ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4ODA1ZgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEwIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgIFRoaXMgTWFrZWZpbGUgaXMgdXNlZCB0byBidWlsZCBsdWEsIGEgbGlnaHR3ZWlnaHQgc2NyaXB0aW5nIGxhbmd1YWdlLgorIyAgICBUaGlzIHBhY2thZ2UgcHJvZHVjZXMgYm90aCBhIHN0YW5kYWxvbmUgbHVhIGludGVycHJldGVyIGFuZCBhIEMgYmluZGluZyBsaWJyYXJ5LgorIworCitCdWlsZENvbmZpZ1NwZWNpYWxpemVkCTo9IE5vCitCdWlsZFByb2R1Y3RTcGVjaWFsaXplZAk6PSBObworCitpbmNsdWRlIHByZS5tYWsKKworUGFja2FnZU5hbWUJCTo9IGx1YQorCitQYWNrYWdlRXh0ZW5zaW9uCTo9IHRhci5negorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VQYXRjaEFyZ3MgCTo9IC1wMQorCitQYWNrYWdlQXJjaGl2ZQkJOj0gJChQYWNrYWdlTmFtZSkuJChQYWNrYWdlRXh0ZW5zaW9uKQorUGFja2FnZVNvdXJjZURpcgk6PSAkKFBhY2thZ2VOYW1lKSQoUGFja2FnZVNlcGFyYXRvcikkKFBhY2thZ2VWZXJzaW9uKQorCitQYWNrYWdlQnVpbGRNYWtlZmlsZQk9ICQoY2FsbCBHZW5lcmF0ZUJ1aWxkUGF0aHMsTWFrZWZpbGUpCisKK0NsZWFuUGF0aHMJCSs9ICQoUGFja2FnZUxpY2Vuc2VGaWxlKQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvQ09QWVJJR0hUOiBzb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL0NPUFlSSUdIVAorCSQoY29weS1yZXN1bHQpCisKKyMgRXh0cmFjdCB0aGUgc291cmNlIGZyb20gdGhlIGFyY2hpdmUgYW5kIGFwcGx5IHBhdGNoZXMsIGlmIGFueS4KKworJChQYWNrYWdlU291cmNlRGlyKTogJChQYWNrYWdlQXJjaGl2ZSkgJChQYWNrYWdlUGF0Y2hQYXRocykKKwkkKGV4cGFuZC1hbmQtcGF0Y2gtcGFja2FnZSkKKworIyBQcmVwYXJlIHRoZSBzb3VyY2VzLgorCisuUEhPTlk6IHNvdXJjZQorc291cmNlOiB8ICR7UGFja2FnZVNvdXJjZURpcn0KKworIyBQYXRjaCB0aGUgc291cmNlcywgaWYgbmVjZXNzYXJ5LgorCisuUEhPTlk6IHBhdGNoCitwYXRjaDogc291cmNlCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUuCisKKyQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpOiB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkKKwkkKGNhbGwgY3JlYXRlLWxpbmtzLCQoQ1VSRElSKS8kKFBhY2thZ2VTb3VyY2VEaXIpLCQoQnVpbGREaXJlY3RvcnkpKQorCisjIENvbmZpZ3VyZSB0aGUgc291cmNlIGZvciBidWlsZGluZy4KKworLlBIT05ZOiBjb25maWd1cmUKK2NvbmZpZ3VyZTogcGF0Y2ggfCAke1BhY2thZ2VCdWlsZE1ha2VmaWxlfQorCisjIEJ1aWxkIHRoZSBzb3VyY2UuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisKK2lmZXEgKCQoVGFyZ2V0T1MpLGRhcndpbikKK01ZTElCUz0iLWxkbCIKK1BMQVQ9bWFjb3N4CitlbHNlCitNWUxJQlM9Ii1XbCwtRSAtbGRsIgorUExBVD1wb3NpeAorZW5kaWYKKworLlBIT05ZOiBidWlsZAorYnVpbGQ6IGNvbmZpZ3VyZSB8ICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KS9zcmMgXAorCUNDPSIkKENDKSIgQVI9IiQoQVIpIC1jciIgTk09JChOTSkgUkFOTElCPSQoUkFOTElCKSBTVFJJUD0kKFNUUklQKSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwlQTEFUPSQoUExBVCkgXAorCU1ZQ0ZMQUdTPSItRExVQV9VU0VfUE9TSVggLURMVUFfVVNFX0RMT1BFTiIgXAorCU1ZTElCUz0kKE1ZTElCUykgXAorCWFsbAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwlJTlNUQUxMX1RPUD0kKFJlc3VsdERpcmVjdG9yeSkgXAorCWluc3RhbGwKKworY2xlYW46CisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChQYWNrYWdlU291cmNlRGlyKQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChSZXN1bHREaXJlY3RvcnkpCisKK2luY2x1ZGUgcG9zdC5tYWsKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9DT1BZUklHSFQgYi9sdWEtNS4xLjQvQ09QWVJJR0hUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTNlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvQ09QWVJJR0hUCkBAIC0wLDAgKzEsMzQgQEAKK0x1YSBMaWNlbnNlCistLS0tLS0tLS0tLQorCitMdWEgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZSByZXByb2R1Y2VkIGJlbG93LgorVGhpcyBtZWFucyB0aGF0IEx1YSBpcyBmcmVlIHNvZnR3YXJlIGFuZCBjYW4gYmUgdXNlZCBmb3IgYm90aCBhY2FkZW1pYworYW5kIGNvbW1lcmNpYWwgcHVycG9zZXMgYXQgYWJzb2x1dGVseSBubyBjb3N0LgorCitGb3IgZGV0YWlscyBhbmQgcmF0aW9uYWxlLCBzZWUgaHR0cDovL3d3dy5sdWEub3JnL2xpY2Vuc2UuaHRtbCAuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29weXJpZ2h0IChDKSAxOTk0LTIwMDggTHVhLm9yZywgUFVDLVJpby4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhlbmQgb2YgQ09QWVJJR0hUKQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L0hJU1RPUlkgYi9sdWEtNS4xLjQvSElTVE9SWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBjOTViCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L0hJU1RPUlkKQEAgLTAsMCArMSwxODMgQEAKK0hJU1RPUlkgZm9yIEx1YSA1LjEKKworKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiA1LjAgdG8gNS4xCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTGFuZ3VhZ2U6CisgICsgbmV3IG1vZHVsZSBzeXN0ZW0uCisgICsgbmV3IHNlbWFudGljcyBmb3IgY29udHJvbCB2YXJpYWJsZXMgb2YgZm9ycy4KKyAgKyBuZXcgc2VtYW50aWNzIGZvciBzZXRuL2dldG4uCisgICsgbmV3IHN5bnRheC9zZW1hbnRpY3MgZm9yIHZhcmFyZ3MuCisgICsgbmV3IGxvbmcgc3RyaW5ncyBhbmQgY29tbWVudHMuCisgICsgbmV3IGBtb2QnIG9wZXJhdG9yIChgJScpCisgICsgbmV3IGxlbmd0aCBvcGVyYXRvciAjdAorICArIG1ldGF0YWJsZXMgZm9yIGFsbCB0eXBlcworICBBUEk6CisgICsgbmV3IGZ1bmN0aW9uczogbHVhX2NyZWF0ZXRhYmxlLCBsdWFfZ2V0KHNldClmaWVsZCwgbHVhX3B1c2godG8paW50ZWdlci4KKyAgKyB1c2VyIHN1cHBsaWVzIG1lbW9yeSBhbGxvY2F0b3IgKGx1YV9vcGVuIGJlY29tZXMgbHVhX25ld3N0YXRlKS4KKyAgKyBsdWFvcGVuXyogZnVuY3Rpb25zIG11c3QgYmUgY2FsbGVkIHRocm91Z2ggTHVhLgorICBJbXBsZW1lbnRhdGlvbjoKKyAgKyBuZXcgY29uZmlndXJhdGlvbiBzY2hlbWUgdmlhIGx1YWNvbmYuaC4KKyAgKyBpbmNyZW1lbnRhbCBnYXJiYWdlIGNvbGxlY3Rpb24uCisgICsgYmV0dGVyIGhhbmRsaW5nIG9mIGVuZC1vZi1saW5lIGluIHRoZSBsZXhlci4KKyAgKyBmdWxseSByZWVudHJhbnQgcGFyc2VyIChuZXcgTHVhIGZ1bmN0aW9uIGBsb2FkJykKKyAgKyBiZXR0ZXIgc3VwcG9ydCBmb3IgNjQtYml0IG1hY2hpbmVzLgorICArIG5hdGl2ZSBsb2FkbGliIHN1cHBvcnQgZm9yIE1hYyBPUyBYLgorICArIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBpbiBvbmx5IG9uZSBsaWJyYXJ5IChsdWFsaWIuYSBtZXJnZWQgaW50byBsdWEuYSkKKworKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiA0LjAgdG8gNS4wCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTGFuZ3VhZ2U6CisgICsgbGV4aWNhbCBzY29waW5nLgorICArIEx1YSBjb3JvdXRpbmVzLgorICArIHN0YW5kYXJkIGxpYnJhcmllcyBub3cgcGFja2FnZWQgaW4gdGFibGVzLgorICArIHRhZ3MgcmVwbGFjZWQgYnkgbWV0YXRhYmxlcyBhbmQgdGFnIG1ldGhvZHMgcmVwbGFjZWQgYnkgbWV0YW1ldGhvZHMsCisgICAgc3RvcmVkIGluIG1ldGF0YWJsZXMuCisgICsgcHJvcGVyIHRhaWwgY2FsbHMuCisgICsgZWFjaCBmdW5jdGlvbiBjYW4gaGF2ZSBpdHMgb3duIGdsb2JhbCB0YWJsZSwgd2hpY2ggY2FuIGJlIHNoYXJlZC4KKyAgKyBuZXcgX19uZXdpbmRleCBtZXRhbWV0aG9kLCBjYWxsZWQgd2hlbiB3ZSBpbnNlcnQgYSBuZXcga2V5IGludG8gYSB0YWJsZS4KKyAgKyBuZXcgYmxvY2sgY29tbWVudHM6IC0tW1sgLi4uIF1dLgorICArIG5ldyBnZW5lcmljIGZvci4KKyAgKyBuZXcgd2VhayB0YWJsZXMuCisgICsgbmV3IGJvb2xlYW4gdHlwZS4KKyAgKyBuZXcgc3ludGF4ICJsb2NhbCBmdW5jdGlvbiIuCisgICsgKGYoKSkgcmV0dXJucyB0aGUgZmlyc3QgdmFsdWUgcmV0dXJuZWQgYnkgZi4KKyAgKyB7ZigpfSBmaWxscyBhIHRhYmxlIHdpdGggYWxsIHZhbHVlcyByZXR1cm5lZCBieSBmLgorICArIFxuIGlnbm9yZWQgaW4gW1tcbiAuCisgICsgZml4ZWQgYW5kLW9yIHByaW9yaXRpZXMuCisgICsgbW9yZSBnZW5lcmFsIHN5bnRheCBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiAoZS5nLiBmdW5jdGlvbiBhLngueTpmKCkuLi5lbmQpLgorICArIG1vcmUgZ2VuZXJhbCBzeW50YXggZm9yIGZ1bmN0aW9uIGNhbGxzIChlLmcuIChwcmludCBvciB3cml0ZSkoOSkpLgorICArIG5ldyBmdW5jdGlvbnMgKHRpbWUvZGF0ZSwgdG1wZmlsZSwgdW5wYWNrLCByZXF1aXJlLCBsb2FkKiwgZXRjLikuCisgIEFQSToKKyAgKyBjaHVua3MgYXJlIGxvYWRlZCBieSB1c2luZyBsdWFfbG9hZDsgbmV3IGx1YUxfbG9hZGZpbGUgYW5kIGx1YUxfbG9hZGJ1ZmZlci4KKyAgKyBpbnRyb2R1Y2VkIGxpZ2h0d2VpZ2h0IHVzZXJkYXRhLCBhIHNpbXBsZSAidm9pZCoiIHdpdGhvdXQgYSBtZXRhdGFibGUuCisgICsgbmV3IGVycm9yIGhhbmRsaW5nIHByb3RvY29sOiB0aGUgY29yZSBubyBsb25nZXIgcHJpbnRzIGVycm9yIG1lc3NhZ2VzOworICAgIGFsbCBlcnJvcnMgYXJlIHJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgb24gdGhlIHN0YWNrLgorICArIG5ldyBsdWFfYXRwYW5pYyBmb3IgaG9zdCBjbGVhbnVwLgorICArIG5ldywgc2lnbmFsLXNhZmUsIGhvb2sgc2NoZW1lLgorICBJbXBsZW1lbnRhdGlvbjoKKyAgKyBuZXcgbGljZW5zZTogTUlULgorICArIG5ldywgZmFzdGVyLCByZWdpc3Rlci1iYXNlZCB2aXJ0dWFsIG1hY2hpbmUuCisgICsgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgbXVsdGl0aHJlYWRpbmcgYW5kIGNvcm91dGluZXMuCisgICsgbmV3IGFuZCBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UgZm9ybWF0LgorICArIHRoZSBjb3JlIG5vIGxvbmdlciBuZWVkcyAic3RkaW8uaCIgZm9yIGFueXRoaW5nIChleGNlcHQgZm9yIGEgc2luZ2xlCisgICAgdXNlIG9mIHNwcmludGYgdG8gY29udmVydCBudW1iZXJzIHRvIHN0cmluZ3MpLgorICArIGx1YS5jIG5vdyBydW5zIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVUFfSU5JVCwgaWYgcHJlc2VudC4gSXQgY2FuCisgICAgYmUgIkBmaWxlbmFtZSIsIHRvIHJ1biBhIGZpbGUsIG9yIHRoZSBjaHVuayBpdHNlbGYuCisgICsgc3VwcG9ydCBmb3IgdXNlciBleHRlbnNpb25zIGluIGx1YS5jLgorICAgIHNhbXBsZSBpbXBsZW1lbnRhdGlvbiBnaXZlbiBmb3IgY29tbWFuZCBsaW5lIGVkaXRpbmcuCisgICsgbmV3IGR5bmFtaWMgbG9hZGluZyBsaWJyYXJ5LCBhY3RpdmUgYnkgZGVmYXVsdCBvbiBzZXZlcmFsIHBsYXRmb3Jtcy4KKyAgKyBzYWZlIGdhcmJhZ2UtY29sbGVjdG9yIG1ldGFtZXRob2RzLgorICArIHByZWNvbXBpbGVkIGJ5dGVjb2RlcyBjaGVja2VkIGZvciBpbnRlZ3JpdHkgKHNlY3VyZSBiaW5hcnkgZG9zdHJpbmcpLgorICArIHN0cmluZ3MgYXJlIGZ1bGx5IGFsaWduZWQuCisgICsgcG9zaXRpb24gY2FwdHVyZSBpbiBzdHJpbmcuZmluZC4KKyAgKyByZWFkKCcqbCcpIGNhbiByZWFkIGxpbmVzIHdpdGggZW1iZWRkZWQgemVyb3MuCisKKyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMy4yIHRvIDQuMAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIExhbmd1YWdlOgorICArIG5ldyAiYnJlYWsiIGFuZCAiZm9yIiBzdGF0ZW1lbnRzIChib3RoIG51bWVyaWNhbCBhbmQgZm9yIHRhYmxlcykuCisgICsgdW5pZm9ybSB0cmVhdG1lbnQgb2YgZ2xvYmFsczogZ2xvYmFscyBhcmUgbm93IHN0b3JlZCBpbiBhIEx1YSB0YWJsZS4KKyAgKyBpbXByb3ZlZCBlcnJvciBtZXNzYWdlcy4KKyAgKyBubyBtb3JlICckZGVidWcnOiBmdWxsIHNwZWVkICphbmQqIGZ1bGwgZGVidWcgaW5mb3JtYXRpb24uCisgICsgbmV3IHJlYWQgZm9ybTogcmVhZChOKSBmb3IgbmV4dCBOIGJ5dGVzLgorICArIGdlbmVyYWwgcmVhZCBwYXR0ZXJucyBub3cgZGVwcmVjYXRlZC4KKyAgICAoc3RpbGwgYXZhaWxhYmxlIHdpdGggLURDT01QQVRfUkVBRFBBVFRFUk5TLikKKyAgKyBhbGwgcmV0dXJuIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyBmb3IgdGhlIGxhc3QgZnVuY3Rpb24KKyAgICAob2xkIHNlbWFudGljcyBzdGlsbCBhdmFpbGFibGUgd2l0aCAtRExVQV9DT01QQVRfQVJHUkVUKQorICArIGdhcmJhZ2UgY29sbGVjdGlvbiB0YWcgbWV0aG9kcyBmb3IgdGFibGVzIG5vdyBkZXByZWNhdGVkLgorICArIHRoZXJlIGlzIG5vdyBvbmx5IG9uZSB0YWcgbWV0aG9kIGZvciBvcmRlci4KKyAgQVBJOgorICArIE5ldyBBUEk6IGZ1bGx5IHJlLWVudHJhbnQsIHNpbXBsZXIsIGFuZCBtb3JlIGVmZmljaWVudC4KKyAgKyBOZXcgZGVidWcgQVBJLgorICBJbXBsZW1lbnRhdGlvbjoKKyAgKyBmYXN0ZXIgdGhhbiBldmVyOiBjbGVhbmVyIHZpcnR1YWwgbWFjaGluZSBhbmQgbmV3IGhhc2hpbmcgYWxnb3JpdGhtLgorICArIG5vbi1yZWN1cnNpdmUgZ2FyYmFnZS1jb2xsZWN0b3IgYWxnb3JpdGhtLgorICArIHJlZHVjZWQgbWVtb3J5IHVzYWdlIGZvciBwcm9ncmFtcyB3aXRoIG1hbnkgc3RyaW5ncy4KKyAgKyBpbXByb3ZlZCB0cmVhdG1lbnQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9ycy4KKyAgKyBpbXByb3ZlZCBzdXBwb3J0IGZvciAxNi1iaXQgbWFjaGluZXMgKHdlIGhvcGUpLgorICArIGNvZGUgbm93IGNvbXBpbGVzIHVubW9kaWZpZWQgYXMgYm90aCBBTlNJIEMgYW5kIEMrKy4KKyAgKyBudW1iZXJzIGluIGJhc2VzIG90aGVyIHRoYW4gMTAgYXJlIGNvbnZlcnRlZCB1c2luZyBzdHJ0b3VsLgorICArIG5ldyAtZiBvcHRpb24gaW4gTHVhIHRvIHN1cHBvcnQgIyEgc2NyaXB0cy4KKyAgKyBsdWFjIGNhbiBub3cgY29tYmluZSB0ZXh0IGFuZCBiaW5hcmllcy4KKworKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAzLjEgdG8gMy4yCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKyByZWRpcmVjdGVkIGFsbCBvdXRwdXQgaW4gTHVhJ3MgY29yZSB0byBfRVJST1JNRVNTQUdFIGFuZCBfQUxFUlQuCisgICsgaW5jcmVhc2VkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29uc3RhbnRzIGFuZCBnbG9iYWxzIHBlciBmdW5jdGlvbgorICAgIChmcm9tIDJeMTYgdG8gMl4yNCkuCisgICsgZGVidWdnaW5nIGluZm8gKGx1YV9kZWJ1ZyBhbmQgaG9va3MpIG1vdmVkIGludG8gbHVhX3N0YXRlIGFuZCBuZXcgQVBJCisgICAgZnVuY3Rpb25zIHByb3ZpZGVkIHRvIGdldCBhbmQgc2V0IHRoaXMgaW5mby4KKyAgKyBuZXcgZGVidWcgbGliIGdpdmVzIGZ1bGwgZGVidWdnaW5nIGFjY2VzcyB3aXRoaW4gTHVhLgorICArIG5ldyB0YWJsZSBmdW5jdGlvbnMgImZvcmVhY2hpIiwgInNvcnQiLCAidGluc2VydCIsICJ0cmVtb3ZlIiwgImdldG4iLgorICArIG5ldyBpbyBmdW5jdGlvbnMgImZsdXNoIiwgInNlZWsiLgorCisqIENoYW5nZXMgZnJvbSB2ZXJzaW9uIDMuMCB0byAzLjEKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICArIE5FVyBGRUFUVVJFOiBhbm9ueW1vdXMgZnVuY3Rpb25zIHdpdGggY2xvc3VyZXMgKHZpYSAidXB2YWx1ZXMiKS4KKyAgKyBuZXcgc3ludGF4OgorICAgIC0gbG9jYWwgdmFyaWFibGVzIGluIGNodW5rcy4KKyAgICAtIGJldHRlciBzY29wZSBjb250cm9sIHdpdGggRE8gYmxvY2sgRU5ELgorICAgIC0gY29uc3RydWN0b3JzIGNhbiBub3cgYmUgYWxzbyB3cml0dGVuOiB7IHJlY29yZC1wYXJ0OyBsaXN0LXBhcnQgfS4KKyAgICAtIG1vcmUgZ2VuZXJhbCBzeW50YXggZm9yIGZ1bmN0aW9uIGNhbGxzIGFuZCBsdmFsdWVzLCBlLmcuOgorICAgICAgZih4KS55PTEKKyAgICAgIG86Zih4LHkpOmcoeikKKyAgICAgIGYic3RyaW5nIiBpcyBzdWdhciBmb3IgZigic3RyaW5nIikKKyAgKyBzdHJpbmdzIG1heSBub3cgY29udGFpbiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEgKGUuZy4sIGVtYmVkZGVkIHplcm9zKS4KKyAgKyBtYWpvciBjb2RlIHJlLW9yZ2FuaXphdGlvbiBhbmQgY2xlYW4tdXA7IHJlZHVjZWQgbW9kdWxlIGludGVyZGVwZW5kZWNpZXMuCisgICsgbm8gYXJiaXRyYXJ5IGxpbWl0cyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbnN0YW50cyBhbmQgZ2xvYmFscy4KKyAgKyBzdXBwb3J0IGZvciBtdWx0aXBsZSBnbG9iYWwgY29udGV4dHMuCisgICsgYmV0dGVyIHN5bnRheCBlcnJvciBtZXNzYWdlcy4KKyAgKyBuZXcgdHJhdmVyc2FsIGZ1bmN0aW9ucyAiZm9yZWFjaCIgYW5kICJmb3JlYWNodmFyIi4KKyAgKyB0aGUgZGVmYXVsdCBmb3IgbnVtYmVycyBpcyBub3cgZG91YmxlLgorICAgIGNoYW5naW5nIGl0IHRvIHVzZSBmbG9hdHMgb3IgbG9uZ3MgaXMgZWFzeS4KKyAgKyBjb21wbGV0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gcHJlLWNvbXBpbGVkIGNodW5rcy4KKyAgKyBzYW1wbGUgaW50ZXJwcmV0ZXIgbm93IHByb21wdHMgdXNlciB3aGVuIHJ1biBpbnRlcmFjdGl2ZWx5LCBhbmQgYWxzbworICAgIGhhbmRsZXMgY29udHJvbC1DIGludGVycnVwdGlvbnMgZ3JhY2VmdWxseS4KKworKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAyLjUgdG8gMy4wCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKyBORVcgQ09OQ0VQVDogInRhZyBtZXRob2RzIi4KKyAgICBUYWcgbWV0aG9kcyByZXBsYWNlIGZhbGxiYWNrcyBhcyB0aGUgbWV0YS1tZWNoYW5pc20gZm9yIGV4dGVuZGluZyB0aGUKKyAgICBzZW1hbnRpY3Mgb2YgTHVhLiBXaGVyZWFzIGZhbGxiYWNrcyBoYWQgYSBnbG9iYWwgbmF0dXJlLCB0YWcgbWV0aG9kcworICAgIHdvcmsgb24gb2JqZWN0cyBoYXZpbmcgdGhlIHNhbWUgdGFnIChlLmcuLCBncm91cHMgb2YgdGFibGVzKS4KKyAgICBFeGlzdGluZyBjb2RlIHRoYXQgdXNlcyBmYWxsYmFja3Mgc2hvdWxkIHdvcmsgd2l0aG91dCBjaGFuZ2UuCisgICsgbmV3LCBnZW5lcmFsIHN5bnRheCBmb3IgY29uc3RydWN0b3JzIHtbZXhwXSA9IGV4cCwgLi4uIH0uCisgICsgc3VwcG9ydCBmb3IgaGFuZGxpbmcgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBmdW5jdGlvbnMgKHZhcmFyZ3MpLgorICArIHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uICgkaWYgLi4uICRlbHNlIC4uLiAkZW5kKS4KKyAgKyBjbGVhbmVyIHNlbWFudGljcyBpbiBBUEkgc2ltcGxpZmllcyBob3N0IGNvZGUuCisgICsgYmV0dGVyIHN1cHBvcnQgZm9yIHdyaXRpbmcgbGlicmFyaWVzIChhdXhsaWIuaCkuCisgICsgYmV0dGVyIHR5cGUgY2hlY2tpbmcgYW5kIGVycm9yIG1lc3NhZ2VzIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LgorICArIGx1YWMgY2FuIG5vdyBhbHNvIHVuZHVtcC4KKworKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAyLjQgdG8gMi41CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKyBpbyBhbmQgc3RyaW5nIGxpYnJhcmllcyBhcmUgbm93IGJhc2VkIG9uIHBhdHRlcm4gbWF0Y2hpbmc7CisgICAgdGhlIG9sZCBsaWJyYXJpZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBmb3IgY29tcGF0aWJpbGl0eQorICArIGRvZmlsZSBhbmQgZG9zdHJpbmcgY2FuIG5vdyByZXR1cm4gdmFsdWVzICh2aWEgcmV0dXJuIHN0YXRlbWVudCkKKyAgKyBiZXR0ZXIgc3VwcG9ydCBmb3IgMTYtIGFuZCA2NC1iaXQgbWFjaGluZXMKKyAgKyBleHBhbmRlZCBkb2N1bWVudGF0aW9uLCB3aXRoIG1vcmUgZXhhbXBsZXMKKworKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAyLjIgdG8gMi40CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKyBleHRlcm5hbCBjb21waWxlciBjcmVhdGVzIHBvcnRhYmxlIGJpbmFyeSBmaWxlcyB0aGF0IGNhbiBiZSBsb2FkZWQgZmFzdGVyCisgICsgaW50ZXJmYWNlIGZvciBkZWJ1Z2dpbmcgYW5kIHByb2ZpbGluZworICArIG5ldyAiZ2V0Z2xvYmFsIiBmYWxsYmFjaworICArIG5ldyBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlZmVyZW5jZXMgdG8gTHVhIG9iamVjdHMKKyAgKyBuZXcgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGxpYgorICArIG9ubHkgb25lIGNvcHkgb2YgZWFjaCBzdHJpbmcgaXMgc3RvcmVkCisgICsgZXhwYW5kZWQgZG9jdW1lbnRhdGlvbiwgd2l0aCBtb3JlIGV4YW1wbGVzCisKKyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMi4xIHRvIDIuMgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICsgZnVuY3Rpb25zIG5vdyBtYXkgYmUgZGVjbGFyZWQgd2l0aCBhbnkgImx2YWx1ZSIgYXMgYSBuYW1lCisgICsgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucworICArIHN1cHBvcnQgZm9yIHBpcGVzCisKKyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS4xIHRvIDIuMQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICsgb2JqZWN0LW9yaWVudGVkIHN1cHBvcnQKKyAgKyBmYWxsYmFja3MKKyAgKyBzaW1wbGlmaWVkIHN5bnRheCBmb3IgdGFibGVzCisgICsgbWFueSBpbnRlcm5hbCBpbXByb3ZlbWVudHMKKworKGVuZCBvZiBISVNUT1JZKQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L0lOU1RBTEwgYi9sdWEtNS4xLjQvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ViOGFlCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L0lOU1RBTEwKQEAgLTAsMCArMSw5OSBAQAorSU5TVEFMTCBmb3IgTHVhIDUuMQorCisqIEJ1aWxkaW5nIEx1YQorICAtLS0tLS0tLS0tLS0KKyAgTHVhIGlzIGJ1aWx0IGluIHRoZSBzcmMgZGlyZWN0b3J5LCBidXQgdGhlIGJ1aWxkIHByb2Nlc3MgY2FuIGJlCisgIGNvbnRyb2xsZWQgZnJvbSB0aGUgdG9wLWxldmVsIE1ha2VmaWxlLgorCisgIEJ1aWxkaW5nIEx1YSBvbiBVbml4IHN5c3RlbXMgc2hvdWxkIGJlIHZlcnkgZWFzeS4gRmlyc3QgZG8gIm1ha2UiIGFuZAorICBzZWUgaWYgeW91ciBwbGF0Zm9ybSBpcyBsaXN0ZWQuIElmIHNvLCBqdXN0IGRvICJtYWtlIHh4eCIsIHdoZXJlIHh4eAorICBpcyB5b3VyIHBsYXRmb3JtIG5hbWUuIFRoZSBwbGF0Zm9ybXMgY3VycmVudGx5IHN1cHBvcnRlZCBhcmU6CisgICAgYWl4IGFuc2kgYnNkIGZyZWVic2QgZ2VuZXJpYyBsaW51eCBtYWNvc3ggbWluZ3cgcG9zaXggc29sYXJpcworCisgIElmIHlvdXIgcGxhdGZvcm0gaXMgbm90IGxpc3RlZCwgdHJ5IHRoZSBjbG9zZXN0IG9uZSBvciBwb3NpeCwgZ2VuZXJpYywKKyAgYW5zaSwgaW4gdGhpcyBvcmRlci4KKworICBTZWUgYmVsb3cgZm9yIGN1c3RvbWl6YXRpb24gaW5zdHJ1Y3Rpb25zIGFuZCBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdworICB0byBidWlsZCB3aXRoIG90aGVyIFdpbmRvd3MgY29tcGlsZXJzLgorCisgIElmIHlvdSB3YW50IHRvIGNoZWNrIHRoYXQgTHVhIGhhcyBiZWVuIGJ1aWx0IGNvcnJlY3RseSwgZG8gIm1ha2UgdGVzdCIKKyAgYWZ0ZXIgYnVpbGRpbmcgTHVhLiBBbHNvLCBoYXZlIGEgbG9vayBhdCB0aGUgZXhhbXBsZSBwcm9ncmFtcyBpbiB0ZXN0LgorCisqIEluc3RhbGxpbmcgTHVhCisgIC0tLS0tLS0tLS0tLS0tCisgIE9uY2UgeW91IGhhdmUgYnVpbHQgTHVhLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBpdCBpbiBhbiBvZmZpY2lhbAorICBwbGFjZSBpbiB5b3VyIHN5c3RlbS4gSW4gdGhpcyBjYXNlLCBkbyAibWFrZSBpbnN0YWxsIi4gVGhlIG9mZmljaWFsCisgIHBsYWNlIGFuZCB0aGUgd2F5IHRvIGluc3RhbGwgZmlsZXMgYXJlIGRlZmluZWQgaW4gTWFrZWZpbGUuIFlvdSBtdXN0CisgIGhhdmUgdGhlIHJpZ2h0IHBlcm1pc3Npb25zIHRvIGluc3RhbGwgZmlsZXMuCisKKyAgSWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIGluc3RhbGwgTHVhIGluIG9uZSBzdGVwLCBkbyAibWFrZSB4eHggaW5zdGFsbCIsCisgIHdoZXJlIHh4eCBpcyB5b3VyIHBsYXRmb3JtIG5hbWUuCisKKyAgSWYgeW91IHdhbnQgdG8gaW5zdGFsbCBMdWEgbG9jYWxseSwgdGhlbiBkbyAibWFrZSBsb2NhbCIuIFRoaXMgd2lsbAorICBjcmVhdGUgZGlyZWN0b3JpZXMgYmluLCBpbmNsdWRlLCBsaWIsIG1hbiwgYW5kIGluc3RhbGwgTHVhIHRoZXJlIGFzCisgIGZvbGxvd3M6CisKKyAgICBiaW46CWx1YSBsdWFjCisgICAgaW5jbHVkZToJbHVhLmggbHVhY29uZi5oIGx1YWxpYi5oIGxhdXhsaWIuaCBsdWEuaHBwCisgICAgbGliOglsaWJsdWEuYQorICAgIG1hbi9tYW4xOglsdWEuMSBsdWFjLjEKKworICBUaGVzZSBhcmUgdGhlIG9ubHkgZGlyZWN0b3JpZXMgeW91IG5lZWQgZm9yIGRldmVsb3BtZW50LgorCisgIFRoZXJlIGFyZSBtYW4gcGFnZXMgZm9yIGx1YSBhbmQgbHVhYywgaW4gYm90aCBucm9mZiBhbmQgaHRtbCwgYW5kIGEKKyAgcmVmZXJlbmNlIG1hbnVhbCBpbiBodG1sIGluIGRvYywgc29tZSBzYW1wbGUgY29kZSBpbiB0ZXN0LCBhbmQgc29tZQorICB1c2VmdWwgc3R1ZmYgaW4gZXRjLiBZb3UgZG9uJ3QgbmVlZCB0aGVzZSBkaXJlY3RvcmllcyBmb3IgZGV2ZWxvcG1lbnQuCisKKyAgSWYgeW91IHdhbnQgdG8gaW5zdGFsbCBMdWEgbG9jYWxseSwgYnV0IGluIHNvbWUgb3RoZXIgZGlyZWN0b3J5LCBkbworICAibWFrZSBpbnN0YWxsIElOU1RBTExfVE9QPXh4eCIsIHdoZXJlIHh4eCBpcyB5b3VyIGNob3NlbiBkaXJlY3RvcnkuCisKKyAgU2VlIGJlbG93IGZvciBpbnN0cnVjdGlvbnMgZm9yIFdpbmRvd3MgYW5kIG90aGVyIHN5c3RlbXMuCisKKyogQ3VzdG9taXphdGlvbgorICAtLS0tLS0tLS0tLS0tCisgIFRocmVlIHRoaW5ncyBjYW4gYmUgY3VzdG9taXplZCBieSBlZGl0aW5nIGEgZmlsZToKKyAgICAtIFdoZXJlIGFuZCBob3cgdG8gaW5zdGFsbCBMdWEgLS0gZWRpdCBNYWtlZmlsZS4KKyAgICAtIEhvdyB0byBidWlsZCBMdWEgLS0gZWRpdCBzcmMvTWFrZWZpbGUuCisgICAgLSBMdWEgZmVhdHVyZXMgLS0gZWRpdCBzcmMvbHVhY29uZi5oLgorCisgIFlvdSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGVkaXQgdGhlIE1ha2VmaWxlcyBiZWNhdXNlIHlvdSBtYXkgc2V0IHRoZQorICByZWxldmFudCB2YXJpYWJsZXMgd2hlbiBpbnZva2luZyBtYWtlLgorCisgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgbmVlZCB0byBzZWxlY3Qgc29tZSBMdWEgZmVhdHVyZXMsIHlvdSdsbCBuZWVkCisgIHRvIGVkaXQgc3JjL2x1YWNvbmYuaC4gVGhlIGVkaXRlZCBmaWxlIHdpbGwgYmUgdGhlIG9uZSBpbnN0YWxsZWQsIGFuZAorICBpdCB3aWxsIGJlIHVzZWQgYnkgYW55IEx1YSBjbGllbnRzIHRoYXQgeW91IGJ1aWxkLCB0byBlbnN1cmUgY29uc2lzdGVuY3kuCisKKyAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgeW91IGVuYWJsZSBkeW5hbWljIGxvYWRpbmcuIFRoaXMgaXMgZG9uZQorICBhdXRvbWF0aWNhbGx5IGZvciBhbGwgcGxhdGZvcm1zIGxpc3RlZCBhYm92ZSB0aGF0IGhhdmUgdGhpcyBmZWF0dXJlCisgIChhbmQgYWxzbyBXaW5kb3dzKS4gU2VlIHNyYy9sdWFjb25mLmggYW5kIGFsc28gc3JjL01ha2VmaWxlLgorCisqIEJ1aWxkaW5nIEx1YSBvbiBXaW5kb3dzIGFuZCBvdGhlciBzeXN0ZW1zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIElmIHlvdSdyZSBub3QgdXNpbmcgdGhlIHVzdWFsIFVuaXggdG9vbHMsIHRoZW4gdGhlIGluc3RydWN0aW9ucyBmb3IKKyAgYnVpbGRpbmcgTHVhIGRlcGVuZCBvbiB0aGUgY29tcGlsZXIgeW91IHVzZS4gWW91J2xsIG5lZWQgdG8gY3JlYXRlCisgIHByb2plY3RzIChvciB3aGF0ZXZlciB5b3VyIGNvbXBpbGVyIHVzZXMpIGZvciBidWlsZGluZyB0aGUgbGlicmFyeSwKKyAgdGhlIGludGVycHJldGVyLCBhbmQgdGhlIGNvbXBpbGVyLCBhcyBmb2xsb3dzOgorCisgIGxpYnJhcnk6CWxhcGkuYyBsY29kZS5jIGxkZWJ1Zy5jIGxkby5jIGxkdW1wLmMgbGZ1bmMuYyBsZ2MuYyBsbGV4LmMKKwkJbG1lbS5jIGxvYmplY3QuYyBsb3Bjb2Rlcy5jIGxwYXJzZXIuYyBsc3RhdGUuYyBsc3RyaW5nLmMKKwkJbHRhYmxlLmMgbHRtLmMgbHVuZHVtcC5jIGx2bS5jIGx6aW8uYworCQlsYXV4bGliLmMgbGJhc2VsaWIuYyBsZGJsaWIuYyBsaW9saWIuYyBsbWF0aGxpYi5jIGxvc2xpYi5jCisJCWx0YWJsaWIuYyBsc3RybGliLmMgbG9hZGxpYi5jIGxpbml0LmMKKworICBpbnRlcnByZXRlcjoJbGlicmFyeSwgbHVhLmMKKworICBjb21waWxlcjoJbGlicmFyeSwgbHVhYy5jIHByaW50LmMKKworICBJZiB5b3UgdXNlIFZpc3VhbCBTdHVkaW8gLk5FVCwgeW91IGNhbiB1c2UgZXRjL2x1YXZzLmJhdCBpbiBpdHMKKyAgIkNvbW1hbmQgUHJvbXB0Ii4KKworICBJZiBhbGwgeW91IHdhbnQgaXMgdG8gYnVpbGQgdGhlIEx1YSBpbnRlcnByZXRlciwgeW91IG1heSBwdXQgYWxsIC5jIGZpbGVzCisgIGluIGEgc2luZ2xlIHByb2plY3QsIGV4Y2VwdCBmb3IgbHVhYy5jIGFuZCBwcmludC5jLiBPciBqdXN0IHVzZSBldGMvYWxsLmMuCisKKyAgVG8gdXNlIEx1YSBhcyBhIGxpYnJhcnkgaW4geW91ciBvd24gcHJvZ3JhbXMsIHlvdSdsbCBuZWVkIHRvIGtub3cgaG93IHRvCisgIGNyZWF0ZSBhbmQgdXNlIGxpYnJhcmllcyB3aXRoIHlvdXIgY29tcGlsZXIuCisKKyAgQXMgbWVudGlvbmVkIGFib3ZlLCB5b3UgbWF5IGVkaXQgbHVhY29uZi5oIHRvIHNlbGVjdCBzb21lIGZlYXR1cmVzIGJlZm9yZQorICBidWlsZGluZyBMdWEuCisKKyhlbmQgb2YgSU5TVEFMTCkKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9NYWtlZmlsZSBiL2x1YS01LjEuNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc4ZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L01ha2VmaWxlCkBAIC0wLDAgKzEsMTI4IEBACisjIG1ha2VmaWxlIGZvciBpbnN0YWxsaW5nIEx1YQorIyBzZWUgSU5TVEFMTCBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucworIyBzZWUgc3JjL01ha2VmaWxlIGFuZCBzcmMvbHVhY29uZi5oIGZvciBmdXJ0aGVyIGN1c3RvbWl6YXRpb24KKworIyA9PSBDSEFOR0UgVEhFIFNFVFRJTkdTIEJFTE9XIFRPIFNVSVQgWU9VUiBFTlZJUk9OTUVOVCA9PT09PT09PT09PT09PT09PT09PT09PQorCisjIFlvdXIgcGxhdGZvcm0uIFNlZSBQTEFUUyBmb3IgcG9zc2libGUgdmFsdWVzLgorUExBVD0gbm9uZQorCisjIFdoZXJlIHRvIGluc3RhbGwuIFRoZSBpbnN0YWxsYXRpb24gc3RhcnRzIGluIHRoZSBzcmMgYW5kIGRvYyBkaXJlY3RvcmllcywKKyMgc28gdGFrZSBjYXJlIGlmIElOU1RBTExfVE9QIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLgorSU5TVEFMTF9UT1A9IC91c3IvbG9jYWwKK0lOU1RBTExfQklOPSAkKElOU1RBTExfVE9QKS9iaW4KK0lOU1RBTExfSU5DPSAkKElOU1RBTExfVE9QKS9pbmNsdWRlCitJTlNUQUxMX0xJQj0gJChJTlNUQUxMX1RPUCkvbGliCitJTlNUQUxMX01BTj0gJChJTlNUQUxMX1RPUCkvbWFuL21hbjEKKyMKKyMgWW91IHByb2JhYmx5IHdhbnQgdG8gbWFrZSBJTlNUQUxMX0xNT0QgYW5kIElOU1RBTExfQ01PRCBjb25zaXN0ZW50IHdpdGgKKyMgTFVBX1JPT1QsIExVQV9MRElSLCBhbmQgTFVBX0NESVIgaW4gbHVhY29uZi5oIChhbmQgYWxzbyB3aXRoIGV0Yy9sdWEucGMpLgorSU5TVEFMTF9MTU9EPSAkKElOU1RBTExfVE9QKS9zaGFyZS9sdWEvJFYKK0lOU1RBTExfQ01PRD0gJChJTlNUQUxMX1RPUCkvbGliL2x1YS8kVgorCisjIEhvdyB0byBpbnN0YWxsLiBJZiB5b3VyIGluc3RhbGwgcHJvZ3JhbSBkb2VzIG5vdCBzdXBwb3J0ICItcCIsIHRoZW4geW91CisjIG1heSBoYXZlIHRvIHJ1biByYW5saWIgb24gdGhlIGluc3RhbGxlZCBsaWJsdWEuYSAoZG8gIm1ha2UgcmFubGliIikuCitJTlNUQUxMPSBpbnN0YWxsIC1wCitJTlNUQUxMX0VYRUM9ICQoSU5TVEFMTCkgLW0gMDc1NQorSU5TVEFMTF9EQVRBPSAkKElOU1RBTEwpIC1tIDA2NDQKKyMKKyMgSWYgeW91IGRvbid0IGhhdmUgaW5zdGFsbCB5b3UgY2FuIHVzZSBjcCBpbnN0ZWFkLgorIyBJTlNUQUxMPSBjcCAtcAorIyBJTlNUQUxMX0VYRUM9ICQoSU5TVEFMTCkKKyMgSU5TVEFMTF9EQVRBPSAkKElOU1RBTEwpCisKKyMgVXRpbGl0aWVzLgorTUtESVI9IG1rZGlyIC1wCitSQU5MSUI9IHJhbmxpYgorCisjID09IEVORCBPRiBVU0VSIFNFVFRJTkdTLiBOTyBORUVEIFRPIENIQU5HRSBBTllUSElORyBCRUxPVyBUSElTIExJTkUgPT09PT09PT09CisKKyMgQ29udmVuaWVuY2UgcGxhdGZvcm1zIHRhcmdldHMuCitQTEFUUz0gYWl4IGFuc2kgYnNkIGZyZWVic2QgZ2VuZXJpYyBsaW51eCBtYWNvc3ggbWluZ3cgcG9zaXggc29sYXJpcworCisjIFdoYXQgdG8gaW5zdGFsbC4KK1RPX0JJTj0gbHVhIGx1YWMKK1RPX0lOQz0gbHVhLmggbHVhY29uZi5oIGx1YWxpYi5oIGxhdXhsaWIuaCAuLi9ldGMvbHVhLmhwcAorVE9fTElCPSBsaWJsdWEuYQorVE9fTUFOPSBsdWEuMSBsdWFjLjEKKworIyBMdWEgdmVyc2lvbiBhbmQgcmVsZWFzZS4KK1Y9IDUuMQorUj0gNS4xLjQKKworYWxsOgkkKFBMQVQpCisKKyQoUExBVFMpIGNsZWFuOgorCWNkIHNyYyAmJiAkKE1BS0UpICRACisKK3Rlc3Q6CWR1bW15CisJc3JjL2x1YSB0ZXN0L2hlbGxvLmx1YQorCitpbnN0YWxsOiBkdW1teQorCWNkIHNyYyAmJiAkKE1LRElSKSAkKElOU1RBTExfQklOKSAkKElOU1RBTExfSU5DKSAkKElOU1RBTExfTElCKSAkKElOU1RBTExfTUFOKSAkKElOU1RBTExfTE1PRCkgJChJTlNUQUxMX0NNT0QpCisJY2Qgc3JjICYmICQoSU5TVEFMTF9FWEVDKSAkKFRPX0JJTikgJChJTlNUQUxMX0JJTikKKwljZCBzcmMgJiYgJChJTlNUQUxMX0RBVEEpICQoVE9fSU5DKSAkKElOU1RBTExfSU5DKQorCWNkIHNyYyAmJiAkKElOU1RBTExfREFUQSkgJChUT19MSUIpICQoSU5TVEFMTF9MSUIpCisJY2QgZG9jICYmICQoSU5TVEFMTF9EQVRBKSAkKFRPX01BTikgJChJTlNUQUxMX01BTikKKworcmFubGliOgorCWNkIHNyYyAmJiBjZCAkKElOU1RBTExfTElCKSAmJiAkKFJBTkxJQikgJChUT19MSUIpCisKK2xvY2FsOgorCSQoTUFLRSkgaW5zdGFsbCBJTlNUQUxMX1RPUD0uLgorCitub25lOgorCUBlY2hvICJQbGVhc2UgZG8iCisJQGVjaG8gIiAgIG1ha2UgUExBVEZPUk0iCisJQGVjaG8gIndoZXJlIFBMQVRGT1JNIGlzIG9uZSBvZiB0aGVzZToiCisJQGVjaG8gIiAgICQoUExBVFMpIgorCUBlY2hvICJTZWUgSU5TVEFMTCBmb3IgY29tcGxldGUgaW5zdHJ1Y3Rpb25zLiIKKworIyBtYWtlIG1heSBnZXQgY29uZnVzZWQgd2l0aCB0ZXN0LyBhbmQgSU5TVEFMTCBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgT1MKK2R1bW15OgorCisjIGVjaG8gY29uZmlnIHBhcmFtZXRlcnMKK2VjaG86CisJQGVjaG8gIiIKKwlAZWNobyAiVGhlc2UgYXJlIHRoZSBwYXJhbWV0ZXJzIGN1cnJlbnRseSBzZXQgaW4gc3JjL01ha2VmaWxlIHRvIGJ1aWxkIEx1YSAkUjoiCisJQGVjaG8gIiIKKwlAY2Qgc3JjICYmICQoTUFLRSkgLXMgZWNobworCUBlY2hvICIiCisJQGVjaG8gIlRoZXNlIGFyZSB0aGUgcGFyYW1ldGVycyBjdXJyZW50bHkgc2V0IGluIE1ha2VmaWxlIHRvIGluc3RhbGwgTHVhICRSOiIKKwlAZWNobyAiIgorCUBlY2hvICJQTEFUID0gJChQTEFUKSIKKwlAZWNobyAiSU5TVEFMTF9UT1AgPSAkKElOU1RBTExfVE9QKSIKKwlAZWNobyAiSU5TVEFMTF9CSU4gPSAkKElOU1RBTExfQklOKSIKKwlAZWNobyAiSU5TVEFMTF9JTkMgPSAkKElOU1RBTExfSU5DKSIKKwlAZWNobyAiSU5TVEFMTF9MSUIgPSAkKElOU1RBTExfTElCKSIKKwlAZWNobyAiSU5TVEFMTF9NQU4gPSAkKElOU1RBTExfTUFOKSIKKwlAZWNobyAiSU5TVEFMTF9MTU9EID0gJChJTlNUQUxMX0xNT0QpIgorCUBlY2hvICJJTlNUQUxMX0NNT0QgPSAkKElOU1RBTExfQ01PRCkiCisJQGVjaG8gIklOU1RBTExfRVhFQyA9ICQoSU5TVEFMTF9FWEVDKSIKKwlAZWNobyAiSU5TVEFMTF9EQVRBID0gJChJTlNUQUxMX0RBVEEpIgorCUBlY2hvICIiCisJQGVjaG8gIlNlZSBhbHNvIHNyYy9sdWFjb25mLmggLiIKKwlAZWNobyAiIgorCisjIGVjaG8gcHJpdmF0ZSBjb25maWcgcGFyYW1ldGVycworcGVjaG86CisJQGVjaG8gIlYgPSAkKFYpIgorCUBlY2hvICJSID0gJChSKSIKKwlAZWNobyAiVE9fQklOID0gJChUT19CSU4pIgorCUBlY2hvICJUT19JTkMgPSAkKFRPX0lOQykiCisJQGVjaG8gIlRPX0xJQiA9ICQoVE9fTElCKSIKKwlAZWNobyAiVE9fTUFOID0gJChUT19NQU4pIgorCisjIGVjaG8gY29uZmlnIHBhcmFtZXRlcnMgYXMgTHVhIGNvZGUKKyMgdW5jb21tZW50IHRoZSBsYXN0IHNlZCBleHByZXNzaW9uIGlmIHlvdSB3YW50IG5pbCBpbnN0ZWFkIG9mIGVtcHR5IHN0cmluZ3MKK2xlY2hvOgorCUBlY2hvICItLSBpbnN0YWxsYXRpb24gcGFyYW1ldGVycyBmb3IgTHVhICRSIgorCUBlY2hvICJWRVJTSU9OID0gJyRWJyIKKwlAZWNobyAiUkVMRUFTRSA9ICckUiciCisJQCQoTUFLRSkgZWNobyB8IGdyZXAgPSB8IHNlZCAtZSAncy89IC89ICIvJyAtZSAncy8kJC8iLycgIy1lICdzLyIiL25pbC8nCisJQGVjaG8gIi0tIEVPRiIKKworIyBsaXN0IHRhcmdldHMgdGhhdCBkbyBub3QgY3JlYXRlIGZpbGVzIChidXQgbm90IGFsbCBtYWtlcyB1bmRlcnN0YW5kIC5QSE9OWSkKKy5QSE9OWTogYWxsICQoUExBVFMpIGNsZWFuIHRlc3QgaW5zdGFsbCBsb2NhbCBub25lIGR1bW15IGVjaG8gcGVjaG8gbGVjaG8KKworIyAoZW5kIG9mIE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L1JFQURNRSBiL2x1YS01LjEuNC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiNGRmZgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9SRUFETUUKQEAgLTAsMCArMSwzNyBAQAorUkVBRE1FIGZvciBMdWEgNS4xCisKK1NlZSBJTlNUQUxMIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorU2VlIEhJU1RPUlkgZm9yIGEgc3VtbWFyeSBvZiBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24uCisKKyogV2hhdCBpcyBMdWE/CisgIC0tLS0tLS0tLS0tLQorICBMdWEgaXMgYSBwb3dlcmZ1bCwgbGlnaHQtd2VpZ2h0IHByb2dyYW1taW5nIGxhbmd1YWdlIGRlc2lnbmVkIGZvciBleHRlbmRpbmcKKyAgYXBwbGljYXRpb25zLiBMdWEgaXMgYWxzbyBmcmVxdWVudGx5IHVzZWQgYXMgYSBnZW5lcmFsLXB1cnBvc2UsIHN0YW5kLWFsb25lCisgIGxhbmd1YWdlLiBMdWEgaXMgZnJlZSBzb2Z0d2FyZS4KKworICBGb3IgY29tcGxldGUgaW5mb3JtYXRpb24sIHZpc2l0IEx1YSdzIHdlYiBzaXRlIGF0IGh0dHA6Ly93d3cubHVhLm9yZy8gLgorICBGb3IgYW4gZXhlY3V0aXZlIHN1bW1hcnksIHNlZSBodHRwOi8vd3d3Lmx1YS5vcmcvYWJvdXQuaHRtbCAuCisKKyAgTHVhIGhhcyBiZWVuIHVzZWQgaW4gbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYXJvdW5kIHRoZSB3b3JsZC4KKyAgRm9yIGEgc2hvcnQgbGlzdCwgc2VlIGh0dHA6Ly93d3cubHVhLm9yZy91c2VzLmh0bWwgLgorCisqIEF2YWlsYWJpbGl0eQorICAtLS0tLS0tLS0tLS0KKyAgTHVhIGlzIGZyZWVseSBhdmFpbGFibGUgZm9yIGJvdGggYWNhZGVtaWMgYW5kIGNvbW1lcmNpYWwgcHVycG9zZXMuCisgIFNlZSBDT1BZUklHSFQgYW5kIGh0dHA6Ly93d3cubHVhLm9yZy9saWNlbnNlLmh0bWwgZm9yIGRldGFpbHMuCisgIEx1YSBjYW4gYmUgZG93bmxvYWRlZCBhdCBodHRwOi8vd3d3Lmx1YS5vcmcvZG93bmxvYWQuaHRtbCAuCisKKyogSW5zdGFsbGF0aW9uCisgIC0tLS0tLS0tLS0tLQorICBMdWEgaXMgaW1wbGVtZW50ZWQgaW4gcHVyZSBBTlNJIEMsIGFuZCBjb21waWxlcyB1bm1vZGlmaWVkIGluIGFsbCBrbm93bgorICBwbGF0Zm9ybXMgdGhhdCBoYXZlIGFuIEFOU0kgQyBjb21waWxlci4gSW4gbW9zdCBVbml4LWxpa2UgcGxhdGZvcm1zLCBzaW1wbHkKKyAgZG8gIm1ha2UiIHdpdGggYSBzdWl0YWJsZSB0YXJnZXQuIFNlZSBJTlNUQUxMIGZvciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMuCisKKyogT3JpZ2luCisgIC0tLS0tLQorICBMdWEgaXMgZGV2ZWxvcGVkIGF0IEx1YS5vcmcsIGEgbGFib3JhdG9yeSBvZiB0aGUgRGVwYXJ0bWVudCBvZiBDb21wdXRlcgorICBTY2llbmNlIG9mIFBVQy1SaW8gKHRoZSBQb250aWZpY2FsIENhdGhvbGljIFVuaXZlcnNpdHkgb2YgUmlvIGRlIEphbmVpcm8KKyAgaW4gQnJhemlsKS4KKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1dGhvcnMsIHNlZSBodHRwOi8vd3d3Lmx1YS5vcmcvYXV0aG9ycy5odG1sIC4KKworKGVuZCBvZiBSRUFETUUpCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZG9jL2FtYXpvbi5naWYgYi9sdWEtNS4xLjQvZG9jL2FtYXpvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ODZkNQotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9kb2MvYW1hem9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZG9jL2NvbnRlbnRzLmh0bWwgYi9sdWEtNS4xLjQvZG9jL2NvbnRlbnRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1OGUxOAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9kb2MvY29udGVudHMuaHRtbApAQCAtMCwwICsxLDQ5OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkx1YSA1LjEgUmVmZXJlbmNlIE1hbnVhbCAtIGNvbnRlbnRzPC9USVRMRT4KKzxMSU5LIFJFTD0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Imx1YS5jc3MiPgorPE1FVEEgSFRUUC1FUVVJVj0iY29udGVudC10eXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0idGV4dC9jc3MiPgordWwgeworCWxpc3Qtc3R5bGUtdHlwZTogbm9uZSA7CisJbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZSA7Cit9Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWT4KKworPEhSPgorPEgxPgorPEEgSFJFRj0iaHR0cDovL3d3dy5sdWEub3JnLyI+PElNRyBTUkM9ImxvZ28uZ2lmIiBBTFQ9IiIgQk9SREVSPTA+PC9BPgorTHVhIDUuMSBSZWZlcmVuY2UgTWFudWFsCis8L0gxPgorCitUaGlzIGlzIGFuIG9ubGluZSB2ZXJzaW9uIG9mCis8QkxPQ0tRVU9URT4KKzxBIEhSRUY9Imh0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzg1OTAzNzk4MzMvbHVhLWluZGV4bWFudWFsLTIwIj4KKzxJTUcgU1JDPSJjb3Zlci5wbmciIEFMVD0iIiBUSVRMRT0iYnV5IGZyb20gQW1hem9uIiBCT1JERVI9MSBBTElHTj0ibGVmdCIgSFNQQUNFPTEyPgorPC9BPgorPEI+THVhIDUuMSBSZWZlcmVuY2UgTWFudWFsPC9CPgorPEJSPmJ5IFIuIEllcnVzYWxpbXNjaHksIEwuIEguIGRlIEZpZ3VlaXJlZG8sIFcuIENlbGVzCis8QlI+THVhLm9yZywgQXVndXN0IDIwMDYKKzxCUj5JU0JOIDg1LTkwMzc5OC0zLTMKKzxCUj48QSBIUkVGPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvQVNJTi84NTkwMzc5ODMzL2x1YS1pbmRleG1hbnVhbC0yMCI+Cis8SU1HIFNSQz0iYW1hem9uLmdpZiIgQUxUPSJbQnV5IGZyb20gQW1hem9uXSIgQk9SREVSPTA+PC9BPgorPEJSIENMRUFSPSJhbGwiPgorPC9CTE9DS1FVT1RFPgorPFA+CisKK0J1eSBhIGNvcHkgb2YgdGhpcyBib29rIGFuZCAKKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy9kb25hdGlvbnMuaHRtbCI+aGVscCB0byBzdXBwb3J0PC9BPgordGhlIEx1YSBwcm9qZWN0LgorPFA+CisKK1RoZSByZWZlcmVuY2UgbWFudWFsIGlzIHRoZSBvZmZpY2lhbCBkZWZpbml0aW9uIG9mIHRoZSBMdWEgbGFuZ3VhZ2UuCitGb3IgYSBjb21wbGV0ZSBpbnRyb2R1Y3Rpb24gdG8gTHVhIHByb2dyYW1taW5nLCBzZWUgdGhlIGJvb2sKKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy9kb2NzLmh0bWwjYm9va3MiPlByb2dyYW1taW5nIGluIEx1YTwvQT4uCis8UD4KKworPEEgSFJFRj0ibWFudWFsLmh0bWwiPnN0YXJ0PC9BPgorJm1pZGRvdDsKKzxBIEhSRUY9IiNjb250ZW50cyI+Y29udGVudHM8L0E+CismbWlkZG90OworPEEgSFJFRj0iI2luZGV4Ij5pbmRleDwvQT4KKyZtaWRkb3Q7Cis8QSBIUkVGPSJodHRwOi8vd3d3Lmx1YS5vcmcvbWFudWFsLzUuMS9wdC8iPnBvcnR1Z3XqczwvQT4KKyZtaWRkb3Q7Cis8QSBIUkVGPSJodHRwOi8vd3d3Lmx1YS5vcmcvbWFudWFsLzUuMS9lcy8iPmVzcGHxb2w8L0E+Cis8SFI+Cis8U01BTEw+CitDb3B5cmlnaHQgJmNvcHk7IDIwMDYtMjAwOCBMdWEub3JnLCBQVUMtUmlvLgorRnJlZWx5IGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCis8YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmcvbGljZW5zZS5odG1sIzUiPkx1YSBsaWNlbnNlPC9hPi4KKzwvU01BTEw+Cis8UD4KKworPEgyPjxBIE5BTUU9ImNvbnRlbnRzIj5Db250ZW50czwvQT48L0gyPgorPFVMIHN0eWxlPSJwYWRkaW5nOiAwIj4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCI+MSAtIEludHJvZHVjdGlvbjwvQT4KKzxQPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIiPjIgLSBUaGUgTGFuZ3VhZ2U8L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi4xIj4yLjEgLSBMZXhpY2FsIENvbnZlbnRpb25zPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuMiI+Mi4yIC0gVmFsdWVzIGFuZCBUeXBlczwvQT4KKzxVTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjIuMSI+Mi4yLjEgLSBDb2VyY2lvbjwvQT4KKzwvVUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi4zIj4yLjMgLSBWYXJpYWJsZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi40Ij4yLjQgLSBTdGF0ZW1lbnRzPC9BPgorPFVMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuNC4xIj4yLjQuMSAtIENodW5rczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjQuMiI+Mi40LjIgLSBCbG9ja3M8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi40LjMiPjIuNC4zIC0gQXNzaWdubWVudDwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjQuNCI+Mi40LjQgLSBDb250cm9sIFN0cnVjdHVyZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi40LjUiPjIuNC41IC0gRm9yIFN0YXRlbWVudDwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjQuNiI+Mi40LjYgLSBGdW5jdGlvbiBDYWxscyBhcyBTdGF0ZW1lbnRzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuNC43Ij4yLjQuNyAtIExvY2FsIERlY2xhcmF0aW9uczwvQT4KKzwvVUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi41Ij4yLjUgLSBFeHByZXNzaW9uczwvQT4KKzxVTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjUuMSI+Mi41LjEgLSBBcml0aG1ldGljIE9wZXJhdG9yczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjUuMiI+Mi41LjIgLSBSZWxhdGlvbmFsIE9wZXJhdG9yczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjUuMyI+Mi41LjMgLSBMb2dpY2FsIE9wZXJhdG9yczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjUuNCI+Mi41LjQgLSBDb25jYXRlbmF0aW9uPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuNS41Ij4yLjUuNSAtIFRoZSBMZW5ndGggT3BlcmF0b3I8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi41LjYiPjIuNS42IC0gUHJlY2VkZW5jZTwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjUuNyI+Mi41LjcgLSBUYWJsZSBDb25zdHJ1Y3RvcnM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi41LjgiPjIuNS44IC0gRnVuY3Rpb24gQ2FsbHM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi41LjkiPjIuNS45IC0gRnVuY3Rpb24gRGVmaW5pdGlvbnM8L0E+Cis8L1VMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuNiI+Mi42IC0gVmlzaWJpbGl0eSBSdWxlczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjciPjIuNyAtIEVycm9yIEhhbmRsaW5nPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuOCI+Mi44IC0gTWV0YXRhYmxlczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjkiPjIuOSAtIEVudmlyb25tZW50czwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjEwIj4yLjEwIC0gR2FyYmFnZSBDb2xsZWN0aW9uPC9BPgorPFVMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuMTAuMSI+Mi4xMC4xIC0gR2FyYmFnZS1Db2xsZWN0aW9uIE1ldGFtZXRob2RzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuMTAuMiI+Mi4xMC4yIC0gV2VhayBUYWJsZXM8L0E+Cis8L1VMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuMTEiPjIuMTEgLSBDb3JvdXRpbmVzPC9BPgorPC9VTD4KKzxQPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzMiPjMgLSBUaGUgQXBwbGljYXRpb24gUHJvZ3JhbSBJbnRlcmZhY2U8L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy4xIj4zLjEgLSBUaGUgU3RhY2s8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy4yIj4zLjIgLSBTdGFjayBTaXplPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzMuMyI+My4zIC0gUHNldWRvLUluZGljZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy40Ij4zLjQgLSBDIENsb3N1cmVzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzMuNSI+My41IC0gUmVnaXN0cnk8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy42Ij4zLjYgLSBFcnJvciBIYW5kbGluZyBpbiBDPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzMuNyI+My43IC0gRnVuY3Rpb25zIGFuZCBUeXBlczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjgiPjMuOCAtIFRoZSBEZWJ1ZyBJbnRlcmZhY2U8L0E+Cis8L1VMPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNCI+NCAtIFRoZSBBdXhpbGlhcnkgTGlicmFyeTwvQT4KKzxVTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM0LjEiPjQuMSAtIEZ1bmN0aW9ucyBhbmQgVHlwZXM8L0E+Cis8L1VMPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNSI+NSAtIFN0YW5kYXJkIExpYnJhcmllczwvQT4KKzxVTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM1LjEiPjUuMSAtIEJhc2ljIEZ1bmN0aW9uczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM1LjIiPjUuMiAtIENvcm91dGluZSBNYW5pcHVsYXRpb248L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNS4zIj41LjMgLSBNb2R1bGVzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzUuNCI+NS40IC0gU3RyaW5nIE1hbmlwdWxhdGlvbjwvQT4KKzxVTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM1LjQuMSI+NS40LjEgLSBQYXR0ZXJuczwvQT4KKzwvVUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNS41Ij41LjUgLSBUYWJsZSBNYW5pcHVsYXRpb248L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNS42Ij41LjYgLSBNYXRoZW1hdGljYWwgRnVuY3Rpb25zPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzUuNyI+NS43IC0gSW5wdXQgYW5kIE91dHB1dCBGYWNpbGl0aWVzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzUuOCI+NS44IC0gT3BlcmF0aW5nIFN5c3RlbSBGYWNpbGl0aWVzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzUuOSI+NS45IC0gVGhlIERlYnVnIExpYnJhcnk8L0E+Cis8L1VMPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNiI+NiAtIEx1YSBTdGFuZC1hbG9uZTwvQT4KKzxQPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzciPjcgLSBJbmNvbXBhdGliaWxpdGllcyB3aXRoIHRoZSBQcmV2aW91cyBWZXJzaW9uPC9BPgorPFVMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzcuMSI+Ny4xIC0gQ2hhbmdlcyBpbiB0aGUgTGFuZ3VhZ2U8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNy4yIj43LjIgLSBDaGFuZ2VzIGluIHRoZSBMaWJyYXJpZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNy4zIj43LjMgLSBDaGFuZ2VzIGluIHRoZSBBUEk8L0E+Cis8L1VMPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjOCI+OCAtIFRoZSBDb21wbGV0ZSBTeW50YXggb2YgTHVhPC9BPgorPC9VTD4KKworPEgyPjxBIE5BTUU9ImluZGV4Ij5JbmRleDwvQT48L0gyPgorPFRBQkxFIFdJRFRIPSIxMDAlIj4KKzxUUiBWQUxJR049InRvcCI+Cis8VEQ+Cis8SDM+PEEgTkFNRT0iZnVuY3Rpb25zIj5MdWEgZnVuY3Rpb25zPC9BPjwvSDM+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtX0ciPl9HPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1fVkVSU0lPTiI+X1ZFUlNJT048L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWFzc2VydCI+YXNzZXJ0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1jb2xsZWN0Z2FyYmFnZSI+Y29sbGVjdGdhcmJhZ2U8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRvZmlsZSI+ZG9maWxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1lcnJvciI+ZXJyb3I8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWdldGZlbnYiPmdldGZlbnY8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWdldG1ldGF0YWJsZSI+Z2V0bWV0YXRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pcGFpcnMiPmlwYWlyczwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbG9hZCI+bG9hZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbG9hZGZpbGUiPmxvYWRmaWxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1sb2Fkc3RyaW5nIj5sb2Fkc3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tb2R1bGUiPm1vZHVsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbmV4dCI+bmV4dDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcGFpcnMiPnBhaXJzPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1wY2FsbCI+cGNhbGw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXByaW50Ij5wcmludDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcmF3ZXF1YWwiPnJhd2VxdWFsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1yYXdnZXQiPnJhd2dldDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcmF3c2V0Ij5yYXdzZXQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXJlcXVpcmUiPnJlcXVpcmU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXNlbGVjdCI+c2VsZWN0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zZXRmZW52Ij5zZXRmZW52PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zZXRtZXRhdGFibGUiPnNldG1ldGF0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtdG9udW1iZXIiPnRvbnVtYmVyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi10b3N0cmluZyI+dG9zdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXR5cGUiPnR5cGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXVucGFjayI+dW5wYWNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi14cGNhbGwiPnhwY2FsbDwvQT48QlI+Cis8UD4KKworPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWNvcm91dGluZS5jcmVhdGUiPmNvcm91dGluZS5jcmVhdGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWNvcm91dGluZS5yZXN1bWUiPmNvcm91dGluZS5yZXN1bWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWNvcm91dGluZS5ydW5uaW5nIj5jb3JvdXRpbmUucnVubmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtY29yb3V0aW5lLnN0YXR1cyI+Y29yb3V0aW5lLnN0YXR1czwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtY29yb3V0aW5lLndyYXAiPmNvcm91dGluZS53cmFwPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1jb3JvdXRpbmUueWllbGQiPmNvcm91dGluZS55aWVsZDwvQT48QlI+Cis8UD4KKworPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLmRlYnVnIj5kZWJ1Zy5kZWJ1ZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZGVidWcuZ2V0ZmVudiI+ZGVidWcuZ2V0ZmVudjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZGVidWcuZ2V0aG9vayI+ZGVidWcuZ2V0aG9vazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZGVidWcuZ2V0aW5mbyI+ZGVidWcuZ2V0aW5mbzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZGVidWcuZ2V0bG9jYWwiPmRlYnVnLmdldGxvY2FsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5nZXRtZXRhdGFibGUiPmRlYnVnLmdldG1ldGF0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZGVidWcuZ2V0cmVnaXN0cnkiPmRlYnVnLmdldHJlZ2lzdHJ5PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5nZXR1cHZhbHVlIj5kZWJ1Zy5nZXR1cHZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5zZXRmZW52Ij5kZWJ1Zy5zZXRmZW52PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5zZXRob29rIj5kZWJ1Zy5zZXRob29rPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5zZXRsb2NhbCI+ZGVidWcuc2V0bG9jYWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLnNldG1ldGF0YWJsZSI+ZGVidWcuc2V0bWV0YXRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5zZXR1cHZhbHVlIj5kZWJ1Zy5zZXR1cHZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy50cmFjZWJhY2siPmRlYnVnLnRyYWNlYmFjazwvQT48QlI+CisKKzwvVEQ+Cis8VEQ+Cis8SDM+Jm5ic3A7PC9IMz4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1maWxlOmNsb3NlIj5maWxlOmNsb3NlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1maWxlOmZsdXNoIj5maWxlOmZsdXNoPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1maWxlOmxpbmVzIj5maWxlOmxpbmVzPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1maWxlOnJlYWQiPmZpbGU6cmVhZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZmlsZTpzZWVrIj5maWxlOnNlZWs8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWZpbGU6c2V0dmJ1ZiI+ZmlsZTpzZXR2YnVmPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1maWxlOndyaXRlIj5maWxlOndyaXRlPC9BPjxCUj4KKzxQPgorCis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8uY2xvc2UiPmlvLmNsb3NlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5mbHVzaCI+aW8uZmx1c2g8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlvLmlucHV0Ij5pby5pbnB1dDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8ubGluZXMiPmlvLmxpbmVzPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5vcGVuIj5pby5vcGVuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5vdXRwdXQiPmlvLm91dHB1dDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8ucG9wZW4iPmlvLnBvcGVuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5yZWFkIj5pby5yZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5zdGRlcnIiPmlvLnN0ZGVycjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8uc3RkaW4iPmlvLnN0ZGluPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5zdGRvdXQiPmlvLnN0ZG91dDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8udG1wZmlsZSI+aW8udG1wZmlsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8udHlwZSI+aW8udHlwZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8ud3JpdGUiPmlvLndyaXRlPC9BPjxCUj4KKzxQPgorCis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5hYnMiPm1hdGguYWJzPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmFjb3MiPm1hdGguYWNvczwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5hc2luIj5tYXRoLmFzaW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguYXRhbiI+bWF0aC5hdGFuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmF0YW4yIj5tYXRoLmF0YW4yPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmNlaWwiPm1hdGguY2VpbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5jb3MiPm1hdGguY29zPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmNvc2giPm1hdGguY29zaDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5kZWciPm1hdGguZGVnPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmV4cCI+bWF0aC5leHA8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguZmxvb3IiPm1hdGguZmxvb3I8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguZm1vZCI+bWF0aC5mbW9kPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmZyZXhwIj5tYXRoLmZyZXhwPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmh1Z2UiPm1hdGguaHVnZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5sZGV4cCI+bWF0aC5sZGV4cDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5sb2ciPm1hdGgubG9nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmxvZzEwIj5tYXRoLmxvZzEwPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLm1heCI+bWF0aC5tYXg8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGgubWluIj5tYXRoLm1pbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5tb2RmIj5tYXRoLm1vZGY8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGgucGkiPm1hdGgucGk8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGgucG93Ij5tYXRoLnBvdzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5yYWQiPm1hdGgucmFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLnJhbmRvbSI+bWF0aC5yYW5kb208L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGgucmFuZG9tc2VlZCI+bWF0aC5yYW5kb21zZWVkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLnNpbiI+bWF0aC5zaW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguc2luaCI+bWF0aC5zaW5oPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLnNxcnQiPm1hdGguc3FydDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC50YW4iPm1hdGgudGFuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLnRhbmgiPm1hdGgudGFuaDwvQT48QlI+Cis8UD4KKworPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW9zLmNsb2NrIj5vcy5jbG9jazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtb3MuZGF0ZSI+b3MuZGF0ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtb3MuZGlmZnRpbWUiPm9zLmRpZmZ0aW1lPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy5leGVjdXRlIj5vcy5leGVjdXRlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy5leGl0Ij5vcy5leGl0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy5nZXRlbnYiPm9zLmdldGVudjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtb3MucmVtb3ZlIj5vcy5yZW1vdmU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW9zLnJlbmFtZSI+b3MucmVuYW1lPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy5zZXRsb2NhbGUiPm9zLnNldGxvY2FsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtb3MudGltZSI+b3MudGltZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtb3MudG1wbmFtZSI+b3MudG1wbmFtZTwvQT48QlI+Cis8UD4KKworPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXBhY2thZ2UuY3BhdGgiPnBhY2thZ2UuY3BhdGg8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXBhY2thZ2UubG9hZGVkIj5wYWNrYWdlLmxvYWRlZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcGFja2FnZS5sb2FkZXJzIj5wYWNrYWdlLmxvYWRlcnM8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXBhY2thZ2UubG9hZGxpYiI+cGFja2FnZS5sb2FkbGliPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1wYWNrYWdlLnBhdGgiPnBhY2thZ2UucGF0aDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcGFja2FnZS5wcmVsb2FkIj5wYWNrYWdlLnByZWxvYWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXBhY2thZ2Uuc2VlYWxsIj5wYWNrYWdlLnNlZWFsbDwvQT48QlI+Cis8UD4KKworPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5ieXRlIj5zdHJpbmcuYnl0ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLmNoYXIiPnN0cmluZy5jaGFyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zdHJpbmcuZHVtcCI+c3RyaW5nLmR1bXA8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5maW5kIj5zdHJpbmcuZmluZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLmZvcm1hdCI+c3RyaW5nLmZvcm1hdDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLmdtYXRjaCI+c3RyaW5nLmdtYXRjaDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLmdzdWIiPnN0cmluZy5nc3ViPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zdHJpbmcubGVuIj5zdHJpbmcubGVuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zdHJpbmcubG93ZXIiPnN0cmluZy5sb3dlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLm1hdGNoIj5zdHJpbmcubWF0Y2g8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5yZXAiPnN0cmluZy5yZXA8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5yZXZlcnNlIj5zdHJpbmcucmV2ZXJzZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLnN1YiI+c3RyaW5nLnN1YjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLnVwcGVyIj5zdHJpbmcudXBwZXI8L0E+PEJSPgorPFA+CisKKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi10YWJsZS5jb25jYXQiPnRhYmxlLmNvbmNhdDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtdGFibGUuaW5zZXJ0Ij50YWJsZS5pbnNlcnQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXRhYmxlLm1heG4iPnRhYmxlLm1heG48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXRhYmxlLnJlbW92ZSI+dGFibGUucmVtb3ZlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi10YWJsZS5zb3J0Ij50YWJsZS5zb3J0PC9BPjxCUj4KKworPC9URD4KKzxURD4KKzxIMz5DIEFQSTwvSDM+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfQWxsb2MiPmx1YV9BbGxvYzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfQ0Z1bmN0aW9uIj5sdWFfQ0Z1bmN0aW9uPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9EZWJ1ZyI+bHVhX0RlYnVnPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9Ib29rIj5sdWFfSG9vazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfSW50ZWdlciI+bHVhX0ludGVnZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX051bWJlciI+bHVhX051bWJlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfUmVhZGVyIj5sdWFfUmVhZGVyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9TdGF0ZSI+bHVhX1N0YXRlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9Xcml0ZXIiPmx1YV9Xcml0ZXI8L0E+PEJSPgorPFA+CisKKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9hdHBhbmljIj5sdWFfYXRwYW5pYzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfY2FsbCI+bHVhX2NhbGw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2NoZWNrc3RhY2siPmx1YV9jaGVja3N0YWNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9jbG9zZSI+bHVhX2Nsb3NlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9jb25jYXQiPmx1YV9jb25jYXQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2NwY2FsbCI+bHVhX2NwY2FsbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfY3JlYXRldGFibGUiPmx1YV9jcmVhdGV0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZHVtcCI+bHVhX2R1bXA8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2VxdWFsIj5sdWFfZXF1YWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2Vycm9yIj5sdWFfZXJyb3I8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2djIj5sdWFfZ2M8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldGFsbG9jZiI+bHVhX2dldGFsbG9jZjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0ZmVudiI+bHVhX2dldGZlbnY8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldGZpZWxkIj5sdWFfZ2V0ZmllbGQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldGdsb2JhbCI+bHVhX2dldGdsb2JhbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0aG9vayI+bHVhX2dldGhvb2s8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldGhvb2tjb3VudCI+bHVhX2dldGhvb2tjb3VudDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0aG9va21hc2siPmx1YV9nZXRob29rbWFzazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0aW5mbyI+bHVhX2dldGluZm88L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldGxvY2FsIj5sdWFfZ2V0bG9jYWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldG1ldGF0YWJsZSI+bHVhX2dldG1ldGF0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0c3RhY2siPmx1YV9nZXRzdGFjazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0dGFibGUiPmx1YV9nZXR0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0dG9wIj5sdWFfZ2V0dG9wPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXR1cHZhbHVlIj5sdWFfZ2V0dXB2YWx1ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfaW5zZXJ0Ij5sdWFfaW5zZXJ0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc2Jvb2xlYW4iPmx1YV9pc2Jvb2xlYW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzY2Z1bmN0aW9uIj5sdWFfaXNjZnVuY3Rpb248L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzZnVuY3Rpb24iPmx1YV9pc2Z1bmN0aW9uPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc2xpZ2h0dXNlcmRhdGEiPmx1YV9pc2xpZ2h0dXNlcmRhdGE8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzbmlsIj5sdWFfaXNuaWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzbm9uZSI+bHVhX2lzbm9uZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfaXNub25lb3JuaWwiPmx1YV9pc25vbmVvcm5pbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfaXNudW1iZXIiPmx1YV9pc251bWJlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfaXNzdHJpbmciPmx1YV9pc3N0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfaXN0YWJsZSI+bHVhX2lzdGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzdGhyZWFkIj5sdWFfaXN0aHJlYWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzdXNlcmRhdGEiPmx1YV9pc3VzZXJkYXRhPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9sZXNzdGhhbiI+bHVhX2xlc3N0aGFuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9sb2FkIj5sdWFfbG9hZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfbmV3c3RhdGUiPmx1YV9uZXdzdGF0ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfbmV3dGFibGUiPmx1YV9uZXd0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfbmV3dGhyZWFkIj5sdWFfbmV3dGhyZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9uZXd1c2VyZGF0YSI+bHVhX25ld3VzZXJkYXRhPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9uZXh0Ij5sdWFfbmV4dDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfb2JqbGVuIj5sdWFfb2JqbGVuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9wY2FsbCI+bHVhX3BjYWxsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9wb3AiPmx1YV9wb3A8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hib29sZWFuIj5sdWFfcHVzaGJvb2xlYW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hjY2xvc3VyZSI+bHVhX3B1c2hjY2xvc3VyZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaGNmdW5jdGlvbiI+bHVhX3B1c2hjZnVuY3Rpb248L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hmc3RyaW5nIj5sdWFfcHVzaGZzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hpbnRlZ2VyIj5sdWFfcHVzaGludGVnZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hsaWdodHVzZXJkYXRhIj5sdWFfcHVzaGxpZ2h0dXNlcmRhdGE8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hsaXRlcmFsIj5sdWFfcHVzaGxpdGVyYWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hsc3RyaW5nIj5sdWFfcHVzaGxzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2huaWwiPmx1YV9wdXNobmlsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9wdXNobnVtYmVyIj5sdWFfcHVzaG51bWJlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaHN0cmluZyI+bHVhX3B1c2hzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2h0aHJlYWQiPmx1YV9wdXNodGhyZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9wdXNodmFsdWUiPmx1YV9wdXNodmFsdWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2h2ZnN0cmluZyI+bHVhX3B1c2h2ZnN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmF3ZXF1YWwiPmx1YV9yYXdlcXVhbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmF3Z2V0Ij5sdWFfcmF3Z2V0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9yYXdnZXRpIj5sdWFfcmF3Z2V0aTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmF3c2V0Ij5sdWFfcmF3c2V0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9yYXdzZXRpIj5sdWFfcmF3c2V0aTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmVnaXN0ZXIiPmx1YV9yZWdpc3RlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmVtb3ZlIj5sdWFfcmVtb3ZlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9yZXBsYWNlIj5sdWFfcmVwbGFjZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmVzdW1lIj5sdWFfcmVzdW1lPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXRhbGxvY2YiPmx1YV9zZXRhbGxvY2Y8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3NldGZlbnYiPmx1YV9zZXRmZW52PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXRmaWVsZCI+bHVhX3NldGZpZWxkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXRnbG9iYWwiPmx1YV9zZXRnbG9iYWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3NldGhvb2siPmx1YV9zZXRob29rPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXRsb2NhbCI+bHVhX3NldGxvY2FsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXRtZXRhdGFibGUiPmx1YV9zZXRtZXRhdGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3NldHRhYmxlIj5sdWFfc2V0dGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3NldHRvcCI+bHVhX3NldHRvcDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfc2V0dXB2YWx1ZSI+bHVhX3NldHVwdmFsdWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3N0YXR1cyI+bHVhX3N0YXR1czwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdG9ib29sZWFuIj5sdWFfdG9ib29sZWFuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b2NmdW5jdGlvbiI+bHVhX3RvY2Z1bmN0aW9uPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b2ludGVnZXIiPmx1YV90b2ludGVnZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3RvbHN0cmluZyI+bHVhX3RvbHN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdG9udW1iZXIiPmx1YV90b251bWJlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdG9wb2ludGVyIj5sdWFfdG9wb2ludGVyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b3N0cmluZyI+bHVhX3Rvc3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b3RocmVhZCI+bHVhX3RvdGhyZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b3VzZXJkYXRhIj5sdWFfdG91c2VyZGF0YTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdHlwZSI+bHVhX3R5cGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3R5cGVuYW1lIj5sdWFfdHlwZW5hbWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3VwdmFsdWVpbmRleCI+bHVhX3VwdmFsdWVpbmRleDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfeG1vdmUiPmx1YV94bW92ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfeWllbGQiPmx1YV95aWVsZDwvQT48QlI+CisKKzwvVEQ+Cis8VEQ+Cis8SDM+YXV4aWxpYXJ5IGxpYnJhcnk8L0gzPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9CdWZmZXIiPmx1YUxfQnVmZmVyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfUmVnIj5sdWFMX1JlZzwvQT48QlI+Cis8UD4KKworPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9hZGRjaGFyIj5sdWFMX2FkZGNoYXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9hZGRsc3RyaW5nIj5sdWFMX2FkZGxzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9hZGRzaXplIj5sdWFMX2FkZHNpemU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9hZGRzdHJpbmciPmx1YUxfYWRkc3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfYWRkdmFsdWUiPmx1YUxfYWRkdmFsdWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9hcmdjaGVjayI+bHVhTF9hcmdjaGVjazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2FyZ2Vycm9yIj5sdWFMX2FyZ2Vycm9yPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfYnVmZmluaXQiPmx1YUxfYnVmZmluaXQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jYWxsbWV0YSI+bHVhTF9jYWxsbWV0YTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2NoZWNrYW55Ij5sdWFMX2NoZWNrYW55PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tpbnQiPmx1YUxfY2hlY2tpbnQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jaGVja2ludGVnZXIiPmx1YUxfY2hlY2tpbnRlZ2VyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tsb25nIj5sdWFMX2NoZWNrbG9uZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2NoZWNrbHN0cmluZyI+bHVhTF9jaGVja2xzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jaGVja251bWJlciI+bHVhTF9jaGVja251bWJlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2NoZWNrb3B0aW9uIj5sdWFMX2NoZWNrb3B0aW9uPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tzdGFjayI+bHVhTF9jaGVja3N0YWNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tzdHJpbmciPmx1YUxfY2hlY2tzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jaGVja3R5cGUiPmx1YUxfY2hlY2t0eXBlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2t1ZGF0YSI+bHVhTF9jaGVja3VkYXRhPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfZG9maWxlIj5sdWFMX2RvZmlsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2Rvc3RyaW5nIj5sdWFMX2Rvc3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfZXJyb3IiPmx1YUxfZXJyb3I8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9nZXRtZXRhZmllbGQiPmx1YUxfZ2V0bWV0YWZpZWxkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfZ2V0bWV0YXRhYmxlIj5sdWFMX2dldG1ldGF0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2dzdWIiPmx1YUxfZ3N1YjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2xvYWRidWZmZXIiPmx1YUxfbG9hZGJ1ZmZlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2xvYWRmaWxlIj5sdWFMX2xvYWRmaWxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfbG9hZHN0cmluZyI+bHVhTF9sb2Fkc3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfbmV3bWV0YXRhYmxlIj5sdWFMX25ld21ldGF0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX25ld3N0YXRlIj5sdWFMX25ld3N0YXRlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfb3BlbmxpYnMiPmx1YUxfb3BlbmxpYnM8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9vcHRpbnQiPmx1YUxfb3B0aW50PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfb3B0aW50ZWdlciI+bHVhTF9vcHRpbnRlZ2VyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfb3B0bG9uZyI+bHVhTF9vcHRsb25nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfb3B0bHN0cmluZyI+bHVhTF9vcHRsc3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfb3B0bnVtYmVyIj5sdWFMX29wdG51bWJlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX29wdHN0cmluZyI+bHVhTF9vcHRzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9wcmVwYnVmZmVyIj5sdWFMX3ByZXBidWZmZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9wdXNocmVzdWx0Ij5sdWFMX3B1c2hyZXN1bHQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9yZWYiPmx1YUxfcmVmPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfcmVnaXN0ZXIiPmx1YUxfcmVnaXN0ZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF90eXBlbmFtZSI+bHVhTF90eXBlbmFtZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX3R5cGVycm9yIj5sdWFMX3R5cGVycm9yPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfdW5yZWYiPmx1YUxfdW5yZWY8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF93aGVyZSI+bHVhTF93aGVyZTwvQT48QlI+CisKKzwvVEQ+Cis8L1RSPgorPC9UQUJMRT4KKzxQPgorCis8SFI+Cis8U01BTEw+CitMYXN0IHVwZGF0ZToKK1NhdCBKYW4gMTkgMTM6MjQ6MjkgQlJTVCAyMDA4Cis8L1NNQUxMPgorPCEtLQorTGFzdCBjaGFuZ2U6IHJldmlzZWQgZm9yIEx1YSA1LjEuMworLS0+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9kb2MvY292ZXIucG5nIGIvbHVhLTUuMS40L2RvYy9jb3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiYjE5OAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9kb2MvY292ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9kb2MvbG9nby5naWYgYi9sdWEtNS4xLjQvZG9jL2xvZ28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNWU0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvZG9jL2xvZ28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9kb2MvbHVhLjEgYi9sdWEtNS4xLjQvZG9jL2x1YS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODA5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvZG9jL2x1YS4xCkBAIC0wLDAgKzEsMTYzIEBACisuXCIgJElkOiBsdWEubWFuLHYgMS4xMSAyMDA2LzAxLzA2IDE2OjAzOjM0IGxoZiBFeHAgJAorLlRIIExVQSAxICIkRGF0ZTogMjAwNi8wMS8wNiAxNjowMzozNCAkIgorLlNIIE5BTUUKK2x1YSBcLSBMdWEgaW50ZXJwcmV0ZXIKKy5TSCBTWU5PUFNJUworLkIgbHVhCitbCisuSSBvcHRpb25zCitdCitbCisuSSBzY3JpcHQKK1sKKy5JIGFyZ3MKK10KK10KKy5TSCBERVNDUklQVElPTgorLkIgbHVhCitpcyB0aGUgc3RhbmQtYWxvbmUgTHVhIGludGVycHJldGVyLgorSXQgbG9hZHMgYW5kIGV4ZWN1dGVzIEx1YSBwcm9ncmFtcywKK2VpdGhlciBpbiB0ZXh0dWFsIHNvdXJjZSBmb3JtIG9yCitpbiBwcmVjb21waWxlZCBiaW5hcnkgZm9ybS4KKyhQcmVjb21waWxlZCBiaW5hcmllcyBhcmUgb3V0cHV0IGJ5CisuQlIgbHVhYyAsCit0aGUgTHVhIGNvbXBpbGVyLikKKy5CIGx1YQorY2FuIGJlIHVzZWQgYXMgYSBiYXRjaCBpbnRlcnByZXRlciBhbmQgYWxzbyBpbnRlcmFjdGl2ZWx5LgorLkxQCitUaGUgZ2l2ZW4KKy5JIG9wdGlvbnMKKyhzZWUgYmVsb3cpCithcmUgZXhlY3V0ZWQgYW5kIHRoZW4KK3RoZSBMdWEgcHJvZ3JhbSBpbiBmaWxlCisuSSBzY3JpcHQKK2lzIGxvYWRlZCBhbmQgZXhlY3V0ZWQuCitUaGUgZ2l2ZW4KKy5JIGFyZ3MKK2FyZSBhdmFpbGFibGUgdG8KKy5JIHNjcmlwdAorYXMgc3RyaW5ncyBpbiBhIGdsb2JhbCB0YWJsZSBuYW1lZAorLkJSIGFyZyAuCitJZiB0aGVzZSBhcmd1bWVudHMgY29udGFpbiBzcGFjZXMgb3Igb3RoZXIgY2hhcmFjdGVycyBzcGVjaWFsIHRvIHRoZSBzaGVsbCwKK3RoZW4gdGhleSBzaG91bGQgYmUgcXVvdGVkCisoYnV0IG5vdGUgdGhhdCB0aGUgcXVvdGVzIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgc2hlbGwpLgorVGhlIGFyZ3VtZW50cyBpbgorLkIgYXJnCitzdGFydCBhdCAwLAord2hpY2ggY29udGFpbnMgdGhlIHN0cmluZworLlJJICcgc2NyaXB0ICcuCitUaGUgaW5kZXggb2YgdGhlIGxhc3QgYXJndW1lbnQgaXMgc3RvcmVkIGluCisuQlIgYXJnLm4gLgorVGhlIGFyZ3VtZW50cyBnaXZlbiBpbiB0aGUgY29tbWFuZCBsaW5lIGJlZm9yZQorLklSIHNjcmlwdCAsCitpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIGludGVycHJldGVyLAorYXJlIGF2YWlsYWJsZSBpbiBuZWdhdGl2ZSBpbmRpY2VzIGluCisuQlIgYXJnIC4KKy5MUAorQXQgdGhlIHZlcnkgc3RhcnQsCitiZWZvcmUgZXZlbiBoYW5kbGluZyB0aGUgY29tbWFuZCBsaW5lLAorLkIgbHVhCitleGVjdXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisuQlIgTFVBX0lOSVQgLAoraWYgaXQgaXMgZGVmaW5lZC4KK0lmIHRoZSB2YWx1ZSBvZgorLkIgTFVBX0lOSVQKK2lzIG9mIHRoZSBmb3JtCisuUkkgJ0AgZmlsZW5hbWUgJywKK3RoZW4KKy5JIGZpbGVuYW1lCitpcyBleGVjdXRlZC4KK090aGVyd2lzZSwgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIGEgTHVhIHN0YXRlbWVudCBhbmQgaXMgZXhlY3V0ZWQuCisuTFAKK09wdGlvbnMgc3RhcnQgd2l0aAorLkIgJ1wtJworYW5kIGFyZSBkZXNjcmliZWQgYmVsb3cuCitZb3UgY2FuIHVzZQorLkIgIidcLS0nIgordG8gc2lnbmFsIHRoZSBlbmQgb2Ygb3B0aW9ucy4KKy5MUAorSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwKK3RoZW4KKy5CICJcLXYgXC1pIgoraXMgYXNzdW1lZCB3aGVuIHRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhIHRlcm1pbmFsOworb3RoZXJ3aXNlLAorLkIgIlwtIgoraXMgYXNzdW1lZC4KKy5MUAorSW4gaW50ZXJhY3RpdmUgbW9kZSwKKy5CIGx1YQorcHJvbXB0cyB0aGUgdXNlciwKK3JlYWRzIGxpbmVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LAorYW5kIGV4ZWN1dGVzIHRoZW0gYXMgdGhleSBhcmUgcmVhZC4KK0lmIGEgbGluZSBkb2VzIG5vdCBjb250YWluIGEgY29tcGxldGUgc3RhdGVtZW50LAordGhlbiBhIHNlY29uZGFyeSBwcm9tcHQgaXMgZGlzcGxheWVkIGFuZAorbGluZXMgYXJlIHJlYWQgdW50aWwgYSBjb21wbGV0ZSBzdGF0ZW1lbnQgaXMgZm9ybWVkIG9yCithIHN5bnRheCBlcnJvciBpcyBmb3VuZC4KK1NvLCBvbmUgd2F5IHRvIGludGVycnVwdCB0aGUgcmVhZGluZyBvZiBhbiBpbmNvbXBsZXRlIHN0YXRlbWVudCBpcwordG8gZm9yY2UgYSBzeW50YXggZXJyb3I6CithZGRpbmcgYQorLkIgJzsnIAoraW4gdGhlIG1pZGRsZSBvZiBhIHN0YXRlbWVudCBpcyBhIHN1cmUgd2F5IG9mIGZvcmNpbmcgYSBzeW50YXggZXJyb3IKKyhleGNlcHQgaW5zaWRlIG11bHRpbGluZSBzdHJpbmdzIGFuZCBjb21tZW50czsgdGhlc2UgbXVzdCBiZSBjbG9zZWQgZXhwbGljaXRseSkuCitJZiBhIGxpbmUgc3RhcnRzIHdpdGgKKy5CUiAnPScgLAordGhlbgorLkIgbHVhCitkaXNwbGF5cyB0aGUgdmFsdWVzIG9mIGFsbCB0aGUgZXhwcmVzc2lvbnMgaW4gdGhlIHJlbWFpbmRlciBvZiB0aGUKK2xpbmUuIFRoZSBleHByZXNzaW9ucyBtdXN0IGJlIHNlcGFyYXRlZCBieSBjb21tYXMuCitUaGUgcHJpbWFyeSBwcm9tcHQgaXMgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUKKy5CUiBfUFJPTVBUICwKK2lmIHRoaXMgdmFsdWUgaXMgYSBzdHJpbmc7CitvdGhlcndpc2UsIHRoZSBkZWZhdWx0IHByb21wdCBpcyB1c2VkLgorU2ltaWxhcmx5LCB0aGUgc2Vjb25kYXJ5IHByb21wdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZQorLkJSIF9QUk9NUFQyIC4KK1NvLAordG8gY2hhbmdlIHRoZSBwcm9tcHRzLAorc2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIHRvIGEgc3RyaW5nIG9mIHlvdXIgY2hvaWNlLgorWW91IGNhbiBkbyB0aGF0IGFmdGVyIGNhbGxpbmcgdGhlIGludGVycHJldGVyCitvciBvbiB0aGUgY29tbWFuZCBsaW5lCisoYnV0IGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggcXVvdGVzCitpZiB0aGUgcHJvbXB0IHN0cmluZyBjb250YWlucyBhIHNwYWNlOyBvdGhlcndpc2UgeW91IG1heSBjb25mdXNlIHRoZSBzaGVsbC4pCitUaGUgZGVmYXVsdCBwcm9tcHRzIGFyZSAiPiAiIGFuZCAiPj4gIi4KKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtCitsb2FkIGFuZCBleGVjdXRlIHRoZSBzdGFuZGFyZCBpbnB1dCBhcyBhIGZpbGUsCit0aGF0IGlzLAorbm90IGludGVyYWN0aXZlbHksCitldmVuIHdoZW4gdGhlIHN0YW5kYXJkIGlucHV0IGlzIGEgdGVybWluYWwuCisuVFAKKy5CSSBcLWUgIiBzdGF0IgorZXhlY3V0ZSBzdGF0ZW1lbnQKKy5JUiBzdGF0IC4KK1lvdSBuZWVkIHRvIHF1b3RlCisuSSBzdGF0IAoraWYgaXQgY29udGFpbnMgc3BhY2VzLCBxdW90ZXMsCitvciBvdGhlciBjaGFyYWN0ZXJzIHNwZWNpYWwgdG8gdGhlIHNoZWxsLgorLlRQCisuQiBcLWkKK2VudGVyIGludGVyYWN0aXZlIG1vZGUgYWZ0ZXIKKy5JIHNjcmlwdAoraXMgZXhlY3V0ZWQuCisuVFAKKy5CSSBcLWwgIiBuYW1lIgorY2FsbAorLkJJIHJlcXVpcmUoJyBuYW1lICcpCitiZWZvcmUgZXhlY3V0aW5nCisuSVIgc2NyaXB0IC4KK1R5cGljYWxseSB1c2VkIHRvIGxvYWQgbGlicmFyaWVzLgorLlRQCisuQiBcLXYKK3Nob3cgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKy5TSCAiU0VFIEFMU08iCisuQlIgbHVhYyAoMSkKKy5icgoraHR0cDovL3d3dy5sdWEub3JnLworLlNIIERJQUdOT1NUSUNTCitFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgc2VsZiBleHBsYW5hdG9yeS4KKy5TSCBBVVRIT1JTCitSLiBJZXJ1c2FsaW1zY2h5LAorTC4gSC4gZGUgRmlndWVpcmVkbywKK2FuZAorVy4gQ2VsZXMKKy5cIiBFT0YKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9kb2MvbHVhLmNzcyBiL2x1YS01LjEuNC9kb2MvbHVhLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzljZjExCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2RvYy9sdWEuY3NzCkBAIC0wLDAgKzEsNDEgQEAKK2JvZHkgeworCWNvbG9yOiAjMDAwMDAwIDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGIDsKKwlmb250LWZhbWlseTogc2Fucy1zZXJpZiA7CisJdGV4dC1hbGlnbjoganVzdGlmeSA7CisJbWFyZ2luLXJpZ2h0OiAyMHB4IDsKKwltYXJnaW4tbGVmdDogMjBweCA7Cit9CisKK2gxLCBoMiwgaDMsIGg0IHsKKwlmb250LXdlaWdodDogbm9ybWFsIDsKKwlmb250LXN0eWxlOiBpdGFsaWMgOworfQorCithOmxpbmsgeworCWNvbG9yOiAjMDAwMDgwIDsKKwliYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0IDsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmUgOworfQorCithOnZpc2l0ZWQgeworCWJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgOworCXRleHQtZGVjb3JhdGlvbjogbm9uZSA7Cit9CisKK2E6bGluazpob3ZlciwgYTp2aXNpdGVkOmhvdmVyIHsKKwljb2xvcjogIzAwMDA4MCA7CisJYmFja2dyb3VuZC1jb2xvcjogI0UwRTBGRiA7Cit9CisKK2E6bGluazphY3RpdmUsIGE6dmlzaXRlZDphY3RpdmUgeworCWNvbG9yOiAjRkYwMDAwIDsKK30KKworaHIgeworCWJvcmRlcjogMCA7CisJaGVpZ2h0OiAxcHggOworCWNvbG9yOiAjYTBhMGEwIDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjYTBhMGEwIDsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L2RvYy9sdWEuaHRtbCBiL2x1YS01LjEuNC9kb2MvbHVhLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0MzVhYgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9kb2MvbHVhLmh0bWwKQEAgLTAsMCArMSwxNzIgQEAKKzwhLS0gJElkOiBsdWEubWFuLHYgMS4xMSAyMDA2LzAxLzA2IDE2OjAzOjM0IGxoZiBFeHAgJCAtLT4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+TFVBIG1hbiBwYWdlPC9USVRMRT4KKzxMSU5LIFJFTD0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Imx1YS5jc3MiPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIj4KKworPEgyPk5BTUU8L0gyPgorbHVhIC0gTHVhIGludGVycHJldGVyCis8SDI+U1lOT1BTSVM8L0gyPgorPEI+bHVhPC9CPgorWworPEk+b3B0aW9uczwvST4KK10KK1sKKzxJPnNjcmlwdDwvST4KK1sKKzxJPmFyZ3M8L0k+CitdCitdCis8SDI+REVTQ1JJUFRJT048L0gyPgorPEI+bHVhPC9CPgoraXMgdGhlIHN0YW5kLWFsb25lIEx1YSBpbnRlcnByZXRlci4KK0l0IGxvYWRzIGFuZCBleGVjdXRlcyBMdWEgcHJvZ3JhbXMsCitlaXRoZXIgaW4gdGV4dHVhbCBzb3VyY2UgZm9ybSBvcgoraW4gcHJlY29tcGlsZWQgYmluYXJ5IGZvcm0uCisoUHJlY29tcGlsZWQgYmluYXJpZXMgYXJlIG91dHB1dCBieQorPEI+bHVhYzwvQj4sCit0aGUgTHVhIGNvbXBpbGVyLikKKzxCPmx1YTwvQj4KK2NhbiBiZSB1c2VkIGFzIGEgYmF0Y2ggaW50ZXJwcmV0ZXIgYW5kIGFsc28gaW50ZXJhY3RpdmVseS4KKzxQPgorVGhlIGdpdmVuCis8ST5vcHRpb25zPC9JPgorKHNlZSBiZWxvdykKK2FyZSBleGVjdXRlZCBhbmQgdGhlbgordGhlIEx1YSBwcm9ncmFtIGluIGZpbGUKKzxJPnNjcmlwdDwvST4KK2lzIGxvYWRlZCBhbmQgZXhlY3V0ZWQuCitUaGUgZ2l2ZW4KKzxJPmFyZ3M8L0k+CithcmUgYXZhaWxhYmxlIHRvCis8ST5zY3JpcHQ8L0k+CithcyBzdHJpbmdzIGluIGEgZ2xvYmFsIHRhYmxlIG5hbWVkCis8Qj5hcmc8L0I+LgorSWYgdGhlc2UgYXJndW1lbnRzIGNvbnRhaW4gc3BhY2VzIG9yIG90aGVyIGNoYXJhY3RlcnMgc3BlY2lhbCB0byB0aGUgc2hlbGwsCit0aGVuIHRoZXkgc2hvdWxkIGJlIHF1b3RlZAorKGJ1dCBub3RlIHRoYXQgdGhlIHF1b3RlcyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIHNoZWxsKS4KK1RoZSBhcmd1bWVudHMgaW4KKzxCPmFyZzwvQj4KK3N0YXJ0IGF0IDAsCit3aGljaCBjb250YWlucyB0aGUgc3RyaW5nCisnPEk+c2NyaXB0PC9JPicuCitUaGUgaW5kZXggb2YgdGhlIGxhc3QgYXJndW1lbnQgaXMgc3RvcmVkIGluCis8Qj5hcmcubjwvQj4uCitUaGUgYXJndW1lbnRzIGdpdmVuIGluIHRoZSBjb21tYW5kIGxpbmUgYmVmb3JlCis8ST5zY3JpcHQ8L0k+LAoraW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBpbnRlcnByZXRlciwKK2FyZSBhdmFpbGFibGUgaW4gbmVnYXRpdmUgaW5kaWNlcyBpbgorPEI+YXJnPC9CPi4KKzxQPgorQXQgdGhlIHZlcnkgc3RhcnQsCitiZWZvcmUgZXZlbiBoYW5kbGluZyB0aGUgY29tbWFuZCBsaW5lLAorPEI+bHVhPC9CPgorZXhlY3V0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorPEI+TFVBX0lOSVQ8L0I+LAoraWYgaXQgaXMgZGVmaW5lZC4KK0lmIHRoZSB2YWx1ZSBvZgorPEI+TFVBX0lOSVQ8L0I+CitpcyBvZiB0aGUgZm9ybQorJ0A8ST5maWxlbmFtZTwvST4nLAordGhlbgorPEk+ZmlsZW5hbWU8L0k+CitpcyBleGVjdXRlZC4KK090aGVyd2lzZSwgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIGEgTHVhIHN0YXRlbWVudCBhbmQgaXMgZXhlY3V0ZWQuCis8UD4KK09wdGlvbnMgc3RhcnQgd2l0aAorPEI+Jy0nPC9CPgorYW5kIGFyZSBkZXNjcmliZWQgYmVsb3cuCitZb3UgY2FuIHVzZQorPEI+Jy0tJzwvQj4KK3RvIHNpZ25hbCB0aGUgZW5kIG9mIG9wdGlvbnMuCis8UD4KK0lmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sCit0aGVuCis8Qj4iLXYgLWkiPC9CPgoraXMgYXNzdW1lZCB3aGVuIHRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhIHRlcm1pbmFsOworb3RoZXJ3aXNlLAorPEI+Ii0iPC9CPgoraXMgYXNzdW1lZC4KKzxQPgorSW4gaW50ZXJhY3RpdmUgbW9kZSwKKzxCPmx1YTwvQj4KK3Byb21wdHMgdGhlIHVzZXIsCityZWFkcyBsaW5lcyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKK2FuZCBleGVjdXRlcyB0aGVtIGFzIHRoZXkgYXJlIHJlYWQuCitJZiBhIGxpbmUgZG9lcyBub3QgY29udGFpbiBhIGNvbXBsZXRlIHN0YXRlbWVudCwKK3RoZW4gYSBzZWNvbmRhcnkgcHJvbXB0IGlzIGRpc3BsYXllZCBhbmQKK2xpbmVzIGFyZSByZWFkIHVudGlsIGEgY29tcGxldGUgc3RhdGVtZW50IGlzIGZvcm1lZCBvcgorYSBzeW50YXggZXJyb3IgaXMgZm91bmQuCitTbywgb25lIHdheSB0byBpbnRlcnJ1cHQgdGhlIHJlYWRpbmcgb2YgYW4gaW5jb21wbGV0ZSBzdGF0ZW1lbnQgaXMKK3RvIGZvcmNlIGEgc3ludGF4IGVycm9yOgorYWRkaW5nIGEKKzxCPic7JzwvQj4KK2luIHRoZSBtaWRkbGUgb2YgYSBzdGF0ZW1lbnQgaXMgYSBzdXJlIHdheSBvZiBmb3JjaW5nIGEgc3ludGF4IGVycm9yCisoZXhjZXB0IGluc2lkZSBtdWx0aWxpbmUgc3RyaW5ncyBhbmQgY29tbWVudHM7IHRoZXNlIG11c3QgYmUgY2xvc2VkIGV4cGxpY2l0bHkpLgorSWYgYSBsaW5lIHN0YXJ0cyB3aXRoCis8Qj4nPSc8L0I+LAordGhlbgorPEI+bHVhPC9CPgorZGlzcGxheXMgdGhlIHZhbHVlcyBvZiBhbGwgdGhlIGV4cHJlc3Npb25zIGluIHRoZSByZW1haW5kZXIgb2YgdGhlCitsaW5lLiBUaGUgZXhwcmVzc2lvbnMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgorVGhlIHByaW1hcnkgcHJvbXB0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlCis8Qj5fUFJPTVBUPC9CPiwKK2lmIHRoaXMgdmFsdWUgaXMgYSBzdHJpbmc7CitvdGhlcndpc2UsIHRoZSBkZWZhdWx0IHByb21wdCBpcyB1c2VkLgorU2ltaWxhcmx5LCB0aGUgc2Vjb25kYXJ5IHByb21wdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZQorPEI+X1BST01QVDI8L0I+LgorU28sCit0byBjaGFuZ2UgdGhlIHByb21wdHMsCitzZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgdG8gYSBzdHJpbmcgb2YgeW91ciBjaG9pY2UuCitZb3UgY2FuIGRvIHRoYXQgYWZ0ZXIgY2FsbGluZyB0aGUgaW50ZXJwcmV0ZXIKK29yIG9uIHRoZSBjb21tYW5kIGxpbmUKKyhidXQgaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGJlIGNhcmVmdWwgd2l0aCBxdW90ZXMKK2lmIHRoZSBwcm9tcHQgc3RyaW5nIGNvbnRhaW5zIGEgc3BhY2U7IG90aGVyd2lzZSB5b3UgbWF5IGNvbmZ1c2UgdGhlIHNoZWxsLikKK1RoZSBkZWZhdWx0IHByb21wdHMgYXJlICImZ3Q7ICIgYW5kICImZ3Q7Jmd0OyAiLgorPEgyPk9QVElPTlM8L0gyPgorPFA+Cis8Qj4tPC9CPgorbG9hZCBhbmQgZXhlY3V0ZSB0aGUgc3RhbmRhcmQgaW5wdXQgYXMgYSBmaWxlLAordGhhdCBpcywKK25vdCBpbnRlcmFjdGl2ZWx5LAorZXZlbiB3aGVuIHRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhIHRlcm1pbmFsLgorPFA+Cis8Qj4tZSA8L0I+PEk+c3RhdDwvST4KK2V4ZWN1dGUgc3RhdGVtZW50Cis8ST5zdGF0PC9JPi4KK1lvdSBuZWVkIHRvIHF1b3RlCis8ST5zdGF0IDwvST4KK2lmIGl0IGNvbnRhaW5zIHNwYWNlcywgcXVvdGVzLAorb3Igb3RoZXIgY2hhcmFjdGVycyBzcGVjaWFsIHRvIHRoZSBzaGVsbC4KKzxQPgorPEI+LWk8L0I+CitlbnRlciBpbnRlcmFjdGl2ZSBtb2RlIGFmdGVyCis8ST5zY3JpcHQ8L0k+CitpcyBleGVjdXRlZC4KKzxQPgorPEI+LWwgPC9CPjxJPm5hbWU8L0k+CitjYWxsCis8Qj5yZXF1aXJlPC9CPignPEk+bmFtZTwvST4nKQorYmVmb3JlIGV4ZWN1dGluZworPEk+c2NyaXB0PC9JPi4KK1R5cGljYWxseSB1c2VkIHRvIGxvYWQgbGlicmFyaWVzLgorPFA+Cis8Qj4tdjwvQj4KK3Nob3cgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKzxIMj5TRUUgQUxTTzwvSDI+Cis8Qj5sdWFjPC9CPigxKQorPEJSPgorPEEgSFJFRj0iaHR0cDovL3d3dy5sdWEub3JnLyI+aHR0cDovL3d3dy5sdWEub3JnLzwvQT4KKzxIMj5ESUFHTk9TVElDUzwvSDI+CitFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgc2VsZiBleHBsYW5hdG9yeS4KKzxIMj5BVVRIT1JTPC9IMj4KK1IuIEllcnVzYWxpbXNjaHksCitMLiBILiBkZSBGaWd1ZWlyZWRvLAorYW5kCitXLiBDZWxlcworPCEtLSBFT0YgLS0+Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZG9jL2x1YWMuMSBiL2x1YS01LjEuNC9kb2MvbHVhYy4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTQ2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvZG9jL2x1YWMuMQpAQCAtMCwwICsxLDEzNiBAQAorLlwiICRJZDogbHVhYy5tYW4sdiAxLjI4IDIwMDYvMDEvMDYgMTY6MDM6MzQgbGhmIEV4cCAkCisuVEggTFVBQyAxICIkRGF0ZTogMjAwNi8wMS8wNiAxNjowMzozNCAkIgorLlNIIE5BTUUKK2x1YWMgXC0gTHVhIGNvbXBpbGVyCisuU0ggU1lOT1BTSVMKKy5CIGx1YWMKK1sKKy5JIG9wdGlvbnMKK10gWworLkkgZmlsZW5hbWVzCitdCisuU0ggREVTQ1JJUFRJT04KKy5CIGx1YWMKK2lzIHRoZSBMdWEgY29tcGlsZXIuCitJdCB0cmFuc2xhdGVzIHByb2dyYW1zIHdyaXR0ZW4gaW4gdGhlIEx1YSBwcm9ncmFtbWluZyBsYW5ndWFnZQoraW50byBiaW5hcnkgZmlsZXMgdGhhdCBjYW4gYmUgbGF0ZXIgbG9hZGVkIGFuZCBleGVjdXRlZC4KKy5MUAorVGhlIG1haW4gYWR2YW50YWdlcyBvZiBwcmVjb21waWxpbmcgY2h1bmtzIGFyZToKK2Zhc3RlciBsb2FkaW5nLAorcHJvdGVjdGluZyBzb3VyY2UgY29kZSBmcm9tIGFjY2lkZW50YWwgdXNlciBjaGFuZ2VzLAorYW5kCitvZmYtbGluZSBzeW50YXggY2hlY2tpbmcuCisuTFAKK1ByZS1jb21waWxpbmcgZG9lcyBub3QgaW1wbHkgZmFzdGVyIGV4ZWN1dGlvbgorYmVjYXVzZSBpbiBMdWEgY2h1bmtzIGFyZSBhbHdheXMgY29tcGlsZWQgaW50byBieXRlY29kZXMgYmVmb3JlIGJlaW5nIGV4ZWN1dGVkLgorLkIgbHVhYworc2ltcGx5IGFsbG93cyB0aG9zZSBieXRlY29kZXMgdG8gYmUgc2F2ZWQgaW4gYSBmaWxlIGZvciBsYXRlciBleGVjdXRpb24uCisuTFAKK1ByZS1jb21waWxlZCBjaHVua3MgYXJlIG5vdCBuZWNlc3NhcmlseSBzbWFsbGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlLgorVGhlIG1haW4gZ29hbCBpbiBwcmUtY29tcGlsaW5nIGlzIGZhc3RlciBsb2FkaW5nLgorLkxQCitUaGUgYmluYXJ5IGZpbGVzIGNyZWF0ZWQgYnkKKy5CIGx1YWMKK2FyZSBwb3J0YWJsZSBvbmx5IGFtb25nIGFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgc2FtZSB3b3JkIHNpemUgYW5kIGJ5dGUgb3JkZXIuCisuTFAKKy5CIGx1YWMKK3Byb2R1Y2VzIGEgc2luZ2xlIG91dHB1dCBmaWxlIGNvbnRhaW5pbmcgdGhlIGJ5dGVjb2RlcworZm9yIGFsbCBzb3VyY2UgZmlsZXMgZ2l2ZW4uCitCeSBkZWZhdWx0LAordGhlIG91dHB1dCBmaWxlIGlzIG5hbWVkCisuQlIgbHVhYy5vdXQgLAorYnV0IHlvdSBjYW4gY2hhbmdlIHRoaXMgd2l0aCB0aGUKKy5CIFwtbworb3B0aW9uLgorLkxQCitJbiB0aGUgY29tbWFuZCBsaW5lLAoreW91IGNhbiBtaXgKK3RleHQgZmlsZXMgY29udGFpbmluZyBMdWEgc291cmNlIGFuZAorYmluYXJ5IGZpbGVzIGNvbnRhaW5pbmcgcHJlY29tcGlsZWQgY2h1bmtzLgorVGhpcyBpcyB1c2VmdWwgdG8gY29tYmluZSBzZXZlcmFsIHByZWNvbXBpbGVkIGNodW5rcywKK2V2ZW4gZnJvbSBkaWZmZXJlbnQgKGJ1dCBjb21wYXRpYmxlKSBwbGF0Zm9ybXMsCitpbnRvIGEgc2luZ2xlIHByZWNvbXBpbGVkIGNodW5rLgorLkxQCitZb3UgY2FuIHVzZQorLkIgIidcLSciCit0byBpbmRpY2F0ZSB0aGUgc3RhbmRhcmQgaW5wdXQgYXMgYSBzb3VyY2UgZmlsZQorYW5kCisuQiAiJ1wtLSciCit0byBzaWduYWwgdGhlIGVuZCBvZiBvcHRpb25zCisodGhhdCBpcywKK2FsbCByZW1haW5pbmcgYXJndW1lbnRzIHdpbGwgYmUgdHJlYXRlZCBhcyBmaWxlcyBldmVuIGlmIHRoZXkgc3RhcnQgd2l0aAorLkJSICInXC0nIiApLgorLkxQCitUaGUgaW50ZXJuYWwgZm9ybWF0IG9mIHRoZSBiaW5hcnkgZmlsZXMgcHJvZHVjZWQgYnkKKy5CIGx1YWMKK2lzIGxpa2VseSB0byBjaGFuZ2Ugd2hlbiBhIG5ldyB2ZXJzaW9uIG9mIEx1YSBpcyByZWxlYXNlZC4KK1NvLAorc2F2ZSB0aGUgc291cmNlIGZpbGVzIG9mIGFsbCBMdWEgcHJvZ3JhbXMgdGhhdCB5b3UgcHJlY29tcGlsZS4KKy5MUAorLlNIIE9QVElPTlMKK09wdGlvbnMgbXVzdCBiZSBzZXBhcmF0ZS4KKy5UUAorLkIgXC1sCitwcm9kdWNlIGEgbGlzdGluZyBvZiB0aGUgY29tcGlsZWQgYnl0ZWNvZGUgZm9yIEx1YSdzIHZpcnR1YWwgbWFjaGluZS4KK0xpc3RpbmcgYnl0ZWNvZGVzIGlzIHVzZWZ1bCB0byBsZWFybiBhYm91dCBMdWEncyB2aXJ0dWFsIG1hY2hpbmUuCitJZiBubyBmaWxlcyBhcmUgZ2l2ZW4sIHRoZW4KKy5CIGx1YWMKK2xvYWRzCisuQiBsdWFjLm91dAorYW5kIGxpc3RzIGl0cyBjb250ZW50cy4KKy5UUAorLkJJIFwtbyAiIGZpbGUiCitvdXRwdXQgdG8KKy5JUiBmaWxlICwKK2luc3RlYWQgb2YgdGhlIGRlZmF1bHQKKy5CUiBsdWFjLm91dCAuCisoWW91IGNhbiB1c2UKKy5CICInXC0nIgorZm9yIHN0YW5kYXJkIG91dHB1dCwKK2J1dCBub3Qgb24gcGxhdGZvcm1zIHRoYXQgb3BlbiBzdGFuZGFyZCBvdXRwdXQgaW4gdGV4dCBtb2RlLikKK1RoZSBvdXRwdXQgZmlsZSBtYXkgYmUgYSBzb3VyY2UgZmlsZSBiZWNhdXNlCithbGwgZmlsZXMgYXJlIGxvYWRlZCBiZWZvcmUgdGhlIG91dHB1dCBmaWxlIGlzIHdyaXR0ZW4uCitCZSBjYXJlZnVsIG5vdCB0byBvdmVyd3JpdGUgcHJlY2lvdXMgZmlsZXMuCisuVFAKKy5CIFwtcAorbG9hZCBmaWxlcyBidXQgZG8gbm90IGdlbmVyYXRlIGFueSBvdXRwdXQgZmlsZS4KK1VzZWQgbWFpbmx5IGZvciBzeW50YXggY2hlY2tpbmcgYW5kIGZvciB0ZXN0aW5nIHByZWNvbXBpbGVkIGNodW5rczoKK2NvcnJ1cHRlZCBmaWxlcyB3aWxsIHByb2JhYmx5IGdlbmVyYXRlIGVycm9ycyB3aGVuIGxvYWRlZC4KK0x1YSBhbHdheXMgcGVyZm9ybXMgYSB0aG9yb3VnaCBpbnRlZ3JpdHkgdGVzdCBvbiBwcmVjb21waWxlZCBjaHVua3MuCitCeXRlY29kZSB0aGF0IHBhc3NlcyB0aGlzIHRlc3QgaXMgY29tcGxldGVseSBzYWZlLAoraW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCBub3QgYnJlYWsgdGhlIGludGVycHJldGVyLgorSG93ZXZlciwKK3RoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHN1Y2ggY29kZSBkb2VzIGFueXRoaW5nIHNlbnNpYmxlLgorKE5vbmUgY2FuIGJlIGdpdmVuLCBiZWNhdXNlIHRoZSBoYWx0aW5nIHByb2JsZW0gaXMgdW5zb2x2YWJsZS4pCitJZiBubyBmaWxlcyBhcmUgZ2l2ZW4sIHRoZW4KKy5CIGx1YWMKK2xvYWRzCisuQiBsdWFjLm91dAorYW5kIHRlc3RzIGl0cyBjb250ZW50cy4KK05vIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQgaWYgdGhlIGZpbGUgcGFzc2VzIHRoZSBpbnRlZ3JpdHkgdGVzdC4KKy5UUAorLkIgXC1zCitzdHJpcCBkZWJ1ZyBpbmZvcm1hdGlvbiBiZWZvcmUgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGUuCitUaGlzIHNhdmVzIHNvbWUgc3BhY2UgaW4gdmVyeSBsYXJnZSBjaHVua3MsCitidXQgaWYgZXJyb3JzIG9jY3VyIHdoZW4gcnVubmluZyBhIHN0cmlwcGVkIGNodW5rLAordGhlbiB0aGUgZXJyb3IgbWVzc2FnZXMgbWF5IG5vdCBjb250YWluIHRoZSBmdWxsIGluZm9ybWF0aW9uIHRoZXkgdXN1YWxseSBkby4KK0ZvciBpbnN0YW5jZSwKK2xpbmUgbnVtYmVycyBhbmQgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIGFyZSBsb3N0LgorLlRQCisuQiBcLXYKK3Nob3cgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKy5TSCBGSUxFUworLlRQIDE1CisuQiBsdWFjLm91dAorZGVmYXVsdCBvdXRwdXQgZmlsZQorLlNIICJTRUUgQUxTTyIKKy5CUiBsdWEgKDEpCisuYnIKK2h0dHA6Ly93d3cubHVhLm9yZy8KKy5TSCBESUFHTk9TVElDUworRXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHNlbGYgZXhwbGFuYXRvcnkuCisuU0ggQVVUSE9SUworTC4gSC4gZGUgRmlndWVpcmVkbywKK1IuIEllcnVzYWxpbXNjaHkgYW5kCitXLiBDZWxlcworLlwiIEVPRgpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L2RvYy9sdWFjLmh0bWwgYi9sdWEtNS4xLjQvZG9jL2x1YWMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlmZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2RvYy9sdWFjLmh0bWwKQEAgLTAsMCArMSwxNDUgQEAKKzwhLS0gJElkOiBsdWFjLm1hbix2IDEuMjggMjAwNi8wMS8wNiAxNjowMzozNCBsaGYgRXhwICQgLS0+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkxVQUMgbWFuIHBhZ2U8L1RJVExFPgorPExJTksgUkVMPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ibHVhLmNzcyI+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiPgorCis8SDI+TkFNRTwvSDI+CitsdWFjIC0gTHVhIGNvbXBpbGVyCis8SDI+U1lOT1BTSVM8L0gyPgorPEI+bHVhYzwvQj4KK1sKKzxJPm9wdGlvbnM8L0k+CitdIFsKKzxJPmZpbGVuYW1lczwvST4KK10KKzxIMj5ERVNDUklQVElPTjwvSDI+Cis8Qj5sdWFjPC9CPgoraXMgdGhlIEx1YSBjb21waWxlci4KK0l0IHRyYW5zbGF0ZXMgcHJvZ3JhbXMgd3JpdHRlbiBpbiB0aGUgTHVhIHByb2dyYW1taW5nIGxhbmd1YWdlCitpbnRvIGJpbmFyeSBmaWxlcyB0aGF0IGNhbiBiZSBsYXRlciBsb2FkZWQgYW5kIGV4ZWN1dGVkLgorPFA+CitUaGUgbWFpbiBhZHZhbnRhZ2VzIG9mIHByZWNvbXBpbGluZyBjaHVua3MgYXJlOgorZmFzdGVyIGxvYWRpbmcsCitwcm90ZWN0aW5nIHNvdXJjZSBjb2RlIGZyb20gYWNjaWRlbnRhbCB1c2VyIGNoYW5nZXMsCithbmQKK29mZi1saW5lIHN5bnRheCBjaGVja2luZy4KKzxQPgorUHJlY29tcGlsaW5nIGRvZXMgbm90IGltcGx5IGZhc3RlciBleGVjdXRpb24KK2JlY2F1c2UgaW4gTHVhIGNodW5rcyBhcmUgYWx3YXlzIGNvbXBpbGVkIGludG8gYnl0ZWNvZGVzIGJlZm9yZSBiZWluZyBleGVjdXRlZC4KKzxCPmx1YWM8L0I+CitzaW1wbHkgYWxsb3dzIHRob3NlIGJ5dGVjb2RlcyB0byBiZSBzYXZlZCBpbiBhIGZpbGUgZm9yIGxhdGVyIGV4ZWN1dGlvbi4KKzxQPgorUHJlY29tcGlsZWQgY2h1bmtzIGFyZSBub3QgbmVjZXNzYXJpbHkgc21hbGxlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZS4KK1RoZSBtYWluIGdvYWwgaW4gcHJlY29tcGlsaW5nIGlzIGZhc3RlciBsb2FkaW5nLgorPFA+CitUaGUgYmluYXJ5IGZpbGVzIGNyZWF0ZWQgYnkKKzxCPmx1YWM8L0I+CithcmUgcG9ydGFibGUgb25seSBhbW9uZyBhcmNoaXRlY3R1cmVzIHdpdGggdGhlIHNhbWUgd29yZCBzaXplIGFuZCBieXRlIG9yZGVyLgorPFA+Cis8Qj5sdWFjPC9CPgorcHJvZHVjZXMgYSBzaW5nbGUgb3V0cHV0IGZpbGUgY29udGFpbmluZyB0aGUgYnl0ZWNvZGVzCitmb3IgYWxsIHNvdXJjZSBmaWxlcyBnaXZlbi4KK0J5IGRlZmF1bHQsCit0aGUgb3V0cHV0IGZpbGUgaXMgbmFtZWQKKzxCPmx1YWMub3V0PC9CPiwKK2J1dCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdpdGggdGhlCis8Qj4tbzwvQj4KK29wdGlvbi4KKzxQPgorSW4gdGhlIGNvbW1hbmQgbGluZSwKK3lvdSBjYW4gbWl4Cit0ZXh0IGZpbGVzIGNvbnRhaW5pbmcgTHVhIHNvdXJjZSBhbmQKK2JpbmFyeSBmaWxlcyBjb250YWluaW5nIHByZWNvbXBpbGVkIGNodW5rcy4KK1RoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugc2V2ZXJhbCBwcmVjb21waWxlZCBjaHVua3MsCitldmVuIGZyb20gZGlmZmVyZW50IChidXQgY29tcGF0aWJsZSkgcGxhdGZvcm1zLAorY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgcHJlY29tcGlsZWQgY2h1bmsuCis8UD4KK1lvdSBjYW4gdXNlCis8Qj4nLSc8L0I+Cit0byBpbmRpY2F0ZSB0aGUgc3RhbmRhcmQgaW5wdXQgYXMgYSBzb3VyY2UgZmlsZQorYW5kCis8Qj4nLS0nPC9CPgordG8gc2lnbmFsIHRoZSBlbmQgb2Ygb3B0aW9ucworKHRoYXQgaXMsCithbGwgcmVtYWluaW5nIGFyZ3VtZW50cyB3aWxsIGJlIHRyZWF0ZWQgYXMgZmlsZXMgZXZlbiBpZiB0aGV5IHN0YXJ0IHdpdGgKKzxCPictJzwvQj4pLgorPFA+CitUaGUgaW50ZXJuYWwgZm9ybWF0IG9mIHRoZSBiaW5hcnkgZmlsZXMgcHJvZHVjZWQgYnkKKzxCPmx1YWM8L0I+CitpcyBsaWtlbHkgdG8gY2hhbmdlIHdoZW4gYSBuZXcgdmVyc2lvbiBvZiBMdWEgaXMgcmVsZWFzZWQuCitTbywKK3NhdmUgdGhlIHNvdXJjZSBmaWxlcyBvZiBhbGwgTHVhIHByb2dyYW1zIHRoYXQgeW91IHByZWNvbXBpbGUuCis8UD4KKzxIMj5PUFRJT05TPC9IMj4KK09wdGlvbnMgbXVzdCBiZSBzZXBhcmF0ZS4KKzxQPgorPEI+LWw8L0I+Citwcm9kdWNlIGEgbGlzdGluZyBvZiB0aGUgY29tcGlsZWQgYnl0ZWNvZGUgZm9yIEx1YSdzIHZpcnR1YWwgbWFjaGluZS4KK0xpc3RpbmcgYnl0ZWNvZGVzIGlzIHVzZWZ1bCB0byBsZWFybiBhYm91dCBMdWEncyB2aXJ0dWFsIG1hY2hpbmUuCitJZiBubyBmaWxlcyBhcmUgZ2l2ZW4sIHRoZW4KKzxCPmx1YWM8L0I+Citsb2FkcworPEI+bHVhYy5vdXQ8L0I+CithbmQgbGlzdHMgaXRzIGNvbnRlbnRzLgorPFA+Cis8Qj4tbyA8L0I+PEk+ZmlsZTwvST4KK291dHB1dCB0bworPEk+ZmlsZTwvST4sCitpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0Cis8Qj5sdWFjLm91dDwvQj4uCisoWW91IGNhbiB1c2UKKzxCPictJzwvQj4KK2ZvciBzdGFuZGFyZCBvdXRwdXQsCitidXQgbm90IG9uIHBsYXRmb3JtcyB0aGF0IG9wZW4gc3RhbmRhcmQgb3V0cHV0IGluIHRleHQgbW9kZS4pCitUaGUgb3V0cHV0IGZpbGUgbWF5IGJlIGEgc291cmNlIGZpbGUgYmVjYXVzZQorYWxsIGZpbGVzIGFyZSBsb2FkZWQgYmVmb3JlIHRoZSBvdXRwdXQgZmlsZSBpcyB3cml0dGVuLgorQmUgY2FyZWZ1bCBub3QgdG8gb3ZlcndyaXRlIHByZWNpb3VzIGZpbGVzLgorPFA+Cis8Qj4tcDwvQj4KK2xvYWQgZmlsZXMgYnV0IGRvIG5vdCBnZW5lcmF0ZSBhbnkgb3V0cHV0IGZpbGUuCitVc2VkIG1haW5seSBmb3Igc3ludGF4IGNoZWNraW5nIGFuZCBmb3IgdGVzdGluZyBwcmVjb21waWxlZCBjaHVua3M6Citjb3JydXB0ZWQgZmlsZXMgd2lsbCBwcm9iYWJseSBnZW5lcmF0ZSBlcnJvcnMgd2hlbiBsb2FkZWQuCitMdWEgYWx3YXlzIHBlcmZvcm1zIGEgdGhvcm91Z2ggaW50ZWdyaXR5IHRlc3Qgb24gcHJlY29tcGlsZWQgY2h1bmtzLgorQnl0ZWNvZGUgdGhhdCBwYXNzZXMgdGhpcyB0ZXN0IGlzIGNvbXBsZXRlbHkgc2FmZSwKK2luIHRoZSBzZW5zZSB0aGF0IGl0IHdpbGwgbm90IGJyZWFrIHRoZSBpbnRlcnByZXRlci4KK0hvd2V2ZXIsCit0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBzdWNoIGNvZGUgZG9lcyBhbnl0aGluZyBzZW5zaWJsZS4KKyhOb25lIGNhbiBiZSBnaXZlbiwgYmVjYXVzZSB0aGUgaGFsdGluZyBwcm9ibGVtIGlzIHVuc29sdmFibGUuKQorSWYgbm8gZmlsZXMgYXJlIGdpdmVuLCB0aGVuCis8Qj5sdWFjPC9CPgorbG9hZHMKKzxCPmx1YWMub3V0PC9CPgorYW5kIHRlc3RzIGl0cyBjb250ZW50cy4KK05vIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQgaWYgdGhlIGZpbGUgcGFzc2VzIHRoZSBpbnRlZ3JpdHkgdGVzdC4KKzxQPgorPEI+LXM8L0I+CitzdHJpcCBkZWJ1ZyBpbmZvcm1hdGlvbiBiZWZvcmUgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGUuCitUaGlzIHNhdmVzIHNvbWUgc3BhY2UgaW4gdmVyeSBsYXJnZSBjaHVua3MsCitidXQgaWYgZXJyb3JzIG9jY3VyIHdoZW4gcnVubmluZyBhIHN0cmlwcGVkIGNodW5rLAordGhlbiB0aGUgZXJyb3IgbWVzc2FnZXMgbWF5IG5vdCBjb250YWluIHRoZSBmdWxsIGluZm9ybWF0aW9uIHRoZXkgdXN1YWxseSBkby4KK0ZvciBpbnN0YW5jZSwKK2xpbmUgbnVtYmVycyBhbmQgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIGFyZSBsb3N0LgorPFA+Cis8Qj4tdjwvQj4KK3Nob3cgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKzxIMj5GSUxFUzwvSDI+Cis8UD4KKzxCPmx1YWMub3V0PC9CPgorZGVmYXVsdCBvdXRwdXQgZmlsZQorPEgyPlNFRSBBTFNPPC9IMj4KKzxCPmx1YTwvQj4oMSkKKzxCUj4KKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy8iPmh0dHA6Ly93d3cubHVhLm9yZy88L0E+Cis8SDI+RElBR05PU1RJQ1M8L0gyPgorRXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHNlbGYgZXhwbGFuYXRvcnkuCis8SDI+QVVUSE9SUzwvSDI+CitMLiBILiBkZSBGaWd1ZWlyZWRvLAorUi4gSWVydXNhbGltc2NoeSBhbmQKK1cuIENlbGVzCis8IS0tIEVPRiAtLT4KKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9kb2MvbWFudWFsLmNzcyBiL2x1YS01LjEuNC9kb2MvbWFudWFsLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQ1YWZkCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2RvYy9tYW51YWwuY3NzCkBAIC0wLDAgKzEsMTMgQEAKK2gzIGNvZGUgeworCWZvbnQtZmFtaWx5OiBpbmhlcml0IDsKK30KKworcHJlIHsKKwlmb250LXNpemU6IDEwNSUgOworfQorCitzcGFuLmFwaWkgeworCWZsb2F0OiByaWdodCA7CisJZm9udC1mYW1pbHk6IGluaGVyaXQgOworfQorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZG9jL21hbnVhbC5odG1sIGIvbHVhLTUuMS40L2RvYy9tYW51YWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZmMTdjCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2RvYy9tYW51YWwuaHRtbApAQCAtMCwwICsxLDg4MDEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+CisKKzxoZWFkPgorPHRpdGxlPkx1YSA1LjEgUmVmZXJlbmNlIE1hbnVhbDwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJsdWEuY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Im1hbnVhbC5jc3MiPgorPE1FVEEgSFRUUC1FUVVJVj0iY29udGVudC10eXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aHI+Cis8aDE+Cis8YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmcvIj48aW1nIHNyYz0ibG9nby5naWYiIGFsdD0iIiBib3JkZXI9IjAiPjwvYT4KK0x1YSA1LjEgUmVmZXJlbmNlIE1hbnVhbAorPC9oMT4KKworYnkgUm9iZXJ0byBJZXJ1c2FsaW1zY2h5LCBMdWl6IEhlbnJpcXVlIGRlIEZpZ3VlaXJlZG8sIFdhbGRlbWFyIENlbGVzCis8cD4KKzxzbWFsbD4KK0NvcHlyaWdodCAmY29weTsgMjAwNi0yMDA4IEx1YS5vcmcsIFBVQy1SaW8uCitGcmVlbHkgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKzxhIGhyZWY9Imh0dHA6Ly93d3cubHVhLm9yZy9saWNlbnNlLmh0bWwjNSI+THVhIGxpY2Vuc2U8L2E+LgorPC9zbWFsbD4KKzxocj4KKzxwPgorCis8YSBocmVmPSJjb250ZW50cy5odG1sI2NvbnRlbnRzIj5jb250ZW50czwvQT4KKyZtaWRkb3Q7Cis8YSBocmVmPSJjb250ZW50cy5odG1sI2luZGV4Ij5pbmRleDwvQT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHA+CisKKzwhLS0gJElkOiBtYW51YWwub2YsdiAxLjQ4IDIwMDgvMDgvMTggMTU6MjQ6MjAgcm9iZXJ0byBFeHAgJCAtLT4KKworCisKKworPGgxPjEgLSA8YSBuYW1lPSIxIj5JbnRyb2R1Y3Rpb248L2E+PC9oMT4KKworPHA+CitMdWEgaXMgYW4gZXh0ZW5zaW9uIHByb2dyYW1taW5nIGxhbmd1YWdlIGRlc2lnbmVkIHRvIHN1cHBvcnQKK2dlbmVyYWwgcHJvY2VkdXJhbCBwcm9ncmFtbWluZyB3aXRoIGRhdGEgZGVzY3JpcHRpb24KK2ZhY2lsaXRpZXMuCitJdCBhbHNvIG9mZmVycyBnb29kIHN1cHBvcnQgZm9yIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZywKK2Z1bmN0aW9uYWwgcHJvZ3JhbW1pbmcsIGFuZCBkYXRhLWRyaXZlbiBwcm9ncmFtbWluZy4KK0x1YSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgcG93ZXJmdWwsIGxpZ2h0LXdlaWdodAorc2NyaXB0aW5nIGxhbmd1YWdlIGZvciBhbnkgcHJvZ3JhbSB0aGF0IG5lZWRzIG9uZS4KK0x1YSBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpYnJhcnksIHdyaXR0ZW4gaW4gPGVtPmNsZWFuPC9lbT4gQworKHRoYXQgaXMsIGluIHRoZSBjb21tb24gc3Vic2V0IG9mIEFOU0kmbmJzcDtDIGFuZCBDKyspLgorCisKKzxwPgorQmVpbmcgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlLCBMdWEgaGFzIG5vIG5vdGlvbiBvZiBhICJtYWluIiBwcm9ncmFtOgoraXQgb25seSB3b3JrcyA8ZW0+ZW1iZWRkZWQ8L2VtPiBpbiBhIGhvc3QgY2xpZW50LAorY2FsbGVkIHRoZSA8ZW0+ZW1iZWRkaW5nIHByb2dyYW08L2VtPiBvciBzaW1wbHkgdGhlIDxlbT5ob3N0PC9lbT4uCitUaGlzIGhvc3QgcHJvZ3JhbSBjYW4gaW52b2tlIGZ1bmN0aW9ucyB0byBleGVjdXRlIGEgcGllY2Ugb2YgTHVhIGNvZGUsCitjYW4gd3JpdGUgYW5kIHJlYWQgTHVhIHZhcmlhYmxlcywKK2FuZCBjYW4gcmVnaXN0ZXIgQyZuYnNwO2Z1bmN0aW9ucyB0byBiZSBjYWxsZWQgYnkgTHVhIGNvZGUuCitUaHJvdWdoIHRoZSB1c2Ugb2YgQyZuYnNwO2Z1bmN0aW9ucywgTHVhIGNhbiBiZSBhdWdtZW50ZWQgdG8gY29wZSB3aXRoCithIHdpZGUgcmFuZ2Ugb2YgZGlmZmVyZW50IGRvbWFpbnMsCit0aHVzIGNyZWF0aW5nIGN1c3RvbWl6ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHNoYXJpbmcgYSBzeW50YWN0aWNhbCBmcmFtZXdvcmsuCitUaGUgTHVhIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhIHNhbXBsZSBob3N0IHByb2dyYW0gY2FsbGVkIDxjb2RlPmx1YTwvY29kZT4sCit3aGljaCB1c2VzIHRoZSBMdWEgbGlicmFyeSB0byBvZmZlciBhIGNvbXBsZXRlLCBzdGFuZC1hbG9uZSBMdWEgaW50ZXJwcmV0ZXIuCisKKworPHA+CitMdWEgaXMgZnJlZSBzb2Z0d2FyZSwKK2FuZCBpcyBwcm92aWRlZCBhcyB1c3VhbCB3aXRoIG5vIGd1YXJhbnRlZXMsCithcyBzdGF0ZWQgaW4gaXRzIGxpY2Vuc2UuCitUaGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGluIHRoaXMgbWFudWFsIGlzIGF2YWlsYWJsZQorYXQgTHVhJ3Mgb2ZmaWNpYWwgd2ViIHNpdGUsIDxjb2RlPnd3dy5sdWEub3JnPC9jb2RlPi4KKworCis8cD4KK0xpa2UgYW55IG90aGVyIHJlZmVyZW5jZSBtYW51YWwsCit0aGlzIGRvY3VtZW50IGlzIGRyeSBpbiBwbGFjZXMuCitGb3IgYSBkaXNjdXNzaW9uIG9mIHRoZSBkZWNpc2lvbnMgYmVoaW5kIHRoZSBkZXNpZ24gb2YgTHVhLAorc2VlIHRoZSB0ZWNobmljYWwgcGFwZXJzIGF2YWlsYWJsZSBhdCBMdWEncyB3ZWIgc2l0ZS4KK0ZvciBhIGRldGFpbGVkIGludHJvZHVjdGlvbiB0byBwcm9ncmFtbWluZyBpbiBMdWEsCitzZWUgUm9iZXJ0bydzIGJvb2ssIDxlbT5Qcm9ncmFtbWluZyBpbiBMdWEgKFNlY29uZCBFZGl0aW9uKTwvZW0+LgorCisKKworPGgxPjIgLSA8YSBuYW1lPSIyIj5UaGUgTGFuZ3VhZ2U8L2E+PC9oMT4KKworPHA+CitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBsZXhpcywgdGhlIHN5bnRheCwgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgTHVhLgorSW4gb3RoZXIgd29yZHMsCit0aGlzIHNlY3Rpb24gZGVzY3JpYmVzCit3aGljaCB0b2tlbnMgYXJlIHZhbGlkLAoraG93IHRoZXkgY2FuIGJlIGNvbWJpbmVkLAorYW5kIHdoYXQgdGhlaXIgY29tYmluYXRpb25zIG1lYW4uCisKKworPHA+CitUaGUgbGFuZ3VhZ2UgY29uc3RydWN0cyB3aWxsIGJlIGV4cGxhaW5lZCB1c2luZyB0aGUgdXN1YWwgZXh0ZW5kZWQgQk5GIG5vdGF0aW9uLAoraW4gd2hpY2gKK3s8ZW0+YTwvZW0+fSZuYnNwO21lYW5zJm5ic3A7MCBvciBtb3JlIDxlbT5hPC9lbT4ncywgYW5kCitbPGVtPmE8L2VtPl0mbmJzcDttZWFucyBhbiBvcHRpb25hbCA8ZW0+YTwvZW0+LgorTm9uLXRlcm1pbmFscyBhcmUgc2hvd24gbGlrZSBub24tdGVybWluYWwsCitrZXl3b3JkcyBhcmUgc2hvd24gbGlrZSA8Yj5rd29yZDwvYj4sCithbmQgb3RoZXIgdGVybWluYWwgc3ltYm9scyBhcmUgc2hvd24gbGlrZSBgPGI+PTwvYj4mYWN1dGU7LgorVGhlIGNvbXBsZXRlIHN5bnRheCBvZiBMdWEgY2FuIGJlIGZvdW5kIGluIDxhIGhyZWY9IiM4Ij4mc2VjdDs4PC9hPgorYXQgdGhlIGVuZCBvZiB0aGlzIG1hbnVhbC4KKworCisKKzxoMj4yLjEgLSA8YSBuYW1lPSIyLjEiPkxleGljYWwgQ29udmVudGlvbnM8L2E+PC9oMj4KKworPHA+Cis8ZW0+TmFtZXM8L2VtPgorKGFsc28gY2FsbGVkIDxlbT5pZGVudGlmaWVyczwvZW0+KQoraW4gTHVhIGNhbiBiZSBhbnkgc3RyaW5nIG9mIGxldHRlcnMsCitkaWdpdHMsIGFuZCB1bmRlcnNjb3JlcywKK25vdCBiZWdpbm5pbmcgd2l0aCBhIGRpZ2l0LgorVGhpcyBjb2luY2lkZXMgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBuYW1lcyBpbiBtb3N0IGxhbmd1YWdlcy4KKyhUaGUgZGVmaW5pdGlvbiBvZiBsZXR0ZXIgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBsb2NhbGU6CithbnkgY2hhcmFjdGVyIGNvbnNpZGVyZWQgYWxwaGFiZXRpYyBieSB0aGUgY3VycmVudCBsb2NhbGUKK2NhbiBiZSB1c2VkIGluIGFuIGlkZW50aWZpZXIuKQorSWRlbnRpZmllcnMgYXJlIHVzZWQgdG8gbmFtZSB2YXJpYWJsZXMgYW5kIHRhYmxlIGZpZWxkcy4KKworCis8cD4KK1RoZSBmb2xsb3dpbmcgPGVtPmtleXdvcmRzPC9lbT4gYXJlIHJlc2VydmVkCithbmQgY2Fubm90IGJlIHVzZWQgYXMgbmFtZXM6CisKKworPHByZT4KKyAgICAgYW5kICAgICAgIGJyZWFrICAgICBkbyAgICAgICAgZWxzZSAgICAgIGVsc2VpZgorICAgICBlbmQgICAgICAgZmFsc2UgICAgIGZvciAgICAgICBmdW5jdGlvbiAgaWYKKyAgICAgaW4gICAgICAgIGxvY2FsICAgICBuaWwgICAgICAgbm90ICAgICAgIG9yCisgICAgIHJlcGVhdCAgICByZXR1cm4gICAgdGhlbiAgICAgIHRydWUgICAgICB1bnRpbCAgICAgd2hpbGUKKzwvcHJlPgorCis8cD4KK0x1YSBpcyBhIGNhc2Utc2Vuc2l0aXZlIGxhbmd1YWdlOgorPGNvZGU+YW5kPC9jb2RlPiBpcyBhIHJlc2VydmVkIHdvcmQsIGJ1dCA8Y29kZT5BbmQ8L2NvZGU+IGFuZCA8Y29kZT5BTkQ8L2NvZGU+CithcmUgdHdvIGRpZmZlcmVudCwgdmFsaWQgbmFtZXMuCitBcyBhIGNvbnZlbnRpb24sIG5hbWVzIHN0YXJ0aW5nIHdpdGggYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieQordXBwZXJjYXNlIGxldHRlcnMgKHN1Y2ggYXMgPGEgaHJlZj0iI3BkZi1fVkVSU0lPTiI+PGNvZGU+X1ZFUlNJT048L2NvZGU+PC9hPikKK2FyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgZ2xvYmFsIHZhcmlhYmxlcyB1c2VkIGJ5IEx1YS4KKworCis8cD4KK1RoZSBmb2xsb3dpbmcgc3RyaW5ncyBkZW5vdGUgb3RoZXIgdG9rZW5zOgorCis8cHJlPgorICAgICArICAgICAtICAgICAqICAgICAvICAgICAlICAgICBeICAgICAjCisgICAgID09ICAgIH49ICAgICZsdDs9ICAgICZndDs9ICAgICZsdDsgICAgICZndDsgICAgID0KKyAgICAgKCAgICAgKSAgICAgeyAgICAgfSAgICAgWyAgICAgXQorICAgICA7ICAgICA6ICAgICAsICAgICAuICAgICAuLiAgICAuLi4KKzwvcHJlPgorCis8cD4KKzxlbT5MaXRlcmFsIHN0cmluZ3M8L2VtPgorY2FuIGJlIGRlbGltaXRlZCBieSBtYXRjaGluZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcywKK2FuZCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIEMtbGlrZSBlc2NhcGUgc2VxdWVuY2VzOgorJzxjb2RlPlxhPC9jb2RlPicgKGJlbGwpLAorJzxjb2RlPlxiPC9jb2RlPicgKGJhY2tzcGFjZSksCisnPGNvZGU+XGY8L2NvZGU+JyAoZm9ybSBmZWVkKSwKKyc8Y29kZT5cbjwvY29kZT4nIChuZXdsaW5lKSwKKyc8Y29kZT5ccjwvY29kZT4nIChjYXJyaWFnZSByZXR1cm4pLAorJzxjb2RlPlx0PC9jb2RlPicgKGhvcml6b250YWwgdGFiKSwKKyc8Y29kZT5cdjwvY29kZT4nICh2ZXJ0aWNhbCB0YWIpLAorJzxjb2RlPlxcPC9jb2RlPicgKGJhY2tzbGFzaCksCisnPGNvZGU+XCI8L2NvZGU+JyAocXVvdGF0aW9uIG1hcmsgW2RvdWJsZSBxdW90ZV0pLAorYW5kICc8Y29kZT5cJzwvY29kZT4nIChhcG9zdHJvcGhlIFtzaW5nbGUgcXVvdGVdKS4KK01vcmVvdmVyLCBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIHJlYWwgbmV3bGluZQorcmVzdWx0cyBpbiBhIG5ld2xpbmUgaW4gdGhlIHN0cmluZy4KK0EgY2hhcmFjdGVyIGluIGEgc3RyaW5nIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBieSBpdHMgbnVtZXJpY2FsIHZhbHVlCit1c2luZyB0aGUgZXNjYXBlIHNlcXVlbmNlIDxjb2RlPlw8ZW0+ZGRkPC9lbT48L2NvZGU+LAord2hlcmUgPGVtPmRkZDwvZW0+IGlzIGEgc2VxdWVuY2Ugb2YgdXAgdG8gdGhyZWUgZGVjaW1hbCBkaWdpdHMuCisoTm90ZSB0aGF0IGlmIGEgbnVtZXJpY2FsIGVzY2FwZSBpcyB0byBiZSBmb2xsb3dlZCBieSBhIGRpZ2l0LAoraXQgbXVzdCBiZSBleHByZXNzZWQgdXNpbmcgZXhhY3RseSB0aHJlZSBkaWdpdHMuKQorU3RyaW5ncyBpbiBMdWEgY2FuIGNvbnRhaW4gYW55IDgtYml0IHZhbHVlLCBpbmNsdWRpbmcgZW1iZWRkZWQgemVyb3MsCit3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGFzICc8Y29kZT5cMDwvY29kZT4nLgorCisKKzxwPgorTGl0ZXJhbCBzdHJpbmdzIGNhbiBhbHNvIGJlIGRlZmluZWQgdXNpbmcgYSBsb25nIGZvcm1hdAorZW5jbG9zZWQgYnkgPGVtPmxvbmcgYnJhY2tldHM8L2VtPi4KK1dlIGRlZmluZSBhbiA8ZW0+b3BlbmluZyBsb25nIGJyYWNrZXQgb2YgbGV2ZWwgPGVtPm48L2VtPjwvZW0+IGFzIGFuIG9wZW5pbmcKK3NxdWFyZSBicmFja2V0IGZvbGxvd2VkIGJ5IDxlbT5uPC9lbT4gZXF1YWwgc2lnbnMgZm9sbG93ZWQgYnkgYW5vdGhlcgorb3BlbmluZyBzcXVhcmUgYnJhY2tldC4KK1NvLCBhbiBvcGVuaW5nIGxvbmcgYnJhY2tldCBvZiBsZXZlbCZuYnNwOzAgaXMgd3JpdHRlbiBhcyA8Y29kZT5bWzwvY29kZT4sCithbiBvcGVuaW5nIGxvbmcgYnJhY2tldCBvZiBsZXZlbCZuYnNwOzEgaXMgd3JpdHRlbiBhcyA8Y29kZT5bPVs8L2NvZGU+LAorYW5kIHNvIG9uLgorQSA8ZW0+Y2xvc2luZyBsb25nIGJyYWNrZXQ8L2VtPiBpcyBkZWZpbmVkIHNpbWlsYXJseTsKK2ZvciBpbnN0YW5jZSwgYSBjbG9zaW5nIGxvbmcgYnJhY2tldCBvZiBsZXZlbCZuYnNwOzQgaXMgd3JpdHRlbiBhcyA8Y29kZT5dPT09PV08L2NvZGU+LgorQSBsb25nIHN0cmluZyBzdGFydHMgd2l0aCBhbiBvcGVuaW5nIGxvbmcgYnJhY2tldCBvZiBhbnkgbGV2ZWwgYW5kCitlbmRzIGF0IHRoZSBmaXJzdCBjbG9zaW5nIGxvbmcgYnJhY2tldCBvZiB0aGUgc2FtZSBsZXZlbC4KK0xpdGVyYWxzIGluIHRoaXMgYnJhY2tldGVkIGZvcm0gY2FuIHJ1biBmb3Igc2V2ZXJhbCBsaW5lcywKK2RvIG5vdCBpbnRlcnByZXQgYW55IGVzY2FwZSBzZXF1ZW5jZXMsCithbmQgaWdub3JlIGxvbmcgYnJhY2tldHMgb2YgYW55IG90aGVyIGxldmVsLgorVGhleSBjYW4gY29udGFpbiBhbnl0aGluZyBleGNlcHQgYSBjbG9zaW5nIGJyYWNrZXQgb2YgdGhlIHByb3BlciBsZXZlbC4KKworCis8cD4KK0ZvciBjb252ZW5pZW5jZSwKK3doZW4gdGhlIG9wZW5pbmcgbG9uZyBicmFja2V0IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbmV3bGluZSwKK3RoZSBuZXdsaW5lIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nLgorQXMgYW4gZXhhbXBsZSwgaW4gYSBzeXN0ZW0gdXNpbmcgQVNDSUkKKyhpbiB3aGljaCAnPGNvZGU+YTwvY29kZT4nIGlzIGNvZGVkIGFzJm5ic3A7OTcsCituZXdsaW5lIGlzIGNvZGVkIGFzJm5ic3A7MTAsIGFuZCAnPGNvZGU+MTwvY29kZT4nIGlzIGNvZGVkIGFzJm5ic3A7NDkpLAordGhlIGZpdmUgbGl0ZXJhbCBzdHJpbmdzIGJlbG93IGRlbm90ZSB0aGUgc2FtZSBzdHJpbmc6CisKKzxwcmU+CisgICAgIGEgPSAnYWxvXG4xMjMiJworICAgICBhID0gImFsb1xuMTIzXCIiCisgICAgIGEgPSAnXDk3bG9cMTBcMDQ5MjMiJworICAgICBhID0gW1thbG8KKyAgICAgMTIzIl1dCisgICAgIGEgPSBbPT1bCisgICAgIGFsbworICAgICAxMjMiXT09XQorPC9wcmU+CisKKzxwPgorQSA8ZW0+bnVtZXJpY2FsIGNvbnN0YW50PC9lbT4gY2FuIGJlIHdyaXR0ZW4gd2l0aCBhbiBvcHRpb25hbCBkZWNpbWFsIHBhcnQKK2FuZCBhbiBvcHRpb25hbCBkZWNpbWFsIGV4cG9uZW50LgorTHVhIGFsc28gYWNjZXB0cyBpbnRlZ2VyIGhleGFkZWNpbWFsIGNvbnN0YW50cywKK2J5IHByZWZpeGluZyB0aGVtIHdpdGggPGNvZGU+MHg8L2NvZGU+LgorRXhhbXBsZXMgb2YgdmFsaWQgbnVtZXJpY2FsIGNvbnN0YW50cyBhcmUKKworPHByZT4KKyAgICAgMyAgIDMuMCAgIDMuMTQxNiAgIDMxNC4xNmUtMiAgIDAuMzE0MTZFMSAgIDB4ZmYgICAweDU2Cis8L3ByZT4KKworPHA+CitBIDxlbT5jb21tZW50PC9lbT4gc3RhcnRzIHdpdGggYSBkb3VibGUgaHlwaGVuICg8Y29kZT4tLTwvY29kZT4pCithbnl3aGVyZSBvdXRzaWRlIGEgc3RyaW5nLgorSWYgdGhlIHRleHQgaW1tZWRpYXRlbHkgYWZ0ZXIgPGNvZGU+LS08L2NvZGU+IGlzIG5vdCBhbiBvcGVuaW5nIGxvbmcgYnJhY2tldCwKK3RoZSBjb21tZW50IGlzIGEgPGVtPnNob3J0IGNvbW1lbnQ8L2VtPiwKK3doaWNoIHJ1bnMgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluZS4KK090aGVyd2lzZSwgaXQgaXMgYSA8ZW0+bG9uZyBjb21tZW50PC9lbT4sCit3aGljaCBydW5zIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgbG9uZyBicmFja2V0LgorTG9uZyBjb21tZW50cyBhcmUgZnJlcXVlbnRseSB1c2VkIHRvIGRpc2FibGUgY29kZSB0ZW1wb3JhcmlseS4KKworCisKKworCis8aDI+Mi4yIC0gPGEgbmFtZT0iMi4yIj5WYWx1ZXMgYW5kIFR5cGVzPC9hPjwvaDI+CisKKzxwPgorTHVhIGlzIGEgPGVtPmR5bmFtaWNhbGx5IHR5cGVkIGxhbmd1YWdlPC9lbT4uCitUaGlzIG1lYW5zIHRoYXQKK3ZhcmlhYmxlcyBkbyBub3QgaGF2ZSB0eXBlczsgb25seSB2YWx1ZXMgZG8uCitUaGVyZSBhcmUgbm8gdHlwZSBkZWZpbml0aW9ucyBpbiB0aGUgbGFuZ3VhZ2UuCitBbGwgdmFsdWVzIGNhcnJ5IHRoZWlyIG93biB0eXBlLgorCisKKzxwPgorQWxsIHZhbHVlcyBpbiBMdWEgYXJlIDxlbT5maXJzdC1jbGFzcyB2YWx1ZXM8L2VtPi4KK1RoaXMgbWVhbnMgdGhhdCBhbGwgdmFsdWVzIGNhbiBiZSBzdG9yZWQgaW4gdmFyaWFibGVzLAorcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBvdGhlciBmdW5jdGlvbnMsIGFuZCByZXR1cm5lZCBhcyByZXN1bHRzLgorCisKKzxwPgorVGhlcmUgYXJlIGVpZ2h0IGJhc2ljIHR5cGVzIGluIEx1YToKKzxlbT5uaWw8L2VtPiwgPGVtPmJvb2xlYW48L2VtPiwgPGVtPm51bWJlcjwvZW0+LAorPGVtPnN0cmluZzwvZW0+LCA8ZW0+ZnVuY3Rpb248L2VtPiwgPGVtPnVzZXJkYXRhPC9lbT4sCis8ZW0+dGhyZWFkPC9lbT4sIGFuZCA8ZW0+dGFibGU8L2VtPi4KKzxlbT5OaWw8L2VtPiBpcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgPGI+bmlsPC9iPiwKK3dob3NlIG1haW4gcHJvcGVydHkgaXMgdG8gYmUgZGlmZmVyZW50IGZyb20gYW55IG90aGVyIHZhbHVlOworaXQgdXN1YWxseSByZXByZXNlbnRzIHRoZSBhYnNlbmNlIG9mIGEgdXNlZnVsIHZhbHVlLgorPGVtPkJvb2xlYW48L2VtPiBpcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIDxiPmZhbHNlPC9iPiBhbmQgPGI+dHJ1ZTwvYj4uCitCb3RoIDxiPm5pbDwvYj4gYW5kIDxiPmZhbHNlPC9iPiBtYWtlIGEgY29uZGl0aW9uIGZhbHNlOworYW55IG90aGVyIHZhbHVlIG1ha2VzIGl0IHRydWUuCis8ZW0+TnVtYmVyPC9lbT4gcmVwcmVzZW50cyByZWFsIChkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50KSBudW1iZXJzLgorKEl0IGlzIGVhc3kgdG8gYnVpbGQgTHVhIGludGVycHJldGVycyB0aGF0IHVzZSBvdGhlcgoraW50ZXJuYWwgcmVwcmVzZW50YXRpb25zIGZvciBudW1iZXJzLAorc3VjaCBhcyBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0IG9yIGxvbmcgaW50ZWdlcnM7CitzZWUgZmlsZSA8Y29kZT5sdWFjb25mLmg8L2NvZGU+LikKKzxlbT5TdHJpbmc8L2VtPiByZXByZXNlbnRzIGFycmF5cyBvZiBjaGFyYWN0ZXJzLgorCitMdWEgaXMgOC1iaXQgY2xlYW46CitzdHJpbmdzIGNhbiBjb250YWluIGFueSA4LWJpdCBjaGFyYWN0ZXIsCitpbmNsdWRpbmcgZW1iZWRkZWQgemVyb3MgKCc8Y29kZT5cMDwvY29kZT4nKSAoc2VlIDxhIGhyZWY9IiMyLjEiPiZzZWN0OzIuMTwvYT4pLgorCisKKzxwPgorTHVhIGNhbiBjYWxsIChhbmQgbWFuaXB1bGF0ZSkgZnVuY3Rpb25zIHdyaXR0ZW4gaW4gTHVhIGFuZAorZnVuY3Rpb25zIHdyaXR0ZW4gaW4gQworKHNlZSA8YSBocmVmPSIjMi41LjgiPiZzZWN0OzIuNS44PC9hPikuCisKKworPHA+CitUaGUgdHlwZSA8ZW0+dXNlcmRhdGE8L2VtPiBpcyBwcm92aWRlZCB0byBhbGxvdyBhcmJpdHJhcnkgQyZuYnNwO2RhdGEgdG8KK2JlIHN0b3JlZCBpbiBMdWEgdmFyaWFibGVzLgorVGhpcyB0eXBlIGNvcnJlc3BvbmRzIHRvIGEgYmxvY2sgb2YgcmF3IG1lbW9yeQorYW5kIGhhcyBubyBwcmUtZGVmaW5lZCBvcGVyYXRpb25zIGluIEx1YSwKK2V4Y2VwdCBhc3NpZ25tZW50IGFuZCBpZGVudGl0eSB0ZXN0LgorSG93ZXZlciwgYnkgdXNpbmcgPGVtPm1ldGF0YWJsZXM8L2VtPiwKK3RoZSBwcm9ncmFtbWVyIGNhbiBkZWZpbmUgb3BlcmF0aW9ucyBmb3IgdXNlcmRhdGEgdmFsdWVzCisoc2VlIDxhIGhyZWY9IiMyLjgiPiZzZWN0OzIuODwvYT4pLgorVXNlcmRhdGEgdmFsdWVzIGNhbm5vdCBiZSBjcmVhdGVkIG9yIG1vZGlmaWVkIGluIEx1YSwKK29ubHkgdGhyb3VnaCB0aGUgQyZuYnNwO0FQSS4KK1RoaXMgZ3VhcmFudGVlcyB0aGUgaW50ZWdyaXR5IG9mIGRhdGEgb3duZWQgYnkgdGhlIGhvc3QgcHJvZ3JhbS4KKworCis8cD4KK1RoZSB0eXBlIDxlbT50aHJlYWQ8L2VtPiByZXByZXNlbnRzIGluZGVwZW5kZW50IHRocmVhZHMgb2YgZXhlY3V0aW9uCithbmQgaXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgY29yb3V0aW5lcyAoc2VlIDxhIGhyZWY9IiMyLjExIj4mc2VjdDsyLjExPC9hPikuCitEbyBub3QgY29uZnVzZSBMdWEgdGhyZWFkcyB3aXRoIG9wZXJhdGluZy1zeXN0ZW0gdGhyZWFkcy4KK0x1YSBzdXBwb3J0cyBjb3JvdXRpbmVzIG9uIGFsbCBzeXN0ZW1zLAorZXZlbiB0aG9zZSB0aGF0IGRvIG5vdCBzdXBwb3J0IHRocmVhZHMuCisKKworPHA+CitUaGUgdHlwZSA8ZW0+dGFibGU8L2VtPiBpbXBsZW1lbnRzIGFzc29jaWF0aXZlIGFycmF5cywKK3RoYXQgaXMsIGFycmF5cyB0aGF0IGNhbiBiZSBpbmRleGVkIG5vdCBvbmx5IHdpdGggbnVtYmVycywKK2J1dCB3aXRoIGFueSB2YWx1ZSAoZXhjZXB0IDxiPm5pbDwvYj4pLgorVGFibGVzIGNhbiBiZSA8ZW0+aGV0ZXJvZ2VuZW91czwvZW0+OwordGhhdCBpcywgdGhleSBjYW4gY29udGFpbiB2YWx1ZXMgb2YgYWxsIHR5cGVzIChleGNlcHQgPGI+bmlsPC9iPikuCitUYWJsZXMgYXJlIHRoZSBzb2xlIGRhdGEgc3RydWN0dXJpbmcgbWVjaGFuaXNtIGluIEx1YTsKK3RoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IG9yZGluYXJ5IGFycmF5cywKK3N5bWJvbCB0YWJsZXMsIHNldHMsIHJlY29yZHMsIGdyYXBocywgdHJlZXMsIGV0Yy4KK1RvIHJlcHJlc2VudCByZWNvcmRzLCBMdWEgdXNlcyB0aGUgZmllbGQgbmFtZSBhcyBhbiBpbmRleC4KK1RoZSBsYW5ndWFnZSBzdXBwb3J0cyB0aGlzIHJlcHJlc2VudGF0aW9uIGJ5Citwcm92aWRpbmcgPGNvZGU+YS5uYW1lPC9jb2RlPiBhcyBzeW50YWN0aWMgc3VnYXIgZm9yIDxjb2RlPmFbIm5hbWUiXTwvY29kZT4uCitUaGVyZSBhcmUgc2V2ZXJhbCBjb252ZW5pZW50IHdheXMgdG8gY3JlYXRlIHRhYmxlcyBpbiBMdWEKKyhzZWUgPGEgaHJlZj0iIzIuNS43Ij4mc2VjdDsyLjUuNzwvYT4pLgorCisKKzxwPgorTGlrZSBpbmRpY2VzLAordGhlIHZhbHVlIG9mIGEgdGFibGUgZmllbGQgY2FuIGJlIG9mIGFueSB0eXBlIChleGNlcHQgPGI+bmlsPC9iPikuCitJbiBwYXJ0aWN1bGFyLAorYmVjYXVzZSBmdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIHZhbHVlcywKK3RhYmxlIGZpZWxkcyBjYW4gY29udGFpbiBmdW5jdGlvbnMuCitUaHVzIHRhYmxlcyBjYW4gYWxzbyBjYXJyeSA8ZW0+bWV0aG9kczwvZW0+IChzZWUgPGEgaHJlZj0iIzIuNS45Ij4mc2VjdDsyLjUuOTwvYT4pLgorCisKKzxwPgorVGFibGVzLCBmdW5jdGlvbnMsIHRocmVhZHMsIGFuZCAoZnVsbCkgdXNlcmRhdGEgdmFsdWVzIGFyZSA8ZW0+b2JqZWN0czwvZW0+OgordmFyaWFibGVzIGRvIG5vdCBhY3R1YWxseSA8ZW0+Y29udGFpbjwvZW0+IHRoZXNlIHZhbHVlcywKK29ubHkgPGVtPnJlZmVyZW5jZXM8L2VtPiB0byB0aGVtLgorQXNzaWdubWVudCwgcGFyYW1ldGVyIHBhc3NpbmcsIGFuZCBmdW5jdGlvbiByZXR1cm5zCithbHdheXMgbWFuaXB1bGF0ZSByZWZlcmVuY2VzIHRvIHN1Y2ggdmFsdWVzOwordGhlc2Ugb3BlcmF0aW9ucyBkbyBub3QgaW1wbHkgYW55IGtpbmQgb2YgY29weS4KKworCis8cD4KK1RoZSBsaWJyYXJ5IGZ1bmN0aW9uIDxhIGhyZWY9IiNwZGYtdHlwZSI+PGNvZGU+dHlwZTwvY29kZT48L2E+IHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZQorb2YgYSBnaXZlbiB2YWx1ZS4KKworCisKKzxoMz4yLjIuMSAtIDxhIG5hbWU9IjIuMi4xIj5Db2VyY2lvbjwvYT48L2gzPgorCis8cD4KK0x1YSBwcm92aWRlcyBhdXRvbWF0aWMgY29udmVyc2lvbiBiZXR3ZWVuCitzdHJpbmcgYW5kIG51bWJlciB2YWx1ZXMgYXQgcnVuIHRpbWUuCitBbnkgYXJpdGhtZXRpYyBvcGVyYXRpb24gYXBwbGllZCB0byBhIHN0cmluZyB0cmllcyB0byBjb252ZXJ0Cit0aGlzIHN0cmluZyB0byBhIG51bWJlciwgZm9sbG93aW5nIHRoZSB1c3VhbCBjb252ZXJzaW9uIHJ1bGVzLgorQ29udmVyc2VseSwgd2hlbmV2ZXIgYSBudW1iZXIgaXMgdXNlZCB3aGVyZSBhIHN0cmluZyBpcyBleHBlY3RlZCwKK3RoZSBudW1iZXIgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nLCBpbiBhIHJlYXNvbmFibGUgZm9ybWF0LgorRm9yIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBob3cgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MsCit1c2UgdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gZnVuY3Rpb24gZnJvbSB0aGUgc3RyaW5nIGxpYnJhcnkKKyhzZWUgPGEgaHJlZj0iI3BkZi1zdHJpbmcuZm9ybWF0Ij48Y29kZT5zdHJpbmcuZm9ybWF0PC9jb2RlPjwvYT4pLgorCisKKworCisKKworCis8aDI+Mi4zIC0gPGEgbmFtZT0iMi4zIj5WYXJpYWJsZXM8L2E+PC9oMj4KKworPHA+CitWYXJpYWJsZXMgYXJlIHBsYWNlcyB0aGF0IHN0b3JlIHZhbHVlcy4KKworVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIHZhcmlhYmxlcyBpbiBMdWE6CitnbG9iYWwgdmFyaWFibGVzLCBsb2NhbCB2YXJpYWJsZXMsIGFuZCB0YWJsZSBmaWVsZHMuCisKKworPHA+CitBIHNpbmdsZSBuYW1lIGNhbiBkZW5vdGUgYSBnbG9iYWwgdmFyaWFibGUgb3IgYSBsb2NhbCB2YXJpYWJsZQorKG9yIGEgZnVuY3Rpb24ncyBmb3JtYWwgcGFyYW1ldGVyLAord2hpY2ggaXMgYSBwYXJ0aWN1bGFyIGtpbmQgb2YgbG9jYWwgdmFyaWFibGUpOgorCis8cHJlPgorCXZhciA6Oj0gTmFtZQorPC9wcmU+PHA+CitOYW1lIGRlbm90ZXMgaWRlbnRpZmllcnMsIGFzIGRlZmluZWQgaW4gPGEgaHJlZj0iIzIuMSI+JnNlY3Q7Mi4xPC9hPi4KKworCis8cD4KK0FueSB2YXJpYWJsZSBpcyBhc3N1bWVkIHRvIGJlIGdsb2JhbCB1bmxlc3MgZXhwbGljaXRseSBkZWNsYXJlZAorYXMgYSBsb2NhbCAoc2VlIDxhIGhyZWY9IiMyLjQuNyI+JnNlY3Q7Mi40Ljc8L2E+KS4KK0xvY2FsIHZhcmlhYmxlcyBhcmUgPGVtPmxleGljYWxseSBzY29wZWQ8L2VtPjoKK2xvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZnJlZWx5IGFjY2Vzc2VkIGJ5IGZ1bmN0aW9ucworZGVmaW5lZCBpbnNpZGUgdGhlaXIgc2NvcGUgKHNlZSA8YSBocmVmPSIjMi42Ij4mc2VjdDsyLjY8L2E+KS4KKworCis8cD4KK0JlZm9yZSB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhIHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgPGI+bmlsPC9iPi4KKworCis8cD4KK1NxdWFyZSBicmFja2V0cyBhcmUgdXNlZCB0byBpbmRleCBhIHRhYmxlOgorCis8cHJlPgorCXZhciA6Oj0gcHJlZml4ZXhwIGA8Yj5bPC9iPiZhY3V0ZTsgZXhwIGA8Yj5dPC9iPiZhY3V0ZTsKKzwvcHJlPjxwPgorVGhlIG1lYW5pbmcgb2YgYWNjZXNzZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcyAKK2FuZCB0YWJsZSBmaWVsZHMgY2FuIGJlIGNoYW5nZWQgdmlhIG1ldGF0YWJsZXMuCitBbiBhY2Nlc3MgdG8gYW4gaW5kZXhlZCB2YXJpYWJsZSA8Y29kZT50W2ldPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvCithIGNhbGwgPGNvZGU+Z2V0dGFibGVfZXZlbnQodCxpKTwvY29kZT4uCisoU2VlIDxhIGhyZWY9IiMyLjgiPiZzZWN0OzIuODwvYT4gZm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlCis8Y29kZT5nZXR0YWJsZV9ldmVudDwvY29kZT4gZnVuY3Rpb24uCitUaGlzIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkIG9yIGNhbGxhYmxlIGluIEx1YS4KK1dlIHVzZSBpdCBoZXJlIG9ubHkgZm9yIGV4cGxhbmF0b3J5IHB1cnBvc2VzLikKKworCis8cD4KK1RoZSBzeW50YXggPGNvZGU+dmFyLk5hbWU8L2NvZGU+IGlzIGp1c3Qgc3ludGFjdGljIHN1Z2FyIGZvcgorPGNvZGU+dmFyWyJOYW1lIl08L2NvZGU+OgorCis8cHJlPgorCXZhciA6Oj0gcHJlZml4ZXhwIGA8Yj4uPC9iPiZhY3V0ZTsgTmFtZQorPC9wcmU+CisKKzxwPgorQWxsIGdsb2JhbCB2YXJpYWJsZXMgbGl2ZSBhcyBmaWVsZHMgaW4gb3JkaW5hcnkgTHVhIHRhYmxlcywKK2NhbGxlZCA8ZW0+ZW52aXJvbm1lbnQgdGFibGVzPC9lbT4gb3Igc2ltcGx5Cis8ZW0+ZW52aXJvbm1lbnRzPC9lbT4gKHNlZSA8YSBocmVmPSIjMi45Ij4mc2VjdDsyLjk8L2E+KS4KK0VhY2ggZnVuY3Rpb24gaGFzIGl0cyBvd24gcmVmZXJlbmNlIHRvIGFuIGVudmlyb25tZW50LAorc28gdGhhdCBhbGwgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGlzIGZ1bmN0aW9uCit3aWxsIHJlZmVyIHRvIHRoaXMgZW52aXJvbm1lbnQgdGFibGUuCitXaGVuIGEgZnVuY3Rpb24gaXMgY3JlYXRlZCwKK2l0IGluaGVyaXRzIHRoZSBlbnZpcm9ubWVudCBmcm9tIHRoZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZWQgaXQuCitUbyBnZXQgdGhlIGVudmlyb25tZW50IHRhYmxlIG9mIGEgTHVhIGZ1bmN0aW9uLAoreW91IGNhbGwgPGEgaHJlZj0iI3BkZi1nZXRmZW52Ij48Y29kZT5nZXRmZW52PC9jb2RlPjwvYT4uCitUbyByZXBsYWNlIGl0LAoreW91IGNhbGwgPGEgaHJlZj0iI3BkZi1zZXRmZW52Ij48Y29kZT5zZXRmZW52PC9jb2RlPjwvYT4uCisoWW91IGNhbiBvbmx5IG1hbmlwdWxhdGUgdGhlIGVudmlyb25tZW50IG9mIEMmbmJzcDtmdW5jdGlvbnMKK3Rocm91Z2ggdGhlIGRlYnVnIGxpYnJhcnk7IChzZWUgPGEgaHJlZj0iIzUuOSI+JnNlY3Q7NS45PC9hPikuKQorCisKKzxwPgorQW4gYWNjZXNzIHRvIGEgZ2xvYmFsIHZhcmlhYmxlIDxjb2RlPng8L2NvZGU+CitpcyBlcXVpdmFsZW50IHRvIDxjb2RlPl9lbnYueDwvY29kZT4sCit3aGljaCBpbiB0dXJuIGlzIGVxdWl2YWxlbnQgdG8KKworPHByZT4KKyAgICAgZ2V0dGFibGVfZXZlbnQoX2VudiwgIngiKQorPC9wcmU+PHA+Cit3aGVyZSA8Y29kZT5fZW52PC9jb2RlPiBpcyB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHJ1bm5pbmcgZnVuY3Rpb24uCisoU2VlIDxhIGhyZWY9IiMyLjgiPiZzZWN0OzIuODwvYT4gZm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlCis8Y29kZT5nZXR0YWJsZV9ldmVudDwvY29kZT4gZnVuY3Rpb24uCitUaGlzIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkIG9yIGNhbGxhYmxlIGluIEx1YS4KK1NpbWlsYXJseSwgdGhlIDxjb2RlPl9lbnY8L2NvZGU+IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGluIEx1YS4KK1dlIHVzZSB0aGVtIGhlcmUgb25seSBmb3IgZXhwbGFuYXRvcnkgcHVycG9zZXMuKQorCisKKworCisKKzxoMj4yLjQgLSA8YSBuYW1lPSIyLjQiPlN0YXRlbWVudHM8L2E+PC9oMj4KKworPHA+CitMdWEgc3VwcG9ydHMgYW4gYWxtb3N0IGNvbnZlbnRpb25hbCBzZXQgb2Ygc3RhdGVtZW50cywKK3NpbWlsYXIgdG8gdGhvc2UgaW4gUGFzY2FsIG9yIEMuCitUaGlzIHNldCBpbmNsdWRlcworYXNzaWdubWVudHMsIGNvbnRyb2wgc3RydWN0dXJlcywgZnVuY3Rpb24gY2FsbHMsCithbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgorCisKKworPGgzPjIuNC4xIC0gPGEgbmFtZT0iMi40LjEiPkNodW5rczwvYT48L2gzPgorCis8cD4KK1RoZSB1bml0IG9mIGV4ZWN1dGlvbiBvZiBMdWEgaXMgY2FsbGVkIGEgPGVtPmNodW5rPC9lbT4uCitBIGNodW5rIGlzIHNpbXBseSBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMsCit3aGljaCBhcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LgorRWFjaCBzdGF0ZW1lbnQgY2FuIGJlIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBzZW1pY29sb246CisKKzxwcmU+CisJY2h1bmsgOjo9IHtzdGF0IFtgPGI+OzwvYj4mYWN1dGU7XX0KKzwvcHJlPjxwPgorVGhlcmUgYXJlIG5vIGVtcHR5IHN0YXRlbWVudHMgYW5kIHRodXMgJzxjb2RlPjs7PC9jb2RlPicgaXMgbm90IGxlZ2FsLgorCisKKzxwPgorTHVhIGhhbmRsZXMgYSBjaHVuayBhcyB0aGUgYm9keSBvZiBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gCit3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cworKHNlZSA8YSBocmVmPSIjMi41LjkiPiZzZWN0OzIuNS45PC9hPikuCitBcyBzdWNoLCBjaHVua3MgY2FuIGRlZmluZSBsb2NhbCB2YXJpYWJsZXMsCityZWNlaXZlIGFyZ3VtZW50cywgYW5kIHJldHVybiB2YWx1ZXMuCisKKworPHA+CitBIGNodW5rIGNhbiBiZSBzdG9yZWQgaW4gYSBmaWxlIG9yIGluIGEgc3RyaW5nIGluc2lkZSB0aGUgaG9zdCBwcm9ncmFtLgorVG8gZXhlY3V0ZSBhIGNodW5rLAorTHVhIGZpcnN0IHByZS1jb21waWxlcyB0aGUgY2h1bmsgaW50byBpbnN0cnVjdGlvbnMgZm9yIGEgdmlydHVhbCBtYWNoaW5lLAorYW5kIHRoZW4gaXQgZXhlY3V0ZXMgdGhlIGNvbXBpbGVkIGNvZGUKK3dpdGggYW4gaW50ZXJwcmV0ZXIgZm9yIHRoZSB2aXJ0dWFsIG1hY2hpbmUuCisKKworPHA+CitDaHVua3MgY2FuIGFsc28gYmUgcHJlLWNvbXBpbGVkIGludG8gYmluYXJ5IGZvcm07CitzZWUgcHJvZ3JhbSA8Y29kZT5sdWFjPC9jb2RlPiBmb3IgZGV0YWlscy4KK1Byb2dyYW1zIGluIHNvdXJjZSBhbmQgY29tcGlsZWQgZm9ybXMgYXJlIGludGVyY2hhbmdlYWJsZTsKK0x1YSBhdXRvbWF0aWNhbGx5IGRldGVjdHMgdGhlIGZpbGUgdHlwZSBhbmQgYWN0cyBhY2NvcmRpbmdseS4KKworCisKKworCisKKzxoMz4yLjQuMiAtIDxhIG5hbWU9IjIuNC4yIj5CbG9ja3M8L2E+PC9oMz48cD4KK0EgYmxvY2sgaXMgYSBsaXN0IG9mIHN0YXRlbWVudHM7CitzeW50YWN0aWNhbGx5LCBhIGJsb2NrIGlzIHRoZSBzYW1lIGFzIGEgY2h1bms6CisKKzxwcmU+CisJYmxvY2sgOjo9IGNodW5rCis8L3ByZT4KKworPHA+CitBIGJsb2NrIGNhbiBiZSBleHBsaWNpdGx5IGRlbGltaXRlZCB0byBwcm9kdWNlIGEgc2luZ2xlIHN0YXRlbWVudDoKKworPHByZT4KKwlzdGF0IDo6PSA8Yj5kbzwvYj4gYmxvY2sgPGI+ZW5kPC9iPgorPC9wcmU+PHA+CitFeHBsaWNpdCBibG9ja3MgYXJlIHVzZWZ1bAordG8gY29udHJvbCB0aGUgc2NvcGUgb2YgdmFyaWFibGUgZGVjbGFyYXRpb25zLgorRXhwbGljaXQgYmxvY2tzIGFyZSBhbHNvIHNvbWV0aW1lcyB1c2VkIHRvCithZGQgYSA8Yj5yZXR1cm48L2I+IG9yIDxiPmJyZWFrPC9iPiBzdGF0ZW1lbnQgaW4gdGhlIG1pZGRsZQorb2YgYW5vdGhlciBibG9jayAoc2VlIDxhIGhyZWY9IiMyLjQuNCI+JnNlY3Q7Mi40LjQ8L2E+KS4KKworCisKKworCis8aDM+Mi40LjMgLSA8YSBuYW1lPSIyLjQuMyI+QXNzaWdubWVudDwvYT48L2gzPgorCis8cD4KK0x1YSBhbGxvd3MgbXVsdGlwbGUgYXNzaWdubWVudHMuCitUaGVyZWZvcmUsIHRoZSBzeW50YXggZm9yIGFzc2lnbm1lbnQKK2RlZmluZXMgYSBsaXN0IG9mIHZhcmlhYmxlcyBvbiB0aGUgbGVmdCBzaWRlCithbmQgYSBsaXN0IG9mIGV4cHJlc3Npb25zIG9uIHRoZSByaWdodCBzaWRlLgorVGhlIGVsZW1lbnRzIGluIGJvdGggbGlzdHMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXM6CisKKzxwcmU+CisJc3RhdCA6Oj0gdmFybGlzdCBgPGI+PTwvYj4mYWN1dGU7IGV4cGxpc3QKKwl2YXJsaXN0IDo6PSB2YXIge2A8Yj4sPC9iPiZhY3V0ZTsgdmFyfQorCWV4cGxpc3QgOjo9IGV4cCB7YDxiPiw8L2I+JmFjdXRlOyBleHB9Cis8L3ByZT48cD4KK0V4cHJlc3Npb25zIGFyZSBkaXNjdXNzZWQgaW4gPGEgaHJlZj0iIzIuNSI+JnNlY3Q7Mi41PC9hPi4KKworCis8cD4KK0JlZm9yZSB0aGUgYXNzaWdubWVudCwKK3RoZSBsaXN0IG9mIHZhbHVlcyBpcyA8ZW0+YWRqdXN0ZWQ8L2VtPiB0byB0aGUgbGVuZ3RoIG9mCit0aGUgbGlzdCBvZiB2YXJpYWJsZXMuCitJZiB0aGVyZSBhcmUgbW9yZSB2YWx1ZXMgdGhhbiBuZWVkZWQsCit0aGUgZXhjZXNzIHZhbHVlcyBhcmUgdGhyb3duIGF3YXkuCitJZiB0aGVyZSBhcmUgZmV3ZXIgdmFsdWVzIHRoYW4gbmVlZGVkLAordGhlIGxpc3QgaXMgZXh0ZW5kZWQgd2l0aCBhcyBtYW55ICA8Yj5uaWw8L2I+J3MgYXMgbmVlZGVkLgorSWYgdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZW5kcyB3aXRoIGEgZnVuY3Rpb24gY2FsbCwKK3RoZW4gYWxsIHZhbHVlcyByZXR1cm5lZCBieSB0aGF0IGNhbGwgZW50ZXIgdGhlIGxpc3Qgb2YgdmFsdWVzLAorYmVmb3JlIHRoZSBhZGp1c3RtZW50CisoZXhjZXB0IHdoZW4gdGhlIGNhbGwgaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXM7IHNlZSA8YSBocmVmPSIjMi41Ij4mc2VjdDsyLjU8L2E+KS4KKworCis8cD4KK1RoZSBhc3NpZ25tZW50IHN0YXRlbWVudCBmaXJzdCBldmFsdWF0ZXMgYWxsIGl0cyBleHByZXNzaW9ucworYW5kIG9ubHkgdGhlbiBhcmUgdGhlIGFzc2lnbm1lbnRzIHBlcmZvcm1lZC4KK1RodXMgdGhlIGNvZGUKKworPHByZT4KKyAgICAgaSA9IDMKKyAgICAgaSwgYVtpXSA9IGkrMSwgMjAKKzwvcHJlPjxwPgorc2V0cyA8Y29kZT5hWzNdPC9jb2RlPiB0byAyMCwgd2l0aG91dCBhZmZlY3RpbmcgPGNvZGU+YVs0XTwvY29kZT4KK2JlY2F1c2UgdGhlIDxjb2RlPmk8L2NvZGU+IGluIDxjb2RlPmFbaV08L2NvZGU+IGlzIGV2YWx1YXRlZCAodG8gMykKK2JlZm9yZSBpdCBpcyBhc3NpZ25lZCZuYnNwOzQuCitTaW1pbGFybHksIHRoZSBsaW5lCisKKzxwcmU+CisgICAgIHgsIHkgPSB5LCB4Cis8L3ByZT48cD4KK2V4Y2hhbmdlcyB0aGUgdmFsdWVzIG9mIDxjb2RlPng8L2NvZGU+IGFuZCA8Y29kZT55PC9jb2RlPiwKK2FuZAorCis8cHJlPgorICAgICB4LCB5LCB6ID0geSwgeiwgeAorPC9wcmU+PHA+CitjeWNsaWNhbGx5IHBlcm11dGVzIHRoZSB2YWx1ZXMgb2YgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCBhbmQgPGNvZGU+ejwvY29kZT4uCisKKworPHA+CitUaGUgbWVhbmluZyBvZiBhc3NpZ25tZW50cyB0byBnbG9iYWwgdmFyaWFibGVzCithbmQgdGFibGUgZmllbGRzIGNhbiBiZSBjaGFuZ2VkIHZpYSBtZXRhdGFibGVzLgorQW4gYXNzaWdubWVudCB0byBhbiBpbmRleGVkIHZhcmlhYmxlIDxjb2RlPnRbaV0gPSB2YWw8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8KKzxjb2RlPnNldHRhYmxlX2V2ZW50KHQsaSx2YWwpPC9jb2RlPi4KKyhTZWUgPGEgaHJlZj0iIzIuOCI+JnNlY3Q7Mi44PC9hPiBmb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUKKzxjb2RlPnNldHRhYmxlX2V2ZW50PC9jb2RlPiBmdW5jdGlvbi4KK1RoaXMgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQgb3IgY2FsbGFibGUgaW4gTHVhLgorV2UgdXNlIGl0IGhlcmUgb25seSBmb3IgZXhwbGFuYXRvcnkgcHVycG9zZXMuKQorCisKKzxwPgorQW4gYXNzaWdubWVudCB0byBhIGdsb2JhbCB2YXJpYWJsZSA8Y29kZT54ID0gdmFsPC9jb2RlPgoraXMgZXF1aXZhbGVudCB0byB0aGUgYXNzaWdubWVudAorPGNvZGU+X2Vudi54ID0gdmFsPC9jb2RlPiwKK3doaWNoIGluIHR1cm4gaXMgZXF1aXZhbGVudCB0bworCis8cHJlPgorICAgICBzZXR0YWJsZV9ldmVudChfZW52LCAieCIsIHZhbCkKKzwvcHJlPjxwPgord2hlcmUgPGNvZGU+X2VudjwvY29kZT4gaXMgdGhlIGVudmlyb25tZW50IG9mIHRoZSBydW5uaW5nIGZ1bmN0aW9uLgorKFRoZSA8Y29kZT5fZW52PC9jb2RlPiB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBpbiBMdWEuCitXZSB1c2UgaXQgaGVyZSBvbmx5IGZvciBleHBsYW5hdG9yeSBwdXJwb3Nlcy4pCisKKworCisKKworPGgzPjIuNC40IC0gPGEgbmFtZT0iMi40LjQiPkNvbnRyb2wgU3RydWN0dXJlczwvYT48L2gzPjxwPgorVGhlIGNvbnRyb2wgc3RydWN0dXJlcworPGI+aWY8L2I+LCA8Yj53aGlsZTwvYj4sIGFuZCA8Yj5yZXBlYXQ8L2I+IGhhdmUgdGhlIHVzdWFsIG1lYW5pbmcgYW5kCitmYW1pbGlhciBzeW50YXg6CisKKworCisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+d2hpbGU8L2I+IGV4cCA8Yj5kbzwvYj4gYmxvY2sgPGI+ZW5kPC9iPgorCXN0YXQgOjo9IDxiPnJlcGVhdDwvYj4gYmxvY2sgPGI+dW50aWw8L2I+IGV4cAorCXN0YXQgOjo9IDxiPmlmPC9iPiBleHAgPGI+dGhlbjwvYj4gYmxvY2sgezxiPmVsc2VpZjwvYj4gZXhwIDxiPnRoZW48L2I+IGJsb2NrfSBbPGI+ZWxzZTwvYj4gYmxvY2tdIDxiPmVuZDwvYj4KKzwvcHJlPjxwPgorTHVhIGFsc28gaGFzIGEgPGI+Zm9yPC9iPiBzdGF0ZW1lbnQsIGluIHR3byBmbGF2b3JzIChzZWUgPGEgaHJlZj0iIzIuNC41Ij4mc2VjdDsyLjQuNTwvYT4pLgorCisKKzxwPgorVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIG9mIGEKK2NvbnRyb2wgc3RydWN0dXJlIGNhbiByZXR1cm4gYW55IHZhbHVlLgorQm90aCA8Yj5mYWxzZTwvYj4gYW5kIDxiPm5pbDwvYj4gYXJlIGNvbnNpZGVyZWQgZmFsc2UuCitBbGwgdmFsdWVzIGRpZmZlcmVudCBmcm9tIDxiPm5pbDwvYj4gYW5kIDxiPmZhbHNlPC9iPiBhcmUgY29uc2lkZXJlZCB0cnVlCisoaW4gcGFydGljdWxhciwgdGhlIG51bWJlciAwIGFuZCB0aGUgZW1wdHkgc3RyaW5nIGFyZSBhbHNvIHRydWUpLgorCisKKzxwPgorSW4gdGhlIDxiPnJlcGVhdDwvYj4mbmRhc2g7PGI+dW50aWw8L2I+IGxvb3AsCit0aGUgaW5uZXIgYmxvY2sgZG9lcyBub3QgZW5kIGF0IHRoZSA8Yj51bnRpbDwvYj4ga2V5d29yZCwKK2J1dCBvbmx5IGFmdGVyIHRoZSBjb25kaXRpb24uCitTbywgdGhlIGNvbmRpdGlvbiBjYW4gcmVmZXIgdG8gbG9jYWwgdmFyaWFibGVzCitkZWNsYXJlZCBpbnNpZGUgdGhlIGxvb3AgYmxvY2suCisKKworPHA+CitUaGUgPGI+cmV0dXJuPC9iPiBzdGF0ZW1lbnQgaXMgdXNlZCB0byByZXR1cm4gdmFsdWVzCitmcm9tIGEgZnVuY3Rpb24gb3IgYSBjaHVuayAod2hpY2ggaXMganVzdCBhIGZ1bmN0aW9uKS4KKworRnVuY3Rpb25zIGFuZCBjaHVua3MgY2FuIHJldHVybiBtb3JlIHRoYW4gb25lIHZhbHVlLAorYW5kIHNvIHRoZSBzeW50YXggZm9yIHRoZSA8Yj5yZXR1cm48L2I+IHN0YXRlbWVudCBpcworCis8cHJlPgorCXN0YXQgOjo9IDxiPnJldHVybjwvYj4gW2V4cGxpc3RdCis8L3ByZT4KKworPHA+CitUaGUgPGI+YnJlYWs8L2I+IHN0YXRlbWVudCBpcyB1c2VkIHRvIHRlcm1pbmF0ZSB0aGUgZXhlY3V0aW9uIG9mIGEKKzxiPndoaWxlPC9iPiwgPGI+cmVwZWF0PC9iPiwgb3IgPGI+Zm9yPC9iPiBsb29wLAorc2tpcHBpbmcgdG8gdGhlIG5leHQgc3RhdGVtZW50IGFmdGVyIHRoZSBsb29wOgorCisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+YnJlYWs8L2I+Cis8L3ByZT48cD4KK0EgPGI+YnJlYWs8L2I+IGVuZHMgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgbG9vcC4KKworCis8cD4KK1RoZSA8Yj5yZXR1cm48L2I+IGFuZCA8Yj5icmVhazwvYj4KK3N0YXRlbWVudHMgY2FuIG9ubHkgYmUgd3JpdHRlbiBhcyB0aGUgPGVtPmxhc3Q8L2VtPiBzdGF0ZW1lbnQgb2YgYSBibG9jay4KK0lmIGl0IGlzIHJlYWxseSBuZWNlc3NhcnkgdG8gPGI+cmV0dXJuPC9iPiBvciA8Yj5icmVhazwvYj4gaW4gdGhlCittaWRkbGUgb2YgYSBibG9jaywKK3RoZW4gYW4gZXhwbGljaXQgaW5uZXIgYmxvY2sgY2FuIGJlIHVzZWQsCithcyBpbiB0aGUgaWRpb21zCis8Y29kZT5kbyByZXR1cm4gZW5kPC9jb2RlPiBhbmQgPGNvZGU+ZG8gYnJlYWsgZW5kPC9jb2RlPiwKK2JlY2F1c2Ugbm93IDxiPnJldHVybjwvYj4gYW5kIDxiPmJyZWFrPC9iPiBhcmUgdGhlIGxhc3Qgc3RhdGVtZW50cyBpbgordGhlaXIgKGlubmVyKSBibG9ja3MuCisKKworCisKKworPGgzPjIuNC41IC0gPGEgbmFtZT0iMi40LjUiPkZvciBTdGF0ZW1lbnQ8L2E+PC9oMz4KKworPHA+CisKK1RoZSA8Yj5mb3I8L2I+IHN0YXRlbWVudCBoYXMgdHdvIGZvcm1zOgorb25lIG51bWVyaWMgYW5kIG9uZSBnZW5lcmljLgorCisKKzxwPgorVGhlIG51bWVyaWMgPGI+Zm9yPC9iPiBsb29wIHJlcGVhdHMgYSBibG9jayBvZiBjb2RlIHdoaWxlIGEKK2NvbnRyb2wgdmFyaWFibGUgcnVucyB0aHJvdWdoIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uCitJdCBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6CisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+Zm9yPC9iPiBOYW1lIGA8Yj49PC9iPiZhY3V0ZTsgZXhwIGA8Yj4sPC9iPiZhY3V0ZTsgZXhwIFtgPGI+LDwvYj4mYWN1dGU7IGV4cF0gPGI+ZG88L2I+IGJsb2NrIDxiPmVuZDwvYj4KKzwvcHJlPjxwPgorVGhlIDxlbT5ibG9jazwvZW0+IGlzIHJlcGVhdGVkIGZvciA8ZW0+bmFtZTwvZW0+IHN0YXJ0aW5nIGF0IHRoZSB2YWx1ZSBvZgordGhlIGZpcnN0IDxlbT5leHA8L2VtPiwgdW50aWwgaXQgcGFzc2VzIHRoZSBzZWNvbmQgPGVtPmV4cDwvZW0+IGJ5IHN0ZXBzIG9mIHRoZQordGhpcmQgPGVtPmV4cDwvZW0+LgorTW9yZSBwcmVjaXNlbHksIGEgPGI+Zm9yPC9iPiBzdGF0ZW1lbnQgbGlrZQorCis8cHJlPgorICAgICBmb3IgdiA9IDxlbT5lMTwvZW0+LCA8ZW0+ZTI8L2VtPiwgPGVtPmUzPC9lbT4gZG8gPGVtPmJsb2NrPC9lbT4gZW5kCis8L3ByZT48cD4KK2lzIGVxdWl2YWxlbnQgdG8gdGhlIGNvZGU6CisKKzxwcmU+CisgICAgIGRvCisgICAgICAgbG9jYWwgPGVtPnZhcjwvZW0+LCA8ZW0+bGltaXQ8L2VtPiwgPGVtPnN0ZXA8L2VtPiA9IHRvbnVtYmVyKDxlbT5lMTwvZW0+KSwgdG9udW1iZXIoPGVtPmUyPC9lbT4pLCB0b251bWJlcig8ZW0+ZTM8L2VtPikKKyAgICAgICBpZiBub3QgKDxlbT52YXI8L2VtPiBhbmQgPGVtPmxpbWl0PC9lbT4gYW5kIDxlbT5zdGVwPC9lbT4pIHRoZW4gZXJyb3IoKSBlbmQKKyAgICAgICB3aGlsZSAoPGVtPnN0ZXA8L2VtPiAmZ3Q7IDAgYW5kIDxlbT52YXI8L2VtPiAmbHQ7PSA8ZW0+bGltaXQ8L2VtPikgb3IgKDxlbT5zdGVwPC9lbT4gJmx0Oz0gMCBhbmQgPGVtPnZhcjwvZW0+ICZndDs9IDxlbT5saW1pdDwvZW0+KSBkbworICAgICAgICAgbG9jYWwgdiA9IDxlbT52YXI8L2VtPgorICAgICAgICAgPGVtPmJsb2NrPC9lbT4KKyAgICAgICAgIDxlbT52YXI8L2VtPiA9IDxlbT52YXI8L2VtPiArIDxlbT5zdGVwPC9lbT4KKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KK05vdGUgdGhlIGZvbGxvd2luZzoKKworPHVsPgorCis8bGk+CitBbGwgdGhyZWUgY29udHJvbCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIG9ubHkgb25jZSwKK2JlZm9yZSB0aGUgbG9vcCBzdGFydHMuCitUaGV5IG11c3QgYWxsIHJlc3VsdCBpbiBudW1iZXJzLgorPC9saT4KKworPGxpPgorPGNvZGU+PGVtPnZhcjwvZW0+PC9jb2RlPiwgPGNvZGU+PGVtPmxpbWl0PC9lbT48L2NvZGU+LCBhbmQgPGNvZGU+PGVtPnN0ZXA8L2VtPjwvY29kZT4gYXJlIGludmlzaWJsZSB2YXJpYWJsZXMuCitUaGUgbmFtZXMgc2hvd24gaGVyZSBhcmUgZm9yIGV4cGxhbmF0b3J5IHB1cnBvc2VzIG9ubHkuCis8L2xpPgorCis8bGk+CitJZiB0aGUgdGhpcmQgZXhwcmVzc2lvbiAodGhlIHN0ZXApIGlzIGFic2VudCwKK3RoZW4gYSBzdGVwIG9mJm5ic3A7MSBpcyB1c2VkLgorPC9saT4KKworPGxpPgorWW91IGNhbiB1c2UgPGI+YnJlYWs8L2I+IHRvIGV4aXQgYSA8Yj5mb3I8L2I+IGxvb3AuCis8L2xpPgorCis8bGk+CitUaGUgbG9vcCB2YXJpYWJsZSA8Y29kZT52PC9jb2RlPiBpcyBsb2NhbCB0byB0aGUgbG9vcDsKK3lvdSBjYW5ub3QgdXNlIGl0cyB2YWx1ZSBhZnRlciB0aGUgPGI+Zm9yPC9iPiBlbmRzIG9yIGlzIGJyb2tlbi4KK0lmIHlvdSBuZWVkIHRoaXMgdmFsdWUsCithc3NpZ24gaXQgdG8gYW5vdGhlciB2YXJpYWJsZSBiZWZvcmUgYnJlYWtpbmcgb3IgZXhpdGluZyB0aGUgbG9vcC4KKzwvbGk+CisKKzwvdWw+CisKKzxwPgorVGhlIGdlbmVyaWMgPGI+Zm9yPC9iPiBzdGF0ZW1lbnQgd29ya3Mgb3ZlciBmdW5jdGlvbnMsCitjYWxsZWQgPGVtPml0ZXJhdG9yczwvZW0+LgorT24gZWFjaCBpdGVyYXRpb24sIHRoZSBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvZHVjZSBhIG5ldyB2YWx1ZSwKK3N0b3BwaW5nIHdoZW4gdGhpcyBuZXcgdmFsdWUgaXMgPGI+bmlsPC9iPi4KK1RoZSBnZW5lcmljIDxiPmZvcjwvYj4gbG9vcCBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6CisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+Zm9yPC9iPiBuYW1lbGlzdCA8Yj5pbjwvYj4gZXhwbGlzdCA8Yj5kbzwvYj4gYmxvY2sgPGI+ZW5kPC9iPgorCW5hbWVsaXN0IDo6PSBOYW1lIHtgPGI+LDwvYj4mYWN1dGU7IE5hbWV9Cis8L3ByZT48cD4KK0EgPGI+Zm9yPC9iPiBzdGF0ZW1lbnQgbGlrZQorCis8cHJlPgorICAgICBmb3IgPGVtPnZhcl8xPC9lbT4sICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OywgPGVtPnZhcl9uPC9lbT4gaW4gPGVtPmV4cGxpc3Q8L2VtPiBkbyA8ZW0+YmxvY2s8L2VtPiBlbmQKKzwvcHJlPjxwPgoraXMgZXF1aXZhbGVudCB0byB0aGUgY29kZToKKworPHByZT4KKyAgICAgZG8KKyAgICAgICBsb2NhbCA8ZW0+ZjwvZW0+LCA8ZW0+czwvZW0+LCA8ZW0+dmFyPC9lbT4gPSA8ZW0+ZXhwbGlzdDwvZW0+CisgICAgICAgd2hpbGUgdHJ1ZSBkbworICAgICAgICAgbG9jYWwgPGVtPnZhcl8xPC9lbT4sICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OywgPGVtPnZhcl9uPC9lbT4gPSA8ZW0+ZjwvZW0+KDxlbT5zPC9lbT4sIDxlbT52YXI8L2VtPikKKyAgICAgICAgIDxlbT52YXI8L2VtPiA9IDxlbT52YXJfMTwvZW0+CisgICAgICAgICBpZiA8ZW0+dmFyPC9lbT4gPT0gbmlsIHRoZW4gYnJlYWsgZW5kCisgICAgICAgICA8ZW0+YmxvY2s8L2VtPgorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorTm90ZSB0aGUgZm9sbG93aW5nOgorCis8dWw+CisKKzxsaT4KKzxjb2RlPjxlbT5leHBsaXN0PC9lbT48L2NvZGU+IGlzIGV2YWx1YXRlZCBvbmx5IG9uY2UuCitJdHMgcmVzdWx0cyBhcmUgYW4gPGVtPml0ZXJhdG9yPC9lbT4gZnVuY3Rpb24sCithIDxlbT5zdGF0ZTwvZW0+LAorYW5kIGFuIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCA8ZW0+aXRlcmF0b3IgdmFyaWFibGU8L2VtPi4KKzwvbGk+CisKKzxsaT4KKzxjb2RlPjxlbT5mPC9lbT48L2NvZGU+LCA8Y29kZT48ZW0+czwvZW0+PC9jb2RlPiwgYW5kIDxjb2RlPjxlbT52YXI8L2VtPjwvY29kZT4gYXJlIGludmlzaWJsZSB2YXJpYWJsZXMuCitUaGUgbmFtZXMgYXJlIGhlcmUgZm9yIGV4cGxhbmF0b3J5IHB1cnBvc2VzIG9ubHkuCis8L2xpPgorCis8bGk+CitZb3UgY2FuIHVzZSA8Yj5icmVhazwvYj4gdG8gZXhpdCBhIDxiPmZvcjwvYj4gbG9vcC4KKzwvbGk+CisKKzxsaT4KK1RoZSBsb29wIHZhcmlhYmxlcyA8Y29kZT48ZW0+dmFyX2k8L2VtPjwvY29kZT4gYXJlIGxvY2FsIHRvIHRoZSBsb29wOworeW91IGNhbm5vdCB1c2UgdGhlaXIgdmFsdWVzIGFmdGVyIHRoZSA8Yj5mb3I8L2I+IGVuZHMuCitJZiB5b3UgbmVlZCB0aGVzZSB2YWx1ZXMsCit0aGVuIGFzc2lnbiB0aGVtIHRvIG90aGVyIHZhcmlhYmxlcyBiZWZvcmUgYnJlYWtpbmcgb3IgZXhpdGluZyB0aGUgbG9vcC4KKzwvbGk+CisKKzwvdWw+CisKKworCisKKzxoMz4yLjQuNiAtIDxhIG5hbWU9IjIuNC42Ij5GdW5jdGlvbiBDYWxscyBhcyBTdGF0ZW1lbnRzPC9hPjwvaDM+PHA+CitUbyBhbGxvdyBwb3NzaWJsZSBzaWRlLWVmZmVjdHMsCitmdW5jdGlvbiBjYWxscyBjYW4gYmUgZXhlY3V0ZWQgYXMgc3RhdGVtZW50czoKKworPHByZT4KKwlzdGF0IDo6PSBmdW5jdGlvbmNhbGwKKzwvcHJlPjxwPgorSW4gdGhpcyBjYXNlLCBhbGwgcmV0dXJuZWQgdmFsdWVzIGFyZSB0aHJvd24gYXdheS4KK0Z1bmN0aW9uIGNhbGxzIGFyZSBleHBsYWluZWQgaW4gPGEgaHJlZj0iIzIuNS44Ij4mc2VjdDsyLjUuODwvYT4uCisKKworCisKKworPGgzPjIuNC43IC0gPGEgbmFtZT0iMi40LjciPkxvY2FsIERlY2xhcmF0aW9uczwvYT48L2gzPjxwPgorTG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBhbnl3aGVyZSBpbnNpZGUgYSBibG9jay4KK1RoZSBkZWNsYXJhdGlvbiBjYW4gaW5jbHVkZSBhbiBpbml0aWFsIGFzc2lnbm1lbnQ6CisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+bG9jYWw8L2I+IG5hbWVsaXN0IFtgPGI+PTwvYj4mYWN1dGU7IGV4cGxpc3RdCis8L3ByZT48cD4KK0lmIHByZXNlbnQsIGFuIGluaXRpYWwgYXNzaWdubWVudCBoYXMgdGhlIHNhbWUgc2VtYW50aWNzCitvZiBhIG11bHRpcGxlIGFzc2lnbm1lbnQgKHNlZSA8YSBocmVmPSIjMi40LjMiPiZzZWN0OzIuNC4zPC9hPikuCitPdGhlcndpc2UsIGFsbCB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIHdpdGggPGI+bmlsPC9iPi4KKworCis8cD4KK0EgY2h1bmsgaXMgYWxzbyBhIGJsb2NrIChzZWUgPGEgaHJlZj0iIzIuNC4xIj4mc2VjdDsyLjQuMTwvYT4pLAorYW5kIHNvIGxvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZGVjbGFyZWQgaW4gYSBjaHVuayBvdXRzaWRlIGFueSBleHBsaWNpdCBibG9jay4KK1RoZSBzY29wZSBvZiBzdWNoIGxvY2FsIHZhcmlhYmxlcyBleHRlbmRzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNodW5rLgorCisKKzxwPgorVGhlIHZpc2liaWxpdHkgcnVsZXMgZm9yIGxvY2FsIHZhcmlhYmxlcyBhcmUgZXhwbGFpbmVkIGluIDxhIGhyZWY9IiMyLjYiPiZzZWN0OzIuNjwvYT4uCisKKworCisKKworCisKKzxoMj4yLjUgLSA8YSBuYW1lPSIyLjUiPkV4cHJlc3Npb25zPC9hPjwvaDI+CisKKzxwPgorVGhlIGJhc2ljIGV4cHJlc3Npb25zIGluIEx1YSBhcmUgdGhlIGZvbGxvd2luZzoKKworPHByZT4KKwlleHAgOjo9IHByZWZpeGV4cAorCWV4cCA6Oj0gPGI+bmlsPC9iPiB8IDxiPmZhbHNlPC9iPiB8IDxiPnRydWU8L2I+CisJZXhwIDo6PSBOdW1iZXIKKwlleHAgOjo9IFN0cmluZworCWV4cCA6Oj0gZnVuY3Rpb24KKwlleHAgOjo9IHRhYmxlY29uc3RydWN0b3IKKwlleHAgOjo9IGA8Yj4uLi48L2I+JmFjdXRlOworCWV4cCA6Oj0gZXhwIGJpbm9wIGV4cAorCWV4cCA6Oj0gdW5vcCBleHAKKwlwcmVmaXhleHAgOjo9IHZhciB8IGZ1bmN0aW9uY2FsbCB8IGA8Yj4oPC9iPiZhY3V0ZTsgZXhwIGA8Yj4pPC9iPiZhY3V0ZTsKKzwvcHJlPgorCis8cD4KK051bWJlcnMgYW5kIGxpdGVyYWwgc3RyaW5ncyBhcmUgZXhwbGFpbmVkIGluIDxhIGhyZWY9IiMyLjEiPiZzZWN0OzIuMTwvYT47Cit2YXJpYWJsZXMgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMi4zIj4mc2VjdDsyLjM8L2E+OworZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMi41LjkiPiZzZWN0OzIuNS45PC9hPjsKK2Z1bmN0aW9uIGNhbGxzIGFyZSBleHBsYWluZWQgaW4gPGEgaHJlZj0iIzIuNS44Ij4mc2VjdDsyLjUuODwvYT47Cit0YWJsZSBjb25zdHJ1Y3RvcnMgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMi41LjciPiZzZWN0OzIuNS43PC9hPi4KK1ZhcmFyZyBleHByZXNzaW9ucywKK2Rlbm90ZWQgYnkgdGhyZWUgZG90cyAoJzxjb2RlPi4uLjwvY29kZT4nKSwgY2FuIG9ubHkgYmUgdXNlZCB3aGVuCitkaXJlY3RseSBpbnNpZGUgYSB2YXJhcmcgZnVuY3Rpb247Cit0aGV5IGFyZSBleHBsYWluZWQgaW4gPGEgaHJlZj0iIzIuNS45Ij4mc2VjdDsyLjUuOTwvYT4uCisKKworPHA+CitCaW5hcnkgb3BlcmF0b3JzIGNvbXByaXNlIGFyaXRobWV0aWMgb3BlcmF0b3JzIChzZWUgPGEgaHJlZj0iIzIuNS4xIj4mc2VjdDsyLjUuMTwvYT4pLAorcmVsYXRpb25hbCBvcGVyYXRvcnMgKHNlZSA8YSBocmVmPSIjMi41LjIiPiZzZWN0OzIuNS4yPC9hPiksIGxvZ2ljYWwgb3BlcmF0b3JzIChzZWUgPGEgaHJlZj0iIzIuNS4zIj4mc2VjdDsyLjUuMzwvYT4pLAorYW5kIHRoZSBjb25jYXRlbmF0aW9uIG9wZXJhdG9yIChzZWUgPGEgaHJlZj0iIzIuNS40Ij4mc2VjdDsyLjUuNDwvYT4pLgorVW5hcnkgb3BlcmF0b3JzIGNvbXByaXNlIHRoZSB1bmFyeSBtaW51cyAoc2VlIDxhIGhyZWY9IiMyLjUuMSI+JnNlY3Q7Mi41LjE8L2E+KSwKK3RoZSB1bmFyeSA8Yj5ub3Q8L2I+IChzZWUgPGEgaHJlZj0iIzIuNS4zIj4mc2VjdDsyLjUuMzwvYT4pLAorYW5kIHRoZSB1bmFyeSA8ZW0+bGVuZ3RoIG9wZXJhdG9yPC9lbT4gKHNlZSA8YSBocmVmPSIjMi41LjUiPiZzZWN0OzIuNS41PC9hPikuCisKKworPHA+CitCb3RoIGZ1bmN0aW9uIGNhbGxzIGFuZCB2YXJhcmcgZXhwcmVzc2lvbnMgY2FuIHJlc3VsdCBpbiBtdWx0aXBsZSB2YWx1ZXMuCitJZiBhbiBleHByZXNzaW9uIGlzIHVzZWQgYXMgYSBzdGF0ZW1lbnQKKyhvbmx5IHBvc3NpYmxlIGZvciBmdW5jdGlvbiBjYWxscyAoc2VlIDxhIGhyZWY9IiMyLjQuNiI+JnNlY3Q7Mi40LjY8L2E+KSksCit0aGVuIGl0cyByZXR1cm4gbGlzdCBpcyBhZGp1c3RlZCB0byB6ZXJvIGVsZW1lbnRzLAordGh1cyBkaXNjYXJkaW5nIGFsbCByZXR1cm5lZCB2YWx1ZXMuCitJZiBhbiBleHByZXNzaW9uIGlzIHVzZWQgYXMgdGhlIGxhc3QgKG9yIHRoZSBvbmx5KSBlbGVtZW50CitvZiBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMsCit0aGVuIG5vIGFkanVzdG1lbnQgaXMgbWFkZQorKHVubGVzcyB0aGUgY2FsbCBpcyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcykuCitJbiBhbGwgb3RoZXIgY29udGV4dHMsCitMdWEgYWRqdXN0cyB0aGUgcmVzdWx0IGxpc3QgdG8gb25lIGVsZW1lbnQsCitkaXNjYXJkaW5nIGFsbCB2YWx1ZXMgZXhjZXB0IHRoZSBmaXJzdCBvbmUuCisKKworPHA+CitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorCis8cHJlPgorICAgICBmKCkgICAgICAgICAgICAgICAgLS0gYWRqdXN0ZWQgdG8gMCByZXN1bHRzCisgICAgIGcoZigpLCB4KSAgICAgICAgICAtLSBmKCkgaXMgYWRqdXN0ZWQgdG8gMSByZXN1bHQKKyAgICAgZyh4LCBmKCkpICAgICAgICAgIC0tIGcgZ2V0cyB4IHBsdXMgYWxsIHJlc3VsdHMgZnJvbSBmKCkKKyAgICAgYSxiLGMgPSBmKCksIHggICAgIC0tIGYoKSBpcyBhZGp1c3RlZCB0byAxIHJlc3VsdCAoYyBnZXRzIG5pbCkKKyAgICAgYSxiID0gLi4uICAgICAgICAgIC0tIGEgZ2V0cyB0aGUgZmlyc3QgdmFyYXJnIHBhcmFtZXRlciwgYiBnZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAtLSB0aGUgc2Vjb25kIChib3RoIGEgYW5kIGIgY2FuIGdldCBuaWwgaWYgdGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlzIG5vIGNvcnJlc3BvbmRpbmcgdmFyYXJnIHBhcmFtZXRlcikKKyAgICAgCisgICAgIGEsYixjID0geCwgZigpICAgICAtLSBmKCkgaXMgYWRqdXN0ZWQgdG8gMiByZXN1bHRzCisgICAgIGEsYixjID0gZigpICAgICAgICAtLSBmKCkgaXMgYWRqdXN0ZWQgdG8gMyByZXN1bHRzCisgICAgIHJldHVybiBmKCkgICAgICAgICAtLSByZXR1cm5zIGFsbCByZXN1bHRzIGZyb20gZigpCisgICAgIHJldHVybiAuLi4gICAgICAgICAtLSByZXR1cm5zIGFsbCByZWNlaXZlZCB2YXJhcmcgcGFyYW1ldGVycworICAgICByZXR1cm4geCx5LGYoKSAgICAgLS0gcmV0dXJucyB4LCB5LCBhbmQgYWxsIHJlc3VsdHMgZnJvbSBmKCkKKyAgICAge2YoKX0gICAgICAgICAgICAgIC0tIGNyZWF0ZXMgYSBsaXN0IHdpdGggYWxsIHJlc3VsdHMgZnJvbSBmKCkKKyAgICAgey4uLn0gICAgICAgICAgICAgIC0tIGNyZWF0ZXMgYSBsaXN0IHdpdGggYWxsIHZhcmFyZyBwYXJhbWV0ZXJzCisgICAgIHtmKCksIG5pbH0gICAgICAgICAtLSBmKCkgaXMgYWRqdXN0ZWQgdG8gMSByZXN1bHQKKzwvcHJlPgorCis8cD4KK0FueSBleHByZXNzaW9uIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzIGFsd2F5cyByZXN1bHRzIGluIG9ubHkgb25lIHZhbHVlLgorVGh1cywKKzxjb2RlPihmKHgseSx6KSk8L2NvZGU+IGlzIGFsd2F5cyBhIHNpbmdsZSB2YWx1ZSwKK2V2ZW4gaWYgPGNvZGU+ZjwvY29kZT4gcmV0dXJucyBzZXZlcmFsIHZhbHVlcy4KKyhUaGUgdmFsdWUgb2YgPGNvZGU+KGYoeCx5LHopKTwvY29kZT4gaXMgdGhlIGZpcnN0IHZhbHVlIHJldHVybmVkIGJ5IDxjb2RlPmY8L2NvZGU+CitvciA8Yj5uaWw8L2I+IGlmIDxjb2RlPmY8L2NvZGU+IGRvZXMgbm90IHJldHVybiBhbnkgdmFsdWVzLikKKworCisKKzxoMz4yLjUuMSAtIDxhIG5hbWU9IjIuNS4xIj5Bcml0aG1ldGljIE9wZXJhdG9yczwvYT48L2gzPjxwPgorTHVhIHN1cHBvcnRzIHRoZSB1c3VhbCBhcml0aG1ldGljIG9wZXJhdG9yczoKK3RoZSBiaW5hcnkgPGNvZGU+KzwvY29kZT4gKGFkZGl0aW9uKSwKKzxjb2RlPi08L2NvZGU+IChzdWJ0cmFjdGlvbiksIDxjb2RlPio8L2NvZGU+IChtdWx0aXBsaWNhdGlvbiksCis8Y29kZT4vPC9jb2RlPiAoZGl2aXNpb24pLCA8Y29kZT4lPC9jb2RlPiAobW9kdWxvKSwgYW5kIDxjb2RlPl48L2NvZGU+IChleHBvbmVudGlhdGlvbik7CithbmQgdW5hcnkgPGNvZGU+LTwvY29kZT4gKG5lZ2F0aW9uKS4KK0lmIHRoZSBvcGVyYW5kcyBhcmUgbnVtYmVycywgb3Igc3RyaW5ncyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8KK251bWJlcnMgKHNlZSA8YSBocmVmPSIjMi4yLjEiPiZzZWN0OzIuMi4xPC9hPiksCit0aGVuIGFsbCBvcGVyYXRpb25zIGhhdmUgdGhlIHVzdWFsIG1lYW5pbmcuCitFeHBvbmVudGlhdGlvbiB3b3JrcyBmb3IgYW55IGV4cG9uZW50LgorRm9yIGluc3RhbmNlLCA8Y29kZT54XigtMC41KTwvY29kZT4gY29tcHV0ZXMgdGhlIGludmVyc2Ugb2YgdGhlIHNxdWFyZSByb290IG9mIDxjb2RlPng8L2NvZGU+LgorTW9kdWxvIGlzIGRlZmluZWQgYXMKKworPHByZT4KKyAgICAgYSAlIGIgPT0gYSAtIG1hdGguZmxvb3IoYS9iKSpiCis8L3ByZT48cD4KK1RoYXQgaXMsIGl0IGlzIHRoZSByZW1haW5kZXIgb2YgYSBkaXZpc2lvbiB0aGF0IHJvdW5kcwordGhlIHF1b3RpZW50IHRvd2FyZHMgbWludXMgaW5maW5pdHkuCisKKworCisKKworPGgzPjIuNS4yIC0gPGEgbmFtZT0iMi41LjIiPlJlbGF0aW9uYWwgT3BlcmF0b3JzPC9hPjwvaDM+PHA+CitUaGUgcmVsYXRpb25hbCBvcGVyYXRvcnMgaW4gTHVhIGFyZQorCis8cHJlPgorICAgICA9PSAgICB+PSAgICAmbHQ7ICAgICAmZ3Q7ICAgICAmbHQ7PSAgICAmZ3Q7PQorPC9wcmU+PHA+CitUaGVzZSBvcGVyYXRvcnMgYWx3YXlzIHJlc3VsdCBpbiA8Yj5mYWxzZTwvYj4gb3IgPGI+dHJ1ZTwvYj4uCisKKworPHA+CitFcXVhbGl0eSAoPGNvZGU+PT08L2NvZGU+KSBmaXJzdCBjb21wYXJlcyB0aGUgdHlwZSBvZiBpdHMgb3BlcmFuZHMuCitJZiB0aGUgdHlwZXMgYXJlIGRpZmZlcmVudCwgdGhlbiB0aGUgcmVzdWx0IGlzIDxiPmZhbHNlPC9iPi4KK090aGVyd2lzZSwgdGhlIHZhbHVlcyBvZiB0aGUgb3BlcmFuZHMgYXJlIGNvbXBhcmVkLgorTnVtYmVycyBhbmQgc3RyaW5ncyBhcmUgY29tcGFyZWQgaW4gdGhlIHVzdWFsIHdheS4KK09iamVjdHMgKHRhYmxlcywgdXNlcmRhdGEsIHRocmVhZHMsIGFuZCBmdW5jdGlvbnMpCithcmUgY29tcGFyZWQgYnkgPGVtPnJlZmVyZW5jZTwvZW0+OgordHdvIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgb25seSBpZiB0aGV5IGFyZSB0aGUgPGVtPnNhbWU8L2VtPiBvYmplY3QuCitFdmVyeSB0aW1lIHlvdSBjcmVhdGUgYSBuZXcgb2JqZWN0CisoYSB0YWJsZSwgdXNlcmRhdGEsIHRocmVhZCwgb3IgZnVuY3Rpb24pLAordGhpcyBuZXcgb2JqZWN0IGlzIGRpZmZlcmVudCBmcm9tIGFueSBwcmV2aW91c2x5IGV4aXN0aW5nIG9iamVjdC4KKworCis8cD4KK1lvdSBjYW4gY2hhbmdlIHRoZSB3YXkgdGhhdCBMdWEgY29tcGFyZXMgdGFibGVzIGFuZCB1c2VyZGF0YSAKK2J5IHVzaW5nIHRoZSAiZXEiIG1ldGFtZXRob2QgKHNlZSA8YSBocmVmPSIjMi44Ij4mc2VjdDsyLjg8L2E+KS4KKworCis8cD4KK1RoZSBjb252ZXJzaW9uIHJ1bGVzIG9mIDxhIGhyZWY9IiMyLjIuMSI+JnNlY3Q7Mi4yLjE8L2E+Cis8ZW0+ZG8gbm90PC9lbT4gYXBwbHkgdG8gZXF1YWxpdHkgY29tcGFyaXNvbnMuCitUaHVzLCA8Y29kZT4iMCI9PTA8L2NvZGU+IGV2YWx1YXRlcyB0byA8Yj5mYWxzZTwvYj4sCithbmQgPGNvZGU+dFswXTwvY29kZT4gYW5kIDxjb2RlPnRbIjAiXTwvY29kZT4gZGVub3RlIGRpZmZlcmVudAorZW50cmllcyBpbiBhIHRhYmxlLgorCisKKzxwPgorVGhlIG9wZXJhdG9yIDxjb2RlPn49PC9jb2RlPiBpcyBleGFjdGx5IHRoZSBuZWdhdGlvbiBvZiBlcXVhbGl0eSAoPGNvZGU+PT08L2NvZGU+KS4KKworCis8cD4KK1RoZSBvcmRlciBvcGVyYXRvcnMgd29yayBhcyBmb2xsb3dzLgorSWYgYm90aCBhcmd1bWVudHMgYXJlIG51bWJlcnMsIHRoZW4gdGhleSBhcmUgY29tcGFyZWQgYXMgc3VjaC4KK090aGVyd2lzZSwgaWYgYm90aCBhcmd1bWVudHMgYXJlIHN0cmluZ3MsCit0aGVuIHRoZWlyIHZhbHVlcyBhcmUgY29tcGFyZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KK090aGVyd2lzZSwgTHVhIHRyaWVzIHRvIGNhbGwgdGhlICJsdCIgb3IgdGhlICJsZSIKK21ldGFtZXRob2QgKHNlZSA8YSBocmVmPSIjMi44Ij4mc2VjdDsyLjg8L2E+KS4KK0EgY29tcGFyaXNvbiA8Y29kZT5hICZndDsgYjwvY29kZT4gaXMgdHJhbnNsYXRlZCB0byA8Y29kZT5iICZsdDsgYTwvY29kZT4KK2FuZCA8Y29kZT5hICZndDs9IGI8L2NvZGU+IGlzIHRyYW5zbGF0ZWQgdG8gPGNvZGU+YiAmbHQ7PSBhPC9jb2RlPi4KKworCisKKworCis8aDM+Mi41LjMgLSA8YSBuYW1lPSIyLjUuMyI+TG9naWNhbCBPcGVyYXRvcnM8L2E+PC9oMz48cD4KK1RoZSBsb2dpY2FsIG9wZXJhdG9ycyBpbiBMdWEgYXJlCis8Yj5hbmQ8L2I+LCA8Yj5vcjwvYj4sIGFuZCA8Yj5ub3Q8L2I+LgorTGlrZSB0aGUgY29udHJvbCBzdHJ1Y3R1cmVzIChzZWUgPGEgaHJlZj0iIzIuNC40Ij4mc2VjdDsyLjQuNDwvYT4pLAorYWxsIGxvZ2ljYWwgb3BlcmF0b3JzIGNvbnNpZGVyIGJvdGggPGI+ZmFsc2U8L2I+IGFuZCA8Yj5uaWw8L2I+IGFzIGZhbHNlCithbmQgYW55dGhpbmcgZWxzZSBhcyB0cnVlLgorCisKKzxwPgorVGhlIG5lZ2F0aW9uIG9wZXJhdG9yIDxiPm5vdDwvYj4gYWx3YXlzIHJldHVybnMgPGI+ZmFsc2U8L2I+IG9yIDxiPnRydWU8L2I+LgorVGhlIGNvbmp1bmN0aW9uIG9wZXJhdG9yIDxiPmFuZDwvYj4gcmV0dXJucyBpdHMgZmlyc3QgYXJndW1lbnQKK2lmIHRoaXMgdmFsdWUgaXMgPGI+ZmFsc2U8L2I+IG9yIDxiPm5pbDwvYj47CitvdGhlcndpc2UsIDxiPmFuZDwvYj4gcmV0dXJucyBpdHMgc2Vjb25kIGFyZ3VtZW50LgorVGhlIGRpc2p1bmN0aW9uIG9wZXJhdG9yIDxiPm9yPC9iPiByZXR1cm5zIGl0cyBmaXJzdCBhcmd1bWVudAoraWYgdGhpcyB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSA8Yj5uaWw8L2I+IGFuZCA8Yj5mYWxzZTwvYj47CitvdGhlcndpc2UsIDxiPm9yPC9iPiByZXR1cm5zIGl0cyBzZWNvbmQgYXJndW1lbnQuCitCb3RoIDxiPmFuZDwvYj4gYW5kIDxiPm9yPC9iPiB1c2Ugc2hvcnQtY3V0IGV2YWx1YXRpb247Cit0aGF0IGlzLAordGhlIHNlY29uZCBvcGVyYW5kIGlzIGV2YWx1YXRlZCBvbmx5IGlmIG5lY2Vzc2FyeS4KK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKzxwcmU+CisgICAgIDEwIG9yIDIwICAgICAgICAgICAgLS0mZ3Q7IDEwCisgICAgIDEwIG9yIGVycm9yKCkgICAgICAgLS0mZ3Q7IDEwCisgICAgIG5pbCBvciAiYSIgICAgICAgICAgLS0mZ3Q7ICJhIgorICAgICBuaWwgYW5kIDEwICAgICAgICAgIC0tJmd0OyBuaWwKKyAgICAgZmFsc2UgYW5kIGVycm9yKCkgICAtLSZndDsgZmFsc2UKKyAgICAgZmFsc2UgYW5kIG5pbCAgICAgICAtLSZndDsgZmFsc2UKKyAgICAgZmFsc2Ugb3IgbmlsICAgICAgICAtLSZndDsgbmlsCisgICAgIDEwIGFuZCAyMCAgICAgICAgICAgLS0mZ3Q7IDIwCis8L3ByZT48cD4KKyhJbiB0aGlzIG1hbnVhbCwKKzxjb2RlPi0tJmd0OzwvY29kZT4gaW5kaWNhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWNlZGluZyBleHByZXNzaW9uLikKKworCisKKworCis8aDM+Mi41LjQgLSA8YSBuYW1lPSIyLjUuNCI+Q29uY2F0ZW5hdGlvbjwvYT48L2gzPjxwPgorVGhlIHN0cmluZyBjb25jYXRlbmF0aW9uIG9wZXJhdG9yIGluIEx1YSBpcworZGVub3RlZCBieSB0d28gZG90cyAoJzxjb2RlPi4uPC9jb2RlPicpLgorSWYgYm90aCBvcGVyYW5kcyBhcmUgc3RyaW5ncyBvciBudW1iZXJzLCB0aGVuIHRoZXkgYXJlIGNvbnZlcnRlZCB0bworc3RyaW5ncyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG1lbnRpb25lZCBpbiA8YSBocmVmPSIjMi4yLjEiPiZzZWN0OzIuMi4xPC9hPi4KK090aGVyd2lzZSwgdGhlICJjb25jYXQiIG1ldGFtZXRob2QgaXMgY2FsbGVkIChzZWUgPGEgaHJlZj0iIzIuOCI+JnNlY3Q7Mi44PC9hPikuCisKKworCisKKworPGgzPjIuNS41IC0gPGEgbmFtZT0iMi41LjUiPlRoZSBMZW5ndGggT3BlcmF0b3I8L2E+PC9oMz4KKworPHA+CitUaGUgbGVuZ3RoIG9wZXJhdG9yIGlzIGRlbm90ZWQgYnkgdGhlIHVuYXJ5IG9wZXJhdG9yIDxjb2RlPiM8L2NvZGU+LgorVGhlIGxlbmd0aCBvZiBhIHN0cmluZyBpcyBpdHMgbnVtYmVyIG9mIGJ5dGVzCisodGhhdCBpcywgdGhlIHVzdWFsIG1lYW5pbmcgb2Ygc3RyaW5nIGxlbmd0aCB3aGVuIGVhY2gKK2NoYXJhY3RlciBpcyBvbmUgYnl0ZSkuCisKKworPHA+CitUaGUgbGVuZ3RoIG9mIGEgdGFibGUgPGNvZGU+dDwvY29kZT4gaXMgZGVmaW5lZCB0byBiZSBhbnkKK2ludGVnZXIgaW5kZXggPGNvZGU+bjwvY29kZT4KK3N1Y2ggdGhhdCA8Y29kZT50W25dPC9jb2RlPiBpcyBub3QgPGI+bmlsPC9iPiBhbmQgPGNvZGU+dFtuKzFdPC9jb2RlPiBpcyA8Yj5uaWw8L2I+OworbW9yZW92ZXIsIGlmIDxjb2RlPnRbMV08L2NvZGU+IGlzIDxiPm5pbDwvYj4sIDxjb2RlPm48L2NvZGU+IGNhbiBiZSB6ZXJvLgorRm9yIGEgcmVndWxhciBhcnJheSwgd2l0aCBub24tbmlsIHZhbHVlcyBmcm9tIDEgdG8gYSBnaXZlbiA8Y29kZT5uPC9jb2RlPiwKK2l0cyBsZW5ndGggaXMgZXhhY3RseSB0aGF0IDxjb2RlPm48L2NvZGU+LAordGhlIGluZGV4IG9mIGl0cyBsYXN0IHZhbHVlLgorSWYgdGhlIGFycmF5IGhhcyAiaG9sZXMiCisodGhhdCBpcywgPGI+bmlsPC9iPiB2YWx1ZXMgYmV0d2VlbiBvdGhlciBub24tbmlsIHZhbHVlcyksCit0aGVuIDxjb2RlPiN0PC9jb2RlPiBjYW4gYmUgYW55IG9mIHRoZSBpbmRpY2VzIHRoYXQKK2RpcmVjdGx5IHByZWNlZGVzIGEgPGI+bmlsPC9iPiB2YWx1ZQorKHRoYXQgaXMsIGl0IG1heSBjb25zaWRlciBhbnkgc3VjaCA8Yj5uaWw8L2I+IHZhbHVlIGFzIHRoZSBlbmQgb2YKK3RoZSBhcnJheSkuIAorCisKKworCisKKzxoMz4yLjUuNiAtIDxhIG5hbWU9IjIuNS42Ij5QcmVjZWRlbmNlPC9hPjwvaDM+PHA+CitPcGVyYXRvciBwcmVjZWRlbmNlIGluIEx1YSBmb2xsb3dzIHRoZSB0YWJsZSBiZWxvdywKK2Zyb20gbG93ZXIgdG8gaGlnaGVyIHByaW9yaXR5OgorCis8cHJlPgorICAgICBvcgorICAgICBhbmQKKyAgICAgJmx0OyAgICAgJmd0OyAgICAgJmx0Oz0gICAgJmd0Oz0gICAgfj0gICAgPT0KKyAgICAgLi4KKyAgICAgKyAgICAgLQorICAgICAqICAgICAvICAgICAlCisgICAgIG5vdCAgICMgICAgIC0gKHVuYXJ5KQorICAgICBeCis8L3ByZT48cD4KK0FzIHVzdWFsLAoreW91IGNhbiB1c2UgcGFyZW50aGVzZXMgdG8gY2hhbmdlIHRoZSBwcmVjZWRlbmNlcyBvZiBhbiBleHByZXNzaW9uLgorVGhlIGNvbmNhdGVuYXRpb24gKCc8Y29kZT4uLjwvY29kZT4nKSBhbmQgZXhwb25lbnRpYXRpb24gKCc8Y29kZT5ePC9jb2RlPicpCitvcGVyYXRvcnMgYXJlIHJpZ2h0IGFzc29jaWF0aXZlLgorQWxsIG90aGVyIGJpbmFyeSBvcGVyYXRvcnMgYXJlIGxlZnQgYXNzb2NpYXRpdmUuCisKKworCisKKworPGgzPjIuNS43IC0gPGEgbmFtZT0iMi41LjciPlRhYmxlIENvbnN0cnVjdG9yczwvYT48L2gzPjxwPgorVGFibGUgY29uc3RydWN0b3JzIGFyZSBleHByZXNzaW9ucyB0aGF0IGNyZWF0ZSB0YWJsZXMuCitFdmVyeSB0aW1lIGEgY29uc3RydWN0b3IgaXMgZXZhbHVhdGVkLCBhIG5ldyB0YWJsZSBpcyBjcmVhdGVkLgorQSBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gZW1wdHkgdGFibGUKK29yIHRvIGNyZWF0ZSBhIHRhYmxlIGFuZCBpbml0aWFsaXplIHNvbWUgb2YgaXRzIGZpZWxkcy4KK1RoZSBnZW5lcmFsIHN5bnRheCBmb3IgY29uc3RydWN0b3JzIGlzCisKKzxwcmU+CisJdGFibGVjb25zdHJ1Y3RvciA6Oj0gYDxiPns8L2I+JmFjdXRlOyBbZmllbGRsaXN0XSBgPGI+fTwvYj4mYWN1dGU7CisJZmllbGRsaXN0IDo6PSBmaWVsZCB7ZmllbGRzZXAgZmllbGR9IFtmaWVsZHNlcF0KKwlmaWVsZCA6Oj0gYDxiPls8L2I+JmFjdXRlOyBleHAgYDxiPl08L2I+JmFjdXRlOyBgPGI+PTwvYj4mYWN1dGU7IGV4cCB8IE5hbWUgYDxiPj08L2I+JmFjdXRlOyBleHAgfCBleHAKKwlmaWVsZHNlcCA6Oj0gYDxiPiw8L2I+JmFjdXRlOyB8IGA8Yj47PC9iPiZhY3V0ZTsKKzwvcHJlPgorCis8cD4KK0VhY2ggZmllbGQgb2YgdGhlIGZvcm0gPGNvZGU+W2V4cDFdID0gZXhwMjwvY29kZT4gYWRkcyB0byB0aGUgbmV3IHRhYmxlIGFuIGVudHJ5Cit3aXRoIGtleSA8Y29kZT5leHAxPC9jb2RlPiBhbmQgdmFsdWUgPGNvZGU+ZXhwMjwvY29kZT4uCitBIGZpZWxkIG9mIHRoZSBmb3JtIDxjb2RlPm5hbWUgPSBleHA8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8KKzxjb2RlPlsibmFtZSJdID0gZXhwPC9jb2RlPi4KK0ZpbmFsbHksIGZpZWxkcyBvZiB0aGUgZm9ybSA8Y29kZT5leHA8L2NvZGU+IGFyZSBlcXVpdmFsZW50IHRvCis8Y29kZT5baV0gPSBleHA8L2NvZGU+LCB3aGVyZSA8Y29kZT5pPC9jb2RlPiBhcmUgY29uc2VjdXRpdmUgbnVtZXJpY2FsIGludGVnZXJzLAorc3RhcnRpbmcgd2l0aCAxLgorRmllbGRzIGluIHRoZSBvdGhlciBmb3JtYXRzIGRvIG5vdCBhZmZlY3QgdGhpcyBjb3VudGluZy4KK0ZvciBleGFtcGxlLAorCis8cHJlPgorICAgICBhID0geyBbZigxKV0gPSBnOyAieCIsICJ5IjsgeCA9IDEsIGYoeCksIFszMF0gPSAyMzsgNDUgfQorPC9wcmU+PHA+CitpcyBlcXVpdmFsZW50IHRvCisKKzxwcmU+CisgICAgIGRvCisgICAgICAgbG9jYWwgdCA9IHt9CisgICAgICAgdFtmKDEpXSA9IGcKKyAgICAgICB0WzFdID0gIngiICAgICAgICAgLS0gMXN0IGV4cAorICAgICAgIHRbMl0gPSAieSIgICAgICAgICAtLSAybmQgZXhwCisgICAgICAgdC54ID0gMSAgICAgICAgICAgIC0tIHRbIngiXSA9IDEKKyAgICAgICB0WzNdID0gZih4KSAgICAgICAgLS0gM3JkIGV4cAorICAgICAgIHRbMzBdID0gMjMKKyAgICAgICB0WzRdID0gNDUgICAgICAgICAgLS0gNHRoIGV4cAorICAgICAgIGEgPSB0CisgICAgIGVuZAorPC9wcmU+CisKKzxwPgorSWYgdGhlIGxhc3QgZmllbGQgaW4gdGhlIGxpc3QgaGFzIHRoZSBmb3JtIDxjb2RlPmV4cDwvY29kZT4KK2FuZCB0aGUgZXhwcmVzc2lvbiBpcyBhIGZ1bmN0aW9uIGNhbGwgb3IgYSB2YXJhcmcgZXhwcmVzc2lvbiwKK3RoZW4gYWxsIHZhbHVlcyByZXR1cm5lZCBieSB0aGlzIGV4cHJlc3Npb24gZW50ZXIgdGhlIGxpc3QgY29uc2VjdXRpdmVseQorKHNlZSA8YSBocmVmPSIjMi41LjgiPiZzZWN0OzIuNS44PC9hPikuCitUbyBhdm9pZCB0aGlzLAorZW5jbG9zZSB0aGUgZnVuY3Rpb24gY2FsbCBvciB0aGUgdmFyYXJnIGV4cHJlc3Npb24KK2luIHBhcmVudGhlc2VzIChzZWUgPGEgaHJlZj0iIzIuNSI+JnNlY3Q7Mi41PC9hPikuCisKKworPHA+CitUaGUgZmllbGQgbGlzdCBjYW4gaGF2ZSBhbiBvcHRpb25hbCB0cmFpbGluZyBzZXBhcmF0b3IsCithcyBhIGNvbnZlbmllbmNlIGZvciBtYWNoaW5lLWdlbmVyYXRlZCBjb2RlLgorCisKKworCisKKzxoMz4yLjUuOCAtIDxhIG5hbWU9IjIuNS44Ij5GdW5jdGlvbiBDYWxsczwvYT48L2gzPjxwPgorQSBmdW5jdGlvbiBjYWxsIGluIEx1YSBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6CisKKzxwcmU+CisJZnVuY3Rpb25jYWxsIDo6PSBwcmVmaXhleHAgYXJncworPC9wcmU+PHA+CitJbiBhIGZ1bmN0aW9uIGNhbGwsCitmaXJzdCBwcmVmaXhleHAgYW5kIGFyZ3MgYXJlIGV2YWx1YXRlZC4KK0lmIHRoZSB2YWx1ZSBvZiBwcmVmaXhleHAgaGFzIHR5cGUgPGVtPmZ1bmN0aW9uPC9lbT4sCit0aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCit3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCitPdGhlcndpc2UsIHRoZSBwcmVmaXhleHAgImNhbGwiIG1ldGFtZXRob2QgaXMgY2FsbGVkLAoraGF2aW5nIGFzIGZpcnN0IHBhcmFtZXRlciB0aGUgdmFsdWUgb2YgcHJlZml4ZXhwLAorZm9sbG93ZWQgYnkgdGhlIG9yaWdpbmFsIGNhbGwgYXJndW1lbnRzCisoc2VlIDxhIGhyZWY9IiMyLjgiPiZzZWN0OzIuODwvYT4pLgorCisKKzxwPgorVGhlIGZvcm0KKworPHByZT4KKwlmdW5jdGlvbmNhbGwgOjo9IHByZWZpeGV4cCBgPGI+OjwvYj4mYWN1dGU7IE5hbWUgYXJncworPC9wcmU+PHA+CitjYW4gYmUgdXNlZCB0byBjYWxsICJtZXRob2RzIi4KK0EgY2FsbCA8Y29kZT52Om5hbWUoPGVtPmFyZ3M8L2VtPik8L2NvZGU+CitpcyBzeW50YWN0aWMgc3VnYXIgZm9yIDxjb2RlPnYubmFtZSh2LDxlbT5hcmdzPC9lbT4pPC9jb2RlPiwKK2V4Y2VwdCB0aGF0IDxjb2RlPnY8L2NvZGU+IGlzIGV2YWx1YXRlZCBvbmx5IG9uY2UuCisKKworPHA+CitBcmd1bWVudHMgaGF2ZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKKworPHByZT4KKwlhcmdzIDo6PSBgPGI+KDwvYj4mYWN1dGU7IFtleHBsaXN0XSBgPGI+KTwvYj4mYWN1dGU7CisJYXJncyA6Oj0gdGFibGVjb25zdHJ1Y3RvcgorCWFyZ3MgOjo9IFN0cmluZworPC9wcmU+PHA+CitBbGwgYXJndW1lbnQgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBiZWZvcmUgdGhlIGNhbGwuCitBIGNhbGwgb2YgdGhlIGZvcm0gPGNvZGU+Zns8ZW0+ZmllbGRzPC9lbT59PC9jb2RlPiBpcworc3ludGFjdGljIHN1Z2FyIGZvciA8Y29kZT5mKHs8ZW0+ZmllbGRzPC9lbT59KTwvY29kZT47Cit0aGF0IGlzLCB0aGUgYXJndW1lbnQgbGlzdCBpcyBhIHNpbmdsZSBuZXcgdGFibGUuCitBIGNhbGwgb2YgdGhlIGZvcm0gPGNvZGU+Zic8ZW0+c3RyaW5nPC9lbT4nPC9jb2RlPgorKG9yIDxjb2RlPmYiPGVtPnN0cmluZzwvZW0+IjwvY29kZT4gb3IgPGNvZGU+ZltbPGVtPnN0cmluZzwvZW0+XV08L2NvZGU+KQoraXMgc3ludGFjdGljIHN1Z2FyIGZvciA8Y29kZT5mKCc8ZW0+c3RyaW5nPC9lbT4nKTwvY29kZT47Cit0aGF0IGlzLCB0aGUgYXJndW1lbnQgbGlzdCBpcyBhIHNpbmdsZSBsaXRlcmFsIHN0cmluZy4KKworCis8cD4KK0FzIGFuIGV4Y2VwdGlvbiB0byB0aGUgZnJlZS1mb3JtYXQgc3ludGF4IG9mIEx1YSwKK3lvdSBjYW5ub3QgcHV0IGEgbGluZSBicmVhayBiZWZvcmUgdGhlICc8Y29kZT4oPC9jb2RlPicgaW4gYSBmdW5jdGlvbiBjYWxsLgorVGhpcyByZXN0cmljdGlvbiBhdm9pZHMgc29tZSBhbWJpZ3VpdGllcyBpbiB0aGUgbGFuZ3VhZ2UuCitJZiB5b3Ugd3JpdGUKKworPHByZT4KKyAgICAgYSA9IGYKKyAgICAgKGcpLngoYSkKKzwvcHJlPjxwPgorTHVhIHdvdWxkIHNlZSB0aGF0IGFzIGEgc2luZ2xlIHN0YXRlbWVudCwgPGNvZGU+YSA9IGYoZykueChhKTwvY29kZT4uCitTbywgaWYgeW91IHdhbnQgdHdvIHN0YXRlbWVudHMsIHlvdSBtdXN0IGFkZCBhIHNlbWktY29sb24gYmV0d2VlbiB0aGVtLgorSWYgeW91IGFjdHVhbGx5IHdhbnQgdG8gY2FsbCA8Y29kZT5mPC9jb2RlPiwKK3lvdSBtdXN0IHJlbW92ZSB0aGUgbGluZSBicmVhayBiZWZvcmUgPGNvZGU+KGcpPC9jb2RlPi4KKworCis8cD4KK0EgY2FsbCBvZiB0aGUgZm9ybSA8Y29kZT5yZXR1cm48L2NvZGU+IDxlbT5mdW5jdGlvbmNhbGw8L2VtPiBpcyBjYWxsZWQKK2EgPGVtPnRhaWwgY2FsbDwvZW0+LgorTHVhIGltcGxlbWVudHMgPGVtPnByb3BlciB0YWlsIGNhbGxzPC9lbT4KKyhvciA8ZW0+cHJvcGVyIHRhaWwgcmVjdXJzaW9uPC9lbT4pOgoraW4gYSB0YWlsIGNhbGwsCit0aGUgY2FsbGVkIGZ1bmN0aW9uIHJldXNlcyB0aGUgc3RhY2sgZW50cnkgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24uCitUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgbmVzdGVkIHRhaWwgY2FsbHMgdGhhdAorYSBwcm9ncmFtIGNhbiBleGVjdXRlLgorSG93ZXZlciwgYSB0YWlsIGNhbGwgZXJhc2VzIGFueSBkZWJ1ZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK2NhbGxpbmcgZnVuY3Rpb24uCitOb3RlIHRoYXQgYSB0YWlsIGNhbGwgb25seSBoYXBwZW5zIHdpdGggYSBwYXJ0aWN1bGFyIHN5bnRheCwKK3doZXJlIHRoZSA8Yj5yZXR1cm48L2I+IGhhcyBvbmUgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgYXMgYXJndW1lbnQ7Cit0aGlzIHN5bnRheCBtYWtlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiByZXR1cm4gZXhhY3RseQordGhlIHJldHVybnMgb2YgdGhlIGNhbGxlZCBmdW5jdGlvbi4KK1NvLCBub25lIG9mIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIHRhaWwgY2FsbHM6CisKKzxwcmU+CisgICAgIHJldHVybiAoZih4KSkgICAgICAgIC0tIHJlc3VsdHMgYWRqdXN0ZWQgdG8gMQorICAgICByZXR1cm4gMiAqIGYoeCkKKyAgICAgcmV0dXJuIHgsIGYoeCkgICAgICAgLS0gYWRkaXRpb25hbCByZXN1bHRzCisgICAgIGYoeCk7IHJldHVybiAgICAgICAgIC0tIHJlc3VsdHMgZGlzY2FyZGVkCisgICAgIHJldHVybiB4IG9yIGYoeCkgICAgIC0tIHJlc3VsdHMgYWRqdXN0ZWQgdG8gMQorPC9wcmU+CisKKworCisKKzxoMz4yLjUuOSAtIDxhIG5hbWU9IjIuNS45Ij5GdW5jdGlvbiBEZWZpbml0aW9uczwvYT48L2gzPgorCis8cD4KK1RoZSBzeW50YXggZm9yIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMKKworPHByZT4KKwlmdW5jdGlvbiA6Oj0gPGI+ZnVuY3Rpb248L2I+IGZ1bmNib2R5CisJZnVuY2JvZHkgOjo9IGA8Yj4oPC9iPiZhY3V0ZTsgW3Bhcmxpc3RdIGA8Yj4pPC9iPiZhY3V0ZTsgYmxvY2sgPGI+ZW5kPC9iPgorPC9wcmU+CisKKzxwPgorVGhlIGZvbGxvd2luZyBzeW50YWN0aWMgc3VnYXIgc2ltcGxpZmllcyBmdW5jdGlvbiBkZWZpbml0aW9uczoKKworPHByZT4KKwlzdGF0IDo6PSA8Yj5mdW5jdGlvbjwvYj4gZnVuY25hbWUgZnVuY2JvZHkKKwlzdGF0IDo6PSA8Yj5sb2NhbDwvYj4gPGI+ZnVuY3Rpb248L2I+IE5hbWUgZnVuY2JvZHkKKwlmdW5jbmFtZSA6Oj0gTmFtZSB7YDxiPi48L2I+JmFjdXRlOyBOYW1lfSBbYDxiPjo8L2I+JmFjdXRlOyBOYW1lXQorPC9wcmU+PHA+CitUaGUgc3RhdGVtZW50CisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIGYgKCkgPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgordHJhbnNsYXRlcyB0bworCis8cHJlPgorICAgICBmID0gZnVuY3Rpb24gKCkgPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgorVGhlIHN0YXRlbWVudAorCis8cHJlPgorICAgICBmdW5jdGlvbiB0LmEuYi5jLmYgKCkgPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgordHJhbnNsYXRlcyB0bworCis8cHJlPgorICAgICB0LmEuYi5jLmYgPSBmdW5jdGlvbiAoKSA8ZW0+Ym9keTwvZW0+IGVuZAorPC9wcmU+PHA+CitUaGUgc3RhdGVtZW50CisKKzxwcmU+CisgICAgIGxvY2FsIGZ1bmN0aW9uIGYgKCkgPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgordHJhbnNsYXRlcyB0bworCis8cHJlPgorICAgICBsb2NhbCBmOyBmID0gZnVuY3Rpb24gKCkgPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgorPGVtPm5vdDwvZW0+IHRvCisKKzxwcmU+CisgICAgIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSA8ZW0+Ym9keTwvZW0+IGVuZAorPC9wcmU+PHA+CisoVGhpcyBvbmx5IG1ha2VzIGEgZGlmZmVyZW5jZSB3aGVuIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbgorY29udGFpbnMgcmVmZXJlbmNlcyB0byA8Y29kZT5mPC9jb2RlPi4pCisKKworPHA+CitBIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBleHByZXNzaW9uLAord2hvc2UgdmFsdWUgaGFzIHR5cGUgPGVtPmZ1bmN0aW9uPC9lbT4uCitXaGVuIEx1YSBwcmUtY29tcGlsZXMgYSBjaHVuaywKK2FsbCBpdHMgZnVuY3Rpb24gYm9kaWVzIGFyZSBwcmUtY29tcGlsZWQgdG9vLgorVGhlbiwgd2hlbmV2ZXIgTHVhIGV4ZWN1dGVzIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLAordGhlIGZ1bmN0aW9uIGlzIDxlbT5pbnN0YW50aWF0ZWQ8L2VtPiAob3IgPGVtPmNsb3NlZDwvZW0+KS4KK1RoaXMgZnVuY3Rpb24gaW5zdGFuY2UgKG9yIDxlbT5jbG9zdXJlPC9lbT4pCitpcyB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uCitEaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZ1bmN0aW9uCitjYW4gcmVmZXIgdG8gZGlmZmVyZW50ICBleHRlcm5hbCBsb2NhbCB2YXJpYWJsZXMKK2FuZCBjYW4gaGF2ZSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdGFibGVzLgorCisKKzxwPgorUGFyYW1ldGVycyBhY3QgYXMgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlCitpbml0aWFsaXplZCB3aXRoIHRoZSBhcmd1bWVudCB2YWx1ZXM6CisKKzxwcmU+CisJcGFybGlzdCA6Oj0gbmFtZWxpc3QgW2A8Yj4sPC9iPiZhY3V0ZTsgYDxiPi4uLjwvYj4mYWN1dGU7XSB8IGA8Yj4uLi48L2I+JmFjdXRlOworPC9wcmU+PHA+CitXaGVuIGEgZnVuY3Rpb24gaXMgY2FsbGVkLAordGhlIGxpc3Qgb2YgYXJndW1lbnRzIGlzIGFkanVzdGVkIHRvCit0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMsCit1bmxlc3MgdGhlIGZ1bmN0aW9uIGlzIGEgdmFyaWFkaWMgb3IgPGVtPnZhcmFyZyBmdW5jdGlvbjwvZW0+LAord2hpY2ggaXMKK2luZGljYXRlZCBieSB0aHJlZSBkb3RzICgnPGNvZGU+Li4uPC9jb2RlPicpIGF0IHRoZSBlbmQgb2YgaXRzIHBhcmFtZXRlciBsaXN0LgorQSB2YXJhcmcgZnVuY3Rpb24gZG9lcyBub3QgYWRqdXN0IGl0cyBhcmd1bWVudCBsaXN0OworaW5zdGVhZCwgaXQgY29sbGVjdHMgYWxsIGV4dHJhIGFyZ3VtZW50cyBhbmQgc3VwcGxpZXMgdGhlbQordG8gdGhlIGZ1bmN0aW9uIHRocm91Z2ggYSA8ZW0+dmFyYXJnIGV4cHJlc3Npb248L2VtPiwKK3doaWNoIGlzIGFsc28gd3JpdHRlbiBhcyB0aHJlZSBkb3RzLgorVGhlIHZhbHVlIG9mIHRoaXMgZXhwcmVzc2lvbiBpcyBhIGxpc3Qgb2YgYWxsIGFjdHVhbCBleHRyYSBhcmd1bWVudHMsCitzaW1pbGFyIHRvIGEgZnVuY3Rpb24gd2l0aCBtdWx0aXBsZSByZXN1bHRzLgorSWYgYSB2YXJhcmcgZXhwcmVzc2lvbiBpcyB1c2VkIGluc2lkZSBhbm90aGVyIGV4cHJlc3Npb24KK29yIGluIHRoZSBtaWRkbGUgb2YgYSBsaXN0IG9mIGV4cHJlc3Npb25zLAordGhlbiBpdHMgcmV0dXJuIGxpc3QgaXMgYWRqdXN0ZWQgdG8gb25lIGVsZW1lbnQuCitJZiB0aGUgZXhwcmVzc2lvbiBpcyB1c2VkIGFzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYSBsaXN0IG9mIGV4cHJlc3Npb25zLAordGhlbiBubyBhZGp1c3RtZW50IGlzIG1hZGUKKyh1bmxlc3MgdGhhdCBsYXN0IGV4cHJlc3Npb24gaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMpLgorCisKKzxwPgorQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKworPHByZT4KKyAgICAgZnVuY3Rpb24gZihhLCBiKSBlbmQKKyAgICAgZnVuY3Rpb24gZyhhLCBiLCAuLi4pIGVuZAorICAgICBmdW5jdGlvbiByKCkgcmV0dXJuIDEsMiwzIGVuZAorPC9wcmU+PHA+CitUaGVuLCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBmcm9tIGFyZ3VtZW50cyB0byBwYXJhbWV0ZXJzIGFuZAordG8gdGhlIHZhcmFyZyBleHByZXNzaW9uOgorCis8cHJlPgorICAgICBDQUxMICAgICAgICAgICAgUEFSQU1FVEVSUworICAgICAKKyAgICAgZigzKSAgICAgICAgICAgICBhPTMsIGI9bmlsCisgICAgIGYoMywgNCkgICAgICAgICAgYT0zLCBiPTQKKyAgICAgZigzLCA0LCA1KSAgICAgICBhPTMsIGI9NAorICAgICBmKHIoKSwgMTApICAgICAgIGE9MSwgYj0xMAorICAgICBmKHIoKSkgICAgICAgICAgIGE9MSwgYj0yCisgICAgIAorICAgICBnKDMpICAgICAgICAgICAgIGE9MywgYj1uaWwsIC4uLiAtLSZndDsgIChub3RoaW5nKQorICAgICBnKDMsIDQpICAgICAgICAgIGE9MywgYj00LCAgIC4uLiAtLSZndDsgIChub3RoaW5nKQorICAgICBnKDMsIDQsIDUsIDgpICAgIGE9MywgYj00LCAgIC4uLiAtLSZndDsgIDUgIDgKKyAgICAgZyg1LCByKCkpICAgICAgICBhPTUsIGI9MSwgICAuLi4gLS0mZ3Q7ICAyICAzCis8L3ByZT4KKworPHA+CitSZXN1bHRzIGFyZSByZXR1cm5lZCB1c2luZyB0aGUgPGI+cmV0dXJuPC9iPiBzdGF0ZW1lbnQgKHNlZSA8YSBocmVmPSIjMi40LjQiPiZzZWN0OzIuNC40PC9hPikuCitJZiBjb250cm9sIHJlYWNoZXMgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uCit3aXRob3V0IGVuY291bnRlcmluZyBhIDxiPnJldHVybjwvYj4gc3RhdGVtZW50LAordGhlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyB3aXRoIG5vIHJlc3VsdHMuCisKKworPHA+CitUaGUgPGVtPmNvbG9uPC9lbT4gc3ludGF4CitpcyB1c2VkIGZvciBkZWZpbmluZyA8ZW0+bWV0aG9kczwvZW0+LAordGhhdCBpcywgZnVuY3Rpb25zIHRoYXQgaGF2ZSBhbiBpbXBsaWNpdCBleHRyYSBwYXJhbWV0ZXIgPGNvZGU+c2VsZjwvY29kZT4uCitUaHVzLCB0aGUgc3RhdGVtZW50CisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIHQuYS5iLmM6ZiAoPGVtPnBhcmFtczwvZW0+KSA8ZW0+Ym9keTwvZW0+IGVuZAorPC9wcmU+PHA+CitpcyBzeW50YWN0aWMgc3VnYXIgZm9yCisKKzxwcmU+CisgICAgIHQuYS5iLmMuZiA9IGZ1bmN0aW9uIChzZWxmLCA8ZW0+cGFyYW1zPC9lbT4pIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT4KKworCisKKworCisKKzxoMj4yLjYgLSA8YSBuYW1lPSIyLjYiPlZpc2liaWxpdHkgUnVsZXM8L2E+PC9oMj4KKworPHA+CisKK0x1YSBpcyBhIGxleGljYWxseSBzY29wZWQgbGFuZ3VhZ2UuCitUaGUgc2NvcGUgb2YgdmFyaWFibGVzIGJlZ2lucyBhdCB0aGUgZmlyc3Qgc3RhdGVtZW50IDxlbT5hZnRlcjwvZW0+Cit0aGVpciBkZWNsYXJhdGlvbiBhbmQgbGFzdHMgdW50aWwgdGhlIGVuZCBvZiB0aGUgaW5uZXJtb3N0IGJsb2NrIHRoYXQKK2luY2x1ZGVzIHRoZSBkZWNsYXJhdGlvbi4KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworPHByZT4KKyAgICAgeCA9IDEwICAgICAgICAgICAgICAgIC0tIGdsb2JhbCB2YXJpYWJsZQorICAgICBkbyAgICAgICAgICAgICAgICAgICAgLS0gbmV3IGJsb2NrCisgICAgICAgbG9jYWwgeCA9IHggICAgICAgICAtLSBuZXcgJ3gnLCB3aXRoIHZhbHVlIDEwCisgICAgICAgcHJpbnQoeCkgICAgICAgICAgICAtLSZndDsgMTAKKyAgICAgICB4ID0geCsxCisgICAgICAgZG8gICAgICAgICAgICAgICAgICAtLSBhbm90aGVyIGJsb2NrCisgICAgICAgICBsb2NhbCB4ID0geCsxICAgICAtLSBhbm90aGVyICd4JworICAgICAgICAgcHJpbnQoeCkgICAgICAgICAgLS0mZ3Q7IDEyCisgICAgICAgZW5kCisgICAgICAgcHJpbnQoeCkgICAgICAgICAgICAtLSZndDsgMTEKKyAgICAgZW5kCisgICAgIHByaW50KHgpICAgICAgICAgICAgICAtLSZndDsgMTAgICh0aGUgZ2xvYmFsIG9uZSkKKzwvcHJlPgorCis8cD4KK05vdGljZSB0aGF0LCBpbiBhIGRlY2xhcmF0aW9uIGxpa2UgPGNvZGU+bG9jYWwgeCA9IHg8L2NvZGU+LAordGhlIG5ldyA8Y29kZT54PC9jb2RlPiBiZWluZyBkZWNsYXJlZCBpcyBub3QgaW4gc2NvcGUgeWV0LAorYW5kIHNvIHRoZSBzZWNvbmQgPGNvZGU+eDwvY29kZT4gcmVmZXJzIHRvIHRoZSBvdXRzaWRlIHZhcmlhYmxlLgorCisKKzxwPgorQmVjYXVzZSBvZiB0aGUgbGV4aWNhbCBzY29waW5nIHJ1bGVzLAorbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBmcmVlbHkgYWNjZXNzZWQgYnkgZnVuY3Rpb25zCitkZWZpbmVkIGluc2lkZSB0aGVpciBzY29wZS4KK0EgbG9jYWwgdmFyaWFibGUgdXNlZCBieSBhbiBpbm5lciBmdW5jdGlvbiBpcyBjYWxsZWQKK2FuIDxlbT51cHZhbHVlPC9lbT4sIG9yIDxlbT5leHRlcm5hbCBsb2NhbCB2YXJpYWJsZTwvZW0+LAoraW5zaWRlIHRoZSBpbm5lciBmdW5jdGlvbi4KKworCis8cD4KK05vdGljZSB0aGF0IGVhY2ggZXhlY3V0aW9uIG9mIGEgPGI+bG9jYWw8L2I+IHN0YXRlbWVudAorZGVmaW5lcyBuZXcgbG9jYWwgdmFyaWFibGVzLgorQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCis8cHJlPgorICAgICBhID0ge30KKyAgICAgbG9jYWwgeCA9IDIwCisgICAgIGZvciBpPTEsMTAgZG8KKyAgICAgICBsb2NhbCB5ID0gMAorICAgICAgIGFbaV0gPSBmdW5jdGlvbiAoKSB5PXkrMTsgcmV0dXJuIHgreSBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KK1RoZSBsb29wIGNyZWF0ZXMgdGVuIGNsb3N1cmVzCisodGhhdCBpcywgdGVuIGluc3RhbmNlcyBvZiB0aGUgYW5vbnltb3VzIGZ1bmN0aW9uKS4KK0VhY2ggb2YgdGhlc2UgY2xvc3VyZXMgdXNlcyBhIGRpZmZlcmVudCA8Y29kZT55PC9jb2RlPiB2YXJpYWJsZSwKK3doaWxlIGFsbCBvZiB0aGVtIHNoYXJlIHRoZSBzYW1lIDxjb2RlPng8L2NvZGU+LgorCisKKworCisKKzxoMj4yLjcgLSA8YSBuYW1lPSIyLjciPkVycm9yIEhhbmRsaW5nPC9hPjwvaDI+CisKKzxwPgorQmVjYXVzZSBMdWEgaXMgYW4gZW1iZWRkZWQgZXh0ZW5zaW9uIGxhbmd1YWdlLAorYWxsIEx1YSBhY3Rpb25zIHN0YXJ0IGZyb20gQyZuYnNwO2NvZGUgaW4gdGhlIGhvc3QgcHJvZ3JhbQorY2FsbGluZyBhIGZ1bmN0aW9uIGZyb20gdGhlIEx1YSBsaWJyYXJ5IChzZWUgPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4pLgorV2hlbmV2ZXIgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBMdWEgY29tcGlsYXRpb24gb3IgZXhlY3V0aW9uLAorY29udHJvbCByZXR1cm5zIHRvIEMsCit3aGljaCBjYW4gdGFrZSBhcHByb3ByaWF0ZSBtZWFzdXJlcworKHN1Y2ggYXMgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZSkuCisKKworPHA+CitMdWEgY29kZSBjYW4gZXhwbGljaXRseSBnZW5lcmF0ZSBhbiBlcnJvciBieSBjYWxsaW5nIHRoZQorPGEgaHJlZj0iI3BkZi1lcnJvciI+PGNvZGU+ZXJyb3I8L2NvZGU+PC9hPiBmdW5jdGlvbi4KK0lmIHlvdSBuZWVkIHRvIGNhdGNoIGVycm9ycyBpbiBMdWEsCit5b3UgY2FuIHVzZSB0aGUgPGEgaHJlZj0iI3BkZi1wY2FsbCI+PGNvZGU+cGNhbGw8L2NvZGU+PC9hPiBmdW5jdGlvbi4KKworCisKKworCis8aDI+Mi44IC0gPGEgbmFtZT0iMi44Ij5NZXRhdGFibGVzPC9hPjwvaDI+CisKKzxwPgorRXZlcnkgdmFsdWUgaW4gTHVhIGNhbiBoYXZlIGEgPGVtPm1ldGF0YWJsZTwvZW0+LgorVGhpcyA8ZW0+bWV0YXRhYmxlPC9lbT4gaXMgYW4gb3JkaW5hcnkgTHVhIHRhYmxlCit0aGF0IGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZQordW5kZXIgY2VydGFpbiBzcGVjaWFsIG9wZXJhdGlvbnMuCitZb3UgY2FuIGNoYW5nZSBzZXZlcmFsIGFzcGVjdHMgb2YgdGhlIGJlaGF2aW9yCitvZiBvcGVyYXRpb25zIG92ZXIgYSB2YWx1ZSBieSBzZXR0aW5nIHNwZWNpZmljIGZpZWxkcyBpbiBpdHMgbWV0YXRhYmxlLgorRm9yIGluc3RhbmNlLCB3aGVuIGEgbm9uLW51bWVyaWMgdmFsdWUgaXMgdGhlIG9wZXJhbmQgb2YgYW4gYWRkaXRpb24sCitMdWEgY2hlY2tzIGZvciBhIGZ1bmN0aW9uIGluIHRoZSBmaWVsZCA8Y29kZT4iX19hZGQiPC9jb2RlPiBpbiBpdHMgbWV0YXRhYmxlLgorSWYgaXQgZmluZHMgb25lLAorTHVhIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWRkaXRpb24uCisKKworPHA+CitXZSBjYWxsIHRoZSBrZXlzIGluIGEgbWV0YXRhYmxlIDxlbT5ldmVudHM8L2VtPgorYW5kIHRoZSB2YWx1ZXMgPGVtPm1ldGFtZXRob2RzPC9lbT4uCitJbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGhlIGV2ZW50IGlzIDxjb2RlPiJhZGQiPC9jb2RlPiAKK2FuZCB0aGUgbWV0YW1ldGhvZCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0aGUgYWRkaXRpb24uCisKKworPHA+CitZb3UgY2FuIHF1ZXJ5IHRoZSBtZXRhdGFibGUgb2YgYW55IHZhbHVlCit0aHJvdWdoIHRoZSA8YSBocmVmPSIjcGRmLWdldG1ldGF0YWJsZSI+PGNvZGU+Z2V0bWV0YXRhYmxlPC9jb2RlPjwvYT4gZnVuY3Rpb24uCisKKworPHA+CitZb3UgY2FuIHJlcGxhY2UgdGhlIG1ldGF0YWJsZSBvZiB0YWJsZXMKK3Rocm91Z2ggdGhlIDxhIGhyZWY9IiNwZGYtc2V0bWV0YXRhYmxlIj48Y29kZT5zZXRtZXRhdGFibGU8L2NvZGU+PC9hPgorZnVuY3Rpb24uCitZb3UgY2Fubm90IGNoYW5nZSB0aGUgbWV0YXRhYmxlIG9mIG90aGVyIHR5cGVzIGZyb20gTHVhCisoZXhjZXB0IGJ5IHVzaW5nIHRoZSBkZWJ1ZyBsaWJyYXJ5KTsKK3lvdSBtdXN0IHVzZSB0aGUgQyZuYnNwO0FQSSBmb3IgdGhhdC4KKworCis8cD4KK1RhYmxlcyBhbmQgZnVsbCB1c2VyZGF0YSBoYXZlIGluZGl2aWR1YWwgbWV0YXRhYmxlcworKGFsdGhvdWdoIG11bHRpcGxlIHRhYmxlcyBhbmQgdXNlcmRhdGEgY2FuIHNoYXJlIHRoZWlyIG1ldGF0YWJsZXMpLgorVmFsdWVzIG9mIGFsbCBvdGhlciB0eXBlcyBzaGFyZSBvbmUgc2luZ2xlIG1ldGF0YWJsZSBwZXIgdHlwZTsKK3RoYXQgaXMsIHRoZXJlIGlzIG9uZSBzaW5nbGUgbWV0YXRhYmxlIGZvciBhbGwgbnVtYmVycywKK29uZSBmb3IgYWxsIHN0cmluZ3MsIGV0Yy4KKworCis8cD4KK0EgbWV0YXRhYmxlIGNvbnRyb2xzIGhvdyBhbiBvYmplY3QgYmVoYXZlcyBpbiBhcml0aG1ldGljIG9wZXJhdGlvbnMsCitvcmRlciBjb21wYXJpc29ucywgY29uY2F0ZW5hdGlvbiwgbGVuZ3RoIG9wZXJhdGlvbiwgYW5kIGluZGV4aW5nLgorQSBtZXRhdGFibGUgYWxzbyBjYW4gZGVmaW5lIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSB1c2VyZGF0YQoraXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCitGb3IgZWFjaCBvZiB0aGVzZSBvcGVyYXRpb25zIEx1YSBhc3NvY2lhdGVzIGEgc3BlY2lmaWMga2V5CitjYWxsZWQgYW4gPGVtPmV2ZW50PC9lbT4uCitXaGVuIEx1YSBwZXJmb3JtcyBvbmUgb2YgdGhlc2Ugb3BlcmF0aW9ucyBvdmVyIGEgdmFsdWUsCitpdCBjaGVja3Mgd2hldGhlciB0aGlzIHZhbHVlIGhhcyBhIG1ldGF0YWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50LgorSWYgc28sIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkgKHRoZSBtZXRhbWV0aG9kKQorY29udHJvbHMgaG93IEx1YSB3aWxsIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4KKworCis8cD4KK01ldGF0YWJsZXMgY29udHJvbCB0aGUgb3BlcmF0aW9ucyBsaXN0ZWQgbmV4dC4KK0VhY2ggb3BlcmF0aW9uIGlzIGlkZW50aWZpZWQgYnkgaXRzIGNvcnJlc3BvbmRpbmcgbmFtZS4KK1RoZSBrZXkgZm9yIGVhY2ggb3BlcmF0aW9uIGlzIGEgc3RyaW5nIHdpdGggaXRzIG5hbWUgcHJlZml4ZWQgYnkKK3R3byB1bmRlcnNjb3JlcywgJzxjb2RlPl9fPC9jb2RlPic7Citmb3IgaW5zdGFuY2UsIHRoZSBrZXkgZm9yIG9wZXJhdGlvbiAiYWRkIiBpcyB0aGUKK3N0cmluZyA8Y29kZT4iX19hZGQiPC9jb2RlPi4KK1RoZSBzZW1hbnRpY3Mgb2YgdGhlc2Ugb3BlcmF0aW9ucyBpcyBiZXR0ZXIgZXhwbGFpbmVkIGJ5IGEgTHVhIGZ1bmN0aW9uCitkZXNjcmliaW5nIGhvdyB0aGUgaW50ZXJwcmV0ZXIgZXhlY3V0ZXMgdGhlIG9wZXJhdGlvbi4KKworCis8cD4KK1RoZSBjb2RlIHNob3duIGhlcmUgaW4gTHVhIGlzIG9ubHkgaWxsdXN0cmF0aXZlOwordGhlIHJlYWwgYmVoYXZpb3IgaXMgaGFyZCBjb2RlZCBpbiB0aGUgaW50ZXJwcmV0ZXIKK2FuZCBpdCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhpcyBzaW11bGF0aW9uLgorQWxsIGZ1bmN0aW9ucyB1c2VkIGluIHRoZXNlIGRlc2NyaXB0aW9ucworKDxhIGhyZWY9IiNwZGYtcmF3Z2V0Ij48Y29kZT5yYXdnZXQ8L2NvZGU+PC9hPiwgPGEgaHJlZj0iI3BkZi10b251bWJlciI+PGNvZGU+dG9udW1iZXI8L2NvZGU+PC9hPiwgZXRjLikKK2FyZSBkZXNjcmliZWQgaW4gPGEgaHJlZj0iIzUuMSI+JnNlY3Q7NS4xPC9hPi4KK0luIHBhcnRpY3VsYXIsIHRvIHJldHJpZXZlIHRoZSBtZXRhbWV0aG9kIG9mIGEgZ2l2ZW4gb2JqZWN0LAord2UgdXNlIHRoZSBleHByZXNzaW9uCisKKzxwcmU+CisgICAgIG1ldGF0YWJsZShvYmopW2V2ZW50XQorPC9wcmU+PHA+CitUaGlzIHNob3VsZCBiZSByZWFkIGFzCisKKzxwcmU+CisgICAgIHJhd2dldChnZXRtZXRhdGFibGUob2JqKSBvciB7fSwgZXZlbnQpCis8L3ByZT48cD4KKworVGhhdCBpcywgdGhlIGFjY2VzcyB0byBhIG1ldGFtZXRob2QgZG9lcyBub3QgaW52b2tlIG90aGVyIG1ldGFtZXRob2RzLAorYW5kIHRoZSBhY2Nlc3MgdG8gb2JqZWN0cyB3aXRoIG5vIG1ldGF0YWJsZXMgZG9lcyBub3QgZmFpbAorKGl0IHNpbXBseSByZXN1bHRzIGluIDxiPm5pbDwvYj4pLgorCisKKworPHVsPgorCis8bGk+PGI+ImFkZCI6PC9iPgordGhlIDxjb2RlPis8L2NvZGU+IG9wZXJhdGlvbi4KKworCisKKzxwPgorVGhlIGZ1bmN0aW9uIDxjb2RlPmdldGJpbmhhbmRsZXI8L2NvZGU+IGJlbG93IGRlZmluZXMgaG93IEx1YSBjaG9vc2VzIGEgaGFuZGxlcgorZm9yIGEgYmluYXJ5IG9wZXJhdGlvbi4KK0ZpcnN0LCBMdWEgdHJpZXMgdGhlIGZpcnN0IG9wZXJhbmQuCitJZiBpdHMgdHlwZSBkb2VzIG5vdCBkZWZpbmUgYSBoYW5kbGVyIGZvciB0aGUgb3BlcmF0aW9uLAordGhlbiBMdWEgdHJpZXMgdGhlIHNlY29uZCBvcGVyYW5kLgorCis8cHJlPgorICAgICBmdW5jdGlvbiBnZXRiaW5oYW5kbGVyIChvcDEsIG9wMiwgZXZlbnQpCisgICAgICAgcmV0dXJuIG1ldGF0YWJsZShvcDEpW2V2ZW50XSBvciBtZXRhdGFibGUob3AyKVtldmVudF0KKyAgICAgZW5kCis8L3ByZT48cD4KK0J5IHVzaW5nIHRoaXMgZnVuY3Rpb24sCit0aGUgYmVoYXZpb3Igb2YgdGhlIDxjb2RlPm9wMSArIG9wMjwvY29kZT4gaXMKKworPHByZT4KKyAgICAgZnVuY3Rpb24gYWRkX2V2ZW50IChvcDEsIG9wMikKKyAgICAgICBsb2NhbCBvMSwgbzIgPSB0b251bWJlcihvcDEpLCB0b251bWJlcihvcDIpCisgICAgICAgaWYgbzEgYW5kIG8yIHRoZW4gIC0tIGJvdGggb3BlcmFuZHMgYXJlIG51bWVyaWM/CisgICAgICAgICByZXR1cm4gbzEgKyBvMiAgIC0tICcrJyBoZXJlIGlzIHRoZSBwcmltaXRpdmUgJ2FkZCcKKyAgICAgICBlbHNlICAtLSBhdCBsZWFzdCBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIG5vdCBudW1lcmljCisgICAgICAgICBsb2NhbCBoID0gZ2V0YmluaGFuZGxlcihvcDEsIG9wMiwgIl9fYWRkIikKKyAgICAgICAgIGlmIGggdGhlbgorICAgICAgICAgICAtLSBjYWxsIHRoZSBoYW5kbGVyIHdpdGggYm90aCBvcGVyYW5kcworICAgICAgICAgICByZXR1cm4gKGgob3AxLCBvcDIpKQorICAgICAgICAgZWxzZSAgLS0gbm8gaGFuZGxlciBhdmFpbGFibGU6IGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgICAgICAgZXJyb3IoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KQorICAgICAgICAgZW5kCisgICAgICAgZW5kCisgICAgIGVuZAorPC9wcmU+PHA+Cis8L2xpPgorCis8bGk+PGI+InN1YiI6PC9iPgordGhlIDxjb2RlPi08L2NvZGU+IG9wZXJhdGlvbi4KKworQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgImFkZCIgb3BlcmF0aW9uLgorPC9saT4KKworPGxpPjxiPiJtdWwiOjwvYj4KK3RoZSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRpb24uCisKK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlICJhZGQiIG9wZXJhdGlvbi4KKzwvbGk+CisKKzxsaT48Yj4iZGl2Ijo8L2I+Cit0aGUgPGNvZGU+LzwvY29kZT4gb3BlcmF0aW9uLgorCitCZWhhdmlvciBzaW1pbGFyIHRvIHRoZSAiYWRkIiBvcGVyYXRpb24uCis8L2xpPgorCis8bGk+PGI+Im1vZCI6PC9iPgordGhlIDxjb2RlPiU8L2NvZGU+IG9wZXJhdGlvbi4KKworQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgImFkZCIgb3BlcmF0aW9uLAord2l0aCB0aGUgb3BlcmF0aW9uCis8Y29kZT5vMSAtIGZsb29yKG8xL28yKSpvMjwvY29kZT4gYXMgdGhlIHByaW1pdGl2ZSBvcGVyYXRpb24uCis8L2xpPgorCis8bGk+PGI+InBvdyI6PC9iPgordGhlIDxjb2RlPl48L2NvZGU+IChleHBvbmVudGlhdGlvbikgb3BlcmF0aW9uLgorCitCZWhhdmlvciBzaW1pbGFyIHRvIHRoZSAiYWRkIiBvcGVyYXRpb24sCit3aXRoIHRoZSBmdW5jdGlvbiA8Y29kZT5wb3c8L2NvZGU+IChmcm9tIHRoZSBDJm5ic3A7bWF0aCBsaWJyYXJ5KQorYXMgdGhlIHByaW1pdGl2ZSBvcGVyYXRpb24uCis8L2xpPgorCis8bGk+PGI+InVubSI6PC9iPgordGhlIHVuYXJ5IDxjb2RlPi08L2NvZGU+IG9wZXJhdGlvbi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiB1bm1fZXZlbnQgKG9wKQorICAgICAgIGxvY2FsIG8gPSB0b251bWJlcihvcCkKKyAgICAgICBpZiBvIHRoZW4gIC0tIG9wZXJhbmQgaXMgbnVtZXJpYz8KKyAgICAgICAgIHJldHVybiAtbyAgLS0gJy0nIGhlcmUgaXMgdGhlIHByaW1pdGl2ZSAndW5tJworICAgICAgIGVsc2UgIC0tIHRoZSBvcGVyYW5kIGlzIG5vdCBudW1lcmljLgorICAgICAgICAgLS0gVHJ5IHRvIGdldCBhIGhhbmRsZXIgZnJvbSB0aGUgb3BlcmFuZAorICAgICAgICAgbG9jYWwgaCA9IG1ldGF0YWJsZShvcCkuX191bm0KKyAgICAgICAgIGlmIGggdGhlbgorICAgICAgICAgICAtLSBjYWxsIHRoZSBoYW5kbGVyIHdpdGggdGhlIG9wZXJhbmQKKyAgICAgICAgICAgcmV0dXJuIChoKG9wKSkKKyAgICAgICAgIGVsc2UgIC0tIG5vIGhhbmRsZXIgYXZhaWxhYmxlOiBkZWZhdWx0IGJlaGF2aW9yCisgICAgICAgICAgIGVycm9yKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OykKKyAgICAgICAgIGVuZAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorPC9saT4KKworPGxpPjxiPiJjb25jYXQiOjwvYj4KK3RoZSA8Y29kZT4uLjwvY29kZT4gKGNvbmNhdGVuYXRpb24pIG9wZXJhdGlvbi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBjb25jYXRfZXZlbnQgKG9wMSwgb3AyKQorICAgICAgIGlmICh0eXBlKG9wMSkgPT0gInN0cmluZyIgb3IgdHlwZShvcDEpID09ICJudW1iZXIiKSBhbmQKKyAgICAgICAgICAodHlwZShvcDIpID09ICJzdHJpbmciIG9yIHR5cGUob3AyKSA9PSAibnVtYmVyIikgdGhlbgorICAgICAgICAgcmV0dXJuIG9wMSAuLiBvcDIgIC0tIHByaW1pdGl2ZSBzdHJpbmcgY29uY2F0ZW5hdGlvbgorICAgICAgIGVsc2UKKyAgICAgICAgIGxvY2FsIGggPSBnZXRiaW5oYW5kbGVyKG9wMSwgb3AyLCAiX19jb25jYXQiKQorICAgICAgICAgaWYgaCB0aGVuCisgICAgICAgICAgIHJldHVybiAoaChvcDEsIG9wMikpCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGVycm9yKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OykKKyAgICAgICAgIGVuZAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorPC9saT4KKworPGxpPjxiPiJsZW4iOjwvYj4KK3RoZSA8Y29kZT4jPC9jb2RlPiBvcGVyYXRpb24uCisKKworPHByZT4KKyAgICAgZnVuY3Rpb24gbGVuX2V2ZW50IChvcCkKKyAgICAgICBpZiB0eXBlKG9wKSA9PSAic3RyaW5nIiB0aGVuCisgICAgICAgICByZXR1cm4gc3RybGVuKG9wKSAgICAgICAgIC0tIHByaW1pdGl2ZSBzdHJpbmcgbGVuZ3RoCisgICAgICAgZWxzZWlmIHR5cGUob3ApID09ICJ0YWJsZSIgdGhlbgorICAgICAgICAgcmV0dXJuICNvcCAgICAgICAgICAgICAgICAtLSBwcmltaXRpdmUgdGFibGUgbGVuZ3RoCisgICAgICAgZWxzZQorICAgICAgICAgbG9jYWwgaCA9IG1ldGF0YWJsZShvcCkuX19sZW4KKyAgICAgICAgIGlmIGggdGhlbgorICAgICAgICAgICAtLSBjYWxsIHRoZSBoYW5kbGVyIHdpdGggdGhlIG9wZXJhbmQKKyAgICAgICAgICAgcmV0dXJuIChoKG9wKSkKKyAgICAgICAgIGVsc2UgIC0tIG5vIGhhbmRsZXIgYXZhaWxhYmxlOiBkZWZhdWx0IGJlaGF2aW9yCisgICAgICAgICAgIGVycm9yKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OykKKyAgICAgICAgIGVuZAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorU2VlIDxhIGhyZWY9IiMyLjUuNSI+JnNlY3Q7Mi41LjU8L2E+IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsZW5ndGggb2YgYSB0YWJsZS4KKzwvbGk+CisKKzxsaT48Yj4iZXEiOjwvYj4KK3RoZSA8Y29kZT49PTwvY29kZT4gb3BlcmF0aW9uLgorCitUaGUgZnVuY3Rpb24gPGNvZGU+Z2V0Y29tcGhhbmRsZXI8L2NvZGU+IGRlZmluZXMgaG93IEx1YSBjaG9vc2VzIGEgbWV0YW1ldGhvZAorZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzLgorQSBtZXRhbWV0aG9kIG9ubHkgaXMgc2VsZWN0ZWQgd2hlbiBib3RoIG9iamVjdHMKK2JlaW5nIGNvbXBhcmVkIGhhdmUgdGhlIHNhbWUgdHlwZQorYW5kIHRoZSBzYW1lIG1ldGFtZXRob2QgZm9yIHRoZSBzZWxlY3RlZCBvcGVyYXRpb24uCisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIGdldGNvbXBoYW5kbGVyIChvcDEsIG9wMiwgZXZlbnQpCisgICAgICAgaWYgdHlwZShvcDEpIH49IHR5cGUob3AyKSB0aGVuIHJldHVybiBuaWwgZW5kCisgICAgICAgbG9jYWwgbW0xID0gbWV0YXRhYmxlKG9wMSlbZXZlbnRdCisgICAgICAgbG9jYWwgbW0yID0gbWV0YXRhYmxlKG9wMilbZXZlbnRdCisgICAgICAgaWYgbW0xID09IG1tMiB0aGVuIHJldHVybiBtbTEgZWxzZSByZXR1cm4gbmlsIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorVGhlICJlcSIgZXZlbnQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCis8cHJlPgorICAgICBmdW5jdGlvbiBlcV9ldmVudCAob3AxLCBvcDIpCisgICAgICAgaWYgdHlwZShvcDEpIH49IHR5cGUob3AyKSB0aGVuICAtLSBkaWZmZXJlbnQgdHlwZXM/CisgICAgICAgICByZXR1cm4gZmFsc2UgICAtLSBkaWZmZXJlbnQgb2JqZWN0cworICAgICAgIGVuZAorICAgICAgIGlmIG9wMSA9PSBvcDIgdGhlbiAgIC0tIHByaW1pdGl2ZSBlcXVhbD8KKyAgICAgICAgIHJldHVybiB0cnVlICAgLS0gb2JqZWN0cyBhcmUgZXF1YWwKKyAgICAgICBlbmQKKyAgICAgICAtLSB0cnkgbWV0YW1ldGhvZAorICAgICAgIGxvY2FsIGggPSBnZXRjb21waGFuZGxlcihvcDEsIG9wMiwgIl9fZXEiKQorICAgICAgIGlmIGggdGhlbgorICAgICAgICAgcmV0dXJuIChoKG9wMSwgb3AyKSkKKyAgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KKzxjb2RlPmEgfj0gYjwvY29kZT4gaXMgZXF1aXZhbGVudCB0byA8Y29kZT5ub3QgKGEgPT0gYik8L2NvZGU+LgorPC9saT4KKworPGxpPjxiPiJsdCI6PC9iPgordGhlIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdGlvbi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBsdF9ldmVudCAob3AxLCBvcDIpCisgICAgICAgaWYgdHlwZShvcDEpID09ICJudW1iZXIiIGFuZCB0eXBlKG9wMikgPT0gIm51bWJlciIgdGhlbgorICAgICAgICAgcmV0dXJuIG9wMSAmbHQ7IG9wMiAgIC0tIG51bWVyaWMgY29tcGFyaXNvbgorICAgICAgIGVsc2VpZiB0eXBlKG9wMSkgPT0gInN0cmluZyIgYW5kIHR5cGUob3AyKSA9PSAic3RyaW5nIiB0aGVuCisgICAgICAgICByZXR1cm4gb3AxICZsdDsgb3AyICAgLS0gbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uCisgICAgICAgZWxzZQorICAgICAgICAgbG9jYWwgaCA9IGdldGNvbXBoYW5kbGVyKG9wMSwgb3AyLCAiX19sdCIpCisgICAgICAgICBpZiBoIHRoZW4KKyAgICAgICAgICAgcmV0dXJuIChoKG9wMSwgb3AyKSkKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgZXJyb3IoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KQorICAgICAgICAgZW5kCisgICAgICAgZW5kCisgICAgIGVuZAorPC9wcmU+PHA+Cis8Y29kZT5hICZndDsgYjwvY29kZT4gaXMgZXF1aXZhbGVudCB0byA8Y29kZT5iICZsdDsgYTwvY29kZT4uCis8L2xpPgorCis8bGk+PGI+ImxlIjo8L2I+Cit0aGUgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdGlvbi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBsZV9ldmVudCAob3AxLCBvcDIpCisgICAgICAgaWYgdHlwZShvcDEpID09ICJudW1iZXIiIGFuZCB0eXBlKG9wMikgPT0gIm51bWJlciIgdGhlbgorICAgICAgICAgcmV0dXJuIG9wMSAmbHQ7PSBvcDIgICAtLSBudW1lcmljIGNvbXBhcmlzb24KKyAgICAgICBlbHNlaWYgdHlwZShvcDEpID09ICJzdHJpbmciIGFuZCB0eXBlKG9wMikgPT0gInN0cmluZyIgdGhlbgorICAgICAgICAgcmV0dXJuIG9wMSAmbHQ7PSBvcDIgICAtLSBsZXhpY29ncmFwaGljIGNvbXBhcmlzb24KKyAgICAgICBlbHNlCisgICAgICAgICBsb2NhbCBoID0gZ2V0Y29tcGhhbmRsZXIob3AxLCBvcDIsICJfX2xlIikKKyAgICAgICAgIGlmIGggdGhlbgorICAgICAgICAgICByZXR1cm4gKGgob3AxLCBvcDIpKQorICAgICAgICAgZWxzZQorICAgICAgICAgICBoID0gZ2V0Y29tcGhhbmRsZXIob3AxLCBvcDIsICJfX2x0IikKKyAgICAgICAgICAgaWYgaCB0aGVuCisgICAgICAgICAgICAgcmV0dXJuIG5vdCBoKG9wMiwgb3AxKQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgZXJyb3IoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KQorICAgICAgICAgICBlbmQKKyAgICAgICAgIGVuZAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorPGNvZGU+YSAmZ3Q7PSBiPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPmIgJmx0Oz0gYTwvY29kZT4uCitOb3RlIHRoYXQsIGluIHRoZSBhYnNlbmNlIG9mIGEgImxlIiBtZXRhbWV0aG9kLAorTHVhIHRyaWVzIHRoZSAibHQiLCBhc3N1bWluZyB0aGF0IDxjb2RlPmEgJmx0Oz0gYjwvY29kZT4gaXMKK2VxdWl2YWxlbnQgdG8gPGNvZGU+bm90IChiICZsdDsgYSk8L2NvZGU+LgorPC9saT4KKworPGxpPjxiPiJpbmRleCI6PC9iPgorVGhlIGluZGV4aW5nIGFjY2VzcyA8Y29kZT50YWJsZVtrZXldPC9jb2RlPi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBnZXR0YWJsZV9ldmVudCAodGFibGUsIGtleSkKKyAgICAgICBsb2NhbCBoCisgICAgICAgaWYgdHlwZSh0YWJsZSkgPT0gInRhYmxlIiB0aGVuCisgICAgICAgICBsb2NhbCB2ID0gcmF3Z2V0KHRhYmxlLCBrZXkpCisgICAgICAgICBpZiB2IH49IG5pbCB0aGVuIHJldHVybiB2IGVuZAorICAgICAgICAgaCA9IG1ldGF0YWJsZSh0YWJsZSkuX19pbmRleAorICAgICAgICAgaWYgaCA9PSBuaWwgdGhlbiByZXR1cm4gbmlsIGVuZAorICAgICAgIGVsc2UKKyAgICAgICAgIGggPSBtZXRhdGFibGUodGFibGUpLl9faW5kZXgKKyAgICAgICAgIGlmIGggPT0gbmlsIHRoZW4KKyAgICAgICAgICAgZXJyb3IoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KQorICAgICAgICAgZW5kCisgICAgICAgZW5kCisgICAgICAgaWYgdHlwZShoKSA9PSAiZnVuY3Rpb24iIHRoZW4KKyAgICAgICAgIHJldHVybiAoaCh0YWJsZSwga2V5KSkgICAgIC0tIGNhbGwgdGhlIGhhbmRsZXIKKyAgICAgICBlbHNlIHJldHVybiBoW2tleV0gICAgICAgICAgIC0tIG9yIHJlcGVhdCBvcGVyYXRpb24gb24gaXQKKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KKzwvbGk+CisKKzxsaT48Yj4ibmV3aW5kZXgiOjwvYj4KK1RoZSBpbmRleGluZyBhc3NpZ25tZW50IDxjb2RlPnRhYmxlW2tleV0gPSB2YWx1ZTwvY29kZT4uCisKKworPHByZT4KKyAgICAgZnVuY3Rpb24gc2V0dGFibGVfZXZlbnQgKHRhYmxlLCBrZXksIHZhbHVlKQorICAgICAgIGxvY2FsIGgKKyAgICAgICBpZiB0eXBlKHRhYmxlKSA9PSAidGFibGUiIHRoZW4KKyAgICAgICAgIGxvY2FsIHYgPSByYXdnZXQodGFibGUsIGtleSkKKyAgICAgICAgIGlmIHYgfj0gbmlsIHRoZW4gcmF3c2V0KHRhYmxlLCBrZXksIHZhbHVlKTsgcmV0dXJuIGVuZAorICAgICAgICAgaCA9IG1ldGF0YWJsZSh0YWJsZSkuX19uZXdpbmRleAorICAgICAgICAgaWYgaCA9PSBuaWwgdGhlbiByYXdzZXQodGFibGUsIGtleSwgdmFsdWUpOyByZXR1cm4gZW5kCisgICAgICAgZWxzZQorICAgICAgICAgaCA9IG1ldGF0YWJsZSh0YWJsZSkuX19uZXdpbmRleAorICAgICAgICAgaWYgaCA9PSBuaWwgdGhlbgorICAgICAgICAgICBlcnJvcigmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspCisgICAgICAgICBlbmQKKyAgICAgICBlbmQKKyAgICAgICBpZiB0eXBlKGgpID09ICJmdW5jdGlvbiIgdGhlbgorICAgICAgICAgaCh0YWJsZSwga2V5LHZhbHVlKSAgICAgICAgICAgLS0gY2FsbCB0aGUgaGFuZGxlcgorICAgICAgIGVsc2UgaFtrZXldID0gdmFsdWUgICAgICAgICAgICAgLS0gb3IgcmVwZWF0IG9wZXJhdGlvbiBvbiBpdAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorPC9saT4KKworPGxpPjxiPiJjYWxsIjo8L2I+CitjYWxsZWQgd2hlbiBMdWEgY2FsbHMgYSB2YWx1ZS4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBmdW5jdGlvbl9ldmVudCAoZnVuYywgLi4uKQorICAgICAgIGlmIHR5cGUoZnVuYykgPT0gImZ1bmN0aW9uIiB0aGVuCisgICAgICAgICByZXR1cm4gZnVuYyguLi4pICAgLS0gcHJpbWl0aXZlIGNhbGwKKyAgICAgICBlbHNlCisgICAgICAgICBsb2NhbCBoID0gbWV0YXRhYmxlKGZ1bmMpLl9fY2FsbAorICAgICAgICAgaWYgaCB0aGVuCisgICAgICAgICAgIHJldHVybiBoKGZ1bmMsIC4uLikKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgZXJyb3IoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KQorICAgICAgICAgZW5kCisgICAgICAgZW5kCisgICAgIGVuZAorPC9wcmU+PHA+Cis8L2xpPgorCis8L3VsPgorCisKKworCis8aDI+Mi45IC0gPGEgbmFtZT0iMi45Ij5FbnZpcm9ubWVudHM8L2E+PC9oMj4KKworPHA+CitCZXNpZGVzIG1ldGF0YWJsZXMsCitvYmplY3RzIG9mIHR5cGVzIHRocmVhZCwgZnVuY3Rpb24sIGFuZCB1c2VyZGF0YQoraGF2ZSBhbm90aGVyIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLAorY2FsbGVkIHRoZWlyIDxlbT5lbnZpcm9ubWVudDwvZW0+LgorTGlrZSBtZXRhdGFibGVzLCBlbnZpcm9ubWVudHMgYXJlIHJlZ3VsYXIgdGFibGVzIGFuZAorbXVsdGlwbGUgb2JqZWN0cyBjYW4gc2hhcmUgdGhlIHNhbWUgZW52aXJvbm1lbnQuCisKKworPHA+CitUaHJlYWRzIGFyZSBjcmVhdGVkIHNoYXJpbmcgdGhlIGVudmlyb25tZW50IG9mIHRoZSBjcmVhdGluZyB0aHJlYWQuCitVc2VyZGF0YSBhbmQgQyZuYnNwO2Z1bmN0aW9ucyBhcmUgY3JlYXRlZCBzaGFyaW5nIHRoZSBlbnZpcm9ubWVudAorb2YgdGhlIGNyZWF0aW5nIEMmbmJzcDtmdW5jdGlvbi4KK05vbi1uZXN0ZWQgTHVhIGZ1bmN0aW9ucworKGNyZWF0ZWQgYnkgPGEgaHJlZj0iI3BkZi1sb2FkZmlsZSI+PGNvZGU+bG9hZGZpbGU8L2NvZGU+PC9hPiwgPGEgaHJlZj0iI3BkZi1sb2Fkc3RyaW5nIj48Y29kZT5sb2Fkc3RyaW5nPC9jb2RlPjwvYT4gb3IgPGEgaHJlZj0iI3BkZi1sb2FkIj48Y29kZT5sb2FkPC9jb2RlPjwvYT4pCithcmUgY3JlYXRlZCBzaGFyaW5nIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgY3JlYXRpbmcgdGhyZWFkLgorTmVzdGVkIEx1YSBmdW5jdGlvbnMgYXJlIGNyZWF0ZWQgc2hhcmluZyB0aGUgZW52aXJvbm1lbnQgb2YKK3RoZSBjcmVhdGluZyBMdWEgZnVuY3Rpb24uCisKKworPHA+CitFbnZpcm9ubWVudHMgYXNzb2NpYXRlZCB3aXRoIHVzZXJkYXRhIGhhdmUgbm8gbWVhbmluZyBmb3IgTHVhLgorSXQgaXMgb25seSBhIGNvbnZlbmllbmNlIGZlYXR1cmUgZm9yIHByb2dyYW1tZXJzIHRvIGFzc29jaWF0ZSBhIHRhYmxlIHRvCithIHVzZXJkYXRhLgorCisKKzxwPgorRW52aXJvbm1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aHJlYWRzIGFyZSBjYWxsZWQKKzxlbT5nbG9iYWwgZW52aXJvbm1lbnRzPC9lbT4uCitUaGV5IGFyZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aHJlYWRzIGFuZAorbm9uLW5lc3RlZCBMdWEgZnVuY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIHRocmVhZAorYW5kIGNhbiBiZSBkaXJlY3RseSBhY2Nlc3NlZCBieSBDJm5ic3A7Y29kZSAoc2VlIDxhIGhyZWY9IiMzLjMiPiZzZWN0OzMuMzwvYT4pLgorCisKKzxwPgorVGhlIGVudmlyb25tZW50IGFzc29jaWF0ZWQgd2l0aCBhIEMmbmJzcDtmdW5jdGlvbiBjYW4gYmUgZGlyZWN0bHkKK2FjY2Vzc2VkIGJ5IEMmbmJzcDtjb2RlIChzZWUgPGEgaHJlZj0iIzMuMyI+JnNlY3Q7My4zPC9hPikuCitJdCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciBvdGhlciBDJm5ic3A7ZnVuY3Rpb25zCithbmQgdXNlcmRhdGEgY3JlYXRlZCBieSB0aGUgZnVuY3Rpb24uCisKKworPHA+CitFbnZpcm9ubWVudHMgYXNzb2NpYXRlZCB3aXRoIEx1YSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gcmVzb2x2ZQorYWxsIGFjY2Vzc2VzIHRvIGdsb2JhbCB2YXJpYWJsZXMgd2l0aGluIHRoZSBmdW5jdGlvbiAoc2VlIDxhIGhyZWY9IiMyLjMiPiZzZWN0OzIuMzwvYT4pLgorVGhleSBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBmb3IgbmVzdGVkIEx1YSBmdW5jdGlvbnMKK2NyZWF0ZWQgYnkgdGhlIGZ1bmN0aW9uLgorCisKKzxwPgorWW91IGNhbiBjaGFuZ2UgdGhlIGVudmlyb25tZW50IG9mIGEgTHVhIGZ1bmN0aW9uIG9yIHRoZQorcnVubmluZyB0aHJlYWQgYnkgY2FsbGluZyA8YSBocmVmPSIjcGRmLXNldGZlbnYiPjxjb2RlPnNldGZlbnY8L2NvZGU+PC9hPi4KK1lvdSBjYW4gZ2V0IHRoZSBlbnZpcm9ubWVudCBvZiBhIEx1YSBmdW5jdGlvbiBvciB0aGUgcnVubmluZyB0aHJlYWQKK2J5IGNhbGxpbmcgPGEgaHJlZj0iI3BkZi1nZXRmZW52Ij48Y29kZT5nZXRmZW52PC9jb2RlPjwvYT4uCitUbyBtYW5pcHVsYXRlIHRoZSBlbnZpcm9ubWVudCBvZiBvdGhlciBvYmplY3RzCisodXNlcmRhdGEsIEMmbmJzcDtmdW5jdGlvbnMsIG90aGVyIHRocmVhZHMpIHlvdSBtdXN0Cit1c2UgdGhlIEMmbmJzcDtBUEkuCisKKworCisKKworPGgyPjIuMTAgLSA8YSBuYW1lPSIyLjEwIj5HYXJiYWdlIENvbGxlY3Rpb248L2E+PC9oMj4KKworPHA+CitMdWEgcGVyZm9ybXMgYXV0b21hdGljIG1lbW9yeSBtYW5hZ2VtZW50LgorVGhpcyBtZWFucyB0aGF0Cit5b3UgaGF2ZSB0byB3b3JyeSBuZWl0aGVyIGFib3V0IGFsbG9jYXRpbmcgbWVtb3J5IGZvciBuZXcgb2JqZWN0cworbm9yIGFib3V0IGZyZWVpbmcgaXQgd2hlbiB0aGUgb2JqZWN0cyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KK0x1YSBtYW5hZ2VzIG1lbW9yeSBhdXRvbWF0aWNhbGx5IGJ5IHJ1bm5pbmcKK2EgPGVtPmdhcmJhZ2UgY29sbGVjdG9yPC9lbT4gZnJvbSB0aW1lIHRvIHRpbWUKK3RvIGNvbGxlY3QgYWxsIDxlbT5kZWFkIG9iamVjdHM8L2VtPgorKHRoYXQgaXMsIG9iamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFjY2Vzc2libGUgZnJvbSBMdWEpLgorQWxsIG1lbW9yeSB1c2VkIGJ5IEx1YSBpcyBzdWJqZWN0IHRvIGF1dG9tYXRpYyBtYW5hZ2VtZW50OgordGFibGVzLCB1c2VyZGF0YSwgZnVuY3Rpb25zLCB0aHJlYWRzLCBzdHJpbmdzLCBldGMuCisKKworPHA+CitMdWEgaW1wbGVtZW50cyBhbiBpbmNyZW1lbnRhbCBtYXJrLWFuZC1zd2VlcCBjb2xsZWN0b3IuCitJdCB1c2VzIHR3byBudW1iZXJzIHRvIGNvbnRyb2wgaXRzIGdhcmJhZ2UtY29sbGVjdGlvbiBjeWNsZXM6Cit0aGUgPGVtPmdhcmJhZ2UtY29sbGVjdG9yIHBhdXNlPC9lbT4gYW5kCit0aGUgPGVtPmdhcmJhZ2UtY29sbGVjdG9yIHN0ZXAgbXVsdGlwbGllcjwvZW0+LgorQm90aCB1c2UgcGVyY2VudGFnZSBwb2ludHMgYXMgdW5pdHMKKyhzbyB0aGF0IGEgdmFsdWUgb2YgMTAwIG1lYW5zIGFuIGludGVybmFsIHZhbHVlIG9mIDEpLgorCisKKzxwPgorVGhlIGdhcmJhZ2UtY29sbGVjdG9yIHBhdXNlCitjb250cm9scyBob3cgbG9uZyB0aGUgY29sbGVjdG9yIHdhaXRzIGJlZm9yZSBzdGFydGluZyBhIG5ldyBjeWNsZS4KK0xhcmdlciB2YWx1ZXMgbWFrZSB0aGUgY29sbGVjdG9yIGxlc3MgYWdncmVzc2l2ZS4KK1ZhbHVlcyBzbWFsbGVyIHRoYW4gMTAwIG1lYW4gdGhlIGNvbGxlY3RvciB3aWxsIG5vdCB3YWl0IHRvCitzdGFydCBhIG5ldyBjeWNsZS4KK0EgdmFsdWUgb2YgMjAwIG1lYW5zIHRoYXQgdGhlIGNvbGxlY3RvciB3YWl0cyBmb3IgdGhlIHRvdGFsIG1lbW9yeSBpbiB1c2UKK3RvIGRvdWJsZSBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgY3ljbGUuCisKKworPHA+CitUaGUgc3RlcCBtdWx0aXBsaWVyCitjb250cm9scyB0aGUgcmVsYXRpdmUgc3BlZWQgb2YgdGhlIGNvbGxlY3RvciByZWxhdGl2ZSB0bworbWVtb3J5IGFsbG9jYXRpb24uCitMYXJnZXIgdmFsdWVzIG1ha2UgdGhlIGNvbGxlY3RvciBtb3JlIGFnZ3Jlc3NpdmUgYnV0IGFsc28gaW5jcmVhc2UKK3RoZSBzaXplIG9mIGVhY2ggaW5jcmVtZW50YWwgc3RlcC4KK1ZhbHVlcyBzbWFsbGVyIHRoYW4gMTAwIG1ha2UgdGhlIGNvbGxlY3RvciB0b28gc2xvdyBhbmQKK2NhbiByZXN1bHQgaW4gdGhlIGNvbGxlY3RvciBuZXZlciBmaW5pc2hpbmcgYSBjeWNsZS4KK1RoZSBkZWZhdWx0LCAyMDAsIG1lYW5zIHRoYXQgdGhlIGNvbGxlY3RvciBydW5zIGF0ICJ0d2ljZSIKK3RoZSBzcGVlZCBvZiBtZW1vcnkgYWxsb2NhdGlvbi4KKworCis8cD4KK1lvdSBjYW4gY2hhbmdlIHRoZXNlIG51bWJlcnMgYnkgY2FsbGluZyA8YSBocmVmPSIjbHVhX2djIj48Y29kZT5sdWFfZ2M8L2NvZGU+PC9hPiBpbiBDCitvciA8YSBocmVmPSIjcGRmLWNvbGxlY3RnYXJiYWdlIj48Y29kZT5jb2xsZWN0Z2FyYmFnZTwvY29kZT48L2E+IGluIEx1YS4KK1dpdGggdGhlc2UgZnVuY3Rpb25zIHlvdSBjYW4gYWxzbyBjb250cm9sIAordGhlIGNvbGxlY3RvciBkaXJlY3RseSAoZS5nLiwgc3RvcCBhbmQgcmVzdGFydCBpdCkuCisKKworCis8aDM+Mi4xMC4xIC0gPGEgbmFtZT0iMi4xMC4xIj5HYXJiYWdlLUNvbGxlY3Rpb24gTWV0YW1ldGhvZHM8L2E+PC9oMz4KKworPHA+CitVc2luZyB0aGUgQyZuYnNwO0FQSSwKK3lvdSBjYW4gc2V0IGdhcmJhZ2UtY29sbGVjdG9yIG1ldGFtZXRob2RzIGZvciB1c2VyZGF0YSAoc2VlIDxhIGhyZWY9IiMyLjgiPiZzZWN0OzIuODwvYT4pLgorVGhlc2UgbWV0YW1ldGhvZHMgYXJlIGFsc28gY2FsbGVkIDxlbT5maW5hbGl6ZXJzPC9lbT4uCitGaW5hbGl6ZXJzIGFsbG93IHlvdSB0byBjb29yZGluYXRlIEx1YSdzIGdhcmJhZ2UgY29sbGVjdGlvbgord2l0aCBleHRlcm5hbCByZXNvdXJjZSBtYW5hZ2VtZW50Cisoc3VjaCBhcyBjbG9zaW5nIGZpbGVzLCBuZXR3b3JrIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zLAorb3IgZnJlZWluZyB5b3VyIG93biBtZW1vcnkpLgorCisKKzxwPgorR2FyYmFnZSB1c2VyZGF0YSB3aXRoIGEgZmllbGQgPGNvZGU+X19nYzwvY29kZT4gaW4gdGhlaXIgbWV0YXRhYmxlcyBhcmUgbm90Citjb2xsZWN0ZWQgaW1tZWRpYXRlbHkgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorSW5zdGVhZCwgTHVhIHB1dHMgdGhlbSBpbiBhIGxpc3QuCitBZnRlciB0aGUgY29sbGVjdGlvbiwKK0x1YSBkb2VzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KK2ZvciBlYWNoIHVzZXJkYXRhIGluIHRoYXQgbGlzdDoKKworPHByZT4KKyAgICAgZnVuY3Rpb24gZ2NfZXZlbnQgKHVkYXRhKQorICAgICAgIGxvY2FsIGggPSBtZXRhdGFibGUodWRhdGEpLl9fZ2MKKyAgICAgICBpZiBoIHRoZW4KKyAgICAgICAgIGgodWRhdGEpCisgICAgICAgZW5kCisgICAgIGVuZAorPC9wcmU+CisKKzxwPgorQXQgdGhlIGVuZCBvZiBlYWNoIGdhcmJhZ2UtY29sbGVjdGlvbiBjeWNsZSwKK3RoZSBmaW5hbGl6ZXJzIGZvciB1c2VyZGF0YSBhcmUgY2FsbGVkIGluIDxlbT5yZXZlcnNlPC9lbT4KK29yZGVyIG9mIHRoZWlyIGNyZWF0aW9uLAorYW1vbmcgdGhvc2UgY29sbGVjdGVkIGluIHRoYXQgY3ljbGUuCitUaGF0IGlzLCB0aGUgZmlyc3QgZmluYWxpemVyIHRvIGJlIGNhbGxlZCBpcyB0aGUgb25lIGFzc29jaWF0ZWQKK3dpdGggdGhlIHVzZXJkYXRhIGNyZWF0ZWQgbGFzdCBpbiB0aGUgcHJvZ3JhbS4KK1RoZSB1c2VyZGF0YSBpdHNlbGYgaXMgZnJlZWQgb25seSBpbiB0aGUgbmV4dCBnYXJiYWdlLWNvbGxlY3Rpb24gY3ljbGUuCisKKworCisKKworPGgzPjIuMTAuMiAtIDxhIG5hbWU9IjIuMTAuMiI+V2VhayBUYWJsZXM8L2E+PC9oMz4KKworPHA+CitBIDxlbT53ZWFrIHRhYmxlPC9lbT4gaXMgYSB0YWJsZSB3aG9zZSBlbGVtZW50cyBhcmUKKzxlbT53ZWFrIHJlZmVyZW5jZXM8L2VtPi4KK0Egd2VhayByZWZlcmVuY2UgaXMgaWdub3JlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCitJbiBvdGhlciB3b3JkcywKK2lmIHRoZSBvbmx5IHJlZmVyZW5jZXMgdG8gYW4gb2JqZWN0IGFyZSB3ZWFrIHJlZmVyZW5jZXMsCit0aGVuIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB3aWxsIGNvbGxlY3QgdGhpcyBvYmplY3QuCisKKworPHA+CitBIHdlYWsgdGFibGUgY2FuIGhhdmUgd2VhayBrZXlzLCB3ZWFrIHZhbHVlcywgb3IgYm90aC4KK0EgdGFibGUgd2l0aCB3ZWFrIGtleXMgYWxsb3dzIHRoZSBjb2xsZWN0aW9uIG9mIGl0cyBrZXlzLAorYnV0IHByZXZlbnRzIHRoZSBjb2xsZWN0aW9uIG9mIGl0cyB2YWx1ZXMuCitBIHRhYmxlIHdpdGggYm90aCB3ZWFrIGtleXMgYW5kIHdlYWsgdmFsdWVzIGFsbG93cyB0aGUgY29sbGVjdGlvbiBvZgorYm90aCBrZXlzIGFuZCB2YWx1ZXMuCitJbiBhbnkgY2FzZSwgaWYgZWl0aGVyIHRoZSBrZXkgb3IgdGhlIHZhbHVlIGlzIGNvbGxlY3RlZCwKK3RoZSB3aG9sZSBwYWlyIGlzIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUuCitUaGUgd2Vha25lc3Mgb2YgYSB0YWJsZSBpcyBjb250cm9sbGVkIGJ5IHRoZQorPGNvZGU+X19tb2RlPC9jb2RlPiBmaWVsZCBvZiBpdHMgbWV0YXRhYmxlLgorSWYgdGhlIDxjb2RlPl9fbW9kZTwvY29kZT4gZmllbGQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyJm5ic3A7Jzxjb2RlPms8L2NvZGU+JywKK3RoZSBrZXlzIGluIHRoZSB0YWJsZSBhcmUgd2Vhay4KK0lmIDxjb2RlPl9fbW9kZTwvY29kZT4gY29udGFpbnMgJzxjb2RlPnY8L2NvZGU+JywKK3RoZSB2YWx1ZXMgaW4gdGhlIHRhYmxlIGFyZSB3ZWFrLgorCisKKzxwPgorQWZ0ZXIgeW91IHVzZSBhIHRhYmxlIGFzIGEgbWV0YXRhYmxlLAoreW91IHNob3VsZCBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBpdHMgPGNvZGU+X19tb2RlPC9jb2RlPiBmaWVsZC4KK090aGVyd2lzZSwgdGhlIHdlYWsgYmVoYXZpb3Igb2YgdGhlIHRhYmxlcyBjb250cm9sbGVkIGJ5IHRoaXMKK21ldGF0YWJsZSBpcyB1bmRlZmluZWQuCisKKworCisKKworCisKKzxoMj4yLjExIC0gPGEgbmFtZT0iMi4xMSI+Q29yb3V0aW5lczwvYT48L2gyPgorCis8cD4KK0x1YSBzdXBwb3J0cyBjb3JvdXRpbmVzLAorYWxzbyBjYWxsZWQgPGVtPmNvbGxhYm9yYXRpdmUgbXVsdGl0aHJlYWRpbmc8L2VtPi4KK0EgY29yb3V0aW5lIGluIEx1YSByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRocmVhZCBvZiBleGVjdXRpb24uCitVbmxpa2UgdGhyZWFkcyBpbiBtdWx0aXRocmVhZCBzeXN0ZW1zLCBob3dldmVyLAorYSBjb3JvdXRpbmUgb25seSBzdXNwZW5kcyBpdHMgZXhlY3V0aW9uIGJ5IGV4cGxpY2l0bHkgY2FsbGluZworYSB5aWVsZCBmdW5jdGlvbi4KKworCis8cD4KK1lvdSBjcmVhdGUgYSBjb3JvdXRpbmUgd2l0aCBhIGNhbGwgdG8gPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUuY3JlYXRlIj48Y29kZT5jb3JvdXRpbmUuY3JlYXRlPC9jb2RlPjwvYT4uCitJdHMgc29sZSBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uCit0aGF0IGlzIHRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSBjb3JvdXRpbmUuCitUaGUgPGNvZGU+Y3JlYXRlPC9jb2RlPiBmdW5jdGlvbiBvbmx5IGNyZWF0ZXMgYSBuZXcgY29yb3V0aW5lIGFuZAorcmV0dXJucyBhIGhhbmRsZSB0byBpdCAoYW4gb2JqZWN0IG9mIHR5cGUgPGVtPnRocmVhZDwvZW0+KTsKK2l0IGRvZXMgbm90IHN0YXJ0IHRoZSBjb3JvdXRpbmUgZXhlY3V0aW9uLgorCisKKzxwPgorV2hlbiB5b3UgZmlyc3QgY2FsbCA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWU8L2NvZGU+PC9hPiwKK3Bhc3NpbmcgYXMgaXRzIGZpcnN0IGFyZ3VtZW50CithIHRocmVhZCByZXR1cm5lZCBieSA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5jcmVhdGUiPjxjb2RlPmNvcm91dGluZS5jcmVhdGU8L2NvZGU+PC9hPiwKK3RoZSBjb3JvdXRpbmUgc3RhcnRzIGl0cyBleGVjdXRpb24sCithdCB0aGUgZmlyc3QgbGluZSBvZiBpdHMgbWFpbiBmdW5jdGlvbi4KK0V4dHJhIGFyZ3VtZW50cyBwYXNzZWQgdG8gPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUucmVzdW1lIj48Y29kZT5jb3JvdXRpbmUucmVzdW1lPC9jb2RlPjwvYT4gYXJlIHBhc3NlZCBvbgordG8gdGhlIGNvcm91dGluZSBtYWluIGZ1bmN0aW9uLgorQWZ0ZXIgdGhlIGNvcm91dGluZSBzdGFydHMgcnVubmluZywKK2l0IHJ1bnMgdW50aWwgaXQgdGVybWluYXRlcyBvciA8ZW0+eWllbGRzPC9lbT4uCisKKworPHA+CitBIGNvcm91dGluZSBjYW4gdGVybWluYXRlIGl0cyBleGVjdXRpb24gaW4gdHdvIHdheXM6Citub3JtYWxseSwgd2hlbiBpdHMgbWFpbiBmdW5jdGlvbiByZXR1cm5zCisoZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LCBhZnRlciB0aGUgbGFzdCBpbnN0cnVjdGlvbik7CithbmQgYWJub3JtYWxseSwgaWYgdGhlcmUgaXMgYW4gdW5wcm90ZWN0ZWQgZXJyb3IuCitJbiB0aGUgZmlyc3QgY2FzZSwgPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUucmVzdW1lIj48Y29kZT5jb3JvdXRpbmUucmVzdW1lPC9jb2RlPjwvYT4gcmV0dXJucyA8Yj50cnVlPC9iPiwKK3BsdXMgYW55IHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY29yb3V0aW5lIG1haW4gZnVuY3Rpb24uCitJbiBjYXNlIG9mIGVycm9ycywgPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUucmVzdW1lIj48Y29kZT5jb3JvdXRpbmUucmVzdW1lPC9jb2RlPjwvYT4gcmV0dXJucyA8Yj5mYWxzZTwvYj4KK3BsdXMgYW4gZXJyb3IgbWVzc2FnZS4KKworCis8cD4KK0EgY29yb3V0aW5lIHlpZWxkcyBieSBjYWxsaW5nIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnlpZWxkIj48Y29kZT5jb3JvdXRpbmUueWllbGQ8L2NvZGU+PC9hPi4KK1doZW4gYSBjb3JvdXRpbmUgeWllbGRzLAordGhlIGNvcnJlc3BvbmRpbmcgPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUucmVzdW1lIj48Y29kZT5jb3JvdXRpbmUucmVzdW1lPC9jb2RlPjwvYT4gcmV0dXJucyBpbW1lZGlhdGVseSwKK2V2ZW4gaWYgdGhlIHlpZWxkIGhhcHBlbnMgaW5zaWRlIG5lc3RlZCBmdW5jdGlvbiBjYWxscworKHRoYXQgaXMsIG5vdCBpbiB0aGUgbWFpbiBmdW5jdGlvbiwKK2J1dCBpbiBhIGZ1bmN0aW9uIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY2FsbGVkIGJ5IHRoZSBtYWluIGZ1bmN0aW9uKS4KK0luIHRoZSBjYXNlIG9mIGEgeWllbGQsIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+IGFsc28gcmV0dXJucyA8Yj50cnVlPC9iPiwKK3BsdXMgYW55IHZhbHVlcyBwYXNzZWQgdG8gPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUueWllbGQiPjxjb2RlPmNvcm91dGluZS55aWVsZDwvY29kZT48L2E+LgorVGhlIG5leHQgdGltZSB5b3UgcmVzdW1lIHRoZSBzYW1lIGNvcm91dGluZSwKK2l0IGNvbnRpbnVlcyBpdHMgZXhlY3V0aW9uIGZyb20gdGhlIHBvaW50IHdoZXJlIGl0IHlpZWxkZWQsCit3aXRoIHRoZSBjYWxsIHRvIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnlpZWxkIj48Y29kZT5jb3JvdXRpbmUueWllbGQ8L2NvZGU+PC9hPiByZXR1cm5pbmcgYW55IGV4dHJhCithcmd1bWVudHMgcGFzc2VkIHRvIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+LgorCisKKzxwPgorTGlrZSA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5jcmVhdGUiPjxjb2RlPmNvcm91dGluZS5jcmVhdGU8L2NvZGU+PC9hPiwKK3RoZSA8YSBocmVmPSIjcGRmLWNvcm91dGluZS53cmFwIj48Y29kZT5jb3JvdXRpbmUud3JhcDwvY29kZT48L2E+IGZ1bmN0aW9uIGFsc28gY3JlYXRlcyBhIGNvcm91dGluZSwKK2J1dCBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgY29yb3V0aW5lIGl0c2VsZiwKK2l0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgcmVzdW1lcyB0aGUgY29yb3V0aW5lLgorQW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbgorZ28gYXMgZXh0cmEgYXJndW1lbnRzIHRvIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+LgorPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUud3JhcCI+PGNvZGU+Y29yb3V0aW5lLndyYXA8L2NvZGU+PC9hPiByZXR1cm5zIGFsbCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+LAorZXhjZXB0IHRoZSBmaXJzdCBvbmUgKHRoZSBib29sZWFuIGVycm9yIGNvZGUpLgorVW5saWtlIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+LAorPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUud3JhcCI+PGNvZGU+Y29yb3V0aW5lLndyYXA8L2NvZGU+PC9hPiBkb2VzIG5vdCBjYXRjaCBlcnJvcnM7CithbnkgZXJyb3IgaXMgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyLgorCisKKzxwPgorQXMgYW4gZXhhbXBsZSwKK2NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZToKKworPHByZT4KKyAgICAgZnVuY3Rpb24gZm9vIChhKQorICAgICAgIHByaW50KCJmb28iLCBhKQorICAgICAgIHJldHVybiBjb3JvdXRpbmUueWllbGQoMiphKQorICAgICBlbmQKKyAgICAgCisgICAgIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoYSxiKQorICAgICAgICAgICBwcmludCgiY28tYm9keSIsIGEsIGIpCisgICAgICAgICAgIGxvY2FsIHIgPSBmb28oYSsxKQorICAgICAgICAgICBwcmludCgiY28tYm9keSIsIHIpCisgICAgICAgICAgIGxvY2FsIHIsIHMgPSBjb3JvdXRpbmUueWllbGQoYStiLCBhLWIpCisgICAgICAgICAgIHByaW50KCJjby1ib2R5IiwgciwgcykKKyAgICAgICAgICAgcmV0dXJuIGIsICJlbmQiCisgICAgIGVuZCkKKyAgICAgICAgICAgIAorICAgICBwcmludCgibWFpbiIsIGNvcm91dGluZS5yZXN1bWUoY28sIDEsIDEwKSkKKyAgICAgcHJpbnQoIm1haW4iLCBjb3JvdXRpbmUucmVzdW1lKGNvLCAiciIpKQorICAgICBwcmludCgibWFpbiIsIGNvcm91dGluZS5yZXN1bWUoY28sICJ4IiwgInkiKSkKKyAgICAgcHJpbnQoIm1haW4iLCBjb3JvdXRpbmUucmVzdW1lKGNvLCAieCIsICJ5IikpCis8L3ByZT48cD4KK1doZW4geW91IHJ1biBpdCwgaXQgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisKKzxwcmU+CisgICAgIGNvLWJvZHkgMSAgICAgICAxMAorICAgICBmb28gICAgIDIKKyAgICAgCisgICAgIG1haW4gICAgdHJ1ZSAgICA0CisgICAgIGNvLWJvZHkgcgorICAgICBtYWluICAgIHRydWUgICAgMTEgICAgICAtOQorICAgICBjby1ib2R5IHggICAgICAgeQorICAgICBtYWluICAgIHRydWUgICAgMTAgICAgICBlbmQKKyAgICAgbWFpbiAgICBmYWxzZSAgIGNhbm5vdCByZXN1bWUgZGVhZCBjb3JvdXRpbmUKKzwvcHJlPgorCisKKworCis8aDE+MyAtIDxhIG5hbWU9IjMiPlRoZSBBcHBsaWNhdGlvbiBQcm9ncmFtIEludGVyZmFjZTwvYT48L2gxPgorCis8cD4KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgQyZuYnNwO0FQSSBmb3IgTHVhLCB0aGF0IGlzLAordGhlIHNldCBvZiBDJm5ic3A7ZnVuY3Rpb25zIGF2YWlsYWJsZSB0byB0aGUgaG9zdCBwcm9ncmFtIHRvIGNvbW11bmljYXRlCit3aXRoIEx1YS4KK0FsbCBBUEkgZnVuY3Rpb25zIGFuZCByZWxhdGVkIHR5cGVzIGFuZCBjb25zdGFudHMKK2FyZSBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUgPGEgbmFtZT0icGRmLWx1YS5oIj48Y29kZT5sdWEuaDwvY29kZT48L2E+LgorCisKKzxwPgorRXZlbiB3aGVuIHdlIHVzZSB0aGUgdGVybSAiZnVuY3Rpb24iLAorYW55IGZhY2lsaXR5IGluIHRoZSBBUEkgbWF5IGJlIHByb3ZpZGVkIGFzIGEgbWFjcm8gaW5zdGVhZC4KK0FsbCBzdWNoIG1hY3JvcyB1c2UgZWFjaCBvZiB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlCisoZXhjZXB0IGZvciB0aGUgZmlyc3QgYXJndW1lbnQsIHdoaWNoIGlzIGFsd2F5cyBhIEx1YSBzdGF0ZSksCithbmQgc28gZG8gbm90IGdlbmVyYXRlIGFueSBoaWRkZW4gc2lkZS1lZmZlY3RzLgorCisKKzxwPgorQXMgaW4gbW9zdCBDJm5ic3A7bGlicmFyaWVzLAordGhlIEx1YSBBUEkgZnVuY3Rpb25zIGRvIG5vdCBjaGVjayB0aGVpciBhcmd1bWVudHMgZm9yIHZhbGlkaXR5IG9yIGNvbnNpc3RlbmN5LgorSG93ZXZlciwgeW91IGNhbiBjaGFuZ2UgdGhpcyBiZWhhdmlvciBieSBjb21waWxpbmcgTHVhCit3aXRoIGEgcHJvcGVyIGRlZmluaXRpb24gZm9yIHRoZSBtYWNybyA8YSBuYW1lPSJwZGYtbHVhaV9hcGljaGVjayI+PGNvZGU+bHVhaV9hcGljaGVjazwvY29kZT48L2E+LAoraW4gZmlsZSA8Y29kZT5sdWFjb25mLmg8L2NvZGU+LgorCisKKworPGgyPjMuMSAtIDxhIG5hbWU9IjMuMSI+VGhlIFN0YWNrPC9hPjwvaDI+CisKKzxwPgorTHVhIHVzZXMgYSA8ZW0+dmlydHVhbCBzdGFjazwvZW0+IHRvIHBhc3MgdmFsdWVzIHRvIGFuZCBmcm9tIEMuCitFYWNoIGVsZW1lbnQgaW4gdGhpcyBzdGFjayByZXByZXNlbnRzIGEgTHVhIHZhbHVlCisoPGI+bmlsPC9iPiwgbnVtYmVyLCBzdHJpbmcsIGV0Yy4pLgorCisKKzxwPgorV2hlbmV2ZXIgTHVhIGNhbGxzIEMsIHRoZSBjYWxsZWQgZnVuY3Rpb24gZ2V0cyBhIG5ldyBzdGFjaywKK3doaWNoIGlzIGluZGVwZW5kZW50IG9mIHByZXZpb3VzIHN0YWNrcyBhbmQgb2Ygc3RhY2tzIG9mCitDJm5ic3A7ZnVuY3Rpb25zIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KK1RoaXMgc3RhY2sgaW5pdGlhbGx5IGNvbnRhaW5zIGFueSBhcmd1bWVudHMgdG8gdGhlIEMmbmJzcDtmdW5jdGlvbgorYW5kIGl0IGlzIHdoZXJlIHRoZSBDJm5ic3A7ZnVuY3Rpb24gcHVzaGVzIGl0cyByZXN1bHRzCit0byBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIChzZWUgPGEgaHJlZj0iI2x1YV9DRnVuY3Rpb24iPjxjb2RlPmx1YV9DRnVuY3Rpb248L2NvZGU+PC9hPikuCisKKworPHA+CitGb3IgY29udmVuaWVuY2UsCittb3N0IHF1ZXJ5IG9wZXJhdGlvbnMgaW4gdGhlIEFQSSBkbyBub3QgZm9sbG93IGEgc3RyaWN0IHN0YWNrIGRpc2NpcGxpbmUuCitJbnN0ZWFkLCB0aGV5IGNhbiByZWZlciB0byBhbnkgZWxlbWVudCBpbiB0aGUgc3RhY2sKK2J5IHVzaW5nIGFuIDxlbT5pbmRleDwvZW0+OgorQSBwb3NpdGl2ZSBpbmRleCByZXByZXNlbnRzIGFuIDxlbT5hYnNvbHV0ZTwvZW0+IHN0YWNrIHBvc2l0aW9uCisoc3RhcnRpbmcgYXQmbmJzcDsxKTsKK2EgbmVnYXRpdmUgaW5kZXggcmVwcmVzZW50cyBhbiA8ZW0+b2Zmc2V0PC9lbT4gcmVsYXRpdmUgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCitNb3JlIHNwZWNpZmljYWxseSwgaWYgdGhlIHN0YWNrIGhhcyA8ZW0+bjwvZW0+IGVsZW1lbnRzLAordGhlbiBpbmRleCZuYnNwOzEgcmVwcmVzZW50cyB0aGUgZmlyc3QgZWxlbWVudAorKHRoYXQgaXMsIHRoZSBlbGVtZW50IHRoYXQgd2FzIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBmaXJzdCkKK2FuZAoraW5kZXgmbmJzcDs8ZW0+bjwvZW0+IHJlcHJlc2VudHMgdGhlIGxhc3QgZWxlbWVudDsKK2luZGV4Jm5ic3A7LTEgYWxzbyByZXByZXNlbnRzIHRoZSBsYXN0IGVsZW1lbnQKKyh0aGF0IGlzLCB0aGUgZWxlbWVudCBhdCB0aGUmbmJzcDt0b3ApCithbmQgaW5kZXggPGVtPi1uPC9lbT4gcmVwcmVzZW50cyB0aGUgZmlyc3QgZWxlbWVudC4KK1dlIHNheSB0aGF0IGFuIGluZGV4IGlzIDxlbT52YWxpZDwvZW0+CitpZiBpdCBsaWVzIGJldHdlZW4mbmJzcDsxIGFuZCB0aGUgc3RhY2sgdG9wCisodGhhdCBpcywgaWYgPGNvZGU+MSAmbGU7IGFicyhpbmRleCkgJmxlOyB0b3A8L2NvZGU+KS4KKyAKKworCisKKworCis8aDI+My4yIC0gPGEgbmFtZT0iMy4yIj5TdGFjayBTaXplPC9hPjwvaDI+CisKKzxwPgorV2hlbiB5b3UgaW50ZXJhY3Qgd2l0aCBMdWEgQVBJLAoreW91IGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgY29uc2lzdGVuY3kuCitJbiBwYXJ0aWN1bGFyLAorPGVtPnlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbnRyb2xsaW5nIHN0YWNrIG92ZXJmbG93PC9lbT4uCitZb3UgY2FuIHVzZSB0aGUgZnVuY3Rpb24gPGEgaHJlZj0iI2x1YV9jaGVja3N0YWNrIj48Y29kZT5sdWFfY2hlY2tzdGFjazwvY29kZT48L2E+Cit0byBncm93IHRoZSBzdGFjayBzaXplLgorCisKKzxwPgorV2hlbmV2ZXIgTHVhIGNhbGxzIEMsCitpdCBlbnN1cmVzIHRoYXQgYXQgbGVhc3QgPGEgbmFtZT0icGRmLUxVQV9NSU5TVEFDSyI+PGNvZGU+TFVBX01JTlNUQUNLPC9jb2RlPjwvYT4gc3RhY2sgcG9zaXRpb25zIGFyZSBhdmFpbGFibGUuCis8Y29kZT5MVUFfTUlOU1RBQ0s8L2NvZGU+IGlzIGRlZmluZWQgYXMgMjAsCitzbyB0aGF0IHVzdWFsbHkgeW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHN0YWNrIHNwYWNlCit1bmxlc3MgeW91ciBjb2RlIGhhcyBsb29wcyBwdXNoaW5nIGVsZW1lbnRzIG9udG8gdGhlIHN0YWNrLgorCisKKzxwPgorTW9zdCBxdWVyeSBmdW5jdGlvbnMgYWNjZXB0IGFzIGluZGljZXMgYW55IHZhbHVlIGluc2lkZSB0aGUKK2F2YWlsYWJsZSBzdGFjayBzcGFjZSwgdGhhdCBpcywgaW5kaWNlcyB1cCB0byB0aGUgbWF4aW11bSBzdGFjayBzaXplCit5b3UgaGF2ZSBzZXQgdGhyb3VnaCA8YSBocmVmPSIjbHVhX2NoZWNrc3RhY2siPjxjb2RlPmx1YV9jaGVja3N0YWNrPC9jb2RlPjwvYT4uCitTdWNoIGluZGljZXMgYXJlIGNhbGxlZCA8ZW0+YWNjZXB0YWJsZSBpbmRpY2VzPC9lbT4uCitNb3JlIGZvcm1hbGx5LCB3ZSBkZWZpbmUgYW4gPGVtPmFjY2VwdGFibGUgaW5kZXg8L2VtPgorYXMgZm9sbG93czoKKworPHByZT4KKyAgICAgKGluZGV4ICZsdDsgMCAmYW1wOyZhbXA7IGFicyhpbmRleCkgJmx0Oz0gdG9wKSB8fAorICAgICAoaW5kZXggJmd0OyAwICZhbXA7JmFtcDsgaW5kZXggJmx0Oz0gc3RhY2tzcGFjZSkKKzwvcHJlPjxwPgorTm90ZSB0aGF0IDAgaXMgbmV2ZXIgYW4gYWNjZXB0YWJsZSBpbmRleC4KKworCisKKworCis8aDI+My4zIC0gPGEgbmFtZT0iMy4zIj5Qc2V1ZG8tSW5kaWNlczwvYT48L2gyPgorCis8cD4KK1VubGVzcyBvdGhlcndpc2Ugbm90ZWQsCithbnkgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHZhbGlkIGluZGljZXMgY2FuIGFsc28gYmUgY2FsbGVkIHdpdGgKKzxlbT5wc2V1ZG8taW5kaWNlczwvZW0+LAord2hpY2ggcmVwcmVzZW50IHNvbWUgTHVhIHZhbHVlcyB0aGF0IGFyZSBhY2Nlc3NpYmxlIHRvIEMmbmJzcDtjb2RlCitidXQgd2hpY2ggYXJlIG5vdCBpbiB0aGUgc3RhY2suCitQc2V1ZG8taW5kaWNlcyBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlIHRocmVhZCBlbnZpcm9ubWVudCwKK3RoZSBmdW5jdGlvbiBlbnZpcm9ubWVudCwKK3RoZSByZWdpc3RyeSwKK2FuZCB0aGUgdXB2YWx1ZXMgb2YgYSBDJm5ic3A7ZnVuY3Rpb24gKHNlZSA8YSBocmVmPSIjMy40Ij4mc2VjdDszLjQ8L2E+KS4KKworCis8cD4KK1RoZSB0aHJlYWQgZW52aXJvbm1lbnQgKHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgbGl2ZSkgaXMKK2Fsd2F5cyBhdCBwc2V1ZG8taW5kZXggPGEgbmFtZT0icGRmLUxVQV9HTE9CQUxTSU5ERVgiPjxjb2RlPkxVQV9HTE9CQUxTSU5ERVg8L2NvZGU+PC9hPi4KK1RoZSBlbnZpcm9ubWVudCBvZiB0aGUgcnVubmluZyBDJm5ic3A7ZnVuY3Rpb24gaXMgYWx3YXlzCithdCBwc2V1ZG8taW5kZXggPGEgbmFtZT0icGRmLUxVQV9FTlZJUk9OSU5ERVgiPjxjb2RlPkxVQV9FTlZJUk9OSU5ERVg8L2NvZGU+PC9hPi4KKworCis8cD4KK1RvIGFjY2VzcyBhbmQgY2hhbmdlIHRoZSB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGVzLAoreW91IGNhbiB1c2UgcmVndWxhciB0YWJsZSBvcGVyYXRpb25zIG92ZXIgYW4gZW52aXJvbm1lbnQgdGFibGUuCitGb3IgaW5zdGFuY2UsIHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgYSBnbG9iYWwgdmFyaWFibGUsIGRvCisKKzxwcmU+CisgICAgIGx1YV9nZXRmaWVsZChMLCBMVUFfR0xPQkFMU0lOREVYLCB2YXJuYW1lKTsKKzwvcHJlPgorCisKKworCis8aDI+My40IC0gPGEgbmFtZT0iMy40Ij5DIENsb3N1cmVzPC9hPjwvaDI+CisKKzxwPgorV2hlbiBhIEMmbmJzcDtmdW5jdGlvbiBpcyBjcmVhdGVkLAoraXQgaXMgcG9zc2libGUgdG8gYXNzb2NpYXRlIHNvbWUgdmFsdWVzIHdpdGggaXQsCit0aHVzIGNyZWF0aW5nIGEgPGVtPkMmbmJzcDtjbG9zdXJlPC9lbT47Cit0aGVzZSB2YWx1ZXMgYXJlIGNhbGxlZCA8ZW0+dXB2YWx1ZXM8L2VtPiBhbmQgYXJlCithY2Nlc3NpYmxlIHRvIHRoZSBmdW5jdGlvbiB3aGVuZXZlciBpdCBpcyBjYWxsZWQKKyhzZWUgPGEgaHJlZj0iI2x1YV9wdXNoY2Nsb3N1cmUiPjxjb2RlPmx1YV9wdXNoY2Nsb3N1cmU8L2NvZGU+PC9hPikuCisKKworPHA+CitXaGVuZXZlciBhIEMmbmJzcDtmdW5jdGlvbiBpcyBjYWxsZWQsCitpdHMgdXB2YWx1ZXMgYXJlIGxvY2F0ZWQgYXQgc3BlY2lmaWMgcHNldWRvLWluZGljZXMuCitUaGVzZSBwc2V1ZG8taW5kaWNlcyBhcmUgcHJvZHVjZWQgYnkgdGhlIG1hY3JvCis8YSBuYW1lPSJsdWFfdXB2YWx1ZWluZGV4Ij48Y29kZT5sdWFfdXB2YWx1ZWluZGV4PC9jb2RlPjwvYT4uCitUaGUgZmlyc3QgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24gaXMgYXQgcG9zaXRpb24KKzxjb2RlPmx1YV91cHZhbHVlaW5kZXgoMSk8L2NvZGU+LCBhbmQgc28gb24uCitBbnkgYWNjZXNzIHRvIDxjb2RlPmx1YV91cHZhbHVlaW5kZXgoPGVtPm48L2VtPik8L2NvZGU+LAord2hlcmUgPGVtPm48L2VtPiBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1cHZhbHVlcyBvZiB0aGUKK2N1cnJlbnQgZnVuY3Rpb24gKGJ1dCBub3QgZ3JlYXRlciB0aGFuIDI1NiksCitwcm9kdWNlcyBhbiBhY2NlcHRhYmxlIChidXQgaW52YWxpZCkgaW5kZXguCisKKworCisKKworPGgyPjMuNSAtIDxhIG5hbWU9IjMuNSI+UmVnaXN0cnk8L2E+PC9oMj4KKworPHA+CitMdWEgcHJvdmlkZXMgYSA8ZW0+cmVnaXN0cnk8L2VtPiwKK2EgcHJlLWRlZmluZWQgdGFibGUgdGhhdCBjYW4gYmUgdXNlZCBieSBhbnkgQyZuYnNwO2NvZGUgdG8KK3N0b3JlIHdoYXRldmVyIEx1YSB2YWx1ZSBpdCBuZWVkcyB0byBzdG9yZS4KK1RoaXMgdGFibGUgaXMgYWx3YXlzIGxvY2F0ZWQgYXQgcHNldWRvLWluZGV4Cis8YSBuYW1lPSJwZGYtTFVBX1JFR0lTVFJZSU5ERVgiPjxjb2RlPkxVQV9SRUdJU1RSWUlOREVYPC9jb2RlPjwvYT4uCitBbnkgQyZuYnNwO2xpYnJhcnkgY2FuIHN0b3JlIGRhdGEgaW50byB0aGlzIHRhYmxlLAorYnV0IGl0IHNob3VsZCB0YWtlIGNhcmUgdG8gY2hvb3NlIGtleXMgZGlmZmVyZW50IGZyb20gdGhvc2UgdXNlZAorYnkgb3RoZXIgbGlicmFyaWVzLCB0byBhdm9pZCBjb2xsaXNpb25zLgorVHlwaWNhbGx5LCB5b3Ugc2hvdWxkIHVzZSBhcyBrZXkgYSBzdHJpbmcgY29udGFpbmluZyB5b3VyIGxpYnJhcnkgbmFtZQorb3IgYSBsaWdodCB1c2VyZGF0YSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgQyZuYnNwO29iamVjdCBpbiB5b3VyIGNvZGUuCisKKworPHA+CitUaGUgaW50ZWdlciBrZXlzIGluIHRoZSByZWdpc3RyeSBhcmUgdXNlZCBieSB0aGUgcmVmZXJlbmNlIG1lY2hhbmlzbSwKK2ltcGxlbWVudGVkIGJ5IHRoZSBhdXhpbGlhcnkgbGlicmFyeSwKK2FuZCB0aGVyZWZvcmUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBvdGhlciBwdXJwb3Nlcy4KKworCisKKworCis8aDI+My42IC0gPGEgbmFtZT0iMy42Ij5FcnJvciBIYW5kbGluZyBpbiBDPC9hPjwvaDI+CisKKzxwPgorSW50ZXJuYWxseSwgTHVhIHVzZXMgdGhlIEMgPGNvZGU+bG9uZ2ptcDwvY29kZT4gZmFjaWxpdHkgdG8gaGFuZGxlIGVycm9ycy4KKyhZb3UgY2FuIGFsc28gY2hvb3NlIHRvIHVzZSBleGNlcHRpb25zIGlmIHlvdSB1c2UgQysrOworc2VlIGZpbGUgPGNvZGU+bHVhY29uZi5oPC9jb2RlPi4pCitXaGVuIEx1YSBmYWNlcyBhbnkgZXJyb3IKKyhzdWNoIGFzIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9ycywgdHlwZSBlcnJvcnMsIHN5bnRheCBlcnJvcnMsCithbmQgcnVudGltZSBlcnJvcnMpCitpdCA8ZW0+cmFpc2VzPC9lbT4gYW4gZXJyb3I7Cit0aGF0IGlzLCBpdCBkb2VzIGEgbG9uZyBqdW1wLgorQSA8ZW0+cHJvdGVjdGVkIGVudmlyb25tZW50PC9lbT4gdXNlcyA8Y29kZT5zZXRqbXA8L2NvZGU+Cit0byBzZXQgYSByZWNvdmVyIHBvaW50OworYW55IGVycm9yIGp1bXBzIHRvIHRoZSBtb3N0IHJlY2VudCBhY3RpdmUgcmVjb3ZlciBwb2ludC4KKworCis8cD4KK01vc3QgZnVuY3Rpb25zIGluIHRoZSBBUEkgY2FuIHRocm93IGFuIGVycm9yLAorZm9yIGluc3RhbmNlIGR1ZSB0byBhIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorVGhlIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggZnVuY3Rpb24gaW5kaWNhdGVzIHdoZXRoZXIKK2l0IGNhbiB0aHJvdyBlcnJvcnMuCisKKworPHA+CitJbnNpZGUgYSBDJm5ic3A7ZnVuY3Rpb24geW91IGNhbiB0aHJvdyBhbiBlcnJvciBieSBjYWxsaW5nIDxhIGhyZWY9IiNsdWFfZXJyb3IiPjxjb2RlPmx1YV9lcnJvcjwvY29kZT48L2E+LgorCisKKworCisKKzxoMj4zLjcgLSA8YSBuYW1lPSIzLjciPkZ1bmN0aW9ucyBhbmQgVHlwZXM8L2E+PC9oMj4KKworPHA+CitIZXJlIHdlIGxpc3QgYWxsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgQyZuYnNwO0FQSSBpbgorYWxwaGFiZXRpY2FsIG9yZGVyLgorRWFjaCBmdW5jdGlvbiBoYXMgYW4gaW5kaWNhdG9yIGxpa2UgdGhpczoKKzxzcGFuIGNsYXNzPSJhcGlpIj5bLW8sICtwLCA8ZW0+eDwvZW0+XTwvc3Bhbj4KKworCis8cD4KK1RoZSBmaXJzdCBmaWVsZCwgPGNvZGU+bzwvY29kZT4sCitpcyBob3cgbWFueSBlbGVtZW50cyB0aGUgZnVuY3Rpb24gcG9wcyBmcm9tIHRoZSBzdGFjay4KK1RoZSBzZWNvbmQgZmllbGQsIDxjb2RlPnA8L2NvZGU+LAoraXMgaG93IG1hbnkgZWxlbWVudHMgdGhlIGZ1bmN0aW9uIHB1c2hlcyBvbnRvIHRoZSBzdGFjay4KKyhBbnkgZnVuY3Rpb24gYWx3YXlzIHB1c2hlcyBpdHMgcmVzdWx0cyBhZnRlciBwb3BwaW5nIGl0cyBhcmd1bWVudHMuKQorQSBmaWVsZCBpbiB0aGUgZm9ybSA8Y29kZT54fHk8L2NvZGU+IG1lYW5zIHRoZSBmdW5jdGlvbiBjYW4gcHVzaCAob3IgcG9wKQorPGNvZGU+eDwvY29kZT4gb3IgPGNvZGU+eTwvY29kZT4gZWxlbWVudHMsCitkZXBlbmRpbmcgb24gdGhlIHNpdHVhdGlvbjsKK2FuIGludGVycm9nYXRpb24gbWFyayAnPGNvZGU+PzwvY29kZT4nIG1lYW5zIHRoYXQKK3dlIGNhbm5vdCBrbm93IGhvdyBtYW55IGVsZW1lbnRzIHRoZSBmdW5jdGlvbiBwb3BzL3B1c2hlcworYnkgbG9va2luZyBvbmx5IGF0IGl0cyBhcmd1bWVudHMKKyhlLmcuLCB0aGV5IG1heSBkZXBlbmQgb24gd2hhdCBpcyBvbiB0aGUgc3RhY2spLgorVGhlIHRoaXJkIGZpZWxkLCA8Y29kZT54PC9jb2RlPiwKK3RlbGxzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIG1heSB0aHJvdyBlcnJvcnM6CisnPGNvZGU+LTwvY29kZT4nIG1lYW5zIHRoZSBmdW5jdGlvbiBuZXZlciB0aHJvd3MgYW55IGVycm9yOworJzxjb2RlPm08L2NvZGU+JyBtZWFucyB0aGUgZnVuY3Rpb24gbWF5IHRocm93IGFuIGVycm9yCitvbmx5IGR1ZSB0byBub3QgZW5vdWdoIG1lbW9yeTsKKyc8Y29kZT5lPC9jb2RlPicgbWVhbnMgdGhlIGZ1bmN0aW9uIG1heSB0aHJvdyBvdGhlciBraW5kcyBvZiBlcnJvcnM7CisnPGNvZGU+djwvY29kZT4nIG1lYW5zIHRoZSBmdW5jdGlvbiBtYXkgdGhyb3cgYW4gZXJyb3Igb24gcHVycG9zZS4KKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX0FsbG9jIj48Y29kZT5sdWFfQWxsb2M8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgdm9pZCAqICgqbHVhX0FsbG9jKSAodm9pZCAqdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnNpemUpOzwvcHJlPgorCis8cD4KK1RoZSB0eXBlIG9mIHRoZSBtZW1vcnktYWxsb2NhdGlvbiBmdW5jdGlvbiB1c2VkIGJ5IEx1YSBzdGF0ZXMuCitUaGUgYWxsb2NhdG9yIGZ1bmN0aW9uIG11c3QgcHJvdmlkZSBhCitmdW5jdGlvbmFsaXR5IHNpbWlsYXIgdG8gPGNvZGU+cmVhbGxvYzwvY29kZT4sCitidXQgbm90IGV4YWN0bHkgdGhlIHNhbWUuCitJdHMgYXJndW1lbnRzIGFyZQorPGNvZGU+dWQ8L2NvZGU+LCBhbiBvcGFxdWUgcG9pbnRlciBwYXNzZWQgdG8gPGEgaHJlZj0iI2x1YV9uZXdzdGF0ZSI+PGNvZGU+bHVhX25ld3N0YXRlPC9jb2RlPjwvYT47Cis8Y29kZT5wdHI8L2NvZGU+LCBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGJlaW5nIGFsbG9jYXRlZC9yZWFsbG9jYXRlZC9mcmVlZDsKKzxjb2RlPm9zaXplPC9jb2RlPiwgdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIGJsb2NrOworPGNvZGU+bnNpemU8L2NvZGU+LCB0aGUgbmV3IHNpemUgb2YgdGhlIGJsb2NrLgorPGNvZGU+cHRyPC9jb2RlPiBpcyA8Y29kZT5OVUxMPC9jb2RlPiBpZiBhbmQgb25seSBpZiA8Y29kZT5vc2l6ZTwvY29kZT4gaXMgemVyby4KK1doZW4gPGNvZGU+bnNpemU8L2NvZGU+IGlzIHplcm8sIHRoZSBhbGxvY2F0b3IgbXVzdCByZXR1cm4gPGNvZGU+TlVMTDwvY29kZT47CitpZiA8Y29kZT5vc2l6ZTwvY29kZT4gaXMgbm90IHplcm8sCitpdCBzaG91bGQgZnJlZSB0aGUgYmxvY2sgcG9pbnRlZCB0byBieSA8Y29kZT5wdHI8L2NvZGU+LgorV2hlbiA8Y29kZT5uc2l6ZTwvY29kZT4gaXMgbm90IHplcm8sIHRoZSBhbGxvY2F0b3IgcmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPgoraWYgYW5kIG9ubHkgaWYgaXQgY2Fubm90IGZpbGwgdGhlIHJlcXVlc3QuCitXaGVuIDxjb2RlPm5zaXplPC9jb2RlPiBpcyBub3QgemVybyBhbmQgPGNvZGU+b3NpemU8L2NvZGU+IGlzIHplcm8sCit0aGUgYWxsb2NhdG9yIHNob3VsZCBiZWhhdmUgbGlrZSA8Y29kZT5tYWxsb2M8L2NvZGU+LgorV2hlbiA8Y29kZT5uc2l6ZTwvY29kZT4gYW5kIDxjb2RlPm9zaXplPC9jb2RlPiBhcmUgbm90IHplcm8sCit0aGUgYWxsb2NhdG9yIGJlaGF2ZXMgbGlrZSA8Y29kZT5yZWFsbG9jPC9jb2RlPi4KK0x1YSBhc3N1bWVzIHRoYXQgdGhlIGFsbG9jYXRvciBuZXZlciBmYWlscyB3aGVuCis8Y29kZT5vc2l6ZSAmZ3Q7PSBuc2l6ZTwvY29kZT4uCisKKworPHA+CitIZXJlIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgYWxsb2NhdG9yIGZ1bmN0aW9uLgorSXQgaXMgdXNlZCBpbiB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkgYnkgPGEgaHJlZj0iI2x1YUxfbmV3c3RhdGUiPjxjb2RlPmx1YUxfbmV3c3RhdGU8L2NvZGU+PC9hPi4KKworPHByZT4KKyAgICAgc3RhdGljIHZvaWQgKmxfYWxsb2MgKHZvaWQgKnVkLCB2b2lkICpwdHIsIHNpemVfdCBvc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSkgeworICAgICAgICh2b2lkKXVkOyAgKHZvaWQpb3NpemU7ICAvKiBub3QgdXNlZCAqLworICAgICAgIGlmIChuc2l6ZSA9PSAwKSB7CisgICAgICAgICBmcmVlKHB0cik7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIHJlYWxsb2MocHRyLCBuc2l6ZSk7CisgICAgIH0KKzwvcHJlPjxwPgorVGhpcyBjb2RlIGFzc3VtZXMKK3RoYXQgPGNvZGU+ZnJlZShOVUxMKTwvY29kZT4gaGFzIG5vIGVmZmVjdCBhbmQgdGhhdAorPGNvZGU+cmVhbGxvYyhOVUxMLCBzaXplKTwvY29kZT4gaXMgZXF1aXZhbGVudCB0byA8Y29kZT5tYWxsb2Moc2l6ZSk8L2NvZGU+LgorQU5TSSZuYnNwO0MgZW5zdXJlcyBib3RoIGJlaGF2aW9ycy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9hdHBhbmljIj48Y29kZT5sdWFfYXRwYW5pYzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX0NGdW5jdGlvbiBsdWFfYXRwYW5pYyAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIHBhbmljZik7PC9wcmU+CisKKzxwPgorU2V0cyBhIG5ldyBwYW5pYyBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgb2xkIG9uZS4KKworCis8cD4KK0lmIGFuIGVycm9yIGhhcHBlbnMgb3V0c2lkZSBhbnkgcHJvdGVjdGVkIGVudmlyb25tZW50LAorTHVhIGNhbGxzIGEgPGVtPnBhbmljIGZ1bmN0aW9uPC9lbT4KK2FuZCB0aGVuIGNhbGxzIDxjb2RlPmV4aXQoRVhJVF9GQUlMVVJFKTwvY29kZT4sCit0aHVzIGV4aXRpbmcgdGhlIGhvc3QgYXBwbGljYXRpb24uCitZb3VyIHBhbmljIGZ1bmN0aW9uIGNhbiBhdm9pZCB0aGlzIGV4aXQgYnkKK25ldmVyIHJldHVybmluZyAoZS5nLiwgZG9pbmcgYSBsb25nIGp1bXApLgorCisKKzxwPgorVGhlIHBhbmljIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGVycm9yIG1lc3NhZ2UgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfY2FsbCI+PGNvZGU+bHVhX2NhbGw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0obmFyZ3MgKyAxKSwgK25yZXN1bHRzLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfY2FsbCAobHVhX1N0YXRlICpMLCBpbnQgbmFyZ3MsIGludCBucmVzdWx0cyk7PC9wcmU+CisKKzxwPgorQ2FsbHMgYSBmdW5jdGlvbi4KKworCis8cD4KK1RvIGNhbGwgYSBmdW5jdGlvbiB5b3UgbXVzdCB1c2UgdGhlIGZvbGxvd2luZyBwcm90b2NvbDoKK2ZpcnN0LCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGlzIHB1c2hlZCBvbnRvIHRoZSBzdGFjazsKK3RoZW4sIHRoZSBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uIGFyZSBwdXNoZWQKK2luIGRpcmVjdCBvcmRlcjsKK3RoYXQgaXMsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBwdXNoZWQgZmlyc3QuCitGaW5hbGx5IHlvdSBjYWxsIDxhIGhyZWY9IiNsdWFfY2FsbCI+PGNvZGU+bHVhX2NhbGw8L2NvZGU+PC9hPjsKKzxjb2RlPm5hcmdzPC9jb2RlPiBpcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHlvdSBwdXNoZWQgb250byB0aGUgc3RhY2suCitBbGwgYXJndW1lbnRzIGFuZCB0aGUgZnVuY3Rpb24gdmFsdWUgYXJlIHBvcHBlZCBmcm9tIHRoZSBzdGFjaword2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorVGhlIGZ1bmN0aW9uIHJlc3VsdHMgYXJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjayB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorVGhlIG51bWJlciBvZiByZXN1bHRzIGlzIGFkanVzdGVkIHRvIDxjb2RlPm5yZXN1bHRzPC9jb2RlPiwKK3VubGVzcyA8Y29kZT5ucmVzdWx0czwvY29kZT4gaXMgPGEgbmFtZT0icGRmLUxVQV9NVUxUUkVUIj48Y29kZT5MVUFfTVVMVFJFVDwvY29kZT48L2E+LgorSW4gdGhpcyBjYXNlLCA8ZW0+YWxsPC9lbT4gcmVzdWx0cyBmcm9tIHRoZSBmdW5jdGlvbiBhcmUgcHVzaGVkLgorTHVhIHRha2VzIGNhcmUgdGhhdCB0aGUgcmV0dXJuZWQgdmFsdWVzIGZpdCBpbnRvIHRoZSBzdGFjayBzcGFjZS4KK1RoZSBmdW5jdGlvbiByZXN1bHRzIGFyZSBwdXNoZWQgb250byB0aGUgc3RhY2sgaW4gZGlyZWN0IG9yZGVyCisodGhlIGZpcnN0IHJlc3VsdCBpcyBwdXNoZWQgZmlyc3QpLAorc28gdGhhdCBhZnRlciB0aGUgY2FsbCB0aGUgbGFzdCByZXN1bHQgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKKworPHA+CitBbnkgZXJyb3IgaW5zaWRlIHRoZSBjYWxsZWQgZnVuY3Rpb24gaXMgcHJvcGFnYXRlZCB1cHdhcmRzCisod2l0aCBhIDxjb2RlPmxvbmdqbXA8L2NvZGU+KS4KKworCis8cD4KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdGhlIGhvc3QgcHJvZ3JhbSBjYW4gZG8gdGhlCitlcXVpdmFsZW50IHRvIHRoaXMgTHVhIGNvZGU6CisKKzxwcmU+CisgICAgIGEgPSBmKCJob3ciLCB0LngsIDE0KQorPC9wcmU+PHA+CitIZXJlIGl0IGlzIGluJm5ic3A7QzoKKworPHByZT4KKyAgICAgbHVhX2dldGZpZWxkKEwsIExVQV9HTE9CQUxTSU5ERVgsICJmIik7IC8qIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCAqLworICAgICBsdWFfcHVzaHN0cmluZyhMLCAiaG93Iik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMXN0IGFyZ3VtZW50ICovCisgICAgIGx1YV9nZXRmaWVsZChMLCBMVUFfR0xPQkFMU0lOREVYLCAidCIpOyAgIC8qIHRhYmxlIHRvIGJlIGluZGV4ZWQgKi8KKyAgICAgbHVhX2dldGZpZWxkKEwsIC0xLCAieCIpOyAgICAgICAgLyogcHVzaCByZXN1bHQgb2YgdC54ICgybmQgYXJnKSAqLworICAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgJ3QnIGZyb20gdGhlIHN0YWNrICovCisgICAgIGx1YV9wdXNoaW50ZWdlcihMLCAxNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzcmQgYXJndW1lbnQgKi8KKyAgICAgbHVhX2NhbGwoTCwgMywgMSk7ICAgICAvKiBjYWxsICdmJyB3aXRoIDMgYXJndW1lbnRzIGFuZCAxIHJlc3VsdCAqLworICAgICBsdWFfc2V0ZmllbGQoTCwgTFVBX0dMT0JBTFNJTkRFWCwgImEiKTsgICAgICAgIC8qIHNldCBnbG9iYWwgJ2EnICovCis8L3ByZT48cD4KK05vdGUgdGhhdCB0aGUgY29kZSBhYm92ZSBpcyAiYmFsYW5jZWQiOgorYXQgaXRzIGVuZCwgdGhlIHN0YWNrIGlzIGJhY2sgdG8gaXRzIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24uCitUaGlzIGlzIGNvbnNpZGVyZWQgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9DRnVuY3Rpb24iPjxjb2RlPmx1YV9DRnVuY3Rpb248L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgaW50ICgqbHVhX0NGdW5jdGlvbikgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorVHlwZSBmb3IgQyZuYnNwO2Z1bmN0aW9ucy4KKworCis8cD4KK0luIG9yZGVyIHRvIGNvbW11bmljYXRlIHByb3Blcmx5IHdpdGggTHVhLAorYSBDJm5ic3A7ZnVuY3Rpb24gbXVzdCB1c2UgdGhlIGZvbGxvd2luZyBwcm90b2NvbCwKK3doaWNoIGRlZmluZXMgdGhlIHdheSBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzIGFyZSBwYXNzZWQ6CithIEMmbmJzcDtmdW5jdGlvbiByZWNlaXZlcyBpdHMgYXJndW1lbnRzIGZyb20gTHVhIGluIGl0cyBzdGFjaworaW4gZGlyZWN0IG9yZGVyICh0aGUgZmlyc3QgYXJndW1lbnQgaXMgcHVzaGVkIGZpcnN0KS4KK1NvLCB3aGVuIHRoZSBmdW5jdGlvbiBzdGFydHMsCis8Y29kZT5sdWFfZ2V0dG9wKEwpPC9jb2RlPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBmdW5jdGlvbi4KK1RoZSBmaXJzdCBhcmd1bWVudCAoaWYgYW55KSBpcyBhdCBpbmRleCAxCithbmQgaXRzIGxhc3QgYXJndW1lbnQgaXMgYXQgaW5kZXggPGNvZGU+bHVhX2dldHRvcChMKTwvY29kZT4uCitUbyByZXR1cm4gdmFsdWVzIHRvIEx1YSwgYSBDJm5ic3A7ZnVuY3Rpb24ganVzdCBwdXNoZXMgdGhlbSBvbnRvIHRoZSBzdGFjaywKK2luIGRpcmVjdCBvcmRlciAodGhlIGZpcnN0IHJlc3VsdCBpcyBwdXNoZWQgZmlyc3QpLAorYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiByZXN1bHRzLgorQW55IG90aGVyIHZhbHVlIGluIHRoZSBzdGFjayBiZWxvdyB0aGUgcmVzdWx0cyB3aWxsIGJlIHByb3Blcmx5CitkaXNjYXJkZWQgYnkgTHVhLgorTGlrZSBhIEx1YSBmdW5jdGlvbiwgYSBDJm5ic3A7ZnVuY3Rpb24gY2FsbGVkIGJ5IEx1YSBjYW4gYWxzbyByZXR1cm4KK21hbnkgcmVzdWx0cy4KKworCis8cD4KK0FzIGFuIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcmVjZWl2ZXMgYSB2YXJpYWJsZSBudW1iZXIKK29mIG51bWVyaWNhbCBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlaXIgYXZlcmFnZSBhbmQgc3VtOgorCis8cHJlPgorICAgICBzdGF0aWMgaW50IGZvbyAobHVhX1N0YXRlICpMKSB7CisgICAgICAgaW50IG4gPSBsdWFfZ2V0dG9wKEwpOyAgICAvKiBudW1iZXIgb2YgYXJndW1lbnRzICovCisgICAgICAgbHVhX051bWJlciBzdW0gPSAwOworICAgICAgIGludCBpOworICAgICAgIGZvciAoaSA9IDE7IGkgJmx0Oz0gbjsgaSsrKSB7CisgICAgICAgICBpZiAoIWx1YV9pc251bWJlcihMLCBpKSkgeworICAgICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCAiaW5jb3JyZWN0IGFyZ3VtZW50Iik7CisgICAgICAgICAgIGx1YV9lcnJvcihMKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHN1bSArPSBsdWFfdG9udW1iZXIoTCwgaSk7CisgICAgICAgfQorICAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHN1bS9uKTsgICAgICAgIC8qIGZpcnN0IHJlc3VsdCAqLworICAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHN1bSk7ICAgICAgICAgLyogc2Vjb25kIHJlc3VsdCAqLworICAgICAgIHJldHVybiAyOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVzdWx0cyAqLworICAgICB9Cis8L3ByZT4KKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfY2hlY2tzdGFjayI+PGNvZGU+bHVhX2NoZWNrc3RhY2s8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfY2hlY2tzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgZXh0cmEpOzwvcHJlPgorCis8cD4KK0Vuc3VyZXMgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgPGNvZGU+ZXh0cmE8L2NvZGU+IGZyZWUgc3RhY2sgc2xvdHMgaW4gdGhlIHN0YWNrLgorSXQgcmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgZ3JvdyB0aGUgc3RhY2sgdG8gdGhhdCBzaXplLgorVGhpcyBmdW5jdGlvbiBuZXZlciBzaHJpbmtzIHRoZSBzdGFjazsKK2lmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGxhcmdlciB0aGFuIHRoZSBuZXcgc2l6ZSwKK2l0IGlzIGxlZnQgdW5jaGFuZ2VkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2Nsb3NlIj48Y29kZT5sdWFfY2xvc2U8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX2Nsb3NlIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK0Rlc3Ryb3lzIGFsbCBvYmplY3RzIGluIHRoZSBnaXZlbiBMdWEgc3RhdGUKKyhjYWxsaW5nIHRoZSBjb3JyZXNwb25kaW5nIGdhcmJhZ2UtY29sbGVjdGlvbiBtZXRhbWV0aG9kcywgaWYgYW55KQorYW5kIGZyZWVzIGFsbCBkeW5hbWljIG1lbW9yeSB1c2VkIGJ5IHRoaXMgc3RhdGUuCitPbiBzZXZlcmFsIHBsYXRmb3JtcywgeW91IG1heSBub3QgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24sCitiZWNhdXNlIGFsbCByZXNvdXJjZXMgYXJlIG5hdHVyYWxseSByZWxlYXNlZCB3aGVuIHRoZSBob3N0IHByb2dyYW0gZW5kcy4KK09uIHRoZSBvdGhlciBoYW5kLCBsb25nLXJ1bm5pbmcgcHJvZ3JhbXMsCitzdWNoIGFzIGEgZGFlbW9uIG9yIGEgd2ViIHNlcnZlciwKK21pZ2h0IG5lZWQgdG8gcmVsZWFzZSBzdGF0ZXMgYXMgc29vbiBhcyB0aGV5IGFyZSBub3QgbmVlZGVkLAordG8gYXZvaWQgZ3Jvd2luZyB0b28gbGFyZ2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfY29uY2F0Ij48Y29kZT5sdWFfY29uY2F0PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstbiwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9jb25jYXQgKGx1YV9TdGF0ZSAqTCwgaW50IG4pOzwvcHJlPgorCis8cD4KK0NvbmNhdGVuYXRlcyB0aGUgPGNvZGU+bjwvY29kZT4gdmFsdWVzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLAorcG9wcyB0aGVtLCBhbmQgbGVhdmVzIHRoZSByZXN1bHQgYXQgdGhlIHRvcC4KK0lmIDxjb2RlPm48L2NvZGU+Jm5ic3A7aXMmbmJzcDsxLCB0aGUgcmVzdWx0IGlzIHRoZSBzaW5nbGUgdmFsdWUgb24gdGhlIHN0YWNrCisodGhhdCBpcywgdGhlIGZ1bmN0aW9uIGRvZXMgbm90aGluZyk7CitpZiA8Y29kZT5uPC9jb2RlPiBpcyAwLCB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuCitDb25jYXRlbmF0aW9uIGlzIHBlcmZvcm1lZCBmb2xsb3dpbmcgdGhlIHVzdWFsIHNlbWFudGljcyBvZiBMdWEKKyhzZWUgPGEgaHJlZj0iIzIuNS40Ij4mc2VjdDsyLjUuNDwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2NwY2FsbCI+PGNvZGU+bHVhX2NwY2FsbDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsoMHwxKSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfY3BjYWxsIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gZnVuYywgdm9pZCAqdWQpOzwvcHJlPgorCis8cD4KK0NhbGxzIHRoZSBDJm5ic3A7ZnVuY3Rpb24gPGNvZGU+ZnVuYzwvY29kZT4gaW4gcHJvdGVjdGVkIG1vZGUuCis8Y29kZT5mdW5jPC9jb2RlPiBzdGFydHMgd2l0aCBvbmx5IG9uZSBlbGVtZW50IGluIGl0cyBzdGFjaywKK2EgbGlnaHQgdXNlcmRhdGEgY29udGFpbmluZyA8Y29kZT51ZDwvY29kZT4uCitJbiBjYXNlIG9mIGVycm9ycywKKzxhIGhyZWY9IiNsdWFfY3BjYWxsIj48Y29kZT5sdWFfY3BjYWxsPC9jb2RlPjwvYT4gcmV0dXJucyB0aGUgc2FtZSBlcnJvciBjb2RlcyBhcyA8YSBocmVmPSIjbHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPiwKK3BsdXMgdGhlIGVycm9yIG9iamVjdCBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjazsKK290aGVyd2lzZSwgaXQgcmV0dXJucyB6ZXJvLCBhbmQgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGFjay4KK0FsbCB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+ZnVuYzwvY29kZT4gYXJlIGRpc2NhcmRlZC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9jcmVhdGV0YWJsZSI+PGNvZGU+bHVhX2NyZWF0ZXRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9jcmVhdGV0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgbmFyciwgaW50IG5yZWMpOzwvcHJlPgorCis8cD4KK0NyZWF0ZXMgYSBuZXcgZW1wdHkgdGFibGUgYW5kIHB1c2hlcyBpdCBvbnRvIHRoZSBzdGFjay4KK1RoZSBuZXcgdGFibGUgaGFzIHNwYWNlIHByZS1hbGxvY2F0ZWQKK2ZvciA8Y29kZT5uYXJyPC9jb2RlPiBhcnJheSBlbGVtZW50cyBhbmQgPGNvZGU+bnJlYzwvY29kZT4gbm9uLWFycmF5IGVsZW1lbnRzLgorVGhpcyBwcmUtYWxsb2NhdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Uga25vdyBleGFjdGx5IGhvdyBtYW55IGVsZW1lbnRzCit0aGUgdGFibGUgd2lsbCBoYXZlLgorT3RoZXJ3aXNlIHlvdSBjYW4gdXNlIHRoZSBmdW5jdGlvbiA8YSBocmVmPSIjbHVhX25ld3RhYmxlIj48Y29kZT5sdWFfbmV3dGFibGU8L2NvZGU+PC9hPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9kdW1wIj48Y29kZT5sdWFfZHVtcDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9kdW1wIChsdWFfU3RhdGUgKkwsIGx1YV9Xcml0ZXIgd3JpdGVyLCB2b2lkICpkYXRhKTs8L3ByZT4KKworPHA+CitEdW1wcyBhIGZ1bmN0aW9uIGFzIGEgYmluYXJ5IGNodW5rLgorUmVjZWl2ZXMgYSBMdWEgZnVuY3Rpb24gb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sKK2FuZCBwcm9kdWNlcyBhIGJpbmFyeSBjaHVuayB0aGF0LAoraWYgbG9hZGVkIGFnYWluLAorcmVzdWx0cyBpbiBhIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBkdW1wZWQuCitBcyBpdCBwcm9kdWNlcyBwYXJ0cyBvZiB0aGUgY2h1bmssCis8YSBocmVmPSIjbHVhX2R1bXAiPjxjb2RlPmx1YV9kdW1wPC9jb2RlPjwvYT4gY2FsbHMgZnVuY3Rpb24gPGNvZGU+d3JpdGVyPC9jb2RlPiAoc2VlIDxhIGhyZWY9IiNsdWFfV3JpdGVyIj48Y29kZT5sdWFfV3JpdGVyPC9jb2RlPjwvYT4pCit3aXRoIHRoZSBnaXZlbiA8Y29kZT5kYXRhPC9jb2RlPgordG8gd3JpdGUgdGhlbS4KKworCis8cD4KK1RoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgbGFzdAorY2FsbCB0byB0aGUgd3JpdGVyOworMCZuYnNwO21lYW5zIG5vIGVycm9ycy4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgcG9wIHRoZSBMdWEgZnVuY3Rpb24gZnJvbSB0aGUgc3RhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZXF1YWwiPjxjb2RlPmx1YV9lcXVhbDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9lcXVhbCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHR3byB2YWx1ZXMgaW4gYWNjZXB0YWJsZSBpbmRpY2VzIDxjb2RlPmluZGV4MTwvY29kZT4gYW5kCis8Y29kZT5pbmRleDI8L2NvZGU+IGFyZSBlcXVhbCwKK2ZvbGxvd2luZyB0aGUgc2VtYW50aWNzIG9mIHRoZSBMdWEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yCisodGhhdCBpcywgbWF5IGNhbGwgbWV0YW1ldGhvZHMpLgorT3RoZXJ3aXNlIHJldHVybnMmbmJzcDswLgorQWxzbyByZXR1cm5zJm5ic3A7MCBpZiBhbnkgb2YgdGhlIGluZGljZXMgaXMgbm9uIHZhbGlkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2Vycm9yIj48Y29kZT5sdWFfZXJyb3I8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfZXJyb3IgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorR2VuZXJhdGVzIGEgTHVhIGVycm9yLgorVGhlIGVycm9yIG1lc3NhZ2UgKHdoaWNoIGNhbiBhY3R1YWxseSBiZSBhIEx1YSB2YWx1ZSBvZiBhbnkgdHlwZSkKK211c3QgYmUgb24gdGhlIHN0YWNrIHRvcC4KK1RoaXMgZnVuY3Rpb24gZG9lcyBhIGxvbmcganVtcCwKK2FuZCB0aGVyZWZvcmUgbmV2ZXIgcmV0dXJucy4KKyhzZWUgPGEgaHJlZj0iI2x1YUxfZXJyb3IiPjxjb2RlPmx1YUxfZXJyb3I8L2NvZGU+PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2MiPjxjb2RlPmx1YV9nYzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nYyAobHVhX1N0YXRlICpMLCBpbnQgd2hhdCwgaW50IGRhdGEpOzwvcHJlPgorCis8cD4KK0NvbnRyb2xzIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcGVyZm9ybXMgc2V2ZXJhbCB0YXNrcywKK2FjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciA8Y29kZT53aGF0PC9jb2RlPjoKKworPHVsPgorCis8bGk+PGI+PGNvZGU+TFVBX0dDU1RPUDwvY29kZT46PC9iPgorc3RvcHMgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorPC9saT4KKworPGxpPjxiPjxjb2RlPkxVQV9HQ1JFU1RBUlQ8L2NvZGU+OjwvYj4KK3Jlc3RhcnRzIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5MVUFfR0NDT0xMRUNUPC9jb2RlPjo8L2I+CitwZXJmb3JtcyBhIGZ1bGwgZ2FyYmFnZS1jb2xsZWN0aW9uIGN5Y2xlLgorPC9saT4KKworPGxpPjxiPjxjb2RlPkxVQV9HQ0NPVU5UPC9jb2RlPjo8L2I+CityZXR1cm5zIHRoZSBjdXJyZW50IGFtb3VudCBvZiBtZW1vcnkgKGluIEtieXRlcykgaW4gdXNlIGJ5IEx1YS4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5MVUFfR0NDT1VOVEI8L2NvZGU+OjwvYj4KK3JldHVybnMgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgY3VycmVudCBhbW91bnQgb2YgYnl0ZXMgb2YKK21lbW9yeSBpbiB1c2UgYnkgTHVhIGJ5IDEwMjQuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+TFVBX0dDU1RFUDwvY29kZT46PC9iPgorcGVyZm9ybXMgYW4gaW5jcmVtZW50YWwgc3RlcCBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uCitUaGUgc3RlcCAic2l6ZSIgaXMgY29udHJvbGxlZCBieSA8Y29kZT5kYXRhPC9jb2RlPgorKGxhcmdlciB2YWx1ZXMgbWVhbiBtb3JlIHN0ZXBzKSBpbiBhIG5vbi1zcGVjaWZpZWQgd2F5LgorSWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgc3RlcCBzaXplCit5b3UgbXVzdCBleHBlcmltZW50YWxseSB0dW5lIHRoZSB2YWx1ZSBvZiA8Y29kZT5kYXRhPC9jb2RlPi4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlIHN0ZXAgZmluaXNoZWQgYQorZ2FyYmFnZS1jb2xsZWN0aW9uIGN5Y2xlLgorPC9saT4KKworPGxpPjxiPjxjb2RlPkxVQV9HQ1NFVFBBVVNFPC9jb2RlPjo8L2I+CitzZXRzIDxjb2RlPmRhdGE8L2NvZGU+IGFzIHRoZSBuZXcgdmFsdWUKK2ZvciB0aGUgPGVtPnBhdXNlPC9lbT4gb2YgdGhlIGNvbGxlY3RvciAoc2VlIDxhIGhyZWY9IiMyLjEwIj4mc2VjdDsyLjEwPC9hPikuCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHBhdXNlLgorPC9saT4KKworPGxpPjxiPjxjb2RlPkxVQV9HQ1NFVFNURVBNVUw8L2NvZGU+OjwvYj4KK3NldHMgPGNvZGU+ZGF0YTwvY29kZT4gYXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIDxlbT5zdGVwIG11bHRpcGxpZXI8L2VtPiBvZgordGhlIGNvbGxlY3RvciAoc2VlIDxhIGhyZWY9IiMyLjEwIj4mc2VjdDsyLjEwPC9hPikuCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHN0ZXAgbXVsdGlwbGllci4KKzwvbGk+CisKKzwvdWw+CisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGFsbG9jZiI+PGNvZGU+bHVhX2dldGFsbG9jZjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX0FsbG9jIGx1YV9nZXRhbGxvY2YgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqKnVkKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIHRoZSBtZW1vcnktYWxsb2NhdGlvbiBmdW5jdGlvbiBvZiBhIGdpdmVuIHN0YXRlLgorSWYgPGNvZGU+dWQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgTHVhIHN0b3JlcyBpbiA8Y29kZT4qdWQ8L2NvZGU+IHRoZQorb3BhcXVlIHBvaW50ZXIgcGFzc2VkIHRvIDxhIGhyZWY9IiNsdWFfbmV3c3RhdGUiPjxjb2RlPmx1YV9uZXdzdGF0ZTwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGZlbnYiPjxjb2RlPmx1YV9nZXRmZW52PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9nZXRmZW52IChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSBlbnZpcm9ubWVudCB0YWJsZSBvZgordGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXRmaWVsZCI+PGNvZGU+bHVhX2dldGZpZWxkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9nZXRmaWVsZCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmspOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgdmFsdWUgPGNvZGU+dFtrXTwvY29kZT4sCit3aGVyZSA8Y29kZT50PC9jb2RlPiBpcyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHZhbGlkIGluZGV4LgorQXMgaW4gTHVhLCB0aGlzIGZ1bmN0aW9uIG1heSB0cmlnZ2VyIGEgbWV0YW1ldGhvZAorZm9yIHRoZSAiaW5kZXgiIGV2ZW50IChzZWUgPGEgaHJlZj0iIzIuOCI+JnNlY3Q7Mi44PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0Z2xvYmFsIj48Y29kZT5sdWFfZ2V0Z2xvYmFsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9nZXRnbG9iYWwgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSk7PC9wcmU+CisKKzxwPgorUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsIDxjb2RlPm5hbWU8L2NvZGU+LgorSXQgaXMgZGVmaW5lZCBhcyBhIG1hY3JvOgorCis8cHJlPgorICAgICAjZGVmaW5lIGx1YV9nZXRnbG9iYWwoTCxzKSAgbHVhX2dldGZpZWxkKEwsIExVQV9HTE9CQUxTSU5ERVgsIHMpCis8L3ByZT4KKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0bWV0YXRhYmxlIj48Y29kZT5sdWFfZ2V0bWV0YXRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKygwfDEpLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nZXRtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitQdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIG1ldGF0YWJsZSBvZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuCithY2NlcHRhYmxlIGluZGV4LgorSWYgdGhlIGluZGV4IGlzIG5vdCB2YWxpZCwKK29yIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBoYXZlIGEgbWV0YXRhYmxlLAordGhlIGZ1bmN0aW9uIHJldHVybnMmbmJzcDswIGFuZCBwdXNoZXMgbm90aGluZyBvbiB0aGUgc3RhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0dGFibGUiPjxjb2RlPmx1YV9nZXR0YWJsZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfZ2V0dGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitQdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIHZhbHVlIDxjb2RlPnRba108L2NvZGU+LAord2hlcmUgPGNvZGU+dDwvY29kZT4gaXMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiB2YWxpZCBpbmRleAorYW5kIDxjb2RlPms8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcG9wcyB0aGUga2V5IGZyb20gdGhlIHN0YWNrCisocHV0dGluZyB0aGUgcmVzdWx0aW5nIHZhbHVlIGluIGl0cyBwbGFjZSkuCitBcyBpbiBMdWEsIHRoaXMgZnVuY3Rpb24gbWF5IHRyaWdnZXIgYSBtZXRhbWV0aG9kCitmb3IgdGhlICJpbmRleCIgZXZlbnQgKHNlZSA8YSBocmVmPSIjMi44Ij4mc2VjdDsyLjg8L2E+KS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXR0b3AiPjxjb2RlPmx1YV9nZXR0b3A8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfZ2V0dG9wIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0b3AgZWxlbWVudCBpbiB0aGUgc3RhY2suCitCZWNhdXNlIGluZGljZXMgc3RhcnQgYXQmbmJzcDsxLAordGhpcyByZXN1bHQgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3RhY2sKKyhhbmQgc28gMCZuYnNwO21lYW5zIGFuIGVtcHR5IHN0YWNrKS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9pbnNlcnQiPjxjb2RlPmx1YV9pbnNlcnQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX2luc2VydCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK01vdmVzIHRoZSB0b3AgZWxlbWVudCBpbnRvIHRoZSBnaXZlbiB2YWxpZCBpbmRleCwKK3NoaWZ0aW5nIHVwIHRoZSBlbGVtZW50cyBhYm92ZSB0aGlzIGluZGV4IHRvIG9wZW4gc3BhY2UuCitDYW5ub3QgYmUgY2FsbGVkIHdpdGggYSBwc2V1ZG8taW5kZXgsCitiZWNhdXNlIGEgcHNldWRvLWluZGV4IGlzIG5vdCBhbiBhY3R1YWwgc3RhY2sgcG9zaXRpb24uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfSW50ZWdlciI+PGNvZGU+bHVhX0ludGVnZXI8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgcHRyZGlmZl90IGx1YV9JbnRlZ2VyOzwvcHJlPgorCis8cD4KK1RoZSB0eXBlIHVzZWQgYnkgdGhlIEx1YSBBUEkgdG8gcmVwcmVzZW50IGludGVncmFsIHZhbHVlcy4KKworCis8cD4KK0J5IGRlZmF1bHQgaXQgaXMgYSA8Y29kZT5wdHJkaWZmX3Q8L2NvZGU+LAord2hpY2ggaXMgdXN1YWxseSB0aGUgbGFyZ2VzdCBzaWduZWQgaW50ZWdyYWwgdHlwZSB0aGUgbWFjaGluZSBoYW5kbGVzCisiY29tZm9ydGFibHkiLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzYm9vbGVhbiI+PGNvZGU+bHVhX2lzYm9vbGVhbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc2Jvb2xlYW4gKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4IGhhcyB0eXBlIGJvb2xlYW4sCithbmQgMCZuYnNwO290aGVyd2lzZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9pc2NmdW5jdGlvbiI+PGNvZGU+bHVhX2lzY2Z1bmN0aW9uPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX2lzY2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gYWNjZXB0YWJsZSBpbmRleCBpcyBhIEMmbmJzcDtmdW5jdGlvbiwKK2FuZCAwJm5ic3A7b3RoZXJ3aXNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzZnVuY3Rpb24iPjxjb2RlPmx1YV9pc2Z1bmN0aW9uPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX2lzZnVuY3Rpb24gKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4IGlzIGEgZnVuY3Rpb24KKyhlaXRoZXIgQyBvciBMdWEpLCBhbmQgMCZuYnNwO290aGVyd2lzZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9pc2xpZ2h0dXNlcmRhdGEiPjxjb2RlPmx1YV9pc2xpZ2h0dXNlcmRhdGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfaXNsaWdodHVzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gYWNjZXB0YWJsZSBpbmRleCBpcyBhIGxpZ2h0IHVzZXJkYXRhLAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNuaWwiPjxjb2RlPmx1YV9pc25pbDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc25pbCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggaXMgPGI+bmlsPC9iPiwKK2FuZCAwJm5ic3A7b3RoZXJ3aXNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzbm9uZSI+PGNvZGU+bHVhX2lzbm9uZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc25vbmUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggaXMgbm90IHZhbGlkCisodGhhdCBpcywgaXQgcmVmZXJzIHRvIGFuIGVsZW1lbnQgb3V0c2lkZSB0aGUgY3VycmVudCBzdGFjayksCithbmQgMCZuYnNwO290aGVyd2lzZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9pc25vbmVvcm5pbCI+PGNvZGU+bHVhX2lzbm9uZW9ybmlsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX2lzbm9uZW9ybmlsIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyAxIGlmIHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4IGlzIG5vdCB2YWxpZAorKHRoYXQgaXMsIGl0IHJlZmVycyB0byBhbiBlbGVtZW50IG91dHNpZGUgdGhlIGN1cnJlbnQgc3RhY2spCitvciBpZiB0aGUgdmFsdWUgYXQgdGhpcyBpbmRleCBpcyA8Yj5uaWw8L2I+LAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNudW1iZXIiPjxjb2RlPmx1YV9pc251bWJlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc251bWJlciAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggaXMgYSBudW1iZXIKK29yIGEgc3RyaW5nIGNvbnZlcnRpYmxlIHRvIGEgbnVtYmVyLAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNzdHJpbmciPjxjb2RlPmx1YV9pc3N0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc3N0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggaXMgYSBzdHJpbmcKK29yIGEgbnVtYmVyICh3aGljaCBpcyBhbHdheXMgY29udmVydGlibGUgdG8gYSBzdHJpbmcpLAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXN0YWJsZSI+PGNvZGU+bHVhX2lzdGFibGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfaXN0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggaXMgYSB0YWJsZSwKK2FuZCAwJm5ic3A7b3RoZXJ3aXNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzdGhyZWFkIj48Y29kZT5sdWFfaXN0aHJlYWQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfaXN0aHJlYWQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4IGlzIGEgdGhyZWFkLAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXN1c2VyZGF0YSI+PGNvZGU+bHVhX2lzdXNlcmRhdGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfaXN1c2VyZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggaXMgYSB1c2VyZGF0YQorKGVpdGhlciBmdWxsIG9yIGxpZ2h0KSwgYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfbGVzc3RoYW4iPjxjb2RlPmx1YV9sZXNzdGhhbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9sZXNzdGhhbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IGFjY2VwdGFibGUgaW5kZXggPGNvZGU+aW5kZXgxPC9jb2RlPiBpcyBzbWFsbGVyCit0aGFuIHRoZSB2YWx1ZSBhdCBhY2NlcHRhYmxlIGluZGV4IDxjb2RlPmluZGV4MjwvY29kZT4sCitmb2xsb3dpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUgTHVhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yCisodGhhdCBpcywgbWF5IGNhbGwgbWV0YW1ldGhvZHMpLgorT3RoZXJ3aXNlIHJldHVybnMmbmJzcDswLgorQWxzbyByZXR1cm5zJm5ic3A7MCBpZiBhbnkgb2YgdGhlIGluZGljZXMgaXMgbm9uIHZhbGlkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX2xvYWQgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgbHVhX1JlYWRlciByZWFkZXIsCisgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNodW5rbmFtZSk7PC9wcmU+CisKKzxwPgorTG9hZHMgYSBMdWEgY2h1bmsuCitJZiB0aGVyZSBhcmUgbm8gZXJyb3JzLAorPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+IHB1c2hlcyB0aGUgY29tcGlsZWQgY2h1bmsgYXMgYSBMdWEKK2Z1bmN0aW9uIG9uIHRvcCBvZiB0aGUgc3RhY2suCitPdGhlcndpc2UsIGl0IHB1c2hlcyBhbiBlcnJvciBtZXNzYWdlLgorVGhlIHJldHVybiB2YWx1ZXMgb2YgPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+IGFyZToKKworPHVsPgorCis8bGk+PGI+MDo8L2I+IG5vIGVycm9yczs8L2xpPgorCis8bGk+PGI+PGEgbmFtZT0icGRmLUxVQV9FUlJTWU5UQVgiPjxjb2RlPkxVQV9FUlJTWU5UQVg8L2NvZGU+PC9hPjo8L2I+CitzeW50YXggZXJyb3IgZHVyaW5nIHByZS1jb21waWxhdGlvbjs8L2xpPgorCis8bGk+PGI+PGEgaHJlZj0iI3BkZi1MVUFfRVJSTUVNIj48Y29kZT5MVUFfRVJSTUVNPC9jb2RlPjwvYT46PC9iPgorbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuPC9saT4KKworPC91bD4KKworPHA+CitUaGlzIGZ1bmN0aW9uIG9ubHkgbG9hZHMgYSBjaHVuazsKK2l0IGRvZXMgbm90IHJ1biBpdC4KKworCis8cD4KKzxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPiBhdXRvbWF0aWNhbGx5IGRldGVjdHMgd2hldGhlciB0aGUgY2h1bmsgaXMgdGV4dCBvciBiaW5hcnksCithbmQgbG9hZHMgaXQgYWNjb3JkaW5nbHkgKHNlZSBwcm9ncmFtIDxjb2RlPmx1YWM8L2NvZGU+KS4KKworCis8cD4KK1RoZSA8YSBocmVmPSIjbHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT4gZnVuY3Rpb24gdXNlcyBhIHVzZXItc3VwcGxpZWQgPGNvZGU+cmVhZGVyPC9jb2RlPiBmdW5jdGlvbgordG8gcmVhZCB0aGUgY2h1bmsgKHNlZSA8YSBocmVmPSIjbHVhX1JlYWRlciI+PGNvZGU+bHVhX1JlYWRlcjwvY29kZT48L2E+KS4KK1RoZSA8Y29kZT5kYXRhPC9jb2RlPiBhcmd1bWVudCBpcyBhbiBvcGFxdWUgdmFsdWUgcGFzc2VkIHRvIHRoZSByZWFkZXIgZnVuY3Rpb24uCisKKworPHA+CitUaGUgPGNvZGU+Y2h1bmtuYW1lPC9jb2RlPiBhcmd1bWVudCBnaXZlcyBhIG5hbWUgdG8gdGhlIGNodW5rLAord2hpY2ggaXMgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIGluIGRlYnVnIGluZm9ybWF0aW9uIChzZWUgPGEgaHJlZj0iIzMuOCI+JnNlY3Q7My44PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfbmV3c3RhdGUiPjxjb2RlPmx1YV9uZXdzdGF0ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX1N0YXRlICpsdWFfbmV3c3RhdGUgKGx1YV9BbGxvYyBmLCB2b2lkICp1ZCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhIG5ldywgaW5kZXBlbmRlbnQgc3RhdGUuCitSZXR1cm5zIDxjb2RlPk5VTEw8L2NvZGU+IGlmIGNhbm5vdCBjcmVhdGUgdGhlIHN0YXRlCisoZHVlIHRvIGxhY2sgb2YgbWVtb3J5KS4KK1RoZSBhcmd1bWVudCA8Y29kZT5mPC9jb2RlPiBpcyB0aGUgYWxsb2NhdG9yIGZ1bmN0aW9uOworTHVhIGRvZXMgYWxsIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGlzIHN0YXRlIHRocm91Z2ggdGhpcyBmdW5jdGlvbi4KK1RoZSBzZWNvbmQgYXJndW1lbnQsIDxjb2RlPnVkPC9jb2RlPiwgaXMgYW4gb3BhcXVlIHBvaW50ZXIgdGhhdCBMdWEKK3NpbXBseSBwYXNzZXMgdG8gdGhlIGFsbG9jYXRvciBpbiBldmVyeSBjYWxsLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX25ld3RhYmxlIj48Y29kZT5sdWFfbmV3dGFibGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX25ld3RhYmxlIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK0NyZWF0ZXMgYSBuZXcgZW1wdHkgdGFibGUgYW5kIHB1c2hlcyBpdCBvbnRvIHRoZSBzdGFjay4KK0l0IGlzIGVxdWl2YWxlbnQgdG8gPGNvZGU+bHVhX2NyZWF0ZXRhYmxlKEwsIDAsIDApPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9uZXd0aHJlYWQiPjxjb2RlPmx1YV9uZXd0aHJlYWQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9TdGF0ZSAqbHVhX25ld3RocmVhZCAobHVhX1N0YXRlICpMKTs8L3ByZT4KKworPHA+CitDcmVhdGVzIGEgbmV3IHRocmVhZCwgcHVzaGVzIGl0IG9uIHRoZSBzdGFjaywKK2FuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhIDxhIGhyZWY9IiNsdWFfU3RhdGUiPjxjb2RlPmx1YV9TdGF0ZTwvY29kZT48L2E+IHRoYXQgcmVwcmVzZW50cyB0aGlzIG5ldyB0aHJlYWQuCitUaGUgbmV3IHN0YXRlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gc2hhcmVzIHdpdGggdGhlIG9yaWdpbmFsIHN0YXRlCithbGwgZ2xvYmFsIG9iamVjdHMgKHN1Y2ggYXMgdGFibGVzKSwKK2J1dCBoYXMgYW4gaW5kZXBlbmRlbnQgZXhlY3V0aW9uIHN0YWNrLgorCisKKzxwPgorVGhlcmUgaXMgbm8gZXhwbGljaXQgZnVuY3Rpb24gdG8gY2xvc2Ugb3IgdG8gZGVzdHJveSBhIHRocmVhZC4KK1RocmVhZHMgYXJlIHN1YmplY3QgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLAorbGlrZSBhbnkgTHVhIG9iamVjdC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9uZXd1c2VyZGF0YSI+PGNvZGU+bHVhX25ld3VzZXJkYXRhPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkICpsdWFfbmV3dXNlcmRhdGEgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHNpemUpOzwvcHJlPgorCis8cD4KK1RoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbmV3IGJsb2NrIG9mIG1lbW9yeSB3aXRoIHRoZSBnaXZlbiBzaXplLAorcHVzaGVzIG9udG8gdGhlIHN0YWNrIGEgbmV3IGZ1bGwgdXNlcmRhdGEgd2l0aCB0aGUgYmxvY2sgYWRkcmVzcywKK2FuZCByZXR1cm5zIHRoaXMgYWRkcmVzcy4KKworCis8cD4KK1VzZXJkYXRhIHJlcHJlc2VudCBDJm5ic3A7dmFsdWVzIGluIEx1YS4KK0EgPGVtPmZ1bGwgdXNlcmRhdGE8L2VtPiByZXByZXNlbnRzIGEgYmxvY2sgb2YgbWVtb3J5LgorSXQgaXMgYW4gb2JqZWN0IChsaWtlIGEgdGFibGUpOgoreW91IG11c3QgY3JlYXRlIGl0LCBpdCBjYW4gaGF2ZSBpdHMgb3duIG1ldGF0YWJsZSwKK2FuZCB5b3UgY2FuIGRldGVjdCB3aGVuIGl0IGlzIGJlaW5nIGNvbGxlY3RlZC4KK0EgZnVsbCB1c2VyZGF0YSBpcyBvbmx5IGVxdWFsIHRvIGl0c2VsZiAodW5kZXIgcmF3IGVxdWFsaXR5KS4KKworCis8cD4KK1doZW4gTHVhIGNvbGxlY3RzIGEgZnVsbCB1c2VyZGF0YSB3aXRoIGEgPGNvZGU+Z2M8L2NvZGU+IG1ldGFtZXRob2QsCitMdWEgY2FsbHMgdGhlIG1ldGFtZXRob2QgYW5kIG1hcmtzIHRoZSB1c2VyZGF0YSBhcyBmaW5hbGl6ZWQuCitXaGVuIHRoaXMgdXNlcmRhdGEgaXMgY29sbGVjdGVkIGFnYWluIHRoZW4KK0x1YSBmcmVlcyBpdHMgY29ycmVzcG9uZGluZyBtZW1vcnkuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfbmV4dCI+PGNvZGU+bHVhX25leHQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArKDJ8MCksIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX25leHQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitQb3BzIGEga2V5IGZyb20gdGhlIHN0YWNrLAorYW5kIHB1c2hlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleAorKHRoZSAibmV4dCIgcGFpciBhZnRlciB0aGUgZ2l2ZW4ga2V5KS4KK0lmIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzIGluIHRoZSB0YWJsZSwKK3RoZW4gPGEgaHJlZj0iI2x1YV9uZXh0Ij48Y29kZT5sdWFfbmV4dDwvY29kZT48L2E+IHJldHVybnMgMCAoYW5kIHB1c2hlcyBub3RoaW5nKS4KKworCis8cD4KK0EgdHlwaWNhbCB0cmF2ZXJzYWwgbG9va3MgbGlrZSB0aGlzOgorCis8cHJlPgorICAgICAvKiB0YWJsZSBpcyBpbiB0aGUgc3RhY2sgYXQgaW5kZXggJ3QnICovCisgICAgIGx1YV9wdXNobmlsKEwpOyAgLyogZmlyc3Qga2V5ICovCisgICAgIHdoaWxlIChsdWFfbmV4dChMLCB0KSAhPSAwKSB7CisgICAgICAgLyogdXNlcyAna2V5JyAoYXQgaW5kZXggLTIpIGFuZCAndmFsdWUnIChhdCBpbmRleCAtMSkgKi8KKyAgICAgICBwcmludGYoIiVzIC0gJXNcbiIsCisgICAgICAgICAgICAgIGx1YV90eXBlbmFtZShMLCBsdWFfdHlwZShMLCAtMikpLAorICAgICAgICAgICAgICBsdWFfdHlwZW5hbWUoTCwgbHVhX3R5cGUoTCwgLTEpKSk7CisgICAgICAgLyogcmVtb3ZlcyAndmFsdWUnOyBrZWVwcyAna2V5JyBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKyAgICAgICBsdWFfcG9wKEwsIDEpOworICAgICB9Cis8L3ByZT4KKworPHA+CitXaGlsZSB0cmF2ZXJzaW5nIGEgdGFibGUsCitkbyBub3QgY2FsbCA8YSBocmVmPSIjbHVhX3RvbHN0cmluZyI+PGNvZGU+bHVhX3RvbHN0cmluZzwvY29kZT48L2E+IGRpcmVjdGx5IG9uIGEga2V5LAordW5sZXNzIHlvdSBrbm93IHRoYXQgdGhlIGtleSBpcyBhY3R1YWxseSBhIHN0cmluZy4KK1JlY2FsbCB0aGF0IDxhIGhyZWY9IiNsdWFfdG9sc3RyaW5nIj48Y29kZT5sdWFfdG9sc3RyaW5nPC9jb2RlPjwvYT4gPGVtPmNoYW5nZXM8L2VtPgordGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleDsKK3RoaXMgY29uZnVzZXMgdGhlIG5leHQgY2FsbCB0byA8YSBocmVmPSIjbHVhX25leHQiPjxjb2RlPmx1YV9uZXh0PC9jb2RlPjwvYT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfTnVtYmVyIj48Y29kZT5sdWFfTnVtYmVyPC9jb2RlPjwvYT48L2gzPgorPHByZT50eXBlZGVmIGRvdWJsZSBsdWFfTnVtYmVyOzwvcHJlPgorCis8cD4KK1RoZSB0eXBlIG9mIG51bWJlcnMgaW4gTHVhLgorQnkgZGVmYXVsdCwgaXQgaXMgZG91YmxlLCBidXQgdGhhdCBjYW4gYmUgY2hhbmdlZCBpbiA8Y29kZT5sdWFjb25mLmg8L2NvZGU+LgorCisKKzxwPgorVGhyb3VnaCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHlvdSBjYW4gY2hhbmdlCitMdWEgdG8gb3BlcmF0ZSB3aXRoIGFub3RoZXIgdHlwZSBmb3IgbnVtYmVycyAoZS5nLiwgZmxvYXQgb3IgbG9uZykuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfb2JqbGVuIj48Y29kZT5sdWFfb2JqbGVuPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5zaXplX3QgbHVhX29iamxlbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlICJsZW5ndGgiIG9mIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gYWNjZXB0YWJsZSBpbmRleDoKK2ZvciBzdHJpbmdzLCB0aGlzIGlzIHRoZSBzdHJpbmcgbGVuZ3RoOworZm9yIHRhYmxlcywgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBsZW5ndGggb3BlcmF0b3IgKCc8Y29kZT4jPC9jb2RlPicpOworZm9yIHVzZXJkYXRhLCB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBibG9jayBvZiBtZW1vcnkgYWxsb2NhdGVkCitmb3IgdGhlIHVzZXJkYXRhOworZm9yIG90aGVyIHZhbHVlcywgaXQgaXMmbmJzcDswLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0obmFyZ3MgKyAxKSwgKyhucmVzdWx0c3wxKSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfcGNhbGwgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmdzLCBpbnQgbnJlc3VsdHMsIGludCBlcnJmdW5jKTs8L3ByZT4KKworPHA+CitDYWxscyBhIGZ1bmN0aW9uIGluIHByb3RlY3RlZCBtb2RlLgorCisKKzxwPgorQm90aCA8Y29kZT5uYXJnczwvY29kZT4gYW5kIDxjb2RlPm5yZXN1bHRzPC9jb2RlPiBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMKK2luIDxhIGhyZWY9IiNsdWFfY2FsbCI+PGNvZGU+bHVhX2NhbGw8L2NvZGU+PC9hPi4KK0lmIHRoZXJlIGFyZSBubyBlcnJvcnMgZHVyaW5nIHRoZSBjYWxsLAorPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4gYmVoYXZlcyBleGFjdGx5IGxpa2UgPGEgaHJlZj0iI2x1YV9jYWxsIj48Y29kZT5sdWFfY2FsbDwvY29kZT48L2E+LgorSG93ZXZlciwgaWYgdGhlcmUgaXMgYW55IGVycm9yLAorPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4gY2F0Y2hlcyBpdCwKK3B1c2hlcyBhIHNpbmdsZSB2YWx1ZSBvbiB0aGUgc3RhY2sgKHRoZSBlcnJvciBtZXNzYWdlKSwKK2FuZCByZXR1cm5zIGFuIGVycm9yIGNvZGUuCitMaWtlIDxhIGhyZWY9IiNsdWFfY2FsbCI+PGNvZGU+bHVhX2NhbGw8L2NvZGU+PC9hPiwKKzxhIGhyZWY9IiNsdWFfcGNhbGwiPjxjb2RlPmx1YV9wY2FsbDwvY29kZT48L2E+IGFsd2F5cyByZW1vdmVzIHRoZSBmdW5jdGlvbgorYW5kIGl0cyBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2suCisKKworPHA+CitJZiA8Y29kZT5lcnJmdW5jPC9jb2RlPiBpcyAwLAordGhlbiB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm5lZCBvbiB0aGUgc3RhY2sKK2lzIGV4YWN0bHkgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UuCitPdGhlcndpc2UsIDxjb2RlPmVycmZ1bmM8L2NvZGU+IGlzIHRoZSBzdGFjayBpbmRleCBvZiBhbgorPGVtPmVycm9yIGhhbmRsZXIgZnVuY3Rpb248L2VtPi4KKyhJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhpcyBpbmRleCBjYW5ub3QgYmUgYSBwc2V1ZG8taW5kZXguKQorSW4gY2FzZSBvZiBydW50aW1lIGVycm9ycywKK3RoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZXJyb3IgbWVzc2FnZQorYW5kIGl0cyByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbWVzc2FnZSByZXR1cm5lZCBvbiB0aGUgc3RhY2sgYnkgPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4uCisKKworPHA+CitUeXBpY2FsbHksIHRoZSBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIG1vcmUgZGVidWcKK2luZm9ybWF0aW9uIHRvIHRoZSBlcnJvciBtZXNzYWdlLCBzdWNoIGFzIGEgc3RhY2sgdHJhY2ViYWNrLgorU3VjaCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgZ2F0aGVyZWQgYWZ0ZXIgdGhlIHJldHVybiBvZiA8YSBocmVmPSIjbHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPiwKK3NpbmNlIGJ5IHRoZW4gdGhlIHN0YWNrIGhhcyB1bndvdW5kLgorCisKKzxwPgorVGhlIDxhIGhyZWY9IiNsdWFfcGNhbGwiPjxjb2RlPmx1YV9wY2FsbDwvY29kZT48L2E+IGZ1bmN0aW9uIHJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MKK29yIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzCisoZGVmaW5lZCBpbiA8Y29kZT5sdWEuaDwvY29kZT4pOgorCis8dWw+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX0VSUlJVTiI+PGNvZGU+TFVBX0VSUlJVTjwvY29kZT48L2E+OjwvYj4KK2EgcnVudGltZSBlcnJvci4KKzwvbGk+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX0VSUk1FTSI+PGNvZGU+TFVBX0VSUk1FTTwvY29kZT48L2E+OjwvYj4KK21lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorRm9yIHN1Y2ggZXJyb3JzLCBMdWEgZG9lcyBub3QgY2FsbCB0aGUgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi4KKzwvbGk+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX0VSUkVSUiI+PGNvZGU+TFVBX0VSUkVSUjwvY29kZT48L2E+OjwvYj4KK2Vycm9yIHdoaWxlIHJ1bm5pbmcgdGhlIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uCis8L2xpPgorCis8L3VsPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wb3AiPjxjb2RlPmx1YV9wb3A8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy1uLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3BvcCAobHVhX1N0YXRlICpMLCBpbnQgbik7PC9wcmU+CisKKzxwPgorUG9wcyA8Y29kZT5uPC9jb2RlPiBlbGVtZW50cyBmcm9tIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNoYm9vbGVhbiI+PGNvZGU+bHVhX3B1c2hib29sZWFuPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNoYm9vbGVhbiAobHVhX1N0YXRlICpMLCBpbnQgYik7PC9wcmU+CisKKzxwPgorUHVzaGVzIGEgYm9vbGVhbiB2YWx1ZSB3aXRoIHZhbHVlIDxjb2RlPmI8L2NvZGU+IG9udG8gdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hjY2xvc3VyZSI+PGNvZGU+bHVhX3B1c2hjY2xvc3VyZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLW4sICsxLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcHVzaGNjbG9zdXJlIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gZm4sIGludCBuKTs8L3ByZT4KKworPHA+CitQdXNoZXMgYSBuZXcgQyZuYnNwO2Nsb3N1cmUgb250byB0aGUgc3RhY2suCisKKworPHA+CitXaGVuIGEgQyZuYnNwO2Z1bmN0aW9uIGlzIGNyZWF0ZWQsCitpdCBpcyBwb3NzaWJsZSB0byBhc3NvY2lhdGUgc29tZSB2YWx1ZXMgd2l0aCBpdCwKK3RodXMgY3JlYXRpbmcgYSBDJm5ic3A7Y2xvc3VyZSAoc2VlIDxhIGhyZWY9IiMzLjQiPiZzZWN0OzMuNDwvYT4pOwordGhlc2UgdmFsdWVzIGFyZSB0aGVuIGFjY2Vzc2libGUgdG8gdGhlIGZ1bmN0aW9uIHdoZW5ldmVyIGl0IGlzIGNhbGxlZC4KK1RvIGFzc29jaWF0ZSB2YWx1ZXMgd2l0aCBhIEMmbmJzcDtmdW5jdGlvbiwKK2ZpcnN0IHRoZXNlIHZhbHVlcyBzaG91bGQgYmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrCisod2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdmFsdWVzLCB0aGUgZmlyc3QgdmFsdWUgaXMgcHVzaGVkIGZpcnN0KS4KK1RoZW4gPGEgaHJlZj0iI2x1YV9wdXNoY2Nsb3N1cmUiPjxjb2RlPmx1YV9wdXNoY2Nsb3N1cmU8L2NvZGU+PC9hPgoraXMgY2FsbGVkIHRvIGNyZWF0ZSBhbmQgcHVzaCB0aGUgQyZuYnNwO2Z1bmN0aW9uIG9udG8gdGhlIHN0YWNrLAord2l0aCB0aGUgYXJndW1lbnQgPGNvZGU+bjwvY29kZT4gdGVsbGluZyBob3cgbWFueSB2YWx1ZXMgc2hvdWxkIGJlCithc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgorPGEgaHJlZj0iI2x1YV9wdXNoY2Nsb3N1cmUiPjxjb2RlPmx1YV9wdXNoY2Nsb3N1cmU8L2NvZGU+PC9hPiBhbHNvIHBvcHMgdGhlc2UgdmFsdWVzIGZyb20gdGhlIHN0YWNrLgorCisKKzxwPgorVGhlIG1heGltdW0gdmFsdWUgZm9yIDxjb2RlPm48L2NvZGU+IGlzIDI1NS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNoY2Z1bmN0aW9uIj48Y29kZT5sdWFfcHVzaGNmdW5jdGlvbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcHVzaGNmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIGYpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIEMmbmJzcDtmdW5jdGlvbiBvbnRvIHRoZSBzdGFjay4KK1RoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgYSBwb2ludGVyIHRvIGEgQyBmdW5jdGlvbgorYW5kIHB1c2hlcyBvbnRvIHRoZSBzdGFjayBhIEx1YSB2YWx1ZSBvZiB0eXBlIDxjb2RlPmZ1bmN0aW9uPC9jb2RlPiB0aGF0LAord2hlbiBjYWxsZWQsIGludm9rZXMgdGhlIGNvcnJlc3BvbmRpbmcgQyZuYnNwO2Z1bmN0aW9uLgorCisKKzxwPgorQW55IGZ1bmN0aW9uIHRvIGJlIHJlZ2lzdGVyZWQgaW4gTHVhIG11c3QKK2ZvbGxvdyB0aGUgY29ycmVjdCBwcm90b2NvbCB0byByZWNlaXZlIGl0cyBwYXJhbWV0ZXJzCithbmQgcmV0dXJuIGl0cyByZXN1bHRzIChzZWUgPGEgaHJlZj0iI2x1YV9DRnVuY3Rpb24iPjxjb2RlPmx1YV9DRnVuY3Rpb248L2NvZGU+PC9hPikuCisKKworPHA+Cis8Y29kZT5sdWFfcHVzaGNmdW5jdGlvbjwvY29kZT4gaXMgZGVmaW5lZCBhcyBhIG1hY3JvOgorCis8cHJlPgorICAgICAjZGVmaW5lIGx1YV9wdXNoY2Z1bmN0aW9uKEwsZikgIGx1YV9wdXNoY2Nsb3N1cmUoTCxmLDApCis8L3ByZT4KKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcHVzaGZzdHJpbmciPjxjb2RlPmx1YV9wdXNoZnN0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhX3B1c2hmc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTs8L3ByZT4KKworPHA+CitQdXNoZXMgb250byB0aGUgc3RhY2sgYSBmb3JtYXR0ZWQgc3RyaW5nCithbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJpbmcuCitJdCBpcyBzaW1pbGFyIHRvIHRoZSBDJm5ic3A7ZnVuY3Rpb24gPGNvZGU+c3ByaW50ZjwvY29kZT4sCitidXQgaGFzIHNvbWUgaW1wb3J0YW50IGRpZmZlcmVuY2VzOgorCis8dWw+CisKKzxsaT4KK1lvdSBkbyBub3QgaGF2ZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlc3VsdDoKK3RoZSByZXN1bHQgaXMgYSBMdWEgc3RyaW5nIGFuZCBMdWEgdGFrZXMgY2FyZSBvZiBtZW1vcnkgYWxsb2NhdGlvbgorKGFuZCBkZWFsbG9jYXRpb24sIHRocm91Z2ggZ2FyYmFnZSBjb2xsZWN0aW9uKS4KKzwvbGk+CisKKzxsaT4KK1RoZSBjb252ZXJzaW9uIHNwZWNpZmllcnMgYXJlIHF1aXRlIHJlc3RyaWN0ZWQuCitUaGVyZSBhcmUgbm8gZmxhZ3MsIHdpZHRocywgb3IgcHJlY2lzaW9ucy4KK1RoZSBjb252ZXJzaW9uIHNwZWNpZmllcnMgY2FuIG9ubHkgYmUKKyc8Y29kZT4lJTwvY29kZT4nIChpbnNlcnRzIGEgJzxjb2RlPiU8L2NvZGU+JyBpbiB0aGUgc3RyaW5nKSwKKyc8Y29kZT4lczwvY29kZT4nIChpbnNlcnRzIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZywgd2l0aCBubyBzaXplIHJlc3RyaWN0aW9ucyksCisnPGNvZGU+JWY8L2NvZGU+JyAoaW5zZXJ0cyBhIDxhIGhyZWY9IiNsdWFfTnVtYmVyIj48Y29kZT5sdWFfTnVtYmVyPC9jb2RlPjwvYT4pLAorJzxjb2RlPiVwPC9jb2RlPicgKGluc2VydHMgYSBwb2ludGVyIGFzIGEgaGV4YWRlY2ltYWwgbnVtZXJhbCksCisnPGNvZGU+JWQ8L2NvZGU+JyAoaW5zZXJ0cyBhbiA8Y29kZT5pbnQ8L2NvZGU+KSwgYW5kCisnPGNvZGU+JWM8L2NvZGU+JyAoaW5zZXJ0cyBhbiA8Y29kZT5pbnQ8L2NvZGU+IGFzIGEgY2hhcmFjdGVyKS4KKzwvbGk+CisKKzwvdWw+CisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hpbnRlZ2VyIj48Y29kZT5sdWFfcHVzaGludGVnZXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2hpbnRlZ2VyIChsdWFfU3RhdGUgKkwsIGx1YV9JbnRlZ2VyIG4pOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIG51bWJlciB3aXRoIHZhbHVlIDxjb2RlPm48L2NvZGU+IG9udG8gdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hsaWdodHVzZXJkYXRhIj48Y29kZT5sdWFfcHVzaGxpZ2h0dXNlcmRhdGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2hsaWdodHVzZXJkYXRhIChsdWFfU3RhdGUgKkwsIHZvaWQgKnApOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIGxpZ2h0IHVzZXJkYXRhIG9udG8gdGhlIHN0YWNrLgorCisKKzxwPgorVXNlcmRhdGEgcmVwcmVzZW50IEMmbmJzcDt2YWx1ZXMgaW4gTHVhLgorQSA8ZW0+bGlnaHQgdXNlcmRhdGE8L2VtPiByZXByZXNlbnRzIGEgcG9pbnRlci4KK0l0IGlzIGEgdmFsdWUgKGxpa2UgYSBudW1iZXIpOgoreW91IGRvIG5vdCBjcmVhdGUgaXQsIGl0IGhhcyBubyBpbmRpdmlkdWFsIG1ldGF0YWJsZSwKK2FuZCBpdCBpcyBub3QgY29sbGVjdGVkIChhcyBpdCB3YXMgbmV2ZXIgY3JlYXRlZCkuCitBIGxpZ2h0IHVzZXJkYXRhIGlzIGVxdWFsIHRvICJhbnkiCitsaWdodCB1c2VyZGF0YSB3aXRoIHRoZSBzYW1lIEMmbmJzcDthZGRyZXNzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hsaXRlcmFsIj48Y29kZT5sdWFfcHVzaGxpdGVyYWw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2hsaXRlcmFsIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpOzwvcHJlPgorCis8cD4KK1RoaXMgbWFjcm8gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjbHVhX3B1c2hsc3RyaW5nIj48Y29kZT5sdWFfcHVzaGxzdHJpbmc8L2NvZGU+PC9hPiwKK2J1dCBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gPGNvZGU+czwvY29kZT4gaXMgYSBsaXRlcmFsIHN0cmluZy4KK0luIHRoZXNlIGNhc2VzLCBpdCBhdXRvbWF0aWNhbGx5IHByb3ZpZGVzIHRoZSBzdHJpbmcgbGVuZ3RoLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hsc3RyaW5nIj48Y29kZT5sdWFfcHVzaGxzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2hsc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pOzwvcHJlPgorCis8cD4KK1B1c2hlcyB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgPGNvZGU+czwvY29kZT4gd2l0aCBzaXplIDxjb2RlPmxlbjwvY29kZT4KK29udG8gdGhlIHN0YWNrLgorTHVhIG1ha2VzIChvciByZXVzZXMpIGFuIGludGVybmFsIGNvcHkgb2YgdGhlIGdpdmVuIHN0cmluZywKK3NvIHRoZSBtZW1vcnkgYXQgPGNvZGU+czwvY29kZT4gY2FuIGJlIGZyZWVkIG9yIHJldXNlZCBpbW1lZGlhdGVseSBhZnRlcgordGhlIGZ1bmN0aW9uIHJldHVybnMuCitUaGUgc3RyaW5nIGNhbiBjb250YWluIGVtYmVkZGVkIHplcm9zLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2huaWwiPjxjb2RlPmx1YV9wdXNobmlsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNobmlsIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIG5pbCB2YWx1ZSBvbnRvIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNobnVtYmVyIj48Y29kZT5sdWFfcHVzaG51bWJlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcHVzaG51bWJlciAobHVhX1N0YXRlICpMLCBsdWFfTnVtYmVyIG4pOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIG51bWJlciB3aXRoIHZhbHVlIDxjb2RlPm48L2NvZGU+IG9udG8gdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hzdHJpbmciPjxjb2RlPmx1YV9wdXNoc3RyaW5nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNoc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpOzwvcHJlPgorCis8cD4KK1B1c2hlcyB0aGUgemVyby10ZXJtaW5hdGVkIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxjb2RlPnM8L2NvZGU+CitvbnRvIHRoZSBzdGFjay4KK0x1YSBtYWtlcyAob3IgcmV1c2VzKSBhbiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBnaXZlbiBzdHJpbmcsCitzbyB0aGUgbWVtb3J5IGF0IDxjb2RlPnM8L2NvZGU+IGNhbiBiZSBmcmVlZCBvciByZXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKK3RoZSBmdW5jdGlvbiByZXR1cm5zLgorVGhlIHN0cmluZyBjYW5ub3QgY29udGFpbiBlbWJlZGRlZCB6ZXJvczsKK2l0IGlzIGFzc3VtZWQgdG8gZW5kIGF0IHRoZSBmaXJzdCB6ZXJvLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2h0aHJlYWQiPjxjb2RlPmx1YV9wdXNodGhyZWFkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX3B1c2h0aHJlYWQgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorUHVzaGVzIHRoZSB0aHJlYWQgcmVwcmVzZW50ZWQgYnkgPGNvZGU+TDwvY29kZT4gb250byB0aGUgc3RhY2suCitSZXR1cm5zIDEgaWYgdGhpcyB0aHJlYWQgaXMgdGhlIG1haW4gdGhyZWFkIG9mIGl0cyBzdGF0ZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNodmFsdWUiPjxjb2RlPmx1YV9wdXNodmFsdWU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2h2YWx1ZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIGNvcHkgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHZhbGlkIGluZGV4CitvbnRvIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNodmZzdHJpbmciPjxjb2RlPmx1YV9wdXNodmZzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV9wdXNodmZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncCk7PC9wcmU+CisKKzxwPgorRXF1aXZhbGVudCB0byA8YSBocmVmPSIjbHVhX3B1c2hmc3RyaW5nIj48Y29kZT5sdWFfcHVzaGZzdHJpbmc8L2NvZGU+PC9hPiwgZXhjZXB0IHRoYXQgaXQgcmVjZWl2ZXMgYSA8Y29kZT52YV9saXN0PC9jb2RlPgoraW5zdGVhZCBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmF3ZXF1YWwiPjxjb2RlPmx1YV9yYXdlcXVhbDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9yYXdlcXVhbCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHR3byB2YWx1ZXMgaW4gYWNjZXB0YWJsZSBpbmRpY2VzIDxjb2RlPmluZGV4MTwvY29kZT4gYW5kCis8Y29kZT5pbmRleDI8L2NvZGU+IGFyZSBwcmltaXRpdmVseSBlcXVhbAorKHRoYXQgaXMsIHdpdGhvdXQgY2FsbGluZyBtZXRhbWV0aG9kcykuCitPdGhlcndpc2UgcmV0dXJucyZuYnNwOzAuCitBbHNvIHJldHVybnMmbmJzcDswIGlmIGFueSBvZiB0aGUgaW5kaWNlcyBhcmUgbm9uIHZhbGlkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Jhd2dldCI+PGNvZGU+bHVhX3Jhd2dldDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICsxLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcmF3Z2V0IChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorU2ltaWxhciB0byA8YSBocmVmPSIjbHVhX2dldHRhYmxlIj48Y29kZT5sdWFfZ2V0dGFibGU8L2NvZGU+PC9hPiwgYnV0IGRvZXMgYSByYXcgYWNjZXNzCisoaS5lLiwgd2l0aG91dCBtZXRhbWV0aG9kcykuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmF3Z2V0aSI+PGNvZGU+bHVhX3Jhd2dldGk8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3Jhd2dldGkgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBpbnQgbik7PC9wcmU+CisKKzxwPgorUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSB2YWx1ZSA8Y29kZT50W25dPC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXguCitUaGUgYWNjZXNzIGlzIHJhdzsKK3RoYXQgaXMsIGl0IGRvZXMgbm90IGludm9rZSBtZXRhbWV0aG9kcy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9yYXdzZXQiPjxjb2RlPmx1YV9yYXdzZXQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0yLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3Jhd3NldCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1NpbWlsYXIgdG8gPGEgaHJlZj0iI2x1YV9zZXR0YWJsZSI+PGNvZGU+bHVhX3NldHRhYmxlPC9jb2RlPjwvYT4sIGJ1dCBkb2VzIGEgcmF3IGFzc2lnbm1lbnQKKyhpLmUuLCB3aXRob3V0IG1ldGFtZXRob2RzKS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9yYXdzZXRpIj48Y29kZT5sdWFfcmF3c2V0aTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICswLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcmF3c2V0aSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGludCBuKTs8L3ByZT4KKworPHA+CitEb2VzIHRoZSBlcXVpdmFsZW50IG9mIDxjb2RlPnRbbl0gPSB2PC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKK2FuZCA8Y29kZT52PC9jb2RlPiBpcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHBvcHMgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorVGhlIGFzc2lnbm1lbnQgaXMgcmF3OwordGhhdCBpcywgaXQgZG9lcyBub3QgaW52b2tlIG1ldGFtZXRob2RzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX1JlYWRlciI+PGNvZGU+bHVhX1JlYWRlcjwvY29kZT48L2E+PC9oMz4KKzxwcmU+dHlwZWRlZiBjb25zdCBjaGFyICogKCpsdWFfUmVhZGVyKSAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7PC9wcmU+CisKKzxwPgorVGhlIHJlYWRlciBmdW5jdGlvbiB1c2VkIGJ5IDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPi4KK0V2ZXJ5IHRpbWUgaXQgbmVlZHMgYW5vdGhlciBwaWVjZSBvZiB0aGUgY2h1bmssCis8YSBocmVmPSIjbHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT4gY2FsbHMgdGhlIHJlYWRlciwKK3Bhc3NpbmcgYWxvbmcgaXRzIDxjb2RlPmRhdGE8L2NvZGU+IHBhcmFtZXRlci4KK1RoZSByZWFkZXIgbXVzdCByZXR1cm4gYSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5Cit3aXRoIGEgbmV3IHBpZWNlIG9mIHRoZSBjaHVuaworYW5kIHNldCA8Y29kZT5zaXplPC9jb2RlPiB0byB0aGUgYmxvY2sgc2l6ZS4KK1RoZSBibG9jayBtdXN0IGV4aXN0IHVudGlsIHRoZSByZWFkZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGFnYWluLgorVG8gc2lnbmFsIHRoZSBlbmQgb2YgdGhlIGNodW5rLAordGhlIHJlYWRlciBtdXN0IHJldHVybiA8Y29kZT5OVUxMPC9jb2RlPiBvciBzZXQgPGNvZGU+c2l6ZTwvY29kZT4gdG8gemVyby4KK1RoZSByZWFkZXIgZnVuY3Rpb24gbWF5IHJldHVybiBwaWVjZXMgb2YgYW55IHNpemUgZ3JlYXRlciB0aGFuIHplcm8uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmVnaXN0ZXIiPjxjb2RlPmx1YV9yZWdpc3RlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcmVnaXN0ZXIgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgIGx1YV9DRnVuY3Rpb24gZik7PC9wcmU+CisKKzxwPgorU2V0cyB0aGUgQyBmdW5jdGlvbiA8Y29kZT5mPC9jb2RlPiBhcyB0aGUgbmV3IHZhbHVlIG9mIGdsb2JhbCA8Y29kZT5uYW1lPC9jb2RlPi4KK0l0IGlzIGRlZmluZWQgYXMgYSBtYWNybzoKKworPHByZT4KKyAgICAgI2RlZmluZSBsdWFfcmVnaXN0ZXIoTCxuLGYpIFwKKyAgICAgICAgICAgIChsdWFfcHVzaGNmdW5jdGlvbihMLCBmKSwgbHVhX3NldGdsb2JhbChMLCBuKSkKKzwvcHJlPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9yZW1vdmUiPjxjb2RlPmx1YV9yZW1vdmU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3JlbW92ZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JlbW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHZhbGlkIGluZGV4LAorc2hpZnRpbmcgZG93biB0aGUgZWxlbWVudHMgYWJvdmUgdGhpcyBpbmRleCB0byBmaWxsIHRoZSBnYXAuCitDYW5ub3QgYmUgY2FsbGVkIHdpdGggYSBwc2V1ZG8taW5kZXgsCitiZWNhdXNlIGEgcHNldWRvLWluZGV4IGlzIG5vdCBhbiBhY3R1YWwgc3RhY2sgcG9zaXRpb24uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmVwbGFjZSI+PGNvZGU+bHVhX3JlcGxhY2U8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3JlcGxhY2UgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitNb3ZlcyB0aGUgdG9wIGVsZW1lbnQgaW50byB0aGUgZ2l2ZW4gcG9zaXRpb24gKGFuZCBwb3BzIGl0KSwKK3dpdGhvdXQgc2hpZnRpbmcgYW55IGVsZW1lbnQKKyh0aGVyZWZvcmUgcmVwbGFjaW5nIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Jlc3VtZSI+PGNvZGU+bHVhX3Jlc3VtZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICs/LCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9yZXN1bWUgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpOzwvcHJlPgorCis8cD4KK1N0YXJ0cyBhbmQgcmVzdW1lcyBhIGNvcm91dGluZSBpbiBhIGdpdmVuIHRocmVhZC4KKworCis8cD4KK1RvIHN0YXJ0IGEgY29yb3V0aW5lLCB5b3UgZmlyc3QgY3JlYXRlIGEgbmV3IHRocmVhZAorKHNlZSA8YSBocmVmPSIjbHVhX25ld3RocmVhZCI+PGNvZGU+bHVhX25ld3RocmVhZDwvY29kZT48L2E+KTsKK3RoZW4geW91IHB1c2ggb250byBpdHMgc3RhY2sgdGhlIG1haW4gZnVuY3Rpb24gcGx1cyBhbnkgYXJndW1lbnRzOwordGhlbiB5b3UgY2FsbCA8YSBocmVmPSIjbHVhX3Jlc3VtZSI+PGNvZGU+bHVhX3Jlc3VtZTwvY29kZT48L2E+LAord2l0aCA8Y29kZT5uYXJnPC9jb2RlPiBiZWluZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KK1RoaXMgY2FsbCByZXR1cm5zIHdoZW4gdGhlIGNvcm91dGluZSBzdXNwZW5kcyBvciBmaW5pc2hlcyBpdHMgZXhlY3V0aW9uLgorV2hlbiBpdCByZXR1cm5zLCB0aGUgc3RhY2sgY29udGFpbnMgYWxsIHZhbHVlcyBwYXNzZWQgdG8gPGEgaHJlZj0iI2x1YV95aWVsZCI+PGNvZGU+bHVhX3lpZWxkPC9jb2RlPjwvYT4sCitvciBhbGwgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBib2R5IGZ1bmN0aW9uLgorPGEgaHJlZj0iI2x1YV9yZXN1bWUiPjxjb2RlPmx1YV9yZXN1bWU8L2NvZGU+PC9hPiByZXR1cm5zCis8YSBocmVmPSIjcGRmLUxVQV9ZSUVMRCI+PGNvZGU+TFVBX1lJRUxEPC9jb2RlPjwvYT4gaWYgdGhlIGNvcm91dGluZSB5aWVsZHMsCiswIGlmIHRoZSBjb3JvdXRpbmUgZmluaXNoZXMgaXRzIGV4ZWN1dGlvbgord2l0aG91dCBlcnJvcnMsCitvciBhbiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZXJyb3JzIChzZWUgPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4pLgorSW4gY2FzZSBvZiBlcnJvcnMsCit0aGUgc3RhY2sgaXMgbm90IHVud291bmQsCitzbyB5b3UgY2FuIHVzZSB0aGUgZGVidWcgQVBJIG92ZXIgaXQuCitUaGUgZXJyb3IgbWVzc2FnZSBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KK1RvIHJlc3RhcnQgYSBjb3JvdXRpbmUsIHlvdSBwdXQgb24gaXRzIHN0YWNrIG9ubHkgdGhlIHZhbHVlcyB0bworYmUgcGFzc2VkIGFzIHJlc3VsdHMgZnJvbSA8Y29kZT55aWVsZDwvY29kZT4sCithbmQgdGhlbiBjYWxsIDxhIGhyZWY9IiNsdWFfcmVzdW1lIj48Y29kZT5sdWFfcmVzdW1lPC9jb2RlPjwvYT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0YWxsb2NmIj48Y29kZT5sdWFfc2V0YWxsb2NmPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9zZXRhbGxvY2YgKGx1YV9TdGF0ZSAqTCwgbHVhX0FsbG9jIGYsIHZvaWQgKnVkKTs8L3ByZT4KKworPHA+CitDaGFuZ2VzIHRoZSBhbGxvY2F0b3IgZnVuY3Rpb24gb2YgYSBnaXZlbiBzdGF0ZSB0byA8Y29kZT5mPC9jb2RlPgord2l0aCB1c2VyIGRhdGEgPGNvZGU+dWQ8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3NldGZlbnYiPjxjb2RlPmx1YV9zZXRmZW52PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX3NldGZlbnYgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitQb3BzIGEgdGFibGUgZnJvbSB0aGUgc3RhY2sgYW5kIHNldHMgaXQgYXMKK3RoZSBuZXcgZW52aXJvbm1lbnQgZm9yIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCitJZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzCituZWl0aGVyIGEgZnVuY3Rpb24gbm9yIGEgdGhyZWFkIG5vciBhIHVzZXJkYXRhLAorPGEgaHJlZj0iI2x1YV9zZXRmZW52Ij48Y29kZT5sdWFfc2V0ZmVudjwvY29kZT48L2E+IHJldHVybnMgMC4KK090aGVyd2lzZSBpdCByZXR1cm5zIDEuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0ZmllbGQiPjxjb2RlPmx1YV9zZXRmaWVsZDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfc2V0ZmllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCBjaGFyICprKTs8L3ByZT4KKworPHA+CitEb2VzIHRoZSBlcXVpdmFsZW50IHRvIDxjb2RlPnRba10gPSB2PC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKK2FuZCA8Y29kZT52PC9jb2RlPiBpcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHBvcHMgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorQXMgaW4gTHVhLCB0aGlzIGZ1bmN0aW9uIG1heSB0cmlnZ2VyIGEgbWV0YW1ldGhvZAorZm9yIHRoZSAibmV3aW5kZXgiIGV2ZW50IChzZWUgPGEgaHJlZj0iIzIuOCI+JnNlY3Q7Mi44PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0Z2xvYmFsIj48Y29kZT5sdWFfc2V0Z2xvYmFsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzAsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9zZXRnbG9iYWwgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSk7PC9wcmU+CisKKzxwPgorUG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGFuZAorc2V0cyBpdCBhcyB0aGUgbmV3IHZhbHVlIG9mIGdsb2JhbCA8Y29kZT5uYW1lPC9jb2RlPi4KK0l0IGlzIGRlZmluZWQgYXMgYSBtYWNybzoKKworPHByZT4KKyAgICAgI2RlZmluZSBsdWFfc2V0Z2xvYmFsKEwscykgICBsdWFfc2V0ZmllbGQoTCwgTFVBX0dMT0JBTFNJTkRFWCwgcykKKzwvcHJlPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9zZXRtZXRhdGFibGUiPjxjb2RlPmx1YV9zZXRtZXRhdGFibGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfc2V0bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUG9wcyBhIHRhYmxlIGZyb20gdGhlIHN0YWNrIGFuZAorc2V0cyBpdCBhcyB0aGUgbmV3IG1ldGF0YWJsZSBmb3IgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbgorYWNjZXB0YWJsZSBpbmRleC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9zZXR0YWJsZSI+PGNvZGU+bHVhX3NldHRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMiwgKzAsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9zZXR0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK0RvZXMgdGhlIGVxdWl2YWxlbnQgdG8gPGNvZGU+dFtrXSA9IHY8L2NvZGU+LAord2hlcmUgPGNvZGU+dDwvY29kZT4gaXMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiB2YWxpZCBpbmRleCwKKzxjb2RlPnY8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywKK2FuZCA8Y29kZT5rPC9jb2RlPiBpcyB0aGUgdmFsdWUganVzdCBiZWxvdyB0aGUgdG9wLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBwb3BzIGJvdGggdGhlIGtleSBhbmQgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorQXMgaW4gTHVhLCB0aGlzIGZ1bmN0aW9uIG1heSB0cmlnZ2VyIGEgbWV0YW1ldGhvZAorZm9yIHRoZSAibmV3aW5kZXgiIGV2ZW50IChzZWUgPGEgaHJlZj0iIzIuOCI+JnNlY3Q7Mi44PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0dG9wIj48Y29kZT5sdWFfc2V0dG9wPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstPywgKz8sIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9zZXR0b3AgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitBY2NlcHRzIGFueSBhY2NlcHRhYmxlIGluZGV4LCBvciZuYnNwOzAsCithbmQgc2V0cyB0aGUgc3RhY2sgdG9wIHRvIHRoaXMgaW5kZXguCitJZiB0aGUgbmV3IHRvcCBpcyBsYXJnZXIgdGhhbiB0aGUgb2xkIG9uZSwKK3RoZW4gdGhlIG5ldyBlbGVtZW50cyBhcmUgZmlsbGVkIHdpdGggPGI+bmlsPC9iPi4KK0lmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyZuYnNwOzAsIHRoZW4gYWxsIHN0YWNrIGVsZW1lbnRzIGFyZSByZW1vdmVkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX1N0YXRlIj48Y29kZT5sdWFfU3RhdGU8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgc3RydWN0IGx1YV9TdGF0ZSBsdWFfU3RhdGU7PC9wcmU+CisKKzxwPgorT3BhcXVlIHN0cnVjdHVyZSB0aGF0IGtlZXBzIHRoZSB3aG9sZSBzdGF0ZSBvZiBhIEx1YSBpbnRlcnByZXRlci4KK1RoZSBMdWEgbGlicmFyeSBpcyBmdWxseSByZWVudHJhbnQ6CitpdCBoYXMgbm8gZ2xvYmFsIHZhcmlhYmxlcy4KK0FsbCBpbmZvcm1hdGlvbiBhYm91dCBhIHN0YXRlIGlzIGtlcHQgaW4gdGhpcyBzdHJ1Y3R1cmUuCisKKworPHA+CitBIHBvaW50ZXIgdG8gdGhpcyBzdGF0ZSBtdXN0IGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8KK2V2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaWJyYXJ5LCBleGNlcHQgdG8gPGEgaHJlZj0iI2x1YV9uZXdzdGF0ZSI+PGNvZGU+bHVhX25ld3N0YXRlPC9jb2RlPjwvYT4sCit3aGljaCBjcmVhdGVzIGEgTHVhIHN0YXRlIGZyb20gc2NyYXRjaC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9zdGF0dXMiPjxjb2RlPmx1YV9zdGF0dXM8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfc3RhdHVzIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgdGhyZWFkIDxjb2RlPkw8L2NvZGU+LgorCisKKzxwPgorVGhlIHN0YXR1cyBjYW4gYmUgMCBmb3IgYSBub3JtYWwgdGhyZWFkLAorYW4gZXJyb3IgY29kZSBpZiB0aGUgdGhyZWFkIGZpbmlzaGVkIGl0cyBleGVjdXRpb24gd2l0aCBhbiBlcnJvciwKK29yIDxhIG5hbWU9InBkZi1MVUFfWUlFTEQiPjxjb2RlPkxVQV9ZSUVMRDwvY29kZT48L2E+IGlmIHRoZSB0aHJlYWQgaXMgc3VzcGVuZGVkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3RvYm9vbGVhbiI+PGNvZGU+bHVhX3RvYm9vbGVhbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV90b2Jvb2xlYW4gKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitDb252ZXJ0cyB0aGUgTHVhIHZhbHVlIGF0IHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4IHRvIGEgQyZuYnNwO2Jvb2xlYW4KK3ZhbHVlICgwJm5ic3A7b3ImbmJzcDsxKS4KK0xpa2UgYWxsIHRlc3RzIGluIEx1YSwKKzxhIGhyZWY9IiNsdWFfdG9ib29sZWFuIj48Y29kZT5sdWFfdG9ib29sZWFuPC9jb2RlPjwvYT4gcmV0dXJucyAxIGZvciBhbnkgTHVhIHZhbHVlCitkaWZmZXJlbnQgZnJvbSA8Yj5mYWxzZTwvYj4gYW5kIDxiPm5pbDwvYj47CitvdGhlcndpc2UgaXQgcmV0dXJucyAwLgorSXQgYWxzbyByZXR1cm5zIDAgd2hlbiBjYWxsZWQgd2l0aCBhIG5vbi12YWxpZCBpbmRleC4KKyhJZiB5b3Ugd2FudCB0byBhY2NlcHQgb25seSBhY3R1YWwgYm9vbGVhbiB2YWx1ZXMsCit1c2UgPGEgaHJlZj0iI2x1YV9pc2Jvb2xlYW4iPjxjb2RlPmx1YV9pc2Jvb2xlYW48L2NvZGU+PC9hPiB0byB0ZXN0IHRoZSB2YWx1ZSdzIHR5cGUuKQorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3RvY2Z1bmN0aW9uIj48Y29kZT5sdWFfdG9jZnVuY3Rpb248L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9DRnVuY3Rpb24gbHVhX3RvY2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorQ29udmVydHMgYSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gYWNjZXB0YWJsZSBpbmRleCB0byBhIEMmbmJzcDtmdW5jdGlvbi4KK1RoYXQgdmFsdWUgbXVzdCBiZSBhIEMmbmJzcDtmdW5jdGlvbjsKK290aGVyd2lzZSwgcmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90b2ludGVnZXIiPjxjb2RlPmx1YV90b2ludGVnZXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9JbnRlZ2VyIGx1YV90b2ludGVnZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitDb252ZXJ0cyB0aGUgTHVhIHZhbHVlIGF0IHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4Cit0byB0aGUgc2lnbmVkIGludGVncmFsIHR5cGUgPGEgaHJlZj0iI2x1YV9JbnRlZ2VyIj48Y29kZT5sdWFfSW50ZWdlcjwvY29kZT48L2E+LgorVGhlIEx1YSB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIGNvbnZlcnRpYmxlIHRvIGEgbnVtYmVyCisoc2VlIDxhIGhyZWY9IiMyLjIuMSI+JnNlY3Q7Mi4yLjE8L2E+KTsKK290aGVyd2lzZSwgPGEgaHJlZj0iI2x1YV90b2ludGVnZXIiPjxjb2RlPmx1YV90b2ludGVnZXI8L2NvZGU+PC9hPiByZXR1cm5zJm5ic3A7MC4KKworCis8cD4KK0lmIHRoZSBudW1iZXIgaXMgbm90IGFuIGludGVnZXIsCitpdCBpcyB0cnVuY2F0ZWQgaW4gc29tZSBub24tc3BlY2lmaWVkIHdheS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV90b2xzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBzaXplX3QgKmxlbik7PC9wcmU+CisKKzxwPgorQ29udmVydHMgdGhlIEx1YSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gYWNjZXB0YWJsZSBpbmRleCB0byBhIEMmbmJzcDtzdHJpbmcuCitJZiA8Y29kZT5sZW48L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwKK2l0IGFsc28gc2V0cyA8Y29kZT4qbGVuPC9jb2RlPiB3aXRoIHRoZSBzdHJpbmcgbGVuZ3RoLgorVGhlIEx1YSB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyOworb3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPi4KK0lmIHRoZSB2YWx1ZSBpcyBhIG51bWJlciwKK3RoZW4gPGEgaHJlZj0iI2x1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPiBhbHNvCis8ZW0+Y2hhbmdlcyB0aGUgYWN0dWFsIHZhbHVlIGluIHRoZSBzdGFjayB0byBhIHN0cmluZzwvZW0+LgorKFRoaXMgY2hhbmdlIGNvbmZ1c2VzIDxhIGhyZWY9IiNsdWFfbmV4dCI+PGNvZGU+bHVhX25leHQ8L2NvZGU+PC9hPgord2hlbiA8YSBocmVmPSIjbHVhX3RvbHN0cmluZyI+PGNvZGU+bHVhX3RvbHN0cmluZzwvY29kZT48L2E+IGlzIGFwcGxpZWQgdG8ga2V5cyBkdXJpbmcgYSB0YWJsZSB0cmF2ZXJzYWwuKQorCisKKzxwPgorPGEgaHJlZj0iI2x1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPiByZXR1cm5zIGEgZnVsbHkgYWxpZ25lZCBwb2ludGVyCit0byBhIHN0cmluZyBpbnNpZGUgdGhlIEx1YSBzdGF0ZS4KK1RoaXMgc3RyaW5nIGFsd2F5cyBoYXMgYSB6ZXJvICgnPGNvZGU+XDA8L2NvZGU+JykKK2FmdGVyIGl0cyBsYXN0IGNoYXJhY3RlciAoYXMgaW4mbmJzcDtDKSwKK2J1dCBjYW4gY29udGFpbiBvdGhlciB6ZXJvcyBpbiBpdHMgYm9keS4KK0JlY2F1c2UgTHVhIGhhcyBnYXJiYWdlIGNvbGxlY3Rpb24sCit0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgcG9pbnRlciByZXR1cm5lZCBieSA8YSBocmVmPSIjbHVhX3RvbHN0cmluZyI+PGNvZGU+bHVhX3RvbHN0cmluZzwvY29kZT48L2E+Cit3aWxsIGJlIHZhbGlkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG9udW1iZXIiPjxjb2RlPmx1YV90b251bWJlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX051bWJlciBsdWFfdG9udW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitDb252ZXJ0cyB0aGUgTHVhIHZhbHVlIGF0IHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4Cit0byB0aGUgQyZuYnNwO3R5cGUgPGEgaHJlZj0iI2x1YV9OdW1iZXIiPjxjb2RlPmx1YV9OdW1iZXI8L2NvZGU+PC9hPiAoc2VlIDxhIGhyZWY9IiNsdWFfTnVtYmVyIj48Y29kZT5sdWFfTnVtYmVyPC9jb2RlPjwvYT4pLgorVGhlIEx1YSB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIGNvbnZlcnRpYmxlIHRvIGEgbnVtYmVyCisoc2VlIDxhIGhyZWY9IiMyLjIuMSI+JnNlY3Q7Mi4yLjE8L2E+KTsKK290aGVyd2lzZSwgPGEgaHJlZj0iI2x1YV90b251bWJlciI+PGNvZGU+bHVhX3RvbnVtYmVyPC9jb2RlPjwvYT4gcmV0dXJucyZuYnNwOzAuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG9wb2ludGVyIj48Y29kZT5sdWFfdG9wb2ludGVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5jb25zdCB2b2lkICpsdWFfdG9wb2ludGVyIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorQ29udmVydHMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBhY2NlcHRhYmxlIGluZGV4IHRvIGEgZ2VuZXJpYworQyZuYnNwO3BvaW50ZXIgKDxjb2RlPnZvaWQqPC9jb2RlPikuCitUaGUgdmFsdWUgY2FuIGJlIGEgdXNlcmRhdGEsIGEgdGFibGUsIGEgdGhyZWFkLCBvciBhIGZ1bmN0aW9uOworb3RoZXJ3aXNlLCA8YSBocmVmPSIjbHVhX3RvcG9pbnRlciI+PGNvZGU+bHVhX3RvcG9pbnRlcjwvY29kZT48L2E+IHJldHVybnMgPGNvZGU+TlVMTDwvY29kZT4uCitEaWZmZXJlbnQgb2JqZWN0cyB3aWxsIGdpdmUgZGlmZmVyZW50IHBvaW50ZXJzLgorVGhlcmUgaXMgbm8gd2F5IHRvIGNvbnZlcnQgdGhlIHBvaW50ZXIgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCisKKworPHA+CitUeXBpY2FsbHkgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgZm9yIGRlYnVnIGluZm9ybWF0aW9uLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Rvc3RyaW5nIj48Y29kZT5sdWFfdG9zdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV90b3N0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK0VxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2x1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPiB3aXRoIDxjb2RlPmxlbjwvY29kZT4gZXF1YWwgdG8gPGNvZGU+TlVMTDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG90aHJlYWQiPjxjb2RlPmx1YV90b3RocmVhZDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX1N0YXRlICpsdWFfdG90aHJlYWQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitDb252ZXJ0cyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggdG8gYSBMdWEgdGhyZWFkCisocmVwcmVzZW50ZWQgYXMgPGNvZGU+bHVhX1N0YXRlKjwvY29kZT4pLgorVGhpcyB2YWx1ZSBtdXN0IGJlIGEgdGhyZWFkOworb3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90b3VzZXJkYXRhIj48Y29kZT5sdWFfdG91c2VyZGF0YTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCAqbHVhX3RvdXNlcmRhdGEgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitJZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXggaXMgYSBmdWxsIHVzZXJkYXRhLAorcmV0dXJucyBpdHMgYmxvY2sgYWRkcmVzcy4KK0lmIHRoZSB2YWx1ZSBpcyBhIGxpZ2h0IHVzZXJkYXRhLAorcmV0dXJucyBpdHMgcG9pbnRlci4KK090aGVyd2lzZSwgcmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90eXBlIj48Y29kZT5sdWFfdHlwZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV90eXBlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgaW4gdGhlIGdpdmVuIGFjY2VwdGFibGUgaW5kZXgsCitvciA8Y29kZT5MVUFfVE5PTkU8L2NvZGU+IGZvciBhIG5vbi12YWxpZCBpbmRleAorKHRoYXQgaXMsIGFuIGluZGV4IHRvIGFuICJlbXB0eSIgc3RhY2sgcG9zaXRpb24pLgorVGhlIHR5cGVzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNsdWFfdHlwZSI+PGNvZGU+bHVhX3R5cGU8L2NvZGU+PC9hPiBhcmUgY29kZWQgYnkgdGhlIGZvbGxvd2luZyBjb25zdGFudHMKK2RlZmluZWQgaW4gPGNvZGU+bHVhLmg8L2NvZGU+OgorPGNvZGU+TFVBX1ROSUw8L2NvZGU+LAorPGNvZGU+TFVBX1ROVU1CRVI8L2NvZGU+LAorPGNvZGU+TFVBX1RCT09MRUFOPC9jb2RlPiwKKzxjb2RlPkxVQV9UU1RSSU5HPC9jb2RlPiwKKzxjb2RlPkxVQV9UVEFCTEU8L2NvZGU+LAorPGNvZGU+TFVBX1RGVU5DVElPTjwvY29kZT4sCis8Y29kZT5MVUFfVFVTRVJEQVRBPC9jb2RlPiwKKzxjb2RlPkxVQV9UVEhSRUFEPC9jb2RlPiwKK2FuZAorPGNvZGU+TFVBX1RMSUdIVFVTRVJEQVRBPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90eXBlbmFtZSI+PGNvZGU+bHVhX3R5cGVuYW1lPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFfdHlwZW5hbWUgIChsdWFfU3RhdGUgKkwsIGludCB0cCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBlbmNvZGVkIGJ5IHRoZSB2YWx1ZSA8Y29kZT50cDwvY29kZT4sCit3aGljaCBtdXN0IGJlIG9uZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNsdWFfdHlwZSI+PGNvZGU+bHVhX3R5cGU8L2NvZGU+PC9hPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9Xcml0ZXIiPjxjb2RlPmx1YV9Xcml0ZXI8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgaW50ICgqbHVhX1dyaXRlcikgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1ZCk7PC9wcmU+CisKKzxwPgorVGhlIHR5cGUgb2YgdGhlIHdyaXRlciBmdW5jdGlvbiB1c2VkIGJ5IDxhIGhyZWY9IiNsdWFfZHVtcCI+PGNvZGU+bHVhX2R1bXA8L2NvZGU+PC9hPi4KK0V2ZXJ5IHRpbWUgaXQgcHJvZHVjZXMgYW5vdGhlciBwaWVjZSBvZiBjaHVuaywKKzxhIGhyZWY9IiNsdWFfZHVtcCI+PGNvZGU+bHVhX2R1bXA8L2NvZGU+PC9hPiBjYWxscyB0aGUgd3JpdGVyLAorcGFzc2luZyBhbG9uZyB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gKDxjb2RlPnA8L2NvZGU+KSwKK2l0cyBzaXplICg8Y29kZT5zejwvY29kZT4pLAorYW5kIHRoZSA8Y29kZT5kYXRhPC9jb2RlPiBwYXJhbWV0ZXIgc3VwcGxpZWQgdG8gPGEgaHJlZj0iI2x1YV9kdW1wIj48Y29kZT5sdWFfZHVtcDwvY29kZT48L2E+LgorCisKKzxwPgorVGhlIHdyaXRlciByZXR1cm5zIGFuIGVycm9yIGNvZGU6CiswJm5ic3A7bWVhbnMgbm8gZXJyb3JzOworYW55IG90aGVyIHZhbHVlIG1lYW5zIGFuIGVycm9yIGFuZCBzdG9wcyA8YSBocmVmPSIjbHVhX2R1bXAiPjxjb2RlPmx1YV9kdW1wPC9jb2RlPjwvYT4gZnJvbQorY2FsbGluZyB0aGUgd3JpdGVyIGFnYWluLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3htb3ZlIj48Y29kZT5sdWFfeG1vdmU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0/LCArPywgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3htb3ZlIChsdWFfU3RhdGUgKmZyb20sIGx1YV9TdGF0ZSAqdG8sIGludCBuKTs8L3ByZT4KKworPHA+CitFeGNoYW5nZSB2YWx1ZXMgYmV0d2VlbiBkaWZmZXJlbnQgdGhyZWFkcyBvZiB0aGUgPGVtPnNhbWU8L2VtPiBnbG9iYWwgc3RhdGUuCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHBvcHMgPGNvZGU+bjwvY29kZT4gdmFsdWVzIGZyb20gdGhlIHN0YWNrIDxjb2RlPmZyb208L2NvZGU+LAorYW5kIHB1c2hlcyB0aGVtIG9udG8gdGhlIHN0YWNrIDxjb2RlPnRvPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV95aWVsZCI+PGNvZGU+bHVhX3lpZWxkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstPywgKz8sIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX3lpZWxkICAobHVhX1N0YXRlICpMLCBpbnQgbnJlc3VsdHMpOzwvcHJlPgorCis8cD4KK1lpZWxkcyBhIGNvcm91dGluZS4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFzIHRoZQorcmV0dXJuIGV4cHJlc3Npb24gb2YgYSBDJm5ic3A7ZnVuY3Rpb24sIGFzIGZvbGxvd3M6CisKKzxwcmU+CisgICAgIHJldHVybiBsdWFfeWllbGQgKEwsIG5yZXN1bHRzKTsKKzwvcHJlPjxwPgorV2hlbiBhIEMmbmJzcDtmdW5jdGlvbiBjYWxscyA8YSBocmVmPSIjbHVhX3lpZWxkIj48Y29kZT5sdWFfeWllbGQ8L2NvZGU+PC9hPiBpbiB0aGF0IHdheSwKK3RoZSBydW5uaW5nIGNvcm91dGluZSBzdXNwZW5kcyBpdHMgZXhlY3V0aW9uLAorYW5kIHRoZSBjYWxsIHRvIDxhIGhyZWY9IiNsdWFfcmVzdW1lIj48Y29kZT5sdWFfcmVzdW1lPC9jb2RlPjwvYT4gdGhhdCBzdGFydGVkIHRoaXMgY29yb3V0aW5lIHJldHVybnMuCitUaGUgcGFyYW1ldGVyIDxjb2RlPm5yZXN1bHRzPC9jb2RlPiBpcyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBmcm9tIHRoZSBzdGFjawordGhhdCBhcmUgcGFzc2VkIGFzIHJlc3VsdHMgdG8gPGEgaHJlZj0iI2x1YV9yZXN1bWUiPjxjb2RlPmx1YV9yZXN1bWU8L2NvZGU+PC9hPi4KKworCisKKworCisKKworPGgyPjMuOCAtIDxhIG5hbWU9IjMuOCI+VGhlIERlYnVnIEludGVyZmFjZTwvYT48L2gyPgorCis8cD4KK0x1YSBoYXMgbm8gYnVpbHQtaW4gZGVidWdnaW5nIGZhY2lsaXRpZXMuCitJbnN0ZWFkLCBpdCBvZmZlcnMgYSBzcGVjaWFsIGludGVyZmFjZQorYnkgbWVhbnMgb2YgZnVuY3Rpb25zIGFuZCA8ZW0+aG9va3M8L2VtPi4KK1RoaXMgaW50ZXJmYWNlIGFsbG93cyB0aGUgY29uc3RydWN0aW9uIG9mIGRpZmZlcmVudAora2luZHMgb2YgZGVidWdnZXJzLCBwcm9maWxlcnMsIGFuZCBvdGhlciB0b29scwordGhhdCBuZWVkICJpbnNpZGUgaW5mb3JtYXRpb24iIGZyb20gdGhlIGludGVycHJldGVyLgorCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfRGVidWciPjxjb2RlPmx1YV9EZWJ1ZzwvY29kZT48L2E+PC9oMz4KKzxwcmU+dHlwZWRlZiBzdHJ1Y3QgbHVhX0RlYnVnIHsKKyAgaW50IGV2ZW50OworICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgLyogKG4pICovCisgIGNvbnN0IGNoYXIgKm5hbWV3aGF0OyAgICAgICAvKiAobikgKi8KKyAgY29uc3QgY2hhciAqd2hhdDsgICAgICAgICAgIC8qIChTKSAqLworICBjb25zdCBjaGFyICpzb3VyY2U7ICAgICAgICAgLyogKFMpICovCisgIGludCBjdXJyZW50bGluZTsgICAgICAgICAgICAvKiAobCkgKi8KKyAgaW50IG51cHM7ICAgICAgICAgICAgICAgICAgIC8qICh1KSBudW1iZXIgb2YgdXB2YWx1ZXMgKi8KKyAgaW50IGxpbmVkZWZpbmVkOyAgICAgICAgICAgIC8qIChTKSAqLworICBpbnQgbGFzdGxpbmVkZWZpbmVkOyAgICAgICAgLyogKFMpICovCisgIGNoYXIgc2hvcnRfc3JjW0xVQV9JRFNJWkVdOyAvKiAoUykgKi8KKyAgLyogcHJpdmF0ZSBwYXJ0ICovCisgIDxlbT5vdGhlciBmaWVsZHM8L2VtPgorfSBsdWFfRGVidWc7PC9wcmU+CisKKzxwPgorQSBzdHJ1Y3R1cmUgdXNlZCB0byBjYXJyeSBkaWZmZXJlbnQgcGllY2VzIG9mCitpbmZvcm1hdGlvbiBhYm91dCBhbiBhY3RpdmUgZnVuY3Rpb24uCis8YSBocmVmPSIjbHVhX2dldHN0YWNrIj48Y29kZT5sdWFfZ2V0c3RhY2s8L2NvZGU+PC9hPiBmaWxscyBvbmx5IHRoZSBwcml2YXRlIHBhcnQKK29mIHRoaXMgc3RydWN0dXJlLCBmb3IgbGF0ZXIgdXNlLgorVG8gZmlsbCB0aGUgb3RoZXIgZmllbGRzIG9mIDxhIGhyZWY9IiNsdWFfRGVidWciPjxjb2RlPmx1YV9EZWJ1ZzwvY29kZT48L2E+IHdpdGggdXNlZnVsIGluZm9ybWF0aW9uLAorY2FsbCA8YSBocmVmPSIjbHVhX2dldGluZm8iPjxjb2RlPmx1YV9nZXRpbmZvPC9jb2RlPjwvYT4uCisKKworPHA+CitUaGUgZmllbGRzIG9mIDxhIGhyZWY9IiNsdWFfRGVidWciPjxjb2RlPmx1YV9EZWJ1ZzwvY29kZT48L2E+IGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nOgorCis8dWw+CisKKzxsaT48Yj48Y29kZT5zb3VyY2U8L2NvZGU+OjwvYj4KK0lmIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiBhIHN0cmluZywKK3RoZW4gPGNvZGU+c291cmNlPC9jb2RlPiBpcyB0aGF0IHN0cmluZy4KK0lmIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiBhIGZpbGUsCit0aGVuIDxjb2RlPnNvdXJjZTwvY29kZT4gc3RhcnRzIHdpdGggYSAnPGNvZGU+QDwvY29kZT4nIGZvbGxvd2VkIGJ5IHRoZSBmaWxlIG5hbWUuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+c2hvcnRfc3JjPC9jb2RlPjo8L2I+CithICJwcmludGFibGUiIHZlcnNpb24gb2YgPGNvZGU+c291cmNlPC9jb2RlPiwgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5saW5lZGVmaW5lZDwvY29kZT46PC9iPgordGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiBzdGFydHMuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+bGFzdGxpbmVkZWZpbmVkPC9jb2RlPjo8L2I+Cit0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIGVuZHMuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+d2hhdDwvY29kZT46PC9iPgordGhlIHN0cmluZyA8Y29kZT4iTHVhIjwvY29kZT4gaWYgdGhlIGZ1bmN0aW9uIGlzIGEgTHVhIGZ1bmN0aW9uLAorPGNvZGU+IkMiPC9jb2RlPiBpZiBpdCBpcyBhIEMmbmJzcDtmdW5jdGlvbiwKKzxjb2RlPiJtYWluIjwvY29kZT4gaWYgaXQgaXMgdGhlIG1haW4gcGFydCBvZiBhIGNodW5rLAorYW5kIDxjb2RlPiJ0YWlsIjwvY29kZT4gaWYgaXQgd2FzIGEgZnVuY3Rpb24gdGhhdCBkaWQgYSB0YWlsIGNhbGwuCitJbiB0aGUgbGF0dGVyIGNhc2UsCitMdWEgaGFzIG5vIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmdW5jdGlvbi4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5jdXJyZW50bGluZTwvY29kZT46PC9iPgordGhlIGN1cnJlbnQgbGluZSB3aGVyZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgZXhlY3V0aW5nLgorV2hlbiBubyBsaW5lIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwKKzxjb2RlPmN1cnJlbnRsaW5lPC9jb2RlPiBpcyBzZXQgdG8gLTEuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+bmFtZTwvY29kZT46PC9iPgorYSByZWFzb25hYmxlIG5hbWUgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbi4KK0JlY2F1c2UgZnVuY3Rpb25zIGluIEx1YSBhcmUgZmlyc3QtY2xhc3MgdmFsdWVzLAordGhleSBkbyBub3QgaGF2ZSBhIGZpeGVkIG5hbWU6Citzb21lIGZ1bmN0aW9ucyBjYW4gYmUgdGhlIHZhbHVlIG9mIG11bHRpcGxlIGdsb2JhbCB2YXJpYWJsZXMsCit3aGlsZSBvdGhlcnMgY2FuIGJlIHN0b3JlZCBvbmx5IGluIGEgdGFibGUgZmllbGQuCitUaGUgPGNvZGU+bHVhX2dldGluZm88L2NvZGU+IGZ1bmN0aW9uIGNoZWNrcyBob3cgdGhlIGZ1bmN0aW9uIHdhcworY2FsbGVkIHRvIGZpbmQgYSBzdWl0YWJsZSBuYW1lLgorSWYgaXQgY2Fubm90IGZpbmQgYSBuYW1lLAordGhlbiA8Y29kZT5uYW1lPC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+TlVMTDwvY29kZT4uCis8L2xpPgorCis8bGk+PGI+PGNvZGU+bmFtZXdoYXQ8L2NvZGU+OjwvYj4KK2V4cGxhaW5zIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBmaWVsZC4KK1RoZSB2YWx1ZSBvZiA8Y29kZT5uYW1ld2hhdDwvY29kZT4gY2FuIGJlCis8Y29kZT4iZ2xvYmFsIjwvY29kZT4sIDxjb2RlPiJsb2NhbCI8L2NvZGU+LCA8Y29kZT4ibWV0aG9kIjwvY29kZT4sCis8Y29kZT4iZmllbGQiPC9jb2RlPiwgPGNvZGU+InVwdmFsdWUiPC9jb2RlPiwgb3IgPGNvZGU+IiI8L2NvZGU+ICh0aGUgZW1wdHkgc3RyaW5nKSwKK2FjY29yZGluZyB0byBob3cgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCisoTHVhIHVzZXMgdGhlIGVtcHR5IHN0cmluZyB3aGVuIG5vIG90aGVyIG9wdGlvbiBzZWVtcyB0byBhcHBseS4pCis8L2xpPgorCis8bGk+PGI+PGNvZGU+bnVwczwvY29kZT46PC9iPgordGhlIG51bWJlciBvZiB1cHZhbHVlcyBvZiB0aGUgZnVuY3Rpb24uCis8L2xpPgorCis8L3VsPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXRob29rIj48Y29kZT5sdWFfZ2V0aG9vazwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX0hvb2sgbHVhX2dldGhvb2sgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyB0aGUgY3VycmVudCBob29rIGZ1bmN0aW9uLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGhvb2tjb3VudCI+PGNvZGU+bHVhX2dldGhvb2tjb3VudDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nZXRob29rY291bnQgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyB0aGUgY3VycmVudCBob29rIGNvdW50LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGhvb2ttYXNrIj48Y29kZT5sdWFfZ2V0aG9va21hc2s8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfZ2V0aG9va21hc2sgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyB0aGUgY3VycmVudCBob29rIG1hc2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0aW5mbyI+PGNvZGU+bHVhX2dldGluZm88L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0oMHwxKSwgKygwfDF8MiksIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX2dldGluZm8gKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqd2hhdCwgbHVhX0RlYnVnICphcik7PC9wcmU+CisKKzxwPgorUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIGludm9jYXRpb24uCisKKworPHA+CitUbyBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbiBpbnZvY2F0aW9uLAordGhlIHBhcmFtZXRlciA8Y29kZT5hcjwvY29kZT4gbXVzdCBiZSBhIHZhbGlkIGFjdGl2YXRpb24gcmVjb3JkIHRoYXQgd2FzCitmaWxsZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIDxhIGhyZWY9IiNsdWFfZ2V0c3RhY2siPjxjb2RlPmx1YV9nZXRzdGFjazwvY29kZT48L2E+IG9yCitnaXZlbiBhcyBhcmd1bWVudCB0byBhIGhvb2sgKHNlZSA8YSBocmVmPSIjbHVhX0hvb2siPjxjb2RlPmx1YV9Ib29rPC9jb2RlPjwvYT4pLgorCisKKzxwPgorVG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24geW91IHB1c2ggaXQgb250byB0aGUgc3RhY2sKK2FuZCBzdGFydCB0aGUgPGNvZGU+d2hhdDwvY29kZT4gc3RyaW5nIHdpdGggdGhlIGNoYXJhY3RlciAnPGNvZGU+Jmd0OzwvY29kZT4nLgorKEluIHRoYXQgY2FzZSwKKzxjb2RlPmx1YV9nZXRpbmZvPC9jb2RlPiBwb3BzIHRoZSBmdW5jdGlvbiBpbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4pCitGb3IgaW5zdGFuY2UsIHRvIGtub3cgaW4gd2hpY2ggbGluZSBhIGZ1bmN0aW9uIDxjb2RlPmY8L2NvZGU+IHdhcyBkZWZpbmVkLAoreW91IGNhbiB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6CisKKzxwcmU+CisgICAgIGx1YV9EZWJ1ZyBhcjsKKyAgICAgbHVhX2dldGZpZWxkKEwsIExVQV9HTE9CQUxTSU5ERVgsICJmIik7ICAvKiBnZXQgZ2xvYmFsICdmJyAqLworICAgICBsdWFfZ2V0aW5mbyhMLCAiJmd0O1MiLCAmYW1wO2FyKTsKKyAgICAgcHJpbnRmKCIlZFxuIiwgYXIubGluZWRlZmluZWQpOworPC9wcmU+CisKKzxwPgorRWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyA8Y29kZT53aGF0PC9jb2RlPgorc2VsZWN0cyBzb21lIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlIDxjb2RlPmFyPC9jb2RlPiB0byBiZSBmaWxsZWQgb3IKK2EgdmFsdWUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjazoKKworPHVsPgorCis8bGk+PGI+Jzxjb2RlPm48L2NvZGU+Jzo8L2I+IGZpbGxzIGluIHRoZSBmaWVsZCA8Y29kZT5uYW1lPC9jb2RlPiBhbmQgPGNvZGU+bmFtZXdoYXQ8L2NvZGU+OworPC9saT4KKworPGxpPjxiPic8Y29kZT5TPC9jb2RlPic6PC9iPgorZmlsbHMgaW4gdGhlIGZpZWxkcyA8Y29kZT5zb3VyY2U8L2NvZGU+LCA8Y29kZT5zaG9ydF9zcmM8L2NvZGU+LAorPGNvZGU+bGluZWRlZmluZWQ8L2NvZGU+LCA8Y29kZT5sYXN0bGluZWRlZmluZWQ8L2NvZGU+LCBhbmQgPGNvZGU+d2hhdDwvY29kZT47Cis8L2xpPgorCis8bGk+PGI+Jzxjb2RlPmw8L2NvZGU+Jzo8L2I+IGZpbGxzIGluIHRoZSBmaWVsZCA8Y29kZT5jdXJyZW50bGluZTwvY29kZT47Cis8L2xpPgorCis8bGk+PGI+Jzxjb2RlPnU8L2NvZGU+Jzo8L2I+IGZpbGxzIGluIHRoZSBmaWVsZCA8Y29kZT5udXBzPC9jb2RlPjsKKzwvbGk+CisKKzxsaT48Yj4nPGNvZGU+ZjwvY29kZT4nOjwvYj4KK3B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgZnVuY3Rpb24gdGhhdCBpcworcnVubmluZyBhdCB0aGUgZ2l2ZW4gbGV2ZWw7Cis8L2xpPgorCis8bGk+PGI+Jzxjb2RlPkw8L2NvZGU+Jzo8L2I+CitwdXNoZXMgb250byB0aGUgc3RhY2sgYSB0YWJsZSB3aG9zZSBpbmRpY2VzIGFyZSB0aGUKK251bWJlcnMgb2YgdGhlIGxpbmVzIHRoYXQgYXJlIHZhbGlkIG9uIHRoZSBmdW5jdGlvbi4KKyhBIDxlbT52YWxpZCBsaW5lPC9lbT4gaXMgYSBsaW5lIHdpdGggc29tZSBhc3NvY2lhdGVkIGNvZGUsCit0aGF0IGlzLCBhIGxpbmUgd2hlcmUgeW91IGNhbiBwdXQgYSBicmVhayBwb2ludC4KK05vbi12YWxpZCBsaW5lcyBpbmNsdWRlIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50cy4pCis8L2xpPgorCis8L3VsPgorCis8cD4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyAwIG9uIGVycm9yCisoZm9yIGluc3RhbmNlLCBhbiBpbnZhbGlkIG9wdGlvbiBpbiA8Y29kZT53aGF0PC9jb2RlPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0bG9jYWwiPjxjb2RlPmx1YV9nZXRsb2NhbDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsoMHwxKSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV9nZXRsb2NhbCAobHVhX1N0YXRlICpMLCBsdWFfRGVidWcgKmFyLCBpbnQgbik7PC9wcmU+CisKKzxwPgorR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIGxvY2FsIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gYWN0aXZhdGlvbiByZWNvcmQuCitUaGUgcGFyYW1ldGVyIDxjb2RlPmFyPC9jb2RlPiBtdXN0IGJlIGEgdmFsaWQgYWN0aXZhdGlvbiByZWNvcmQgdGhhdCB3YXMKK2ZpbGxlZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gPGEgaHJlZj0iI2x1YV9nZXRzdGFjayI+PGNvZGU+bHVhX2dldHN0YWNrPC9jb2RlPjwvYT4gb3IKK2dpdmVuIGFzIGFyZ3VtZW50IHRvIGEgaG9vayAoc2VlIDxhIGhyZWY9IiNsdWFfSG9vayI+PGNvZGU+bHVhX0hvb2s8L2NvZGU+PC9hPikuCitUaGUgaW5kZXggPGNvZGU+bjwvY29kZT4gc2VsZWN0cyB3aGljaCBsb2NhbCB2YXJpYWJsZSB0byBpbnNwZWN0CisoMSBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIG9yIGFjdGl2ZSBsb2NhbCB2YXJpYWJsZSwgYW5kIHNvIG9uLAordW50aWwgdGhlIGxhc3QgYWN0aXZlIGxvY2FsIHZhcmlhYmxlKS4KKzxhIGhyZWY9IiNsdWFfZ2V0bG9jYWwiPjxjb2RlPmx1YV9nZXRsb2NhbDwvY29kZT48L2E+IHB1c2hlcyB0aGUgdmFyaWFibGUncyB2YWx1ZSBvbnRvIHRoZSBzdGFjaworYW5kIHJldHVybnMgaXRzIG5hbWUuCisKKworPHA+CitWYXJpYWJsZSBuYW1lcyBzdGFydGluZyB3aXRoICc8Y29kZT4oPC9jb2RlPicgKG9wZW4gcGFyZW50aGVzZXMpCityZXByZXNlbnQgaW50ZXJuYWwgdmFyaWFibGVzCisobG9vcCBjb250cm9sIHZhcmlhYmxlcywgdGVtcG9yYXJpZXMsIGFuZCBDJm5ic3A7ZnVuY3Rpb24gbG9jYWxzKS4KKworCis8cD4KK1JldHVybnMgPGNvZGU+TlVMTDwvY29kZT4gKGFuZCBwdXNoZXMgbm90aGluZykKK3doZW4gdGhlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbgordGhlIG51bWJlciBvZiBhY3RpdmUgbG9jYWwgdmFyaWFibGVzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldHN0YWNrIj48Y29kZT5sdWFfZ2V0c3RhY2s8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfZ2V0c3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IGxldmVsLCBsdWFfRGVidWcgKmFyKTs8L3ByZT4KKworPHA+CitHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVycHJldGVyIHJ1bnRpbWUgc3RhY2suCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGZpbGxzIHBhcnRzIG9mIGEgPGEgaHJlZj0iI2x1YV9EZWJ1ZyI+PGNvZGU+bHVhX0RlYnVnPC9jb2RlPjwvYT4gc3RydWN0dXJlIHdpdGgKK2FuIGlkZW50aWZpY2F0aW9uIG9mIHRoZSA8ZW0+YWN0aXZhdGlvbiByZWNvcmQ8L2VtPgorb2YgdGhlIGZ1bmN0aW9uIGV4ZWN1dGluZyBhdCBhIGdpdmVuIGxldmVsLgorTGV2ZWwmbmJzcDswIGlzIHRoZSBjdXJyZW50IHJ1bm5pbmcgZnVuY3Rpb24sCit3aGVyZWFzIGxldmVsIDxlbT5uKzE8L2VtPiBpcyB0aGUgZnVuY3Rpb24gdGhhdCBoYXMgY2FsbGVkIGxldmVsIDxlbT5uPC9lbT4uCitXaGVuIHRoZXJlIGFyZSBubyBlcnJvcnMsIDxhIGhyZWY9IiNsdWFfZ2V0c3RhY2siPjxjb2RlPmx1YV9nZXRzdGFjazwvY29kZT48L2E+IHJldHVybnMgMTsKK3doZW4gY2FsbGVkIHdpdGggYSBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHN0YWNrIGRlcHRoLAoraXQgcmV0dXJucyAwLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldHVwdmFsdWUiPjxjb2RlPmx1YV9nZXR1cHZhbHVlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKygwfDEpLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhX2dldHVwdmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGZ1bmNpbmRleCwgaW50IG4pOzwvcHJlPgorCis8cD4KK0dldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBjbG9zdXJlJ3MgdXB2YWx1ZS4KKyhGb3IgTHVhIGZ1bmN0aW9ucywKK3VwdmFsdWVzIGFyZSB0aGUgZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGVzIHRoYXQgdGhlIGZ1bmN0aW9uIHVzZXMsCithbmQgdGhhdCBhcmUgY29uc2VxdWVudGx5IGluY2x1ZGVkIGluIGl0cyBjbG9zdXJlLikKKzxhIGhyZWY9IiNsdWFfZ2V0dXB2YWx1ZSI+PGNvZGU+bHVhX2dldHVwdmFsdWU8L2NvZGU+PC9hPiBnZXRzIHRoZSBpbmRleCA8Y29kZT5uPC9jb2RlPiBvZiBhbiB1cHZhbHVlLAorcHVzaGVzIHRoZSB1cHZhbHVlJ3MgdmFsdWUgb250byB0aGUgc3RhY2ssCithbmQgcmV0dXJucyBpdHMgbmFtZS4KKzxjb2RlPmZ1bmNpbmRleDwvY29kZT4gcG9pbnRzIHRvIHRoZSBjbG9zdXJlIGluIHRoZSBzdGFjay4KKyhVcHZhbHVlcyBoYXZlIG5vIHBhcnRpY3VsYXIgb3JkZXIsCithcyB0aGV5IGFyZSBhY3RpdmUgdGhyb3VnaCB0aGUgd2hvbGUgZnVuY3Rpb24uCitTbywgdGhleSBhcmUgbnVtYmVyZWQgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLikKKworCis8cD4KK1JldHVybnMgPGNvZGU+TlVMTDwvY29kZT4gKGFuZCBwdXNoZXMgbm90aGluZykKK3doZW4gdGhlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVwdmFsdWVzLgorRm9yIEMmbmJzcDtmdW5jdGlvbnMsIHRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPgorYXMgYSBuYW1lIGZvciBhbGwgdXB2YWx1ZXMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfSG9vayI+PGNvZGU+bHVhX0hvb2s8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgdm9pZCAoKmx1YV9Ib29rKSAobHVhX1N0YXRlICpMLCBsdWFfRGVidWcgKmFyKTs8L3ByZT4KKworPHA+CitUeXBlIGZvciBkZWJ1Z2dpbmcgaG9vayBmdW5jdGlvbnMuCisKKworPHA+CitXaGVuZXZlciBhIGhvb2sgaXMgY2FsbGVkLCBpdHMgPGNvZGU+YXI8L2NvZGU+IGFyZ3VtZW50IGhhcyBpdHMgZmllbGQKKzxjb2RlPmV2ZW50PC9jb2RlPiBzZXQgdG8gdGhlIHNwZWNpZmljIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBob29rLgorTHVhIGlkZW50aWZpZXMgdGhlc2UgZXZlbnRzIHdpdGggdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Cis8YSBuYW1lPSJwZGYtTFVBX0hPT0tDQUxMIj48Y29kZT5MVUFfSE9PS0NBTEw8L2NvZGU+PC9hPiwgPGEgbmFtZT0icGRmLUxVQV9IT09LUkVUIj48Y29kZT5MVUFfSE9PS1JFVDwvY29kZT48L2E+LAorPGEgbmFtZT0icGRmLUxVQV9IT09LVEFJTFJFVCI+PGNvZGU+TFVBX0hPT0tUQUlMUkVUPC9jb2RlPjwvYT4sIDxhIG5hbWU9InBkZi1MVUFfSE9PS0xJTkUiPjxjb2RlPkxVQV9IT09LTElORTwvY29kZT48L2E+LAorYW5kIDxhIG5hbWU9InBkZi1MVUFfSE9PS0NPVU5UIj48Y29kZT5MVUFfSE9PS0NPVU5UPC9jb2RlPjwvYT4uCitNb3Jlb3ZlciwgZm9yIGxpbmUgZXZlbnRzLCB0aGUgZmllbGQgPGNvZGU+Y3VycmVudGxpbmU8L2NvZGU+IGlzIGFsc28gc2V0LgorVG8gZ2V0IHRoZSB2YWx1ZSBvZiBhbnkgb3RoZXIgZmllbGQgaW4gPGNvZGU+YXI8L2NvZGU+LAordGhlIGhvb2sgbXVzdCBjYWxsIDxhIGhyZWY9IiNsdWFfZ2V0aW5mbyI+PGNvZGU+bHVhX2dldGluZm88L2NvZGU+PC9hPi4KK0ZvciByZXR1cm4gZXZlbnRzLCA8Y29kZT5ldmVudDwvY29kZT4gY2FuIGJlIDxjb2RlPkxVQV9IT09LUkVUPC9jb2RlPiwKK3RoZSBub3JtYWwgdmFsdWUsIG9yIDxjb2RlPkxVQV9IT09LVEFJTFJFVDwvY29kZT4uCitJbiB0aGUgbGF0dGVyIGNhc2UsIEx1YSBpcyBzaW11bGF0aW5nIGEgcmV0dXJuIGZyb20KK2EgZnVuY3Rpb24gdGhhdCBkaWQgYSB0YWlsIGNhbGw7CitpbiB0aGlzIGNhc2UsIGl0IGlzIHVzZWxlc3MgdG8gY2FsbCA8YSBocmVmPSIjbHVhX2dldGluZm8iPjxjb2RlPmx1YV9nZXRpbmZvPC9jb2RlPjwvYT4uCisKKworPHA+CitXaGlsZSBMdWEgaXMgcnVubmluZyBhIGhvb2ssIGl0IGRpc2FibGVzIG90aGVyIGNhbGxzIHRvIGhvb2tzLgorVGhlcmVmb3JlLCBpZiBhIGhvb2sgY2FsbHMgYmFjayBMdWEgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIG9yIGEgY2h1bmssCit0aGlzIGV4ZWN1dGlvbiBvY2N1cnMgd2l0aG91dCBhbnkgY2FsbHMgdG8gaG9va3MuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0aG9vayI+PGNvZGU+bHVhX3NldGhvb2s8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfc2V0aG9vayAobHVhX1N0YXRlICpMLCBsdWFfSG9vayBmLCBpbnQgbWFzaywgaW50IGNvdW50KTs8L3ByZT4KKworPHA+CitTZXRzIHRoZSBkZWJ1Z2dpbmcgaG9vayBmdW5jdGlvbi4KKworCis8cD4KK0FyZ3VtZW50IDxjb2RlPmY8L2NvZGU+IGlzIHRoZSBob29rIGZ1bmN0aW9uLgorPGNvZGU+bWFzazwvY29kZT4gc3BlY2lmaWVzIG9uIHdoaWNoIGV2ZW50cyB0aGUgaG9vayB3aWxsIGJlIGNhbGxlZDoKK2l0IGlzIGZvcm1lZCBieSBhIGJpdHdpc2Ugb3Igb2YgdGhlIGNvbnN0YW50cworPGEgbmFtZT0icGRmLUxVQV9NQVNLQ0FMTCI+PGNvZGU+TFVBX01BU0tDQUxMPC9jb2RlPjwvYT4sCis8YSBuYW1lPSJwZGYtTFVBX01BU0tSRVQiPjxjb2RlPkxVQV9NQVNLUkVUPC9jb2RlPjwvYT4sCis8YSBuYW1lPSJwZGYtTFVBX01BU0tMSU5FIj48Y29kZT5MVUFfTUFTS0xJTkU8L2NvZGU+PC9hPiwKK2FuZCA8YSBuYW1lPSJwZGYtTFVBX01BU0tDT1VOVCI+PGNvZGU+TFVBX01BU0tDT1VOVDwvY29kZT48L2E+LgorVGhlIDxjb2RlPmNvdW50PC9jb2RlPiBhcmd1bWVudCBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgbWFzaworaW5jbHVkZXMgPGNvZGU+TFVBX01BU0tDT1VOVDwvY29kZT4uCitGb3IgZWFjaCBldmVudCwgdGhlIGhvb2sgaXMgY2FsbGVkIGFzIGV4cGxhaW5lZCBiZWxvdzoKKworPHVsPgorCis8bGk+PGI+VGhlIGNhbGwgaG9vazo8L2I+IGlzIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnByZXRlciBjYWxscyBhIGZ1bmN0aW9uLgorVGhlIGhvb2sgaXMgY2FsbGVkIGp1c3QgYWZ0ZXIgTHVhIGVudGVycyB0aGUgbmV3IGZ1bmN0aW9uLAorYmVmb3JlIHRoZSBmdW5jdGlvbiBnZXRzIGl0cyBhcmd1bWVudHMuCis8L2xpPgorCis8bGk+PGI+VGhlIHJldHVybiBob29rOjwvYj4gaXMgY2FsbGVkIHdoZW4gdGhlIGludGVycHJldGVyIHJldHVybnMgZnJvbSBhIGZ1bmN0aW9uLgorVGhlIGhvb2sgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIEx1YSBsZWF2ZXMgdGhlIGZ1bmN0aW9uLgorWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoZSB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgorPC9saT4KKworPGxpPjxiPlRoZSBsaW5lIGhvb2s6PC9iPiBpcyBjYWxsZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgaXMgYWJvdXQgdG8KK3N0YXJ0IHRoZSBleGVjdXRpb24gb2YgYSBuZXcgbGluZSBvZiBjb2RlLAorb3Igd2hlbiBpdCBqdW1wcyBiYWNrIGluIHRoZSBjb2RlIChldmVuIHRvIHRoZSBzYW1lIGxpbmUpLgorKFRoaXMgZXZlbnQgb25seSBoYXBwZW5zIHdoaWxlIEx1YSBpcyBleGVjdXRpbmcgYSBMdWEgZnVuY3Rpb24uKQorPC9saT4KKworPGxpPjxiPlRoZSBjb3VudCBob29rOjwvYj4gaXMgY2FsbGVkIGFmdGVyIHRoZSBpbnRlcnByZXRlciBleGVjdXRlcyBldmVyeQorPGNvZGU+Y291bnQ8L2NvZGU+IGluc3RydWN0aW9ucy4KKyhUaGlzIGV2ZW50IG9ubHkgaGFwcGVucyB3aGlsZSBMdWEgaXMgZXhlY3V0aW5nIGEgTHVhIGZ1bmN0aW9uLikKKzwvbGk+CisKKzwvdWw+CisKKzxwPgorQSBob29rIGlzIGRpc2FibGVkIGJ5IHNldHRpbmcgPGNvZGU+bWFzazwvY29kZT4gdG8gemVyby4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9zZXRsb2NhbCI+PGNvZGU+bHVhX3NldGxvY2FsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstKDB8MSksICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhX3NldGxvY2FsIChsdWFfU3RhdGUgKkwsIGx1YV9EZWJ1ZyAqYXIsIGludCBuKTs8L3ByZT4KKworPHA+CitTZXRzIHRoZSB2YWx1ZSBvZiBhIGxvY2FsIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gYWN0aXZhdGlvbiByZWNvcmQuCitQYXJhbWV0ZXJzIDxjb2RlPmFyPC9jb2RlPiBhbmQgPGNvZGU+bjwvY29kZT4gYXJlIGFzIGluIDxhIGhyZWY9IiNsdWFfZ2V0bG9jYWwiPjxjb2RlPmx1YV9nZXRsb2NhbDwvY29kZT48L2E+Cisoc2VlIDxhIGhyZWY9IiNsdWFfZ2V0bG9jYWwiPjxjb2RlPmx1YV9nZXRsb2NhbDwvY29kZT48L2E+KS4KKzxhIGhyZWY9IiNsdWFfc2V0bG9jYWwiPjxjb2RlPmx1YV9zZXRsb2NhbDwvY29kZT48L2E+IGFzc2lnbnMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCit0byB0aGUgdmFyaWFibGUgYW5kIHJldHVybnMgaXRzIG5hbWUuCitJdCBhbHNvIHBvcHMgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorCisKKzxwPgorUmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPiAoYW5kIHBvcHMgbm90aGluZykKK3doZW4gdGhlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbgordGhlIG51bWJlciBvZiBhY3RpdmUgbG9jYWwgdmFyaWFibGVzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3NldHVwdmFsdWUiPjxjb2RlPmx1YV9zZXR1cHZhbHVlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstKDB8MSksICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhX3NldHVwdmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGZ1bmNpbmRleCwgaW50IG4pOzwvcHJlPgorCis8cD4KK1NldHMgdGhlIHZhbHVlIG9mIGEgY2xvc3VyZSdzIHVwdmFsdWUuCitJdCBhc3NpZ25zIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawordG8gdGhlIHVwdmFsdWUgYW5kIHJldHVybnMgaXRzIG5hbWUuCitJdCBhbHNvIHBvcHMgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorUGFyYW1ldGVycyA8Y29kZT5mdW5jaW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5uPC9jb2RlPiBhcmUgYXMgaW4gdGhlIDxhIGhyZWY9IiNsdWFfZ2V0dXB2YWx1ZSI+PGNvZGU+bHVhX2dldHVwdmFsdWU8L2NvZGU+PC9hPgorKHNlZSA8YSBocmVmPSIjbHVhX2dldHVwdmFsdWUiPjxjb2RlPmx1YV9nZXR1cHZhbHVlPC9jb2RlPjwvYT4pLgorCisKKzxwPgorUmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPiAoYW5kIHBvcHMgbm90aGluZykKK3doZW4gdGhlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVwdmFsdWVzLgorCisKKworCisKKworCis8aDE+NCAtIDxhIG5hbWU9IjQiPlRoZSBBdXhpbGlhcnkgTGlicmFyeTwvYT48L2gxPgorCis8cD4KKworVGhlIDxlbT5hdXhpbGlhcnkgbGlicmFyeTwvZW0+IHByb3ZpZGVzIHNldmVyYWwgY29udmVuaWVudCBmdW5jdGlvbnMKK3RvIGludGVyZmFjZSBDIHdpdGggTHVhLgorV2hpbGUgdGhlIGJhc2ljIEFQSSBwcm92aWRlcyB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucyBmb3IgYWxsIAoraW50ZXJhY3Rpb25zIGJldHdlZW4gQyBhbmQgTHVhLAordGhlIGF1eGlsaWFyeSBsaWJyYXJ5IHByb3ZpZGVzIGhpZ2hlci1sZXZlbCBmdW5jdGlvbnMgZm9yIHNvbWUKK2NvbW1vbiB0YXNrcy4KKworCis8cD4KK0FsbCBmdW5jdGlvbnMgZnJvbSB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkKK2FyZSBkZWZpbmVkIGluIGhlYWRlciBmaWxlIDxjb2RlPmxhdXhsaWIuaDwvY29kZT4gYW5kCitoYXZlIGEgcHJlZml4IDxjb2RlPmx1YUxfPC9jb2RlPi4KKworCis8cD4KK0FsbCBmdW5jdGlvbnMgaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IGFyZSBidWlsdCBvbgordG9wIG9mIHRoZSBiYXNpYyBBUEksCithbmQgc28gdGhleSBwcm92aWRlIG5vdGhpbmcgdGhhdCBjYW5ub3QgYmUgZG9uZSB3aXRoIHRoaXMgQVBJLgorCisKKzxwPgorU2V2ZXJhbCBmdW5jdGlvbnMgaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IGFyZSB1c2VkIHRvCitjaGVjayBDJm5ic3A7ZnVuY3Rpb24gYXJndW1lbnRzLgorVGhlaXIgbmFtZXMgYXJlIGFsd2F5cyA8Y29kZT5sdWFMX2NoZWNrKjwvY29kZT4gb3IgPGNvZGU+bHVhTF9vcHQqPC9jb2RlPi4KK0FsbCBvZiB0aGVzZSBmdW5jdGlvbnMgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNoZWNrIGlzIG5vdCBzYXRpc2ZpZWQuCitCZWNhdXNlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGZvcm1hdHRlZCBmb3IgYXJndW1lbnRzCisoZS5nLiwgIjxjb2RlPmJhZCBhcmd1bWVudCAjMTwvY29kZT4iKSwKK3lvdSBzaG91bGQgbm90IHVzZSB0aGVzZSBmdW5jdGlvbnMgZm9yIG90aGVyIHN0YWNrIHZhbHVlcy4KKworCisKKzxoMj40LjEgLSA8YSBuYW1lPSI0LjEiPkZ1bmN0aW9ucyBhbmQgVHlwZXM8L2E+PC9oMj4KKworPHA+CitIZXJlIHdlIGxpc3QgYWxsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkKK2luIGFscGhhYmV0aWNhbCBvcmRlci4KKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9hZGRjaGFyIj48Y29kZT5sdWFMX2FkZGNoYXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hZGRjaGFyIChsdWFMX0J1ZmZlciAqQiwgY2hhciBjKTs8L3ByZT4KKworPHA+CitBZGRzIHRoZSBjaGFyYWN0ZXIgPGNvZGU+YzwvY29kZT4gdG8gdGhlIGJ1ZmZlciA8Y29kZT5CPC9jb2RlPgorKHNlZSA8YSBocmVmPSIjbHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9hZGRsc3RyaW5nIj48Y29kZT5sdWFMX2FkZGxzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hZGRsc3RyaW5nIChsdWFMX0J1ZmZlciAqQiwgY29uc3QgY2hhciAqcywgc2l6ZV90IGwpOzwvcHJlPgorCis8cD4KK0FkZHMgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxjb2RlPnM8L2NvZGU+IHdpdGggbGVuZ3RoIDxjb2RlPmw8L2NvZGU+IHRvCit0aGUgYnVmZmVyIDxjb2RlPkI8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPikuCitUaGUgc3RyaW5nIG1heSBjb250YWluIGVtYmVkZGVkIHplcm9zLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9hZGRzaXplIj48Y29kZT5sdWFMX2FkZHNpemU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hZGRzaXplIChsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IG4pOzwvcHJlPgorCis8cD4KK0FkZHMgdG8gdGhlIGJ1ZmZlciA8Y29kZT5CPC9jb2RlPiAoc2VlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPikKK2Egc3RyaW5nIG9mIGxlbmd0aCA8Y29kZT5uPC9jb2RlPiBwcmV2aW91c2x5IGNvcGllZCB0byB0aGUKK2J1ZmZlciBhcmVhIChzZWUgPGEgaHJlZj0iI2x1YUxfcHJlcGJ1ZmZlciI+PGNvZGU+bHVhTF9wcmVwYnVmZmVyPC9jb2RlPjwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9hZGRzdHJpbmciPjxjb2RlPmx1YUxfYWRkc3RyaW5nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfYWRkc3RyaW5nIChsdWFMX0J1ZmZlciAqQiwgY29uc3QgY2hhciAqcyk7PC9wcmU+CisKKzxwPgorQWRkcyB0aGUgemVyby10ZXJtaW5hdGVkIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxjb2RlPnM8L2NvZGU+Cit0byB0aGUgYnVmZmVyIDxjb2RlPkI8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPikuCitUaGUgc3RyaW5nIG1heSBub3QgY29udGFpbiBlbWJlZGRlZCB6ZXJvcy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYWRkdmFsdWUiPjxjb2RlPmx1YUxfYWRkdmFsdWU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hZGR2YWx1ZSAobHVhTF9CdWZmZXIgKkIpOzwvcHJlPgorCis8cD4KK0FkZHMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCit0byB0aGUgYnVmZmVyIDxjb2RlPkI8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPikuCitQb3BzIHRoZSB2YWx1ZS4KKworCis8cD4KK1RoaXMgaXMgdGhlIG9ubHkgZnVuY3Rpb24gb24gc3RyaW5nIGJ1ZmZlcnMgdGhhdCBjYW4gKGFuZCBtdXN0KQorYmUgY2FsbGVkIHdpdGggYW4gZXh0cmEgZWxlbWVudCBvbiB0aGUgc3RhY2ssCit3aGljaCBpcyB0aGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIGJ1ZmZlci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYXJnY2hlY2siPjxjb2RlPmx1YUxfYXJnY2hlY2s8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hcmdjaGVjayAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICBpbnQgY29uZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5hcmcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4dHJhbXNnKTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciA8Y29kZT5jb25kPC9jb2RlPiBpcyB0cnVlLgorSWYgbm90LCByYWlzZXMgYW4gZXJyb3Igd2l0aCB0aGUgZm9sbG93aW5nIG1lc3NhZ2UsCit3aGVyZSA8Y29kZT5mdW5jPC9jb2RlPiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgY2FsbCBzdGFjazoKKworPHByZT4KKyAgICAgYmFkIGFyZ3VtZW50ICMmbHQ7bmFyZyZndDsgdG8gJmx0O2Z1bmMmZ3Q7ICgmbHQ7ZXh0cmFtc2cmZ3Q7KQorPC9wcmU+CisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9hcmdlcnJvciI+PGNvZGU+bHVhTF9hcmdlcnJvcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfYXJnZXJyb3IgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGNvbnN0IGNoYXIgKmV4dHJhbXNnKTs8L3ByZT4KKworPHA+CitSYWlzZXMgYW4gZXJyb3Igd2l0aCB0aGUgZm9sbG93aW5nIG1lc3NhZ2UsCit3aGVyZSA8Y29kZT5mdW5jPC9jb2RlPiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgY2FsbCBzdGFjazoKKworPHByZT4KKyAgICAgYmFkIGFyZ3VtZW50ICMmbHQ7bmFyZyZndDsgdG8gJmx0O2Z1bmMmZ3Q7ICgmbHQ7ZXh0cmFtc2cmZ3Q7KQorPC9wcmU+CisKKzxwPgorVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zLAorYnV0IGl0IGlzIGFuIGlkaW9tIHRvIHVzZSBpdCBpbiBDJm5ic3A7ZnVuY3Rpb25zCithcyA8Y29kZT5yZXR1cm4gbHVhTF9hcmdlcnJvcig8ZW0+YXJnczwvZW0+KTwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgc3RydWN0IGx1YUxfQnVmZmVyIGx1YUxfQnVmZmVyOzwvcHJlPgorCis8cD4KK1R5cGUgZm9yIGEgPGVtPnN0cmluZyBidWZmZXI8L2VtPi4KKworCis8cD4KK0Egc3RyaW5nIGJ1ZmZlciBhbGxvd3MgQyZuYnNwO2NvZGUgdG8gYnVpbGQgTHVhIHN0cmluZ3MgcGllY2VtZWFsLgorSXRzIHBhdHRlcm4gb2YgdXNlIGlzIGFzIGZvbGxvd3M6CisKKzx1bD4KKworPGxpPkZpcnN0IHlvdSBkZWNsYXJlIGEgdmFyaWFibGUgPGNvZGU+YjwvY29kZT4gb2YgdHlwZSA8YSBocmVmPSIjbHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT4uPC9saT4KKworPGxpPlRoZW4geW91IGluaXRpYWxpemUgaXQgd2l0aCBhIGNhbGwgPGNvZGU+bHVhTF9idWZmaW5pdChMLCAmYW1wO2IpPC9jb2RlPi48L2xpPgorCis8bGk+CitUaGVuIHlvdSBhZGQgc3RyaW5nIHBpZWNlcyB0byB0aGUgYnVmZmVyIGNhbGxpbmcgYW55IG9mCit0aGUgPGNvZGU+bHVhTF9hZGQqPC9jb2RlPiBmdW5jdGlvbnMuCis8L2xpPgorCis8bGk+CitZb3UgZmluaXNoIGJ5IGNhbGxpbmcgPGNvZGU+bHVhTF9wdXNocmVzdWx0KCZhbXA7Yik8L2NvZGU+LgorVGhpcyBjYWxsIGxlYXZlcyB0aGUgZmluYWwgc3RyaW5nIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorPC9saT4KKworPC91bD4KKworPHA+CitEdXJpbmcgaXRzIG5vcm1hbCBvcGVyYXRpb24sCithIHN0cmluZyBidWZmZXIgdXNlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBzdGFjayBzbG90cy4KK1NvLCB3aGlsZSB1c2luZyBhIGJ1ZmZlciwgeW91IGNhbm5vdCBhc3N1bWUgdGhhdCB5b3Uga25vdyB3aGVyZQordGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMuCitZb3UgY2FuIHVzZSB0aGUgc3RhY2sgYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzIHRvIGJ1ZmZlciBvcGVyYXRpb25zCithcyBsb25nIGFzIHRoYXQgdXNlIGlzIGJhbGFuY2VkOwordGhhdCBpcywKK3doZW4geW91IGNhbGwgYSBidWZmZXIgb3BlcmF0aW9uLAordGhlIHN0YWNrIGlzIGF0IHRoZSBzYW1lIGxldmVsCitpdCB3YXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHByZXZpb3VzIGJ1ZmZlciBvcGVyYXRpb24uCisoVGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyA8YSBocmVmPSIjbHVhTF9hZGR2YWx1ZSI+PGNvZGU+bHVhTF9hZGR2YWx1ZTwvY29kZT48L2E+LikKK0FmdGVyIGNhbGxpbmcgPGEgaHJlZj0iI2x1YUxfcHVzaHJlc3VsdCI+PGNvZGU+bHVhTF9wdXNocmVzdWx0PC9jb2RlPjwvYT4gdGhlIHN0YWNrIGlzIGJhY2sgdG8gaXRzCitsZXZlbCB3aGVuIHRoZSBidWZmZXIgd2FzIGluaXRpYWxpemVkLAorcGx1cyB0aGUgZmluYWwgc3RyaW5nIG9uIGl0cyB0b3AuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2J1ZmZpbml0Ij48Y29kZT5sdWFMX2J1ZmZpbml0PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfYnVmZmluaXQgKGx1YV9TdGF0ZSAqTCwgbHVhTF9CdWZmZXIgKkIpOzwvcHJlPgorCis8cD4KK0luaXRpYWxpemVzIGEgYnVmZmVyIDxjb2RlPkI8L2NvZGU+LgorVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgc3BhY2U7Cit0aGUgYnVmZmVyIG11c3QgYmUgZGVjbGFyZWQgYXMgYSB2YXJpYWJsZQorKHNlZSA8YSBocmVmPSIjbHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jYWxsbWV0YSI+PGNvZGU+bHVhTF9jYWxsbWV0YTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsoMHwxKSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2NhbGxtZXRhIChsdWFfU3RhdGUgKkwsIGludCBvYmosIGNvbnN0IGNoYXIgKmUpOzwvcHJlPgorCis8cD4KK0NhbGxzIGEgbWV0YW1ldGhvZC4KKworCis8cD4KK0lmIHRoZSBvYmplY3QgYXQgaW5kZXggPGNvZGU+b2JqPC9jb2RlPiBoYXMgYSBtZXRhdGFibGUgYW5kIHRoaXMKK21ldGF0YWJsZSBoYXMgYSBmaWVsZCA8Y29kZT5lPC9jb2RlPiwKK3RoaXMgZnVuY3Rpb24gY2FsbHMgdGhpcyBmaWVsZCBhbmQgcGFzc2VzIHRoZSBvYmplY3QgYXMgaXRzIG9ubHkgYXJndW1lbnQuCitJbiB0aGlzIGNhc2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgYW5kIHB1c2hlcyBvbnRvIHRoZQorc3RhY2sgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjYWxsLgorSWYgdGhlcmUgaXMgbm8gbWV0YXRhYmxlIG9yIG5vIG1ldGFtZXRob2QsCit0aGlzIGZ1bmN0aW9uIHJldHVybnMgMCAod2l0aG91dCBwdXNoaW5nIGFueSB2YWx1ZSBvbiB0aGUgc3RhY2spLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja2FueSI+PGNvZGU+bHVhTF9jaGVja2FueTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX2NoZWNrYW55IChsdWFfU3RhdGUgKkwsIGludCBuYXJnKTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gaGFzIGFuIGFyZ3VtZW50CitvZiBhbnkgdHlwZSAoaW5jbHVkaW5nIDxiPm5pbDwvYj4pIGF0IHBvc2l0aW9uIDxjb2RlPm5hcmc8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja2ludCI+PGNvZGU+bHVhTF9jaGVja2ludDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfY2hlY2tpbnQgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpOzwvcHJlPgorCis8cD4KK0NoZWNrcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBhcmd1bWVudCA8Y29kZT5uYXJnPC9jb2RlPiBpcyBhIG51bWJlcgorYW5kIHJldHVybnMgdGhpcyBudW1iZXIgY2FzdCB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja2ludGVnZXIiPjxjb2RlPmx1YUxfY2hlY2tpbnRlZ2VyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5sdWFfSW50ZWdlciBsdWFMX2NoZWNraW50ZWdlciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPm5hcmc8L2NvZGU+IGlzIGEgbnVtYmVyCithbmQgcmV0dXJucyB0aGlzIG51bWJlciBjYXN0IHRvIGEgPGEgaHJlZj0iI2x1YV9JbnRlZ2VyIj48Y29kZT5sdWFfSW50ZWdlcjwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja2xvbmciPjxjb2RlPmx1YUxfY2hlY2tsb25nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5sb25nIGx1YUxfY2hlY2tsb25nIChsdWFfU3RhdGUgKkwsIGludCBuYXJnKTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+bmFyZzwvY29kZT4gaXMgYSBudW1iZXIKK2FuZCByZXR1cm5zIHRoaXMgbnVtYmVyIGNhc3QgdG8gYSA8Y29kZT5sb25nPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tsc3RyaW5nIj48Y29kZT5sdWFMX2NoZWNrbHN0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhTF9jaGVja2xzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIHNpemVfdCAqbCk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPm5hcmc8L2NvZGU+IGlzIGEgc3RyaW5nCithbmQgcmV0dXJucyB0aGlzIHN0cmluZzsKK2lmIDxjb2RlPmw8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiBmaWxscyA8Y29kZT4qbDwvY29kZT4KK3dpdGggdGhlIHN0cmluZydzIGxlbmd0aC4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gdXNlcyA8YSBocmVmPSIjbHVhX3RvbHN0cmluZyI+PGNvZGU+bHVhX3RvbHN0cmluZzwvY29kZT48L2E+IHRvIGdldCBpdHMgcmVzdWx0LAorc28gYWxsIGNvbnZlcnNpb25zIGFuZCBjYXZlYXRzIG9mIHRoYXQgZnVuY3Rpb24gYXBwbHkgaGVyZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tudW1iZXIiPjxjb2RlPmx1YUxfY2hlY2tudW1iZXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9OdW1iZXIgbHVhTF9jaGVja251bWJlciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPm5hcmc8L2NvZGU+IGlzIGEgbnVtYmVyCithbmQgcmV0dXJucyB0aGlzIG51bWJlci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tvcHRpb24iPjxjb2RlPmx1YUxfY2hlY2tvcHRpb248L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2NoZWNrb3B0aW9uIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGxzdFtdKTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+bmFyZzwvY29kZT4gaXMgYSBzdHJpbmcgYW5kCitzZWFyY2hlcyBmb3IgdGhpcyBzdHJpbmcgaW4gdGhlIGFycmF5IDxjb2RlPmxzdDwvY29kZT4KKyh3aGljaCBtdXN0IGJlIE5VTEwtdGVybWluYXRlZCkuCitSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIHN0cmluZyB3YXMgZm91bmQuCitSYWlzZXMgYW4gZXJyb3IgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHN0cmluZyBvcgoraWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgZm91bmQuCisKKworPHA+CitJZiA8Y29kZT5kZWY8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwKK3RoZSBmdW5jdGlvbiB1c2VzIDxjb2RlPmRlZjwvY29kZT4gYXMgYSBkZWZhdWx0IHZhbHVlIHdoZW4KK3RoZXJlIGlzIG5vIGFyZ3VtZW50IDxjb2RlPm5hcmc8L2NvZGU+IG9yIGlmIHRoaXMgYXJndW1lbnQgaXMgPGI+bmlsPC9iPi4KKworCis8cD4KK1RoaXMgaXMgYSB1c2VmdWwgZnVuY3Rpb24gZm9yIG1hcHBpbmcgc3RyaW5ncyB0byBDJm5ic3A7ZW51bXMuCisoVGhlIHVzdWFsIGNvbnZlbnRpb24gaW4gTHVhIGxpYnJhcmllcyBpcwordG8gdXNlIHN0cmluZ3MgaW5zdGVhZCBvZiBudW1iZXJzIHRvIHNlbGVjdCBvcHRpb25zLikKKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tzdGFjayI+PGNvZGU+bHVhTF9jaGVja3N0YWNrPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfY2hlY2tzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgc3osIGNvbnN0IGNoYXIgKm1zZyk7PC9wcmU+CisKKzxwPgorR3Jvd3MgdGhlIHN0YWNrIHNpemUgdG8gPGNvZGU+dG9wICsgc3o8L2NvZGU+IGVsZW1lbnRzLAorcmFpc2luZyBhbiBlcnJvciBpZiB0aGUgc3RhY2sgY2Fubm90IGdyb3cgdG8gdGhhdCBzaXplLgorPGNvZGU+bXNnPC9jb2RlPiBpcyBhbiBhZGRpdGlvbmFsIHRleHQgdG8gZ28gaW50byB0aGUgZXJyb3IgbWVzc2FnZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tzdHJpbmciPjxjb2RlPmx1YUxfY2hlY2tzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YUxfY2hlY2tzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpOzwvcHJlPgorCis8cD4KK0NoZWNrcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBhcmd1bWVudCA8Y29kZT5uYXJnPC9jb2RlPiBpcyBhIHN0cmluZworYW5kIHJldHVybnMgdGhpcyBzdHJpbmcuCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHVzZXMgPGEgaHJlZj0iI2x1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPiB0byBnZXQgaXRzIHJlc3VsdCwKK3NvIGFsbCBjb252ZXJzaW9ucyBhbmQgY2F2ZWF0cyBvZiB0aGF0IGZ1bmN0aW9uIGFwcGx5IGhlcmUuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2NoZWNrdHlwZSI+PGNvZGU+bHVhTF9jaGVja3R5cGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9jaGVja3R5cGUgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGludCB0KTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+bmFyZzwvY29kZT4gaGFzIHR5cGUgPGNvZGU+dDwvY29kZT4uCitTZWUgPGEgaHJlZj0iI2x1YV90eXBlIj48Y29kZT5sdWFfdHlwZTwvY29kZT48L2E+IGZvciB0aGUgZW5jb2Rpbmcgb2YgdHlwZXMgZm9yIDxjb2RlPnQ8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja3VkYXRhIj48Y29kZT5sdWFMX2NoZWNrdWRhdGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgKmx1YUxfY2hlY2t1ZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgY29uc3QgY2hhciAqdG5hbWUpOzwvcHJlPgorCis8cD4KK0NoZWNrcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBhcmd1bWVudCA8Y29kZT5uYXJnPC9jb2RlPiBpcyBhIHVzZXJkYXRhCitvZiB0aGUgdHlwZSA8Y29kZT50bmFtZTwvY29kZT4gKHNlZSA8YSBocmVmPSIjbHVhTF9uZXdtZXRhdGFibGUiPjxjb2RlPmx1YUxfbmV3bWV0YXRhYmxlPC9jb2RlPjwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9kb2ZpbGUiPjxjb2RlPmx1YUxfZG9maWxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKz8sIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9kb2ZpbGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZmlsZW5hbWUpOzwvcHJlPgorCis8cD4KK0xvYWRzIGFuZCBydW5zIHRoZSBnaXZlbiBmaWxlLgorSXQgaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIG1hY3JvOgorCis8cHJlPgorICAgICAobHVhTF9sb2FkZmlsZShMLCBmaWxlbmFtZSkgfHwgbHVhX3BjYWxsKEwsIDAsIExVQV9NVUxUUkVULCAwKSkKKzwvcHJlPjxwPgorSXQgcmV0dXJucyAwIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMKK29yIDEgaW4gY2FzZSBvZiBlcnJvcnMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2Rvc3RyaW5nIj48Y29kZT5sdWFMX2Rvc3RyaW5nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKz8sIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9kb3N0cmluZyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzdHIpOzwvcHJlPgorCis8cD4KK0xvYWRzIGFuZCBydW5zIHRoZSBnaXZlbiBzdHJpbmcuCitJdCBpcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgbWFjcm86CisKKzxwcmU+CisgICAgIChsdWFMX2xvYWRzdHJpbmcoTCwgc3RyKSB8fCBsdWFfcGNhbGwoTCwgMCwgTFVBX01VTFRSRVQsIDApKQorPC9wcmU+PHA+CitJdCByZXR1cm5zIDAgaWYgdGhlcmUgYXJlIG5vIGVycm9ycworb3IgMSBpbiBjYXNlIG9mIGVycm9ycy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfZXJyb3IiPjxjb2RlPmx1YUxfZXJyb3I8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2Vycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTs8L3ByZT4KKworPHA+CitSYWlzZXMgYW4gZXJyb3IuCitUaGUgZXJyb3IgbWVzc2FnZSBmb3JtYXQgaXMgZ2l2ZW4gYnkgPGNvZGU+Zm10PC9jb2RlPgorcGx1cyBhbnkgZXh0cmEgYXJndW1lbnRzLAorZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIG9mIDxhIGhyZWY9IiNsdWFfcHVzaGZzdHJpbmciPjxjb2RlPmx1YV9wdXNoZnN0cmluZzwvY29kZT48L2E+LgorSXQgYWxzbyBhZGRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UgdGhlIGZpbGUgbmFtZSBhbmQKK3RoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsCitpZiB0aGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gbmV2ZXIgcmV0dXJucywKK2J1dCBpdCBpcyBhbiBpZGlvbSB0byB1c2UgaXQgaW4gQyZuYnNwO2Z1bmN0aW9ucworYXMgPGNvZGU+cmV0dXJuIGx1YUxfZXJyb3IoPGVtPmFyZ3M8L2VtPik8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9nZXRtZXRhZmllbGQiPjxjb2RlPmx1YUxfZ2V0bWV0YWZpZWxkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKygwfDEpLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfZ2V0bWV0YWZpZWxkIChsdWFfU3RhdGUgKkwsIGludCBvYmosIGNvbnN0IGNoYXIgKmUpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgZmllbGQgPGNvZGU+ZTwvY29kZT4gZnJvbSB0aGUgbWV0YXRhYmxlCitvZiB0aGUgb2JqZWN0IGF0IGluZGV4IDxjb2RlPm9iajwvY29kZT4uCitJZiB0aGUgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBtZXRhdGFibGUsCitvciBpZiB0aGUgbWV0YXRhYmxlIGRvZXMgbm90IGhhdmUgdGhpcyBmaWVsZCwKK3JldHVybnMgMCBhbmQgcHVzaGVzIG5vdGhpbmcuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2dldG1ldGF0YWJsZSI+PGNvZGU+bHVhTF9nZXRtZXRhdGFibGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9nZXRtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqdG5hbWUpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgbWV0YXRhYmxlIGFzc29jaWF0ZWQgd2l0aCBuYW1lIDxjb2RlPnRuYW1lPC9jb2RlPgoraW4gdGhlIHJlZ2lzdHJ5IChzZWUgPGEgaHJlZj0iI2x1YUxfbmV3bWV0YXRhYmxlIj48Y29kZT5sdWFMX25ld21ldGF0YWJsZTwvY29kZT48L2E+KS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfZ3N1YiI+PGNvZGU+bHVhTF9nc3ViPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFMX2dzdWIgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcik7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhIGNvcHkgb2Ygc3RyaW5nIDxjb2RlPnM8L2NvZGU+IGJ5IHJlcGxhY2luZworYW55IG9jY3VycmVuY2Ugb2YgdGhlIHN0cmluZyA8Y29kZT5wPC9jb2RlPgord2l0aCB0aGUgc3RyaW5nIDxjb2RlPnI8L2NvZGU+LgorUHVzaGVzIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uIHRoZSBzdGFjayBhbmQgcmV0dXJucyBpdC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbG9hZGJ1ZmZlciI+PGNvZGU+bHVhTF9sb2FkYnVmZmVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9sb2FkYnVmZmVyIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7PC9wcmU+CisKKzxwPgorTG9hZHMgYSBidWZmZXIgYXMgYSBMdWEgY2h1bmsuCitUaGlzIGZ1bmN0aW9uIHVzZXMgPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+IHRvIGxvYWQgdGhlIGNodW5rIGluIHRoZQorYnVmZmVyIHBvaW50ZWQgdG8gYnkgPGNvZGU+YnVmZjwvY29kZT4gd2l0aCBzaXplIDxjb2RlPnN6PC9jb2RlPi4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSByZXN1bHRzIGFzIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPi4KKzxjb2RlPm5hbWU8L2NvZGU+IGlzIHRoZSBjaHVuayBuYW1lLAordXNlZCBmb3IgZGVidWcgaW5mb3JtYXRpb24gYW5kIGVycm9yIG1lc3NhZ2VzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9sb2FkZmlsZSI+PGNvZGU+bHVhTF9sb2FkZmlsZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfbG9hZGZpbGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZmlsZW5hbWUpOzwvcHJlPgorCis8cD4KK0xvYWRzIGEgZmlsZSBhcyBhIEx1YSBjaHVuay4KK1RoaXMgZnVuY3Rpb24gdXNlcyA8YSBocmVmPSIjbHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT4gdG8gbG9hZCB0aGUgY2h1bmsgaW4gdGhlIGZpbGUKK25hbWVkIDxjb2RlPmZpbGVuYW1lPC9jb2RlPi4KK0lmIDxjb2RlPmZpbGVuYW1lPC9jb2RlPiBpcyA8Y29kZT5OVUxMPC9jb2RlPiwKK3RoZW4gaXQgbG9hZHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuCitUaGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZSBpcyBpZ25vcmVkIGlmIGl0IHN0YXJ0cyB3aXRoIGEgPGNvZGU+IzwvY29kZT4uCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgcmVzdWx0cyBhcyA8YSBocmVmPSIjbHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT4sCitidXQgaXQgaGFzIGFuIGV4dHJhIGVycm9yIGNvZGUgPGEgbmFtZT0icGRmLUxVQV9FUlJGSUxFIj48Y29kZT5MVUFfRVJSRklMRTwvY29kZT48L2E+CitpZiBpdCBjYW5ub3Qgb3Blbi9yZWFkIHRoZSBmaWxlLgorCisKKzxwPgorQXMgPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+LCB0aGlzIGZ1bmN0aW9uIG9ubHkgbG9hZHMgdGhlIGNodW5rOworaXQgZG9lcyBub3QgcnVuIGl0LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9sb2Fkc3RyaW5nIj48Y29kZT5sdWFMX2xvYWRzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2xvYWRzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcyk7PC9wcmU+CisKKzxwPgorTG9hZHMgYSBzdHJpbmcgYXMgYSBMdWEgY2h1bmsuCitUaGlzIGZ1bmN0aW9uIHVzZXMgPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+IHRvIGxvYWQgdGhlIGNodW5rIGluCit0aGUgemVyby10ZXJtaW5hdGVkIHN0cmluZyA8Y29kZT5zPC9jb2RlPi4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSByZXN1bHRzIGFzIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPi4KKworCis8cD4KK0Fsc28gYXMgPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+LCB0aGlzIGZ1bmN0aW9uIG9ubHkgbG9hZHMgdGhlIGNodW5rOworaXQgZG9lcyBub3QgcnVuIGl0LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9uZXdtZXRhdGFibGUiPjxjb2RlPmx1YUxfbmV3bWV0YXRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9uZXdtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqdG5hbWUpOzwvcHJlPgorCis8cD4KK0lmIHRoZSByZWdpc3RyeSBhbHJlYWR5IGhhcyB0aGUga2V5IDxjb2RlPnRuYW1lPC9jb2RlPiwKK3JldHVybnMgMC4KK090aGVyd2lzZSwKK2NyZWF0ZXMgYSBuZXcgdGFibGUgdG8gYmUgdXNlZCBhcyBhIG1ldGF0YWJsZSBmb3IgdXNlcmRhdGEsCithZGRzIGl0IHRvIHRoZSByZWdpc3RyeSB3aXRoIGtleSA8Y29kZT50bmFtZTwvY29kZT4sCithbmQgcmV0dXJucyAxLgorCisKKzxwPgorSW4gYm90aCBjYXNlcyBwdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIGZpbmFsIHZhbHVlIGFzc29jaWF0ZWQKK3dpdGggPGNvZGU+dG5hbWU8L2NvZGU+IGluIHRoZSByZWdpc3RyeS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbmV3c3RhdGUiPjxjb2RlPmx1YUxfbmV3c3RhdGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPi08L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9TdGF0ZSAqbHVhTF9uZXdzdGF0ZSAodm9pZCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhIG5ldyBMdWEgc3RhdGUuCitJdCBjYWxscyA8YSBocmVmPSIjbHVhX25ld3N0YXRlIj48Y29kZT5sdWFfbmV3c3RhdGU8L2NvZGU+PC9hPiB3aXRoIGFuCithbGxvY2F0b3IgYmFzZWQgb24gdGhlIHN0YW5kYXJkJm5ic3A7QyA8Y29kZT5yZWFsbG9jPC9jb2RlPiBmdW5jdGlvbgorYW5kIHRoZW4gc2V0cyBhIHBhbmljIGZ1bmN0aW9uIChzZWUgPGEgaHJlZj0iI2x1YV9hdHBhbmljIj48Y29kZT5sdWFfYXRwYW5pYzwvY29kZT48L2E+KSB0aGF0IHByaW50cworYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IGluIGNhc2Ugb2YgZmF0YWwKK2Vycm9ycy4KKworCis8cD4KK1JldHVybnMgdGhlIG5ldyBzdGF0ZSwKK29yIDxjb2RlPk5VTEw8L2NvZGU+IGlmIHRoZXJlIGlzIGEgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX29wZW5saWJzIj48Y29kZT5sdWFMX29wZW5saWJzPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT5tPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfb3BlbmxpYnMgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorT3BlbnMgYWxsIHN0YW5kYXJkIEx1YSBsaWJyYXJpZXMgaW50byB0aGUgZ2l2ZW4gc3RhdGUuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX29wdGludCI+PGNvZGU+bHVhTF9vcHRpbnQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX29wdGludCAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgaW50IGQpOzwvcHJlPgorCis8cD4KK0lmIHRoZSBmdW5jdGlvbiBhcmd1bWVudCA8Y29kZT5uYXJnPC9jb2RlPiBpcyBhIG51bWJlciwKK3JldHVybnMgdGhpcyBudW1iZXIgY2FzdCB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+LgorSWYgdGhpcyBhcmd1bWVudCBpcyBhYnNlbnQgb3IgaXMgPGI+bmlsPC9iPiwKK3JldHVybnMgPGNvZGU+ZDwvY29kZT4uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfb3B0aW50ZWdlciI+PGNvZGU+bHVhTF9vcHRpbnRlZ2VyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5sdWFfSW50ZWdlciBsdWFMX29wdGludGVnZXIgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9JbnRlZ2VyIGQpOzwvcHJlPgorCis8cD4KK0lmIHRoZSBmdW5jdGlvbiBhcmd1bWVudCA8Y29kZT5uYXJnPC9jb2RlPiBpcyBhIG51bWJlciwKK3JldHVybnMgdGhpcyBudW1iZXIgY2FzdCB0byBhIDxhIGhyZWY9IiNsdWFfSW50ZWdlciI+PGNvZGU+bHVhX0ludGVnZXI8L2NvZGU+PC9hPi4KK0lmIHRoaXMgYXJndW1lbnQgaXMgYWJzZW50IG9yIGlzIDxiPm5pbDwvYj4sCityZXR1cm5zIDxjb2RlPmQ8L2NvZGU+LgorT3RoZXJ3aXNlLCByYWlzZXMgYW4gZXJyb3IuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX29wdGxvbmciPjxjb2RlPmx1YUxfb3B0bG9uZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+bG9uZyBsdWFMX29wdGxvbmcgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGxvbmcgZCk7PC9wcmU+CisKKzxwPgorSWYgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPm5hcmc8L2NvZGU+IGlzIGEgbnVtYmVyLAorcmV0dXJucyB0aGlzIG51bWJlciBjYXN0IHRvIGEgPGNvZGU+bG9uZzwvY29kZT4uCitJZiB0aGlzIGFyZ3VtZW50IGlzIGFic2VudCBvciBpcyA8Yj5uaWw8L2I+LAorcmV0dXJucyA8Y29kZT5kPC9jb2RlPi4KK090aGVyd2lzZSwgcmFpc2VzIGFuIGVycm9yLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9vcHRsc3RyaW5nIj48Y29kZT5sdWFMX29wdGxzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YUxfb3B0bHN0cmluZyAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsKTs8L3ByZT4KKworPHA+CitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+bmFyZzwvY29kZT4gaXMgYSBzdHJpbmcsCityZXR1cm5zIHRoaXMgc3RyaW5nLgorSWYgdGhpcyBhcmd1bWVudCBpcyBhYnNlbnQgb3IgaXMgPGI+bmlsPC9iPiwKK3JldHVybnMgPGNvZGU+ZDwvY29kZT4uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworCis8cD4KK0lmIDxjb2RlPmw8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwKK2ZpbGxzIHRoZSBwb3NpdGlvbiA8Y29kZT4qbDwvY29kZT4gd2l0aCB0aGUgcmVzdWx0cydzIGxlbmd0aC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfb3B0bnVtYmVyIj48Y29kZT5sdWFMX29wdG51bWJlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX051bWJlciBsdWFMX29wdG51bWJlciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgbHVhX051bWJlciBkKTs8L3ByZT4KKworPHA+CitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+bmFyZzwvY29kZT4gaXMgYSBudW1iZXIsCityZXR1cm5zIHRoaXMgbnVtYmVyLgorSWYgdGhpcyBhcmd1bWVudCBpcyBhYnNlbnQgb3IgaXMgPGI+bmlsPC9iPiwKK3JldHVybnMgPGNvZGU+ZDwvY29kZT4uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfb3B0c3RyaW5nIj48Y29kZT5sdWFMX29wdHN0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhTF9vcHRzdHJpbmcgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkKTs8L3ByZT4KKworPHA+CitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+bmFyZzwvY29kZT4gaXMgYSBzdHJpbmcsCityZXR1cm5zIHRoaXMgc3RyaW5nLgorSWYgdGhpcyBhcmd1bWVudCBpcyBhYnNlbnQgb3IgaXMgPGI+bmlsPC9iPiwKK3JldHVybnMgPGNvZGU+ZDwvY29kZT4uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfcHJlcGJ1ZmZlciI+PGNvZGU+bHVhTF9wcmVwYnVmZmVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT4tPC9lbT5dPC9zcGFuPgorPHByZT5jaGFyICpsdWFMX3ByZXBidWZmZXIgKGx1YUxfQnVmZmVyICpCKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIGFuIGFkZHJlc3MgdG8gYSBzcGFjZSBvZiBzaXplIDxhIG5hbWU9InBkZi1MVUFMX0JVRkZFUlNJWkUiPjxjb2RlPkxVQUxfQlVGRkVSU0laRTwvY29kZT48L2E+Cit3aGVyZSB5b3UgY2FuIGNvcHkgYSBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYnVmZmVyIDxjb2RlPkI8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPikuCitBZnRlciBjb3B5aW5nIHRoZSBzdHJpbmcgaW50byB0aGlzIHNwYWNlIHlvdSBtdXN0IGNhbGwKKzxhIGhyZWY9IiNsdWFMX2FkZHNpemUiPjxjb2RlPmx1YUxfYWRkc2l6ZTwvY29kZT48L2E+IHdpdGggdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0byBhY3R1YWxseSBhZGQgCitpdCB0byB0aGUgYnVmZmVyLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9wdXNocmVzdWx0Ij48Y29kZT5sdWFMX3B1c2hyZXN1bHQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0/LCArMSwgPGVtPm08L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9wdXNocmVzdWx0IChsdWFMX0J1ZmZlciAqQik7PC9wcmU+CisKKzxwPgorRmluaXNoZXMgdGhlIHVzZSBvZiBidWZmZXIgPGNvZGU+QjwvY29kZT4gbGVhdmluZyB0aGUgZmluYWwgc3RyaW5nIG9uCit0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfcmVmIj48Y29kZT5sdWFMX3JlZjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICswLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfcmVmIChsdWFfU3RhdGUgKkwsIGludCB0KTs8L3ByZT4KKworPHA+CitDcmVhdGVzIGFuZCByZXR1cm5zIGEgPGVtPnJlZmVyZW5jZTwvZW0+LAoraW4gdGhlIHRhYmxlIGF0IGluZGV4IDxjb2RlPnQ8L2NvZGU+LAorZm9yIHRoZSBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGFuZCBwb3BzIHRoZSBvYmplY3QpLgorCisKKzxwPgorQSByZWZlcmVuY2UgaXMgYSB1bmlxdWUgaW50ZWdlciBrZXkuCitBcyBsb25nIGFzIHlvdSBkbyBub3QgbWFudWFsbHkgYWRkIGludGVnZXIga2V5cyBpbnRvIHRhYmxlIDxjb2RlPnQ8L2NvZGU+LAorPGEgaHJlZj0iI2x1YUxfcmVmIj48Y29kZT5sdWFMX3JlZjwvY29kZT48L2E+IGVuc3VyZXMgdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIGtleSBpdCByZXR1cm5zLgorWW91IGNhbiByZXRyaWV2ZSBhbiBvYmplY3QgcmVmZXJyZWQgYnkgcmVmZXJlbmNlIDxjb2RlPnI8L2NvZGU+CitieSBjYWxsaW5nIDxjb2RlPmx1YV9yYXdnZXRpKEwsIHQsIHIpPC9jb2RlPi4KK0Z1bmN0aW9uIDxhIGhyZWY9IiNsdWFMX3VucmVmIj48Y29kZT5sdWFMX3VucmVmPC9jb2RlPjwvYT4gZnJlZXMgYSByZWZlcmVuY2UgYW5kIGl0cyBhc3NvY2lhdGVkIG9iamVjdC4KKworCis8cD4KK0lmIHRoZSBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgPGI+bmlsPC9iPiwKKzxhIGhyZWY9IiNsdWFMX3JlZiI+PGNvZGU+bHVhTF9yZWY8L2NvZGU+PC9hPiByZXR1cm5zIHRoZSBjb25zdGFudCA8YSBuYW1lPSJwZGYtTFVBX1JFRk5JTCI+PGNvZGU+TFVBX1JFRk5JTDwvY29kZT48L2E+LgorVGhlIGNvbnN0YW50IDxhIG5hbWU9InBkZi1MVUFfTk9SRUYiPjxjb2RlPkxVQV9OT1JFRjwvY29kZT48L2E+IGlzIGd1YXJhbnRlZWQgdG8gYmUgZGlmZmVyZW50Citmcm9tIGFueSByZWZlcmVuY2UgcmV0dXJuZWQgYnkgPGEgaHJlZj0iI2x1YUxfcmVmIj48Y29kZT5sdWFMX3JlZjwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9SZWciPjxjb2RlPmx1YUxfUmVnPC9jb2RlPjwvYT48L2gzPgorPHByZT50eXBlZGVmIHN0cnVjdCBsdWFMX1JlZyB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx1YV9DRnVuY3Rpb24gZnVuYzsKK30gbHVhTF9SZWc7PC9wcmU+CisKKzxwPgorVHlwZSBmb3IgYXJyYXlzIG9mIGZ1bmN0aW9ucyB0byBiZSByZWdpc3RlcmVkIGJ5Cis8YSBocmVmPSIjbHVhTF9yZWdpc3RlciI+PGNvZGU+bHVhTF9yZWdpc3RlcjwvY29kZT48L2E+LgorPGNvZGU+bmFtZTwvY29kZT4gaXMgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIDxjb2RlPmZ1bmM8L2NvZGU+IGlzIGEgcG9pbnRlciB0bwordGhlIGZ1bmN0aW9uLgorQW55IGFycmF5IG9mIDxhIGhyZWY9IiNsdWFMX1JlZyI+PGNvZGU+bHVhTF9SZWc8L2NvZGU+PC9hPiBtdXN0IGVuZCB3aXRoIGFuIHNlbnRpbmVsIGVudHJ5CitpbiB3aGljaCBib3RoIDxjb2RlPm5hbWU8L2NvZGU+IGFuZCA8Y29kZT5mdW5jPC9jb2RlPiBhcmUgPGNvZGU+TlVMTDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX3JlZ2lzdGVyIj48Y29kZT5sdWFMX3JlZ2lzdGVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstKDB8MSksICsxLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3JlZ2lzdGVyIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYm5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx1YUxfUmVnICpsKTs8L3ByZT4KKworPHA+CitPcGVucyBhIGxpYnJhcnkuCisKKworPHA+CitXaGVuIGNhbGxlZCB3aXRoIDxjb2RlPmxpYm5hbWU8L2NvZGU+IGVxdWFsIHRvIDxjb2RlPk5VTEw8L2NvZGU+LAoraXQgc2ltcGx5IHJlZ2lzdGVycyBhbGwgZnVuY3Rpb25zIGluIHRoZSBsaXN0IDxjb2RlPmw8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX1JlZyI+PGNvZGU+bHVhTF9SZWc8L2NvZGU+PC9hPikgaW50byB0aGUgdGFibGUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKKworPHA+CitXaGVuIGNhbGxlZCB3aXRoIGEgbm9uLW51bGwgPGNvZGU+bGlibmFtZTwvY29kZT4sCis8Y29kZT5sdWFMX3JlZ2lzdGVyPC9jb2RlPiBjcmVhdGVzIGEgbmV3IHRhYmxlIDxjb2RlPnQ8L2NvZGU+LAorc2V0cyBpdCBhcyB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSA8Y29kZT5saWJuYW1lPC9jb2RlPiwKK3NldHMgaXQgYXMgdGhlIHZhbHVlIG9mIDxjb2RlPnBhY2thZ2UubG9hZGVkW2xpYm5hbWVdPC9jb2RlPiwKK2FuZCByZWdpc3RlcnMgb24gaXQgYWxsIGZ1bmN0aW9ucyBpbiB0aGUgbGlzdCA8Y29kZT5sPC9jb2RlPi4KK0lmIHRoZXJlIGlzIGEgdGFibGUgaW4gPGNvZGU+cGFja2FnZS5sb2FkZWRbbGlibmFtZV08L2NvZGU+IG9yIGluCit2YXJpYWJsZSA8Y29kZT5saWJuYW1lPC9jb2RlPiwKK3JldXNlcyB0aGlzIHRhYmxlIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgorCisKKzxwPgorSW4gYW55IGNhc2UgdGhlIGZ1bmN0aW9uIGxlYXZlcyB0aGUgdGFibGUKK29uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF90eXBlbmFtZSI+PGNvZGU+bHVhTF90eXBlbmFtZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhTF90eXBlbmFtZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfdHlwZXJyb3IiPjxjb2RlPmx1YUxfdHlwZXJyb3I8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX3R5cGVycm9yIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBjb25zdCBjaGFyICp0bmFtZSk7PC9wcmU+CisKKzxwPgorR2VuZXJhdGVzIGFuIGVycm9yIHdpdGggYSBtZXNzYWdlIGxpa2UgdGhlIGZvbGxvd2luZzoKKworPHByZT4KKyAgICAgPGVtPmxvY2F0aW9uPC9lbT46IGJhZCBhcmd1bWVudCA8ZW0+bmFyZzwvZW0+IHRvICc8ZW0+ZnVuYzwvZW0+JyAoPGVtPnRuYW1lPC9lbT4gZXhwZWN0ZWQsIGdvdCA8ZW0+cnQ8L2VtPikKKzwvcHJlPjxwPgord2hlcmUgPGNvZGU+PGVtPmxvY2F0aW9uPC9lbT48L2NvZGU+IGlzIHByb2R1Y2VkIGJ5IDxhIGhyZWY9IiNsdWFMX3doZXJlIj48Y29kZT5sdWFMX3doZXJlPC9jb2RlPjwvYT4sCis8Y29kZT48ZW0+ZnVuYzwvZW0+PC9jb2RlPiBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiwKK2FuZCA8Y29kZT48ZW0+cnQ8L2VtPjwvY29kZT4gaXMgdGhlIHR5cGUgbmFtZSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF91bnJlZiI+PGNvZGU+bHVhTF91bnJlZjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+LTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3VucmVmIChsdWFfU3RhdGUgKkwsIGludCB0LCBpbnQgcmVmKTs8L3ByZT4KKworPHA+CitSZWxlYXNlcyByZWZlcmVuY2UgPGNvZGU+cmVmPC9jb2RlPiBmcm9tIHRoZSB0YWJsZSBhdCBpbmRleCA8Y29kZT50PC9jb2RlPgorKHNlZSA8YSBocmVmPSIjbHVhTF9yZWYiPjxjb2RlPmx1YUxfcmVmPC9jb2RlPjwvYT4pLgorVGhlIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUsCitzbyB0aGF0IHRoZSByZWZlcnJlZCBvYmplY3QgY2FuIGJlIGNvbGxlY3RlZC4KK1RoZSByZWZlcmVuY2UgPGNvZGU+cmVmPC9jb2RlPiBpcyBhbHNvIGZyZWVkIHRvIGJlIHVzZWQgYWdhaW4uCisKKworPHA+CitJZiA8Y29kZT5yZWY8L2NvZGU+IGlzIDxhIGhyZWY9IiNwZGYtTFVBX05PUkVGIj48Y29kZT5MVUFfTk9SRUY8L2NvZGU+PC9hPiBvciA8YSBocmVmPSIjcGRmLUxVQV9SRUZOSUwiPjxjb2RlPkxVQV9SRUZOSUw8L2NvZGU+PC9hPiwKKzxhIGhyZWY9IiNsdWFMX3VucmVmIj48Y29kZT5sdWFMX3VucmVmPC9jb2RlPjwvYT4gZG9lcyBub3RoaW5nLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF93aGVyZSI+PGNvZGU+bHVhTF93aGVyZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+bTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3doZXJlIChsdWFfU3RhdGUgKkwsIGludCBsdmwpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgY3VycmVudCBwb3NpdGlvbgorb2YgdGhlIGNvbnRyb2wgYXQgbGV2ZWwgPGNvZGU+bHZsPC9jb2RlPiBpbiB0aGUgY2FsbCBzdGFjay4KK1R5cGljYWxseSB0aGlzIHN0cmluZyBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKzxwcmU+CisgICAgIDxlbT5jaHVua25hbWU8L2VtPjo8ZW0+Y3VycmVudGxpbmU8L2VtPjoKKzwvcHJlPjxwPgorTGV2ZWwmbmJzcDswIGlzIHRoZSBydW5uaW5nIGZ1bmN0aW9uLAorbGV2ZWwmbmJzcDsxIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZCB0aGUgcnVubmluZyBmdW5jdGlvbiwKK2V0Yy4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBidWlsZCBhIHByZWZpeCBmb3IgZXJyb3IgbWVzc2FnZXMuCisKKworCisKKworCisKKzxoMT41IC0gPGEgbmFtZT0iNSI+U3RhbmRhcmQgTGlicmFyaWVzPC9hPjwvaDE+CisKKzxwPgorVGhlIHN0YW5kYXJkIEx1YSBsaWJyYXJpZXMgcHJvdmlkZSB1c2VmdWwgZnVuY3Rpb25zCit0aGF0IGFyZSBpbXBsZW1lbnRlZCBkaXJlY3RseSB0aHJvdWdoIHRoZSBDJm5ic3A7QVBJLgorU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBlc3NlbnRpYWwgc2VydmljZXMgdG8gdGhlIGxhbmd1YWdlCisoZS5nLiwgPGEgaHJlZj0iI3BkZi10eXBlIj48Y29kZT50eXBlPC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9IiNwZGYtZ2V0bWV0YXRhYmxlIj48Y29kZT5nZXRtZXRhdGFibGU8L2NvZGU+PC9hPik7CitvdGhlcnMgcHJvdmlkZSBhY2Nlc3MgdG8gIm91dHNpZGUiIHNlcnZpY2VzIChlLmcuLCBJL08pOworYW5kIG90aGVycyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBMdWEgaXRzZWxmLAorYnV0IGFyZSBxdWl0ZSB1c2VmdWwgb3IgaGF2ZSBjcml0aWNhbCBwZXJmb3JtYW5jZSByZXF1aXJlbWVudHMgdGhhdAorZGVzZXJ2ZSBhbiBpbXBsZW1lbnRhdGlvbiBpbiBDIChlLmcuLCA8YSBocmVmPSIjcGRmLXRhYmxlLnNvcnQiPjxjb2RlPnRhYmxlLnNvcnQ8L2NvZGU+PC9hPikuCisKKworPHA+CitBbGwgbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCB0aHJvdWdoIHRoZSBvZmZpY2lhbCBDJm5ic3A7QVBJCithbmQgYXJlIHByb3ZpZGVkIGFzIHNlcGFyYXRlIEMmbmJzcDttb2R1bGVzLgorQ3VycmVudGx5LCBMdWEgaGFzIHRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgbGlicmFyaWVzOgorCis8dWw+CisKKzxsaT5iYXNpYyBsaWJyYXJ5LDwvbGk+IHdoaWNoIGluY2x1ZGVzIHRoZSBjb3JvdXRpbmUgc3ViLWxpYnJhcnk7CisKKzxsaT5wYWNrYWdlIGxpYnJhcnk7PC9saT4KKworPGxpPnN0cmluZyBtYW5pcHVsYXRpb247PC9saT4KKworPGxpPnRhYmxlIG1hbmlwdWxhdGlvbjs8L2xpPgorCis8bGk+bWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyAoc2luLCBsb2csIGV0Yy4pOzwvbGk+CisKKzxsaT5pbnB1dCBhbmQgb3V0cHV0OzwvbGk+CisKKzxsaT5vcGVyYXRpbmcgc3lzdGVtIGZhY2lsaXRpZXM7PC9saT4KKworPGxpPmRlYnVnIGZhY2lsaXRpZXMuPC9saT4KKworPC91bD48cD4KK0V4Y2VwdCBmb3IgdGhlIGJhc2ljIGFuZCBwYWNrYWdlIGxpYnJhcmllcywKK2VhY2ggbGlicmFyeSBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9ucyBhcyBmaWVsZHMgb2YgYSBnbG9iYWwgdGFibGUKK29yIGFzIG1ldGhvZHMgb2YgaXRzIG9iamVjdHMuCisKKworPHA+CitUbyBoYXZlIGFjY2VzcyB0byB0aGVzZSBsaWJyYXJpZXMsCit0aGUgQyZuYnNwO2hvc3QgcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGUgPGEgaHJlZj0iI2x1YUxfb3BlbmxpYnMiPjxjb2RlPmx1YUxfb3BlbmxpYnM8L2NvZGU+PC9hPiBmdW5jdGlvbiwKK3doaWNoIG9wZW5zIGFsbCBzdGFuZGFyZCBsaWJyYXJpZXMuCitBbHRlcm5hdGl2ZWx5LAoraXQgY2FuIG9wZW4gdGhlbSBpbmRpdmlkdWFsbHkgYnkgY2FsbGluZworPGEgbmFtZT0icGRmLWx1YW9wZW5fYmFzZSI+PGNvZGU+bHVhb3Blbl9iYXNlPC9jb2RlPjwvYT4gKGZvciB0aGUgYmFzaWMgbGlicmFyeSksCis8YSBuYW1lPSJwZGYtbHVhb3Blbl9wYWNrYWdlIj48Y29kZT5sdWFvcGVuX3BhY2thZ2U8L2NvZGU+PC9hPiAoZm9yIHRoZSBwYWNrYWdlIGxpYnJhcnkpLAorPGEgbmFtZT0icGRmLWx1YW9wZW5fc3RyaW5nIj48Y29kZT5sdWFvcGVuX3N0cmluZzwvY29kZT48L2E+IChmb3IgdGhlIHN0cmluZyBsaWJyYXJ5KSwKKzxhIG5hbWU9InBkZi1sdWFvcGVuX3RhYmxlIj48Y29kZT5sdWFvcGVuX3RhYmxlPC9jb2RlPjwvYT4gKGZvciB0aGUgdGFibGUgbGlicmFyeSksCis8YSBuYW1lPSJwZGYtbHVhb3Blbl9tYXRoIj48Y29kZT5sdWFvcGVuX21hdGg8L2NvZGU+PC9hPiAoZm9yIHRoZSBtYXRoZW1hdGljYWwgbGlicmFyeSksCis8YSBuYW1lPSJwZGYtbHVhb3Blbl9pbyI+PGNvZGU+bHVhb3Blbl9pbzwvY29kZT48L2E+IChmb3IgdGhlIEkvTyBsaWJyYXJ5KSwKKzxhIG5hbWU9InBkZi1sdWFvcGVuX29zIj48Y29kZT5sdWFvcGVuX29zPC9jb2RlPjwvYT4gKGZvciB0aGUgT3BlcmF0aW5nIFN5c3RlbSBsaWJyYXJ5KSwKK2FuZCA8YSBuYW1lPSJwZGYtbHVhb3Blbl9kZWJ1ZyI+PGNvZGU+bHVhb3Blbl9kZWJ1ZzwvY29kZT48L2E+IChmb3IgdGhlIGRlYnVnIGxpYnJhcnkpLgorVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBpbiA8YSBuYW1lPSJwZGYtbHVhbGliLmgiPjxjb2RlPmx1YWxpYi5oPC9jb2RlPjwvYT4KK2FuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseToKK3lvdSBtdXN0IGNhbGwgdGhlbSBsaWtlIGFueSBvdGhlciBMdWEgQyZuYnNwO2Z1bmN0aW9uLAorZS5nLiwgYnkgdXNpbmcgPGEgaHJlZj0iI2x1YV9jYWxsIj48Y29kZT5sdWFfY2FsbDwvY29kZT48L2E+LgorCisKKworPGgyPjUuMSAtIDxhIG5hbWU9IjUuMSI+QmFzaWMgRnVuY3Rpb25zPC9hPjwvaDI+CisKKzxwPgorVGhlIGJhc2ljIGxpYnJhcnkgcHJvdmlkZXMgc29tZSBjb3JlIGZ1bmN0aW9ucyB0byBMdWEuCitJZiB5b3UgZG8gbm90IGluY2x1ZGUgdGhpcyBsaWJyYXJ5IGluIHlvdXIgYXBwbGljYXRpb24sCit5b3Ugc2hvdWxkIGNoZWNrIGNhcmVmdWxseSB3aGV0aGVyIHlvdSBuZWVkIHRvIHByb3ZpZGUgCitpbXBsZW1lbnRhdGlvbnMgZm9yIHNvbWUgb2YgaXRzIGZhY2lsaXRpZXMuCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1hc3NlcnQiPjxjb2RlPmFzc2VydCAodiBbLCBtZXNzYWdlXSk8L2NvZGU+PC9hPjwvaDM+CitJc3N1ZXMgYW4gIGVycm9yIHdoZW4KK3RoZSB2YWx1ZSBvZiBpdHMgYXJndW1lbnQgPGNvZGU+djwvY29kZT4gaXMgZmFsc2UgKGkuZS4sIDxiPm5pbDwvYj4gb3IgPGI+ZmFsc2U8L2I+KTsKK290aGVyd2lzZSwgcmV0dXJucyBhbGwgaXRzIGFyZ3VtZW50cy4KKzxjb2RlPm1lc3NhZ2U8L2NvZGU+IGlzIGFuIGVycm9yIG1lc3NhZ2U7Cit3aGVuIGFic2VudCwgaXQgZGVmYXVsdHMgdG8gImFzc2VydGlvbiBmYWlsZWQhIgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWNvbGxlY3RnYXJiYWdlIj48Y29kZT5jb2xsZWN0Z2FyYmFnZSAob3B0IFssIGFyZ10pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KK0l0IHBlcmZvcm1zIGRpZmZlcmVudCBmdW5jdGlvbnMgYWNjb3JkaW5nIHRvIGl0cyBmaXJzdCBhcmd1bWVudCwgPGNvZGU+b3B0PC9jb2RlPjoKKworPHVsPgorCis8bGk+PGI+InN0b3AiOjwvYj4KK3N0b3BzIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKzwvbGk+CisKKzxsaT48Yj4icmVzdGFydCI6PC9iPgorcmVzdGFydHMgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorPC9saT4KKworPGxpPjxiPiJjb2xsZWN0Ijo8L2I+CitwZXJmb3JtcyBhIGZ1bGwgZ2FyYmFnZS1jb2xsZWN0aW9uIGN5Y2xlLgorPC9saT4KKworPGxpPjxiPiJjb3VudCI6PC9iPgorcmV0dXJucyB0aGUgdG90YWwgbWVtb3J5IGluIHVzZSBieSBMdWEgKGluIEtieXRlcykuCis8L2xpPgorCis8bGk+PGI+InN0ZXAiOjwvYj4KK3BlcmZvcm1zIGEgZ2FyYmFnZS1jb2xsZWN0aW9uIHN0ZXAuCitUaGUgc3RlcCAic2l6ZSIgaXMgY29udHJvbGxlZCBieSA8Y29kZT5hcmc8L2NvZGU+CisobGFyZ2VyIHZhbHVlcyBtZWFuIG1vcmUgc3RlcHMpIGluIGEgbm9uLXNwZWNpZmllZCB3YXkuCitJZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBzdGVwIHNpemUKK3lvdSBtdXN0IGV4cGVyaW1lbnRhbGx5IHR1bmUgdGhlIHZhbHVlIG9mIDxjb2RlPmFyZzwvY29kZT4uCitSZXR1cm5zIDxiPnRydWU8L2I+IGlmIHRoZSBzdGVwIGZpbmlzaGVkIGEgY29sbGVjdGlvbiBjeWNsZS4KKzwvbGk+CisKKzxsaT48Yj4ic2V0cGF1c2UiOjwvYj4KK3NldHMgPGNvZGU+YXJnPC9jb2RlPiBhcyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgPGVtPnBhdXNlPC9lbT4gb2YKK3RoZSBjb2xsZWN0b3IgKHNlZSA8YSBocmVmPSIjMi4xMCI+JnNlY3Q7Mi4xMDwvYT4pLgorUmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIDxlbT5wYXVzZTwvZW0+LgorPC9saT4KKworPGxpPjxiPiJzZXRzdGVwbXVsIjo8L2I+CitzZXRzIDxjb2RlPmFyZzwvY29kZT4gYXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIDxlbT5zdGVwIG11bHRpcGxpZXI8L2VtPiBvZgordGhlIGNvbGxlY3RvciAoc2VlIDxhIGhyZWY9IiMyLjEwIj4mc2VjdDsyLjEwPC9hPikuCitSZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgPGVtPnN0ZXA8L2VtPi4KKzwvbGk+CisKKzwvdWw+CisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRvZmlsZSI+PGNvZGU+ZG9maWxlIChmaWxlbmFtZSk8L2NvZGU+PC9hPjwvaDM+CitPcGVucyB0aGUgbmFtZWQgZmlsZSBhbmQgZXhlY3V0ZXMgaXRzIGNvbnRlbnRzIGFzIGEgTHVhIGNodW5rLgorV2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsCis8Y29kZT5kb2ZpbGU8L2NvZGU+IGV4ZWN1dGVzIHRoZSBjb250ZW50cyBvZiB0aGUgc3RhbmRhcmQgaW5wdXQgKDxjb2RlPnN0ZGluPC9jb2RlPikuCitSZXR1cm5zIGFsbCB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNodW5rLgorSW4gY2FzZSBvZiBlcnJvcnMsIDxjb2RlPmRvZmlsZTwvY29kZT4gcHJvcGFnYXRlcyB0aGUgZXJyb3IKK3RvIGl0cyBjYWxsZXIgKHRoYXQgaXMsIDxjb2RlPmRvZmlsZTwvY29kZT4gZG9lcyBub3QgcnVuIGluIHByb3RlY3RlZCBtb2RlKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1lcnJvciI+PGNvZGU+ZXJyb3IgKG1lc3NhZ2UgWywgbGV2ZWxdKTwvY29kZT48L2E+PC9oMz4KK1Rlcm1pbmF0ZXMgdGhlIGxhc3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGNhbGxlZAorYW5kIHJldHVybnMgPGNvZGU+bWVzc2FnZTwvY29kZT4gYXMgdGhlIGVycm9yIG1lc3NhZ2UuCitGdW5jdGlvbiA8Y29kZT5lcnJvcjwvY29kZT4gbmV2ZXIgcmV0dXJucy4KKworCis8cD4KK1VzdWFsbHksIDxjb2RlPmVycm9yPC9jb2RlPiBhZGRzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHBvc2l0aW9uCithdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorVGhlIDxjb2RlPmxldmVsPC9jb2RlPiBhcmd1bWVudCBzcGVjaWZpZXMgaG93IHRvIGdldCB0aGUgZXJyb3IgcG9zaXRpb24uCitXaXRoIGxldmVsJm5ic3A7MSAodGhlIGRlZmF1bHQpLCB0aGUgZXJyb3IgcG9zaXRpb24gaXMgd2hlcmUgdGhlCis8Y29kZT5lcnJvcjwvY29kZT4gZnVuY3Rpb24gd2FzIGNhbGxlZC4KK0xldmVsJm5ic3A7MiBwb2ludHMgdGhlIGVycm9yIHRvIHdoZXJlIHRoZSBmdW5jdGlvbgordGhhdCBjYWxsZWQgPGNvZGU+ZXJyb3I8L2NvZGU+IHdhcyBjYWxsZWQ7IGFuZCBzbyBvbi4KK1Bhc3NpbmcgYSBsZXZlbCZuYnNwOzAgYXZvaWRzIHRoZSBhZGRpdGlvbiBvZiBlcnJvciBwb3NpdGlvbiBpbmZvcm1hdGlvbgordG8gdGhlIG1lc3NhZ2UuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtX0ciPjxjb2RlPl9HPC9jb2RlPjwvYT48L2gzPgorQSBnbG9iYWwgdmFyaWFibGUgKG5vdCBhIGZ1bmN0aW9uKSB0aGF0Citob2xkcyB0aGUgZ2xvYmFsIGVudmlyb25tZW50ICh0aGF0IGlzLCA8Y29kZT5fRy5fRyA9IF9HPC9jb2RlPikuCitMdWEgaXRzZWxmIGRvZXMgbm90IHVzZSB0aGlzIHZhcmlhYmxlOworY2hhbmdpbmcgaXRzIHZhbHVlIGRvZXMgbm90IGFmZmVjdCBhbnkgZW52aXJvbm1lbnQsCitub3IgdmljZS12ZXJzYS4KKyhVc2UgPGEgaHJlZj0iI3BkZi1zZXRmZW52Ij48Y29kZT5zZXRmZW52PC9jb2RlPjwvYT4gdG8gY2hhbmdlIGVudmlyb25tZW50cy4pCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZ2V0ZmVudiI+PGNvZGU+Z2V0ZmVudiAoW2ZdKTwvY29kZT48L2E+PC9oMz4KK1JldHVybnMgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaW4gdXNlIGJ5IHRoZSBmdW5jdGlvbi4KKzxjb2RlPmY8L2NvZGU+IGNhbiBiZSBhIEx1YSBmdW5jdGlvbiBvciBhIG51bWJlcgordGhhdCBzcGVjaWZpZXMgdGhlIGZ1bmN0aW9uIGF0IHRoYXQgc3RhY2sgbGV2ZWw6CitMZXZlbCZuYnNwOzEgaXMgdGhlIGZ1bmN0aW9uIGNhbGxpbmcgPGNvZGU+Z2V0ZmVudjwvY29kZT4uCitJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgbm90IGEgTHVhIGZ1bmN0aW9uLAorb3IgaWYgPGNvZGU+ZjwvY29kZT4gaXMgMCwKKzxjb2RlPmdldGZlbnY8L2NvZGU+IHJldHVybnMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudC4KK1RoZSBkZWZhdWx0IGZvciA8Y29kZT5mPC9jb2RlPiBpcyAxLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWdldG1ldGF0YWJsZSI+PGNvZGU+Z2V0bWV0YXRhYmxlIChvYmplY3QpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBkb2VzIG5vdCBoYXZlIGEgbWV0YXRhYmxlLCByZXR1cm5zIDxiPm5pbDwvYj4uCitPdGhlcndpc2UsCitpZiB0aGUgb2JqZWN0J3MgbWV0YXRhYmxlIGhhcyBhIDxjb2RlPiJfX21ldGF0YWJsZSI8L2NvZGU+IGZpZWxkLAorcmV0dXJucyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KK090aGVyd2lzZSwgcmV0dXJucyB0aGUgbWV0YXRhYmxlIG9mIHRoZSBnaXZlbiBvYmplY3QuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaXBhaXJzIj48Y29kZT5pcGFpcnMgKHQpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aHJlZSB2YWx1ZXM6IGFuIGl0ZXJhdG9yIGZ1bmN0aW9uLCB0aGUgdGFibGUgPGNvZGU+dDwvY29kZT4sIGFuZCAwLAorc28gdGhhdCB0aGUgY29uc3RydWN0aW9uCisKKzxwcmU+CisgICAgIGZvciBpLHYgaW4gaXBhaXJzKHQpIGRvIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK3dpbGwgaXRlcmF0ZSBvdmVyIHRoZSBwYWlycyAoPGNvZGU+MSx0WzFdPC9jb2RlPiksICg8Y29kZT4yLHRbMl08L2NvZGU+KSwgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7LAordXAgdG8gdGhlIGZpcnN0IGludGVnZXIga2V5IGFic2VudCBmcm9tIHRoZSB0YWJsZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1sb2FkIj48Y29kZT5sb2FkIChmdW5jIFssIGNodW5rbmFtZV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorTG9hZHMgYSBjaHVuayB1c2luZyBmdW5jdGlvbiA8Y29kZT5mdW5jPC9jb2RlPiB0byBnZXQgaXRzIHBpZWNlcy4KK0VhY2ggY2FsbCB0byA8Y29kZT5mdW5jPC9jb2RlPiBtdXN0IHJldHVybiBhIHN0cmluZyB0aGF0IGNvbmNhdGVuYXRlcword2l0aCBwcmV2aW91cyByZXN1bHRzLgorQSByZXR1cm4gb2YgYW4gZW1wdHkgc3RyaW5nLCA8Yj5uaWw8L2I+LCBvciBubyB2YWx1ZSBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIGNodW5rLgorCisKKzxwPgorSWYgdGhlcmUgYXJlIG5vIGVycm9ycywgCityZXR1cm5zIHRoZSBjb21waWxlZCBjaHVuayBhcyBhIGZ1bmN0aW9uOworb3RoZXJ3aXNlLCByZXR1cm5zIDxiPm5pbDwvYj4gcGx1cyB0aGUgZXJyb3IgbWVzc2FnZS4KK1RoZSBlbnZpcm9ubWVudCBvZiB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudC4KKworCis8cD4KKzxjb2RlPmNodW5rbmFtZTwvY29kZT4gaXMgdXNlZCBhcyB0aGUgY2h1bmsgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMKK2FuZCBkZWJ1ZyBpbmZvcm1hdGlvbi4KK1doZW4gYWJzZW50LAoraXQgZGVmYXVsdHMgdG8gIjxjb2RlPj0obG9hZCk8L2NvZGU+Ii4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1sb2FkZmlsZSI+PGNvZGU+bG9hZGZpbGUgKFtmaWxlbmFtZV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorU2ltaWxhciB0byA8YSBocmVmPSIjcGRmLWxvYWQiPjxjb2RlPmxvYWQ8L2NvZGU+PC9hPiwKK2J1dCBnZXRzIHRoZSBjaHVuayBmcm9tIGZpbGUgPGNvZGU+ZmlsZW5hbWU8L2NvZGU+CitvciBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKK2lmIG5vIGZpbGUgbmFtZSBpcyBnaXZlbi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1sb2Fkc3RyaW5nIj48Y29kZT5sb2Fkc3RyaW5nIChzdHJpbmcgWywgY2h1bmtuYW1lXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTaW1pbGFyIHRvIDxhIGhyZWY9IiNwZGYtbG9hZCI+PGNvZGU+bG9hZDwvY29kZT48L2E+LAorYnV0IGdldHMgdGhlIGNodW5rIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KKworCis8cD4KK1RvIGxvYWQgYW5kIHJ1biBhIGdpdmVuIHN0cmluZywgdXNlIHRoZSBpZGlvbQorCis8cHJlPgorICAgICBhc3NlcnQobG9hZHN0cmluZyhzKSkoKQorPC9wcmU+CisKKzxwPgorV2hlbiBhYnNlbnQsCis8Y29kZT5jaHVua25hbWU8L2NvZGU+IGRlZmF1bHRzIHRvIHRoZSBnaXZlbiBzdHJpbmcuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbmV4dCI+PGNvZGU+bmV4dCAodGFibGUgWywgaW5kZXhdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0FsbG93cyBhIHByb2dyYW0gdG8gdHJhdmVyc2UgYWxsIGZpZWxkcyBvZiBhIHRhYmxlLgorSXRzIGZpcnN0IGFyZ3VtZW50IGlzIGEgdGFibGUgYW5kIGl0cyBzZWNvbmQgYXJndW1lbnQKK2lzIGFuIGluZGV4IGluIHRoaXMgdGFibGUuCis8Y29kZT5uZXh0PC9jb2RlPiByZXR1cm5zIHRoZSBuZXh0IGluZGV4IG9mIHRoZSB0YWJsZQorYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlLgorV2hlbiBjYWxsZWQgd2l0aCA8Yj5uaWw8L2I+IGFzIGl0cyBzZWNvbmQgYXJndW1lbnQsCis8Y29kZT5uZXh0PC9jb2RlPiByZXR1cm5zIGFuIGluaXRpYWwgaW5kZXgKK2FuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS4KK1doZW4gY2FsbGVkIHdpdGggdGhlIGxhc3QgaW5kZXgsCitvciB3aXRoIDxiPm5pbDwvYj4gaW4gYW4gZW1wdHkgdGFibGUsCis8Y29kZT5uZXh0PC9jb2RlPiByZXR1cm5zIDxiPm5pbDwvYj4uCitJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGFic2VudCwgdGhlbiBpdCBpcyBpbnRlcnByZXRlZCBhcyA8Yj5uaWw8L2I+LgorSW4gcGFydGljdWxhciwKK3lvdSBjYW4gdXNlIDxjb2RlPm5leHQodCk8L2NvZGU+IHRvIGNoZWNrIHdoZXRoZXIgYSB0YWJsZSBpcyBlbXB0eS4KKworCis8cD4KK1RoZSBvcmRlciBpbiB3aGljaCB0aGUgaW5kaWNlcyBhcmUgZW51bWVyYXRlZCBpcyBub3Qgc3BlY2lmaWVkLAorPGVtPmV2ZW4gZm9yIG51bWVyaWMgaW5kaWNlczwvZW0+LgorKFRvIHRyYXZlcnNlIGEgdGFibGUgaW4gbnVtZXJpYyBvcmRlciwKK3VzZSBhIG51bWVyaWNhbCA8Yj5mb3I8L2I+IG9yIHRoZSA8YSBocmVmPSIjcGRmLWlwYWlycyI+PGNvZGU+aXBhaXJzPC9jb2RlPjwvYT4gZnVuY3Rpb24uKQorCisKKzxwPgorVGhlIGJlaGF2aW9yIG9mIDxjb2RlPm5leHQ8L2NvZGU+IGlzIDxlbT51bmRlZmluZWQ8L2VtPiBpZiwKK2R1cmluZyB0aGUgdHJhdmVyc2FsLAoreW91IGFzc2lnbiBhbnkgdmFsdWUgdG8gYSBub24tZXhpc3RlbnQgZmllbGQgaW4gdGhlIHRhYmxlLgorWW91IG1heSBob3dldmVyIG1vZGlmeSBleGlzdGluZyBmaWVsZHMuCitJbiBwYXJ0aWN1bGFyLCB5b3UgbWF5IGNsZWFyIGV4aXN0aW5nIGZpZWxkcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wYWlycyI+PGNvZGU+cGFpcnMgKHQpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aHJlZSB2YWx1ZXM6IHRoZSA8YSBocmVmPSIjcGRmLW5leHQiPjxjb2RlPm5leHQ8L2NvZGU+PC9hPiBmdW5jdGlvbiwgdGhlIHRhYmxlIDxjb2RlPnQ8L2NvZGU+LCBhbmQgPGI+bmlsPC9iPiwKK3NvIHRoYXQgdGhlIGNvbnN0cnVjdGlvbgorCis8cHJlPgorICAgICBmb3Igayx2IGluIHBhaXJzKHQpIGRvIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK3dpbGwgaXRlcmF0ZSBvdmVyIGFsbCBrZXkmbmRhc2g7dmFsdWUgcGFpcnMgb2YgdGFibGUgPGNvZGU+dDwvY29kZT4uCisKKworPHA+CitTZWUgZnVuY3Rpb24gPGEgaHJlZj0iI3BkZi1uZXh0Ij48Y29kZT5uZXh0PC9jb2RlPjwvYT4gZm9yIHRoZSBjYXZlYXRzIG9mIG1vZGlmeWluZwordGhlIHRhYmxlIGR1cmluZyBpdHMgdHJhdmVyc2FsLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXBjYWxsIj48Y29kZT5wY2FsbCAoZiwgYXJnMSwgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0NhbGxzIGZ1bmN0aW9uIDxjb2RlPmY8L2NvZGU+IHdpdGgKK3RoZSBnaXZlbiBhcmd1bWVudHMgaW4gPGVtPnByb3RlY3RlZCBtb2RlPC9lbT4uCitUaGlzIG1lYW5zIHRoYXQgYW55IGVycm9yIGluc2lkZSZuYnNwOzxjb2RlPmY8L2NvZGU+IGlzIG5vdCBwcm9wYWdhdGVkOworaW5zdGVhZCwgPGNvZGU+cGNhbGw8L2NvZGU+IGNhdGNoZXMgdGhlIGVycm9yCithbmQgcmV0dXJucyBhIHN0YXR1cyBjb2RlLgorSXRzIGZpcnN0IHJlc3VsdCBpcyB0aGUgc3RhdHVzIGNvZGUgKGEgYm9vbGVhbiksCit3aGljaCBpcyB0cnVlIGlmIHRoZSBjYWxsIHN1Y2NlZWRzIHdpdGhvdXQgZXJyb3JzLgorSW4gc3VjaCBjYXNlLCA8Y29kZT5wY2FsbDwvY29kZT4gYWxzbyByZXR1cm5zIGFsbCByZXN1bHRzIGZyb20gdGhlIGNhbGwsCithZnRlciB0aGlzIGZpcnN0IHJlc3VsdC4KK0luIGNhc2Ugb2YgYW55IGVycm9yLCA8Y29kZT5wY2FsbDwvY29kZT4gcmV0dXJucyA8Yj5mYWxzZTwvYj4gcGx1cyB0aGUgZXJyb3IgbWVzc2FnZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wcmludCI+PGNvZGU+cHJpbnQgKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CitSZWNlaXZlcyBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cywKK2FuZCBwcmludHMgdGhlaXIgdmFsdWVzIHRvIDxjb2RlPnN0ZG91dDwvY29kZT4sCit1c2luZyB0aGUgPGEgaHJlZj0iI3BkZi10b3N0cmluZyI+PGNvZGU+dG9zdHJpbmc8L2NvZGU+PC9hPiBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZW0gdG8gc3RyaW5ncy4KKzxjb2RlPnByaW50PC9jb2RlPiBpcyBub3QgaW50ZW5kZWQgZm9yIGZvcm1hdHRlZCBvdXRwdXQsCitidXQgb25seSBhcyBhIHF1aWNrIHdheSB0byBzaG93IGEgdmFsdWUsCit0eXBpY2FsbHkgZm9yIGRlYnVnZ2luZy4KK0ZvciBmb3JtYXR0ZWQgb3V0cHV0LCB1c2UgPGEgaHJlZj0iI3BkZi1zdHJpbmcuZm9ybWF0Ij48Y29kZT5zdHJpbmcuZm9ybWF0PC9jb2RlPjwvYT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcmF3ZXF1YWwiPjxjb2RlPnJhd2VxdWFsICh2MSwgdjIpPC9jb2RlPjwvYT48L2gzPgorQ2hlY2tzIHdoZXRoZXIgPGNvZGU+djE8L2NvZGU+IGlzIGVxdWFsIHRvIDxjb2RlPnYyPC9jb2RlPiwKK3dpdGhvdXQgaW52b2tpbmcgYW55IG1ldGFtZXRob2QuCitSZXR1cm5zIGEgYm9vbGVhbi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1yYXdnZXQiPjxjb2RlPnJhd2dldCAodGFibGUsIGluZGV4KTwvY29kZT48L2E+PC9oMz4KK0dldHMgdGhlIHJlYWwgdmFsdWUgb2YgPGNvZGU+dGFibGVbaW5kZXhdPC9jb2RlPiwKK3dpdGhvdXQgaW52b2tpbmcgYW55IG1ldGFtZXRob2QuCis8Y29kZT50YWJsZTwvY29kZT4gbXVzdCBiZSBhIHRhYmxlOworPGNvZGU+aW5kZXg8L2NvZGU+IG1heSBiZSBhbnkgdmFsdWUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcmF3c2V0Ij48Y29kZT5yYXdzZXQgKHRhYmxlLCBpbmRleCwgdmFsdWUpPC9jb2RlPjwvYT48L2gzPgorU2V0cyB0aGUgcmVhbCB2YWx1ZSBvZiA8Y29kZT50YWJsZVtpbmRleF08L2NvZGU+IHRvIDxjb2RlPnZhbHVlPC9jb2RlPiwKK3dpdGhvdXQgaW52b2tpbmcgYW55IG1ldGFtZXRob2QuCis8Y29kZT50YWJsZTwvY29kZT4gbXVzdCBiZSBhIHRhYmxlLAorPGNvZGU+aW5kZXg8L2NvZGU+IGFueSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSA8Yj5uaWw8L2I+LAorYW5kIDxjb2RlPnZhbHVlPC9jb2RlPiBhbnkgTHVhIHZhbHVlLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIDxjb2RlPnRhYmxlPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zZWxlY3QiPjxjb2RlPnNlbGVjdCAoaW5kZXgsICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitJZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgYSBudW1iZXIsCityZXR1cm5zIGFsbCBhcmd1bWVudHMgYWZ0ZXIgYXJndW1lbnQgbnVtYmVyIDxjb2RlPmluZGV4PC9jb2RlPi4KK090aGVyd2lzZSwgPGNvZGU+aW5kZXg8L2NvZGU+IG11c3QgYmUgdGhlIHN0cmluZyA8Y29kZT4iIyI8L2NvZGU+LAorYW5kIDxjb2RlPnNlbGVjdDwvY29kZT4gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGV4dHJhIGFyZ3VtZW50cyBpdCByZWNlaXZlZC4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zZXRmZW52Ij48Y29kZT5zZXRmZW52IChmLCB0YWJsZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIHRoZSBlbnZpcm9ubWVudCB0byBiZSB1c2VkIGJ5IHRoZSBnaXZlbiBmdW5jdGlvbi4KKzxjb2RlPmY8L2NvZGU+IGNhbiBiZSBhIEx1YSBmdW5jdGlvbiBvciBhIG51bWJlcgordGhhdCBzcGVjaWZpZXMgdGhlIGZ1bmN0aW9uIGF0IHRoYXQgc3RhY2sgbGV2ZWw6CitMZXZlbCZuYnNwOzEgaXMgdGhlIGZ1bmN0aW9uIGNhbGxpbmcgPGNvZGU+c2V0ZmVudjwvY29kZT4uCis8Y29kZT5zZXRmZW52PC9jb2RlPiByZXR1cm5zIHRoZSBnaXZlbiBmdW5jdGlvbi4KKworCis8cD4KK0FzIGEgc3BlY2lhbCBjYXNlLCB3aGVuIDxjb2RlPmY8L2NvZGU+IGlzIDAgPGNvZGU+c2V0ZmVudjwvY29kZT4gY2hhbmdlcwordGhlIGVudmlyb25tZW50IG9mIHRoZSBydW5uaW5nIHRocmVhZC4KK0luIHRoaXMgY2FzZSwgPGNvZGU+c2V0ZmVudjwvY29kZT4gcmV0dXJucyBubyB2YWx1ZXMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc2V0bWV0YXRhYmxlIj48Y29kZT5zZXRtZXRhdGFibGUgKHRhYmxlLCBtZXRhdGFibGUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorU2V0cyB0aGUgbWV0YXRhYmxlIGZvciB0aGUgZ2l2ZW4gdGFibGUuCisoWW91IGNhbm5vdCBjaGFuZ2UgdGhlIG1ldGF0YWJsZSBvZiBvdGhlciB0eXBlcyBmcm9tIEx1YSwgb25seSBmcm9tJm5ic3A7Qy4pCitJZiA8Y29kZT5tZXRhdGFibGU8L2NvZGU+IGlzIDxiPm5pbDwvYj4sCityZW1vdmVzIHRoZSBtZXRhdGFibGUgb2YgdGhlIGdpdmVuIHRhYmxlLgorSWYgdGhlIG9yaWdpbmFsIG1ldGF0YWJsZSBoYXMgYSA8Y29kZT4iX19tZXRhdGFibGUiPC9jb2RlPiBmaWVsZCwKK3JhaXNlcyBhbiBlcnJvci4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyA8Y29kZT50YWJsZTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdG9udW1iZXIiPjxjb2RlPnRvbnVtYmVyIChlIFssIGJhc2VdKTwvY29kZT48L2E+PC9oMz4KK1RyaWVzIHRvIGNvbnZlcnQgaXRzIGFyZ3VtZW50IHRvIGEgbnVtYmVyLgorSWYgdGhlIGFyZ3VtZW50IGlzIGFscmVhZHkgYSBudW1iZXIgb3IgYSBzdHJpbmcgY29udmVydGlibGUKK3RvIGEgbnVtYmVyLCB0aGVuIDxjb2RlPnRvbnVtYmVyPC9jb2RlPiByZXR1cm5zIHRoaXMgbnVtYmVyOworb3RoZXJ3aXNlLCBpdCByZXR1cm5zIDxiPm5pbDwvYj4uCisKKworPHA+CitBbiBvcHRpb25hbCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGJhc2UgdG8gaW50ZXJwcmV0IHRoZSBudW1lcmFsLgorVGhlIGJhc2UgbWF5IGJlIGFueSBpbnRlZ2VyIGJldHdlZW4gMiBhbmQgMzYsIGluY2x1c2l2ZS4KK0luIGJhc2VzIGFib3ZlJm5ic3A7MTAsIHRoZSBsZXR0ZXIgJzxjb2RlPkE8L2NvZGU+JyAoaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UpCityZXByZXNlbnRzJm5ic3A7MTAsICc8Y29kZT5CPC9jb2RlPicgcmVwcmVzZW50cyZuYnNwOzExLCBhbmQgc28gZm9ydGgsCit3aXRoICc8Y29kZT5aPC9jb2RlPicgcmVwcmVzZW50aW5nIDM1LgorSW4gYmFzZSAxMCAodGhlIGRlZmF1bHQpLCB0aGUgbnVtYmVyIGNhbiBoYXZlIGEgZGVjaW1hbCBwYXJ0LAorYXMgd2VsbCBhcyBhbiBvcHRpb25hbCBleHBvbmVudCBwYXJ0IChzZWUgPGEgaHJlZj0iIzIuMSI+JnNlY3Q7Mi4xPC9hPikuCitJbiBvdGhlciBiYXNlcywgb25seSB1bnNpZ25lZCBpbnRlZ2VycyBhcmUgYWNjZXB0ZWQuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdG9zdHJpbmciPjxjb2RlPnRvc3RyaW5nIChlKTwvY29kZT48L2E+PC9oMz4KK1JlY2VpdmVzIGFuIGFyZ3VtZW50IG9mIGFueSB0eXBlIGFuZAorY29udmVydHMgaXQgdG8gYSBzdHJpbmcgaW4gYSByZWFzb25hYmxlIGZvcm1hdC4KK0ZvciBjb21wbGV0ZSBjb250cm9sIG9mIGhvdyBudW1iZXJzIGFyZSBjb252ZXJ0ZWQsCit1c2UgPGEgaHJlZj0iI3BkZi1zdHJpbmcuZm9ybWF0Ij48Y29kZT5zdHJpbmcuZm9ybWF0PC9jb2RlPjwvYT4uCisKKworPHA+CitJZiB0aGUgbWV0YXRhYmxlIG9mIDxjb2RlPmU8L2NvZGU+IGhhcyBhIDxjb2RlPiJfX3Rvc3RyaW5nIjwvY29kZT4gZmllbGQsCit0aGVuIDxjb2RlPnRvc3RyaW5nPC9jb2RlPiBjYWxscyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZQord2l0aCA8Y29kZT5lPC9jb2RlPiBhcyBhcmd1bWVudCwKK2FuZCB1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgYXMgaXRzIHJlc3VsdC4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi10eXBlIj48Y29kZT50eXBlICh2KTwvY29kZT48L2E+PC9oMz4KK1JldHVybnMgdGhlIHR5cGUgb2YgaXRzIG9ubHkgYXJndW1lbnQsIGNvZGVkIGFzIGEgc3RyaW5nLgorVGhlIHBvc3NpYmxlIHJlc3VsdHMgb2YgdGhpcyBmdW5jdGlvbiBhcmUKKyI8Y29kZT5uaWw8L2NvZGU+IiAoYSBzdHJpbmcsIG5vdCB0aGUgdmFsdWUgPGI+bmlsPC9iPiksCisiPGNvZGU+bnVtYmVyPC9jb2RlPiIsCisiPGNvZGU+c3RyaW5nPC9jb2RlPiIsCisiPGNvZGU+Ym9vbGVhbjwvY29kZT4iLAorIjxjb2RlPnRhYmxlPC9jb2RlPiIsCisiPGNvZGU+ZnVuY3Rpb248L2NvZGU+IiwKKyI8Y29kZT50aHJlYWQ8L2NvZGU+IiwKK2FuZCAiPGNvZGU+dXNlcmRhdGE8L2NvZGU+Ii4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi11bnBhY2siPjxjb2RlPnVucGFjayAobGlzdCBbLCBpIFssIGpdXSk8L2NvZGU+PC9hPjwvaDM+CitSZXR1cm5zIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBnaXZlbiB0YWJsZS4KK1RoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworCis8cHJlPgorICAgICByZXR1cm4gbGlzdFtpXSwgbGlzdFtpKzFdLCAmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDssIGxpc3Rbal0KKzwvcHJlPjxwPgorZXhjZXB0IHRoYXQgdGhlIGFib3ZlIGNvZGUgY2FuIGJlIHdyaXR0ZW4gb25seSBmb3IgYSBmaXhlZCBudW1iZXIKK29mIGVsZW1lbnRzLgorQnkgZGVmYXVsdCwgPGNvZGU+aTwvY29kZT4gaXMmbmJzcDsxIGFuZCA8Y29kZT5qPC9jb2RlPiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LAorYXMgZGVmaW5lZCBieSB0aGUgbGVuZ3RoIG9wZXJhdG9yIChzZWUgPGEgaHJlZj0iIzIuNS41Ij4mc2VjdDsyLjUuNTwvYT4pLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLV9WRVJTSU9OIj48Y29kZT5fVkVSU0lPTjwvY29kZT48L2E+PC9oMz4KK0EgZ2xvYmFsIHZhcmlhYmxlIChub3QgYSBmdW5jdGlvbikgdGhhdAoraG9sZHMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVudCBpbnRlcnByZXRlciB2ZXJzaW9uLgorVGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhpcyB2YXJpYWJsZSBpcyAiPGNvZGU+THVhIDUuMTwvY29kZT4iLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXhwY2FsbCI+PGNvZGU+eHBjYWxsIChmLCBlcnIpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIDxhIGhyZWY9IiNwZGYtcGNhbGwiPjxjb2RlPnBjYWxsPC9jb2RlPjwvYT4sCitleGNlcHQgdGhhdCB5b3UgY2FuIHNldCBhIG5ldyBlcnJvciBoYW5kbGVyLgorCisKKzxwPgorPGNvZGU+eHBjYWxsPC9jb2RlPiBjYWxscyBmdW5jdGlvbiA8Y29kZT5mPC9jb2RlPiBpbiBwcm90ZWN0ZWQgbW9kZSwKK3VzaW5nIDxjb2RlPmVycjwvY29kZT4gYXMgdGhlIGVycm9yIGhhbmRsZXIuCitBbnkgZXJyb3IgaW5zaWRlIDxjb2RlPmY8L2NvZGU+IGlzIG5vdCBwcm9wYWdhdGVkOworaW5zdGVhZCwgPGNvZGU+eHBjYWxsPC9jb2RlPiBjYXRjaGVzIHRoZSBlcnJvciwKK2NhbGxzIHRoZSA8Y29kZT5lcnI8L2NvZGU+IGZ1bmN0aW9uIHdpdGggdGhlIG9yaWdpbmFsIGVycm9yIG9iamVjdCwKK2FuZCByZXR1cm5zIGEgc3RhdHVzIGNvZGUuCitJdHMgZmlyc3QgcmVzdWx0IGlzIHRoZSBzdGF0dXMgY29kZSAoYSBib29sZWFuKSwKK3doaWNoIGlzIHRydWUgaWYgdGhlIGNhbGwgc3VjY2VlZHMgd2l0aG91dCBlcnJvcnMuCitJbiB0aGlzIGNhc2UsIDxjb2RlPnhwY2FsbDwvY29kZT4gYWxzbyByZXR1cm5zIGFsbCByZXN1bHRzIGZyb20gdGhlIGNhbGwsCithZnRlciB0aGlzIGZpcnN0IHJlc3VsdC4KK0luIGNhc2Ugb2YgYW55IGVycm9yLAorPGNvZGU+eHBjYWxsPC9jb2RlPiByZXR1cm5zIDxiPmZhbHNlPC9iPiBwbHVzIHRoZSByZXN1bHQgZnJvbSA8Y29kZT5lcnI8L2NvZGU+LgorCisKKworCisKKworCis8aDI+NS4yIC0gPGEgbmFtZT0iNS4yIj5Db3JvdXRpbmUgTWFuaXB1bGF0aW9uPC9hPjwvaDI+CisKKzxwPgorVGhlIG9wZXJhdGlvbnMgcmVsYXRlZCB0byBjb3JvdXRpbmVzIGNvbXByaXNlIGEgc3ViLWxpYnJhcnkgb2YKK3RoZSBiYXNpYyBsaWJyYXJ5IGFuZCBjb21lIGluc2lkZSB0aGUgdGFibGUgPGEgbmFtZT0icGRmLWNvcm91dGluZSI+PGNvZGU+Y29yb3V0aW5lPC9jb2RlPjwvYT4uCitTZWUgPGEgaHJlZj0iIzIuMTEiPiZzZWN0OzIuMTE8L2E+IGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgY29yb3V0aW5lcy4KKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWNvcm91dGluZS5jcmVhdGUiPjxjb2RlPmNvcm91dGluZS5jcmVhdGUgKGYpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQ3JlYXRlcyBhIG5ldyBjb3JvdXRpbmUsIHdpdGggYm9keSA8Y29kZT5mPC9jb2RlPi4KKzxjb2RlPmY8L2NvZGU+IG11c3QgYmUgYSBMdWEgZnVuY3Rpb24uCitSZXR1cm5zIHRoaXMgbmV3IGNvcm91dGluZSwKK2FuIG9iamVjdCB3aXRoIHR5cGUgPGNvZGU+InRocmVhZCI8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWUgKGNvIFssIHZhbDEsICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90O10pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorU3RhcnRzIG9yIGNvbnRpbnVlcyB0aGUgZXhlY3V0aW9uIG9mIGNvcm91dGluZSA8Y29kZT5jbzwvY29kZT4uCitUaGUgZmlyc3QgdGltZSB5b3UgcmVzdW1lIGEgY29yb3V0aW5lLAoraXQgc3RhcnRzIHJ1bm5pbmcgaXRzIGJvZHkuCitUaGUgdmFsdWVzIDxjb2RlPnZhbDE8L2NvZGU+LCAmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDsgYXJlIHBhc3NlZAorYXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgYm9keSBmdW5jdGlvbi4KK0lmIHRoZSBjb3JvdXRpbmUgaGFzIHlpZWxkZWQsCis8Y29kZT5yZXN1bWU8L2NvZGU+IHJlc3RhcnRzIGl0OwordGhlIHZhbHVlcyA8Y29kZT52YWwxPC9jb2RlPiwgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7IGFyZSBwYXNzZWQKK2FzIHRoZSByZXN1bHRzIGZyb20gdGhlIHlpZWxkLgorCisKKzxwPgorSWYgdGhlIGNvcm91dGluZSBydW5zIHdpdGhvdXQgYW55IGVycm9ycywKKzxjb2RlPnJlc3VtZTwvY29kZT4gcmV0dXJucyA8Yj50cnVlPC9iPiBwbHVzIGFueSB2YWx1ZXMgcGFzc2VkIHRvIDxjb2RlPnlpZWxkPC9jb2RlPgorKGlmIHRoZSBjb3JvdXRpbmUgeWllbGRzKSBvciBhbnkgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBib2R5IGZ1bmN0aW9uCisoaWYgdGhlIGNvcm91dGluZSB0ZXJtaW5hdGVzKS4KK0lmIHRoZXJlIGlzIGFueSBlcnJvciwKKzxjb2RlPnJlc3VtZTwvY29kZT4gcmV0dXJucyA8Yj5mYWxzZTwvYj4gcGx1cyB0aGUgZXJyb3IgbWVzc2FnZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1jb3JvdXRpbmUucnVubmluZyI+PGNvZGU+Y29yb3V0aW5lLnJ1bm5pbmcgKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBydW5uaW5nIGNvcm91dGluZSwKK29yIDxiPm5pbDwvYj4gd2hlbiBjYWxsZWQgYnkgdGhlIG1haW4gdGhyZWFkLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWNvcm91dGluZS5zdGF0dXMiPjxjb2RlPmNvcm91dGluZS5zdGF0dXMgKGNvKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHN0YXR1cyBvZiBjb3JvdXRpbmUgPGNvZGU+Y288L2NvZGU+LCBhcyBhIHN0cmluZzoKKzxjb2RlPiJydW5uaW5nIjwvY29kZT4sCitpZiB0aGUgY29yb3V0aW5lIGlzIHJ1bm5pbmcgKHRoYXQgaXMsIGl0IGNhbGxlZCA8Y29kZT5zdGF0dXM8L2NvZGU+KTsKKzxjb2RlPiJzdXNwZW5kZWQiPC9jb2RlPiwgaWYgdGhlIGNvcm91dGluZSBpcyBzdXNwZW5kZWQgaW4gYSBjYWxsIHRvIDxjb2RlPnlpZWxkPC9jb2RlPiwKK29yIGlmIGl0IGhhcyBub3Qgc3RhcnRlZCBydW5uaW5nIHlldDsKKzxjb2RlPiJub3JtYWwiPC9jb2RlPiBpZiB0aGUgY29yb3V0aW5lIGlzIGFjdGl2ZSBidXQgbm90IHJ1bm5pbmcKKyh0aGF0IGlzLCBpdCBoYXMgcmVzdW1lZCBhbm90aGVyIGNvcm91dGluZSk7CithbmQgPGNvZGU+ImRlYWQiPC9jb2RlPiBpZiB0aGUgY29yb3V0aW5lIGhhcyBmaW5pc2hlZCBpdHMgYm9keSBmdW5jdGlvbiwKK29yIGlmIGl0IGhhcyBzdG9wcGVkIHdpdGggYW4gZXJyb3IuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtY29yb3V0aW5lLndyYXAiPjxjb2RlPmNvcm91dGluZS53cmFwIChmKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0NyZWF0ZXMgYSBuZXcgY29yb3V0aW5lLCB3aXRoIGJvZHkgPGNvZGU+ZjwvY29kZT4uCis8Y29kZT5mPC9jb2RlPiBtdXN0IGJlIGEgTHVhIGZ1bmN0aW9uLgorUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVzdW1lcyB0aGUgY29yb3V0aW5lIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuCitBbnkgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYmVoYXZlIGFzIHRoZQorZXh0cmEgYXJndW1lbnRzIHRvIDxjb2RlPnJlc3VtZTwvY29kZT4uCitSZXR1cm5zIHRoZSBzYW1lIHZhbHVlcyByZXR1cm5lZCBieSA8Y29kZT5yZXN1bWU8L2NvZGU+LAorZXhjZXB0IHRoZSBmaXJzdCBib29sZWFuLgorSW4gY2FzZSBvZiBlcnJvciwgcHJvcGFnYXRlcyB0aGUgZXJyb3IuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtY29yb3V0aW5lLnlpZWxkIj48Y29kZT5jb3JvdXRpbmUueWllbGQgKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTdXNwZW5kcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjYWxsaW5nIGNvcm91dGluZS4KK1RoZSBjb3JvdXRpbmUgY2Fubm90IGJlIHJ1bm5pbmcgYSBDJm5ic3A7ZnVuY3Rpb24sCithIG1ldGFtZXRob2QsIG9yIGFuIGl0ZXJhdG9yLgorQW55IGFyZ3VtZW50cyB0byA8Y29kZT55aWVsZDwvY29kZT4gYXJlIHBhc3NlZCBhcyBleHRyYSByZXN1bHRzIHRvIDxjb2RlPnJlc3VtZTwvY29kZT4uCisKKworCisKKworCisKKzxoMj41LjMgLSA8YSBuYW1lPSI1LjMiPk1vZHVsZXM8L2E+PC9oMj4KKworPHA+CitUaGUgcGFja2FnZSBsaWJyYXJ5IHByb3ZpZGVzIGJhc2ljCitmYWNpbGl0aWVzIGZvciBsb2FkaW5nIGFuZCBidWlsZGluZyBtb2R1bGVzIGluIEx1YS4KK0l0IGV4cG9ydHMgdHdvIG9mIGl0cyBmdW5jdGlvbnMgZGlyZWN0bHkgaW4gdGhlIGdsb2JhbCBlbnZpcm9ubWVudDoKKzxhIGhyZWY9IiNwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZTwvY29kZT48L2E+IGFuZCA8YSBocmVmPSIjcGRmLW1vZHVsZSI+PGNvZGU+bW9kdWxlPC9jb2RlPjwvYT4uCitFdmVyeXRoaW5nIGVsc2UgaXMgZXhwb3J0ZWQgaW4gYSB0YWJsZSA8YSBuYW1lPSJwZGYtcGFja2FnZSI+PGNvZGU+cGFja2FnZTwvY29kZT48L2E+LgorCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbW9kdWxlIj48Y29kZT5tb2R1bGUgKG5hbWUgWywgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7XSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitDcmVhdGVzIGEgbW9kdWxlLgorSWYgdGhlcmUgaXMgYSB0YWJsZSBpbiA8Y29kZT5wYWNrYWdlLmxvYWRlZFtuYW1lXTwvY29kZT4sCit0aGlzIHRhYmxlIGlzIHRoZSBtb2R1bGUuCitPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGEgZ2xvYmFsIHRhYmxlIDxjb2RlPnQ8L2NvZGU+IHdpdGggdGhlIGdpdmVuIG5hbWUsCit0aGlzIHRhYmxlIGlzIHRoZSBtb2R1bGUuCitPdGhlcndpc2UgY3JlYXRlcyBhIG5ldyB0YWJsZSA8Y29kZT50PC9jb2RlPiBhbmQKK3NldHMgaXQgYXMgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgPGNvZGU+bmFtZTwvY29kZT4gYW5kCit0aGUgdmFsdWUgb2YgPGNvZGU+cGFja2FnZS5sb2FkZWRbbmFtZV08L2NvZGU+LgorVGhpcyBmdW5jdGlvbiBhbHNvIGluaXRpYWxpemVzIDxjb2RlPnQuX05BTUU8L2NvZGU+IHdpdGggdGhlIGdpdmVuIG5hbWUsCis8Y29kZT50Ll9NPC9jb2RlPiB3aXRoIHRoZSBtb2R1bGUgKDxjb2RlPnQ8L2NvZGU+IGl0c2VsZiksCithbmQgPGNvZGU+dC5fUEFDS0FHRTwvY29kZT4gd2l0aCB0aGUgcGFja2FnZSBuYW1lCisodGhlIGZ1bGwgbW9kdWxlIG5hbWUgbWludXMgbGFzdCBjb21wb25lbnQ7IHNlZSBiZWxvdykuCitGaW5hbGx5LCA8Y29kZT5tb2R1bGU8L2NvZGU+IHNldHMgPGNvZGU+dDwvY29kZT4gYXMgdGhlIG5ldyBlbnZpcm9ubWVudAorb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gYW5kIHRoZSBuZXcgdmFsdWUgb2YgPGNvZGU+cGFja2FnZS5sb2FkZWRbbmFtZV08L2NvZGU+LAorc28gdGhhdCA8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPiByZXR1cm5zIDxjb2RlPnQ8L2NvZGU+LgorCisKKzxwPgorSWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgYSBjb21wb3VuZCBuYW1lCisodGhhdCBpcywgb25lIHdpdGggY29tcG9uZW50cyBzZXBhcmF0ZWQgYnkgZG90cyksCis8Y29kZT5tb2R1bGU8L2NvZGU+IGNyZWF0ZXMgKG9yIHJldXNlcywgaWYgdGhleSBhbHJlYWR5IGV4aXN0KQordGFibGVzIGZvciBlYWNoIGNvbXBvbmVudC4KK0ZvciBpbnN0YW5jZSwgaWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgPGNvZGU+YS5iLmM8L2NvZGU+LAordGhlbiA8Y29kZT5tb2R1bGU8L2NvZGU+IHN0b3JlcyB0aGUgbW9kdWxlIHRhYmxlIGluIGZpZWxkIDxjb2RlPmM8L2NvZGU+IG9mCitmaWVsZCA8Y29kZT5iPC9jb2RlPiBvZiBnbG9iYWwgPGNvZGU+YTwvY29kZT4uCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGNhbiByZWNlaXZlIG9wdGlvbmFsIDxlbT5vcHRpb25zPC9lbT4gYWZ0ZXIKK3RoZSBtb2R1bGUgbmFtZSwKK3doZXJlIGVhY2ggb3B0aW9uIGlzIGEgZnVuY3Rpb24gdG8gYmUgYXBwbGllZCBvdmVyIHRoZSBtb2R1bGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZSAobW9kbmFtZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitMb2FkcyB0aGUgZ2l2ZW4gbW9kdWxlLgorVGhlIGZ1bmN0aW9uIHN0YXJ0cyBieSBsb29raW5nIGludG8gdGhlIDxhIGhyZWY9IiNwZGYtcGFja2FnZS5sb2FkZWQiPjxjb2RlPnBhY2thZ2UubG9hZGVkPC9jb2RlPjwvYT4gdGFibGUKK3RvIGRldGVybWluZSB3aGV0aGVyIDxjb2RlPm1vZG5hbWU8L2NvZGU+IGlzIGFscmVhZHkgbG9hZGVkLgorSWYgaXQgaXMsIHRoZW4gPGNvZGU+cmVxdWlyZTwvY29kZT4gcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkCithdCA8Y29kZT5wYWNrYWdlLmxvYWRlZFttb2RuYW1lXTwvY29kZT4uCitPdGhlcndpc2UsIGl0IHRyaWVzIHRvIGZpbmQgYSA8ZW0+bG9hZGVyPC9lbT4gZm9yIHRoZSBtb2R1bGUuCisKKworPHA+CitUbyBmaW5kIGEgbG9hZGVyLAorPGNvZGU+cmVxdWlyZTwvY29kZT4gaXMgZ3VpZGVkIGJ5IHRoZSA8YSBocmVmPSIjcGRmLXBhY2thZ2UubG9hZGVycyI+PGNvZGU+cGFja2FnZS5sb2FkZXJzPC9jb2RlPjwvYT4gYXJyYXkuCitCeSBjaGFuZ2luZyB0aGlzIGFycmF5LAord2UgY2FuIGNoYW5nZSBob3cgPGNvZGU+cmVxdWlyZTwvY29kZT4gbG9va3MgZm9yIGEgbW9kdWxlLgorVGhlIGZvbGxvd2luZyBleHBsYW5hdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCitmb3IgPGEgaHJlZj0iI3BkZi1wYWNrYWdlLmxvYWRlcnMiPjxjb2RlPnBhY2thZ2UubG9hZGVyczwvY29kZT48L2E+LgorCisKKzxwPgorRmlyc3QgPGNvZGU+cmVxdWlyZTwvY29kZT4gcXVlcmllcyA8Y29kZT5wYWNrYWdlLnByZWxvYWRbbW9kbmFtZV08L2NvZGU+LgorSWYgaXQgaGFzIGEgdmFsdWUsCit0aGlzIHZhbHVlICh3aGljaCBzaG91bGQgYmUgYSBmdW5jdGlvbikgaXMgdGhlIGxvYWRlci4KK090aGVyd2lzZSA8Y29kZT5yZXF1aXJlPC9jb2RlPiBzZWFyY2hlcyBmb3IgYSBMdWEgbG9hZGVyIHVzaW5nIHRoZQorcGF0aCBzdG9yZWQgaW4gPGEgaHJlZj0iI3BkZi1wYWNrYWdlLnBhdGgiPjxjb2RlPnBhY2thZ2UucGF0aDwvY29kZT48L2E+LgorSWYgdGhhdCBhbHNvIGZhaWxzLCBpdCBzZWFyY2hlcyBmb3IgYSBDJm5ic3A7bG9hZGVyIHVzaW5nIHRoZQorcGF0aCBzdG9yZWQgaW4gPGEgaHJlZj0iI3BkZi1wYWNrYWdlLmNwYXRoIj48Y29kZT5wYWNrYWdlLmNwYXRoPC9jb2RlPjwvYT4uCitJZiB0aGF0IGFsc28gZmFpbHMsCitpdCB0cmllcyBhbiA8ZW0+YWxsLWluLW9uZTwvZW0+IGxvYWRlciAoc2VlIDxhIGhyZWY9IiNwZGYtcGFja2FnZS5sb2FkZXJzIj48Y29kZT5wYWNrYWdlLmxvYWRlcnM8L2NvZGU+PC9hPikuCisKKworPHA+CitPbmNlIGEgbG9hZGVyIGlzIGZvdW5kLAorPGNvZGU+cmVxdWlyZTwvY29kZT4gY2FsbHMgdGhlIGxvYWRlciB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LCA8Y29kZT5tb2RuYW1lPC9jb2RlPi4KK0lmIHRoZSBsb2FkZXIgcmV0dXJucyBhbnkgdmFsdWUsCis8Y29kZT5yZXF1aXJlPC9jb2RlPiBhc3NpZ25zIHRoZSByZXR1cm5lZCB2YWx1ZSB0byA8Y29kZT5wYWNrYWdlLmxvYWRlZFttb2RuYW1lXTwvY29kZT4uCitJZiB0aGUgbG9hZGVyIHJldHVybnMgbm8gdmFsdWUgYW5kCitoYXMgbm90IGFzc2lnbmVkIGFueSB2YWx1ZSB0byA8Y29kZT5wYWNrYWdlLmxvYWRlZFttb2RuYW1lXTwvY29kZT4sCit0aGVuIDxjb2RlPnJlcXVpcmU8L2NvZGU+IGFzc2lnbnMgPGI+dHJ1ZTwvYj4gdG8gdGhpcyBlbnRyeS4KK0luIGFueSBjYXNlLCA8Y29kZT5yZXF1aXJlPC9jb2RlPiByZXR1cm5zIHRoZQorZmluYWwgdmFsdWUgb2YgPGNvZGU+cGFja2FnZS5sb2FkZWRbbW9kbmFtZV08L2NvZGU+LgorCisKKzxwPgorSWYgdGhlcmUgaXMgYW55IGVycm9yIGxvYWRpbmcgb3IgcnVubmluZyB0aGUgbW9kdWxlLAorb3IgaWYgaXQgY2Fubm90IGZpbmQgYW55IGxvYWRlciBmb3IgdGhlIG1vZHVsZSwKK3RoZW4gPGNvZGU+cmVxdWlyZTwvY29kZT4gc2lnbmFscyBhbiBlcnJvci4gCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcGFja2FnZS5jcGF0aCI+PGNvZGU+cGFja2FnZS5jcGF0aDwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoZSBwYXRoIHVzZWQgYnkgPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4gdG8gc2VhcmNoIGZvciBhIEMmbmJzcDtsb2FkZXIuCisKKworPHA+CitMdWEgaW5pdGlhbGl6ZXMgdGhlIEMmbmJzcDtwYXRoIDxhIGhyZWY9IiNwZGYtcGFja2FnZS5jcGF0aCI+PGNvZGU+cGFja2FnZS5jcGF0aDwvY29kZT48L2E+IGluIHRoZSBzYW1lIHdheQoraXQgaW5pdGlhbGl6ZXMgdGhlIEx1YSBwYXRoIDxhIGhyZWY9IiNwZGYtcGFja2FnZS5wYXRoIj48Y29kZT5wYWNrYWdlLnBhdGg8L2NvZGU+PC9hPiwKK3VzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8YSBuYW1lPSJwZGYtTFVBX0NQQVRIIj48Y29kZT5MVUFfQ1BBVEg8L2NvZGU+PC9hPgorb3IgYSBkZWZhdWx0IHBhdGggZGVmaW5lZCBpbiA8Y29kZT5sdWFjb25mLmg8L2NvZGU+LgorCisKKworCis8cD4KKworPGhyPjxoMz48YSBuYW1lPSJwZGYtcGFja2FnZS5sb2FkZWQiPjxjb2RlPnBhY2thZ2UubG9hZGVkPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQSB0YWJsZSB1c2VkIGJ5IDxhIGhyZWY9IiNwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZTwvY29kZT48L2E+IHRvIGNvbnRyb2wgd2hpY2gKK21vZHVsZXMgYXJlIGFscmVhZHkgbG9hZGVkLgorV2hlbiB5b3UgcmVxdWlyZSBhIG1vZHVsZSA8Y29kZT5tb2RuYW1lPC9jb2RlPiBhbmQKKzxjb2RlPnBhY2thZ2UubG9hZGVkW21vZG5hbWVdPC9jb2RlPiBpcyBub3QgZmFsc2UsCis8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPiBzaW1wbHkgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIHRoZXJlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXBhY2thZ2UubG9hZGVycyI+PGNvZGU+cGFja2FnZS5sb2FkZXJzPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQSB0YWJsZSB1c2VkIGJ5IDxhIGhyZWY9IiNwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZTwvY29kZT48L2E+IHRvIGNvbnRyb2wgaG93IHRvIGxvYWQgbW9kdWxlcy4KKworCis8cD4KK0VhY2ggZW50cnkgaW4gdGhpcyB0YWJsZSBpcyBhIDxlbT5zZWFyY2hlciBmdW5jdGlvbjwvZW0+LgorV2hlbiBsb29raW5nIGZvciBhIG1vZHVsZSwKKzxhIGhyZWY9IiNwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZTwvY29kZT48L2E+IGNhbGxzIGVhY2ggb2YgdGhlc2Ugc2VhcmNoZXJzIGluIGFzY2VuZGluZyBvcmRlciwKK3dpdGggdGhlIG1vZHVsZSBuYW1lICh0aGUgYXJndW1lbnQgZ2l2ZW4gdG8gPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4pIGFzIGl0cworc29sZSBwYXJhbWV0ZXIuCitUaGUgZnVuY3Rpb24gY2FuIHJldHVybiBhbm90aGVyIGZ1bmN0aW9uICh0aGUgbW9kdWxlIDxlbT5sb2FkZXI8L2VtPikKK29yIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2h5IGl0IGRpZCBub3QgZmluZCB0aGF0IG1vZHVsZQorKG9yIDxiPm5pbDwvYj4gaWYgaXQgaGFzIG5vdGhpbmcgdG8gc2F5KS4KK0x1YSBpbml0aWFsaXplcyB0aGlzIHRhYmxlIHdpdGggZm91ciBmdW5jdGlvbnMuCisKKworPHA+CitUaGUgZmlyc3Qgc2VhcmNoZXIgc2ltcGx5IGxvb2tzIGZvciBhIGxvYWRlciBpbiB0aGUKKzxhIGhyZWY9IiNwZGYtcGFja2FnZS5wcmVsb2FkIj48Y29kZT5wYWNrYWdlLnByZWxvYWQ8L2NvZGU+PC9hPiB0YWJsZS4KKworCis8cD4KK1RoZSBzZWNvbmQgc2VhcmNoZXIgbG9va3MgZm9yIGEgbG9hZGVyIGFzIGEgTHVhIGxpYnJhcnksCit1c2luZyB0aGUgcGF0aCBzdG9yZWQgYXQgPGEgaHJlZj0iI3BkZi1wYWNrYWdlLnBhdGgiPjxjb2RlPnBhY2thZ2UucGF0aDwvY29kZT48L2E+LgorQSBwYXRoIGlzIGEgc2VxdWVuY2Ugb2YgPGVtPnRlbXBsYXRlczwvZW0+IHNlcGFyYXRlZCBieSBzZW1pY29sb25zLgorRm9yIGVhY2ggdGVtcGxhdGUsCit0aGUgc2VhcmNoZXIgd2lsbCBjaGFuZ2UgZWFjaCBpbnRlcnJvZ2F0aW9uCittYXJrIGluIHRoZSB0ZW1wbGF0ZSBieSA8Y29kZT5maWxlbmFtZTwvY29kZT4sCit3aGljaCBpcyB0aGUgbW9kdWxlIG5hbWUgd2l0aCBlYWNoIGRvdCByZXBsYWNlZCBieSBhCisiZGlyZWN0b3J5IHNlcGFyYXRvciIgKHN1Y2ggYXMgIjxjb2RlPi88L2NvZGU+IiBpbiBVbml4KTsKK3RoZW4gaXQgd2lsbCB0cnkgdG8gb3BlbiB0aGUgcmVzdWx0aW5nIGZpbGUgbmFtZS4KK1NvLCBmb3IgaW5zdGFuY2UsIGlmIHRoZSBMdWEgcGF0aCBpcyB0aGUgc3RyaW5nCisKKzxwcmU+CisgICAgICIuLz8ubHVhOy4vPy5sYzsvdXNyL2xvY2FsLz8vaW5pdC5sdWEiCis8L3ByZT48cD4KK3RoZSBzZWFyY2ggZm9yIGEgTHVhIGZpbGUgZm9yIG1vZHVsZSA8Y29kZT5mb288L2NvZGU+Cit3aWxsIHRyeSB0byBvcGVuIHRoZSBmaWxlcworPGNvZGU+Li9mb28ubHVhPC9jb2RlPiwgPGNvZGU+Li9mb28ubGM8L2NvZGU+LCBhbmQKKzxjb2RlPi91c3IvbG9jYWwvZm9vL2luaXQubHVhPC9jb2RlPiwgaW4gdGhhdCBvcmRlci4KKworCis8cD4KK1RoZSB0aGlyZCBzZWFyY2hlciBsb29rcyBmb3IgYSBsb2FkZXIgYXMgYSBDJm5ic3A7bGlicmFyeSwKK3VzaW5nIHRoZSBwYXRoIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZSA8YSBocmVmPSIjcGRmLXBhY2thZ2UuY3BhdGgiPjxjb2RlPnBhY2thZ2UuY3BhdGg8L2NvZGU+PC9hPi4KK0ZvciBpbnN0YW5jZSwKK2lmIHRoZSBDJm5ic3A7cGF0aCBpcyB0aGUgc3RyaW5nCisKKzxwcmU+CisgICAgICIuLz8uc287Li8/LmRsbDsvdXNyL2xvY2FsLz8vaW5pdC5zbyIKKzwvcHJlPjxwPgordGhlIHNlYXJjaGVyIGZvciBtb2R1bGUgPGNvZGU+Zm9vPC9jb2RlPgord2lsbCB0cnkgdG8gb3BlbiB0aGUgZmlsZXMgPGNvZGU+Li9mb28uc288L2NvZGU+LCA8Y29kZT4uL2Zvby5kbGw8L2NvZGU+LAorYW5kIDxjb2RlPi91c3IvbG9jYWwvZm9vL2luaXQuc288L2NvZGU+LCBpbiB0aGF0IG9yZGVyLgorT25jZSBpdCBmaW5kcyBhIEMmbmJzcDtsaWJyYXJ5LAordGhpcyBzZWFyY2hlciBmaXJzdCB1c2VzIGEgZHluYW1pYyBsaW5rIGZhY2lsaXR5IHRvIGxpbmsgdGhlCithcHBsaWNhdGlvbiB3aXRoIHRoZSBsaWJyYXJ5LgorVGhlbiBpdCB0cmllcyB0byBmaW5kIGEgQyZuYnNwO2Z1bmN0aW9uIGluc2lkZSB0aGUgbGlicmFyeSB0bworYmUgdXNlZCBhcyB0aGUgbG9hZGVyLgorVGhlIG5hbWUgb2YgdGhpcyBDJm5ic3A7ZnVuY3Rpb24gaXMgdGhlIHN0cmluZyAiPGNvZGU+bHVhb3Blbl88L2NvZGU+IgorY29uY2F0ZW5hdGVkIHdpdGggYSBjb3B5IG9mIHRoZSBtb2R1bGUgbmFtZSB3aGVyZSBlYWNoIGRvdAoraXMgcmVwbGFjZWQgYnkgYW4gdW5kZXJzY29yZS4KK01vcmVvdmVyLCBpZiB0aGUgbW9kdWxlIG5hbWUgaGFzIGEgaHlwaGVuLAoraXRzIHByZWZpeCB1cCB0byAoYW5kIGluY2x1ZGluZykgdGhlIGZpcnN0IGh5cGhlbiBpcyByZW1vdmVkLgorRm9yIGluc3RhbmNlLCBpZiB0aGUgbW9kdWxlIG5hbWUgaXMgPGNvZGU+YS52MS1iLmM8L2NvZGU+LAordGhlIGZ1bmN0aW9uIG5hbWUgd2lsbCBiZSA8Y29kZT5sdWFvcGVuX2JfYzwvY29kZT4uCisKKworPHA+CitUaGUgZm91cnRoIHNlYXJjaGVyIHRyaWVzIGFuIDxlbT5hbGwtaW4tb25lIGxvYWRlcjwvZW0+LgorSXQgc2VhcmNoZXMgdGhlIEMmbmJzcDtwYXRoIGZvciBhIGxpYnJhcnkgZm9yCit0aGUgcm9vdCBuYW1lIG9mIHRoZSBnaXZlbiBtb2R1bGUuCitGb3IgaW5zdGFuY2UsIHdoZW4gcmVxdWlyaW5nIDxjb2RlPmEuYi5jPC9jb2RlPiwKK2l0IHdpbGwgc2VhcmNoIGZvciBhIEMmbmJzcDtsaWJyYXJ5IGZvciA8Y29kZT5hPC9jb2RlPi4KK0lmIGZvdW5kLCBpdCBsb29rcyBpbnRvIGl0IGZvciBhbiBvcGVuIGZ1bmN0aW9uIGZvcgordGhlIHN1Ym1vZHVsZTsKK2luIG91ciBleGFtcGxlLCB0aGF0IHdvdWxkIGJlIDxjb2RlPmx1YW9wZW5fYV9iX2M8L2NvZGU+LgorV2l0aCB0aGlzIGZhY2lsaXR5LCBhIHBhY2thZ2UgY2FuIHBhY2sgc2V2ZXJhbCBDJm5ic3A7c3VibW9kdWxlcworaW50byBvbmUgc2luZ2xlIGxpYnJhcnksCit3aXRoIGVhY2ggc3VibW9kdWxlIGtlZXBpbmcgaXRzIG9yaWdpbmFsIG9wZW4gZnVuY3Rpb24uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcGFja2FnZS5sb2FkbGliIj48Y29kZT5wYWNrYWdlLmxvYWRsaWIgKGxpYm5hbWUsIGZ1bmNuYW1lKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0R5bmFtaWNhbGx5IGxpbmtzIHRoZSBob3N0IHByb2dyYW0gd2l0aCB0aGUgQyZuYnNwO2xpYnJhcnkgPGNvZGU+bGlibmFtZTwvY29kZT4uCitJbnNpZGUgdGhpcyBsaWJyYXJ5LCBsb29rcyBmb3IgYSBmdW5jdGlvbiA8Y29kZT5mdW5jbmFtZTwvY29kZT4KK2FuZCByZXR1cm5zIHRoaXMgZnVuY3Rpb24gYXMgYSBDJm5ic3A7ZnVuY3Rpb24uCisoU28sIDxjb2RlPmZ1bmNuYW1lPC9jb2RlPiBtdXN0IGZvbGxvdyB0aGUgcHJvdG9jb2wgKHNlZSA8YSBocmVmPSIjbHVhX0NGdW5jdGlvbiI+PGNvZGU+bHVhX0NGdW5jdGlvbjwvY29kZT48L2E+KSkuCisKKworPHA+CitUaGlzIGlzIGEgbG93LWxldmVsIGZ1bmN0aW9uLgorSXQgY29tcGxldGVseSBieXBhc3NlcyB0aGUgcGFja2FnZSBhbmQgbW9kdWxlIHN5c3RlbS4KK1VubGlrZSA8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPiwKK2l0IGRvZXMgbm90IHBlcmZvcm0gYW55IHBhdGggc2VhcmNoaW5nIGFuZAorZG9lcyBub3QgYXV0b21hdGljYWxseSBhZGRzIGV4dGVuc2lvbnMuCis8Y29kZT5saWJuYW1lPC9jb2RlPiBtdXN0IGJlIHRoZSBjb21wbGV0ZSBmaWxlIG5hbWUgb2YgdGhlIEMmbmJzcDtsaWJyYXJ5LAoraW5jbHVkaW5nIGlmIG5lY2Vzc2FyeSBhIHBhdGggYW5kIGV4dGVuc2lvbi4KKzxjb2RlPmZ1bmNuYW1lPC9jb2RlPiBtdXN0IGJlIHRoZSBleGFjdCBuYW1lIGV4cG9ydGVkIGJ5IHRoZSBDJm5ic3A7bGlicmFyeQorKHdoaWNoIG1heSBkZXBlbmQgb24gdGhlIEMmbmJzcDtjb21waWxlciBhbmQgbGlua2VyIHVzZWQpLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFOU0kgQy4KK0FzIHN1Y2gsIGl0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zCisoV2luZG93cywgTGludXgsIE1hYyBPUyBYLCBTb2xhcmlzLCBCU0QsCitwbHVzIG90aGVyIFVuaXggc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlIDxjb2RlPmRsZmNuPC9jb2RlPiBzdGFuZGFyZCkuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcGFja2FnZS5wYXRoIj48Y29kZT5wYWNrYWdlLnBhdGg8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGUgcGF0aCB1c2VkIGJ5IDxhIGhyZWY9IiNwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZTwvY29kZT48L2E+IHRvIHNlYXJjaCBmb3IgYSBMdWEgbG9hZGVyLgorCisKKzxwPgorQXQgc3RhcnQtdXAsIEx1YSBpbml0aWFsaXplcyB0aGlzIHZhcmlhYmxlIHdpdGgKK3RoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPGEgbmFtZT0icGRmLUxVQV9QQVRIIj48Y29kZT5MVUFfUEFUSDwvY29kZT48L2E+IG9yCit3aXRoIGEgZGVmYXVsdCBwYXRoIGRlZmluZWQgaW4gPGNvZGU+bHVhY29uZi5oPC9jb2RlPiwKK2lmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4KK0FueSAiPGNvZGU+Ozs8L2NvZGU+IiBpbiB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitpcyByZXBsYWNlZCBieSB0aGUgZGVmYXVsdCBwYXRoLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXBhY2thZ2UucHJlbG9hZCI+PGNvZGU+cGFja2FnZS5wcmVsb2FkPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQSB0YWJsZSB0byBzdG9yZSBsb2FkZXJzIGZvciBzcGVjaWZpYyBtb2R1bGVzCisoc2VlIDxhIGhyZWY9IiNwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZTwvY29kZT48L2E+KS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wYWNrYWdlLnNlZWFsbCI+PGNvZGU+cGFja2FnZS5zZWVhbGwgKG1vZHVsZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIGEgbWV0YXRhYmxlIGZvciA8Y29kZT5tb2R1bGU8L2NvZGU+IHdpdGgKK2l0cyA8Y29kZT5fX2luZGV4PC9jb2RlPiBmaWVsZCByZWZlcnJpbmcgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudCwKK3NvIHRoYXQgdGhpcyBtb2R1bGUgaW5oZXJpdHMgdmFsdWVzCitmcm9tIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQuCitUbyBiZSB1c2VkIGFzIGFuIG9wdGlvbiB0byBmdW5jdGlvbiA8YSBocmVmPSIjcGRmLW1vZHVsZSI+PGNvZGU+bW9kdWxlPC9jb2RlPjwvYT4uCisKKworCisKKworCisKKzxoMj41LjQgLSA8YSBuYW1lPSI1LjQiPlN0cmluZyBNYW5pcHVsYXRpb248L2E+PC9oMj4KKworPHA+CitUaGlzIGxpYnJhcnkgcHJvdmlkZXMgZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHN0cmluZyBtYW5pcHVsYXRpb24sCitzdWNoIGFzIGZpbmRpbmcgYW5kIGV4dHJhY3Rpbmcgc3Vic3RyaW5ncywgYW5kIHBhdHRlcm4gbWF0Y2hpbmcuCitXaGVuIGluZGV4aW5nIGEgc3RyaW5nIGluIEx1YSwgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhdCBwb3NpdGlvbiZuYnNwOzEKKyhub3QgYXQmbmJzcDswLCBhcyBpbiBDKS4KK0luZGljZXMgYXJlIGFsbG93ZWQgdG8gYmUgbmVnYXRpdmUgYW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbmRleGluZyBiYWNrd2FyZHMsCitmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KK1RodXMsIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhdCBwb3NpdGlvbiAtMSwgYW5kIHNvIG9uLgorCisKKzxwPgorVGhlIHN0cmluZyBsaWJyYXJ5IHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25zIGluc2lkZSB0aGUgdGFibGUKKzxhIG5hbWU9InBkZi1zdHJpbmciPjxjb2RlPnN0cmluZzwvY29kZT48L2E+LgorSXQgYWxzbyBzZXRzIGEgbWV0YXRhYmxlIGZvciBzdHJpbmdzCit3aGVyZSB0aGUgPGNvZGU+X19pbmRleDwvY29kZT4gZmllbGQgcG9pbnRzIHRvIHRoZSA8Y29kZT5zdHJpbmc8L2NvZGU+IHRhYmxlLgorVGhlcmVmb3JlLCB5b3UgY2FuIHVzZSB0aGUgc3RyaW5nIGZ1bmN0aW9ucyBpbiBvYmplY3Qtb3JpZW50ZWQgc3R5bGUuCitGb3IgaW5zdGFuY2UsIDxjb2RlPnN0cmluZy5ieXRlKHMsIGkpPC9jb2RlPgorY2FuIGJlIHdyaXR0ZW4gYXMgPGNvZGU+czpieXRlKGkpPC9jb2RlPi4KKworCis8cD4KK1RoZSBzdHJpbmcgbGlicmFyeSBhc3N1bWVzIG9uZS1ieXRlIGNoYXJhY3RlciBlbmNvZGluZ3MuCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcuYnl0ZSI+PGNvZGU+c3RyaW5nLmJ5dGUgKHMgWywgaSBbLCBqXV0pPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyB0aGUgaW50ZXJuYWwgbnVtZXJpY2FsIGNvZGVzIG9mIHRoZSBjaGFyYWN0ZXJzIDxjb2RlPnNbaV08L2NvZGU+LAorPGNvZGU+c1tpKzFdPC9jb2RlPiwgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7LCA8Y29kZT5zW2pdPC9jb2RlPi4KK1RoZSBkZWZhdWx0IHZhbHVlIGZvciA8Y29kZT5pPC9jb2RlPiBpcyZuYnNwOzE7Cit0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+ajwvY29kZT4gaXMmbmJzcDs8Y29kZT5pPC9jb2RlPi4KKworCis8cD4KK05vdGUgdGhhdCBudW1lcmljYWwgY29kZXMgYXJlIG5vdCBuZWNlc3NhcmlseSBwb3J0YWJsZSBhY3Jvc3MgcGxhdGZvcm1zLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXN0cmluZy5jaGFyIj48Y29kZT5zdHJpbmcuY2hhciAoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KK1JlY2VpdmVzIHplcm8gb3IgbW9yZSBpbnRlZ2Vycy4KK1JldHVybnMgYSBzdHJpbmcgd2l0aCBsZW5ndGggZXF1YWwgdG8gdGhlIG51bWJlciBvZiBhcmd1bWVudHMsCitpbiB3aGljaCBlYWNoIGNoYXJhY3RlciBoYXMgdGhlIGludGVybmFsIG51bWVyaWNhbCBjb2RlIGVxdWFsCit0byBpdHMgY29ycmVzcG9uZGluZyBhcmd1bWVudC4KKworCis8cD4KK05vdGUgdGhhdCBudW1lcmljYWwgY29kZXMgYXJlIG5vdCBuZWNlc3NhcmlseSBwb3J0YWJsZSBhY3Jvc3MgcGxhdGZvcm1zLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXN0cmluZy5kdW1wIj48Y29kZT5zdHJpbmcuZHVtcCAoZnVuY3Rpb24pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiwKK3NvIHRoYXQgYSBsYXRlciA8YSBocmVmPSIjcGRmLWxvYWRzdHJpbmciPjxjb2RlPmxvYWRzdHJpbmc8L2NvZGU+PC9hPiBvbiB0aGlzIHN0cmluZyByZXR1cm5zCithIGNvcHkgb2YgdGhlIGZ1bmN0aW9uLgorPGNvZGU+ZnVuY3Rpb248L2NvZGU+IG11c3QgYmUgYSBMdWEgZnVuY3Rpb24gd2l0aG91dCB1cHZhbHVlcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcuZmluZCI+PGNvZGU+c3RyaW5nLmZpbmQgKHMsIHBhdHRlcm4gWywgaW5pdCBbLCBwbGFpbl1dKTwvY29kZT48L2E+PC9oMz4KK0xvb2tzIGZvciB0aGUgZmlyc3QgbWF0Y2ggb2YKKzxjb2RlPnBhdHRlcm48L2NvZGU+IGluIHRoZSBzdHJpbmcgPGNvZGU+czwvY29kZT4uCitJZiBpdCBmaW5kcyBhIG1hdGNoLCB0aGVuIDxjb2RlPmZpbmQ8L2NvZGU+IHJldHVybnMgdGhlIGluZGljZXMgb2YmbmJzcDs8Y29kZT5zPC9jb2RlPgord2hlcmUgdGhpcyBvY2N1cnJlbmNlIHN0YXJ0cyBhbmQgZW5kczsKK290aGVyd2lzZSwgaXQgcmV0dXJucyA8Yj5uaWw8L2I+LgorQSB0aGlyZCwgb3B0aW9uYWwgbnVtZXJpY2FsIGFyZ3VtZW50IDxjb2RlPmluaXQ8L2NvZGU+IHNwZWNpZmllcword2hlcmUgdG8gc3RhcnQgdGhlIHNlYXJjaDsKK2l0cyBkZWZhdWx0IHZhbHVlIGlzJm5ic3A7MSBhbmQgY2FuIGJlIG5lZ2F0aXZlLgorQSB2YWx1ZSBvZiA8Yj50cnVlPC9iPiBhcyBhIGZvdXJ0aCwgb3B0aW9uYWwgYXJndW1lbnQgPGNvZGU+cGxhaW48L2NvZGU+Cit0dXJucyBvZmYgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgZmFjaWxpdGllcywKK3NvIHRoZSBmdW5jdGlvbiBkb2VzIGEgcGxhaW4gImZpbmQgc3Vic3RyaW5nIiBvcGVyYXRpb24sCit3aXRoIG5vIGNoYXJhY3RlcnMgaW4gPGNvZGU+cGF0dGVybjwvY29kZT4gYmVpbmcgY29uc2lkZXJlZCAibWFnaWMiLgorTm90ZSB0aGF0IGlmIDxjb2RlPnBsYWluPC9jb2RlPiBpcyBnaXZlbiwgdGhlbiA8Y29kZT5pbml0PC9jb2RlPiBtdXN0IGJlIGdpdmVuIGFzIHdlbGwuCisKKworPHA+CitJZiB0aGUgcGF0dGVybiBoYXMgY2FwdHVyZXMsCit0aGVuIGluIGEgc3VjY2Vzc2Z1bCBtYXRjaAordGhlIGNhcHR1cmVkIHZhbHVlcyBhcmUgYWxzbyByZXR1cm5lZCwKK2FmdGVyIHRoZSB0d28gaW5kaWNlcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcuZm9ybWF0Ij48Y29kZT5zdHJpbmcuZm9ybWF0IChmb3JtYXRzdHJpbmcsICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CitSZXR1cm5zIGEgZm9ybWF0dGVkIHZlcnNpb24gb2YgaXRzIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMKK2ZvbGxvd2luZyB0aGUgZGVzY3JpcHRpb24gZ2l2ZW4gaW4gaXRzIGZpcnN0IGFyZ3VtZW50ICh3aGljaCBtdXN0IGJlIGEgc3RyaW5nKS4KK1RoZSBmb3JtYXQgc3RyaW5nIGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIDxjb2RlPnByaW50ZjwvY29kZT4gZmFtaWx5IG9mCitzdGFuZGFyZCBDJm5ic3A7ZnVuY3Rpb25zLgorVGhlIG9ubHkgZGlmZmVyZW5jZXMgYXJlIHRoYXQgdGhlIG9wdGlvbnMvbW9kaWZpZXJzCis8Y29kZT4qPC9jb2RlPiwgPGNvZGU+bDwvY29kZT4sIDxjb2RlPkw8L2NvZGU+LCA8Y29kZT5uPC9jb2RlPiwgPGNvZGU+cDwvY29kZT4sCithbmQgPGNvZGU+aDwvY29kZT4gYXJlIG5vdCBzdXBwb3J0ZWQKK2FuZCB0aGF0IHRoZXJlIGlzIGFuIGV4dHJhIG9wdGlvbiwgPGNvZGU+cTwvY29kZT4uCitUaGUgPGNvZGU+cTwvY29kZT4gb3B0aW9uIGZvcm1hdHMgYSBzdHJpbmcgaW4gYSBmb3JtIHN1aXRhYmxlIHRvIGJlIHNhZmVseSByZWFkCitiYWNrIGJ5IHRoZSBMdWEgaW50ZXJwcmV0ZXI6Cit0aGUgc3RyaW5nIGlzIHdyaXR0ZW4gYmV0d2VlbiBkb3VibGUgcXVvdGVzLAorYW5kIGFsbCBkb3VibGUgcXVvdGVzLCBuZXdsaW5lcywgZW1iZWRkZWQgemVyb3MsCithbmQgYmFja3NsYXNoZXMgaW4gdGhlIHN0cmluZworYXJlIGNvcnJlY3RseSBlc2NhcGVkIHdoZW4gd3JpdHRlbi4KK0ZvciBpbnN0YW5jZSwgdGhlIGNhbGwKKworPHByZT4KKyAgICAgc3RyaW5nLmZvcm1hdCgnJXEnLCAnYSBzdHJpbmcgd2l0aCAicXVvdGVzIiBhbmQgXG4gbmV3IGxpbmUnKQorPC9wcmU+PHA+Cit3aWxsIHByb2R1Y2UgdGhlIHN0cmluZzoKKworPHByZT4KKyAgICAgImEgc3RyaW5nIHdpdGggXCJxdW90ZXNcIiBhbmQgXAorICAgICAgbmV3IGxpbmUiCis8L3ByZT4KKworPHA+CitUaGUgb3B0aW9ucyA8Y29kZT5jPC9jb2RlPiwgPGNvZGU+ZDwvY29kZT4sIDxjb2RlPkU8L2NvZGU+LCA8Y29kZT5lPC9jb2RlPiwgPGNvZGU+ZjwvY29kZT4sCis8Y29kZT5nPC9jb2RlPiwgPGNvZGU+RzwvY29kZT4sIDxjb2RlPmk8L2NvZGU+LCA8Y29kZT5vPC9jb2RlPiwgPGNvZGU+dTwvY29kZT4sIDxjb2RlPlg8L2NvZGU+LCBhbmQgPGNvZGU+eDwvY29kZT4gYWxsCitleHBlY3QgYSBudW1iZXIgYXMgYXJndW1lbnQsCit3aGVyZWFzIDxjb2RlPnE8L2NvZGU+IGFuZCA8Y29kZT5zPC9jb2RlPiBleHBlY3QgYSBzdHJpbmcuCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBzdHJpbmcgdmFsdWVzCitjb250YWluaW5nIGVtYmVkZGVkIHplcm9zLAorZXhjZXB0IGFzIGFyZ3VtZW50cyB0byB0aGUgPGNvZGU+cTwvY29kZT4gb3B0aW9uLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXN0cmluZy5nbWF0Y2giPjxjb2RlPnN0cmluZy5nbWF0Y2ggKHMsIHBhdHRlcm4pPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyBhbiBpdGVyYXRvciBmdW5jdGlvbiB0aGF0LAorZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCwKK3JldHVybnMgdGhlIG5leHQgY2FwdHVyZXMgZnJvbSA8Y29kZT5wYXR0ZXJuPC9jb2RlPiBvdmVyIHN0cmluZyA8Y29kZT5zPC9jb2RlPi4KK0lmIDxjb2RlPnBhdHRlcm48L2NvZGU+IHNwZWNpZmllcyBubyBjYXB0dXJlcywKK3RoZW4gdGhlIHdob2xlIG1hdGNoIGlzIHByb2R1Y2VkIGluIGVhY2ggY2FsbC4KKworCis8cD4KK0FzIGFuIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgbG9vcAorCis8cHJlPgorICAgICBzID0gImhlbGxvIHdvcmxkIGZyb20gTHVhIgorICAgICBmb3IgdyBpbiBzdHJpbmcuZ21hdGNoKHMsICIlYSsiKSBkbworICAgICAgIHByaW50KHcpCisgICAgIGVuZAorPC9wcmU+PHA+Cit3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHdvcmRzIGZyb20gc3RyaW5nIDxjb2RlPnM8L2NvZGU+LAorcHJpbnRpbmcgb25lIHBlciBsaW5lLgorVGhlIG5leHQgZXhhbXBsZSBjb2xsZWN0cyBhbGwgcGFpcnMgPGNvZGU+a2V5PXZhbHVlPC9jb2RlPiBmcm9tIHRoZQorZ2l2ZW4gc3RyaW5nIGludG8gYSB0YWJsZToKKworPHByZT4KKyAgICAgdCA9IHt9CisgICAgIHMgPSAiZnJvbT13b3JsZCwgdG89THVhIgorICAgICBmb3IgaywgdiBpbiBzdHJpbmcuZ21hdGNoKHMsICIoJXcrKT0oJXcrKSIpIGRvCisgICAgICAgdFtrXSA9IHYKKyAgICAgZW5kCis8L3ByZT4KKworPHA+CitGb3IgdGhpcyBmdW5jdGlvbiwgYSAnPGNvZGU+XjwvY29kZT4nIGF0IHRoZSBzdGFydCBvZiBhIHBhdHRlcm4gZG9lcyBub3QKK3dvcmsgYXMgYW4gYW5jaG9yLCBhcyB0aGlzIHdvdWxkIHByZXZlbnQgdGhlIGl0ZXJhdGlvbi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcuZ3N1YiI+PGNvZGU+c3RyaW5nLmdzdWIgKHMsIHBhdHRlcm4sIHJlcGwgWywgbl0pPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyBhIGNvcHkgb2YgPGNvZGU+czwvY29kZT4KK2luIHdoaWNoIGFsbCAob3IgdGhlIGZpcnN0IDxjb2RlPm48L2NvZGU+LCBpZiBnaXZlbikKK29jY3VycmVuY2VzIG9mIHRoZSA8Y29kZT5wYXR0ZXJuPC9jb2RlPiBoYXZlIGJlZW4KK3JlcGxhY2VkIGJ5IGEgcmVwbGFjZW1lbnQgc3RyaW5nIHNwZWNpZmllZCBieSA8Y29kZT5yZXBsPC9jb2RlPiwKK3doaWNoIGNhbiBiZSBhIHN0cmluZywgYSB0YWJsZSwgb3IgYSBmdW5jdGlvbi4KKzxjb2RlPmdzdWI8L2NvZGU+IGFsc28gcmV0dXJucywgYXMgaXRzIHNlY29uZCB2YWx1ZSwKK3RoZSB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyB0aGF0IG9jY3VycmVkLgorCisKKzxwPgorSWYgPGNvZGU+cmVwbDwvY29kZT4gaXMgYSBzdHJpbmcsIHRoZW4gaXRzIHZhbHVlIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgorVGhlIGNoYXJhY3RlciZuYnNwOzxjb2RlPiU8L2NvZGU+IHdvcmtzIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXI6Cithbnkgc2VxdWVuY2UgaW4gPGNvZGU+cmVwbDwvY29kZT4gb2YgdGhlIGZvcm0gPGNvZGU+JTxlbT5uPC9lbT48L2NvZGU+LAord2l0aCA8ZW0+bjwvZW0+IGJldHdlZW4gMSBhbmQgOSwKK3N0YW5kcyBmb3IgdGhlIHZhbHVlIG9mIHRoZSA8ZW0+bjwvZW0+LXRoIGNhcHR1cmVkIHN1YnN0cmluZyAoc2VlIGJlbG93KS4KK1RoZSBzZXF1ZW5jZSA8Y29kZT4lMDwvY29kZT4gc3RhbmRzIGZvciB0aGUgd2hvbGUgbWF0Y2guCitUaGUgc2VxdWVuY2UgPGNvZGU+JSU8L2NvZGU+IHN0YW5kcyBmb3IgYSBzaW5nbGUmbmJzcDs8Y29kZT4lPC9jb2RlPi4KKworCis8cD4KK0lmIDxjb2RlPnJlcGw8L2NvZGU+IGlzIGEgdGFibGUsIHRoZW4gdGhlIHRhYmxlIGlzIHF1ZXJpZWQgZm9yIGV2ZXJ5IG1hdGNoLAordXNpbmcgdGhlIGZpcnN0IGNhcHR1cmUgYXMgdGhlIGtleTsKK2lmIHRoZSBwYXR0ZXJuIHNwZWNpZmllcyBubyBjYXB0dXJlcywKK3RoZW4gdGhlIHdob2xlIG1hdGNoIGlzIHVzZWQgYXMgdGhlIGtleS4KKworCis8cD4KK0lmIDxjb2RlPnJlcGw8L2NvZGU+IGlzIGEgZnVuY3Rpb24sIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBhCittYXRjaCBvY2N1cnMsIHdpdGggYWxsIGNhcHR1cmVkIHN1YnN0cmluZ3MgcGFzc2VkIGFzIGFyZ3VtZW50cywKK2luIG9yZGVyOworaWYgdGhlIHBhdHRlcm4gc3BlY2lmaWVzIG5vIGNhcHR1cmVzLAordGhlbiB0aGUgd2hvbGUgbWF0Y2ggaXMgcGFzc2VkIGFzIGEgc29sZSBhcmd1bWVudC4KKworCis8cD4KK0lmIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgdGFibGUgcXVlcnkgb3IgYnkgdGhlIGZ1bmN0aW9uIGNhbGwKK2lzIGEgc3RyaW5nIG9yIGEgbnVtYmVyLAordGhlbiBpdCBpcyB1c2VkIGFzIHRoZSByZXBsYWNlbWVudCBzdHJpbmc7CitvdGhlcndpc2UsIGlmIGl0IGlzIDxiPmZhbHNlPC9iPiBvciA8Yj5uaWw8L2I+LAordGhlbiB0aGVyZSBpcyBubyByZXBsYWNlbWVudAorKHRoYXQgaXMsIHRoZSBvcmlnaW5hbCBtYXRjaCBpcyBrZXB0IGluIHRoZSBzdHJpbmcpLgorCisKKzxwPgorSGVyZSBhcmUgc29tZSBleGFtcGxlczoKKworPHByZT4KKyAgICAgeCA9IHN0cmluZy5nc3ViKCJoZWxsbyB3b3JsZCIsICIoJXcrKSIsICIlMSAlMSIpCisgICAgIC0tJmd0OyB4PSJoZWxsbyBoZWxsbyB3b3JsZCB3b3JsZCIKKyAgICAgCisgICAgIHggPSBzdHJpbmcuZ3N1YigiaGVsbG8gd29ybGQiLCAiJXcrIiwgIiUwICUwIiwgMSkKKyAgICAgLS0mZ3Q7IHg9ImhlbGxvIGhlbGxvIHdvcmxkIgorICAgICAKKyAgICAgeCA9IHN0cmluZy5nc3ViKCJoZWxsbyB3b3JsZCBmcm9tIEx1YSIsICIoJXcrKSVzKigldyspIiwgIiUyICUxIikKKyAgICAgLS0mZ3Q7IHg9IndvcmxkIGhlbGxvIEx1YSBmcm9tIgorICAgICAKKyAgICAgeCA9IHN0cmluZy5nc3ViKCJob21lID0gJEhPTUUsIHVzZXIgPSAkVVNFUiIsICIlJCgldyspIiwgb3MuZ2V0ZW52KQorICAgICAtLSZndDsgeD0iaG9tZSA9IC9ob21lL3JvYmVydG8sIHVzZXIgPSByb2JlcnRvIgorICAgICAKKyAgICAgeCA9IHN0cmluZy5nc3ViKCI0KzUgPSAkcmV0dXJuIDQrNSQiLCAiJSQoLi0pJSQiLCBmdW5jdGlvbiAocykKKyAgICAgICAgICAgcmV0dXJuIGxvYWRzdHJpbmcocykoKQorICAgICAgICAgZW5kKQorICAgICAtLSZndDsgeD0iNCs1ID0gOSIKKyAgICAgCisgICAgIGxvY2FsIHQgPSB7bmFtZT0ibHVhIiwgdmVyc2lvbj0iNS4xIn0KKyAgICAgeCA9IHN0cmluZy5nc3ViKCIkbmFtZS0kdmVyc2lvbi50YXIuZ3oiLCAiJSQoJXcrKSIsIHQpCisgICAgIC0tJmd0OyB4PSJsdWEtNS4xLnRhci5neiIKKzwvcHJlPgorCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcubGVuIj48Y29kZT5zdHJpbmcubGVuIChzKTwvY29kZT48L2E+PC9oMz4KK1JlY2VpdmVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGl0cyBsZW5ndGguCitUaGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPiBoYXMgbGVuZ3RoIDAuCitFbWJlZGRlZCB6ZXJvcyBhcmUgY291bnRlZCwKK3NvIDxjb2RlPiJhXDAwMGJjXDAwMCI8L2NvZGU+IGhhcyBsZW5ndGggNS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcubG93ZXIiPjxjb2RlPnN0cmluZy5sb3dlciAocyk8L2NvZGU+PC9hPjwvaDM+CitSZWNlaXZlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBzdHJpbmcgd2l0aCBhbGwKK3VwcGVyY2FzZSBsZXR0ZXJzIGNoYW5nZWQgdG8gbG93ZXJjYXNlLgorQWxsIG90aGVyIGNoYXJhY3RlcnMgYXJlIGxlZnQgdW5jaGFuZ2VkLgorVGhlIGRlZmluaXRpb24gb2Ygd2hhdCBhbiB1cHBlcmNhc2UgbGV0dGVyIGlzIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXN0cmluZy5tYXRjaCI+PGNvZGU+c3RyaW5nLm1hdGNoIChzLCBwYXR0ZXJuIFssIGluaXRdKTwvY29kZT48L2E+PC9oMz4KK0xvb2tzIGZvciB0aGUgZmlyc3QgPGVtPm1hdGNoPC9lbT4gb2YKKzxjb2RlPnBhdHRlcm48L2NvZGU+IGluIHRoZSBzdHJpbmcgPGNvZGU+czwvY29kZT4uCitJZiBpdCBmaW5kcyBvbmUsIHRoZW4gPGNvZGU+bWF0Y2g8L2NvZGU+IHJldHVybnMKK3RoZSBjYXB0dXJlcyBmcm9tIHRoZSBwYXR0ZXJuOworb3RoZXJ3aXNlIGl0IHJldHVybnMgPGI+bmlsPC9iPi4KK0lmIDxjb2RlPnBhdHRlcm48L2NvZGU+IHNwZWNpZmllcyBubyBjYXB0dXJlcywKK3RoZW4gdGhlIHdob2xlIG1hdGNoIGlzIHJldHVybmVkLgorQSB0aGlyZCwgb3B0aW9uYWwgbnVtZXJpY2FsIGFyZ3VtZW50IDxjb2RlPmluaXQ8L2NvZGU+IHNwZWNpZmllcword2hlcmUgdG8gc3RhcnQgdGhlIHNlYXJjaDsKK2l0cyBkZWZhdWx0IHZhbHVlIGlzJm5ic3A7MSBhbmQgY2FuIGJlIG5lZ2F0aXZlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXN0cmluZy5yZXAiPjxjb2RlPnN0cmluZy5yZXAgKHMsIG4pPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIDxjb2RlPm48L2NvZGU+IGNvcGllcyBvZgordGhlIHN0cmluZyA8Y29kZT5zPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcucmV2ZXJzZSI+PGNvZGU+c3RyaW5nLnJldmVyc2UgKHMpPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHRoZSBzdHJpbmcgPGNvZGU+czwvY29kZT4gcmV2ZXJzZWQuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLnN1YiI+PGNvZGU+c3RyaW5nLnN1YiAocywgaSBbLCBqXSk8L2NvZGU+PC9hPjwvaDM+CitSZXR1cm5zIHRoZSBzdWJzdHJpbmcgb2YgPGNvZGU+czwvY29kZT4gdGhhdAorc3RhcnRzIGF0IDxjb2RlPmk8L2NvZGU+ICBhbmQgY29udGludWVzIHVudGlsIDxjb2RlPmo8L2NvZGU+OworPGNvZGU+aTwvY29kZT4gYW5kIDxjb2RlPmo8L2NvZGU+IGNhbiBiZSBuZWdhdGl2ZS4KK0lmIDxjb2RlPmo8L2NvZGU+IGlzIGFic2VudCwgdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIGVxdWFsIHRvIC0xCisod2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIHN0cmluZyBsZW5ndGgpLgorSW4gcGFydGljdWxhciwKK3RoZSBjYWxsIDxjb2RlPnN0cmluZy5zdWIocywxLGopPC9jb2RlPiByZXR1cm5zIGEgcHJlZml4IG9mIDxjb2RlPnM8L2NvZGU+Cit3aXRoIGxlbmd0aCA8Y29kZT5qPC9jb2RlPiwKK2FuZCA8Y29kZT5zdHJpbmcuc3ViKHMsIC1pKTwvY29kZT4gcmV0dXJucyBhIHN1ZmZpeCBvZiA8Y29kZT5zPC9jb2RlPgord2l0aCBsZW5ndGggPGNvZGU+aTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLnVwcGVyIj48Y29kZT5zdHJpbmcudXBwZXIgKHMpPC9jb2RlPjwvYT48L2gzPgorUmVjZWl2ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgc3RyaW5nIHdpdGggYWxsCitsb3dlcmNhc2UgbGV0dGVycyBjaGFuZ2VkIHRvIHVwcGVyY2FzZS4KK0FsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KK1RoZSBkZWZpbml0aW9uIG9mIHdoYXQgYSBsb3dlcmNhc2UgbGV0dGVyIGlzIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgorCisKKworPGgzPjUuNC4xIC0gPGEgbmFtZT0iNS40LjEiPlBhdHRlcm5zPC9hPjwvaDM+CisKKworPGg0PkNoYXJhY3RlciBDbGFzczo8L2g0PjxwPgorQSA8ZW0+Y2hhcmFjdGVyIGNsYXNzPC9lbT4gaXMgdXNlZCB0byByZXByZXNlbnQgYSBzZXQgb2YgY2hhcmFjdGVycy4KK1RoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIGFyZSBhbGxvd2VkIGluIGRlc2NyaWJpbmcgYSBjaGFyYWN0ZXIgY2xhc3M6CisKKzx1bD4KKworPGxpPjxiPjxlbT54PC9lbT46PC9iPgorKHdoZXJlIDxlbT54PC9lbT4gaXMgbm90IG9uZSBvZiB0aGUgPGVtPm1hZ2ljIGNoYXJhY3RlcnM8L2VtPgorPGNvZGU+XiQoKSUuW10qKy0/PC9jb2RlPikKK3JlcHJlc2VudHMgdGhlIGNoYXJhY3RlciA8ZW0+eDwvZW0+IGl0c2VsZi4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT4uPC9jb2RlPjo8L2I+IChhIGRvdCkgcmVwcmVzZW50cyBhbGwgY2hhcmFjdGVycy48L2xpPgorCis8bGk+PGI+PGNvZGU+JWE8L2NvZGU+OjwvYj4gcmVwcmVzZW50cyBhbGwgbGV0dGVycy48L2xpPgorCis8bGk+PGI+PGNvZGU+JWM8L2NvZGU+OjwvYj4gcmVwcmVzZW50cyBhbGwgY29udHJvbCBjaGFyYWN0ZXJzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4lZDwvY29kZT46PC9iPiByZXByZXNlbnRzIGFsbCBkaWdpdHMuPC9saT4KKworPGxpPjxiPjxjb2RlPiVsPC9jb2RlPjo8L2I+IHJlcHJlc2VudHMgYWxsIGxvd2VyY2FzZSBsZXR0ZXJzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4lcDwvY29kZT46PC9iPiByZXByZXNlbnRzIGFsbCBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4lczwvY29kZT46PC9iPiByZXByZXNlbnRzIGFsbCBzcGFjZSBjaGFyYWN0ZXJzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4ldTwvY29kZT46PC9iPiByZXByZXNlbnRzIGFsbCB1cHBlcmNhc2UgbGV0dGVycy48L2xpPgorCis8bGk+PGI+PGNvZGU+JXc8L2NvZGU+OjwvYj4gcmVwcmVzZW50cyBhbGwgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuPC9saT4KKworPGxpPjxiPjxjb2RlPiV4PC9jb2RlPjo8L2I+IHJlcHJlc2VudHMgYWxsIGhleGFkZWNpbWFsIGRpZ2l0cy48L2xpPgorCis8bGk+PGI+PGNvZGU+JXo8L2NvZGU+OjwvYj4gcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyIHdpdGggcmVwcmVzZW50YXRpb24gMC48L2xpPgorCis8bGk+PGI+PGNvZGU+JTxlbT54PC9lbT48L2NvZGU+OjwvYj4gKHdoZXJlIDxlbT54PC9lbT4gaXMgYW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyKQorcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyIDxlbT54PC9lbT4uCitUaGlzIGlzIHRoZSBzdGFuZGFyZCB3YXkgdG8gZXNjYXBlIHRoZSBtYWdpYyBjaGFyYWN0ZXJzLgorQW55IHB1bmN0dWF0aW9uIGNoYXJhY3RlciAoZXZlbiB0aGUgbm9uIG1hZ2ljKQorY2FuIGJlIHByZWNlZGVkIGJ5IGEgJzxjb2RlPiU8L2NvZGU+Jword2hlbiB1c2VkIHRvIHJlcHJlc2VudCBpdHNlbGYgaW4gYSBwYXR0ZXJuLgorPC9saT4KKworPGxpPjxiPjxjb2RlPls8ZW0+c2V0PC9lbT5dPC9jb2RlPjo8L2I+CityZXByZXNlbnRzIHRoZSBjbGFzcyB3aGljaCBpcyB0aGUgdW5pb24gb2YgYWxsCitjaGFyYWN0ZXJzIGluIDxlbT5zZXQ8L2VtPi4KK0EgcmFuZ2Ugb2YgY2hhcmFjdGVycyBjYW4gYmUgc3BlY2lmaWVkIGJ5CitzZXBhcmF0aW5nIHRoZSBlbmQgY2hhcmFjdGVycyBvZiB0aGUgcmFuZ2Ugd2l0aCBhICc8Y29kZT4tPC9jb2RlPicuCitBbGwgY2xhc3NlcyA8Y29kZT4lPC9jb2RlPjxlbT54PC9lbT4gZGVzY3JpYmVkIGFib3ZlIGNhbiBhbHNvIGJlIHVzZWQgYXMKK2NvbXBvbmVudHMgaW4gPGVtPnNldDwvZW0+LgorQWxsIG90aGVyIGNoYXJhY3RlcnMgaW4gPGVtPnNldDwvZW0+IHJlcHJlc2VudCB0aGVtc2VsdmVzLgorRm9yIGV4YW1wbGUsIDxjb2RlPlsld19dPC9jb2RlPiAob3IgPGNvZGU+W18ld108L2NvZGU+KQorcmVwcmVzZW50cyBhbGwgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgcGx1cyB0aGUgdW5kZXJzY29yZSwKKzxjb2RlPlswLTddPC9jb2RlPiByZXByZXNlbnRzIHRoZSBvY3RhbCBkaWdpdHMsCithbmQgPGNvZGU+WzAtNyVsJS1dPC9jb2RlPiByZXByZXNlbnRzIHRoZSBvY3RhbCBkaWdpdHMgcGx1cwordGhlIGxvd2VyY2FzZSBsZXR0ZXJzIHBsdXMgdGhlICc8Y29kZT4tPC9jb2RlPicgY2hhcmFjdGVyLgorCisKKzxwPgorVGhlIGludGVyYWN0aW9uIGJldHdlZW4gcmFuZ2VzIGFuZCBjbGFzc2VzIGlzIG5vdCBkZWZpbmVkLgorVGhlcmVmb3JlLCBwYXR0ZXJucyBsaWtlIDxjb2RlPlslYS16XTwvY29kZT4gb3IgPGNvZGU+W2EtJSVdPC9jb2RlPgoraGF2ZSBubyBtZWFuaW5nLgorPC9saT4KKworPGxpPjxiPjxjb2RlPltePGVtPnNldDwvZW0+XTwvY29kZT46PC9iPgorcmVwcmVzZW50cyB0aGUgY29tcGxlbWVudCBvZiA8ZW0+c2V0PC9lbT4sCit3aGVyZSA8ZW0+c2V0PC9lbT4gaXMgaW50ZXJwcmV0ZWQgYXMgYWJvdmUuCis8L2xpPgorCis8L3VsPjxwPgorRm9yIGFsbCBjbGFzc2VzIHJlcHJlc2VudGVkIGJ5IHNpbmdsZSBsZXR0ZXJzICg8Y29kZT4lYTwvY29kZT4sIDxjb2RlPiVjPC9jb2RlPiwgZXRjLiksCit0aGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgbGV0dGVyIHJlcHJlc2VudHMgdGhlIGNvbXBsZW1lbnQgb2YgdGhlIGNsYXNzLgorRm9yIGluc3RhbmNlLCA8Y29kZT4lUzwvY29kZT4gcmVwcmVzZW50cyBhbGwgbm9uLXNwYWNlIGNoYXJhY3RlcnMuCisKKworPHA+CitUaGUgZGVmaW5pdGlvbnMgb2YgbGV0dGVyLCBzcGFjZSwgYW5kIG90aGVyIGNoYXJhY3RlciBncm91cHMKK2RlcGVuZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuCitJbiBwYXJ0aWN1bGFyLCB0aGUgY2xhc3MgPGNvZGU+W2Etel08L2NvZGU+IG1heSBub3QgYmUgZXF1aXZhbGVudCB0byA8Y29kZT4lbDwvY29kZT4uCisKKworCisKKworPGg0PlBhdHRlcm4gSXRlbTo8L2g0PjxwPgorQSA8ZW0+cGF0dGVybiBpdGVtPC9lbT4gY2FuIGJlCisKKzx1bD4KKworPGxpPgorYSBzaW5nbGUgY2hhcmFjdGVyIGNsYXNzLAord2hpY2ggbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBpbiB0aGUgY2xhc3M7Cis8L2xpPgorCis8bGk+CithIHNpbmdsZSBjaGFyYWN0ZXIgY2xhc3MgZm9sbG93ZWQgYnkgJzxjb2RlPio8L2NvZGU+JywKK3doaWNoIG1hdGNoZXMgMCBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNsYXNzLgorVGhlc2UgcmVwZXRpdGlvbiBpdGVtcyB3aWxsIGFsd2F5cyBtYXRjaCB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBzZXF1ZW5jZTsKKzwvbGk+CisKKzxsaT4KK2Egc2luZ2xlIGNoYXJhY3RlciBjbGFzcyBmb2xsb3dlZCBieSAnPGNvZGU+KzwvY29kZT4nLAord2hpY2ggbWF0Y2hlcyAxIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgY2hhcmFjdGVycyBpbiB0aGUgY2xhc3MuCitUaGVzZSByZXBldGl0aW9uIGl0ZW1zIHdpbGwgYWx3YXlzIG1hdGNoIHRoZSBsb25nZXN0IHBvc3NpYmxlIHNlcXVlbmNlOworPC9saT4KKworPGxpPgorYSBzaW5nbGUgY2hhcmFjdGVyIGNsYXNzIGZvbGxvd2VkIGJ5ICc8Y29kZT4tPC9jb2RlPicsCit3aGljaCBhbHNvIG1hdGNoZXMgMCBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNsYXNzLgorVW5saWtlICc8Y29kZT4qPC9jb2RlPicsCit0aGVzZSByZXBldGl0aW9uIGl0ZW1zIHdpbGwgYWx3YXlzIG1hdGNoIHRoZSA8ZW0+c2hvcnRlc3Q8L2VtPiBwb3NzaWJsZSBzZXF1ZW5jZTsKKzwvbGk+CisKKzxsaT4KK2Egc2luZ2xlIGNoYXJhY3RlciBjbGFzcyBmb2xsb3dlZCBieSAnPGNvZGU+PzwvY29kZT4nLAord2hpY2ggbWF0Y2hlcyAwIG9yIDEgb2NjdXJyZW5jZSBvZiBhIGNoYXJhY3RlciBpbiB0aGUgY2xhc3M7Cis8L2xpPgorCis8bGk+Cis8Y29kZT4lPGVtPm48L2VtPjwvY29kZT4sIGZvciA8ZW0+bjwvZW0+IGJldHdlZW4gMSBhbmQgOTsKK3N1Y2ggaXRlbSBtYXRjaGVzIGEgc3Vic3RyaW5nIGVxdWFsIHRvIHRoZSA8ZW0+bjwvZW0+LXRoIGNhcHR1cmVkIHN0cmluZworKHNlZSBiZWxvdyk7Cis8L2xpPgorCis8bGk+Cis8Y29kZT4lYjxlbT54eTwvZW0+PC9jb2RlPiwgd2hlcmUgPGVtPng8L2VtPiBhbmQgPGVtPnk8L2VtPiBhcmUgdHdvIGRpc3RpbmN0IGNoYXJhY3RlcnM7CitzdWNoIGl0ZW0gbWF0Y2hlcyBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCZuYnNwOzxlbT54PC9lbT4sIGVuZCB3aXRoJm5ic3A7PGVtPnk8L2VtPiwKK2FuZCB3aGVyZSB0aGUgPGVtPng8L2VtPiBhbmQgPGVtPnk8L2VtPiBhcmUgPGVtPmJhbGFuY2VkPC9lbT4uCitUaGlzIG1lYW5zIHRoYXQsIGlmIG9uZSByZWFkcyB0aGUgc3RyaW5nIGZyb20gbGVmdCB0byByaWdodCwKK2NvdW50aW5nIDxlbT4rMTwvZW0+IGZvciBhbiA8ZW0+eDwvZW0+IGFuZCA8ZW0+LTE8L2VtPiBmb3IgYSA8ZW0+eTwvZW0+LAordGhlIGVuZGluZyA8ZW0+eTwvZW0+IGlzIHRoZSBmaXJzdCA8ZW0+eTwvZW0+IHdoZXJlIHRoZSBjb3VudCByZWFjaGVzIDAuCitGb3IgaW5zdGFuY2UsIHRoZSBpdGVtIDxjb2RlPiViKCk8L2NvZGU+IG1hdGNoZXMgZXhwcmVzc2lvbnMgd2l0aAorYmFsYW5jZWQgcGFyZW50aGVzZXMuCis8L2xpPgorCis8L3VsPgorCisKKworCis8aDQ+UGF0dGVybjo8L2g0PjxwPgorQSA8ZW0+cGF0dGVybjwvZW0+IGlzIGEgc2VxdWVuY2Ugb2YgcGF0dGVybiBpdGVtcy4KK0EgJzxjb2RlPl48L2NvZGU+JyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGF0dGVybiBhbmNob3JzIHRoZSBtYXRjaCBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgc3ViamVjdCBzdHJpbmcuCitBICc8Y29kZT4kPC9jb2RlPicgYXQgdGhlIGVuZCBvZiBhIHBhdHRlcm4gYW5jaG9ycyB0aGUgbWF0Y2ggYXQgdGhlCitlbmQgb2YgdGhlIHN1YmplY3Qgc3RyaW5nLgorQXQgb3RoZXIgcG9zaXRpb25zLAorJzxjb2RlPl48L2NvZGU+JyBhbmQgJzxjb2RlPiQ8L2NvZGU+JyBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgcmVwcmVzZW50IHRoZW1zZWx2ZXMuCisKKworCisKKworPGg0PkNhcHR1cmVzOjwvaDQ+PHA+CitBIHBhdHRlcm4gY2FuIGNvbnRhaW4gc3ViLXBhdHRlcm5zIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzOwordGhleSBkZXNjcmliZSA8ZW0+Y2FwdHVyZXM8L2VtPi4KK1doZW4gYSBtYXRjaCBzdWNjZWVkcywgdGhlIHN1YnN0cmluZ3Mgb2YgdGhlIHN1YmplY3Qgc3RyaW5nCit0aGF0IG1hdGNoIGNhcHR1cmVzIGFyZSBzdG9yZWQgKDxlbT5jYXB0dXJlZDwvZW0+KSBmb3IgZnV0dXJlIHVzZS4KK0NhcHR1cmVzIGFyZSBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgbGVmdCBwYXJlbnRoZXNlcy4KK0ZvciBpbnN0YW5jZSwgaW4gdGhlIHBhdHRlcm4gPGNvZGU+IihhKiguKSV3KCVzKikpIjwvY29kZT4sCit0aGUgcGFydCBvZiB0aGUgc3RyaW5nIG1hdGNoaW5nIDxjb2RlPiJhKiguKSV3KCVzKikiPC9jb2RlPiBpcworc3RvcmVkIGFzIHRoZSBmaXJzdCBjYXB0dXJlIChhbmQgdGhlcmVmb3JlIGhhcyBudW1iZXImbmJzcDsxKTsKK3RoZSBjaGFyYWN0ZXIgbWF0Y2hpbmcgIjxjb2RlPi48L2NvZGU+IiBpcyBjYXB0dXJlZCB3aXRoIG51bWJlciZuYnNwOzIsCithbmQgdGhlIHBhcnQgbWF0Y2hpbmcgIjxjb2RlPiVzKjwvY29kZT4iIGhhcyBudW1iZXImbmJzcDszLgorCisKKzxwPgorQXMgYSBzcGVjaWFsIGNhc2UsIHRoZSBlbXB0eSBjYXB0dXJlIDxjb2RlPigpPC9jb2RlPiBjYXB0dXJlcwordGhlIGN1cnJlbnQgc3RyaW5nIHBvc2l0aW9uIChhIG51bWJlcikuCitGb3IgaW5zdGFuY2UsIGlmIHdlIGFwcGx5IHRoZSBwYXR0ZXJuIDxjb2RlPiIoKWFhKCkiPC9jb2RlPiBvbiB0aGUKK3N0cmluZyA8Y29kZT4iZmxhYWFwIjwvY29kZT4sIHRoZXJlIHdpbGwgYmUgdHdvIGNhcHR1cmVzOiAzJm5ic3A7YW5kJm5ic3A7NS4KKworCis8cD4KK0EgcGF0dGVybiBjYW5ub3QgY29udGFpbiBlbWJlZGRlZCB6ZXJvcy4gIFVzZSA8Y29kZT4lejwvY29kZT4gaW5zdGVhZC4KKworCisKKworCisKKworCisKKworCis8aDI+NS41IC0gPGEgbmFtZT0iNS41Ij5UYWJsZSBNYW5pcHVsYXRpb248L2E+PC9oMj48cD4KK1RoaXMgbGlicmFyeSBwcm92aWRlcyBnZW5lcmljIGZ1bmN0aW9ucyBmb3IgdGFibGUgbWFuaXB1bGF0aW9uLgorSXQgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbnMgaW5zaWRlIHRoZSB0YWJsZSA8YSBuYW1lPSJwZGYtdGFibGUiPjxjb2RlPnRhYmxlPC9jb2RlPjwvYT4uCisKKworPHA+CitNb3N0IGZ1bmN0aW9ucyBpbiB0aGUgdGFibGUgbGlicmFyeSBhc3N1bWUgdGhhdCB0aGUgdGFibGUKK3JlcHJlc2VudHMgYW4gYXJyYXkgb3IgYSBsaXN0LgorRm9yIHRoZXNlIGZ1bmN0aW9ucywgd2hlbiB3ZSB0YWxrIGFib3V0IHRoZSAibGVuZ3RoIiBvZiBhIHRhYmxlCit3ZSBtZWFuIHRoZSByZXN1bHQgb2YgdGhlIGxlbmd0aCBvcGVyYXRvci4KKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXRhYmxlLmNvbmNhdCI+PGNvZGU+dGFibGUuY29uY2F0ICh0YWJsZSBbLCBzZXAgWywgaSBbLCBqXV1dKTwvY29kZT48L2E+PC9oMz4KK0dpdmVuIGFuIGFycmF5IHdoZXJlIGFsbCBlbGVtZW50cyBhcmUgc3RyaW5ncyBvciBudW1iZXJzLAorcmV0dXJucyA8Y29kZT50YWJsZVtpXS4uc2VwLi50YWJsZVtpKzFdICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OyBzZXAuLnRhYmxlW2pdPC9jb2RlPi4KK1RoZSBkZWZhdWx0IHZhbHVlIGZvciA8Y29kZT5zZXA8L2NvZGU+IGlzIHRoZSBlbXB0eSBzdHJpbmcsCit0aGUgZGVmYXVsdCBmb3IgPGNvZGU+aTwvY29kZT4gaXMgMSwKK2FuZCB0aGUgZGVmYXVsdCBmb3IgPGNvZGU+ajwvY29kZT4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUuCitJZiA8Y29kZT5pPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4gPGNvZGU+ajwvY29kZT4sIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi10YWJsZS5pbnNlcnQiPjxjb2RlPnRhYmxlLmluc2VydCAodGFibGUsIFtwb3MsXSB2YWx1ZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitJbnNlcnRzIGVsZW1lbnQgPGNvZGU+dmFsdWU8L2NvZGU+IGF0IHBvc2l0aW9uIDxjb2RlPnBvczwvY29kZT4gaW4gPGNvZGU+dGFibGU8L2NvZGU+LAorc2hpZnRpbmcgdXAgb3RoZXIgZWxlbWVudHMgdG8gb3BlbiBzcGFjZSwgaWYgbmVjZXNzYXJ5LgorVGhlIGRlZmF1bHQgdmFsdWUgZm9yIDxjb2RlPnBvczwvY29kZT4gaXMgPGNvZGU+bisxPC9jb2RlPiwKK3doZXJlIDxjb2RlPm48L2NvZGU+IGlzIHRoZSBsZW5ndGggb2YgdGhlIHRhYmxlIChzZWUgPGEgaHJlZj0iIzIuNS41Ij4mc2VjdDsyLjUuNTwvYT4pLAorc28gdGhhdCBhIGNhbGwgPGNvZGU+dGFibGUuaW5zZXJ0KHQseCk8L2NvZGU+IGluc2VydHMgPGNvZGU+eDwvY29kZT4gYXQgdGhlIGVuZAorb2YgdGFibGUgPGNvZGU+dDwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdGFibGUubWF4biI+PGNvZGU+dGFibGUubWF4biAodGFibGUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBudW1lcmljYWwgaW5kZXggb2YgdGhlIGdpdmVuIHRhYmxlLAorb3IgemVybyBpZiB0aGUgdGFibGUgaGFzIG5vIHBvc2l0aXZlIG51bWVyaWNhbCBpbmRpY2VzLgorKFRvIGRvIGl0cyBqb2IgdGhpcyBmdW5jdGlvbiBkb2VzIGEgbGluZWFyIHRyYXZlcnNhbCBvZgordGhlIHdob2xlIHRhYmxlLikgCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdGFibGUucmVtb3ZlIj48Y29kZT50YWJsZS5yZW1vdmUgKHRhYmxlIFssIHBvc10pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmVtb3ZlcyBmcm9tIDxjb2RlPnRhYmxlPC9jb2RlPiB0aGUgZWxlbWVudCBhdCBwb3NpdGlvbiA8Y29kZT5wb3M8L2NvZGU+LAorc2hpZnRpbmcgZG93biBvdGhlciBlbGVtZW50cyB0byBjbG9zZSB0aGUgc3BhY2UsIGlmIG5lY2Vzc2FyeS4KK1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIGVsZW1lbnQuCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+cG9zPC9jb2RlPiBpcyA8Y29kZT5uPC9jb2RlPiwKK3doZXJlIDxjb2RlPm48L2NvZGU+IGlzIHRoZSBsZW5ndGggb2YgdGhlIHRhYmxlLAorc28gdGhhdCBhIGNhbGwgPGNvZGU+dGFibGUucmVtb3ZlKHQpPC9jb2RlPiByZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQKK29mIHRhYmxlIDxjb2RlPnQ8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXRhYmxlLnNvcnQiPjxjb2RlPnRhYmxlLnNvcnQgKHRhYmxlIFssIGNvbXBdKTwvY29kZT48L2E+PC9oMz4KK1NvcnRzIHRhYmxlIGVsZW1lbnRzIGluIGEgZ2l2ZW4gb3JkZXIsIDxlbT5pbi1wbGFjZTwvZW0+LAorZnJvbSA8Y29kZT50YWJsZVsxXTwvY29kZT4gdG8gPGNvZGU+dGFibGVbbl08L2NvZGU+LAord2hlcmUgPGNvZGU+bjwvY29kZT4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUuCitJZiA8Y29kZT5jb21wPC9jb2RlPiBpcyBnaXZlbiwKK3RoZW4gaXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdHdvIHRhYmxlIGVsZW1lbnRzLAorYW5kIHJldHVybnMgdHJ1ZQord2hlbiB0aGUgZmlyc3QgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQKKyhzbyB0aGF0IDxjb2RlPm5vdCBjb21wKGFbaSsxXSxhW2ldKTwvY29kZT4gd2lsbCBiZSB0cnVlIGFmdGVyIHRoZSBzb3J0KS4KK0lmIDxjb2RlPmNvbXA8L2NvZGU+IGlzIG5vdCBnaXZlbiwKK3RoZW4gdGhlIHN0YW5kYXJkIEx1YSBvcGVyYXRvciA8Y29kZT4mbHQ7PC9jb2RlPiBpcyB1c2VkIGluc3RlYWQuCisKKworPHA+CitUaGUgc29ydCBhbGdvcml0aG0gaXMgbm90IHN0YWJsZTsKK3RoYXQgaXMsIGVsZW1lbnRzIGNvbnNpZGVyZWQgZXF1YWwgYnkgdGhlIGdpdmVuIG9yZGVyCittYXkgaGF2ZSB0aGVpciByZWxhdGl2ZSBwb3NpdGlvbnMgY2hhbmdlZCBieSB0aGUgc29ydC4KKworCisKKworCisKKworPGgyPjUuNiAtIDxhIG5hbWU9IjUuNiI+TWF0aGVtYXRpY2FsIEZ1bmN0aW9uczwvYT48L2gyPgorCis8cD4KK1RoaXMgbGlicmFyeSBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkIEMmbmJzcDttYXRoIGxpYnJhcnkuCitJdCBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9ucyBpbnNpZGUgdGhlIHRhYmxlIDxhIG5hbWU9InBkZi1tYXRoIj48Y29kZT5tYXRoPC9jb2RlPjwvYT4uCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmFicyI+PGNvZGU+bWF0aC5hYnMgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgPGNvZGU+eDwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5hY29zIj48Y29kZT5tYXRoLmFjb3MgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYXJjIGNvc2luZSBvZiA8Y29kZT54PC9jb2RlPiAoaW4gcmFkaWFucykuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5hc2luIj48Y29kZT5tYXRoLmFzaW4gKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYXJjIHNpbmUgb2YgPGNvZGU+eDwvY29kZT4gKGluIHJhZGlhbnMpLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguYXRhbiI+PGNvZGU+bWF0aC5hdGFuICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGFyYyB0YW5nZW50IG9mIDxjb2RlPng8L2NvZGU+IChpbiByYWRpYW5zKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmF0YW4yIj48Y29kZT5tYXRoLmF0YW4yICh5LCB4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGFyYyB0YW5nZW50IG9mIDxjb2RlPnkveDwvY29kZT4gKGluIHJhZGlhbnMpLAorYnV0IHVzZXMgdGhlIHNpZ25zIG9mIGJvdGggcGFyYW1ldGVycyB0byBmaW5kIHRoZQorcXVhZHJhbnQgb2YgdGhlIHJlc3VsdC4KKyhJdCBhbHNvIGhhbmRsZXMgY29ycmVjdGx5IHRoZSBjYXNlIG9mIDxjb2RlPng8L2NvZGU+IGJlaW5nIHplcm8uKQorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguY2VpbCI+PGNvZGU+bWF0aC5jZWlsICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHNtYWxsZXN0IGludGVnZXIgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+eDwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5jb3MiPjxjb2RlPm1hdGguY29zICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGNvc2luZSBvZiA8Y29kZT54PC9jb2RlPiAoYXNzdW1lZCB0byBiZSBpbiByYWRpYW5zKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmNvc2giPjxjb2RlPm1hdGguY29zaCAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiA8Y29kZT54PC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmRlZyI+PGNvZGU+bWF0aC5kZWcgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYW5nbGUgPGNvZGU+eDwvY29kZT4gKGdpdmVuIGluIHJhZGlhbnMpIGluIGRlZ3JlZXMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5leHAiPjxjb2RlPm1hdGguZXhwICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHZhbHVlIDxlbT5lPHN1cD54PC9zdXA+PC9lbT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5mbG9vciI+PGNvZGU+bWF0aC5mbG9vciAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBsYXJnZXN0IGludGVnZXIgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPng8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguZm1vZCI+PGNvZGU+bWF0aC5mbW9kICh4LCB5KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgZGl2aXNpb24gb2YgPGNvZGU+eDwvY29kZT4gYnkgPGNvZGU+eTwvY29kZT4KK3RoYXQgcm91bmRzIHRoZSBxdW90aWVudCB0b3dhcmRzIHplcm8uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5mcmV4cCI+PGNvZGU+bWF0aC5mcmV4cCAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIDxjb2RlPm08L2NvZGU+IGFuZCA8Y29kZT5lPC9jb2RlPiBzdWNoIHRoYXQgPGVtPnggPSBtMjxzdXA+ZTwvc3VwPjwvZW0+LAorPGNvZGU+ZTwvY29kZT4gaXMgYW4gaW50ZWdlciBhbmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIDxjb2RlPm08L2NvZGU+IGlzCitpbiB0aGUgcmFuZ2UgPGVtPlswLjUsIDEpPC9lbT4KKyhvciB6ZXJvIHdoZW4gPGNvZGU+eDwvY29kZT4gaXMgemVybykuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5odWdlIj48Y29kZT5tYXRoLmh1Z2U8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGUgdmFsdWUgPGNvZGU+SFVHRV9WQUw8L2NvZGU+LAorYSB2YWx1ZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byBhbnkgb3RoZXIgbnVtZXJpY2FsIHZhbHVlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgubGRleHAiPjxjb2RlPm1hdGgubGRleHAgKG0sIGUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyA8ZW0+bTI8c3VwPmU8L3N1cD48L2VtPiAoPGNvZGU+ZTwvY29kZT4gc2hvdWxkIGJlIGFuIGludGVnZXIpLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgubG9nIj48Y29kZT5tYXRoLmxvZyAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiA8Y29kZT54PC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmxvZzEwIj48Y29kZT5tYXRoLmxvZzEwICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGJhc2UtMTAgbG9nYXJpdGhtIG9mIDxjb2RlPng8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgubWF4Ij48Y29kZT5tYXRoLm1heCAoeCwgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIG1heGltdW0gdmFsdWUgYW1vbmcgaXRzIGFyZ3VtZW50cy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLm1pbiI+PGNvZGU+bWF0aC5taW4gKHgsICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGFtb25nIGl0cyBhcmd1bWVudHMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5tb2RmIj48Y29kZT5tYXRoLm1vZGYgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0d28gbnVtYmVycywKK3RoZSBpbnRlZ3JhbCBwYXJ0IG9mIDxjb2RlPng8L2NvZGU+IGFuZCB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIDxjb2RlPng8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgucGkiPjxjb2RlPm1hdGgucGk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGUgdmFsdWUgb2YgPGVtPnBpPC9lbT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5wb3ciPjxjb2RlPm1hdGgucG93ICh4LCB5KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgPGVtPng8c3VwPnk8L3N1cD48L2VtPi4KKyhZb3UgY2FuIGFsc28gdXNlIHRoZSBleHByZXNzaW9uIDxjb2RlPnheeTwvY29kZT4gdG8gY29tcHV0ZSB0aGlzIHZhbHVlLikKKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLnJhZCI+PGNvZGU+bWF0aC5yYWQgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYW5nbGUgPGNvZGU+eDwvY29kZT4gKGdpdmVuIGluIGRlZ3JlZXMpIGluIHJhZGlhbnMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5yYW5kb20iPjxjb2RlPm1hdGgucmFuZG9tIChbbSBbLCBuXV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHNpbXBsZQorcHNldWRvLXJhbmRvbSBnZW5lcmF0b3IgZnVuY3Rpb24gPGNvZGU+cmFuZDwvY29kZT4gcHJvdmlkZWQgYnkgQU5TSSZuYnNwO0MuCisoTm8gZ3VhcmFudGVlcyBjYW4gYmUgZ2l2ZW4gZm9yIGl0cyBzdGF0aXN0aWNhbCBwcm9wZXJ0aWVzLikKKworCis8cD4KK1doZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLAorcmV0dXJucyBhIHVuaWZvcm0gcHNldWRvLXJhbmRvbSByZWFsIG51bWJlcgoraW4gdGhlIHJhbmdlIDxlbT5bMCwxKTwvZW0+LiAgCitXaGVuIGNhbGxlZCB3aXRoIGFuIGludGVnZXIgbnVtYmVyIDxjb2RlPm08L2NvZGU+LAorPGNvZGU+bWF0aC5yYW5kb208L2NvZGU+IHJldHVybnMKK2EgdW5pZm9ybSBwc2V1ZG8tcmFuZG9tIGludGVnZXIgaW4gdGhlIHJhbmdlIDxlbT5bMSwgbV08L2VtPi4KK1doZW4gY2FsbGVkIHdpdGggdHdvIGludGVnZXIgbnVtYmVycyA8Y29kZT5tPC9jb2RlPiBhbmQgPGNvZGU+bjwvY29kZT4sCis8Y29kZT5tYXRoLnJhbmRvbTwvY29kZT4gcmV0dXJucyBhIHVuaWZvcm0gcHNldWRvLXJhbmRvbQoraW50ZWdlciBpbiB0aGUgcmFuZ2UgPGVtPlttLCBuXTwvZW0+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgucmFuZG9tc2VlZCI+PGNvZGU+bWF0aC5yYW5kb21zZWVkICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1NldHMgPGNvZGU+eDwvY29kZT4gYXMgdGhlICJzZWVkIgorZm9yIHRoZSBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRvcjoKK2VxdWFsIHNlZWRzIHByb2R1Y2UgZXF1YWwgc2VxdWVuY2VzIG9mIG51bWJlcnMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5zaW4iPjxjb2RlPm1hdGguc2luICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHNpbmUgb2YgPGNvZGU+eDwvY29kZT4gKGFzc3VtZWQgdG8gYmUgaW4gcmFkaWFucykuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5zaW5oIj48Y29kZT5tYXRoLnNpbmggKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIDxjb2RlPng8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguc3FydCI+PGNvZGU+bWF0aC5zcXJ0ICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHNxdWFyZSByb290IG9mIDxjb2RlPng8L2NvZGU+LgorKFlvdSBjYW4gYWxzbyB1c2UgdGhlIGV4cHJlc3Npb24gPGNvZGU+eF4wLjU8L2NvZGU+IHRvIGNvbXB1dGUgdGhpcyB2YWx1ZS4pCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC50YW4iPjxjb2RlPm1hdGgudGFuICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHRhbmdlbnQgb2YgPGNvZGU+eDwvY29kZT4gKGFzc3VtZWQgdG8gYmUgaW4gcmFkaWFucykuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC50YW5oIj48Y29kZT5tYXRoLnRhbmggKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIDxjb2RlPng8L2NvZGU+LgorCisKKworCisKKworCis8aDI+NS43IC0gPGEgbmFtZT0iNS43Ij5JbnB1dCBhbmQgT3V0cHV0IEZhY2lsaXRpZXM8L2E+PC9oMj4KKworPHA+CitUaGUgSS9PIGxpYnJhcnkgcHJvdmlkZXMgdHdvIGRpZmZlcmVudCBzdHlsZXMgZm9yIGZpbGUgbWFuaXB1bGF0aW9uLgorVGhlIGZpcnN0IG9uZSB1c2VzIGltcGxpY2l0IGZpbGUgZGVzY3JpcHRvcnM7Cit0aGF0IGlzLCB0aGVyZSBhcmUgb3BlcmF0aW9ucyB0byBzZXQgYSBkZWZhdWx0IGlucHV0IGZpbGUgYW5kIGEKK2RlZmF1bHQgb3V0cHV0IGZpbGUsCithbmQgYWxsIGlucHV0L291dHB1dCBvcGVyYXRpb25zIGFyZSBvdmVyIHRoZXNlIGRlZmF1bHQgZmlsZXMuCitUaGUgc2Vjb25kIHN0eWxlIHVzZXMgZXhwbGljaXQgZmlsZSBkZXNjcmlwdG9ycy4KKworCis8cD4KK1doZW4gdXNpbmcgaW1wbGljaXQgZmlsZSBkZXNjcmlwdG9ycywKK2FsbCBvcGVyYXRpb25zIGFyZSBzdXBwbGllZCBieSB0YWJsZSA8YSBuYW1lPSJwZGYtaW8iPjxjb2RlPmlvPC9jb2RlPjwvYT4uCitXaGVuIHVzaW5nIGV4cGxpY2l0IGZpbGUgZGVzY3JpcHRvcnMsCit0aGUgb3BlcmF0aW9uIDxhIGhyZWY9IiNwZGYtaW8ub3BlbiI+PGNvZGU+aW8ub3BlbjwvY29kZT48L2E+IHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IKK2FuZCB0aGVuIGFsbCBvcGVyYXRpb25zIGFyZSBzdXBwbGllZCBhcyBtZXRob2RzIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisKKworPHA+CitUaGUgdGFibGUgPGNvZGU+aW88L2NvZGU+IGFsc28gcHJvdmlkZXMKK3RocmVlIHByZWRlZmluZWQgZmlsZSBkZXNjcmlwdG9ycyB3aXRoIHRoZWlyIHVzdWFsIG1lYW5pbmdzIGZyb20gQzoKKzxhIG5hbWU9InBkZi1pby5zdGRpbiI+PGNvZGU+aW8uc3RkaW48L2NvZGU+PC9hPiwgPGEgbmFtZT0icGRmLWlvLnN0ZG91dCI+PGNvZGU+aW8uc3Rkb3V0PC9jb2RlPjwvYT4sIGFuZCA8YSBuYW1lPSJwZGYtaW8uc3RkZXJyIj48Y29kZT5pby5zdGRlcnI8L2NvZGU+PC9hPi4KK1RoZSBJL08gbGlicmFyeSBuZXZlciBjbG9zZXMgdGhlc2UgZmlsZXMuCisKKworPHA+CitVbmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwKK2FsbCBJL08gZnVuY3Rpb25zIHJldHVybiA8Yj5uaWw8L2I+IG9uIGZhaWx1cmUKKyhwbHVzIGFuIGVycm9yIG1lc3NhZ2UgYXMgYSBzZWNvbmQgcmVzdWx0IGFuZAorYSBzeXN0ZW0tZGVwZW5kZW50IGVycm9yIGNvZGUgYXMgYSB0aGlyZCByZXN1bHQpCithbmQgc29tZSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSA8Yj5uaWw8L2I+IG9uIHN1Y2Nlc3MuCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1pby5jbG9zZSI+PGNvZGU+aW8uY2xvc2UgKFtmaWxlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitFcXVpdmFsZW50IHRvIDxjb2RlPmZpbGU6Y2xvc2UoKTwvY29kZT4uCitXaXRob3V0IGEgPGNvZGU+ZmlsZTwvY29kZT4sIGNsb3NlcyB0aGUgZGVmYXVsdCBvdXRwdXQgZmlsZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1pby5mbHVzaCI+PGNvZGU+aW8uZmx1c2ggKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitFcXVpdmFsZW50IHRvIDxjb2RlPmZpbGU6Zmx1c2g8L2NvZGU+IG92ZXIgdGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8uaW5wdXQiPjxjb2RlPmlvLmlucHV0IChbZmlsZV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aCBhIGZpbGUgbmFtZSwgaXQgb3BlbnMgdGhlIG5hbWVkIGZpbGUgKGluIHRleHQgbW9kZSksCithbmQgc2V0cyBpdHMgaGFuZGxlIGFzIHRoZSBkZWZhdWx0IGlucHV0IGZpbGUuCitXaGVuIGNhbGxlZCB3aXRoIGEgZmlsZSBoYW5kbGUsCitpdCBzaW1wbHkgc2V0cyB0aGlzIGZpbGUgaGFuZGxlIGFzIHRoZSBkZWZhdWx0IGlucHV0IGZpbGUuCitXaGVuIGNhbGxlZCB3aXRob3V0IHBhcmFtZXRlcnMsCitpdCByZXR1cm5zIHRoZSBjdXJyZW50IGRlZmF1bHQgaW5wdXQgZmlsZS4KKworCis8cD4KK0luIGNhc2Ugb2YgZXJyb3JzIHRoaXMgZnVuY3Rpb24gcmFpc2VzIHRoZSBlcnJvciwKK2luc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yIGNvZGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8ubGluZXMiPjxjb2RlPmlvLmxpbmVzIChbZmlsZW5hbWVdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK09wZW5zIHRoZSBnaXZlbiBmaWxlIG5hbWUgaW4gcmVhZCBtb2RlCithbmQgcmV0dXJucyBhbiBpdGVyYXRvciBmdW5jdGlvbiB0aGF0LAorZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCwKK3JldHVybnMgYSBuZXcgbGluZSBmcm9tIHRoZSBmaWxlLgorVGhlcmVmb3JlLCB0aGUgY29uc3RydWN0aW9uCisKKzxwcmU+CisgICAgIGZvciBsaW5lIGluIGlvLmxpbmVzKGZpbGVuYW1lKSBkbyA8ZW0+Ym9keTwvZW0+IGVuZAorPC9wcmU+PHA+Cit3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgbGluZXMgb2YgdGhlIGZpbGUuCitXaGVuIHRoZSBpdGVyYXRvciBmdW5jdGlvbiBkZXRlY3RzIHRoZSBlbmQgb2YgZmlsZSwKK2l0IHJldHVybnMgPGI+bmlsPC9iPiAodG8gZmluaXNoIHRoZSBsb29wKSBhbmQgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGZpbGUuCisKKworPHA+CitUaGUgY2FsbCA8Y29kZT5pby5saW5lcygpPC9jb2RlPiAod2l0aCBubyBmaWxlIG5hbWUpIGlzIGVxdWl2YWxlbnQKK3RvIDxjb2RlPmlvLmlucHV0KCk6bGluZXMoKTwvY29kZT47Cit0aGF0IGlzLCBpdCBpdGVyYXRlcyBvdmVyIHRoZSBsaW5lcyBvZiB0aGUgZGVmYXVsdCBpbnB1dCBmaWxlLgorSW4gdGhpcyBjYXNlIGl0IGRvZXMgbm90IGNsb3NlIHRoZSBmaWxlIHdoZW4gdGhlIGxvb3AgZW5kcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1pby5vcGVuIj48Y29kZT5pby5vcGVuIChmaWxlbmFtZSBbLCBtb2RlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGlzIGZ1bmN0aW9uIG9wZW5zIGEgZmlsZSwKK2luIHRoZSBtb2RlIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIDxjb2RlPm1vZGU8L2NvZGU+LgorSXQgcmV0dXJucyBhIG5ldyBmaWxlIGhhbmRsZSwKK29yLCBpbiBjYXNlIG9mIGVycm9ycywgPGI+bmlsPC9iPiBwbHVzIGFuIGVycm9yIG1lc3NhZ2UuCisKKworPHA+CitUaGUgPGNvZGU+bW9kZTwvY29kZT4gc3RyaW5nIGNhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKworPHVsPgorPGxpPjxiPiJyIjo8L2I+IHJlYWQgbW9kZSAodGhlIGRlZmF1bHQpOzwvbGk+Cis8bGk+PGI+InciOjwvYj4gd3JpdGUgbW9kZTs8L2xpPgorPGxpPjxiPiJhIjo8L2I+IGFwcGVuZCBtb2RlOzwvbGk+Cis8bGk+PGI+InIrIjo8L2I+IHVwZGF0ZSBtb2RlLCBhbGwgcHJldmlvdXMgZGF0YSBpcyBwcmVzZXJ2ZWQ7PC9saT4KKzxsaT48Yj4idysiOjwvYj4gdXBkYXRlIG1vZGUsIGFsbCBwcmV2aW91cyBkYXRhIGlzIGVyYXNlZDs8L2xpPgorPGxpPjxiPiJhKyI6PC9iPiBhcHBlbmQgdXBkYXRlIG1vZGUsIHByZXZpb3VzIGRhdGEgaXMgcHJlc2VydmVkLAorICB3cml0aW5nIGlzIG9ubHkgYWxsb3dlZCBhdCB0aGUgZW5kIG9mIGZpbGUuPC9saT4KKzwvdWw+PHA+CitUaGUgPGNvZGU+bW9kZTwvY29kZT4gc3RyaW5nIGNhbiBhbHNvIGhhdmUgYSAnPGNvZGU+YjwvY29kZT4nIGF0IHRoZSBlbmQsCit3aGljaCBpcyBuZWVkZWQgaW4gc29tZSBzeXN0ZW1zIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUuCitUaGlzIHN0cmluZyBpcyBleGFjdGx5IHdoYXQgaXMgdXNlZCBpbiB0aGUKK3N0YW5kYXJkJm5ic3A7QyBmdW5jdGlvbiA8Y29kZT5mb3BlbjwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8ub3V0cHV0Ij48Y29kZT5pby5vdXRwdXQgKFtmaWxlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTaW1pbGFyIHRvIDxhIGhyZWY9IiNwZGYtaW8uaW5wdXQiPjxjb2RlPmlvLmlucHV0PC9jb2RlPjwvYT4sIGJ1dCBvcGVyYXRlcyBvdmVyIHRoZSBkZWZhdWx0IG91dHB1dCBmaWxlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWlvLnBvcGVuIj48Y29kZT5pby5wb3BlbiAocHJvZyBbLCBtb2RlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTdGFydHMgcHJvZ3JhbSA8Y29kZT5wcm9nPC9jb2RlPiBpbiBhIHNlcGFyYXRlZCBwcm9jZXNzIGFuZCByZXR1cm5zCithIGZpbGUgaGFuZGxlIHRoYXQgeW91IGNhbiB1c2UgdG8gcmVhZCBkYXRhIGZyb20gdGhpcyBwcm9ncmFtCisoaWYgPGNvZGU+bW9kZTwvY29kZT4gaXMgPGNvZGU+InIiPC9jb2RlPiwgdGhlIGRlZmF1bHQpCitvciB0byB3cml0ZSBkYXRhIHRvIHRoaXMgcHJvZ3JhbQorKGlmIDxjb2RlPm1vZGU8L2NvZGU+IGlzIDxjb2RlPiJ3IjwvY29kZT4pLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBpcyBzeXN0ZW0gZGVwZW5kZW50IGFuZCBpcyBub3QgYXZhaWxhYmxlCitvbiBhbGwgcGxhdGZvcm1zLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWlvLnJlYWQiPjxjb2RlPmlvLnJlYWQgKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitFcXVpdmFsZW50IHRvIDxjb2RlPmlvLmlucHV0KCk6cmVhZDwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8udG1wZmlsZSI+PGNvZGU+aW8udG1wZmlsZSAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYSBoYW5kbGUgZm9yIGEgdGVtcG9yYXJ5IGZpbGUuCitUaGlzIGZpbGUgaXMgb3BlbmVkIGluIHVwZGF0ZSBtb2RlCithbmQgaXQgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIHdoZW4gdGhlIHByb2dyYW0gZW5kcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1pby50eXBlIj48Y29kZT5pby50eXBlIChvYmopPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgPGNvZGU+b2JqPC9jb2RlPiBpcyBhIHZhbGlkIGZpbGUgaGFuZGxlLgorUmV0dXJucyB0aGUgc3RyaW5nIDxjb2RlPiJmaWxlIjwvY29kZT4gaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhbiBvcGVuIGZpbGUgaGFuZGxlLAorPGNvZGU+ImNsb3NlZCBmaWxlIjwvY29kZT4gaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhIGNsb3NlZCBmaWxlIGhhbmRsZSwKK29yIDxiPm5pbDwvYj4gaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBub3QgYSBmaWxlIGhhbmRsZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1pby53cml0ZSI+PGNvZGU+aW8ud3JpdGUgKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitFcXVpdmFsZW50IHRvIDxjb2RlPmlvLm91dHB1dCgpOndyaXRlPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1maWxlOmNsb3NlIj48Y29kZT5maWxlOmNsb3NlICgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQ2xvc2VzIDxjb2RlPmZpbGU8L2NvZGU+LgorTm90ZSB0aGF0IGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGNsb3NlZCB3aGVuCit0aGVpciBoYW5kbGVzIGFyZSBnYXJiYWdlIGNvbGxlY3RlZCwKK2J1dCB0aGF0IHRha2VzIGFuIHVucHJlZGljdGFibGUgYW1vdW50IG9mIHRpbWUgdG8gaGFwcGVuLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWZpbGU6Zmx1c2giPjxjb2RlPmZpbGU6Zmx1c2ggKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTYXZlcyBhbnkgd3JpdHRlbiBkYXRhIHRvIDxjb2RlPmZpbGU8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWZpbGU6bGluZXMiPjxjb2RlPmZpbGU6bGluZXMgKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIGFuIGl0ZXJhdG9yIGZ1bmN0aW9uIHRoYXQsCitlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLAorcmV0dXJucyBhIG5ldyBsaW5lIGZyb20gdGhlIGZpbGUuCitUaGVyZWZvcmUsIHRoZSBjb25zdHJ1Y3Rpb24KKworPHByZT4KKyAgICAgZm9yIGxpbmUgaW4gZmlsZTpsaW5lcygpIGRvIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK3dpbGwgaXRlcmF0ZSBvdmVyIGFsbCBsaW5lcyBvZiB0aGUgZmlsZS4KKyhVbmxpa2UgPGEgaHJlZj0iI3BkZi1pby5saW5lcyI+PGNvZGU+aW8ubGluZXM8L2NvZGU+PC9hPiwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjbG9zZSB0aGUgZmlsZQord2hlbiB0aGUgbG9vcCBlbmRzLikKKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1maWxlOnJlYWQiPjxjb2RlPmZpbGU6cmVhZCAoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JlYWRzIHRoZSBmaWxlIDxjb2RlPmZpbGU8L2NvZGU+LAorYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBmb3JtYXRzLCB3aGljaCBzcGVjaWZ5IHdoYXQgdG8gcmVhZC4KK0ZvciBlYWNoIGZvcm1hdCwKK3RoZSBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIChvciBhIG51bWJlcikgd2l0aCB0aGUgY2hhcmFjdGVycyByZWFkLAorb3IgPGI+bmlsPC9iPiBpZiBpdCBjYW5ub3QgcmVhZCBkYXRhIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQuCitXaGVuIGNhbGxlZCB3aXRob3V0IGZvcm1hdHMsCitpdCB1c2VzIGEgZGVmYXVsdCBmb3JtYXQgdGhhdCByZWFkcyB0aGUgZW50aXJlIG5leHQgbGluZQorKHNlZSBiZWxvdykuCisKKworPHA+CitUaGUgYXZhaWxhYmxlIGZvcm1hdHMgYXJlCisKKzx1bD4KKworPGxpPjxiPiIqbiI6PC9iPgorcmVhZHMgYSBudW1iZXI7Cit0aGlzIGlzIHRoZSBvbmx5IGZvcm1hdCB0aGF0IHJldHVybnMgYSBudW1iZXIgaW5zdGVhZCBvZiBhIHN0cmluZy4KKzwvbGk+CisKKzxsaT48Yj4iKmEiOjwvYj4KK3JlYWRzIHRoZSB3aG9sZSBmaWxlLCBzdGFydGluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KK09uIGVuZCBvZiBmaWxlLCBpdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCis8L2xpPgorCis8bGk+PGI+IipsIjo8L2I+CityZWFkcyB0aGUgbmV4dCBsaW5lIChza2lwcGluZyB0aGUgZW5kIG9mIGxpbmUpLAorcmV0dXJuaW5nIDxiPm5pbDwvYj4gb24gZW5kIG9mIGZpbGUuCitUaGlzIGlzIHRoZSBkZWZhdWx0IGZvcm1hdC4KKzwvbGk+CisKKzxsaT48Yj48ZW0+bnVtYmVyPC9lbT46PC9iPgorcmVhZHMgYSBzdHJpbmcgd2l0aCB1cCB0byB0aGlzIG51bWJlciBvZiBjaGFyYWN0ZXJzLAorcmV0dXJuaW5nIDxiPm5pbDwvYj4gb24gZW5kIG9mIGZpbGUuCitJZiBudW1iZXIgaXMgemVybywKK2l0IHJlYWRzIG5vdGhpbmcgYW5kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLAorb3IgPGI+bmlsPC9iPiBvbiBlbmQgb2YgZmlsZS4KKzwvbGk+CisKKzwvdWw+CisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWZpbGU6c2VlayI+PGNvZGU+ZmlsZTpzZWVrIChbd2hlbmNlXSBbLCBvZmZzZXRdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1NldHMgYW5kIGdldHMgdGhlIGZpbGUgcG9zaXRpb24sCittZWFzdXJlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsCit0byB0aGUgcG9zaXRpb24gZ2l2ZW4gYnkgPGNvZGU+b2Zmc2V0PC9jb2RlPiBwbHVzIGEgYmFzZQorc3BlY2lmaWVkIGJ5IHRoZSBzdHJpbmcgPGNvZGU+d2hlbmNlPC9jb2RlPiwgYXMgZm9sbG93czoKKworPHVsPgorPGxpPjxiPiJzZXQiOjwvYj4gYmFzZSBpcyBwb3NpdGlvbiAwIChiZWdpbm5pbmcgb2YgdGhlIGZpbGUpOzwvbGk+Cis8bGk+PGI+ImN1ciI6PC9iPiBiYXNlIGlzIGN1cnJlbnQgcG9zaXRpb247PC9saT4KKzxsaT48Yj4iZW5kIjo8L2I+IGJhc2UgaXMgZW5kIG9mIGZpbGU7PC9saT4KKzwvdWw+PHA+CitJbiBjYXNlIG9mIHN1Y2Nlc3MsIGZ1bmN0aW9uIDxjb2RlPnNlZWs8L2NvZGU+IHJldHVybnMgdGhlIGZpbmFsIGZpbGUgcG9zaXRpb24sCittZWFzdXJlZCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCitJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zIDxiPm5pbDwvYj4sCitwbHVzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorCisKKzxwPgorVGhlIGRlZmF1bHQgdmFsdWUgZm9yIDxjb2RlPndoZW5jZTwvY29kZT4gaXMgPGNvZGU+ImN1ciI8L2NvZGU+LAorYW5kIGZvciA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIDAuCitUaGVyZWZvcmUsIHRoZSBjYWxsIDxjb2RlPmZpbGU6c2VlaygpPC9jb2RlPiByZXR1cm5zIHRoZSBjdXJyZW50CitmaWxlIHBvc2l0aW9uLCB3aXRob3V0IGNoYW5naW5nIGl0OwordGhlIGNhbGwgPGNvZGU+ZmlsZTpzZWVrKCJzZXQiKTwvY29kZT4gc2V0cyB0aGUgcG9zaXRpb24gdG8gdGhlCitiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKGFuZCByZXR1cm5zIDApOworYW5kIHRoZSBjYWxsIDxjb2RlPmZpbGU6c2VlaygiZW5kIik8L2NvZGU+IHNldHMgdGhlIHBvc2l0aW9uIHRvIHRoZQorZW5kIG9mIHRoZSBmaWxlLCBhbmQgcmV0dXJucyBpdHMgc2l6ZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1maWxlOnNldHZidWYiPjxjb2RlPmZpbGU6c2V0dmJ1ZiAobW9kZSBbLCBzaXplXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIHRoZSBidWZmZXJpbmcgbW9kZSBmb3IgYW4gb3V0cHV0IGZpbGUuCitUaGVyZSBhcmUgdGhyZWUgYXZhaWxhYmxlIG1vZGVzOgorCis8dWw+CisKKzxsaT48Yj4ibm8iOjwvYj4KK25vIGJ1ZmZlcmluZzsgdGhlIHJlc3VsdCBvZiBhbnkgb3V0cHV0IG9wZXJhdGlvbiBhcHBlYXJzIGltbWVkaWF0ZWx5LgorPC9saT4KKworPGxpPjxiPiJmdWxsIjo8L2I+CitmdWxsIGJ1ZmZlcmluZzsgb3V0cHV0IG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb25seQord2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgKG9yIHdoZW4geW91IGV4cGxpY2l0bHkgPGNvZGU+Zmx1c2g8L2NvZGU+IHRoZSBmaWxlCisoc2VlIDxhIGhyZWY9IiNwZGYtaW8uZmx1c2giPjxjb2RlPmlvLmZsdXNoPC9jb2RlPjwvYT4pKS4KKzwvbGk+CisKKzxsaT48Yj4ibGluZSI6PC9iPgorbGluZSBidWZmZXJpbmc7IG91dHB1dCBpcyBidWZmZXJlZCB1bnRpbCBhIG5ld2xpbmUgaXMgb3V0cHV0CitvciB0aGVyZSBpcyBhbnkgaW5wdXQgZnJvbSBzb21lIHNwZWNpYWwgZmlsZXMKKyhzdWNoIGFzIGEgdGVybWluYWwgZGV2aWNlKS4KKzwvbGk+CisKKzwvdWw+PHA+CitGb3IgdGhlIGxhc3QgdHdvIGNhc2VzLCA8Y29kZT5zaXplPC9jb2RlPgorc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGluIGJ5dGVzLgorVGhlIGRlZmF1bHQgaXMgYW4gYXBwcm9wcmlhdGUgc2l6ZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1maWxlOndyaXRlIj48Y29kZT5maWxlOndyaXRlICgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorV3JpdGVzIHRoZSB2YWx1ZSBvZiBlYWNoIG9mIGl0cyBhcmd1bWVudHMgdG8KK3RoZSA8Y29kZT5maWxlPC9jb2RlPi4KK1RoZSBhcmd1bWVudHMgbXVzdCBiZSBzdHJpbmdzIG9yIG51bWJlcnMuCitUbyB3cml0ZSBvdGhlciB2YWx1ZXMsCit1c2UgPGEgaHJlZj0iI3BkZi10b3N0cmluZyI+PGNvZGU+dG9zdHJpbmc8L2NvZGU+PC9hPiBvciA8YSBocmVmPSIjcGRmLXN0cmluZy5mb3JtYXQiPjxjb2RlPnN0cmluZy5mb3JtYXQ8L2NvZGU+PC9hPiBiZWZvcmUgPGNvZGU+d3JpdGU8L2NvZGU+LgorCisKKworCisKKworCis8aDI+NS44IC0gPGEgbmFtZT0iNS44Ij5PcGVyYXRpbmcgU3lzdGVtIEZhY2lsaXRpZXM8L2E+PC9oMj4KKworPHA+CitUaGlzIGxpYnJhcnkgaXMgaW1wbGVtZW50ZWQgdGhyb3VnaCB0YWJsZSA8YSBuYW1lPSJwZGYtb3MiPjxjb2RlPm9zPC9jb2RlPjwvYT4uCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1vcy5jbG9jayI+PGNvZGU+b3MuY2xvY2sgKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGFtb3VudCBpbiBzZWNvbmRzIG9mIENQVSB0aW1lCit1c2VkIGJ5IHRoZSBwcm9ncmFtLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLmRhdGUiPjxjb2RlPm9zLmRhdGUgKFtmb3JtYXQgWywgdGltZV1dKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYSBzdHJpbmcgb3IgYSB0YWJsZSBjb250YWluaW5nIGRhdGUgYW5kIHRpbWUsCitmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzdHJpbmcgPGNvZGU+Zm9ybWF0PC9jb2RlPi4KKworCis8cD4KK0lmIHRoZSA8Y29kZT50aW1lPC9jb2RlPiBhcmd1bWVudCBpcyBwcmVzZW50LAordGhpcyBpcyB0aGUgdGltZSB0byBiZSBmb3JtYXR0ZWQKKyhzZWUgdGhlIDxhIGhyZWY9IiNwZGYtb3MudGltZSI+PGNvZGU+b3MudGltZTwvY29kZT48L2E+IGZ1bmN0aW9uIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFsdWUpLgorT3RoZXJ3aXNlLCA8Y29kZT5kYXRlPC9jb2RlPiBmb3JtYXRzIHRoZSBjdXJyZW50IHRpbWUuCisKKworPHA+CitJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IHN0YXJ0cyB3aXRoICc8Y29kZT4hPC9jb2RlPicsCit0aGVuIHRoZSBkYXRlIGlzIGZvcm1hdHRlZCBpbiBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZS4KK0FmdGVyIHRoaXMgb3B0aW9uYWwgY2hhcmFjdGVyLAoraWYgPGNvZGU+Zm9ybWF0PC9jb2RlPiBpcyB0aGUgc3RyaW5nICI8Y29kZT4qdDwvY29kZT4iLAordGhlbiA8Y29kZT5kYXRlPC9jb2RlPiByZXR1cm5zIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKKzxjb2RlPnllYXI8L2NvZGU+IChmb3VyIGRpZ2l0cyksIDxjb2RlPm1vbnRoPC9jb2RlPiAoMS0tMTIpLCA8Y29kZT5kYXk8L2NvZGU+ICgxLS0zMSksCis8Y29kZT5ob3VyPC9jb2RlPiAoMC0tMjMpLCA8Y29kZT5taW48L2NvZGU+ICgwLS01OSksIDxjb2RlPnNlYzwvY29kZT4gKDAtLTYxKSwKKzxjb2RlPndkYXk8L2NvZGU+ICh3ZWVrZGF5LCBTdW5kYXkgaXMmbmJzcDsxKSwKKzxjb2RlPnlkYXk8L2NvZGU+IChkYXkgb2YgdGhlIHllYXIpLAorYW5kIDxjb2RlPmlzZHN0PC9jb2RlPiAoZGF5bGlnaHQgc2F2aW5nIGZsYWcsIGEgYm9vbGVhbikuCisKKworPHA+CitJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIG5vdCAiPGNvZGU+KnQ8L2NvZGU+IiwKK3RoZW4gPGNvZGU+ZGF0ZTwvY29kZT4gcmV0dXJucyB0aGUgZGF0ZSBhcyBhIHN0cmluZywKK2Zvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgcnVsZXMgYXMgdGhlIEMmbmJzcDtmdW5jdGlvbiA8Y29kZT5zdHJmdGltZTwvY29kZT4uCisKKworPHA+CitXaGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywKKzxjb2RlPmRhdGU8L2NvZGU+IHJldHVybnMgYSByZWFzb25hYmxlIGRhdGUgYW5kIHRpbWUgcmVwcmVzZW50YXRpb24gdGhhdCBkZXBlbmRzIG9uCit0aGUgaG9zdCBzeXN0ZW0gYW5kIG9uIHRoZSBjdXJyZW50IGxvY2FsZQorKHRoYXQgaXMsIDxjb2RlPm9zLmRhdGUoKTwvY29kZT4gaXMgZXF1aXZhbGVudCB0byA8Y29kZT5vcy5kYXRlKCIlYyIpPC9jb2RlPikuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MuZGlmZnRpbWUiPjxjb2RlPm9zLmRpZmZ0aW1lICh0MiwgdDEpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSB0aW1lIDxjb2RlPnQxPC9jb2RlPiB0byB0aW1lIDxjb2RlPnQyPC9jb2RlPi4KK0luIFBPU0lYLCBXaW5kb3dzLCBhbmQgc29tZSBvdGhlciBzeXN0ZW1zLAordGhpcyB2YWx1ZSBpcyBleGFjdGx5IDxjb2RlPnQyPC9jb2RlPjxlbT4tPC9lbT48Y29kZT50MTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MuZXhlY3V0ZSI+PGNvZGU+b3MuZXhlY3V0ZSAoW2NvbW1hbmRdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgQyZuYnNwO2Z1bmN0aW9uIDxjb2RlPnN5c3RlbTwvY29kZT4uCitJdCBwYXNzZXMgPGNvZGU+Y29tbWFuZDwvY29kZT4gdG8gYmUgZXhlY3V0ZWQgYnkgYW4gb3BlcmF0aW5nIHN5c3RlbSBzaGVsbC4KK0l0IHJldHVybnMgYSBzdGF0dXMgY29kZSwgd2hpY2ggaXMgc3lzdGVtLWRlcGVuZGVudC4KK0lmIDxjb2RlPmNvbW1hbmQ8L2NvZGU+IGlzIGFic2VudCwgdGhlbiBpdCByZXR1cm5zIG5vbnplcm8gaWYgYSBzaGVsbCBpcyBhdmFpbGFibGUKK2FuZCB6ZXJvIG90aGVyd2lzZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1vcy5leGl0Ij48Y29kZT5vcy5leGl0IChbY29kZV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQ2FsbHMgdGhlIEMmbmJzcDtmdW5jdGlvbiA8Y29kZT5leGl0PC9jb2RlPiwKK3dpdGggYW4gb3B0aW9uYWwgPGNvZGU+Y29kZTwvY29kZT4sCit0byB0ZXJtaW5hdGUgdGhlIGhvc3QgcHJvZ3JhbS4KK1RoZSBkZWZhdWx0IHZhbHVlIGZvciA8Y29kZT5jb2RlPC9jb2RlPiBpcyB0aGUgc3VjY2VzcyBjb2RlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLmdldGVudiI+PGNvZGU+b3MuZ2V0ZW52ICh2YXJuYW1lKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlIDxjb2RlPnZhcm5hbWU8L2NvZGU+LAorb3IgPGI+bmlsPC9iPiBpZiB0aGUgdmFyaWFibGUgaXMgbm90IGRlZmluZWQuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MucmVtb3ZlIj48Y29kZT5vcy5yZW1vdmUgKGZpbGVuYW1lKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0RlbGV0ZXMgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHdpdGggdGhlIGdpdmVuIG5hbWUuCitEaXJlY3RvcmllcyBtdXN0IGJlIGVtcHR5IHRvIGJlIHJlbW92ZWQuCitJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zIDxiPm5pbDwvYj4sCitwbHVzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLnJlbmFtZSI+PGNvZGU+b3MucmVuYW1lIChvbGRuYW1lLCBuZXduYW1lKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JlbmFtZXMgZmlsZSBvciBkaXJlY3RvcnkgbmFtZWQgPGNvZGU+b2xkbmFtZTwvY29kZT4gdG8gPGNvZGU+bmV3bmFtZTwvY29kZT4uCitJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zIDxiPm5pbDwvYj4sCitwbHVzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLnNldGxvY2FsZSI+PGNvZGU+b3Muc2V0bG9jYWxlIChsb2NhbGUgWywgY2F0ZWdvcnldKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1NldHMgdGhlIGN1cnJlbnQgbG9jYWxlIG9mIHRoZSBwcm9ncmFtLgorPGNvZGU+bG9jYWxlPC9jb2RlPiBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIGEgbG9jYWxlOworPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+IGlzIGFuIG9wdGlvbmFsIHN0cmluZyBkZXNjcmliaW5nIHdoaWNoIGNhdGVnb3J5IHRvIGNoYW5nZToKKzxjb2RlPiJhbGwiPC9jb2RlPiwgPGNvZGU+ImNvbGxhdGUiPC9jb2RlPiwgPGNvZGU+ImN0eXBlIjwvY29kZT4sCis8Y29kZT4ibW9uZXRhcnkiPC9jb2RlPiwgPGNvZGU+Im51bWVyaWMiPC9jb2RlPiwgb3IgPGNvZGU+InRpbWUiPC9jb2RlPjsKK3RoZSBkZWZhdWx0IGNhdGVnb3J5IGlzIDxjb2RlPiJhbGwiPC9jb2RlPi4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBuZXcgbG9jYWxlLAorb3IgPGI+bmlsPC9iPiBpZiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgaG9ub3JlZC4KKworCis8cD4KK0lmIDxjb2RlPmxvY2FsZTwvY29kZT4gaXMgdGhlIGVtcHR5IHN0cmluZywKK3RoZSBjdXJyZW50IGxvY2FsZSBpcyBzZXQgdG8gYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBuYXRpdmUgbG9jYWxlLgorSWYgPGNvZGU+bG9jYWxlPC9jb2RlPiBpcyB0aGUgc3RyaW5nICI8Y29kZT5DPC9jb2RlPiIsCit0aGUgY3VycmVudCBsb2NhbGUgaXMgc2V0IHRvIHRoZSBzdGFuZGFyZCBDIGxvY2FsZS4KKworCis8cD4KK1doZW4gY2FsbGVkIHdpdGggPGI+bmlsPC9iPiBhcyB0aGUgZmlyc3QgYXJndW1lbnQsCit0aGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBsb2NhbGUKK2ZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MudGltZSI+PGNvZGU+b3MudGltZSAoW3RhYmxlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgd2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsCitvciBhIHRpbWUgcmVwcmVzZW50aW5nIHRoZSBkYXRlIGFuZCB0aW1lIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gdGFibGUuCitUaGlzIHRhYmxlIG11c3QgaGF2ZSBmaWVsZHMgPGNvZGU+eWVhcjwvY29kZT4sIDxjb2RlPm1vbnRoPC9jb2RlPiwgYW5kIDxjb2RlPmRheTwvY29kZT4sCithbmQgbWF5IGhhdmUgZmllbGRzIDxjb2RlPmhvdXI8L2NvZGU+LCA8Y29kZT5taW48L2NvZGU+LCA8Y29kZT5zZWM8L2NvZGU+LCBhbmQgPGNvZGU+aXNkc3Q8L2NvZGU+CisoZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlc2UgZmllbGRzLCBzZWUgdGhlIDxhIGhyZWY9IiNwZGYtb3MuZGF0ZSI+PGNvZGU+b3MuZGF0ZTwvY29kZT48L2E+IGZ1bmN0aW9uKS4KKworCis8cD4KK1RoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciwgd2hvc2UgbWVhbmluZyBkZXBlbmRzIG9uIHlvdXIgc3lzdGVtLgorSW4gUE9TSVgsIFdpbmRvd3MsIGFuZCBzb21lIG90aGVyIHN5c3RlbXMsIHRoaXMgbnVtYmVyIGNvdW50cyB0aGUgbnVtYmVyCitvZiBzZWNvbmRzIHNpbmNlIHNvbWUgZ2l2ZW4gc3RhcnQgdGltZSAodGhlICJlcG9jaCIpLgorSW4gb3RoZXIgc3lzdGVtcywgdGhlIG1lYW5pbmcgaXMgbm90IHNwZWNpZmllZCwKK2FuZCB0aGUgbnVtYmVyIHJldHVybmVkIGJ5IDxjb2RlPnRpbWU8L2NvZGU+IGNhbiBiZSB1c2VkIG9ubHkgYXMgYW4gYXJndW1lbnQgdG8KKzxjb2RlPmRhdGU8L2NvZGU+IGFuZCA8Y29kZT5kaWZmdGltZTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MudG1wbmFtZSI+PGNvZGU+b3MudG1wbmFtZSAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYSBzdHJpbmcgd2l0aCBhIGZpbGUgbmFtZSB0aGF0IGNhbgorYmUgdXNlZCBmb3IgYSB0ZW1wb3JhcnkgZmlsZS4KK1RoZSBmaWxlIG11c3QgYmUgZXhwbGljaXRseSBvcGVuZWQgYmVmb3JlIGl0cyB1c2UKK2FuZCBleHBsaWNpdGx5IHJlbW92ZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorCisKKzxwPgorT24gc29tZSBzeXN0ZW1zIChQT1NJWCksCit0aGlzIGZ1bmN0aW9uIGFsc28gY3JlYXRlcyBhIGZpbGUgd2l0aCB0aGF0IG5hbWUsCit0byBhdm9pZCBzZWN1cml0eSByaXNrcy4KKyhTb21lb25lIGVsc2UgbWlnaHQgY3JlYXRlIHRoZSBmaWxlIHdpdGggd3JvbmcgcGVybWlzc2lvbnMKK2luIHRoZSB0aW1lIGJldHdlZW4gZ2V0dGluZyB0aGUgbmFtZSBhbmQgY3JlYXRpbmcgdGhlIGZpbGUuKQorWW91IHN0aWxsIGhhdmUgdG8gb3BlbiB0aGUgZmlsZSB0byB1c2UgaXQKK2FuZCB0byByZW1vdmUgaXQgKGV2ZW4gaWYgeW91IGRvIG5vdCB1c2UgaXQpLgorCisKKzxwPgorV2hlbiBwb3NzaWJsZSwKK3lvdSBtYXkgcHJlZmVyIHRvIHVzZSA8YSBocmVmPSIjcGRmLWlvLnRtcGZpbGUiPjxjb2RlPmlvLnRtcGZpbGU8L2NvZGU+PC9hPiwKK3doaWNoIGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyB0aGUgZmlsZSB3aGVuIHRoZSBwcm9ncmFtIGVuZHMuCisKKworCisKKworCisKKzxoMj41LjkgLSA8YSBuYW1lPSI1LjkiPlRoZSBEZWJ1ZyBMaWJyYXJ5PC9hPjwvaDI+CisKKzxwPgorVGhpcyBsaWJyYXJ5IHByb3ZpZGVzCit0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZGVidWcgaW50ZXJmYWNlIHRvIEx1YSBwcm9ncmFtcy4KK1lvdSBzaG91bGQgZXhlcnQgY2FyZSB3aGVuIHVzaW5nIHRoaXMgbGlicmFyeS4KK1RoZSBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSBzaG91bGQgYmUgdXNlZCBleGNsdXNpdmVseSBmb3IgZGVidWdnaW5nCithbmQgc2ltaWxhciB0YXNrcywgc3VjaCBhcyBwcm9maWxpbmcuCitQbGVhc2UgcmVzaXN0IHRoZSB0ZW1wdGF0aW9uIHRvIHVzZSB0aGVtIGFzIGEKK3VzdWFsIHByb2dyYW1taW5nIHRvb2w6Cit0aGV5IGNhbiBiZSB2ZXJ5IHNsb3cuCitNb3Jlb3Zlciwgc2V2ZXJhbCBvZiB0aGVzZSBmdW5jdGlvbnMKK3Zpb2xhdGUgc29tZSBhc3N1bXB0aW9ucyBhYm91dCBMdWEgY29kZQorKGUuZy4sIHRoYXQgdmFyaWFibGVzIGxvY2FsIHRvIGEgZnVuY3Rpb24KK2Nhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIG91dHNpZGUgb3IKK3RoYXQgdXNlcmRhdGEgbWV0YXRhYmxlcyBjYW5ub3QgYmUgY2hhbmdlZCBieSBMdWEgY29kZSkKK2FuZCB0aGVyZWZvcmUgY2FuIGNvbXByb21pc2Ugb3RoZXJ3aXNlIHNlY3VyZSBjb2RlLgorCisKKzxwPgorQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGxpYnJhcnkgYXJlIHByb3ZpZGVkCitpbnNpZGUgdGhlIDxhIG5hbWU9InBkZi1kZWJ1ZyI+PGNvZGU+ZGVidWc8L2NvZGU+PC9hPiB0YWJsZS4KK0FsbCBmdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG92ZXIgYSB0aHJlYWQKK2hhdmUgYW4gb3B0aW9uYWwgZmlyc3QgYXJndW1lbnQgd2hpY2ggaXMgdGhlCit0aHJlYWQgdG8gb3BlcmF0ZSBvdmVyLgorVGhlIGRlZmF1bHQgaXMgYWx3YXlzIHRoZSBjdXJyZW50IHRocmVhZC4KKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLmRlYnVnIj48Y29kZT5kZWJ1Zy5kZWJ1ZyAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0VudGVycyBhbiBpbnRlcmFjdGl2ZSBtb2RlIHdpdGggdGhlIHVzZXIsCitydW5uaW5nIGVhY2ggc3RyaW5nIHRoYXQgdGhlIHVzZXIgZW50ZXJzLgorVXNpbmcgc2ltcGxlIGNvbW1hbmRzIGFuZCBvdGhlciBkZWJ1ZyBmYWNpbGl0aWVzLAordGhlIHVzZXIgY2FuIGluc3BlY3QgZ2xvYmFsIGFuZCBsb2NhbCB2YXJpYWJsZXMsCitjaGFuZ2UgdGhlaXIgdmFsdWVzLCBldmFsdWF0ZSBleHByZXNzaW9ucywgYW5kIHNvIG9uLgorQSBsaW5lIGNvbnRhaW5pbmcgb25seSB0aGUgd29yZCA8Y29kZT5jb250PC9jb2RlPiBmaW5pc2hlcyB0aGlzIGZ1bmN0aW9uLAorc28gdGhhdCB0aGUgY2FsbGVyIGNvbnRpbnVlcyBpdHMgZXhlY3V0aW9uLgorCisKKzxwPgorTm90ZSB0aGF0IGNvbW1hbmRzIGZvciA8Y29kZT5kZWJ1Zy5kZWJ1ZzwvY29kZT4gYXJlIG5vdCBsZXhpY2FsbHkgbmVzdGVkCit3aXRoaW4gYW55IGZ1bmN0aW9uLCBhbmQgc28gaGF2ZSBubyBkaXJlY3QgYWNjZXNzIHRvIGxvY2FsIHZhcmlhYmxlcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5nZXRmZW52Ij48Y29kZT5kZWJ1Zy5nZXRmZW52IChvKTwvY29kZT48L2E+PC9oMz4KK1JldHVybnMgdGhlIGVudmlyb25tZW50IG9mIG9iamVjdCA8Y29kZT5vPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5nZXRob29rIj48Y29kZT5kZWJ1Zy5nZXRob29rIChbdGhyZWFkXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBjdXJyZW50IGhvb2sgc2V0dGluZ3Mgb2YgdGhlIHRocmVhZCwgYXMgdGhyZWUgdmFsdWVzOgordGhlIGN1cnJlbnQgaG9vayBmdW5jdGlvbiwgdGhlIGN1cnJlbnQgaG9vayBtYXNrLAorYW5kIHRoZSBjdXJyZW50IGhvb2sgY291bnQKKyhhcyBzZXQgYnkgdGhlIDxhIGhyZWY9IiNwZGYtZGVidWcuc2V0aG9vayI+PGNvZGU+ZGVidWcuc2V0aG9vazwvY29kZT48L2E+IGZ1bmN0aW9uKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5nZXRpbmZvIj48Y29kZT5kZWJ1Zy5nZXRpbmZvIChbdGhyZWFkLF0gZnVuY3Rpb24gWywgd2hhdF0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyBhIHRhYmxlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbi4KK1lvdSBjYW4gZ2l2ZSB0aGUgZnVuY3Rpb24gZGlyZWN0bHksCitvciB5b3UgY2FuIGdpdmUgYSBudW1iZXIgYXMgdGhlIHZhbHVlIG9mIDxjb2RlPmZ1bmN0aW9uPC9jb2RlPiwKK3doaWNoIG1lYW5zIHRoZSBmdW5jdGlvbiBydW5uaW5nIGF0IGxldmVsIDxjb2RlPmZ1bmN0aW9uPC9jb2RlPiBvZiB0aGUgY2FsbCBzdGFjaworb2YgdGhlIGdpdmVuIHRocmVhZDoKK2xldmVsJm5ic3A7MCBpcyB0aGUgY3VycmVudCBmdW5jdGlvbiAoPGNvZGU+Z2V0aW5mbzwvY29kZT4gaXRzZWxmKTsKK2xldmVsJm5ic3A7MSBpcyB0aGUgZnVuY3Rpb24gdGhhdCBjYWxsZWQgPGNvZGU+Z2V0aW5mbzwvY29kZT47CithbmQgc28gb24uCitJZiA8Y29kZT5mdW5jdGlvbjwvY29kZT4gaXMgYSBudW1iZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBhY3RpdmUgZnVuY3Rpb25zLAordGhlbiA8Y29kZT5nZXRpbmZvPC9jb2RlPiByZXR1cm5zIDxiPm5pbDwvYj4uCisKKworPHA+CitUaGUgcmV0dXJuZWQgdGFibGUgY2FuIGNvbnRhaW4gYWxsIHRoZSBmaWVsZHMgcmV0dXJuZWQgYnkgPGEgaHJlZj0iI2x1YV9nZXRpbmZvIj48Y29kZT5sdWFfZ2V0aW5mbzwvY29kZT48L2E+LAord2l0aCB0aGUgc3RyaW5nIDxjb2RlPndoYXQ8L2NvZGU+IGRlc2NyaWJpbmcgd2hpY2ggZmllbGRzIHRvIGZpbGwgaW4uCitUaGUgZGVmYXVsdCBmb3IgPGNvZGU+d2hhdDwvY29kZT4gaXMgdG8gZ2V0IGFsbCBpbmZvcm1hdGlvbiBhdmFpbGFibGUsCitleGNlcHQgdGhlIHRhYmxlIG9mIHZhbGlkIGxpbmVzLgorSWYgcHJlc2VudCwKK3RoZSBvcHRpb24gJzxjb2RlPmY8L2NvZGU+JworYWRkcyBhIGZpZWxkIG5hbWVkIDxjb2RlPmZ1bmM8L2NvZGU+IHdpdGggdGhlIGZ1bmN0aW9uIGl0c2VsZi4KK0lmIHByZXNlbnQsCit0aGUgb3B0aW9uICc8Y29kZT5MPC9jb2RlPicKK2FkZHMgYSBmaWVsZCBuYW1lZCA8Y29kZT5hY3RpdmVsaW5lczwvY29kZT4gd2l0aCB0aGUgdGFibGUgb2YKK3ZhbGlkIGxpbmVzLgorCisKKzxwPgorRm9yIGluc3RhbmNlLCB0aGUgZXhwcmVzc2lvbiA8Y29kZT5kZWJ1Zy5nZXRpbmZvKDEsIm4iKS5uYW1lPC9jb2RlPiByZXR1cm5zCithIHRhYmxlIHdpdGggYSBuYW1lIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbiwKK2lmIGEgcmVhc29uYWJsZSBuYW1lIGNhbiBiZSBmb3VuZCwKK2FuZCB0aGUgZXhwcmVzc2lvbiA8Y29kZT5kZWJ1Zy5nZXRpbmZvKHByaW50KTwvY29kZT4KK3JldHVybnMgYSB0YWJsZSB3aXRoIGFsbCBhdmFpbGFibGUgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSA8YSBocmVmPSIjcGRmLXByaW50Ij48Y29kZT5wcmludDwvY29kZT48L2E+IGZ1bmN0aW9uLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLmdldGxvY2FsIj48Y29kZT5kZWJ1Zy5nZXRsb2NhbCAoW3RocmVhZCxdIGxldmVsLCBsb2NhbCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUKK3dpdGggaW5kZXggPGNvZGU+bG9jYWw8L2NvZGU+IG9mIHRoZSBmdW5jdGlvbiBhdCBsZXZlbCA8Y29kZT5sZXZlbDwvY29kZT4gb2YgdGhlIHN0YWNrLgorKFRoZSBmaXJzdCBwYXJhbWV0ZXIgb3IgbG9jYWwgdmFyaWFibGUgaGFzIGluZGV4Jm5ic3A7MSwgYW5kIHNvIG9uLAordW50aWwgdGhlIGxhc3QgYWN0aXZlIGxvY2FsIHZhcmlhYmxlLikKK1RoZSBmdW5jdGlvbiByZXR1cm5zIDxiPm5pbDwvYj4gaWYgdGhlcmUgaXMgbm8gbG9jYWwKK3ZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIGluZGV4LAorYW5kIHJhaXNlcyBhbiBlcnJvciB3aGVuIGNhbGxlZCB3aXRoIGEgPGNvZGU+bGV2ZWw8L2NvZGU+IG91dCBvZiByYW5nZS4KKyhZb3UgY2FuIGNhbGwgPGEgaHJlZj0iI3BkZi1kZWJ1Zy5nZXRpbmZvIj48Y29kZT5kZWJ1Zy5nZXRpbmZvPC9jb2RlPjwvYT4gdG8gY2hlY2sgd2hldGhlciB0aGUgbGV2ZWwgaXMgdmFsaWQuKQorCisKKzxwPgorVmFyaWFibGUgbmFtZXMgc3RhcnRpbmcgd2l0aCAnPGNvZGU+KDwvY29kZT4nIChvcGVuIHBhcmVudGhlc2VzKQorcmVwcmVzZW50IGludGVybmFsIHZhcmlhYmxlcworKGxvb3AgY29udHJvbCB2YXJpYWJsZXMsIHRlbXBvcmFyaWVzLCBhbmQgQyZuYnNwO2Z1bmN0aW9uIGxvY2FscykuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcuZ2V0bWV0YXRhYmxlIj48Y29kZT5kZWJ1Zy5nZXRtZXRhdGFibGUgKG9iamVjdCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBtZXRhdGFibGUgb2YgdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4KK29yIDxiPm5pbDwvYj4gaWYgaXQgZG9lcyBub3QgaGF2ZSBhIG1ldGF0YWJsZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5nZXRyZWdpc3RyeSI+PGNvZGU+ZGVidWcuZ2V0cmVnaXN0cnkgKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSByZWdpc3RyeSB0YWJsZSAoc2VlIDxhIGhyZWY9IiMzLjUiPiZzZWN0OzMuNTwvYT4pLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLmdldHVwdmFsdWUiPjxjb2RlPmRlYnVnLmdldHVwdmFsdWUgKGZ1bmMsIHVwKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZSBhbmQgdGhlIHZhbHVlIG9mIHRoZSB1cHZhbHVlCit3aXRoIGluZGV4IDxjb2RlPnVwPC9jb2RlPiBvZiB0aGUgZnVuY3Rpb24gPGNvZGU+ZnVuYzwvY29kZT4uCitUaGUgZnVuY3Rpb24gcmV0dXJucyA8Yj5uaWw8L2I+IGlmIHRoZXJlIGlzIG5vIHVwdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcuc2V0ZmVudiI+PGNvZGU+ZGVidWcuc2V0ZmVudiAob2JqZWN0LCB0YWJsZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPiB0byB0aGUgZ2l2ZW4gPGNvZGU+dGFibGU8L2NvZGU+LgorUmV0dXJucyA8Y29kZT5vYmplY3Q8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLnNldGhvb2siPjxjb2RlPmRlYnVnLnNldGhvb2sgKFt0aHJlYWQsXSBob29rLCBtYXNrIFssIGNvdW50XSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhIGhvb2suCitUaGUgc3RyaW5nIDxjb2RlPm1hc2s8L2NvZGU+IGFuZCB0aGUgbnVtYmVyIDxjb2RlPmNvdW50PC9jb2RlPiBkZXNjcmliZQord2hlbiB0aGUgaG9vayB3aWxsIGJlIGNhbGxlZC4KK1RoZSBzdHJpbmcgbWFzayBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMsCit3aXRoIHRoZSBnaXZlbiBtZWFuaW5nOgorCis8dWw+Cis8bGk+PGI+PGNvZGU+ImMiPC9jb2RlPjo8L2I+IHRoZSBob29rIGlzIGNhbGxlZCBldmVyeSB0aW1lIEx1YSBjYWxscyBhIGZ1bmN0aW9uOzwvbGk+Cis8bGk+PGI+PGNvZGU+InIiPC9jb2RlPjo8L2I+IHRoZSBob29rIGlzIGNhbGxlZCBldmVyeSB0aW1lIEx1YSByZXR1cm5zIGZyb20gYSBmdW5jdGlvbjs8L2xpPgorPGxpPjxiPjxjb2RlPiJsIjwvY29kZT46PC9iPiB0aGUgaG9vayBpcyBjYWxsZWQgZXZlcnkgdGltZSBMdWEgZW50ZXJzIGEgbmV3IGxpbmUgb2YgY29kZS48L2xpPgorPC91bD48cD4KK1dpdGggYSA8Y29kZT5jb3VudDwvY29kZT4gZGlmZmVyZW50IGZyb20gemVybywKK3RoZSBob29rIGlzIGNhbGxlZCBhZnRlciBldmVyeSA8Y29kZT5jb3VudDwvY29kZT4gaW5zdHJ1Y3Rpb25zLgorCisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsCis8YSBocmVmPSIjcGRmLWRlYnVnLnNldGhvb2siPjxjb2RlPmRlYnVnLnNldGhvb2s8L2NvZGU+PC9hPiB0dXJucyBvZmYgdGhlIGhvb2suCisKKworPHA+CitXaGVuIHRoZSBob29rIGlzIGNhbGxlZCwgaXRzIGZpcnN0IHBhcmFtZXRlciBpcyBhIHN0cmluZworZGVzY3JpYmluZyB0aGUgZXZlbnQgdGhhdCBoYXMgdHJpZ2dlcmVkIGl0cyBjYWxsOgorPGNvZGU+ImNhbGwiPC9jb2RlPiwgPGNvZGU+InJldHVybiI8L2NvZGU+IChvciA8Y29kZT4idGFpbCByZXR1cm4iPC9jb2RlPiwKK3doZW4gc2ltdWxhdGluZyBhIHJldHVybiBmcm9tIGEgdGFpbCBjYWxsKSwKKzxjb2RlPiJsaW5lIjwvY29kZT4sIGFuZCA8Y29kZT4iY291bnQiPC9jb2RlPi4KK0ZvciBsaW5lIGV2ZW50cywKK3RoZSBob29rIGFsc28gZ2V0cyB0aGUgbmV3IGxpbmUgbnVtYmVyIGFzIGl0cyBzZWNvbmQgcGFyYW1ldGVyLgorSW5zaWRlIGEgaG9vaywKK3lvdSBjYW4gY2FsbCA8Y29kZT5nZXRpbmZvPC9jb2RlPiB3aXRoIGxldmVsJm5ic3A7MiB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAordGhlIHJ1bm5pbmcgZnVuY3Rpb24KKyhsZXZlbCZuYnNwOzAgaXMgdGhlIDxjb2RlPmdldGluZm88L2NvZGU+IGZ1bmN0aW9uLAorYW5kIGxldmVsJm5ic3A7MSBpcyB0aGUgaG9vayBmdW5jdGlvbiksCit1bmxlc3MgdGhlIGV2ZW50IGlzIDxjb2RlPiJ0YWlsIHJldHVybiI8L2NvZGU+LgorSW4gdGhpcyBjYXNlLCBMdWEgaXMgb25seSBzaW11bGF0aW5nIHRoZSByZXR1cm4sCithbmQgYSBjYWxsIHRvIDxjb2RlPmdldGluZm88L2NvZGU+IHdpbGwgcmV0dXJuIGludmFsaWQgZGF0YS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5zZXRsb2NhbCI+PGNvZGU+ZGVidWcuc2V0bG9jYWwgKFt0aHJlYWQsXSBsZXZlbCwgbG9jYWwsIHZhbHVlKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gYXNzaWducyB0aGUgdmFsdWUgPGNvZGU+dmFsdWU8L2NvZGU+IHRvIHRoZSBsb2NhbCB2YXJpYWJsZQord2l0aCBpbmRleCA8Y29kZT5sb2NhbDwvY29kZT4gb2YgdGhlIGZ1bmN0aW9uIGF0IGxldmVsIDxjb2RlPmxldmVsPC9jb2RlPiBvZiB0aGUgc3RhY2suCitUaGUgZnVuY3Rpb24gcmV0dXJucyA8Yj5uaWw8L2I+IGlmIHRoZXJlIGlzIG5vIGxvY2FsCit2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBpbmRleCwKK2FuZCByYWlzZXMgYW4gZXJyb3Igd2hlbiBjYWxsZWQgd2l0aCBhIDxjb2RlPmxldmVsPC9jb2RlPiBvdXQgb2YgcmFuZ2UuCisoWW91IGNhbiBjYWxsIDxjb2RlPmdldGluZm88L2NvZGU+IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGxldmVsIGlzIHZhbGlkLikKK090aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcuc2V0bWV0YXRhYmxlIj48Y29kZT5kZWJ1Zy5zZXRtZXRhdGFibGUgKG9iamVjdCwgdGFibGUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorU2V0cyB0aGUgbWV0YXRhYmxlIGZvciB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPiB0byB0aGUgZ2l2ZW4gPGNvZGU+dGFibGU8L2NvZGU+Cisod2hpY2ggY2FuIGJlIDxiPm5pbDwvYj4pLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLnNldHVwdmFsdWUiPjxjb2RlPmRlYnVnLnNldHVwdmFsdWUgKGZ1bmMsIHVwLCB2YWx1ZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgdGhlIHZhbHVlIDxjb2RlPnZhbHVlPC9jb2RlPiB0byB0aGUgdXB2YWx1ZQord2l0aCBpbmRleCA8Y29kZT51cDwvY29kZT4gb2YgdGhlIGZ1bmN0aW9uIDxjb2RlPmZ1bmM8L2NvZGU+LgorVGhlIGZ1bmN0aW9uIHJldHVybnMgPGI+bmlsPC9iPiBpZiB0aGVyZSBpcyBubyB1cHZhbHVlCit3aXRoIHRoZSBnaXZlbiBpbmRleC4KK090aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdXB2YWx1ZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy50cmFjZWJhY2siPjxjb2RlPmRlYnVnLnRyYWNlYmFjayAoW3RocmVhZCxdIFttZXNzYWdlXSBbLCBsZXZlbF0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyBhIHN0cmluZyB3aXRoIGEgdHJhY2ViYWNrIG9mIHRoZSBjYWxsIHN0YWNrLgorQW4gb3B0aW9uYWwgPGNvZGU+bWVzc2FnZTwvY29kZT4gc3RyaW5nIGlzIGFwcGVuZGVkCithdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFjZWJhY2suCitBbiBvcHRpb25hbCA8Y29kZT5sZXZlbDwvY29kZT4gbnVtYmVyIHRlbGxzIGF0IHdoaWNoIGxldmVsCit0byBzdGFydCB0aGUgdHJhY2ViYWNrCisoZGVmYXVsdCBpcyAxLCB0aGUgZnVuY3Rpb24gY2FsbGluZyA8Y29kZT50cmFjZWJhY2s8L2NvZGU+KS4KKworCisKKworCisKKworPGgxPjYgLSA8YSBuYW1lPSI2Ij5MdWEgU3RhbmQtYWxvbmU8L2E+PC9oMT4KKworPHA+CitBbHRob3VnaCBMdWEgaGFzIGJlZW4gZGVzaWduZWQgYXMgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlLAordG8gYmUgZW1iZWRkZWQgaW4gYSBob3N0IEMmbmJzcDtwcm9ncmFtLAoraXQgaXMgYWxzbyBmcmVxdWVudGx5IHVzZWQgYXMgYSBzdGFuZC1hbG9uZSBsYW5ndWFnZS4KK0FuIGludGVycHJldGVyIGZvciBMdWEgYXMgYSBzdGFuZC1hbG9uZSBsYW5ndWFnZSwKK2NhbGxlZCBzaW1wbHkgPGNvZGU+bHVhPC9jb2RlPiwKK2lzIHByb3ZpZGVkIHdpdGggdGhlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4KK1RoZSBzdGFuZC1hbG9uZSBpbnRlcnByZXRlciBpbmNsdWRlcworYWxsIHN0YW5kYXJkIGxpYnJhcmllcywgaW5jbHVkaW5nIHRoZSBkZWJ1ZyBsaWJyYXJ5LgorSXRzIHVzYWdlIGlzOgorCis8cHJlPgorICAgICBsdWEgW29wdGlvbnNdIFtzY3JpcHQgW2FyZ3NdXQorPC9wcmU+PHA+CitUaGUgb3B0aW9ucyBhcmU6CisKKzx1bD4KKzxsaT48Yj48Y29kZT4tZSA8ZW0+c3RhdDwvZW0+PC9jb2RlPjo8L2I+IGV4ZWN1dGVzIHN0cmluZyA8ZW0+c3RhdDwvZW0+OzwvbGk+Cis8bGk+PGI+PGNvZGU+LWwgPGVtPm1vZDwvZW0+PC9jb2RlPjo8L2I+ICJyZXF1aXJlcyIgPGVtPm1vZDwvZW0+OzwvbGk+Cis8bGk+PGI+PGNvZGU+LWk8L2NvZGU+OjwvYj4gZW50ZXJzIGludGVyYWN0aXZlIG1vZGUgYWZ0ZXIgcnVubmluZyA8ZW0+c2NyaXB0PC9lbT47PC9saT4KKzxsaT48Yj48Y29kZT4tdjwvY29kZT46PC9iPiBwcmludHMgdmVyc2lvbiBpbmZvcm1hdGlvbjs8L2xpPgorPGxpPjxiPjxjb2RlPi0tPC9jb2RlPjo8L2I+IHN0b3BzIGhhbmRsaW5nIG9wdGlvbnM7PC9saT4KKzxsaT48Yj48Y29kZT4tPC9jb2RlPjo8L2I+IGV4ZWN1dGVzIDxjb2RlPnN0ZGluPC9jb2RlPiBhcyBhIGZpbGUgYW5kIHN0b3BzIGhhbmRsaW5nIG9wdGlvbnMuPC9saT4KKzwvdWw+PHA+CitBZnRlciBoYW5kbGluZyBpdHMgb3B0aW9ucywgPGNvZGU+bHVhPC9jb2RlPiBydW5zIHRoZSBnaXZlbiA8ZW0+c2NyaXB0PC9lbT4sCitwYXNzaW5nIHRvIGl0IHRoZSBnaXZlbiA8ZW0+YXJnczwvZW0+IGFzIHN0cmluZyBhcmd1bWVudHMuCitXaGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywKKzxjb2RlPmx1YTwvY29kZT4gYmVoYXZlcyBhcyA8Y29kZT5sdWEgLXYgLWk8L2NvZGU+Cit3aGVuIHRoZSBzdGFuZGFyZCBpbnB1dCAoPGNvZGU+c3RkaW48L2NvZGU+KSBpcyBhIHRlcm1pbmFsLAorYW5kIGFzIDxjb2RlPmx1YSAtPC9jb2RlPiBvdGhlcndpc2UuCisKKworPHA+CitCZWZvcmUgcnVubmluZyBhbnkgYXJndW1lbnQsCit0aGUgaW50ZXJwcmV0ZXIgY2hlY2tzIGZvciBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSA8YSBuYW1lPSJwZGYtTFVBX0lOSVQiPjxjb2RlPkxVQV9JTklUPC9jb2RlPjwvYT4uCitJZiBpdHMgZm9ybWF0IGlzIDxjb2RlPkA8ZW0+ZmlsZW5hbWU8L2VtPjwvY29kZT4sCit0aGVuIDxjb2RlPmx1YTwvY29kZT4gZXhlY3V0ZXMgdGhlIGZpbGUuCitPdGhlcndpc2UsIDxjb2RlPmx1YTwvY29kZT4gZXhlY3V0ZXMgdGhlIHN0cmluZyBpdHNlbGYuCisKKworPHA+CitBbGwgb3B0aW9ucyBhcmUgaGFuZGxlZCBpbiBvcmRlciwgZXhjZXB0IDxjb2RlPi1pPC9jb2RlPi4KK0ZvciBpbnN0YW5jZSwgYW4gaW52b2NhdGlvbiBsaWtlCisKKzxwcmU+CisgICAgICQgbHVhIC1lJ2E9MScgLWUgJ3ByaW50KGEpJyBzY3JpcHQubHVhCis8L3ByZT48cD4KK3dpbGwgZmlyc3Qgc2V0IDxjb2RlPmE8L2NvZGU+IHRvIDEsIHRoZW4gcHJpbnQgdGhlIHZhbHVlIG9mIDxjb2RlPmE8L2NvZGU+ICh3aGljaCBpcyAnPGNvZGU+MTwvY29kZT4nKSwKK2FuZCBmaW5hbGx5IHJ1biB0aGUgZmlsZSA8Y29kZT5zY3JpcHQubHVhPC9jb2RlPiB3aXRoIG5vIGFyZ3VtZW50cy4KKyhIZXJlIDxjb2RlPiQ8L2NvZGU+IGlzIHRoZSBzaGVsbCBwcm9tcHQuIFlvdXIgcHJvbXB0IG1heSBiZSBkaWZmZXJlbnQuKQorCisKKzxwPgorQmVmb3JlIHN0YXJ0aW5nIHRvIHJ1biB0aGUgc2NyaXB0LAorPGNvZGU+bHVhPC9jb2RlPiBjb2xsZWN0cyBhbGwgYXJndW1lbnRzIGluIHRoZSBjb21tYW5kIGxpbmUKK2luIGEgZ2xvYmFsIHRhYmxlIGNhbGxlZCA8Y29kZT5hcmc8L2NvZGU+LgorVGhlIHNjcmlwdCBuYW1lIGlzIHN0b3JlZCBhdCBpbmRleCAwLAordGhlIGZpcnN0IGFyZ3VtZW50IGFmdGVyIHRoZSBzY3JpcHQgbmFtZSBnb2VzIHRvIGluZGV4IDEsCithbmQgc28gb24uCitBbnkgYXJndW1lbnRzIGJlZm9yZSB0aGUgc2NyaXB0IG5hbWUKKyh0aGF0IGlzLCB0aGUgaW50ZXJwcmV0ZXIgbmFtZSBwbHVzIHRoZSBvcHRpb25zKQorZ28gdG8gbmVnYXRpdmUgaW5kaWNlcy4KK0ZvciBpbnN0YW5jZSwgaW4gdGhlIGNhbGwKKworPHByZT4KKyAgICAgJCBsdWEgLWxhIGIubHVhIHQxIHQyCis8L3ByZT48cD4KK3RoZSBpbnRlcnByZXRlciBmaXJzdCBydW5zIHRoZSBmaWxlIDxjb2RlPmEubHVhPC9jb2RlPiwKK3RoZW4gY3JlYXRlcyBhIHRhYmxlCisKKzxwcmU+CisgICAgIGFyZyA9IHsgWy0yXSA9ICJsdWEiLCBbLTFdID0gIi1sYSIsCisgICAgICAgICAgICAgWzBdID0gImIubHVhIiwKKyAgICAgICAgICAgICBbMV0gPSAidDEiLCBbMl0gPSAidDIiIH0KKzwvcHJlPjxwPgorYW5kIGZpbmFsbHkgcnVucyB0aGUgZmlsZSA8Y29kZT5iLmx1YTwvY29kZT4uCitUaGUgc2NyaXB0IGlzIGNhbGxlZCB3aXRoIDxjb2RlPmFyZ1sxXTwvY29kZT4sIDxjb2RlPmFyZ1syXTwvY29kZT4sICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OworYXMgYXJndW1lbnRzOworaXQgY2FuIGFsc28gYWNjZXNzIHRoZXNlIGFyZ3VtZW50cyB3aXRoIHRoZSB2YXJhcmcgZXhwcmVzc2lvbiAnPGNvZGU+Li4uPC9jb2RlPicuCisKKworPHA+CitJbiBpbnRlcmFjdGl2ZSBtb2RlLAoraWYgeW91IHdyaXRlIGFuIGluY29tcGxldGUgc3RhdGVtZW50LAordGhlIGludGVycHJldGVyIHdhaXRzIGZvciBpdHMgY29tcGxldGlvbgorYnkgaXNzdWluZyBhIGRpZmZlcmVudCBwcm9tcHQuCisKKworPHA+CitJZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIDxhIG5hbWU9InBkZi1fUFJPTVBUIj48Y29kZT5fUFJPTVBUPC9jb2RlPjwvYT4gY29udGFpbnMgYSBzdHJpbmcsCit0aGVuIGl0cyB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBwcm9tcHQuCitTaW1pbGFybHksIGlmIHRoZSBnbG9iYWwgdmFyaWFibGUgPGEgbmFtZT0icGRmLV9QUk9NUFQyIj48Y29kZT5fUFJPTVBUMjwvY29kZT48L2E+IGNvbnRhaW5zIGEgc3RyaW5nLAoraXRzIHZhbHVlIGlzIHVzZWQgYXMgdGhlIHNlY29uZGFyeSBwcm9tcHQKKyhpc3N1ZWQgZHVyaW5nIGluY29tcGxldGUgc3RhdGVtZW50cykuCitUaGVyZWZvcmUsIGJvdGggcHJvbXB0cyBjYW4gYmUgY2hhbmdlZCBkaXJlY3RseSBvbiB0aGUgY29tbWFuZCBsaW5lCitvciBpbiBhbnkgTHVhIHByb2dyYW1zIGJ5IGFzc2lnbmluZyB0byA8Y29kZT5fUFJPTVBUPC9jb2RlPi4KK1NlZSB0aGUgbmV4dCBleGFtcGxlOgorCis8cHJlPgorICAgICAkIGx1YSAtZSJfUFJPTVBUPSdteXByb21wdCZndDsgJyIgLWkKKzwvcHJlPjxwPgorKFRoZSBvdXRlciBwYWlyIG9mIHF1b3RlcyBpcyBmb3IgdGhlIHNoZWxsLAordGhlIGlubmVyIHBhaXIgaXMgZm9yIEx1YS4pCitOb3RlIHRoZSB1c2Ugb2YgPGNvZGU+LWk8L2NvZGU+IHRvIGVudGVyIGludGVyYWN0aXZlIG1vZGU7CitvdGhlcndpc2UsCit0aGUgcHJvZ3JhbSB3b3VsZCBqdXN0IGVuZCBzaWxlbnRseQorcmlnaHQgYWZ0ZXIgdGhlIGFzc2lnbm1lbnQgdG8gPGNvZGU+X1BST01QVDwvY29kZT4uCisKKworPHA+CitUbyBhbGxvdyB0aGUgdXNlIG9mIEx1YSBhcyBhCitzY3JpcHQgaW50ZXJwcmV0ZXIgaW4gVW5peCBzeXN0ZW1zLAordGhlIHN0YW5kLWFsb25lIGludGVycHJldGVyIHNraXBzCit0aGUgZmlyc3QgbGluZSBvZiBhIGNodW5rIGlmIGl0IHN0YXJ0cyB3aXRoIDxjb2RlPiM8L2NvZGU+LgorVGhlcmVmb3JlLCBMdWEgc2NyaXB0cyBjYW4gYmUgbWFkZSBpbnRvIGV4ZWN1dGFibGUgcHJvZ3JhbXMKK2J5IHVzaW5nIDxjb2RlPmNobW9kICt4PC9jb2RlPiBhbmQgdGhlJm5ic3A7PGNvZGU+IyE8L2NvZGU+IGZvcm0sCithcyBpbgorCis8cHJlPgorICAgICAjIS91c3IvbG9jYWwvYmluL2x1YQorPC9wcmU+PHA+CisoT2YgY291cnNlLAordGhlIGxvY2F0aW9uIG9mIHRoZSBMdWEgaW50ZXJwcmV0ZXIgbWF5IGJlIGRpZmZlcmVudCBpbiB5b3VyIG1hY2hpbmUuCitJZiA8Y29kZT5sdWE8L2NvZGU+IGlzIGluIHlvdXIgPGNvZGU+UEFUSDwvY29kZT4sCit0aGVuIAorCis8cHJlPgorICAgICAjIS91c3IvYmluL2VudiBsdWEKKzwvcHJlPjxwPgoraXMgYSBtb3JlIHBvcnRhYmxlIHNvbHV0aW9uLikgCisKKworCis8aDE+NyAtIDxhIG5hbWU9IjciPkluY29tcGF0aWJpbGl0aWVzIHdpdGggdGhlIFByZXZpb3VzIFZlcnNpb248L2E+PC9oMT4KKworPHA+CitIZXJlIHdlIGxpc3QgdGhlIGluY29tcGF0aWJpbGl0aWVzIHRoYXQgeW91IG1heSBmaW5kIHdoZW4gbW92aW5nIGEgcHJvZ3JhbQorZnJvbSBMdWEmbmJzcDs1LjAgdG8gTHVhJm5ic3A7NS4xLgorWW91IGNhbiBhdm9pZCBtb3N0IG9mIHRoZSBpbmNvbXBhdGliaWxpdGllcyBjb21waWxpbmcgTHVhIHdpdGgKK2FwcHJvcHJpYXRlIG9wdGlvbnMgKHNlZSBmaWxlIDxjb2RlPmx1YWNvbmYuaDwvY29kZT4pLgorSG93ZXZlciwKK2FsbCB0aGVzZSBjb21wYXRpYmlsaXR5IG9wdGlvbnMgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgTHVhLgorCisKKworPGgyPjcuMSAtIDxhIG5hbWU9IjcuMSI+Q2hhbmdlcyBpbiB0aGUgTGFuZ3VhZ2U8L2E+PC9oMj4KKzx1bD4KKworPGxpPgorVGhlIHZhcmFyZyBzeXN0ZW0gY2hhbmdlZCBmcm9tIHRoZSBwc2V1ZG8tYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiB3aXRoIGEKK3RhYmxlIHdpdGggdGhlIGV4dHJhIGFyZ3VtZW50cyB0byB0aGUgdmFyYXJnIGV4cHJlc3Npb24uCisoU2VlIGNvbXBpbGUtdGltZSBvcHRpb24gPGNvZGU+TFVBX0NPTVBBVF9WQVJBUkc8L2NvZGU+IGluIDxjb2RlPmx1YWNvbmYuaDwvY29kZT4uKQorPC9saT4KKworPGxpPgorVGhlcmUgd2FzIGEgc3VidGxlIGNoYW5nZSBpbiB0aGUgc2NvcGUgb2YgdGhlIGltcGxpY2l0Cit2YXJpYWJsZXMgb2YgdGhlIDxiPmZvcjwvYj4gc3RhdGVtZW50IGFuZCBmb3IgdGhlIDxiPnJlcGVhdDwvYj4gc3RhdGVtZW50LgorPC9saT4KKworPGxpPgorVGhlIGxvbmcgc3RyaW5nL2xvbmcgY29tbWVudCBzeW50YXggKDxjb2RlPltbPGVtPnN0cmluZzwvZW0+XV08L2NvZGU+KQorZG9lcyBub3QgYWxsb3cgbmVzdGluZy4KK1lvdSBjYW4gdXNlIHRoZSBuZXcgc3ludGF4ICg8Y29kZT5bPVs8ZW0+c3RyaW5nPC9lbT5dPV08L2NvZGU+KSBpbiB0aGVzZSBjYXNlcy4KKyhTZWUgY29tcGlsZS10aW1lIG9wdGlvbiA8Y29kZT5MVUFfQ09NUEFUX0xTVFI8L2NvZGU+IGluIDxjb2RlPmx1YWNvbmYuaDwvY29kZT4uKQorPC9saT4KKworPC91bD4KKworCisKKworPGgyPjcuMiAtIDxhIG5hbWU9IjcuMiI+Q2hhbmdlcyBpbiB0aGUgTGlicmFyaWVzPC9hPjwvaDI+Cis8dWw+CisKKzxsaT4KK0Z1bmN0aW9uIDxjb2RlPnN0cmluZy5nZmluZDwvY29kZT4gd2FzIHJlbmFtZWQgPGEgaHJlZj0iI3BkZi1zdHJpbmcuZ21hdGNoIj48Y29kZT5zdHJpbmcuZ21hdGNoPC9jb2RlPjwvYT4uCisoU2VlIGNvbXBpbGUtdGltZSBvcHRpb24gPGNvZGU+TFVBX0NPTVBBVF9HRklORDwvY29kZT4gaW4gPGNvZGU+bHVhY29uZi5oPC9jb2RlPi4pCis8L2xpPgorCis8bGk+CitXaGVuIDxhIGhyZWY9IiNwZGYtc3RyaW5nLmdzdWIiPjxjb2RlPnN0cmluZy5nc3ViPC9jb2RlPjwvYT4gaXMgY2FsbGVkIHdpdGggYSBmdW5jdGlvbiBhcyBpdHMKK3RoaXJkIGFyZ3VtZW50LAord2hlbmV2ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDxiPm5pbDwvYj4gb3IgPGI+ZmFsc2U8L2I+IHRoZQorcmVwbGFjZW1lbnQgc3RyaW5nIGlzIHRoZSB3aG9sZSBtYXRjaCwKK2luc3RlYWQgb2YgdGhlIGVtcHR5IHN0cmluZy4KKzwvbGk+CisKKzxsaT4KK0Z1bmN0aW9uIDxjb2RlPnRhYmxlLnNldG48L2NvZGU+IHdhcyBkZXByZWNhdGVkLgorRnVuY3Rpb24gPGNvZGU+dGFibGUuZ2V0bjwvY29kZT4gY29ycmVzcG9uZHMKK3RvIHRoZSBuZXcgbGVuZ3RoIG9wZXJhdG9yICg8Y29kZT4jPC9jb2RlPik7Cit1c2UgdGhlIG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uLgorKFNlZSBjb21waWxlLXRpbWUgb3B0aW9uIDxjb2RlPkxVQV9DT01QQVRfR0VUTjwvY29kZT4gaW4gPGNvZGU+bHVhY29uZi5oPC9jb2RlPi4pCis8L2xpPgorCis8bGk+CitGdW5jdGlvbiA8Y29kZT5sb2FkbGliPC9jb2RlPiB3YXMgcmVuYW1lZCA8YSBocmVmPSIjcGRmLXBhY2thZ2UubG9hZGxpYiI+PGNvZGU+cGFja2FnZS5sb2FkbGliPC9jb2RlPjwvYT4uCisoU2VlIGNvbXBpbGUtdGltZSBvcHRpb24gPGNvZGU+TFVBX0NPTVBBVF9MT0FETElCPC9jb2RlPiBpbiA8Y29kZT5sdWFjb25mLmg8L2NvZGU+LikKKzwvbGk+CisKKzxsaT4KK0Z1bmN0aW9uIDxjb2RlPm1hdGgubW9kPC9jb2RlPiB3YXMgcmVuYW1lZCA8YSBocmVmPSIjcGRmLW1hdGguZm1vZCI+PGNvZGU+bWF0aC5mbW9kPC9jb2RlPjwvYT4uCisoU2VlIGNvbXBpbGUtdGltZSBvcHRpb24gPGNvZGU+TFVBX0NPTVBBVF9NT0Q8L2NvZGU+IGluIDxjb2RlPmx1YWNvbmYuaDwvY29kZT4uKQorPC9saT4KKworPGxpPgorRnVuY3Rpb25zIDxjb2RlPnRhYmxlLmZvcmVhY2g8L2NvZGU+IGFuZCA8Y29kZT50YWJsZS5mb3JlYWNoaTwvY29kZT4gYXJlIGRlcHJlY2F0ZWQuCitZb3UgY2FuIHVzZSBhIGZvciBsb29wIHdpdGggPGNvZGU+cGFpcnM8L2NvZGU+IG9yIDxjb2RlPmlwYWlyczwvY29kZT4gaW5zdGVhZC4KKzwvbGk+CisKKzxsaT4KK1RoZXJlIHdlcmUgc3Vic3RhbnRpYWwgY2hhbmdlcyBpbiBmdW5jdGlvbiA8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPiBkdWUgdG8KK3RoZSBuZXcgbW9kdWxlIHN5c3RlbS4KK0hvd2V2ZXIsIHRoZSBuZXcgYmVoYXZpb3IgaXMgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkLAorYnV0IDxjb2RlPnJlcXVpcmU8L2NvZGU+IGdldHMgdGhlIHBhdGggZnJvbSA8YSBocmVmPSIjcGRmLXBhY2thZ2UucGF0aCI+PGNvZGU+cGFja2FnZS5wYXRoPC9jb2RlPjwvYT4gaW5zdGVhZAorb2YgZnJvbSA8Y29kZT5MVUFfUEFUSDwvY29kZT4uCis8L2xpPgorCis8bGk+CitGdW5jdGlvbiA8YSBocmVmPSIjcGRmLWNvbGxlY3RnYXJiYWdlIj48Y29kZT5jb2xsZWN0Z2FyYmFnZTwvY29kZT48L2E+IGhhcyBkaWZmZXJlbnQgYXJndW1lbnRzLgorRnVuY3Rpb24gPGNvZGU+Z2NpbmZvPC9jb2RlPiBpcyBkZXByZWNhdGVkOwordXNlIDxjb2RlPmNvbGxlY3RnYXJiYWdlKCJjb3VudCIpPC9jb2RlPiBpbnN0ZWFkLgorPC9saT4KKworPC91bD4KKworCisKKworPGgyPjcuMyAtIDxhIG5hbWU9IjcuMyI+Q2hhbmdlcyBpbiB0aGUgQVBJPC9hPjwvaDI+Cis8dWw+CisKKzxsaT4KK1RoZSA8Y29kZT5sdWFvcGVuXyo8L2NvZGU+IGZ1bmN0aW9ucyAodG8gb3BlbiBsaWJyYXJpZXMpCitjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LAorbGlrZSBhIHJlZ3VsYXIgQyBmdW5jdGlvbi4KK1RoZXkgbXVzdCBiZSBjYWxsZWQgdGhyb3VnaCBMdWEsCitsaWtlIGEgTHVhIGZ1bmN0aW9uLgorPC9saT4KKworPGxpPgorRnVuY3Rpb24gPGNvZGU+bHVhX29wZW48L2NvZGU+IHdhcyByZXBsYWNlZCBieSA8YSBocmVmPSIjbHVhX25ld3N0YXRlIj48Y29kZT5sdWFfbmV3c3RhdGU8L2NvZGU+PC9hPiB0bworYWxsb3cgdGhlIHVzZXIgdG8gc2V0IGEgbWVtb3J5LWFsbG9jYXRpb24gZnVuY3Rpb24uCitZb3UgY2FuIHVzZSA8YSBocmVmPSIjbHVhTF9uZXdzdGF0ZSI+PGNvZGU+bHVhTF9uZXdzdGF0ZTwvY29kZT48L2E+IGZyb20gdGhlIHN0YW5kYXJkIGxpYnJhcnkgdG8KK2NyZWF0ZSBhIHN0YXRlIHdpdGggYSBzdGFuZGFyZCBhbGxvY2F0aW9uIGZ1bmN0aW9uCisoYmFzZWQgb24gPGNvZGU+cmVhbGxvYzwvY29kZT4pLgorPC9saT4KKworPGxpPgorRnVuY3Rpb25zIDxjb2RlPmx1YUxfZ2V0bjwvY29kZT4gYW5kIDxjb2RlPmx1YUxfc2V0bjwvY29kZT4KKyhmcm9tIHRoZSBhdXhpbGlhcnkgbGlicmFyeSkgYXJlIGRlcHJlY2F0ZWQuCitVc2UgPGEgaHJlZj0iI2x1YV9vYmpsZW4iPjxjb2RlPmx1YV9vYmpsZW48L2NvZGU+PC9hPiBpbnN0ZWFkIG9mIDxjb2RlPmx1YUxfZ2V0bjwvY29kZT4KK2FuZCBub3RoaW5nIGluc3RlYWQgb2YgPGNvZGU+bHVhTF9zZXRuPC9jb2RlPi4KKzwvbGk+CisKKzxsaT4KK0Z1bmN0aW9uIDxjb2RlPmx1YUxfb3BlbmxpYjwvY29kZT4gd2FzIHJlcGxhY2VkIGJ5IDxhIGhyZWY9IiNsdWFMX3JlZ2lzdGVyIj48Y29kZT5sdWFMX3JlZ2lzdGVyPC9jb2RlPjwvYT4uCis8L2xpPgorCis8bGk+CitGdW5jdGlvbiA8Y29kZT5sdWFMX2NoZWNrdWRhdGE8L2NvZGU+IG5vdyB0aHJvd3MgYW4gZXJyb3Igd2hlbiB0aGUgZ2l2ZW4gdmFsdWUKK2lzIG5vdCBhIHVzZXJkYXRhIG9mIHRoZSBleHBlY3RlZCB0eXBlLgorKEluIEx1YSZuYnNwOzUuMCBpdCByZXR1cm5lZCA8Y29kZT5OVUxMPC9jb2RlPi4pCis8L2xpPgorCis8L3VsPgorCisKKworCis8aDE+OCAtIDxhIG5hbWU9IjgiPlRoZSBDb21wbGV0ZSBTeW50YXggb2YgTHVhPC9hPjwvaDE+CisKKzxwPgorSGVyZSBpcyB0aGUgY29tcGxldGUgc3ludGF4IG9mIEx1YSBpbiBleHRlbmRlZCBCTkYuCisoSXQgZG9lcyBub3QgZGVzY3JpYmUgb3BlcmF0b3IgcHJlY2VkZW5jZXMuKQorCisKKworCis8cHJlPgorCisJY2h1bmsgOjo9IHtzdGF0IFtgPGI+OzwvYj4mYWN1dGU7XX0gW2xhc3RzdGF0IFtgPGI+OzwvYj4mYWN1dGU7XV0KKworCWJsb2NrIDo6PSBjaHVuaworCisJc3RhdCA6Oj0gIHZhcmxpc3QgYDxiPj08L2I+JmFjdXRlOyBleHBsaXN0IHwgCisJCSBmdW5jdGlvbmNhbGwgfCAKKwkJIDxiPmRvPC9iPiBibG9jayA8Yj5lbmQ8L2I+IHwgCisJCSA8Yj53aGlsZTwvYj4gZXhwIDxiPmRvPC9iPiBibG9jayA8Yj5lbmQ8L2I+IHwgCisJCSA8Yj5yZXBlYXQ8L2I+IGJsb2NrIDxiPnVudGlsPC9iPiBleHAgfCAKKwkJIDxiPmlmPC9iPiBleHAgPGI+dGhlbjwvYj4gYmxvY2sgezxiPmVsc2VpZjwvYj4gZXhwIDxiPnRoZW48L2I+IGJsb2NrfSBbPGI+ZWxzZTwvYj4gYmxvY2tdIDxiPmVuZDwvYj4gfCAKKwkJIDxiPmZvcjwvYj4gTmFtZSBgPGI+PTwvYj4mYWN1dGU7IGV4cCBgPGI+LDwvYj4mYWN1dGU7IGV4cCBbYDxiPiw8L2I+JmFjdXRlOyBleHBdIDxiPmRvPC9iPiBibG9jayA8Yj5lbmQ8L2I+IHwgCisJCSA8Yj5mb3I8L2I+IG5hbWVsaXN0IDxiPmluPC9iPiBleHBsaXN0IDxiPmRvPC9iPiBibG9jayA8Yj5lbmQ8L2I+IHwgCisJCSA8Yj5mdW5jdGlvbjwvYj4gZnVuY25hbWUgZnVuY2JvZHkgfCAKKwkJIDxiPmxvY2FsPC9iPiA8Yj5mdW5jdGlvbjwvYj4gTmFtZSBmdW5jYm9keSB8IAorCQkgPGI+bG9jYWw8L2I+IG5hbWVsaXN0IFtgPGI+PTwvYj4mYWN1dGU7IGV4cGxpc3RdIAorCisJbGFzdHN0YXQgOjo9IDxiPnJldHVybjwvYj4gW2V4cGxpc3RdIHwgPGI+YnJlYWs8L2I+CisKKwlmdW5jbmFtZSA6Oj0gTmFtZSB7YDxiPi48L2I+JmFjdXRlOyBOYW1lfSBbYDxiPjo8L2I+JmFjdXRlOyBOYW1lXQorCisJdmFybGlzdCA6Oj0gdmFyIHtgPGI+LDwvYj4mYWN1dGU7IHZhcn0KKworCXZhciA6Oj0gIE5hbWUgfCBwcmVmaXhleHAgYDxiPls8L2I+JmFjdXRlOyBleHAgYDxiPl08L2I+JmFjdXRlOyB8IHByZWZpeGV4cCBgPGI+LjwvYj4mYWN1dGU7IE5hbWUgCisKKwluYW1lbGlzdCA6Oj0gTmFtZSB7YDxiPiw8L2I+JmFjdXRlOyBOYW1lfQorCisJZXhwbGlzdCA6Oj0ge2V4cCBgPGI+LDwvYj4mYWN1dGU7fSBleHAKKworCWV4cCA6Oj0gIDxiPm5pbDwvYj4gfCA8Yj5mYWxzZTwvYj4gfCA8Yj50cnVlPC9iPiB8IE51bWJlciB8IFN0cmluZyB8IGA8Yj4uLi48L2I+JmFjdXRlOyB8IGZ1bmN0aW9uIHwgCisJCSBwcmVmaXhleHAgfCB0YWJsZWNvbnN0cnVjdG9yIHwgZXhwIGJpbm9wIGV4cCB8IHVub3AgZXhwIAorCisJcHJlZml4ZXhwIDo6PSB2YXIgfCBmdW5jdGlvbmNhbGwgfCBgPGI+KDwvYj4mYWN1dGU7IGV4cCBgPGI+KTwvYj4mYWN1dGU7CisKKwlmdW5jdGlvbmNhbGwgOjo9ICBwcmVmaXhleHAgYXJncyB8IHByZWZpeGV4cCBgPGI+OjwvYj4mYWN1dGU7IE5hbWUgYXJncyAKKworCWFyZ3MgOjo9ICBgPGI+KDwvYj4mYWN1dGU7IFtleHBsaXN0XSBgPGI+KTwvYj4mYWN1dGU7IHwgdGFibGVjb25zdHJ1Y3RvciB8IFN0cmluZyAKKworCWZ1bmN0aW9uIDo6PSA8Yj5mdW5jdGlvbjwvYj4gZnVuY2JvZHkKKworCWZ1bmNib2R5IDo6PSBgPGI+KDwvYj4mYWN1dGU7IFtwYXJsaXN0XSBgPGI+KTwvYj4mYWN1dGU7IGJsb2NrIDxiPmVuZDwvYj4KKworCXBhcmxpc3QgOjo9IG5hbWVsaXN0IFtgPGI+LDwvYj4mYWN1dGU7IGA8Yj4uLi48L2I+JmFjdXRlO10gfCBgPGI+Li4uPC9iPiZhY3V0ZTsKKworCXRhYmxlY29uc3RydWN0b3IgOjo9IGA8Yj57PC9iPiZhY3V0ZTsgW2ZpZWxkbGlzdF0gYDxiPn08L2I+JmFjdXRlOworCisJZmllbGRsaXN0IDo6PSBmaWVsZCB7ZmllbGRzZXAgZmllbGR9IFtmaWVsZHNlcF0KKworCWZpZWxkIDo6PSBgPGI+WzwvYj4mYWN1dGU7IGV4cCBgPGI+XTwvYj4mYWN1dGU7IGA8Yj49PC9iPiZhY3V0ZTsgZXhwIHwgTmFtZSBgPGI+PTwvYj4mYWN1dGU7IGV4cCB8IGV4cAorCisJZmllbGRzZXAgOjo9IGA8Yj4sPC9iPiZhY3V0ZTsgfCBgPGI+OzwvYj4mYWN1dGU7CisKKwliaW5vcCA6Oj0gYDxiPis8L2I+JmFjdXRlOyB8IGA8Yj4tPC9iPiZhY3V0ZTsgfCBgPGI+KjwvYj4mYWN1dGU7IHwgYDxiPi88L2I+JmFjdXRlOyB8IGA8Yj5ePC9iPiZhY3V0ZTsgfCBgPGI+JTwvYj4mYWN1dGU7IHwgYDxiPi4uPC9iPiZhY3V0ZTsgfCAKKwkJIGA8Yj4mbHQ7PC9iPiZhY3V0ZTsgfCBgPGI+Jmx0Oz08L2I+JmFjdXRlOyB8IGA8Yj4mZ3Q7PC9iPiZhY3V0ZTsgfCBgPGI+Jmd0Oz08L2I+JmFjdXRlOyB8IGA8Yj49PTwvYj4mYWN1dGU7IHwgYDxiPn49PC9iPiZhY3V0ZTsgfCAKKwkJIDxiPmFuZDwvYj4gfCA8Yj5vcjwvYj4KKworCXVub3AgOjo9IGA8Yj4tPC9iPiZhY3V0ZTsgfCA8Yj5ub3Q8L2I+IHwgYDxiPiM8L2I+JmFjdXRlOworCis8L3ByZT4KKworPHA+CisKKworCisKKworCisKKzxIUj4KKzxTTUFMTD4KK0xhc3QgdXBkYXRlOgorTW9uIEF1ZyAxOCAxMzoyNTo0NiBCUlQgMjAwOAorPC9TTUFMTD4KKzwhLS0KK0xhc3QgY2hhbmdlOiByZXZpc2VkIGZvciBMdWEgNS4xLjQKKy0tPgorCis8L2JvZHk+PC9odG1sPgorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZG9jL3JlYWRtZS5odG1sIGIvbHVhLTUuMS40L2RvYy9yZWFkbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJlNmRiCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2RvYy9yZWFkbWUuaHRtbApAQCAtMCwwICsxLDQwIEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkx1YSBkb2N1bWVudGF0aW9uPC9USVRMRT4KKzxMSU5LIFJFTD0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Imx1YS5jc3MiPgorPC9IRUFEPgorCis8Qk9EWT4KKworPEhSPgorPEgxPgorPEEgSFJFRj0iaHR0cDovL3d3dy5sdWEub3JnLyI+PElNRyBTUkM9ImxvZ28uZ2lmIiBBTFQ9Ikx1YSIgQk9SREVSPTA+PC9BPgorRG9jdW1lbnRhdGlvbgorPC9IMT4KKworVGhpcyBpcyB0aGUgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvZiBMdWEgNS4xLjQuCisKKzxVTD4KKzxMST48QSBIUkVGPSJjb250ZW50cy5odG1sIj5SZWZlcmVuY2UgbWFudWFsPC9BPgorPExJPjxBIEhSRUY9Imx1YS5odG1sIj5sdWEgbWFuIHBhZ2U8L0E+Cis8TEk+PEEgSFJFRj0ibHVhYy5odG1sIj5sdWFjIG1hbiBwYWdlPC9BPgorPExJPjxBIEhSRUY9Ii4uL1JFQURNRSI+bHVhL1JFQURNRTwvQT4KKzxMST48QSBIUkVGPSIuLi9ldGMvUkVBRE1FIj5sdWEvZXRjL1JFQURNRTwvQT4KKzxMST48QSBIUkVGPSIuLi90ZXN0L1JFQURNRSI+bHVhL3Rlc3QvUkVBRE1FPC9BPgorPC9VTD4KKworTHVhJ3MKKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy8iPm9mZmljaWFsIHdlYiBzaXRlPC9BPgorY29udGFpbnMgdXBkYXRlZCBkb2N1bWVudGF0aW9uLAorZXNwZWNpYWxseSB0aGUKKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy9tYW51YWwvNS4xLyI+cmVmZXJlbmNlIG1hbnVhbDwvQT4uCis8UD4KKworPEhSPgorPFNNQUxMPgorTGFzdCB1cGRhdGU6CitUdWUgQXVnIDEyIDE0OjQ2OjA3IEJSVCAyMDA4Cis8L1NNQUxMPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZXRjL01ha2VmaWxlIGIvbHVhLTUuMS40L2V0Yy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDAwMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2V0Yy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ0IEBACisjIG1ha2VmaWxlIGZvciBMdWEgZXRjCisKK1RPUD0gLi4KK0xJQj0gJChUT1ApL3NyYworSU5DPSAkKFRPUCkvc3JjCitCSU49ICQoVE9QKS9zcmMKK1NSQz0gJChUT1ApL3NyYworVFNUPSAkKFRPUCkvdGVzdAorCitDQz0gZ2NjCitDRkxBR1M9IC1PMiAtV2FsbCAtSSQoSU5DKSAkKE1ZQ0ZMQUdTKQorTVlDRkxBR1M9IAorTVlMREZMQUdTPSAtV2wsLUUKK01ZTElCUz0gLWxtCisjTVlMSUJTPSAtbG0gLVdsLC1FIC1sZGwgLWxyZWFkbGluZSAtbGhpc3RvcnkgLWxuY3Vyc2VzCitSTT0gcm0gLWYKKworZGVmYXVsdDoKKwlAZWNobyAnUGxlYXNlIGNob29zZSBhIHRhcmdldDogbWluIG5vcGFyc2VyIG9uZSBzdHJpY3QgY2xlYW4nCisKK21pbjoJbWluLmMKKwkkKENDKSAkKENGTEFHUykgJEAuYyAtTCQoTElCKSAtbGx1YSAkKE1ZTElCUykKKwllY2hvICdwcmludCJIZWxsbyB0aGVyZSEiJyB8IC4vYS5vdXQKKworbm9wYXJzZXI6IG5vcGFyc2VyLm8KKwkkKENDKSBub3BhcnNlci5vICQoU1JDKS9sdWEubyAtTCQoTElCKSAtbGx1YSAkKE1ZTElCUykKKwkkKEJJTikvbHVhYyAkKFRTVCkvaGVsbG8ubHVhCisJLS4vYS5vdXQgbHVhYy5vdXQKKwktLi9hLm91dCAtZSdhPTEnCisKK29uZToKKwkkKENDKSAkKENGTEFHUykgYWxsLmMgJChNWUxJQlMpCisJLi9hLm91dCAkKFRTVCkvaGVsbG8ubHVhCisKK3N0cmljdDoKKwktJChCSU4pL2x1YSAtZSAncHJpbnQoYSk7Yj0yJworCS0kKEJJTikvbHVhIC1sc3RyaWN0IC1lICdwcmludChhKScKKwktJChCSU4pL2x1YSAtZSAnZnVuY3Rpb24gZigpIGI9MiBlbmQgZigpJworCS0kKEJJTikvbHVhIC1sc3RyaWN0IC1lICdmdW5jdGlvbiBmKCkgYj0yIGVuZCBmKCknCisKK2NsZWFuOgorCSQoUk0pIGEub3V0IGNvcmUgY29yZS4qICoubyBsdWFjLm91dAorCisuUEhPTlk6CWRlZmF1bHQgbWluIG5vcGFyc2VyIG9uZSBzdHJpY3QgY2xlYW4KZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9ldGMvUkVBRE1FIGIvbHVhLTUuMS40L2V0Yy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0OWZjOQotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9ldGMvUkVBRE1FCkBAIC0wLDAgKzEsMzcgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHNvbWUgdXNlZnVsIGZpbGVzIGFuZCBjb2RlLgorVW5saWtlIHRoZSBjb2RlIGluIC4uL3NyYywgZXZlcnl0aGluZyBoZXJlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCitJZiBhbnkgb2YgdGhlIG1ha2VzIGZhaWwsIHlvdSdyZSBwcm9iYWJseSBub3QgdXNpbmcgdGhlIHNhbWUgbGlicmFyaWVzCit1c2VkIHRvIGJ1aWxkIEx1YS4gU2V0IE1ZTElCUyBpbiBNYWtlZmlsZSBhY2NvcmRpbmdseS4KKworYWxsLmMKKwlGdWxsIEx1YSBpbnRlcnByZXRlciBpbiBhIHNpbmdsZSBmaWxlLgorCURvICJtYWtlIG9uZSIgZm9yIGEgZGVtby4KKworbHVhLmhwcAorCUx1YSBoZWFkZXIgZmlsZXMgZm9yIEMrKyB1c2luZyAnZXh0ZXJuICJDIicuCisKK2x1YS5pY28KKwlBIEx1YSBpY29uIGZvciBXaW5kb3dzIChhbmQgd2ViIHNpdGVzOiBzYXZlIGFzIGZhdmljb24uaWNvKS4KKwlEcmF3biBieSBoYW5kIGJ5IE1hcmt1cyBHcml0c2NoIDxncml0c2NoQGl1ZS50dXdpZW4uYWMuYXQ+LgorCitsdWEucGMKKwlwa2ctY29uZmlnIGRhdGEgZm9yIEx1YQorCitsdWF2cy5iYXQKKwlTY3JpcHQgdG8gYnVpbGQgTHVhIHVuZGVyICJWaXN1YWwgU3R1ZGlvIC5ORVQgQ29tbWFuZCBQcm9tcHQiLgorCVJ1biBpdCBmcm9tIHRoZSB0b3BsZXZlbCBhcyBldGNcbHVhdnMuYmF0LgorCittaW4uYworCUEgbWluaW1hbCBMdWEgaW50ZXJwcmV0ZXIuCisJR29vZCBmb3IgbGVhcm5pbmcgYW5kIGZvciBzdGFydGluZyB5b3VyIG93bi4KKwlEbyAibWFrZSBtaW4iIGZvciBhIGRlbW8uCisKK25vcGFyc2VyLmMKKwlMaW5raW5nIHdpdGggbm9wYXJzZXIubyBhdm9pZHMgbG9hZGluZyB0aGUgcGFyc2luZyBtb2R1bGVzIGluIGx1YWxpYi5hLgorCURvICJtYWtlIG5vcGFyc2VyIiBmb3IgYSBkZW1vLgorCitzdHJpY3QubHVhCisJVHJhcHMgdXNlcyBvZiB1bmRlY2xhcmVkIGdsb2JhbCB2YXJpYWJsZXMuCisJRG8gIm1ha2Ugc3RyaWN0IiBmb3IgYSBkZW1vLgorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZXRjL2FsbC5jIGIvbHVhLTUuMS40L2V0Yy9hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI2OGZhCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2V0Yy9hbGwuYwpAQCAtMCwwICsxLDM4IEBACisvKgorKiBhbGwuYyAtLSBMdWEgY29yZSwgbGlicmFyaWVzIGFuZCBpbnRlcnByZXRlciBpbiBhIHNpbmdsZSBmaWxlCisqLworCisjZGVmaW5lIGx1YWFsbF9jCisKKyNpbmNsdWRlICJsYXBpLmMiCisjaW5jbHVkZSAibGNvZGUuYyIKKyNpbmNsdWRlICJsZGVidWcuYyIKKyNpbmNsdWRlICJsZG8uYyIKKyNpbmNsdWRlICJsZHVtcC5jIgorI2luY2x1ZGUgImxmdW5jLmMiCisjaW5jbHVkZSAibGdjLmMiCisjaW5jbHVkZSAibGxleC5jIgorI2luY2x1ZGUgImxtZW0uYyIKKyNpbmNsdWRlICJsb2JqZWN0LmMiCisjaW5jbHVkZSAibG9wY29kZXMuYyIKKyNpbmNsdWRlICJscGFyc2VyLmMiCisjaW5jbHVkZSAibHN0YXRlLmMiCisjaW5jbHVkZSAibHN0cmluZy5jIgorI2luY2x1ZGUgImx0YWJsZS5jIgorI2luY2x1ZGUgImx0bS5jIgorI2luY2x1ZGUgImx1bmR1bXAuYyIKKyNpbmNsdWRlICJsdm0uYyIKKyNpbmNsdWRlICJsemlvLmMiCisKKyNpbmNsdWRlICJsYXV4bGliLmMiCisjaW5jbHVkZSAibGJhc2VsaWIuYyIKKyNpbmNsdWRlICJsZGJsaWIuYyIKKyNpbmNsdWRlICJsaW9saWIuYyIKKyNpbmNsdWRlICJsaW5pdC5jIgorI2luY2x1ZGUgImxtYXRobGliLmMiCisjaW5jbHVkZSAibG9hZGxpYi5jIgorI2luY2x1ZGUgImxvc2xpYi5jIgorI2luY2x1ZGUgImxzdHJsaWIuYyIKKyNpbmNsdWRlICJsdGFibGliLmMiCisKKyNpbmNsdWRlICJsdWEuYyIKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9ldGMvbHVhLmhwcCBiL2x1YS01LjEuNC9ldGMvbHVhLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzQxN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2V0Yy9sdWEuaHBwCkBAIC0wLDAgKzEsOSBAQAorLy8gbHVhLmhwcAorLy8gTHVhIGhlYWRlciBmaWxlcyBmb3IgQysrCisvLyA8PGV4dGVybiAiQyI+PiBub3Qgc3VwcGxpZWQgYXV0b21hdGljYWxseSBiZWNhdXNlIEx1YSBhbHNvIGNvbXBpbGVzIGFzIEMrKworCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCit9CmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZXRjL2x1YS5pY28gYi9sdWEtNS4xLjQvZXRjL2x1YS5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiYWJjNAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9ldGMvbHVhLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvZXRjL2x1YS5wYyBiL2x1YS01LjEuNC9ldGMvbHVhLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MmY1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvZXRjL2x1YS5wYwpAQCAtMCwwICsxLDMxIEBACisjIGx1YS5wYyAtLSBwa2ctY29uZmlnIGRhdGEgZm9yIEx1YQorCisjIHZhcnMgZnJvbSBpbnN0YWxsIE1ha2VmaWxlCisKKyMgZ3JlcCAnXlY9JyAuLi9NYWtlZmlsZQorVj0gNS4xCisjIGdyZXAgJ15SPScgLi4vTWFrZWZpbGUKK1I9IDUuMS40CisKKyMgZ3JlcCAnXklOU1RBTExfLio9JyAuLi9NYWtlZmlsZSB8IHNlZCAncy9JTlNUQUxMX1RPUC9wcmVmaXgvJworcHJlZml4PSAvdXNyL2xvY2FsCitJTlNUQUxMX0JJTj0gJHtwcmVmaXh9L2JpbgorSU5TVEFMTF9JTkM9ICR7cHJlZml4fS9pbmNsdWRlCitJTlNUQUxMX0xJQj0gJHtwcmVmaXh9L2xpYgorSU5TVEFMTF9NQU49ICR7cHJlZml4fS9tYW4vbWFuMQorSU5TVEFMTF9MTU9EPSAke3ByZWZpeH0vc2hhcmUvbHVhLyR7Vn0KK0lOU1RBTExfQ01PRD0gJHtwcmVmaXh9L2xpYi9sdWEvJHtWfQorCisjIGNhbm9uaWNhbCB2YXJzCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogTHVhCitEZXNjcmlwdGlvbjogQW4gRXh0ZW5zaWJsZSBFeHRlbnNpb24gTGFuZ3VhZ2UKK1ZlcnNpb246ICR7Un0KK1JlcXVpcmVzOiAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sbHVhIC1sbQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KKworIyAoZW5kIG9mIGx1YS5wYykKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9ldGMvbHVhdnMuYmF0IGIvbHVhLTUuMS40L2V0Yy9sdWF2cy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjMmJlZAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9ldGMvbHVhdnMuYmF0CkBAIC0wLDAgKzEsMjggQEAKK0ByZW0gU2NyaXB0IHRvIGJ1aWxkIEx1YSB1bmRlciAiVmlzdWFsIFN0dWRpbyAuTkVUIENvbW1hbmQgUHJvbXB0Ii4NCitAcmVtIERvIG5vdCBydW4gZnJvbSB0aGlzIGRpcmVjdG9yeTsgcnVuIGl0IGZyb20gdGhlIHRvcGxldmVsOiBldGNcbHVhdnMuYmF0IC4NCitAcmVtIEl0IGNyZWF0ZXMgbHVhNTEuZGxsLCBsdWE1MS5saWIsIGx1YS5leGUsIGFuZCBsdWFjLmV4ZSBpbiBzcmMuDQorQHJlbSAoY29udHJpYnV0ZWQgYnkgRGF2aWQgTWFudXJhIGFuZCBNaWtlIFBhbGwpDQorDQorQHNldGxvY2FsDQorQHNldCBNWUNPTVBJTEU9Y2wgL25vbG9nbyAvTUQgL08yIC9XMyAvYyAvRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQ0KK0BzZXQgTVlMSU5LPWxpbmsgL25vbG9nbw0KK0BzZXQgTVlNVD1tdCAvbm9sb2dvDQorDQorY2Qgc3JjDQorJU1ZQ09NUElMRSUgL0RMVUFfQlVJTERfQVNfRExMIGwqLmMNCitkZWwgbHVhLm9iaiBsdWFjLm9iag0KKyVNWUxJTkslIC9ETEwgL291dDpsdWE1MS5kbGwgbCoub2JqDQoraWYgZXhpc3QgbHVhNTEuZGxsLm1hbmlmZXN0Xg0KKyAgJU1ZTVQlIC1tYW5pZmVzdCBsdWE1MS5kbGwubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOmx1YTUxLmRsbDsyDQorJU1ZQ09NUElMRSUgL0RMVUFfQlVJTERfQVNfRExMIGx1YS5jDQorJU1ZTElOSyUgL291dDpsdWEuZXhlIGx1YS5vYmogbHVhNTEubGliDQoraWYgZXhpc3QgbHVhLmV4ZS5tYW5pZmVzdF4NCisgICVNWU1UJSAtbWFuaWZlc3QgbHVhLmV4ZS5tYW5pZmVzdCAtb3V0cHV0cmVzb3VyY2U6bHVhLmV4ZQ0KKyVNWUNPTVBJTEUlIGwqLmMgcHJpbnQuYw0KK2RlbCBsdWEub2JqIGxpbml0Lm9iaiBsYmFzZWxpYi5vYmogbGRibGliLm9iaiBsaW9saWIub2JqIGxtYXRobGliLm9ial4NCisgICAgbG9zbGliLm9iaiBsdGFibGliLm9iaiBsc3RybGliLm9iaiBsb2FkbGliLm9iag0KKyVNWUxJTkslIC9vdXQ6bHVhYy5leGUgKi5vYmoNCitpZiBleGlzdCBsdWFjLmV4ZS5tYW5pZmVzdF4NCisgICVNWU1UJSAtbWFuaWZlc3QgbHVhYy5leGUubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOmx1YWMuZXhlDQorZGVsICoub2JqICoubWFuaWZlc3QNCitjZCAuLg0KZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9ldGMvbWluLmMgYi9sdWEtNS4xLjQvZXRjL21pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODVhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvZXRjL21pbi5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisqIG1pbi5jIC0tIGEgbWluaW1hbCBMdWEgaW50ZXJwcmV0ZXIKKyogbG9hZHMgc3RkaW4gb25seSB3aXRoIG1pbmltYWwgZXJyb3IgaGFuZGxpbmcuCisqIG5vIGludGVyYWN0aW9uLCBhbmQgbm8gc3RhbmRhcmQgbGlicmFyeSwgb25seSBhICJwcmludCIgZnVuY3Rpb24uCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKworc3RhdGljIGludCBwcmludChsdWFfU3RhdGUgKkwpCit7CisgaW50IG49bHVhX2dldHRvcChMKTsKKyBpbnQgaTsKKyBmb3IgKGk9MTsgaTw9bjsgaSsrKQorIHsKKyAgaWYgKGk+MSkgcHJpbnRmKCJcdCIpOworICBpZiAobHVhX2lzc3RyaW5nKEwsaSkpCisgICBwcmludGYoIiVzIixsdWFfdG9zdHJpbmcoTCxpKSk7CisgIGVsc2UgaWYgKGx1YV9pc25pbChMLGkpKQorICAgcHJpbnRmKCIlcyIsIm5pbCIpOworICBlbHNlIGlmIChsdWFfaXNib29sZWFuKEwsaSkpCisgICBwcmludGYoIiVzIixsdWFfdG9ib29sZWFuKEwsaSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgZWxzZQorICAgcHJpbnRmKCIlczolcCIsbHVhTF90eXBlbmFtZShMLGkpLGx1YV90b3BvaW50ZXIoTCxpKSk7CisgfQorIHByaW50ZigiXG4iKTsKKyByZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyBsdWFfU3RhdGUgKkw9bHVhX29wZW4oKTsKKyBsdWFfcmVnaXN0ZXIoTCwicHJpbnQiLHByaW50KTsKKyBpZiAobHVhTF9kb2ZpbGUoTCxOVUxMKSE9MCkgZnByaW50ZihzdGRlcnIsIiVzXG4iLGx1YV90b3N0cmluZyhMLC0xKSk7CisgbHVhX2Nsb3NlKEwpOworIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L2V0Yy9ub3BhcnNlci5jIGIvbHVhLTUuMS40L2V0Yy9ub3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmE1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvZXRjL25vcGFyc2VyLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyogVGhlIGNvZGUgYmVsb3cgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIEx1YSBjb3JlIHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUKKyogcGFyc2luZyBtb2R1bGVzIChsY29kZSwgbGxleCwgbHBhcnNlciksIHdoaWNoIHJlcHJlc2VudCAzNSUgb2YgdGhlIHRvdGFsIGNvcmUuCisqIFlvdSdsbCBvbmx5IGJlIGFibGUgdG8gbG9hZCBiaW5hcnkgZmlsZXMgYW5kIHN0cmluZ3MsIHByZWNvbXBpbGVkIHdpdGggbHVhYy4KKyogKE9mIGNvdXJzZSwgeW91J2xsIGhhdmUgdG8gYnVpbGQgbHVhYyB3aXRoIHRoZSBvcmlnaW5hbCBwYXJzaW5nIG1vZHVsZXMhKQorKgorKiBUbyB1c2UgdGhpcyBtb2R1bGUsIHNpbXBseSBjb21waWxlIGl0ICgibWFrZSBub3BhcnNlciIgZG9lcyB0aGF0KSBhbmQgbGlzdAorKiBpdHMgb2JqZWN0IGZpbGUgYmVmb3JlIHRoZSBMdWEgbGlicmFyaWVzLiBUaGUgbGlua2VyIHNob3VsZCB0aGVuIG5vdCBsb2FkCisqIHRoZSBwYXJzaW5nIG1vZHVsZXMuIFRvIHRyeSBpdCwgZG8gIm1ha2UgbHVhYiIuCisqCisqIElmIHlvdSBhbHNvIHdhbnQgdG8gYXZvaWQgdGhlIGR1bXAgbW9kdWxlIChsZHVtcC5vKSwgZGVmaW5lIE5PRFVNUC4KKyogI2RlZmluZSBOT0RVTVAKKyovCisKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImxsZXguaCIKKyNpbmNsdWRlICJscGFyc2VyLmgiCisjaW5jbHVkZSAibHppby5oIgorCitMVUFJX0ZVTkMgdm9pZCBsdWFYX2luaXQgKGx1YV9TdGF0ZSAqTCkgeworICBVTlVTRUQoTCk7Cit9CisKK0xVQUlfRlVOQyBQcm90byAqbHVhWV9wYXJzZXIgKGx1YV9TdGF0ZSAqTCwgWklPICp6LCBNYnVmZmVyICpidWZmLCBjb25zdCBjaGFyICpuYW1lKSB7CisgIFVOVVNFRCh6KTsKKyAgVU5VU0VEKGJ1ZmYpOworICBVTlVTRUQobmFtZSk7CisgIGx1YV9wdXNobGl0ZXJhbChMLCJwYXJzZXIgbm90IGxvYWRlZCIpOworICBsdWFfZXJyb3IoTCk7CisgIHJldHVybiBOVUxMOworfQorCisjaWZkZWYgTk9EVU1QCisjaW5jbHVkZSAibHVuZHVtcC5oIgorCitMVUFJX0ZVTkMgaW50IGx1YVVfZHVtcCAobHVhX1N0YXRlKiBMLCBjb25zdCBQcm90byogZiwgbHVhX1dyaXRlciB3LCB2b2lkKiBkYXRhLCBpbnQgc3RyaXApIHsKKyAgVU5VU0VEKGYpOworICBVTlVTRUQodyk7CisgIFVOVVNFRChkYXRhKTsKKyAgVU5VU0VEKHN0cmlwKTsKKyNpZiAxCisgIFVOVVNFRChMKTsKKyAgcmV0dXJuIDA7CisjZWxzZQorICBsdWFfcHVzaGxpdGVyYWwoTCwiZHVtcGVyIG5vdCBsb2FkZWQiKTsKKyAgbHVhX2Vycm9yKEwpOworI2VuZGlmCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9ldGMvc3RyaWN0Lmx1YSBiL2x1YS01LjEuNC9ldGMvc3RyaWN0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ2MTlkCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L2V0Yy9zdHJpY3QubHVhCkBAIC0wLDAgKzEsNDEgQEAKKy0tCistLSBzdHJpY3QubHVhCistLSBjaGVja3MgdXNlcyBvZiB1bmRlY2xhcmVkIGdsb2JhbCB2YXJpYWJsZXMKKy0tIEFsbCBnbG9iYWwgdmFyaWFibGVzIG11c3QgYmUgJ2RlY2xhcmVkJyB0aHJvdWdoIGEgcmVndWxhciBhc3NpZ25tZW50CistLSAoZXZlbiBhc3NpZ25pbmcgbmlsIHdpbGwgZG8pIGluIGEgbWFpbiBjaHVuayBiZWZvcmUgYmVpbmcgdXNlZAorLS0gYW55d2hlcmUgb3IgYXNzaWduZWQgdG8gaW5zaWRlIGEgZnVuY3Rpb24uCistLQorCitsb2NhbCBnZXRpbmZvLCBlcnJvciwgcmF3c2V0LCByYXdnZXQgPSBkZWJ1Zy5nZXRpbmZvLCBlcnJvciwgcmF3c2V0LCByYXdnZXQKKworbG9jYWwgbXQgPSBnZXRtZXRhdGFibGUoX0cpCitpZiBtdCA9PSBuaWwgdGhlbgorICBtdCA9IHt9CisgIHNldG1ldGF0YWJsZShfRywgbXQpCitlbmQKKworbXQuX19kZWNsYXJlZCA9IHt9CisKK2xvY2FsIGZ1bmN0aW9uIHdoYXQgKCkKKyAgbG9jYWwgZCA9IGdldGluZm8oMywgIlMiKQorICByZXR1cm4gZCBhbmQgZC53aGF0IG9yICJDIgorZW5kCisKK210Ll9fbmV3aW5kZXggPSBmdW5jdGlvbiAodCwgbiwgdikKKyAgaWYgbm90IG10Ll9fZGVjbGFyZWRbbl0gdGhlbgorICAgIGxvY2FsIHcgPSB3aGF0KCkKKyAgICBpZiB3IH49ICJtYWluIiBhbmQgdyB+PSAiQyIgdGhlbgorICAgICAgZXJyb3IoImFzc2lnbiB0byB1bmRlY2xhcmVkIHZhcmlhYmxlICciLi5uLi4iJyIsIDIpCisgICAgZW5kCisgICAgbXQuX19kZWNsYXJlZFtuXSA9IHRydWUKKyAgZW5kCisgIHJhd3NldCh0LCBuLCB2KQorZW5kCisgIAorbXQuX19pbmRleCA9IGZ1bmN0aW9uICh0LCBuKQorICBpZiBub3QgbXQuX19kZWNsYXJlZFtuXSBhbmQgd2hhdCgpIH49ICJDIiB0aGVuCisgICAgZXJyb3IoInZhcmlhYmxlICciLi5uLi4iJyBpcyBub3QgZGVjbGFyZWQiLCAyKQorICBlbmQKKyAgcmV0dXJuIHJhd2dldCh0LCBuKQorZW5kCisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvTWFrZWZpbGUgYi9sdWEtNS4xLjQvc3JjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTNjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL01ha2VmaWxlCkBAIC0wLDAgKzEsMTgyIEBACisjIG1ha2VmaWxlIGZvciBidWlsZGluZyBMdWEKKyMgc2VlIC4uL0lOU1RBTEwgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMKKyMgc2VlIC4uL01ha2VmaWxlIGFuZCBsdWFjb25mLmggZm9yIGZ1cnRoZXIgY3VzdG9taXphdGlvbgorCisjID09IENIQU5HRSBUSEUgU0VUVElOR1MgQkVMT1cgVE8gU1VJVCBZT1VSIEVOVklST05NRU5UID09PT09PT09PT09PT09PT09PT09PT09CisKKyMgWW91ciBwbGF0Zm9ybS4gU2VlIFBMQVRTIGZvciBwb3NzaWJsZSB2YWx1ZXMuCitQTEFUPSBub25lCisKK0NDPSBnY2MKK0NGTEFHUz0gLU8yIC1XYWxsICQoTVlDRkxBR1MpCitBUj0gYXIgcmN1CitSQU5MSUI9IHJhbmxpYgorUk09IHJtIC1mCitMSUJTPSAtbG0gJChNWUxJQlMpCisKK01ZQ0ZMQUdTPQorTVlMREZMQUdTPQorTVlMSUJTPQorCisjID09IEVORCBPRiBVU0VSIFNFVFRJTkdTLiBOTyBORUVEIFRPIENIQU5HRSBBTllUSElORyBCRUxPVyBUSElTIExJTkUgPT09PT09PT09CisKK1BMQVRTPSBhaXggYW5zaSBic2QgZnJlZWJzZCBnZW5lcmljIGxpbnV4IG1hY29zeCBtaW5ndyBwb3NpeCBzb2xhcmlzCisKK0xVQV9BPQlsaWJsdWEuYQorQ09SRV9PPQlsYXBpLm8gbGNvZGUubyBsZGVidWcubyBsZG8ubyBsZHVtcC5vIGxmdW5jLm8gbGdjLm8gbGxleC5vIGxtZW0ubyBcCisJbG9iamVjdC5vIGxvcGNvZGVzLm8gbHBhcnNlci5vIGxzdGF0ZS5vIGxzdHJpbmcubyBsdGFibGUubyBsdG0ubyAgXAorCWx1bmR1bXAubyBsdm0ubyBsemlvLm8KK0xJQl9PPQlsYXV4bGliLm8gbGJhc2VsaWIubyBsZGJsaWIubyBsaW9saWIubyBsbWF0aGxpYi5vIGxvc2xpYi5vIGx0YWJsaWIubyBcCisJbHN0cmxpYi5vIGxvYWRsaWIubyBsaW5pdC5vCisKK0xVQV9UPQlsdWEKK0xVQV9PPQlsdWEubworCitMVUFDX1Q9CWx1YWMKK0xVQUNfTz0JbHVhYy5vIHByaW50Lm8KKworQUxMX089ICQoQ09SRV9PKSAkKExJQl9PKSAkKExVQV9PKSAkKExVQUNfTykKK0FMTF9UPSAkKExVQV9BKSAkKExVQV9UKSAkKExVQUNfVCkKK0FMTF9BPSAkKExVQV9BKQorCitkZWZhdWx0OiAkKFBMQVQpCisKK2FsbDoJJChBTExfVCkKKworbzoJJChBTExfTykKKworYToJJChBTExfQSkKKworJChMVUFfQSk6ICQoQ09SRV9PKSAkKExJQl9PKQorCSQoQVIpICRAICQ/CisJJChSQU5MSUIpICRACisKKyQoTFVBX1QpOiAkKExVQV9PKSAkKExVQV9BKQorCSQoQ0MpIC1vICRAICQoTVlMREZMQUdTKSAkKExVQV9PKSAkKExVQV9BKSAkKExJQlMpCisKKyQoTFVBQ19UKTogJChMVUFDX08pICQoTFVBX0EpCisJJChDQykgLW8gJEAgJChNWUxERkxBR1MpICQoTFVBQ19PKSAkKExVQV9BKSAkKExJQlMpCisKK2NsZWFuOgorCSQoUk0pICQoQUxMX1QpICQoQUxMX08pCisKK2RlcGVuZDoKKwlAJChDQykgJChDRkxBR1MpIC1NTSBsKi5jIHByaW50LmMKKworZWNobzoKKwlAZWNobyAiUExBVCA9ICQoUExBVCkiCisJQGVjaG8gIkNDID0gJChDQykiCisJQGVjaG8gIkNGTEFHUyA9ICQoQ0ZMQUdTKSIKKwlAZWNobyAiQVIgPSAkKEFSKSIKKwlAZWNobyAiUkFOTElCID0gJChSQU5MSUIpIgorCUBlY2hvICJSTSA9ICQoUk0pIgorCUBlY2hvICJNWUNGTEFHUyA9ICQoTVlDRkxBR1MpIgorCUBlY2hvICJNWUxERkxBR1MgPSAkKE1ZTERGTEFHUykiCisJQGVjaG8gIk1ZTElCUyA9ICQoTVlMSUJTKSIKKworIyBjb252ZW5pZW5jZSB0YXJnZXRzIGZvciBwb3B1bGFyIHBsYXRmb3JtcworCitub25lOgorCUBlY2hvICJQbGVhc2UgY2hvb3NlIGEgcGxhdGZvcm06IgorCUBlY2hvICIgICAkKFBMQVRTKSIKKworYWl4OgorCSQoTUFLRSkgYWxsIENDPSJ4bGMiIENGTEFHUz0iLU8yIC1ETFVBX1VTRV9QT1NJWCAtRExVQV9VU0VfRExPUEVOIiBNWUxJQlM9Ii1sZGwiIE1ZTERGTEFHUz0iLWJydGwgLWJleHBhbGwiCisKK2Fuc2k6CisJJChNQUtFKSBhbGwgTVlDRkxBR1M9LURMVUFfQU5TSQorCitic2Q6CisJJChNQUtFKSBhbGwgTVlDRkxBR1M9Ii1ETFVBX1VTRV9QT1NJWCAtRExVQV9VU0VfRExPUEVOIiBNWUxJQlM9Ii1XbCwtRSIKKworZnJlZWJzZDoKKwkkKE1BS0UpIGFsbCBNWUNGTEFHUz0iLURMVUFfVVNFX0xJTlVYIiBNWUxJQlM9Ii1XbCwtRSAtbHJlYWRsaW5lIgorCitnZW5lcmljOgorCSQoTUFLRSkgYWxsIE1ZQ0ZMQUdTPQorCitsaW51eDoKKwkkKE1BS0UpIGFsbCBNWUNGTEFHUz0tRExVQV9VU0VfTElOVVggTVlMSUJTPSItV2wsLUUgLWxkbCAtbHJlYWRsaW5lIC1saGlzdG9yeSAtbG5jdXJzZXMiCisKK21hY29zeDoKKwkkKE1BS0UpIGFsbCBNWUNGTEFHUz0tRExVQV9VU0VfTElOVVggTVlMSUJTPSItbHJlYWRsaW5lIgorIyB1c2UgdGhpcyBvbiBNYWMgT1MgWCAxMC4zLQorIwkkKE1BS0UpIGFsbCBNWUNGTEFHUz0tRExVQV9VU0VfTUFDT1NYCisKK21pbmd3OgorCSQoTUFLRSkgIkxVQV9BPWx1YTUxLmRsbCIgIkxVQV9UPWx1YS5leGUiIFwKKwkiQVI9JChDQykgLXNoYXJlZCAtbyIgIlJBTkxJQj1zdHJpcCAtLXN0cmlwLXVubmVlZGVkIiBcCisJIk1ZQ0ZMQUdTPS1ETFVBX0JVSUxEX0FTX0RMTCIgIk1ZTElCUz0iICJNWUxERkxBR1M9LXMiIGx1YS5leGUKKwkkKE1BS0UpICJMVUFDX1Q9bHVhYy5leGUiIGx1YWMuZXhlCisKK3Bvc2l4OgorCSQoTUFLRSkgYWxsIE1ZQ0ZMQUdTPS1ETFVBX1VTRV9QT1NJWAorCitzb2xhcmlzOgorCSQoTUFLRSkgYWxsIE1ZQ0ZMQUdTPSItRExVQV9VU0VfUE9TSVggLURMVUFfVVNFX0RMT1BFTiIgTVlMSUJTPSItbGRsIgorCisjIGxpc3QgdGFyZ2V0cyB0aGF0IGRvIG5vdCBjcmVhdGUgZmlsZXMgKGJ1dCBub3QgYWxsIG1ha2VzIHVuZGVyc3RhbmQgLlBIT05ZKQorLlBIT05ZOiBhbGwgJChQTEFUUykgZGVmYXVsdCBvIGEgY2xlYW4gZGVwZW5kIGVjaG8gbm9uZQorCisjIERPIE5PVCBERUxFVEUKKworbGFwaS5vOiBsYXBpLmMgbHVhLmggbHVhY29uZi5oIGxhcGkuaCBsb2JqZWN0LmggbGxpbWl0cy5oIGxkZWJ1Zy5oIFwKKyAgbHN0YXRlLmggbHRtLmggbHppby5oIGxtZW0uaCBsZG8uaCBsZnVuYy5oIGxnYy5oIGxzdHJpbmcuaCBsdGFibGUuaCBcCisgIGx1bmR1bXAuaCBsdm0uaAorbGF1eGxpYi5vOiBsYXV4bGliLmMgbHVhLmggbHVhY29uZi5oIGxhdXhsaWIuaAorbGJhc2VsaWIubzogbGJhc2VsaWIuYyBsdWEuaCBsdWFjb25mLmggbGF1eGxpYi5oIGx1YWxpYi5oCitsY29kZS5vOiBsY29kZS5jIGx1YS5oIGx1YWNvbmYuaCBsY29kZS5oIGxsZXguaCBsb2JqZWN0LmggbGxpbWl0cy5oIFwKKyAgbHppby5oIGxtZW0uaCBsb3Bjb2Rlcy5oIGxwYXJzZXIuaCBsZGVidWcuaCBsc3RhdGUuaCBsdG0uaCBsZG8uaCBsZ2MuaCBcCisgIGx0YWJsZS5oCitsZGJsaWIubzogbGRibGliLmMgbHVhLmggbHVhY29uZi5oIGxhdXhsaWIuaCBsdWFsaWIuaAorbGRlYnVnLm86IGxkZWJ1Zy5jIGx1YS5oIGx1YWNvbmYuaCBsYXBpLmggbG9iamVjdC5oIGxsaW1pdHMuaCBsY29kZS5oIFwKKyAgbGxleC5oIGx6aW8uaCBsbWVtLmggbG9wY29kZXMuaCBscGFyc2VyLmggbGRlYnVnLmggbHN0YXRlLmggbHRtLmggbGRvLmggXAorICBsZnVuYy5oIGxzdHJpbmcuaCBsZ2MuaCBsdGFibGUuaCBsdm0uaAorbGRvLm86IGxkby5jIGx1YS5oIGx1YWNvbmYuaCBsZGVidWcuaCBsc3RhdGUuaCBsb2JqZWN0LmggbGxpbWl0cy5oIGx0bS5oIFwKKyAgbHppby5oIGxtZW0uaCBsZG8uaCBsZnVuYy5oIGxnYy5oIGxvcGNvZGVzLmggbHBhcnNlci5oIGxzdHJpbmcuaCBcCisgIGx0YWJsZS5oIGx1bmR1bXAuaCBsdm0uaAorbGR1bXAubzogbGR1bXAuYyBsdWEuaCBsdWFjb25mLmggbG9iamVjdC5oIGxsaW1pdHMuaCBsc3RhdGUuaCBsdG0uaCBcCisgIGx6aW8uaCBsbWVtLmggbHVuZHVtcC5oCitsZnVuYy5vOiBsZnVuYy5jIGx1YS5oIGx1YWNvbmYuaCBsZnVuYy5oIGxvYmplY3QuaCBsbGltaXRzLmggbGdjLmggbG1lbS5oIFwKKyAgbHN0YXRlLmggbHRtLmggbHppby5oCitsZ2MubzogbGdjLmMgbHVhLmggbHVhY29uZi5oIGxkZWJ1Zy5oIGxzdGF0ZS5oIGxvYmplY3QuaCBsbGltaXRzLmggbHRtLmggXAorICBsemlvLmggbG1lbS5oIGxkby5oIGxmdW5jLmggbGdjLmggbHN0cmluZy5oIGx0YWJsZS5oCitsaW5pdC5vOiBsaW5pdC5jIGx1YS5oIGx1YWNvbmYuaCBsdWFsaWIuaCBsYXV4bGliLmgKK2xpb2xpYi5vOiBsaW9saWIuYyBsdWEuaCBsdWFjb25mLmggbGF1eGxpYi5oIGx1YWxpYi5oCitsbGV4Lm86IGxsZXguYyBsdWEuaCBsdWFjb25mLmggbGRvLmggbG9iamVjdC5oIGxsaW1pdHMuaCBsc3RhdGUuaCBsdG0uaCBcCisgIGx6aW8uaCBsbWVtLmggbGxleC5oIGxwYXJzZXIuaCBsc3RyaW5nLmggbGdjLmggbHRhYmxlLmgKK2xtYXRobGliLm86IGxtYXRobGliLmMgbHVhLmggbHVhY29uZi5oIGxhdXhsaWIuaCBsdWFsaWIuaAorbG1lbS5vOiBsbWVtLmMgbHVhLmggbHVhY29uZi5oIGxkZWJ1Zy5oIGxzdGF0ZS5oIGxvYmplY3QuaCBsbGltaXRzLmggXAorICBsdG0uaCBsemlvLmggbG1lbS5oIGxkby5oCitsb2FkbGliLm86IGxvYWRsaWIuYyBsdWEuaCBsdWFjb25mLmggbGF1eGxpYi5oIGx1YWxpYi5oCitsb2JqZWN0Lm86IGxvYmplY3QuYyBsdWEuaCBsdWFjb25mLmggbGRvLmggbG9iamVjdC5oIGxsaW1pdHMuaCBsc3RhdGUuaCBcCisgIGx0bS5oIGx6aW8uaCBsbWVtLmggbHN0cmluZy5oIGxnYy5oIGx2bS5oCitsb3Bjb2Rlcy5vOiBsb3Bjb2Rlcy5jIGxvcGNvZGVzLmggbGxpbWl0cy5oIGx1YS5oIGx1YWNvbmYuaAorbG9zbGliLm86IGxvc2xpYi5jIGx1YS5oIGx1YWNvbmYuaCBsYXV4bGliLmggbHVhbGliLmgKK2xwYXJzZXIubzogbHBhcnNlci5jIGx1YS5oIGx1YWNvbmYuaCBsY29kZS5oIGxsZXguaCBsb2JqZWN0LmggbGxpbWl0cy5oIFwKKyAgbHppby5oIGxtZW0uaCBsb3Bjb2Rlcy5oIGxwYXJzZXIuaCBsZGVidWcuaCBsc3RhdGUuaCBsdG0uaCBsZG8uaCBcCisgIGxmdW5jLmggbHN0cmluZy5oIGxnYy5oIGx0YWJsZS5oCitsc3RhdGUubzogbHN0YXRlLmMgbHVhLmggbHVhY29uZi5oIGxkZWJ1Zy5oIGxzdGF0ZS5oIGxvYmplY3QuaCBsbGltaXRzLmggXAorICBsdG0uaCBsemlvLmggbG1lbS5oIGxkby5oIGxmdW5jLmggbGdjLmggbGxleC5oIGxzdHJpbmcuaCBsdGFibGUuaAorbHN0cmluZy5vOiBsc3RyaW5nLmMgbHVhLmggbHVhY29uZi5oIGxtZW0uaCBsbGltaXRzLmggbG9iamVjdC5oIGxzdGF0ZS5oIFwKKyAgbHRtLmggbHppby5oIGxzdHJpbmcuaCBsZ2MuaAorbHN0cmxpYi5vOiBsc3RybGliLmMgbHVhLmggbHVhY29uZi5oIGxhdXhsaWIuaCBsdWFsaWIuaAorbHRhYmxlLm86IGx0YWJsZS5jIGx1YS5oIGx1YWNvbmYuaCBsZGVidWcuaCBsc3RhdGUuaCBsb2JqZWN0LmggbGxpbWl0cy5oIFwKKyAgbHRtLmggbHppby5oIGxtZW0uaCBsZG8uaCBsZ2MuaCBsdGFibGUuaAorbHRhYmxpYi5vOiBsdGFibGliLmMgbHVhLmggbHVhY29uZi5oIGxhdXhsaWIuaCBsdWFsaWIuaAorbHRtLm86IGx0bS5jIGx1YS5oIGx1YWNvbmYuaCBsb2JqZWN0LmggbGxpbWl0cy5oIGxzdGF0ZS5oIGx0bS5oIGx6aW8uaCBcCisgIGxtZW0uaCBsc3RyaW5nLmggbGdjLmggbHRhYmxlLmgKK2x1YS5vOiBsdWEuYyBsdWEuaCBsdWFjb25mLmggbGF1eGxpYi5oIGx1YWxpYi5oCitsdWFjLm86IGx1YWMuYyBsdWEuaCBsdWFjb25mLmggbGF1eGxpYi5oIGxkby5oIGxvYmplY3QuaCBsbGltaXRzLmggXAorICBsc3RhdGUuaCBsdG0uaCBsemlvLmggbG1lbS5oIGxmdW5jLmggbG9wY29kZXMuaCBsc3RyaW5nLmggbGdjLmggXAorICBsdW5kdW1wLmgKK2x1bmR1bXAubzogbHVuZHVtcC5jIGx1YS5oIGx1YWNvbmYuaCBsZGVidWcuaCBsc3RhdGUuaCBsb2JqZWN0LmggXAorICBsbGltaXRzLmggbHRtLmggbHppby5oIGxtZW0uaCBsZG8uaCBsZnVuYy5oIGxzdHJpbmcuaCBsZ2MuaCBsdW5kdW1wLmgKK2x2bS5vOiBsdm0uYyBsdWEuaCBsdWFjb25mLmggbGRlYnVnLmggbHN0YXRlLmggbG9iamVjdC5oIGxsaW1pdHMuaCBsdG0uaCBcCisgIGx6aW8uaCBsbWVtLmggbGRvLmggbGZ1bmMuaCBsZ2MuaCBsb3Bjb2Rlcy5oIGxzdHJpbmcuaCBsdGFibGUuaCBsdm0uaAorbHppby5vOiBsemlvLmMgbHVhLmggbHVhY29uZi5oIGxsaW1pdHMuaCBsbWVtLmggbHN0YXRlLmggbG9iamVjdC5oIGx0bS5oIFwKKyAgbHppby5oCitwcmludC5vOiBwcmludC5jIGxkZWJ1Zy5oIGxzdGF0ZS5oIGx1YS5oIGx1YWNvbmYuaCBsb2JqZWN0LmggbGxpbWl0cy5oIFwKKyAgbHRtLmggbHppby5oIGxtZW0uaCBsb3Bjb2Rlcy5oIGx1bmR1bXAuaAorCisjIChlbmQgb2YgTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xhcGkuYyBiL2x1YS01LjEuNC9zcmMvbGFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTE0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xhcGkuYwpAQCAtMCwwICsxLDEwODcgQEAKKy8qCisqKiAkSWQ6IGxhcGkuYyx2IDIuNTUuMS41IDIwMDgvMDcvMDQgMTg6NDE6MTggcm9iZXJ0byBFeHAgJAorKiogTHVhIEFQSQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsYXBpX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGFwaS5oIgorI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxmdW5jLmgiCisjaW5jbHVkZSAibGdjLmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisjaW5jbHVkZSAibHRtLmgiCisjaW5jbHVkZSAibHVuZHVtcC5oIgorI2luY2x1ZGUgImx2bS5oIgorCisKKworY29uc3QgY2hhciBsdWFfaWRlbnRbXSA9CisgICIkTHVhOiAiIExVQV9SRUxFQVNFICIgIiBMVUFfQ09QWVJJR0hUICIgJFxuIgorICAiJEF1dGhvcnM6ICIgTFVBX0FVVEhPUlMgIiAkXG4iCisgICIkVVJMOiB3d3cubHVhLm9yZyAkXG4iOworCisKKworI2RlZmluZSBhcGlfY2hlY2tuZWxlbXMoTCwgbikJYXBpX2NoZWNrKEwsIChuKSA8PSAoTC0+dG9wIC0gTC0+YmFzZSkpCisKKyNkZWZpbmUgYXBpX2NoZWNrdmFsaWRpbmRleChMLCBpKQlhcGlfY2hlY2soTCwgKGkpICE9IGx1YU9fbmlsb2JqZWN0KQorCisjZGVmaW5lIGFwaV9pbmNyX3RvcChMKSAgIHthcGlfY2hlY2soTCwgTC0+dG9wIDwgTC0+Y2ktPnRvcCk7IEwtPnRvcCsrO30KKworCisKK3N0YXRpYyBUVmFsdWUgKmluZGV4MmFkciAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIGlmIChpZHggPiAwKSB7CisgICAgVFZhbHVlICpvID0gTC0+YmFzZSArIChpZHggLSAxKTsKKyAgICBhcGlfY2hlY2soTCwgaWR4IDw9IEwtPmNpLT50b3AgLSBMLT5iYXNlKTsKKyAgICBpZiAobyA+PSBMLT50b3ApIHJldHVybiBjYXN0KFRWYWx1ZSAqLCBsdWFPX25pbG9iamVjdCk7CisgICAgZWxzZSByZXR1cm4gbzsKKyAgfQorICBlbHNlIGlmIChpZHggPiBMVUFfUkVHSVNUUllJTkRFWCkgeworICAgIGFwaV9jaGVjayhMLCBpZHggIT0gMCAmJiAtaWR4IDw9IEwtPnRvcCAtIEwtPmJhc2UpOworICAgIHJldHVybiBMLT50b3AgKyBpZHg7CisgIH0KKyAgZWxzZSBzd2l0Y2ggKGlkeCkgeyAgLyogcHNldWRvLWluZGljZXMgKi8KKyAgICBjYXNlIExVQV9SRUdJU1RSWUlOREVYOiByZXR1cm4gcmVnaXN0cnkoTCk7CisgICAgY2FzZSBMVUFfRU5WSVJPTklOREVYOiB7CisgICAgICBDbG9zdXJlICpmdW5jID0gY3Vycl9mdW5jKEwpOworICAgICAgc2V0aHZhbHVlKEwsICZMLT5lbnYsIGZ1bmMtPmMuZW52KTsKKyAgICAgIHJldHVybiAmTC0+ZW52OworICAgIH0KKyAgICBjYXNlIExVQV9HTE9CQUxTSU5ERVg6IHJldHVybiBndChMKTsKKyAgICBkZWZhdWx0OiB7CisgICAgICBDbG9zdXJlICpmdW5jID0gY3Vycl9mdW5jKEwpOworICAgICAgaWR4ID0gTFVBX0dMT0JBTFNJTkRFWCAtIGlkeDsKKyAgICAgIHJldHVybiAoaWR4IDw9IGZ1bmMtPmMubnVwdmFsdWVzKQorICAgICAgICAgICAgICAgID8gJmZ1bmMtPmMudXB2YWx1ZVtpZHgtMV0KKyAgICAgICAgICAgICAgICA6IGNhc3QoVFZhbHVlICosIGx1YU9fbmlsb2JqZWN0KTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgVGFibGUgKmdldGN1cnJlbnYgKGx1YV9TdGF0ZSAqTCkgeworICBpZiAoTC0+Y2kgPT0gTC0+YmFzZV9jaSkgIC8qIG5vIGVuY2xvc2luZyBmdW5jdGlvbj8gKi8KKyAgICByZXR1cm4gaHZhbHVlKGd0KEwpKTsgIC8qIHVzZSBnbG9iYWwgdGFibGUgYXMgZW52aXJvbm1lbnQgKi8KKyAgZWxzZSB7CisgICAgQ2xvc3VyZSAqZnVuYyA9IGN1cnJfZnVuYyhMKTsKKyAgICByZXR1cm4gZnVuYy0+Yy5lbnY7CisgIH0KK30KKworCit2b2lkIGx1YUFfcHVzaG9iamVjdCAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKm8pIHsKKyAgc2V0b2JqMnMoTCwgTC0+dG9wLCBvKTsKKyAgYXBpX2luY3JfdG9wKEwpOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9jaGVja3N0YWNrIChsdWFfU3RhdGUgKkwsIGludCBzaXplKSB7CisgIGludCByZXMgPSAxOworICBsdWFfbG9jayhMKTsKKyAgaWYgKHNpemUgPiBMVUFJX01BWENTVEFDSyB8fCAoTC0+dG9wIC0gTC0+YmFzZSArIHNpemUpID4gTFVBSV9NQVhDU1RBQ0spCisgICAgcmVzID0gMDsgIC8qIHN0YWNrIG92ZXJmbG93ICovCisgIGVsc2UgaWYgKHNpemUgPiAwKSB7CisgICAgbHVhRF9jaGVja3N0YWNrKEwsIHNpemUpOworICAgIGlmIChMLT5jaS0+dG9wIDwgTC0+dG9wICsgc2l6ZSkKKyAgICAgIEwtPmNpLT50b3AgPSBMLT50b3AgKyBzaXplOworICB9CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiByZXM7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV94bW92ZSAobHVhX1N0YXRlICpmcm9tLCBsdWFfU3RhdGUgKnRvLCBpbnQgbikgeworICBpbnQgaTsKKyAgaWYgKGZyb20gPT0gdG8pIHJldHVybjsKKyAgbHVhX2xvY2sodG8pOworICBhcGlfY2hlY2tuZWxlbXMoZnJvbSwgbik7CisgIGFwaV9jaGVjayhmcm9tLCBHKGZyb20pID09IEcodG8pKTsKKyAgYXBpX2NoZWNrKGZyb20sIHRvLT5jaS0+dG9wIC0gdG8tPnRvcCA+PSBuKTsKKyAgZnJvbS0+dG9wIC09IG47CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBzZXRvYmoycyh0bywgdG8tPnRvcCsrLCBmcm9tLT50b3AgKyBpKTsKKyAgfQorICBsdWFfdW5sb2NrKHRvKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3NldGxldmVsIChsdWFfU3RhdGUgKmZyb20sIGx1YV9TdGF0ZSAqdG8pIHsKKyAgdG8tPm5DY2FsbHMgPSBmcm9tLT5uQ2NhbGxzOworfQorCisKK0xVQV9BUEkgbHVhX0NGdW5jdGlvbiBsdWFfYXRwYW5pYyAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIHBhbmljZikgeworICBsdWFfQ0Z1bmN0aW9uIG9sZDsKKyAgbHVhX2xvY2soTCk7CisgIG9sZCA9IEcoTCktPnBhbmljOworICBHKEwpLT5wYW5pYyA9IHBhbmljZjsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIG9sZDsKK30KKworCitMVUFfQVBJIGx1YV9TdGF0ZSAqbHVhX25ld3RocmVhZCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9TdGF0ZSAqTDE7CisgIGx1YV9sb2NrKEwpOworICBsdWFDX2NoZWNrR0MoTCk7CisgIEwxID0gbHVhRV9uZXd0aHJlYWQoTCk7CisgIHNldHRodmFsdWUoTCwgTC0+dG9wLCBMMSk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgbHVhaV91c2Vyc3RhdGV0aHJlYWQoTCwgTDEpOworICByZXR1cm4gTDE7Cit9CisKKworCisvKgorKiogYmFzaWMgc3RhY2sgbWFuaXB1bGF0aW9uCisqLworCisKK0xVQV9BUEkgaW50IGx1YV9nZXR0b3AgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gY2FzdF9pbnQoTC0+dG9wIC0gTC0+YmFzZSk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9zZXR0b3AgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBsdWFfbG9jayhMKTsKKyAgaWYgKGlkeCA+PSAwKSB7CisgICAgYXBpX2NoZWNrKEwsIGlkeCA8PSBMLT5zdGFja19sYXN0IC0gTC0+YmFzZSk7CisgICAgd2hpbGUgKEwtPnRvcCA8IEwtPmJhc2UgKyBpZHgpCisgICAgICBzZXRuaWx2YWx1ZShMLT50b3ArKyk7CisgICAgTC0+dG9wID0gTC0+YmFzZSArIGlkeDsKKyAgfQorICBlbHNlIHsKKyAgICBhcGlfY2hlY2soTCwgLShpZHgrMSkgPD0gKEwtPnRvcCAtIEwtPmJhc2UpKTsKKyAgICBMLT50b3AgKz0gaWR4KzE7ICAvKiBgc3VidHJhY3QnIGluZGV4IChpbmRleCBpcyBuZWdhdGl2ZSkgKi8KKyAgfQorICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcmVtb3ZlIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgcDsKKyAgbHVhX2xvY2soTCk7CisgIHAgPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgYXBpX2NoZWNrdmFsaWRpbmRleChMLCBwKTsKKyAgd2hpbGUgKCsrcCA8IEwtPnRvcCkgc2V0b2JqczJzKEwsIHAtMSwgcCk7CisgIEwtPnRvcC0tOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfaW5zZXJ0IChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgcDsKKyAgU3RrSWQgcTsKKyAgbHVhX2xvY2soTCk7CisgIHAgPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgYXBpX2NoZWNrdmFsaWRpbmRleChMLCBwKTsKKyAgZm9yIChxID0gTC0+dG9wOyBxPnA7IHEtLSkgc2V0b2JqczJzKEwsIHEsIHEtMSk7CisgIHNldG9ianMycyhMLCBwLCBMLT50b3ApOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcmVwbGFjZSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG87CisgIGx1YV9sb2NrKEwpOworICAvKiBleHBsaWNpdCB0ZXN0IGZvciBpbmNvbXBhdGlibGUgY29kZSAqLworICBpZiAoaWR4ID09IExVQV9FTlZJUk9OSU5ERVggJiYgTC0+Y2kgPT0gTC0+YmFzZV9jaSkKKyAgICBsdWFHX3J1bmVycm9yKEwsICJubyBjYWxsaW5nIGVudmlyb25tZW50Iik7CisgIGFwaV9jaGVja25lbGVtcyhMLCAxKTsKKyAgbyA9IGluZGV4MmFkcihMLCBpZHgpOworICBhcGlfY2hlY2t2YWxpZGluZGV4KEwsIG8pOworICBpZiAoaWR4ID09IExVQV9FTlZJUk9OSU5ERVgpIHsKKyAgICBDbG9zdXJlICpmdW5jID0gY3Vycl9mdW5jKEwpOworICAgIGFwaV9jaGVjayhMLCB0dGlzdGFibGUoTC0+dG9wIC0gMSkpOyAKKyAgICBmdW5jLT5jLmVudiA9IGh2YWx1ZShMLT50b3AgLSAxKTsKKyAgICBsdWFDX2JhcnJpZXIoTCwgZnVuYywgTC0+dG9wIC0gMSk7CisgIH0KKyAgZWxzZSB7CisgICAgc2V0b2JqKEwsIG8sIEwtPnRvcCAtIDEpOworICAgIGlmIChpZHggPCBMVUFfR0xPQkFMU0lOREVYKSAgLyogZnVuY3Rpb24gdXB2YWx1ZT8gKi8KKyAgICAgIGx1YUNfYmFycmllcihMLCBjdXJyX2Z1bmMoTCksIEwtPnRvcCAtIDEpOworICB9CisgIEwtPnRvcC0tOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcHVzaHZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgbHVhX2xvY2soTCk7CisgIHNldG9iajJzKEwsIEwtPnRvcCwgaW5kZXgyYWRyKEwsIGlkeCkpOworICBhcGlfaW5jcl90b3AoTCk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworCisvKgorKiogYWNjZXNzIGZ1bmN0aW9ucyAoc3RhY2sgLT4gQykKKyovCisKKworTFVBX0FQSSBpbnQgbHVhX3R5cGUgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvID0gaW5kZXgyYWRyKEwsIGlkeCk7CisgIHJldHVybiAobyA9PSBsdWFPX25pbG9iamVjdCkgPyBMVUFfVE5PTkUgOiB0dHlwZShvKTsKK30KKworCitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV90eXBlbmFtZSAobHVhX1N0YXRlICpMLCBpbnQgdCkgeworICBVTlVTRUQoTCk7CisgIHJldHVybiAodCA9PSBMVUFfVE5PTkUpID8gIm5vIHZhbHVlIiA6IGx1YVRfdHlwZW5hbWVzW3RdOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9pc2NmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgcmV0dXJuIGlzY2Z1bmN0aW9uKG8pOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9pc251bWJlciAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFRWYWx1ZSBuOworICBjb25zdCBUVmFsdWUgKm8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgcmV0dXJuIHRvbnVtYmVyKG8sICZuKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfaXNzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBpbnQgdCA9IGx1YV90eXBlKEwsIGlkeCk7CisgIHJldHVybiAodCA9PSBMVUFfVFNUUklORyB8fCB0ID09IExVQV9UTlVNQkVSKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfaXN1c2VyZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIGNvbnN0IFRWYWx1ZSAqbyA9IGluZGV4MmFkcihMLCBpZHgpOworICByZXR1cm4gKHR0aXN1c2VyZGF0YShvKSB8fCB0dGlzbGlnaHR1c2VyZGF0YShvKSk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX3Jhd2VxdWFsIChsdWFfU3RhdGUgKkwsIGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgU3RrSWQgbzEgPSBpbmRleDJhZHIoTCwgaW5kZXgxKTsKKyAgU3RrSWQgbzIgPSBpbmRleDJhZHIoTCwgaW5kZXgyKTsKKyAgcmV0dXJuIChvMSA9PSBsdWFPX25pbG9iamVjdCB8fCBvMiA9PSBsdWFPX25pbG9iamVjdCkgPyAwCisgICAgICAgICA6IGx1YU9fcmF3ZXF1YWxPYmoobzEsIG8yKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfZXF1YWwgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4MSwgaW50IGluZGV4MikgeworICBTdGtJZCBvMSwgbzI7CisgIGludCBpOworICBsdWFfbG9jayhMKTsgIC8qIG1heSBjYWxsIHRhZyBtZXRob2QgKi8KKyAgbzEgPSBpbmRleDJhZHIoTCwgaW5kZXgxKTsKKyAgbzIgPSBpbmRleDJhZHIoTCwgaW5kZXgyKTsKKyAgaSA9IChvMSA9PSBsdWFPX25pbG9iamVjdCB8fCBvMiA9PSBsdWFPX25pbG9iamVjdCkgPyAwIDogZXF1YWxvYmooTCwgbzEsIG8yKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIGk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2xlc3N0aGFuIChsdWFfU3RhdGUgKkwsIGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgU3RrSWQgbzEsIG8yOworICBpbnQgaTsKKyAgbHVhX2xvY2soTCk7ICAvKiBtYXkgY2FsbCB0YWcgbWV0aG9kICovCisgIG8xID0gaW5kZXgyYWRyKEwsIGluZGV4MSk7CisgIG8yID0gaW5kZXgyYWRyKEwsIGluZGV4Mik7CisgIGkgPSAobzEgPT0gbHVhT19uaWxvYmplY3QgfHwgbzIgPT0gbHVhT19uaWxvYmplY3QpID8gMAorICAgICAgIDogbHVhVl9sZXNzdGhhbihMLCBvMSwgbzIpOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gaTsKK30KKworCisKK0xVQV9BUEkgbHVhX051bWJlciBsdWFfdG9udW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBUVmFsdWUgbjsKKyAgY29uc3QgVFZhbHVlICpvID0gaW5kZXgyYWRyKEwsIGlkeCk7CisgIGlmICh0b251bWJlcihvLCAmbikpCisgICAgcmV0dXJuIG52YWx1ZShvKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisKK0xVQV9BUEkgbHVhX0ludGVnZXIgbHVhX3RvaW50ZWdlciAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFRWYWx1ZSBuOworICBjb25zdCBUVmFsdWUgKm8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgaWYgKHRvbnVtYmVyKG8sICZuKSkgeworICAgIGx1YV9JbnRlZ2VyIHJlczsKKyAgICBsdWFfTnVtYmVyIG51bSA9IG52YWx1ZShvKTsKKyAgICBsdWFfbnVtYmVyMmludGVnZXIocmVzLCBudW0pOworICAgIHJldHVybiByZXM7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisKK0xVQV9BUEkgaW50IGx1YV90b2Jvb2xlYW4gKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBjb25zdCBUVmFsdWUgKm8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgcmV0dXJuICFsX2lzZmFsc2Uobyk7Cit9CisKKworTFVBX0FQSSBjb25zdCBjaGFyICpsdWFfdG9sc3RyaW5nIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIHNpemVfdCAqbGVuKSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgaWYgKCF0dGlzc3RyaW5nKG8pKSB7CisgICAgbHVhX2xvY2soTCk7ICAvKiBgbHVhVl90b3N0cmluZycgbWF5IGNyZWF0ZSBhIG5ldyBzdHJpbmcgKi8KKyAgICBpZiAoIWx1YVZfdG9zdHJpbmcoTCwgbykpIHsgIC8qIGNvbnZlcnNpb24gZmFpbGVkPyAqLworICAgICAgaWYgKGxlbiAhPSBOVUxMKSAqbGVuID0gMDsKKyAgICAgIGx1YV91bmxvY2soTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbHVhQ19jaGVja0dDKEwpOworICAgIG8gPSBpbmRleDJhZHIoTCwgaWR4KTsgIC8qIHByZXZpb3VzIGNhbGwgbWF5IHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCisgICAgbHVhX3VubG9jayhMKTsKKyAgfQorICBpZiAobGVuICE9IE5VTEwpICpsZW4gPSB0c3ZhbHVlKG8pLT5sZW47CisgIHJldHVybiBzdmFsdWUobyk7Cit9CisKKworTFVBX0FQSSBzaXplX3QgbHVhX29iamxlbiAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgc3dpdGNoICh0dHlwZShvKSkgeworICAgIGNhc2UgTFVBX1RTVFJJTkc6IHJldHVybiB0c3ZhbHVlKG8pLT5sZW47CisgICAgY2FzZSBMVUFfVFVTRVJEQVRBOiByZXR1cm4gdXZhbHVlKG8pLT5sZW47CisgICAgY2FzZSBMVUFfVFRBQkxFOiByZXR1cm4gbHVhSF9nZXRuKGh2YWx1ZShvKSk7CisgICAgY2FzZSBMVUFfVE5VTUJFUjogeworICAgICAgc2l6ZV90IGw7CisgICAgICBsdWFfbG9jayhMKTsgIC8qIGBsdWFWX3Rvc3RyaW5nJyBtYXkgY3JlYXRlIGEgbmV3IHN0cmluZyAqLworICAgICAgbCA9IChsdWFWX3Rvc3RyaW5nKEwsIG8pID8gdHN2YWx1ZShvKS0+bGVuIDogMCk7CisgICAgICBsdWFfdW5sb2NrKEwpOworICAgICAgcmV0dXJuIGw7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9Cit9CisKKworTFVBX0FQSSBsdWFfQ0Z1bmN0aW9uIGx1YV90b2NmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgcmV0dXJuICghaXNjZnVuY3Rpb24obykpID8gTlVMTCA6IGNsdmFsdWUobyktPmMuZjsKK30KKworCitMVUFfQVBJIHZvaWQgKmx1YV90b3VzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgbyA9IGluZGV4MmFkcihMLCBpZHgpOworICBzd2l0Y2ggKHR0eXBlKG8pKSB7CisgICAgY2FzZSBMVUFfVFVTRVJEQVRBOiByZXR1cm4gKHJhd3V2YWx1ZShvKSArIDEpOworICAgIGNhc2UgTFVBX1RMSUdIVFVTRVJEQVRBOiByZXR1cm4gcHZhbHVlKG8pOworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOworICB9Cit9CisKKworTFVBX0FQSSBsdWFfU3RhdGUgKmx1YV90b3RocmVhZCAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgcmV0dXJuICghdHRpc3RocmVhZChvKSkgPyBOVUxMIDogdGh2YWx1ZShvKTsKK30KKworCitMVUFfQVBJIGNvbnN0IHZvaWQgKmx1YV90b3BvaW50ZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvID0gaW5kZXgyYWRyKEwsIGlkeCk7CisgIHN3aXRjaCAodHR5cGUobykpIHsKKyAgICBjYXNlIExVQV9UVEFCTEU6IHJldHVybiBodmFsdWUobyk7CisgICAgY2FzZSBMVUFfVEZVTkNUSU9OOiByZXR1cm4gY2x2YWx1ZShvKTsKKyAgICBjYXNlIExVQV9UVEhSRUFEOiByZXR1cm4gdGh2YWx1ZShvKTsKKyAgICBjYXNlIExVQV9UVVNFUkRBVEE6CisgICAgY2FzZSBMVUFfVExJR0hUVVNFUkRBVEE6CisgICAgICByZXR1cm4gbHVhX3RvdXNlcmRhdGEoTCwgaWR4KTsKKyAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgfQorfQorCisKKworLyoKKyoqIHB1c2ggZnVuY3Rpb25zIChDIC0+IHN0YWNrKQorKi8KKworCitMVUFfQVBJIHZvaWQgbHVhX3B1c2huaWwgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfbG9jayhMKTsKKyAgc2V0bmlsdmFsdWUoTC0+dG9wKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcHVzaG51bWJlciAobHVhX1N0YXRlICpMLCBsdWFfTnVtYmVyIG4pIHsKKyAgbHVhX2xvY2soTCk7CisgIHNldG52YWx1ZShMLT50b3AsIG4pOworICBhcGlfaW5jcl90b3AoTCk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9wdXNoaW50ZWdlciAobHVhX1N0YXRlICpMLCBsdWFfSW50ZWdlciBuKSB7CisgIGx1YV9sb2NrKEwpOworICBzZXRudmFsdWUoTC0+dG9wLCBjYXN0X251bShuKSk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3B1c2hsc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pIHsKKyAgbHVhX2xvY2soTCk7CisgIGx1YUNfY2hlY2tHQyhMKTsKKyAgc2V0c3ZhbHVlMnMoTCwgTC0+dG9wLCBsdWFTX25ld2xzdHIoTCwgcywgbGVuKSk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3B1c2hzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcykgeworICBpZiAocyA9PSBOVUxMKQorICAgIGx1YV9wdXNobmlsKEwpOworICBlbHNlCisgICAgbHVhX3B1c2hsc3RyaW5nKEwsIHMsIHN0cmxlbihzKSk7Cit9CisKKworTFVBX0FQSSBjb25zdCBjaGFyICpsdWFfcHVzaHZmc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdwKSB7CisgIGNvbnN0IGNoYXIgKnJldDsKKyAgbHVhX2xvY2soTCk7CisgIGx1YUNfY2hlY2tHQyhMKTsKKyAgcmV0ID0gbHVhT19wdXNodmZzdHJpbmcoTCwgZm10LCBhcmdwKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIHJldDsKK30KKworCitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV9wdXNoZnN0cmluZyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworICBjb25zdCBjaGFyICpyZXQ7CisgIHZhX2xpc3QgYXJncDsKKyAgbHVhX2xvY2soTCk7CisgIGx1YUNfY2hlY2tHQyhMKTsKKyAgdmFfc3RhcnQoYXJncCwgZm10KTsKKyAgcmV0ID0gbHVhT19wdXNodmZzdHJpbmcoTCwgZm10LCBhcmdwKTsKKyAgdmFfZW5kKGFyZ3ApOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gcmV0OworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcHVzaGNjbG9zdXJlIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gZm4sIGludCBuKSB7CisgIENsb3N1cmUgKmNsOworICBsdWFfbG9jayhMKTsKKyAgbHVhQ19jaGVja0dDKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgbik7CisgIGNsID0gbHVhRl9uZXdDY2xvc3VyZShMLCBuLCBnZXRjdXJyZW52KEwpKTsKKyAgY2wtPmMuZiA9IGZuOworICBMLT50b3AgLT0gbjsKKyAgd2hpbGUgKG4tLSkKKyAgICBzZXRvYmoybihMLCAmY2wtPmMudXB2YWx1ZVtuXSwgTC0+dG9wK24pOworICBzZXRjbHZhbHVlKEwsIEwtPnRvcCwgY2wpOworICBsdWFfYXNzZXJ0KGlzd2hpdGUob2JqMmdjbyhjbCkpKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcHVzaGJvb2xlYW4gKGx1YV9TdGF0ZSAqTCwgaW50IGIpIHsKKyAgbHVhX2xvY2soTCk7CisgIHNldGJ2YWx1ZShMLT50b3AsIChiICE9IDApKTsgIC8qIGVuc3VyZSB0aGF0IHRydWUgaXMgMSAqLworICBhcGlfaW5jcl90b3AoTCk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9wdXNobGlnaHR1c2VyZGF0YSAobHVhX1N0YXRlICpMLCB2b2lkICpwKSB7CisgIGx1YV9sb2NrKEwpOworICBzZXRwdmFsdWUoTC0+dG9wLCBwKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9wdXNodGhyZWFkIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX2xvY2soTCk7CisgIHNldHRodmFsdWUoTCwgTC0+dG9wLCBMKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gKEcoTCktPm1haW50aHJlYWQgPT0gTCk7Cit9CisKKworCisvKgorKiogZ2V0IGZ1bmN0aW9ucyAoTHVhIC0+IHN0YWNrKQorKi8KKworCitMVUFfQVBJIHZvaWQgbHVhX2dldHRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgdDsKKyAgbHVhX2xvY2soTCk7CisgIHQgPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgYXBpX2NoZWNrdmFsaWRpbmRleChMLCB0KTsKKyAgbHVhVl9nZXR0YWJsZShMLCB0LCBMLT50b3AgLSAxLCBMLT50b3AgLSAxKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX2dldGZpZWxkIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGNvbnN0IGNoYXIgKmspIHsKKyAgU3RrSWQgdDsKKyAgVFZhbHVlIGtleTsKKyAgbHVhX2xvY2soTCk7CisgIHQgPSBpbmRleDJhZHIoTCwgaWR4KTsKKyAgYXBpX2NoZWNrdmFsaWRpbmRleChMLCB0KTsKKyAgc2V0c3ZhbHVlKEwsICZrZXksIGx1YVNfbmV3KEwsIGspKTsKKyAgbHVhVl9nZXR0YWJsZShMLCB0LCAma2V5LCBMLT50b3ApOworICBhcGlfaW5jcl90b3AoTCk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9yYXdnZXQgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCB0OworICBsdWFfbG9jayhMKTsKKyAgdCA9IGluZGV4MmFkcihMLCBpZHgpOworICBhcGlfY2hlY2soTCwgdHRpc3RhYmxlKHQpKTsKKyAgc2V0b2JqMnMoTCwgTC0+dG9wIC0gMSwgbHVhSF9nZXQoaHZhbHVlKHQpLCBMLT50b3AgLSAxKSk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9yYXdnZXRpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCBuKSB7CisgIFN0a0lkIG87CisgIGx1YV9sb2NrKEwpOworICBvID0gaW5kZXgyYWRyKEwsIGlkeCk7CisgIGFwaV9jaGVjayhMLCB0dGlzdGFibGUobykpOworICBzZXRvYmoycyhMLCBMLT50b3AsIGx1YUhfZ2V0bnVtKGh2YWx1ZShvKSwgbikpOworICBhcGlfaW5jcl90b3AoTCk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9jcmVhdGV0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgbmFycmF5LCBpbnQgbnJlYykgeworICBsdWFfbG9jayhMKTsKKyAgbHVhQ19jaGVja0dDKEwpOworICBzZXRodmFsdWUoTCwgTC0+dG9wLCBsdWFIX25ldyhMLCBuYXJyYXksIG5yZWMpKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9nZXRtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IG9iamluZGV4KSB7CisgIGNvbnN0IFRWYWx1ZSAqb2JqOworICBUYWJsZSAqbXQgPSBOVUxMOworICBpbnQgcmVzOworICBsdWFfbG9jayhMKTsKKyAgb2JqID0gaW5kZXgyYWRyKEwsIG9iamluZGV4KTsKKyAgc3dpdGNoICh0dHlwZShvYmopKSB7CisgICAgY2FzZSBMVUFfVFRBQkxFOgorICAgICAgbXQgPSBodmFsdWUob2JqKS0+bWV0YXRhYmxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMVUFfVFVTRVJEQVRBOgorICAgICAgbXQgPSB1dmFsdWUob2JqKS0+bWV0YXRhYmxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG10ID0gRyhMKS0+bXRbdHR5cGUob2JqKV07CisgICAgICBicmVhazsKKyAgfQorICBpZiAobXQgPT0gTlVMTCkKKyAgICByZXMgPSAwOworICBlbHNlIHsKKyAgICBzZXRodmFsdWUoTCwgTC0+dG9wLCBtdCk7CisgICAgYXBpX2luY3JfdG9wKEwpOworICAgIHJlcyA9IDE7CisgIH0KKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX2dldGZlbnYgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvOworICBsdWFfbG9jayhMKTsKKyAgbyA9IGluZGV4MmFkcihMLCBpZHgpOworICBhcGlfY2hlY2t2YWxpZGluZGV4KEwsIG8pOworICBzd2l0Y2ggKHR0eXBlKG8pKSB7CisgICAgY2FzZSBMVUFfVEZVTkNUSU9OOgorICAgICAgc2V0aHZhbHVlKEwsIEwtPnRvcCwgY2x2YWx1ZShvKS0+Yy5lbnYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMVUFfVFVTRVJEQVRBOgorICAgICAgc2V0aHZhbHVlKEwsIEwtPnRvcCwgdXZhbHVlKG8pLT5lbnYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMVUFfVFRIUkVBRDoKKyAgICAgIHNldG9iajJzKEwsIEwtPnRvcCwgIGd0KHRodmFsdWUobykpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzZXRuaWx2YWx1ZShMLT50b3ApOworICAgICAgYnJlYWs7CisgIH0KKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKKy8qCisqKiBzZXQgZnVuY3Rpb25zIChzdGFjayAtPiBMdWEpCisqLworCisKK0xVQV9BUEkgdm9pZCBsdWFfc2V0dGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCB0OworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDIpOworICB0ID0gaW5kZXgyYWRyKEwsIGlkeCk7CisgIGFwaV9jaGVja3ZhbGlkaW5kZXgoTCwgdCk7CisgIGx1YVZfc2V0dGFibGUoTCwgdCwgTC0+dG9wIC0gMiwgTC0+dG9wIC0gMSk7CisgIEwtPnRvcCAtPSAyOyAgLyogcG9wIGluZGV4IGFuZCB2YWx1ZSAqLworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfc2V0ZmllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgY29uc3QgY2hhciAqaykgeworICBTdGtJZCB0OworICBUVmFsdWUga2V5OworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDEpOworICB0ID0gaW5kZXgyYWRyKEwsIGlkeCk7CisgIGFwaV9jaGVja3ZhbGlkaW5kZXgoTCwgdCk7CisgIHNldHN2YWx1ZShMLCAma2V5LCBsdWFTX25ldyhMLCBrKSk7CisgIGx1YVZfc2V0dGFibGUoTCwgdCwgJmtleSwgTC0+dG9wIC0gMSk7CisgIEwtPnRvcC0tOyAgLyogcG9wIHZhbHVlICovCisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9yYXdzZXQgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCB0OworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDIpOworICB0ID0gaW5kZXgyYWRyKEwsIGlkeCk7CisgIGFwaV9jaGVjayhMLCB0dGlzdGFibGUodCkpOworICBzZXRvYmoydChMLCBsdWFIX3NldChMLCBodmFsdWUodCksIEwtPnRvcC0yKSwgTC0+dG9wLTEpOworICBsdWFDX2JhcnJpZXJ0KEwsIGh2YWx1ZSh0KSwgTC0+dG9wLTEpOworICBMLT50b3AgLT0gMjsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3Jhd3NldGkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgaW50IG4pIHsKKyAgU3RrSWQgbzsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCAxKTsKKyAgbyA9IGluZGV4MmFkcihMLCBpZHgpOworICBhcGlfY2hlY2soTCwgdHRpc3RhYmxlKG8pKTsKKyAgc2V0b2JqMnQoTCwgbHVhSF9zZXRudW0oTCwgaHZhbHVlKG8pLCBuKSwgTC0+dG9wLTEpOworICBsdWFDX2JhcnJpZXJ0KEwsIGh2YWx1ZShvKSwgTC0+dG9wLTEpOworICBMLT50b3AtLTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfc2V0bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBvYmppbmRleCkgeworICBUVmFsdWUgKm9iajsKKyAgVGFibGUgKm10OworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDEpOworICBvYmogPSBpbmRleDJhZHIoTCwgb2JqaW5kZXgpOworICBhcGlfY2hlY2t2YWxpZGluZGV4KEwsIG9iaik7CisgIGlmICh0dGlzbmlsKEwtPnRvcCAtIDEpKQorICAgIG10ID0gTlVMTDsKKyAgZWxzZSB7CisgICAgYXBpX2NoZWNrKEwsIHR0aXN0YWJsZShMLT50b3AgLSAxKSk7CisgICAgbXQgPSBodmFsdWUoTC0+dG9wIC0gMSk7CisgIH0KKyAgc3dpdGNoICh0dHlwZShvYmopKSB7CisgICAgY2FzZSBMVUFfVFRBQkxFOiB7CisgICAgICBodmFsdWUob2JqKS0+bWV0YXRhYmxlID0gbXQ7CisgICAgICBpZiAobXQpCisgICAgICAgIGx1YUNfb2JqYmFycmllcnQoTCwgaHZhbHVlKG9iaiksIG10KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9UVVNFUkRBVEE6IHsKKyAgICAgIHV2YWx1ZShvYmopLT5tZXRhdGFibGUgPSBtdDsKKyAgICAgIGlmIChtdCkKKyAgICAgICAgbHVhQ19vYmpiYXJyaWVyKEwsIHJhd3V2YWx1ZShvYmopLCBtdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgRyhMKS0+bXRbdHR5cGUob2JqKV0gPSBtdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBMLT50b3AtLTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIDE7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX3NldGZlbnYgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvOworICBpbnQgcmVzID0gMTsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCAxKTsKKyAgbyA9IGluZGV4MmFkcihMLCBpZHgpOworICBhcGlfY2hlY2t2YWxpZGluZGV4KEwsIG8pOworICBhcGlfY2hlY2soTCwgdHRpc3RhYmxlKEwtPnRvcCAtIDEpKTsKKyAgc3dpdGNoICh0dHlwZShvKSkgeworICAgIGNhc2UgTFVBX1RGVU5DVElPTjoKKyAgICAgIGNsdmFsdWUobyktPmMuZW52ID0gaHZhbHVlKEwtPnRvcCAtIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMVUFfVFVTRVJEQVRBOgorICAgICAgdXZhbHVlKG8pLT5lbnYgPSBodmFsdWUoTC0+dG9wIC0gMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExVQV9UVEhSRUFEOgorICAgICAgc2V0aHZhbHVlKEwsIGd0KHRodmFsdWUobykpLCBodmFsdWUoTC0+dG9wIC0gMSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IDA7CisgICAgICBicmVhazsKKyAgfQorICBpZiAocmVzKSBsdWFDX29iamJhcnJpZXIoTCwgZ2N2YWx1ZShvKSwgaHZhbHVlKEwtPnRvcCAtIDEpKTsKKyAgTC0+dG9wLS07CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiByZXM7Cit9CisKKworLyoKKyoqIGBsb2FkJyBhbmQgYGNhbGwnIGZ1bmN0aW9ucyAocnVuIEx1YSBjb2RlKQorKi8KKworCisjZGVmaW5lIGFkanVzdHJlc3VsdHMoTCxucmVzKSBcCisgICAgeyBpZiAobnJlcyA9PSBMVUFfTVVMVFJFVCAmJiBMLT50b3AgPj0gTC0+Y2ktPnRvcCkgTC0+Y2ktPnRvcCA9IEwtPnRvcDsgfQorCisKKyNkZWZpbmUgY2hlY2tyZXN1bHRzKEwsbmEsbnIpIFwKKyAgICAgYXBpX2NoZWNrKEwsIChucikgPT0gTFVBX01VTFRSRVQgfHwgKEwtPmNpLT50b3AgLSBMLT50b3AgPj0gKG5yKSAtIChuYSkpKQorCQorCitMVUFfQVBJIHZvaWQgbHVhX2NhbGwgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmdzLCBpbnQgbnJlc3VsdHMpIHsKKyAgU3RrSWQgZnVuYzsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCBuYXJncysxKTsKKyAgY2hlY2tyZXN1bHRzKEwsIG5hcmdzLCBucmVzdWx0cyk7CisgIGZ1bmMgPSBMLT50b3AgLSAobmFyZ3MrMSk7CisgIGx1YURfY2FsbChMLCBmdW5jLCBucmVzdWx0cyk7CisgIGFkanVzdHJlc3VsdHMoTCwgbnJlc3VsdHMpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKKworLyoKKyoqIEV4ZWN1dGUgYSBwcm90ZWN0ZWQgY2FsbC4KKyovCitzdHJ1Y3QgQ2FsbFMgeyAgLyogZGF0YSB0byBgZl9jYWxsJyAqLworICBTdGtJZCBmdW5jOworICBpbnQgbnJlc3VsdHM7Cit9OworCisKK3N0YXRpYyB2b2lkIGZfY2FsbCAobHVhX1N0YXRlICpMLCB2b2lkICp1ZCkgeworICBzdHJ1Y3QgQ2FsbFMgKmMgPSBjYXN0KHN0cnVjdCBDYWxsUyAqLCB1ZCk7CisgIGx1YURfY2FsbChMLCBjLT5mdW5jLCBjLT5ucmVzdWx0cyk7Cit9CisKKworCitMVUFfQVBJIGludCBsdWFfcGNhbGwgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmdzLCBpbnQgbnJlc3VsdHMsIGludCBlcnJmdW5jKSB7CisgIHN0cnVjdCBDYWxsUyBjOworICBpbnQgc3RhdHVzOworICBwdHJkaWZmX3QgZnVuYzsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCBuYXJncysxKTsKKyAgY2hlY2tyZXN1bHRzKEwsIG5hcmdzLCBucmVzdWx0cyk7CisgIGlmIChlcnJmdW5jID09IDApCisgICAgZnVuYyA9IDA7CisgIGVsc2UgeworICAgIFN0a0lkIG8gPSBpbmRleDJhZHIoTCwgZXJyZnVuYyk7CisgICAgYXBpX2NoZWNrdmFsaWRpbmRleChMLCBvKTsKKyAgICBmdW5jID0gc2F2ZXN0YWNrKEwsIG8pOworICB9CisgIGMuZnVuYyA9IEwtPnRvcCAtIChuYXJncysxKTsgIC8qIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCAqLworICBjLm5yZXN1bHRzID0gbnJlc3VsdHM7CisgIHN0YXR1cyA9IGx1YURfcGNhbGwoTCwgZl9jYWxsLCAmYywgc2F2ZXN0YWNrKEwsIGMuZnVuYyksIGZ1bmMpOworICBhZGp1c3RyZXN1bHRzKEwsIG5yZXN1bHRzKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorKiogRXhlY3V0ZSBhIHByb3RlY3RlZCBDIGNhbGwuCisqLworc3RydWN0IENDYWxsUyB7ICAvKiBkYXRhIHRvIGBmX0NjYWxsJyAqLworICBsdWFfQ0Z1bmN0aW9uIGZ1bmM7CisgIHZvaWQgKnVkOworfTsKKworCitzdGF0aWMgdm9pZCBmX0NjYWxsIChsdWFfU3RhdGUgKkwsIHZvaWQgKnVkKSB7CisgIHN0cnVjdCBDQ2FsbFMgKmMgPSBjYXN0KHN0cnVjdCBDQ2FsbFMgKiwgdWQpOworICBDbG9zdXJlICpjbDsKKyAgY2wgPSBsdWFGX25ld0NjbG9zdXJlKEwsIDAsIGdldGN1cnJlbnYoTCkpOworICBjbC0+Yy5mID0gYy0+ZnVuYzsKKyAgc2V0Y2x2YWx1ZShMLCBMLT50b3AsIGNsKTsgIC8qIHB1c2ggZnVuY3Rpb24gKi8KKyAgYXBpX2luY3JfdG9wKEwpOworICBzZXRwdmFsdWUoTC0+dG9wLCBjLT51ZCk7ICAvKiBwdXNoIG9ubHkgYXJndW1lbnQgKi8KKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFEX2NhbGwoTCwgTC0+dG9wIC0gMiwgMCk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2NwY2FsbCAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIGZ1bmMsIHZvaWQgKnVkKSB7CisgIHN0cnVjdCBDQ2FsbFMgYzsKKyAgaW50IHN0YXR1czsKKyAgbHVhX2xvY2soTCk7CisgIGMuZnVuYyA9IGZ1bmM7CisgIGMudWQgPSB1ZDsKKyAgc3RhdHVzID0gbHVhRF9wY2FsbChMLCBmX0NjYWxsLCAmYywgc2F2ZXN0YWNrKEwsIEwtPnRvcCksIDApOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gc3RhdHVzOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9sb2FkIChsdWFfU3RhdGUgKkwsIGx1YV9SZWFkZXIgcmVhZGVyLCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNodW5rbmFtZSkgeworICBaSU8gejsKKyAgaW50IHN0YXR1czsKKyAgbHVhX2xvY2soTCk7CisgIGlmICghY2h1bmtuYW1lKSBjaHVua25hbWUgPSAiPyI7CisgIGx1YVpfaW5pdChMLCAmeiwgcmVhZGVyLCBkYXRhKTsKKyAgc3RhdHVzID0gbHVhRF9wcm90ZWN0ZWRwYXJzZXIoTCwgJnosIGNodW5rbmFtZSk7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2R1bXAgKGx1YV9TdGF0ZSAqTCwgbHVhX1dyaXRlciB3cml0ZXIsIHZvaWQgKmRhdGEpIHsKKyAgaW50IHN0YXR1czsKKyAgVFZhbHVlICpvOworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDEpOworICBvID0gTC0+dG9wIC0gMTsKKyAgaWYgKGlzTGZ1bmN0aW9uKG8pKQorICAgIHN0YXR1cyA9IGx1YVVfZHVtcChMLCBjbHZhbHVlKG8pLT5sLnAsIHdyaXRlciwgZGF0YSwgMCk7CisgIGVsc2UKKyAgICBzdGF0dXMgPSAxOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gc3RhdHVzOworfQorCisKK0xVQV9BUEkgaW50ICBsdWFfc3RhdHVzIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIEwtPnN0YXR1czsKK30KKworCisvKgorKiogR2FyYmFnZS1jb2xsZWN0aW9uIGZ1bmN0aW9uCisqLworCitMVUFfQVBJIGludCBsdWFfZ2MgKGx1YV9TdGF0ZSAqTCwgaW50IHdoYXQsIGludCBkYXRhKSB7CisgIGludCByZXMgPSAwOworICBnbG9iYWxfU3RhdGUgKmc7CisgIGx1YV9sb2NrKEwpOworICBnID0gRyhMKTsKKyAgc3dpdGNoICh3aGF0KSB7CisgICAgY2FzZSBMVUFfR0NTVE9QOiB7CisgICAgICBnLT5HQ3RocmVzaG9sZCA9IE1BWF9MVU1FTTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ1JFU1RBUlQ6IHsKKyAgICAgIGctPkdDdGhyZXNob2xkID0gZy0+dG90YWxieXRlczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ0NPTExFQ1Q6IHsKKyAgICAgIGx1YUNfZnVsbGdjKEwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX0dDQ09VTlQ6IHsKKyAgICAgIC8qIEdDIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIEtieXRlczogI2J5dGVzLzJeMTAgKi8KKyAgICAgIHJlcyA9IGNhc3RfaW50KGctPnRvdGFsYnl0ZXMgPj4gMTApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX0dDQ09VTlRCOiB7CisgICAgICByZXMgPSBjYXN0X2ludChnLT50b3RhbGJ5dGVzICYgMHgzZmYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX0dDU1RFUDogeworICAgICAgbHVfbWVtIGEgPSAoY2FzdChsdV9tZW0sIGRhdGEpIDw8IDEwKTsKKyAgICAgIGlmIChhIDw9IGctPnRvdGFsYnl0ZXMpCisgICAgICAgIGctPkdDdGhyZXNob2xkID0gZy0+dG90YWxieXRlcyAtIGE7CisgICAgICBlbHNlCisgICAgICAgIGctPkdDdGhyZXNob2xkID0gMDsKKyAgICAgIHdoaWxlIChnLT5HQ3RocmVzaG9sZCA8PSBnLT50b3RhbGJ5dGVzKSB7CisgICAgICAgIGx1YUNfc3RlcChMKTsKKyAgICAgICAgaWYgKGctPmdjc3RhdGUgPT0gR0NTcGF1c2UpIHsgIC8qIGVuZCBvZiBjeWNsZT8gKi8KKyAgICAgICAgICByZXMgPSAxOyAgLyogc2lnbmFsIGl0ICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ1NFVFBBVVNFOiB7CisgICAgICByZXMgPSBnLT5nY3BhdXNlOworICAgICAgZy0+Z2NwYXVzZSA9IGRhdGE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfR0NTRVRTVEVQTVVMOiB7CisgICAgICByZXMgPSBnLT5nY3N0ZXBtdWw7CisgICAgICBnLT5nY3N0ZXBtdWwgPSBkYXRhOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHJlcyA9IC0xOyAgLyogaW52YWxpZCBvcHRpb24gKi8KKyAgfQorICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gcmVzOworfQorCisKKworLyoKKyoqIG1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zCisqLworCisKK0xVQV9BUEkgaW50IGx1YV9lcnJvciAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9sb2NrKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgMSk7CisgIGx1YUdfZXJyb3Jtc2coTCk7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiAwOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KK30KKworCitMVUFfQVBJIGludCBsdWFfbmV4dCAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIHQ7CisgIGludCBtb3JlOworICBsdWFfbG9jayhMKTsKKyAgdCA9IGluZGV4MmFkcihMLCBpZHgpOworICBhcGlfY2hlY2soTCwgdHRpc3RhYmxlKHQpKTsKKyAgbW9yZSA9IGx1YUhfbmV4dChMLCBodmFsdWUodCksIEwtPnRvcCAtIDEpOworICBpZiAobW9yZSkgeworICAgIGFwaV9pbmNyX3RvcChMKTsKKyAgfQorICBlbHNlICAvKiBubyBtb3JlIGVsZW1lbnRzICovCisgICAgTC0+dG9wIC09IDE7ICAvKiByZW1vdmUga2V5ICovCisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBtb3JlOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfY29uY2F0IChsdWFfU3RhdGUgKkwsIGludCBuKSB7CisgIGx1YV9sb2NrKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgbik7CisgIGlmIChuID49IDIpIHsKKyAgICBsdWFDX2NoZWNrR0MoTCk7CisgICAgbHVhVl9jb25jYXQoTCwgbiwgY2FzdF9pbnQoTC0+dG9wIC0gTC0+YmFzZSkgLSAxKTsKKyAgICBMLT50b3AgLT0gKG4tMSk7CisgIH0KKyAgZWxzZSBpZiAobiA9PSAwKSB7ICAvKiBwdXNoIGVtcHR5IHN0cmluZyAqLworICAgIHNldHN2YWx1ZTJzKEwsIEwtPnRvcCwgbHVhU19uZXdsc3RyKEwsICIiLCAwKSk7CisgICAgYXBpX2luY3JfdG9wKEwpOworICB9CisgIC8qIGVsc2UgbiA9PSAxOyBub3RoaW5nIHRvIGRvICovCisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSBsdWFfQWxsb2MgbHVhX2dldGFsbG9jZiAobHVhX1N0YXRlICpMLCB2b2lkICoqdWQpIHsKKyAgbHVhX0FsbG9jIGY7CisgIGx1YV9sb2NrKEwpOworICBpZiAodWQpICp1ZCA9IEcoTCktPnVkOworICBmID0gRyhMKS0+ZnJlYWxsb2M7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBmOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfc2V0YWxsb2NmIChsdWFfU3RhdGUgKkwsIGx1YV9BbGxvYyBmLCB2b2lkICp1ZCkgeworICBsdWFfbG9jayhMKTsKKyAgRyhMKS0+dWQgPSB1ZDsKKyAgRyhMKS0+ZnJlYWxsb2MgPSBmOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCAqbHVhX25ld3VzZXJkYXRhIChsdWFfU3RhdGUgKkwsIHNpemVfdCBzaXplKSB7CisgIFVkYXRhICp1OworICBsdWFfbG9jayhMKTsKKyAgbHVhQ19jaGVja0dDKEwpOworICB1ID0gbHVhU19uZXd1ZGF0YShMLCBzaXplLCBnZXRjdXJyZW52KEwpKTsKKyAgc2V0dXZhbHVlKEwsIEwtPnRvcCwgdSk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIHUgKyAxOworfQorCisKKworCitzdGF0aWMgY29uc3QgY2hhciAqYXV4X3VwdmFsdWUgKFN0a0lkIGZpLCBpbnQgbiwgVFZhbHVlICoqdmFsKSB7CisgIENsb3N1cmUgKmY7CisgIGlmICghdHRpc2Z1bmN0aW9uKGZpKSkgcmV0dXJuIE5VTEw7CisgIGYgPSBjbHZhbHVlKGZpKTsKKyAgaWYgKGYtPmMuaXNDKSB7CisgICAgaWYgKCEoMSA8PSBuICYmIG4gPD0gZi0+Yy5udXB2YWx1ZXMpKSByZXR1cm4gTlVMTDsKKyAgICAqdmFsID0gJmYtPmMudXB2YWx1ZVtuLTFdOworICAgIHJldHVybiAiIjsKKyAgfQorICBlbHNlIHsKKyAgICBQcm90byAqcCA9IGYtPmwucDsKKyAgICBpZiAoISgxIDw9IG4gJiYgbiA8PSBwLT5zaXpldXB2YWx1ZXMpKSByZXR1cm4gTlVMTDsKKyAgICAqdmFsID0gZi0+bC51cHZhbHNbbi0xXS0+djsKKyAgICByZXR1cm4gZ2V0c3RyKHAtPnVwdmFsdWVzW24tMV0pOworICB9Cit9CisKKworTFVBX0FQSSBjb25zdCBjaGFyICpsdWFfZ2V0dXB2YWx1ZSAobHVhX1N0YXRlICpMLCBpbnQgZnVuY2luZGV4LCBpbnQgbikgeworICBjb25zdCBjaGFyICpuYW1lOworICBUVmFsdWUgKnZhbDsKKyAgbHVhX2xvY2soTCk7CisgIG5hbWUgPSBhdXhfdXB2YWx1ZShpbmRleDJhZHIoTCwgZnVuY2luZGV4KSwgbiwgJnZhbCk7CisgIGlmIChuYW1lKSB7CisgICAgc2V0b2JqMnMoTCwgTC0+dG9wLCB2YWwpOworICAgIGFwaV9pbmNyX3RvcChMKTsKKyAgfQorICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gbmFtZTsKK30KKworCitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV9zZXR1cHZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBmdW5jaW5kZXgsIGludCBuKSB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIFRWYWx1ZSAqdmFsOworICBTdGtJZCBmaTsKKyAgbHVhX2xvY2soTCk7CisgIGZpID0gaW5kZXgyYWRyKEwsIGZ1bmNpbmRleCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCAxKTsKKyAgbmFtZSA9IGF1eF91cHZhbHVlKGZpLCBuLCAmdmFsKTsKKyAgaWYgKG5hbWUpIHsKKyAgICBMLT50b3AtLTsKKyAgICBzZXRvYmooTCwgdmFsLCBMLT50b3ApOworICAgIGx1YUNfYmFycmllcihMLCBjbHZhbHVlKGZpKSwgTC0+dG9wKTsKKyAgfQorICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gbmFtZTsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sYXBpLmggYi9sdWEtNS4xLjQvc3JjL2xhcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzNmYWIyCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sYXBpLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyoqICRJZDogbGFwaS5oLHYgMi4yLjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIEF1eGlsaWFyeSBmdW5jdGlvbnMgZnJvbSBMdWEgQVBJCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsYXBpX2gKKyNkZWZpbmUgbGFwaV9oCisKKworI2luY2x1ZGUgImxvYmplY3QuaCIKKworCitMVUFJX0ZVTkMgdm9pZCBsdWFBX3B1c2hvYmplY3QgKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xhdXhsaWIuYyBiL2x1YS01LjEuNC9zcmMvbGF1eGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xhdXhsaWIuYwpAQCAtMCwwICsxLDY1MiBAQAorLyoKKyoqICRJZDogbGF1eGxpYi5jLHYgMS4xNTkuMS4zIDIwMDgvMDEvMjEgMTM6MjA6NTEgcm9iZXJ0byBFeHAgJAorKiogQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcgTHVhIGxpYnJhcmllcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKy8qIFRoaXMgZmlsZSB1c2VzIG9ubHkgdGhlIG9mZmljaWFsIEFQSSBvZiBMdWEuCisqKiBBbnkgZnVuY3Rpb24gZGVjbGFyZWQgaGVyZSBjb3VsZCBiZSB3cml0dGVuIGFzIGFuIGFwcGxpY2F0aW9uIGZ1bmN0aW9uLgorKi8KKworI2RlZmluZSBsYXV4bGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKKworI2RlZmluZSBGUkVFTElTVF9SRUYJMAkvKiBmcmVlIGxpc3Qgb2YgcmVmZXJlbmNlcyAqLworCisKKy8qIGNvbnZlcnQgYSBzdGFjayBpbmRleCB0byBwb3NpdGl2ZSAqLworI2RlZmluZSBhYnNfaW5kZXgoTCwgaSkJCSgoaSkgPiAwIHx8IChpKSA8PSBMVUFfUkVHSVNUUllJTkRFWCA/IChpKSA6IFwKKwkJCQkJbHVhX2dldHRvcChMKSArIChpKSArIDEpCisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIEVycm9yLXJlcG9ydCBmdW5jdGlvbnMKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9hcmdlcnJvciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgY29uc3QgY2hhciAqZXh0cmFtc2cpIHsKKyAgbHVhX0RlYnVnIGFyOworICBpZiAoIWx1YV9nZXRzdGFjayhMLCAwLCAmYXIpKSAgLyogbm8gc3RhY2sgZnJhbWU/ICovCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImJhZCBhcmd1bWVudCAjJWQgKCVzKSIsIG5hcmcsIGV4dHJhbXNnKTsKKyAgbHVhX2dldGluZm8oTCwgIm4iLCAmYXIpOworICBpZiAoc3RyY21wKGFyLm5hbWV3aGF0LCAibWV0aG9kIikgPT0gMCkgeworICAgIG5hcmctLTsgIC8qIGRvIG5vdCBjb3VudCBgc2VsZicgKi8KKyAgICBpZiAobmFyZyA9PSAwKSAgLyogZXJyb3IgaXMgaW4gdGhlIHNlbGYgYXJndW1lbnQgaXRzZWxmPyAqLworICAgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImNhbGxpbmcgIiBMVUFfUVMgIiBvbiBiYWQgc2VsZiAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyLm5hbWUsIGV4dHJhbXNnKTsKKyAgfQorICBpZiAoYXIubmFtZSA9PSBOVUxMKQorICAgIGFyLm5hbWUgPSAiPyI7CisgIHJldHVybiBsdWFMX2Vycm9yKEwsICJiYWQgYXJndW1lbnQgIyVkIHRvICIgTFVBX1FTICIgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYXJnLCBhci5uYW1lLCBleHRyYW1zZyk7Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF90eXBlcnJvciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgY29uc3QgY2hhciAqdG5hbWUpIHsKKyAgY29uc3QgY2hhciAqbXNnID0gbHVhX3B1c2hmc3RyaW5nKEwsICIlcyBleHBlY3RlZCwgZ290ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuYW1lLCBsdWFMX3R5cGVuYW1lKEwsIG5hcmcpKTsKKyAgcmV0dXJuIGx1YUxfYXJnZXJyb3IoTCwgbmFyZywgbXNnKTsKK30KKworCitzdGF0aWMgdm9pZCB0YWdfZXJyb3IgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGludCB0YWcpIHsKKyAgbHVhTF90eXBlcnJvcihMLCBuYXJnLCBsdWFfdHlwZW5hbWUoTCwgdGFnKSk7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfd2hlcmUgKGx1YV9TdGF0ZSAqTCwgaW50IGxldmVsKSB7CisgIGx1YV9EZWJ1ZyBhcjsKKyAgaWYgKGx1YV9nZXRzdGFjayhMLCBsZXZlbCwgJmFyKSkgeyAgLyogY2hlY2sgZnVuY3Rpb24gYXQgbGV2ZWwgKi8KKyAgICBsdWFfZ2V0aW5mbyhMLCAiU2wiLCAmYXIpOyAgLyogZ2V0IGluZm8gYWJvdXQgaXQgKi8KKyAgICBpZiAoYXIuY3VycmVudGxpbmUgPiAwKSB7ICAvKiBpcyB0aGVyZSBpbmZvPyAqLworICAgICAgbHVhX3B1c2hmc3RyaW5nKEwsICIlczolZDogIiwgYXIuc2hvcnRfc3JjLCBhci5jdXJyZW50bGluZSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGx1YV9wdXNobGl0ZXJhbChMLCAiIik7ICAvKiBlbHNlLCBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUuLi4gKi8KK30KKworCitMVUFMSUJfQVBJIGludCBsdWFMX2Vycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJncDsKKyAgdmFfc3RhcnQoYXJncCwgZm10KTsKKyAgbHVhTF93aGVyZShMLCAxKTsKKyAgbHVhX3B1c2h2ZnN0cmluZyhMLCBmbXQsIGFyZ3ApOworICB2YV9lbmQoYXJncCk7CisgIGx1YV9jb25jYXQoTCwgMik7CisgIHJldHVybiBsdWFfZXJyb3IoTCk7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitMVUFMSUJfQVBJIGludCBsdWFMX2NoZWNrb3B0aW9uIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBjb25zdCBjaGFyICpkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBsc3RbXSkgeworICBjb25zdCBjaGFyICpuYW1lID0gKGRlZikgPyBsdWFMX29wdHN0cmluZyhMLCBuYXJnLCBkZWYpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhTF9jaGVja3N0cmluZyhMLCBuYXJnKTsKKyAgaW50IGk7CisgIGZvciAoaT0wOyBsc3RbaV07IGkrKykKKyAgICBpZiAoc3RyY21wKGxzdFtpXSwgbmFtZSkgPT0gMCkKKyAgICAgIHJldHVybiBpOworICByZXR1cm4gbHVhTF9hcmdlcnJvcihMLCBuYXJnLAorICAgICAgICAgICAgICAgICAgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgImludmFsaWQgb3B0aW9uICIgTFVBX1FTLCBuYW1lKSk7Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9uZXdtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqdG5hbWUpIHsKKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCB0bmFtZSk7ICAvKiBnZXQgcmVnaXN0cnkubmFtZSAqLworICBpZiAoIWx1YV9pc25pbChMLCAtMSkpICAvKiBuYW1lIGFscmVhZHkgaW4gdXNlPyAqLworICAgIHJldHVybiAwOyAgLyogbGVhdmUgcHJldmlvdXMgdmFsdWUgb24gdG9wLCBidXQgcmV0dXJuIDAgKi8KKyAgbHVhX3BvcChMLCAxKTsKKyAgbHVhX25ld3RhYmxlKEwpOyAgLyogY3JlYXRlIG1ldGF0YWJsZSAqLworICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsKKyAgbHVhX3NldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCB0bmFtZSk7ICAvKiByZWdpc3RyeS5uYW1lID0gbWV0YXRhYmxlICovCisgIHJldHVybiAxOworfQorCisKK0xVQUxJQl9BUEkgdm9pZCAqbHVhTF9jaGVja3VkYXRhIChsdWFfU3RhdGUgKkwsIGludCB1ZCwgY29uc3QgY2hhciAqdG5hbWUpIHsKKyAgdm9pZCAqcCA9IGx1YV90b3VzZXJkYXRhKEwsIHVkKTsKKyAgaWYgKHAgIT0gTlVMTCkgeyAgLyogdmFsdWUgaXMgYSB1c2VyZGF0YT8gKi8KKyAgICBpZiAobHVhX2dldG1ldGF0YWJsZShMLCB1ZCkpIHsgIC8qIGRvZXMgaXQgaGF2ZSBhIG1ldGF0YWJsZT8gKi8KKyAgICAgIGx1YV9nZXRmaWVsZChMLCBMVUFfUkVHSVNUUllJTkRFWCwgdG5hbWUpOyAgLyogZ2V0IGNvcnJlY3QgbWV0YXRhYmxlICovCisgICAgICBpZiAobHVhX3Jhd2VxdWFsKEwsIC0xLCAtMikpIHsgIC8qIGRvZXMgaXQgaGF2ZSB0aGUgY29ycmVjdCBtdD8gKi8KKyAgICAgICAgbHVhX3BvcChMLCAyKTsgIC8qIHJlbW92ZSBib3RoIG1ldGF0YWJsZXMgKi8KKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgfQorICB9CisgIGx1YUxfdHlwZXJyb3IoTCwgdWQsIHRuYW1lKTsgIC8qIGVsc2UgZXJyb3IgKi8KKyAgcmV0dXJuIE5VTEw7ICAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLworfQorCisKK0xVQUxJQl9BUEkgdm9pZCBsdWFMX2NoZWNrc3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IHNwYWNlLCBjb25zdCBjaGFyICptZXMpIHsKKyAgaWYgKCFsdWFfY2hlY2tzdGFjayhMLCBzcGFjZSkpCisgICAgbHVhTF9lcnJvcihMLCAic3RhY2sgb3ZlcmZsb3cgKCVzKSIsIG1lcyk7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfY2hlY2t0eXBlIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBpbnQgdCkgeworICBpZiAobHVhX3R5cGUoTCwgbmFyZykgIT0gdCkKKyAgICB0YWdfZXJyb3IoTCwgbmFyZywgdCk7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfY2hlY2thbnkgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpIHsKKyAgaWYgKGx1YV90eXBlKEwsIG5hcmcpID09IExVQV9UTk9ORSkKKyAgICBsdWFMX2FyZ2Vycm9yKEwsIG5hcmcsICJ2YWx1ZSBleHBlY3RlZCIpOworfQorCisKK0xVQUxJQl9BUEkgY29uc3QgY2hhciAqbHVhTF9jaGVja2xzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIHNpemVfdCAqbGVuKSB7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFfdG9sc3RyaW5nKEwsIG5hcmcsIGxlbik7CisgIGlmICghcykgdGFnX2Vycm9yKEwsIG5hcmcsIExVQV9UU1RSSU5HKTsKKyAgcmV0dXJuIHM7Cit9CisKKworTFVBTElCX0FQSSBjb25zdCBjaGFyICpsdWFMX29wdGxzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVmLCBzaXplX3QgKmxlbikgeworICBpZiAobHVhX2lzbm9uZW9ybmlsKEwsIG5hcmcpKSB7CisgICAgaWYgKGxlbikKKyAgICAgICpsZW4gPSAoZGVmID8gc3RybGVuKGRlZikgOiAwKTsKKyAgICByZXR1cm4gZGVmOworICB9CisgIGVsc2UgcmV0dXJuIGx1YUxfY2hlY2tsc3RyaW5nKEwsIG5hcmcsIGxlbik7Cit9CisKKworTFVBTElCX0FQSSBsdWFfTnVtYmVyIGx1YUxfY2hlY2tudW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpIHsKKyAgbHVhX051bWJlciBkID0gbHVhX3RvbnVtYmVyKEwsIG5hcmcpOworICBpZiAoZCA9PSAwICYmICFsdWFfaXNudW1iZXIoTCwgbmFyZykpICAvKiBhdm9pZCBleHRyYSB0ZXN0IHdoZW4gZCBpcyBub3QgMCAqLworICAgIHRhZ19lcnJvcihMLCBuYXJnLCBMVUFfVE5VTUJFUik7CisgIHJldHVybiBkOworfQorCisKK0xVQUxJQl9BUEkgbHVhX051bWJlciBsdWFMX29wdG51bWJlciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgbHVhX051bWJlciBkZWYpIHsKKyAgcmV0dXJuIGx1YUxfb3B0KEwsIGx1YUxfY2hlY2tudW1iZXIsIG5hcmcsIGRlZik7Cit9CisKKworTFVBTElCX0FQSSBsdWFfSW50ZWdlciBsdWFMX2NoZWNraW50ZWdlciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZykgeworICBsdWFfSW50ZWdlciBkID0gbHVhX3RvaW50ZWdlcihMLCBuYXJnKTsKKyAgaWYgKGQgPT0gMCAmJiAhbHVhX2lzbnVtYmVyKEwsIG5hcmcpKSAgLyogYXZvaWQgZXh0cmEgdGVzdCB3aGVuIGQgaXMgbm90IDAgKi8KKyAgICB0YWdfZXJyb3IoTCwgbmFyZywgTFVBX1ROVU1CRVIpOworICByZXR1cm4gZDsKK30KKworCitMVUFMSUJfQVBJIGx1YV9JbnRlZ2VyIGx1YUxfb3B0aW50ZWdlciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9JbnRlZ2VyIGRlZikgeworICByZXR1cm4gbHVhTF9vcHQoTCwgbHVhTF9jaGVja2ludGVnZXIsIG5hcmcsIGRlZik7Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9nZXRtZXRhZmllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IG9iaiwgY29uc3QgY2hhciAqZXZlbnQpIHsKKyAgaWYgKCFsdWFfZ2V0bWV0YXRhYmxlKEwsIG9iaikpICAvKiBubyBtZXRhdGFibGU/ICovCisgICAgcmV0dXJuIDA7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGV2ZW50KTsKKyAgbHVhX3Jhd2dldChMLCAtMik7CisgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgbHVhX3BvcChMLCAyKTsgIC8qIHJlbW92ZSBtZXRhdGFibGUgYW5kIG1ldGFmaWVsZCAqLworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgeworICAgIGx1YV9yZW1vdmUoTCwgLTIpOyAgLyogcmVtb3ZlIG9ubHkgbWV0YXRhYmxlICovCisgICAgcmV0dXJuIDE7CisgIH0KK30KKworCitMVUFMSUJfQVBJIGludCBsdWFMX2NhbGxtZXRhIChsdWFfU3RhdGUgKkwsIGludCBvYmosIGNvbnN0IGNoYXIgKmV2ZW50KSB7CisgIG9iaiA9IGFic19pbmRleChMLCBvYmopOworICBpZiAoIWx1YUxfZ2V0bWV0YWZpZWxkKEwsIG9iaiwgZXZlbnQpKSAgLyogbm8gbWV0YWZpZWxkPyAqLworICAgIHJldHVybiAwOworICBsdWFfcHVzaHZhbHVlKEwsIG9iaik7CisgIGx1YV9jYWxsKEwsIDEsIDEpOworICByZXR1cm4gMTsKK30KKworCitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfcmVnaXN0ZXIpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmxpYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx1YUxfUmVnICpsKSB7CisgIGx1YUlfb3BlbmxpYihMLCBsaWJuYW1lLCBsLCAwKTsKK30KKworCitzdGF0aWMgaW50IGxpYnNpemUgKGNvbnN0IGx1YUxfUmVnICpsKSB7CisgIGludCBzaXplID0gMDsKKyAgZm9yICg7IGwtPm5hbWU7IGwrKykgc2l6ZSsrOworICByZXR1cm4gc2l6ZTsKK30KKworCitMVUFMSUJfQVBJIHZvaWQgbHVhSV9vcGVubGliIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmxpYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsdWFMX1JlZyAqbCwgaW50IG51cCkgeworICBpZiAobGlibmFtZSkgeworICAgIGludCBzaXplID0gbGlic2l6ZShsKTsKKyAgICAvKiBjaGVjayB3aGV0aGVyIGxpYiBhbHJlYWR5IGV4aXN0cyAqLworICAgIGx1YUxfZmluZHRhYmxlKEwsIExVQV9SRUdJU1RSWUlOREVYLCAiX0xPQURFRCIsIDEpOworICAgIGx1YV9nZXRmaWVsZChMLCAtMSwgbGlibmFtZSk7ICAvKiBnZXQgX0xPQURFRFtsaWJuYW1lXSAqLworICAgIGlmICghbHVhX2lzdGFibGUoTCwgLTEpKSB7ICAvKiBub3QgZm91bmQ/ICovCisgICAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIHByZXZpb3VzIHJlc3VsdCAqLworICAgICAgLyogdHJ5IGdsb2JhbCB2YXJpYWJsZSAoYW5kIGNyZWF0ZSBvbmUgaWYgaXQgZG9lcyBub3QgZXhpc3QpICovCisgICAgICBpZiAobHVhTF9maW5kdGFibGUoTCwgTFVBX0dMT0JBTFNJTkRFWCwgbGlibmFtZSwgc2l6ZSkgIT0gTlVMTCkKKyAgICAgICAgbHVhTF9lcnJvcihMLCAibmFtZSBjb25mbGljdCBmb3IgbW9kdWxlICIgTFVBX1FTLCBsaWJuYW1lKTsKKyAgICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOworICAgICAgbHVhX3NldGZpZWxkKEwsIC0zLCBsaWJuYW1lKTsgIC8qIF9MT0FERURbbGlibmFtZV0gPSBuZXcgdGFibGUgKi8KKyAgICB9CisgICAgbHVhX3JlbW92ZShMLCAtMik7ICAvKiByZW1vdmUgX0xPQURFRCB0YWJsZSAqLworICAgIGx1YV9pbnNlcnQoTCwgLShudXArMSkpOyAgLyogbW92ZSBsaWJyYXJ5IHRhYmxlIHRvIGJlbG93IHVwdmFsdWVzICovCisgIH0KKyAgZm9yICg7IGwtPm5hbWU7IGwrKykgeworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPG51cDsgaSsrKSAgLyogY29weSB1cHZhbHVlcyB0byB0aGUgdG9wICovCisgICAgICBsdWFfcHVzaHZhbHVlKEwsIC1udXApOworICAgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgbC0+ZnVuYywgbnVwKTsKKyAgICBsdWFfc2V0ZmllbGQoTCwgLShudXArMiksIGwtPm5hbWUpOworICB9CisgIGx1YV9wb3AoTCwgbnVwKTsgIC8qIHJlbW92ZSB1cHZhbHVlcyAqLworfQorCisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIGdldG4tc2V0bjogc2l6ZSBmb3IgYXJyYXlzCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgZGVmaW5lZChMVUFfQ09NUEFUX0dFVE4pCisKK3N0YXRpYyBpbnQgY2hlY2tpbnQgKGx1YV9TdGF0ZSAqTCwgaW50IHRvcG9wKSB7CisgIGludCBuID0gKGx1YV90eXBlKEwsIC0xKSA9PSBMVUFfVE5VTUJFUikgPyBsdWFfdG9pbnRlZ2VyKEwsIC0xKSA6IC0xOworICBsdWFfcG9wKEwsIHRvcG9wKTsKKyAgcmV0dXJuIG47Cit9CisKKworc3RhdGljIHZvaWQgZ2V0c2l6ZXMgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfZ2V0ZmllbGQoTCwgTFVBX1JFR0lTVFJZSU5ERVgsICJMVUFfU0laRVMiKTsKKyAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsgIC8qIG5vIGBzaXplJyB0YWJsZT8gKi8KKyAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIG5pbCAqLworICAgIGx1YV9uZXd0YWJsZShMKTsgIC8qIGNyZWF0ZSBpdCAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOyAgLyogYHNpemUnIHdpbGwgYmUgaXRzIG93biBtZXRhdGFibGUgKi8KKyAgICBsdWFfc2V0bWV0YXRhYmxlKEwsIC0yKTsKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImt2Iik7CisgICAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX19tb2RlIik7ICAvKiBtZXRhdGFibGUoTikuX19tb2RlID0gImt2IiAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOworICAgIGx1YV9zZXRmaWVsZChMLCBMVUFfUkVHSVNUUllJTkRFWCwgIkxVQV9TSVpFUyIpOyAgLyogc3RvcmUgaW4gcmVnaXN0ZXIgKi8KKyAgfQorfQorCisKK0xVQUxJQl9BUEkgdm9pZCBsdWFMX3NldG4gKGx1YV9TdGF0ZSAqTCwgaW50IHQsIGludCBuKSB7CisgIHQgPSBhYnNfaW5kZXgoTCwgdCk7CisgIGx1YV9wdXNobGl0ZXJhbChMLCAibiIpOworICBsdWFfcmF3Z2V0KEwsIHQpOworICBpZiAoY2hlY2tpbnQoTCwgMSkgPj0gMCkgeyAgLyogaXMgdGhlcmUgYSBudW1lcmljIGZpZWxkIGBuJz8gKi8KKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIm4iKTsgIC8qIHVzZSBpdCAqLworICAgIGx1YV9wdXNoaW50ZWdlcihMLCBuKTsKKyAgICBsdWFfcmF3c2V0KEwsIHQpOworICB9CisgIGVsc2UgeyAgLyogdXNlIGBzaXplcycgKi8KKyAgICBnZXRzaXplcyhMKTsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIHQpOworICAgIGx1YV9wdXNoaW50ZWdlcihMLCBuKTsKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgIC8qIHNpemVzW3RdID0gbiAqLworICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgYHNpemVzJyAqLworICB9Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9nZXRuIChsdWFfU3RhdGUgKkwsIGludCB0KSB7CisgIGludCBuOworICB0ID0gYWJzX2luZGV4KEwsIHQpOworICBsdWFfcHVzaGxpdGVyYWwoTCwgIm4iKTsgIC8qIHRyeSB0Lm4gKi8KKyAgbHVhX3Jhd2dldChMLCB0KTsKKyAgaWYgKChuID0gY2hlY2tpbnQoTCwgMSkpID49IDApIHJldHVybiBuOworICBnZXRzaXplcyhMKTsgIC8qIGVsc2UgdHJ5IHNpemVzW3RdICovCisgIGx1YV9wdXNodmFsdWUoTCwgdCk7CisgIGx1YV9yYXdnZXQoTCwgLTIpOworICBpZiAoKG4gPSBjaGVja2ludChMLCAyKSkgPj0gMCkgcmV0dXJuIG47CisgIHJldHVybiAoaW50KWx1YV9vYmpsZW4oTCwgdCk7Cit9CisKKyNlbmRpZgorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCitMVUFMSUJfQVBJIGNvbnN0IGNoYXIgKmx1YUxfZ3N1YiAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcikgeworICBjb25zdCBjaGFyICp3aWxkOworICBzaXplX3QgbCA9IHN0cmxlbihwKTsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIHdoaWxlICgod2lsZCA9IHN0cnN0cihzLCBwKSkgIT0gTlVMTCkgeworICAgIGx1YUxfYWRkbHN0cmluZygmYiwgcywgd2lsZCAtIHMpOyAgLyogcHVzaCBwcmVmaXggKi8KKyAgICBsdWFMX2FkZHN0cmluZygmYiwgcik7ICAvKiBwdXNoIHJlcGxhY2VtZW50IGluIHBsYWNlIG9mIHBhdHRlcm4gKi8KKyAgICBzID0gd2lsZCArIGw7ICAvKiBjb250aW51ZSBhZnRlciBgcCcgKi8KKyAgfQorICBsdWFMX2FkZHN0cmluZygmYiwgcyk7ICAvKiBwdXNoIGxhc3Qgc3VmZml4ICovCisgIGx1YUxfcHVzaHJlc3VsdCgmYik7CisgIHJldHVybiBsdWFfdG9zdHJpbmcoTCwgLTEpOworfQorCisKK0xVQUxJQl9BUEkgY29uc3QgY2hhciAqbHVhTF9maW5kdGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgc3poaW50KSB7CisgIGNvbnN0IGNoYXIgKmU7CisgIGx1YV9wdXNodmFsdWUoTCwgaWR4KTsKKyAgZG8geworICAgIGUgPSBzdHJjaHIoZm5hbWUsICcuJyk7CisgICAgaWYgKGUgPT0gTlVMTCkgZSA9IGZuYW1lICsgc3RybGVuKGZuYW1lKTsKKyAgICBsdWFfcHVzaGxzdHJpbmcoTCwgZm5hbWUsIGUgLSBmbmFtZSk7CisgICAgbHVhX3Jhd2dldChMLCAtMik7CisgICAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsgIC8qIG5vIHN1Y2ggZmllbGQ/ICovCisgICAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIHRoaXMgbmlsICovCisgICAgICBsdWFfY3JlYXRldGFibGUoTCwgMCwgKCplID09ICcuJyA/IDEgOiBzemhpbnQpKTsgLyogbmV3IHRhYmxlIGZvciBmaWVsZCAqLworICAgICAgbHVhX3B1c2hsc3RyaW5nKEwsIGZuYW1lLCBlIC0gZm5hbWUpOworICAgICAgbHVhX3B1c2h2YWx1ZShMLCAtMik7CisgICAgICBsdWFfc2V0dGFibGUoTCwgLTQpOyAgLyogc2V0IG5ldyB0YWJsZSBpbnRvIGZpZWxkICovCisgICAgfQorICAgIGVsc2UgaWYgKCFsdWFfaXN0YWJsZShMLCAtMSkpIHsgIC8qIGZpZWxkIGhhcyBhIG5vbi10YWJsZSB2YWx1ZT8gKi8KKyAgICAgIGx1YV9wb3AoTCwgMik7ICAvKiByZW1vdmUgdGFibGUgYW5kIHZhbHVlICovCisgICAgICByZXR1cm4gZm5hbWU7ICAvKiByZXR1cm4gcHJvYmxlbWF0aWMgcGFydCBvZiB0aGUgbmFtZSAqLworICAgIH0KKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSBwcmV2aW91cyB0YWJsZSAqLworICAgIGZuYW1lID0gZSArIDE7CisgIH0gd2hpbGUgKCplID09ICcuJyk7CisgIHJldHVybiBOVUxMOworfQorCisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIEdlbmVyaWMgQnVmZmVyIG1hbmlwdWxhdGlvbgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisjZGVmaW5lIGJ1ZmZsZW4oQikJKChCKS0+cCAtIChCKS0+YnVmZmVyKQorI2RlZmluZSBidWZmZnJlZShCKQkoKHNpemVfdCkoTFVBTF9CVUZGRVJTSVpFIC0gYnVmZmxlbihCKSkpCisKKyNkZWZpbmUgTElNSVQJKExVQV9NSU5TVEFDSy8yKQorCisKK3N0YXRpYyBpbnQgZW1wdHlidWZmZXIgKGx1YUxfQnVmZmVyICpCKSB7CisgIHNpemVfdCBsID0gYnVmZmxlbihCKTsKKyAgaWYgKGwgPT0gMCkgcmV0dXJuIDA7ICAvKiBwdXQgbm90aGluZyBvbiBzdGFjayAqLworICBlbHNlIHsKKyAgICBsdWFfcHVzaGxzdHJpbmcoQi0+TCwgQi0+YnVmZmVyLCBsKTsKKyAgICBCLT5wID0gQi0+YnVmZmVyOworICAgIEItPmx2bCsrOworICAgIHJldHVybiAxOworICB9Cit9CisKKworc3RhdGljIHZvaWQgYWRqdXN0c3RhY2sgKGx1YUxfQnVmZmVyICpCKSB7CisgIGlmIChCLT5sdmwgPiAxKSB7CisgICAgbHVhX1N0YXRlICpMID0gQi0+TDsKKyAgICBpbnQgdG9nZXQgPSAxOyAgLyogbnVtYmVyIG9mIGxldmVscyB0byBjb25jYXQgKi8KKyAgICBzaXplX3QgdG9wbGVuID0gbHVhX3N0cmxlbihMLCAtMSk7CisgICAgZG8geworICAgICAgc2l6ZV90IGwgPSBsdWFfc3RybGVuKEwsIC0odG9nZXQrMSkpOworICAgICAgaWYgKEItPmx2bCAtIHRvZ2V0ICsgMSA+PSBMSU1JVCB8fCB0b3BsZW4gPiBsKSB7CisgICAgICAgIHRvcGxlbiArPSBsOworICAgICAgICB0b2dldCsrOworICAgICAgfQorICAgICAgZWxzZSBicmVhazsKKyAgICB9IHdoaWxlICh0b2dldCA8IEItPmx2bCk7CisgICAgbHVhX2NvbmNhdChMLCB0b2dldCk7CisgICAgQi0+bHZsID0gQi0+bHZsIC0gdG9nZXQgKyAxOworICB9Cit9CisKKworTFVBTElCX0FQSSBjaGFyICpsdWFMX3ByZXBidWZmZXIgKGx1YUxfQnVmZmVyICpCKSB7CisgIGlmIChlbXB0eWJ1ZmZlcihCKSkKKyAgICBhZGp1c3RzdGFjayhCKTsKKyAgcmV0dXJuIEItPmJ1ZmZlcjsKK30KKworCitMVUFMSUJfQVBJIHZvaWQgbHVhTF9hZGRsc3RyaW5nIChsdWFMX0J1ZmZlciAqQiwgY29uc3QgY2hhciAqcywgc2l6ZV90IGwpIHsKKyAgd2hpbGUgKGwtLSkKKyAgICBsdWFMX2FkZGNoYXIoQiwgKnMrKyk7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfYWRkc3RyaW5nIChsdWFMX0J1ZmZlciAqQiwgY29uc3QgY2hhciAqcykgeworICBsdWFMX2FkZGxzdHJpbmcoQiwgcywgc3RybGVuKHMpKTsKK30KKworCitMVUFMSUJfQVBJIHZvaWQgbHVhTF9wdXNocmVzdWx0IChsdWFMX0J1ZmZlciAqQikgeworICBlbXB0eWJ1ZmZlcihCKTsKKyAgbHVhX2NvbmNhdChCLT5MLCBCLT5sdmwpOworICBCLT5sdmwgPSAxOworfQorCisKK0xVQUxJQl9BUEkgdm9pZCBsdWFMX2FkZHZhbHVlIChsdWFMX0J1ZmZlciAqQikgeworICBsdWFfU3RhdGUgKkwgPSBCLT5MOworICBzaXplX3Qgdmw7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFfdG9sc3RyaW5nKEwsIC0xLCAmdmwpOworICBpZiAodmwgPD0gYnVmZmZyZWUoQikpIHsgIC8qIGZpdCBpbnRvIGJ1ZmZlcj8gKi8KKyAgICBtZW1jcHkoQi0+cCwgcywgdmwpOyAgLyogcHV0IGl0IHRoZXJlICovCisgICAgQi0+cCArPSB2bDsKKyAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGZyb20gc3RhY2sgKi8KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoZW1wdHlidWZmZXIoQikpCisgICAgICBsdWFfaW5zZXJ0KEwsIC0yKTsgIC8qIHB1dCBidWZmZXIgYmVmb3JlIG5ldyB2YWx1ZSAqLworICAgIEItPmx2bCsrOyAgLyogYWRkIG5ldyB2YWx1ZSBpbnRvIEIgc3RhY2sgKi8KKyAgICBhZGp1c3RzdGFjayhCKTsKKyAgfQorfQorCisKK0xVQUxJQl9BUEkgdm9pZCBsdWFMX2J1ZmZpbml0IChsdWFfU3RhdGUgKkwsIGx1YUxfQnVmZmVyICpCKSB7CisgIEItPkwgPSBMOworICBCLT5wID0gQi0+YnVmZmVyOworICBCLT5sdmwgPSAwOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9yZWYgKGx1YV9TdGF0ZSAqTCwgaW50IHQpIHsKKyAgaW50IHJlZjsKKyAgdCA9IGFic19pbmRleChMLCB0KTsKKyAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsKKyAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGZyb20gc3RhY2sgKi8KKyAgICByZXR1cm4gTFVBX1JFRk5JTDsgIC8qIGBuaWwnIGhhcyBhIHVuaXF1ZSBmaXhlZCByZWZlcmVuY2UgKi8KKyAgfQorICBsdWFfcmF3Z2V0aShMLCB0LCBGUkVFTElTVF9SRUYpOyAgLyogZ2V0IGZpcnN0IGZyZWUgZWxlbWVudCAqLworICByZWYgPSAoaW50KWx1YV90b2ludGVnZXIoTCwgLTEpOyAgLyogcmVmID0gdFtGUkVFTElTVF9SRUZdICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgaXQgZnJvbSBzdGFjayAqLworICBpZiAocmVmICE9IDApIHsgIC8qIGFueSBmcmVlIGVsZW1lbnQ/ICovCisgICAgbHVhX3Jhd2dldGkoTCwgdCwgcmVmKTsgIC8qIHJlbW92ZSBpdCBmcm9tIGxpc3QgKi8KKyAgICBsdWFfcmF3c2V0aShMLCB0LCBGUkVFTElTVF9SRUYpOyAgLyogKHRbRlJFRUxJU1RfUkVGXSA9IHRbcmVmXSkgKi8KKyAgfQorICBlbHNlIHsgIC8qIG5vIGZyZWUgZWxlbWVudHMgKi8KKyAgICByZWYgPSAoaW50KWx1YV9vYmpsZW4oTCwgdCk7CisgICAgcmVmKys7ICAvKiBjcmVhdGUgbmV3IHJlZmVyZW5jZSAqLworICB9CisgIGx1YV9yYXdzZXRpKEwsIHQsIHJlZik7CisgIHJldHVybiByZWY7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfdW5yZWYgKGx1YV9TdGF0ZSAqTCwgaW50IHQsIGludCByZWYpIHsKKyAgaWYgKHJlZiA+PSAwKSB7CisgICAgdCA9IGFic19pbmRleChMLCB0KTsKKyAgICBsdWFfcmF3Z2V0aShMLCB0LCBGUkVFTElTVF9SRUYpOworICAgIGx1YV9yYXdzZXRpKEwsIHQsIHJlZik7ICAvKiB0W3JlZl0gPSB0W0ZSRUVMSVNUX1JFRl0gKi8KKyAgICBsdWFfcHVzaGludGVnZXIoTCwgcmVmKTsKKyAgICBsdWFfcmF3c2V0aShMLCB0LCBGUkVFTElTVF9SRUYpOyAgLyogdFtGUkVFTElTVF9SRUZdID0gcmVmICovCisgIH0KK30KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBMb2FkIGZ1bmN0aW9ucworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgTG9hZEYgeworICBpbnQgZXh0cmFsaW5lOworICBGSUxFICpmOworICBjaGFyIGJ1ZmZbTFVBTF9CVUZGRVJTSVpFXTsKK30gTG9hZEY7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldEYgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQsIHNpemVfdCAqc2l6ZSkgeworICBMb2FkRiAqbGYgPSAoTG9hZEYgKil1ZDsKKyAgKHZvaWQpTDsKKyAgaWYgKGxmLT5leHRyYWxpbmUpIHsKKyAgICBsZi0+ZXh0cmFsaW5lID0gMDsKKyAgICAqc2l6ZSA9IDE7CisgICAgcmV0dXJuICJcbiI7CisgIH0KKyAgaWYgKGZlb2YobGYtPmYpKSByZXR1cm4gTlVMTDsKKyAgKnNpemUgPSBmcmVhZChsZi0+YnVmZiwgMSwgc2l6ZW9mKGxmLT5idWZmKSwgbGYtPmYpOworICByZXR1cm4gKCpzaXplID4gMCkgPyBsZi0+YnVmZiA6IE5VTEw7Cit9CisKKworc3RhdGljIGludCBlcnJmaWxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKndoYXQsIGludCBmbmFtZWluZGV4KSB7CisgIGNvbnN0IGNoYXIgKnNlcnIgPSBzdHJlcnJvcihlcnJubyk7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gbHVhX3Rvc3RyaW5nKEwsIGZuYW1laW5kZXgpICsgMTsKKyAgbHVhX3B1c2hmc3RyaW5nKEwsICJjYW5ub3QgJXMgJXM6ICVzIiwgd2hhdCwgZmlsZW5hbWUsIHNlcnIpOworICBsdWFfcmVtb3ZlKEwsIGZuYW1laW5kZXgpOworICByZXR1cm4gTFVBX0VSUkZJTEU7Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9sb2FkZmlsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmaWxlbmFtZSkgeworICBMb2FkRiBsZjsKKyAgaW50IHN0YXR1cywgcmVhZHN0YXR1czsKKyAgaW50IGM7CisgIGludCBmbmFtZWluZGV4ID0gbHVhX2dldHRvcChMKSArIDE7ICAvKiBpbmRleCBvZiBmaWxlbmFtZSBvbiB0aGUgc3RhY2sgKi8KKyAgbGYuZXh0cmFsaW5lID0gMDsKKyAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIj1zdGRpbiIpOworICAgIGxmLmYgPSBzdGRpbjsKKyAgfQorICBlbHNlIHsKKyAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIkAlcyIsIGZpbGVuYW1lKTsKKyAgICBsZi5mID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgaWYgKGxmLmYgPT0gTlVMTCkgcmV0dXJuIGVycmZpbGUoTCwgIm9wZW4iLCBmbmFtZWluZGV4KTsKKyAgfQorICBjID0gZ2V0YyhsZi5mKTsKKyAgaWYgKGMgPT0gJyMnKSB7ICAvKiBVbml4IGV4ZWMuIGZpbGU/ICovCisgICAgbGYuZXh0cmFsaW5lID0gMTsKKyAgICB3aGlsZSAoKGMgPSBnZXRjKGxmLmYpKSAhPSBFT0YgJiYgYyAhPSAnXG4nKSA7ICAvKiBza2lwIGZpcnN0IGxpbmUgKi8KKyAgICBpZiAoYyA9PSAnXG4nKSBjID0gZ2V0YyhsZi5mKTsKKyAgfQorICBpZiAoYyA9PSBMVUFfU0lHTkFUVVJFWzBdICYmIGZpbGVuYW1lKSB7ICAvKiBiaW5hcnkgZmlsZT8gKi8KKyAgICBsZi5mID0gZnJlb3BlbihmaWxlbmFtZSwgInJiIiwgbGYuZik7ICAvKiByZW9wZW4gaW4gYmluYXJ5IG1vZGUgKi8KKyAgICBpZiAobGYuZiA9PSBOVUxMKSByZXR1cm4gZXJyZmlsZShMLCAicmVvcGVuIiwgZm5hbWVpbmRleCk7CisgICAgLyogc2tpcCBldmVudHVhbCBgIyEuLi4nICovCisgICB3aGlsZSAoKGMgPSBnZXRjKGxmLmYpKSAhPSBFT0YgJiYgYyAhPSBMVUFfU0lHTkFUVVJFWzBdKSA7CisgICAgbGYuZXh0cmFsaW5lID0gMDsKKyAgfQorICB1bmdldGMoYywgbGYuZik7CisgIHN0YXR1cyA9IGx1YV9sb2FkKEwsIGdldEYsICZsZiwgbHVhX3Rvc3RyaW5nKEwsIC0xKSk7CisgIHJlYWRzdGF0dXMgPSBmZXJyb3IobGYuZik7CisgIGlmIChmaWxlbmFtZSkgZmNsb3NlKGxmLmYpOyAgLyogY2xvc2UgZmlsZSAoZXZlbiBpbiBjYXNlIG9mIGVycm9ycykgKi8KKyAgaWYgKHJlYWRzdGF0dXMpIHsKKyAgICBsdWFfc2V0dG9wKEwsIGZuYW1laW5kZXgpOyAgLyogaWdub3JlIHJlc3VsdHMgZnJvbSBgbHVhX2xvYWQnICovCisgICAgcmV0dXJuIGVycmZpbGUoTCwgInJlYWQiLCBmbmFtZWluZGV4KTsKKyAgfQorICBsdWFfcmVtb3ZlKEwsIGZuYW1laW5kZXgpOworICByZXR1cm4gc3RhdHVzOworfQorCisKK3R5cGVkZWYgc3RydWN0IExvYWRTIHsKKyAgY29uc3QgY2hhciAqczsKKyAgc2l6ZV90IHNpemU7Cit9IExvYWRTOworCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRTIChsdWFfU3RhdGUgKkwsIHZvaWQgKnVkLCBzaXplX3QgKnNpemUpIHsKKyAgTG9hZFMgKmxzID0gKExvYWRTICopdWQ7CisgICh2b2lkKUw7CisgIGlmIChscy0+c2l6ZSA9PSAwKSByZXR1cm4gTlVMTDsKKyAgKnNpemUgPSBscy0+c2l6ZTsKKyAgbHMtPnNpemUgPSAwOworICByZXR1cm4gbHMtPnM7Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9sb2FkYnVmZmVyIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmJ1ZmYsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgIExvYWRTIGxzOworICBscy5zID0gYnVmZjsKKyAgbHMuc2l6ZSA9IHNpemU7CisgIHJldHVybiBsdWFfbG9hZChMLCBnZXRTLCAmbHMsIG5hbWUpOworfQorCisKK0xVQUxJQl9BUEkgaW50IChsdWFMX2xvYWRzdHJpbmcpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpIHsKKyAgcmV0dXJuIGx1YUxfbG9hZGJ1ZmZlcihMLCBzLCBzdHJsZW4ocyksIHMpOworfQorCisKKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK3N0YXRpYyB2b2lkICpsX2FsbG9jICh2b2lkICp1ZCwgdm9pZCAqcHRyLCBzaXplX3Qgb3NpemUsIHNpemVfdCBuc2l6ZSkgeworICAodm9pZCl1ZDsKKyAgKHZvaWQpb3NpemU7CisgIGlmIChuc2l6ZSA9PSAwKSB7CisgICAgZnJlZShwdHIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gcmVhbGxvYyhwdHIsIG5zaXplKTsKK30KKworCitzdGF0aWMgaW50IHBhbmljIChsdWFfU3RhdGUgKkwpIHsKKyAgKHZvaWQpTDsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgIGZwcmludGYoc3RkZXJyLCAiUEFOSUM6IHVucHJvdGVjdGVkIGVycm9yIGluIGNhbGwgdG8gTHVhIEFQSSAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgIGx1YV90b3N0cmluZyhMLCAtMSkpOworICByZXR1cm4gMDsKK30KKworCitMVUFMSUJfQVBJIGx1YV9TdGF0ZSAqbHVhTF9uZXdzdGF0ZSAodm9pZCkgeworICBsdWFfU3RhdGUgKkwgPSBsdWFfbmV3c3RhdGUobF9hbGxvYywgTlVMTCk7CisgIGlmIChMKSBsdWFfYXRwYW5pYyhMLCAmcGFuaWMpOworICByZXR1cm4gTDsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sYXV4bGliLmggYi9sdWEtNS4xLjQvc3JjL2xhdXhsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI1ODIzCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sYXV4bGliLmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisqKiAkSWQ6IGxhdXhsaWIuaCx2IDEuODguMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcgTHVhIGxpYnJhcmllcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2lmbmRlZiBsYXV4bGliX2gKKyNkZWZpbmUgbGF1eGxpYl9oCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsdWEuaCIKKworCisjaWYgZGVmaW5lZChMVUFfQ09NUEFUX0dFVE4pCitMVUFMSUJfQVBJIGludCAobHVhTF9nZXRuKSAobHVhX1N0YXRlICpMLCBpbnQgdCk7CitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfc2V0bikgKGx1YV9TdGF0ZSAqTCwgaW50IHQsIGludCBuKTsKKyNlbHNlCisjZGVmaW5lIGx1YUxfZ2V0bihMLGkpICAgICAgICAgICgoaW50KWx1YV9vYmpsZW4oTCwgaSkpCisjZGVmaW5lIGx1YUxfc2V0bihMLGksaikgICAgICAgICgodm9pZCkwKSAgLyogbm8gb3AhICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9PUEVOTElCKQorI2RlZmluZSBsdWFJX29wZW5saWIJbHVhTF9vcGVubGliCisjZW5kaWYKKworCisvKiBleHRyYSBlcnJvciBjb2RlIGZvciBgbHVhTF9sb2FkJyAqLworI2RlZmluZSBMVUFfRVJSRklMRSAgICAgKExVQV9FUlJFUlIrMSkKKworCit0eXBlZGVmIHN0cnVjdCBsdWFMX1JlZyB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx1YV9DRnVuY3Rpb24gZnVuYzsKK30gbHVhTF9SZWc7CisKKworCitMVUFMSUJfQVBJIHZvaWQgKGx1YUlfb3BlbmxpYikgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbGlibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbHVhTF9SZWcgKmwsIGludCBudXApOworTFVBTElCX0FQSSB2b2lkIChsdWFMX3JlZ2lzdGVyKSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpsaWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsdWFMX1JlZyAqbCk7CitMVUFMSUJfQVBJIGludCAobHVhTF9nZXRtZXRhZmllbGQpIChsdWFfU3RhdGUgKkwsIGludCBvYmosIGNvbnN0IGNoYXIgKmUpOworTFVBTElCX0FQSSBpbnQgKGx1YUxfY2FsbG1ldGEpIChsdWFfU3RhdGUgKkwsIGludCBvYmosIGNvbnN0IGNoYXIgKmUpOworTFVBTElCX0FQSSBpbnQgKGx1YUxfdHlwZXJyb3IpIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBjb25zdCBjaGFyICp0bmFtZSk7CitMVUFMSUJfQVBJIGludCAobHVhTF9hcmdlcnJvcikgKGx1YV9TdGF0ZSAqTCwgaW50IG51bWFyZywgY29uc3QgY2hhciAqZXh0cmFtc2cpOworTFVBTElCX0FQSSBjb25zdCBjaGFyICoobHVhTF9jaGVja2xzdHJpbmcpIChsdWFfU3RhdGUgKkwsIGludCBudW1BcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsKTsKK0xVQUxJQl9BUEkgY29uc3QgY2hhciAqKGx1YUxfb3B0bHN0cmluZykgKGx1YV9TdGF0ZSAqTCwgaW50IG51bUFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZiwgc2l6ZV90ICpsKTsKK0xVQUxJQl9BUEkgbHVhX051bWJlciAobHVhTF9jaGVja251bWJlcikgKGx1YV9TdGF0ZSAqTCwgaW50IG51bUFyZyk7CitMVUFMSUJfQVBJIGx1YV9OdW1iZXIgKGx1YUxfb3B0bnVtYmVyKSAobHVhX1N0YXRlICpMLCBpbnQgbkFyZywgbHVhX051bWJlciBkZWYpOworCitMVUFMSUJfQVBJIGx1YV9JbnRlZ2VyIChsdWFMX2NoZWNraW50ZWdlcikgKGx1YV9TdGF0ZSAqTCwgaW50IG51bUFyZyk7CitMVUFMSUJfQVBJIGx1YV9JbnRlZ2VyIChsdWFMX29wdGludGVnZXIpIChsdWFfU3RhdGUgKkwsIGludCBuQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhX0ludGVnZXIgZGVmKTsKKworTFVBTElCX0FQSSB2b2lkIChsdWFMX2NoZWNrc3RhY2spIChsdWFfU3RhdGUgKkwsIGludCBzeiwgY29uc3QgY2hhciAqbXNnKTsKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9jaGVja3R5cGUpIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBpbnQgdCk7CitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfY2hlY2thbnkpIChsdWFfU3RhdGUgKkwsIGludCBuYXJnKTsKKworTFVBTElCX0FQSSBpbnQgICAobHVhTF9uZXdtZXRhdGFibGUpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnRuYW1lKTsKK0xVQUxJQl9BUEkgdm9pZCAqKGx1YUxfY2hlY2t1ZGF0YSkgKGx1YV9TdGF0ZSAqTCwgaW50IHVkLCBjb25zdCBjaGFyICp0bmFtZSk7CisKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF93aGVyZSkgKGx1YV9TdGF0ZSAqTCwgaW50IGx2bCk7CitMVUFMSUJfQVBJIGludCAobHVhTF9lcnJvcikgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCitMVUFMSUJfQVBJIGludCAobHVhTF9jaGVja29wdGlvbikgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGNvbnN0IGNoYXIgKmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbHN0W10pOworCitMVUFMSUJfQVBJIGludCAobHVhTF9yZWYpIChsdWFfU3RhdGUgKkwsIGludCB0KTsKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF91bnJlZikgKGx1YV9TdGF0ZSAqTCwgaW50IHQsIGludCByZWYpOworCitMVUFMSUJfQVBJIGludCAobHVhTF9sb2FkZmlsZSkgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworTFVBTElCX0FQSSBpbnQgKGx1YUxfbG9hZGJ1ZmZlcikgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqYnVmZiwgc2l6ZV90IHN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworTFVBTElCX0FQSSBpbnQgKGx1YUxfbG9hZHN0cmluZykgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcyk7CisKK0xVQUxJQl9BUEkgbHVhX1N0YXRlICoobHVhTF9uZXdzdGF0ZSkgKHZvaWQpOworCisKK0xVQUxJQl9BUEkgY29uc3QgY2hhciAqKGx1YUxfZ3N1YikgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcik7CisKK0xVQUxJQl9BUEkgY29uc3QgY2hhciAqKGx1YUxfZmluZHRhYmxlKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbmFtZSwgaW50IHN6aGludCk7CisKKworCisKKy8qCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIHNvbWUgdXNlZnVsIG1hY3JvcworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIGx1YUxfYXJnY2hlY2soTCwgY29uZCxudW1hcmcsZXh0cmFtc2cpCVwKKwkJKCh2b2lkKSgoY29uZCkgfHwgbHVhTF9hcmdlcnJvcihMLCAobnVtYXJnKSwgKGV4dHJhbXNnKSkpKQorI2RlZmluZSBsdWFMX2NoZWNrc3RyaW5nKEwsbikJKGx1YUxfY2hlY2tsc3RyaW5nKEwsIChuKSwgTlVMTCkpCisjZGVmaW5lIGx1YUxfb3B0c3RyaW5nKEwsbixkKQkobHVhTF9vcHRsc3RyaW5nKEwsIChuKSwgKGQpLCBOVUxMKSkKKyNkZWZpbmUgbHVhTF9jaGVja2ludChMLG4pCSgoaW50KWx1YUxfY2hlY2tpbnRlZ2VyKEwsIChuKSkpCisjZGVmaW5lIGx1YUxfb3B0aW50KEwsbixkKQkoKGludClsdWFMX29wdGludGVnZXIoTCwgKG4pLCAoZCkpKQorI2RlZmluZSBsdWFMX2NoZWNrbG9uZyhMLG4pCSgobG9uZylsdWFMX2NoZWNraW50ZWdlcihMLCAobikpKQorI2RlZmluZSBsdWFMX29wdGxvbmcoTCxuLGQpCSgobG9uZylsdWFMX29wdGludGVnZXIoTCwgKG4pLCAoZCkpKQorCisjZGVmaW5lIGx1YUxfdHlwZW5hbWUoTCxpKQlsdWFfdHlwZW5hbWUoTCwgbHVhX3R5cGUoTCwoaSkpKQorCisjZGVmaW5lIGx1YUxfZG9maWxlKEwsIGZuKSBcCisJKGx1YUxfbG9hZGZpbGUoTCwgZm4pIHx8IGx1YV9wY2FsbChMLCAwLCBMVUFfTVVMVFJFVCwgMCkpCisKKyNkZWZpbmUgbHVhTF9kb3N0cmluZyhMLCBzKSBcCisJKGx1YUxfbG9hZHN0cmluZyhMLCBzKSB8fCBsdWFfcGNhbGwoTCwgMCwgTFVBX01VTFRSRVQsIDApKQorCisjZGVmaW5lIGx1YUxfZ2V0bWV0YXRhYmxlKEwsbikJKGx1YV9nZXRmaWVsZChMLCBMVUFfUkVHSVNUUllJTkRFWCwgKG4pKSkKKworI2RlZmluZSBsdWFMX29wdChMLGYsbixkKQkobHVhX2lzbm9uZW9ybmlsKEwsKG4pKSA/IChkKSA6IGYoTCwobikpKQorCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogR2VuZXJpYyBCdWZmZXIgbWFuaXB1bGF0aW9uCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKwordHlwZWRlZiBzdHJ1Y3QgbHVhTF9CdWZmZXIgeworICBjaGFyICpwOwkJCS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCisgIGludCBsdmw7ICAvKiBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgc3RhY2sgKGxldmVsKSAqLworICBsdWFfU3RhdGUgKkw7CisgIGNoYXIgYnVmZmVyW0xVQUxfQlVGRkVSU0laRV07Cit9IGx1YUxfQnVmZmVyOworCisjZGVmaW5lIGx1YUxfYWRkY2hhcihCLGMpIFwKKyAgKCh2b2lkKSgoQiktPnAgPCAoKEIpLT5idWZmZXIrTFVBTF9CVUZGRVJTSVpFKSB8fCBsdWFMX3ByZXBidWZmZXIoQikpLCBcCisgICAoKihCKS0+cCsrID0gKGNoYXIpKGMpKSkKKworLyogY29tcGF0aWJpbGl0eSBvbmx5ICovCisjZGVmaW5lIGx1YUxfcHV0Y2hhcihCLGMpCWx1YUxfYWRkY2hhcihCLGMpCisKKyNkZWZpbmUgbHVhTF9hZGRzaXplKEIsbikJKChCKS0+cCArPSAobikpCisKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9idWZmaW5pdCkgKGx1YV9TdGF0ZSAqTCwgbHVhTF9CdWZmZXIgKkIpOworTFVBTElCX0FQSSBjaGFyICoobHVhTF9wcmVwYnVmZmVyKSAobHVhTF9CdWZmZXIgKkIpOworTFVBTElCX0FQSSB2b2lkIChsdWFMX2FkZGxzdHJpbmcpIChsdWFMX0J1ZmZlciAqQiwgY29uc3QgY2hhciAqcywgc2l6ZV90IGwpOworTFVBTElCX0FQSSB2b2lkIChsdWFMX2FkZHN0cmluZykgKGx1YUxfQnVmZmVyICpCLCBjb25zdCBjaGFyICpzKTsKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9hZGR2YWx1ZSkgKGx1YUxfQnVmZmVyICpCKTsKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9wdXNocmVzdWx0KSAobHVhTF9CdWZmZXIgKkIpOworCisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKiBjb21wYXRpYmlsaXR5IHdpdGggcmVmIHN5c3RlbSAqLworCisvKiBwcmUtZGVmaW5lZCByZWZlcmVuY2VzICovCisjZGVmaW5lIExVQV9OT1JFRiAgICAgICAoLTIpCisjZGVmaW5lIExVQV9SRUZOSUwgICAgICAoLTEpCisKKyNkZWZpbmUgbHVhX3JlZihMLGxvY2spICgobG9jaykgPyBsdWFMX3JlZihMLCBMVUFfUkVHSVNUUllJTkRFWCkgOiBcCisgICAgICAobHVhX3B1c2hzdHJpbmcoTCwgInVubG9ja2VkIHJlZmVyZW5jZXMgYXJlIG9ic29sZXRlIiksIGx1YV9lcnJvcihMKSwgMCkpCisKKyNkZWZpbmUgbHVhX3VucmVmKEwscmVmKSAgICAgICAgbHVhTF91bnJlZihMLCBMVUFfUkVHSVNUUllJTkRFWCwgKHJlZikpCisKKyNkZWZpbmUgbHVhX2dldHJlZihMLHJlZikgICAgICAgbHVhX3Jhd2dldGkoTCwgTFVBX1JFR0lTVFJZSU5ERVgsIChyZWYpKQorCisKKyNkZWZpbmUgbHVhTF9yZWcJbHVhTF9SZWcKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sYmFzZWxpYi5jIGIvbHVhLTUuMS40L3NyYy9sYmFzZWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGMwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xiYXNlbGliLmMKQEAgLTAsMCArMSw2NTMgQEAKKy8qCisqKiAkSWQ6IGxiYXNlbGliLmMsdiAxLjE5MS4xLjYgMjAwOC8wMi8xNCAxNjo0NjoyMiByb2JlcnRvIEV4cCAkCisqKiBCYXNpYyBsaWJyYXJ5CisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbGJhc2VsaWJfYworI2RlZmluZSBMVUFfTElCCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKworCisKKworLyoKKyoqIElmIHlvdXIgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgYHN0ZG91dCcsIHlvdSBjYW4ganVzdCByZW1vdmUgdGhpcyBmdW5jdGlvbi4KKyoqIElmIHlvdSBuZWVkLCB5b3UgY2FuIGRlZmluZSB5b3VyIG93biBgcHJpbnQnIGZ1bmN0aW9uLCBmb2xsb3dpbmcgdGhpcworKiogbW9kZWwgYnV0IGNoYW5naW5nIGBmcHV0cycgdG8gcHV0IHRoZSBzdHJpbmdzIGF0IGEgcHJvcGVyIHBsYWNlCisqKiAoYSBjb25zb2xlIHdpbmRvdyBvciBhIGxvZyBmaWxlLCBmb3IgaW5zdGFuY2UpLgorKi8KK3N0YXRpYyBpbnQgbHVhQl9wcmludCAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gbHVhX2dldHRvcChMKTsgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgaW50IGk7CisgIGx1YV9nZXRnbG9iYWwoTCwgInRvc3RyaW5nIik7CisgIGZvciAoaT0xOyBpPD1uOyBpKyspIHsKKyAgICBjb25zdCBjaGFyICpzOworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOyAgLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkICovCisgICAgbHVhX3B1c2h2YWx1ZShMLCBpKTsgICAvKiB2YWx1ZSB0byBwcmludCAqLworICAgIGx1YV9jYWxsKEwsIDEsIDEpOworICAgIHMgPSBsdWFfdG9zdHJpbmcoTCwgLTEpOyAgLyogZ2V0IHJlc3VsdCAqLworICAgIGlmIChzID09IE5VTEwpCisgICAgICByZXR1cm4gbHVhTF9lcnJvcihMLCBMVUFfUUwoInRvc3RyaW5nIikgIiBtdXN0IHJldHVybiBhIHN0cmluZyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVUFfUUwoInByaW50IikpOworICAgIGlmIChpPjEpIGZwdXRzKCJcdCIsIHN0ZG91dCk7CisgICAgZnB1dHMocywgc3Rkb3V0KTsKKyAgICBsdWFfcG9wKEwsIDEpOyAgLyogcG9wIHJlc3VsdCAqLworICB9CisgIGZwdXRzKCJcbiIsIHN0ZG91dCk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl90b251bWJlciAobHVhX1N0YXRlICpMKSB7CisgIGludCBiYXNlID0gbHVhTF9vcHRpbnQoTCwgMiwgMTApOworICBpZiAoYmFzZSA9PSAxMCkgeyAgLyogc3RhbmRhcmQgY29udmVyc2lvbiAqLworICAgIGx1YUxfY2hlY2thbnkoTCwgMSk7CisgICAgaWYgKGx1YV9pc251bWJlcihMLCAxKSkgeworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgbHVhX3RvbnVtYmVyKEwsIDEpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBjaGFyICpzMSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgICAgY2hhciAqczI7CisgICAgdW5zaWduZWQgbG9uZyBuOworICAgIGx1YUxfYXJnY2hlY2soTCwgMiA8PSBiYXNlICYmIGJhc2UgPD0gMzYsIDIsICJiYXNlIG91dCBvZiByYW5nZSIpOworICAgIG4gPSBzdHJ0b3VsKHMxLCAmczIsIGJhc2UpOworICAgIGlmIChzMSAhPSBzMikgeyAgLyogYXQgbGVhc3Qgb25lIHZhbGlkIGRpZ2l0PyAqLworICAgICAgd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKCpzMikpKSBzMisrOyAgLyogc2tpcCB0cmFpbGluZyBzcGFjZXMgKi8KKyAgICAgIGlmICgqczIgPT0gJ1wwJykgeyAgLyogbm8gaW52YWxpZCB0cmFpbGluZyBjaGFyYWN0ZXJzPyAqLworICAgICAgICBsdWFfcHVzaG51bWJlcihMLCAobHVhX051bWJlciluKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIGx1YV9wdXNobmlsKEwpOyAgLyogZWxzZSBub3QgYSBudW1iZXIgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX2Vycm9yIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGxldmVsID0gbHVhTF9vcHRpbnQoTCwgMiwgMSk7CisgIGx1YV9zZXR0b3AoTCwgMSk7CisgIGlmIChsdWFfaXNzdHJpbmcoTCwgMSkgJiYgbGV2ZWwgPiAwKSB7ICAvKiBhZGQgZXh0cmEgaW5mb3JtYXRpb24/ICovCisgICAgbHVhTF93aGVyZShMLCBsZXZlbCk7CisgICAgbHVhX3B1c2h2YWx1ZShMLCAxKTsKKyAgICBsdWFfY29uY2F0KEwsIDIpOworICB9CisgIHJldHVybiBsdWFfZXJyb3IoTCk7Cit9CisKKworc3RhdGljIGludCBsdWFCX2dldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2thbnkoTCwgMSk7CisgIGlmICghbHVhX2dldG1ldGF0YWJsZShMLCAxKSkgeworICAgIGx1YV9wdXNobmlsKEwpOworICAgIHJldHVybiAxOyAgLyogbm8gbWV0YXRhYmxlICovCisgIH0KKyAgbHVhTF9nZXRtZXRhZmllbGQoTCwgMSwgIl9fbWV0YXRhYmxlIik7CisgIHJldHVybiAxOyAgLyogcmV0dXJucyBlaXRoZXIgX19tZXRhdGFibGUgZmllbGQgKGlmIHByZXNlbnQpIG9yIG1ldGF0YWJsZSAqLworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9zZXRtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgdCA9IGx1YV90eXBlKEwsIDIpOworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgbHVhTF9hcmdjaGVjayhMLCB0ID09IExVQV9UTklMIHx8IHQgPT0gTFVBX1RUQUJMRSwgMiwKKyAgICAgICAgICAgICAgICAgICAgIm5pbCBvciB0YWJsZSBleHBlY3RlZCIpOworICBpZiAobHVhTF9nZXRtZXRhZmllbGQoTCwgMSwgIl9fbWV0YXRhYmxlIikpCisgICAgbHVhTF9lcnJvcihMLCAiY2Fubm90IGNoYW5nZSBhIHByb3RlY3RlZCBtZXRhdGFibGUiKTsKKyAgbHVhX3NldHRvcChMLCAyKTsKKyAgbHVhX3NldG1ldGF0YWJsZShMLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgZ2V0ZnVuYyAobHVhX1N0YXRlICpMLCBpbnQgb3B0KSB7CisgIGlmIChsdWFfaXNmdW5jdGlvbihMLCAxKSkgbHVhX3B1c2h2YWx1ZShMLCAxKTsKKyAgZWxzZSB7CisgICAgbHVhX0RlYnVnIGFyOworICAgIGludCBsZXZlbCA9IG9wdCA/IGx1YUxfb3B0aW50KEwsIDEsIDEpIDogbHVhTF9jaGVja2ludChMLCAxKTsKKyAgICBsdWFMX2FyZ2NoZWNrKEwsIGxldmVsID49IDAsIDEsICJsZXZlbCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgIGlmIChsdWFfZ2V0c3RhY2soTCwgbGV2ZWwsICZhcikgPT0gMCkKKyAgICAgIGx1YUxfYXJnZXJyb3IoTCwgMSwgImludmFsaWQgbGV2ZWwiKTsKKyAgICBsdWFfZ2V0aW5mbyhMLCAiZiIsICZhcik7CisgICAgaWYgKGx1YV9pc25pbChMLCAtMSkpCisgICAgICBsdWFMX2Vycm9yKEwsICJubyBmdW5jdGlvbiBlbnZpcm9ubWVudCBmb3IgdGFpbCBjYWxsIGF0IGxldmVsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworICB9Cit9CisKKworc3RhdGljIGludCBsdWFCX2dldGZlbnYgKGx1YV9TdGF0ZSAqTCkgeworICBnZXRmdW5jKEwsIDEpOworICBpZiAobHVhX2lzY2Z1bmN0aW9uKEwsIC0xKSkgIC8qIGlzIGEgQyBmdW5jdGlvbj8gKi8KKyAgICBsdWFfcHVzaHZhbHVlKEwsIExVQV9HTE9CQUxTSU5ERVgpOyAgLyogcmV0dXJuIHRoZSB0aHJlYWQncyBnbG9iYWwgZW52LiAqLworICBlbHNlCisgICAgbHVhX2dldGZlbnYoTCwgLTEpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfc2V0ZmVudiAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDIsIExVQV9UVEFCTEUpOworICBnZXRmdW5jKEwsIDApOworICBsdWFfcHVzaHZhbHVlKEwsIDIpOworICBpZiAobHVhX2lzbnVtYmVyKEwsIDEpICYmIGx1YV90b251bWJlcihMLCAxKSA9PSAwKSB7CisgICAgLyogY2hhbmdlIGVudmlyb25tZW50IG9mIGN1cnJlbnQgdGhyZWFkICovCisgICAgbHVhX3B1c2h0aHJlYWQoTCk7CisgICAgbHVhX2luc2VydChMLCAtMik7CisgICAgbHVhX3NldGZlbnYoTCwgLTIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgaWYgKGx1YV9pc2NmdW5jdGlvbihMLCAtMikgfHwgbHVhX3NldGZlbnYoTCwgLTIpID09IDApCisgICAgbHVhTF9lcnJvcihMLAorICAgICAgICAgIExVQV9RTCgic2V0ZmVudiIpICIgY2Fubm90IGNoYW5nZSBlbnZpcm9ubWVudCBvZiBnaXZlbiBvYmplY3QiKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX3Jhd2VxdWFsIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgbHVhTF9jaGVja2FueShMLCAyKTsKKyAgbHVhX3B1c2hib29sZWFuKEwsIGx1YV9yYXdlcXVhbChMLCAxLCAyKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9yYXdnZXQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgbHVhTF9jaGVja2FueShMLCAyKTsKKyAgbHVhX3NldHRvcChMLCAyKTsKKyAgbHVhX3Jhd2dldChMLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbHVhQl9yYXdzZXQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgbHVhTF9jaGVja2FueShMLCAyKTsKKyAgbHVhTF9jaGVja2FueShMLCAzKTsKKyAgbHVhX3NldHRvcChMLCAzKTsKKyAgbHVhX3Jhd3NldChMLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX2djaW5mbyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNoaW50ZWdlcihMLCBsdWFfZ2V0Z2Njb3VudChMKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9jb2xsZWN0Z2FyYmFnZSAobHVhX1N0YXRlICpMKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBvcHRzW10gPSB7InN0b3AiLCAicmVzdGFydCIsICJjb2xsZWN0IiwKKyAgICAiY291bnQiLCAic3RlcCIsICJzZXRwYXVzZSIsICJzZXRzdGVwbXVsIiwgTlVMTH07CisgIHN0YXRpYyBjb25zdCBpbnQgb3B0c251bVtdID0ge0xVQV9HQ1NUT1AsIExVQV9HQ1JFU1RBUlQsIExVQV9HQ0NPTExFQ1QsCisgICAgTFVBX0dDQ09VTlQsIExVQV9HQ1NURVAsIExVQV9HQ1NFVFBBVVNFLCBMVUFfR0NTRVRTVEVQTVVMfTsKKyAgaW50IG8gPSBsdWFMX2NoZWNrb3B0aW9uKEwsIDEsICJjb2xsZWN0Iiwgb3B0cyk7CisgIGludCBleCA9IGx1YUxfb3B0aW50KEwsIDIsIDApOworICBpbnQgcmVzID0gbHVhX2djKEwsIG9wdHNudW1bb10sIGV4KTsKKyAgc3dpdGNoIChvcHRzbnVtW29dKSB7CisgICAgY2FzZSBMVUFfR0NDT1VOVDogeworICAgICAgaW50IGIgPSBsdWFfZ2MoTCwgTFVBX0dDQ09VTlRCLCAwKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHJlcyArICgobHVhX051bWJlciliLzEwMjQpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBjYXNlIExVQV9HQ1NURVA6IHsKKyAgICAgIGx1YV9wdXNoYm9vbGVhbihMLCByZXMpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHJlcyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgaW50IGx1YUJfdHlwZSAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2thbnkoTCwgMSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGx1YUxfdHlwZW5hbWUoTCwgMSkpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfbmV4dCAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOworICBsdWFfc2V0dG9wKEwsIDIpOyAgLyogY3JlYXRlIGEgMm5kIGFyZ3VtZW50IGlmIHRoZXJlIGlzbid0IG9uZSAqLworICBpZiAobHVhX25leHQoTCwgMSkpCisgICAgcmV0dXJuIDI7CisgIGVsc2UgeworICAgIGx1YV9wdXNobmlsKEwpOworICAgIHJldHVybiAxOworICB9Cit9CisKKworc3RhdGljIGludCBsdWFCX3BhaXJzIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RUQUJMRSk7CisgIGx1YV9wdXNodmFsdWUoTCwgbHVhX3VwdmFsdWVpbmRleCgxKSk7ICAvKiByZXR1cm4gZ2VuZXJhdG9yLCAqLworICBsdWFfcHVzaHZhbHVlKEwsIDEpOyAgLyogc3RhdGUsICovCisgIGx1YV9wdXNobmlsKEwpOyAgLyogYW5kIGluaXRpYWwgdmFsdWUgKi8KKyAgcmV0dXJuIDM7Cit9CisKKworc3RhdGljIGludCBpcGFpcnNhdXggKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgaSA9IGx1YUxfY2hlY2tpbnQoTCwgMik7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOworICBpKys7ICAvKiBuZXh0IHZhbHVlICovCisgIGx1YV9wdXNoaW50ZWdlcihMLCBpKTsKKyAgbHVhX3Jhd2dldGkoTCwgMSwgaSk7CisgIHJldHVybiAobHVhX2lzbmlsKEwsIC0xKSkgPyAwIDogMjsKK30KKworCitzdGF0aWMgaW50IGx1YUJfaXBhaXJzIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RUQUJMRSk7CisgIGx1YV9wdXNodmFsdWUoTCwgbHVhX3VwdmFsdWVpbmRleCgxKSk7ICAvKiByZXR1cm4gZ2VuZXJhdG9yLCAqLworICBsdWFfcHVzaHZhbHVlKEwsIDEpOyAgLyogc3RhdGUsICovCisgIGx1YV9wdXNoaW50ZWdlcihMLCAwKTsgIC8qIGFuZCBpbml0aWFsIHZhbHVlICovCisgIHJldHVybiAzOworfQorCisKK3N0YXRpYyBpbnQgbG9hZF9hdXggKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXR1cykgeworICBpZiAoc3RhdHVzID09IDApICAvKiBPSz8gKi8KKyAgICByZXR1cm4gMTsKKyAgZWxzZSB7CisgICAgbHVhX3B1c2huaWwoTCk7CisgICAgbHVhX2luc2VydChMLCAtMik7ICAvKiBwdXQgYmVmb3JlIGVycm9yIG1lc3NhZ2UgKi8KKyAgICByZXR1cm4gMjsgIC8qIHJldHVybiBuaWwgcGx1cyBlcnJvciBtZXNzYWdlICovCisgIH0KK30KKworCitzdGF0aWMgaW50IGx1YUJfbG9hZHN0cmluZyAobHVhX1N0YXRlICpMKSB7CisgIHNpemVfdCBsOworICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMSwgJmwpOworICBjb25zdCBjaGFyICpjaHVua25hbWUgPSBsdWFMX29wdHN0cmluZyhMLCAyLCBzKTsKKyAgcmV0dXJuIGxvYWRfYXV4KEwsIGx1YUxfbG9hZGJ1ZmZlcihMLCBzLCBsLCBjaHVua25hbWUpKTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfbG9hZGZpbGUgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpmbmFtZSA9IGx1YUxfb3B0c3RyaW5nKEwsIDEsIE5VTEwpOworICByZXR1cm4gbG9hZF9hdXgoTCwgbHVhTF9sb2FkZmlsZShMLCBmbmFtZSkpOworfQorCisKKy8qCisqKiBSZWFkZXIgZm9yIGdlbmVyaWMgYGxvYWQnIGZ1bmN0aW9uOiBgbHVhX2xvYWQnIHVzZXMgdGhlCisqKiBzdGFjayBmb3IgaW50ZXJuYWwgc3R1ZmYsIHNvIHRoZSByZWFkZXIgY2Fubm90IGNoYW5nZSB0aGUKKyoqIHN0YWNrIHRvcC4gSW5zdGVhZCwgaXQga2VlcHMgaXRzIHJlc3VsdGluZyBzdHJpbmcgaW4gYQorKiogcmVzZXJ2ZWQgc2xvdCBpbnNpZGUgdGhlIHN0YWNrLgorKi8KK3N0YXRpYyBjb25zdCBjaGFyICpnZW5lcmljX3JlYWRlciAobHVhX1N0YXRlICpMLCB2b2lkICp1ZCwgc2l6ZV90ICpzaXplKSB7CisgICh2b2lkKXVkOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KKyAgbHVhTF9jaGVja3N0YWNrKEwsIDIsICJ0b28gbWFueSBuZXN0ZWQgZnVuY3Rpb25zIik7CisgIGx1YV9wdXNodmFsdWUoTCwgMSk7ICAvKiBnZXQgZnVuY3Rpb24gKi8KKyAgbHVhX2NhbGwoTCwgMCwgMSk7ICAvKiBjYWxsIGl0ICovCisgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgKnNpemUgPSAwOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKGx1YV9pc3N0cmluZyhMLCAtMSkpIHsKKyAgICBsdWFfcmVwbGFjZShMLCAzKTsgIC8qIHNhdmUgc3RyaW5nIGluIGEgcmVzZXJ2ZWQgc3RhY2sgc2xvdCAqLworICAgIHJldHVybiBsdWFfdG9sc3RyaW5nKEwsIDMsIHNpemUpOworICB9CisgIGVsc2UgbHVhTF9lcnJvcihMLCAicmVhZGVyIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgc3RyaW5nIik7CisgIHJldHVybiBOVUxMOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KK30KKworCitzdGF0aWMgaW50IGx1YUJfbG9hZCAobHVhX1N0YXRlICpMKSB7CisgIGludCBzdGF0dXM7CisgIGNvbnN0IGNoYXIgKmNuYW1lID0gbHVhTF9vcHRzdHJpbmcoTCwgMiwgIj0obG9hZCkiKTsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RGVU5DVElPTik7CisgIGx1YV9zZXR0b3AoTCwgMyk7ICAvKiBmdW5jdGlvbiwgZXZlbnR1YWwgbmFtZSwgcGx1cyBvbmUgcmVzZXJ2ZWQgc2xvdCAqLworICBzdGF0dXMgPSBsdWFfbG9hZChMLCBnZW5lcmljX3JlYWRlciwgTlVMTCwgY25hbWUpOworICByZXR1cm4gbG9hZF9hdXgoTCwgc3RhdHVzKTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfZG9maWxlIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZm5hbWUgPSBsdWFMX29wdHN0cmluZyhMLCAxLCBOVUxMKTsKKyAgaW50IG4gPSBsdWFfZ2V0dG9wKEwpOworICBpZiAobHVhTF9sb2FkZmlsZShMLCBmbmFtZSkgIT0gMCkgbHVhX2Vycm9yKEwpOworICBsdWFfY2FsbChMLCAwLCBMVUFfTVVMVFJFVCk7CisgIHJldHVybiBsdWFfZ2V0dG9wKEwpIC0gbjsKK30KKworCitzdGF0aWMgaW50IGx1YUJfYXNzZXJ0IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgaWYgKCFsdWFfdG9ib29sZWFuKEwsIDEpKQorICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICIlcyIsIGx1YUxfb3B0c3RyaW5nKEwsIDIsICJhc3NlcnRpb24gZmFpbGVkISIpKTsKKyAgcmV0dXJuIGx1YV9nZXR0b3AoTCk7Cit9CisKKworc3RhdGljIGludCBsdWFCX3VucGFjayAobHVhX1N0YXRlICpMKSB7CisgIGludCBpLCBlLCBuOworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgaSA9IGx1YUxfb3B0aW50KEwsIDIsIDEpOworICBlID0gbHVhTF9vcHQoTCwgbHVhTF9jaGVja2ludCwgMywgbHVhTF9nZXRuKEwsIDEpKTsKKyAgaWYgKGkgPiBlKSByZXR1cm4gMDsgIC8qIGVtcHR5IHJhbmdlICovCisgIG4gPSBlIC0gaSArIDE7ICAvKiBudW1iZXIgb2YgZWxlbWVudHMgKi8KKyAgaWYgKG4gPD0gMCB8fCAhbHVhX2NoZWNrc3RhY2soTCwgbikpICAvKiBuIDw9IDAgbWVhbnMgYXJpdGguIG92ZXJmbG93ICovCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgInRvbyBtYW55IHJlc3VsdHMgdG8gdW5wYWNrIik7CisgIGx1YV9yYXdnZXRpKEwsIDEsIGkpOyAgLyogcHVzaCBhcmdbaV0gKGF2b2lkaW5nIG92ZXJmbG93IHByb2JsZW1zKSAqLworICB3aGlsZSAoaSsrIDwgZSkgIC8qIHB1c2ggYXJnW2kgKyAxLi4uZV0gKi8KKyAgICBsdWFfcmF3Z2V0aShMLCAxLCBpKTsKKyAgcmV0dXJuIG47Cit9CisKKworc3RhdGljIGludCBsdWFCX3NlbGVjdCAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gbHVhX2dldHRvcChMKTsKKyAgaWYgKGx1YV90eXBlKEwsIDEpID09IExVQV9UU1RSSU5HICYmICpsdWFfdG9zdHJpbmcoTCwgMSkgPT0gJyMnKSB7CisgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIG4tMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICAgaW50IGkgPSBsdWFMX2NoZWNraW50KEwsIDEpOworICAgIGlmIChpIDwgMCkgaSA9IG4gKyBpOworICAgIGVsc2UgaWYgKGkgPiBuKSBpID0gbjsKKyAgICBsdWFMX2FyZ2NoZWNrKEwsIDEgPD0gaSwgMSwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBuIC0gaTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbHVhQl9wY2FsbCAobHVhX1N0YXRlICpMKSB7CisgIGludCBzdGF0dXM7CisgIGx1YUxfY2hlY2thbnkoTCwgMSk7CisgIHN0YXR1cyA9IGx1YV9wY2FsbChMLCBsdWFfZ2V0dG9wKEwpIC0gMSwgTFVBX01VTFRSRVQsIDApOworICBsdWFfcHVzaGJvb2xlYW4oTCwgKHN0YXR1cyA9PSAwKSk7CisgIGx1YV9pbnNlcnQoTCwgMSk7CisgIHJldHVybiBsdWFfZ2V0dG9wKEwpOyAgLyogcmV0dXJuIHN0YXR1cyArIGFsbCByZXN1bHRzICovCit9CisKKworc3RhdGljIGludCBsdWFCX3hwY2FsbCAobHVhX1N0YXRlICpMKSB7CisgIGludCBzdGF0dXM7CisgIGx1YUxfY2hlY2thbnkoTCwgMik7CisgIGx1YV9zZXR0b3AoTCwgMik7CisgIGx1YV9pbnNlcnQoTCwgMSk7ICAvKiBwdXQgZXJyb3IgZnVuY3Rpb24gdW5kZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkICovCisgIHN0YXR1cyA9IGx1YV9wY2FsbChMLCAwLCBMVUFfTVVMVFJFVCwgMSk7CisgIGx1YV9wdXNoYm9vbGVhbihMLCAoc3RhdHVzID09IDApKTsKKyAgbHVhX3JlcGxhY2UoTCwgMSk7CisgIHJldHVybiBsdWFfZ2V0dG9wKEwpOyAgLyogcmV0dXJuIHN0YXR1cyArIGFsbCByZXN1bHRzICovCit9CisKKworc3RhdGljIGludCBsdWFCX3Rvc3RyaW5nIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgaWYgKGx1YUxfY2FsbG1ldGEoTCwgMSwgIl9fdG9zdHJpbmciKSkgIC8qIGlzIHRoZXJlIGEgbWV0YWZpZWxkPyAqLworICAgIHJldHVybiAxOyAgLyogdXNlIGl0cyB2YWx1ZSAqLworICBzd2l0Y2ggKGx1YV90eXBlKEwsIDEpKSB7CisgICAgY2FzZSBMVUFfVE5VTUJFUjoKKyAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIGx1YV90b3N0cmluZyhMLCAxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExVQV9UU1RSSU5HOgorICAgICAgbHVhX3B1c2h2YWx1ZShMLCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTFVBX1RCT09MRUFOOgorICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgKGx1YV90b2Jvb2xlYW4oTCwgMSkgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExVQV9UTklMOgorICAgICAgbHVhX3B1c2hsaXRlcmFsKEwsICJuaWwiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzOiAlcCIsIGx1YUxfdHlwZW5hbWUoTCwgMSksIGx1YV90b3BvaW50ZXIoTCwgMSkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX25ld3Byb3h5IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3NldHRvcChMLCAxKTsKKyAgbHVhX25ld3VzZXJkYXRhKEwsIDApOyAgLyogY3JlYXRlIHByb3h5ICovCisgIGlmIChsdWFfdG9ib29sZWFuKEwsIDEpID09IDApCisgICAgcmV0dXJuIDE7ICAvKiBubyBtZXRhdGFibGUgKi8KKyAgZWxzZSBpZiAobHVhX2lzYm9vbGVhbihMLCAxKSkgeworICAgIGx1YV9uZXd0YWJsZShMKTsgIC8qIGNyZWF0ZSBhIG5ldyBtZXRhdGFibGUgYG0nIC4uLiAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOyAgLyogLi4uIGFuZCBtYXJrIGBtJyBhcyBhIHZhbGlkIG1ldGF0YWJsZSAqLworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsKKyAgICBsdWFfcmF3c2V0KEwsIGx1YV91cHZhbHVlaW5kZXgoMSkpOyAgLyogd2Vha3RhYmxlW21dID0gdHJ1ZSAqLworICB9CisgIGVsc2UgeworICAgIGludCB2YWxpZHByb3h5ID0gMDsgIC8qIHRvIGNoZWNrIGlmIHdlYWt0YWJsZVttZXRhdGFibGUodSldID09IHRydWUgKi8KKyAgICBpZiAobHVhX2dldG1ldGF0YWJsZShMLCAxKSkgeworICAgICAgbHVhX3Jhd2dldChMLCBsdWFfdXB2YWx1ZWluZGV4KDEpKTsKKyAgICAgIHZhbGlkcHJveHkgPSBsdWFfdG9ib29sZWFuKEwsIC0xKTsKKyAgICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgdmFsdWUgKi8KKyAgICB9CisgICAgbHVhTF9hcmdjaGVjayhMLCB2YWxpZHByb3h5LCAxLCAiYm9vbGVhbiBvciBwcm94eSBleHBlY3RlZCIpOworICAgIGx1YV9nZXRtZXRhdGFibGUoTCwgMSk7ICAvKiBtZXRhdGFibGUgaXMgdmFsaWQ7IGdldCBpdCAqLworICB9CisgIGx1YV9zZXRtZXRhdGFibGUoTCwgMik7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBiYXNlX2Z1bmNzW10gPSB7CisgIHsiYXNzZXJ0IiwgbHVhQl9hc3NlcnR9LAorICB7ImNvbGxlY3RnYXJiYWdlIiwgbHVhQl9jb2xsZWN0Z2FyYmFnZX0sCisgIHsiZG9maWxlIiwgbHVhQl9kb2ZpbGV9LAorICB7ImVycm9yIiwgbHVhQl9lcnJvcn0sCisgIHsiZ2NpbmZvIiwgbHVhQl9nY2luZm99LAorICB7ImdldGZlbnYiLCBsdWFCX2dldGZlbnZ9LAorICB7ImdldG1ldGF0YWJsZSIsIGx1YUJfZ2V0bWV0YXRhYmxlfSwKKyAgeyJsb2FkZmlsZSIsIGx1YUJfbG9hZGZpbGV9LAorICB7ImxvYWQiLCBsdWFCX2xvYWR9LAorICB7ImxvYWRzdHJpbmciLCBsdWFCX2xvYWRzdHJpbmd9LAorICB7Im5leHQiLCBsdWFCX25leHR9LAorICB7InBjYWxsIiwgbHVhQl9wY2FsbH0sCisgIHsicHJpbnQiLCBsdWFCX3ByaW50fSwKKyAgeyJyYXdlcXVhbCIsIGx1YUJfcmF3ZXF1YWx9LAorICB7InJhd2dldCIsIGx1YUJfcmF3Z2V0fSwKKyAgeyJyYXdzZXQiLCBsdWFCX3Jhd3NldH0sCisgIHsic2VsZWN0IiwgbHVhQl9zZWxlY3R9LAorICB7InNldGZlbnYiLCBsdWFCX3NldGZlbnZ9LAorICB7InNldG1ldGF0YWJsZSIsIGx1YUJfc2V0bWV0YXRhYmxlfSwKKyAgeyJ0b251bWJlciIsIGx1YUJfdG9udW1iZXJ9LAorICB7InRvc3RyaW5nIiwgbHVhQl90b3N0cmluZ30sCisgIHsidHlwZSIsIGx1YUJfdHlwZX0sCisgIHsidW5wYWNrIiwgbHVhQl91bnBhY2t9LAorICB7InhwY2FsbCIsIGx1YUJfeHBjYWxsfSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBDb3JvdXRpbmUgbGlicmFyeQorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZSBDT19SVU4JMAkvKiBydW5uaW5nICovCisjZGVmaW5lIENPX1NVUwkxCS8qIHN1c3BlbmRlZCAqLworI2RlZmluZSBDT19OT1IJMgkvKiAnbm9ybWFsJyAoaXQgcmVzdW1lZCBhbm90aGVyIGNvcm91dGluZSkgKi8KKyNkZWZpbmUgQ09fREVBRAkzCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdGF0bmFtZXNbXSA9CisgICAgeyJydW5uaW5nIiwgInN1c3BlbmRlZCIsICJub3JtYWwiLCAiZGVhZCJ9OworCitzdGF0aWMgaW50IGNvc3RhdHVzIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqY28pIHsKKyAgaWYgKEwgPT0gY28pIHJldHVybiBDT19SVU47CisgIHN3aXRjaCAobHVhX3N0YXR1cyhjbykpIHsKKyAgICBjYXNlIExVQV9ZSUVMRDoKKyAgICAgIHJldHVybiBDT19TVVM7CisgICAgY2FzZSAwOiB7CisgICAgICBsdWFfRGVidWcgYXI7CisgICAgICBpZiAobHVhX2dldHN0YWNrKGNvLCAwLCAmYXIpID4gMCkgIC8qIGRvZXMgaXQgaGF2ZSBmcmFtZXM/ICovCisgICAgICAgIHJldHVybiBDT19OT1I7ICAvKiBpdCBpcyBydW5uaW5nICovCisgICAgICBlbHNlIGlmIChsdWFfZ2V0dG9wKGNvKSA9PSAwKQorICAgICAgICAgIHJldHVybiBDT19ERUFEOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gQ09fU1VTOyAgLyogaW5pdGlhbCBzdGF0ZSAqLworICAgIH0KKyAgICBkZWZhdWx0OiAgLyogc29tZSBlcnJvciBvY2N1cmVkICovCisgICAgICByZXR1cm4gQ09fREVBRDsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbHVhQl9jb3N0YXR1cyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9TdGF0ZSAqY28gPSBsdWFfdG90aHJlYWQoTCwgMSk7CisgIGx1YUxfYXJnY2hlY2soTCwgY28sIDEsICJjb3JvdXRpbmUgZXhwZWN0ZWQiKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgc3RhdG5hbWVzW2Nvc3RhdHVzKEwsIGNvKV0pOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGF1eHJlc3VtZSAobHVhX1N0YXRlICpMLCBsdWFfU3RhdGUgKmNvLCBpbnQgbmFyZykgeworICBpbnQgc3RhdHVzID0gY29zdGF0dXMoTCwgY28pOworICBpZiAoIWx1YV9jaGVja3N0YWNrKGNvLCBuYXJnKSkKKyAgICBsdWFMX2Vycm9yKEwsICJ0b28gbWFueSBhcmd1bWVudHMgdG8gcmVzdW1lIik7CisgIGlmIChzdGF0dXMgIT0gQ09fU1VTKSB7CisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJjYW5ub3QgcmVzdW1lICVzIGNvcm91dGluZSIsIHN0YXRuYW1lc1tzdGF0dXNdKTsKKyAgICByZXR1cm4gLTE7ICAvKiBlcnJvciBmbGFnICovCisgIH0KKyAgbHVhX3htb3ZlKEwsIGNvLCBuYXJnKTsKKyAgbHVhX3NldGxldmVsKEwsIGNvKTsKKyAgc3RhdHVzID0gbHVhX3Jlc3VtZShjbywgbmFyZyk7CisgIGlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gTFVBX1lJRUxEKSB7CisgICAgaW50IG5yZXMgPSBsdWFfZ2V0dG9wKGNvKTsKKyAgICBpZiAoIWx1YV9jaGVja3N0YWNrKEwsIG5yZXMgKyAxKSkKKyAgICAgIGx1YUxfZXJyb3IoTCwgInRvbyBtYW55IHJlc3VsdHMgdG8gcmVzdW1lIik7CisgICAgbHVhX3htb3ZlKGNvLCBMLCBucmVzKTsgIC8qIG1vdmUgeWllbGRlZCB2YWx1ZXMgKi8KKyAgICByZXR1cm4gbnJlczsKKyAgfQorICBlbHNlIHsKKyAgICBsdWFfeG1vdmUoY28sIEwsIDEpOyAgLyogbW92ZSBlcnJvciBtZXNzYWdlICovCisgICAgcmV0dXJuIC0xOyAgLyogZXJyb3IgZmxhZyAqLworICB9Cit9CisKKworc3RhdGljIGludCBsdWFCX2NvcmVzdW1lIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX1N0YXRlICpjbyA9IGx1YV90b3RocmVhZChMLCAxKTsKKyAgaW50IHI7CisgIGx1YUxfYXJnY2hlY2soTCwgY28sIDEsICJjb3JvdXRpbmUgZXhwZWN0ZWQiKTsKKyAgciA9IGF1eHJlc3VtZShMLCBjbywgbHVhX2dldHRvcChMKSAtIDEpOworICBpZiAociA8IDApIHsKKyAgICBsdWFfcHVzaGJvb2xlYW4oTCwgMCk7CisgICAgbHVhX2luc2VydChMLCAtMik7CisgICAgcmV0dXJuIDI7ICAvKiByZXR1cm4gZmFsc2UgKyBlcnJvciBtZXNzYWdlICovCisgIH0KKyAgZWxzZSB7CisgICAgbHVhX3B1c2hib29sZWFuKEwsIDEpOworICAgIGx1YV9pbnNlcnQoTCwgLShyICsgMSkpOworICAgIHJldHVybiByICsgMTsgIC8qIHJldHVybiB0cnVlICsgYHJlc3VtZScgcmV0dXJucyAqLworICB9Cit9CisKKworc3RhdGljIGludCBsdWFCX2F1eHdyYXAgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfU3RhdGUgKmNvID0gbHVhX3RvdGhyZWFkKEwsIGx1YV91cHZhbHVlaW5kZXgoMSkpOworICBpbnQgciA9IGF1eHJlc3VtZShMLCBjbywgbHVhX2dldHRvcChMKSk7CisgIGlmIChyIDwgMCkgeworICAgIGlmIChsdWFfaXNzdHJpbmcoTCwgLTEpKSB7ICAvKiBlcnJvciBvYmplY3QgaXMgYSBzdHJpbmc/ICovCisgICAgICBsdWFMX3doZXJlKEwsIDEpOyAgLyogYWRkIGV4dHJhIGluZm8gKi8KKyAgICAgIGx1YV9pbnNlcnQoTCwgLTIpOworICAgICAgbHVhX2NvbmNhdChMLCAyKTsKKyAgICB9CisgICAgbHVhX2Vycm9yKEwpOyAgLyogcHJvcGFnYXRlIGVycm9yICovCisgIH0KKyAgcmV0dXJuIHI7Cit9CisKKworc3RhdGljIGludCBsdWFCX2NvY3JlYXRlIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX1N0YXRlICpOTCA9IGx1YV9uZXd0aHJlYWQoTCk7CisgIGx1YUxfYXJnY2hlY2soTCwgbHVhX2lzZnVuY3Rpb24oTCwgMSkgJiYgIWx1YV9pc2NmdW5jdGlvbihMLCAxKSwgMSwKKyAgICAiTHVhIGZ1bmN0aW9uIGV4cGVjdGVkIik7CisgIGx1YV9wdXNodmFsdWUoTCwgMSk7ICAvKiBtb3ZlIGZ1bmN0aW9uIHRvIHRvcCAqLworICBsdWFfeG1vdmUoTCwgTkwsIDEpOyAgLyogbW92ZSBmdW5jdGlvbiBmcm9tIEwgdG8gTkwgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX2Nvd3JhcCAobHVhX1N0YXRlICpMKSB7CisgIGx1YUJfY29jcmVhdGUoTCk7CisgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgbHVhQl9hdXh3cmFwLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX3lpZWxkIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGx1YV95aWVsZChMLCBsdWFfZ2V0dG9wKEwpKTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfY29ydW5uaW5nIChsdWFfU3RhdGUgKkwpIHsKKyAgaWYgKGx1YV9wdXNodGhyZWFkKEwpKQorICAgIGx1YV9wdXNobmlsKEwpOyAgLyogbWFpbiB0aHJlYWQgaXMgbm90IGEgY29yb3V0aW5lICovCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBjb19mdW5jc1tdID0geworICB7ImNyZWF0ZSIsIGx1YUJfY29jcmVhdGV9LAorICB7InJlc3VtZSIsIGx1YUJfY29yZXN1bWV9LAorICB7InJ1bm5pbmciLCBsdWFCX2NvcnVubmluZ30sCisgIHsic3RhdHVzIiwgbHVhQl9jb3N0YXR1c30sCisgIHsid3JhcCIsIGx1YUJfY293cmFwfSwKKyAgeyJ5aWVsZCIsIGx1YUJfeWllbGR9LAorICB7TlVMTCwgTlVMTH0KK307CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitzdGF0aWMgdm9pZCBhdXhvcGVuIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBsdWFfQ0Z1bmN0aW9uIGYsIGx1YV9DRnVuY3Rpb24gdSkgeworICBsdWFfcHVzaGNmdW5jdGlvbihMLCB1KTsKKyAgbHVhX3B1c2hjY2xvc3VyZShMLCBmLCAxKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCBuYW1lKTsKK30KKworCitzdGF0aWMgdm9pZCBiYXNlX29wZW4gKGx1YV9TdGF0ZSAqTCkgeworICAvKiBzZXQgZ2xvYmFsIF9HICovCisgIGx1YV9wdXNodmFsdWUoTCwgTFVBX0dMT0JBTFNJTkRFWCk7CisgIGx1YV9zZXRnbG9iYWwoTCwgIl9HIik7CisgIC8qIG9wZW4gbGliIGludG8gZ2xvYmFsIHRhYmxlICovCisgIGx1YUxfcmVnaXN0ZXIoTCwgIl9HIiwgYmFzZV9mdW5jcyk7CisgIGx1YV9wdXNobGl0ZXJhbChMLCBMVUFfVkVSU0lPTik7CisgIGx1YV9zZXRnbG9iYWwoTCwgIl9WRVJTSU9OIik7ICAvKiBzZXQgZ2xvYmFsIF9WRVJTSU9OICovCisgIC8qIGBpcGFpcnMnIGFuZCBgcGFpcnMnIG5lZWQgYXV4bGlsaWFyeSBmdW5jdGlvbnMgYXMgdXB2YWx1ZXMgKi8KKyAgYXV4b3BlbihMLCAiaXBhaXJzIiwgbHVhQl9pcGFpcnMsIGlwYWlyc2F1eCk7CisgIGF1eG9wZW4oTCwgInBhaXJzIiwgbHVhQl9wYWlycywgbHVhQl9uZXh0KTsKKyAgLyogYG5ld3Byb3h5JyBuZWVkcyBhIHdlYWt0YWJsZSBhcyB1cHZhbHVlICovCisgIGx1YV9jcmVhdGV0YWJsZShMLCAwLCAxKTsgIC8qIG5ldyB0YWJsZSBgdycgKi8KKyAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7ICAvKiBgdycgd2lsbCBiZSBpdHMgb3duIG1ldGF0YWJsZSAqLworICBsdWFfc2V0bWV0YXRhYmxlKEwsIC0yKTsKKyAgbHVhX3B1c2hsaXRlcmFsKEwsICJrdiIpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJfX21vZGUiKTsgIC8qIG1ldGF0YWJsZSh3KS5fX21vZGUgPSAia3YiICovCisgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgbHVhQl9uZXdwcm94eSwgMSk7CisgIGx1YV9zZXRnbG9iYWwoTCwgIm5ld3Byb3h5Iik7ICAvKiBzZXQgZ2xvYmFsIGBuZXdwcm94eScgKi8KK30KKworCitMVUFMSUJfQVBJIGludCBsdWFvcGVuX2Jhc2UgKGx1YV9TdGF0ZSAqTCkgeworICBiYXNlX29wZW4oTCk7CisgIGx1YUxfcmVnaXN0ZXIoTCwgTFVBX0NPTElCTkFNRSwgY29fZnVuY3MpOworICByZXR1cm4gMjsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sY29kZS5jIGIvbHVhLTUuMS40L3NyYy9sY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xjb2RlLmMKQEAgLTAsMCArMSw4MzkgQEAKKy8qCisqKiAkSWQ6IGxjb2RlLmMsdiAyLjI1LjEuMyAyMDA3LzEyLzI4IDE1OjMyOjIzIHJvYmVydG8gRXhwICQKKyoqIENvZGUgZ2VuZXJhdG9yIGZvciBMdWEKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBsY29kZV9jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxjb2RlLmgiCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGdjLmgiCisjaW5jbHVkZSAibGxleC5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibG9wY29kZXMuaCIKKyNpbmNsdWRlICJscGFyc2VyLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisKKworI2RlZmluZSBoYXNqdW1wcyhlKQkoKGUpLT50ICE9IChlKS0+ZikKKworCitzdGF0aWMgaW50IGlzbnVtZXJhbChleHBkZXNjICplKSB7CisgIHJldHVybiAoZS0+ayA9PSBWS05VTSAmJiBlLT50ID09IE5PX0pVTVAgJiYgZS0+ZiA9PSBOT19KVU1QKTsKK30KKworCit2b2lkIGx1YUtfbmlsIChGdW5jU3RhdGUgKmZzLCBpbnQgZnJvbSwgaW50IG4pIHsKKyAgSW5zdHJ1Y3Rpb24gKnByZXZpb3VzOworICBpZiAoZnMtPnBjID4gZnMtPmxhc3R0YXJnZXQpIHsgIC8qIG5vIGp1bXBzIHRvIGN1cnJlbnQgcG9zaXRpb24/ICovCisgICAgaWYgKGZzLT5wYyA9PSAwKSB7ICAvKiBmdW5jdGlvbiBzdGFydD8gKi8KKyAgICAgIGlmIChmcm9tID49IGZzLT5uYWN0dmFyKQorICAgICAgICByZXR1cm47ICAvKiBwb3NpdGlvbnMgYXJlIGFscmVhZHkgY2xlYW4gKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwcmV2aW91cyA9ICZmcy0+Zi0+Y29kZVtmcy0+cGMtMV07CisgICAgICBpZiAoR0VUX09QQ09ERSgqcHJldmlvdXMpID09IE9QX0xPQUROSUwpIHsKKyAgICAgICAgaW50IHBmcm9tID0gR0VUQVJHX0EoKnByZXZpb3VzKTsKKyAgICAgICAgaW50IHB0byA9IEdFVEFSR19CKCpwcmV2aW91cyk7CisgICAgICAgIGlmIChwZnJvbSA8PSBmcm9tICYmIGZyb20gPD0gcHRvKzEpIHsgIC8qIGNhbiBjb25uZWN0IGJvdGg/ICovCisgICAgICAgICAgaWYgKGZyb20rbi0xID4gcHRvKQorICAgICAgICAgICAgU0VUQVJHX0IoKnByZXZpb3VzLCBmcm9tK24tMSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGx1YUtfY29kZUFCQyhmcywgT1BfTE9BRE5JTCwgZnJvbSwgZnJvbStuLTEsIDApOyAgLyogZWxzZSBubyBvcHRpbWl6YXRpb24gKi8KK30KKworCitpbnQgbHVhS19qdW1wIChGdW5jU3RhdGUgKmZzKSB7CisgIGludCBqcGMgPSBmcy0+anBjOyAgLyogc2F2ZSBsaXN0IG9mIGp1bXBzIHRvIGhlcmUgKi8KKyAgaW50IGo7CisgIGZzLT5qcGMgPSBOT19KVU1QOworICBqID0gbHVhS19jb2RlQXNCeChmcywgT1BfSk1QLCAwLCBOT19KVU1QKTsKKyAgbHVhS19jb25jYXQoZnMsICZqLCBqcGMpOyAgLyoga2VlcCB0aGVtIG9uIGhvbGQgKi8KKyAgcmV0dXJuIGo7Cit9CisKKwordm9pZCBsdWFLX3JldCAoRnVuY1N0YXRlICpmcywgaW50IGZpcnN0LCBpbnQgbnJldCkgeworICBsdWFLX2NvZGVBQkMoZnMsIE9QX1JFVFVSTiwgZmlyc3QsIG5yZXQrMSwgMCk7Cit9CisKKworc3RhdGljIGludCBjb25kanVtcCAoRnVuY1N0YXRlICpmcywgT3BDb2RlIG9wLCBpbnQgQSwgaW50IEIsIGludCBDKSB7CisgIGx1YUtfY29kZUFCQyhmcywgb3AsIEEsIEIsIEMpOworICByZXR1cm4gbHVhS19qdW1wKGZzKTsKK30KKworCitzdGF0aWMgdm9pZCBmaXhqdW1wIChGdW5jU3RhdGUgKmZzLCBpbnQgcGMsIGludCBkZXN0KSB7CisgIEluc3RydWN0aW9uICpqbXAgPSAmZnMtPmYtPmNvZGVbcGNdOworICBpbnQgb2Zmc2V0ID0gZGVzdC0ocGMrMSk7CisgIGx1YV9hc3NlcnQoZGVzdCAhPSBOT19KVU1QKTsKKyAgaWYgKGFicyhvZmZzZXQpID4gTUFYQVJHX3NCeCkKKyAgICBsdWFYX3N5bnRheGVycm9yKGZzLT5scywgImNvbnRyb2wgc3RydWN0dXJlIHRvbyBsb25nIik7CisgIFNFVEFSR19zQngoKmptcCwgb2Zmc2V0KTsKK30KKworCisvKgorKiogcmV0dXJucyBjdXJyZW50IGBwYycgYW5kIG1hcmtzIGl0IGFzIGEganVtcCB0YXJnZXQgKHRvIGF2b2lkIHdyb25nCisqKiBvcHRpbWl6YXRpb25zIHdpdGggY29uc2VjdXRpdmUgaW5zdHJ1Y3Rpb25zIG5vdCBpbiB0aGUgc2FtZSBiYXNpYyBibG9jaykuCisqLworaW50IGx1YUtfZ2V0bGFiZWwgKEZ1bmNTdGF0ZSAqZnMpIHsKKyAgZnMtPmxhc3R0YXJnZXQgPSBmcy0+cGM7CisgIHJldHVybiBmcy0+cGM7Cit9CisKKworc3RhdGljIGludCBnZXRqdW1wIChGdW5jU3RhdGUgKmZzLCBpbnQgcGMpIHsKKyAgaW50IG9mZnNldCA9IEdFVEFSR19zQngoZnMtPmYtPmNvZGVbcGNdKTsKKyAgaWYgKG9mZnNldCA9PSBOT19KVU1QKSAgLyogcG9pbnQgdG8gaXRzZWxmIHJlcHJlc2VudHMgZW5kIG9mIGxpc3QgKi8KKyAgICByZXR1cm4gTk9fSlVNUDsgIC8qIGVuZCBvZiBsaXN0ICovCisgIGVsc2UKKyAgICByZXR1cm4gKHBjKzEpK29mZnNldDsgIC8qIHR1cm4gb2Zmc2V0IGludG8gYWJzb2x1dGUgcG9zaXRpb24gKi8KK30KKworCitzdGF0aWMgSW5zdHJ1Y3Rpb24gKmdldGp1bXBjb250cm9sIChGdW5jU3RhdGUgKmZzLCBpbnQgcGMpIHsKKyAgSW5zdHJ1Y3Rpb24gKnBpID0gJmZzLT5mLT5jb2RlW3BjXTsKKyAgaWYgKHBjID49IDEgJiYgdGVzdFRNb2RlKEdFVF9PUENPREUoKihwaS0xKSkpKQorICAgIHJldHVybiBwaS0xOworICBlbHNlCisgICAgcmV0dXJuIHBpOworfQorCisKKy8qCisqKiBjaGVjayB3aGV0aGVyIGxpc3QgaGFzIGFueSBqdW1wIHRoYXQgZG8gbm90IHByb2R1Y2UgYSB2YWx1ZQorKiogKG9yIHByb2R1Y2UgYW4gaW52ZXJ0ZWQgdmFsdWUpCisqLworc3RhdGljIGludCBuZWVkX3ZhbHVlIChGdW5jU3RhdGUgKmZzLCBpbnQgbGlzdCkgeworICBmb3IgKDsgbGlzdCAhPSBOT19KVU1QOyBsaXN0ID0gZ2V0anVtcChmcywgbGlzdCkpIHsKKyAgICBJbnN0cnVjdGlvbiBpID0gKmdldGp1bXBjb250cm9sKGZzLCBsaXN0KTsKKyAgICBpZiAoR0VUX09QQ09ERShpKSAhPSBPUF9URVNUU0VUKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsgIC8qIG5vdCBmb3VuZCAqLworfQorCisKK3N0YXRpYyBpbnQgcGF0Y2h0ZXN0cmVnIChGdW5jU3RhdGUgKmZzLCBpbnQgbm9kZSwgaW50IHJlZykgeworICBJbnN0cnVjdGlvbiAqaSA9IGdldGp1bXBjb250cm9sKGZzLCBub2RlKTsKKyAgaWYgKEdFVF9PUENPREUoKmkpICE9IE9QX1RFU1RTRVQpCisgICAgcmV0dXJuIDA7ICAvKiBjYW5ub3QgcGF0Y2ggb3RoZXIgaW5zdHJ1Y3Rpb25zICovCisgIGlmIChyZWcgIT0gTk9fUkVHICYmIHJlZyAhPSBHRVRBUkdfQigqaSkpCisgICAgU0VUQVJHX0EoKmksIHJlZyk7CisgIGVsc2UgIC8qIG5vIHJlZ2lzdGVyIHRvIHB1dCB2YWx1ZSBvciByZWdpc3RlciBhbHJlYWR5IGhhcyB0aGUgdmFsdWUgKi8KKyAgICAqaSA9IENSRUFURV9BQkMoT1BfVEVTVCwgR0VUQVJHX0IoKmkpLCAwLCBHRVRBUkdfQygqaSkpOworCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIHJlbW92ZXZhbHVlcyAoRnVuY1N0YXRlICpmcywgaW50IGxpc3QpIHsKKyAgZm9yICg7IGxpc3QgIT0gTk9fSlVNUDsgbGlzdCA9IGdldGp1bXAoZnMsIGxpc3QpKQorICAgICAgcGF0Y2h0ZXN0cmVnKGZzLCBsaXN0LCBOT19SRUcpOworfQorCisKK3N0YXRpYyB2b2lkIHBhdGNobGlzdGF1eCAoRnVuY1N0YXRlICpmcywgaW50IGxpc3QsIGludCB2dGFyZ2V0LCBpbnQgcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHRhcmdldCkgeworICB3aGlsZSAobGlzdCAhPSBOT19KVU1QKSB7CisgICAgaW50IG5leHQgPSBnZXRqdW1wKGZzLCBsaXN0KTsKKyAgICBpZiAocGF0Y2h0ZXN0cmVnKGZzLCBsaXN0LCByZWcpKQorICAgICAgZml4anVtcChmcywgbGlzdCwgdnRhcmdldCk7CisgICAgZWxzZQorICAgICAgZml4anVtcChmcywgbGlzdCwgZHRhcmdldCk7ICAvKiBqdW1wIHRvIGRlZmF1bHQgdGFyZ2V0ICovCisgICAgbGlzdCA9IG5leHQ7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBkaXNjaGFyZ2VqcGMgKEZ1bmNTdGF0ZSAqZnMpIHsKKyAgcGF0Y2hsaXN0YXV4KGZzLCBmcy0+anBjLCBmcy0+cGMsIE5PX1JFRywgZnMtPnBjKTsKKyAgZnMtPmpwYyA9IE5PX0pVTVA7Cit9CisKKwordm9pZCBsdWFLX3BhdGNobGlzdCAoRnVuY1N0YXRlICpmcywgaW50IGxpc3QsIGludCB0YXJnZXQpIHsKKyAgaWYgKHRhcmdldCA9PSBmcy0+cGMpCisgICAgbHVhS19wYXRjaHRvaGVyZShmcywgbGlzdCk7CisgIGVsc2UgeworICAgIGx1YV9hc3NlcnQodGFyZ2V0IDwgZnMtPnBjKTsKKyAgICBwYXRjaGxpc3RhdXgoZnMsIGxpc3QsIHRhcmdldCwgTk9fUkVHLCB0YXJnZXQpOworICB9Cit9CisKKwordm9pZCBsdWFLX3BhdGNodG9oZXJlIChGdW5jU3RhdGUgKmZzLCBpbnQgbGlzdCkgeworICBsdWFLX2dldGxhYmVsKGZzKTsKKyAgbHVhS19jb25jYXQoZnMsICZmcy0+anBjLCBsaXN0KTsKK30KKworCit2b2lkIGx1YUtfY29uY2F0IChGdW5jU3RhdGUgKmZzLCBpbnQgKmwxLCBpbnQgbDIpIHsKKyAgaWYgKGwyID09IE5PX0pVTVApIHJldHVybjsKKyAgZWxzZSBpZiAoKmwxID09IE5PX0pVTVApCisgICAgKmwxID0gbDI7CisgIGVsc2UgeworICAgIGludCBsaXN0ID0gKmwxOworICAgIGludCBuZXh0OworICAgIHdoaWxlICgobmV4dCA9IGdldGp1bXAoZnMsIGxpc3QpKSAhPSBOT19KVU1QKSAgLyogZmluZCBsYXN0IGVsZW1lbnQgKi8KKyAgICAgIGxpc3QgPSBuZXh0OworICAgIGZpeGp1bXAoZnMsIGxpc3QsIGwyKTsKKyAgfQorfQorCisKK3ZvaWQgbHVhS19jaGVja3N0YWNrIChGdW5jU3RhdGUgKmZzLCBpbnQgbikgeworICBpbnQgbmV3c3RhY2sgPSBmcy0+ZnJlZXJlZyArIG47CisgIGlmIChuZXdzdGFjayA+IGZzLT5mLT5tYXhzdGFja3NpemUpIHsKKyAgICBpZiAobmV3c3RhY2sgPj0gTUFYU1RBQ0spCisgICAgICBsdWFYX3N5bnRheGVycm9yKGZzLT5scywgImZ1bmN0aW9uIG9yIGV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKKyAgICBmcy0+Zi0+bWF4c3RhY2tzaXplID0gY2FzdF9ieXRlKG5ld3N0YWNrKTsKKyAgfQorfQorCisKK3ZvaWQgbHVhS19yZXNlcnZlcmVncyAoRnVuY1N0YXRlICpmcywgaW50IG4pIHsKKyAgbHVhS19jaGVja3N0YWNrKGZzLCBuKTsKKyAgZnMtPmZyZWVyZWcgKz0gbjsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlcmVnIChGdW5jU3RhdGUgKmZzLCBpbnQgcmVnKSB7CisgIGlmICghSVNLKHJlZykgJiYgcmVnID49IGZzLT5uYWN0dmFyKSB7CisgICAgZnMtPmZyZWVyZWctLTsKKyAgICBsdWFfYXNzZXJ0KHJlZyA9PSBmcy0+ZnJlZXJlZyk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBmcmVlZXhwIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIGlmIChlLT5rID09IFZOT05SRUxPQykKKyAgICBmcmVlcmVnKGZzLCBlLT51LnMuaW5mbyk7Cit9CisKKworc3RhdGljIGludCBhZGRrIChGdW5jU3RhdGUgKmZzLCBUVmFsdWUgKmssIFRWYWx1ZSAqdikgeworICBsdWFfU3RhdGUgKkwgPSBmcy0+TDsKKyAgVFZhbHVlICppZHggPSBsdWFIX3NldChMLCBmcy0+aCwgayk7CisgIFByb3RvICpmID0gZnMtPmY7CisgIGludCBvbGRzaXplID0gZi0+c2l6ZWs7CisgIGlmICh0dGlzbnVtYmVyKGlkeCkpIHsKKyAgICBsdWFfYXNzZXJ0KGx1YU9fcmF3ZXF1YWxPYmooJmZzLT5mLT5rW2Nhc3RfaW50KG52YWx1ZShpZHgpKV0sIHYpKTsKKyAgICByZXR1cm4gY2FzdF9pbnQobnZhbHVlKGlkeCkpOworICB9CisgIGVsc2UgeyAgLyogY29uc3RhbnQgbm90IGZvdW5kOyBjcmVhdGUgYSBuZXcgZW50cnkgKi8KKyAgICBzZXRudmFsdWUoaWR4LCBjYXN0X251bShmcy0+bmspKTsKKyAgICBsdWFNX2dyb3d2ZWN0b3IoTCwgZi0+aywgZnMtPm5rLCBmLT5zaXplaywgVFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBNQVhBUkdfQngsICJjb25zdGFudCB0YWJsZSBvdmVyZmxvdyIpOworICAgIHdoaWxlIChvbGRzaXplIDwgZi0+c2l6ZWspIHNldG5pbHZhbHVlKCZmLT5rW29sZHNpemUrK10pOworICAgIHNldG9iaihMLCAmZi0+a1tmcy0+bmtdLCB2KTsKKyAgICBsdWFDX2JhcnJpZXIoTCwgZiwgdik7CisgICAgcmV0dXJuIGZzLT5uaysrOworICB9Cit9CisKKworaW50IGx1YUtfc3RyaW5nSyAoRnVuY1N0YXRlICpmcywgVFN0cmluZyAqcykgeworICBUVmFsdWUgbzsKKyAgc2V0c3ZhbHVlKGZzLT5MLCAmbywgcyk7CisgIHJldHVybiBhZGRrKGZzLCAmbywgJm8pOworfQorCisKK2ludCBsdWFLX251bWJlcksgKEZ1bmNTdGF0ZSAqZnMsIGx1YV9OdW1iZXIgcikgeworICBUVmFsdWUgbzsKKyAgc2V0bnZhbHVlKCZvLCByKTsKKyAgcmV0dXJuIGFkZGsoZnMsICZvLCAmbyk7Cit9CisKKworc3RhdGljIGludCBib29sSyAoRnVuY1N0YXRlICpmcywgaW50IGIpIHsKKyAgVFZhbHVlIG87CisgIHNldGJ2YWx1ZSgmbywgYik7CisgIHJldHVybiBhZGRrKGZzLCAmbywgJm8pOworfQorCisKK3N0YXRpYyBpbnQgbmlsSyAoRnVuY1N0YXRlICpmcykgeworICBUVmFsdWUgaywgdjsKKyAgc2V0bmlsdmFsdWUoJnYpOworICAvKiBjYW5ub3QgdXNlIG5pbCBhcyBrZXk7IGluc3RlYWQgdXNlIHRhYmxlIGl0c2VsZiB0byByZXByZXNlbnQgbmlsICovCisgIHNldGh2YWx1ZShmcy0+TCwgJmssIGZzLT5oKTsKKyAgcmV0dXJuIGFkZGsoZnMsICZrLCAmdik7Cit9CisKKwordm9pZCBsdWFLX3NldHJldHVybnMgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUsIGludCBucmVzdWx0cykgeworICBpZiAoZS0+ayA9PSBWQ0FMTCkgeyAgLyogZXhwcmVzc2lvbiBpcyBhbiBvcGVuIGZ1bmN0aW9uIGNhbGw/ICovCisgICAgU0VUQVJHX0MoZ2V0Y29kZShmcywgZSksIG5yZXN1bHRzKzEpOworICB9CisgIGVsc2UgaWYgKGUtPmsgPT0gVlZBUkFSRykgeworICAgIFNFVEFSR19CKGdldGNvZGUoZnMsIGUpLCBucmVzdWx0cysxKTsKKyAgICBTRVRBUkdfQShnZXRjb2RlKGZzLCBlKSwgZnMtPmZyZWVyZWcpOworICAgIGx1YUtfcmVzZXJ2ZXJlZ3MoZnMsIDEpOworICB9Cit9CisKKwordm9pZCBsdWFLX3NldG9uZXJldCAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBpZiAoZS0+ayA9PSBWQ0FMTCkgeyAgLyogZXhwcmVzc2lvbiBpcyBhbiBvcGVuIGZ1bmN0aW9uIGNhbGw/ICovCisgICAgZS0+ayA9IFZOT05SRUxPQzsKKyAgICBlLT51LnMuaW5mbyA9IEdFVEFSR19BKGdldGNvZGUoZnMsIGUpKTsKKyAgfQorICBlbHNlIGlmIChlLT5rID09IFZWQVJBUkcpIHsKKyAgICBTRVRBUkdfQihnZXRjb2RlKGZzLCBlKSwgMik7CisgICAgZS0+ayA9IFZSRUxPQ0FCTEU7ICAvKiBjYW4gcmVsb2NhdGUgaXRzIHNpbXBsZSByZXN1bHQgKi8KKyAgfQorfQorCisKK3ZvaWQgbHVhS19kaXNjaGFyZ2V2YXJzIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIHN3aXRjaCAoZS0+aykgeworICAgIGNhc2UgVkxPQ0FMOiB7CisgICAgICBlLT5rID0gVk5PTlJFTE9DOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVlVQVkFMOiB7CisgICAgICBlLT51LnMuaW5mbyA9IGx1YUtfY29kZUFCQyhmcywgT1BfR0VUVVBWQUwsIDAsIGUtPnUucy5pbmZvLCAwKTsKKyAgICAgIGUtPmsgPSBWUkVMT0NBQkxFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVkdMT0JBTDogeworICAgICAgZS0+dS5zLmluZm8gPSBsdWFLX2NvZGVBQngoZnMsIE9QX0dFVEdMT0JBTCwgMCwgZS0+dS5zLmluZm8pOworICAgICAgZS0+ayA9IFZSRUxPQ0FCTEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWSU5ERVhFRDogeworICAgICAgZnJlZXJlZyhmcywgZS0+dS5zLmF1eCk7CisgICAgICBmcmVlcmVnKGZzLCBlLT51LnMuaW5mbyk7CisgICAgICBlLT51LnMuaW5mbyA9IGx1YUtfY29kZUFCQyhmcywgT1BfR0VUVEFCTEUsIDAsIGUtPnUucy5pbmZvLCBlLT51LnMuYXV4KTsKKyAgICAgIGUtPmsgPSBWUkVMT0NBQkxFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVlZBUkFSRzoKKyAgICBjYXNlIFZDQUxMOiB7CisgICAgICBsdWFLX3NldG9uZXJldChmcywgZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogYnJlYWs7ICAvKiB0aGVyZSBpcyBvbmUgdmFsdWUgYXZhaWxhYmxlIChzb21ld2hlcmUpICovCisgIH0KK30KKworCitzdGF0aWMgaW50IGNvZGVfbGFiZWwgKEZ1bmNTdGF0ZSAqZnMsIGludCBBLCBpbnQgYiwgaW50IGp1bXApIHsKKyAgbHVhS19nZXRsYWJlbChmcyk7ICAvKiB0aG9zZSBpbnN0cnVjdGlvbnMgbWF5IGJlIGp1bXAgdGFyZ2V0cyAqLworICByZXR1cm4gbHVhS19jb2RlQUJDKGZzLCBPUF9MT0FEQk9PTCwgQSwgYiwganVtcCk7Cit9CisKKworc3RhdGljIHZvaWQgZGlzY2hhcmdlMnJlZyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSwgaW50IHJlZykgeworICBsdWFLX2Rpc2NoYXJnZXZhcnMoZnMsIGUpOworICBzd2l0Y2ggKGUtPmspIHsKKyAgICBjYXNlIFZOSUw6IHsKKyAgICAgIGx1YUtfbmlsKGZzLCByZWcsIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVkZBTFNFOiAgY2FzZSBWVFJVRTogeworICAgICAgbHVhS19jb2RlQUJDKGZzLCBPUF9MT0FEQk9PTCwgcmVnLCBlLT5rID09IFZUUlVFLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZLOiB7CisgICAgICBsdWFLX2NvZGVBQngoZnMsIE9QX0xPQURLLCByZWcsIGUtPnUucy5pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZLTlVNOiB7CisgICAgICBsdWFLX2NvZGVBQngoZnMsIE9QX0xPQURLLCByZWcsIGx1YUtfbnVtYmVySyhmcywgZS0+dS5udmFsKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWUkVMT0NBQkxFOiB7CisgICAgICBJbnN0cnVjdGlvbiAqcGMgPSAmZ2V0Y29kZShmcywgZSk7CisgICAgICBTRVRBUkdfQSgqcGMsIHJlZyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWTk9OUkVMT0M6IHsKKyAgICAgIGlmIChyZWcgIT0gZS0+dS5zLmluZm8pCisgICAgICAgIGx1YUtfY29kZUFCQyhmcywgT1BfTU9WRSwgcmVnLCBlLT51LnMuaW5mbywgMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgbHVhX2Fzc2VydChlLT5rID09IFZWT0lEIHx8IGUtPmsgPT0gVkpNUCk7CisgICAgICByZXR1cm47ICAvKiBub3RoaW5nIHRvIGRvLi4uICovCisgICAgfQorICB9CisgIGUtPnUucy5pbmZvID0gcmVnOworICBlLT5rID0gVk5PTlJFTE9DOworfQorCisKK3N0YXRpYyB2b2lkIGRpc2NoYXJnZTJhbnlyZWcgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgaWYgKGUtPmsgIT0gVk5PTlJFTE9DKSB7CisgICAgbHVhS19yZXNlcnZlcmVncyhmcywgMSk7CisgICAgZGlzY2hhcmdlMnJlZyhmcywgZSwgZnMtPmZyZWVyZWctMSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBleHAycmVnIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplLCBpbnQgcmVnKSB7CisgIGRpc2NoYXJnZTJyZWcoZnMsIGUsIHJlZyk7CisgIGlmIChlLT5rID09IFZKTVApCisgICAgbHVhS19jb25jYXQoZnMsICZlLT50LCBlLT51LnMuaW5mbyk7ICAvKiBwdXQgdGhpcyBqdW1wIGluIGB0JyBsaXN0ICovCisgIGlmIChoYXNqdW1wcyhlKSkgeworICAgIGludCBmaW5hbDsgIC8qIHBvc2l0aW9uIGFmdGVyIHdob2xlIGV4cHJlc3Npb24gKi8KKyAgICBpbnQgcF9mID0gTk9fSlVNUDsgIC8qIHBvc2l0aW9uIG9mIGFuIGV2ZW50dWFsIExPQUQgZmFsc2UgKi8KKyAgICBpbnQgcF90ID0gTk9fSlVNUDsgIC8qIHBvc2l0aW9uIG9mIGFuIGV2ZW50dWFsIExPQUQgdHJ1ZSAqLworICAgIGlmIChuZWVkX3ZhbHVlKGZzLCBlLT50KSB8fCBuZWVkX3ZhbHVlKGZzLCBlLT5mKSkgeworICAgICAgaW50IGZqID0gKGUtPmsgPT0gVkpNUCkgPyBOT19KVU1QIDogbHVhS19qdW1wKGZzKTsKKyAgICAgIHBfZiA9IGNvZGVfbGFiZWwoZnMsIHJlZywgMCwgMSk7CisgICAgICBwX3QgPSBjb2RlX2xhYmVsKGZzLCByZWcsIDEsIDApOworICAgICAgbHVhS19wYXRjaHRvaGVyZShmcywgZmopOworICAgIH0KKyAgICBmaW5hbCA9IGx1YUtfZ2V0bGFiZWwoZnMpOworICAgIHBhdGNobGlzdGF1eChmcywgZS0+ZiwgZmluYWwsIHJlZywgcF9mKTsKKyAgICBwYXRjaGxpc3RhdXgoZnMsIGUtPnQsIGZpbmFsLCByZWcsIHBfdCk7CisgIH0KKyAgZS0+ZiA9IGUtPnQgPSBOT19KVU1QOworICBlLT51LnMuaW5mbyA9IHJlZzsKKyAgZS0+ayA9IFZOT05SRUxPQzsKK30KKworCit2b2lkIGx1YUtfZXhwMm5leHRyZWcgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgbHVhS19kaXNjaGFyZ2V2YXJzKGZzLCBlKTsKKyAgZnJlZWV4cChmcywgZSk7CisgIGx1YUtfcmVzZXJ2ZXJlZ3MoZnMsIDEpOworICBleHAycmVnKGZzLCBlLCBmcy0+ZnJlZXJlZyAtIDEpOworfQorCisKK2ludCBsdWFLX2V4cDJhbnlyZWcgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgbHVhS19kaXNjaGFyZ2V2YXJzKGZzLCBlKTsKKyAgaWYgKGUtPmsgPT0gVk5PTlJFTE9DKSB7CisgICAgaWYgKCFoYXNqdW1wcyhlKSkgcmV0dXJuIGUtPnUucy5pbmZvOyAgLyogZXhwIGlzIGFscmVhZHkgaW4gYSByZWdpc3RlciAqLworICAgIGlmIChlLT51LnMuaW5mbyA+PSBmcy0+bmFjdHZhcikgeyAgLyogcmVnLiBpcyBub3QgYSBsb2NhbD8gKi8KKyAgICAgIGV4cDJyZWcoZnMsIGUsIGUtPnUucy5pbmZvKTsgIC8qIHB1dCB2YWx1ZSBvbiBpdCAqLworICAgICAgcmV0dXJuIGUtPnUucy5pbmZvOworICAgIH0KKyAgfQorICBsdWFLX2V4cDJuZXh0cmVnKGZzLCBlKTsgIC8qIGRlZmF1bHQgKi8KKyAgcmV0dXJuIGUtPnUucy5pbmZvOworfQorCisKK3ZvaWQgbHVhS19leHAydmFsIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIGlmIChoYXNqdW1wcyhlKSkKKyAgICBsdWFLX2V4cDJhbnlyZWcoZnMsIGUpOworICBlbHNlCisgICAgbHVhS19kaXNjaGFyZ2V2YXJzKGZzLCBlKTsKK30KKworCitpbnQgbHVhS19leHAyUksgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgbHVhS19leHAydmFsKGZzLCBlKTsKKyAgc3dpdGNoIChlLT5rKSB7CisgICAgY2FzZSBWS05VTToKKyAgICBjYXNlIFZUUlVFOgorICAgIGNhc2UgVkZBTFNFOgorICAgIGNhc2UgVk5JTDogeworICAgICAgaWYgKGZzLT5uayA8PSBNQVhJTkRFWFJLKSB7ICAvKiBjb25zdGFudCBmaXQgaW4gUksgb3BlcmFuZD8gKi8KKyAgICAgICAgZS0+dS5zLmluZm8gPSAoZS0+ayA9PSBWTklMKSAgPyBuaWxLKGZzKSA6CisgICAgICAgICAgICAgICAgICAgICAgKGUtPmsgPT0gVktOVU0pID8gbHVhS19udW1iZXJLKGZzLCBlLT51Lm52YWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sSyhmcywgKGUtPmsgPT0gVlRSVUUpKTsKKyAgICAgICAgZS0+ayA9IFZLOworICAgICAgICByZXR1cm4gUktBU0soZS0+dS5zLmluZm8pOworICAgICAgfQorICAgICAgZWxzZSBicmVhazsKKyAgICB9CisgICAgY2FzZSBWSzogeworICAgICAgaWYgKGUtPnUucy5pbmZvIDw9IE1BWElOREVYUkspICAvKiBjb25zdGFudCBmaXQgaW4gYXJnQz8gKi8KKyAgICAgICAgcmV0dXJuIFJLQVNLKGUtPnUucy5pbmZvKTsKKyAgICAgIGVsc2UgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIC8qIG5vdCBhIGNvbnN0YW50IGluIHRoZSByaWdodCByYW5nZTogcHV0IGl0IGluIGEgcmVnaXN0ZXIgKi8KKyAgcmV0dXJuIGx1YUtfZXhwMmFueXJlZyhmcywgZSk7Cit9CisKKwordm9pZCBsdWFLX3N0b3JldmFyIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICp2YXIsIGV4cGRlc2MgKmV4KSB7CisgIHN3aXRjaCAodmFyLT5rKSB7CisgICAgY2FzZSBWTE9DQUw6IHsKKyAgICAgIGZyZWVleHAoZnMsIGV4KTsKKyAgICAgIGV4cDJyZWcoZnMsIGV4LCB2YXItPnUucy5pbmZvKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBWVVBWQUw6IHsKKyAgICAgIGludCBlID0gbHVhS19leHAyYW55cmVnKGZzLCBleCk7CisgICAgICBsdWFLX2NvZGVBQkMoZnMsIE9QX1NFVFVQVkFMLCBlLCB2YXItPnUucy5pbmZvLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZHTE9CQUw6IHsKKyAgICAgIGludCBlID0gbHVhS19leHAyYW55cmVnKGZzLCBleCk7CisgICAgICBsdWFLX2NvZGVBQngoZnMsIE9QX1NFVEdMT0JBTCwgZSwgdmFyLT51LnMuaW5mbyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWSU5ERVhFRDogeworICAgICAgaW50IGUgPSBsdWFLX2V4cDJSSyhmcywgZXgpOworICAgICAgbHVhS19jb2RlQUJDKGZzLCBPUF9TRVRUQUJMRSwgdmFyLT51LnMuaW5mbywgdmFyLT51LnMuYXV4LCBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBsdWFfYXNzZXJ0KDApOyAgLyogaW52YWxpZCB2YXIga2luZCB0byBzdG9yZSAqLworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGZyZWVleHAoZnMsIGV4KTsKK30KKworCit2b2lkIGx1YUtfc2VsZiAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSwgZXhwZGVzYyAqa2V5KSB7CisgIGludCBmdW5jOworICBsdWFLX2V4cDJhbnlyZWcoZnMsIGUpOworICBmcmVlZXhwKGZzLCBlKTsKKyAgZnVuYyA9IGZzLT5mcmVlcmVnOworICBsdWFLX3Jlc2VydmVyZWdzKGZzLCAyKTsKKyAgbHVhS19jb2RlQUJDKGZzLCBPUF9TRUxGLCBmdW5jLCBlLT51LnMuaW5mbywgbHVhS19leHAyUksoZnMsIGtleSkpOworICBmcmVlZXhwKGZzLCBrZXkpOworICBlLT51LnMuaW5mbyA9IGZ1bmM7CisgIGUtPmsgPSBWTk9OUkVMT0M7Cit9CisKKworc3RhdGljIHZvaWQgaW52ZXJ0anVtcCAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBJbnN0cnVjdGlvbiAqcGMgPSBnZXRqdW1wY29udHJvbChmcywgZS0+dS5zLmluZm8pOworICBsdWFfYXNzZXJ0KHRlc3RUTW9kZShHRVRfT1BDT0RFKCpwYykpICYmIEdFVF9PUENPREUoKnBjKSAhPSBPUF9URVNUU0VUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX09QQ09ERSgqcGMpICE9IE9QX1RFU1QpOworICBTRVRBUkdfQSgqcGMsICEoR0VUQVJHX0EoKnBjKSkpOworfQorCisKK3N0YXRpYyBpbnQganVtcG9uY29uZCAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSwgaW50IGNvbmQpIHsKKyAgaWYgKGUtPmsgPT0gVlJFTE9DQUJMRSkgeworICAgIEluc3RydWN0aW9uIGllID0gZ2V0Y29kZShmcywgZSk7CisgICAgaWYgKEdFVF9PUENPREUoaWUpID09IE9QX05PVCkgeworICAgICAgZnMtPnBjLS07ICAvKiByZW1vdmUgcHJldmlvdXMgT1BfTk9UICovCisgICAgICByZXR1cm4gY29uZGp1bXAoZnMsIE9QX1RFU1QsIEdFVEFSR19CKGllKSwgMCwgIWNvbmQpOworICAgIH0KKyAgICAvKiBlbHNlIGdvIHRocm91Z2ggKi8KKyAgfQorICBkaXNjaGFyZ2UyYW55cmVnKGZzLCBlKTsKKyAgZnJlZWV4cChmcywgZSk7CisgIHJldHVybiBjb25kanVtcChmcywgT1BfVEVTVFNFVCwgTk9fUkVHLCBlLT51LnMuaW5mbywgY29uZCk7Cit9CisKKwordm9pZCBsdWFLX2dvaWZ0cnVlIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIGludCBwYzsgIC8qIHBjIG9mIGxhc3QganVtcCAqLworICBsdWFLX2Rpc2NoYXJnZXZhcnMoZnMsIGUpOworICBzd2l0Y2ggKGUtPmspIHsKKyAgICBjYXNlIFZLOiBjYXNlIFZLTlVNOiBjYXNlIFZUUlVFOiB7CisgICAgICBwYyA9IE5PX0pVTVA7ICAvKiBhbHdheXMgdHJ1ZTsgZG8gbm90aGluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVkZBTFNFOiB7CisgICAgICBwYyA9IGx1YUtfanVtcChmcyk7ICAvKiBhbHdheXMganVtcCAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVkpNUDogeworICAgICAgaW52ZXJ0anVtcChmcywgZSk7CisgICAgICBwYyA9IGUtPnUucy5pbmZvOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHBjID0ganVtcG9uY29uZChmcywgZSwgMCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgbHVhS19jb25jYXQoZnMsICZlLT5mLCBwYyk7ICAvKiBpbnNlcnQgbGFzdCBqdW1wIGluIGBmJyBsaXN0ICovCisgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIGUtPnQpOworICBlLT50ID0gTk9fSlVNUDsKK30KKworCitzdGF0aWMgdm9pZCBsdWFLX2dvaWZmYWxzZSAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBpbnQgcGM7ICAvKiBwYyBvZiBsYXN0IGp1bXAgKi8KKyAgbHVhS19kaXNjaGFyZ2V2YXJzKGZzLCBlKTsKKyAgc3dpdGNoIChlLT5rKSB7CisgICAgY2FzZSBWTklMOiBjYXNlIFZGQUxTRTogeworICAgICAgcGMgPSBOT19KVU1QOyAgLyogYWx3YXlzIGZhbHNlOyBkbyBub3RoaW5nICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWVFJVRTogeworICAgICAgcGMgPSBsdWFLX2p1bXAoZnMpOyAgLyogYWx3YXlzIGp1bXAgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZKTVA6IHsKKyAgICAgIHBjID0gZS0+dS5zLmluZm87CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgcGMgPSBqdW1wb25jb25kKGZzLCBlLCAxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBsdWFLX2NvbmNhdChmcywgJmUtPnQsIHBjKTsgIC8qIGluc2VydCBsYXN0IGp1bXAgaW4gYHQnIGxpc3QgKi8KKyAgbHVhS19wYXRjaHRvaGVyZShmcywgZS0+Zik7CisgIGUtPmYgPSBOT19KVU1QOworfQorCisKK3N0YXRpYyB2b2lkIGNvZGVub3QgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgbHVhS19kaXNjaGFyZ2V2YXJzKGZzLCBlKTsKKyAgc3dpdGNoIChlLT5rKSB7CisgICAgY2FzZSBWTklMOiBjYXNlIFZGQUxTRTogeworICAgICAgZS0+ayA9IFZUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVks6IGNhc2UgVktOVU06IGNhc2UgVlRSVUU6IHsKKyAgICAgIGUtPmsgPSBWRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWSk1QOiB7CisgICAgICBpbnZlcnRqdW1wKGZzLCBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZSRUxPQ0FCTEU6CisgICAgY2FzZSBWTk9OUkVMT0M6IHsKKyAgICAgIGRpc2NoYXJnZTJhbnlyZWcoZnMsIGUpOworICAgICAgZnJlZWV4cChmcywgZSk7CisgICAgICBlLT51LnMuaW5mbyA9IGx1YUtfY29kZUFCQyhmcywgT1BfTk9ULCAwLCBlLT51LnMuaW5mbywgMCk7CisgICAgICBlLT5rID0gVlJFTE9DQUJMRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBsdWFfYXNzZXJ0KDApOyAgLyogY2Fubm90IGhhcHBlbiAqLworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIGludGVyY2hhbmdlIHRydWUgYW5kIGZhbHNlIGxpc3RzICovCisgIHsgaW50IHRlbXAgPSBlLT5mOyBlLT5mID0gZS0+dDsgZS0+dCA9IHRlbXA7IH0KKyAgcmVtb3ZldmFsdWVzKGZzLCBlLT5mKTsKKyAgcmVtb3ZldmFsdWVzKGZzLCBlLT50KTsKK30KKworCit2b2lkIGx1YUtfaW5kZXhlZCAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqdCwgZXhwZGVzYyAqaykgeworICB0LT51LnMuYXV4ID0gbHVhS19leHAyUksoZnMsIGspOworICB0LT5rID0gVklOREVYRUQ7Cit9CisKKworc3RhdGljIGludCBjb25zdGZvbGRpbmcgKE9wQ29kZSBvcCwgZXhwZGVzYyAqZTEsIGV4cGRlc2MgKmUyKSB7CisgIGx1YV9OdW1iZXIgdjEsIHYyLCByOworICBpZiAoIWlzbnVtZXJhbChlMSkgfHwgIWlzbnVtZXJhbChlMikpIHJldHVybiAwOworICB2MSA9IGUxLT51Lm52YWw7CisgIHYyID0gZTItPnUubnZhbDsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgT1BfQUREOiByID0gbHVhaV9udW1hZGQodjEsIHYyKTsgYnJlYWs7CisgICAgY2FzZSBPUF9TVUI6IHIgPSBsdWFpX251bXN1Yih2MSwgdjIpOyBicmVhazsKKyAgICBjYXNlIE9QX01VTDogciA9IGx1YWlfbnVtbXVsKHYxLCB2Mik7IGJyZWFrOworICAgIGNhc2UgT1BfRElWOgorICAgICAgaWYgKHYyID09IDApIHJldHVybiAwOyAgLyogZG8gbm90IGF0dGVtcHQgdG8gZGl2aWRlIGJ5IDAgKi8KKyAgICAgIHIgPSBsdWFpX251bWRpdih2MSwgdjIpOyBicmVhazsKKyAgICBjYXNlIE9QX01PRDoKKyAgICAgIGlmICh2MiA9PSAwKSByZXR1cm4gMDsgIC8qIGRvIG5vdCBhdHRlbXB0IHRvIGRpdmlkZSBieSAwICovCisgICAgICByID0gbHVhaV9udW1tb2QodjEsIHYyKTsgYnJlYWs7CisgICAgY2FzZSBPUF9QT1c6IHIgPSBsdWFpX251bXBvdyh2MSwgdjIpOyBicmVhazsKKyAgICBjYXNlIE9QX1VOTTogciA9IGx1YWlfbnVtdW5tKHYxKTsgYnJlYWs7CisgICAgY2FzZSBPUF9MRU46IHJldHVybiAwOyAgLyogbm8gY29uc3RhbnQgZm9sZGluZyBmb3IgJ2xlbicgKi8KKyAgICBkZWZhdWx0OiBsdWFfYXNzZXJ0KDApOyByID0gMDsgYnJlYWs7CisgIH0KKyAgaWYgKGx1YWlfbnVtaXNuYW4ocikpIHJldHVybiAwOyAgLyogZG8gbm90IGF0dGVtcHQgdG8gcHJvZHVjZSBOYU4gKi8KKyAgZTEtPnUubnZhbCA9IHI7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIGNvZGVhcml0aCAoRnVuY1N0YXRlICpmcywgT3BDb2RlIG9wLCBleHBkZXNjICplMSwgZXhwZGVzYyAqZTIpIHsKKyAgaWYgKGNvbnN0Zm9sZGluZyhvcCwgZTEsIGUyKSkKKyAgICByZXR1cm47CisgIGVsc2UgeworICAgIGludCBvMiA9IChvcCAhPSBPUF9VTk0gJiYgb3AgIT0gT1BfTEVOKSA/IGx1YUtfZXhwMlJLKGZzLCBlMikgOiAwOworICAgIGludCBvMSA9IGx1YUtfZXhwMlJLKGZzLCBlMSk7CisgICAgaWYgKG8xID4gbzIpIHsKKyAgICAgIGZyZWVleHAoZnMsIGUxKTsKKyAgICAgIGZyZWVleHAoZnMsIGUyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmcmVlZXhwKGZzLCBlMik7CisgICAgICBmcmVlZXhwKGZzLCBlMSk7CisgICAgfQorICAgIGUxLT51LnMuaW5mbyA9IGx1YUtfY29kZUFCQyhmcywgb3AsIDAsIG8xLCBvMik7CisgICAgZTEtPmsgPSBWUkVMT0NBQkxFOworICB9Cit9CisKKworc3RhdGljIHZvaWQgY29kZWNvbXAgKEZ1bmNTdGF0ZSAqZnMsIE9wQ29kZSBvcCwgaW50IGNvbmQsIGV4cGRlc2MgKmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGRlc2MgKmUyKSB7CisgIGludCBvMSA9IGx1YUtfZXhwMlJLKGZzLCBlMSk7CisgIGludCBvMiA9IGx1YUtfZXhwMlJLKGZzLCBlMik7CisgIGZyZWVleHAoZnMsIGUyKTsKKyAgZnJlZWV4cChmcywgZTEpOworICBpZiAoY29uZCA9PSAwICYmIG9wICE9IE9QX0VRKSB7CisgICAgaW50IHRlbXA7ICAvKiBleGNoYW5nZSBhcmdzIHRvIHJlcGxhY2UgYnkgYDwnIG9yIGA8PScgKi8KKyAgICB0ZW1wID0gbzE7IG8xID0gbzI7IG8yID0gdGVtcDsgIC8qIG8xIDw9PT4gbzIgKi8KKyAgICBjb25kID0gMTsKKyAgfQorICBlMS0+dS5zLmluZm8gPSBjb25kanVtcChmcywgb3AsIGNvbmQsIG8xLCBvMik7CisgIGUxLT5rID0gVkpNUDsKK30KKworCit2b2lkIGx1YUtfcHJlZml4IChGdW5jU3RhdGUgKmZzLCBVbk9wciBvcCwgZXhwZGVzYyAqZSkgeworICBleHBkZXNjIGUyOworICBlMi50ID0gZTIuZiA9IE5PX0pVTVA7IGUyLmsgPSBWS05VTTsgZTIudS5udmFsID0gMDsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgT1BSX01JTlVTOiB7CisgICAgICBpZiAoIWlzbnVtZXJhbChlKSkKKyAgICAgICAgbHVhS19leHAyYW55cmVnKGZzLCBlKTsgIC8qIGNhbm5vdCBvcGVyYXRlIG9uIG5vbi1udW1lcmljIGNvbnN0YW50cyAqLworICAgICAgY29kZWFyaXRoKGZzLCBPUF9VTk0sIGUsICZlMik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfTk9UOiBjb2Rlbm90KGZzLCBlKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfTEVOOiB7CisgICAgICBsdWFLX2V4cDJhbnlyZWcoZnMsIGUpOyAgLyogY2Fubm90IG9wZXJhdGUgb24gY29uc3RhbnRzICovCisgICAgICBjb2RlYXJpdGgoZnMsIE9QX0xFTiwgZSwgJmUyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBsdWFfYXNzZXJ0KDApOworICB9Cit9CisKKwordm9pZCBsdWFLX2luZml4IChGdW5jU3RhdGUgKmZzLCBCaW5PcHIgb3AsIGV4cGRlc2MgKnYpIHsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgT1BSX0FORDogeworICAgICAgbHVhS19nb2lmdHJ1ZShmcywgdik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfT1I6IHsKKyAgICAgIGx1YUtfZ29pZmZhbHNlKGZzLCB2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9QUl9DT05DQVQ6IHsKKyAgICAgIGx1YUtfZXhwMm5leHRyZWcoZnMsIHYpOyAgLyogb3BlcmFuZCBtdXN0IGJlIG9uIHRoZSBgc3RhY2snICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfQUREOiBjYXNlIE9QUl9TVUI6IGNhc2UgT1BSX01VTDogY2FzZSBPUFJfRElWOgorICAgIGNhc2UgT1BSX01PRDogY2FzZSBPUFJfUE9XOiB7CisgICAgICBpZiAoIWlzbnVtZXJhbCh2KSkgbHVhS19leHAyUksoZnMsIHYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIGx1YUtfZXhwMlJLKGZzLCB2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgbHVhS19wb3NmaXggKEZ1bmNTdGF0ZSAqZnMsIEJpbk9wciBvcCwgZXhwZGVzYyAqZTEsIGV4cGRlc2MgKmUyKSB7CisgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIE9QUl9BTkQ6IHsKKyAgICAgIGx1YV9hc3NlcnQoZTEtPnQgPT0gTk9fSlVNUCk7ICAvKiBsaXN0IG11c3QgYmUgY2xvc2VkICovCisgICAgICBsdWFLX2Rpc2NoYXJnZXZhcnMoZnMsIGUyKTsKKyAgICAgIGx1YUtfY29uY2F0KGZzLCAmZTItPmYsIGUxLT5mKTsKKyAgICAgICplMSA9ICplMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9QUl9PUjogeworICAgICAgbHVhX2Fzc2VydChlMS0+ZiA9PSBOT19KVU1QKTsgIC8qIGxpc3QgbXVzdCBiZSBjbG9zZWQgKi8KKyAgICAgIGx1YUtfZGlzY2hhcmdldmFycyhmcywgZTIpOworICAgICAgbHVhS19jb25jYXQoZnMsICZlMi0+dCwgZTEtPnQpOworICAgICAgKmUxID0gKmUyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT1BSX0NPTkNBVDogeworICAgICAgbHVhS19leHAydmFsKGZzLCBlMik7CisgICAgICBpZiAoZTItPmsgPT0gVlJFTE9DQUJMRSAmJiBHRVRfT1BDT0RFKGdldGNvZGUoZnMsIGUyKSkgPT0gT1BfQ09OQ0FUKSB7CisgICAgICAgIGx1YV9hc3NlcnQoZTEtPnUucy5pbmZvID09IEdFVEFSR19CKGdldGNvZGUoZnMsIGUyKSktMSk7CisgICAgICAgIGZyZWVleHAoZnMsIGUxKTsKKyAgICAgICAgU0VUQVJHX0IoZ2V0Y29kZShmcywgZTIpLCBlMS0+dS5zLmluZm8pOworICAgICAgICBlMS0+ayA9IFZSRUxPQ0FCTEU7IGUxLT51LnMuaW5mbyA9IGUyLT51LnMuaW5mbzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBsdWFLX2V4cDJuZXh0cmVnKGZzLCBlMik7ICAvKiBvcGVyYW5kIG11c3QgYmUgb24gdGhlICdzdGFjaycgKi8KKyAgICAgICAgY29kZWFyaXRoKGZzLCBPUF9DT05DQVQsIGUxLCBlMik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfQUREOiBjb2RlYXJpdGgoZnMsIE9QX0FERCwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfU1VCOiBjb2RlYXJpdGgoZnMsIE9QX1NVQiwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfTVVMOiBjb2RlYXJpdGgoZnMsIE9QX01VTCwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfRElWOiBjb2RlYXJpdGgoZnMsIE9QX0RJViwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfTU9EOiBjb2RlYXJpdGgoZnMsIE9QX01PRCwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfUE9XOiBjb2RlYXJpdGgoZnMsIE9QX1BPVywgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfRVE6IGNvZGVjb21wKGZzLCBPUF9FUSwgMSwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfTkU6IGNvZGVjb21wKGZzLCBPUF9FUSwgMCwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfTFQ6IGNvZGVjb21wKGZzLCBPUF9MVCwgMSwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfTEU6IGNvZGVjb21wKGZzLCBPUF9MRSwgMSwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfR1Q6IGNvZGVjb21wKGZzLCBPUF9MVCwgMCwgZTEsIGUyKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfR0U6IGNvZGVjb21wKGZzLCBPUF9MRSwgMCwgZTEsIGUyKTsgYnJlYWs7CisgICAgZGVmYXVsdDogbHVhX2Fzc2VydCgwKTsKKyAgfQorfQorCisKK3ZvaWQgbHVhS19maXhsaW5lIChGdW5jU3RhdGUgKmZzLCBpbnQgbGluZSkgeworICBmcy0+Zi0+bGluZWluZm9bZnMtPnBjIC0gMV0gPSBsaW5lOworfQorCisKK3N0YXRpYyBpbnQgbHVhS19jb2RlIChGdW5jU3RhdGUgKmZzLCBJbnN0cnVjdGlvbiBpLCBpbnQgbGluZSkgeworICBQcm90byAqZiA9IGZzLT5mOworICBkaXNjaGFyZ2VqcGMoZnMpOyAgLyogYHBjJyB3aWxsIGNoYW5nZSAqLworICAvKiBwdXQgbmV3IGluc3RydWN0aW9uIGluIGNvZGUgYXJyYXkgKi8KKyAgbHVhTV9ncm93dmVjdG9yKGZzLT5MLCBmLT5jb2RlLCBmcy0+cGMsIGYtPnNpemVjb2RlLCBJbnN0cnVjdGlvbiwKKyAgICAgICAgICAgICAgICAgIE1BWF9JTlQsICJjb2RlIHNpemUgb3ZlcmZsb3ciKTsKKyAgZi0+Y29kZVtmcy0+cGNdID0gaTsKKyAgLyogc2F2ZSBjb3JyZXNwb25kaW5nIGxpbmUgaW5mb3JtYXRpb24gKi8KKyAgbHVhTV9ncm93dmVjdG9yKGZzLT5MLCBmLT5saW5laW5mbywgZnMtPnBjLCBmLT5zaXplbGluZWluZm8sIGludCwKKyAgICAgICAgICAgICAgICAgIE1BWF9JTlQsICJjb2RlIHNpemUgb3ZlcmZsb3ciKTsKKyAgZi0+bGluZWluZm9bZnMtPnBjXSA9IGxpbmU7CisgIHJldHVybiBmcy0+cGMrKzsKK30KKworCitpbnQgbHVhS19jb2RlQUJDIChGdW5jU3RhdGUgKmZzLCBPcENvZGUgbywgaW50IGEsIGludCBiLCBpbnQgYykgeworICBsdWFfYXNzZXJ0KGdldE9wTW9kZShvKSA9PSBpQUJDKTsKKyAgbHVhX2Fzc2VydChnZXRCTW9kZShvKSAhPSBPcEFyZ04gfHwgYiA9PSAwKTsKKyAgbHVhX2Fzc2VydChnZXRDTW9kZShvKSAhPSBPcEFyZ04gfHwgYyA9PSAwKTsKKyAgcmV0dXJuIGx1YUtfY29kZShmcywgQ1JFQVRFX0FCQyhvLCBhLCBiLCBjKSwgZnMtPmxzLT5sYXN0bGluZSk7Cit9CisKKworaW50IGx1YUtfY29kZUFCeCAoRnVuY1N0YXRlICpmcywgT3BDb2RlIG8sIGludCBhLCB1bnNpZ25lZCBpbnQgYmMpIHsKKyAgbHVhX2Fzc2VydChnZXRPcE1vZGUobykgPT0gaUFCeCB8fCBnZXRPcE1vZGUobykgPT0gaUFzQngpOworICBsdWFfYXNzZXJ0KGdldENNb2RlKG8pID09IE9wQXJnTik7CisgIHJldHVybiBsdWFLX2NvZGUoZnMsIENSRUFURV9BQngobywgYSwgYmMpLCBmcy0+bHMtPmxhc3RsaW5lKTsKK30KKworCit2b2lkIGx1YUtfc2V0bGlzdCAoRnVuY1N0YXRlICpmcywgaW50IGJhc2UsIGludCBuZWxlbXMsIGludCB0b3N0b3JlKSB7CisgIGludCBjID0gIChuZWxlbXMgLSAxKS9MRklFTERTX1BFUl9GTFVTSCArIDE7CisgIGludCBiID0gKHRvc3RvcmUgPT0gTFVBX01VTFRSRVQpID8gMCA6IHRvc3RvcmU7CisgIGx1YV9hc3NlcnQodG9zdG9yZSAhPSAwKTsKKyAgaWYgKGMgPD0gTUFYQVJHX0MpCisgICAgbHVhS19jb2RlQUJDKGZzLCBPUF9TRVRMSVNULCBiYXNlLCBiLCBjKTsKKyAgZWxzZSB7CisgICAgbHVhS19jb2RlQUJDKGZzLCBPUF9TRVRMSVNULCBiYXNlLCBiLCAwKTsKKyAgICBsdWFLX2NvZGUoZnMsIGNhc3QoSW5zdHJ1Y3Rpb24sIGMpLCBmcy0+bHMtPmxhc3RsaW5lKTsKKyAgfQorICBmcy0+ZnJlZXJlZyA9IGJhc2UgKyAxOyAgLyogZnJlZSByZWdpc3RlcnMgd2l0aCBsaXN0IHZhbHVlcyAqLworfQorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xjb2RlLmggYi9sdWEtNS4xLjQvc3JjL2xjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0MWM2MAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbGNvZGUuaApAQCAtMCwwICsxLDc2IEBACisvKgorKiogJElkOiBsY29kZS5oLHYgMS40OC4xLjEgMjAwNy8xMi8yNyAxMzowMjoyNSByb2JlcnRvIEV4cCAkCisqKiBDb2RlIGdlbmVyYXRvciBmb3IgTHVhCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsY29kZV9oCisjZGVmaW5lIGxjb2RlX2gKKworI2luY2x1ZGUgImxsZXguaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibG9wY29kZXMuaCIKKyNpbmNsdWRlICJscGFyc2VyLmgiCisKKworLyoKKyoqIE1hcmtzIHRoZSBlbmQgb2YgYSBwYXRjaCBsaXN0LiBJdCBpcyBhbiBpbnZhbGlkIHZhbHVlIGJvdGggYXMgYW4gYWJzb2x1dGUKKyoqIGFkZHJlc3MsIGFuZCBhcyBhIGxpc3QgbGluayAod291bGQgbGluayBhbiBlbGVtZW50IHRvIGl0c2VsZikuCisqLworI2RlZmluZSBOT19KVU1QICgtMSkKKworCisvKgorKiogZ3JlcCAiT1JERVIgT1BSIiBpZiB5b3UgY2hhbmdlIHRoZXNlIGVudW1zCisqLwordHlwZWRlZiBlbnVtIEJpbk9wciB7CisgIE9QUl9BREQsIE9QUl9TVUIsIE9QUl9NVUwsIE9QUl9ESVYsIE9QUl9NT0QsIE9QUl9QT1csCisgIE9QUl9DT05DQVQsCisgIE9QUl9ORSwgT1BSX0VRLAorICBPUFJfTFQsIE9QUl9MRSwgT1BSX0dULCBPUFJfR0UsCisgIE9QUl9BTkQsIE9QUl9PUiwKKyAgT1BSX05PQklOT1BSCit9IEJpbk9wcjsKKworCit0eXBlZGVmIGVudW0gVW5PcHIgeyBPUFJfTUlOVVMsIE9QUl9OT1QsIE9QUl9MRU4sIE9QUl9OT1VOT1BSIH0gVW5PcHI7CisKKworI2RlZmluZSBnZXRjb2RlKGZzLGUpCSgoZnMpLT5mLT5jb2RlWyhlKS0+dS5zLmluZm9dKQorCisjZGVmaW5lIGx1YUtfY29kZUFzQngoZnMsbyxBLHNCeCkJbHVhS19jb2RlQUJ4KGZzLG8sQSwoc0J4KStNQVhBUkdfc0J4KQorCisjZGVmaW5lIGx1YUtfc2V0bXVsdHJldChmcyxlKQlsdWFLX3NldHJldHVybnMoZnMsIGUsIExVQV9NVUxUUkVUKQorCitMVUFJX0ZVTkMgaW50IGx1YUtfY29kZUFCeCAoRnVuY1N0YXRlICpmcywgT3BDb2RlIG8sIGludCBBLCB1bnNpZ25lZCBpbnQgQngpOworTFVBSV9GVU5DIGludCBsdWFLX2NvZGVBQkMgKEZ1bmNTdGF0ZSAqZnMsIE9wQ29kZSBvLCBpbnQgQSwgaW50IEIsIGludCBDKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfZml4bGluZSAoRnVuY1N0YXRlICpmcywgaW50IGxpbmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19uaWwgKEZ1bmNTdGF0ZSAqZnMsIGludCBmcm9tLCBpbnQgbik7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3Jlc2VydmVyZWdzIChGdW5jU3RhdGUgKmZzLCBpbnQgbik7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX2NoZWNrc3RhY2sgKEZ1bmNTdGF0ZSAqZnMsIGludCBuKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19zdHJpbmdLIChGdW5jU3RhdGUgKmZzLCBUU3RyaW5nICpzKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19udW1iZXJLIChGdW5jU3RhdGUgKmZzLCBsdWFfTnVtYmVyIHIpOworTFVBSV9GVU5DIHZvaWQgbHVhS19kaXNjaGFyZ2V2YXJzIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19leHAyYW55cmVnIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfZXhwMm5leHRyZWcgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19leHAydmFsIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19leHAyUksgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19zZWxmIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplLCBleHBkZXNjICprZXkpOworTFVBSV9GVU5DIHZvaWQgbHVhS19pbmRleGVkIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICp0LCBleHBkZXNjICprKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfZ29pZnRydWUgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19zdG9yZXZhciAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqdmFyLCBleHBkZXNjICplKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfc2V0cmV0dXJucyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSwgaW50IG5yZXN1bHRzKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfc2V0b25lcmV0IChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19qdW1wIChGdW5jU3RhdGUgKmZzKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfcmV0IChGdW5jU3RhdGUgKmZzLCBpbnQgZmlyc3QsIGludCBucmV0KTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfcGF0Y2hsaXN0IChGdW5jU3RhdGUgKmZzLCBpbnQgbGlzdCwgaW50IHRhcmdldCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3BhdGNodG9oZXJlIChGdW5jU3RhdGUgKmZzLCBpbnQgbGlzdCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX2NvbmNhdCAoRnVuY1N0YXRlICpmcywgaW50ICpsMSwgaW50IGwyKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19nZXRsYWJlbCAoRnVuY1N0YXRlICpmcyk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3ByZWZpeCAoRnVuY1N0YXRlICpmcywgVW5PcHIgb3AsIGV4cGRlc2MgKnYpOworTFVBSV9GVU5DIHZvaWQgbHVhS19pbmZpeCAoRnVuY1N0YXRlICpmcywgQmluT3ByIG9wLCBleHBkZXNjICp2KTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfcG9zZml4IChGdW5jU3RhdGUgKmZzLCBCaW5PcHIgb3AsIGV4cGRlc2MgKnYxLCBleHBkZXNjICp2Mik7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3NldGxpc3QgKEZ1bmNTdGF0ZSAqZnMsIGludCBiYXNlLCBpbnQgbmVsZW1zLCBpbnQgdG9zdG9yZSk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xkYmxpYi5jIGIvbHVhLTUuMS40L3NyYy9sZGJsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RlMTIyCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sZGJsaWIuYwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyoqICRJZDogbGRibGliLmMsdiAxLjEwNC4xLjMgMjAwOC8wMS8yMSAxMzoxMToyMSByb2JlcnRvIEV4cCAkCisqKiBJbnRlcmZhY2UgZnJvbSBMdWEgdG8gaXRzIGRlYnVnIEFQSQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbGRibGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworCitzdGF0aWMgaW50IGRiX2dldHJlZ2lzdHJ5IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2h2YWx1ZShMLCBMVUFfUkVHSVNUUllJTkRFWCk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZGJfZ2V0bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgaWYgKCFsdWFfZ2V0bWV0YXRhYmxlKEwsIDEpKSB7CisgICAgbHVhX3B1c2huaWwoTCk7ICAvKiBubyBtZXRhdGFibGUgKi8KKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGRiX3NldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMKSB7CisgIGludCB0ID0gbHVhX3R5cGUoTCwgMik7CisgIGx1YUxfYXJnY2hlY2soTCwgdCA9PSBMVUFfVE5JTCB8fCB0ID09IExVQV9UVEFCTEUsIDIsCisgICAgICAgICAgICAgICAgICAgICJuaWwgb3IgdGFibGUgZXhwZWN0ZWQiKTsKKyAgbHVhX3NldHRvcChMLCAyKTsKKyAgbHVhX3B1c2hib29sZWFuKEwsIGx1YV9zZXRtZXRhdGFibGUoTCwgMSkpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGRiX2dldGZlbnYgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfZ2V0ZmVudihMLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBkYl9zZXRmZW52IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMiwgTFVBX1RUQUJMRSk7CisgIGx1YV9zZXR0b3AoTCwgMik7CisgIGlmIChsdWFfc2V0ZmVudihMLCAxKSA9PSAwKQorICAgIGx1YUxfZXJyb3IoTCwgTFVBX1FMKCJzZXRmZW52IikKKyAgICAgICAgICAgICAgICAgICIgY2Fubm90IGNoYW5nZSBlbnZpcm9ubWVudCBvZiBnaXZlbiBvYmplY3QiKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgc2V0dGFic3MgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqaSwgY29uc3QgY2hhciAqdikgeworICBsdWFfcHVzaHN0cmluZyhMLCB2KTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCBpKTsKK30KKworCitzdGF0aWMgdm9pZCBzZXR0YWJzaSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICppLCBpbnQgdikgeworICBsdWFfcHVzaGludGVnZXIoTCwgdik7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgaSk7Cit9CisKKworc3RhdGljIGx1YV9TdGF0ZSAqZ2V0dGhyZWFkIChsdWFfU3RhdGUgKkwsIGludCAqYXJnKSB7CisgIGlmIChsdWFfaXN0aHJlYWQoTCwgMSkpIHsKKyAgICAqYXJnID0gMTsKKyAgICByZXR1cm4gbHVhX3RvdGhyZWFkKEwsIDEpOworICB9CisgIGVsc2UgeworICAgICphcmcgPSAwOworICAgIHJldHVybiBMOworICB9Cit9CisKKworc3RhdGljIHZvaWQgdHJlYXRzdGFja29wdGlvbiAobHVhX1N0YXRlICpMLCBsdWFfU3RhdGUgKkwxLCBjb25zdCBjaGFyICpmbmFtZSkgeworICBpZiAoTCA9PSBMMSkgeworICAgIGx1YV9wdXNodmFsdWUoTCwgLTIpOworICAgIGx1YV9yZW1vdmUoTCwgLTMpOworICB9CisgIGVsc2UKKyAgICBsdWFfeG1vdmUoTDEsIEwsIDEpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsIGZuYW1lKTsKK30KKworCitzdGF0aWMgaW50IGRiX2dldGluZm8gKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfRGVidWcgYXI7CisgIGludCBhcmc7CisgIGx1YV9TdGF0ZSAqTDEgPSBnZXR0aHJlYWQoTCwgJmFyZyk7CisgIGNvbnN0IGNoYXIgKm9wdGlvbnMgPSBsdWFMX29wdHN0cmluZyhMLCBhcmcrMiwgImZsblN1Iik7CisgIGlmIChsdWFfaXNudW1iZXIoTCwgYXJnKzEpKSB7CisgICAgaWYgKCFsdWFfZ2V0c3RhY2soTDEsIChpbnQpbHVhX3RvaW50ZWdlcihMLCBhcmcrMSksICZhcikpIHsKKyAgICAgIGx1YV9wdXNobmlsKEwpOyAgLyogbGV2ZWwgb3V0IG9mIHJhbmdlICovCisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAobHVhX2lzZnVuY3Rpb24oTCwgYXJnKzEpKSB7CisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICI+JXMiLCBvcHRpb25zKTsKKyAgICBvcHRpb25zID0gbHVhX3Rvc3RyaW5nKEwsIC0xKTsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIGFyZysxKTsKKyAgICBsdWFfeG1vdmUoTCwgTDEsIDEpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gbHVhTF9hcmdlcnJvcihMLCBhcmcrMSwgImZ1bmN0aW9uIG9yIGxldmVsIGV4cGVjdGVkIik7CisgIGlmICghbHVhX2dldGluZm8oTDEsIG9wdGlvbnMsICZhcikpCisgICAgcmV0dXJuIGx1YUxfYXJnZXJyb3IoTCwgYXJnKzIsICJpbnZhbGlkIG9wdGlvbiIpOworICBsdWFfY3JlYXRldGFibGUoTCwgMCwgMik7CisgIGlmIChzdHJjaHIob3B0aW9ucywgJ1MnKSkgeworICAgIHNldHRhYnNzKEwsICJzb3VyY2UiLCBhci5zb3VyY2UpOworICAgIHNldHRhYnNzKEwsICJzaG9ydF9zcmMiLCBhci5zaG9ydF9zcmMpOworICAgIHNldHRhYnNpKEwsICJsaW5lZGVmaW5lZCIsIGFyLmxpbmVkZWZpbmVkKTsKKyAgICBzZXR0YWJzaShMLCAibGFzdGxpbmVkZWZpbmVkIiwgYXIubGFzdGxpbmVkZWZpbmVkKTsKKyAgICBzZXR0YWJzcyhMLCAid2hhdCIsIGFyLndoYXQpOworICB9CisgIGlmIChzdHJjaHIob3B0aW9ucywgJ2wnKSkKKyAgICBzZXR0YWJzaShMLCAiY3VycmVudGxpbmUiLCBhci5jdXJyZW50bGluZSk7CisgIGlmIChzdHJjaHIob3B0aW9ucywgJ3UnKSkKKyAgICBzZXR0YWJzaShMLCAibnVwcyIsIGFyLm51cHMpOworICBpZiAoc3RyY2hyKG9wdGlvbnMsICduJykpIHsKKyAgICBzZXR0YWJzcyhMLCAibmFtZSIsIGFyLm5hbWUpOworICAgIHNldHRhYnNzKEwsICJuYW1ld2hhdCIsIGFyLm5hbWV3aGF0KTsKKyAgfQorICBpZiAoc3RyY2hyKG9wdGlvbnMsICdMJykpCisgICAgdHJlYXRzdGFja29wdGlvbihMLCBMMSwgImFjdGl2ZWxpbmVzIik7CisgIGlmIChzdHJjaHIob3B0aW9ucywgJ2YnKSkKKyAgICB0cmVhdHN0YWNrb3B0aW9uKEwsIEwxLCAiZnVuYyIpOworICByZXR1cm4gMTsgIC8qIHJldHVybiB0YWJsZSAqLworfQorICAgIAorCitzdGF0aWMgaW50IGRiX2dldGxvY2FsIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGFyZzsKKyAgbHVhX1N0YXRlICpMMSA9IGdldHRocmVhZChMLCAmYXJnKTsKKyAgbHVhX0RlYnVnIGFyOworICBjb25zdCBjaGFyICpuYW1lOworICBpZiAoIWx1YV9nZXRzdGFjayhMMSwgbHVhTF9jaGVja2ludChMLCBhcmcrMSksICZhcikpICAvKiBvdXQgb2YgcmFuZ2U/ICovCisgICAgcmV0dXJuIGx1YUxfYXJnZXJyb3IoTCwgYXJnKzEsICJsZXZlbCBvdXQgb2YgcmFuZ2UiKTsKKyAgbmFtZSA9IGx1YV9nZXRsb2NhbChMMSwgJmFyLCBsdWFMX2NoZWNraW50KEwsIGFyZysyKSk7CisgIGlmIChuYW1lKSB7CisgICAgbHVhX3htb3ZlKEwxLCBMLCAxKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBuYW1lKTsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBlbHNlIHsKKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgZGJfc2V0bG9jYWwgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYXJnOworICBsdWFfU3RhdGUgKkwxID0gZ2V0dGhyZWFkKEwsICZhcmcpOworICBsdWFfRGVidWcgYXI7CisgIGlmICghbHVhX2dldHN0YWNrKEwxLCBsdWFMX2NoZWNraW50KEwsIGFyZysxKSwgJmFyKSkgIC8qIG91dCBvZiByYW5nZT8gKi8KKyAgICByZXR1cm4gbHVhTF9hcmdlcnJvcihMLCBhcmcrMSwgImxldmVsIG91dCBvZiByYW5nZSIpOworICBsdWFMX2NoZWNrYW55KEwsIGFyZyszKTsKKyAgbHVhX3NldHRvcChMLCBhcmcrMyk7CisgIGx1YV94bW92ZShMLCBMMSwgMSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGx1YV9zZXRsb2NhbChMMSwgJmFyLCBsdWFMX2NoZWNraW50KEwsIGFyZysyKSkpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGF1eHVwdmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGdldCkgeworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgbiA9IGx1YUxfY2hlY2tpbnQoTCwgMik7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9URlVOQ1RJT04pOworICBpZiAobHVhX2lzY2Z1bmN0aW9uKEwsIDEpKSByZXR1cm4gMDsgIC8qIGNhbm5vdCB0b3VjaCBDIHVwdmFsdWVzIGZyb20gTHVhICovCisgIG5hbWUgPSBnZXQgPyBsdWFfZ2V0dXB2YWx1ZShMLCAxLCBuKSA6IGx1YV9zZXR1cHZhbHVlKEwsIDEsIG4pOworICBpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgbmFtZSk7CisgIGx1YV9pbnNlcnQoTCwgLShnZXQrMSkpOworICByZXR1cm4gZ2V0ICsgMTsKK30KKworCitzdGF0aWMgaW50IGRiX2dldHVwdmFsdWUgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gYXV4dXB2YWx1ZShMLCAxKTsKK30KKworCitzdGF0aWMgaW50IGRiX3NldHVwdmFsdWUgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrYW55KEwsIDMpOworICByZXR1cm4gYXV4dXB2YWx1ZShMLCAwKTsKK30KKworCisKK3N0YXRpYyBjb25zdCBjaGFyIEtFWV9IT09LID0gJ2gnOworCisKK3N0YXRpYyB2b2lkIGhvb2tmIChsdWFfU3RhdGUgKkwsIGx1YV9EZWJ1ZyAqYXIpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGhvb2tuYW1lc1tdID0KKyAgICB7ImNhbGwiLCAicmV0dXJuIiwgImxpbmUiLCAiY291bnQiLCAidGFpbCByZXR1cm4ifTsKKyAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsICh2b2lkICopJktFWV9IT09LKTsKKyAgbHVhX3Jhd2dldChMLCBMVUFfUkVHSVNUUllJTkRFWCk7CisgIGx1YV9wdXNobGlnaHR1c2VyZGF0YShMLCBMKTsKKyAgbHVhX3Jhd2dldChMLCAtMik7CisgIGlmIChsdWFfaXNmdW5jdGlvbihMLCAtMSkpIHsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBob29rbmFtZXNbKGludClhci0+ZXZlbnRdKTsKKyAgICBpZiAoYXItPmN1cnJlbnRsaW5lID49IDApCisgICAgICBsdWFfcHVzaGludGVnZXIoTCwgYXItPmN1cnJlbnRsaW5lKTsKKyAgICBlbHNlIGx1YV9wdXNobmlsKEwpOworICAgIGx1YV9hc3NlcnQobHVhX2dldGluZm8oTCwgImxTIiwgYXIpKTsKKyAgICBsdWFfY2FsbChMLCAyLCAwKTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbWFrZW1hc2sgKGNvbnN0IGNoYXIgKnNtYXNrLCBpbnQgY291bnQpIHsKKyAgaW50IG1hc2sgPSAwOworICBpZiAoc3RyY2hyKHNtYXNrLCAnYycpKSBtYXNrIHw9IExVQV9NQVNLQ0FMTDsKKyAgaWYgKHN0cmNocihzbWFzaywgJ3InKSkgbWFzayB8PSBMVUFfTUFTS1JFVDsKKyAgaWYgKHN0cmNocihzbWFzaywgJ2wnKSkgbWFzayB8PSBMVUFfTUFTS0xJTkU7CisgIGlmIChjb3VudCA+IDApIG1hc2sgfD0gTFVBX01BU0tDT1VOVDsKKyAgcmV0dXJuIG1hc2s7Cit9CisKKworc3RhdGljIGNoYXIgKnVubWFrZW1hc2sgKGludCBtYXNrLCBjaGFyICpzbWFzaykgeworICBpbnQgaSA9IDA7CisgIGlmIChtYXNrICYgTFVBX01BU0tDQUxMKSBzbWFza1tpKytdID0gJ2MnOworICBpZiAobWFzayAmIExVQV9NQVNLUkVUKSBzbWFza1tpKytdID0gJ3InOworICBpZiAobWFzayAmIExVQV9NQVNLTElORSkgc21hc2tbaSsrXSA9ICdsJzsKKyAgc21hc2tbaV0gPSAnXDAnOworICByZXR1cm4gc21hc2s7Cit9CisKKworc3RhdGljIHZvaWQgZ2V0aG9va3RhYmxlIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsICh2b2lkICopJktFWV9IT09LKTsKKyAgbHVhX3Jhd2dldChMLCBMVUFfUkVHSVNUUllJTkRFWCk7CisgIGlmICghbHVhX2lzdGFibGUoTCwgLTEpKSB7CisgICAgbHVhX3BvcChMLCAxKTsKKyAgICBsdWFfY3JlYXRldGFibGUoTCwgMCwgMSk7CisgICAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsICh2b2lkICopJktFWV9IT09LKTsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsKKyAgICBsdWFfcmF3c2V0KEwsIExVQV9SRUdJU1RSWUlOREVYKTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgZGJfc2V0aG9vayAobHVhX1N0YXRlICpMKSB7CisgIGludCBhcmcsIG1hc2ssIGNvdW50OworICBsdWFfSG9vayBmdW5jOworICBsdWFfU3RhdGUgKkwxID0gZ2V0dGhyZWFkKEwsICZhcmcpOworICBpZiAobHVhX2lzbm9uZW9ybmlsKEwsIGFyZysxKSkgeworICAgIGx1YV9zZXR0b3AoTCwgYXJnKzEpOworICAgIGZ1bmMgPSBOVUxMOyBtYXNrID0gMDsgY291bnQgPSAwOyAgLyogdHVybiBvZmYgaG9va3MgKi8KKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBjaGFyICpzbWFzayA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgYXJnKzIpOworICAgIGx1YUxfY2hlY2t0eXBlKEwsIGFyZysxLCBMVUFfVEZVTkNUSU9OKTsKKyAgICBjb3VudCA9IGx1YUxfb3B0aW50KEwsIGFyZyszLCAwKTsKKyAgICBmdW5jID0gaG9va2Y7IG1hc2sgPSBtYWtlbWFzayhzbWFzaywgY291bnQpOworICB9CisgIGdldGhvb2t0YWJsZShMKTsKKyAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsIEwxKTsKKyAgbHVhX3B1c2h2YWx1ZShMLCBhcmcrMSk7CisgIGx1YV9yYXdzZXQoTCwgLTMpOyAgLyogc2V0IG5ldyBob29rICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgaG9vayB0YWJsZSAqLworICBsdWFfc2V0aG9vayhMMSwgZnVuYywgbWFzaywgY291bnQpOyAgLyogc2V0IGhvb2tzICovCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGJfZ2V0aG9vayAobHVhX1N0YXRlICpMKSB7CisgIGludCBhcmc7CisgIGx1YV9TdGF0ZSAqTDEgPSBnZXR0aHJlYWQoTCwgJmFyZyk7CisgIGNoYXIgYnVmZls1XTsKKyAgaW50IG1hc2sgPSBsdWFfZ2V0aG9va21hc2soTDEpOworICBsdWFfSG9vayBob29rID0gbHVhX2dldGhvb2soTDEpOworICBpZiAoaG9vayAhPSBOVUxMICYmIGhvb2sgIT0gaG9va2YpICAvKiBleHRlcm5hbCBob29rPyAqLworICAgIGx1YV9wdXNobGl0ZXJhbChMLCAiZXh0ZXJuYWwgaG9vayIpOworICBlbHNlIHsKKyAgICBnZXRob29rdGFibGUoTCk7CisgICAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsIEwxKTsKKyAgICBsdWFfcmF3Z2V0KEwsIC0yKTsgICAvKiBnZXQgaG9vayAqLworICAgIGx1YV9yZW1vdmUoTCwgLTIpOyAgLyogcmVtb3ZlIGhvb2sgdGFibGUgKi8KKyAgfQorICBsdWFfcHVzaHN0cmluZyhMLCB1bm1ha2VtYXNrKG1hc2ssIGJ1ZmYpKTsKKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIGx1YV9nZXRob29rY291bnQoTDEpKTsKKyAgcmV0dXJuIDM7Cit9CisKKworc3RhdGljIGludCBkYl9kZWJ1ZyAobHVhX1N0YXRlICpMKSB7CisgIGZvciAoOzspIHsKKyAgICBjaGFyIGJ1ZmZlclsyNTBdOworICAgIGZwdXRzKCJsdWFfZGVidWc+ICIsIHN0ZGVycik7CisgICAgaWYgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0ZGluKSA9PSAwIHx8CisgICAgICAgIHN0cmNtcChidWZmZXIsICJjb250XG4iKSA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGx1YUxfbG9hZGJ1ZmZlcihMLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCAiPShkZWJ1ZyBjb21tYW5kKSIpIHx8CisgICAgICAgIGx1YV9wY2FsbChMLCAwLCAwLCAwKSkgeworICAgICAgZnB1dHMobHVhX3Rvc3RyaW5nKEwsIC0xKSwgc3RkZXJyKTsKKyAgICAgIGZwdXRzKCJcbiIsIHN0ZGVycik7CisgICAgfQorICAgIGx1YV9zZXR0b3AoTCwgMCk7ICAvKiByZW1vdmUgZXZlbnR1YWwgcmV0dXJucyAqLworICB9Cit9CisKKworI2RlZmluZSBMRVZFTFMxCTEyCS8qIHNpemUgb2YgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN0YWNrICovCisjZGVmaW5lIExFVkVMUzIJMTAJLyogc2l6ZSBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHN0YWNrICovCisKK3N0YXRpYyBpbnQgZGJfZXJyb3JmYiAobHVhX1N0YXRlICpMKSB7CisgIGludCBsZXZlbDsKKyAgaW50IGZpcnN0cGFydCA9IDE7ICAvKiBzdGlsbCBiZWZvcmUgZXZlbnR1YWwgYC4uLicgKi8KKyAgaW50IGFyZzsKKyAgbHVhX1N0YXRlICpMMSA9IGdldHRocmVhZChMLCAmYXJnKTsKKyAgbHVhX0RlYnVnIGFyOworICBpZiAobHVhX2lzbnVtYmVyKEwsIGFyZysyKSkgeworICAgIGxldmVsID0gKGludClsdWFfdG9pbnRlZ2VyKEwsIGFyZysyKTsKKyAgICBsdWFfcG9wKEwsIDEpOworICB9CisgIGVsc2UKKyAgICBsZXZlbCA9IChMID09IEwxKSA/IDEgOiAwOyAgLyogbGV2ZWwgMCBtYXkgYmUgdGhpcyBvd24gZnVuY3Rpb24gKi8KKyAgaWYgKGx1YV9nZXR0b3AoTCkgPT0gYXJnKQorICAgIGx1YV9wdXNobGl0ZXJhbChMLCAiIik7CisgIGVsc2UgaWYgKCFsdWFfaXNzdHJpbmcoTCwgYXJnKzEpKSByZXR1cm4gMTsgIC8qIG1lc3NhZ2UgaXMgbm90IGEgc3RyaW5nICovCisgIGVsc2UgbHVhX3B1c2hsaXRlcmFsKEwsICJcbiIpOworICBsdWFfcHVzaGxpdGVyYWwoTCwgInN0YWNrIHRyYWNlYmFjazoiKTsKKyAgd2hpbGUgKGx1YV9nZXRzdGFjayhMMSwgbGV2ZWwrKywgJmFyKSkgeworICAgIGlmIChsZXZlbCA+IExFVkVMUzEgJiYgZmlyc3RwYXJ0KSB7CisgICAgICAvKiBubyBtb3JlIHRoYW4gYExFVkVMUzInIG1vcmUgbGV2ZWxzPyAqLworICAgICAgaWYgKCFsdWFfZ2V0c3RhY2soTDEsIGxldmVsK0xFVkVMUzIsICZhcikpCisgICAgICAgIGxldmVsLS07ICAvKiBrZWVwIGdvaW5nICovCisgICAgICBlbHNlIHsKKyAgICAgICAgbHVhX3B1c2hsaXRlcmFsKEwsICJcblx0Li4uIik7ICAvKiB0b28gbWFueSBsZXZlbHMgKi8KKyAgICAgICAgd2hpbGUgKGx1YV9nZXRzdGFjayhMMSwgbGV2ZWwrTEVWRUxTMiwgJmFyKSkgIC8qIGZpbmQgbGFzdCBsZXZlbHMgKi8KKyAgICAgICAgICBsZXZlbCsrOworICAgICAgfQorICAgICAgZmlyc3RwYXJ0ID0gMDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIlxuXHQiKTsKKyAgICBsdWFfZ2V0aW5mbyhMMSwgIlNubCIsICZhcik7CisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICIlczoiLCBhci5zaG9ydF9zcmMpOworICAgIGlmIChhci5jdXJyZW50bGluZSA+IDApCisgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVkOiIsIGFyLmN1cnJlbnRsaW5lKTsKKyAgICBpZiAoKmFyLm5hbWV3aGF0ICE9ICdcMCcpICAvKiBpcyB0aGVyZSBhIG5hbWU/ICovCisgICAgICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiIGluIGZ1bmN0aW9uICIgTFVBX1FTLCBhci5uYW1lKTsKKyAgICBlbHNlIHsKKyAgICAgIGlmICgqYXIud2hhdCA9PSAnbScpICAvKiBtYWluPyAqLworICAgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiBpbiBtYWluIGNodW5rIik7CisgICAgICBlbHNlIGlmICgqYXIud2hhdCA9PSAnQycgfHwgKmFyLndoYXQgPT0gJ3QnKQorICAgICAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIiA/Iik7ICAvKiBDIGZ1bmN0aW9uIG9yIHRhaWwgY2FsbCAqLworICAgICAgZWxzZQorICAgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiBpbiBmdW5jdGlvbiA8JXM6JWQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyLnNob3J0X3NyYywgYXIubGluZWRlZmluZWQpOworICAgIH0KKyAgICBsdWFfY29uY2F0KEwsIGx1YV9nZXR0b3AoTCkgLSBhcmcpOworICB9CisgIGx1YV9jb25jYXQoTCwgbHVhX2dldHRvcChMKSAtIGFyZyk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBkYmxpYltdID0geworICB7ImRlYnVnIiwgZGJfZGVidWd9LAorICB7ImdldGZlbnYiLCBkYl9nZXRmZW52fSwKKyAgeyJnZXRob29rIiwgZGJfZ2V0aG9va30sCisgIHsiZ2V0aW5mbyIsIGRiX2dldGluZm99LAorICB7ImdldGxvY2FsIiwgZGJfZ2V0bG9jYWx9LAorICB7ImdldHJlZ2lzdHJ5IiwgZGJfZ2V0cmVnaXN0cnl9LAorICB7ImdldG1ldGF0YWJsZSIsIGRiX2dldG1ldGF0YWJsZX0sCisgIHsiZ2V0dXB2YWx1ZSIsIGRiX2dldHVwdmFsdWV9LAorICB7InNldGZlbnYiLCBkYl9zZXRmZW52fSwKKyAgeyJzZXRob29rIiwgZGJfc2V0aG9va30sCisgIHsic2V0bG9jYWwiLCBkYl9zZXRsb2NhbH0sCisgIHsic2V0bWV0YXRhYmxlIiwgZGJfc2V0bWV0YXRhYmxlfSwKKyAgeyJzZXR1cHZhbHVlIiwgZGJfc2V0dXB2YWx1ZX0sCisgIHsidHJhY2ViYWNrIiwgZGJfZXJyb3JmYn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCitMVUFMSUJfQVBJIGludCBsdWFvcGVuX2RlYnVnIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9yZWdpc3RlcihMLCBMVUFfREJMSUJOQU1FLCBkYmxpYik7CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xkZWJ1Zy5jIGIvbHVhLTUuMS40L3NyYy9sZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFkM2QzCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sZGVidWcuYwpAQCAtMCwwICsxLDYzOCBAQAorLyoKKyoqICRJZDogbGRlYnVnLmMsdiAyLjI5LjEuNiAyMDA4LzA1LzA4IDE2OjU2OjI2IHJvYmVydG8gRXhwICQKKyoqIERlYnVnIEludGVyZmFjZQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNkZWZpbmUgbGRlYnVnX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGFwaS5oIgorI2luY2x1ZGUgImxjb2RlLmgiCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibG9wY29kZXMuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisjaW5jbHVkZSAibHRtLmgiCisjaW5jbHVkZSAibHZtLmgiCisKKworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0ZnVuY25hbWUgKGx1YV9TdGF0ZSAqTCwgQ2FsbEluZm8gKmNpLCBjb25zdCBjaGFyICoqbmFtZSk7CisKKworc3RhdGljIGludCBjdXJyZW50cGMgKGx1YV9TdGF0ZSAqTCwgQ2FsbEluZm8gKmNpKSB7CisgIGlmICghaXNMdWEoY2kpKSByZXR1cm4gLTE7ICAvKiBmdW5jdGlvbiBpcyBub3QgYSBMdWEgZnVuY3Rpb24/ICovCisgIGlmIChjaSA9PSBMLT5jaSkKKyAgICBjaS0+c2F2ZWRwYyA9IEwtPnNhdmVkcGM7CisgIHJldHVybiBwY1JlbChjaS0+c2F2ZWRwYywgY2lfZnVuYyhjaSktPmwucCk7Cit9CisKKworc3RhdGljIGludCBjdXJyZW50bGluZSAobHVhX1N0YXRlICpMLCBDYWxsSW5mbyAqY2kpIHsKKyAgaW50IHBjID0gY3VycmVudHBjKEwsIGNpKTsKKyAgaWYgKHBjIDwgMCkKKyAgICByZXR1cm4gLTE7ICAvKiBvbmx5IGFjdGl2ZSBsdWEgZnVuY3Rpb25zIGhhdmUgY3VycmVudC1saW5lIGluZm9ybWF0aW9uICovCisgIGVsc2UKKyAgICByZXR1cm4gZ2V0bGluZShjaV9mdW5jKGNpKS0+bC5wLCBwYyk7Cit9CisKKworLyoKKyoqIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhc3luY2hyb25vdXMgKGUuZy4gZHVyaW5nIGEgc2lnbmFsKQorKi8KK0xVQV9BUEkgaW50IGx1YV9zZXRob29rIChsdWFfU3RhdGUgKkwsIGx1YV9Ib29rIGZ1bmMsIGludCBtYXNrLCBpbnQgY291bnQpIHsKKyAgaWYgKGZ1bmMgPT0gTlVMTCB8fCBtYXNrID09IDApIHsgIC8qIHR1cm4gb2ZmIGhvb2tzPyAqLworICAgIG1hc2sgPSAwOworICAgIGZ1bmMgPSBOVUxMOworICB9CisgIEwtPmhvb2sgPSBmdW5jOworICBMLT5iYXNlaG9va2NvdW50ID0gY291bnQ7CisgIHJlc2V0aG9va2NvdW50KEwpOworICBMLT5ob29rbWFzayA9IGNhc3RfYnl0ZShtYXNrKTsKKyAgcmV0dXJuIDE7Cit9CisKKworTFVBX0FQSSBsdWFfSG9vayBsdWFfZ2V0aG9vayAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBMLT5ob29rOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9nZXRob29rbWFzayAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBMLT5ob29rbWFzazsKK30KKworCitMVUFfQVBJIGludCBsdWFfZ2V0aG9va2NvdW50IChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIEwtPmJhc2Vob29rY291bnQ7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2dldHN0YWNrIChsdWFfU3RhdGUgKkwsIGludCBsZXZlbCwgbHVhX0RlYnVnICphcikgeworICBpbnQgc3RhdHVzOworICBDYWxsSW5mbyAqY2k7CisgIGx1YV9sb2NrKEwpOworICBmb3IgKGNpID0gTC0+Y2k7IGxldmVsID4gMCAmJiBjaSA+IEwtPmJhc2VfY2k7IGNpLS0pIHsKKyAgICBsZXZlbC0tOworICAgIGlmIChmX2lzTHVhKGNpKSkgIC8qIEx1YSBmdW5jdGlvbj8gKi8KKyAgICAgIGxldmVsIC09IGNpLT50YWlsY2FsbHM7ICAvKiBza2lwIGxvc3QgdGFpbCBjYWxscyAqLworICB9CisgIGlmIChsZXZlbCA9PSAwICYmIGNpID4gTC0+YmFzZV9jaSkgeyAgLyogbGV2ZWwgZm91bmQ/ICovCisgICAgc3RhdHVzID0gMTsKKyAgICBhci0+aV9jaSA9IGNhc3RfaW50KGNpIC0gTC0+YmFzZV9jaSk7CisgIH0KKyAgZWxzZSBpZiAobGV2ZWwgPCAwKSB7ICAvKiBsZXZlbCBpcyBvZiBhIGxvc3QgdGFpbCBjYWxsPyAqLworICAgIHN0YXR1cyA9IDE7CisgICAgYXItPmlfY2kgPSAwOworICB9CisgIGVsc2Ugc3RhdHVzID0gMDsgIC8qIG5vIHN1Y2ggbGV2ZWwgKi8KKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgUHJvdG8gKmdldGx1YXByb3RvIChDYWxsSW5mbyAqY2kpIHsKKyAgcmV0dXJuIChpc0x1YShjaSkgPyBjaV9mdW5jKGNpKS0+bC5wIDogTlVMTCk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRsb2NhbCAobHVhX1N0YXRlICpMLCBDYWxsSW5mbyAqY2ksIGludCBuKSB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIFByb3RvICpmcCA9IGdldGx1YXByb3RvKGNpKTsKKyAgaWYgKGZwICYmIChuYW1lID0gbHVhRl9nZXRsb2NhbG5hbWUoZnAsIG4sIGN1cnJlbnRwYyhMLCBjaSkpKSAhPSBOVUxMKQorICAgIHJldHVybiBuYW1lOyAgLyogaXMgYSBsb2NhbCB2YXJpYWJsZSBpbiBhIEx1YSBmdW5jdGlvbiAqLworICBlbHNlIHsKKyAgICBTdGtJZCBsaW1pdCA9IChjaSA9PSBMLT5jaSkgPyBMLT50b3AgOiAoY2krMSktPmZ1bmM7CisgICAgaWYgKGxpbWl0IC0gY2ktPmJhc2UgPj0gbiAmJiBuID4gMCkgIC8qIGlzICduJyBpbnNpZGUgJ2NpJyBzdGFjaz8gKi8KKyAgICAgIHJldHVybiAiKCp0ZW1wb3JhcnkpIjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCisKK0xVQV9BUEkgY29uc3QgY2hhciAqbHVhX2dldGxvY2FsIChsdWFfU3RhdGUgKkwsIGNvbnN0IGx1YV9EZWJ1ZyAqYXIsIGludCBuKSB7CisgIENhbGxJbmZvICpjaSA9IEwtPmJhc2VfY2kgKyBhci0+aV9jaTsKKyAgY29uc3QgY2hhciAqbmFtZSA9IGZpbmRsb2NhbChMLCBjaSwgbik7CisgIGx1YV9sb2NrKEwpOworICBpZiAobmFtZSkKKyAgICAgIGx1YUFfcHVzaG9iamVjdChMLCBjaS0+YmFzZSArIChuIC0gMSkpOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gbmFtZTsKK30KKworCitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV9zZXRsb2NhbCAobHVhX1N0YXRlICpMLCBjb25zdCBsdWFfRGVidWcgKmFyLCBpbnQgbikgeworICBDYWxsSW5mbyAqY2kgPSBMLT5iYXNlX2NpICsgYXItPmlfY2k7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBmaW5kbG9jYWwoTCwgY2ksIG4pOworICBsdWFfbG9jayhMKTsKKyAgaWYgKG5hbWUpCisgICAgICBzZXRvYmpzMnMoTCwgY2ktPmJhc2UgKyAobiAtIDEpLCBMLT50b3AgLSAxKTsKKyAgTC0+dG9wLS07ICAvKiBwb3AgdmFsdWUgKi8KKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKKworc3RhdGljIHZvaWQgZnVuY2luZm8gKGx1YV9EZWJ1ZyAqYXIsIENsb3N1cmUgKmNsKSB7CisgIGlmIChjbC0+Yy5pc0MpIHsKKyAgICBhci0+c291cmNlID0gIj1bQ10iOworICAgIGFyLT5saW5lZGVmaW5lZCA9IC0xOworICAgIGFyLT5sYXN0bGluZWRlZmluZWQgPSAtMTsKKyAgICBhci0+d2hhdCA9ICJDIjsKKyAgfQorICBlbHNlIHsKKyAgICBhci0+c291cmNlID0gZ2V0c3RyKGNsLT5sLnAtPnNvdXJjZSk7CisgICAgYXItPmxpbmVkZWZpbmVkID0gY2wtPmwucC0+bGluZWRlZmluZWQ7CisgICAgYXItPmxhc3RsaW5lZGVmaW5lZCA9IGNsLT5sLnAtPmxhc3RsaW5lZGVmaW5lZDsKKyAgICBhci0+d2hhdCA9IChhci0+bGluZWRlZmluZWQgPT0gMCkgPyAibWFpbiIgOiAiTHVhIjsKKyAgfQorICBsdWFPX2NodW5raWQoYXItPnNob3J0X3NyYywgYXItPnNvdXJjZSwgTFVBX0lEU0laRSk7Cit9CisKKworc3RhdGljIHZvaWQgaW5mb190YWlsY2FsbCAobHVhX0RlYnVnICphcikgeworICBhci0+bmFtZSA9IGFyLT5uYW1ld2hhdCA9ICIiOworICBhci0+d2hhdCA9ICJ0YWlsIjsKKyAgYXItPmxhc3RsaW5lZGVmaW5lZCA9IGFyLT5saW5lZGVmaW5lZCA9IGFyLT5jdXJyZW50bGluZSA9IC0xOworICBhci0+c291cmNlID0gIj0odGFpbCBjYWxsKSI7CisgIGx1YU9fY2h1bmtpZChhci0+c2hvcnRfc3JjLCBhci0+c291cmNlLCBMVUFfSURTSVpFKTsKKyAgYXItPm51cHMgPSAwOworfQorCisKK3N0YXRpYyB2b2lkIGNvbGxlY3R2YWxpZGxpbmVzIChsdWFfU3RhdGUgKkwsIENsb3N1cmUgKmYpIHsKKyAgaWYgKGYgPT0gTlVMTCB8fCBmLT5jLmlzQykgeworICAgIHNldG5pbHZhbHVlKEwtPnRvcCk7CisgIH0KKyAgZWxzZSB7CisgICAgVGFibGUgKnQgPSBsdWFIX25ldyhMLCAwLCAwKTsKKyAgICBpbnQgKmxpbmVpbmZvID0gZi0+bC5wLT5saW5laW5mbzsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaTxmLT5sLnAtPnNpemVsaW5laW5mbzsgaSsrKQorICAgICAgc2V0YnZhbHVlKGx1YUhfc2V0bnVtKEwsIHQsIGxpbmVpbmZvW2ldKSwgMSk7CisgICAgc2V0aHZhbHVlKEwsIEwtPnRvcCwgdCk7IAorICB9CisgIGluY3JfdG9wKEwpOworfQorCisKK3N0YXRpYyBpbnQgYXV4Z2V0aW5mbyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp3aGF0LCBsdWFfRGVidWcgKmFyLAorICAgICAgICAgICAgICAgICAgICBDbG9zdXJlICpmLCBDYWxsSW5mbyAqY2kpIHsKKyAgaW50IHN0YXR1cyA9IDE7CisgIGlmIChmID09IE5VTEwpIHsKKyAgICBpbmZvX3RhaWxjYWxsKGFyKTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIGZvciAoOyAqd2hhdDsgd2hhdCsrKSB7CisgICAgc3dpdGNoICgqd2hhdCkgeworICAgICAgY2FzZSAnUyc6IHsKKyAgICAgICAgZnVuY2luZm8oYXIsIGYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ2wnOiB7CisgICAgICAgIGFyLT5jdXJyZW50bGluZSA9IChjaSkgPyBjdXJyZW50bGluZShMLCBjaSkgOiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICd1JzogeworICAgICAgICBhci0+bnVwcyA9IGYtPmMubnVwdmFsdWVzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ24nOiB7CisgICAgICAgIGFyLT5uYW1ld2hhdCA9IChjaSkgPyBnZXRmdW5jbmFtZShMLCBjaSwgJmFyLT5uYW1lKSA6IE5VTEw7CisgICAgICAgIGlmIChhci0+bmFtZXdoYXQgPT0gTlVMTCkgeworICAgICAgICAgIGFyLT5uYW1ld2hhdCA9ICIiOyAgLyogbm90IGZvdW5kICovCisgICAgICAgICAgYXItPm5hbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnTCc6CisgICAgICBjYXNlICdmJzogIC8qIGhhbmRsZWQgYnkgbHVhX2dldGluZm8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBzdGF0dXMgPSAwOyAgLyogaW52YWxpZCBvcHRpb24gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworCitMVUFfQVBJIGludCBsdWFfZ2V0aW5mbyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp3aGF0LCBsdWFfRGVidWcgKmFyKSB7CisgIGludCBzdGF0dXM7CisgIENsb3N1cmUgKmYgPSBOVUxMOworICBDYWxsSW5mbyAqY2kgPSBOVUxMOworICBsdWFfbG9jayhMKTsKKyAgaWYgKCp3aGF0ID09ICc+JykgeworICAgIFN0a0lkIGZ1bmMgPSBMLT50b3AgLSAxOworICAgIGx1YWlfYXBpY2hlY2soTCwgdHRpc2Z1bmN0aW9uKGZ1bmMpKTsKKyAgICB3aGF0Kys7ICAvKiBza2lwIHRoZSAnPicgKi8KKyAgICBmID0gY2x2YWx1ZShmdW5jKTsKKyAgICBMLT50b3AtLTsgIC8qIHBvcCBmdW5jdGlvbiAqLworICB9CisgIGVsc2UgaWYgKGFyLT5pX2NpICE9IDApIHsgIC8qIG5vIHRhaWwgY2FsbD8gKi8KKyAgICBjaSA9IEwtPmJhc2VfY2kgKyBhci0+aV9jaTsKKyAgICBsdWFfYXNzZXJ0KHR0aXNmdW5jdGlvbihjaS0+ZnVuYykpOworICAgIGYgPSBjbHZhbHVlKGNpLT5mdW5jKTsKKyAgfQorICBzdGF0dXMgPSBhdXhnZXRpbmZvKEwsIHdoYXQsIGFyLCBmLCBjaSk7CisgIGlmIChzdHJjaHIod2hhdCwgJ2YnKSkgeworICAgIGlmIChmID09IE5VTEwpIHNldG5pbHZhbHVlKEwtPnRvcCk7CisgICAgZWxzZSBzZXRjbHZhbHVlKEwsIEwtPnRvcCwgZik7CisgICAgaW5jcl90b3AoTCk7CisgIH0KKyAgaWYgKHN0cmNocih3aGF0LCAnTCcpKQorICAgIGNvbGxlY3R2YWxpZGxpbmVzKEwsIGYpOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBTeW1ib2xpYyBFeGVjdXRpb24gYW5kIGNvZGUgY2hlY2tlcgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZSBjaGVjayh4KQkJaWYgKCEoeCkpIHJldHVybiAwOworCisjZGVmaW5lIGNoZWNranVtcChwdCxwYykJY2hlY2soMCA8PSBwYyAmJiBwYyA8IHB0LT5zaXplY29kZSkKKworI2RlZmluZSBjaGVja3JlZyhwdCxyZWcpCWNoZWNrKChyZWcpIDwgKHB0KS0+bWF4c3RhY2tzaXplKQorCisKKworc3RhdGljIGludCBwcmVjaGVjayAoY29uc3QgUHJvdG8gKnB0KSB7CisgIGNoZWNrKHB0LT5tYXhzdGFja3NpemUgPD0gTUFYU1RBQ0spOworICBjaGVjayhwdC0+bnVtcGFyYW1zKyhwdC0+aXNfdmFyYXJnICYgVkFSQVJHX0hBU0FSRykgPD0gcHQtPm1heHN0YWNrc2l6ZSk7CisgIGNoZWNrKCEocHQtPmlzX3ZhcmFyZyAmIFZBUkFSR19ORUVEU0FSRykgfHwKKyAgICAgICAgICAgICAgKHB0LT5pc192YXJhcmcgJiBWQVJBUkdfSEFTQVJHKSk7CisgIGNoZWNrKHB0LT5zaXpldXB2YWx1ZXMgPD0gcHQtPm51cHMpOworICBjaGVjayhwdC0+c2l6ZWxpbmVpbmZvID09IHB0LT5zaXplY29kZSB8fCBwdC0+c2l6ZWxpbmVpbmZvID09IDApOworICBjaGVjayhwdC0+c2l6ZWNvZGUgPiAwICYmIEdFVF9PUENPREUocHQtPmNvZGVbcHQtPnNpemVjb2RlLTFdKSA9PSBPUF9SRVRVUk4pOworICByZXR1cm4gMTsKK30KKworCisjZGVmaW5lIGNoZWNrb3Blbm9wKHB0LHBjKQlsdWFHX2NoZWNrb3Blbm9wKChwdCktPmNvZGVbKHBjKSsxXSkKKworaW50IGx1YUdfY2hlY2tvcGVub3AgKEluc3RydWN0aW9uIGkpIHsKKyAgc3dpdGNoIChHRVRfT1BDT0RFKGkpKSB7CisgICAgY2FzZSBPUF9DQUxMOgorICAgIGNhc2UgT1BfVEFJTENBTEw6CisgICAgY2FzZSBPUF9SRVRVUk46CisgICAgY2FzZSBPUF9TRVRMSVNUOiB7CisgICAgICBjaGVjayhHRVRBUkdfQihpKSA9PSAwKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBkZWZhdWx0OiByZXR1cm4gMDsgIC8qIGludmFsaWQgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYW4gb3BlbiBjYWxsICovCisgIH0KK30KKworCitzdGF0aWMgaW50IGNoZWNrQXJnTW9kZSAoY29uc3QgUHJvdG8gKnB0LCBpbnQgciwgZW51bSBPcEFyZ01hc2sgbW9kZSkgeworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIE9wQXJnTjogY2hlY2sociA9PSAwKTsgYnJlYWs7CisgICAgY2FzZSBPcEFyZ1U6IGJyZWFrOworICAgIGNhc2UgT3BBcmdSOiBjaGVja3JlZyhwdCwgcik7IGJyZWFrOworICAgIGNhc2UgT3BBcmdLOgorICAgICAgY2hlY2soSVNLKHIpID8gSU5ERVhLKHIpIDwgcHQtPnNpemVrIDogciA8IHB0LT5tYXhzdGFja3NpemUpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIEluc3RydWN0aW9uIHN5bWJleGVjIChjb25zdCBQcm90byAqcHQsIGludCBsYXN0cGMsIGludCByZWcpIHsKKyAgaW50IHBjOworICBpbnQgbGFzdDsgIC8qIHN0b3JlcyBwb3NpdGlvbiBvZiBsYXN0IGluc3RydWN0aW9uIHRoYXQgY2hhbmdlZCBgcmVnJyAqLworICBsYXN0ID0gcHQtPnNpemVjb2RlLTE7ICAvKiBwb2ludHMgdG8gZmluYWwgcmV0dXJuIChhIGBuZXV0cmFsJyBpbnN0cnVjdGlvbikgKi8KKyAgY2hlY2socHJlY2hlY2socHQpKTsKKyAgZm9yIChwYyA9IDA7IHBjIDwgbGFzdHBjOyBwYysrKSB7CisgICAgSW5zdHJ1Y3Rpb24gaSA9IHB0LT5jb2RlW3BjXTsKKyAgICBPcENvZGUgb3AgPSBHRVRfT1BDT0RFKGkpOworICAgIGludCBhID0gR0VUQVJHX0EoaSk7CisgICAgaW50IGIgPSAwOworICAgIGludCBjID0gMDsKKyAgICBjaGVjayhvcCA8IE5VTV9PUENPREVTKTsKKyAgICBjaGVja3JlZyhwdCwgYSk7CisgICAgc3dpdGNoIChnZXRPcE1vZGUob3ApKSB7CisgICAgICBjYXNlIGlBQkM6IHsKKyAgICAgICAgYiA9IEdFVEFSR19CKGkpOworICAgICAgICBjID0gR0VUQVJHX0MoaSk7CisgICAgICAgIGNoZWNrKGNoZWNrQXJnTW9kZShwdCwgYiwgZ2V0Qk1vZGUob3ApKSk7CisgICAgICAgIGNoZWNrKGNoZWNrQXJnTW9kZShwdCwgYywgZ2V0Q01vZGUob3ApKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBpQUJ4OiB7CisgICAgICAgIGIgPSBHRVRBUkdfQngoaSk7CisgICAgICAgIGlmIChnZXRCTW9kZShvcCkgPT0gT3BBcmdLKSBjaGVjayhiIDwgcHQtPnNpemVrKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGlBc0J4OiB7CisgICAgICAgIGIgPSBHRVRBUkdfc0J4KGkpOworICAgICAgICBpZiAoZ2V0Qk1vZGUob3ApID09IE9wQXJnUikgeworICAgICAgICAgIGludCBkZXN0ID0gcGMrMStiOworICAgICAgICAgIGNoZWNrKDAgPD0gZGVzdCAmJiBkZXN0IDwgcHQtPnNpemVjb2RlKTsKKyAgICAgICAgICBpZiAoZGVzdCA+IDApIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBpdCBkb2VzIG5vdCBqdW1wIHRvIGEgc2V0bGlzdCBjb3VudDsgdGhpcworICAgICAgICAgICAgICAgaXMgdHJpY2t5LCBiZWNhdXNlIHRoZSBjb3VudCBmcm9tIGEgcHJldmlvdXMgc2V0bGlzdCBtYXkKKyAgICAgICAgICAgICAgIGhhdmUgdGhlIHNhbWUgdmFsdWUgb2YgYW4gaW52YWxpZCBzZXRsaXN0OyBzbywgd2UgbXVzdAorICAgICAgICAgICAgICAgZ28gYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgZmlyc3Qgb2YgdGhlbSAoaWYgYW55KSAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRlc3Q7IGorKykgeworICAgICAgICAgICAgICBJbnN0cnVjdGlvbiBkID0gcHQtPmNvZGVbZGVzdC0xLWpdOworICAgICAgICAgICAgICBpZiAoIShHRVRfT1BDT0RFKGQpID09IE9QX1NFVExJU1QgJiYgR0VUQVJHX0MoZCkgPT0gMCkpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgJ2onIGlzIGV2ZW4sIHByZXZpb3VzIHZhbHVlIGlzIG5vdCBhIHNldGxpc3QgKGV2ZW4gaWYKKyAgICAgICAgICAgICAgIGl0IGxvb2tzIGxpa2Ugb25lKSAqLworICAgICAgICAgICAgY2hlY2soKGomMSkgPT0gMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAodGVzdEFNb2RlKG9wKSkgeworICAgICAgaWYgKGEgPT0gcmVnKSBsYXN0ID0gcGM7ICAvKiBjaGFuZ2UgcmVnaXN0ZXIgYGEnICovCisgICAgfQorICAgIGlmICh0ZXN0VE1vZGUob3ApKSB7CisgICAgICBjaGVjayhwYysyIDwgcHQtPnNpemVjb2RlKTsgIC8qIGNoZWNrIHNraXAgKi8KKyAgICAgIGNoZWNrKEdFVF9PUENPREUocHQtPmNvZGVbcGMrMV0pID09IE9QX0pNUCk7CisgICAgfQorICAgIHN3aXRjaCAob3ApIHsKKyAgICAgIGNhc2UgT1BfTE9BREJPT0w6IHsKKyAgICAgICAgaWYgKGMgPT0gMSkgeyAgLyogZG9lcyBpdCBqdW1wPyAqLworICAgICAgICAgIGNoZWNrKHBjKzIgPCBwdC0+c2l6ZWNvZGUpOyAgLyogY2hlY2sgaXRzIGp1bXAgKi8KKyAgICAgICAgICBjaGVjayhHRVRfT1BDT0RFKHB0LT5jb2RlW3BjKzFdKSAhPSBPUF9TRVRMSVNUIHx8CisgICAgICAgICAgICAgICAgR0VUQVJHX0MocHQtPmNvZGVbcGMrMV0pICE9IDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBPUF9MT0FETklMOiB7CisgICAgICAgIGlmIChhIDw9IHJlZyAmJiByZWcgPD0gYikKKyAgICAgICAgICBsYXN0ID0gcGM7ICAvKiBzZXQgcmVnaXN0ZXJzIGZyb20gYGEnIHRvIGBiJyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfR0VUVVBWQUw6CisgICAgICBjYXNlIE9QX1NFVFVQVkFMOiB7CisgICAgICAgIGNoZWNrKGIgPCBwdC0+bnVwcyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBPUF9HRVRHTE9CQUw6CisgICAgICBjYXNlIE9QX1NFVEdMT0JBTDogeworICAgICAgICBjaGVjayh0dGlzc3RyaW5nKCZwdC0+a1tiXSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfU0VMRjogeworICAgICAgICBjaGVja3JlZyhwdCwgYSsxKTsKKyAgICAgICAgaWYgKHJlZyA9PSBhKzEpIGxhc3QgPSBwYzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE9QX0NPTkNBVDogeworICAgICAgICBjaGVjayhiIDwgYyk7ICAvKiBhdCBsZWFzdCB0d28gb3BlcmFuZHMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE9QX1RGT1JMT09QOiB7CisgICAgICAgIGNoZWNrKGMgPj0gMSk7ICAvKiBhdCBsZWFzdCBvbmUgcmVzdWx0IChjb250cm9sIHZhcmlhYmxlKSAqLworICAgICAgICBjaGVja3JlZyhwdCwgYSsyK2MpOyAgLyogc3BhY2UgZm9yIHJlc3VsdHMgKi8KKyAgICAgICAgaWYgKHJlZyA+PSBhKzIpIGxhc3QgPSBwYzsgIC8qIGFmZmVjdCBhbGwgcmVncyBhYm92ZSBpdHMgYmFzZSAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfRk9STE9PUDoKKyAgICAgIGNhc2UgT1BfRk9SUFJFUDoKKyAgICAgICAgY2hlY2tyZWcocHQsIGErMyk7CisgICAgICAgIC8qIGdvIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgT1BfSk1QOiB7CisgICAgICAgIGludCBkZXN0ID0gcGMrMStiOworICAgICAgICAvKiBub3QgZnVsbCBjaGVjayBhbmQganVtcCBpcyBmb3J3YXJkIGFuZCBkbyBub3Qgc2tpcCBgbGFzdHBjJz8gKi8KKyAgICAgICAgaWYgKHJlZyAhPSBOT19SRUcgJiYgcGMgPCBkZXN0ICYmIGRlc3QgPD0gbGFzdHBjKQorICAgICAgICAgIHBjICs9IGI7ICAvKiBkbyB0aGUganVtcCAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfQ0FMTDoKKyAgICAgIGNhc2UgT1BfVEFJTENBTEw6IHsKKyAgICAgICAgaWYgKGIgIT0gMCkgeworICAgICAgICAgIGNoZWNrcmVnKHB0LCBhK2ItMSk7CisgICAgICAgIH0KKyAgICAgICAgYy0tOyAgLyogYyA9IG51bS4gcmV0dXJucyAqLworICAgICAgICBpZiAoYyA9PSBMVUFfTVVMVFJFVCkgeworICAgICAgICAgIGNoZWNrKGNoZWNrb3Blbm9wKHB0LCBwYykpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgIT0gMCkKKyAgICAgICAgICBjaGVja3JlZyhwdCwgYStjLTEpOworICAgICAgICBpZiAocmVnID49IGEpIGxhc3QgPSBwYzsgIC8qIGFmZmVjdCBhbGwgcmVnaXN0ZXJzIGFib3ZlIGJhc2UgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE9QX1JFVFVSTjogeworICAgICAgICBiLS07ICAvKiBiID0gbnVtLiByZXR1cm5zICovCisgICAgICAgIGlmIChiID4gMCkgY2hlY2tyZWcocHQsIGErYi0xKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE9QX1NFVExJU1Q6IHsKKyAgICAgICAgaWYgKGIgPiAwKSBjaGVja3JlZyhwdCwgYSArIGIpOworICAgICAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgICAgcGMrKzsKKyAgICAgICAgICBjaGVjayhwYyA8IHB0LT5zaXplY29kZSAtIDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBPUF9DTE9TVVJFOiB7CisgICAgICAgIGludCBudXAsIGo7CisgICAgICAgIGNoZWNrKGIgPCBwdC0+c2l6ZXApOworICAgICAgICBudXAgPSBwdC0+cFtiXS0+bnVwczsKKyAgICAgICAgY2hlY2socGMgKyBudXAgPCBwdC0+c2l6ZWNvZGUpOworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IG51cDsgaisrKSB7CisgICAgICAgICAgT3BDb2RlIG9wMSA9IEdFVF9PUENPREUocHQtPmNvZGVbcGMgKyBqXSk7CisgICAgICAgICAgY2hlY2sob3AxID09IE9QX0dFVFVQVkFMIHx8IG9wMSA9PSBPUF9NT1ZFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVnICE9IE5PX1JFRykgIC8qIHRyYWNpbmc/ICovCisgICAgICAgICAgcGMgKz0gbnVwOyAgLyogZG8gbm90ICdleGVjdXRlJyB0aGVzZSBwc2V1ZG8taW5zdHJ1Y3Rpb25zICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBPUF9WQVJBUkc6IHsKKyAgICAgICAgY2hlY2soKHB0LT5pc192YXJhcmcgJiBWQVJBUkdfSVNWQVJBUkcpICYmCisgICAgICAgICAgICAgIShwdC0+aXNfdmFyYXJnICYgVkFSQVJHX05FRURTQVJHKSk7CisgICAgICAgIGItLTsKKyAgICAgICAgaWYgKGIgPT0gTFVBX01VTFRSRVQpIGNoZWNrKGNoZWNrb3Blbm9wKHB0LCBwYykpOworICAgICAgICBjaGVja3JlZyhwdCwgYStiLTEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcHQtPmNvZGVbbGFzdF07Cit9CisKKyN1bmRlZiBjaGVjaworI3VuZGVmIGNoZWNranVtcAorI3VuZGVmIGNoZWNrcmVnCisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitpbnQgbHVhR19jaGVja2NvZGUgKGNvbnN0IFByb3RvICpwdCkgeworICByZXR1cm4gKHN5bWJleGVjKHB0LCBwdC0+c2l6ZWNvZGUsIE5PX1JFRykgIT0gMCk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmtuYW1lIChQcm90byAqcCwgaW50IGMpIHsKKyAgaWYgKElTSyhjKSAmJiB0dGlzc3RyaW5nKCZwLT5rW0lOREVYSyhjKV0pKQorICAgIHJldHVybiBzdmFsdWUoJnAtPmtbSU5ERVhLKGMpXSk7CisgIGVsc2UKKyAgICByZXR1cm4gIj8iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRvYmpuYW1lIChsdWFfU3RhdGUgKkwsIENhbGxJbmZvICpjaSwgaW50IHN0YWNrcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuYW1lKSB7CisgIGlmIChpc0x1YShjaSkpIHsgIC8qIGEgTHVhIGZ1bmN0aW9uPyAqLworICAgIFByb3RvICpwID0gY2lfZnVuYyhjaSktPmwucDsKKyAgICBpbnQgcGMgPSBjdXJyZW50cGMoTCwgY2kpOworICAgIEluc3RydWN0aW9uIGk7CisgICAgKm5hbWUgPSBsdWFGX2dldGxvY2FsbmFtZShwLCBzdGFja3BvcysxLCBwYyk7CisgICAgaWYgKCpuYW1lKSAgLyogaXMgYSBsb2NhbD8gKi8KKyAgICAgIHJldHVybiAibG9jYWwiOworICAgIGkgPSBzeW1iZXhlYyhwLCBwYywgc3RhY2twb3MpOyAgLyogdHJ5IHN5bWJvbGljIGV4ZWN1dGlvbiAqLworICAgIGx1YV9hc3NlcnQocGMgIT0gLTEpOworICAgIHN3aXRjaCAoR0VUX09QQ09ERShpKSkgeworICAgICAgY2FzZSBPUF9HRVRHTE9CQUw6IHsKKyAgICAgICAgaW50IGcgPSBHRVRBUkdfQngoaSk7ICAvKiBnbG9iYWwgaW5kZXggKi8KKyAgICAgICAgbHVhX2Fzc2VydCh0dGlzc3RyaW5nKCZwLT5rW2ddKSk7CisgICAgICAgICpuYW1lID0gc3ZhbHVlKCZwLT5rW2ddKTsKKyAgICAgICAgcmV0dXJuICJnbG9iYWwiOworICAgICAgfQorICAgICAgY2FzZSBPUF9NT1ZFOiB7CisgICAgICAgIGludCBhID0gR0VUQVJHX0EoaSk7CisgICAgICAgIGludCBiID0gR0VUQVJHX0IoaSk7ICAvKiBtb3ZlIGZyb20gYGInIHRvIGBhJyAqLworICAgICAgICBpZiAoYiA8IGEpCisgICAgICAgICAgcmV0dXJuIGdldG9iam5hbWUoTCwgY2ksIGIsIG5hbWUpOyAgLyogZ2V0IG5hbWUgZm9yIGBiJyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfR0VUVEFCTEU6IHsKKyAgICAgICAgaW50IGsgPSBHRVRBUkdfQyhpKTsgIC8qIGtleSBpbmRleCAqLworICAgICAgICAqbmFtZSA9IGtuYW1lKHAsIGspOworICAgICAgICByZXR1cm4gImZpZWxkIjsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfR0VUVVBWQUw6IHsKKyAgICAgICAgaW50IHUgPSBHRVRBUkdfQihpKTsgIC8qIHVwdmFsdWUgaW5kZXggKi8KKyAgICAgICAgKm5hbWUgPSBwLT51cHZhbHVlcyA/IGdldHN0cihwLT51cHZhbHVlc1t1XSkgOiAiPyI7CisgICAgICAgIHJldHVybiAidXB2YWx1ZSI7CisgICAgICB9CisgICAgICBjYXNlIE9QX1NFTEY6IHsKKyAgICAgICAgaW50IGsgPSBHRVRBUkdfQyhpKTsgIC8qIGtleSBpbmRleCAqLworICAgICAgICAqbmFtZSA9IGtuYW1lKHAsIGspOworICAgICAgICByZXR1cm4gIm1ldGhvZCI7CisgICAgICB9CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7ICAvKiBubyB1c2VmdWwgbmFtZSBmb3VuZCAqLworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRmdW5jbmFtZSAobHVhX1N0YXRlICpMLCBDYWxsSW5mbyAqY2ksIGNvbnN0IGNoYXIgKipuYW1lKSB7CisgIEluc3RydWN0aW9uIGk7CisgIGlmICgoaXNMdWEoY2kpICYmIGNpLT50YWlsY2FsbHMgPiAwKSB8fCAhaXNMdWEoY2kgLSAxKSkKKyAgICByZXR1cm4gTlVMTDsgIC8qIGNhbGxpbmcgZnVuY3Rpb24gaXMgbm90IEx1YSAob3IgaXMgdW5rbm93bikgKi8KKyAgY2ktLTsgIC8qIGNhbGxpbmcgZnVuY3Rpb24gKi8KKyAgaSA9IGNpX2Z1bmMoY2kpLT5sLnAtPmNvZGVbY3VycmVudHBjKEwsIGNpKV07CisgIGlmIChHRVRfT1BDT0RFKGkpID09IE9QX0NBTEwgfHwgR0VUX09QQ09ERShpKSA9PSBPUF9UQUlMQ0FMTCB8fAorICAgICAgR0VUX09QQ09ERShpKSA9PSBPUF9URk9STE9PUCkKKyAgICByZXR1cm4gZ2V0b2JqbmFtZShMLCBjaSwgR0VUQVJHX0EoaSksIG5hbWUpOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7ICAvKiBubyB1c2VmdWwgbmFtZSBjYW4gYmUgZm91bmQgKi8KK30KKworCisvKiBvbmx5IEFOU0kgd2F5IHRvIGNoZWNrIHdoZXRoZXIgYSBwb2ludGVyIHBvaW50cyB0byBhbiBhcnJheSAqLworc3RhdGljIGludCBpc2luc3RhY2sgKENhbGxJbmZvICpjaSwgY29uc3QgVFZhbHVlICpvKSB7CisgIFN0a0lkIHA7CisgIGZvciAocCA9IGNpLT5iYXNlOyBwIDwgY2ktPnRvcDsgcCsrKQorICAgIGlmIChvID09IHApIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworCit2b2lkIGx1YUdfdHlwZWVycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqbywgY29uc3QgY2hhciAqb3ApIHsKKyAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnQgPSBsdWFUX3R5cGVuYW1lc1t0dHlwZShvKV07CisgIGNvbnN0IGNoYXIgKmtpbmQgPSAoaXNpbnN0YWNrKEwtPmNpLCBvKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgIGdldG9iam5hbWUoTCwgTC0+Y2ksIGNhc3RfaW50KG8gLSBMLT5iYXNlKSwgJm5hbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMOworICBpZiAoa2luZCkKKyAgICBsdWFHX3J1bmVycm9yKEwsICJhdHRlbXB0IHRvICVzICVzICIgTFVBX1FTICIgKGEgJXMgdmFsdWUpIiwKKyAgICAgICAgICAgICAgICBvcCwga2luZCwgbmFtZSwgdCk7CisgIGVsc2UKKyAgICBsdWFHX3J1bmVycm9yKEwsICJhdHRlbXB0IHRvICVzIGEgJXMgdmFsdWUiLCBvcCwgdCk7Cit9CisKKwordm9pZCBsdWFHX2NvbmNhdGVycm9yIChsdWFfU3RhdGUgKkwsIFN0a0lkIHAxLCBTdGtJZCBwMikgeworICBpZiAodHRpc3N0cmluZyhwMSkgfHwgdHRpc251bWJlcihwMSkpIHAxID0gcDI7CisgIGx1YV9hc3NlcnQoIXR0aXNzdHJpbmcocDEpICYmICF0dGlzbnVtYmVyKHAxKSk7CisgIGx1YUdfdHlwZWVycm9yKEwsIHAxLCAiY29uY2F0ZW5hdGUiKTsKK30KKworCit2b2lkIGx1YUdfYXJpdGhlcnJvciAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnAxLCBjb25zdCBUVmFsdWUgKnAyKSB7CisgIFRWYWx1ZSB0ZW1wOworICBpZiAobHVhVl90b251bWJlcihwMSwgJnRlbXApID09IE5VTEwpCisgICAgcDIgPSBwMTsgIC8qIGZpcnN0IG9wZXJhbmQgaXMgd3JvbmcgKi8KKyAgbHVhR190eXBlZXJyb3IoTCwgcDIsICJwZXJmb3JtIGFyaXRobWV0aWMgb24iKTsKK30KKworCitpbnQgbHVhR19vcmRlcmVycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqcDEsIGNvbnN0IFRWYWx1ZSAqcDIpIHsKKyAgY29uc3QgY2hhciAqdDEgPSBsdWFUX3R5cGVuYW1lc1t0dHlwZShwMSldOworICBjb25zdCBjaGFyICp0MiA9IGx1YVRfdHlwZW5hbWVzW3R0eXBlKHAyKV07CisgIGlmICh0MVsyXSA9PSB0MlsyXSkKKyAgICBsdWFHX3J1bmVycm9yKEwsICJhdHRlbXB0IHRvIGNvbXBhcmUgdHdvICVzIHZhbHVlcyIsIHQxKTsKKyAgZWxzZQorICAgIGx1YUdfcnVuZXJyb3IoTCwgImF0dGVtcHQgdG8gY29tcGFyZSAlcyB3aXRoICVzIiwgdDEsIHQyKTsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYWRkaW5mbyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICptc2cpIHsKKyAgQ2FsbEluZm8gKmNpID0gTC0+Y2k7CisgIGlmIChpc0x1YShjaSkpIHsgIC8qIGlzIEx1YSBjb2RlPyAqLworICAgIGNoYXIgYnVmZltMVUFfSURTSVpFXTsgIC8qIGFkZCBmaWxlOmxpbmUgaW5mb3JtYXRpb24gKi8KKyAgICBpbnQgbGluZSA9IGN1cnJlbnRsaW5lKEwsIGNpKTsKKyAgICBsdWFPX2NodW5raWQoYnVmZiwgZ2V0c3RyKGdldGx1YXByb3RvKGNpKS0+c291cmNlKSwgTFVBX0lEU0laRSk7CisgICAgbHVhT19wdXNoZnN0cmluZyhMLCAiJXM6JWQ6ICVzIiwgYnVmZiwgbGluZSwgbXNnKTsKKyAgfQorfQorCisKK3ZvaWQgbHVhR19lcnJvcm1zZyAobHVhX1N0YXRlICpMKSB7CisgIGlmIChMLT5lcnJmdW5jICE9IDApIHsgIC8qIGlzIHRoZXJlIGFuIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uPyAqLworICAgIFN0a0lkIGVycmZ1bmMgPSByZXN0b3Jlc3RhY2soTCwgTC0+ZXJyZnVuYyk7CisgICAgaWYgKCF0dGlzZnVuY3Rpb24oZXJyZnVuYykpIGx1YURfdGhyb3coTCwgTFVBX0VSUkVSUik7CisgICAgc2V0b2JqczJzKEwsIEwtPnRvcCwgTC0+dG9wIC0gMSk7ICAvKiBtb3ZlIGFyZ3VtZW50ICovCisgICAgc2V0b2JqczJzKEwsIEwtPnRvcCAtIDEsIGVycmZ1bmMpOyAgLyogcHVzaCBmdW5jdGlvbiAqLworICAgIGluY3JfdG9wKEwpOworICAgIGx1YURfY2FsbChMLCBMLT50b3AgLSAyLCAxKTsgIC8qIGNhbGwgaXQgKi8KKyAgfQorICBsdWFEX3Rocm93KEwsIExVQV9FUlJSVU4pOworfQorCisKK3ZvaWQgbHVhR19ydW5lcnJvciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3A7CisgIHZhX3N0YXJ0KGFyZ3AsIGZtdCk7CisgIGFkZGluZm8oTCwgbHVhT19wdXNodmZzdHJpbmcoTCwgZm10LCBhcmdwKSk7CisgIHZhX2VuZChhcmdwKTsKKyAgbHVhR19lcnJvcm1zZyhMKTsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sZGVidWcuaCBiL2x1YS01LjEuNC9zcmMvbGRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyOGE5NwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbGRlYnVnLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyoqICRJZDogbGRlYnVnLmgsdiAyLjMuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmcm9tIERlYnVnIEludGVyZmFjZSBtb2R1bGUKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGxkZWJ1Z19oCisjZGVmaW5lIGxkZWJ1Z19oCisKKworI2luY2x1ZGUgImxzdGF0ZS5oIgorCisKKyNkZWZpbmUgcGNSZWwocGMsIHApCShjYXN0KGludCwgKHBjKSAtIChwKS0+Y29kZSkgLSAxKQorCisjZGVmaW5lIGdldGxpbmUoZixwYykJKCgoZiktPmxpbmVpbmZvKSA/IChmKS0+bGluZWluZm9bcGNdIDogMCkKKworI2RlZmluZSByZXNldGhvb2tjb3VudChMKQkoTC0+aG9va2NvdW50ID0gTC0+YmFzZWhvb2tjb3VudCkKKworCitMVUFJX0ZVTkMgdm9pZCBsdWFHX3R5cGVlcnJvciAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcG5hbWUpOworTFVBSV9GVU5DIHZvaWQgbHVhR19jb25jYXRlcnJvciAobHVhX1N0YXRlICpMLCBTdGtJZCBwMSwgU3RrSWQgcDIpOworTFVBSV9GVU5DIHZvaWQgbHVhR19hcml0aGVycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFZhbHVlICpwMik7CitMVUFJX0ZVTkMgaW50IGx1YUdfb3JkZXJlcnJvciAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFZhbHVlICpwMik7CitMVUFJX0ZVTkMgdm9pZCBsdWFHX3J1bmVycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUdfZXJyb3Jtc2cgKGx1YV9TdGF0ZSAqTCk7CitMVUFJX0ZVTkMgaW50IGx1YUdfY2hlY2tjb2RlIChjb25zdCBQcm90byAqcHQpOworTFVBSV9GVU5DIGludCBsdWFHX2NoZWNrb3Blbm9wIChJbnN0cnVjdGlvbiBpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xkby5jIGIvbHVhLTUuMS40L3NyYy9sZG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGUwNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sZG8uYwpAQCAtMCwwICsxLDUxOCBAQAorLyoKKyoqICRJZDogbGRvLmMsdiAyLjM4LjEuMyAyMDA4LzAxLzE4IDIyOjMxOjIyIHJvYmVydG8gRXhwICQKKyoqIFN0YWNrIGFuZCBDYWxsIHN0cnVjdHVyZSBvZiBMdWEKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsZG9fYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsZGVidWcuaCIKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsZnVuYy5oIgorI2luY2x1ZGUgImxnYy5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibG9wY29kZXMuaCIKKyNpbmNsdWRlICJscGFyc2VyLmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx0YWJsZS5oIgorI2luY2x1ZGUgImx0bS5oIgorI2luY2x1ZGUgImx1bmR1bXAuaCIKKyNpbmNsdWRlICJsdm0uaCIKKyNpbmNsdWRlICJsemlvLmgiCisKKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBFcnJvci1yZWNvdmVyeSBmdW5jdGlvbnMKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworLyogY2hhaW4gbGlzdCBvZiBsb25nIGp1bXAgYnVmZmVycyAqLworc3RydWN0IGx1YV9sb25nam1wIHsKKyAgc3RydWN0IGx1YV9sb25nam1wICpwcmV2aW91czsKKyAgbHVhaV9qbXBidWYgYjsKKyAgdm9sYXRpbGUgaW50IHN0YXR1czsgIC8qIGVycm9yIGNvZGUgKi8KK307CisKKwordm9pZCBsdWFEX3NldGVycm9yb2JqIChsdWFfU3RhdGUgKkwsIGludCBlcnJjb2RlLCBTdGtJZCBvbGR0b3ApIHsKKyAgc3dpdGNoIChlcnJjb2RlKSB7CisgICAgY2FzZSBMVUFfRVJSTUVNOiB7CisgICAgICBzZXRzdmFsdWUycyhMLCBvbGR0b3AsIGx1YVNfbmV3bGl0ZXJhbChMLCBNRU1FUlJNU0cpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9FUlJFUlI6IHsKKyAgICAgIHNldHN2YWx1ZTJzKEwsIG9sZHRvcCwgbHVhU19uZXdsaXRlcmFsKEwsICJlcnJvciBpbiBlcnJvciBoYW5kbGluZyIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9FUlJTWU5UQVg6CisgICAgY2FzZSBMVUFfRVJSUlVOOiB7CisgICAgICBzZXRvYmpzMnMoTCwgb2xkdG9wLCBMLT50b3AgLSAxKTsgIC8qIGVycm9yIG1lc3NhZ2Ugb24gY3VycmVudCB0b3AgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBMLT50b3AgPSBvbGR0b3AgKyAxOworfQorCisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfc3RhY2tfbGltaXQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfYXNzZXJ0KEwtPnN0YWNrX2xhc3QgLSBMLT5zdGFjayA9PSBMLT5zdGFja3NpemUgLSBFWFRSQV9TVEFDSyAtIDEpOworICBpZiAoTC0+c2l6ZV9jaSA+IExVQUlfTUFYQ0FMTFMpIHsgIC8qIHRoZXJlIHdhcyBhbiBvdmVyZmxvdz8gKi8KKyAgICBpbnQgaW51c2UgPSBjYXN0X2ludChMLT5jaSAtIEwtPmJhc2VfY2kpOworICAgIGlmIChpbnVzZSArIDEgPCBMVUFJX01BWENBTExTKSAgLyogY2FuIGB1bmRvJyBvdmVyZmxvdz8gKi8KKyAgICAgIGx1YURfcmVhbGxvY0NJKEwsIExVQUlfTUFYQ0FMTFMpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgcmVzZXRzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgc3RhdHVzKSB7CisgIEwtPmNpID0gTC0+YmFzZV9jaTsKKyAgTC0+YmFzZSA9IEwtPmNpLT5iYXNlOworICBsdWFGX2Nsb3NlKEwsIEwtPmJhc2UpOyAgLyogY2xvc2UgZXZlbnR1YWwgcGVuZGluZyBjbG9zdXJlcyAqLworICBsdWFEX3NldGVycm9yb2JqKEwsIHN0YXR1cywgTC0+YmFzZSk7CisgIEwtPm5DY2FsbHMgPSBMLT5iYXNlQ2NhbGxzOworICBMLT5hbGxvd2hvb2sgPSAxOworICByZXN0b3JlX3N0YWNrX2xpbWl0KEwpOworICBMLT5lcnJmdW5jID0gMDsKKyAgTC0+ZXJyb3JKbXAgPSBOVUxMOworfQorCisKK3ZvaWQgbHVhRF90aHJvdyAobHVhX1N0YXRlICpMLCBpbnQgZXJyY29kZSkgeworICBpZiAoTC0+ZXJyb3JKbXApIHsKKyAgICBMLT5lcnJvckptcC0+c3RhdHVzID0gZXJyY29kZTsKKyAgICBMVUFJX1RIUk9XKEwsIEwtPmVycm9ySm1wKTsKKyAgfQorICBlbHNlIHsKKyAgICBMLT5zdGF0dXMgPSBjYXN0X2J5dGUoZXJyY29kZSk7CisgICAgaWYgKEcoTCktPnBhbmljKSB7CisgICAgICByZXNldHN0YWNrKEwsIGVycmNvZGUpOworICAgICAgbHVhX3VubG9jayhMKTsKKyAgICAgIEcoTCktPnBhbmljKEwpOworICAgIH0KKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KK30KKworCitpbnQgbHVhRF9yYXdydW5wcm90ZWN0ZWQgKGx1YV9TdGF0ZSAqTCwgUGZ1bmMgZiwgdm9pZCAqdWQpIHsKKyAgc3RydWN0IGx1YV9sb25nam1wIGxqOworICBsai5zdGF0dXMgPSAwOworICBsai5wcmV2aW91cyA9IEwtPmVycm9ySm1wOyAgLyogY2hhaW4gbmV3IGVycm9yIGhhbmRsZXIgKi8KKyAgTC0+ZXJyb3JKbXAgPSAmbGo7CisgIExVQUlfVFJZKEwsICZsaiwKKyAgICAoKmYpKEwsIHVkKTsKKyAgKTsKKyAgTC0+ZXJyb3JKbXAgPSBsai5wcmV2aW91czsgIC8qIHJlc3RvcmUgb2xkIGVycm9yIGhhbmRsZXIgKi8KKyAgcmV0dXJuIGxqLnN0YXR1czsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK3N0YXRpYyB2b2lkIGNvcnJlY3RzdGFjayAobHVhX1N0YXRlICpMLCBUVmFsdWUgKm9sZHN0YWNrKSB7CisgIENhbGxJbmZvICpjaTsKKyAgR0NPYmplY3QgKnVwOworICBMLT50b3AgPSAoTC0+dG9wIC0gb2xkc3RhY2spICsgTC0+c3RhY2s7CisgIGZvciAodXAgPSBMLT5vcGVudXB2YWw7IHVwICE9IE5VTEw7IHVwID0gdXAtPmdjaC5uZXh0KQorICAgIGdjbzJ1dih1cCktPnYgPSAoZ2NvMnV2KHVwKS0+diAtIG9sZHN0YWNrKSArIEwtPnN0YWNrOworICBmb3IgKGNpID0gTC0+YmFzZV9jaTsgY2kgPD0gTC0+Y2k7IGNpKyspIHsKKyAgICBjaS0+dG9wID0gKGNpLT50b3AgLSBvbGRzdGFjaykgKyBMLT5zdGFjazsKKyAgICBjaS0+YmFzZSA9IChjaS0+YmFzZSAtIG9sZHN0YWNrKSArIEwtPnN0YWNrOworICAgIGNpLT5mdW5jID0gKGNpLT5mdW5jIC0gb2xkc3RhY2spICsgTC0+c3RhY2s7CisgIH0KKyAgTC0+YmFzZSA9IChMLT5iYXNlIC0gb2xkc3RhY2spICsgTC0+c3RhY2s7Cit9CisKKwordm9pZCBsdWFEX3JlYWxsb2NzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgbmV3c2l6ZSkgeworICBUVmFsdWUgKm9sZHN0YWNrID0gTC0+c3RhY2s7CisgIGludCByZWFsc2l6ZSA9IG5ld3NpemUgKyAxICsgRVhUUkFfU1RBQ0s7CisgIGx1YV9hc3NlcnQoTC0+c3RhY2tfbGFzdCAtIEwtPnN0YWNrID09IEwtPnN0YWNrc2l6ZSAtIEVYVFJBX1NUQUNLIC0gMSk7CisgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCBMLT5zdGFjaywgTC0+c3RhY2tzaXplLCByZWFsc2l6ZSwgVFZhbHVlKTsKKyAgTC0+c3RhY2tzaXplID0gcmVhbHNpemU7CisgIEwtPnN0YWNrX2xhc3QgPSBMLT5zdGFjaytuZXdzaXplOworICBjb3JyZWN0c3RhY2soTCwgb2xkc3RhY2spOworfQorCisKK3ZvaWQgbHVhRF9yZWFsbG9jQ0kgKGx1YV9TdGF0ZSAqTCwgaW50IG5ld3NpemUpIHsKKyAgQ2FsbEluZm8gKm9sZGNpID0gTC0+YmFzZV9jaTsKKyAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIEwtPmJhc2VfY2ksIEwtPnNpemVfY2ksIG5ld3NpemUsIENhbGxJbmZvKTsKKyAgTC0+c2l6ZV9jaSA9IG5ld3NpemU7CisgIEwtPmNpID0gKEwtPmNpIC0gb2xkY2kpICsgTC0+YmFzZV9jaTsKKyAgTC0+ZW5kX2NpID0gTC0+YmFzZV9jaSArIEwtPnNpemVfY2kgLSAxOworfQorCisKK3ZvaWQgbHVhRF9ncm93c3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IG4pIHsKKyAgaWYgKG4gPD0gTC0+c3RhY2tzaXplKSAgLyogZG91YmxlIHNpemUgaXMgZW5vdWdoPyAqLworICAgIGx1YURfcmVhbGxvY3N0YWNrKEwsIDIqTC0+c3RhY2tzaXplKTsKKyAgZWxzZQorICAgIGx1YURfcmVhbGxvY3N0YWNrKEwsIEwtPnN0YWNrc2l6ZSArIG4pOworfQorCisKK3N0YXRpYyBDYWxsSW5mbyAqZ3Jvd0NJIChsdWFfU3RhdGUgKkwpIHsKKyAgaWYgKEwtPnNpemVfY2kgPiBMVUFJX01BWENBTExTKSAgLyogb3ZlcmZsb3cgd2hpbGUgaGFuZGxpbmcgb3ZlcmZsb3c/ICovCisgICAgbHVhRF90aHJvdyhMLCBMVUFfRVJSRVJSKTsKKyAgZWxzZSB7CisgICAgbHVhRF9yZWFsbG9jQ0koTCwgMipMLT5zaXplX2NpKTsKKyAgICBpZiAoTC0+c2l6ZV9jaSA+IExVQUlfTUFYQ0FMTFMpCisgICAgICBsdWFHX3J1bmVycm9yKEwsICJzdGFjayBvdmVyZmxvdyIpOworICB9CisgIHJldHVybiArK0wtPmNpOworfQorCisKK3ZvaWQgbHVhRF9jYWxsaG9vayAobHVhX1N0YXRlICpMLCBpbnQgZXZlbnQsIGludCBsaW5lKSB7CisgIGx1YV9Ib29rIGhvb2sgPSBMLT5ob29rOworICBpZiAoaG9vayAmJiBMLT5hbGxvd2hvb2spIHsKKyAgICBwdHJkaWZmX3QgdG9wID0gc2F2ZXN0YWNrKEwsIEwtPnRvcCk7CisgICAgcHRyZGlmZl90IGNpX3RvcCA9IHNhdmVzdGFjayhMLCBMLT5jaS0+dG9wKTsKKyAgICBsdWFfRGVidWcgYXI7CisgICAgYXIuZXZlbnQgPSBldmVudDsKKyAgICBhci5jdXJyZW50bGluZSA9IGxpbmU7CisgICAgaWYgKGV2ZW50ID09IExVQV9IT09LVEFJTFJFVCkKKyAgICAgIGFyLmlfY2kgPSAwOyAgLyogdGFpbCBjYWxsOyBubyBkZWJ1ZyBpbmZvcm1hdGlvbiBhYm91dCBpdCAqLworICAgIGVsc2UKKyAgICAgIGFyLmlfY2kgPSBjYXN0X2ludChMLT5jaSAtIEwtPmJhc2VfY2kpOworICAgIGx1YURfY2hlY2tzdGFjayhMLCBMVUFfTUlOU1RBQ0spOyAgLyogZW5zdXJlIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworICAgIEwtPmNpLT50b3AgPSBMLT50b3AgKyBMVUFfTUlOU1RBQ0s7CisgICAgbHVhX2Fzc2VydChMLT5jaS0+dG9wIDw9IEwtPnN0YWNrX2xhc3QpOworICAgIEwtPmFsbG93aG9vayA9IDA7ICAvKiBjYW5ub3QgY2FsbCBob29rcyBpbnNpZGUgYSBob29rICovCisgICAgbHVhX3VubG9jayhMKTsKKyAgICAoKmhvb2spKEwsICZhcik7CisgICAgbHVhX2xvY2soTCk7CisgICAgbHVhX2Fzc2VydCghTC0+YWxsb3dob29rKTsKKyAgICBMLT5hbGxvd2hvb2sgPSAxOworICAgIEwtPmNpLT50b3AgPSByZXN0b3Jlc3RhY2soTCwgY2lfdG9wKTsKKyAgICBMLT50b3AgPSByZXN0b3Jlc3RhY2soTCwgdG9wKTsKKyAgfQorfQorCisKK3N0YXRpYyBTdGtJZCBhZGp1c3RfdmFyYXJncyAobHVhX1N0YXRlICpMLCBQcm90byAqcCwgaW50IGFjdHVhbCkgeworICBpbnQgaTsKKyAgaW50IG5maXhhcmdzID0gcC0+bnVtcGFyYW1zOworICBUYWJsZSAqaHRhYiA9IE5VTEw7CisgIFN0a0lkIGJhc2UsIGZpeGVkOworICBmb3IgKDsgYWN0dWFsIDwgbmZpeGFyZ3M7ICsrYWN0dWFsKQorICAgIHNldG5pbHZhbHVlKEwtPnRvcCsrKTsKKyNpZiBkZWZpbmVkKExVQV9DT01QQVRfVkFSQVJHKQorICBpZiAocC0+aXNfdmFyYXJnICYgVkFSQVJHX05FRURTQVJHKSB7IC8qIGNvbXBhdC4gd2l0aCBvbGQtc3R5bGUgdmFyYXJnPyAqLworICAgIGludCBudmFyID0gYWN0dWFsIC0gbmZpeGFyZ3M7ICAvKiBudW1iZXIgb2YgZXh0cmEgYXJndW1lbnRzICovCisgICAgbHVhX2Fzc2VydChwLT5pc192YXJhcmcgJiBWQVJBUkdfSEFTQVJHKTsKKyAgICBsdWFDX2NoZWNrR0MoTCk7CisgICAgaHRhYiA9IGx1YUhfbmV3KEwsIG52YXIsIDEpOyAgLyogY3JlYXRlIGBhcmcnIHRhYmxlICovCisgICAgZm9yIChpPTA7IGk8bnZhcjsgaSsrKSAgLyogcHV0IGV4dHJhIGFyZ3VtZW50cyBpbnRvIGBhcmcnIHRhYmxlICovCisgICAgICBzZXRvYmoybihMLCBsdWFIX3NldG51bShMLCBodGFiLCBpKzEpLCBMLT50b3AgLSBudmFyICsgaSk7CisgICAgLyogc3RvcmUgY291bnRlciBpbiBmaWVsZCBgbicgKi8KKyAgICBzZXRudmFsdWUobHVhSF9zZXRzdHIoTCwgaHRhYiwgbHVhU19uZXdsaXRlcmFsKEwsICJuIikpLCBjYXN0X251bShudmFyKSk7CisgIH0KKyNlbmRpZgorICAvKiBtb3ZlIGZpeGVkIHBhcmFtZXRlcnMgdG8gZmluYWwgcG9zaXRpb24gKi8KKyAgZml4ZWQgPSBMLT50b3AgLSBhY3R1YWw7ICAvKiBmaXJzdCBmaXhlZCBhcmd1bWVudCAqLworICBiYXNlID0gTC0+dG9wOyAgLyogZmluYWwgcG9zaXRpb24gb2YgZmlyc3QgYXJndW1lbnQgKi8KKyAgZm9yIChpPTA7IGk8bmZpeGFyZ3M7IGkrKykgeworICAgIHNldG9ianMycyhMLCBMLT50b3ArKywgZml4ZWQraSk7CisgICAgc2V0bmlsdmFsdWUoZml4ZWQraSk7CisgIH0KKyAgLyogYWRkIGBhcmcnIHBhcmFtZXRlciAqLworICBpZiAoaHRhYikgeworICAgIHNldGh2YWx1ZShMLCBMLT50b3ArKywgaHRhYik7CisgICAgbHVhX2Fzc2VydChpc3doaXRlKG9iajJnY28oaHRhYikpKTsKKyAgfQorICByZXR1cm4gYmFzZTsKK30KKworCitzdGF0aWMgU3RrSWQgdHJ5ZnVuY1RNIChsdWFfU3RhdGUgKkwsIFN0a0lkIGZ1bmMpIHsKKyAgY29uc3QgVFZhbHVlICp0bSA9IGx1YVRfZ2V0dG1ieW9iaihMLCBmdW5jLCBUTV9DQUxMKTsKKyAgU3RrSWQgcDsKKyAgcHRyZGlmZl90IGZ1bmNyID0gc2F2ZXN0YWNrKEwsIGZ1bmMpOworICBpZiAoIXR0aXNmdW5jdGlvbih0bSkpCisgICAgbHVhR190eXBlZXJyb3IoTCwgZnVuYywgImNhbGwiKTsKKyAgLyogT3BlbiBhIGhvbGUgaW5zaWRlIHRoZSBzdGFjayBhdCBgZnVuYycgKi8KKyAgZm9yIChwID0gTC0+dG9wOyBwID4gZnVuYzsgcC0tKSBzZXRvYmpzMnMoTCwgcCwgcC0xKTsKKyAgaW5jcl90b3AoTCk7CisgIGZ1bmMgPSByZXN0b3Jlc3RhY2soTCwgZnVuY3IpOyAgLyogcHJldmlvdXMgY2FsbCBtYXkgY2hhbmdlIHN0YWNrICovCisgIHNldG9iajJzKEwsIGZ1bmMsIHRtKTsgIC8qIHRhZyBtZXRob2QgaXMgdGhlIG5ldyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgKi8KKyAgcmV0dXJuIGZ1bmM7Cit9CisKKworCisjZGVmaW5lIGluY19jaShMKSBcCisgICgoTC0+Y2kgPT0gTC0+ZW5kX2NpKSA/IGdyb3dDSShMKSA6IFwKKyAgIChjb25kaGFyZHN0YWNrdGVzdHMobHVhRF9yZWFsbG9jQ0koTCwgTC0+c2l6ZV9jaSkpLCArK0wtPmNpKSkKKworCitpbnQgbHVhRF9wcmVjYWxsIChsdWFfU3RhdGUgKkwsIFN0a0lkIGZ1bmMsIGludCBucmVzdWx0cykgeworICBMQ2xvc3VyZSAqY2w7CisgIHB0cmRpZmZfdCBmdW5jcjsKKyAgaWYgKCF0dGlzZnVuY3Rpb24oZnVuYykpIC8qIGBmdW5jJyBpcyBub3QgYSBmdW5jdGlvbj8gKi8KKyAgICBmdW5jID0gdHJ5ZnVuY1RNKEwsIGZ1bmMpOyAgLyogY2hlY2sgdGhlIGBmdW5jdGlvbicgdGFnIG1ldGhvZCAqLworICBmdW5jciA9IHNhdmVzdGFjayhMLCBmdW5jKTsKKyAgY2wgPSAmY2x2YWx1ZShmdW5jKS0+bDsKKyAgTC0+Y2ktPnNhdmVkcGMgPSBMLT5zYXZlZHBjOworICBpZiAoIWNsLT5pc0MpIHsgIC8qIEx1YSBmdW5jdGlvbj8gcHJlcGFyZSBpdHMgY2FsbCAqLworICAgIENhbGxJbmZvICpjaTsKKyAgICBTdGtJZCBzdCwgYmFzZTsKKyAgICBQcm90byAqcCA9IGNsLT5wOworICAgIGx1YURfY2hlY2tzdGFjayhMLCBwLT5tYXhzdGFja3NpemUpOworICAgIGZ1bmMgPSByZXN0b3Jlc3RhY2soTCwgZnVuY3IpOworICAgIGlmICghcC0+aXNfdmFyYXJnKSB7ICAvKiBubyB2YXJhcmdzPyAqLworICAgICAgYmFzZSA9IGZ1bmMgKyAxOworICAgICAgaWYgKEwtPnRvcCA+IGJhc2UgKyBwLT5udW1wYXJhbXMpCisgICAgICAgIEwtPnRvcCA9IGJhc2UgKyBwLT5udW1wYXJhbXM7CisgICAgfQorICAgIGVsc2UgeyAgLyogdmFyYXJnIGZ1bmN0aW9uICovCisgICAgICBpbnQgbmFyZ3MgPSBjYXN0X2ludChMLT50b3AgLSBmdW5jKSAtIDE7CisgICAgICBiYXNlID0gYWRqdXN0X3ZhcmFyZ3MoTCwgcCwgbmFyZ3MpOworICAgICAgZnVuYyA9IHJlc3RvcmVzdGFjayhMLCBmdW5jcik7ICAvKiBwcmV2aW91cyBjYWxsIG1heSBjaGFuZ2UgdGhlIHN0YWNrICovCisgICAgfQorICAgIGNpID0gaW5jX2NpKEwpOyAgLyogbm93IGBlbnRlcicgbmV3IGZ1bmN0aW9uICovCisgICAgY2ktPmZ1bmMgPSBmdW5jOworICAgIEwtPmJhc2UgPSBjaS0+YmFzZSA9IGJhc2U7CisgICAgY2ktPnRvcCA9IEwtPmJhc2UgKyBwLT5tYXhzdGFja3NpemU7CisgICAgbHVhX2Fzc2VydChjaS0+dG9wIDw9IEwtPnN0YWNrX2xhc3QpOworICAgIEwtPnNhdmVkcGMgPSBwLT5jb2RlOyAgLyogc3RhcnRpbmcgcG9pbnQgKi8KKyAgICBjaS0+dGFpbGNhbGxzID0gMDsKKyAgICBjaS0+bnJlc3VsdHMgPSBucmVzdWx0czsKKyAgICBmb3IgKHN0ID0gTC0+dG9wOyBzdCA8IGNpLT50b3A7IHN0KyspCisgICAgICBzZXRuaWx2YWx1ZShzdCk7CisgICAgTC0+dG9wID0gY2ktPnRvcDsKKyAgICBpZiAoTC0+aG9va21hc2sgJiBMVUFfTUFTS0NBTEwpIHsKKyAgICAgIEwtPnNhdmVkcGMrKzsgIC8qIGhvb2tzIGFzc3VtZSAncGMnIGlzIGFscmVhZHkgaW5jcmVtZW50ZWQgKi8KKyAgICAgIGx1YURfY2FsbGhvb2soTCwgTFVBX0hPT0tDQUxMLCAtMSk7CisgICAgICBMLT5zYXZlZHBjLS07ICAvKiBjb3JyZWN0ICdwYycgKi8KKyAgICB9CisgICAgcmV0dXJuIFBDUkxVQTsKKyAgfQorICBlbHNlIHsgIC8qIGlmIGlzIGEgQyBmdW5jdGlvbiwgY2FsbCBpdCAqLworICAgIENhbGxJbmZvICpjaTsKKyAgICBpbnQgbjsKKyAgICBsdWFEX2NoZWNrc3RhY2soTCwgTFVBX01JTlNUQUNLKTsgIC8qIGVuc3VyZSBtaW5pbXVtIHN0YWNrIHNpemUgKi8KKyAgICBjaSA9IGluY19jaShMKTsgIC8qIG5vdyBgZW50ZXInIG5ldyBmdW5jdGlvbiAqLworICAgIGNpLT5mdW5jID0gcmVzdG9yZXN0YWNrKEwsIGZ1bmNyKTsKKyAgICBMLT5iYXNlID0gY2ktPmJhc2UgPSBjaS0+ZnVuYyArIDE7CisgICAgY2ktPnRvcCA9IEwtPnRvcCArIExVQV9NSU5TVEFDSzsKKyAgICBsdWFfYXNzZXJ0KGNpLT50b3AgPD0gTC0+c3RhY2tfbGFzdCk7CisgICAgY2ktPm5yZXN1bHRzID0gbnJlc3VsdHM7CisgICAgaWYgKEwtPmhvb2ttYXNrICYgTFVBX01BU0tDQUxMKQorICAgICAgbHVhRF9jYWxsaG9vayhMLCBMVUFfSE9PS0NBTEwsIC0xKTsKKyAgICBsdWFfdW5sb2NrKEwpOworICAgIG4gPSAoKmN1cnJfZnVuYyhMKS0+Yy5mKShMKTsgIC8qIGRvIHRoZSBhY3R1YWwgY2FsbCAqLworICAgIGx1YV9sb2NrKEwpOworICAgIGlmIChuIDwgMCkgIC8qIHlpZWxkaW5nPyAqLworICAgICAgcmV0dXJuIFBDUllJRUxEOworICAgIGVsc2UgeworICAgICAgbHVhRF9wb3NjYWxsKEwsIEwtPnRvcCAtIG4pOworICAgICAgcmV0dXJuIFBDUkM7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIFN0a0lkIGNhbGxyZXRob29rcyAobHVhX1N0YXRlICpMLCBTdGtJZCBmaXJzdFJlc3VsdCkgeworICBwdHJkaWZmX3QgZnIgPSBzYXZlc3RhY2soTCwgZmlyc3RSZXN1bHQpOyAgLyogbmV4dCBjYWxsIG1heSBjaGFuZ2Ugc3RhY2sgKi8KKyAgbHVhRF9jYWxsaG9vayhMLCBMVUFfSE9PS1JFVCwgLTEpOworICBpZiAoZl9pc0x1YShMLT5jaSkpIHsgIC8qIEx1YSBmdW5jdGlvbj8gKi8KKyAgICB3aGlsZSAoKEwtPmhvb2ttYXNrICYgTFVBX01BU0tSRVQpICYmIEwtPmNpLT50YWlsY2FsbHMtLSkgLyogdGFpbCBjYWxscyAqLworICAgICAgbHVhRF9jYWxsaG9vayhMLCBMVUFfSE9PS1RBSUxSRVQsIC0xKTsKKyAgfQorICByZXR1cm4gcmVzdG9yZXN0YWNrKEwsIGZyKTsKK30KKworCitpbnQgbHVhRF9wb3NjYWxsIChsdWFfU3RhdGUgKkwsIFN0a0lkIGZpcnN0UmVzdWx0KSB7CisgIFN0a0lkIHJlczsKKyAgaW50IHdhbnRlZCwgaTsKKyAgQ2FsbEluZm8gKmNpOworICBpZiAoTC0+aG9va21hc2sgJiBMVUFfTUFTS1JFVCkKKyAgICBmaXJzdFJlc3VsdCA9IGNhbGxyZXRob29rcyhMLCBmaXJzdFJlc3VsdCk7CisgIGNpID0gTC0+Y2ktLTsKKyAgcmVzID0gY2ktPmZ1bmM7ICAvKiByZXMgPT0gZmluYWwgcG9zaXRpb24gb2YgMXN0IHJlc3VsdCAqLworICB3YW50ZWQgPSBjaS0+bnJlc3VsdHM7CisgIEwtPmJhc2UgPSAoY2kgLSAxKS0+YmFzZTsgIC8qIHJlc3RvcmUgYmFzZSAqLworICBMLT5zYXZlZHBjID0gKGNpIC0gMSktPnNhdmVkcGM7ICAvKiByZXN0b3JlIHNhdmVkcGMgKi8KKyAgLyogbW92ZSByZXN1bHRzIHRvIGNvcnJlY3QgcGxhY2UgKi8KKyAgZm9yIChpID0gd2FudGVkOyBpICE9IDAgJiYgZmlyc3RSZXN1bHQgPCBMLT50b3A7IGktLSkKKyAgICBzZXRvYmpzMnMoTCwgcmVzKyssIGZpcnN0UmVzdWx0KyspOworICB3aGlsZSAoaS0tID4gMCkKKyAgICBzZXRuaWx2YWx1ZShyZXMrKyk7CisgIEwtPnRvcCA9IHJlczsKKyAgcmV0dXJuICh3YW50ZWQgLSBMVUFfTVVMVFJFVCk7ICAvKiAwIGlmZiB3YW50ZWQgPT0gTFVBX01VTFRSRVQgKi8KK30KKworCisvKgorKiogQ2FsbCBhIGZ1bmN0aW9uIChDIG9yIEx1YSkuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgaXMgYXQgKmZ1bmMuCisqKiBUaGUgYXJndW1lbnRzIGFyZSBvbiB0aGUgc3RhY2ssIHJpZ2h0IGFmdGVyIHRoZSBmdW5jdGlvbi4KKyoqIFdoZW4gcmV0dXJucywgYWxsIHRoZSByZXN1bHRzIGFyZSBvbiB0aGUgc3RhY2ssIHN0YXJ0aW5nIGF0IHRoZSBvcmlnaW5hbAorKiogZnVuY3Rpb24gcG9zaXRpb24uCisqLyAKK3ZvaWQgbHVhRF9jYWxsIChsdWFfU3RhdGUgKkwsIFN0a0lkIGZ1bmMsIGludCBuUmVzdWx0cykgeworICBpZiAoKytMLT5uQ2NhbGxzID49IExVQUlfTUFYQ0NBTExTKSB7CisgICAgaWYgKEwtPm5DY2FsbHMgPT0gTFVBSV9NQVhDQ0FMTFMpCisgICAgICBsdWFHX3J1bmVycm9yKEwsICJDIHN0YWNrIG92ZXJmbG93Iik7CisgICAgZWxzZSBpZiAoTC0+bkNjYWxscyA+PSAoTFVBSV9NQVhDQ0FMTFMgKyAoTFVBSV9NQVhDQ0FMTFM+PjMpKSkKKyAgICAgIGx1YURfdGhyb3coTCwgTFVBX0VSUkVSUik7ICAvKiBlcnJvciB3aGlsZSBoYW5kaW5nIHN0YWNrIGVycm9yICovCisgIH0KKyAgaWYgKGx1YURfcHJlY2FsbChMLCBmdW5jLCBuUmVzdWx0cykgPT0gUENSTFVBKSAgLyogaXMgYSBMdWEgZnVuY3Rpb24/ICovCisgICAgbHVhVl9leGVjdXRlKEwsIDEpOyAgLyogY2FsbCBpdCAqLworICBMLT5uQ2NhbGxzLS07CisgIGx1YUNfY2hlY2tHQyhMKTsKK30KKworCitzdGF0aWMgdm9pZCByZXN1bWUgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQpIHsKKyAgU3RrSWQgZmlyc3RBcmcgPSBjYXN0KFN0a0lkLCB1ZCk7CisgIENhbGxJbmZvICpjaSA9IEwtPmNpOworICBpZiAoTC0+c3RhdHVzID09IDApIHsgIC8qIHN0YXJ0IGNvcm91dGluZT8gKi8KKyAgICBsdWFfYXNzZXJ0KGNpID09IEwtPmJhc2VfY2kgJiYgZmlyc3RBcmcgPiBMLT5iYXNlKTsKKyAgICBpZiAobHVhRF9wcmVjYWxsKEwsIGZpcnN0QXJnIC0gMSwgTFVBX01VTFRSRVQpICE9IFBDUkxVQSkKKyAgICAgIHJldHVybjsKKyAgfQorICBlbHNlIHsgIC8qIHJlc3VtaW5nIGZyb20gcHJldmlvdXMgeWllbGQgKi8KKyAgICBsdWFfYXNzZXJ0KEwtPnN0YXR1cyA9PSBMVUFfWUlFTEQpOworICAgIEwtPnN0YXR1cyA9IDA7CisgICAgaWYgKCFmX2lzTHVhKGNpKSkgeyAgLyogYGNvbW1vbicgeWllbGQ/ICovCisgICAgICAvKiBmaW5pc2ggaW50ZXJydXB0ZWQgZXhlY3V0aW9uIG9mIGBPUF9DQUxMJyAqLworICAgICAgbHVhX2Fzc2VydChHRVRfT1BDT0RFKCooKGNpLTEpLT5zYXZlZHBjIC0gMSkpID09IE9QX0NBTEwgfHwKKyAgICAgICAgICAgICAgICAgR0VUX09QQ09ERSgqKChjaS0xKS0+c2F2ZWRwYyAtIDEpKSA9PSBPUF9UQUlMQ0FMTCk7CisgICAgICBpZiAobHVhRF9wb3NjYWxsKEwsIGZpcnN0QXJnKSkgIC8qIGNvbXBsZXRlIGl0Li4uICovCisgICAgICAgIEwtPnRvcCA9IEwtPmNpLT50b3A7ICAvKiBhbmQgY29ycmVjdCB0b3AgaWYgbm90IG11bHRpcGxlIHJlc3VsdHMgKi8KKyAgICB9CisgICAgZWxzZSAgLyogeWllbGRlZCBpbnNpZGUgYSBob29rOiBqdXN0IGNvbnRpbnVlIGl0cyBleGVjdXRpb24gKi8KKyAgICAgIEwtPmJhc2UgPSBMLT5jaS0+YmFzZTsKKyAgfQorICBsdWFWX2V4ZWN1dGUoTCwgY2FzdF9pbnQoTC0+Y2kgLSBMLT5iYXNlX2NpKSk7Cit9CisKKworc3RhdGljIGludCByZXN1bWVfZXJyb3IgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbXNnKSB7CisgIEwtPnRvcCA9IEwtPmNpLT5iYXNlOworICBzZXRzdmFsdWUycyhMLCBMLT50b3AsIGx1YVNfbmV3KEwsIG1zZykpOworICBpbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIExVQV9FUlJSVU47Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX3Jlc3VtZSAobHVhX1N0YXRlICpMLCBpbnQgbmFyZ3MpIHsKKyAgaW50IHN0YXR1czsKKyAgbHVhX2xvY2soTCk7CisgIGlmIChMLT5zdGF0dXMgIT0gTFVBX1lJRUxEICYmIChMLT5zdGF0dXMgIT0gMCB8fCBMLT5jaSAhPSBMLT5iYXNlX2NpKSkKKyAgICAgIHJldHVybiByZXN1bWVfZXJyb3IoTCwgImNhbm5vdCByZXN1bWUgbm9uLXN1c3BlbmRlZCBjb3JvdXRpbmUiKTsKKyAgaWYgKEwtPm5DY2FsbHMgPj0gTFVBSV9NQVhDQ0FMTFMpCisgICAgcmV0dXJuIHJlc3VtZV9lcnJvcihMLCAiQyBzdGFjayBvdmVyZmxvdyIpOworICBsdWFpX3VzZXJzdGF0ZXJlc3VtZShMLCBuYXJncyk7CisgIGx1YV9hc3NlcnQoTC0+ZXJyZnVuYyA9PSAwKTsKKyAgTC0+YmFzZUNjYWxscyA9ICsrTC0+bkNjYWxsczsKKyAgc3RhdHVzID0gbHVhRF9yYXdydW5wcm90ZWN0ZWQoTCwgcmVzdW1lLCBMLT50b3AgLSBuYXJncyk7CisgIGlmIChzdGF0dXMgIT0gMCkgeyAgLyogZXJyb3I/ICovCisgICAgTC0+c3RhdHVzID0gY2FzdF9ieXRlKHN0YXR1cyk7ICAvKiBtYXJrIHRocmVhZCBhcyBgZGVhZCcgKi8KKyAgICBsdWFEX3NldGVycm9yb2JqKEwsIHN0YXR1cywgTC0+dG9wKTsKKyAgICBMLT5jaS0+dG9wID0gTC0+dG9wOworICB9CisgIGVsc2UgeworICAgIGx1YV9hc3NlcnQoTC0+bkNjYWxscyA9PSBMLT5iYXNlQ2NhbGxzKTsKKyAgICBzdGF0dXMgPSBMLT5zdGF0dXM7CisgIH0KKyAgLS1MLT5uQ2NhbGxzOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gc3RhdHVzOworfQorCisKK0xVQV9BUEkgaW50IGx1YV95aWVsZCAobHVhX1N0YXRlICpMLCBpbnQgbnJlc3VsdHMpIHsKKyAgbHVhaV91c2Vyc3RhdGV5aWVsZChMLCBucmVzdWx0cyk7CisgIGx1YV9sb2NrKEwpOworICBpZiAoTC0+bkNjYWxscyA+IEwtPmJhc2VDY2FsbHMpCisgICAgbHVhR19ydW5lcnJvcihMLCAiYXR0ZW1wdCB0byB5aWVsZCBhY3Jvc3MgbWV0YW1ldGhvZC9DLWNhbGwgYm91bmRhcnkiKTsKKyAgTC0+YmFzZSA9IEwtPnRvcCAtIG5yZXN1bHRzOyAgLyogcHJvdGVjdCBzdGFjayBzbG90cyBiZWxvdyAqLworICBMLT5zdGF0dXMgPSBMVUFfWUlFTEQ7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiAtMTsKK30KKworCitpbnQgbHVhRF9wY2FsbCAobHVhX1N0YXRlICpMLCBQZnVuYyBmdW5jLCB2b2lkICp1LAorICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBvbGRfdG9wLCBwdHJkaWZmX3QgZWYpIHsKKyAgaW50IHN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgb2xkbkNjYWxscyA9IEwtPm5DY2FsbHM7CisgIHB0cmRpZmZfdCBvbGRfY2kgPSBzYXZlY2koTCwgTC0+Y2kpOworICBsdV9ieXRlIG9sZF9hbGxvd2hvb2tzID0gTC0+YWxsb3dob29rOworICBwdHJkaWZmX3Qgb2xkX2VycmZ1bmMgPSBMLT5lcnJmdW5jOworICBMLT5lcnJmdW5jID0gZWY7CisgIHN0YXR1cyA9IGx1YURfcmF3cnVucHJvdGVjdGVkKEwsIGZ1bmMsIHUpOworICBpZiAoc3RhdHVzICE9IDApIHsgIC8qIGFuIGVycm9yIG9jY3VycmVkPyAqLworICAgIFN0a0lkIG9sZHRvcCA9IHJlc3RvcmVzdGFjayhMLCBvbGRfdG9wKTsKKyAgICBsdWFGX2Nsb3NlKEwsIG9sZHRvcCk7ICAvKiBjbG9zZSBldmVudHVhbCBwZW5kaW5nIGNsb3N1cmVzICovCisgICAgbHVhRF9zZXRlcnJvcm9iaihMLCBzdGF0dXMsIG9sZHRvcCk7CisgICAgTC0+bkNjYWxscyA9IG9sZG5DY2FsbHM7CisgICAgTC0+Y2kgPSByZXN0b3JlY2koTCwgb2xkX2NpKTsKKyAgICBMLT5iYXNlID0gTC0+Y2ktPmJhc2U7CisgICAgTC0+c2F2ZWRwYyA9IEwtPmNpLT5zYXZlZHBjOworICAgIEwtPmFsbG93aG9vayA9IG9sZF9hbGxvd2hvb2tzOworICAgIHJlc3RvcmVfc3RhY2tfbGltaXQoTCk7CisgIH0KKyAgTC0+ZXJyZnVuYyA9IG9sZF9lcnJmdW5jOworICByZXR1cm4gc3RhdHVzOworfQorCisKKworLyoKKyoqIEV4ZWN1dGUgYSBwcm90ZWN0ZWQgcGFyc2VyLgorKi8KK3N0cnVjdCBTUGFyc2VyIHsgIC8qIGRhdGEgdG8gYGZfcGFyc2VyJyAqLworICBaSU8gKno7CisgIE1idWZmZXIgYnVmZjsgIC8qIGJ1ZmZlciB0byBiZSB1c2VkIGJ5IHRoZSBzY2FubmVyICovCisgIGNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgdm9pZCBmX3BhcnNlciAobHVhX1N0YXRlICpMLCB2b2lkICp1ZCkgeworICBpbnQgaTsKKyAgUHJvdG8gKnRmOworICBDbG9zdXJlICpjbDsKKyAgc3RydWN0IFNQYXJzZXIgKnAgPSBjYXN0KHN0cnVjdCBTUGFyc2VyICosIHVkKTsKKyAgaW50IGMgPSBsdWFaX2xvb2thaGVhZChwLT56KTsKKyAgbHVhQ19jaGVja0dDKEwpOworICB0ZiA9ICgoYyA9PSBMVUFfU0lHTkFUVVJFWzBdKSA/IGx1YVVfdW5kdW1wIDogbHVhWV9wYXJzZXIpKEwsIHAtPnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPmJ1ZmYsIHAtPm5hbWUpOworICBjbCA9IGx1YUZfbmV3TGNsb3N1cmUoTCwgdGYtPm51cHMsIGh2YWx1ZShndChMKSkpOworICBjbC0+bC5wID0gdGY7CisgIGZvciAoaSA9IDA7IGkgPCB0Zi0+bnVwczsgaSsrKSAgLyogaW5pdGlhbGl6ZSBldmVudHVhbCB1cHZhbHVlcyAqLworICAgIGNsLT5sLnVwdmFsc1tpXSA9IGx1YUZfbmV3dXB2YWwoTCk7CisgIHNldGNsdmFsdWUoTCwgTC0+dG9wLCBjbCk7CisgIGluY3JfdG9wKEwpOworfQorCisKK2ludCBsdWFEX3Byb3RlY3RlZHBhcnNlciAobHVhX1N0YXRlICpMLCBaSU8gKnosIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgc3RydWN0IFNQYXJzZXIgcDsKKyAgaW50IHN0YXR1czsKKyAgcC56ID0gejsgcC5uYW1lID0gbmFtZTsKKyAgbHVhWl9pbml0YnVmZmVyKEwsICZwLmJ1ZmYpOworICBzdGF0dXMgPSBsdWFEX3BjYWxsKEwsIGZfcGFyc2VyLCAmcCwgc2F2ZXN0YWNrKEwsIEwtPnRvcCksIEwtPmVycmZ1bmMpOworICBsdWFaX2ZyZWVidWZmZXIoTCwgJnAuYnVmZik7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sZG8uaCBiL2x1YS01LjEuNC9zcmMvbGRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZGRhYwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbGRvLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyoqICRJZDogbGRvLmgsdiAyLjcuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogU3RhY2sgYW5kIENhbGwgc3RydWN0dXJlIG9mIEx1YQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbGRvX2gKKyNkZWZpbmUgbGRvX2gKKworCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworCisjZGVmaW5lIGx1YURfY2hlY2tzdGFjayhMLG4pCVwKKyAgaWYgKChjaGFyICopTC0+c3RhY2tfbGFzdCAtIChjaGFyICopTC0+dG9wIDw9IChuKSooaW50KXNpemVvZihUVmFsdWUpKSBcCisgICAgbHVhRF9ncm93c3RhY2soTCwgbik7IFwKKyAgZWxzZSBjb25kaGFyZHN0YWNrdGVzdHMobHVhRF9yZWFsbG9jc3RhY2soTCwgTC0+c3RhY2tzaXplIC0gRVhUUkFfU1RBQ0sgLSAxKSk7CisKKworI2RlZmluZSBpbmNyX3RvcChMKSB7bHVhRF9jaGVja3N0YWNrKEwsMSk7IEwtPnRvcCsrO30KKworI2RlZmluZSBzYXZlc3RhY2soTCxwKQkJKChjaGFyICopKHApIC0gKGNoYXIgKilMLT5zdGFjaykKKyNkZWZpbmUgcmVzdG9yZXN0YWNrKEwsbikJKChUVmFsdWUgKikoKGNoYXIgKilMLT5zdGFjayArIChuKSkpCisKKyNkZWZpbmUgc2F2ZWNpKEwscCkJCSgoY2hhciAqKShwKSAtIChjaGFyICopTC0+YmFzZV9jaSkKKyNkZWZpbmUgcmVzdG9yZWNpKEwsbikJCSgoQ2FsbEluZm8gKikoKGNoYXIgKilMLT5iYXNlX2NpICsgKG4pKSkKKworCisvKiByZXN1bHRzIGZyb20gbHVhRF9wcmVjYWxsICovCisjZGVmaW5lIFBDUkxVQQkJMAkvKiBpbml0aWF0ZWQgYSBjYWxsIHRvIGEgTHVhIGZ1bmN0aW9uICovCisjZGVmaW5lIFBDUkMJCTEJLyogZGlkIGEgY2FsbCB0byBhIEMgZnVuY3Rpb24gKi8KKyNkZWZpbmUgUENSWUlFTEQJMgkvKiBDIGZ1bnRpb24geWllbGRlZCAqLworCisKKy8qIHR5cGUgb2YgcHJvdGVjdGVkIGZ1bmN0aW9ucywgdG8gYmUgcmFuIGJ5IGBydW5wcm90ZWN0ZWQnICovCit0eXBlZGVmIHZvaWQgKCpQZnVuYykgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQpOworCitMVUFJX0ZVTkMgaW50IGx1YURfcHJvdGVjdGVkcGFyc2VyIChsdWFfU3RhdGUgKkwsIFpJTyAqeiwgY29uc3QgY2hhciAqbmFtZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFEX2NhbGxob29rIChsdWFfU3RhdGUgKkwsIGludCBldmVudCwgaW50IGxpbmUpOworTFVBSV9GVU5DIGludCBsdWFEX3ByZWNhbGwgKGx1YV9TdGF0ZSAqTCwgU3RrSWQgZnVuYywgaW50IG5yZXN1bHRzKTsKK0xVQUlfRlVOQyB2b2lkIGx1YURfY2FsbCAobHVhX1N0YXRlICpMLCBTdGtJZCBmdW5jLCBpbnQgblJlc3VsdHMpOworTFVBSV9GVU5DIGludCBsdWFEX3BjYWxsIChsdWFfU3RhdGUgKkwsIFBmdW5jIGZ1bmMsIHZvaWQgKnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG9sZHRvcCwgcHRyZGlmZl90IGVmKTsKK0xVQUlfRlVOQyBpbnQgbHVhRF9wb3NjYWxsIChsdWFfU3RhdGUgKkwsIFN0a0lkIGZpcnN0UmVzdWx0KTsKK0xVQUlfRlVOQyB2b2lkIGx1YURfcmVhbGxvY0NJIChsdWFfU3RhdGUgKkwsIGludCBuZXdzaXplKTsKK0xVQUlfRlVOQyB2b2lkIGx1YURfcmVhbGxvY3N0YWNrIChsdWFfU3RhdGUgKkwsIGludCBuZXdzaXplKTsKK0xVQUlfRlVOQyB2b2lkIGx1YURfZ3Jvd3N0YWNrIChsdWFfU3RhdGUgKkwsIGludCBuKTsKKworTFVBSV9GVU5DIHZvaWQgbHVhRF90aHJvdyAobHVhX1N0YXRlICpMLCBpbnQgZXJyY29kZSk7CitMVUFJX0ZVTkMgaW50IGx1YURfcmF3cnVucHJvdGVjdGVkIChsdWFfU3RhdGUgKkwsIFBmdW5jIGYsIHZvaWQgKnVkKTsKKworTFVBSV9GVU5DIHZvaWQgbHVhRF9zZXRlcnJvcm9iaiAobHVhX1N0YXRlICpMLCBpbnQgZXJyY29kZSwgU3RrSWQgb2xkdG9wKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbGR1bXAuYyBiL2x1YS01LjEuNC9zcmMvbGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQzZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sZHVtcC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorKiogJElkOiBsZHVtcC5jLHYgMi44LjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIHNhdmUgcHJlY29tcGlsZWQgTHVhIGNodW5rcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBsZHVtcF9jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsdW5kdW1wLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyBsdWFfU3RhdGUqIEw7CisgbHVhX1dyaXRlciB3cml0ZXI7Cisgdm9pZCogZGF0YTsKKyBpbnQgc3RyaXA7CisgaW50IHN0YXR1czsKK30gRHVtcFN0YXRlOworCisjZGVmaW5lIER1bXBNZW0oYixuLHNpemUsRCkJRHVtcEJsb2NrKGIsKG4pKihzaXplKSxEKQorI2RlZmluZSBEdW1wVmFyKHgsRCkJIAlEdW1wTWVtKCZ4LDEsc2l6ZW9mKHgpLEQpCisKK3N0YXRpYyB2b2lkIER1bXBCbG9jayhjb25zdCB2b2lkKiBiLCBzaXplX3Qgc2l6ZSwgRHVtcFN0YXRlKiBEKQoreworIGlmIChELT5zdGF0dXM9PTApCisgeworICBsdWFfdW5sb2NrKEQtPkwpOworICBELT5zdGF0dXM9KCpELT53cml0ZXIpKEQtPkwsYixzaXplLEQtPmRhdGEpOworICBsdWFfbG9jayhELT5MKTsKKyB9Cit9CisKK3N0YXRpYyB2b2lkIER1bXBDaGFyKGludCB5LCBEdW1wU3RhdGUqIEQpCit7CisgY2hhciB4PShjaGFyKXk7CisgRHVtcFZhcih4LEQpOworfQorCitzdGF0aWMgdm9pZCBEdW1wSW50KGludCB4LCBEdW1wU3RhdGUqIEQpCit7CisgRHVtcFZhcih4LEQpOworfQorCitzdGF0aWMgdm9pZCBEdW1wTnVtYmVyKGx1YV9OdW1iZXIgeCwgRHVtcFN0YXRlKiBEKQoreworIER1bXBWYXIoeCxEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcFZlY3Rvcihjb25zdCB2b2lkKiBiLCBpbnQgbiwgc2l6ZV90IHNpemUsIER1bXBTdGF0ZSogRCkKK3sKKyBEdW1wSW50KG4sRCk7CisgRHVtcE1lbShiLG4sc2l6ZSxEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcFN0cmluZyhjb25zdCBUU3RyaW5nKiBzLCBEdW1wU3RhdGUqIEQpCit7CisgaWYgKHM9PU5VTEwgfHwgZ2V0c3RyKHMpPT1OVUxMKQorIHsKKyAgc2l6ZV90IHNpemU9MDsKKyAgRHVtcFZhcihzaXplLEQpOworIH0KKyBlbHNlCisgeworICBzaXplX3Qgc2l6ZT1zLT50c3YubGVuKzE7CQkvKiBpbmNsdWRlIHRyYWlsaW5nICdcMCcgKi8KKyAgRHVtcFZhcihzaXplLEQpOworICBEdW1wQmxvY2soZ2V0c3RyKHMpLHNpemUsRCk7CisgfQorfQorCisjZGVmaW5lIER1bXBDb2RlKGYsRCkJIER1bXBWZWN0b3IoZi0+Y29kZSxmLT5zaXplY29kZSxzaXplb2YoSW5zdHJ1Y3Rpb24pLEQpCisKK3N0YXRpYyB2b2lkIER1bXBGdW5jdGlvbihjb25zdCBQcm90byogZiwgY29uc3QgVFN0cmluZyogcCwgRHVtcFN0YXRlKiBEKTsKKworc3RhdGljIHZvaWQgRHVtcENvbnN0YW50cyhjb25zdCBQcm90byogZiwgRHVtcFN0YXRlKiBEKQoreworIGludCBpLG49Zi0+c2l6ZWs7CisgRHVtcEludChuLEQpOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIGNvbnN0IFRWYWx1ZSogbz0mZi0+a1tpXTsKKyAgRHVtcENoYXIodHR5cGUobyksRCk7CisgIHN3aXRjaCAodHR5cGUobykpCisgIHsKKyAgIGNhc2UgTFVBX1ROSUw6CisJYnJlYWs7CisgICBjYXNlIExVQV9UQk9PTEVBTjoKKwlEdW1wQ2hhcihidmFsdWUobyksRCk7CisJYnJlYWs7CisgICBjYXNlIExVQV9UTlVNQkVSOgorCUR1bXBOdW1iZXIobnZhbHVlKG8pLEQpOworCWJyZWFrOworICAgY2FzZSBMVUFfVFNUUklORzoKKwlEdW1wU3RyaW5nKHJhd3RzdmFsdWUobyksRCk7CisJYnJlYWs7CisgICBkZWZhdWx0OgorCWx1YV9hc3NlcnQoMCk7CQkJLyogY2Fubm90IGhhcHBlbiAqLworCWJyZWFrOworICB9CisgfQorIG49Zi0+c2l6ZXA7CisgRHVtcEludChuLEQpOworIGZvciAoaT0wOyBpPG47IGkrKykgRHVtcEZ1bmN0aW9uKGYtPnBbaV0sZi0+c291cmNlLEQpOworfQorCitzdGF0aWMgdm9pZCBEdW1wRGVidWcoY29uc3QgUHJvdG8qIGYsIER1bXBTdGF0ZSogRCkKK3sKKyBpbnQgaSxuOworIG49IChELT5zdHJpcCkgPyAwIDogZi0+c2l6ZWxpbmVpbmZvOworIER1bXBWZWN0b3IoZi0+bGluZWluZm8sbixzaXplb2YoaW50KSxEKTsKKyBuPSAoRC0+c3RyaXApID8gMCA6IGYtPnNpemVsb2N2YXJzOworIER1bXBJbnQobixEKTsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBEdW1wU3RyaW5nKGYtPmxvY3ZhcnNbaV0udmFybmFtZSxEKTsKKyAgRHVtcEludChmLT5sb2N2YXJzW2ldLnN0YXJ0cGMsRCk7CisgIER1bXBJbnQoZi0+bG9jdmFyc1tpXS5lbmRwYyxEKTsKKyB9Cisgbj0gKEQtPnN0cmlwKSA/IDAgOiBmLT5zaXpldXB2YWx1ZXM7CisgRHVtcEludChuLEQpOworIGZvciAoaT0wOyBpPG47IGkrKykgRHVtcFN0cmluZyhmLT51cHZhbHVlc1tpXSxEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcEZ1bmN0aW9uKGNvbnN0IFByb3RvKiBmLCBjb25zdCBUU3RyaW5nKiBwLCBEdW1wU3RhdGUqIEQpCit7CisgRHVtcFN0cmluZygoZi0+c291cmNlPT1wIHx8IEQtPnN0cmlwKSA/IE5VTEwgOiBmLT5zb3VyY2UsRCk7CisgRHVtcEludChmLT5saW5lZGVmaW5lZCxEKTsKKyBEdW1wSW50KGYtPmxhc3RsaW5lZGVmaW5lZCxEKTsKKyBEdW1wQ2hhcihmLT5udXBzLEQpOworIER1bXBDaGFyKGYtPm51bXBhcmFtcyxEKTsKKyBEdW1wQ2hhcihmLT5pc192YXJhcmcsRCk7CisgRHVtcENoYXIoZi0+bWF4c3RhY2tzaXplLEQpOworIER1bXBDb2RlKGYsRCk7CisgRHVtcENvbnN0YW50cyhmLEQpOworIER1bXBEZWJ1ZyhmLEQpOworfQorCitzdGF0aWMgdm9pZCBEdW1wSGVhZGVyKER1bXBTdGF0ZSogRCkKK3sKKyBjaGFyIGhbTFVBQ19IRUFERVJTSVpFXTsKKyBsdWFVX2hlYWRlcihoKTsKKyBEdW1wQmxvY2soaCxMVUFDX0hFQURFUlNJWkUsRCk7Cit9CisKKy8qCisqKiBkdW1wIEx1YSBmdW5jdGlvbiBhcyBwcmVjb21waWxlZCBjaHVuaworKi8KK2ludCBsdWFVX2R1bXAgKGx1YV9TdGF0ZSogTCwgY29uc3QgUHJvdG8qIGYsIGx1YV9Xcml0ZXIgdywgdm9pZCogZGF0YSwgaW50IHN0cmlwKQoreworIER1bXBTdGF0ZSBEOworIEQuTD1MOworIEQud3JpdGVyPXc7CisgRC5kYXRhPWRhdGE7CisgRC5zdHJpcD1zdHJpcDsKKyBELnN0YXR1cz0wOworIER1bXBIZWFkZXIoJkQpOworIER1bXBGdW5jdGlvbihmLE5VTEwsJkQpOworIHJldHVybiBELnN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbGZ1bmMuYyBiL2x1YS01LjEuNC9zcmMvbGZ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNlODhmCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sZnVuYy5jCkBAIC0wLDAgKzEsMTc0IEBACisvKgorKiogJElkOiBsZnVuYy5jLHYgMi4xMi4xLjIgMjAwNy8xMi8yOCAxNDo1ODo0MyByb2JlcnRvIEV4cCAkCisqKiBBdXhpbGlhcnkgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgcHJvdG90eXBlcyBhbmQgY2xvc3VyZXMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBsZnVuY19jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxmdW5jLmgiCisjaW5jbHVkZSAibGdjLmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKworCisKK0Nsb3N1cmUgKmx1YUZfbmV3Q2Nsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgaW50IG5lbGVtcywgVGFibGUgKmUpIHsKKyAgQ2xvc3VyZSAqYyA9IGNhc3QoQ2xvc3VyZSAqLCBsdWFNX21hbGxvYyhMLCBzaXplQ2Nsb3N1cmUobmVsZW1zKSkpOworICBsdWFDX2xpbmsoTCwgb2JqMmdjbyhjKSwgTFVBX1RGVU5DVElPTik7CisgIGMtPmMuaXNDID0gMTsKKyAgYy0+Yy5lbnYgPSBlOworICBjLT5jLm51cHZhbHVlcyA9IGNhc3RfYnl0ZShuZWxlbXMpOworICByZXR1cm4gYzsKK30KKworCitDbG9zdXJlICpsdWFGX25ld0xjbG9zdXJlIChsdWFfU3RhdGUgKkwsIGludCBuZWxlbXMsIFRhYmxlICplKSB7CisgIENsb3N1cmUgKmMgPSBjYXN0KENsb3N1cmUgKiwgbHVhTV9tYWxsb2MoTCwgc2l6ZUxjbG9zdXJlKG5lbGVtcykpKTsKKyAgbHVhQ19saW5rKEwsIG9iajJnY28oYyksIExVQV9URlVOQ1RJT04pOworICBjLT5sLmlzQyA9IDA7CisgIGMtPmwuZW52ID0gZTsKKyAgYy0+bC5udXB2YWx1ZXMgPSBjYXN0X2J5dGUobmVsZW1zKTsKKyAgd2hpbGUgKG5lbGVtcy0tKSBjLT5sLnVwdmFsc1tuZWxlbXNdID0gTlVMTDsKKyAgcmV0dXJuIGM7Cit9CisKKworVXBWYWwgKmx1YUZfbmV3dXB2YWwgKGx1YV9TdGF0ZSAqTCkgeworICBVcFZhbCAqdXYgPSBsdWFNX25ldyhMLCBVcFZhbCk7CisgIGx1YUNfbGluayhMLCBvYmoyZ2NvKHV2KSwgTFVBX1RVUFZBTCk7CisgIHV2LT52ID0gJnV2LT51LnZhbHVlOworICBzZXRuaWx2YWx1ZSh1di0+dik7CisgIHJldHVybiB1djsKK30KKworCitVcFZhbCAqbHVhRl9maW5kdXB2YWwgKGx1YV9TdGF0ZSAqTCwgU3RrSWQgbGV2ZWwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgR0NPYmplY3QgKipwcCA9ICZMLT5vcGVudXB2YWw7CisgIFVwVmFsICpwOworICBVcFZhbCAqdXY7CisgIHdoaWxlICgqcHAgIT0gTlVMTCAmJiAocCA9IG5nY290b3V2KCpwcCkpLT52ID49IGxldmVsKSB7CisgICAgbHVhX2Fzc2VydChwLT52ICE9ICZwLT51LnZhbHVlKTsKKyAgICBpZiAocC0+diA9PSBsZXZlbCkgeyAgLyogZm91bmQgYSBjb3JyZXNwb25kaW5nIHVwdmFsdWU/ICovCisgICAgICBpZiAoaXNkZWFkKGcsIG9iajJnY28ocCkpKSAgLyogaXMgaXQgZGVhZD8gKi8KKyAgICAgICAgY2hhbmdld2hpdGUob2JqMmdjbyhwKSk7ICAvKiByZXNzdXJlY3QgaXQgKi8KKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBwcCA9ICZwLT5uZXh0OworICB9CisgIHV2ID0gbHVhTV9uZXcoTCwgVXBWYWwpOyAgLyogbm90IGZvdW5kOiBjcmVhdGUgYSBuZXcgb25lICovCisgIHV2LT50dCA9IExVQV9UVVBWQUw7CisgIHV2LT5tYXJrZWQgPSBsdWFDX3doaXRlKGcpOworICB1di0+diA9IGxldmVsOyAgLyogY3VycmVudCB2YWx1ZSBsaXZlcyBpbiB0aGUgc3RhY2sgKi8KKyAgdXYtPm5leHQgPSAqcHA7ICAvKiBjaGFpbiBpdCBpbiB0aGUgcHJvcGVyIHBvc2l0aW9uICovCisgICpwcCA9IG9iajJnY28odXYpOworICB1di0+dS5sLnByZXYgPSAmZy0+dXZoZWFkOyAgLyogZG91YmxlIGxpbmsgaXQgaW4gYHV2aGVhZCcgbGlzdCAqLworICB1di0+dS5sLm5leHQgPSBnLT51dmhlYWQudS5sLm5leHQ7CisgIHV2LT51LmwubmV4dC0+dS5sLnByZXYgPSB1djsKKyAgZy0+dXZoZWFkLnUubC5uZXh0ID0gdXY7CisgIGx1YV9hc3NlcnQodXYtPnUubC5uZXh0LT51LmwucHJldiA9PSB1diAmJiB1di0+dS5sLnByZXYtPnUubC5uZXh0ID09IHV2KTsKKyAgcmV0dXJuIHV2OworfQorCisKK3N0YXRpYyB2b2lkIHVubGlua3VwdmFsIChVcFZhbCAqdXYpIHsKKyAgbHVhX2Fzc2VydCh1di0+dS5sLm5leHQtPnUubC5wcmV2ID09IHV2ICYmIHV2LT51LmwucHJldi0+dS5sLm5leHQgPT0gdXYpOworICB1di0+dS5sLm5leHQtPnUubC5wcmV2ID0gdXYtPnUubC5wcmV2OyAgLyogcmVtb3ZlIGZyb20gYHV2aGVhZCcgbGlzdCAqLworICB1di0+dS5sLnByZXYtPnUubC5uZXh0ID0gdXYtPnUubC5uZXh0OworfQorCisKK3ZvaWQgbHVhRl9mcmVldXB2YWwgKGx1YV9TdGF0ZSAqTCwgVXBWYWwgKnV2KSB7CisgIGlmICh1di0+diAhPSAmdXYtPnUudmFsdWUpICAvKiBpcyBpdCBvcGVuPyAqLworICAgIHVubGlua3VwdmFsKHV2KTsgIC8qIHJlbW92ZSBmcm9tIG9wZW4gbGlzdCAqLworICBsdWFNX2ZyZWUoTCwgdXYpOyAgLyogZnJlZSB1cHZhbHVlICovCit9CisKKwordm9pZCBsdWFGX2Nsb3NlIChsdWFfU3RhdGUgKkwsIFN0a0lkIGxldmVsKSB7CisgIFVwVmFsICp1djsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgd2hpbGUgKEwtPm9wZW51cHZhbCAhPSBOVUxMICYmICh1diA9IG5nY290b3V2KEwtPm9wZW51cHZhbCkpLT52ID49IGxldmVsKSB7CisgICAgR0NPYmplY3QgKm8gPSBvYmoyZ2NvKHV2KTsKKyAgICBsdWFfYXNzZXJ0KCFpc2JsYWNrKG8pICYmIHV2LT52ICE9ICZ1di0+dS52YWx1ZSk7CisgICAgTC0+b3BlbnVwdmFsID0gdXYtPm5leHQ7ICAvKiByZW1vdmUgZnJvbSBgb3BlbicgbGlzdCAqLworICAgIGlmIChpc2RlYWQoZywgbykpCisgICAgICBsdWFGX2ZyZWV1cHZhbChMLCB1dik7ICAvKiBmcmVlIHVwdmFsdWUgKi8KKyAgICBlbHNlIHsKKyAgICAgIHVubGlua3VwdmFsKHV2KTsKKyAgICAgIHNldG9iaihMLCAmdXYtPnUudmFsdWUsIHV2LT52KTsKKyAgICAgIHV2LT52ID0gJnV2LT51LnZhbHVlOyAgLyogbm93IGN1cnJlbnQgdmFsdWUgbGl2ZXMgaGVyZSAqLworICAgICAgbHVhQ19saW5rdXB2YWwoTCwgdXYpOyAgLyogbGluayB1cHZhbHVlIGludG8gYGdjcm9vdCcgbGlzdCAqLworICAgIH0KKyAgfQorfQorCisKK1Byb3RvICpsdWFGX25ld3Byb3RvIChsdWFfU3RhdGUgKkwpIHsKKyAgUHJvdG8gKmYgPSBsdWFNX25ldyhMLCBQcm90byk7CisgIGx1YUNfbGluayhMLCBvYmoyZ2NvKGYpLCBMVUFfVFBST1RPKTsKKyAgZi0+ayA9IE5VTEw7CisgIGYtPnNpemVrID0gMDsKKyAgZi0+cCA9IE5VTEw7CisgIGYtPnNpemVwID0gMDsKKyAgZi0+Y29kZSA9IE5VTEw7CisgIGYtPnNpemVjb2RlID0gMDsKKyAgZi0+c2l6ZWxpbmVpbmZvID0gMDsKKyAgZi0+c2l6ZXVwdmFsdWVzID0gMDsKKyAgZi0+bnVwcyA9IDA7CisgIGYtPnVwdmFsdWVzID0gTlVMTDsKKyAgZi0+bnVtcGFyYW1zID0gMDsKKyAgZi0+aXNfdmFyYXJnID0gMDsKKyAgZi0+bWF4c3RhY2tzaXplID0gMDsKKyAgZi0+bGluZWluZm8gPSBOVUxMOworICBmLT5zaXplbG9jdmFycyA9IDA7CisgIGYtPmxvY3ZhcnMgPSBOVUxMOworICBmLT5saW5lZGVmaW5lZCA9IDA7CisgIGYtPmxhc3RsaW5lZGVmaW5lZCA9IDA7CisgIGYtPnNvdXJjZSA9IE5VTEw7CisgIHJldHVybiBmOworfQorCisKK3ZvaWQgbHVhRl9mcmVlcHJvdG8gKGx1YV9TdGF0ZSAqTCwgUHJvdG8gKmYpIHsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgZi0+Y29kZSwgZi0+c2l6ZWNvZGUsIEluc3RydWN0aW9uKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgZi0+cCwgZi0+c2l6ZXAsIFByb3RvICopOworICBsdWFNX2ZyZWVhcnJheShMLCBmLT5rLCBmLT5zaXplaywgVFZhbHVlKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgZi0+bGluZWluZm8sIGYtPnNpemVsaW5laW5mbywgaW50KTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgZi0+bG9jdmFycywgZi0+c2l6ZWxvY3ZhcnMsIHN0cnVjdCBMb2NWYXIpOworICBsdWFNX2ZyZWVhcnJheShMLCBmLT51cHZhbHVlcywgZi0+c2l6ZXVwdmFsdWVzLCBUU3RyaW5nICopOworICBsdWFNX2ZyZWUoTCwgZik7Cit9CisKKwordm9pZCBsdWFGX2ZyZWVjbG9zdXJlIChsdWFfU3RhdGUgKkwsIENsb3N1cmUgKmMpIHsKKyAgaW50IHNpemUgPSAoYy0+Yy5pc0MpID8gc2l6ZUNjbG9zdXJlKGMtPmMubnVwdmFsdWVzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVMY2xvc3VyZShjLT5sLm51cHZhbHVlcyk7CisgIGx1YU1fZnJlZW1lbShMLCBjLCBzaXplKTsKK30KKworCisvKgorKiogTG9vayBmb3Igbi10aCBsb2NhbCB2YXJpYWJsZSBhdCBsaW5lIGBsaW5lJyBpbiBmdW5jdGlvbiBgZnVuYycuCisqKiBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLgorKi8KK2NvbnN0IGNoYXIgKmx1YUZfZ2V0bG9jYWxuYW1lIChjb25zdCBQcm90byAqZiwgaW50IGxvY2FsX251bWJlciwgaW50IHBjKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpPGYtPnNpemVsb2N2YXJzICYmIGYtPmxvY3ZhcnNbaV0uc3RhcnRwYyA8PSBwYzsgaSsrKSB7CisgICAgaWYgKHBjIDwgZi0+bG9jdmFyc1tpXS5lbmRwYykgeyAgLyogaXMgdmFyaWFibGUgYWN0aXZlPyAqLworICAgICAgbG9jYWxfbnVtYmVyLS07CisgICAgICBpZiAobG9jYWxfbnVtYmVyID09IDApCisgICAgICAgIHJldHVybiBnZXRzdHIoZi0+bG9jdmFyc1tpXS52YXJuYW1lKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7ICAvKiBub3QgZm91bmQgKi8KK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sZnVuYy5oIGIvbHVhLTUuMS40L3NyYy9sZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OGNmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xmdW5jLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyoqICRJZDogbGZ1bmMuaCx2IDIuNC4xLjEgMjAwNy8xMi8yNyAxMzowMjoyNSByb2JlcnRvIEV4cCAkCisqKiBBdXhpbGlhcnkgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgcHJvdG90eXBlcyBhbmQgY2xvc3VyZXMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGxmdW5jX2gKKyNkZWZpbmUgbGZ1bmNfaAorCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisKKworI2RlZmluZSBzaXplQ2Nsb3N1cmUobikJKGNhc3QoaW50LCBzaXplb2YoQ0Nsb3N1cmUpKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0KGludCwgc2l6ZW9mKFRWYWx1ZSkqKChuKS0xKSkpCisKKyNkZWZpbmUgc2l6ZUxjbG9zdXJlKG4pCShjYXN0KGludCwgc2l6ZW9mKExDbG9zdXJlKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdChpbnQsIHNpemVvZihUVmFsdWUgKikqKChuKS0xKSkpCisKKworTFVBSV9GVU5DIFByb3RvICpsdWFGX25ld3Byb3RvIChsdWFfU3RhdGUgKkwpOworTFVBSV9GVU5DIENsb3N1cmUgKmx1YUZfbmV3Q2Nsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgaW50IG5lbGVtcywgVGFibGUgKmUpOworTFVBSV9GVU5DIENsb3N1cmUgKmx1YUZfbmV3TGNsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgaW50IG5lbGVtcywgVGFibGUgKmUpOworTFVBSV9GVU5DIFVwVmFsICpsdWFGX25ld3VwdmFsIChsdWFfU3RhdGUgKkwpOworTFVBSV9GVU5DIFVwVmFsICpsdWFGX2ZpbmR1cHZhbCAobHVhX1N0YXRlICpMLCBTdGtJZCBsZXZlbCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFGX2Nsb3NlIChsdWFfU3RhdGUgKkwsIFN0a0lkIGxldmVsKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUZfZnJlZXByb3RvIChsdWFfU3RhdGUgKkwsIFByb3RvICpmKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUZfZnJlZWNsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgQ2xvc3VyZSAqYyk7CitMVUFJX0ZVTkMgdm9pZCBsdWFGX2ZyZWV1cHZhbCAobHVhX1N0YXRlICpMLCBVcFZhbCAqdXYpOworTFVBSV9GVU5DIGNvbnN0IGNoYXIgKmx1YUZfZ2V0bG9jYWxuYW1lIChjb25zdCBQcm90byAqZnVuYywgaW50IGxvY2FsX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBjKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbGdjLmMgYi9sdWEtNS4xLjQvc3JjL2xnYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTBiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xnYy5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorKiogJElkOiBsZ2MuYyx2IDIuMzguMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogR2FyYmFnZSBDb2xsZWN0b3IKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbGdjX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdGFibGUuaCIKKyNpbmNsdWRlICJsdG0uaCIKKworCisjZGVmaW5lIEdDU1RFUFNJWkUJMTAyNHUKKyNkZWZpbmUgR0NTV0VFUE1BWAk0MAorI2RlZmluZSBHQ1NXRUVQQ09TVAkxMAorI2RlZmluZSBHQ0ZJTkFMSVpFQ09TVAkxMDAKKworCisjZGVmaW5lIG1hc2ttYXJrcwljYXN0X2J5dGUofihiaXRtYXNrKEJMQUNLQklUKXxXSElURUJJVFMpKQorCisjZGVmaW5lIG1ha2V3aGl0ZShnLHgpCVwKKyAgICgoeCktPmdjaC5tYXJrZWQgPSBjYXN0X2J5dGUoKCh4KS0+Z2NoLm1hcmtlZCAmIG1hc2ttYXJrcykgfCBsdWFDX3doaXRlKGcpKSkKKworI2RlZmluZSB3aGl0ZTJncmF5KHgpCXJlc2V0MmJpdHMoKHgpLT5nY2gubWFya2VkLCBXSElURTBCSVQsIFdISVRFMUJJVCkKKyNkZWZpbmUgYmxhY2syZ3JheSh4KQlyZXNldGJpdCgoeCktPmdjaC5tYXJrZWQsIEJMQUNLQklUKQorCisjZGVmaW5lIHN0cmluZ21hcmsocykJcmVzZXQyYml0cygocyktPnRzdi5tYXJrZWQsIFdISVRFMEJJVCwgV0hJVEUxQklUKQorCisKKyNkZWZpbmUgaXNmaW5hbGl6ZWQodSkJCXRlc3RiaXQoKHUpLT5tYXJrZWQsIEZJTkFMSVpFREJJVCkKKyNkZWZpbmUgbWFya2ZpbmFsaXplZCh1KQlsX3NldGJpdCgodSktPm1hcmtlZCwgRklOQUxJWkVEQklUKQorCisKKyNkZWZpbmUgS0VZV0VBSyAgICAgICAgIGJpdG1hc2soS0VZV0VBS0JJVCkKKyNkZWZpbmUgVkFMVUVXRUFLICAgICAgIGJpdG1hc2soVkFMVUVXRUFLQklUKQorCisKKworI2RlZmluZSBtYXJrdmFsdWUoZyxvKSB7IGNoZWNrY29uc2lzdGVuY3kobyk7IFwKKyAgaWYgKGlzY29sbGVjdGFibGUobykgJiYgaXN3aGl0ZShnY3ZhbHVlKG8pKSkgcmVhbGx5bWFya29iamVjdChnLGdjdmFsdWUobykpOyB9CisKKyNkZWZpbmUgbWFya29iamVjdChnLHQpIHsgaWYgKGlzd2hpdGUob2JqMmdjbyh0KSkpIFwKKwkJcmVhbGx5bWFya29iamVjdChnLCBvYmoyZ2NvKHQpKTsgfQorCisKKyNkZWZpbmUgc2V0dGhyZXNob2xkKGcpICAoZy0+R0N0aHJlc2hvbGQgPSAoZy0+ZXN0aW1hdGUvMTAwKSAqIGctPmdjcGF1c2UpCisKKworc3RhdGljIHZvaWQgcmVtb3ZlZW50cnkgKE5vZGUgKm4pIHsKKyAgbHVhX2Fzc2VydCh0dGlzbmlsKGd2YWwobikpKTsKKyAgaWYgKGlzY29sbGVjdGFibGUoZ2tleShuKSkpCisgICAgc2V0dHR5cGUoZ2tleShuKSwgTFVBX1RERUFES0VZKTsgIC8qIGRlYWQga2V5OyByZW1vdmUgaXQgKi8KK30KKworCitzdGF0aWMgdm9pZCByZWFsbHltYXJrb2JqZWN0IChnbG9iYWxfU3RhdGUgKmcsIEdDT2JqZWN0ICpvKSB7CisgIGx1YV9hc3NlcnQoaXN3aGl0ZShvKSAmJiAhaXNkZWFkKGcsIG8pKTsKKyAgd2hpdGUyZ3JheShvKTsKKyAgc3dpdGNoIChvLT5nY2gudHQpIHsKKyAgICBjYXNlIExVQV9UU1RSSU5HOiB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgTFVBX1RVU0VSREFUQTogeworICAgICAgVGFibGUgKm10ID0gZ2NvMnUobyktPm1ldGF0YWJsZTsKKyAgICAgIGdyYXkyYmxhY2sobyk7ICAvKiB1ZGF0YSBhcmUgbmV2ZXIgZ3JheSAqLworICAgICAgaWYgKG10KSBtYXJrb2JqZWN0KGcsIG10KTsKKyAgICAgIG1hcmtvYmplY3QoZywgZ2NvMnUobyktPmVudik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgTFVBX1RVUFZBTDogeworICAgICAgVXBWYWwgKnV2ID0gZ2NvMnV2KG8pOworICAgICAgbWFya3ZhbHVlKGcsIHV2LT52KTsKKyAgICAgIGlmICh1di0+diA9PSAmdXYtPnUudmFsdWUpICAvKiBjbG9zZWQ/ICovCisgICAgICAgIGdyYXkyYmxhY2sobyk7ICAvKiBvcGVuIHVwdmFsdWVzIGFyZSBuZXZlciBibGFjayAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIExVQV9URlVOQ1RJT046IHsKKyAgICAgIGdjbzJjbChvKS0+Yy5nY2xpc3QgPSBnLT5ncmF5OworICAgICAgZy0+Z3JheSA9IG87CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfVFRBQkxFOiB7CisgICAgICBnY28yaChvKS0+Z2NsaXN0ID0gZy0+Z3JheTsKKyAgICAgIGctPmdyYXkgPSBvOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX1RUSFJFQUQ6IHsKKyAgICAgIGdjbzJ0aChvKS0+Z2NsaXN0ID0gZy0+Z3JheTsKKyAgICAgIGctPmdyYXkgPSBvOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX1RQUk9UTzogeworICAgICAgZ2NvMnAobyktPmdjbGlzdCA9IGctPmdyYXk7CisgICAgICBnLT5ncmF5ID0gbzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBsdWFfYXNzZXJ0KDApOworICB9Cit9CisKKworc3RhdGljIHZvaWQgbWFya3RtdSAoZ2xvYmFsX1N0YXRlICpnKSB7CisgIEdDT2JqZWN0ICp1ID0gZy0+dG11ZGF0YTsKKyAgaWYgKHUpIHsKKyAgICBkbyB7CisgICAgICB1ID0gdS0+Z2NoLm5leHQ7CisgICAgICBtYWtld2hpdGUoZywgdSk7ICAvKiBtYXkgYmUgbWFya2VkLCBpZiBsZWZ0IGZyb20gcHJldmlvdXMgR0MgKi8KKyAgICAgIHJlYWxseW1hcmtvYmplY3QoZywgdSk7CisgICAgfSB3aGlsZSAodSAhPSBnLT50bXVkYXRhKTsKKyAgfQorfQorCisKKy8qIG1vdmUgYGRlYWQnIHVkYXRhIHRoYXQgbmVlZCBmaW5hbGl6YXRpb24gdG8gbGlzdCBgdG11ZGF0YScgKi8KK3NpemVfdCBsdWFDX3NlcGFyYXRldWRhdGEgKGx1YV9TdGF0ZSAqTCwgaW50IGFsbCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBzaXplX3QgZGVhZG1lbSA9IDA7CisgIEdDT2JqZWN0ICoqcCA9ICZnLT5tYWludGhyZWFkLT5uZXh0OworICBHQ09iamVjdCAqY3VycjsKKyAgd2hpbGUgKChjdXJyID0gKnApICE9IE5VTEwpIHsKKyAgICBpZiAoIShpc3doaXRlKGN1cnIpIHx8IGFsbCkgfHwgaXNmaW5hbGl6ZWQoZ2NvMnUoY3VycikpKQorICAgICAgcCA9ICZjdXJyLT5nY2gubmV4dDsgIC8qIGRvbid0IGJvdGhlciB3aXRoIHRoZW0gKi8KKyAgICBlbHNlIGlmIChmYXN0dG0oTCwgZ2NvMnUoY3VyciktPm1ldGF0YWJsZSwgVE1fR0MpID09IE5VTEwpIHsKKyAgICAgIG1hcmtmaW5hbGl6ZWQoZ2NvMnUoY3VycikpOyAgLyogZG9uJ3QgbmVlZCBmaW5hbGl6YXRpb24gKi8KKyAgICAgIHAgPSAmY3Vyci0+Z2NoLm5leHQ7CisgICAgfQorICAgIGVsc2UgeyAgLyogbXVzdCBjYWxsIGl0cyBnYyBtZXRob2QgKi8KKyAgICAgIGRlYWRtZW0gKz0gc2l6ZXVkYXRhKGdjbzJ1KGN1cnIpKTsKKyAgICAgIG1hcmtmaW5hbGl6ZWQoZ2NvMnUoY3VycikpOworICAgICAgKnAgPSBjdXJyLT5nY2gubmV4dDsKKyAgICAgIC8qIGxpbmsgYGN1cnInIGF0IHRoZSBlbmQgb2YgYHRtdWRhdGEnIGxpc3QgKi8KKyAgICAgIGlmIChnLT50bXVkYXRhID09IE5VTEwpICAvKiBsaXN0IGlzIGVtcHR5PyAqLworICAgICAgICBnLT50bXVkYXRhID0gY3Vyci0+Z2NoLm5leHQgPSBjdXJyOyAgLyogY3JlYXRlcyBhIGNpcmN1bGFyIGxpc3QgKi8KKyAgICAgIGVsc2UgeworICAgICAgICBjdXJyLT5nY2gubmV4dCA9IGctPnRtdWRhdGEtPmdjaC5uZXh0OworICAgICAgICBnLT50bXVkYXRhLT5nY2gubmV4dCA9IGN1cnI7CisgICAgICAgIGctPnRtdWRhdGEgPSBjdXJyOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZGVhZG1lbTsKK30KKworCitzdGF0aWMgaW50IHRyYXZlcnNldGFibGUgKGdsb2JhbF9TdGF0ZSAqZywgVGFibGUgKmgpIHsKKyAgaW50IGk7CisgIGludCB3ZWFra2V5ID0gMDsKKyAgaW50IHdlYWt2YWx1ZSA9IDA7CisgIGNvbnN0IFRWYWx1ZSAqbW9kZTsKKyAgaWYgKGgtPm1ldGF0YWJsZSkKKyAgICBtYXJrb2JqZWN0KGcsIGgtPm1ldGF0YWJsZSk7CisgIG1vZGUgPSBnZmFzdHRtKGcsIGgtPm1ldGF0YWJsZSwgVE1fTU9ERSk7CisgIGlmIChtb2RlICYmIHR0aXNzdHJpbmcobW9kZSkpIHsgIC8qIGlzIHRoZXJlIGEgd2VhayBtb2RlPyAqLworICAgIHdlYWtrZXkgPSAoc3RyY2hyKHN2YWx1ZShtb2RlKSwgJ2snKSAhPSBOVUxMKTsKKyAgICB3ZWFrdmFsdWUgPSAoc3RyY2hyKHN2YWx1ZShtb2RlKSwgJ3YnKSAhPSBOVUxMKTsKKyAgICBpZiAod2Vha2tleSB8fCB3ZWFrdmFsdWUpIHsgIC8qIGlzIHJlYWxseSB3ZWFrPyAqLworICAgICAgaC0+bWFya2VkICY9IH4oS0VZV0VBSyB8IFZBTFVFV0VBSyk7ICAvKiBjbGVhciBiaXRzICovCisgICAgICBoLT5tYXJrZWQgfD0gY2FzdF9ieXRlKCh3ZWFra2V5IDw8IEtFWVdFQUtCSVQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdlYWt2YWx1ZSA8PCBWQUxVRVdFQUtCSVQpKTsKKyAgICAgIGgtPmdjbGlzdCA9IGctPndlYWs7ICAvKiBtdXN0IGJlIGNsZWFyZWQgYWZ0ZXIgR0MsIC4uLiAqLworICAgICAgZy0+d2VhayA9IG9iajJnY28oaCk7ICAvKiAuLi4gc28gcHV0IGluIHRoZSBhcHByb3ByaWF0ZSBsaXN0ICovCisgICAgfQorICB9CisgIGlmICh3ZWFra2V5ICYmIHdlYWt2YWx1ZSkgcmV0dXJuIDE7CisgIGlmICghd2Vha3ZhbHVlKSB7CisgICAgaSA9IGgtPnNpemVhcnJheTsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgbWFya3ZhbHVlKGcsICZoLT5hcnJheVtpXSk7CisgIH0KKyAgaSA9IHNpemVub2RlKGgpOworICB3aGlsZSAoaS0tKSB7CisgICAgTm9kZSAqbiA9IGdub2RlKGgsIGkpOworICAgIGx1YV9hc3NlcnQodHR5cGUoZ2tleShuKSkgIT0gTFVBX1RERUFES0VZIHx8IHR0aXNuaWwoZ3ZhbChuKSkpOworICAgIGlmICh0dGlzbmlsKGd2YWwobikpKQorICAgICAgcmVtb3ZlZW50cnkobik7ICAvKiByZW1vdmUgZW1wdHkgZW50cmllcyAqLworICAgIGVsc2UgeworICAgICAgbHVhX2Fzc2VydCghdHRpc25pbChna2V5KG4pKSk7CisgICAgICBpZiAoIXdlYWtrZXkpIG1hcmt2YWx1ZShnLCBna2V5KG4pKTsKKyAgICAgIGlmICghd2Vha3ZhbHVlKSBtYXJrdmFsdWUoZywgZ3ZhbChuKSk7CisgICAgfQorICB9CisgIHJldHVybiB3ZWFra2V5IHx8IHdlYWt2YWx1ZTsKK30KKworCisvKgorKiogQWxsIG1hcmtzIGFyZSBjb25kaXRpb25hbCBiZWNhdXNlIGEgR0MgbWF5IGhhcHBlbiB3aGlsZSB0aGUKKyoqIHByb3RvdHlwZSBpcyBzdGlsbCBiZWluZyBjcmVhdGVkCisqLworc3RhdGljIHZvaWQgdHJhdmVyc2Vwcm90byAoZ2xvYmFsX1N0YXRlICpnLCBQcm90byAqZikgeworICBpbnQgaTsKKyAgaWYgKGYtPnNvdXJjZSkgc3RyaW5nbWFyayhmLT5zb3VyY2UpOworICBmb3IgKGk9MDsgaTxmLT5zaXplazsgaSsrKSAgLyogbWFyayBsaXRlcmFscyAqLworICAgIG1hcmt2YWx1ZShnLCAmZi0+a1tpXSk7CisgIGZvciAoaT0wOyBpPGYtPnNpemV1cHZhbHVlczsgaSsrKSB7ICAvKiBtYXJrIHVwdmFsdWUgbmFtZXMgKi8KKyAgICBpZiAoZi0+dXB2YWx1ZXNbaV0pCisgICAgICBzdHJpbmdtYXJrKGYtPnVwdmFsdWVzW2ldKTsKKyAgfQorICBmb3IgKGk9MDsgaTxmLT5zaXplcDsgaSsrKSB7ICAvKiBtYXJrIG5lc3RlZCBwcm90b3MgKi8KKyAgICBpZiAoZi0+cFtpXSkKKyAgICAgIG1hcmtvYmplY3QoZywgZi0+cFtpXSk7CisgIH0KKyAgZm9yIChpPTA7IGk8Zi0+c2l6ZWxvY3ZhcnM7IGkrKykgeyAgLyogbWFyayBsb2NhbC12YXJpYWJsZSBuYW1lcyAqLworICAgIGlmIChmLT5sb2N2YXJzW2ldLnZhcm5hbWUpCisgICAgICBzdHJpbmdtYXJrKGYtPmxvY3ZhcnNbaV0udmFybmFtZSk7CisgIH0KK30KKworCisKK3N0YXRpYyB2b2lkIHRyYXZlcnNlY2xvc3VyZSAoZ2xvYmFsX1N0YXRlICpnLCBDbG9zdXJlICpjbCkgeworICBtYXJrb2JqZWN0KGcsIGNsLT5jLmVudik7CisgIGlmIChjbC0+Yy5pc0MpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaTxjbC0+Yy5udXB2YWx1ZXM7IGkrKykgIC8qIG1hcmsgaXRzIHVwdmFsdWVzICovCisgICAgICBtYXJrdmFsdWUoZywgJmNsLT5jLnVwdmFsdWVbaV0pOworICB9CisgIGVsc2UgeworICAgIGludCBpOworICAgIGx1YV9hc3NlcnQoY2wtPmwubnVwdmFsdWVzID09IGNsLT5sLnAtPm51cHMpOworICAgIG1hcmtvYmplY3QoZywgY2wtPmwucCk7CisgICAgZm9yIChpPTA7IGk8Y2wtPmwubnVwdmFsdWVzOyBpKyspICAvKiBtYXJrIGl0cyB1cHZhbHVlcyAqLworICAgICAgbWFya29iamVjdChnLCBjbC0+bC51cHZhbHNbaV0pOworICB9Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tzdGFja3NpemVzIChsdWFfU3RhdGUgKkwsIFN0a0lkIG1heCkgeworICBpbnQgY2lfdXNlZCA9IGNhc3RfaW50KEwtPmNpIC0gTC0+YmFzZV9jaSk7ICAvKiBudW1iZXIgb2YgYGNpJyBpbiB1c2UgKi8KKyAgaW50IHNfdXNlZCA9IGNhc3RfaW50KG1heCAtIEwtPnN0YWNrKTsgIC8qIHBhcnQgb2Ygc3RhY2sgaW4gdXNlICovCisgIGlmIChMLT5zaXplX2NpID4gTFVBSV9NQVhDQUxMUykgIC8qIGhhbmRsaW5nIG92ZXJmbG93PyAqLworICAgIHJldHVybjsgIC8qIGRvIG5vdCB0b3VjaCB0aGUgc3RhY2tzICovCisgIGlmICg0KmNpX3VzZWQgPCBMLT5zaXplX2NpICYmIDIqQkFTSUNfQ0lfU0laRSA8IEwtPnNpemVfY2kpCisgICAgbHVhRF9yZWFsbG9jQ0koTCwgTC0+c2l6ZV9jaS8yKTsgIC8qIHN0aWxsIGJpZyBlbm91Z2guLi4gKi8KKyAgY29uZGhhcmRzdGFja3Rlc3RzKGx1YURfcmVhbGxvY0NJKEwsIGNpX3VzZWQgKyAxKSk7CisgIGlmICg0KnNfdXNlZCA8IEwtPnN0YWNrc2l6ZSAmJgorICAgICAgMiooQkFTSUNfU1RBQ0tfU0laRStFWFRSQV9TVEFDSykgPCBMLT5zdGFja3NpemUpCisgICAgbHVhRF9yZWFsbG9jc3RhY2soTCwgTC0+c3RhY2tzaXplLzIpOyAgLyogc3RpbGwgYmlnIGVub3VnaC4uLiAqLworICBjb25kaGFyZHN0YWNrdGVzdHMobHVhRF9yZWFsbG9jc3RhY2soTCwgc191c2VkKSk7Cit9CisKKworc3RhdGljIHZvaWQgdHJhdmVyc2VzdGFjayAoZ2xvYmFsX1N0YXRlICpnLCBsdWFfU3RhdGUgKmwpIHsKKyAgU3RrSWQgbywgbGltOworICBDYWxsSW5mbyAqY2k7CisgIG1hcmt2YWx1ZShnLCBndChsKSk7CisgIGxpbSA9IGwtPnRvcDsKKyAgZm9yIChjaSA9IGwtPmJhc2VfY2k7IGNpIDw9IGwtPmNpOyBjaSsrKSB7CisgICAgbHVhX2Fzc2VydChjaS0+dG9wIDw9IGwtPnN0YWNrX2xhc3QpOworICAgIGlmIChsaW0gPCBjaS0+dG9wKSBsaW0gPSBjaS0+dG9wOworICB9CisgIGZvciAobyA9IGwtPnN0YWNrOyBvIDwgbC0+dG9wOyBvKyspCisgICAgbWFya3ZhbHVlKGcsIG8pOworICBmb3IgKDsgbyA8PSBsaW07IG8rKykKKyAgICBzZXRuaWx2YWx1ZShvKTsKKyAgY2hlY2tzdGFja3NpemVzKGwsIGxpbSk7Cit9CisKKworLyoKKyoqIHRyYXZlcnNlIG9uZSBncmF5IG9iamVjdCwgdHVybmluZyBpdCB0byBibGFjay4KKyoqIFJldHVybnMgYHF1YW50aXR5JyB0cmF2ZXJzZWQuCisqLworc3RhdGljIGxfbWVtIHByb3BhZ2F0ZW1hcmsgKGdsb2JhbF9TdGF0ZSAqZykgeworICBHQ09iamVjdCAqbyA9IGctPmdyYXk7CisgIGx1YV9hc3NlcnQoaXNncmF5KG8pKTsKKyAgZ3JheTJibGFjayhvKTsKKyAgc3dpdGNoIChvLT5nY2gudHQpIHsKKyAgICBjYXNlIExVQV9UVEFCTEU6IHsKKyAgICAgIFRhYmxlICpoID0gZ2NvMmgobyk7CisgICAgICBnLT5ncmF5ID0gaC0+Z2NsaXN0OworICAgICAgaWYgKHRyYXZlcnNldGFibGUoZywgaCkpICAvKiB0YWJsZSBpcyB3ZWFrPyAqLworICAgICAgICBibGFjazJncmF5KG8pOyAgLyoga2VlcCBpdCBncmF5ICovCisgICAgICByZXR1cm4gc2l6ZW9mKFRhYmxlKSArIHNpemVvZihUVmFsdWUpICogaC0+c2l6ZWFycmF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5vZGUpICogc2l6ZW5vZGUoaCk7CisgICAgfQorICAgIGNhc2UgTFVBX1RGVU5DVElPTjogeworICAgICAgQ2xvc3VyZSAqY2wgPSBnY28yY2wobyk7CisgICAgICBnLT5ncmF5ID0gY2wtPmMuZ2NsaXN0OworICAgICAgdHJhdmVyc2VjbG9zdXJlKGcsIGNsKTsKKyAgICAgIHJldHVybiAoY2wtPmMuaXNDKSA/IHNpemVDY2xvc3VyZShjbC0+Yy5udXB2YWx1ZXMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVMY2xvc3VyZShjbC0+bC5udXB2YWx1ZXMpOworICAgIH0KKyAgICBjYXNlIExVQV9UVEhSRUFEOiB7CisgICAgICBsdWFfU3RhdGUgKnRoID0gZ2NvMnRoKG8pOworICAgICAgZy0+Z3JheSA9IHRoLT5nY2xpc3Q7CisgICAgICB0aC0+Z2NsaXN0ID0gZy0+Z3JheWFnYWluOworICAgICAgZy0+Z3JheWFnYWluID0gbzsKKyAgICAgIGJsYWNrMmdyYXkobyk7CisgICAgICB0cmF2ZXJzZXN0YWNrKGcsIHRoKTsKKyAgICAgIHJldHVybiBzaXplb2YobHVhX1N0YXRlKSArIHNpemVvZihUVmFsdWUpICogdGgtPnN0YWNrc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ2FsbEluZm8pICogdGgtPnNpemVfY2k7CisgICAgfQorICAgIGNhc2UgTFVBX1RQUk9UTzogeworICAgICAgUHJvdG8gKnAgPSBnY28ycChvKTsKKyAgICAgIGctPmdyYXkgPSBwLT5nY2xpc3Q7CisgICAgICB0cmF2ZXJzZXByb3RvKGcsIHApOworICAgICAgcmV0dXJuIHNpemVvZihQcm90bykgKyBzaXplb2YoSW5zdHJ1Y3Rpb24pICogcC0+c2l6ZWNvZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHJvdG8gKikgKiBwLT5zaXplcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUVmFsdWUpICogcC0+c2l6ZWsgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBwLT5zaXplbGluZWluZm8gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTG9jVmFyKSAqIHAtPnNpemVsb2N2YXJzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRTdHJpbmcgKikgKiBwLT5zaXpldXB2YWx1ZXM7CisgICAgfQorICAgIGRlZmF1bHQ6IGx1YV9hc3NlcnQoMCk7IHJldHVybiAwOworICB9Cit9CisKKworc3RhdGljIHNpemVfdCBwcm9wYWdhdGVhbGwgKGdsb2JhbF9TdGF0ZSAqZykgeworICBzaXplX3QgbSA9IDA7CisgIHdoaWxlIChnLT5ncmF5KSBtICs9IHByb3BhZ2F0ZW1hcmsoZyk7CisgIHJldHVybiBtOworfQorCisKKy8qCisqKiBUaGUgbmV4dCBmdW5jdGlvbiB0ZWxscyB3aGV0aGVyIGEga2V5IG9yIHZhbHVlIGNhbiBiZSBjbGVhcmVkIGZyb20KKyoqIGEgd2VhayB0YWJsZS4gTm9uLWNvbGxlY3RhYmxlIG9iamVjdHMgYXJlIG5ldmVyIHJlbW92ZWQgZnJvbSB3ZWFrCisqKiB0YWJsZXMuIFN0cmluZ3MgYmVoYXZlIGFzIGB2YWx1ZXMnLCBzbyBhcmUgbmV2ZXIgcmVtb3ZlZCB0b28uIGZvcgorKiogb3RoZXIgb2JqZWN0czogaWYgcmVhbGx5IGNvbGxlY3RlZCwgY2Fubm90IGtlZXAgdGhlbTsgZm9yIHVzZXJkYXRhCisqKiBiZWluZyBmaW5hbGl6ZWQsIGtlZXAgdGhlbSBpbiBrZXlzLCBidXQgbm90IGluIHZhbHVlcworKi8KK3N0YXRpYyBpbnQgaXNjbGVhcmVkIChjb25zdCBUVmFsdWUgKm8sIGludCBpc2tleSkgeworICBpZiAoIWlzY29sbGVjdGFibGUobykpIHJldHVybiAwOworICBpZiAodHRpc3N0cmluZyhvKSkgeworICAgIHN0cmluZ21hcmsocmF3dHN2YWx1ZShvKSk7ICAvKiBzdHJpbmdzIGFyZSBgdmFsdWVzJywgc28gYXJlIG5ldmVyIHdlYWsgKi8KKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gaXN3aGl0ZShnY3ZhbHVlKG8pKSB8fAorICAgICh0dGlzdXNlcmRhdGEobykgJiYgKCFpc2tleSAmJiBpc2ZpbmFsaXplZCh1dmFsdWUobykpKSk7Cit9CisKKworLyoKKyoqIGNsZWFyIGNvbGxlY3RlZCBlbnRyaWVzIGZyb20gd2Vha3RhYmxlcworKi8KK3N0YXRpYyB2b2lkIGNsZWFydGFibGUgKEdDT2JqZWN0ICpsKSB7CisgIHdoaWxlIChsKSB7CisgICAgVGFibGUgKmggPSBnY28yaChsKTsKKyAgICBpbnQgaSA9IGgtPnNpemVhcnJheTsKKyAgICBsdWFfYXNzZXJ0KHRlc3RiaXQoaC0+bWFya2VkLCBWQUxVRVdFQUtCSVQpIHx8CisgICAgICAgICAgICAgICB0ZXN0Yml0KGgtPm1hcmtlZCwgS0VZV0VBS0JJVCkpOworICAgIGlmICh0ZXN0Yml0KGgtPm1hcmtlZCwgVkFMVUVXRUFLQklUKSkgeworICAgICAgd2hpbGUgKGktLSkgeworICAgICAgICBUVmFsdWUgKm8gPSAmaC0+YXJyYXlbaV07CisgICAgICAgIGlmIChpc2NsZWFyZWQobywgMCkpICAvKiB2YWx1ZSB3YXMgY29sbGVjdGVkPyAqLworICAgICAgICAgIHNldG5pbHZhbHVlKG8pOyAgLyogcmVtb3ZlIHZhbHVlICovCisgICAgICB9CisgICAgfQorICAgIGkgPSBzaXplbm9kZShoKTsKKyAgICB3aGlsZSAoaS0tKSB7CisgICAgICBOb2RlICpuID0gZ25vZGUoaCwgaSk7CisgICAgICBpZiAoIXR0aXNuaWwoZ3ZhbChuKSkgJiYgIC8qIG5vbi1lbXB0eSBlbnRyeT8gKi8KKyAgICAgICAgICAoaXNjbGVhcmVkKGtleTJ0dmFsKG4pLCAxKSB8fCBpc2NsZWFyZWQoZ3ZhbChuKSwgMCkpKSB7CisgICAgICAgIHNldG5pbHZhbHVlKGd2YWwobikpOyAgLyogcmVtb3ZlIHZhbHVlIC4uLiAqLworICAgICAgICByZW1vdmVlbnRyeShuKTsgIC8qIHJlbW92ZSBlbnRyeSBmcm9tIHRhYmxlICovCisgICAgICB9CisgICAgfQorICAgIGwgPSBoLT5nY2xpc3Q7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBmcmVlb2JqIChsdWFfU3RhdGUgKkwsIEdDT2JqZWN0ICpvKSB7CisgIHN3aXRjaCAoby0+Z2NoLnR0KSB7CisgICAgY2FzZSBMVUFfVFBST1RPOiBsdWFGX2ZyZWVwcm90byhMLCBnY28ycChvKSk7IGJyZWFrOworICAgIGNhc2UgTFVBX1RGVU5DVElPTjogbHVhRl9mcmVlY2xvc3VyZShMLCBnY28yY2wobykpOyBicmVhazsKKyAgICBjYXNlIExVQV9UVVBWQUw6IGx1YUZfZnJlZXVwdmFsKEwsIGdjbzJ1dihvKSk7IGJyZWFrOworICAgIGNhc2UgTFVBX1RUQUJMRTogbHVhSF9mcmVlKEwsIGdjbzJoKG8pKTsgYnJlYWs7CisgICAgY2FzZSBMVUFfVFRIUkVBRDogeworICAgICAgbHVhX2Fzc2VydChnY28ydGgobykgIT0gTCAmJiBnY28ydGgobykgIT0gRyhMKS0+bWFpbnRocmVhZCk7CisgICAgICBsdWFFX2ZyZWV0aHJlYWQoTCwgZ2NvMnRoKG8pKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9UU1RSSU5HOiB7CisgICAgICBHKEwpLT5zdHJ0Lm51c2UtLTsKKyAgICAgIGx1YU1fZnJlZW1lbShMLCBvLCBzaXplc3RyaW5nKGdjbzJ0cyhvKSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX1RVU0VSREFUQTogeworICAgICAgbHVhTV9mcmVlbWVtKEwsIG8sIHNpemV1ZGF0YShnY28ydShvKSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IGx1YV9hc3NlcnQoMCk7CisgIH0KK30KKworCisKKyNkZWZpbmUgc3dlZXB3aG9sZWxpc3QoTCxwKQlzd2VlcGxpc3QoTCxwLE1BWF9MVU1FTSkKKworCitzdGF0aWMgR0NPYmplY3QgKipzd2VlcGxpc3QgKGx1YV9TdGF0ZSAqTCwgR0NPYmplY3QgKipwLCBsdV9tZW0gY291bnQpIHsKKyAgR0NPYmplY3QgKmN1cnI7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGludCBkZWFkbWFzayA9IG90aGVyd2hpdGUoZyk7CisgIHdoaWxlICgoY3VyciA9ICpwKSAhPSBOVUxMICYmIGNvdW50LS0gPiAwKSB7CisgICAgaWYgKGN1cnItPmdjaC50dCA9PSBMVUFfVFRIUkVBRCkgIC8qIHN3ZWVwIG9wZW4gdXB2YWx1ZXMgb2YgZWFjaCB0aHJlYWQgKi8KKyAgICAgIHN3ZWVwd2hvbGVsaXN0KEwsICZnY28ydGgoY3VyciktPm9wZW51cHZhbCk7CisgICAgaWYgKChjdXJyLT5nY2gubWFya2VkIF4gV0hJVEVCSVRTKSAmIGRlYWRtYXNrKSB7ICAvKiBub3QgZGVhZD8gKi8KKyAgICAgIGx1YV9hc3NlcnQoIWlzZGVhZChnLCBjdXJyKSB8fCB0ZXN0Yml0KGN1cnItPmdjaC5tYXJrZWQsIEZJWEVEQklUKSk7CisgICAgICBtYWtld2hpdGUoZywgY3Vycik7ICAvKiBtYWtlIGl0IHdoaXRlIChmb3IgbmV4dCBjeWNsZSkgKi8KKyAgICAgIHAgPSAmY3Vyci0+Z2NoLm5leHQ7CisgICAgfQorICAgIGVsc2UgeyAgLyogbXVzdCBlcmFzZSBgY3VycicgKi8KKyAgICAgIGx1YV9hc3NlcnQoaXNkZWFkKGcsIGN1cnIpIHx8IGRlYWRtYXNrID09IGJpdG1hc2soU0ZJWEVEQklUKSk7CisgICAgICAqcCA9IGN1cnItPmdjaC5uZXh0OworICAgICAgaWYgKGN1cnIgPT0gZy0+cm9vdGdjKSAgLyogaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Q/ICovCisgICAgICAgIGctPnJvb3RnYyA9IGN1cnItPmdjaC5uZXh0OyAgLyogYWRqdXN0IGZpcnN0ICovCisgICAgICBmcmVlb2JqKEwsIGN1cnIpOworICAgIH0KKyAgfQorICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgdm9pZCBjaGVja1NpemVzIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgLyogY2hlY2sgc2l6ZSBvZiBzdHJpbmcgaGFzaCAqLworICBpZiAoZy0+c3RydC5udXNlIDwgY2FzdChsdV9pbnQzMiwgZy0+c3RydC5zaXplLzQpICYmCisgICAgICBnLT5zdHJ0LnNpemUgPiBNSU5TVFJUQUJTSVpFKjIpCisgICAgbHVhU19yZXNpemUoTCwgZy0+c3RydC5zaXplLzIpOyAgLyogdGFibGUgaXMgdG9vIGJpZyAqLworICAvKiBjaGVjayBzaXplIG9mIGJ1ZmZlciAqLworICBpZiAobHVhWl9zaXplYnVmZmVyKCZnLT5idWZmKSA+IExVQV9NSU5CVUZGRVIqMikgeyAgLyogYnVmZmVyIHRvbyBiaWc/ICovCisgICAgc2l6ZV90IG5ld3NpemUgPSBsdWFaX3NpemVidWZmZXIoJmctPmJ1ZmYpIC8gMjsKKyAgICBsdWFaX3Jlc2l6ZWJ1ZmZlcihMLCAmZy0+YnVmZiwgbmV3c2l6ZSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBHQ1RNIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgR0NPYmplY3QgKm8gPSBnLT50bXVkYXRhLT5nY2gubmV4dDsgIC8qIGdldCBmaXJzdCBlbGVtZW50ICovCisgIFVkYXRhICp1ZGF0YSA9IHJhd2djbzJ1KG8pOworICBjb25zdCBUVmFsdWUgKnRtOworICAvKiByZW1vdmUgdWRhdGEgZnJvbSBgdG11ZGF0YScgKi8KKyAgaWYgKG8gPT0gZy0+dG11ZGF0YSkgIC8qIGxhc3QgZWxlbWVudD8gKi8KKyAgICBnLT50bXVkYXRhID0gTlVMTDsKKyAgZWxzZQorICAgIGctPnRtdWRhdGEtPmdjaC5uZXh0ID0gdWRhdGEtPnV2Lm5leHQ7CisgIHVkYXRhLT51di5uZXh0ID0gZy0+bWFpbnRocmVhZC0+bmV4dDsgIC8qIHJldHVybiBpdCB0byBgcm9vdCcgbGlzdCAqLworICBnLT5tYWludGhyZWFkLT5uZXh0ID0gbzsKKyAgbWFrZXdoaXRlKGcsIG8pOworICB0bSA9IGZhc3R0bShMLCB1ZGF0YS0+dXYubWV0YXRhYmxlLCBUTV9HQyk7CisgIGlmICh0bSAhPSBOVUxMKSB7CisgICAgbHVfYnl0ZSBvbGRhaCA9IEwtPmFsbG93aG9vazsKKyAgICBsdV9tZW0gb2xkdCA9IGctPkdDdGhyZXNob2xkOworICAgIEwtPmFsbG93aG9vayA9IDA7ICAvKiBzdG9wIGRlYnVnIGhvb2tzIGR1cmluZyBHQyB0YWcgbWV0aG9kICovCisgICAgZy0+R0N0aHJlc2hvbGQgPSAyKmctPnRvdGFsYnl0ZXM7ICAvKiBhdm9pZCBHQyBzdGVwcyAqLworICAgIHNldG9iajJzKEwsIEwtPnRvcCwgdG0pOworICAgIHNldHV2YWx1ZShMLCBMLT50b3ArMSwgdWRhdGEpOworICAgIEwtPnRvcCArPSAyOworICAgIGx1YURfY2FsbChMLCBMLT50b3AgLSAyLCAwKTsKKyAgICBMLT5hbGxvd2hvb2sgPSBvbGRhaDsgIC8qIHJlc3RvcmUgaG9va3MgKi8KKyAgICBnLT5HQ3RocmVzaG9sZCA9IG9sZHQ7ICAvKiByZXN0b3JlIHRocmVzaG9sZCAqLworICB9Cit9CisKKworLyoKKyoqIENhbGwgYWxsIEdDIHRhZyBtZXRob2RzCisqLwordm9pZCBsdWFDX2NhbGxHQ1RNIChsdWFfU3RhdGUgKkwpIHsKKyAgd2hpbGUgKEcoTCktPnRtdWRhdGEpCisgICAgR0NUTShMKTsKK30KKworCit2b2lkIGx1YUNfZnJlZWFsbCAobHVhX1N0YXRlICpMKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGludCBpOworICBnLT5jdXJyZW50d2hpdGUgPSBXSElURUJJVFMgfCBiaXRtYXNrKFNGSVhFREJJVCk7ICAvKiBtYXNrIHRvIGNvbGxlY3QgYWxsIGVsZW1lbnRzICovCisgIHN3ZWVwd2hvbGVsaXN0KEwsICZnLT5yb290Z2MpOworICBmb3IgKGkgPSAwOyBpIDwgZy0+c3RydC5zaXplOyBpKyspICAvKiBmcmVlIGFsbCBzdHJpbmcgbGlzdHMgKi8KKyAgICBzd2VlcHdob2xlbGlzdChMLCAmZy0+c3RydC5oYXNoW2ldKTsKK30KKworCitzdGF0aWMgdm9pZCBtYXJrbXQgKGdsb2JhbF9TdGF0ZSAqZykgeworICBpbnQgaTsKKyAgZm9yIChpPTA7IGk8TlVNX1RBR1M7IGkrKykKKyAgICBpZiAoZy0+bXRbaV0pIG1hcmtvYmplY3QoZywgZy0+bXRbaV0pOworfQorCisKKy8qIG1hcmsgcm9vdCBzZXQgKi8KK3N0YXRpYyB2b2lkIG1hcmtyb290IChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgZy0+Z3JheSA9IE5VTEw7CisgIGctPmdyYXlhZ2FpbiA9IE5VTEw7CisgIGctPndlYWsgPSBOVUxMOworICBtYXJrb2JqZWN0KGcsIGctPm1haW50aHJlYWQpOworICAvKiBtYWtlIGdsb2JhbCB0YWJsZSBiZSB0cmF2ZXJzZWQgYmVmb3JlIG1haW4gc3RhY2sgKi8KKyAgbWFya3ZhbHVlKGcsIGd0KGctPm1haW50aHJlYWQpKTsKKyAgbWFya3ZhbHVlKGcsIHJlZ2lzdHJ5KEwpKTsKKyAgbWFya210KGcpOworICBnLT5nY3N0YXRlID0gR0NTcHJvcGFnYXRlOworfQorCisKK3N0YXRpYyB2b2lkIHJlbWFya3VwdmFscyAoZ2xvYmFsX1N0YXRlICpnKSB7CisgIFVwVmFsICp1djsKKyAgZm9yICh1diA9IGctPnV2aGVhZC51LmwubmV4dDsgdXYgIT0gJmctPnV2aGVhZDsgdXYgPSB1di0+dS5sLm5leHQpIHsKKyAgICBsdWFfYXNzZXJ0KHV2LT51LmwubmV4dC0+dS5sLnByZXYgPT0gdXYgJiYgdXYtPnUubC5wcmV2LT51LmwubmV4dCA9PSB1dik7CisgICAgaWYgKGlzZ3JheShvYmoyZ2NvKHV2KSkpCisgICAgICBtYXJrdmFsdWUoZywgdXYtPnYpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgYXRvbWljIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgc2l6ZV90IHVkc2l6ZTsgIC8qIHRvdGFsIHNpemUgb2YgdXNlcmRhdGEgdG8gYmUgZmluYWxpemVkICovCisgIC8qIHJlbWFyayBvY2Nhc2lvbmFsIHVwdmFsdWVzIG9mIChtYXliZSkgZGVhZCB0aHJlYWRzICovCisgIHJlbWFya3VwdmFscyhnKTsKKyAgLyogdHJhdmVyc2Ugb2JqZWN0cyBjYXV0Y2ggYnkgd3JpdGUgYmFycmllciBhbmQgYnkgJ3JlbWFya3VwdmFscycgKi8KKyAgcHJvcGFnYXRlYWxsKGcpOworICAvKiByZW1hcmsgd2VhayB0YWJsZXMgKi8KKyAgZy0+Z3JheSA9IGctPndlYWs7CisgIGctPndlYWsgPSBOVUxMOworICBsdWFfYXNzZXJ0KCFpc3doaXRlKG9iajJnY28oZy0+bWFpbnRocmVhZCkpKTsKKyAgbWFya29iamVjdChnLCBMKTsgIC8qIG1hcmsgcnVubmluZyB0aHJlYWQgKi8KKyAgbWFya210KGcpOyAgLyogbWFyayBiYXNpYyBtZXRhdGFibGVzIChhZ2FpbikgKi8KKyAgcHJvcGFnYXRlYWxsKGcpOworICAvKiByZW1hcmsgZ3JheSBhZ2FpbiAqLworICBnLT5ncmF5ID0gZy0+Z3JheWFnYWluOworICBnLT5ncmF5YWdhaW4gPSBOVUxMOworICBwcm9wYWdhdGVhbGwoZyk7CisgIHVkc2l6ZSA9IGx1YUNfc2VwYXJhdGV1ZGF0YShMLCAwKTsgIC8qIHNlcGFyYXRlIHVzZXJkYXRhIHRvIGJlIGZpbmFsaXplZCAqLworICBtYXJrdG11KGcpOyAgLyogbWFyayBgcHJlc2VydmVkJyB1c2VyZGF0YSAqLworICB1ZHNpemUgKz0gcHJvcGFnYXRlYWxsKGcpOyAgLyogcmVtYXJrLCB0byBwcm9wYWdhdGUgYHByZXNlcnZlbmVzcycgKi8KKyAgY2xlYXJ0YWJsZShnLT53ZWFrKTsgIC8qIHJlbW92ZSBjb2xsZWN0ZWQgb2JqZWN0cyBmcm9tIHdlYWsgdGFibGVzICovCisgIC8qIGZsaXAgY3VycmVudCB3aGl0ZSAqLworICBnLT5jdXJyZW50d2hpdGUgPSBjYXN0X2J5dGUob3RoZXJ3aGl0ZShnKSk7CisgIGctPnN3ZWVwc3RyZ2MgPSAwOworICBnLT5zd2VlcGdjID0gJmctPnJvb3RnYzsKKyAgZy0+Z2NzdGF0ZSA9IEdDU3N3ZWVwc3RyaW5nOworICBnLT5lc3RpbWF0ZSA9IGctPnRvdGFsYnl0ZXMgLSB1ZHNpemU7ICAvKiBmaXJzdCBlc3RpbWF0ZSAqLworfQorCisKK3N0YXRpYyBsX21lbSBzaW5nbGVzdGVwIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgLypsdWFfY2hlY2ttZW1vcnkoTCk7Ki8KKyAgc3dpdGNoIChnLT5nY3N0YXRlKSB7CisgICAgY2FzZSBHQ1NwYXVzZTogeworICAgICAgbWFya3Jvb3QoTCk7ICAvKiBzdGFydCBhIG5ldyBjb2xsZWN0aW9uICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2FzZSBHQ1Nwcm9wYWdhdGU6IHsKKyAgICAgIGlmIChnLT5ncmF5KQorICAgICAgICByZXR1cm4gcHJvcGFnYXRlbWFyayhnKTsKKyAgICAgIGVsc2UgeyAgLyogbm8gbW9yZSBgZ3JheScgb2JqZWN0cyAqLworICAgICAgICBhdG9taWMoTCk7ICAvKiBmaW5pc2ggbWFyayBwaGFzZSAqLworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBHQ1Nzd2VlcHN0cmluZzogeworICAgICAgbHVfbWVtIG9sZCA9IGctPnRvdGFsYnl0ZXM7CisgICAgICBzd2VlcHdob2xlbGlzdChMLCAmZy0+c3RydC5oYXNoW2ctPnN3ZWVwc3RyZ2MrK10pOworICAgICAgaWYgKGctPnN3ZWVwc3RyZ2MgPj0gZy0+c3RydC5zaXplKSAgLyogbm90aGluZyBtb3JlIHRvIHN3ZWVwPyAqLworICAgICAgICBnLT5nY3N0YXRlID0gR0NTc3dlZXA7ICAvKiBlbmQgc3dlZXAtc3RyaW5nIHBoYXNlICovCisgICAgICBsdWFfYXNzZXJ0KG9sZCA+PSBnLT50b3RhbGJ5dGVzKTsKKyAgICAgIGctPmVzdGltYXRlIC09IG9sZCAtIGctPnRvdGFsYnl0ZXM7CisgICAgICByZXR1cm4gR0NTV0VFUENPU1Q7CisgICAgfQorICAgIGNhc2UgR0NTc3dlZXA6IHsKKyAgICAgIGx1X21lbSBvbGQgPSBnLT50b3RhbGJ5dGVzOworICAgICAgZy0+c3dlZXBnYyA9IHN3ZWVwbGlzdChMLCBnLT5zd2VlcGdjLCBHQ1NXRUVQTUFYKTsKKyAgICAgIGlmICgqZy0+c3dlZXBnYyA9PSBOVUxMKSB7ICAvKiBub3RoaW5nIG1vcmUgdG8gc3dlZXA/ICovCisgICAgICAgIGNoZWNrU2l6ZXMoTCk7CisgICAgICAgIGctPmdjc3RhdGUgPSBHQ1NmaW5hbGl6ZTsgIC8qIGVuZCBzd2VlcCBwaGFzZSAqLworICAgICAgfQorICAgICAgbHVhX2Fzc2VydChvbGQgPj0gZy0+dG90YWxieXRlcyk7CisgICAgICBnLT5lc3RpbWF0ZSAtPSBvbGQgLSBnLT50b3RhbGJ5dGVzOworICAgICAgcmV0dXJuIEdDU1dFRVBNQVgqR0NTV0VFUENPU1Q7CisgICAgfQorICAgIGNhc2UgR0NTZmluYWxpemU6IHsKKyAgICAgIGlmIChnLT50bXVkYXRhKSB7CisgICAgICAgIEdDVE0oTCk7CisgICAgICAgIGlmIChnLT5lc3RpbWF0ZSA+IEdDRklOQUxJWkVDT1NUKQorICAgICAgICAgIGctPmVzdGltYXRlIC09IEdDRklOQUxJWkVDT1NUOworICAgICAgICByZXR1cm4gR0NGSU5BTElaRUNPU1Q7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgZy0+Z2NzdGF0ZSA9IEdDU3BhdXNlOyAgLyogZW5kIGNvbGxlY3Rpb24gKi8KKyAgICAgICAgZy0+Z2NkZXB0ID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGRlZmF1bHQ6IGx1YV9hc3NlcnQoMCk7IHJldHVybiAwOworICB9Cit9CisKKwordm9pZCBsdWFDX3N0ZXAgKGx1YV9TdGF0ZSAqTCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBsX21lbSBsaW0gPSAoR0NTVEVQU0laRS8xMDApICogZy0+Z2NzdGVwbXVsOworICBpZiAobGltID09IDApCisgICAgbGltID0gKE1BWF9MVU1FTS0xKS8yOyAgLyogbm8gbGltaXQgKi8KKyAgZy0+Z2NkZXB0ICs9IGctPnRvdGFsYnl0ZXMgLSBnLT5HQ3RocmVzaG9sZDsKKyAgZG8geworICAgIGxpbSAtPSBzaW5nbGVzdGVwKEwpOworICAgIGlmIChnLT5nY3N0YXRlID09IEdDU3BhdXNlKQorICAgICAgYnJlYWs7CisgIH0gd2hpbGUgKGxpbSA+IDApOworICBpZiAoZy0+Z2NzdGF0ZSAhPSBHQ1NwYXVzZSkgeworICAgIGlmIChnLT5nY2RlcHQgPCBHQ1NURVBTSVpFKQorICAgICAgZy0+R0N0aHJlc2hvbGQgPSBnLT50b3RhbGJ5dGVzICsgR0NTVEVQU0laRTsgIC8qIC0gbGltL2ctPmdjc3RlcG11bDsqLworICAgIGVsc2UgeworICAgICAgZy0+Z2NkZXB0IC09IEdDU1RFUFNJWkU7CisgICAgICBnLT5HQ3RocmVzaG9sZCA9IGctPnRvdGFsYnl0ZXM7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGx1YV9hc3NlcnQoZy0+dG90YWxieXRlcyA+PSBnLT5lc3RpbWF0ZSk7CisgICAgc2V0dGhyZXNob2xkKGcpOworICB9Cit9CisKKwordm9pZCBsdWFDX2Z1bGxnYyAobHVhX1N0YXRlICpMKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGlmIChnLT5nY3N0YXRlIDw9IEdDU3Byb3BhZ2F0ZSkgeworICAgIC8qIHJlc2V0IHN3ZWVwIG1hcmtzIHRvIHN3ZWVwIGFsbCBlbGVtZW50cyAocmV0dXJuaW5nIHRoZW0gdG8gd2hpdGUpICovCisgICAgZy0+c3dlZXBzdHJnYyA9IDA7CisgICAgZy0+c3dlZXBnYyA9ICZnLT5yb290Z2M7CisgICAgLyogcmVzZXQgb3RoZXIgY29sbGVjdG9yIGxpc3RzICovCisgICAgZy0+Z3JheSA9IE5VTEw7CisgICAgZy0+Z3JheWFnYWluID0gTlVMTDsKKyAgICBnLT53ZWFrID0gTlVMTDsKKyAgICBnLT5nY3N0YXRlID0gR0NTc3dlZXBzdHJpbmc7CisgIH0KKyAgbHVhX2Fzc2VydChnLT5nY3N0YXRlICE9IEdDU3BhdXNlICYmIGctPmdjc3RhdGUgIT0gR0NTcHJvcGFnYXRlKTsKKyAgLyogZmluaXNoIGFueSBwZW5kaW5nIHN3ZWVwIHBoYXNlICovCisgIHdoaWxlIChnLT5nY3N0YXRlICE9IEdDU2ZpbmFsaXplKSB7CisgICAgbHVhX2Fzc2VydChnLT5nY3N0YXRlID09IEdDU3N3ZWVwc3RyaW5nIHx8IGctPmdjc3RhdGUgPT0gR0NTc3dlZXApOworICAgIHNpbmdsZXN0ZXAoTCk7CisgIH0KKyAgbWFya3Jvb3QoTCk7CisgIHdoaWxlIChnLT5nY3N0YXRlICE9IEdDU3BhdXNlKSB7CisgICAgc2luZ2xlc3RlcChMKTsKKyAgfQorICBzZXR0aHJlc2hvbGQoZyk7Cit9CisKKwordm9pZCBsdWFDX2JhcnJpZXJmIChsdWFfU3RhdGUgKkwsIEdDT2JqZWN0ICpvLCBHQ09iamVjdCAqdikgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBsdWFfYXNzZXJ0KGlzYmxhY2sobykgJiYgaXN3aGl0ZSh2KSAmJiAhaXNkZWFkKGcsIHYpICYmICFpc2RlYWQoZywgbykpOworICBsdWFfYXNzZXJ0KGctPmdjc3RhdGUgIT0gR0NTZmluYWxpemUgJiYgZy0+Z2NzdGF0ZSAhPSBHQ1NwYXVzZSk7CisgIGx1YV9hc3NlcnQodHR5cGUoJm8tPmdjaCkgIT0gTFVBX1RUQUJMRSk7CisgIC8qIG11c3Qga2VlcCBpbnZhcmlhbnQ/ICovCisgIGlmIChnLT5nY3N0YXRlID09IEdDU3Byb3BhZ2F0ZSkKKyAgICByZWFsbHltYXJrb2JqZWN0KGcsIHYpOyAgLyogcmVzdG9yZSBpbnZhcmlhbnQgKi8KKyAgZWxzZSAgLyogZG9uJ3QgbWluZCAqLworICAgIG1ha2V3aGl0ZShnLCBvKTsgIC8qIG1hcmsgYXMgd2hpdGUganVzdCB0byBhdm9pZCBvdGhlciBiYXJyaWVycyAqLworfQorCisKK3ZvaWQgbHVhQ19iYXJyaWVyYmFjayAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBHQ09iamVjdCAqbyA9IG9iajJnY28odCk7CisgIGx1YV9hc3NlcnQoaXNibGFjayhvKSAmJiAhaXNkZWFkKGcsIG8pKTsKKyAgbHVhX2Fzc2VydChnLT5nY3N0YXRlICE9IEdDU2ZpbmFsaXplICYmIGctPmdjc3RhdGUgIT0gR0NTcGF1c2UpOworICBibGFjazJncmF5KG8pOyAgLyogbWFrZSB0YWJsZSBncmF5IChhZ2FpbikgKi8KKyAgdC0+Z2NsaXN0ID0gZy0+Z3JheWFnYWluOworICBnLT5ncmF5YWdhaW4gPSBvOworfQorCisKK3ZvaWQgbHVhQ19saW5rIChsdWFfU3RhdGUgKkwsIEdDT2JqZWN0ICpvLCBsdV9ieXRlIHR0KSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIG8tPmdjaC5uZXh0ID0gZy0+cm9vdGdjOworICBnLT5yb290Z2MgPSBvOworICBvLT5nY2gubWFya2VkID0gbHVhQ193aGl0ZShnKTsKKyAgby0+Z2NoLnR0ID0gdHQ7Cit9CisKKwordm9pZCBsdWFDX2xpbmt1cHZhbCAobHVhX1N0YXRlICpMLCBVcFZhbCAqdXYpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgR0NPYmplY3QgKm8gPSBvYmoyZ2NvKHV2KTsKKyAgby0+Z2NoLm5leHQgPSBnLT5yb290Z2M7ICAvKiBsaW5rIHVwdmFsdWUgaW50byBgcm9vdGdjJyBsaXN0ICovCisgIGctPnJvb3RnYyA9IG87CisgIGlmIChpc2dyYXkobykpIHsgCisgICAgaWYgKGctPmdjc3RhdGUgPT0gR0NTcHJvcGFnYXRlKSB7CisgICAgICBncmF5MmJsYWNrKG8pOyAgLyogY2xvc2VkIHVwdmFsdWVzIG5lZWQgYmFycmllciAqLworICAgICAgbHVhQ19iYXJyaWVyKEwsIHV2LCB1di0+dik7CisgICAgfQorICAgIGVsc2UgeyAgLyogc3dlZXAgcGhhc2U6IHN3ZWVwIGl0ICh0dXJuaW5nIGl0IGludG8gd2hpdGUpICovCisgICAgICBtYWtld2hpdGUoZywgbyk7CisgICAgICBsdWFfYXNzZXJ0KGctPmdjc3RhdGUgIT0gR0NTZmluYWxpemUgJiYgZy0+Z2NzdGF0ZSAhPSBHQ1NwYXVzZSk7CisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbGdjLmggYi9sdWEtNS4xLjQvc3JjL2xnYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOGRjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xnYy5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorKiogJElkOiBsZ2MuaCx2IDIuMTUuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogR2FyYmFnZSBDb2xsZWN0b3IKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGxnY19oCisjZGVmaW5lIGxnY19oCisKKworI2luY2x1ZGUgImxvYmplY3QuaCIKKworCisvKgorKiogUG9zc2libGUgc3RhdGVzIG9mIHRoZSBHYXJiYWdlIENvbGxlY3RvcgorKi8KKyNkZWZpbmUgR0NTcGF1c2UJMAorI2RlZmluZSBHQ1Nwcm9wYWdhdGUJMQorI2RlZmluZSBHQ1Nzd2VlcHN0cmluZwkyCisjZGVmaW5lIEdDU3N3ZWVwCTMKKyNkZWZpbmUgR0NTZmluYWxpemUJNAorCisKKy8qCisqKiBzb21lIHVzZXJmdWwgYml0IHRyaWNrcworKi8KKyNkZWZpbmUgcmVzZXRiaXRzKHgsbSkJKCh4KSAmPSBjYXN0KGx1X2J5dGUsIH4obSkpKQorI2RlZmluZSBzZXRiaXRzKHgsbSkJKCh4KSB8PSAobSkpCisjZGVmaW5lIHRlc3RiaXRzKHgsbSkJKCh4KSAmIChtKSkKKyNkZWZpbmUgYml0bWFzayhiKQkoMTw8KGIpKQorI2RlZmluZSBiaXQybWFzayhiMSxiMikJKGJpdG1hc2soYjEpIHwgYml0bWFzayhiMikpCisjZGVmaW5lIGxfc2V0Yml0KHgsYikJc2V0Yml0cyh4LCBiaXRtYXNrKGIpKQorI2RlZmluZSByZXNldGJpdCh4LGIpCXJlc2V0Yml0cyh4LCBiaXRtYXNrKGIpKQorI2RlZmluZSB0ZXN0Yml0KHgsYikJdGVzdGJpdHMoeCwgYml0bWFzayhiKSkKKyNkZWZpbmUgc2V0MmJpdHMoeCxiMSxiMikJc2V0Yml0cyh4LCAoYml0Mm1hc2soYjEsIGIyKSkpCisjZGVmaW5lIHJlc2V0MmJpdHMoeCxiMSxiMikJcmVzZXRiaXRzKHgsIChiaXQybWFzayhiMSwgYjIpKSkKKyNkZWZpbmUgdGVzdDJiaXRzKHgsYjEsYjIpCXRlc3RiaXRzKHgsIChiaXQybWFzayhiMSwgYjIpKSkKKworCisKKy8qCisqKiBMYXlvdXQgZm9yIGJpdCB1c2UgaW4gYG1hcmtlZCcgZmllbGQ6CisqKiBiaXQgMCAtIG9iamVjdCBpcyB3aGl0ZSAodHlwZSAwKQorKiogYml0IDEgLSBvYmplY3QgaXMgd2hpdGUgKHR5cGUgMSkKKyoqIGJpdCAyIC0gb2JqZWN0IGlzIGJsYWNrCisqKiBiaXQgMyAtIGZvciB1c2VyZGF0YTogaGFzIGJlZW4gZmluYWxpemVkCisqKiBiaXQgMyAtIGZvciB0YWJsZXM6IGhhcyB3ZWFrIGtleXMKKyoqIGJpdCA0IC0gZm9yIHRhYmxlczogaGFzIHdlYWsgdmFsdWVzCisqKiBiaXQgNSAtIG9iamVjdCBpcyBmaXhlZCAoc2hvdWxkIG5vdCBiZSBjb2xsZWN0ZWQpCisqKiBiaXQgNiAtIG9iamVjdCBpcyAic3VwZXIiIGZpeGVkIChvbmx5IHRoZSBtYWluIHRocmVhZCkKKyovCisKKworI2RlZmluZSBXSElURTBCSVQJMAorI2RlZmluZSBXSElURTFCSVQJMQorI2RlZmluZSBCTEFDS0JJVAkyCisjZGVmaW5lIEZJTkFMSVpFREJJVAkzCisjZGVmaW5lIEtFWVdFQUtCSVQJMworI2RlZmluZSBWQUxVRVdFQUtCSVQJNAorI2RlZmluZSBGSVhFREJJVAk1CisjZGVmaW5lIFNGSVhFREJJVAk2CisjZGVmaW5lIFdISVRFQklUUwliaXQybWFzayhXSElURTBCSVQsIFdISVRFMUJJVCkKKworCisjZGVmaW5lIGlzd2hpdGUoeCkgICAgICB0ZXN0MmJpdHMoKHgpLT5nY2gubWFya2VkLCBXSElURTBCSVQsIFdISVRFMUJJVCkKKyNkZWZpbmUgaXNibGFjayh4KSAgICAgIHRlc3RiaXQoKHgpLT5nY2gubWFya2VkLCBCTEFDS0JJVCkKKyNkZWZpbmUgaXNncmF5KHgpCSghaXNibGFjayh4KSAmJiAhaXN3aGl0ZSh4KSkKKworI2RlZmluZSBvdGhlcndoaXRlKGcpCShnLT5jdXJyZW50d2hpdGUgXiBXSElURUJJVFMpCisjZGVmaW5lIGlzZGVhZChnLHYpCSgodiktPmdjaC5tYXJrZWQgJiBvdGhlcndoaXRlKGcpICYgV0hJVEVCSVRTKQorCisjZGVmaW5lIGNoYW5nZXdoaXRlKHgpCSgoeCktPmdjaC5tYXJrZWQgXj0gV0hJVEVCSVRTKQorI2RlZmluZSBncmF5MmJsYWNrKHgpCWxfc2V0Yml0KCh4KS0+Z2NoLm1hcmtlZCwgQkxBQ0tCSVQpCisKKyNkZWZpbmUgdmFsaXN3aGl0ZSh4KQkoaXNjb2xsZWN0YWJsZSh4KSAmJiBpc3doaXRlKGdjdmFsdWUoeCkpKQorCisjZGVmaW5lIGx1YUNfd2hpdGUoZykJY2FzdChsdV9ieXRlLCAoZyktPmN1cnJlbnR3aGl0ZSAmIFdISVRFQklUUykKKworCisjZGVmaW5lIGx1YUNfY2hlY2tHQyhMKSB7IFwKKyAgY29uZGhhcmRzdGFja3Rlc3RzKGx1YURfcmVhbGxvY3N0YWNrKEwsIEwtPnN0YWNrc2l6ZSAtIEVYVFJBX1NUQUNLIC0gMSkpOyBcCisgIGlmIChHKEwpLT50b3RhbGJ5dGVzID49IEcoTCktPkdDdGhyZXNob2xkKSBcCisJbHVhQ19zdGVwKEwpOyB9CisKKworI2RlZmluZSBsdWFDX2JhcnJpZXIoTCxwLHYpIHsgaWYgKHZhbGlzd2hpdGUodikgJiYgaXNibGFjayhvYmoyZ2NvKHApKSkgIFwKKwlsdWFDX2JhcnJpZXJmKEwsb2JqMmdjbyhwKSxnY3ZhbHVlKHYpKTsgfQorCisjZGVmaW5lIGx1YUNfYmFycmllcnQoTCx0LHYpIHsgaWYgKHZhbGlzd2hpdGUodikgJiYgaXNibGFjayhvYmoyZ2NvKHQpKSkgIFwKKwlsdWFDX2JhcnJpZXJiYWNrKEwsdCk7IH0KKworI2RlZmluZSBsdWFDX29iamJhcnJpZXIoTCxwLG8pICBcCisJeyBpZiAoaXN3aGl0ZShvYmoyZ2NvKG8pKSAmJiBpc2JsYWNrKG9iajJnY28ocCkpKSBcCisJCWx1YUNfYmFycmllcmYoTCxvYmoyZ2NvKHApLG9iajJnY28obykpOyB9CisKKyNkZWZpbmUgbHVhQ19vYmpiYXJyaWVydChMLHQsbykgIFwKKyAgIHsgaWYgKGlzd2hpdGUob2JqMmdjbyhvKSkgJiYgaXNibGFjayhvYmoyZ2NvKHQpKSkgbHVhQ19iYXJyaWVyYmFjayhMLHQpOyB9CisKK0xVQUlfRlVOQyBzaXplX3QgbHVhQ19zZXBhcmF0ZXVkYXRhIChsdWFfU3RhdGUgKkwsIGludCBhbGwpOworTFVBSV9GVU5DIHZvaWQgbHVhQ19jYWxsR0NUTSAobHVhX1N0YXRlICpMKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUNfZnJlZWFsbCAobHVhX1N0YXRlICpMKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUNfc3RlcCAobHVhX1N0YXRlICpMKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUNfZnVsbGdjIChsdWFfU3RhdGUgKkwpOworTFVBSV9GVU5DIHZvaWQgbHVhQ19saW5rIChsdWFfU3RhdGUgKkwsIEdDT2JqZWN0ICpvLCBsdV9ieXRlIHR0KTsKK0xVQUlfRlVOQyB2b2lkIGx1YUNfbGlua3VwdmFsIChsdWFfU3RhdGUgKkwsIFVwVmFsICp1dik7CitMVUFJX0ZVTkMgdm9pZCBsdWFDX2JhcnJpZXJmIChsdWFfU3RhdGUgKkwsIEdDT2JqZWN0ICpvLCBHQ09iamVjdCAqdik7CitMVUFJX0ZVTkMgdm9pZCBsdWFDX2JhcnJpZXJiYWNrIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbGluaXQuYyBiL2x1YS01LjEuNC9zcmMvbGluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY5MGRmCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9saW5pdC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisqKiAkSWQ6IGxpbml0LmMsdiAxLjE0LjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIEluaXRpYWxpemF0aW9uIG9mIGxpYnJhcmllcyBmb3IgbHVhLmMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNkZWZpbmUgbGluaXRfYworI2RlZmluZSBMVUFfTElCCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImx1YWxpYi5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgbHVhbGlic1tdID0geworICB7IiIsIGx1YW9wZW5fYmFzZX0sCisgIHtMVUFfTE9BRExJQk5BTUUsIGx1YW9wZW5fcGFja2FnZX0sCisgIHtMVUFfVEFCTElCTkFNRSwgbHVhb3Blbl90YWJsZX0sCisgIHtMVUFfSU9MSUJOQU1FLCBsdWFvcGVuX2lvfSwKKyAge0xVQV9PU0xJQk5BTUUsIGx1YW9wZW5fb3N9LAorICB7TFVBX1NUUkxJQk5BTUUsIGx1YW9wZW5fc3RyaW5nfSwKKyAge0xVQV9NQVRITElCTkFNRSwgbHVhb3Blbl9tYXRofSwKKyAge0xVQV9EQkxJQk5BTUUsIGx1YW9wZW5fZGVidWd9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfb3BlbmxpYnMgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBsdWFMX1JlZyAqbGliID0gbHVhbGliczsKKyAgZm9yICg7IGxpYi0+ZnVuYzsgbGliKyspIHsKKyAgICBsdWFfcHVzaGNmdW5jdGlvbihMLCBsaWItPmZ1bmMpOworICAgIGx1YV9wdXNoc3RyaW5nKEwsIGxpYi0+bmFtZSk7CisgICAgbHVhX2NhbGwoTCwgMSwgMCk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9saW9saWIuYyBiL2x1YS01LjEuNC9zcmMvbGlvbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ZWQxYwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbGlvbGliLmMKQEAgLTAsMCArMSw1NTMgQEAKKy8qCisqKiAkSWQ6IGxpb2xpYi5jLHYgMi43My4xLjMgMjAwOC8wMS8xOCAxNzo0Nzo0MyByb2JlcnRvIEV4cCAkCisqKiBTdGFuZGFyZCBJL08gKGFuZCBzeXN0ZW0pIGxpYnJhcnkKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbGlvbGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworCisjZGVmaW5lIElPX0lOUFVUCTEKKyNkZWZpbmUgSU9fT1VUUFVUCTIKKworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZm5hbWVzW10gPSB7ImlucHV0IiwgIm91dHB1dCJ9OworCisKK3N0YXRpYyBpbnQgcHVzaHJlc3VsdCAobHVhX1N0YXRlICpMLCBpbnQgaSwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgaW50IGVuID0gZXJybm87ICAvKiBjYWxscyB0byBMdWEgQVBJIG1heSBjaGFuZ2UgdGhpcyB2YWx1ZSAqLworICBpZiAoaSkgeworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIHsKKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgICBpZiAoZmlsZW5hbWUpCisgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlbikpOworICAgIGVsc2UKKyAgICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiJXMiLCBzdHJlcnJvcihlbikpOworICAgIGx1YV9wdXNoaW50ZWdlcihMLCBlbik7CisgICAgcmV0dXJuIDM7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBmaWxlZXJyb3IgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZywgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgbHVhX3B1c2hmc3RyaW5nKEwsICIlczogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgbHVhTF9hcmdlcnJvcihMLCBhcmcsIGx1YV90b3N0cmluZyhMLCAtMSkpOworfQorCisKKyNkZWZpbmUgdG9maWxlcChMKQkoKEZJTEUgKiopbHVhTF9jaGVja3VkYXRhKEwsIDEsIExVQV9GSUxFSEFORExFKSkKKworCitzdGF0aWMgaW50IGlvX3R5cGUgKGx1YV9TdGF0ZSAqTCkgeworICB2b2lkICp1ZDsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgdWQgPSBsdWFfdG91c2VyZGF0YShMLCAxKTsKKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCBMVUFfRklMRUhBTkRMRSk7CisgIGlmICh1ZCA9PSBOVUxMIHx8ICFsdWFfZ2V0bWV0YXRhYmxlKEwsIDEpIHx8ICFsdWFfcmF3ZXF1YWwoTCwgLTIsIC0xKSkKKyAgICBsdWFfcHVzaG5pbChMKTsgIC8qIG5vdCBhIGZpbGUgKi8KKyAgZWxzZSBpZiAoKigoRklMRSAqKil1ZCkgPT0gTlVMTCkKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImNsb3NlZCBmaWxlIik7CisgIGVsc2UKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImZpbGUiKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIEZJTEUgKnRvZmlsZSAobHVhX1N0YXRlICpMKSB7CisgIEZJTEUgKipmID0gdG9maWxlcChMKTsKKyAgaWYgKCpmID09IE5VTEwpCisgICAgbHVhTF9lcnJvcihMLCAiYXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZmlsZSIpOworICByZXR1cm4gKmY7Cit9CisKKworCisvKgorKiogV2hlbiBjcmVhdGluZyBmaWxlIGhhbmRsZXMsIGFsd2F5cyBjcmVhdGVzIGEgYGNsb3NlZCcgZmlsZSBoYW5kbGUKKyoqIGJlZm9yZSBvcGVuaW5nIHRoZSBhY3R1YWwgZmlsZTsgc28sIGlmIHRoZXJlIGlzIGEgbWVtb3J5IGVycm9yLCB0aGUKKyoqIGZpbGUgaXMgbm90IGxlZnQgb3BlbmVkLgorKi8KK3N0YXRpYyBGSUxFICoqbmV3ZmlsZSAobHVhX1N0YXRlICpMKSB7CisgIEZJTEUgKipwZiA9IChGSUxFICoqKWx1YV9uZXd1c2VyZGF0YShMLCBzaXplb2YoRklMRSAqKSk7CisgICpwZiA9IE5VTEw7ICAvKiBmaWxlIGhhbmRsZSBpcyBjdXJyZW50bHkgYGNsb3NlZCcgKi8KKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgTFVBX0ZJTEVIQU5ETEUpOworICBsdWFfc2V0bWV0YXRhYmxlKEwsIC0yKTsKKyAgcmV0dXJuIHBmOworfQorCisKKy8qCisqKiBmdW5jdGlvbiB0byAobm90KSBjbG9zZSB0aGUgc3RhbmRhcmQgZmlsZXMgc3RkaW4sIHN0ZG91dCwgYW5kIHN0ZGVycgorKi8KK3N0YXRpYyBpbnQgaW9fbm9jbG9zZSAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobmlsKEwpOworICBsdWFfcHVzaGxpdGVyYWwoTCwgImNhbm5vdCBjbG9zZSBzdGFuZGFyZCBmaWxlIik7CisgIHJldHVybiAyOworfQorCisKKy8qCisqKiBmdW5jdGlvbiB0byBjbG9zZSAncG9wZW4nIGZpbGVzCisqLworc3RhdGljIGludCBpb19wY2xvc2UgKGx1YV9TdGF0ZSAqTCkgeworICBGSUxFICoqcCA9IHRvZmlsZXAoTCk7CisgIGludCBvayA9IGx1YV9wY2xvc2UoTCwgKnApOworICAqcCA9IE5VTEw7CisgIHJldHVybiBwdXNocmVzdWx0KEwsIG9rLCBOVUxMKTsKK30KKworCisvKgorKiogZnVuY3Rpb24gdG8gY2xvc2UgcmVndWxhciBmaWxlcworKi8KK3N0YXRpYyBpbnQgaW9fZmNsb3NlIChsdWFfU3RhdGUgKkwpIHsKKyAgRklMRSAqKnAgPSB0b2ZpbGVwKEwpOworICBpbnQgb2sgPSAoZmNsb3NlKCpwKSA9PSAwKTsKKyAgKnAgPSBOVUxMOworICByZXR1cm4gcHVzaHJlc3VsdChMLCBvaywgTlVMTCk7Cit9CisKKworc3RhdGljIGludCBhdXhfY2xvc2UgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfZ2V0ZmVudihMLCAxKTsKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCAiX19jbG9zZSIpOworICByZXR1cm4gKGx1YV90b2NmdW5jdGlvbihMLCAtMSkpKEwpOworfQorCisKK3N0YXRpYyBpbnQgaW9fY2xvc2UgKGx1YV9TdGF0ZSAqTCkgeworICBpZiAobHVhX2lzbm9uZShMLCAxKSkKKyAgICBsdWFfcmF3Z2V0aShMLCBMVUFfRU5WSVJPTklOREVYLCBJT19PVVRQVVQpOworICB0b2ZpbGUoTCk7ICAvKiBtYWtlIHN1cmUgYXJndW1lbnQgaXMgYSBmaWxlICovCisgIHJldHVybiBhdXhfY2xvc2UoTCk7Cit9CisKKworc3RhdGljIGludCBpb19nYyAobHVhX1N0YXRlICpMKSB7CisgIEZJTEUgKmYgPSAqdG9maWxlcChMKTsKKyAgLyogaWdub3JlIGNsb3NlZCBmaWxlcyAqLworICBpZiAoZiAhPSBOVUxMKQorICAgIGF1eF9jbG9zZShMKTsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpb190b3N0cmluZyAobHVhX1N0YXRlICpMKSB7CisgIEZJTEUgKmYgPSAqdG9maWxlcChMKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImZpbGUgKGNsb3NlZCkiKTsKKyAgZWxzZQorICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiZmlsZSAoJXApIiwgZik7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgaW9fb3BlbiAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgY29uc3QgY2hhciAqbW9kZSA9IGx1YUxfb3B0c3RyaW5nKEwsIDIsICJyIik7CisgIEZJTEUgKipwZiA9IG5ld2ZpbGUoTCk7CisgICpwZiA9IGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKKyAgcmV0dXJuICgqcGYgPT0gTlVMTCkgPyBwdXNocmVzdWx0KEwsIDAsIGZpbGVuYW1lKSA6IDE7Cit9CisKKworLyoKKyoqIHRoaXMgZnVuY3Rpb24gaGFzIGEgc2VwYXJhdGVkIGVudmlyb25tZW50LCB3aGljaCBkZWZpbmVzIHRoZQorKiogY29ycmVjdCBfX2Nsb3NlIGZvciAncG9wZW4nIGZpbGVzCisqLworc3RhdGljIGludCBpb19wb3BlbiAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgY29uc3QgY2hhciAqbW9kZSA9IGx1YUxfb3B0c3RyaW5nKEwsIDIsICJyIik7CisgIEZJTEUgKipwZiA9IG5ld2ZpbGUoTCk7CisgICpwZiA9IGx1YV9wb3BlbihMLCBmaWxlbmFtZSwgbW9kZSk7CisgIHJldHVybiAoKnBmID09IE5VTEwpID8gcHVzaHJlc3VsdChMLCAwLCBmaWxlbmFtZSkgOiAxOworfQorCisKK3N0YXRpYyBpbnQgaW9fdG1wZmlsZSAobHVhX1N0YXRlICpMKSB7CisgIEZJTEUgKipwZiA9IG5ld2ZpbGUoTCk7CisgICpwZiA9IHRtcGZpbGUoKTsKKyAgcmV0dXJuICgqcGYgPT0gTlVMTCkgPyBwdXNocmVzdWx0KEwsIDAsIE5VTEwpIDogMTsKK30KKworCitzdGF0aWMgRklMRSAqZ2V0aW9maWxlIChsdWFfU3RhdGUgKkwsIGludCBmaW5kZXgpIHsKKyAgRklMRSAqZjsKKyAgbHVhX3Jhd2dldGkoTCwgTFVBX0VOVklST05JTkRFWCwgZmluZGV4KTsKKyAgZiA9ICooRklMRSAqKilsdWFfdG91c2VyZGF0YShMLCAtMSk7CisgIGlmIChmID09IE5VTEwpCisgICAgbHVhTF9lcnJvcihMLCAic3RhbmRhcmQgJXMgZmlsZSBpcyBjbG9zZWQiLCBmbmFtZXNbZmluZGV4IC0gMV0pOworICByZXR1cm4gZjsKK30KKworCitzdGF0aWMgaW50IGdfaW9maWxlIChsdWFfU3RhdGUgKkwsIGludCBmLCBjb25zdCBjaGFyICptb2RlKSB7CisgIGlmICghbHVhX2lzbm9uZW9ybmlsKEwsIDEpKSB7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFfdG9zdHJpbmcoTCwgMSk7CisgICAgaWYgKGZpbGVuYW1lKSB7CisgICAgICBGSUxFICoqcGYgPSBuZXdmaWxlKEwpOworICAgICAgKnBmID0gZm9wZW4oZmlsZW5hbWUsIG1vZGUpOworICAgICAgaWYgKCpwZiA9PSBOVUxMKQorICAgICAgICBmaWxlZXJyb3IoTCwgMSwgZmlsZW5hbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRvZmlsZShMKTsgIC8qIGNoZWNrIHRoYXQgaXQncyBhIHZhbGlkIGZpbGUgaGFuZGxlICovCisgICAgICBsdWFfcHVzaHZhbHVlKEwsIDEpOworICAgIH0KKyAgICBsdWFfcmF3c2V0aShMLCBMVUFfRU5WSVJPTklOREVYLCBmKTsKKyAgfQorICAvKiByZXR1cm4gY3VycmVudCB2YWx1ZSAqLworICBsdWFfcmF3Z2V0aShMLCBMVUFfRU5WSVJPTklOREVYLCBmKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBpb19pbnB1dCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBnX2lvZmlsZShMLCBJT19JTlBVVCwgInIiKTsKK30KKworCitzdGF0aWMgaW50IGlvX291dHB1dCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBnX2lvZmlsZShMLCBJT19PVVRQVVQsICJ3Iik7Cit9CisKKworc3RhdGljIGludCBpb19yZWFkbGluZSAobHVhX1N0YXRlICpMKTsKKworCitzdGF0aWMgdm9pZCBhdXhfbGluZXMgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgaW50IHRvY2xvc2UpIHsKKyAgbHVhX3B1c2h2YWx1ZShMLCBpZHgpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgdG9jbG9zZSk7ICAvKiBjbG9zZS9ub3QgY2xvc2UgZmlsZSB3aGVuIGZpbmlzaGVkICovCisgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgaW9fcmVhZGxpbmUsIDIpOworfQorCisKK3N0YXRpYyBpbnQgZl9saW5lcyAobHVhX1N0YXRlICpMKSB7CisgIHRvZmlsZShMKTsgIC8qIGNoZWNrIHRoYXQgaXQncyBhIHZhbGlkIGZpbGUgaGFuZGxlICovCisgIGF1eF9saW5lcyhMLCAxLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBpb19saW5lcyAobHVhX1N0YXRlICpMKSB7CisgIGlmIChsdWFfaXNub25lb3JuaWwoTCwgMSkpIHsgIC8qIG5vIGFyZ3VtZW50cz8gKi8KKyAgICAvKiB3aWxsIGl0ZXJhdGUgb3ZlciBkZWZhdWx0IGlucHV0ICovCisgICAgbHVhX3Jhd2dldGkoTCwgTFVBX0VOVklST05JTkRFWCwgSU9fSU5QVVQpOworICAgIHJldHVybiBmX2xpbmVzKEwpOworICB9CisgIGVsc2UgeworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgICBGSUxFICoqcGYgPSBuZXdmaWxlKEwpOworICAgICpwZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmICgqcGYgPT0gTlVMTCkKKyAgICAgIGZpbGVlcnJvcihMLCAxLCBmaWxlbmFtZSk7CisgICAgYXV4X2xpbmVzKEwsIGx1YV9nZXR0b3AoTCksIDEpOworICAgIHJldHVybiAxOworICB9Cit9CisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFJFQUQKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworc3RhdGljIGludCByZWFkX251bWJlciAobHVhX1N0YXRlICpMLCBGSUxFICpmKSB7CisgIGx1YV9OdW1iZXIgZDsKKyAgaWYgKGZzY2FuZihmLCBMVUFfTlVNQkVSX1NDQU4sICZkKSA9PSAxKSB7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgZCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSByZXR1cm4gMDsgIC8qIHJlYWQgZmFpbHMgKi8KK30KKworCitzdGF0aWMgaW50IHRlc3RfZW9mIChsdWFfU3RhdGUgKkwsIEZJTEUgKmYpIHsKKyAgaW50IGMgPSBnZXRjKGYpOworICB1bmdldGMoYywgZik7CisgIGx1YV9wdXNobHN0cmluZyhMLCBOVUxMLCAwKTsKKyAgcmV0dXJuIChjICE9IEVPRik7Cit9CisKKworc3RhdGljIGludCByZWFkX2xpbmUgKGx1YV9TdGF0ZSAqTCwgRklMRSAqZikgeworICBsdWFMX0J1ZmZlciBiOworICBsdWFMX2J1ZmZpbml0KEwsICZiKTsKKyAgZm9yICg7OykgeworICAgIHNpemVfdCBsOworICAgIGNoYXIgKnAgPSBsdWFMX3ByZXBidWZmZXIoJmIpOworICAgIGlmIChmZ2V0cyhwLCBMVUFMX0JVRkZFUlNJWkUsIGYpID09IE5VTEwpIHsgIC8qIGVvZj8gKi8KKyAgICAgIGx1YUxfcHVzaHJlc3VsdCgmYik7ICAvKiBjbG9zZSBidWZmZXIgKi8KKyAgICAgIHJldHVybiAobHVhX29iamxlbihMLCAtMSkgPiAwKTsgIC8qIGNoZWNrIHdoZXRoZXIgcmVhZCBzb21ldGhpbmcgKi8KKyAgICB9CisgICAgbCA9IHN0cmxlbihwKTsKKyAgICBpZiAobCA9PSAwIHx8IHBbbC0xXSAhPSAnXG4nKQorICAgICAgbHVhTF9hZGRzaXplKCZiLCBsKTsKKyAgICBlbHNlIHsKKyAgICAgIGx1YUxfYWRkc2l6ZSgmYiwgbCAtIDEpOyAgLyogZG8gbm90IGluY2x1ZGUgYGVvbCcgKi8KKyAgICAgIGx1YUxfcHVzaHJlc3VsdCgmYik7ICAvKiBjbG9zZSBidWZmZXIgKi8KKyAgICAgIHJldHVybiAxOyAgLyogcmVhZCBhdCBsZWFzdCBhbiBgZW9sJyAqLworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBpbnQgcmVhZF9jaGFycyAobHVhX1N0YXRlICpMLCBGSUxFICpmLCBzaXplX3QgbikgeworICBzaXplX3QgcmxlbjsgIC8qIGhvdyBtdWNoIHRvIHJlYWQgKi8KKyAgc2l6ZV90IG5yOyAgLyogbnVtYmVyIG9mIGNoYXJzIGFjdHVhbGx5IHJlYWQgKi8KKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIHJsZW4gPSBMVUFMX0JVRkZFUlNJWkU7ICAvKiB0cnkgdG8gcmVhZCB0aGF0IG11Y2ggZWFjaCB0aW1lICovCisgIGRvIHsKKyAgICBjaGFyICpwID0gbHVhTF9wcmVwYnVmZmVyKCZiKTsKKyAgICBpZiAocmxlbiA+IG4pIHJsZW4gPSBuOyAgLyogY2Fubm90IHJlYWQgbW9yZSB0aGFuIGFza2VkICovCisgICAgbnIgPSBmcmVhZChwLCBzaXplb2YoY2hhciksIHJsZW4sIGYpOworICAgIGx1YUxfYWRkc2l6ZSgmYiwgbnIpOworICAgIG4gLT0gbnI7ICAvKiBzdGlsbCBoYXZlIHRvIHJlYWQgYG4nIGNoYXJzICovCisgIH0gd2hpbGUgKG4gPiAwICYmIG5yID09IHJsZW4pOyAgLyogdW50aWwgZW5kIG9mIGNvdW50IG9yIGVvZiAqLworICBsdWFMX3B1c2hyZXN1bHQoJmIpOyAgLyogY2xvc2UgYnVmZmVyICovCisgIHJldHVybiAobiA9PSAwIHx8IGx1YV9vYmpsZW4oTCwgLTEpID4gMCk7Cit9CisKKworc3RhdGljIGludCBnX3JlYWQgKGx1YV9TdGF0ZSAqTCwgRklMRSAqZiwgaW50IGZpcnN0KSB7CisgIGludCBuYXJncyA9IGx1YV9nZXR0b3AoTCkgLSAxOworICBpbnQgc3VjY2VzczsKKyAgaW50IG47CisgIGNsZWFyZXJyKGYpOworICBpZiAobmFyZ3MgPT0gMCkgeyAgLyogbm8gYXJndW1lbnRzPyAqLworICAgIHN1Y2Nlc3MgPSByZWFkX2xpbmUoTCwgZik7CisgICAgbiA9IGZpcnN0KzE7ICAvKiB0byByZXR1cm4gMSByZXN1bHQgKi8KKyAgfQorICBlbHNlIHsgIC8qIGVuc3VyZSBzdGFjayBzcGFjZSBmb3IgYWxsIHJlc3VsdHMgYW5kIGZvciBhdXhsaWIncyBidWZmZXIgKi8KKyAgICBsdWFMX2NoZWNrc3RhY2soTCwgbmFyZ3MrTFVBX01JTlNUQUNLLCAidG9vIG1hbnkgYXJndW1lbnRzIik7CisgICAgc3VjY2VzcyA9IDE7CisgICAgZm9yIChuID0gZmlyc3Q7IG5hcmdzLS0gJiYgc3VjY2VzczsgbisrKSB7CisgICAgICBpZiAobHVhX3R5cGUoTCwgbikgPT0gTFVBX1ROVU1CRVIpIHsKKyAgICAgICAgc2l6ZV90IGwgPSAoc2l6ZV90KWx1YV90b2ludGVnZXIoTCwgbik7CisgICAgICAgIHN1Y2Nlc3MgPSAobCA9PSAwKSA/IHRlc3RfZW9mKEwsIGYpIDogcmVhZF9jaGFycyhMLCBmLCBsKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb25zdCBjaGFyICpwID0gbHVhX3Rvc3RyaW5nKEwsIG4pOworICAgICAgICBsdWFMX2FyZ2NoZWNrKEwsIHAgJiYgcFswXSA9PSAnKicsIG4sICJpbnZhbGlkIG9wdGlvbiIpOworICAgICAgICBzd2l0Y2ggKHBbMV0pIHsKKyAgICAgICAgICBjYXNlICduJzogIC8qIG51bWJlciAqLworICAgICAgICAgICAgc3VjY2VzcyA9IHJlYWRfbnVtYmVyKEwsIGYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnbCc6ICAvKiBsaW5lICovCisgICAgICAgICAgICBzdWNjZXNzID0gcmVhZF9saW5lKEwsIGYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnYSc6ICAvKiBmaWxlICovCisgICAgICAgICAgICByZWFkX2NoYXJzKEwsIGYsIH4oKHNpemVfdCkwKSk7ICAvKiByZWFkIE1BWF9TSVpFX1QgY2hhcnMgKi8KKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAxOyAvKiBhbHdheXMgc3VjY2VzcyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBsdWFMX2FyZ2Vycm9yKEwsIG4sICJpbnZhbGlkIGZvcm1hdCIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChmZXJyb3IoZikpCisgICAgcmV0dXJuIHB1c2hyZXN1bHQoTCwgMCwgTlVMTCk7CisgIGlmICghc3VjY2VzcykgeworICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgbGFzdCByZXN1bHQgKi8KKyAgICBsdWFfcHVzaG5pbChMKTsgIC8qIHB1c2ggbmlsIGluc3RlYWQgKi8KKyAgfQorICByZXR1cm4gbiAtIGZpcnN0OworfQorCisKK3N0YXRpYyBpbnQgaW9fcmVhZCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBnX3JlYWQoTCwgZ2V0aW9maWxlKEwsIElPX0lOUFVUKSwgMSk7Cit9CisKKworc3RhdGljIGludCBmX3JlYWQgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gZ19yZWFkKEwsIHRvZmlsZShMKSwgMik7Cit9CisKKworc3RhdGljIGludCBpb19yZWFkbGluZSAobHVhX1N0YXRlICpMKSB7CisgIEZJTEUgKmYgPSAqKEZJTEUgKiopbHVhX3RvdXNlcmRhdGEoTCwgbHVhX3VwdmFsdWVpbmRleCgxKSk7CisgIGludCBzdWNlc3M7CisgIGlmIChmID09IE5VTEwpICAvKiBmaWxlIGlzIGFscmVhZHkgY2xvc2VkPyAqLworICAgIGx1YUxfZXJyb3IoTCwgImZpbGUgaXMgYWxyZWFkeSBjbG9zZWQiKTsKKyAgc3VjZXNzID0gcmVhZF9saW5lKEwsIGYpOworICBpZiAoZmVycm9yKGYpKQorICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICIlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgIGlmIChzdWNlc3MpIHJldHVybiAxOworICBlbHNlIHsgIC8qIEVPRiAqLworICAgIGlmIChsdWFfdG9ib29sZWFuKEwsIGx1YV91cHZhbHVlaW5kZXgoMikpKSB7ICAvKiBnZW5lcmF0b3IgY3JlYXRlZCBmaWxlPyAqLworICAgICAgbHVhX3NldHRvcChMLCAwKTsKKyAgICAgIGx1YV9wdXNodmFsdWUoTCwgbHVhX3VwdmFsdWVpbmRleCgxKSk7CisgICAgICBhdXhfY2xvc2UoTCk7ICAvKiBjbG9zZSBpdCAqLworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworc3RhdGljIGludCBnX3dyaXRlIChsdWFfU3RhdGUgKkwsIEZJTEUgKmYsIGludCBhcmcpIHsKKyAgaW50IG5hcmdzID0gbHVhX2dldHRvcChMKSAtIDE7CisgIGludCBzdGF0dXMgPSAxOworICBmb3IgKDsgbmFyZ3MtLTsgYXJnKyspIHsKKyAgICBpZiAobHVhX3R5cGUoTCwgYXJnKSA9PSBMVUFfVE5VTUJFUikgeworICAgICAgLyogb3B0aW1pemF0aW9uOiBjb3VsZCBiZSBkb25lIGV4YWN0bHkgYXMgZm9yIHN0cmluZ3MgKi8KKyAgICAgIHN0YXR1cyA9IHN0YXR1cyAmJgorICAgICAgICAgIGZwcmludGYoZiwgTFVBX05VTUJFUl9GTVQsIGx1YV90b251bWJlcihMLCBhcmcpKSA+IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2l6ZV90IGw7CisgICAgICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgYXJnLCAmbCk7CisgICAgICBzdGF0dXMgPSBzdGF0dXMgJiYgKGZ3cml0ZShzLCBzaXplb2YoY2hhciksIGwsIGYpID09IGwpOworICAgIH0KKyAgfQorICByZXR1cm4gcHVzaHJlc3VsdChMLCBzdGF0dXMsIE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgaW9fd3JpdGUgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gZ193cml0ZShMLCBnZXRpb2ZpbGUoTCwgSU9fT1VUUFVUKSwgMSk7Cit9CisKKworc3RhdGljIGludCBmX3dyaXRlIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGdfd3JpdGUoTCwgdG9maWxlKEwpLCAyKTsKK30KKworCitzdGF0aWMgaW50IGZfc2VlayAobHVhX1N0YXRlICpMKSB7CisgIHN0YXRpYyBjb25zdCBpbnQgbW9kZVtdID0ge1NFRUtfU0VULCBTRUVLX0NVUiwgU0VFS19FTkR9OworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbW9kZW5hbWVzW10gPSB7InNldCIsICJjdXIiLCAiZW5kIiwgTlVMTH07CisgIEZJTEUgKmYgPSB0b2ZpbGUoTCk7CisgIGludCBvcCA9IGx1YUxfY2hlY2tvcHRpb24oTCwgMiwgImN1ciIsIG1vZGVuYW1lcyk7CisgIGxvbmcgb2Zmc2V0ID0gbHVhTF9vcHRsb25nKEwsIDMsIDApOworICBvcCA9IGZzZWVrKGYsIG9mZnNldCwgbW9kZVtvcF0pOworICBpZiAob3ApCisgICAgcmV0dXJuIHB1c2hyZXN1bHQoTCwgMCwgTlVMTCk7ICAvKiBlcnJvciAqLworICBlbHNlIHsKKyAgICBsdWFfcHVzaGludGVnZXIoTCwgZnRlbGwoZikpOworICAgIHJldHVybiAxOworICB9Cit9CisKKworc3RhdGljIGludCBmX3NldHZidWYgKGx1YV9TdGF0ZSAqTCkgeworICBzdGF0aWMgY29uc3QgaW50IG1vZGVbXSA9IHtfSU9OQkYsIF9JT0ZCRiwgX0lPTEJGfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1vZGVuYW1lc1tdID0geyJubyIsICJmdWxsIiwgImxpbmUiLCBOVUxMfTsKKyAgRklMRSAqZiA9IHRvZmlsZShMKTsKKyAgaW50IG9wID0gbHVhTF9jaGVja29wdGlvbihMLCAyLCBOVUxMLCBtb2RlbmFtZXMpOworICBsdWFfSW50ZWdlciBzeiA9IGx1YUxfb3B0aW50ZWdlcihMLCAzLCBMVUFMX0JVRkZFUlNJWkUpOworICBpbnQgcmVzID0gc2V0dmJ1ZihmLCBOVUxMLCBtb2RlW29wXSwgc3opOworICByZXR1cm4gcHVzaHJlc3VsdChMLCByZXMgPT0gMCwgTlVMTCk7Cit9CisKKworCitzdGF0aWMgaW50IGlvX2ZsdXNoIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIHB1c2hyZXN1bHQoTCwgZmZsdXNoKGdldGlvZmlsZShMLCBJT19PVVRQVVQpKSA9PSAwLCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IGZfZmx1c2ggKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gcHVzaHJlc3VsdChMLCBmZmx1c2godG9maWxlKEwpKSA9PSAwLCBOVUxMKTsKK30KKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgaW9saWJbXSA9IHsKKyAgeyJjbG9zZSIsIGlvX2Nsb3NlfSwKKyAgeyJmbHVzaCIsIGlvX2ZsdXNofSwKKyAgeyJpbnB1dCIsIGlvX2lucHV0fSwKKyAgeyJsaW5lcyIsIGlvX2xpbmVzfSwKKyAgeyJvcGVuIiwgaW9fb3Blbn0sCisgIHsib3V0cHV0IiwgaW9fb3V0cHV0fSwKKyAgeyJwb3BlbiIsIGlvX3BvcGVufSwKKyAgeyJyZWFkIiwgaW9fcmVhZH0sCisgIHsidG1wZmlsZSIsIGlvX3RtcGZpbGV9LAorICB7InR5cGUiLCBpb190eXBlfSwKKyAgeyJ3cml0ZSIsIGlvX3dyaXRlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBmbGliW10gPSB7CisgIHsiY2xvc2UiLCBpb19jbG9zZX0sCisgIHsiZmx1c2giLCBmX2ZsdXNofSwKKyAgeyJsaW5lcyIsIGZfbGluZXN9LAorICB7InJlYWQiLCBmX3JlYWR9LAorICB7InNlZWsiLCBmX3NlZWt9LAorICB7InNldHZidWYiLCBmX3NldHZidWZ9LAorICB7IndyaXRlIiwgZl93cml0ZX0sCisgIHsiX19nYyIsIGlvX2djfSwKKyAgeyJfX3Rvc3RyaW5nIiwgaW9fdG9zdHJpbmd9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworc3RhdGljIHZvaWQgY3JlYXRlbWV0YSAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIExVQV9GSUxFSEFORExFKTsgIC8qIGNyZWF0ZSBtZXRhdGFibGUgZm9yIGZpbGUgaGFuZGxlcyAqLworICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsgIC8qIHB1c2ggbWV0YXRhYmxlICovCisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9faW5kZXgiKTsgIC8qIG1ldGF0YWJsZS5fX2luZGV4ID0gbWV0YXRhYmxlICovCisgIGx1YUxfcmVnaXN0ZXIoTCwgTlVMTCwgZmxpYik7ICAvKiBmaWxlIG1ldGhvZHMgKi8KK30KKworCitzdGF0aWMgdm9pZCBjcmVhdGVzdGRmaWxlIChsdWFfU3RhdGUgKkwsIEZJTEUgKmYsIGludCBrLCBjb25zdCBjaGFyICpmbmFtZSkgeworICAqbmV3ZmlsZShMKSA9IGY7CisgIGlmIChrID4gMCkgeworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOworICAgIGx1YV9yYXdzZXRpKEwsIExVQV9FTlZJUk9OSU5ERVgsIGspOworICB9CisgIGx1YV9wdXNodmFsdWUoTCwgLTIpOyAgLyogY29weSBlbnZpcm9ubWVudCAqLworICBsdWFfc2V0ZmVudihMLCAtMik7ICAvKiBzZXQgaXQgKi8KKyAgbHVhX3NldGZpZWxkKEwsIC0zLCBmbmFtZSk7Cit9CisKKworc3RhdGljIHZvaWQgbmV3ZmVudiAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIGNscykgeworICBsdWFfY3JlYXRldGFibGUoTCwgMCwgMSk7CisgIGx1YV9wdXNoY2Z1bmN0aW9uKEwsIGNscyk7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9fY2xvc2UiKTsKK30KKworCitMVUFMSUJfQVBJIGludCBsdWFvcGVuX2lvIChsdWFfU3RhdGUgKkwpIHsKKyAgY3JlYXRlbWV0YShMKTsKKyAgLyogY3JlYXRlIChwcml2YXRlKSBlbnZpcm9ubWVudCAod2l0aCBmaWVsZHMgSU9fSU5QVVQsIElPX09VVFBVVCwgX19jbG9zZSkgKi8KKyAgbmV3ZmVudihMLCBpb19mY2xvc2UpOworICBsdWFfcmVwbGFjZShMLCBMVUFfRU5WSVJPTklOREVYKTsKKyAgLyogb3BlbiBsaWJyYXJ5ICovCisgIGx1YUxfcmVnaXN0ZXIoTCwgTFVBX0lPTElCTkFNRSwgaW9saWIpOworICAvKiBjcmVhdGUgKGFuZCBzZXQpIGRlZmF1bHQgZmlsZXMgKi8KKyAgbmV3ZmVudihMLCBpb19ub2Nsb3NlKTsgIC8qIGNsb3NlIGZ1bmN0aW9uIGZvciBkZWZhdWx0IGZpbGVzICovCisgIGNyZWF0ZXN0ZGZpbGUoTCwgc3RkaW4sIElPX0lOUFVULCAic3RkaW4iKTsKKyAgY3JlYXRlc3RkZmlsZShMLCBzdGRvdXQsIElPX09VVFBVVCwgInN0ZG91dCIpOworICBjcmVhdGVzdGRmaWxlKEwsIHN0ZGVyciwgMCwgInN0ZGVyciIpOworICBsdWFfcG9wKEwsIDEpOyAgLyogcG9wIGVudmlyb25tZW50IGZvciBkZWZhdWx0IGZpbGVzICovCisgIGx1YV9nZXRmaWVsZChMLCAtMSwgInBvcGVuIik7CisgIG5ld2ZlbnYoTCwgaW9fcGNsb3NlKTsgIC8qIGNyZWF0ZSBlbnZpcm9ubWVudCBmb3IgJ3BvcGVuJyAqLworICBsdWFfc2V0ZmVudihMLCAtMik7ICAvKiBzZXQgZmVudiBmb3IgJ3BvcGVuJyAqLworICBsdWFfcG9wKEwsIDEpOyAgLyogcG9wICdwb3BlbicgKi8KKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbGxleC5jIGIvbHVhLTUuMS40L3NyYy9sbGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjMzE5MwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbGxleC5jCkBAIC0wLDAgKzEsNDYxIEBACisvKgorKiogJElkOiBsbGV4LmMsdiAyLjIwLjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIExleGljYWwgQW5hbHl6ZXIKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGxsZXhfYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsbGV4LmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxwYXJzZXIuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisjaW5jbHVkZSAibHppby5oIgorCisKKworI2RlZmluZSBuZXh0KGxzKSAobHMtPmN1cnJlbnQgPSB6Z2V0Yyhscy0+eikpCisKKworCisKKyNkZWZpbmUgY3VycklzTmV3bGluZShscykJKGxzLT5jdXJyZW50ID09ICdcbicgfHwgbHMtPmN1cnJlbnQgPT0gJ1xyJykKKworCisvKiBPUkRFUiBSRVNFUlZFRCAqLworY29uc3QgY2hhciAqY29uc3QgbHVhWF90b2tlbnMgW10gPSB7CisgICAgImFuZCIsICJicmVhayIsICJkbyIsICJlbHNlIiwgImVsc2VpZiIsCisgICAgImVuZCIsICJmYWxzZSIsICJmb3IiLCAiZnVuY3Rpb24iLCAiaWYiLAorICAgICJpbiIsICJsb2NhbCIsICJuaWwiLCAibm90IiwgIm9yIiwgInJlcGVhdCIsCisgICAgInJldHVybiIsICJ0aGVuIiwgInRydWUiLCAidW50aWwiLCAid2hpbGUiLAorICAgICIuLiIsICIuLi4iLCAiPT0iLCAiPj0iLCAiPD0iLCAifj0iLAorICAgICI8bnVtYmVyPiIsICI8bmFtZT4iLCAiPHN0cmluZz4iLCAiPGVvZj4iLAorICAgIE5VTEwKK307CisKKworI2RlZmluZSBzYXZlX2FuZF9uZXh0KGxzKSAoc2F2ZShscywgbHMtPmN1cnJlbnQpLCBuZXh0KGxzKSkKKworCitzdGF0aWMgdm9pZCBzYXZlIChMZXhTdGF0ZSAqbHMsIGludCBjKSB7CisgIE1idWZmZXIgKmIgPSBscy0+YnVmZjsKKyAgaWYgKGItPm4gKyAxID4gYi0+YnVmZnNpemUpIHsKKyAgICBzaXplX3QgbmV3c2l6ZTsKKyAgICBpZiAoYi0+YnVmZnNpemUgPj0gTUFYX1NJWkVULzIpCisgICAgICBsdWFYX2xleGVycm9yKGxzLCAibGV4aWNhbCBlbGVtZW50IHRvbyBsb25nIiwgMCk7CisgICAgbmV3c2l6ZSA9IGItPmJ1ZmZzaXplICogMjsKKyAgICBsdWFaX3Jlc2l6ZWJ1ZmZlcihscy0+TCwgYiwgbmV3c2l6ZSk7CisgIH0KKyAgYi0+YnVmZmVyW2ItPm4rK10gPSBjYXN0KGNoYXIsIGMpOworfQorCisKK3ZvaWQgbHVhWF9pbml0IChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPE5VTV9SRVNFUlZFRDsgaSsrKSB7CisgICAgVFN0cmluZyAqdHMgPSBsdWFTX25ldyhMLCBsdWFYX3Rva2Vuc1tpXSk7CisgICAgbHVhU19maXgodHMpOyAgLyogcmVzZXJ2ZWQgd29yZHMgYXJlIG5ldmVyIGNvbGxlY3RlZCAqLworICAgIGx1YV9hc3NlcnQoc3RybGVuKGx1YVhfdG9rZW5zW2ldKSsxIDw9IFRPS0VOX0xFTik7CisgICAgdHMtPnRzdi5yZXNlcnZlZCA9IGNhc3RfYnl0ZShpKzEpOyAgLyogcmVzZXJ2ZWQgd29yZCAqLworICB9Cit9CisKKworI2RlZmluZSBNQVhTUkMgICAgICAgICAgODAKKworCitjb25zdCBjaGFyICpsdWFYX3Rva2VuMnN0ciAoTGV4U3RhdGUgKmxzLCBpbnQgdG9rZW4pIHsKKyAgaWYgKHRva2VuIDwgRklSU1RfUkVTRVJWRUQpIHsKKyAgICBsdWFfYXNzZXJ0KHRva2VuID09IGNhc3QodW5zaWduZWQgY2hhciwgdG9rZW4pKTsKKyAgICByZXR1cm4gKGlzY250cmwodG9rZW4pKSA/IGx1YU9fcHVzaGZzdHJpbmcobHMtPkwsICJjaGFyKCVkKSIsIHRva2VuKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFPX3B1c2hmc3RyaW5nKGxzLT5MLCAiJWMiLCB0b2tlbik7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBsdWFYX3Rva2Vuc1t0b2tlbi1GSVJTVF9SRVNFUlZFRF07Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnR4dFRva2VuIChMZXhTdGF0ZSAqbHMsIGludCB0b2tlbikgeworICBzd2l0Y2ggKHRva2VuKSB7CisgICAgY2FzZSBUS19OQU1FOgorICAgIGNhc2UgVEtfU1RSSU5HOgorICAgIGNhc2UgVEtfTlVNQkVSOgorICAgICAgc2F2ZShscywgJ1wwJyk7CisgICAgICByZXR1cm4gbHVhWl9idWZmZXIobHMtPmJ1ZmYpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gbHVhWF90b2tlbjJzdHIobHMsIHRva2VuKTsKKyAgfQorfQorCisKK3ZvaWQgbHVhWF9sZXhlcnJvciAoTGV4U3RhdGUgKmxzLCBjb25zdCBjaGFyICptc2csIGludCB0b2tlbikgeworICBjaGFyIGJ1ZmZbTUFYU1JDXTsKKyAgbHVhT19jaHVua2lkKGJ1ZmYsIGdldHN0cihscy0+c291cmNlKSwgTUFYU1JDKTsKKyAgbXNnID0gbHVhT19wdXNoZnN0cmluZyhscy0+TCwgIiVzOiVkOiAlcyIsIGJ1ZmYsIGxzLT5saW5lbnVtYmVyLCBtc2cpOworICBpZiAodG9rZW4pCisgICAgbHVhT19wdXNoZnN0cmluZyhscy0+TCwgIiVzIG5lYXIgIiBMVUFfUVMsIG1zZywgdHh0VG9rZW4obHMsIHRva2VuKSk7CisgIGx1YURfdGhyb3cobHMtPkwsIExVQV9FUlJTWU5UQVgpOworfQorCisKK3ZvaWQgbHVhWF9zeW50YXhlcnJvciAoTGV4U3RhdGUgKmxzLCBjb25zdCBjaGFyICptc2cpIHsKKyAgbHVhWF9sZXhlcnJvcihscywgbXNnLCBscy0+dC50b2tlbik7Cit9CisKKworVFN0cmluZyAqbHVhWF9uZXdzdHJpbmcgKExleFN0YXRlICpscywgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbCkgeworICBsdWFfU3RhdGUgKkwgPSBscy0+TDsKKyAgVFN0cmluZyAqdHMgPSBsdWFTX25ld2xzdHIoTCwgc3RyLCBsKTsKKyAgVFZhbHVlICpvID0gbHVhSF9zZXRzdHIoTCwgbHMtPmZzLT5oLCB0cyk7ICAvKiBlbnRyeSBmb3IgYHN0cicgKi8KKyAgaWYgKHR0aXNuaWwobykpCisgICAgc2V0YnZhbHVlKG8sIDEpOyAgLyogbWFrZSBzdXJlIGBzdHInIHdpbGwgbm90IGJlIGNvbGxlY3RlZCAqLworICByZXR1cm4gdHM7Cit9CisKKworc3RhdGljIHZvaWQgaW5jbGluZW51bWJlciAoTGV4U3RhdGUgKmxzKSB7CisgIGludCBvbGQgPSBscy0+Y3VycmVudDsKKyAgbHVhX2Fzc2VydChjdXJySXNOZXdsaW5lKGxzKSk7CisgIG5leHQobHMpOyAgLyogc2tpcCBgXG4nIG9yIGBccicgKi8KKyAgaWYgKGN1cnJJc05ld2xpbmUobHMpICYmIGxzLT5jdXJyZW50ICE9IG9sZCkKKyAgICBuZXh0KGxzKTsgIC8qIHNraXAgYFxuXHInIG9yIGBcclxuJyAqLworICBpZiAoKytscy0+bGluZW51bWJlciA+PSBNQVhfSU5UKQorICAgIGx1YVhfc3ludGF4ZXJyb3IobHMsICJjaHVuayBoYXMgdG9vIG1hbnkgbGluZXMiKTsKK30KKworCit2b2lkIGx1YVhfc2V0aW5wdXQgKGx1YV9TdGF0ZSAqTCwgTGV4U3RhdGUgKmxzLCBaSU8gKnosIFRTdHJpbmcgKnNvdXJjZSkgeworICBscy0+ZGVjcG9pbnQgPSAnLic7CisgIGxzLT5MID0gTDsKKyAgbHMtPmxvb2thaGVhZC50b2tlbiA9IFRLX0VPUzsgIC8qIG5vIGxvb2stYWhlYWQgdG9rZW4gKi8KKyAgbHMtPnogPSB6OworICBscy0+ZnMgPSBOVUxMOworICBscy0+bGluZW51bWJlciA9IDE7CisgIGxzLT5sYXN0bGluZSA9IDE7CisgIGxzLT5zb3VyY2UgPSBzb3VyY2U7CisgIGx1YVpfcmVzaXplYnVmZmVyKGxzLT5MLCBscy0+YnVmZiwgTFVBX01JTkJVRkZFUik7ICAvKiBpbml0aWFsaXplIGJ1ZmZlciAqLworICBuZXh0KGxzKTsgIC8qIHJlYWQgZmlyc3QgY2hhciAqLworfQorCisKKworLyoKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIExFWElDQUwgQU5BTFlaRVIKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworCitzdGF0aWMgaW50IGNoZWNrX25leHQgKExleFN0YXRlICpscywgY29uc3QgY2hhciAqc2V0KSB7CisgIGlmICghc3RyY2hyKHNldCwgbHMtPmN1cnJlbnQpKQorICAgIHJldHVybiAwOworICBzYXZlX2FuZF9uZXh0KGxzKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgYnVmZnJlcGxhY2UgKExleFN0YXRlICpscywgY2hhciBmcm9tLCBjaGFyIHRvKSB7CisgIHNpemVfdCBuID0gbHVhWl9idWZmbGVuKGxzLT5idWZmKTsKKyAgY2hhciAqcCA9IGx1YVpfYnVmZmVyKGxzLT5idWZmKTsKKyAgd2hpbGUgKG4tLSkKKyAgICBpZiAocFtuXSA9PSBmcm9tKSBwW25dID0gdG87Cit9CisKKworc3RhdGljIHZvaWQgdHJ5ZGVjcG9pbnQgKExleFN0YXRlICpscywgU2VtSW5mbyAqc2VtaW5mbykgeworICAvKiBmb3JtYXQgZXJyb3I6IHRyeSB0byB1cGRhdGUgZGVjaW1hbCBwb2ludCBzZXBhcmF0b3IgKi8KKyAgc3RydWN0IGxjb252ICpjdiA9IGxvY2FsZWNvbnYoKTsKKyAgY2hhciBvbGQgPSBscy0+ZGVjcG9pbnQ7CisgIGxzLT5kZWNwb2ludCA9IChjdiA/IGN2LT5kZWNpbWFsX3BvaW50WzBdIDogJy4nKTsKKyAgYnVmZnJlcGxhY2UobHMsIG9sZCwgbHMtPmRlY3BvaW50KTsgIC8qIHRyeSB1cGRhdGVkIGRlY2ltYWwgc2VwYXJhdG9yICovCisgIGlmICghbHVhT19zdHIyZChsdWFaX2J1ZmZlcihscy0+YnVmZiksICZzZW1pbmZvLT5yKSkgeworICAgIC8qIGZvcm1hdCBlcnJvciB3aXRoIGNvcnJlY3QgZGVjaW1hbCBwb2ludDogbm8gbW9yZSBvcHRpb25zICovCisgICAgYnVmZnJlcGxhY2UobHMsIGxzLT5kZWNwb2ludCwgJy4nKTsgIC8qIHVuZG8gY2hhbmdlIChmb3IgZXJyb3IgbWVzc2FnZSkgKi8KKyAgICBsdWFYX2xleGVycm9yKGxzLCAibWFsZm9ybWVkIG51bWJlciIsIFRLX05VTUJFUik7CisgIH0KK30KKworCisvKiBMVUFfTlVNQkVSICovCitzdGF0aWMgdm9pZCByZWFkX251bWVyYWwgKExleFN0YXRlICpscywgU2VtSW5mbyAqc2VtaW5mbykgeworICBsdWFfYXNzZXJ0KGlzZGlnaXQobHMtPmN1cnJlbnQpKTsKKyAgZG8geworICAgIHNhdmVfYW5kX25leHQobHMpOworICB9IHdoaWxlIChpc2RpZ2l0KGxzLT5jdXJyZW50KSB8fCBscy0+Y3VycmVudCA9PSAnLicpOworICBpZiAoY2hlY2tfbmV4dChscywgIkVlIikpICAvKiBgRSc/ICovCisgICAgY2hlY2tfbmV4dChscywgIistIik7ICAvKiBvcHRpb25hbCBleHBvbmVudCBzaWduICovCisgIHdoaWxlIChpc2FsbnVtKGxzLT5jdXJyZW50KSB8fCBscy0+Y3VycmVudCA9PSAnXycpCisgICAgc2F2ZV9hbmRfbmV4dChscyk7CisgIHNhdmUobHMsICdcMCcpOworICBidWZmcmVwbGFjZShscywgJy4nLCBscy0+ZGVjcG9pbnQpOyAgLyogZm9sbG93IGxvY2FsZSBmb3IgZGVjaW1hbCBwb2ludCAqLworICBpZiAoIWx1YU9fc3RyMmQobHVhWl9idWZmZXIobHMtPmJ1ZmYpLCAmc2VtaW5mby0+cikpICAvKiBmb3JtYXQgZXJyb3I/ICovCisgICAgdHJ5ZGVjcG9pbnQobHMsIHNlbWluZm8pOyAvKiB0cnkgdG8gdXBkYXRlIGRlY2ltYWwgcG9pbnQgc2VwYXJhdG9yICovCit9CisKKworc3RhdGljIGludCBza2lwX3NlcCAoTGV4U3RhdGUgKmxzKSB7CisgIGludCBjb3VudCA9IDA7CisgIGludCBzID0gbHMtPmN1cnJlbnQ7CisgIGx1YV9hc3NlcnQocyA9PSAnWycgfHwgcyA9PSAnXScpOworICBzYXZlX2FuZF9uZXh0KGxzKTsKKyAgd2hpbGUgKGxzLT5jdXJyZW50ID09ICc9JykgeworICAgIHNhdmVfYW5kX25leHQobHMpOworICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIChscy0+Y3VycmVudCA9PSBzKSA/IGNvdW50IDogKC1jb3VudCkgLSAxOworfQorCisKK3N0YXRpYyB2b2lkIHJlYWRfbG9uZ19zdHJpbmcgKExleFN0YXRlICpscywgU2VtSW5mbyAqc2VtaW5mbywgaW50IHNlcCkgeworICBpbnQgY29udCA9IDA7CisgICh2b2lkKShjb250KTsgIC8qIGF2b2lkIHdhcm5pbmdzIHdoZW4gYGNvbnQnIGlzIG5vdCB1c2VkICovCisgIHNhdmVfYW5kX25leHQobHMpOyAgLyogc2tpcCAybmQgYFsnICovCisgIGlmIChjdXJySXNOZXdsaW5lKGxzKSkgIC8qIHN0cmluZyBzdGFydHMgd2l0aCBhIG5ld2xpbmU/ICovCisgICAgaW5jbGluZW51bWJlcihscyk7ICAvKiBza2lwIGl0ICovCisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKGxzLT5jdXJyZW50KSB7CisgICAgICBjYXNlIEVPWjoKKyAgICAgICAgbHVhWF9sZXhlcnJvcihscywgKHNlbWluZm8pID8gInVuZmluaXNoZWQgbG9uZyBzdHJpbmciIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZmluaXNoZWQgbG9uZyBjb21tZW50IiwgVEtfRU9TKTsKKyAgICAgICAgYnJlYWs7ICAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9MU1RSKQorICAgICAgY2FzZSAnWyc6IHsKKyAgICAgICAgaWYgKHNraXBfc2VwKGxzKSA9PSBzZXApIHsKKyAgICAgICAgICBzYXZlX2FuZF9uZXh0KGxzKTsgIC8qIHNraXAgMm5kIGBbJyAqLworICAgICAgICAgIGNvbnQrKzsKKyNpZiBMVUFfQ09NUEFUX0xTVFIgPT0gMQorICAgICAgICAgIGlmIChzZXAgPT0gMCkKKyAgICAgICAgICAgIGx1YVhfbGV4ZXJyb3IobHMsICJuZXN0aW5nIG9mIFtbLi4uXV0gaXMgZGVwcmVjYXRlZCIsICdbJyk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgY2FzZSAnXSc6IHsKKyAgICAgICAgaWYgKHNraXBfc2VwKGxzKSA9PSBzZXApIHsKKyAgICAgICAgICBzYXZlX2FuZF9uZXh0KGxzKTsgIC8qIHNraXAgMm5kIGBdJyAqLworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9MU1RSKSAmJiBMVUFfQ09NUEFUX0xTVFIgPT0gMgorICAgICAgICAgIGNvbnQtLTsKKyAgICAgICAgICBpZiAoc2VwID09IDAgJiYgY29udCA+PSAwKSBicmVhazsKKyNlbmRpZgorICAgICAgICAgIGdvdG8gZW5kbG9vcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgIGNhc2UgJ1xyJzogeworICAgICAgICBzYXZlKGxzLCAnXG4nKTsKKyAgICAgICAgaW5jbGluZW51bWJlcihscyk7CisgICAgICAgIGlmICghc2VtaW5mbykgbHVhWl9yZXNldGJ1ZmZlcihscy0+YnVmZik7ICAvKiBhdm9pZCB3YXN0aW5nIHNwYWNlICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDogeworICAgICAgICBpZiAoc2VtaW5mbykgc2F2ZV9hbmRfbmV4dChscyk7CisgICAgICAgIGVsc2UgbmV4dChscyk7CisgICAgICB9CisgICAgfQorICB9IGVuZGxvb3A6CisgIGlmIChzZW1pbmZvKQorICAgIHNlbWluZm8tPnRzID0gbHVhWF9uZXdzdHJpbmcobHMsIGx1YVpfYnVmZmVyKGxzLT5idWZmKSArICgyICsgc2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFaX2J1ZmZsZW4obHMtPmJ1ZmYpIC0gMiooMiArIHNlcCkpOworfQorCisKK3N0YXRpYyB2b2lkIHJlYWRfc3RyaW5nIChMZXhTdGF0ZSAqbHMsIGludCBkZWwsIFNlbUluZm8gKnNlbWluZm8pIHsKKyAgc2F2ZV9hbmRfbmV4dChscyk7CisgIHdoaWxlIChscy0+Y3VycmVudCAhPSBkZWwpIHsKKyAgICBzd2l0Y2ggKGxzLT5jdXJyZW50KSB7CisgICAgICBjYXNlIEVPWjoKKyAgICAgICAgbHVhWF9sZXhlcnJvcihscywgInVuZmluaXNoZWQgc3RyaW5nIiwgVEtfRU9TKTsKKyAgICAgICAgY29udGludWU7ICAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLworICAgICAgY2FzZSAnXG4nOgorICAgICAgY2FzZSAnXHInOgorICAgICAgICBsdWFYX2xleGVycm9yKGxzLCAidW5maW5pc2hlZCBzdHJpbmciLCBUS19TVFJJTkcpOworICAgICAgICBjb250aW51ZTsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgICAgICBjYXNlICdcXCc6IHsKKyAgICAgICAgaW50IGM7CisgICAgICAgIG5leHQobHMpOyAgLyogZG8gbm90IHNhdmUgdGhlIGBcJyAqLworICAgICAgICBzd2l0Y2ggKGxzLT5jdXJyZW50KSB7CisgICAgICAgICAgY2FzZSAnYSc6IGMgPSAnXGEnOyBicmVhazsKKyAgICAgICAgICBjYXNlICdiJzogYyA9ICdcYic7IGJyZWFrOworICAgICAgICAgIGNhc2UgJ2YnOiBjID0gJ1xmJzsgYnJlYWs7CisgICAgICAgICAgY2FzZSAnbic6IGMgPSAnXG4nOyBicmVhazsKKyAgICAgICAgICBjYXNlICdyJzogYyA9ICdccic7IGJyZWFrOworICAgICAgICAgIGNhc2UgJ3QnOiBjID0gJ1x0JzsgYnJlYWs7CisgICAgICAgICAgY2FzZSAndic6IGMgPSAnXHYnOyBicmVhazsKKyAgICAgICAgICBjYXNlICdcbic6ICAvKiBnbyB0aHJvdWdoICovCisgICAgICAgICAgY2FzZSAnXHInOiBzYXZlKGxzLCAnXG4nKTsgaW5jbGluZW51bWJlcihscyk7IGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgRU9aOiBjb250aW51ZTsgIC8qIHdpbGwgcmFpc2UgYW4gZXJyb3IgbmV4dCBsb29wICovCisgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KGxzLT5jdXJyZW50KSkKKyAgICAgICAgICAgICAgc2F2ZV9hbmRfbmV4dChscyk7ICAvKiBoYW5kbGVzIFxcLCBcIiwgXCcsIGFuZCBcPyAqLworICAgICAgICAgICAgZWxzZSB7ICAvKiBceHh4ICovCisgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgYyA9IDA7CisgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjID0gMTAqYyArIChscy0+Y3VycmVudC0nMCcpOworICAgICAgICAgICAgICAgIG5leHQobHMpOworICAgICAgICAgICAgICB9IHdoaWxlICgrK2k8MyAmJiBpc2RpZ2l0KGxzLT5jdXJyZW50KSk7CisgICAgICAgICAgICAgIGlmIChjID4gVUNIQVJfTUFYKQorICAgICAgICAgICAgICAgIGx1YVhfbGV4ZXJyb3IobHMsICJlc2NhcGUgc2VxdWVuY2UgdG9vIGxhcmdlIiwgVEtfU1RSSU5HKTsKKyAgICAgICAgICAgICAgc2F2ZShscywgYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2F2ZShscywgYyk7CisgICAgICAgIG5leHQobHMpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNhdmVfYW5kX25leHQobHMpOworICAgIH0KKyAgfQorICBzYXZlX2FuZF9uZXh0KGxzKTsgIC8qIHNraXAgZGVsaW1pdGVyICovCisgIHNlbWluZm8tPnRzID0gbHVhWF9uZXdzdHJpbmcobHMsIGx1YVpfYnVmZmVyKGxzLT5idWZmKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YVpfYnVmZmxlbihscy0+YnVmZikgLSAyKTsKK30KKworCitzdGF0aWMgaW50IGxsZXggKExleFN0YXRlICpscywgU2VtSW5mbyAqc2VtaW5mbykgeworICBsdWFaX3Jlc2V0YnVmZmVyKGxzLT5idWZmKTsKKyAgZm9yICg7OykgeworICAgIHN3aXRjaCAobHMtPmN1cnJlbnQpIHsKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgIGNhc2UgJ1xyJzogeworICAgICAgICBpbmNsaW5lbnVtYmVyKGxzKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlICctJzogeworICAgICAgICBuZXh0KGxzKTsKKyAgICAgICAgaWYgKGxzLT5jdXJyZW50ICE9ICctJykgcmV0dXJuICctJzsKKyAgICAgICAgLyogZWxzZSBpcyBhIGNvbW1lbnQgKi8KKyAgICAgICAgbmV4dChscyk7CisgICAgICAgIGlmIChscy0+Y3VycmVudCA9PSAnWycpIHsKKyAgICAgICAgICBpbnQgc2VwID0gc2tpcF9zZXAobHMpOworICAgICAgICAgIGx1YVpfcmVzZXRidWZmZXIobHMtPmJ1ZmYpOyAgLyogYHNraXBfc2VwJyBtYXkgZGlydHkgdGhlIGJ1ZmZlciAqLworICAgICAgICAgIGlmIChzZXAgPj0gMCkgeworICAgICAgICAgICAgcmVhZF9sb25nX3N0cmluZyhscywgTlVMTCwgc2VwKTsgIC8qIGxvbmcgY29tbWVudCAqLworICAgICAgICAgICAgbHVhWl9yZXNldGJ1ZmZlcihscy0+YnVmZik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZSBzaG9ydCBjb21tZW50ICovCisgICAgICAgIHdoaWxlICghY3VycklzTmV3bGluZShscykgJiYgbHMtPmN1cnJlbnQgIT0gRU9aKQorICAgICAgICAgIG5leHQobHMpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ1snOiB7CisgICAgICAgIGludCBzZXAgPSBza2lwX3NlcChscyk7CisgICAgICAgIGlmIChzZXAgPj0gMCkgeworICAgICAgICAgIHJlYWRfbG9uZ19zdHJpbmcobHMsIHNlbWluZm8sIHNlcCk7CisgICAgICAgICAgcmV0dXJuIFRLX1NUUklORzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzZXAgPT0gLTEpIHJldHVybiAnWyc7CisgICAgICAgIGVsc2UgbHVhWF9sZXhlcnJvcihscywgImludmFsaWQgbG9uZyBzdHJpbmcgZGVsaW1pdGVyIiwgVEtfU1RSSU5HKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgJz0nOiB7CisgICAgICAgIG5leHQobHMpOworICAgICAgICBpZiAobHMtPmN1cnJlbnQgIT0gJz0nKSByZXR1cm4gJz0nOworICAgICAgICBlbHNlIHsgbmV4dChscyk7IHJldHVybiBUS19FUTsgfQorICAgICAgfQorICAgICAgY2FzZSAnPCc6IHsKKyAgICAgICAgbmV4dChscyk7CisgICAgICAgIGlmIChscy0+Y3VycmVudCAhPSAnPScpIHJldHVybiAnPCc7CisgICAgICAgIGVsc2UgeyBuZXh0KGxzKTsgcmV0dXJuIFRLX0xFOyB9CisgICAgICB9CisgICAgICBjYXNlICc+JzogeworICAgICAgICBuZXh0KGxzKTsKKyAgICAgICAgaWYgKGxzLT5jdXJyZW50ICE9ICc9JykgcmV0dXJuICc+JzsKKyAgICAgICAgZWxzZSB7IG5leHQobHMpOyByZXR1cm4gVEtfR0U7IH0KKyAgICAgIH0KKyAgICAgIGNhc2UgJ34nOiB7CisgICAgICAgIG5leHQobHMpOworICAgICAgICBpZiAobHMtPmN1cnJlbnQgIT0gJz0nKSByZXR1cm4gJ34nOworICAgICAgICBlbHNlIHsgbmV4dChscyk7IHJldHVybiBUS19ORTsgfQorICAgICAgfQorICAgICAgY2FzZSAnIic6CisgICAgICBjYXNlICdcJyc6IHsKKyAgICAgICAgcmVhZF9zdHJpbmcobHMsIGxzLT5jdXJyZW50LCBzZW1pbmZvKTsKKyAgICAgICAgcmV0dXJuIFRLX1NUUklORzsKKyAgICAgIH0KKyAgICAgIGNhc2UgJy4nOiB7CisgICAgICAgIHNhdmVfYW5kX25leHQobHMpOworICAgICAgICBpZiAoY2hlY2tfbmV4dChscywgIi4iKSkgeworICAgICAgICAgIGlmIChjaGVja19uZXh0KGxzLCAiLiIpKQorICAgICAgICAgICAgcmV0dXJuIFRLX0RPVFM7ICAgLyogLi4uICovCisgICAgICAgICAgZWxzZSByZXR1cm4gVEtfQ09OQ0FUOyAgIC8qIC4uICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWlzZGlnaXQobHMtPmN1cnJlbnQpKSByZXR1cm4gJy4nOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICByZWFkX251bWVyYWwobHMsIHNlbWluZm8pOworICAgICAgICAgIHJldHVybiBUS19OVU1CRVI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNhc2UgRU9aOiB7CisgICAgICAgIHJldHVybiBUS19FT1M7CisgICAgICB9CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmIChpc3NwYWNlKGxzLT5jdXJyZW50KSkgeworICAgICAgICAgIGx1YV9hc3NlcnQoIWN1cnJJc05ld2xpbmUobHMpKTsKKyAgICAgICAgICBuZXh0KGxzKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc2RpZ2l0KGxzLT5jdXJyZW50KSkgeworICAgICAgICAgIHJlYWRfbnVtZXJhbChscywgc2VtaW5mbyk7CisgICAgICAgICAgcmV0dXJuIFRLX05VTUJFUjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc2FscGhhKGxzLT5jdXJyZW50KSB8fCBscy0+Y3VycmVudCA9PSAnXycpIHsKKyAgICAgICAgICAvKiBpZGVudGlmaWVyIG9yIHJlc2VydmVkIHdvcmQgKi8KKyAgICAgICAgICBUU3RyaW5nICp0czsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBzYXZlX2FuZF9uZXh0KGxzKTsKKyAgICAgICAgICB9IHdoaWxlIChpc2FsbnVtKGxzLT5jdXJyZW50KSB8fCBscy0+Y3VycmVudCA9PSAnXycpOworICAgICAgICAgIHRzID0gbHVhWF9uZXdzdHJpbmcobHMsIGx1YVpfYnVmZmVyKGxzLT5idWZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFaX2J1ZmZsZW4obHMtPmJ1ZmYpKTsKKyAgICAgICAgICBpZiAodHMtPnRzdi5yZXNlcnZlZCA+IDApICAvKiByZXNlcnZlZCB3b3JkPyAqLworICAgICAgICAgICAgcmV0dXJuIHRzLT50c3YucmVzZXJ2ZWQgLSAxICsgRklSU1RfUkVTRVJWRUQ7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZW1pbmZvLT50cyA9IHRzOworICAgICAgICAgICAgcmV0dXJuIFRLX05BTUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGludCBjID0gbHMtPmN1cnJlbnQ7CisgICAgICAgICAgbmV4dChscyk7CisgICAgICAgICAgcmV0dXJuIGM7ICAvKiBzaW5nbGUtY2hhciB0b2tlbnMgKCsgLSAvIC4uLikgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3ZvaWQgbHVhWF9uZXh0IChMZXhTdGF0ZSAqbHMpIHsKKyAgbHMtPmxhc3RsaW5lID0gbHMtPmxpbmVudW1iZXI7CisgIGlmIChscy0+bG9va2FoZWFkLnRva2VuICE9IFRLX0VPUykgeyAgLyogaXMgdGhlcmUgYSBsb29rLWFoZWFkIHRva2VuPyAqLworICAgIGxzLT50ID0gbHMtPmxvb2thaGVhZDsgIC8qIHVzZSB0aGlzIG9uZSAqLworICAgIGxzLT5sb29rYWhlYWQudG9rZW4gPSBUS19FT1M7ICAvKiBhbmQgZGlzY2hhcmdlIGl0ICovCisgIH0KKyAgZWxzZQorICAgIGxzLT50LnRva2VuID0gbGxleChscywgJmxzLT50LnNlbWluZm8pOyAgLyogcmVhZCBuZXh0IHRva2VuICovCit9CisKKwordm9pZCBsdWFYX2xvb2thaGVhZCAoTGV4U3RhdGUgKmxzKSB7CisgIGx1YV9hc3NlcnQobHMtPmxvb2thaGVhZC50b2tlbiA9PSBUS19FT1MpOworICBscy0+bG9va2FoZWFkLnRva2VuID0gbGxleChscywgJmxzLT5sb29rYWhlYWQuc2VtaW5mbyk7Cit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbGxleC5oIGIvbHVhLTUuMS40L3NyYy9sbGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyMDFjZQotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbGxleC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisqKiAkSWQ6IGxsZXguaCx2IDEuNTguMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogTGV4aWNhbCBBbmFseXplcgorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbGxleF9oCisjZGVmaW5lIGxsZXhfaAorCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworCisjZGVmaW5lIEZJUlNUX1JFU0VSVkVECTI1NworCisvKiBtYXhpbXVtIGxlbmd0aCBvZiBhIHJlc2VydmVkIHdvcmQgKi8KKyNkZWZpbmUgVE9LRU5fTEVOCShzaXplb2YoImZ1bmN0aW9uIikvc2l6ZW9mKGNoYXIpKQorCisKKy8qCisqIFdBUk5JTkc6IGlmIHlvdSBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoaXMgZW51bWVyYXRpb24sCisqIGdyZXAgIk9SREVSIFJFU0VSVkVEIgorKi8KK2VudW0gUkVTRVJWRUQgeworICAvKiB0ZXJtaW5hbCBzeW1ib2xzIGRlbm90ZWQgYnkgcmVzZXJ2ZWQgd29yZHMgKi8KKyAgVEtfQU5EID0gRklSU1RfUkVTRVJWRUQsIFRLX0JSRUFLLAorICBUS19ETywgVEtfRUxTRSwgVEtfRUxTRUlGLCBUS19FTkQsIFRLX0ZBTFNFLCBUS19GT1IsIFRLX0ZVTkNUSU9OLAorICBUS19JRiwgVEtfSU4sIFRLX0xPQ0FMLCBUS19OSUwsIFRLX05PVCwgVEtfT1IsIFRLX1JFUEVBVCwKKyAgVEtfUkVUVVJOLCBUS19USEVOLCBUS19UUlVFLCBUS19VTlRJTCwgVEtfV0hJTEUsCisgIC8qIG90aGVyIHRlcm1pbmFsIHN5bWJvbHMgKi8KKyAgVEtfQ09OQ0FULCBUS19ET1RTLCBUS19FUSwgVEtfR0UsIFRLX0xFLCBUS19ORSwgVEtfTlVNQkVSLAorICBUS19OQU1FLCBUS19TVFJJTkcsIFRLX0VPUworfTsKKworLyogbnVtYmVyIG9mIHJlc2VydmVkIHdvcmRzICovCisjZGVmaW5lIE5VTV9SRVNFUlZFRAkoY2FzdChpbnQsIFRLX1dISUxFLUZJUlNUX1JFU0VSVkVEKzEpKQorCisKKy8qIGFycmF5IHdpdGggdG9rZW4gYG5hbWVzJyAqLworTFVBSV9EQVRBIGNvbnN0IGNoYXIgKmNvbnN0IGx1YVhfdG9rZW5zIFtdOworCisKK3R5cGVkZWYgdW5pb24geworICBsdWFfTnVtYmVyIHI7CisgIFRTdHJpbmcgKnRzOworfSBTZW1JbmZvOyAgLyogc2VtYW50aWNzIGluZm9ybWF0aW9uICovCisKKwordHlwZWRlZiBzdHJ1Y3QgVG9rZW4geworICBpbnQgdG9rZW47CisgIFNlbUluZm8gc2VtaW5mbzsKK30gVG9rZW47CisKKwordHlwZWRlZiBzdHJ1Y3QgTGV4U3RhdGUgeworICBpbnQgY3VycmVudDsgIC8qIGN1cnJlbnQgY2hhcmFjdGVyIChjaGFyaW50KSAqLworICBpbnQgbGluZW51bWJlcjsgIC8qIGlucHV0IGxpbmUgY291bnRlciAqLworICBpbnQgbGFzdGxpbmU7ICAvKiBsaW5lIG9mIGxhc3QgdG9rZW4gYGNvbnN1bWVkJyAqLworICBUb2tlbiB0OyAgLyogY3VycmVudCB0b2tlbiAqLworICBUb2tlbiBsb29rYWhlYWQ7ICAvKiBsb29rIGFoZWFkIHRva2VuICovCisgIHN0cnVjdCBGdW5jU3RhdGUgKmZzOyAgLyogYEZ1bmNTdGF0ZScgaXMgcHJpdmF0ZSB0byB0aGUgcGFyc2VyICovCisgIHN0cnVjdCBsdWFfU3RhdGUgKkw7CisgIFpJTyAqejsgIC8qIGlucHV0IHN0cmVhbSAqLworICBNYnVmZmVyICpidWZmOyAgLyogYnVmZmVyIGZvciB0b2tlbnMgKi8KKyAgVFN0cmluZyAqc291cmNlOyAgLyogY3VycmVudCBzb3VyY2UgbmFtZSAqLworICBjaGFyIGRlY3BvaW50OyAgLyogbG9jYWxlIGRlY2ltYWwgcG9pbnQgKi8KK30gTGV4U3RhdGU7CisKKworTFVBSV9GVU5DIHZvaWQgbHVhWF9pbml0IChsdWFfU3RhdGUgKkwpOworTFVBSV9GVU5DIHZvaWQgbHVhWF9zZXRpbnB1dCAobHVhX1N0YXRlICpMLCBMZXhTdGF0ZSAqbHMsIFpJTyAqeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTdHJpbmcgKnNvdXJjZSk7CitMVUFJX0ZVTkMgVFN0cmluZyAqbHVhWF9uZXdzdHJpbmcgKExleFN0YXRlICpscywgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFYX25leHQgKExleFN0YXRlICpscyk7CitMVUFJX0ZVTkMgdm9pZCBsdWFYX2xvb2thaGVhZCAoTGV4U3RhdGUgKmxzKTsKK0xVQUlfRlVOQyB2b2lkIGx1YVhfbGV4ZXJyb3IgKExleFN0YXRlICpscywgY29uc3QgY2hhciAqbXNnLCBpbnQgdG9rZW4pOworTFVBSV9GVU5DIHZvaWQgbHVhWF9zeW50YXhlcnJvciAoTGV4U3RhdGUgKmxzLCBjb25zdCBjaGFyICpzKTsKK0xVQUlfRlVOQyBjb25zdCBjaGFyICpsdWFYX3Rva2VuMnN0ciAoTGV4U3RhdGUgKmxzLCBpbnQgdG9rZW4pOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sbGltaXRzLmggYi9sdWEtNS4xLjQvc3JjL2xsaW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYThkY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sbGltaXRzLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisqKiAkSWQ6IGxsaW1pdHMuaCx2IDEuNjkuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogTGltaXRzLCBiYXNpYyB0eXBlcywgYW5kIHNvbWUgb3RoZXIgYGluc3RhbGxhdGlvbi1kZXBlbmRlbnQnIGRlZmluaXRpb25zCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsbGltaXRzX2gKKyNkZWZpbmUgbGxpbWl0c19oCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKyNpbmNsdWRlICJsdWEuaCIKKworCit0eXBlZGVmIExVQUlfVUlOVDMyIGx1X2ludDMyOworCit0eXBlZGVmIExVQUlfVU1FTSBsdV9tZW07CisKK3R5cGVkZWYgTFVBSV9NRU0gbF9tZW07CisKKworCisvKiBjaGFycyB1c2VkIGFzIHNtYWxsIG5hdHVyYWxzIChzbyB0aGF0IGBjaGFyJyBpcyByZXNlcnZlZCBmb3IgY2hhcmFjdGVycykgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBsdV9ieXRlOworCisKKyNkZWZpbmUgTUFYX1NJWkVUCSgoc2l6ZV90KSh+KHNpemVfdCkwKS0yKQorCisjZGVmaW5lIE1BWF9MVU1FTQkoKGx1X21lbSkofihsdV9tZW0pMCktMikKKworCisjZGVmaW5lIE1BWF9JTlQgKElOVF9NQVgtMikgIC8qIG1heGltdW0gdmFsdWUgb2YgYW4gaW50ICgtMiBmb3Igc2FmZXR5KSAqLworCisvKgorKiogY29udmVyc2lvbiBvZiBwb2ludGVyIHRvIGludGVnZXIKKyoqIHRoaXMgaXMgZm9yIGhhc2hpbmcgb25seTsgdGhlcmUgaXMgbm8gcHJvYmxlbSBpZiB0aGUgaW50ZWdlcgorKiogY2Fubm90IGhvbGQgdGhlIHdob2xlIHBvaW50ZXIgdmFsdWUKKyovCisjZGVmaW5lIEludFBvaW50KHApICAoKHVuc2lnbmVkIGludCkobHVfbWVtKShwKSkKKworCisKKy8qIHR5cGUgdG8gZW5zdXJlIG1heGltdW0gYWxpZ25tZW50ICovCit0eXBlZGVmIExVQUlfVVNFUl9BTElHTk1FTlRfVCBMX1VtYXhhbGlnbjsKKworCisvKiByZXN1bHQgb2YgYSBgdXN1YWwgYXJndW1lbnQgY29udmVyc2lvbicgb3ZlciBsdWFfTnVtYmVyICovCit0eXBlZGVmIExVQUlfVUFDTlVNQkVSIGxfdWFjTnVtYmVyOworCisKKy8qIGludGVybmFsIGFzc2VydGlvbnMgZm9yIGluLWhvdXNlIGRlYnVnZ2luZyAqLworI2lmZGVmIGx1YV9hc3NlcnQKKworI2RlZmluZSBjaGVja19leHAoYyxlKQkJKGx1YV9hc3NlcnQoYyksIChlKSkKKyNkZWZpbmUgYXBpX2NoZWNrKGwsZSkJCWx1YV9hc3NlcnQoZSkKKworI2Vsc2UKKworI2RlZmluZSBsdWFfYXNzZXJ0KGMpCQkoKHZvaWQpMCkKKyNkZWZpbmUgY2hlY2tfZXhwKGMsZSkJCShlKQorI2RlZmluZSBhcGlfY2hlY2sJCWx1YWlfYXBpY2hlY2sKKworI2VuZGlmCisKKworI2lmbmRlZiBVTlVTRUQKKyNkZWZpbmUgVU5VU0VEKHgpCSgodm9pZCkoeCkpCS8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisjZW5kaWYKKworCisjaWZuZGVmIGNhc3QKKyNkZWZpbmUgY2FzdCh0LCBleHApCSgodCkoZXhwKSkKKyNlbmRpZgorCisjZGVmaW5lIGNhc3RfYnl0ZShpKQljYXN0KGx1X2J5dGUsIChpKSkKKyNkZWZpbmUgY2FzdF9udW0oaSkJY2FzdChsdWFfTnVtYmVyLCAoaSkpCisjZGVmaW5lIGNhc3RfaW50KGkpCWNhc3QoaW50LCAoaSkpCisKKworCisvKgorKiogdHlwZSBmb3IgdmlydHVhbC1tYWNoaW5lIGluc3RydWN0aW9ucworKiogbXVzdCBiZSBhbiB1bnNpZ25lZCB3aXRoIChhdCBsZWFzdCkgNCBieXRlcyAoc2VlIGRldGFpbHMgaW4gbG9wY29kZXMuaCkKKyovCit0eXBlZGVmIGx1X2ludDMyIEluc3RydWN0aW9uOworCisKKworLyogbWF4aW11bSBzdGFjayBmb3IgYSBMdWEgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTUFYU1RBQ0sJMjUwCisKKworCisvKiBtaW5pbXVtIHNpemUgZm9yIHRoZSBzdHJpbmcgdGFibGUgKG11c3QgYmUgcG93ZXIgb2YgMikgKi8KKyNpZm5kZWYgTUlOU1RSVEFCU0laRQorI2RlZmluZSBNSU5TVFJUQUJTSVpFCTMyCisjZW5kaWYKKworCisvKiBtaW5pbXVtIHNpemUgZm9yIHN0cmluZyBidWZmZXIgKi8KKyNpZm5kZWYgTFVBX01JTkJVRkZFUgorI2RlZmluZSBMVUFfTUlOQlVGRkVSCTMyCisjZW5kaWYKKworCisjaWZuZGVmIGx1YV9sb2NrCisjZGVmaW5lIGx1YV9sb2NrKEwpICAgICAoKHZvaWQpIDApIAorI2RlZmluZSBsdWFfdW5sb2NrKEwpICAgKCh2b2lkKSAwKQorI2VuZGlmCisKKyNpZm5kZWYgbHVhaV90aHJlYWR5aWVsZAorI2RlZmluZSBsdWFpX3RocmVhZHlpZWxkKEwpICAgICB7bHVhX3VubG9jayhMKTsgbHVhX2xvY2soTCk7fQorI2VuZGlmCisKKworLyoKKyoqIG1hY3JvIHRvIGNvbnRyb2wgaW5jbHVzaW9uIG9mIHNvbWUgaGFyZCB0ZXN0cyBvbiBzdGFjayByZWFsbG9jYXRpb24KKyovIAorI2lmbmRlZiBIQVJEU1RBQ0tURVNUUworI2RlZmluZSBjb25kaGFyZHN0YWNrdGVzdHMoeCkJKCh2b2lkKTApCisjZWxzZQorI2RlZmluZSBjb25kaGFyZHN0YWNrdGVzdHMoeCkJeAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sbWF0aGxpYi5jIGIvbHVhLTUuMS40L3NyYy9sbWF0aGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWZiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xtYXRobGliLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisqKiAkSWQ6IGxtYXRobGliLmMsdiAxLjY3LjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIFN0YW5kYXJkIG1hdGhlbWF0aWNhbCBsaWJyYXJ5CisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIGxtYXRobGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworI3VuZGVmIFBJCisjZGVmaW5lIFBJICgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2KQorI2RlZmluZSBSQURJQU5TX1BFUl9ERUdSRUUgKFBJLzE4MC4wKQorCisKKworc3RhdGljIGludCBtYXRoX2FicyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGZhYnMobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX3NpbiAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIHNpbihsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfc2luaCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIHNpbmgobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2NvcyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGNvcyhsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfY29zaCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGNvc2gobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX3RhbiAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIHRhbihsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfdGFuaCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIHRhbmgobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2FzaW4gKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBhc2luKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9hY29zIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYWNvcyhsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfYXRhbiAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGF0YW4obHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2F0YW4yIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYXRhbjIobHVhTF9jaGVja251bWJlcihMLCAxKSwgbHVhTF9jaGVja251bWJlcihMLCAyKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2NlaWwgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBjZWlsKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9mbG9vciAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGZsb29yKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9mbW9kIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgZm1vZChsdWFMX2NoZWNrbnVtYmVyKEwsIDEpLCBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfbW9kZiAobHVhX1N0YXRlICpMKSB7CisgIGRvdWJsZSBpcDsKKyAgZG91YmxlIGZwID0gbW9kZihsdWFMX2NoZWNrbnVtYmVyKEwsIDEpLCAmaXApOworICBsdWFfcHVzaG51bWJlcihMLCBpcCk7CisgIGx1YV9wdXNobnVtYmVyKEwsIGZwKTsKKyAgcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9zcXJ0IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgc3FydChsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfcG93IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgcG93KGx1YUxfY2hlY2tudW1iZXIoTCwgMSksIGx1YUxfY2hlY2tudW1iZXIoTCwgMikpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9sb2cgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBsb2cobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2xvZzEwIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbG9nMTAobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2V4cCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGV4cChsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfZGVnIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbHVhTF9jaGVja251bWJlcihMLCAxKS9SQURJQU5TX1BFUl9ERUdSRUUpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX3JhZCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGx1YUxfY2hlY2tudW1iZXIoTCwgMSkqUkFESUFOU19QRVJfREVHUkVFKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9mcmV4cCAobHVhX1N0YXRlICpMKSB7CisgIGludCBlOworICBsdWFfcHVzaG51bWJlcihMLCBmcmV4cChsdWFMX2NoZWNrbnVtYmVyKEwsIDEpLCAmZSkpOworICBsdWFfcHVzaGludGVnZXIoTCwgZSk7CisgIHJldHVybiAyOworfQorCitzdGF0aWMgaW50IG1hdGhfbGRleHAgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBsZGV4cChsdWFMX2NoZWNrbnVtYmVyKEwsIDEpLCBsdWFMX2NoZWNraW50KEwsIDIpKSk7CisgIHJldHVybiAxOworfQorCisKKworc3RhdGljIGludCBtYXRoX21pbiAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gbHVhX2dldHRvcChMKTsgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgbHVhX051bWJlciBkbWluID0gbHVhTF9jaGVja251bWJlcihMLCAxKTsKKyAgaW50IGk7CisgIGZvciAoaT0yOyBpPD1uOyBpKyspIHsKKyAgICBsdWFfTnVtYmVyIGQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIGkpOworICAgIGlmIChkIDwgZG1pbikKKyAgICAgIGRtaW4gPSBkOworICB9CisgIGx1YV9wdXNobnVtYmVyKEwsIGRtaW4pOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IG1hdGhfbWF4IChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IG4gPSBsdWFfZ2V0dG9wKEwpOyAgLyogbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICBsdWFfTnVtYmVyIGRtYXggPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDEpOworICBpbnQgaTsKKyAgZm9yIChpPTI7IGk8PW47IGkrKykgeworICAgIGx1YV9OdW1iZXIgZCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgaSk7CisgICAgaWYgKGQgPiBkbWF4KQorICAgICAgZG1heCA9IGQ7CisgIH0KKyAgbHVhX3B1c2hudW1iZXIoTCwgZG1heCk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbWF0aF9yYW5kb20gKGx1YV9TdGF0ZSAqTCkgeworICAvKiB0aGUgYCUnIGF2b2lkcyB0aGUgKHJhcmUpIGNhc2Ugb2Ygcj09MSwgYW5kIGlzIG5lZWRlZCBhbHNvIGJlY2F1c2Ugb24KKyAgICAgc29tZSBzeXN0ZW1zIChTdW5PUyEpIGByYW5kKCknIG1heSByZXR1cm4gYSB2YWx1ZSBsYXJnZXIgdGhhbiBSQU5EX01BWCAqLworICBsdWFfTnVtYmVyIHIgPSAobHVhX051bWJlcikocmFuZCgpJVJBTkRfTUFYKSAvIChsdWFfTnVtYmVyKVJBTkRfTUFYOworICBzd2l0Y2ggKGx1YV9nZXR0b3AoTCkpIHsgIC8qIGNoZWNrIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgICBjYXNlIDA6IHsgIC8qIG5vIGFyZ3VtZW50cyAqLworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgcik7ICAvKiBOdW1iZXIgYmV0d2VlbiAwIGFuZCAxICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxOiB7ICAvKiBvbmx5IHVwcGVyIGxpbWl0ICovCisgICAgICBpbnQgdSA9IGx1YUxfY2hlY2tpbnQoTCwgMSk7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIDE8PXUsIDEsICJpbnRlcnZhbCBpcyBlbXB0eSIpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgZmxvb3Iocip1KSsxKTsgIC8qIGludCBiZXR3ZWVuIDEgYW5kIGB1JyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjogeyAgLyogbG93ZXIgYW5kIHVwcGVyIGxpbWl0cyAqLworICAgICAgaW50IGwgPSBsdWFMX2NoZWNraW50KEwsIDEpOworICAgICAgaW50IHUgPSBsdWFMX2NoZWNraW50KEwsIDIpOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsPD11LCAyLCAiaW50ZXJ2YWwgaXMgZW1wdHkiKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIGZsb29yKHIqKHUtbCsxKSkrbCk7ICAvKiBpbnQgYmV0d2VlbiBgbCcgYW5kIGB1JyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiBsdWFMX2Vycm9yKEwsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBtYXRoX3JhbmRvbXNlZWQgKGx1YV9TdGF0ZSAqTCkgeworICBzcmFuZChsdWFMX2NoZWNraW50KEwsIDEpKTsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIG1hdGhsaWJbXSA9IHsKKyAgeyJhYnMiLCAgIG1hdGhfYWJzfSwKKyAgeyJhY29zIiwgIG1hdGhfYWNvc30sCisgIHsiYXNpbiIsICBtYXRoX2FzaW59LAorICB7ImF0YW4yIiwgbWF0aF9hdGFuMn0sCisgIHsiYXRhbiIsICBtYXRoX2F0YW59LAorICB7ImNlaWwiLCAgbWF0aF9jZWlsfSwKKyAgeyJjb3NoIiwgICBtYXRoX2Nvc2h9LAorICB7ImNvcyIsICAgbWF0aF9jb3N9LAorICB7ImRlZyIsICAgbWF0aF9kZWd9LAorICB7ImV4cCIsICAgbWF0aF9leHB9LAorICB7ImZsb29yIiwgbWF0aF9mbG9vcn0sCisgIHsiZm1vZCIsICAgbWF0aF9mbW9kfSwKKyAgeyJmcmV4cCIsIG1hdGhfZnJleHB9LAorICB7ImxkZXhwIiwgbWF0aF9sZGV4cH0sCisgIHsibG9nMTAiLCBtYXRoX2xvZzEwfSwKKyAgeyJsb2ciLCAgIG1hdGhfbG9nfSwKKyAgeyJtYXgiLCAgIG1hdGhfbWF4fSwKKyAgeyJtaW4iLCAgIG1hdGhfbWlufSwKKyAgeyJtb2RmIiwgICBtYXRoX21vZGZ9LAorICB7InBvdyIsICAgbWF0aF9wb3d9LAorICB7InJhZCIsICAgbWF0aF9yYWR9LAorICB7InJhbmRvbSIsICAgICBtYXRoX3JhbmRvbX0sCisgIHsicmFuZG9tc2VlZCIsIG1hdGhfcmFuZG9tc2VlZH0sCisgIHsic2luaCIsICAgbWF0aF9zaW5ofSwKKyAgeyJzaW4iLCAgIG1hdGhfc2lufSwKKyAgeyJzcXJ0IiwgIG1hdGhfc3FydH0sCisgIHsidGFuaCIsICAgbWF0aF90YW5ofSwKKyAgeyJ0YW4iLCAgIG1hdGhfdGFufSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKKy8qCisqKiBPcGVuIG1hdGggbGlicmFyeQorKi8KK0xVQUxJQl9BUEkgaW50IGx1YW9wZW5fbWF0aCAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfcmVnaXN0ZXIoTCwgTFVBX01BVEhMSUJOQU1FLCBtYXRobGliKTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgUEkpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJwaSIpOworICBsdWFfcHVzaG51bWJlcihMLCBIVUdFX1ZBTCk7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgImh1Z2UiKTsKKyNpZiBkZWZpbmVkKExVQV9DT01QQVRfTU9EKQorICBsdWFfZ2V0ZmllbGQoTCwgLTEsICJmbW9kIik7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIm1vZCIpOworI2VuZGlmCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xtZW0uYyBiL2x1YS01LjEuNC9zcmMvbG1lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlN2Q4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xtZW0uYwpAQCAtMCwwICsxLDg2IEBACisvKgorKiogJElkOiBsbWVtLmMsdiAxLjcwLjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIEludGVyZmFjZSB0byBNZW1vcnkgTWFuYWdlcgorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIGxtZW1fYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsZGVidWcuaCIKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorCisKKworLyoKKyoqIEFib3V0IHRoZSByZWFsbG9jIGZ1bmN0aW9uOgorKiogdm9pZCAqIGZyZWFsbG9jICh2b2lkICp1ZCwgdm9pZCAqcHRyLCBzaXplX3Qgb3NpemUsIHNpemVfdCBuc2l6ZSk7CisqKiAoYG9zaXplJyBpcyB0aGUgb2xkIHNpemUsIGBuc2l6ZScgaXMgdGhlIG5ldyBzaXplKQorKioKKyoqIEx1YSBlbnN1cmVzIHRoYXQgKHB0ciA9PSBOVUxMKSBpZmYgKG9zaXplID09IDApLgorKioKKyoqICogZnJlYWxsb2ModWQsIE5VTEwsIDAsIHgpIGNyZWF0ZXMgYSBuZXcgYmxvY2sgb2Ygc2l6ZSBgeCcKKyoqCisqKiAqIGZyZWFsbG9jKHVkLCBwLCB4LCAwKSBmcmVlcyB0aGUgYmxvY2sgYHAnCisqKiAoaW4gdGhpcyBzcGVjaWZpYyBjYXNlLCBmcmVhbGxvYyBtdXN0IHJldHVybiBOVUxMKS4KKyoqIHBhcnRpY3VsYXJseSwgZnJlYWxsb2ModWQsIE5VTEwsIDAsIDApIGRvZXMgbm90aGluZworKiogKHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gZnJlZShOVUxMKSBpbiBBTlNJIEMpCisqKgorKiogZnJlYWxsb2MgcmV0dXJucyBOVUxMIGlmIGl0IGNhbm5vdCBjcmVhdGUgb3IgcmVhbGxvY2F0ZSB0aGUgYXJlYQorKiogKGFueSByZWFsbG9jYXRpb24gdG8gYW4gZXF1YWwgb3Igc21hbGxlciBzaXplIGNhbm5vdCBmYWlsISkKKyovCisKKworCisjZGVmaW5lIE1JTlNJWkVBUlJBWQk0CisKKwordm9pZCAqbHVhTV9ncm93YXV4XyAobHVhX1N0YXRlICpMLCB2b2lkICpibG9jaywgaW50ICpzaXplLCBzaXplX3Qgc2l6ZV9lbGVtcywKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW1pdCwgY29uc3QgY2hhciAqZXJyb3Jtc2cpIHsKKyAgdm9pZCAqbmV3YmxvY2s7CisgIGludCBuZXdzaXplOworICBpZiAoKnNpemUgPj0gbGltaXQvMikgeyAgLyogY2Fubm90IGRvdWJsZSBpdD8gKi8KKyAgICBpZiAoKnNpemUgPj0gbGltaXQpICAvKiBjYW5ub3QgZ3JvdyBldmVuIGEgbGl0dGxlPyAqLworICAgICAgbHVhR19ydW5lcnJvcihMLCBlcnJvcm1zZyk7CisgICAgbmV3c2l6ZSA9IGxpbWl0OyAgLyogc3RpbGwgaGF2ZSBhdCBsZWFzdCBvbmUgZnJlZSBwbGFjZSAqLworICB9CisgIGVsc2UgeworICAgIG5ld3NpemUgPSAoKnNpemUpKjI7CisgICAgaWYgKG5ld3NpemUgPCBNSU5TSVpFQVJSQVkpCisgICAgICBuZXdzaXplID0gTUlOU0laRUFSUkFZOyAgLyogbWluaW11bSBzaXplICovCisgIH0KKyAgbmV3YmxvY2sgPSBsdWFNX3JlYWxsb2N2KEwsIGJsb2NrLCAqc2l6ZSwgbmV3c2l6ZSwgc2l6ZV9lbGVtcyk7CisgICpzaXplID0gbmV3c2l6ZTsgIC8qIHVwZGF0ZSBvbmx5IHdoZW4gZXZlcnl0aGluZyBlbHNlIGlzIE9LICovCisgIHJldHVybiBuZXdibG9jazsKK30KKworCit2b2lkICpsdWFNX3Rvb2JpZyAobHVhX1N0YXRlICpMKSB7CisgIGx1YUdfcnVuZXJyb3IoTCwgIm1lbW9yeSBhbGxvY2F0aW9uIGVycm9yOiBibG9jayB0b28gYmlnIik7CisgIHJldHVybiBOVUxMOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KK30KKworCisKKy8qCisqKiBnZW5lcmljIGFsbG9jYXRpb24gcm91dGluZS4KKyovCit2b2lkICpsdWFNX3JlYWxsb2NfIChsdWFfU3RhdGUgKkwsIHZvaWQgKmJsb2NrLCBzaXplX3Qgb3NpemUsIHNpemVfdCBuc2l6ZSkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBsdWFfYXNzZXJ0KChvc2l6ZSA9PSAwKSA9PSAoYmxvY2sgPT0gTlVMTCkpOworICBibG9jayA9ICgqZy0+ZnJlYWxsb2MpKGctPnVkLCBibG9jaywgb3NpemUsIG5zaXplKTsKKyAgaWYgKGJsb2NrID09IE5VTEwgJiYgbnNpemUgPiAwKQorICAgIGx1YURfdGhyb3coTCwgTFVBX0VSUk1FTSk7CisgIGx1YV9hc3NlcnQoKG5zaXplID09IDApID09IChibG9jayA9PSBOVUxMKSk7CisgIGctPnRvdGFsYnl0ZXMgPSAoZy0+dG90YWxieXRlcyAtIG9zaXplKSArIG5zaXplOworICByZXR1cm4gYmxvY2s7Cit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbG1lbS5oIGIvbHVhLTUuMS40L3NyYy9sbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZGNiMwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbG1lbS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisqKiAkSWQ6IGxtZW0uaCx2IDEuMzEuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogSW50ZXJmYWNlIHRvIE1lbW9yeSBNYW5hZ2VyCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsbWVtX2gKKyNkZWZpbmUgbG1lbV9oCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGxpbWl0cy5oIgorI2luY2x1ZGUgImx1YS5oIgorCisjZGVmaW5lIE1FTUVSUk1TRwkibm90IGVub3VnaCBtZW1vcnkiCisKKworI2RlZmluZSBsdWFNX3JlYWxsb2N2KEwsYixvbixuLGUpIFwKKwkoKGNhc3Qoc2l6ZV90LCAobikrMSkgPD0gTUFYX1NJWkVULyhlKSkgPyAgLyogKzEgdG8gYXZvaWQgd2FybmluZ3MgKi8gXAorCQlsdWFNX3JlYWxsb2NfKEwsIChiKSwgKG9uKSooZSksIChuKSooZSkpIDogXAorCQlsdWFNX3Rvb2JpZyhMKSkKKworI2RlZmluZSBsdWFNX2ZyZWVtZW0oTCwgYiwgcykJbHVhTV9yZWFsbG9jXyhMLCAoYiksIChzKSwgMCkKKyNkZWZpbmUgbHVhTV9mcmVlKEwsIGIpCQlsdWFNX3JlYWxsb2NfKEwsIChiKSwgc2l6ZW9mKCooYikpLCAwKQorI2RlZmluZSBsdWFNX2ZyZWVhcnJheShMLCBiLCBuLCB0KSAgIGx1YU1fcmVhbGxvY3YoTCwgKGIpLCBuLCAwLCBzaXplb2YodCkpCisKKyNkZWZpbmUgbHVhTV9tYWxsb2MoTCx0KQlsdWFNX3JlYWxsb2NfKEwsIE5VTEwsIDAsICh0KSkKKyNkZWZpbmUgbHVhTV9uZXcoTCx0KQkJY2FzdCh0ICosIGx1YU1fbWFsbG9jKEwsIHNpemVvZih0KSkpCisjZGVmaW5lIGx1YU1fbmV3dmVjdG9yKEwsbix0KSBcCisJCWNhc3QodCAqLCBsdWFNX3JlYWxsb2N2KEwsIE5VTEwsIDAsIG4sIHNpemVvZih0KSkpCisKKyNkZWZpbmUgbHVhTV9ncm93dmVjdG9yKEwsdixuZWxlbXMsc2l6ZSx0LGxpbWl0LGUpIFwKKyAgICAgICAgICBpZiAoKG5lbGVtcykrMSA+IChzaXplKSkgXAorICAgICAgICAgICAgKCh2KT1jYXN0KHQgKiwgbHVhTV9ncm93YXV4XyhMLHYsJihzaXplKSxzaXplb2YodCksbGltaXQsZSkpKQorCisjZGVmaW5lIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCB2LG9sZG4sbix0KSBcCisgICAoKHYpPWNhc3QodCAqLCBsdWFNX3JlYWxsb2N2KEwsIHYsIG9sZG4sIG4sIHNpemVvZih0KSkpKQorCisKK0xVQUlfRlVOQyB2b2lkICpsdWFNX3JlYWxsb2NfIChsdWFfU3RhdGUgKkwsIHZvaWQgKmJsb2NrLCBzaXplX3Qgb2xkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CitMVUFJX0ZVTkMgdm9pZCAqbHVhTV90b29iaWcgKGx1YV9TdGF0ZSAqTCk7CitMVUFJX0ZVTkMgdm9pZCAqbHVhTV9ncm93YXV4XyAobHVhX1N0YXRlICpMLCB2b2lkICpibG9jaywgaW50ICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX2VsZW0sIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcm1zZyk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xvYWRsaWIuYyBiL2x1YS01LjEuNC9zcmMvbG9hZGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDAxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xvYWRsaWIuYwpAQCAtMCwwICsxLDY2NiBAQAorLyoKKyoqICRJZDogbG9hZGxpYi5jLHYgMS41Mi4xLjMgMjAwOC8wOC8wNiAxMzoyOToyOCByb2JlcnRvIEV4cCAkCisqKiBEeW5hbWljIGxpYnJhcnkgbG9hZGVyIGZvciBMdWEKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqKgorKiogVGhpcyBtb2R1bGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgbG9hZGxpYiBmb3IgVW5peCBzeXN0ZW1zCisqKiB0aGF0IGhhdmUgZGxmY24sIGFuIGltcGxlbWVudGF0aW9uIGZvciBEYXJ3aW4gKE1hYyBPUyBYKSwgYW4KKyoqIGltcGxlbWVudGF0aW9uIGZvciBXaW5kb3dzLCBhbmQgYSBzdHViIGZvciBvdGhlciBzeXN0ZW1zLgorKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworI2RlZmluZSBsb2FkbGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworLyogcHJlZml4IGZvciBvcGVuIGZ1bmN0aW9ucyBpbiBDIGxpYnJhcmllcyAqLworI2RlZmluZSBMVUFfUE9GCQkibHVhb3Blbl8iCisKKy8qIHNlcGFyYXRvciBmb3Igb3BlbiBmdW5jdGlvbnMgaW4gQyBsaWJyYXJpZXMgKi8KKyNkZWZpbmUgTFVBX09GU0VQCSJfIgorCisKKyNkZWZpbmUgTElCUFJFRklYCSJMT0FETElCOiAiCisKKyNkZWZpbmUgUE9GCQlMVUFfUE9GCisjZGVmaW5lIExJQl9GQUlMCSJvcGVuIgorCisKKy8qIGVycm9yIGNvZGVzIGZvciBsbF9sb2FkZnVuYyAqLworI2RlZmluZSBFUlJMSUIJCTEKKyNkZWZpbmUgRVJSRlVOQwkJMgorCisjZGVmaW5lIHNldHByb2dkaXIoTCkJCSgodm9pZCkwKQorCisKK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKTsKK3N0YXRpYyB2b2lkICpsbF9sb2FkIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnBhdGgpOworc3RhdGljIGx1YV9DRnVuY3Rpb24gbGxfc3ltIChsdWFfU3RhdGUgKkwsIHZvaWQgKmxpYiwgY29uc3QgY2hhciAqc3ltKTsKKworCisKKyNpZiBkZWZpbmVkKExVQV9ETF9ETE9QRU4pCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBsb2FkbGliIGJhc2VkIG9uIHRoZSBkbGZjbiBpbnRlcmZhY2UuCisqKiBUaGUgZGxmY24gaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSBpbiBMaW51eCwgU3VuT1MsIFNvbGFyaXMsIElSSVgsIEZyZWVCU0QsCisqKiBOZXRCU0QsIEFJWCA0LjIsIEhQVVggMTEsIGFuZCAgcHJvYmFibHkgbW9zdCBvdGhlciBVbml4IGZsYXZvcnMsIGF0IGxlYXN0CisqKiBhcyBhbiBlbXVsYXRpb24gbGF5ZXIgb24gdG9wIG9mIG5hdGl2ZSBmdW5jdGlvbnMuCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaW5jbHVkZSA8ZGxmY24uaD4KKworc3RhdGljIHZvaWQgbGxfdW5sb2FkbGliICh2b2lkICpsaWIpIHsKKyAgZGxjbG9zZShsaWIpOworfQorCisKK3N0YXRpYyB2b2lkICpsbF9sb2FkIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgdm9pZCAqbGliID0gZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKKyAgaWYgKGxpYiA9PSBOVUxMKSBsdWFfcHVzaHN0cmluZyhMLCBkbGVycm9yKCkpOworICByZXR1cm4gbGliOworfQorCisKK3N0YXRpYyBsdWFfQ0Z1bmN0aW9uIGxsX3N5bSAobHVhX1N0YXRlICpMLCB2b2lkICpsaWIsIGNvbnN0IGNoYXIgKnN5bSkgeworICBsdWFfQ0Z1bmN0aW9uIGYgPSAobHVhX0NGdW5jdGlvbilkbHN5bShsaWIsIHN5bSk7CisgIGlmIChmID09IE5VTEwpIGx1YV9wdXNoc3RyaW5nKEwsIGRsZXJyb3IoKSk7CisgIHJldHVybiBmOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisjZWxpZiBkZWZpbmVkKExVQV9ETF9ETEwpCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgbG9hZGxpYiBmb3IgV2luZG93cyB1c2luZyBuYXRpdmUgZnVuY3Rpb25zLgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKworI3VuZGVmIHNldHByb2dkaXIKKworc3RhdGljIHZvaWQgc2V0cHJvZ2RpciAobHVhX1N0YXRlICpMKSB7CisgIGNoYXIgYnVmZltNQVhfUEFUSCArIDFdOworICBjaGFyICpsYjsKKyAgRFdPUkQgbnNpemUgPSBzaXplb2YoYnVmZikvc2l6ZW9mKGNoYXIpOworICBEV09SRCBuID0gR2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsIGJ1ZmYsIG5zaXplKTsKKyAgaWYgKG4gPT0gMCB8fCBuID09IG5zaXplIHx8IChsYiA9IHN0cnJjaHIoYnVmZiwgJ1xcJykpID09IE5VTEwpCisgICAgbHVhTF9lcnJvcihMLCAidW5hYmxlIHRvIGdldCBNb2R1bGVGaWxlTmFtZSIpOworICBlbHNlIHsKKyAgICAqbGIgPSAnXDAnOworICAgIGx1YUxfZ3N1YihMLCBsdWFfdG9zdHJpbmcoTCwgLTEpLCBMVUFfRVhFQ0RJUiwgYnVmZik7CisgICAgbHVhX3JlbW92ZShMLCAtMik7ICAvKiByZW1vdmUgb3JpZ2luYWwgc3RyaW5nICovCisgIH0KK30KKworCitzdGF0aWMgdm9pZCBwdXNoZXJyb3IgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgY2hhciBidWZmZXJbMTI4XTsKKyAgaWYgKEZvcm1hdE1lc3NhZ2VBKEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICBOVUxMLCBlcnJvciwgMCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgTlVMTCkpCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgYnVmZmVyKTsKKyAgZWxzZQorICAgIGx1YV9wdXNoZnN0cmluZyhMLCAic3lzdGVtIGVycm9yICVkXG4iLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKSB7CisgIEZyZWVMaWJyYXJ5KChISU5TVEFOQ0UpbGliKTsKK30KKworCitzdGF0aWMgdm9pZCAqbGxfbG9hZCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpwYXRoKSB7CisgIEhJTlNUQU5DRSBsaWIgPSBMb2FkTGlicmFyeUEocGF0aCk7CisgIGlmIChsaWIgPT0gTlVMTCkgcHVzaGVycm9yKEwpOworICByZXR1cm4gbGliOworfQorCisKK3N0YXRpYyBsdWFfQ0Z1bmN0aW9uIGxsX3N5bSAobHVhX1N0YXRlICpMLCB2b2lkICpsaWIsIGNvbnN0IGNoYXIgKnN5bSkgeworICBsdWFfQ0Z1bmN0aW9uIGYgPSAobHVhX0NGdW5jdGlvbilHZXRQcm9jQWRkcmVzcygoSElOU1RBTkNFKWxpYiwgc3ltKTsKKyAgaWYgKGYgPT0gTlVMTCkgcHVzaGVycm9yKEwpOworICByZXR1cm4gZjsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKworI2VsaWYgZGVmaW5lZChMVUFfRExfRFlMRCkKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogTmF0aXZlIE1hYyBPUyBYIC8gRGFyd2luIEltcGxlbWVudGF0aW9uCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2luY2x1ZGUgPG1hY2gtby9keWxkLmg+CisKKworLyogTWFjIGFwcGVuZHMgYSBgXycgYmVmb3JlIEMgZnVuY3Rpb24gbmFtZXMgKi8KKyN1bmRlZiBQT0YKKyNkZWZpbmUgUE9GCSJfIiBMVUFfUE9GCisKKworc3RhdGljIHZvaWQgcHVzaGVycm9yIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZXJyX3N0cjsKKyAgY29uc3QgY2hhciAqZXJyX2ZpbGU7CisgIE5TTGlua0VkaXRFcnJvcnMgZXJyOworICBpbnQgZXJyX251bTsKKyAgTlNMaW5rRWRpdEVycm9yKCZlcnIsICZlcnJfbnVtLCAmZXJyX2ZpbGUsICZlcnJfc3RyKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyX3N0cik7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmVycm9yZnJvbWNvZGUgKE5TT2JqZWN0RmlsZUltYWdlUmV0dXJuQ29kZSByZXQpIHsKKyAgc3dpdGNoIChyZXQpIHsKKyAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlSW5hcHByb3ByaWF0ZUZpbGU6CisgICAgICByZXR1cm4gImZpbGUgaXMgbm90IGEgYnVuZGxlIjsKKyAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlQXJjaDoKKyAgICAgIHJldHVybiAibGlicmFyeSBpcyBmb3Igd3JvbmcgQ1BVIHR5cGUiOworICAgIGNhc2UgTlNPYmplY3RGaWxlSW1hZ2VGb3JtYXQ6CisgICAgICByZXR1cm4gImJhZCBmb3JtYXQiOworICAgIGNhc2UgTlNPYmplY3RGaWxlSW1hZ2VBY2Nlc3M6CisgICAgICByZXR1cm4gImNhbm5vdCBhY2Nlc3MgZmlsZSI7CisgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUZhaWx1cmU6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAidW5hYmxlIHRvIGxvYWQgbGlicmFyeSI7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBsbF91bmxvYWRsaWIgKHZvaWQgKmxpYikgeworICBOU1VuTGlua01vZHVsZSgoTlNNb2R1bGUpbGliLCBOU1VOTElOS01PRFVMRV9PUFRJT05fUkVTRVRfTEFaWV9SRUZFUkVOQ0VTKTsKK30KKworCitzdGF0aWMgdm9pZCAqbGxfbG9hZCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpwYXRoKSB7CisgIE5TT2JqZWN0RmlsZUltYWdlIGltZzsKKyAgTlNPYmplY3RGaWxlSW1hZ2VSZXR1cm5Db2RlIHJldDsKKyAgLyogdGhpcyB3b3VsZCBiZSBhIHJhcmUgY2FzZSwgYnV0IHByZXZlbnRzIGNyYXNoaW5nIGlmIGl0IGhhcHBlbnMgKi8KKyAgaWYoIV9keWxkX3ByZXNlbnQoKSkgeworICAgIGx1YV9wdXNobGl0ZXJhbChMLCAiZHlsZCBub3QgcHJlc2VudCIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldCA9IE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUocGF0aCwgJmltZyk7CisgIGlmIChyZXQgPT0gTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzKSB7CisgICAgTlNNb2R1bGUgbW9kID0gTlNMaW5rTW9kdWxlKGltZywgcGF0aCwgTlNMSU5LTU9EVUxFX09QVElPTl9QUklWQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOworICAgIE5TRGVzdHJveU9iamVjdEZpbGVJbWFnZShpbWcpOworICAgIGlmIChtb2QgPT0gTlVMTCkgcHVzaGVycm9yKEwpOworICAgIHJldHVybiBtb2Q7CisgIH0KKyAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyb3Jmcm9tY29kZShyZXQpKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGx1YV9DRnVuY3Rpb24gbGxfc3ltIChsdWFfU3RhdGUgKkwsIHZvaWQgKmxpYiwgY29uc3QgY2hhciAqc3ltKSB7CisgIE5TU3ltYm9sIG5zcyA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUoKE5TTW9kdWxlKWxpYiwgc3ltKTsKKyAgaWYgKG5zcyA9PSBOVUxMKSB7CisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJzeW1ib2wgIiBMVUFfUVMgIiBub3QgZm91bmQiLCBzeW0pOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAobHVhX0NGdW5jdGlvbilOU0FkZHJlc3NPZlN5bWJvbChuc3MpOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisjZWxzZQorLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIEZhbGxiYWNrIGZvciBvdGhlciBzeXN0ZW1zCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjdW5kZWYgTElCX0ZBSUwKKyNkZWZpbmUgTElCX0ZBSUwJImFic2VudCIKKworCisjZGVmaW5lIERMTVNHCSJkeW5hbWljIGxpYnJhcmllcyBub3QgZW5hYmxlZDsgY2hlY2sgeW91ciBMdWEgaW5zdGFsbGF0aW9uIgorCisKK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKSB7CisgICh2b2lkKWxpYjsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCit9CisKKworc3RhdGljIHZvaWQgKmxsX2xvYWQgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcGF0aCkgeworICAodm9pZClwYXRoOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KKyAgbHVhX3B1c2hsaXRlcmFsKEwsIERMTVNHKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGx1YV9DRnVuY3Rpb24gbGxfc3ltIChsdWFfU3RhdGUgKkwsIHZvaWQgKmxpYiwgY29uc3QgY2hhciAqc3ltKSB7CisgICh2b2lkKWxpYjsgKHZvaWQpc3ltOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KKyAgbHVhX3B1c2hsaXRlcmFsKEwsIERMTVNHKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNlbmRpZgorCisKKworc3RhdGljIHZvaWQgKipsbF9yZWdpc3RlciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpwYXRoKSB7CisgIHZvaWQgKipwbGliOworICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzJXMiLCBMSUJQUkVGSVgsIHBhdGgpOworICBsdWFfZ2V0dGFibGUoTCwgTFVBX1JFR0lTVFJZSU5ERVgpOyAgLyogY2hlY2sgbGlicmFyeSBpbiByZWdpc3RyeT8gKi8KKyAgaWYgKCFsdWFfaXNuaWwoTCwgLTEpKSAgLyogaXMgdGhlcmUgYW4gZW50cnk/ICovCisgICAgcGxpYiA9ICh2b2lkICoqKWx1YV90b3VzZXJkYXRhKEwsIC0xKTsKKyAgZWxzZSB7ICAvKiBubyBlbnRyeSB5ZXQ7IGNyZWF0ZSBvbmUgKi8KKyAgICBsdWFfcG9wKEwsIDEpOworICAgIHBsaWIgPSAodm9pZCAqKilsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKGNvbnN0IHZvaWQgKikpOworICAgICpwbGliID0gTlVMTDsKKyAgICBsdWFMX2dldG1ldGF0YWJsZShMLCAiX0xPQURMSUIiKTsKKyAgICBsdWFfc2V0bWV0YXRhYmxlKEwsIC0yKTsKKyAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzJXMiLCBMSUJQUkVGSVgsIHBhdGgpOworICAgIGx1YV9wdXNodmFsdWUoTCwgLTIpOworICAgIGx1YV9zZXR0YWJsZShMLCBMVUFfUkVHSVNUUllJTkRFWCk7CisgIH0KKyAgcmV0dXJuIHBsaWI7Cit9CisKKworLyoKKyoqIF9fZ2MgdGFnIG1ldGhvZDogY2FsbHMgbGlicmFyeSdzIGBsbF91bmxvYWRsaWInIGZ1bmN0aW9uIHdpdGggdGhlIGxpYgorKiogaGFuZGxlCisqLworc3RhdGljIGludCBnY3RtIChsdWFfU3RhdGUgKkwpIHsKKyAgdm9pZCAqKmxpYiA9ICh2b2lkICoqKWx1YUxfY2hlY2t1ZGF0YShMLCAxLCAiX0xPQURMSUIiKTsKKyAgaWYgKCpsaWIpIGxsX3VubG9hZGxpYigqbGliKTsKKyAgKmxpYiA9IE5VTEw7ICAvKiBtYXJrIGxpYnJhcnkgYXMgY2xvc2VkICovCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbGxfbG9hZGZ1bmMgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3ltKSB7CisgIHZvaWQgKipyZWcgPSBsbF9yZWdpc3RlcihMLCBwYXRoKTsKKyAgaWYgKCpyZWcgPT0gTlVMTCkgKnJlZyA9IGxsX2xvYWQoTCwgcGF0aCk7CisgIGlmICgqcmVnID09IE5VTEwpCisgICAgcmV0dXJuIEVSUkxJQjsgIC8qIHVuYWJsZSB0byBsb2FkIGxpYnJhcnkgKi8KKyAgZWxzZSB7CisgICAgbHVhX0NGdW5jdGlvbiBmID0gbGxfc3ltKEwsICpyZWcsIHN5bSk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgIHJldHVybiBFUlJGVU5DOyAgLyogdW5hYmxlIHRvIGZpbmQgZnVuY3Rpb24gKi8KKyAgICBsdWFfcHVzaGNmdW5jdGlvbihMLCBmKTsKKyAgICByZXR1cm4gMDsgIC8qIHJldHVybiBmdW5jdGlvbiAqLworICB9Cit9CisKKworc3RhdGljIGludCBsbF9sb2FkbGliIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqcGF0aCA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGNvbnN0IGNoYXIgKmluaXQgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICBpbnQgc3RhdCA9IGxsX2xvYWRmdW5jKEwsIHBhdGgsIGluaXQpOworICBpZiAoc3RhdCA9PSAwKSAgLyogbm8gZXJyb3JzPyAqLworICAgIHJldHVybiAxOyAgLyogcmV0dXJuIHRoZSBsb2FkZWQgZnVuY3Rpb24gKi8KKyAgZWxzZSB7ICAvKiBlcnJvcjsgZXJyb3IgbWVzc2FnZSBpcyBvbiBzdGFjayB0b3AgKi8KKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgICBsdWFfaW5zZXJ0KEwsIC0yKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAoc3RhdCA9PSBFUlJMSUIpID8gIExJQl9GQUlMIDogImluaXQiKTsKKyAgICByZXR1cm4gMzsgIC8qIHJldHVybiBuaWwsIGVycm9yIG1lc3NhZ2UsIGFuZCB3aGVyZSAqLworICB9Cit9CisKKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogJ3JlcXVpcmUnIGZ1bmN0aW9uCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKK3N0YXRpYyBpbnQgcmVhZGFibGUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CisgIEZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsgIC8qIHRyeSB0byBvcGVuIGZpbGUgKi8KKyAgaWYgKGYgPT0gTlVMTCkgcmV0dXJuIDA7ICAvKiBvcGVuIGZhaWxlZCAqLworICBmY2xvc2UoZik7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpwdXNobmV4dHRlbXBsYXRlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgY29uc3QgY2hhciAqbDsKKyAgd2hpbGUgKCpwYXRoID09ICpMVUFfUEFUSFNFUCkgcGF0aCsrOyAgLyogc2tpcCBzZXBhcmF0b3JzICovCisgIGlmICgqcGF0aCA9PSAnXDAnKSByZXR1cm4gTlVMTDsgIC8qIG5vIG1vcmUgdGVtcGxhdGVzICovCisgIGwgPSBzdHJjaHIocGF0aCwgKkxVQV9QQVRIU0VQKTsgIC8qIGZpbmQgbmV4dCBzZXBhcmF0b3IgKi8KKyAgaWYgKGwgPT0gTlVMTCkgbCA9IHBhdGggKyBzdHJsZW4ocGF0aCk7CisgIGx1YV9wdXNobHN0cmluZyhMLCBwYXRoLCBsIC0gcGF0aCk7ICAvKiB0ZW1wbGF0ZSAqLworICByZXR1cm4gbDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqZmluZGZpbGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwbmFtZSkgeworICBjb25zdCBjaGFyICpwYXRoOworICBuYW1lID0gbHVhTF9nc3ViKEwsIG5hbWUsICIuIiwgTFVBX0RJUlNFUCk7CisgIGx1YV9nZXRmaWVsZChMLCBMVUFfRU5WSVJPTklOREVYLCBwbmFtZSk7CisgIHBhdGggPSBsdWFfdG9zdHJpbmcoTCwgLTEpOworICBpZiAocGF0aCA9PSBOVUxMKQorICAgIGx1YUxfZXJyb3IoTCwgTFVBX1FMKCJwYWNrYWdlLiVzIikgIiBtdXN0IGJlIGEgc3RyaW5nIiwgcG5hbWUpOworICBsdWFfcHVzaGxpdGVyYWwoTCwgIiIpOyAgLyogZXJyb3IgYWNjdW11bGF0b3IgKi8KKyAgd2hpbGUgKChwYXRoID0gcHVzaG5leHR0ZW1wbGF0ZShMLCBwYXRoKSkgIT0gTlVMTCkgeworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgIGZpbGVuYW1lID0gbHVhTF9nc3ViKEwsIGx1YV90b3N0cmluZyhMLCAtMSksIExVQV9QQVRIX01BUkssIG5hbWUpOworICAgIGx1YV9yZW1vdmUoTCwgLTIpOyAgLyogcmVtb3ZlIHBhdGggdGVtcGxhdGUgKi8KKyAgICBpZiAocmVhZGFibGUoZmlsZW5hbWUpKSAgLyogZG9lcyBmaWxlIGV4aXN0IGFuZCBpcyByZWFkYWJsZT8gKi8KKyAgICAgIHJldHVybiBmaWxlbmFtZTsgIC8qIHJldHVybiB0aGF0IGZpbGUgbmFtZSAqLworICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiXG5cdG5vIGZpbGUgIiBMVUFfUVMsIGZpbGVuYW1lKTsKKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSBmaWxlIG5hbWUgKi8KKyAgICBsdWFfY29uY2F0KEwsIDIpOyAgLyogYWRkIGVudHJ5IHRvIHBvc3NpYmxlIGVycm9yIG1lc3NhZ2UgKi8KKyAgfQorICByZXR1cm4gTlVMTDsgIC8qIG5vdCBmb3VuZCAqLworfQorCisKK3N0YXRpYyB2b2lkIGxvYWRlcnJvciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmaWxlbmFtZSkgeworICBsdWFMX2Vycm9yKEwsICJlcnJvciBsb2FkaW5nIG1vZHVsZSAiIExVQV9RUyAiIGZyb20gZmlsZSAiIExVQV9RUyAiOlxuXHQlcyIsCisgICAgICAgICAgICAgICAgbHVhX3Rvc3RyaW5nKEwsIDEpLCBmaWxlbmFtZSwgbHVhX3Rvc3RyaW5nKEwsIC0xKSk7Cit9CisKKworc3RhdGljIGludCBsb2FkZXJfTHVhIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICBmaWxlbmFtZSA9IGZpbmRmaWxlKEwsIG5hbWUsICJwYXRoIik7CisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSByZXR1cm4gMTsgIC8qIGxpYnJhcnkgbm90IGZvdW5kIGluIHRoaXMgcGF0aCAqLworICBpZiAobHVhTF9sb2FkZmlsZShMLCBmaWxlbmFtZSkgIT0gMCkKKyAgICBsb2FkZXJyb3IoTCwgZmlsZW5hbWUpOworICByZXR1cm4gMTsgIC8qIGxpYnJhcnkgbG9hZGVkIHN1Y2Nlc3NmdWxseSAqLworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpta2Z1bmNuYW1lIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm1vZG5hbWUpIHsKKyAgY29uc3QgY2hhciAqZnVuY25hbWU7CisgIGNvbnN0IGNoYXIgKm1hcmsgPSBzdHJjaHIobW9kbmFtZSwgKkxVQV9JR01BUkspOworICBpZiAobWFyaykgbW9kbmFtZSA9IG1hcmsgKyAxOworICBmdW5jbmFtZSA9IGx1YUxfZ3N1YihMLCBtb2RuYW1lLCAiLiIsIExVQV9PRlNFUCk7CisgIGZ1bmNuYW1lID0gbHVhX3B1c2hmc3RyaW5nKEwsIFBPRiIlcyIsIGZ1bmNuYW1lKTsKKyAgbHVhX3JlbW92ZShMLCAtMik7ICAvKiByZW1vdmUgJ2dzdWInIHJlc3VsdCAqLworICByZXR1cm4gZnVuY25hbWU7Cit9CisKKworc3RhdGljIGludCBsb2FkZXJfQyAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lOworICBjb25zdCBjaGFyICpuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBmaW5kZmlsZShMLCBuYW1lLCAiY3BhdGgiKTsKKyAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHJldHVybiAxOyAgLyogbGlicmFyeSBub3QgZm91bmQgaW4gdGhpcyBwYXRoICovCisgIGZ1bmNuYW1lID0gbWtmdW5jbmFtZShMLCBuYW1lKTsKKyAgaWYgKGxsX2xvYWRmdW5jKEwsIGZpbGVuYW1lLCBmdW5jbmFtZSkgIT0gMCkKKyAgICBsb2FkZXJyb3IoTCwgZmlsZW5hbWUpOworICByZXR1cm4gMTsgIC8qIGxpYnJhcnkgbG9hZGVkIHN1Y2Nlc3NmdWxseSAqLworfQorCisKK3N0YXRpYyBpbnQgbG9hZGVyX0Nyb290IChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZnVuY25hbWU7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICBjb25zdCBjaGFyICpuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgY29uc3QgY2hhciAqcCA9IHN0cmNocihuYW1lLCAnLicpOworICBpbnQgc3RhdDsKKyAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIDA7ICAvKiBpcyByb290ICovCisgIGx1YV9wdXNobHN0cmluZyhMLCBuYW1lLCBwIC0gbmFtZSk7CisgIGZpbGVuYW1lID0gZmluZGZpbGUoTCwgbHVhX3Rvc3RyaW5nKEwsIC0xKSwgImNwYXRoIik7CisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSByZXR1cm4gMTsgIC8qIHJvb3Qgbm90IGZvdW5kICovCisgIGZ1bmNuYW1lID0gbWtmdW5jbmFtZShMLCBuYW1lKTsKKyAgaWYgKChzdGF0ID0gbGxfbG9hZGZ1bmMoTCwgZmlsZW5hbWUsIGZ1bmNuYW1lKSkgIT0gMCkgeworICAgIGlmIChzdGF0ICE9IEVSUkZVTkMpIGxvYWRlcnJvcihMLCBmaWxlbmFtZSk7ICAvKiByZWFsIGVycm9yICovCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJcblx0bm8gbW9kdWxlICIgTFVBX1FTICIgaW4gZmlsZSAiIExVQV9RUywKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmlsZW5hbWUpOworICAgIHJldHVybiAxOyAgLyogZnVuY3Rpb24gbm90IGZvdW5kICovCisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsb2FkZXJfcHJlbG9hZCAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICBsdWFfZ2V0ZmllbGQoTCwgTFVBX0VOVklST05JTkRFWCwgInByZWxvYWQiKTsKKyAgaWYgKCFsdWFfaXN0YWJsZShMLCAtMSkpCisgICAgbHVhTF9lcnJvcihMLCBMVUFfUUwoInBhY2thZ2UucHJlbG9hZCIpICIgbXVzdCBiZSBhIHRhYmxlIik7CisgIGx1YV9nZXRmaWVsZChMLCAtMSwgbmFtZSk7CisgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSAgLyogbm90IGZvdW5kPyAqLworICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiXG5cdG5vIGZpZWxkIHBhY2thZ2UucHJlbG9hZFsnJXMnXSIsIG5hbWUpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgY29uc3QgaW50IHNlbnRpbmVsXyA9IDA7CisjZGVmaW5lIHNlbnRpbmVsCSgodm9pZCAqKSZzZW50aW5lbF8pCisKKworc3RhdGljIGludCBsbF9yZXF1aXJlIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGludCBpOworICBsdWFfc2V0dG9wKEwsIDEpOyAgLyogX0xPQURFRCB0YWJsZSB3aWxsIGJlIGF0IGluZGV4IDIgKi8KKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCAiX0xPQURFRCIpOworICBsdWFfZ2V0ZmllbGQoTCwgMiwgbmFtZSk7CisgIGlmIChsdWFfdG9ib29sZWFuKEwsIC0xKSkgeyAgLyogaXMgaXQgdGhlcmU/ICovCisgICAgaWYgKGx1YV90b3VzZXJkYXRhKEwsIC0xKSA9PSBzZW50aW5lbCkgIC8qIGNoZWNrIGxvb3BzICovCisgICAgICBsdWFMX2Vycm9yKEwsICJsb29wIG9yIHByZXZpb3VzIGVycm9yIGxvYWRpbmcgbW9kdWxlICIgTFVBX1FTLCBuYW1lKTsKKyAgICByZXR1cm4gMTsgIC8qIHBhY2thZ2UgaXMgYWxyZWFkeSBsb2FkZWQgKi8KKyAgfQorICAvKiBlbHNlIG11c3QgbG9hZCBpdDsgaXRlcmF0ZSBvdmVyIGF2YWlsYWJsZSBsb2FkZXJzICovCisgIGx1YV9nZXRmaWVsZChMLCBMVUFfRU5WSVJPTklOREVYLCAibG9hZGVycyIpOworICBpZiAoIWx1YV9pc3RhYmxlKEwsIC0xKSkKKyAgICBsdWFMX2Vycm9yKEwsIExVQV9RTCgicGFja2FnZS5sb2FkZXJzIikgIiBtdXN0IGJlIGEgdGFibGUiKTsKKyAgbHVhX3B1c2hsaXRlcmFsKEwsICIiKTsgIC8qIGVycm9yIG1lc3NhZ2UgYWNjdW11bGF0b3IgKi8KKyAgZm9yIChpPTE7IDsgaSsrKSB7CisgICAgbHVhX3Jhd2dldGkoTCwgLTIsIGkpOyAgLyogZ2V0IGEgbG9hZGVyICovCisgICAgaWYgKGx1YV9pc25pbChMLCAtMSkpCisgICAgICBsdWFMX2Vycm9yKEwsICJtb2R1bGUgIiBMVUFfUVMgIiBub3QgZm91bmQ6JXMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBsdWFfdG9zdHJpbmcoTCwgLTIpKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBuYW1lKTsKKyAgICBsdWFfY2FsbChMLCAxLCAxKTsgIC8qIGNhbGwgaXQgKi8KKyAgICBpZiAobHVhX2lzZnVuY3Rpb24oTCwgLTEpKSAgLyogZGlkIGl0IGZpbmQgbW9kdWxlPyAqLworICAgICAgYnJlYWs7ICAvKiBtb2R1bGUgbG9hZGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIGVsc2UgaWYgKGx1YV9pc3N0cmluZyhMLCAtMSkpICAvKiBsb2FkZXIgcmV0dXJuZWQgZXJyb3IgbWVzc2FnZT8gKi8KKyAgICAgIGx1YV9jb25jYXQoTCwgMik7ICAvKiBhY2N1bXVsYXRlIGl0ICovCisgICAgZWxzZQorICAgICAgbHVhX3BvcChMLCAxKTsKKyAgfQorICBsdWFfcHVzaGxpZ2h0dXNlcmRhdGEoTCwgc2VudGluZWwpOworICBsdWFfc2V0ZmllbGQoTCwgMiwgbmFtZSk7ICAvKiBfTE9BREVEW25hbWVdID0gc2VudGluZWwgKi8KKyAgbHVhX3B1c2hzdHJpbmcoTCwgbmFtZSk7ICAvKiBwYXNzIG5hbWUgYXMgYXJndW1lbnQgdG8gbW9kdWxlICovCisgIGx1YV9jYWxsKEwsIDEsIDEpOyAgLyogcnVuIGxvYWRlZCBtb2R1bGUgKi8KKyAgaWYgKCFsdWFfaXNuaWwoTCwgLTEpKSAgLyogbm9uLW5pbCByZXR1cm4/ICovCisgICAgbHVhX3NldGZpZWxkKEwsIDIsIG5hbWUpOyAgLyogX0xPQURFRFtuYW1lXSA9IHJldHVybmVkIHZhbHVlICovCisgIGx1YV9nZXRmaWVsZChMLCAyLCBuYW1lKTsKKyAgaWYgKGx1YV90b3VzZXJkYXRhKEwsIC0xKSA9PSBzZW50aW5lbCkgeyAgIC8qIG1vZHVsZSBkaWQgbm90IHNldCBhIHZhbHVlPyAqLworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsgIC8qIHVzZSB0cnVlIGFzIHJlc3VsdCAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOyAgLyogZXh0cmEgY29weSB0byBiZSByZXR1cm5lZCAqLworICAgIGx1YV9zZXRmaWVsZChMLCAyLCBuYW1lKTsgIC8qIF9MT0FERURbbmFtZV0gPSB0cnVlICovCisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiAnbW9kdWxlJyBmdW5jdGlvbgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyAgCisKK3N0YXRpYyB2b2lkIHNldGZlbnYgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfRGVidWcgYXI7CisgIGlmIChsdWFfZ2V0c3RhY2soTCwgMSwgJmFyKSA9PSAwIHx8CisgICAgICBsdWFfZ2V0aW5mbyhMLCAiZiIsICZhcikgPT0gMCB8fCAgLyogZ2V0IGNhbGxpbmcgZnVuY3Rpb24gKi8KKyAgICAgIGx1YV9pc2NmdW5jdGlvbihMLCAtMSkpCisgICAgbHVhTF9lcnJvcihMLCBMVUFfUUwoIm1vZHVsZSIpICIgbm90IGNhbGxlZCBmcm9tIGEgTHVhIGZ1bmN0aW9uIik7CisgIGx1YV9wdXNodmFsdWUoTCwgLTIpOworICBsdWFfc2V0ZmVudihMLCAtMik7CisgIGx1YV9wb3AoTCwgMSk7Cit9CisKKworc3RhdGljIHZvaWQgZG9vcHRpb25zIChsdWFfU3RhdGUgKkwsIGludCBuKSB7CisgIGludCBpOworICBmb3IgKGkgPSAyOyBpIDw9IG47IGkrKykgeworICAgIGx1YV9wdXNodmFsdWUoTCwgaSk7ICAvKiBnZXQgb3B0aW9uIChhIGZ1bmN0aW9uKSAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTIpOyAgLyogbW9kdWxlICovCisgICAgbHVhX2NhbGwoTCwgMSwgMCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBtb2Rpbml0IChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm1vZG5hbWUpIHsKKyAgY29uc3QgY2hhciAqZG90OworICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX00iKTsgIC8qIG1vZHVsZS5fTSA9IG1vZHVsZSAqLworICBsdWFfcHVzaHN0cmluZyhMLCBtb2RuYW1lKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX05BTUUiKTsKKyAgZG90ID0gc3RycmNocihtb2RuYW1lLCAnLicpOyAgLyogbG9vayBmb3IgbGFzdCBkb3QgaW4gbW9kdWxlIG5hbWUgKi8KKyAgaWYgKGRvdCA9PSBOVUxMKSBkb3QgPSBtb2RuYW1lOworICBlbHNlIGRvdCsrOworICAvKiBzZXQgX1BBQ0tBR0UgYXMgcGFja2FnZSBuYW1lIChmdWxsIG1vZHVsZSBuYW1lIG1pbnVzIGxhc3QgcGFydCkgKi8KKyAgbHVhX3B1c2hsc3RyaW5nKEwsIG1vZG5hbWUsIGRvdCAtIG1vZG5hbWUpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJfUEFDS0FHRSIpOworfQorCisKK3N0YXRpYyBpbnQgbGxfbW9kdWxlIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqbW9kbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGludCBsb2FkZWQgPSBsdWFfZ2V0dG9wKEwpICsgMTsgIC8qIGluZGV4IG9mIF9MT0FERUQgdGFibGUgKi8KKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCAiX0xPQURFRCIpOworICBsdWFfZ2V0ZmllbGQoTCwgbG9hZGVkLCBtb2RuYW1lKTsgIC8qIGdldCBfTE9BREVEW21vZG5hbWVdICovCisgIGlmICghbHVhX2lzdGFibGUoTCwgLTEpKSB7ICAvKiBub3QgZm91bmQ/ICovCisgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSBwcmV2aW91cyByZXN1bHQgKi8KKyAgICAvKiB0cnkgZ2xvYmFsIHZhcmlhYmxlIChhbmQgY3JlYXRlIG9uZSBpZiBpdCBkb2VzIG5vdCBleGlzdCkgKi8KKyAgICBpZiAobHVhTF9maW5kdGFibGUoTCwgTFVBX0dMT0JBTFNJTkRFWCwgbW9kbmFtZSwgMSkgIT0gTlVMTCkKKyAgICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICJuYW1lIGNvbmZsaWN0IGZvciBtb2R1bGUgIiBMVUFfUVMsIG1vZG5hbWUpOworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOworICAgIGx1YV9zZXRmaWVsZChMLCBsb2FkZWQsIG1vZG5hbWUpOyAgLyogX0xPQURFRFttb2RuYW1lXSA9IG5ldyB0YWJsZSAqLworICB9CisgIC8qIGNoZWNrIHdoZXRoZXIgdGFibGUgYWxyZWFkeSBoYXMgYSBfTkFNRSBmaWVsZCAqLworICBsdWFfZ2V0ZmllbGQoTCwgLTEsICJfTkFNRSIpOworICBpZiAoIWx1YV9pc25pbChMLCAtMSkpICAvKiBpcyB0YWJsZSBhbiBpbml0aWFsaXplZCBtb2R1bGU/ICovCisgICAgbHVhX3BvcChMLCAxKTsKKyAgZWxzZSB7ICAvKiBubzsgaW5pdGlhbGl6ZSBpdCAqLworICAgIGx1YV9wb3AoTCwgMSk7CisgICAgbW9kaW5pdChMLCBtb2RuYW1lKTsKKyAgfQorICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsKKyAgc2V0ZmVudihMKTsKKyAgZG9vcHRpb25zKEwsIGxvYWRlZCAtIDEpOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGxsX3NlZWFsbCAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOworICBpZiAoIWx1YV9nZXRtZXRhdGFibGUoTCwgMSkpIHsKKyAgICBsdWFfY3JlYXRldGFibGUoTCwgMCwgMSk7IC8qIGNyZWF0ZSBuZXcgbWV0YXRhYmxlICovCisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgICAgbHVhX3NldG1ldGF0YWJsZShMLCAxKTsKKyAgfQorICBsdWFfcHVzaHZhbHVlKEwsIExVQV9HTE9CQUxTSU5ERVgpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJfX2luZGV4Iik7ICAvKiBtdC5fX2luZGV4ID0gX0cgKi8KKyAgcmV0dXJuIDA7Cit9CisKKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKworLyogYXV4aWxpYXJ5IG1hcmsgKGZvciBpbnRlcm5hbCB1c2UpICovCisjZGVmaW5lIEFVWE1BUksJCSJcMSIKKworc3RhdGljIHZvaWQgc2V0cGF0aCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmaWVsZG5hbWUsIGNvbnN0IGNoYXIgKmVudm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZikgeworICBjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KGVudm5hbWUpOworICBpZiAocGF0aCA9PSBOVUxMKSAgLyogbm8gZW52aXJvbm1lbnQgdmFyaWFibGU/ICovCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgZGVmKTsgIC8qIHVzZSBkZWZhdWx0ICovCisgIGVsc2UgeworICAgIC8qIHJlcGxhY2UgIjs7IiBieSAiO0FVWE1BUks7IiBhbmQgdGhlbiBBVVhNQVJLIGJ5IGRlZmF1bHQgcGF0aCAqLworICAgIHBhdGggPSBsdWFMX2dzdWIoTCwgcGF0aCwgTFVBX1BBVEhTRVAgTFVBX1BBVEhTRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVUFfUEFUSFNFUCBBVVhNQVJLIExVQV9QQVRIU0VQKTsKKyAgICBsdWFMX2dzdWIoTCwgcGF0aCwgQVVYTUFSSywgZGVmKTsKKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsKKyAgfQorICBzZXRwcm9nZGlyKEwpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsIGZpZWxkbmFtZSk7Cit9CisKKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIHBrX2Z1bmNzW10gPSB7CisgIHsibG9hZGxpYiIsIGxsX2xvYWRsaWJ9LAorICB7InNlZWFsbCIsIGxsX3NlZWFsbH0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgbGxfZnVuY3NbXSA9IHsKKyAgeyJtb2R1bGUiLCBsbF9tb2R1bGV9LAorICB7InJlcXVpcmUiLCBsbF9yZXF1aXJlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKK3N0YXRpYyBjb25zdCBsdWFfQ0Z1bmN0aW9uIGxvYWRlcnNbXSA9CisgIHtsb2FkZXJfcHJlbG9hZCwgbG9hZGVyX0x1YSwgbG9hZGVyX0MsIGxvYWRlcl9Dcm9vdCwgTlVMTH07CisKKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9wYWNrYWdlIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGk7CisgIC8qIGNyZWF0ZSBuZXcgdHlwZSBfTE9BRExJQiAqLworICBsdWFMX25ld21ldGF0YWJsZShMLCAiX0xPQURMSUIiKTsKKyAgbHVhX3B1c2hjZnVuY3Rpb24oTCwgZ2N0bSk7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9fZ2MiKTsKKyAgLyogY3JlYXRlIGBwYWNrYWdlJyB0YWJsZSAqLworICBsdWFMX3JlZ2lzdGVyKEwsIExVQV9MT0FETElCTkFNRSwgcGtfZnVuY3MpOworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9MT0FETElCKSAKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCAibG9hZGxpYiIpOworICBsdWFfc2V0ZmllbGQoTCwgTFVBX0dMT0JBTFNJTkRFWCwgImxvYWRsaWIiKTsKKyNlbmRpZgorICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsKKyAgbHVhX3JlcGxhY2UoTCwgTFVBX0VOVklST05JTkRFWCk7CisgIC8qIGNyZWF0ZSBgbG9hZGVycycgdGFibGUgKi8KKyAgbHVhX2NyZWF0ZXRhYmxlKEwsIDAsIHNpemVvZihsb2FkZXJzKS9zaXplb2YobG9hZGVyc1swXSkgLSAxKTsKKyAgLyogZmlsbCBpdCB3aXRoIHByZS1kZWZpbmVkIGxvYWRlcnMgKi8KKyAgZm9yIChpPTA7IGxvYWRlcnNbaV0gIT0gTlVMTDsgaSsrKSB7CisgICAgbHVhX3B1c2hjZnVuY3Rpb24oTCwgbG9hZGVyc1tpXSk7CisgICAgbHVhX3Jhd3NldGkoTCwgLTIsIGkrMSk7CisgIH0KKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAibG9hZGVycyIpOyAgLyogcHV0IGl0IGluIGZpZWxkIGBsb2FkZXJzJyAqLworICBzZXRwYXRoKEwsICJwYXRoIiwgTFVBX1BBVEgsIExVQV9QQVRIX0RFRkFVTFQpOyAgLyogc2V0IGZpZWxkIGBwYXRoJyAqLworICBzZXRwYXRoKEwsICJjcGF0aCIsIExVQV9DUEFUSCwgTFVBX0NQQVRIX0RFRkFVTFQpOyAvKiBzZXQgZmllbGQgYGNwYXRoJyAqLworICAvKiBzdG9yZSBjb25maWcgaW5mb3JtYXRpb24gKi8KKyAgbHVhX3B1c2hsaXRlcmFsKEwsIExVQV9ESVJTRVAgIlxuIiBMVUFfUEFUSFNFUCAiXG4iIExVQV9QQVRIX01BUksgIlxuIgorICAgICAgICAgICAgICAgICAgICAgTFVBX0VYRUNESVIgIlxuIiBMVUFfSUdNQVJLKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiY29uZmlnIik7CisgIC8qIHNldCBmaWVsZCBgbG9hZGVkJyAqLworICBsdWFMX2ZpbmR0YWJsZShMLCBMVUFfUkVHSVNUUllJTkRFWCwgIl9MT0FERUQiLCAyKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAibG9hZGVkIik7CisgIC8qIHNldCBmaWVsZCBgcHJlbG9hZCcgKi8KKyAgbHVhX25ld3RhYmxlKEwpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJwcmVsb2FkIik7CisgIGx1YV9wdXNodmFsdWUoTCwgTFVBX0dMT0JBTFNJTkRFWCk7CisgIGx1YUxfcmVnaXN0ZXIoTCwgTlVMTCwgbGxfZnVuY3MpOyAgLyogb3BlbiBsaWIgaW50byBnbG9iYWwgdGFibGUgKi8KKyAgbHVhX3BvcChMLCAxKTsKKyAgcmV0dXJuIDE7ICAvKiByZXR1cm4gJ3BhY2thZ2UnIHRhYmxlICovCit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbG9iamVjdC5jIGIvbHVhLTUuMS40L3NyYy9sb2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmNTA3MwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbG9iamVjdC5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorKiogJElkOiBsb2JqZWN0LmMsdiAyLjIyLjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIFNvbWUgZ2VuZXJpYyBmdW5jdGlvbnMgb3ZlciBMdWEgb2JqZWN0cworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbG9iamVjdF9jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx2bS5oIgorCisKKworY29uc3QgVFZhbHVlIGx1YU9fbmlsb2JqZWN0XyA9IHt7TlVMTH0sIExVQV9UTklMfTsKKworCisvKgorKiogY29udmVydHMgYW4gaW50ZWdlciB0byBhICJmbG9hdGluZyBwb2ludCBieXRlIiwgcmVwcmVzZW50ZWQgYXMKKyoqIChlZWVlZXh4eCksIHdoZXJlIHRoZSByZWFsIHZhbHVlIGlzICgxeHh4KSAqIDJeKGVlZWVlIC0gMSkgaWYKKyoqIGVlZWVlICE9IDAgYW5kICh4eHgpIG90aGVyd2lzZS4KKyovCitpbnQgbHVhT19pbnQyZmIgKHVuc2lnbmVkIGludCB4KSB7CisgIGludCBlID0gMDsgIC8qIGV4cG9lbnQgKi8KKyAgd2hpbGUgKHggPj0gMTYpIHsKKyAgICB4ID0gKHgrMSkgPj4gMTsKKyAgICBlKys7CisgIH0KKyAgaWYgKHggPCA4KSByZXR1cm4geDsKKyAgZWxzZSByZXR1cm4gKChlKzEpIDw8IDMpIHwgKGNhc3RfaW50KHgpIC0gOCk7Cit9CisKKworLyogY29udmVydHMgYmFjayAqLworaW50IGx1YU9fZmIyaW50IChpbnQgeCkgeworICBpbnQgZSA9ICh4ID4+IDMpICYgMzE7CisgIGlmIChlID09IDApIHJldHVybiB4OworICBlbHNlIHJldHVybiAoKHggJiA3KSs4KSA8PCAoZSAtIDEpOworfQorCisKK2ludCBsdWFPX2xvZzIgKHVuc2lnbmVkIGludCB4KSB7CisgIHN0YXRpYyBjb25zdCBsdV9ieXRlIGxvZ18yWzI1Nl0gPSB7CisgICAgMCwxLDIsMiwzLDMsMywzLDQsNCw0LDQsNCw0LDQsNCw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAorICAgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKyAgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisgICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICAgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKyAgICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCisgICAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAorICAgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOAorICB9OworICBpbnQgbCA9IC0xOworICB3aGlsZSAoeCA+PSAyNTYpIHsgbCArPSA4OyB4ID4+PSA4OyB9CisgIHJldHVybiBsICsgbG9nXzJbeF07CisKK30KKworCitpbnQgbHVhT19yYXdlcXVhbE9iaiAoY29uc3QgVFZhbHVlICp0MSwgY29uc3QgVFZhbHVlICp0MikgeworICBpZiAodHR5cGUodDEpICE9IHR0eXBlKHQyKSkgcmV0dXJuIDA7CisgIGVsc2Ugc3dpdGNoICh0dHlwZSh0MSkpIHsKKyAgICBjYXNlIExVQV9UTklMOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBMVUFfVE5VTUJFUjoKKyAgICAgIHJldHVybiBsdWFpX251bWVxKG52YWx1ZSh0MSksIG52YWx1ZSh0MikpOworICAgIGNhc2UgTFVBX1RCT09MRUFOOgorICAgICAgcmV0dXJuIGJ2YWx1ZSh0MSkgPT0gYnZhbHVlKHQyKTsgIC8qIGJvb2xlYW4gdHJ1ZSBtdXN0IGJlIDEgISEgKi8KKyAgICBjYXNlIExVQV9UTElHSFRVU0VSREFUQToKKyAgICAgIHJldHVybiBwdmFsdWUodDEpID09IHB2YWx1ZSh0Mik7CisgICAgZGVmYXVsdDoKKyAgICAgIGx1YV9hc3NlcnQoaXNjb2xsZWN0YWJsZSh0MSkpOworICAgICAgcmV0dXJuIGdjdmFsdWUodDEpID09IGdjdmFsdWUodDIpOworICB9Cit9CisKKworaW50IGx1YU9fc3RyMmQgKGNvbnN0IGNoYXIgKnMsIGx1YV9OdW1iZXIgKnJlc3VsdCkgeworICBjaGFyICplbmRwdHI7CisgICpyZXN1bHQgPSBsdWFfc3RyMm51bWJlcihzLCAmZW5kcHRyKTsKKyAgaWYgKGVuZHB0ciA9PSBzKSByZXR1cm4gMDsgIC8qIGNvbnZlcnNpb24gZmFpbGVkICovCisgIGlmICgqZW5kcHRyID09ICd4JyB8fCAqZW5kcHRyID09ICdYJykgIC8qIG1heWJlIGFuIGhleGFkZWNpbWFsIGNvbnN0YW50PyAqLworICAgICpyZXN1bHQgPSBjYXN0X251bShzdHJ0b3VsKHMsICZlbmRwdHIsIDE2KSk7CisgIGlmICgqZW5kcHRyID09ICdcMCcpIHJldHVybiAxOyAgLyogbW9zdCBjb21tb24gY2FzZSAqLworICB3aGlsZSAoaXNzcGFjZShjYXN0KHVuc2lnbmVkIGNoYXIsICplbmRwdHIpKSkgZW5kcHRyKys7CisgIGlmICgqZW5kcHRyICE9ICdcMCcpIHJldHVybiAwOyAgLyogaW52YWxpZCB0cmFpbGluZyBjaGFyYWN0ZXJzPyAqLworICByZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyB2b2lkIHB1c2hzdHIgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqc3RyKSB7CisgIHNldHN2YWx1ZTJzKEwsIEwtPnRvcCwgbHVhU19uZXcoTCwgc3RyKSk7CisgIGluY3JfdG9wKEwpOworfQorCisKKy8qIHRoaXMgZnVuY3Rpb24gaGFuZGxlcyBvbmx5IGAlZCcsIGAlYycsICVmLCAlcCwgYW5kIGAlcycgZm9ybWF0cyAqLworY29uc3QgY2hhciAqbHVhT19wdXNodmZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3ApIHsKKyAgaW50IG4gPSAxOworICBwdXNoc3RyKEwsICIiKTsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKmUgPSBzdHJjaHIoZm10LCAnJScpOworICAgIGlmIChlID09IE5VTEwpIGJyZWFrOworICAgIHNldHN2YWx1ZTJzKEwsIEwtPnRvcCwgbHVhU19uZXdsc3RyKEwsIGZtdCwgZS1mbXQpKTsKKyAgICBpbmNyX3RvcChMKTsKKyAgICBzd2l0Y2ggKCooZSsxKSkgeworICAgICAgY2FzZSAncyc6IHsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOworICAgICAgICBpZiAocyA9PSBOVUxMKSBzID0gIihudWxsKSI7CisgICAgICAgIHB1c2hzdHIoTCwgcyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnYyc6IHsKKyAgICAgICAgY2hhciBidWZmWzJdOworICAgICAgICBidWZmWzBdID0gY2FzdChjaGFyLCB2YV9hcmcoYXJncCwgaW50KSk7CisgICAgICAgIGJ1ZmZbMV0gPSAnXDAnOworICAgICAgICBwdXNoc3RyKEwsIGJ1ZmYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ2QnOiB7CisgICAgICAgIHNldG52YWx1ZShMLT50b3AsIGNhc3RfbnVtKHZhX2FyZyhhcmdwLCBpbnQpKSk7CisgICAgICAgIGluY3JfdG9wKEwpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ2YnOiB7CisgICAgICAgIHNldG52YWx1ZShMLT50b3AsIGNhc3RfbnVtKHZhX2FyZyhhcmdwLCBsX3VhY051bWJlcikpKTsKKyAgICAgICAgaW5jcl90b3AoTCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAncCc6IHsKKyAgICAgICAgY2hhciBidWZmWzQqc2l6ZW9mKHZvaWQgKikgKyA4XTsgLyogc2hvdWxkIGJlIGVub3VnaCBzcGFjZSBmb3IgYSBgJXAnICovCisgICAgICAgIHNwcmludGYoYnVmZiwgIiVwIiwgdmFfYXJnKGFyZ3AsIHZvaWQgKikpOworICAgICAgICBwdXNoc3RyKEwsIGJ1ZmYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJyUnOiB7CisgICAgICAgIHB1c2hzdHIoTCwgIiUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGNoYXIgYnVmZlszXTsKKyAgICAgICAgYnVmZlswXSA9ICclJzsKKyAgICAgICAgYnVmZlsxXSA9ICooZSsxKTsKKyAgICAgICAgYnVmZlsyXSA9ICdcMCc7CisgICAgICAgIHB1c2hzdHIoTCwgYnVmZik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBuICs9IDI7CisgICAgZm10ID0gZSsyOworICB9CisgIHB1c2hzdHIoTCwgZm10KTsKKyAgbHVhVl9jb25jYXQoTCwgbisxLCBjYXN0X2ludChMLT50b3AgLSBMLT5iYXNlKSAtIDEpOworICBMLT50b3AgLT0gbjsKKyAgcmV0dXJuIHN2YWx1ZShMLT50b3AgLSAxKTsKK30KKworCitjb25zdCBjaGFyICpsdWFPX3B1c2hmc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIGNvbnN0IGNoYXIgKm1zZzsKKyAgdmFfbGlzdCBhcmdwOworICB2YV9zdGFydChhcmdwLCBmbXQpOworICBtc2cgPSBsdWFPX3B1c2h2ZnN0cmluZyhMLCBmbXQsIGFyZ3ApOworICB2YV9lbmQoYXJncCk7CisgIHJldHVybiBtc2c7Cit9CisKKwordm9pZCBsdWFPX2NodW5raWQgKGNoYXIgKm91dCwgY29uc3QgY2hhciAqc291cmNlLCBzaXplX3QgYnVmZmxlbikgeworICBpZiAoKnNvdXJjZSA9PSAnPScpIHsKKyAgICBzdHJuY3B5KG91dCwgc291cmNlKzEsIGJ1ZmZsZW4pOyAgLyogcmVtb3ZlIGZpcnN0IGNoYXIgKi8KKyAgICBvdXRbYnVmZmxlbi0xXSA9ICdcMCc7ICAvKiBlbnN1cmVzIG51bGwgdGVybWluYXRpb24gKi8KKyAgfQorICBlbHNlIHsgIC8qIG91dCA9ICJzb3VyY2UiLCBvciAiLi4uc291cmNlIiAqLworICAgIGlmICgqc291cmNlID09ICdAJykgeworICAgICAgc2l6ZV90IGw7CisgICAgICBzb3VyY2UrKzsgIC8qIHNraXAgdGhlIGBAJyAqLworICAgICAgYnVmZmxlbiAtPSBzaXplb2YoIiAnLi4uJyAiKTsKKyAgICAgIGwgPSBzdHJsZW4oc291cmNlKTsKKyAgICAgIHN0cmNweShvdXQsICIiKTsKKyAgICAgIGlmIChsID4gYnVmZmxlbikgeworICAgICAgICBzb3VyY2UgKz0gKGwtYnVmZmxlbik7ICAvKiBnZXQgbGFzdCBwYXJ0IG9mIGZpbGUgbmFtZSAqLworICAgICAgICBzdHJjYXQob3V0LCAiLi4uIik7CisgICAgICB9CisgICAgICBzdHJjYXQob3V0LCBzb3VyY2UpOworICAgIH0KKyAgICBlbHNlIHsgIC8qIG91dCA9IFtzdHJpbmcgInN0cmluZyJdICovCisgICAgICBzaXplX3QgbGVuID0gc3RyY3Nwbihzb3VyY2UsICJcblxyIik7ICAvKiBzdG9wIGF0IGZpcnN0IG5ld2xpbmUgKi8KKyAgICAgIGJ1ZmZsZW4gLT0gc2l6ZW9mKCIgW3N0cmluZyBcIi4uLlwiXSAiKTsKKyAgICAgIGlmIChsZW4gPiBidWZmbGVuKSBsZW4gPSBidWZmbGVuOworICAgICAgc3RyY3B5KG91dCwgIltzdHJpbmcgXCIiKTsKKyAgICAgIGlmIChzb3VyY2VbbGVuXSAhPSAnXDAnKSB7ICAvKiBtdXN0IHRydW5jYXRlPyAqLworICAgICAgICBzdHJuY2F0KG91dCwgc291cmNlLCBsZW4pOworICAgICAgICBzdHJjYXQob3V0LCAiLi4uIik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHN0cmNhdChvdXQsIHNvdXJjZSk7CisgICAgICBzdHJjYXQob3V0LCAiXCJdIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xvYmplY3QuaCBiL2x1YS01LjEuNC9zcmMvbG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTQ0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xvYmplY3QuaApAQCAtMCwwICsxLDM4MSBAQAorLyoKKyoqICRJZDogbG9iamVjdC5oLHYgMi4yMC4xLjIgMjAwOC8wOC8wNiAxMzoyOTo0OCByb2JlcnRvIEV4cCAkCisqKiBUeXBlIGRlZmluaXRpb25zIGZvciBMdWEgb2JqZWN0cworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2lmbmRlZiBsb2JqZWN0X2gKKyNkZWZpbmUgbG9iamVjdF9oCisKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKyNpbmNsdWRlICJsbGltaXRzLmgiCisjaW5jbHVkZSAibHVhLmgiCisKKworLyogdGFncyBmb3IgdmFsdWVzIHZpc2libGUgZnJvbSBMdWEgKi8KKyNkZWZpbmUgTEFTVF9UQUcJTFVBX1RUSFJFQUQKKworI2RlZmluZSBOVU1fVEFHUwkoTEFTVF9UQUcrMSkKKworCisvKgorKiogRXh0cmEgdGFncyBmb3Igbm9uLXZhbHVlcworKi8KKyNkZWZpbmUgTFVBX1RQUk9UTwkoTEFTVF9UQUcrMSkKKyNkZWZpbmUgTFVBX1RVUFZBTAkoTEFTVF9UQUcrMikKKyNkZWZpbmUgTFVBX1RERUFES0VZCShMQVNUX1RBRyszKQorCisKKy8qCisqKiBVbmlvbiBvZiBhbGwgY29sbGVjdGFibGUgb2JqZWN0cworKi8KK3R5cGVkZWYgdW5pb24gR0NPYmplY3QgR0NPYmplY3Q7CisKKworLyoKKyoqIENvbW1vbiBIZWFkZXIgZm9yIGFsbCBjb2xsZWN0YWJsZSBvYmplY3RzIChpbiBtYWNybyBmb3JtLCB0byBiZQorKiogaW5jbHVkZWQgaW4gb3RoZXIgb2JqZWN0cykKKyovCisjZGVmaW5lIENvbW1vbkhlYWRlcglHQ09iamVjdCAqbmV4dDsgbHVfYnl0ZSB0dDsgbHVfYnl0ZSBtYXJrZWQKKworCisvKgorKiogQ29tbW9uIGhlYWRlciBpbiBzdHJ1Y3QgZm9ybQorKi8KK3R5cGVkZWYgc3RydWN0IEdDaGVhZGVyIHsKKyAgQ29tbW9uSGVhZGVyOworfSBHQ2hlYWRlcjsKKworCisKKworLyoKKyoqIFVuaW9uIG9mIGFsbCBMdWEgdmFsdWVzCisqLwordHlwZWRlZiB1bmlvbiB7CisgIEdDT2JqZWN0ICpnYzsKKyAgdm9pZCAqcDsKKyAgbHVhX051bWJlciBuOworICBpbnQgYjsKK30gVmFsdWU7CisKKworLyoKKyoqIFRhZ2dlZCBWYWx1ZXMKKyovCisKKyNkZWZpbmUgVFZhbHVlZmllbGRzCVZhbHVlIHZhbHVlOyBpbnQgdHQKKwordHlwZWRlZiBzdHJ1Y3QgbHVhX1RWYWx1ZSB7CisgIFRWYWx1ZWZpZWxkczsKK30gVFZhbHVlOworCisKKy8qIE1hY3JvcyB0byB0ZXN0IHR5cGUgKi8KKyNkZWZpbmUgdHRpc25pbChvKQkodHR5cGUobykgPT0gTFVBX1ROSUwpCisjZGVmaW5lIHR0aXNudW1iZXIobykJKHR0eXBlKG8pID09IExVQV9UTlVNQkVSKQorI2RlZmluZSB0dGlzc3RyaW5nKG8pCSh0dHlwZShvKSA9PSBMVUFfVFNUUklORykKKyNkZWZpbmUgdHRpc3RhYmxlKG8pCSh0dHlwZShvKSA9PSBMVUFfVFRBQkxFKQorI2RlZmluZSB0dGlzZnVuY3Rpb24obykJKHR0eXBlKG8pID09IExVQV9URlVOQ1RJT04pCisjZGVmaW5lIHR0aXNib29sZWFuKG8pCSh0dHlwZShvKSA9PSBMVUFfVEJPT0xFQU4pCisjZGVmaW5lIHR0aXN1c2VyZGF0YShvKQkodHR5cGUobykgPT0gTFVBX1RVU0VSREFUQSkKKyNkZWZpbmUgdHRpc3RocmVhZChvKQkodHR5cGUobykgPT0gTFVBX1RUSFJFQUQpCisjZGVmaW5lIHR0aXNsaWdodHVzZXJkYXRhKG8pCSh0dHlwZShvKSA9PSBMVUFfVExJR0hUVVNFUkRBVEEpCisKKy8qIE1hY3JvcyB0byBhY2Nlc3MgdmFsdWVzICovCisjZGVmaW5lIHR0eXBlKG8pCSgobyktPnR0KQorI2RlZmluZSBnY3ZhbHVlKG8pCWNoZWNrX2V4cChpc2NvbGxlY3RhYmxlKG8pLCAobyktPnZhbHVlLmdjKQorI2RlZmluZSBwdmFsdWUobykJY2hlY2tfZXhwKHR0aXNsaWdodHVzZXJkYXRhKG8pLCAobyktPnZhbHVlLnApCisjZGVmaW5lIG52YWx1ZShvKQljaGVja19leHAodHRpc251bWJlcihvKSwgKG8pLT52YWx1ZS5uKQorI2RlZmluZSByYXd0c3ZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzc3RyaW5nKG8pLCAmKG8pLT52YWx1ZS5nYy0+dHMpCisjZGVmaW5lIHRzdmFsdWUobykJKCZyYXd0c3ZhbHVlKG8pLT50c3YpCisjZGVmaW5lIHJhd3V2YWx1ZShvKQljaGVja19leHAodHRpc3VzZXJkYXRhKG8pLCAmKG8pLT52YWx1ZS5nYy0+dSkKKyNkZWZpbmUgdXZhbHVlKG8pCSgmcmF3dXZhbHVlKG8pLT51dikKKyNkZWZpbmUgY2x2YWx1ZShvKQljaGVja19leHAodHRpc2Z1bmN0aW9uKG8pLCAmKG8pLT52YWx1ZS5nYy0+Y2wpCisjZGVmaW5lIGh2YWx1ZShvKQljaGVja19leHAodHRpc3RhYmxlKG8pLCAmKG8pLT52YWx1ZS5nYy0+aCkKKyNkZWZpbmUgYnZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzYm9vbGVhbihvKSwgKG8pLT52YWx1ZS5iKQorI2RlZmluZSB0aHZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzdGhyZWFkKG8pLCAmKG8pLT52YWx1ZS5nYy0+dGgpCisKKyNkZWZpbmUgbF9pc2ZhbHNlKG8pCSh0dGlzbmlsKG8pIHx8ICh0dGlzYm9vbGVhbihvKSAmJiBidmFsdWUobykgPT0gMCkpCisKKy8qCisqKiBmb3IgaW50ZXJuYWwgZGVidWcgb25seQorKi8KKyNkZWZpbmUgY2hlY2tjb25zaXN0ZW5jeShvYmopIFwKKyAgbHVhX2Fzc2VydCghaXNjb2xsZWN0YWJsZShvYmopIHx8ICh0dHlwZShvYmopID09IChvYmopLT52YWx1ZS5nYy0+Z2NoLnR0KSkKKworI2RlZmluZSBjaGVja2xpdmVuZXNzKGcsb2JqKSBcCisgIGx1YV9hc3NlcnQoIWlzY29sbGVjdGFibGUob2JqKSB8fCBcCisgICgodHR5cGUob2JqKSA9PSAob2JqKS0+dmFsdWUuZ2MtPmdjaC50dCkgJiYgIWlzZGVhZChnLCAob2JqKS0+dmFsdWUuZ2MpKSkKKworCisvKiBNYWNyb3MgdG8gc2V0IHZhbHVlcyAqLworI2RlZmluZSBzZXRuaWx2YWx1ZShvYmopICgob2JqKS0+dHQ9TFVBX1ROSUwpCisKKyNkZWZpbmUgc2V0bnZhbHVlKG9iaix4KSBcCisgIHsgVFZhbHVlICppX289KG9iaik7IGlfby0+dmFsdWUubj0oeCk7IGlfby0+dHQ9TFVBX1ROVU1CRVI7IH0KKworI2RlZmluZSBzZXRwdmFsdWUob2JqLHgpIFwKKyAgeyBUVmFsdWUgKmlfbz0ob2JqKTsgaV9vLT52YWx1ZS5wPSh4KTsgaV9vLT50dD1MVUFfVExJR0hUVVNFUkRBVEE7IH0KKworI2RlZmluZSBzZXRidmFsdWUob2JqLHgpIFwKKyAgeyBUVmFsdWUgKmlfbz0ob2JqKTsgaV9vLT52YWx1ZS5iPSh4KTsgaV9vLT50dD1MVUFfVEJPT0xFQU47IH0KKworI2RlZmluZSBzZXRzdmFsdWUoTCxvYmoseCkgXAorICB7IFRWYWx1ZSAqaV9vPShvYmopOyBcCisgICAgaV9vLT52YWx1ZS5nYz1jYXN0KEdDT2JqZWN0ICosICh4KSk7IGlfby0+dHQ9TFVBX1RTVFJJTkc7IFwKKyAgICBjaGVja2xpdmVuZXNzKEcoTCksaV9vKTsgfQorCisjZGVmaW5lIHNldHV2YWx1ZShMLG9iaix4KSBcCisgIHsgVFZhbHVlICppX289KG9iaik7IFwKKyAgICBpX28tPnZhbHVlLmdjPWNhc3QoR0NPYmplY3QgKiwgKHgpKTsgaV9vLT50dD1MVUFfVFVTRVJEQVRBOyBcCisgICAgY2hlY2tsaXZlbmVzcyhHKEwpLGlfbyk7IH0KKworI2RlZmluZSBzZXR0aHZhbHVlKEwsb2JqLHgpIFwKKyAgeyBUVmFsdWUgKmlfbz0ob2JqKTsgXAorICAgIGlfby0+dmFsdWUuZ2M9Y2FzdChHQ09iamVjdCAqLCAoeCkpOyBpX28tPnR0PUxVQV9UVEhSRUFEOyBcCisgICAgY2hlY2tsaXZlbmVzcyhHKEwpLGlfbyk7IH0KKworI2RlZmluZSBzZXRjbHZhbHVlKEwsb2JqLHgpIFwKKyAgeyBUVmFsdWUgKmlfbz0ob2JqKTsgXAorICAgIGlfby0+dmFsdWUuZ2M9Y2FzdChHQ09iamVjdCAqLCAoeCkpOyBpX28tPnR0PUxVQV9URlVOQ1RJT047IFwKKyAgICBjaGVja2xpdmVuZXNzKEcoTCksaV9vKTsgfQorCisjZGVmaW5lIHNldGh2YWx1ZShMLG9iaix4KSBcCisgIHsgVFZhbHVlICppX289KG9iaik7IFwKKyAgICBpX28tPnZhbHVlLmdjPWNhc3QoR0NPYmplY3QgKiwgKHgpKTsgaV9vLT50dD1MVUFfVFRBQkxFOyBcCisgICAgY2hlY2tsaXZlbmVzcyhHKEwpLGlfbyk7IH0KKworI2RlZmluZSBzZXRwdHZhbHVlKEwsb2JqLHgpIFwKKyAgeyBUVmFsdWUgKmlfbz0ob2JqKTsgXAorICAgIGlfby0+dmFsdWUuZ2M9Y2FzdChHQ09iamVjdCAqLCAoeCkpOyBpX28tPnR0PUxVQV9UUFJPVE87IFwKKyAgICBjaGVja2xpdmVuZXNzKEcoTCksaV9vKTsgfQorCisKKworCisjZGVmaW5lIHNldG9iaihMLG9iajEsb2JqMikgXAorICB7IGNvbnN0IFRWYWx1ZSAqbzI9KG9iajIpOyBUVmFsdWUgKm8xPShvYmoxKTsgXAorICAgIG8xLT52YWx1ZSA9IG8yLT52YWx1ZTsgbzEtPnR0PW8yLT50dDsgXAorICAgIGNoZWNrbGl2ZW5lc3MoRyhMKSxvMSk7IH0KKworCisvKgorKiogZGlmZmVyZW50IHR5cGVzIG9mIHNldHMsIGFjY29yZGluZyB0byBkZXN0aW5hdGlvbgorKi8KKworLyogZnJvbSBzdGFjayB0byAoc2FtZSkgc3RhY2sgKi8KKyNkZWZpbmUgc2V0b2JqczJzCXNldG9iagorLyogdG8gc3RhY2sgKG5vdCBmcm9tIHNhbWUgc3RhY2spICovCisjZGVmaW5lIHNldG9iajJzCXNldG9iagorI2RlZmluZSBzZXRzdmFsdWUycwlzZXRzdmFsdWUKKyNkZWZpbmUgc2V0aHZhbHVlMnMJc2V0aHZhbHVlCisjZGVmaW5lIHNldHB0dmFsdWUycwlzZXRwdHZhbHVlCisvKiBmcm9tIHRhYmxlIHRvIHNhbWUgdGFibGUgKi8KKyNkZWZpbmUgc2V0b2JqdDJ0CXNldG9iagorLyogdG8gdGFibGUgKi8KKyNkZWZpbmUgc2V0b2JqMnQJc2V0b2JqCisvKiB0byBuZXcgb2JqZWN0ICovCisjZGVmaW5lIHNldG9iajJuCXNldG9iagorI2RlZmluZSBzZXRzdmFsdWUybglzZXRzdmFsdWUKKworI2RlZmluZSBzZXR0dHlwZShvYmosIHR0KSAodHR5cGUob2JqKSA9ICh0dCkpCisKKworI2RlZmluZSBpc2NvbGxlY3RhYmxlKG8pCSh0dHlwZShvKSA+PSBMVUFfVFNUUklORykKKworCisKK3R5cGVkZWYgVFZhbHVlICpTdGtJZDsgIC8qIGluZGV4IHRvIHN0YWNrIGVsZW1lbnRzICovCisKKworLyoKKyoqIFN0cmluZyBoZWFkZXJzIGZvciBzdHJpbmcgdGFibGUKKyovCit0eXBlZGVmIHVuaW9uIFRTdHJpbmcgeworICBMX1VtYXhhbGlnbiBkdW1teTsgIC8qIGVuc3VyZXMgbWF4aW11bSBhbGlnbm1lbnQgZm9yIHN0cmluZ3MgKi8KKyAgc3RydWN0IHsKKyAgICBDb21tb25IZWFkZXI7CisgICAgbHVfYnl0ZSByZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBpbnQgaGFzaDsKKyAgICBzaXplX3QgbGVuOworICB9IHRzdjsKK30gVFN0cmluZzsKKworCisjZGVmaW5lIGdldHN0cih0cykJY2FzdChjb25zdCBjaGFyICosICh0cykgKyAxKQorI2RlZmluZSBzdmFsdWUobykgICAgICAgZ2V0c3RyKHJhd3RzdmFsdWUobykpCisKKworCit0eXBlZGVmIHVuaW9uIFVkYXRhIHsKKyAgTF9VbWF4YWxpZ24gZHVtbXk7ICAvKiBlbnN1cmVzIG1heGltdW0gYWxpZ25tZW50IGZvciBgbG9jYWwnIHVkYXRhICovCisgIHN0cnVjdCB7CisgICAgQ29tbW9uSGVhZGVyOworICAgIHN0cnVjdCBUYWJsZSAqbWV0YXRhYmxlOworICAgIHN0cnVjdCBUYWJsZSAqZW52OworICAgIHNpemVfdCBsZW47CisgIH0gdXY7Cit9IFVkYXRhOworCisKKworCisvKgorKiogRnVuY3Rpb24gUHJvdG90eXBlcworKi8KK3R5cGVkZWYgc3RydWN0IFByb3RvIHsKKyAgQ29tbW9uSGVhZGVyOworICBUVmFsdWUgKms7ICAvKiBjb25zdGFudHMgdXNlZCBieSB0aGUgZnVuY3Rpb24gKi8KKyAgSW5zdHJ1Y3Rpb24gKmNvZGU7CisgIHN0cnVjdCBQcm90byAqKnA7ICAvKiBmdW5jdGlvbnMgZGVmaW5lZCBpbnNpZGUgdGhlIGZ1bmN0aW9uICovCisgIGludCAqbGluZWluZm87ICAvKiBtYXAgZnJvbSBvcGNvZGVzIHRvIHNvdXJjZSBsaW5lcyAqLworICBzdHJ1Y3QgTG9jVmFyICpsb2N2YXJzOyAgLyogaW5mb3JtYXRpb24gYWJvdXQgbG9jYWwgdmFyaWFibGVzICovCisgIFRTdHJpbmcgKip1cHZhbHVlczsgIC8qIHVwdmFsdWUgbmFtZXMgKi8KKyAgVFN0cmluZyAgKnNvdXJjZTsKKyAgaW50IHNpemV1cHZhbHVlczsKKyAgaW50IHNpemVrOyAgLyogc2l6ZSBvZiBgaycgKi8KKyAgaW50IHNpemVjb2RlOworICBpbnQgc2l6ZWxpbmVpbmZvOworICBpbnQgc2l6ZXA7ICAvKiBzaXplIG9mIGBwJyAqLworICBpbnQgc2l6ZWxvY3ZhcnM7CisgIGludCBsaW5lZGVmaW5lZDsKKyAgaW50IGxhc3RsaW5lZGVmaW5lZDsKKyAgR0NPYmplY3QgKmdjbGlzdDsKKyAgbHVfYnl0ZSBudXBzOyAgLyogbnVtYmVyIG9mIHVwdmFsdWVzICovCisgIGx1X2J5dGUgbnVtcGFyYW1zOworICBsdV9ieXRlIGlzX3ZhcmFyZzsKKyAgbHVfYnl0ZSBtYXhzdGFja3NpemU7Cit9IFByb3RvOworCisKKy8qIG1hc2tzIGZvciBuZXctc3R5bGUgdmFyYXJnICovCisjZGVmaW5lIFZBUkFSR19IQVNBUkcJCTEKKyNkZWZpbmUgVkFSQVJHX0lTVkFSQVJHCQkyCisjZGVmaW5lIFZBUkFSR19ORUVEU0FSRwkJNAorCisKK3R5cGVkZWYgc3RydWN0IExvY1ZhciB7CisgIFRTdHJpbmcgKnZhcm5hbWU7CisgIGludCBzdGFydHBjOyAgLyogZmlyc3QgcG9pbnQgd2hlcmUgdmFyaWFibGUgaXMgYWN0aXZlICovCisgIGludCBlbmRwYzsgICAgLyogZmlyc3QgcG9pbnQgd2hlcmUgdmFyaWFibGUgaXMgZGVhZCAqLworfSBMb2NWYXI7CisKKworCisvKgorKiogVXB2YWx1ZXMKKyovCisKK3R5cGVkZWYgc3RydWN0IFVwVmFsIHsKKyAgQ29tbW9uSGVhZGVyOworICBUVmFsdWUgKnY7ICAvKiBwb2ludHMgdG8gc3RhY2sgb3IgdG8gaXRzIG93biB2YWx1ZSAqLworICB1bmlvbiB7CisgICAgVFZhbHVlIHZhbHVlOyAgLyogdGhlIHZhbHVlICh3aGVuIGNsb3NlZCkgKi8KKyAgICBzdHJ1Y3QgeyAgLyogZG91YmxlIGxpbmtlZCBsaXN0ICh3aGVuIG9wZW4pICovCisgICAgICBzdHJ1Y3QgVXBWYWwgKnByZXY7CisgICAgICBzdHJ1Y3QgVXBWYWwgKm5leHQ7CisgICAgfSBsOworICB9IHU7Cit9IFVwVmFsOworCisKKy8qCisqKiBDbG9zdXJlcworKi8KKworI2RlZmluZSBDbG9zdXJlSGVhZGVyIFwKKwlDb21tb25IZWFkZXI7IGx1X2J5dGUgaXNDOyBsdV9ieXRlIG51cHZhbHVlczsgR0NPYmplY3QgKmdjbGlzdDsgXAorCXN0cnVjdCBUYWJsZSAqZW52CisKK3R5cGVkZWYgc3RydWN0IENDbG9zdXJlIHsKKyAgQ2xvc3VyZUhlYWRlcjsKKyAgbHVhX0NGdW5jdGlvbiBmOworICBUVmFsdWUgdXB2YWx1ZVsxXTsKK30gQ0Nsb3N1cmU7CisKKwordHlwZWRlZiBzdHJ1Y3QgTENsb3N1cmUgeworICBDbG9zdXJlSGVhZGVyOworICBzdHJ1Y3QgUHJvdG8gKnA7CisgIFVwVmFsICp1cHZhbHNbMV07Cit9IExDbG9zdXJlOworCisKK3R5cGVkZWYgdW5pb24gQ2xvc3VyZSB7CisgIENDbG9zdXJlIGM7CisgIExDbG9zdXJlIGw7Cit9IENsb3N1cmU7CisKKworI2RlZmluZSBpc2NmdW5jdGlvbihvKQkodHR5cGUobykgPT0gTFVBX1RGVU5DVElPTiAmJiBjbHZhbHVlKG8pLT5jLmlzQykKKyNkZWZpbmUgaXNMZnVuY3Rpb24obykJKHR0eXBlKG8pID09IExVQV9URlVOQ1RJT04gJiYgIWNsdmFsdWUobyktPmMuaXNDKQorCisKKy8qCisqKiBUYWJsZXMKKyovCisKK3R5cGVkZWYgdW5pb24gVEtleSB7CisgIHN0cnVjdCB7CisgICAgVFZhbHVlZmllbGRzOworICAgIHN0cnVjdCBOb2RlICpuZXh0OyAgLyogZm9yIGNoYWluaW5nICovCisgIH0gbms7CisgIFRWYWx1ZSB0dms7Cit9IFRLZXk7CisKKwordHlwZWRlZiBzdHJ1Y3QgTm9kZSB7CisgIFRWYWx1ZSBpX3ZhbDsKKyAgVEtleSBpX2tleTsKK30gTm9kZTsKKworCit0eXBlZGVmIHN0cnVjdCBUYWJsZSB7CisgIENvbW1vbkhlYWRlcjsKKyAgbHVfYnl0ZSBmbGFnczsgIC8qIDE8PHAgbWVhbnMgdGFnbWV0aG9kKHApIGlzIG5vdCBwcmVzZW50ICovIAorICBsdV9ieXRlIGxzaXplbm9kZTsgIC8qIGxvZzIgb2Ygc2l6ZSBvZiBgbm9kZScgYXJyYXkgKi8KKyAgc3RydWN0IFRhYmxlICptZXRhdGFibGU7CisgIFRWYWx1ZSAqYXJyYXk7ICAvKiBhcnJheSBwYXJ0ICovCisgIE5vZGUgKm5vZGU7CisgIE5vZGUgKmxhc3RmcmVlOyAgLyogYW55IGZyZWUgcG9zaXRpb24gaXMgYmVmb3JlIHRoaXMgcG9zaXRpb24gKi8KKyAgR0NPYmplY3QgKmdjbGlzdDsKKyAgaW50IHNpemVhcnJheTsgIC8qIHNpemUgb2YgYGFycmF5JyBhcnJheSAqLworfSBUYWJsZTsKKworCisKKy8qCisqKiBgbW9kdWxlJyBvcGVyYXRpb24gZm9yIGhhc2hpbmcgKHNpemUgaXMgYWx3YXlzIGEgcG93ZXIgb2YgMikKKyovCisjZGVmaW5lIGxtb2QocyxzaXplKSBcCisJKGNoZWNrX2V4cCgoc2l6ZSYoc2l6ZS0xKSk9PTAsIChjYXN0KGludCwgKHMpICYgKChzaXplKS0xKSkpKSkKKworCisjZGVmaW5lIHR3b3RvKHgpCSgxPDwoeCkpCisjZGVmaW5lIHNpemVub2RlKHQpCSh0d290bygodCktPmxzaXplbm9kZSkpCisKKworI2RlZmluZSBsdWFPX25pbG9iamVjdAkJKCZsdWFPX25pbG9iamVjdF8pCisKK0xVQUlfREFUQSBjb25zdCBUVmFsdWUgbHVhT19uaWxvYmplY3RfOworCisjZGVmaW5lIGNlaWxsb2cyKHgpCShsdWFPX2xvZzIoKHgpLTEpICsgMSkKKworTFVBSV9GVU5DIGludCBsdWFPX2xvZzIgKHVuc2lnbmVkIGludCB4KTsKK0xVQUlfRlVOQyBpbnQgbHVhT19pbnQyZmIgKHVuc2lnbmVkIGludCB4KTsKK0xVQUlfRlVOQyBpbnQgbHVhT19mYjJpbnQgKGludCB4KTsKK0xVQUlfRlVOQyBpbnQgbHVhT19yYXdlcXVhbE9iaiAoY29uc3QgVFZhbHVlICp0MSwgY29uc3QgVFZhbHVlICp0Mik7CitMVUFJX0ZVTkMgaW50IGx1YU9fc3RyMmQgKGNvbnN0IGNoYXIgKnMsIGx1YV9OdW1iZXIgKnJlc3VsdCk7CitMVUFJX0ZVTkMgY29uc3QgY2hhciAqbHVhT19wdXNodmZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncCk7CitMVUFJX0ZVTkMgY29uc3QgY2hhciAqbHVhT19wdXNoZnN0cmluZyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitMVUFJX0ZVTkMgdm9pZCBsdWFPX2NodW5raWQgKGNoYXIgKm91dCwgY29uc3QgY2hhciAqc291cmNlLCBzaXplX3QgbGVuKTsKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sb3Bjb2Rlcy5jIGIvbHVhLTUuMS40L3NyYy9sb3Bjb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzc0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xvcGNvZGVzLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisqKiAkSWQ6IGxvcGNvZGVzLmMsdiAxLjM3LjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNkZWZpbmUgbG9wY29kZXNfYworI2RlZmluZSBMVUFfQ09SRQorCisKKyNpbmNsdWRlICJsb3Bjb2Rlcy5oIgorCisKKy8qIE9SREVSIE9QICovCisKK2NvbnN0IGNoYXIgKmNvbnN0IGx1YVBfb3BuYW1lc1tOVU1fT1BDT0RFUysxXSA9IHsKKyAgIk1PVkUiLAorICAiTE9BREsiLAorICAiTE9BREJPT0wiLAorICAiTE9BRE5JTCIsCisgICJHRVRVUFZBTCIsCisgICJHRVRHTE9CQUwiLAorICAiR0VUVEFCTEUiLAorICAiU0VUR0xPQkFMIiwKKyAgIlNFVFVQVkFMIiwKKyAgIlNFVFRBQkxFIiwKKyAgIk5FV1RBQkxFIiwKKyAgIlNFTEYiLAorICAiQUREIiwKKyAgIlNVQiIsCisgICJNVUwiLAorICAiRElWIiwKKyAgIk1PRCIsCisgICJQT1ciLAorICAiVU5NIiwKKyAgIk5PVCIsCisgICJMRU4iLAorICAiQ09OQ0FUIiwKKyAgIkpNUCIsCisgICJFUSIsCisgICJMVCIsCisgICJMRSIsCisgICJURVNUIiwKKyAgIlRFU1RTRVQiLAorICAiQ0FMTCIsCisgICJUQUlMQ0FMTCIsCisgICJSRVRVUk4iLAorICAiRk9STE9PUCIsCisgICJGT1JQUkVQIiwKKyAgIlRGT1JMT09QIiwKKyAgIlNFVExJU1QiLAorICAiQ0xPU0UiLAorICAiQ0xPU1VSRSIsCisgICJWQVJBUkciLAorICBOVUxMCit9OworCisKKyNkZWZpbmUgb3Btb2RlKHQsYSxiLGMsbSkgKCgodCk8PDcpIHwgKChhKTw8NikgfCAoKGIpPDw0KSB8ICgoYyk8PDIpIHwgKG0pKQorCitjb25zdCBsdV9ieXRlIGx1YVBfb3Btb2Rlc1tOVU1fT1BDT0RFU10gPSB7CisvKiAgICAgICBUICBBICAgIEIgICAgICAgQyAgICAgbW9kZQkJICAgb3Bjb2RlCSovCisgIG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnTiwgaUFCQykgCQkvKiBPUF9NT1ZFICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ0ssIE9wQXJnTiwgaUFCeCkJCS8qIE9QX0xPQURLICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnVSwgaUFCQykJCS8qIE9QX0xPQURCT09MICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnTiwgaUFCQykJCS8qIE9QX0xPQUROSUwgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnVSwgT3BBcmdOLCBpQUJDKQkJLyogT1BfR0VUVVBWQUwgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnSywgT3BBcmdOLCBpQUJ4KQkJLyogT1BfR0VUR0xPQkFMICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnSywgaUFCQykJCS8qIE9QX0dFVFRBQkxFICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ0ssIE9wQXJnTiwgaUFCeCkJCS8qIE9QX1NFVEdMT0JBTCAqLworICxvcG1vZGUoMCwgMCwgT3BBcmdVLCBPcEFyZ04sIGlBQkMpCQkvKiBPUF9TRVRVUFZBTCAqLworICxvcG1vZGUoMCwgMCwgT3BBcmdLLCBPcEFyZ0ssIGlBQkMpCQkvKiBPUF9TRVRUQUJMRSAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdVLCBPcEFyZ1UsIGlBQkMpCQkvKiBPUF9ORVdUQUJMRSAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdSLCBPcEFyZ0ssIGlBQkMpCQkvKiBPUF9TRUxGICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX0FERCAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdLLCBPcEFyZ0ssIGlBQkMpCQkvKiBPUF9TVUIgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnSywgT3BBcmdLLCBpQUJDKQkJLyogT1BfTVVMICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX0RJViAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdLLCBPcEFyZ0ssIGlBQkMpCQkvKiBPUF9NT0QgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnSywgT3BBcmdLLCBpQUJDKQkJLyogT1BfUE9XICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnTiwgaUFCQykJCS8qIE9QX1VOTSAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdSLCBPcEFyZ04sIGlBQkMpCQkvKiBPUF9OT1QgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnUiwgT3BBcmdOLCBpQUJDKQkJLyogT1BfTEVOICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnUiwgaUFCQykJCS8qIE9QX0NPTkNBVCAqLworICxvcG1vZGUoMCwgMCwgT3BBcmdSLCBPcEFyZ04sIGlBc0J4KQkJLyogT1BfSk1QICovCisgLG9wbW9kZSgxLCAwLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX0VRICovCisgLG9wbW9kZSgxLCAwLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX0xUICovCisgLG9wbW9kZSgxLCAwLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX0xFICovCisgLG9wbW9kZSgxLCAxLCBPcEFyZ1IsIE9wQXJnVSwgaUFCQykJCS8qIE9QX1RFU1QgKi8KKyAsb3Btb2RlKDEsIDEsIE9wQXJnUiwgT3BBcmdVLCBpQUJDKQkJLyogT1BfVEVTVFNFVCAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdVLCBPcEFyZ1UsIGlBQkMpCQkvKiBPUF9DQUxMICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnVSwgaUFCQykJCS8qIE9QX1RBSUxDQUxMICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ1UsIE9wQXJnTiwgaUFCQykJCS8qIE9QX1JFVFVSTiAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdSLCBPcEFyZ04sIGlBc0J4KQkJLyogT1BfRk9STE9PUCAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdSLCBPcEFyZ04sIGlBc0J4KQkJLyogT1BfRk9SUFJFUCAqLworICxvcG1vZGUoMSwgMCwgT3BBcmdOLCBPcEFyZ1UsIGlBQkMpCQkvKiBPUF9URk9STE9PUCAqLworICxvcG1vZGUoMCwgMCwgT3BBcmdVLCBPcEFyZ1UsIGlBQkMpCQkvKiBPUF9TRVRMSVNUICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ04sIE9wQXJnTiwgaUFCQykJCS8qIE9QX0NMT1NFICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnTiwgaUFCeCkJCS8qIE9QX0NMT1NVUkUgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnVSwgT3BBcmdOLCBpQUJDKQkJLyogT1BfVkFSQVJHICovCit9OworCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xvcGNvZGVzLmggYi9sdWEtNS4xLjQvc3JjL2xvcGNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMjRkNgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbG9wY29kZXMuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyoqICRJZDogbG9wY29kZXMuaCx2IDEuMTI1LjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIE9wY29kZXMgZm9yIEx1YSB2aXJ0dWFsIG1hY2hpbmUKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGxvcGNvZGVzX2gKKyNkZWZpbmUgbG9wY29kZXNfaAorCisjaW5jbHVkZSAibGxpbWl0cy5oIgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFdlIGFzc3VtZSB0aGF0IGluc3RydWN0aW9ucyBhcmUgdW5zaWduZWQgbnVtYmVycy4KKyAgQWxsIGluc3RydWN0aW9ucyBoYXZlIGFuIG9wY29kZSBpbiB0aGUgZmlyc3QgNiBiaXRzLgorICBJbnN0cnVjdGlvbnMgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisJYEEnIDogOCBiaXRzCisJYEInIDogOSBiaXRzCisJYEMnIDogOSBiaXRzCisJYEJ4JyA6IDE4IGJpdHMgKGBCJyBhbmQgYEMnIHRvZ2V0aGVyKQorCWBzQngnIDogc2lnbmVkIEJ4CisKKyAgQSBzaWduZWQgYXJndW1lbnQgaXMgcmVwcmVzZW50ZWQgaW4gZXhjZXNzIEs7IHRoYXQgaXMsIHRoZSBudW1iZXIKKyAgdmFsdWUgaXMgdGhlIHVuc2lnbmVkIHZhbHVlIG1pbnVzIEsuIEsgaXMgZXhhY3RseSB0aGUgbWF4aW11bSB2YWx1ZQorICBmb3IgdGhhdCBhcmd1bWVudCAoc28gdGhhdCAtbWF4IGlzIHJlcHJlc2VudGVkIGJ5IDAsIGFuZCArbWF4IGlzCisgIHJlcHJlc2VudGVkIGJ5IDIqbWF4KSwgd2hpY2ggaXMgaGFsZiB0aGUgbWF4aW11bSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKKyAgdW5zaWduZWQgYXJndW1lbnQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK2VudW0gT3BNb2RlIHtpQUJDLCBpQUJ4LCBpQXNCeH07ICAvKiBiYXNpYyBpbnN0cnVjdGlvbiBmb3JtYXQgKi8KKworCisvKgorKiogc2l6ZSBhbmQgcG9zaXRpb24gb2Ygb3Bjb2RlIGFyZ3VtZW50cy4KKyovCisjZGVmaW5lIFNJWkVfQwkJOQorI2RlZmluZSBTSVpFX0IJCTkKKyNkZWZpbmUgU0laRV9CeAkJKFNJWkVfQyArIFNJWkVfQikKKyNkZWZpbmUgU0laRV9BCQk4CisKKyNkZWZpbmUgU0laRV9PUAkJNgorCisjZGVmaW5lIFBPU19PUAkJMAorI2RlZmluZSBQT1NfQQkJKFBPU19PUCArIFNJWkVfT1ApCisjZGVmaW5lIFBPU19DCQkoUE9TX0EgKyBTSVpFX0EpCisjZGVmaW5lIFBPU19CCQkoUE9TX0MgKyBTSVpFX0MpCisjZGVmaW5lIFBPU19CeAkJUE9TX0MKKworCisvKgorKiogbGltaXRzIGZvciBvcGNvZGUgYXJndW1lbnRzLgorKiogd2UgdXNlIChzaWduZWQpIGludCB0byBtYW5pcHVsYXRlIG1vc3QgYXJndW1lbnRzLAorKiogc28gdGhleSBtdXN0IGZpdCBpbiBMVUFJX0JJVFNJTlQtMSBiaXRzICgtMSBmb3Igc2lnbikKKyovCisjaWYgU0laRV9CeCA8IExVQUlfQklUU0lOVC0xCisjZGVmaW5lIE1BWEFSR19CeCAgICAgICAgKCgxPDxTSVpFX0J4KS0xKQorI2RlZmluZSBNQVhBUkdfc0J4ICAgICAgICAoTUFYQVJHX0J4Pj4xKSAgICAgICAgIC8qIGBzQngnIGlzIHNpZ25lZCAqLworI2Vsc2UKKyNkZWZpbmUgTUFYQVJHX0J4ICAgICAgICBNQVhfSU5UCisjZGVmaW5lIE1BWEFSR19zQnggICAgICAgIE1BWF9JTlQKKyNlbmRpZgorCisKKyNkZWZpbmUgTUFYQVJHX0EgICAgICAgICgoMTw8U0laRV9BKS0xKQorI2RlZmluZSBNQVhBUkdfQiAgICAgICAgKCgxPDxTSVpFX0IpLTEpCisjZGVmaW5lIE1BWEFSR19DICAgICAgICAoKDE8PFNJWkVfQyktMSkKKworCisvKiBjcmVhdGVzIGEgbWFzayB3aXRoIGBuJyAxIGJpdHMgYXQgcG9zaXRpb24gYHAnICovCisjZGVmaW5lIE1BU0sxKG4scCkJKCh+KCh+KEluc3RydWN0aW9uKTApPDxuKSk8PHApCisKKy8qIGNyZWF0ZXMgYSBtYXNrIHdpdGggYG4nIDAgYml0cyBhdCBwb3NpdGlvbiBgcCcgKi8KKyNkZWZpbmUgTUFTSzAobixwKQkofk1BU0sxKG4scCkpCisKKy8qCisqKiB0aGUgZm9sbG93aW5nIG1hY3JvcyBoZWxwIHRvIG1hbmlwdWxhdGUgaW5zdHJ1Y3Rpb25zCisqLworCisjZGVmaW5lIEdFVF9PUENPREUoaSkJKGNhc3QoT3BDb2RlLCAoKGkpPj5QT1NfT1ApICYgTUFTSzEoU0laRV9PUCwwKSkpCisjZGVmaW5lIFNFVF9PUENPREUoaSxvKQkoKGkpID0gKCgoaSkmTUFTSzAoU0laRV9PUCxQT1NfT1ApKSB8IFwKKwkJKChjYXN0KEluc3RydWN0aW9uLCBvKTw8UE9TX09QKSZNQVNLMShTSVpFX09QLFBPU19PUCkpKSkKKworI2RlZmluZSBHRVRBUkdfQShpKQkoY2FzdChpbnQsICgoaSk+PlBPU19BKSAmIE1BU0sxKFNJWkVfQSwwKSkpCisjZGVmaW5lIFNFVEFSR19BKGksdSkJKChpKSA9ICgoKGkpJk1BU0swKFNJWkVfQSxQT1NfQSkpIHwgXAorCQkoKGNhc3QoSW5zdHJ1Y3Rpb24sIHUpPDxQT1NfQSkmTUFTSzEoU0laRV9BLFBPU19BKSkpKQorCisjZGVmaW5lIEdFVEFSR19CKGkpCShjYXN0KGludCwgKChpKT4+UE9TX0IpICYgTUFTSzEoU0laRV9CLDApKSkKKyNkZWZpbmUgU0VUQVJHX0IoaSxiKQkoKGkpID0gKCgoaSkmTUFTSzAoU0laRV9CLFBPU19CKSkgfCBcCisJCSgoY2FzdChJbnN0cnVjdGlvbiwgYik8PFBPU19CKSZNQVNLMShTSVpFX0IsUE9TX0IpKSkpCisKKyNkZWZpbmUgR0VUQVJHX0MoaSkJKGNhc3QoaW50LCAoKGkpPj5QT1NfQykgJiBNQVNLMShTSVpFX0MsMCkpKQorI2RlZmluZSBTRVRBUkdfQyhpLGIpCSgoaSkgPSAoKChpKSZNQVNLMChTSVpFX0MsUE9TX0MpKSB8IFwKKwkJKChjYXN0KEluc3RydWN0aW9uLCBiKTw8UE9TX0MpJk1BU0sxKFNJWkVfQyxQT1NfQykpKSkKKworI2RlZmluZSBHRVRBUkdfQngoaSkJKGNhc3QoaW50LCAoKGkpPj5QT1NfQngpICYgTUFTSzEoU0laRV9CeCwwKSkpCisjZGVmaW5lIFNFVEFSR19CeChpLGIpCSgoaSkgPSAoKChpKSZNQVNLMChTSVpFX0J4LFBPU19CeCkpIHwgXAorCQkoKGNhc3QoSW5zdHJ1Y3Rpb24sIGIpPDxQT1NfQngpJk1BU0sxKFNJWkVfQngsUE9TX0J4KSkpKQorCisjZGVmaW5lIEdFVEFSR19zQngoaSkJKEdFVEFSR19CeChpKS1NQVhBUkdfc0J4KQorI2RlZmluZSBTRVRBUkdfc0J4KGksYikJU0VUQVJHX0J4KChpKSxjYXN0KHVuc2lnbmVkIGludCwgKGIpK01BWEFSR19zQngpKQorCisKKyNkZWZpbmUgQ1JFQVRFX0FCQyhvLGEsYixjKQkoKGNhc3QoSW5zdHJ1Y3Rpb24sIG8pPDxQT1NfT1ApIFwKKwkJCXwgKGNhc3QoSW5zdHJ1Y3Rpb24sIGEpPDxQT1NfQSkgXAorCQkJfCAoY2FzdChJbnN0cnVjdGlvbiwgYik8PFBPU19CKSBcCisJCQl8IChjYXN0KEluc3RydWN0aW9uLCBjKTw8UE9TX0MpKQorCisjZGVmaW5lIENSRUFURV9BQngobyxhLGJjKQkoKGNhc3QoSW5zdHJ1Y3Rpb24sIG8pPDxQT1NfT1ApIFwKKwkJCXwgKGNhc3QoSW5zdHJ1Y3Rpb24sIGEpPDxQT1NfQSkgXAorCQkJfCAoY2FzdChJbnN0cnVjdGlvbiwgYmMpPDxQT1NfQngpKQorCisKKy8qCisqKiBNYWNyb3MgdG8gb3BlcmF0ZSBSSyBpbmRpY2VzCisqLworCisvKiB0aGlzIGJpdCAxIG1lYW5zIGNvbnN0YW50ICgwIG1lYW5zIHJlZ2lzdGVyKSAqLworI2RlZmluZSBCSVRSSwkJKDEgPDwgKFNJWkVfQiAtIDEpKQorCisvKiB0ZXN0IHdoZXRoZXIgdmFsdWUgaXMgYSBjb25zdGFudCAqLworI2RlZmluZSBJU0soeCkJCSgoeCkgJiBCSVRSSykKKworLyogZ2V0cyB0aGUgaW5kZXggb2YgdGhlIGNvbnN0YW50ICovCisjZGVmaW5lIElOREVYSyhyKQkoKGludCkocikgJiB+QklUUkspCisKKyNkZWZpbmUgTUFYSU5ERVhSSwkoQklUUksgLSAxKQorCisvKiBjb2RlIGEgY29uc3RhbnQgaW5kZXggYXMgYSBSSyB2YWx1ZSAqLworI2RlZmluZSBSS0FTSyh4KQkoKHgpIHwgQklUUkspCisKKworLyoKKyoqIGludmFsaWQgcmVnaXN0ZXIgdGhhdCBmaXRzIGluIDggYml0cworKi8KKyNkZWZpbmUgTk9fUkVHCQlNQVhBUkdfQQorCisKKy8qCisqKiBSKHgpIC0gcmVnaXN0ZXIKKyoqIEtzdCh4KSAtIGNvbnN0YW50IChpbiBjb25zdGFudCB0YWJsZSkKKyoqIFJLKHgpID09IGlmIElTSyh4KSB0aGVuIEtzdChJTkRFWEsoeCkpIGVsc2UgUih4KQorKi8KKworCisvKgorKiogZ3JlcCAiT1JERVIgT1AiIGlmIHlvdSBjaGFuZ2UgdGhlc2UgZW51bXMKKyovCisKK3R5cGVkZWYgZW51bSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWUJCWFyZ3MJZGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitPUF9NT1ZFLC8qCUEgQglSKEEpIDo9IFIoQikJCQkJCSovCitPUF9MT0FESywvKglBIEJ4CVIoQSkgOj0gS3N0KEJ4KQkJCQkJKi8KK09QX0xPQURCT09MLC8qCUEgQiBDCVIoQSkgOj0gKEJvb2wpQjsgaWYgKEMpIHBjKysJCQkqLworT1BfTE9BRE5JTCwvKglBIEIJUihBKSA6PSAuLi4gOj0gUihCKSA6PSBuaWwJCQkqLworT1BfR0VUVVBWQUwsLyoJQSBCCVIoQSkgOj0gVXBWYWx1ZVtCXQkJCQkqLworCitPUF9HRVRHTE9CQUwsLyoJQSBCeAlSKEEpIDo9IEdibFtLc3QoQngpXQkJCQkqLworT1BfR0VUVEFCTEUsLyoJQSBCIEMJUihBKSA6PSBSKEIpW1JLKEMpXQkJCQkqLworCitPUF9TRVRHTE9CQUwsLyoJQSBCeAlHYmxbS3N0KEJ4KV0gOj0gUihBKQkJCQkqLworT1BfU0VUVVBWQUwsLyoJQSBCCVVwVmFsdWVbQl0gOj0gUihBKQkJCQkqLworT1BfU0VUVEFCTEUsLyoJQSBCIEMJUihBKVtSSyhCKV0gOj0gUksoQykJCQkJKi8KKworT1BfTkVXVEFCTEUsLyoJQSBCIEMJUihBKSA6PSB7fSAoc2l6ZSA9IEIsQykJCQkJKi8KKworT1BfU0VMRiwvKglBIEIgQwlSKEErMSkgOj0gUihCKTsgUihBKSA6PSBSKEIpW1JLKEMpXQkJKi8KKworT1BfQURELC8qCUEgQiBDCVIoQSkgOj0gUksoQikgKyBSSyhDKQkJCQkqLworT1BfU1VCLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgLSBSSyhDKQkJCQkqLworT1BfTVVMLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgKiBSSyhDKQkJCQkqLworT1BfRElWLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgLyBSSyhDKQkJCQkqLworT1BfTU9ELC8qCUEgQiBDCVIoQSkgOj0gUksoQikgJSBSSyhDKQkJCQkqLworT1BfUE9XLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgXiBSSyhDKQkJCQkqLworT1BfVU5NLC8qCUEgQglSKEEpIDo9IC1SKEIpCQkJCQkqLworT1BfTk9ULC8qCUEgQglSKEEpIDo9IG5vdCBSKEIpCQkJCSovCitPUF9MRU4sLyoJQSBCCVIoQSkgOj0gbGVuZ3RoIG9mIFIoQikJCQkJKi8KKworT1BfQ09OQ0FULC8qCUEgQiBDCVIoQSkgOj0gUihCKS4uIC4uLiAuLlIoQykJCQkqLworCitPUF9KTVAsLyoJc0J4CXBjKz1zQngJCQkJCSovCisKK09QX0VRLC8qCUEgQiBDCWlmICgoUksoQikgPT0gUksoQykpIH49IEEpIHRoZW4gcGMrKwkJKi8KK09QX0xULC8qCUEgQiBDCWlmICgoUksoQikgPCAgUksoQykpIH49IEEpIHRoZW4gcGMrKyAgCQkqLworT1BfTEUsLyoJQSBCIEMJaWYgKChSSyhCKSA8PSBSSyhDKSkgfj0gQSkgdGhlbiBwYysrICAJCSovCisKK09QX1RFU1QsLyoJQSBDCWlmIG5vdCAoUihBKSA8PT4gQykgdGhlbiBwYysrCQkJKi8gCitPUF9URVNUU0VULC8qCUEgQiBDCWlmIChSKEIpIDw9PiBDKSB0aGVuIFIoQSkgOj0gUihCKSBlbHNlIHBjKysJKi8gCisKK09QX0NBTEwsLyoJQSBCIEMJUihBKSwgLi4uICxSKEErQy0yKSA6PSBSKEEpKFIoQSsxKSwgLi4uICxSKEErQi0xKSkgKi8KK09QX1RBSUxDQUxMLC8qCUEgQiBDCXJldHVybiBSKEEpKFIoQSsxKSwgLi4uICxSKEErQi0xKSkJCSovCitPUF9SRVRVUk4sLyoJQSBCCXJldHVybiBSKEEpLCAuLi4gLFIoQStCLTIpCShzZWUgbm90ZSkJKi8KKworT1BfRk9STE9PUCwvKglBIHNCeAlSKEEpKz1SKEErMik7CisJCQlpZiBSKEEpIDw/PSBSKEErMSkgdGhlbiB7IHBjKz1zQng7IFIoQSszKT1SKEEpIH0qLworT1BfRk9SUFJFUCwvKglBIHNCeAlSKEEpLT1SKEErMik7IHBjKz1zQngJCQkJKi8KKworT1BfVEZPUkxPT1AsLyoJQSBDCVIoQSszKSwgLi4uICxSKEErMitDKSA6PSBSKEEpKFIoQSsxKSwgUihBKzIpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBSKEErMykgfj0gbmlsIHRoZW4gUihBKzIpPVIoQSszKSBlbHNlIHBjKysJKi8gCitPUF9TRVRMSVNULC8qCUEgQiBDCVIoQSlbKEMtMSkqRlBGK2ldIDo9IFIoQStpKSwgMSA8PSBpIDw9IEIJKi8KKworT1BfQ0xPU0UsLyoJQSAJY2xvc2UgYWxsIHZhcmlhYmxlcyBpbiB0aGUgc3RhY2sgdXAgdG8gKD49KSBSKEEpKi8KK09QX0NMT1NVUkUsLyoJQSBCeAlSKEEpIDo9IGNsb3N1cmUoS1BST1RPW0J4XSwgUihBKSwgLi4uICxSKEErbikpCSovCisKK09QX1ZBUkFSRy8qCUEgQglSKEEpLCBSKEErMSksIC4uLiwgUihBK0ItMSkgPSB2YXJhcmcJCSovCit9IE9wQ29kZTsKKworCisjZGVmaW5lIE5VTV9PUENPREVTCShjYXN0KGludCwgT1BfVkFSQVJHKSArIDEpCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBOb3RlczoKKyAgKCopIEluIE9QX0NBTEwsIGlmIChCID09IDApIHRoZW4gQiA9IHRvcC4gQyBpcyB0aGUgbnVtYmVyIG9mIHJldHVybnMgLSAxLAorICAgICAgYW5kIGNhbiBiZSAwOiBPUF9DQUxMIHRoZW4gc2V0cyBgdG9wJyB0byBsYXN0X3Jlc3VsdCsxLCBzbworICAgICAgbmV4dCBvcGVuIGluc3RydWN0aW9uIChPUF9DQUxMLCBPUF9SRVRVUk4sIE9QX1NFVExJU1QpIG1heSB1c2UgYHRvcCcuCisKKyAgKCopIEluIE9QX1ZBUkFSRywgaWYgKEIgPT0gMCkgdGhlbiB1c2UgYWN0dWFsIG51bWJlciBvZiB2YXJhcmdzIGFuZAorICAgICAgc2V0IHRvcCAobGlrZSBpbiBPUF9DQUxMIHdpdGggQyA9PSAwKS4KKworICAoKikgSW4gT1BfUkVUVVJOLCBpZiAoQiA9PSAwKSB0aGVuIHJldHVybiB1cCB0byBgdG9wJworCisgICgqKSBJbiBPUF9TRVRMSVNULCBpZiAoQiA9PSAwKSB0aGVuIEIgPSBgdG9wJzsKKyAgICAgIGlmIChDID09IDApIHRoZW4gbmV4dCBgaW5zdHJ1Y3Rpb24nIGlzIHJlYWwgQworCisgICgqKSBGb3IgY29tcGFyaXNvbnMsIEEgc3BlY2lmaWVzIHdoYXQgY29uZGl0aW9uIHRoZSB0ZXN0IHNob3VsZCBhY2NlcHQKKyAgICAgICh0cnVlIG9yIGZhbHNlKS4KKworICAoKikgQWxsIGBza2lwcycgKHBjKyspIGFzc3VtZSB0aGF0IG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBqdW1wCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qCisqKiBtYXNrcyBmb3IgaW5zdHJ1Y3Rpb24gcHJvcGVydGllcy4gVGhlIGZvcm1hdCBpczoKKyoqIGJpdHMgMC0xOiBvcCBtb2RlCisqKiBiaXRzIDItMzogQyBhcmcgbW9kZQorKiogYml0cyA0LTU6IEIgYXJnIG1vZGUKKyoqIGJpdCA2OiBpbnN0cnVjdGlvbiBzZXQgcmVnaXN0ZXIgQQorKiogYml0IDc6IG9wZXJhdG9yIGlzIGEgdGVzdAorKi8gIAorCitlbnVtIE9wQXJnTWFzayB7CisgIE9wQXJnTiwgIC8qIGFyZ3VtZW50IGlzIG5vdCB1c2VkICovCisgIE9wQXJnVSwgIC8qIGFyZ3VtZW50IGlzIHVzZWQgKi8KKyAgT3BBcmdSLCAgLyogYXJndW1lbnQgaXMgYSByZWdpc3RlciBvciBhIGp1bXAgb2Zmc2V0ICovCisgIE9wQXJnSyAgIC8qIGFyZ3VtZW50IGlzIGEgY29uc3RhbnQgb3IgcmVnaXN0ZXIvY29uc3RhbnQgKi8KK307CisKK0xVQUlfREFUQSBjb25zdCBsdV9ieXRlIGx1YVBfb3Btb2Rlc1tOVU1fT1BDT0RFU107CisKKyNkZWZpbmUgZ2V0T3BNb2RlKG0pCShjYXN0KGVudW0gT3BNb2RlLCBsdWFQX29wbW9kZXNbbV0gJiAzKSkKKyNkZWZpbmUgZ2V0Qk1vZGUobSkJKGNhc3QoZW51bSBPcEFyZ01hc2ssIChsdWFQX29wbW9kZXNbbV0gPj4gNCkgJiAzKSkKKyNkZWZpbmUgZ2V0Q01vZGUobSkJKGNhc3QoZW51bSBPcEFyZ01hc2ssIChsdWFQX29wbW9kZXNbbV0gPj4gMikgJiAzKSkKKyNkZWZpbmUgdGVzdEFNb2RlKG0pCShsdWFQX29wbW9kZXNbbV0gJiAoMSA8PCA2KSkKKyNkZWZpbmUgdGVzdFRNb2RlKG0pCShsdWFQX29wbW9kZXNbbV0gJiAoMSA8PCA3KSkKKworCitMVUFJX0RBVEEgY29uc3QgY2hhciAqY29uc3QgbHVhUF9vcG5hbWVzW05VTV9PUENPREVTKzFdOyAgLyogb3Bjb2RlIG5hbWVzICovCisKKworLyogbnVtYmVyIG9mIGxpc3QgaXRlbXMgdG8gYWNjdW11bGF0ZSBiZWZvcmUgYSBTRVRMSVNUIGluc3RydWN0aW9uICovCisjZGVmaW5lIExGSUVMRFNfUEVSX0ZMVVNICTUwCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2xvc2xpYi5jIGIvbHVhLTUuMS40L3NyYy9sb3NsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA2YTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sb3NsaWIuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyoqICRJZDogbG9zbGliLmMsdiAxLjE5LjEuMyAyMDA4LzAxLzE4IDE2OjM4OjE4IHJvYmVydG8gRXhwICQKKyoqIFN0YW5kYXJkIE9wZXJhdGluZyBTeXN0ZW0gbGlicmFyeQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjZGVmaW5lIGxvc2xpYl9jCisjZGVmaW5lIExVQV9MSUIKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorCisKK3N0YXRpYyBpbnQgb3NfcHVzaHJlc3VsdCAobHVhX1N0YXRlICpMLCBpbnQgaSwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgaW50IGVuID0gZXJybm87ICAvKiBjYWxscyB0byBMdWEgQVBJIG1heSBjaGFuZ2UgdGhpcyB2YWx1ZSAqLworICBpZiAoaSkgeworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIHsKKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlbikpOworICAgIGx1YV9wdXNoaW50ZWdlcihMLCBlbik7CisgICAgcmV0dXJuIDM7CisgIH0KK30KKworCitzdGF0aWMgaW50IG9zX2V4ZWN1dGUgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaGludGVnZXIoTCwgc3lzdGVtKGx1YUxfb3B0c3RyaW5nKEwsIDEsIE5VTEwpKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgb3NfcmVtb3ZlIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICByZXR1cm4gb3NfcHVzaHJlc3VsdChMLCByZW1vdmUoZmlsZW5hbWUpID09IDAsIGZpbGVuYW1lKTsKK30KKworCitzdGF0aWMgaW50IG9zX3JlbmFtZSAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKmZyb21uYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgY29uc3QgY2hhciAqdG9uYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyAgcmV0dXJuIG9zX3B1c2hyZXN1bHQoTCwgcmVuYW1lKGZyb21uYW1lLCB0b25hbWUpID09IDAsIGZyb21uYW1lKTsKK30KKworCitzdGF0aWMgaW50IG9zX3RtcG5hbWUgKGx1YV9TdGF0ZSAqTCkgeworICBjaGFyIGJ1ZmZbTFVBX1RNUE5BTUJVRlNJWkVdOworICBpbnQgZXJyOworICBsdWFfdG1wbmFtKGJ1ZmYsIGVycik7CisgIGlmIChlcnIpCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgInVuYWJsZSB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBmaWxlbmFtZSIpOworICBsdWFfcHVzaHN0cmluZyhMLCBidWZmKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBvc19nZXRlbnYgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaHN0cmluZyhMLCBnZXRlbnYobHVhTF9jaGVja3N0cmluZyhMLCAxKSkpOyAgLyogaWYgTlVMTCBwdXNoIG5pbCAqLworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IG9zX2Nsb2NrIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgKChsdWFfTnVtYmVyKWNsb2NrKCkpLyhsdWFfTnVtYmVyKUNMT0NLU19QRVJfU0VDKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFRpbWUvRGF0ZSBvcGVyYXRpb25zCisqKiB7IHllYXI9JVksIG1vbnRoPSVtLCBkYXk9JWQsIGhvdXI9JUgsIG1pbj0lTSwgc2VjPSVTLAorKiogICB3ZGF5PSV3KzEsIHlkYXk9JWosIGlzZHN0PT8gfQorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgc2V0ZmllbGQgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqa2V5LCBpbnQgdmFsdWUpIHsKKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIHZhbHVlKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCBrZXkpOworfQorCitzdGF0aWMgdm9pZCBzZXRib29sZmllbGQgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqa2V5LCBpbnQgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgMCkgIC8qIHVuZGVmaW5lZD8gKi8KKyAgICByZXR1cm47ICAvKiBkb2VzIG5vdCBzZXQgZmllbGQgKi8KKyAgbHVhX3B1c2hib29sZWFuKEwsIHZhbHVlKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCBrZXkpOworfQorCitzdGF0aWMgaW50IGdldGJvb2xmaWVsZCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICprZXkpIHsKKyAgaW50IHJlczsKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCBrZXkpOworICByZXMgPSBsdWFfaXNuaWwoTCwgLTEpID8gLTEgOiBsdWFfdG9ib29sZWFuKEwsIC0xKTsKKyAgbHVhX3BvcChMLCAxKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgaW50IGdldGZpZWxkIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmtleSwgaW50IGQpIHsKKyAgaW50IHJlczsKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCBrZXkpOworICBpZiAobHVhX2lzbnVtYmVyKEwsIC0xKSkKKyAgICByZXMgPSAoaW50KWx1YV90b2ludGVnZXIoTCwgLTEpOworICBlbHNlIHsKKyAgICBpZiAoZCA8IDApCisgICAgICByZXR1cm4gbHVhTF9lcnJvcihMLCAiZmllbGQgIiBMVUFfUVMgIiBtaXNzaW5nIGluIGRhdGUgdGFibGUiLCBrZXkpOworICAgIHJlcyA9IGQ7CisgIH0KKyAgbHVhX3BvcChMLCAxKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgaW50IG9zX2RhdGUgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpzID0gbHVhTF9vcHRzdHJpbmcoTCwgMSwgIiVjIik7CisgIHRpbWVfdCB0ID0gbHVhTF9vcHQoTCwgKHRpbWVfdClsdWFMX2NoZWNrbnVtYmVyLCAyLCB0aW1lKE5VTEwpKTsKKyAgc3RydWN0IHRtICpzdG07CisgIGlmICgqcyA9PSAnIScpIHsgIC8qIFVUQz8gKi8KKyAgICBzdG0gPSBnbXRpbWUoJnQpOworICAgIHMrKzsgIC8qIHNraXAgYCEnICovCisgIH0KKyAgZWxzZQorICAgIHN0bSA9IGxvY2FsdGltZSgmdCk7CisgIGlmIChzdG0gPT0gTlVMTCkgIC8qIGludmFsaWQgZGF0ZT8gKi8KKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgZWxzZSBpZiAoc3RyY21wKHMsICIqdCIpID09IDApIHsKKyAgICBsdWFfY3JlYXRldGFibGUoTCwgMCwgOSk7ICAvKiA5ID0gbnVtYmVyIG9mIGZpZWxkcyAqLworICAgIHNldGZpZWxkKEwsICJzZWMiLCBzdG0tPnRtX3NlYyk7CisgICAgc2V0ZmllbGQoTCwgIm1pbiIsIHN0bS0+dG1fbWluKTsKKyAgICBzZXRmaWVsZChMLCAiaG91ciIsIHN0bS0+dG1faG91cik7CisgICAgc2V0ZmllbGQoTCwgImRheSIsIHN0bS0+dG1fbWRheSk7CisgICAgc2V0ZmllbGQoTCwgIm1vbnRoIiwgc3RtLT50bV9tb24rMSk7CisgICAgc2V0ZmllbGQoTCwgInllYXIiLCBzdG0tPnRtX3llYXIrMTkwMCk7CisgICAgc2V0ZmllbGQoTCwgIndkYXkiLCBzdG0tPnRtX3dkYXkrMSk7CisgICAgc2V0ZmllbGQoTCwgInlkYXkiLCBzdG0tPnRtX3lkYXkrMSk7CisgICAgc2V0Ym9vbGZpZWxkKEwsICJpc2RzdCIsIHN0bS0+dG1faXNkc3QpOworICB9CisgIGVsc2UgeworICAgIGNoYXIgY2NbM107CisgICAgbHVhTF9CdWZmZXIgYjsKKyAgICBjY1swXSA9ICclJzsgY2NbMl0gPSAnXDAnOworICAgIGx1YUxfYnVmZmluaXQoTCwgJmIpOworICAgIGZvciAoOyAqczsgcysrKSB7CisgICAgICBpZiAoKnMgIT0gJyUnIHx8ICoocyArIDEpID09ICdcMCcpICAvKiBubyBjb252ZXJzaW9uIHNwZWNpZmllcj8gKi8KKyAgICAgICAgbHVhTF9hZGRjaGFyKCZiLCAqcyk7CisgICAgICBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHJlc2xlbjsKKyAgICAgICAgY2hhciBidWZmWzIwMF07ICAvKiBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgYW55IGNvbnZlcnNpb24gcmVzdWx0ICovCisgICAgICAgIGNjWzFdID0gKigrK3MpOworICAgICAgICByZXNsZW4gPSBzdHJmdGltZShidWZmLCBzaXplb2YoYnVmZiksIGNjLCBzdG0pOworICAgICAgICBsdWFMX2FkZGxzdHJpbmcoJmIsIGJ1ZmYsIHJlc2xlbik7CisgICAgICB9CisgICAgfQorICAgIGx1YUxfcHVzaHJlc3VsdCgmYik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBvc190aW1lIChsdWFfU3RhdGUgKkwpIHsKKyAgdGltZV90IHQ7CisgIGlmIChsdWFfaXNub25lb3JuaWwoTCwgMSkpICAvKiBjYWxsZWQgd2l0aG91dCBhcmdzPyAqLworICAgIHQgPSB0aW1lKE5VTEwpOyAgLyogZ2V0IGN1cnJlbnQgdGltZSAqLworICBlbHNlIHsKKyAgICBzdHJ1Y3QgdG0gdHM7CisgICAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RUQUJMRSk7CisgICAgbHVhX3NldHRvcChMLCAxKTsgIC8qIG1ha2Ugc3VyZSB0YWJsZSBpcyBhdCB0aGUgdG9wICovCisgICAgdHMudG1fc2VjID0gZ2V0ZmllbGQoTCwgInNlYyIsIDApOworICAgIHRzLnRtX21pbiA9IGdldGZpZWxkKEwsICJtaW4iLCAwKTsKKyAgICB0cy50bV9ob3VyID0gZ2V0ZmllbGQoTCwgImhvdXIiLCAxMik7CisgICAgdHMudG1fbWRheSA9IGdldGZpZWxkKEwsICJkYXkiLCAtMSk7CisgICAgdHMudG1fbW9uID0gZ2V0ZmllbGQoTCwgIm1vbnRoIiwgLTEpIC0gMTsKKyAgICB0cy50bV95ZWFyID0gZ2V0ZmllbGQoTCwgInllYXIiLCAtMSkgLSAxOTAwOworICAgIHRzLnRtX2lzZHN0ID0gZ2V0Ym9vbGZpZWxkKEwsICJpc2RzdCIpOworICAgIHQgPSBta3RpbWUoJnRzKTsKKyAgfQorICBpZiAodCA9PSAodGltZV90KSgtMSkpCisgICAgbHVhX3B1c2huaWwoTCk7CisgIGVsc2UKKyAgICBsdWFfcHVzaG51bWJlcihMLCAobHVhX051bWJlcil0KTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBvc19kaWZmdGltZSAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGRpZmZ0aW1lKCh0aW1lX3QpKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZV90KShsdWFMX29wdG51bWJlcihMLCAyLCAwKSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitzdGF0aWMgaW50IG9zX3NldGxvY2FsZSAobHVhX1N0YXRlICpMKSB7CisgIHN0YXRpYyBjb25zdCBpbnQgY2F0W10gPSB7TENfQUxMLCBMQ19DT0xMQVRFLCBMQ19DVFlQRSwgTENfTU9ORVRBUlksCisgICAgICAgICAgICAgICAgICAgICAgTENfTlVNRVJJQywgTENfVElNRX07CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjYXRuYW1lc1tdID0geyJhbGwiLCAiY29sbGF0ZSIsICJjdHlwZSIsICJtb25ldGFyeSIsCisgICAgICJudW1lcmljIiwgInRpbWUiLCBOVUxMfTsKKyAgY29uc3QgY2hhciAqbCA9IGx1YUxfb3B0c3RyaW5nKEwsIDEsIE5VTEwpOworICBpbnQgb3AgPSBsdWFMX2NoZWNrb3B0aW9uKEwsIDIsICJhbGwiLCBjYXRuYW1lcyk7CisgIGx1YV9wdXNoc3RyaW5nKEwsIHNldGxvY2FsZShjYXRbb3BdLCBsKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgb3NfZXhpdCAobHVhX1N0YXRlICpMKSB7CisgIGV4aXQobHVhTF9vcHRpbnQoTCwgMSwgRVhJVF9TVUNDRVNTKSk7Cit9CisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBzeXNsaWJbXSA9IHsKKyAgeyJjbG9jayIsICAgICBvc19jbG9ja30sCisgIHsiZGF0ZSIsICAgICAgb3NfZGF0ZX0sCisgIHsiZGlmZnRpbWUiLCAgb3NfZGlmZnRpbWV9LAorICB7ImV4ZWN1dGUiLCAgIG9zX2V4ZWN1dGV9LAorICB7ImV4aXQiLCAgICAgIG9zX2V4aXR9LAorICB7ImdldGVudiIsICAgIG9zX2dldGVudn0sCisgIHsicmVtb3ZlIiwgICAgb3NfcmVtb3ZlfSwKKyAgeyJyZW5hbWUiLCAgICBvc19yZW5hbWV9LAorICB7InNldGxvY2FsZSIsIG9zX3NldGxvY2FsZX0sCisgIHsidGltZSIsICAgICAgb3NfdGltZX0sCisgIHsidG1wbmFtZSIsICAgb3NfdG1wbmFtZX0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9vcyAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfcmVnaXN0ZXIoTCwgTFVBX09TTElCTkFNRSwgc3lzbGliKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHBhcnNlci5jIGIvbHVhLTUuMS40L3NyYy9scGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyYTlhOAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHBhcnNlci5jCkBAIC0wLDAgKzEsMTMzOSBAQAorLyoKKyoqICRJZDogbHBhcnNlci5jLHYgMi40Mi4xLjMgMjAwNy8xMi8yOCAxNTozMjoyMyByb2JlcnRvIEV4cCAkCisqKiBMdWEgUGFyc2VyCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbHBhcnNlcl9jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxjb2RlLmgiCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsbGV4LmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsb3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxwYXJzZXIuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisKKworCisjZGVmaW5lIGhhc211bHRyZXQoaykJCSgoaykgPT0gVkNBTEwgfHwgKGspID09IFZWQVJBUkcpCisKKyNkZWZpbmUgZ2V0bG9jdmFyKGZzLCBpKQkoKGZzKS0+Zi0+bG9jdmFyc1soZnMpLT5hY3R2YXJbaV1dKQorCisjZGVmaW5lIGx1YVlfY2hlY2tsaW1pdChmcyx2LGwsbSkJaWYgKCh2KT4obCkpIGVycm9ybGltaXQoZnMsbCxtKQorCisKKy8qCisqKiBub2RlcyBmb3IgYmxvY2sgbGlzdCAobGlzdCBvZiBhY3RpdmUgYmxvY2tzKQorKi8KK3R5cGVkZWYgc3RydWN0IEJsb2NrQ250IHsKKyAgc3RydWN0IEJsb2NrQ250ICpwcmV2aW91czsgIC8qIGNoYWluICovCisgIGludCBicmVha2xpc3Q7ICAvKiBsaXN0IG9mIGp1bXBzIG91dCBvZiB0aGlzIGxvb3AgKi8KKyAgbHVfYnl0ZSBuYWN0dmFyOyAgLyogIyBhY3RpdmUgbG9jYWxzIG91dHNpZGUgdGhlIGJyZWFrYWJsZSBzdHJ1Y3R1cmUgKi8KKyAgbHVfYnl0ZSB1cHZhbDsgIC8qIHRydWUgaWYgc29tZSB2YXJpYWJsZSBpbiB0aGUgYmxvY2sgaXMgYW4gdXB2YWx1ZSAqLworICBsdV9ieXRlIGlzYnJlYWthYmxlOyAgLyogdHJ1ZSBpZiBgYmxvY2snIGlzIGEgbG9vcCAqLworfSBCbG9ja0NudDsKKworCisKKy8qCisqKiBwcm90b3R5cGVzIGZvciByZWN1cnNpdmUgbm9uLXRlcm1pbmFsIGZ1bmN0aW9ucworKi8KK3N0YXRpYyB2b2lkIGNodW5rIChMZXhTdGF0ZSAqbHMpOworc3RhdGljIHZvaWQgZXhwciAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICp2KTsKKworCitzdGF0aWMgdm9pZCBhbmNob3JfdG9rZW4gKExleFN0YXRlICpscykgeworICBpZiAobHMtPnQudG9rZW4gPT0gVEtfTkFNRSB8fCBscy0+dC50b2tlbiA9PSBUS19TVFJJTkcpIHsKKyAgICBUU3RyaW5nICp0cyA9IGxzLT50LnNlbWluZm8udHM7CisgICAgbHVhWF9uZXdzdHJpbmcobHMsIGdldHN0cih0cyksIHRzLT50c3YubGVuKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGVycm9yX2V4cGVjdGVkIChMZXhTdGF0ZSAqbHMsIGludCB0b2tlbikgeworICBsdWFYX3N5bnRheGVycm9yKGxzLAorICAgICAgbHVhT19wdXNoZnN0cmluZyhscy0+TCwgTFVBX1FTICIgZXhwZWN0ZWQiLCBsdWFYX3Rva2VuMnN0cihscywgdG9rZW4pKSk7Cit9CisKKworc3RhdGljIHZvaWQgZXJyb3JsaW1pdCAoRnVuY1N0YXRlICpmcywgaW50IGxpbWl0LCBjb25zdCBjaGFyICp3aGF0KSB7CisgIGNvbnN0IGNoYXIgKm1zZyA9IChmcy0+Zi0+bGluZWRlZmluZWQgPT0gMCkgPworICAgIGx1YU9fcHVzaGZzdHJpbmcoZnMtPkwsICJtYWluIGZ1bmN0aW9uIGhhcyBtb3JlIHRoYW4gJWQgJXMiLCBsaW1pdCwgd2hhdCkgOgorICAgIGx1YU9fcHVzaGZzdHJpbmcoZnMtPkwsICJmdW5jdGlvbiBhdCBsaW5lICVkIGhhcyBtb3JlIHRoYW4gJWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLT5mLT5saW5lZGVmaW5lZCwgbGltaXQsIHdoYXQpOworICBsdWFYX2xleGVycm9yKGZzLT5scywgbXNnLCAwKTsKK30KKworCitzdGF0aWMgaW50IHRlc3RuZXh0IChMZXhTdGF0ZSAqbHMsIGludCBjKSB7CisgIGlmIChscy0+dC50b2tlbiA9PSBjKSB7CisgICAgbHVhWF9uZXh0KGxzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrIChMZXhTdGF0ZSAqbHMsIGludCBjKSB7CisgIGlmIChscy0+dC50b2tlbiAhPSBjKQorICAgIGVycm9yX2V4cGVjdGVkKGxzLCBjKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tuZXh0IChMZXhTdGF0ZSAqbHMsIGludCBjKSB7CisgIGNoZWNrKGxzLCBjKTsKKyAgbHVhWF9uZXh0KGxzKTsKK30KKworCisjZGVmaW5lIGNoZWNrX2NvbmRpdGlvbihscyxjLG1zZykJeyBpZiAoIShjKSkgbHVhWF9zeW50YXhlcnJvcihscywgbXNnKTsgfQorCisKKworc3RhdGljIHZvaWQgY2hlY2tfbWF0Y2ggKExleFN0YXRlICpscywgaW50IHdoYXQsIGludCB3aG8sIGludCB3aGVyZSkgeworICBpZiAoIXRlc3RuZXh0KGxzLCB3aGF0KSkgeworICAgIGlmICh3aGVyZSA9PSBscy0+bGluZW51bWJlcikKKyAgICAgIGVycm9yX2V4cGVjdGVkKGxzLCB3aGF0KTsKKyAgICBlbHNlIHsKKyAgICAgIGx1YVhfc3ludGF4ZXJyb3IobHMsIGx1YU9fcHVzaGZzdHJpbmcobHMtPkwsCisgICAgICAgICAgICAgTFVBX1FTICIgZXhwZWN0ZWQgKHRvIGNsb3NlICIgTFVBX1FTICIgYXQgbGluZSAlZCkiLAorICAgICAgICAgICAgICBsdWFYX3Rva2VuMnN0cihscywgd2hhdCksIGx1YVhfdG9rZW4yc3RyKGxzLCB3aG8pLCB3aGVyZSkpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBUU3RyaW5nICpzdHJfY2hlY2tuYW1lIChMZXhTdGF0ZSAqbHMpIHsKKyAgVFN0cmluZyAqdHM7CisgIGNoZWNrKGxzLCBUS19OQU1FKTsKKyAgdHMgPSBscy0+dC5zZW1pbmZvLnRzOworICBsdWFYX25leHQobHMpOworICByZXR1cm4gdHM7Cit9CisKKworc3RhdGljIHZvaWQgaW5pdF9leHAgKGV4cGRlc2MgKmUsIGV4cGtpbmQgaywgaW50IGkpIHsKKyAgZS0+ZiA9IGUtPnQgPSBOT19KVU1QOworICBlLT5rID0gazsKKyAgZS0+dS5zLmluZm8gPSBpOworfQorCisKK3N0YXRpYyB2b2lkIGNvZGVzdHJpbmcgKExleFN0YXRlICpscywgZXhwZGVzYyAqZSwgVFN0cmluZyAqcykgeworICBpbml0X2V4cChlLCBWSywgbHVhS19zdHJpbmdLKGxzLT5mcywgcykpOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrbmFtZShMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKmUpIHsKKyAgY29kZXN0cmluZyhscywgZSwgc3RyX2NoZWNrbmFtZShscykpOworfQorCisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJsb2NhbHZhciAoTGV4U3RhdGUgKmxzLCBUU3RyaW5nICp2YXJuYW1lKSB7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIFByb3RvICpmID0gZnMtPmY7CisgIGludCBvbGRzaXplID0gZi0+c2l6ZWxvY3ZhcnM7CisgIGx1YU1fZ3Jvd3ZlY3Rvcihscy0+TCwgZi0+bG9jdmFycywgZnMtPm5sb2N2YXJzLCBmLT5zaXplbG9jdmFycywKKyAgICAgICAgICAgICAgICAgIExvY1ZhciwgU0hSVF9NQVgsICJ0b28gbWFueSBsb2NhbCB2YXJpYWJsZXMiKTsKKyAgd2hpbGUgKG9sZHNpemUgPCBmLT5zaXplbG9jdmFycykgZi0+bG9jdmFyc1tvbGRzaXplKytdLnZhcm5hbWUgPSBOVUxMOworICBmLT5sb2N2YXJzW2ZzLT5ubG9jdmFyc10udmFybmFtZSA9IHZhcm5hbWU7CisgIGx1YUNfb2JqYmFycmllcihscy0+TCwgZiwgdmFybmFtZSk7CisgIHJldHVybiBmcy0+bmxvY3ZhcnMrKzsKK30KKworCisjZGVmaW5lIG5ld19sb2NhbHZhcmxpdGVyYWwobHMsdixuKSBcCisgIG5ld19sb2NhbHZhcihscywgbHVhWF9uZXdzdHJpbmcobHMsICIiIHYsIChzaXplb2Yodikvc2l6ZW9mKGNoYXIpKS0xKSwgbikKKworCitzdGF0aWMgdm9pZCBuZXdfbG9jYWx2YXIgKExleFN0YXRlICpscywgVFN0cmluZyAqbmFtZSwgaW50IG4pIHsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgbHVhWV9jaGVja2xpbWl0KGZzLCBmcy0+bmFjdHZhcituKzEsIExVQUlfTUFYVkFSUywgImxvY2FsIHZhcmlhYmxlcyIpOworICBmcy0+YWN0dmFyW2ZzLT5uYWN0dmFyK25dID0gY2FzdCh1bnNpZ25lZCBzaG9ydCwgcmVnaXN0ZXJsb2NhbHZhcihscywgbmFtZSkpOworfQorCisKK3N0YXRpYyB2b2lkIGFkanVzdGxvY2FsdmFycyAoTGV4U3RhdGUgKmxzLCBpbnQgbnZhcnMpIHsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgZnMtPm5hY3R2YXIgPSBjYXN0X2J5dGUoZnMtPm5hY3R2YXIgKyBudmFycyk7CisgIGZvciAoOyBudmFyczsgbnZhcnMtLSkgeworICAgIGdldGxvY3ZhcihmcywgZnMtPm5hY3R2YXIgLSBudmFycykuc3RhcnRwYyA9IGZzLT5wYzsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHJlbW92ZXZhcnMgKExleFN0YXRlICpscywgaW50IHRvbGV2ZWwpIHsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgd2hpbGUgKGZzLT5uYWN0dmFyID4gdG9sZXZlbCkKKyAgICBnZXRsb2N2YXIoZnMsIC0tZnMtPm5hY3R2YXIpLmVuZHBjID0gZnMtPnBjOworfQorCisKK3N0YXRpYyBpbnQgaW5kZXh1cHZhbHVlIChGdW5jU3RhdGUgKmZzLCBUU3RyaW5nICpuYW1lLCBleHBkZXNjICp2KSB7CisgIGludCBpOworICBQcm90byAqZiA9IGZzLT5mOworICBpbnQgb2xkc2l6ZSA9IGYtPnNpemV1cHZhbHVlczsKKyAgZm9yIChpPTA7IGk8Zi0+bnVwczsgaSsrKSB7CisgICAgaWYgKGZzLT51cHZhbHVlc1tpXS5rID09IHYtPmsgJiYgZnMtPnVwdmFsdWVzW2ldLmluZm8gPT0gdi0+dS5zLmluZm8pIHsKKyAgICAgIGx1YV9hc3NlcnQoZi0+dXB2YWx1ZXNbaV0gPT0gbmFtZSk7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgLyogbmV3IG9uZSAqLworICBsdWFZX2NoZWNrbGltaXQoZnMsIGYtPm51cHMgKyAxLCBMVUFJX01BWFVQVkFMVUVTLCAidXB2YWx1ZXMiKTsKKyAgbHVhTV9ncm93dmVjdG9yKGZzLT5MLCBmLT51cHZhbHVlcywgZi0+bnVwcywgZi0+c2l6ZXVwdmFsdWVzLAorICAgICAgICAgICAgICAgICAgVFN0cmluZyAqLCBNQVhfSU5ULCAiIik7CisgIHdoaWxlIChvbGRzaXplIDwgZi0+c2l6ZXVwdmFsdWVzKSBmLT51cHZhbHVlc1tvbGRzaXplKytdID0gTlVMTDsKKyAgZi0+dXB2YWx1ZXNbZi0+bnVwc10gPSBuYW1lOworICBsdWFDX29iamJhcnJpZXIoZnMtPkwsIGYsIG5hbWUpOworICBsdWFfYXNzZXJ0KHYtPmsgPT0gVkxPQ0FMIHx8IHYtPmsgPT0gVlVQVkFMKTsKKyAgZnMtPnVwdmFsdWVzW2YtPm51cHNdLmsgPSBjYXN0X2J5dGUodi0+ayk7CisgIGZzLT51cHZhbHVlc1tmLT5udXBzXS5pbmZvID0gY2FzdF9ieXRlKHYtPnUucy5pbmZvKTsKKyAgcmV0dXJuIGYtPm51cHMrKzsKK30KKworCitzdGF0aWMgaW50IHNlYXJjaHZhciAoRnVuY1N0YXRlICpmcywgVFN0cmluZyAqbikgeworICBpbnQgaTsKKyAgZm9yIChpPWZzLT5uYWN0dmFyLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKG4gPT0gZ2V0bG9jdmFyKGZzLCBpKS52YXJuYW1lKQorICAgICAgcmV0dXJuIGk7CisgIH0KKyAgcmV0dXJuIC0xOyAgLyogbm90IGZvdW5kICovCit9CisKKworc3RhdGljIHZvaWQgbWFya3VwdmFsIChGdW5jU3RhdGUgKmZzLCBpbnQgbGV2ZWwpIHsKKyAgQmxvY2tDbnQgKmJsID0gZnMtPmJsOworICB3aGlsZSAoYmwgJiYgYmwtPm5hY3R2YXIgPiBsZXZlbCkgYmwgPSBibC0+cHJldmlvdXM7CisgIGlmIChibCkgYmwtPnVwdmFsID0gMTsKK30KKworCitzdGF0aWMgaW50IHNpbmdsZXZhcmF1eCAoRnVuY1N0YXRlICpmcywgVFN0cmluZyAqbiwgZXhwZGVzYyAqdmFyLCBpbnQgYmFzZSkgeworICBpZiAoZnMgPT0gTlVMTCkgeyAgLyogbm8gbW9yZSBsZXZlbHM/ICovCisgICAgaW5pdF9leHAodmFyLCBWR0xPQkFMLCBOT19SRUcpOyAgLyogZGVmYXVsdCBpcyBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICByZXR1cm4gVkdMT0JBTDsKKyAgfQorICBlbHNlIHsKKyAgICBpbnQgdiA9IHNlYXJjaHZhcihmcywgbik7ICAvKiBsb29rIHVwIGF0IGN1cnJlbnQgbGV2ZWwgKi8KKyAgICBpZiAodiA+PSAwKSB7CisgICAgICBpbml0X2V4cCh2YXIsIFZMT0NBTCwgdik7CisgICAgICBpZiAoIWJhc2UpCisgICAgICAgIG1hcmt1cHZhbChmcywgdik7ICAvKiBsb2NhbCB3aWxsIGJlIHVzZWQgYXMgYW4gdXB2YWwgKi8KKyAgICAgIHJldHVybiBWTE9DQUw7CisgICAgfQorICAgIGVsc2UgeyAgLyogbm90IGZvdW5kIGF0IGN1cnJlbnQgbGV2ZWw7IHRyeSB1cHBlciBvbmUgKi8KKyAgICAgIGlmIChzaW5nbGV2YXJhdXgoZnMtPnByZXYsIG4sIHZhciwgMCkgPT0gVkdMT0JBTCkKKyAgICAgICAgcmV0dXJuIFZHTE9CQUw7CisgICAgICB2YXItPnUucy5pbmZvID0gaW5kZXh1cHZhbHVlKGZzLCBuLCB2YXIpOyAgLyogZWxzZSB3YXMgTE9DQUwgb3IgVVBWQUwgKi8KKyAgICAgIHZhci0+ayA9IFZVUFZBTDsgIC8qIHVwdmFsdWUgaW4gdGhpcyBsZXZlbCAqLworICAgICAgcmV0dXJuIFZVUFZBTDsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBzaW5nbGV2YXIgKExleFN0YXRlICpscywgZXhwZGVzYyAqdmFyKSB7CisgIFRTdHJpbmcgKnZhcm5hbWUgPSBzdHJfY2hlY2tuYW1lKGxzKTsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgaWYgKHNpbmdsZXZhcmF1eChmcywgdmFybmFtZSwgdmFyLCAxKSA9PSBWR0xPQkFMKQorICAgIHZhci0+dS5zLmluZm8gPSBsdWFLX3N0cmluZ0soZnMsIHZhcm5hbWUpOyAgLyogaW5mbyBwb2ludHMgdG8gZ2xvYmFsIG5hbWUgKi8KK30KKworCitzdGF0aWMgdm9pZCBhZGp1c3RfYXNzaWduIChMZXhTdGF0ZSAqbHMsIGludCBudmFycywgaW50IG5leHBzLCBleHBkZXNjICplKSB7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGludCBleHRyYSA9IG52YXJzIC0gbmV4cHM7CisgIGlmIChoYXNtdWx0cmV0KGUtPmspKSB7CisgICAgZXh0cmErKzsgIC8qIGluY2x1ZGVzIGNhbGwgaXRzZWxmICovCisgICAgaWYgKGV4dHJhIDwgMCkgZXh0cmEgPSAwOworICAgIGx1YUtfc2V0cmV0dXJucyhmcywgZSwgZXh0cmEpOyAgLyogbGFzdCBleHAuIHByb3ZpZGVzIHRoZSBkaWZmZXJlbmNlICovCisgICAgaWYgKGV4dHJhID4gMSkgbHVhS19yZXNlcnZlcmVncyhmcywgZXh0cmEtMSk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKGUtPmsgIT0gVlZPSUQpIGx1YUtfZXhwMm5leHRyZWcoZnMsIGUpOyAgLyogY2xvc2UgbGFzdCBleHByZXNzaW9uICovCisgICAgaWYgKGV4dHJhID4gMCkgeworICAgICAgaW50IHJlZyA9IGZzLT5mcmVlcmVnOworICAgICAgbHVhS19yZXNlcnZlcmVncyhmcywgZXh0cmEpOworICAgICAgbHVhS19uaWwoZnMsIHJlZywgZXh0cmEpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGVudGVybGV2ZWwgKExleFN0YXRlICpscykgeworICBpZiAoKytscy0+TC0+bkNjYWxscyA+IExVQUlfTUFYQ0NBTExTKQorCWx1YVhfbGV4ZXJyb3IobHMsICJjaHVuayBoYXMgdG9vIG1hbnkgc3ludGF4IGxldmVscyIsIDApOworfQorCisKKyNkZWZpbmUgbGVhdmVsZXZlbChscykJKChscyktPkwtPm5DY2FsbHMtLSkKKworCitzdGF0aWMgdm9pZCBlbnRlcmJsb2NrIChGdW5jU3RhdGUgKmZzLCBCbG9ja0NudCAqYmwsIGx1X2J5dGUgaXNicmVha2FibGUpIHsKKyAgYmwtPmJyZWFrbGlzdCA9IE5PX0pVTVA7CisgIGJsLT5pc2JyZWFrYWJsZSA9IGlzYnJlYWthYmxlOworICBibC0+bmFjdHZhciA9IGZzLT5uYWN0dmFyOworICBibC0+dXB2YWwgPSAwOworICBibC0+cHJldmlvdXMgPSBmcy0+Ymw7CisgIGZzLT5ibCA9IGJsOworICBsdWFfYXNzZXJ0KGZzLT5mcmVlcmVnID09IGZzLT5uYWN0dmFyKTsKK30KKworCitzdGF0aWMgdm9pZCBsZWF2ZWJsb2NrIChGdW5jU3RhdGUgKmZzKSB7CisgIEJsb2NrQ250ICpibCA9IGZzLT5ibDsKKyAgZnMtPmJsID0gYmwtPnByZXZpb3VzOworICByZW1vdmV2YXJzKGZzLT5scywgYmwtPm5hY3R2YXIpOworICBpZiAoYmwtPnVwdmFsKQorICAgIGx1YUtfY29kZUFCQyhmcywgT1BfQ0xPU0UsIGJsLT5uYWN0dmFyLCAwLCAwKTsKKyAgLyogYSBibG9jayBlaXRoZXIgY29udHJvbHMgc2NvcGUgb3IgYnJlYWtzIChuZXZlciBib3RoKSAqLworICBsdWFfYXNzZXJ0KCFibC0+aXNicmVha2FibGUgfHwgIWJsLT51cHZhbCk7CisgIGx1YV9hc3NlcnQoYmwtPm5hY3R2YXIgPT0gZnMtPm5hY3R2YXIpOworICBmcy0+ZnJlZXJlZyA9IGZzLT5uYWN0dmFyOyAgLyogZnJlZSByZWdpc3RlcnMgKi8KKyAgbHVhS19wYXRjaHRvaGVyZShmcywgYmwtPmJyZWFrbGlzdCk7Cit9CisKKworc3RhdGljIHZvaWQgcHVzaGNsb3N1cmUgKExleFN0YXRlICpscywgRnVuY1N0YXRlICpmdW5jLCBleHBkZXNjICp2KSB7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIFByb3RvICpmID0gZnMtPmY7CisgIGludCBvbGRzaXplID0gZi0+c2l6ZXA7CisgIGludCBpOworICBsdWFNX2dyb3d2ZWN0b3IobHMtPkwsIGYtPnAsIGZzLT5ucCwgZi0+c2l6ZXAsIFByb3RvICosCisgICAgICAgICAgICAgICAgICBNQVhBUkdfQngsICJjb25zdGFudCB0YWJsZSBvdmVyZmxvdyIpOworICB3aGlsZSAob2xkc2l6ZSA8IGYtPnNpemVwKSBmLT5wW29sZHNpemUrK10gPSBOVUxMOworICBmLT5wW2ZzLT5ucCsrXSA9IGZ1bmMtPmY7CisgIGx1YUNfb2JqYmFycmllcihscy0+TCwgZiwgZnVuYy0+Zik7CisgIGluaXRfZXhwKHYsIFZSRUxPQ0FCTEUsIGx1YUtfY29kZUFCeChmcywgT1BfQ0xPU1VSRSwgMCwgZnMtPm5wLTEpKTsKKyAgZm9yIChpPTA7IGk8ZnVuYy0+Zi0+bnVwczsgaSsrKSB7CisgICAgT3BDb2RlIG8gPSAoZnVuYy0+dXB2YWx1ZXNbaV0uayA9PSBWTE9DQUwpID8gT1BfTU9WRSA6IE9QX0dFVFVQVkFMOworICAgIGx1YUtfY29kZUFCQyhmcywgbywgMCwgZnVuYy0+dXB2YWx1ZXNbaV0uaW5mbywgMCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBvcGVuX2Z1bmMgKExleFN0YXRlICpscywgRnVuY1N0YXRlICpmcykgeworICBsdWFfU3RhdGUgKkwgPSBscy0+TDsKKyAgUHJvdG8gKmYgPSBsdWFGX25ld3Byb3RvKEwpOworICBmcy0+ZiA9IGY7CisgIGZzLT5wcmV2ID0gbHMtPmZzOyAgLyogbGlua2VkIGxpc3Qgb2YgZnVuY3N0YXRlcyAqLworICBmcy0+bHMgPSBsczsKKyAgZnMtPkwgPSBMOworICBscy0+ZnMgPSBmczsKKyAgZnMtPnBjID0gMDsKKyAgZnMtPmxhc3R0YXJnZXQgPSAtMTsKKyAgZnMtPmpwYyA9IE5PX0pVTVA7CisgIGZzLT5mcmVlcmVnID0gMDsKKyAgZnMtPm5rID0gMDsKKyAgZnMtPm5wID0gMDsKKyAgZnMtPm5sb2N2YXJzID0gMDsKKyAgZnMtPm5hY3R2YXIgPSAwOworICBmcy0+YmwgPSBOVUxMOworICBmLT5zb3VyY2UgPSBscy0+c291cmNlOworICBmLT5tYXhzdGFja3NpemUgPSAyOyAgLyogcmVnaXN0ZXJzIDAvMSBhcmUgYWx3YXlzIHZhbGlkICovCisgIGZzLT5oID0gbHVhSF9uZXcoTCwgMCwgMCk7CisgIC8qIGFuY2hvciB0YWJsZSBvZiBjb25zdGFudHMgYW5kIHByb3RvdHlwZSAodG8gYXZvaWQgYmVpbmcgY29sbGVjdGVkKSAqLworICBzZXRodmFsdWUycyhMLCBMLT50b3AsIGZzLT5oKTsKKyAgaW5jcl90b3AoTCk7CisgIHNldHB0dmFsdWUycyhMLCBMLT50b3AsIGYpOworICBpbmNyX3RvcChMKTsKK30KKworCitzdGF0aWMgdm9pZCBjbG9zZV9mdW5jIChMZXhTdGF0ZSAqbHMpIHsKKyAgbHVhX1N0YXRlICpMID0gbHMtPkw7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIFByb3RvICpmID0gZnMtPmY7CisgIHJlbW92ZXZhcnMobHMsIDApOworICBsdWFLX3JldChmcywgMCwgMCk7ICAvKiBmaW5hbCByZXR1cm4gKi8KKyAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIGYtPmNvZGUsIGYtPnNpemVjb2RlLCBmcy0+cGMsIEluc3RydWN0aW9uKTsKKyAgZi0+c2l6ZWNvZGUgPSBmcy0+cGM7CisgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCBmLT5saW5laW5mbywgZi0+c2l6ZWxpbmVpbmZvLCBmcy0+cGMsIGludCk7CisgIGYtPnNpemVsaW5laW5mbyA9IGZzLT5wYzsKKyAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIGYtPmssIGYtPnNpemVrLCBmcy0+bmssIFRWYWx1ZSk7CisgIGYtPnNpemVrID0gZnMtPm5rOworICBsdWFNX3JlYWxsb2N2ZWN0b3IoTCwgZi0+cCwgZi0+c2l6ZXAsIGZzLT5ucCwgUHJvdG8gKik7CisgIGYtPnNpemVwID0gZnMtPm5wOworICBsdWFNX3JlYWxsb2N2ZWN0b3IoTCwgZi0+bG9jdmFycywgZi0+c2l6ZWxvY3ZhcnMsIGZzLT5ubG9jdmFycywgTG9jVmFyKTsKKyAgZi0+c2l6ZWxvY3ZhcnMgPSBmcy0+bmxvY3ZhcnM7CisgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCBmLT51cHZhbHVlcywgZi0+c2l6ZXVwdmFsdWVzLCBmLT5udXBzLCBUU3RyaW5nICopOworICBmLT5zaXpldXB2YWx1ZXMgPSBmLT5udXBzOworICBsdWFfYXNzZXJ0KGx1YUdfY2hlY2tjb2RlKGYpKTsKKyAgbHVhX2Fzc2VydChmcy0+YmwgPT0gTlVMTCk7CisgIGxzLT5mcyA9IGZzLT5wcmV2OworICBMLT50b3AgLT0gMjsgIC8qIHJlbW92ZSB0YWJsZSBhbmQgcHJvdG90eXBlIGZyb20gdGhlIHN0YWNrICovCisgIC8qIGxhc3QgdG9rZW4gcmVhZCB3YXMgYW5jaG9yZWQgaW4gZGVmdW5jdCBmdW5jdGlvbjsgbXVzdCByZWFuY2hvciBpdCAqLworICBpZiAoZnMpIGFuY2hvcl90b2tlbihscyk7Cit9CisKKworUHJvdG8gKmx1YVlfcGFyc2VyIChsdWFfU3RhdGUgKkwsIFpJTyAqeiwgTWJ1ZmZlciAqYnVmZiwgY29uc3QgY2hhciAqbmFtZSkgeworICBzdHJ1Y3QgTGV4U3RhdGUgbGV4c3RhdGU7CisgIHN0cnVjdCBGdW5jU3RhdGUgZnVuY3N0YXRlOworICBsZXhzdGF0ZS5idWZmID0gYnVmZjsKKyAgbHVhWF9zZXRpbnB1dChMLCAmbGV4c3RhdGUsIHosIGx1YVNfbmV3KEwsIG5hbWUpKTsKKyAgb3Blbl9mdW5jKCZsZXhzdGF0ZSwgJmZ1bmNzdGF0ZSk7CisgIGZ1bmNzdGF0ZS5mLT5pc192YXJhcmcgPSBWQVJBUkdfSVNWQVJBUkc7ICAvKiBtYWluIGZ1bmMuIGlzIGFsd2F5cyB2YXJhcmcgKi8KKyAgbHVhWF9uZXh0KCZsZXhzdGF0ZSk7ICAvKiByZWFkIGZpcnN0IHRva2VuICovCisgIGNodW5rKCZsZXhzdGF0ZSk7CisgIGNoZWNrKCZsZXhzdGF0ZSwgVEtfRU9TKTsKKyAgY2xvc2VfZnVuYygmbGV4c3RhdGUpOworICBsdWFfYXNzZXJ0KGZ1bmNzdGF0ZS5wcmV2ID09IE5VTEwpOworICBsdWFfYXNzZXJ0KGZ1bmNzdGF0ZS5mLT5udXBzID09IDApOworICBsdWFfYXNzZXJ0KGxleHN0YXRlLmZzID09IE5VTEwpOworICByZXR1cm4gZnVuY3N0YXRlLmY7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBHUkFNTUFSIFJVTEVTICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RhdGljIHZvaWQgZmllbGQgKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICAvKiBmaWVsZCAtPiBbJy4nIHwgJzonXSBOQU1FICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGV4cGRlc2Mga2V5OworICBsdWFLX2V4cDJhbnlyZWcoZnMsIHYpOworICBsdWFYX25leHQobHMpOyAgLyogc2tpcCB0aGUgZG90IG9yIGNvbG9uICovCisgIGNoZWNrbmFtZShscywgJmtleSk7CisgIGx1YUtfaW5kZXhlZChmcywgdiwgJmtleSk7Cit9CisKKworc3RhdGljIHZvaWQgeWluZGV4IChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnYpIHsKKyAgLyogaW5kZXggLT4gJ1snIGV4cHIgJ10nICovCisgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIHRoZSAnWycgKi8KKyAgZXhwcihscywgdik7CisgIGx1YUtfZXhwMnZhbChscy0+ZnMsIHYpOworICBjaGVja25leHQobHMsICddJyk7Cit9CisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBSdWxlcyBmb3IgQ29uc3RydWN0b3JzCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCitzdHJ1Y3QgQ29uc0NvbnRyb2wgeworICBleHBkZXNjIHY7ICAvKiBsYXN0IGxpc3QgaXRlbSByZWFkICovCisgIGV4cGRlc2MgKnQ7ICAvKiB0YWJsZSBkZXNjcmlwdG9yICovCisgIGludCBuaDsgIC8qIHRvdGFsIG51bWJlciBvZiBgcmVjb3JkJyBlbGVtZW50cyAqLworICBpbnQgbmE7ICAvKiB0b3RhbCBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgaW50IHRvc3RvcmU7ICAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgcGVuZGluZyB0byBiZSBzdG9yZWQgKi8KK307CisKKworc3RhdGljIHZvaWQgcmVjZmllbGQgKExleFN0YXRlICpscywgc3RydWN0IENvbnNDb250cm9sICpjYykgeworICAvKiByZWNmaWVsZCAtPiAoTkFNRSB8IGBbJ2V4cDFgXScpID0gZXhwMSAqLworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpbnQgcmVnID0gbHMtPmZzLT5mcmVlcmVnOworICBleHBkZXNjIGtleSwgdmFsOworICBpbnQgcmtrZXk7CisgIGlmIChscy0+dC50b2tlbiA9PSBUS19OQU1FKSB7CisgICAgbHVhWV9jaGVja2xpbWl0KGZzLCBjYy0+bmgsIE1BWF9JTlQsICJpdGVtcyBpbiBhIGNvbnN0cnVjdG9yIik7CisgICAgY2hlY2tuYW1lKGxzLCAma2V5KTsKKyAgfQorICBlbHNlICAvKiBscy0+dC50b2tlbiA9PSAnWycgKi8KKyAgICB5aW5kZXgobHMsICZrZXkpOworICBjYy0+bmgrKzsKKyAgY2hlY2tuZXh0KGxzLCAnPScpOworICBya2tleSA9IGx1YUtfZXhwMlJLKGZzLCAma2V5KTsKKyAgZXhwcihscywgJnZhbCk7CisgIGx1YUtfY29kZUFCQyhmcywgT1BfU0VUVEFCTEUsIGNjLT50LT51LnMuaW5mbywgcmtrZXksIGx1YUtfZXhwMlJLKGZzLCAmdmFsKSk7CisgIGZzLT5mcmVlcmVnID0gcmVnOyAgLyogZnJlZSByZWdpc3RlcnMgKi8KK30KKworCitzdGF0aWMgdm9pZCBjbG9zZWxpc3RmaWVsZCAoRnVuY1N0YXRlICpmcywgc3RydWN0IENvbnNDb250cm9sICpjYykgeworICBpZiAoY2MtPnYuayA9PSBWVk9JRCkgcmV0dXJuOyAgLyogdGhlcmUgaXMgbm8gbGlzdCBpdGVtICovCisgIGx1YUtfZXhwMm5leHRyZWcoZnMsICZjYy0+dik7CisgIGNjLT52LmsgPSBWVk9JRDsKKyAgaWYgKGNjLT50b3N0b3JlID09IExGSUVMRFNfUEVSX0ZMVVNIKSB7CisgICAgbHVhS19zZXRsaXN0KGZzLCBjYy0+dC0+dS5zLmluZm8sIGNjLT5uYSwgY2MtPnRvc3RvcmUpOyAgLyogZmx1c2ggKi8KKyAgICBjYy0+dG9zdG9yZSA9IDA7ICAvKiBubyBtb3JlIGl0ZW1zIHBlbmRpbmcgKi8KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGxhc3RsaXN0ZmllbGQgKEZ1bmNTdGF0ZSAqZnMsIHN0cnVjdCBDb25zQ29udHJvbCAqY2MpIHsKKyAgaWYgKGNjLT50b3N0b3JlID09IDApIHJldHVybjsKKyAgaWYgKGhhc211bHRyZXQoY2MtPnYuaykpIHsKKyAgICBsdWFLX3NldG11bHRyZXQoZnMsICZjYy0+dik7CisgICAgbHVhS19zZXRsaXN0KGZzLCBjYy0+dC0+dS5zLmluZm8sIGNjLT5uYSwgTFVBX01VTFRSRVQpOworICAgIGNjLT5uYS0tOyAgLyogZG8gbm90IGNvdW50IGxhc3QgZXhwcmVzc2lvbiAodW5rbm93biBudW1iZXIgb2YgZWxlbWVudHMpICovCisgIH0KKyAgZWxzZSB7CisgICAgaWYgKGNjLT52LmsgIT0gVlZPSUQpCisgICAgICBsdWFLX2V4cDJuZXh0cmVnKGZzLCAmY2MtPnYpOworICAgIGx1YUtfc2V0bGlzdChmcywgY2MtPnQtPnUucy5pbmZvLCBjYy0+bmEsIGNjLT50b3N0b3JlKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGxpc3RmaWVsZCAoTGV4U3RhdGUgKmxzLCBzdHJ1Y3QgQ29uc0NvbnRyb2wgKmNjKSB7CisgIGV4cHIobHMsICZjYy0+dik7CisgIGx1YVlfY2hlY2tsaW1pdChscy0+ZnMsIGNjLT5uYSwgTUFYX0lOVCwgIml0ZW1zIGluIGEgY29uc3RydWN0b3IiKTsKKyAgY2MtPm5hKys7CisgIGNjLT50b3N0b3JlKys7Cit9CisKKworc3RhdGljIHZvaWQgY29uc3RydWN0b3IgKExleFN0YXRlICpscywgZXhwZGVzYyAqdCkgeworICAvKiBjb25zdHJ1Y3RvciAtPiA/PyAqLworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpbnQgbGluZSA9IGxzLT5saW5lbnVtYmVyOworICBpbnQgcGMgPSBsdWFLX2NvZGVBQkMoZnMsIE9QX05FV1RBQkxFLCAwLCAwLCAwKTsKKyAgc3RydWN0IENvbnNDb250cm9sIGNjOworICBjYy5uYSA9IGNjLm5oID0gY2MudG9zdG9yZSA9IDA7CisgIGNjLnQgPSB0OworICBpbml0X2V4cCh0LCBWUkVMT0NBQkxFLCBwYyk7CisgIGluaXRfZXhwKCZjYy52LCBWVk9JRCwgMCk7ICAvKiBubyB2YWx1ZSAoeWV0KSAqLworICBsdWFLX2V4cDJuZXh0cmVnKGxzLT5mcywgdCk7ICAvKiBmaXggaXQgYXQgc3RhY2sgdG9wIChmb3IgZ2MpICovCisgIGNoZWNrbmV4dChscywgJ3snKTsKKyAgZG8geworICAgIGx1YV9hc3NlcnQoY2Mudi5rID09IFZWT0lEIHx8IGNjLnRvc3RvcmUgPiAwKTsKKyAgICBpZiAobHMtPnQudG9rZW4gPT0gJ30nKSBicmVhazsKKyAgICBjbG9zZWxpc3RmaWVsZChmcywgJmNjKTsKKyAgICBzd2l0Y2gobHMtPnQudG9rZW4pIHsKKyAgICAgIGNhc2UgVEtfTkFNRTogeyAgLyogbWF5IGJlIGxpc3RmaWVsZHMgb3IgcmVjZmllbGRzICovCisgICAgICAgIGx1YVhfbG9va2FoZWFkKGxzKTsKKyAgICAgICAgaWYgKGxzLT5sb29rYWhlYWQudG9rZW4gIT0gJz0nKSAgLyogZXhwcmVzc2lvbj8gKi8KKyAgICAgICAgICBsaXN0ZmllbGQobHMsICZjYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZWNmaWVsZChscywgJmNjKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdbJzogeyAgLyogY29uc3RydWN0b3JfaXRlbSAtPiByZWNmaWVsZCAqLworICAgICAgICByZWNmaWVsZChscywgJmNjKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiB7ICAvKiBjb25zdHJ1Y3Rvcl9wYXJ0IC0+IGxpc3RmaWVsZCAqLworICAgICAgICBsaXN0ZmllbGQobHMsICZjYyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAodGVzdG5leHQobHMsICcsJykgfHwgdGVzdG5leHQobHMsICc7JykpOworICBjaGVja19tYXRjaChscywgJ30nLCAneycsIGxpbmUpOworICBsYXN0bGlzdGZpZWxkKGZzLCAmY2MpOworICBTRVRBUkdfQihmcy0+Zi0+Y29kZVtwY10sIGx1YU9faW50MmZiKGNjLm5hKSk7IC8qIHNldCBpbml0aWFsIGFycmF5IHNpemUgKi8KKyAgU0VUQVJHX0MoZnMtPmYtPmNvZGVbcGNdLCBsdWFPX2ludDJmYihjYy5uaCkpOyAgLyogc2V0IGluaXRpYWwgdGFibGUgc2l6ZSAqLworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKworc3RhdGljIHZvaWQgcGFybGlzdCAoTGV4U3RhdGUgKmxzKSB7CisgIC8qIHBhcmxpc3QgLT4gWyBwYXJhbSB7IGAsJyBwYXJhbSB9IF0gKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgUHJvdG8gKmYgPSBmcy0+ZjsKKyAgaW50IG5wYXJhbXMgPSAwOworICBmLT5pc192YXJhcmcgPSAwOworICBpZiAobHMtPnQudG9rZW4gIT0gJyknKSB7ICAvKiBpcyBgcGFybGlzdCcgbm90IGVtcHR5PyAqLworICAgIGRvIHsKKyAgICAgIHN3aXRjaCAobHMtPnQudG9rZW4pIHsKKyAgICAgICAgY2FzZSBUS19OQU1FOiB7ICAvKiBwYXJhbSAtPiBOQU1FICovCisgICAgICAgICAgbmV3X2xvY2FsdmFyKGxzLCBzdHJfY2hlY2tuYW1lKGxzKSwgbnBhcmFtcysrKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRLX0RPVFM6IHsgIC8qIHBhcmFtIC0+IGAuLi4nICovCisgICAgICAgICAgbHVhWF9uZXh0KGxzKTsKKyNpZiBkZWZpbmVkKExVQV9DT01QQVRfVkFSQVJHKQorICAgICAgICAgIC8qIHVzZSBgYXJnJyBhcyBkZWZhdWx0IG5hbWUgKi8KKyAgICAgICAgICBuZXdfbG9jYWx2YXJsaXRlcmFsKGxzLCAiYXJnIiwgbnBhcmFtcysrKTsKKyAgICAgICAgICBmLT5pc192YXJhcmcgPSBWQVJBUkdfSEFTQVJHIHwgVkFSQVJHX05FRURTQVJHOworI2VuZGlmCisgICAgICAgICAgZi0+aXNfdmFyYXJnIHw9IFZBUkFSR19JU1ZBUkFSRzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiBsdWFYX3N5bnRheGVycm9yKGxzLCAiPG5hbWU+IG9yICIgTFVBX1FMKCIuLi4iKSAiIGV4cGVjdGVkIik7CisgICAgICB9CisgICAgfSB3aGlsZSAoIWYtPmlzX3ZhcmFyZyAmJiB0ZXN0bmV4dChscywgJywnKSk7CisgIH0KKyAgYWRqdXN0bG9jYWx2YXJzKGxzLCBucGFyYW1zKTsKKyAgZi0+bnVtcGFyYW1zID0gY2FzdF9ieXRlKGZzLT5uYWN0dmFyIC0gKGYtPmlzX3ZhcmFyZyAmIFZBUkFSR19IQVNBUkcpKTsKKyAgbHVhS19yZXNlcnZlcmVncyhmcywgZnMtPm5hY3R2YXIpOyAgLyogcmVzZXJ2ZSByZWdpc3RlciBmb3IgcGFyYW1ldGVycyAqLworfQorCisKK3N0YXRpYyB2b2lkIGJvZHkgKExleFN0YXRlICpscywgZXhwZGVzYyAqZSwgaW50IG5lZWRzZWxmLCBpbnQgbGluZSkgeworICAvKiBib2R5IC0+ICBgKCcgcGFybGlzdCBgKScgY2h1bmsgRU5EICovCisgIEZ1bmNTdGF0ZSBuZXdfZnM7CisgIG9wZW5fZnVuYyhscywgJm5ld19mcyk7CisgIG5ld19mcy5mLT5saW5lZGVmaW5lZCA9IGxpbmU7CisgIGNoZWNrbmV4dChscywgJygnKTsKKyAgaWYgKG5lZWRzZWxmKSB7CisgICAgbmV3X2xvY2FsdmFybGl0ZXJhbChscywgInNlbGYiLCAwKTsKKyAgICBhZGp1c3Rsb2NhbHZhcnMobHMsIDEpOworICB9CisgIHBhcmxpc3QobHMpOworICBjaGVja25leHQobHMsICcpJyk7CisgIGNodW5rKGxzKTsKKyAgbmV3X2ZzLmYtPmxhc3RsaW5lZGVmaW5lZCA9IGxzLT5saW5lbnVtYmVyOworICBjaGVja19tYXRjaChscywgVEtfRU5ELCBUS19GVU5DVElPTiwgbGluZSk7CisgIGNsb3NlX2Z1bmMobHMpOworICBwdXNoY2xvc3VyZShscywgJm5ld19mcywgZSk7Cit9CisKKworc3RhdGljIGludCBleHBsaXN0MSAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICp2KSB7CisgIC8qIGV4cGxpc3QxIC0+IGV4cHIgeyBgLCcgZXhwciB9ICovCisgIGludCBuID0gMTsgIC8qIGF0IGxlYXN0IG9uZSBleHByZXNzaW9uICovCisgIGV4cHIobHMsIHYpOworICB3aGlsZSAodGVzdG5leHQobHMsICcsJykpIHsKKyAgICBsdWFLX2V4cDJuZXh0cmVnKGxzLT5mcywgdik7CisgICAgZXhwcihscywgdik7CisgICAgbisrOworICB9CisgIHJldHVybiBuOworfQorCisKK3N0YXRpYyB2b2lkIGZ1bmNhcmdzIChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKmYpIHsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgZXhwZGVzYyBhcmdzOworICBpbnQgYmFzZSwgbnBhcmFtczsKKyAgaW50IGxpbmUgPSBscy0+bGluZW51bWJlcjsKKyAgc3dpdGNoIChscy0+dC50b2tlbikgeworICAgIGNhc2UgJygnOiB7ICAvKiBmdW5jYXJncyAtPiBgKCcgWyBleHBsaXN0MSBdIGApJyAqLworICAgICAgaWYgKGxpbmUgIT0gbHMtPmxhc3RsaW5lKQorICAgICAgICBsdWFYX3N5bnRheGVycm9yKGxzLCJhbWJpZ3VvdXMgc3ludGF4IChmdW5jdGlvbiBjYWxsIHggbmV3IHN0YXRlbWVudCkiKTsKKyAgICAgIGx1YVhfbmV4dChscyk7CisgICAgICBpZiAobHMtPnQudG9rZW4gPT0gJyknKSAgLyogYXJnIGxpc3QgaXMgZW1wdHk/ICovCisgICAgICAgIGFyZ3MuayA9IFZWT0lEOworICAgICAgZWxzZSB7CisgICAgICAgIGV4cGxpc3QxKGxzLCAmYXJncyk7CisgICAgICAgIGx1YUtfc2V0bXVsdHJldChmcywgJmFyZ3MpOworICAgICAgfQorICAgICAgY2hlY2tfbWF0Y2gobHMsICcpJywgJygnLCBsaW5lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICd7JzogeyAgLyogZnVuY2FyZ3MgLT4gY29uc3RydWN0b3IgKi8KKyAgICAgIGNvbnN0cnVjdG9yKGxzLCAmYXJncyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19TVFJJTkc6IHsgIC8qIGZ1bmNhcmdzIC0+IFNUUklORyAqLworICAgICAgY29kZXN0cmluZyhscywgJmFyZ3MsIGxzLT50LnNlbWluZm8udHMpOworICAgICAgbHVhWF9uZXh0KGxzKTsgIC8qIG11c3QgdXNlIGBzZW1pbmZvJyBiZWZvcmUgYG5leHQnICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgbHVhWF9zeW50YXhlcnJvcihscywgImZ1bmN0aW9uIGFyZ3VtZW50cyBleHBlY3RlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBsdWFfYXNzZXJ0KGYtPmsgPT0gVk5PTlJFTE9DKTsKKyAgYmFzZSA9IGYtPnUucy5pbmZvOyAgLyogYmFzZSByZWdpc3RlciBmb3IgY2FsbCAqLworICBpZiAoaGFzbXVsdHJldChhcmdzLmspKQorICAgIG5wYXJhbXMgPSBMVUFfTVVMVFJFVDsgIC8qIG9wZW4gY2FsbCAqLworICBlbHNlIHsKKyAgICBpZiAoYXJncy5rICE9IFZWT0lEKQorICAgICAgbHVhS19leHAybmV4dHJlZyhmcywgJmFyZ3MpOyAgLyogY2xvc2UgbGFzdCBhcmd1bWVudCAqLworICAgIG5wYXJhbXMgPSBmcy0+ZnJlZXJlZyAtIChiYXNlKzEpOworICB9CisgIGluaXRfZXhwKGYsIFZDQUxMLCBsdWFLX2NvZGVBQkMoZnMsIE9QX0NBTEwsIGJhc2UsIG5wYXJhbXMrMSwgMikpOworICBsdWFLX2ZpeGxpbmUoZnMsIGxpbmUpOworICBmcy0+ZnJlZXJlZyA9IGJhc2UrMTsgIC8qIGNhbGwgcmVtb3ZlIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgYW5kIGxlYXZlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmxlc3MgY2hhbmdlZCkgb25lIHJlc3VsdCAqLworfQorCisKKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIEV4cHJlc3Npb24gcGFyc2luZworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworc3RhdGljIHZvaWQgcHJlZml4ZXhwIChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnYpIHsKKyAgLyogcHJlZml4ZXhwIC0+IE5BTUUgfCAnKCcgZXhwciAnKScgKi8KKyAgc3dpdGNoIChscy0+dC50b2tlbikgeworICAgIGNhc2UgJygnOiB7CisgICAgICBpbnQgbGluZSA9IGxzLT5saW5lbnVtYmVyOworICAgICAgbHVhWF9uZXh0KGxzKTsKKyAgICAgIGV4cHIobHMsIHYpOworICAgICAgY2hlY2tfbWF0Y2gobHMsICcpJywgJygnLCBsaW5lKTsKKyAgICAgIGx1YUtfZGlzY2hhcmdldmFycyhscy0+ZnMsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRLX05BTUU6IHsKKyAgICAgIHNpbmdsZXZhcihscywgdik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIGx1YVhfc3ludGF4ZXJyb3IobHMsICJ1bmV4cGVjdGVkIHN5bWJvbCIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHByaW1hcnlleHAgKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICAvKiBwcmltYXJ5ZXhwIC0+CisgICAgICAgIHByZWZpeGV4cCB7IGAuJyBOQU1FIHwgYFsnIGV4cCBgXScgfCBgOicgTkFNRSBmdW5jYXJncyB8IGZ1bmNhcmdzIH0gKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgcHJlZml4ZXhwKGxzLCB2KTsKKyAgZm9yICg7OykgeworICAgIHN3aXRjaCAobHMtPnQudG9rZW4pIHsKKyAgICAgIGNhc2UgJy4nOiB7ICAvKiBmaWVsZCAqLworICAgICAgICBmaWVsZChscywgdik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnWyc6IHsgIC8qIGBbJyBleHAxIGBdJyAqLworICAgICAgICBleHBkZXNjIGtleTsKKyAgICAgICAgbHVhS19leHAyYW55cmVnKGZzLCB2KTsKKyAgICAgICAgeWluZGV4KGxzLCAma2V5KTsKKyAgICAgICAgbHVhS19pbmRleGVkKGZzLCB2LCAma2V5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICc6JzogeyAgLyogYDonIE5BTUUgZnVuY2FyZ3MgKi8KKyAgICAgICAgZXhwZGVzYyBrZXk7CisgICAgICAgIGx1YVhfbmV4dChscyk7CisgICAgICAgIGNoZWNrbmFtZShscywgJmtleSk7CisgICAgICAgIGx1YUtfc2VsZihmcywgdiwgJmtleSk7CisgICAgICAgIGZ1bmNhcmdzKGxzLCB2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICcoJzogY2FzZSBUS19TVFJJTkc6IGNhc2UgJ3snOiB7ICAvKiBmdW5jYXJncyAqLworICAgICAgICBsdWFLX2V4cDJuZXh0cmVnKGZzLCB2KTsKKyAgICAgICAgZnVuY2FyZ3MobHMsIHYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHJldHVybjsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBzaW1wbGVleHAgKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICAvKiBzaW1wbGVleHAgLT4gTlVNQkVSIHwgU1RSSU5HIHwgTklMIHwgdHJ1ZSB8IGZhbHNlIHwgLi4uIHwKKyAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIHwgRlVOQ1RJT04gYm9keSB8IHByaW1hcnlleHAgKi8KKyAgc3dpdGNoIChscy0+dC50b2tlbikgeworICAgIGNhc2UgVEtfTlVNQkVSOiB7CisgICAgICBpbml0X2V4cCh2LCBWS05VTSwgMCk7CisgICAgICB2LT51Lm52YWwgPSBscy0+dC5zZW1pbmZvLnI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19TVFJJTkc6IHsKKyAgICAgIGNvZGVzdHJpbmcobHMsIHYsIGxzLT50LnNlbWluZm8udHMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVEtfTklMOiB7CisgICAgICBpbml0X2V4cCh2LCBWTklMLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRLX1RSVUU6IHsKKyAgICAgIGluaXRfZXhwKHYsIFZUUlVFLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRLX0ZBTFNFOiB7CisgICAgICBpbml0X2V4cCh2LCBWRkFMU0UsIDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVEtfRE9UUzogeyAgLyogdmFyYXJnICovCisgICAgICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICAgICAgY2hlY2tfY29uZGl0aW9uKGxzLCBmcy0+Zi0+aXNfdmFyYXJnLAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgdXNlICIgTFVBX1FMKCIuLi4iKSAiIG91dHNpZGUgYSB2YXJhcmcgZnVuY3Rpb24iKTsKKyAgICAgIGZzLT5mLT5pc192YXJhcmcgJj0gflZBUkFSR19ORUVEU0FSRzsgIC8qIGRvbid0IG5lZWQgJ2FyZycgKi8KKyAgICAgIGluaXRfZXhwKHYsIFZWQVJBUkcsIGx1YUtfY29kZUFCQyhmcywgT1BfVkFSQVJHLCAwLCAxLCAwKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAneyc6IHsgIC8qIGNvbnN0cnVjdG9yICovCisgICAgICBjb25zdHJ1Y3Rvcihscywgdik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVEtfRlVOQ1RJT046IHsKKyAgICAgIGx1YVhfbmV4dChscyk7CisgICAgICBib2R5KGxzLCB2LCAwLCBscy0+bGluZW51bWJlcik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHByaW1hcnlleHAobHMsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBsdWFYX25leHQobHMpOworfQorCisKK3N0YXRpYyBVbk9wciBnZXR1bm9wciAoaW50IG9wKSB7CisgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFRLX05PVDogcmV0dXJuIE9QUl9OT1Q7CisgICAgY2FzZSAnLSc6IHJldHVybiBPUFJfTUlOVVM7CisgICAgY2FzZSAnIyc6IHJldHVybiBPUFJfTEVOOworICAgIGRlZmF1bHQ6IHJldHVybiBPUFJfTk9VTk9QUjsKKyAgfQorfQorCisKK3N0YXRpYyBCaW5PcHIgZ2V0Ymlub3ByIChpbnQgb3ApIHsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgJysnOiByZXR1cm4gT1BSX0FERDsKKyAgICBjYXNlICctJzogcmV0dXJuIE9QUl9TVUI7CisgICAgY2FzZSAnKic6IHJldHVybiBPUFJfTVVMOworICAgIGNhc2UgJy8nOiByZXR1cm4gT1BSX0RJVjsKKyAgICBjYXNlICclJzogcmV0dXJuIE9QUl9NT0Q7CisgICAgY2FzZSAnXic6IHJldHVybiBPUFJfUE9XOworICAgIGNhc2UgVEtfQ09OQ0FUOiByZXR1cm4gT1BSX0NPTkNBVDsKKyAgICBjYXNlIFRLX05FOiByZXR1cm4gT1BSX05FOworICAgIGNhc2UgVEtfRVE6IHJldHVybiBPUFJfRVE7CisgICAgY2FzZSAnPCc6IHJldHVybiBPUFJfTFQ7CisgICAgY2FzZSBUS19MRTogcmV0dXJuIE9QUl9MRTsKKyAgICBjYXNlICc+JzogcmV0dXJuIE9QUl9HVDsKKyAgICBjYXNlIFRLX0dFOiByZXR1cm4gT1BSX0dFOworICAgIGNhc2UgVEtfQU5EOiByZXR1cm4gT1BSX0FORDsKKyAgICBjYXNlIFRLX09SOiByZXR1cm4gT1BSX09SOworICAgIGRlZmF1bHQ6IHJldHVybiBPUFJfTk9CSU5PUFI7CisgIH0KK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgbHVfYnl0ZSBsZWZ0OyAgLyogbGVmdCBwcmlvcml0eSBmb3IgZWFjaCBiaW5hcnkgb3BlcmF0b3IgKi8KKyAgbHVfYnl0ZSByaWdodDsgLyogcmlnaHQgcHJpb3JpdHkgKi8KK30gcHJpb3JpdHlbXSA9IHsgIC8qIE9SREVSIE9QUiAqLworICAgezYsIDZ9LCB7NiwgNn0sIHs3LCA3fSwgezcsIDd9LCB7NywgN30sICAvKiBgKycgYC0nIGAvJyBgJScgKi8KKyAgIHsxMCwgOX0sIHs1LCA0fSwgICAgICAgICAgICAgICAgIC8qIHBvd2VyIGFuZCBjb25jYXQgKHJpZ2h0IGFzc29jaWF0aXZlKSAqLworICAgezMsIDN9LCB7MywgM30sICAgICAgICAgICAgICAgICAgLyogZXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgKi8KKyAgIHszLCAzfSwgezMsIDN9LCB7MywgM30sIHszLCAzfSwgIC8qIG9yZGVyICovCisgICB7MiwgMn0sIHsxLCAxfSAgICAgICAgICAgICAgICAgICAvKiBsb2dpY2FsIChhbmQvb3IpICovCit9OworCisjZGVmaW5lIFVOQVJZX1BSSU9SSVRZCTggIC8qIHByaW9yaXR5IGZvciB1bmFyeSBvcGVyYXRvcnMgKi8KKworCisvKgorKiogc3ViZXhwciAtPiAoc2ltcGxlZXhwIHwgdW5vcCBzdWJleHByKSB7IGJpbm9wIHN1YmV4cHIgfQorKiogd2hlcmUgYGJpbm9wJyBpcyBhbnkgYmluYXJ5IG9wZXJhdG9yIHdpdGggYSBwcmlvcml0eSBoaWdoZXIgdGhhbiBgbGltaXQnCisqLworc3RhdGljIEJpbk9wciBzdWJleHByIChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnYsIHVuc2lnbmVkIGludCBsaW1pdCkgeworICBCaW5PcHIgb3A7CisgIFVuT3ByIHVvcDsKKyAgZW50ZXJsZXZlbChscyk7CisgIHVvcCA9IGdldHVub3ByKGxzLT50LnRva2VuKTsKKyAgaWYgKHVvcCAhPSBPUFJfTk9VTk9QUikgeworICAgIGx1YVhfbmV4dChscyk7CisgICAgc3ViZXhwcihscywgdiwgVU5BUllfUFJJT1JJVFkpOworICAgIGx1YUtfcHJlZml4KGxzLT5mcywgdW9wLCB2KTsKKyAgfQorICBlbHNlIHNpbXBsZWV4cChscywgdik7CisgIC8qIGV4cGFuZCB3aGlsZSBvcGVyYXRvcnMgaGF2ZSBwcmlvcml0aWVzIGhpZ2hlciB0aGFuIGBsaW1pdCcgKi8KKyAgb3AgPSBnZXRiaW5vcHIobHMtPnQudG9rZW4pOworICB3aGlsZSAob3AgIT0gT1BSX05PQklOT1BSICYmIHByaW9yaXR5W29wXS5sZWZ0ID4gbGltaXQpIHsKKyAgICBleHBkZXNjIHYyOworICAgIEJpbk9wciBuZXh0b3A7CisgICAgbHVhWF9uZXh0KGxzKTsKKyAgICBsdWFLX2luZml4KGxzLT5mcywgb3AsIHYpOworICAgIC8qIHJlYWQgc3ViLWV4cHJlc3Npb24gd2l0aCBoaWdoZXIgcHJpb3JpdHkgKi8KKyAgICBuZXh0b3AgPSBzdWJleHByKGxzLCAmdjIsIHByaW9yaXR5W29wXS5yaWdodCk7CisgICAgbHVhS19wb3NmaXgobHMtPmZzLCBvcCwgdiwgJnYyKTsKKyAgICBvcCA9IG5leHRvcDsKKyAgfQorICBsZWF2ZWxldmVsKGxzKTsKKyAgcmV0dXJuIG9wOyAgLyogcmV0dXJuIGZpcnN0IHVudHJlYXRlZCBvcGVyYXRvciAqLworfQorCisKK3N0YXRpYyB2b2lkIGV4cHIgKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICBzdWJleHByKGxzLCB2LCAwKTsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFJ1bGVzIGZvciBTdGF0ZW1lbnRzCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCitzdGF0aWMgaW50IGJsb2NrX2ZvbGxvdyAoaW50IHRva2VuKSB7CisgIHN3aXRjaCAodG9rZW4pIHsKKyAgICBjYXNlIFRLX0VMU0U6IGNhc2UgVEtfRUxTRUlGOiBjYXNlIFRLX0VORDoKKyAgICBjYXNlIFRLX1VOVElMOiBjYXNlIFRLX0VPUzoKKyAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9Cit9CisKKworc3RhdGljIHZvaWQgYmxvY2sgKExleFN0YXRlICpscykgeworICAvKiBibG9jayAtPiBjaHVuayAqLworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBCbG9ja0NudCBibDsKKyAgZW50ZXJibG9jayhmcywgJmJsLCAwKTsKKyAgY2h1bmsobHMpOworICBsdWFfYXNzZXJ0KGJsLmJyZWFrbGlzdCA9PSBOT19KVU1QKTsKKyAgbGVhdmVibG9jayhmcyk7Cit9CisKKworLyoKKyoqIHN0cnVjdHVyZSB0byBjaGFpbiBhbGwgdmFyaWFibGVzIGluIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhbgorKiogYXNzaWdubWVudAorKi8KK3N0cnVjdCBMSFNfYXNzaWduIHsKKyAgc3RydWN0IExIU19hc3NpZ24gKnByZXY7CisgIGV4cGRlc2MgdjsgIC8qIHZhcmlhYmxlIChnbG9iYWwsIGxvY2FsLCB1cHZhbHVlLCBvciBpbmRleGVkKSAqLworfTsKKworCisvKgorKiogY2hlY2sgd2hldGhlciwgaW4gYW4gYXNzaWdubWVudCB0byBhIGxvY2FsIHZhcmlhYmxlLCB0aGUgbG9jYWwgdmFyaWFibGUKKyoqIGlzIG5lZWRlZCBpbiBhIHByZXZpb3VzIGFzc2lnbm1lbnQgKHRvIGEgdGFibGUpLiBJZiBzbywgc2F2ZSBvcmlnaW5hbAorKiogbG9jYWwgdmFsdWUgaW4gYSBzYWZlIHBsYWNlIGFuZCB1c2UgdGhpcyBzYWZlIGNvcHkgaW4gdGhlIHByZXZpb3VzCisqKiBhc3NpZ25tZW50LgorKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2NvbmZsaWN0IChMZXhTdGF0ZSAqbHMsIHN0cnVjdCBMSFNfYXNzaWduICpsaCwgZXhwZGVzYyAqdikgeworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpbnQgZXh0cmEgPSBmcy0+ZnJlZXJlZzsgIC8qIGV2ZW50dWFsIHBvc2l0aW9uIHRvIHNhdmUgbG9jYWwgdmFyaWFibGUgKi8KKyAgaW50IGNvbmZsaWN0ID0gMDsKKyAgZm9yICg7IGxoOyBsaCA9IGxoLT5wcmV2KSB7CisgICAgaWYgKGxoLT52LmsgPT0gVklOREVYRUQpIHsKKyAgICAgIGlmIChsaC0+di51LnMuaW5mbyA9PSB2LT51LnMuaW5mbykgeyAgLyogY29uZmxpY3Q/ICovCisgICAgICAgIGNvbmZsaWN0ID0gMTsKKyAgICAgICAgbGgtPnYudS5zLmluZm8gPSBleHRyYTsgIC8qIHByZXZpb3VzIGFzc2lnbm1lbnQgd2lsbCB1c2Ugc2FmZSBjb3B5ICovCisgICAgICB9CisgICAgICBpZiAobGgtPnYudS5zLmF1eCA9PSB2LT51LnMuaW5mbykgeyAgLyogY29uZmxpY3Q/ICovCisgICAgICAgIGNvbmZsaWN0ID0gMTsKKyAgICAgICAgbGgtPnYudS5zLmF1eCA9IGV4dHJhOyAgLyogcHJldmlvdXMgYXNzaWdubWVudCB3aWxsIHVzZSBzYWZlIGNvcHkgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGNvbmZsaWN0KSB7CisgICAgbHVhS19jb2RlQUJDKGZzLCBPUF9NT1ZFLCBmcy0+ZnJlZXJlZywgdi0+dS5zLmluZm8sIDApOyAgLyogbWFrZSBjb3B5ICovCisgICAgbHVhS19yZXNlcnZlcmVncyhmcywgMSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBhc3NpZ25tZW50IChMZXhTdGF0ZSAqbHMsIHN0cnVjdCBMSFNfYXNzaWduICpsaCwgaW50IG52YXJzKSB7CisgIGV4cGRlc2MgZTsKKyAgY2hlY2tfY29uZGl0aW9uKGxzLCBWTE9DQUwgPD0gbGgtPnYuayAmJiBsaC0+di5rIDw9IFZJTkRFWEVELAorICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggZXJyb3IiKTsKKyAgaWYgKHRlc3RuZXh0KGxzLCAnLCcpKSB7ICAvKiBhc3NpZ25tZW50IC0+IGAsJyBwcmltYXJ5ZXhwIGFzc2lnbm1lbnQgKi8KKyAgICBzdHJ1Y3QgTEhTX2Fzc2lnbiBudjsKKyAgICBudi5wcmV2ID0gbGg7CisgICAgcHJpbWFyeWV4cChscywgJm52LnYpOworICAgIGlmIChudi52LmsgPT0gVkxPQ0FMKQorICAgICAgY2hlY2tfY29uZmxpY3QobHMsIGxoLCAmbnYudik7CisgICAgbHVhWV9jaGVja2xpbWl0KGxzLT5mcywgbnZhcnMsIExVQUlfTUFYQ0NBTExTIC0gbHMtPkwtPm5DY2FsbHMsCisgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZXMgaW4gYXNzaWdubWVudCIpOworICAgIGFzc2lnbm1lbnQobHMsICZudiwgbnZhcnMrMSk7CisgIH0KKyAgZWxzZSB7ICAvKiBhc3NpZ25tZW50IC0+IGA9JyBleHBsaXN0MSAqLworICAgIGludCBuZXhwczsKKyAgICBjaGVja25leHQobHMsICc9Jyk7CisgICAgbmV4cHMgPSBleHBsaXN0MShscywgJmUpOworICAgIGlmIChuZXhwcyAhPSBudmFycykgeworICAgICAgYWRqdXN0X2Fzc2lnbihscywgbnZhcnMsIG5leHBzLCAmZSk7CisgICAgICBpZiAobmV4cHMgPiBudmFycykKKyAgICAgICAgbHMtPmZzLT5mcmVlcmVnIC09IG5leHBzIC0gbnZhcnM7ICAvKiByZW1vdmUgZXh0cmEgdmFsdWVzICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgbHVhS19zZXRvbmVyZXQobHMtPmZzLCAmZSk7ICAvKiBjbG9zZSBsYXN0IGV4cHJlc3Npb24gKi8KKyAgICAgIGx1YUtfc3RvcmV2YXIobHMtPmZzLCAmbGgtPnYsICZlKTsKKyAgICAgIHJldHVybjsgIC8qIGF2b2lkIGRlZmF1bHQgKi8KKyAgICB9CisgIH0KKyAgaW5pdF9leHAoJmUsIFZOT05SRUxPQywgbHMtPmZzLT5mcmVlcmVnLTEpOyAgLyogZGVmYXVsdCBhc3NpZ25tZW50ICovCisgIGx1YUtfc3RvcmV2YXIobHMtPmZzLCAmbGgtPnYsICZlKTsKK30KKworCitzdGF0aWMgaW50IGNvbmQgKExleFN0YXRlICpscykgeworICAvKiBjb25kIC0+IGV4cCAqLworICBleHBkZXNjIHY7CisgIGV4cHIobHMsICZ2KTsgIC8qIHJlYWQgY29uZGl0aW9uICovCisgIGlmICh2LmsgPT0gVk5JTCkgdi5rID0gVkZBTFNFOyAgLyogYGZhbHNlcycgYXJlIGFsbCBlcXVhbCBoZXJlICovCisgIGx1YUtfZ29pZnRydWUobHMtPmZzLCAmdik7CisgIHJldHVybiB2LmY7Cit9CisKKworc3RhdGljIHZvaWQgYnJlYWtzdGF0IChMZXhTdGF0ZSAqbHMpIHsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgQmxvY2tDbnQgKmJsID0gZnMtPmJsOworICBpbnQgdXB2YWwgPSAwOworICB3aGlsZSAoYmwgJiYgIWJsLT5pc2JyZWFrYWJsZSkgeworICAgIHVwdmFsIHw9IGJsLT51cHZhbDsKKyAgICBibCA9IGJsLT5wcmV2aW91czsKKyAgfQorICBpZiAoIWJsKQorICAgIGx1YVhfc3ludGF4ZXJyb3IobHMsICJubyBsb29wIHRvIGJyZWFrIik7CisgIGlmICh1cHZhbCkKKyAgICBsdWFLX2NvZGVBQkMoZnMsIE9QX0NMT1NFLCBibC0+bmFjdHZhciwgMCwgMCk7CisgIGx1YUtfY29uY2F0KGZzLCAmYmwtPmJyZWFrbGlzdCwgbHVhS19qdW1wKGZzKSk7Cit9CisKKworc3RhdGljIHZvaWQgd2hpbGVzdGF0IChMZXhTdGF0ZSAqbHMsIGludCBsaW5lKSB7CisgIC8qIHdoaWxlc3RhdCAtPiBXSElMRSBjb25kIERPIGJsb2NrIEVORCAqLworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpbnQgd2hpbGVpbml0OworICBpbnQgY29uZGV4aXQ7CisgIEJsb2NrQ250IGJsOworICBsdWFYX25leHQobHMpOyAgLyogc2tpcCBXSElMRSAqLworICB3aGlsZWluaXQgPSBsdWFLX2dldGxhYmVsKGZzKTsKKyAgY29uZGV4aXQgPSBjb25kKGxzKTsKKyAgZW50ZXJibG9jayhmcywgJmJsLCAxKTsKKyAgY2hlY2tuZXh0KGxzLCBUS19ETyk7CisgIGJsb2NrKGxzKTsKKyAgbHVhS19wYXRjaGxpc3QoZnMsIGx1YUtfanVtcChmcyksIHdoaWxlaW5pdCk7CisgIGNoZWNrX21hdGNoKGxzLCBUS19FTkQsIFRLX1dISUxFLCBsaW5lKTsKKyAgbGVhdmVibG9jayhmcyk7CisgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIGNvbmRleGl0KTsgIC8qIGZhbHNlIGNvbmRpdGlvbnMgZmluaXNoIHRoZSBsb29wICovCit9CisKKworc3RhdGljIHZvaWQgcmVwZWF0c3RhdCAoTGV4U3RhdGUgKmxzLCBpbnQgbGluZSkgeworICAvKiByZXBlYXRzdGF0IC0+IFJFUEVBVCBibG9jayBVTlRJTCBjb25kICovCisgIGludCBjb25kZXhpdDsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgaW50IHJlcGVhdF9pbml0ID0gbHVhS19nZXRsYWJlbChmcyk7CisgIEJsb2NrQ250IGJsMSwgYmwyOworICBlbnRlcmJsb2NrKGZzLCAmYmwxLCAxKTsgIC8qIGxvb3AgYmxvY2sgKi8KKyAgZW50ZXJibG9jayhmcywgJmJsMiwgMCk7ICAvKiBzY29wZSBibG9jayAqLworICBsdWFYX25leHQobHMpOyAgLyogc2tpcCBSRVBFQVQgKi8KKyAgY2h1bmsobHMpOworICBjaGVja19tYXRjaChscywgVEtfVU5USUwsIFRLX1JFUEVBVCwgbGluZSk7CisgIGNvbmRleGl0ID0gY29uZChscyk7ICAvKiByZWFkIGNvbmRpdGlvbiAoaW5zaWRlIHNjb3BlIGJsb2NrKSAqLworICBpZiAoIWJsMi51cHZhbCkgeyAgLyogbm8gdXB2YWx1ZXM/ICovCisgICAgbGVhdmVibG9jayhmcyk7ICAvKiBmaW5pc2ggc2NvcGUgKi8KKyAgICBsdWFLX3BhdGNobGlzdChscy0+ZnMsIGNvbmRleGl0LCByZXBlYXRfaW5pdCk7ICAvKiBjbG9zZSB0aGUgbG9vcCAqLworICB9CisgIGVsc2UgeyAgLyogY29tcGxldGUgc2VtYW50aWNzIHdoZW4gdGhlcmUgYXJlIHVwdmFsdWVzICovCisgICAgYnJlYWtzdGF0KGxzKTsgIC8qIGlmIGNvbmRpdGlvbiB0aGVuIGJyZWFrICovCisgICAgbHVhS19wYXRjaHRvaGVyZShscy0+ZnMsIGNvbmRleGl0KTsgIC8qIGVsc2UuLi4gKi8KKyAgICBsZWF2ZWJsb2NrKGZzKTsgIC8qIGZpbmlzaCBzY29wZS4uLiAqLworICAgIGx1YUtfcGF0Y2hsaXN0KGxzLT5mcywgbHVhS19qdW1wKGZzKSwgcmVwZWF0X2luaXQpOyAgLyogYW5kIHJlcGVhdCAqLworICB9CisgIGxlYXZlYmxvY2soZnMpOyAgLyogZmluaXNoIGxvb3AgKi8KK30KKworCitzdGF0aWMgaW50IGV4cDEgKExleFN0YXRlICpscykgeworICBleHBkZXNjIGU7CisgIGludCBrOworICBleHByKGxzLCAmZSk7CisgIGsgPSBlLms7CisgIGx1YUtfZXhwMm5leHRyZWcobHMtPmZzLCAmZSk7CisgIHJldHVybiBrOworfQorCisKK3N0YXRpYyB2b2lkIGZvcmJvZHkgKExleFN0YXRlICpscywgaW50IGJhc2UsIGludCBsaW5lLCBpbnQgbnZhcnMsIGludCBpc251bSkgeworICAvKiBmb3Jib2R5IC0+IERPIGJsb2NrICovCisgIEJsb2NrQ250IGJsOworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpbnQgcHJlcCwgZW5kZm9yOworICBhZGp1c3Rsb2NhbHZhcnMobHMsIDMpOyAgLyogY29udHJvbCB2YXJpYWJsZXMgKi8KKyAgY2hlY2tuZXh0KGxzLCBUS19ETyk7CisgIHByZXAgPSBpc251bSA/IGx1YUtfY29kZUFzQngoZnMsIE9QX0ZPUlBSRVAsIGJhc2UsIE5PX0pVTVApIDogbHVhS19qdW1wKGZzKTsKKyAgZW50ZXJibG9jayhmcywgJmJsLCAwKTsgIC8qIHNjb3BlIGZvciBkZWNsYXJlZCB2YXJpYWJsZXMgKi8KKyAgYWRqdXN0bG9jYWx2YXJzKGxzLCBudmFycyk7CisgIGx1YUtfcmVzZXJ2ZXJlZ3MoZnMsIG52YXJzKTsKKyAgYmxvY2sobHMpOworICBsZWF2ZWJsb2NrKGZzKTsgIC8qIGVuZCBvZiBzY29wZSBmb3IgZGVjbGFyZWQgdmFyaWFibGVzICovCisgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIHByZXApOworICBlbmRmb3IgPSAoaXNudW0pID8gbHVhS19jb2RlQXNCeChmcywgT1BfRk9STE9PUCwgYmFzZSwgTk9fSlVNUCkgOgorICAgICAgICAgICAgICAgICAgICAgbHVhS19jb2RlQUJDKGZzLCBPUF9URk9STE9PUCwgYmFzZSwgMCwgbnZhcnMpOworICBsdWFLX2ZpeGxpbmUoZnMsIGxpbmUpOyAgLyogcHJldGVuZCB0aGF0IGBPUF9GT1InIHN0YXJ0cyB0aGUgbG9vcCAqLworICBsdWFLX3BhdGNobGlzdChmcywgKGlzbnVtID8gZW5kZm9yIDogbHVhS19qdW1wKGZzKSksIHByZXAgKyAxKTsKK30KKworCitzdGF0aWMgdm9pZCBmb3JudW0gKExleFN0YXRlICpscywgVFN0cmluZyAqdmFybmFtZSwgaW50IGxpbmUpIHsKKyAgLyogZm9ybnVtIC0+IE5BTUUgPSBleHAxLGV4cDFbLGV4cDFdIGZvcmJvZHkgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgaW50IGJhc2UgPSBmcy0+ZnJlZXJlZzsKKyAgbmV3X2xvY2FsdmFybGl0ZXJhbChscywgIihmb3IgaW5kZXgpIiwgMCk7CisgIG5ld19sb2NhbHZhcmxpdGVyYWwobHMsICIoZm9yIGxpbWl0KSIsIDEpOworICBuZXdfbG9jYWx2YXJsaXRlcmFsKGxzLCAiKGZvciBzdGVwKSIsIDIpOworICBuZXdfbG9jYWx2YXIobHMsIHZhcm5hbWUsIDMpOworICBjaGVja25leHQobHMsICc9Jyk7CisgIGV4cDEobHMpOyAgLyogaW5pdGlhbCB2YWx1ZSAqLworICBjaGVja25leHQobHMsICcsJyk7CisgIGV4cDEobHMpOyAgLyogbGltaXQgKi8KKyAgaWYgKHRlc3RuZXh0KGxzLCAnLCcpKQorICAgIGV4cDEobHMpOyAgLyogb3B0aW9uYWwgc3RlcCAqLworICBlbHNlIHsgIC8qIGRlZmF1bHQgc3RlcCA9IDEgKi8KKyAgICBsdWFLX2NvZGVBQngoZnMsIE9QX0xPQURLLCBmcy0+ZnJlZXJlZywgbHVhS19udW1iZXJLKGZzLCAxKSk7CisgICAgbHVhS19yZXNlcnZlcmVncyhmcywgMSk7CisgIH0KKyAgZm9yYm9keShscywgYmFzZSwgbGluZSwgMSwgMSk7Cit9CisKKworc3RhdGljIHZvaWQgZm9ybGlzdCAoTGV4U3RhdGUgKmxzLCBUU3RyaW5nICppbmRleG5hbWUpIHsKKyAgLyogZm9ybGlzdCAtPiBOQU1FIHssTkFNRX0gSU4gZXhwbGlzdDEgZm9yYm9keSAqLworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBleHBkZXNjIGU7CisgIGludCBudmFycyA9IDA7CisgIGludCBsaW5lOworICBpbnQgYmFzZSA9IGZzLT5mcmVlcmVnOworICAvKiBjcmVhdGUgY29udHJvbCB2YXJpYWJsZXMgKi8KKyAgbmV3X2xvY2FsdmFybGl0ZXJhbChscywgIihmb3IgZ2VuZXJhdG9yKSIsIG52YXJzKyspOworICBuZXdfbG9jYWx2YXJsaXRlcmFsKGxzLCAiKGZvciBzdGF0ZSkiLCBudmFycysrKTsKKyAgbmV3X2xvY2FsdmFybGl0ZXJhbChscywgIihmb3IgY29udHJvbCkiLCBudmFycysrKTsKKyAgLyogY3JlYXRlIGRlY2xhcmVkIHZhcmlhYmxlcyAqLworICBuZXdfbG9jYWx2YXIobHMsIGluZGV4bmFtZSwgbnZhcnMrKyk7CisgIHdoaWxlICh0ZXN0bmV4dChscywgJywnKSkKKyAgICBuZXdfbG9jYWx2YXIobHMsIHN0cl9jaGVja25hbWUobHMpLCBudmFycysrKTsKKyAgY2hlY2tuZXh0KGxzLCBUS19JTik7CisgIGxpbmUgPSBscy0+bGluZW51bWJlcjsKKyAgYWRqdXN0X2Fzc2lnbihscywgMywgZXhwbGlzdDEobHMsICZlKSwgJmUpOworICBsdWFLX2NoZWNrc3RhY2soZnMsIDMpOyAgLyogZXh0cmEgc3BhY2UgdG8gY2FsbCBnZW5lcmF0b3IgKi8KKyAgZm9yYm9keShscywgYmFzZSwgbGluZSwgbnZhcnMgLSAzLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCBmb3JzdGF0IChMZXhTdGF0ZSAqbHMsIGludCBsaW5lKSB7CisgIC8qIGZvcnN0YXQgLT4gRk9SIChmb3JudW0gfCBmb3JsaXN0KSBFTkQgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgVFN0cmluZyAqdmFybmFtZTsKKyAgQmxvY2tDbnQgYmw7CisgIGVudGVyYmxvY2soZnMsICZibCwgMSk7ICAvKiBzY29wZSBmb3IgbG9vcCBhbmQgY29udHJvbCB2YXJpYWJsZXMgKi8KKyAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgYGZvcicgKi8KKyAgdmFybmFtZSA9IHN0cl9jaGVja25hbWUobHMpOyAgLyogZmlyc3QgdmFyaWFibGUgbmFtZSAqLworICBzd2l0Y2ggKGxzLT50LnRva2VuKSB7CisgICAgY2FzZSAnPSc6IGZvcm51bShscywgdmFybmFtZSwgbGluZSk7IGJyZWFrOworICAgIGNhc2UgJywnOiBjYXNlIFRLX0lOOiBmb3JsaXN0KGxzLCB2YXJuYW1lKTsgYnJlYWs7CisgICAgZGVmYXVsdDogbHVhWF9zeW50YXhlcnJvcihscywgTFVBX1FMKCI9IikgIiBvciAiIExVQV9RTCgiaW4iKSAiIGV4cGVjdGVkIik7CisgIH0KKyAgY2hlY2tfbWF0Y2gobHMsIFRLX0VORCwgVEtfRk9SLCBsaW5lKTsKKyAgbGVhdmVibG9jayhmcyk7ICAvKiBsb29wIHNjb3BlIChgYnJlYWsnIGp1bXBzIHRvIHRoaXMgcG9pbnQpICovCit9CisKKworc3RhdGljIGludCB0ZXN0X3RoZW5fYmxvY2sgKExleFN0YXRlICpscykgeworICAvKiB0ZXN0X3RoZW5fYmxvY2sgLT4gW0lGIHwgRUxTRUlGXSBjb25kIFRIRU4gYmxvY2sgKi8KKyAgaW50IGNvbmRleGl0OworICBsdWFYX25leHQobHMpOyAgLyogc2tpcCBJRiBvciBFTFNFSUYgKi8KKyAgY29uZGV4aXQgPSBjb25kKGxzKTsKKyAgY2hlY2tuZXh0KGxzLCBUS19USEVOKTsKKyAgYmxvY2sobHMpOyAgLyogYHRoZW4nIHBhcnQgKi8KKyAgcmV0dXJuIGNvbmRleGl0OworfQorCisKK3N0YXRpYyB2b2lkIGlmc3RhdCAoTGV4U3RhdGUgKmxzLCBpbnQgbGluZSkgeworICAvKiBpZnN0YXQgLT4gSUYgY29uZCBUSEVOIGJsb2NrIHtFTFNFSUYgY29uZCBUSEVOIGJsb2NrfSBbRUxTRSBibG9ja10gRU5EICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGludCBmbGlzdDsKKyAgaW50IGVzY2FwZWxpc3QgPSBOT19KVU1QOworICBmbGlzdCA9IHRlc3RfdGhlbl9ibG9jayhscyk7ICAvKiBJRiBjb25kIFRIRU4gYmxvY2sgKi8KKyAgd2hpbGUgKGxzLT50LnRva2VuID09IFRLX0VMU0VJRikgeworICAgIGx1YUtfY29uY2F0KGZzLCAmZXNjYXBlbGlzdCwgbHVhS19qdW1wKGZzKSk7CisgICAgbHVhS19wYXRjaHRvaGVyZShmcywgZmxpc3QpOworICAgIGZsaXN0ID0gdGVzdF90aGVuX2Jsb2NrKGxzKTsgIC8qIEVMU0VJRiBjb25kIFRIRU4gYmxvY2sgKi8KKyAgfQorICBpZiAobHMtPnQudG9rZW4gPT0gVEtfRUxTRSkgeworICAgIGx1YUtfY29uY2F0KGZzLCAmZXNjYXBlbGlzdCwgbHVhS19qdW1wKGZzKSk7CisgICAgbHVhS19wYXRjaHRvaGVyZShmcywgZmxpc3QpOworICAgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIEVMU0UgKGFmdGVyIHBhdGNoLCBmb3IgY29ycmVjdCBsaW5lIGluZm8pICovCisgICAgYmxvY2sobHMpOyAgLyogYGVsc2UnIHBhcnQgKi8KKyAgfQorICBlbHNlCisgICAgbHVhS19jb25jYXQoZnMsICZlc2NhcGVsaXN0LCBmbGlzdCk7CisgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIGVzY2FwZWxpc3QpOworICBjaGVja19tYXRjaChscywgVEtfRU5ELCBUS19JRiwgbGluZSk7Cit9CisKKworc3RhdGljIHZvaWQgbG9jYWxmdW5jIChMZXhTdGF0ZSAqbHMpIHsKKyAgZXhwZGVzYyB2LCBiOworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBuZXdfbG9jYWx2YXIobHMsIHN0cl9jaGVja25hbWUobHMpLCAwKTsKKyAgaW5pdF9leHAoJnYsIFZMT0NBTCwgZnMtPmZyZWVyZWcpOworICBsdWFLX3Jlc2VydmVyZWdzKGZzLCAxKTsKKyAgYWRqdXN0bG9jYWx2YXJzKGxzLCAxKTsKKyAgYm9keShscywgJmIsIDAsIGxzLT5saW5lbnVtYmVyKTsKKyAgbHVhS19zdG9yZXZhcihmcywgJnYsICZiKTsKKyAgLyogZGVidWcgaW5mb3JtYXRpb24gd2lsbCBvbmx5IHNlZSB0aGUgdmFyaWFibGUgYWZ0ZXIgdGhpcyBwb2ludCEgKi8KKyAgZ2V0bG9jdmFyKGZzLCBmcy0+bmFjdHZhciAtIDEpLnN0YXJ0cGMgPSBmcy0+cGM7Cit9CisKKworc3RhdGljIHZvaWQgbG9jYWxzdGF0IChMZXhTdGF0ZSAqbHMpIHsKKyAgLyogc3RhdCAtPiBMT0NBTCBOQU1FIHtgLCcgTkFNRX0gW2A9JyBleHBsaXN0MV0gKi8KKyAgaW50IG52YXJzID0gMDsKKyAgaW50IG5leHBzOworICBleHBkZXNjIGU7CisgIGRvIHsKKyAgICBuZXdfbG9jYWx2YXIobHMsIHN0cl9jaGVja25hbWUobHMpLCBudmFycysrKTsKKyAgfSB3aGlsZSAodGVzdG5leHQobHMsICcsJykpOworICBpZiAodGVzdG5leHQobHMsICc9JykpCisgICAgbmV4cHMgPSBleHBsaXN0MShscywgJmUpOworICBlbHNlIHsKKyAgICBlLmsgPSBWVk9JRDsKKyAgICBuZXhwcyA9IDA7CisgIH0KKyAgYWRqdXN0X2Fzc2lnbihscywgbnZhcnMsIG5leHBzLCAmZSk7CisgIGFkanVzdGxvY2FsdmFycyhscywgbnZhcnMpOworfQorCisKK3N0YXRpYyBpbnQgZnVuY25hbWUgKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICAvKiBmdW5jbmFtZSAtPiBOQU1FIHtmaWVsZH0gW2A6JyBOQU1FXSAqLworICBpbnQgbmVlZHNlbGYgPSAwOworICBzaW5nbGV2YXIobHMsIHYpOworICB3aGlsZSAobHMtPnQudG9rZW4gPT0gJy4nKQorICAgIGZpZWxkKGxzLCB2KTsKKyAgaWYgKGxzLT50LnRva2VuID09ICc6JykgeworICAgIG5lZWRzZWxmID0gMTsKKyAgICBmaWVsZChscywgdik7CisgIH0KKyAgcmV0dXJuIG5lZWRzZWxmOworfQorCisKK3N0YXRpYyB2b2lkIGZ1bmNzdGF0IChMZXhTdGF0ZSAqbHMsIGludCBsaW5lKSB7CisgIC8qIGZ1bmNzdGF0IC0+IEZVTkNUSU9OIGZ1bmNuYW1lIGJvZHkgKi8KKyAgaW50IG5lZWRzZWxmOworICBleHBkZXNjIHYsIGI7CisgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIEZVTkNUSU9OICovCisgIG5lZWRzZWxmID0gZnVuY25hbWUobHMsICZ2KTsKKyAgYm9keShscywgJmIsIG5lZWRzZWxmLCBsaW5lKTsKKyAgbHVhS19zdG9yZXZhcihscy0+ZnMsICZ2LCAmYik7CisgIGx1YUtfZml4bGluZShscy0+ZnMsIGxpbmUpOyAgLyogZGVmaW5pdGlvbiBgaGFwcGVucycgaW4gdGhlIGZpcnN0IGxpbmUgKi8KK30KKworCitzdGF0aWMgdm9pZCBleHByc3RhdCAoTGV4U3RhdGUgKmxzKSB7CisgIC8qIHN0YXQgLT4gZnVuYyB8IGFzc2lnbm1lbnQgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgc3RydWN0IExIU19hc3NpZ24gdjsKKyAgcHJpbWFyeWV4cChscywgJnYudik7CisgIGlmICh2LnYuayA9PSBWQ0FMTCkgIC8qIHN0YXQgLT4gZnVuYyAqLworICAgIFNFVEFSR19DKGdldGNvZGUoZnMsICZ2LnYpLCAxKTsgIC8qIGNhbGwgc3RhdGVtZW50IHVzZXMgbm8gcmVzdWx0cyAqLworICBlbHNlIHsgIC8qIHN0YXQgLT4gYXNzaWdubWVudCAqLworICAgIHYucHJldiA9IE5VTEw7CisgICAgYXNzaWdubWVudChscywgJnYsIDEpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgcmV0c3RhdCAoTGV4U3RhdGUgKmxzKSB7CisgIC8qIHN0YXQgLT4gUkVUVVJOIGV4cGxpc3QgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgZXhwZGVzYyBlOworICBpbnQgZmlyc3QsIG5yZXQ7ICAvKiByZWdpc3RlcnMgd2l0aCByZXR1cm5lZCB2YWx1ZXMgKi8KKyAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgUkVUVVJOICovCisgIGlmIChibG9ja19mb2xsb3cobHMtPnQudG9rZW4pIHx8IGxzLT50LnRva2VuID09ICc7JykKKyAgICBmaXJzdCA9IG5yZXQgPSAwOyAgLyogcmV0dXJuIG5vIHZhbHVlcyAqLworICBlbHNlIHsKKyAgICBucmV0ID0gZXhwbGlzdDEobHMsICZlKTsgIC8qIG9wdGlvbmFsIHJldHVybiB2YWx1ZXMgKi8KKyAgICBpZiAoaGFzbXVsdHJldChlLmspKSB7CisgICAgICBsdWFLX3NldG11bHRyZXQoZnMsICZlKTsKKyAgICAgIGlmIChlLmsgPT0gVkNBTEwgJiYgbnJldCA9PSAxKSB7ICAvKiB0YWlsIGNhbGw/ICovCisgICAgICAgIFNFVF9PUENPREUoZ2V0Y29kZShmcywmZSksIE9QX1RBSUxDQUxMKTsKKyAgICAgICAgbHVhX2Fzc2VydChHRVRBUkdfQShnZXRjb2RlKGZzLCZlKSkgPT0gZnMtPm5hY3R2YXIpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmcy0+bmFjdHZhcjsKKyAgICAgIG5yZXQgPSBMVUFfTVVMVFJFVDsgIC8qIHJldHVybiBhbGwgdmFsdWVzICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKG5yZXQgPT0gMSkgIC8qIG9ubHkgb25lIHNpbmdsZSB2YWx1ZT8gKi8KKyAgICAgICAgZmlyc3QgPSBsdWFLX2V4cDJhbnlyZWcoZnMsICZlKTsKKyAgICAgIGVsc2UgeworICAgICAgICBsdWFLX2V4cDJuZXh0cmVnKGZzLCAmZSk7ICAvKiB2YWx1ZXMgbXVzdCBnbyB0byB0aGUgYHN0YWNrJyAqLworICAgICAgICBmaXJzdCA9IGZzLT5uYWN0dmFyOyAgLyogcmV0dXJuIGFsbCBgYWN0aXZlJyB2YWx1ZXMgKi8KKyAgICAgICAgbHVhX2Fzc2VydChucmV0ID09IGZzLT5mcmVlcmVnIC0gZmlyc3QpOworICAgICAgfQorICAgIH0KKyAgfQorICBsdWFLX3JldChmcywgZmlyc3QsIG5yZXQpOworfQorCisKK3N0YXRpYyBpbnQgc3RhdGVtZW50IChMZXhTdGF0ZSAqbHMpIHsKKyAgaW50IGxpbmUgPSBscy0+bGluZW51bWJlcjsgIC8qIG1heSBiZSBuZWVkZWQgZm9yIGVycm9yIG1lc3NhZ2VzICovCisgIHN3aXRjaCAobHMtPnQudG9rZW4pIHsKKyAgICBjYXNlIFRLX0lGOiB7ICAvKiBzdGF0IC0+IGlmc3RhdCAqLworICAgICAgaWZzdGF0KGxzLCBsaW5lKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjYXNlIFRLX1dISUxFOiB7ICAvKiBzdGF0IC0+IHdoaWxlc3RhdCAqLworICAgICAgd2hpbGVzdGF0KGxzLCBsaW5lKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjYXNlIFRLX0RPOiB7ICAvKiBzdGF0IC0+IERPIGJsb2NrIEVORCAqLworICAgICAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgRE8gKi8KKyAgICAgIGJsb2NrKGxzKTsKKyAgICAgIGNoZWNrX21hdGNoKGxzLCBUS19FTkQsIFRLX0RPLCBsaW5lKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjYXNlIFRLX0ZPUjogeyAgLyogc3RhdCAtPiBmb3JzdGF0ICovCisgICAgICBmb3JzdGF0KGxzLCBsaW5lKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjYXNlIFRLX1JFUEVBVDogeyAgLyogc3RhdCAtPiByZXBlYXRzdGF0ICovCisgICAgICByZXBlYXRzdGF0KGxzLCBsaW5lKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjYXNlIFRLX0ZVTkNUSU9OOiB7CisgICAgICBmdW5jc3RhdChscywgbGluZSk7ICAvKiBzdGF0IC0+IGZ1bmNzdGF0ICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2FzZSBUS19MT0NBTDogeyAgLyogc3RhdCAtPiBsb2NhbHN0YXQgKi8KKyAgICAgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIExPQ0FMICovCisgICAgICBpZiAodGVzdG5leHQobHMsIFRLX0ZVTkNUSU9OKSkgIC8qIGxvY2FsIGZ1bmN0aW9uPyAqLworICAgICAgICBsb2NhbGZ1bmMobHMpOworICAgICAgZWxzZQorICAgICAgICBsb2NhbHN0YXQobHMpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNhc2UgVEtfUkVUVVJOOiB7ICAvKiBzdGF0IC0+IHJldHN0YXQgKi8KKyAgICAgIHJldHN0YXQobHMpOworICAgICAgcmV0dXJuIDE7ICAvKiBtdXN0IGJlIGxhc3Qgc3RhdGVtZW50ICovCisgICAgfQorICAgIGNhc2UgVEtfQlJFQUs6IHsgIC8qIHN0YXQgLT4gYnJlYWtzdGF0ICovCisgICAgICBsdWFYX25leHQobHMpOyAgLyogc2tpcCBCUkVBSyAqLworICAgICAgYnJlYWtzdGF0KGxzKTsKKyAgICAgIHJldHVybiAxOyAgLyogbXVzdCBiZSBsYXN0IHN0YXRlbWVudCAqLworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBleHByc3RhdChscyk7CisgICAgICByZXR1cm4gMDsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgY2h1bmsgKExleFN0YXRlICpscykgeworICAvKiBjaHVuayAtPiB7IHN0YXQgW2A7J10gfSAqLworICBpbnQgaXNsYXN0ID0gMDsKKyAgZW50ZXJsZXZlbChscyk7CisgIHdoaWxlICghaXNsYXN0ICYmICFibG9ja19mb2xsb3cobHMtPnQudG9rZW4pKSB7CisgICAgaXNsYXN0ID0gc3RhdGVtZW50KGxzKTsKKyAgICB0ZXN0bmV4dChscywgJzsnKTsKKyAgICBsdWFfYXNzZXJ0KGxzLT5mcy0+Zi0+bWF4c3RhY2tzaXplID49IGxzLT5mcy0+ZnJlZXJlZyAmJgorICAgICAgICAgICAgICAgbHMtPmZzLT5mcmVlcmVnID49IGxzLT5mcy0+bmFjdHZhcik7CisgICAgbHMtPmZzLT5mcmVlcmVnID0gbHMtPmZzLT5uYWN0dmFyOyAgLyogZnJlZSByZWdpc3RlcnMgKi8KKyAgfQorICBsZWF2ZWxldmVsKGxzKTsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHBhcnNlci5oIGIvbHVhLTUuMS40L3NyYy9scGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4MzZhZgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHBhcnNlci5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisqKiAkSWQ6IGxwYXJzZXIuaCx2IDEuNTcuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogTHVhIFBhcnNlcgorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbHBhcnNlcl9oCisjZGVmaW5lIGxwYXJzZXJfaAorCisjaW5jbHVkZSAibGxpbWl0cy5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsemlvLmgiCisKKworLyoKKyoqIEV4cHJlc3Npb24gZGVzY3JpcHRvcgorKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgVlZPSUQsCS8qIG5vIHZhbHVlICovCisgIFZOSUwsCisgIFZUUlVFLAorICBWRkFMU0UsCisgIFZLLAkJLyogaW5mbyA9IGluZGV4IG9mIGNvbnN0YW50IGluIGBrJyAqLworICBWS05VTSwJLyogbnZhbCA9IG51bWVyaWNhbCB2YWx1ZSAqLworICBWTE9DQUwsCS8qIGluZm8gPSBsb2NhbCByZWdpc3RlciAqLworICBWVVBWQUwsICAgICAgIC8qIGluZm8gPSBpbmRleCBvZiB1cHZhbHVlIGluIGB1cHZhbHVlcycgKi8KKyAgVkdMT0JBTCwJLyogaW5mbyA9IGluZGV4IG9mIHRhYmxlOyBhdXggPSBpbmRleCBvZiBnbG9iYWwgbmFtZSBpbiBgaycgKi8KKyAgVklOREVYRUQsCS8qIGluZm8gPSB0YWJsZSByZWdpc3RlcjsgYXV4ID0gaW5kZXggcmVnaXN0ZXIgKG9yIGBrJykgKi8KKyAgVkpNUCwJCS8qIGluZm8gPSBpbnN0cnVjdGlvbiBwYyAqLworICBWUkVMT0NBQkxFLAkvKiBpbmZvID0gaW5zdHJ1Y3Rpb24gcGMgKi8KKyAgVk5PTlJFTE9DLAkvKiBpbmZvID0gcmVzdWx0IHJlZ2lzdGVyICovCisgIFZDQUxMLAkvKiBpbmZvID0gaW5zdHJ1Y3Rpb24gcGMgKi8KKyAgVlZBUkFSRwkvKiBpbmZvID0gaW5zdHJ1Y3Rpb24gcGMgKi8KK30gZXhwa2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgZXhwZGVzYyB7CisgIGV4cGtpbmQgazsKKyAgdW5pb24geworICAgIHN0cnVjdCB7IGludCBpbmZvLCBhdXg7IH0gczsKKyAgICBsdWFfTnVtYmVyIG52YWw7CisgIH0gdTsKKyAgaW50IHQ7ICAvKiBwYXRjaCBsaXN0IG9mIGBleGl0IHdoZW4gdHJ1ZScgKi8KKyAgaW50IGY7ICAvKiBwYXRjaCBsaXN0IG9mIGBleGl0IHdoZW4gZmFsc2UnICovCit9IGV4cGRlc2M7CisKKwordHlwZWRlZiBzdHJ1Y3QgdXB2YWxkZXNjIHsKKyAgbHVfYnl0ZSBrOworICBsdV9ieXRlIGluZm87Cit9IHVwdmFsZGVzYzsKKworCitzdHJ1Y3QgQmxvY2tDbnQ7ICAvKiBkZWZpbmVkIGluIGxwYXJzZXIuYyAqLworCisKKy8qIHN0YXRlIG5lZWRlZCB0byBnZW5lcmF0ZSBjb2RlIGZvciBhIGdpdmVuIGZ1bmN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBGdW5jU3RhdGUgeworICBQcm90byAqZjsgIC8qIGN1cnJlbnQgZnVuY3Rpb24gaGVhZGVyICovCisgIFRhYmxlICpoOyAgLyogdGFibGUgdG8gZmluZCAoYW5kIHJldXNlKSBlbGVtZW50cyBpbiBgaycgKi8KKyAgc3RydWN0IEZ1bmNTdGF0ZSAqcHJldjsgIC8qIGVuY2xvc2luZyBmdW5jdGlvbiAqLworICBzdHJ1Y3QgTGV4U3RhdGUgKmxzOyAgLyogbGV4aWNhbCBzdGF0ZSAqLworICBzdHJ1Y3QgbHVhX1N0YXRlICpMOyAgLyogY29weSBvZiB0aGUgTHVhIHN0YXRlICovCisgIHN0cnVjdCBCbG9ja0NudCAqYmw7ICAvKiBjaGFpbiBvZiBjdXJyZW50IGJsb2NrcyAqLworICBpbnQgcGM7ICAvKiBuZXh0IHBvc2l0aW9uIHRvIGNvZGUgKGVxdWl2YWxlbnQgdG8gYG5jb2RlJykgKi8KKyAgaW50IGxhc3R0YXJnZXQ7ICAgLyogYHBjJyBvZiBsYXN0IGBqdW1wIHRhcmdldCcgKi8KKyAgaW50IGpwYzsgIC8qIGxpc3Qgb2YgcGVuZGluZyBqdW1wcyB0byBgcGMnICovCisgIGludCBmcmVlcmVnOyAgLyogZmlyc3QgZnJlZSByZWdpc3RlciAqLworICBpbnQgbms7ICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYGsnICovCisgIGludCBucDsgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBgcCcgKi8KKyAgc2hvcnQgbmxvY3ZhcnM7ICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYGxvY3ZhcnMnICovCisgIGx1X2J5dGUgbmFjdHZhcjsgIC8qIG51bWJlciBvZiBhY3RpdmUgbG9jYWwgdmFyaWFibGVzICovCisgIHVwdmFsZGVzYyB1cHZhbHVlc1tMVUFJX01BWFVQVkFMVUVTXTsgIC8qIHVwdmFsdWVzICovCisgIHVuc2lnbmVkIHNob3J0IGFjdHZhcltMVUFJX01BWFZBUlNdOyAgLyogZGVjbGFyZWQtdmFyaWFibGUgc3RhY2sgKi8KK30gRnVuY1N0YXRlOworCisKK0xVQUlfRlVOQyBQcm90byAqbHVhWV9wYXJzZXIgKGx1YV9TdGF0ZSAqTCwgWklPICp6LCBNYnVmZmVyICpidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHN0YXRlLmMgYi9sdWEtNS4xLjQvc3JjL2xzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTNiODMKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xzdGF0ZS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorKiogJElkOiBsc3RhdGUuYyx2IDIuMzYuMS4yIDIwMDgvMDEvMDMgMTU6MjA6Mzkgcm9iZXJ0byBFeHAgJAorKiogR2xvYmFsIFN0YXRlCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgbHN0YXRlX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsbGV4LmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdGFibGUuaCIKKyNpbmNsdWRlICJsdG0uaCIKKworCisjZGVmaW5lIHN0YXRlX3NpemUoeCkJKHNpemVvZih4KSArIExVQUlfRVhUUkFTUEFDRSkKKyNkZWZpbmUgZnJvbXN0YXRlKGwpCShjYXN0KGx1X2J5dGUgKiwgKGwpKSAtIExVQUlfRVhUUkFTUEFDRSkKKyNkZWZpbmUgdG9zdGF0ZShsKSAgIChjYXN0KGx1YV9TdGF0ZSAqLCBjYXN0KGx1X2J5dGUgKiwgbCkgKyBMVUFJX0VYVFJBU1BBQ0UpKQorCisKKy8qCisqKiBNYWluIHRocmVhZCBjb21iaW5lcyBhIHRocmVhZCBzdGF0ZSBhbmQgdGhlIGdsb2JhbCBzdGF0ZQorKi8KK3R5cGVkZWYgc3RydWN0IExHIHsKKyAgbHVhX1N0YXRlIGw7CisgIGdsb2JhbF9TdGF0ZSBnOworfSBMRzsKKyAgCisKKworc3RhdGljIHZvaWQgc3RhY2tfaW5pdCAobHVhX1N0YXRlICpMMSwgbHVhX1N0YXRlICpMKSB7CisgIC8qIGluaXRpYWxpemUgQ2FsbEluZm8gYXJyYXkgKi8KKyAgTDEtPmJhc2VfY2kgPSBsdWFNX25ld3ZlY3RvcihMLCBCQVNJQ19DSV9TSVpFLCBDYWxsSW5mbyk7CisgIEwxLT5jaSA9IEwxLT5iYXNlX2NpOworICBMMS0+c2l6ZV9jaSA9IEJBU0lDX0NJX1NJWkU7CisgIEwxLT5lbmRfY2kgPSBMMS0+YmFzZV9jaSArIEwxLT5zaXplX2NpIC0gMTsKKyAgLyogaW5pdGlhbGl6ZSBzdGFjayBhcnJheSAqLworICBMMS0+c3RhY2sgPSBsdWFNX25ld3ZlY3RvcihMLCBCQVNJQ19TVEFDS19TSVpFICsgRVhUUkFfU1RBQ0ssIFRWYWx1ZSk7CisgIEwxLT5zdGFja3NpemUgPSBCQVNJQ19TVEFDS19TSVpFICsgRVhUUkFfU1RBQ0s7CisgIEwxLT50b3AgPSBMMS0+c3RhY2s7CisgIEwxLT5zdGFja19sYXN0ID0gTDEtPnN0YWNrKyhMMS0+c3RhY2tzaXplIC0gRVhUUkFfU1RBQ0spLTE7CisgIC8qIGluaXRpYWxpemUgZmlyc3QgY2kgKi8KKyAgTDEtPmNpLT5mdW5jID0gTDEtPnRvcDsKKyAgc2V0bmlsdmFsdWUoTDEtPnRvcCsrKTsgIC8qIGBmdW5jdGlvbicgZW50cnkgZm9yIHRoaXMgYGNpJyAqLworICBMMS0+YmFzZSA9IEwxLT5jaS0+YmFzZSA9IEwxLT50b3A7CisgIEwxLT5jaS0+dG9wID0gTDEtPnRvcCArIExVQV9NSU5TVEFDSzsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlc3RhY2sgKGx1YV9TdGF0ZSAqTCwgbHVhX1N0YXRlICpMMSkgeworICBsdWFNX2ZyZWVhcnJheShMLCBMMS0+YmFzZV9jaSwgTDEtPnNpemVfY2ksIENhbGxJbmZvKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgTDEtPnN0YWNrLCBMMS0+c3RhY2tzaXplLCBUVmFsdWUpOworfQorCisKKy8qCisqKiBvcGVuIHBhcnRzIHRoYXQgbWF5IGNhdXNlIG1lbW9yeS1hbGxvY2F0aW9uIGVycm9ycworKi8KK3N0YXRpYyB2b2lkIGZfbHVhb3BlbiAobHVhX1N0YXRlICpMLCB2b2lkICp1ZCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBVTlVTRUQodWQpOworICBzdGFja19pbml0KEwsIEwpOyAgLyogaW5pdCBzdGFjayAqLworICBzZXRodmFsdWUoTCwgZ3QoTCksIGx1YUhfbmV3KEwsIDAsIDIpKTsgIC8qIHRhYmxlIG9mIGdsb2JhbHMgKi8KKyAgc2V0aHZhbHVlKEwsIHJlZ2lzdHJ5KEwpLCBsdWFIX25ldyhMLCAwLCAyKSk7ICAvKiByZWdpc3RyeSAqLworICBsdWFTX3Jlc2l6ZShMLCBNSU5TVFJUQUJTSVpFKTsgIC8qIGluaXRpYWwgc2l6ZSBvZiBzdHJpbmcgdGFibGUgKi8KKyAgbHVhVF9pbml0KEwpOworICBsdWFYX2luaXQoTCk7CisgIGx1YVNfZml4KGx1YVNfbmV3bGl0ZXJhbChMLCBNRU1FUlJNU0cpKTsKKyAgZy0+R0N0aHJlc2hvbGQgPSA0KmctPnRvdGFsYnl0ZXM7Cit9CisKKworc3RhdGljIHZvaWQgcHJlaW5pdF9zdGF0ZSAobHVhX1N0YXRlICpMLCBnbG9iYWxfU3RhdGUgKmcpIHsKKyAgRyhMKSA9IGc7CisgIEwtPnN0YWNrID0gTlVMTDsKKyAgTC0+c3RhY2tzaXplID0gMDsKKyAgTC0+ZXJyb3JKbXAgPSBOVUxMOworICBMLT5ob29rID0gTlVMTDsKKyAgTC0+aG9va21hc2sgPSAwOworICBMLT5iYXNlaG9va2NvdW50ID0gMDsKKyAgTC0+YWxsb3dob29rID0gMTsKKyAgcmVzZXRob29rY291bnQoTCk7CisgIEwtPm9wZW51cHZhbCA9IE5VTEw7CisgIEwtPnNpemVfY2kgPSAwOworICBMLT5uQ2NhbGxzID0gTC0+YmFzZUNjYWxscyA9IDA7CisgIEwtPnN0YXR1cyA9IDA7CisgIEwtPmJhc2VfY2kgPSBMLT5jaSA9IE5VTEw7CisgIEwtPnNhdmVkcGMgPSBOVUxMOworICBMLT5lcnJmdW5jID0gMDsKKyAgc2V0bmlsdmFsdWUoZ3QoTCkpOworfQorCisKK3N0YXRpYyB2b2lkIGNsb3NlX3N0YXRlIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgbHVhRl9jbG9zZShMLCBMLT5zdGFjayk7ICAvKiBjbG9zZSBhbGwgdXB2YWx1ZXMgZm9yIHRoaXMgdGhyZWFkICovCisgIGx1YUNfZnJlZWFsbChMKTsgIC8qIGNvbGxlY3QgYWxsIG9iamVjdHMgKi8KKyAgbHVhX2Fzc2VydChnLT5yb290Z2MgPT0gb2JqMmdjbyhMKSk7CisgIGx1YV9hc3NlcnQoZy0+c3RydC5udXNlID09IDApOworICBsdWFNX2ZyZWVhcnJheShMLCBHKEwpLT5zdHJ0Lmhhc2gsIEcoTCktPnN0cnQuc2l6ZSwgVFN0cmluZyAqKTsKKyAgbHVhWl9mcmVlYnVmZmVyKEwsICZnLT5idWZmKTsKKyAgZnJlZXN0YWNrKEwsIEwpOworICBsdWFfYXNzZXJ0KGctPnRvdGFsYnl0ZXMgPT0gc2l6ZW9mKExHKSk7CisgICgqZy0+ZnJlYWxsb2MpKGctPnVkLCBmcm9tc3RhdGUoTCksIHN0YXRlX3NpemUoTEcpLCAwKTsKK30KKworCitsdWFfU3RhdGUgKmx1YUVfbmV3dGhyZWFkIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX1N0YXRlICpMMSA9IHRvc3RhdGUobHVhTV9tYWxsb2MoTCwgc3RhdGVfc2l6ZShsdWFfU3RhdGUpKSk7CisgIGx1YUNfbGluayhMLCBvYmoyZ2NvKEwxKSwgTFVBX1RUSFJFQUQpOworICBwcmVpbml0X3N0YXRlKEwxLCBHKEwpKTsKKyAgc3RhY2tfaW5pdChMMSwgTCk7ICAvKiBpbml0IHN0YWNrICovCisgIHNldG9iajJuKEwsIGd0KEwxKSwgZ3QoTCkpOyAgLyogc2hhcmUgdGFibGUgb2YgZ2xvYmFscyAqLworICBMMS0+aG9va21hc2sgPSBMLT5ob29rbWFzazsKKyAgTDEtPmJhc2Vob29rY291bnQgPSBMLT5iYXNlaG9va2NvdW50OworICBMMS0+aG9vayA9IEwtPmhvb2s7CisgIHJlc2V0aG9va2NvdW50KEwxKTsKKyAgbHVhX2Fzc2VydChpc3doaXRlKG9iajJnY28oTDEpKSk7CisgIHJldHVybiBMMTsKK30KKworCit2b2lkIGx1YUVfZnJlZXRocmVhZCAobHVhX1N0YXRlICpMLCBsdWFfU3RhdGUgKkwxKSB7CisgIGx1YUZfY2xvc2UoTDEsIEwxLT5zdGFjayk7ICAvKiBjbG9zZSBhbGwgdXB2YWx1ZXMgZm9yIHRoaXMgdGhyZWFkICovCisgIGx1YV9hc3NlcnQoTDEtPm9wZW51cHZhbCA9PSBOVUxMKTsKKyAgbHVhaV91c2Vyc3RhdGVmcmVlKEwxKTsKKyAgZnJlZXN0YWNrKEwsIEwxKTsKKyAgbHVhTV9mcmVlbWVtKEwsIGZyb21zdGF0ZShMMSksIHN0YXRlX3NpemUobHVhX1N0YXRlKSk7Cit9CisKKworTFVBX0FQSSBsdWFfU3RhdGUgKmx1YV9uZXdzdGF0ZSAobHVhX0FsbG9jIGYsIHZvaWQgKnVkKSB7CisgIGludCBpOworICBsdWFfU3RhdGUgKkw7CisgIGdsb2JhbF9TdGF0ZSAqZzsKKyAgdm9pZCAqbCA9ICgqZikodWQsIE5VTEwsIDAsIHN0YXRlX3NpemUoTEcpKTsKKyAgaWYgKGwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIEwgPSB0b3N0YXRlKGwpOworICBnID0gJigoTEcgKilMKS0+ZzsKKyAgTC0+bmV4dCA9IE5VTEw7CisgIEwtPnR0ID0gTFVBX1RUSFJFQUQ7CisgIGctPmN1cnJlbnR3aGl0ZSA9IGJpdDJtYXNrKFdISVRFMEJJVCwgRklYRURCSVQpOworICBMLT5tYXJrZWQgPSBsdWFDX3doaXRlKGcpOworICBzZXQyYml0cyhMLT5tYXJrZWQsIEZJWEVEQklULCBTRklYRURCSVQpOworICBwcmVpbml0X3N0YXRlKEwsIGcpOworICBnLT5mcmVhbGxvYyA9IGY7CisgIGctPnVkID0gdWQ7CisgIGctPm1haW50aHJlYWQgPSBMOworICBnLT51dmhlYWQudS5sLnByZXYgPSAmZy0+dXZoZWFkOworICBnLT51dmhlYWQudS5sLm5leHQgPSAmZy0+dXZoZWFkOworICBnLT5HQ3RocmVzaG9sZCA9IDA7ICAvKiBtYXJrIGl0IGFzIHVuZmluaXNoZWQgc3RhdGUgKi8KKyAgZy0+c3RydC5zaXplID0gMDsKKyAgZy0+c3RydC5udXNlID0gMDsKKyAgZy0+c3RydC5oYXNoID0gTlVMTDsKKyAgc2V0bmlsdmFsdWUocmVnaXN0cnkoTCkpOworICBsdWFaX2luaXRidWZmZXIoTCwgJmctPmJ1ZmYpOworICBnLT5wYW5pYyA9IE5VTEw7CisgIGctPmdjc3RhdGUgPSBHQ1NwYXVzZTsKKyAgZy0+cm9vdGdjID0gb2JqMmdjbyhMKTsKKyAgZy0+c3dlZXBzdHJnYyA9IDA7CisgIGctPnN3ZWVwZ2MgPSAmZy0+cm9vdGdjOworICBnLT5ncmF5ID0gTlVMTDsKKyAgZy0+Z3JheWFnYWluID0gTlVMTDsKKyAgZy0+d2VhayA9IE5VTEw7CisgIGctPnRtdWRhdGEgPSBOVUxMOworICBnLT50b3RhbGJ5dGVzID0gc2l6ZW9mKExHKTsKKyAgZy0+Z2NwYXVzZSA9IExVQUlfR0NQQVVTRTsKKyAgZy0+Z2NzdGVwbXVsID0gTFVBSV9HQ01VTDsKKyAgZy0+Z2NkZXB0ID0gMDsKKyAgZm9yIChpPTA7IGk8TlVNX1RBR1M7IGkrKykgZy0+bXRbaV0gPSBOVUxMOworICBpZiAobHVhRF9yYXdydW5wcm90ZWN0ZWQoTCwgZl9sdWFvcGVuLCBOVUxMKSAhPSAwKSB7CisgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gZXJyb3I6IGZyZWUgcGFydGlhbCBzdGF0ZSAqLworICAgIGNsb3NlX3N0YXRlKEwpOworICAgIEwgPSBOVUxMOworICB9CisgIGVsc2UKKyAgICBsdWFpX3VzZXJzdGF0ZW9wZW4oTCk7CisgIHJldHVybiBMOworfQorCisKK3N0YXRpYyB2b2lkIGNhbGxhbGxnY1RNIChsdWFfU3RhdGUgKkwsIHZvaWQgKnVkKSB7CisgIFVOVVNFRCh1ZCk7CisgIGx1YUNfY2FsbEdDVE0oTCk7ICAvKiBjYWxsIEdDIG1ldGFtZXRob2RzIGZvciBhbGwgdWRhdGEgKi8KK30KKworCitMVUFfQVBJIHZvaWQgbHVhX2Nsb3NlIChsdWFfU3RhdGUgKkwpIHsKKyAgTCA9IEcoTCktPm1haW50aHJlYWQ7ICAvKiBvbmx5IHRoZSBtYWluIHRocmVhZCBjYW4gYmUgY2xvc2VkICovCisgIGx1YV9sb2NrKEwpOworICBsdWFGX2Nsb3NlKEwsIEwtPnN0YWNrKTsgIC8qIGNsb3NlIGFsbCB1cHZhbHVlcyBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgbHVhQ19zZXBhcmF0ZXVkYXRhKEwsIDEpOyAgLyogc2VwYXJhdGUgdWRhdGEgdGhhdCBoYXZlIEdDIG1ldGFtZXRob2RzICovCisgIEwtPmVycmZ1bmMgPSAwOyAgLyogbm8gZXJyb3IgZnVuY3Rpb24gZHVyaW5nIEdDIG1ldGFtZXRob2RzICovCisgIGRvIHsgIC8qIHJlcGVhdCB1bnRpbCBubyBtb3JlIGVycm9ycyAqLworICAgIEwtPmNpID0gTC0+YmFzZV9jaTsKKyAgICBMLT5iYXNlID0gTC0+dG9wID0gTC0+Y2ktPmJhc2U7CisgICAgTC0+bkNjYWxscyA9IEwtPmJhc2VDY2FsbHMgPSAwOworICB9IHdoaWxlIChsdWFEX3Jhd3J1bnByb3RlY3RlZChMLCBjYWxsYWxsZ2NUTSwgTlVMTCkgIT0gMCk7CisgIGx1YV9hc3NlcnQoRyhMKS0+dG11ZGF0YSA9PSBOVUxMKTsKKyAgbHVhaV91c2Vyc3RhdGVjbG9zZShMKTsKKyAgY2xvc2Vfc3RhdGUoTCk7Cit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHN0YXRlLmggYi9sdWEtNS4xLjQvc3JjL2xzdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzU3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2xzdGF0ZS5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorKiogJElkOiBsc3RhdGUuaCx2IDIuMjQuMS4yIDIwMDgvMDEvMDMgMTU6MjA6Mzkgcm9iZXJ0byBFeHAgJAorKiogR2xvYmFsIFN0YXRlCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsc3RhdGVfaAorI2RlZmluZSBsc3RhdGVfaAorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHRtLmgiCisjaW5jbHVkZSAibHppby5oIgorCisKKworc3RydWN0IGx1YV9sb25nam1wOyAgLyogZGVmaW5lZCBpbiBsZG8uYyAqLworCisKKy8qIHRhYmxlIG9mIGdsb2JhbHMgKi8KKyNkZWZpbmUgZ3QoTCkJKCZMLT5sX2d0KQorCisvKiByZWdpc3RyeSAqLworI2RlZmluZSByZWdpc3RyeShMKQkoJkcoTCktPmxfcmVnaXN0cnkpCisKKworLyogZXh0cmEgc3RhY2sgc3BhY2UgdG8gaGFuZGxlIFRNIGNhbGxzIGFuZCBzb21lIG90aGVyIGV4dHJhcyAqLworI2RlZmluZSBFWFRSQV9TVEFDSyAgIDUKKworCisjZGVmaW5lIEJBU0lDX0NJX1NJWkUgICAgICAgICAgIDgKKworI2RlZmluZSBCQVNJQ19TVEFDS19TSVpFICAgICAgICAoMipMVUFfTUlOU1RBQ0spCisKKworCit0eXBlZGVmIHN0cnVjdCBzdHJpbmd0YWJsZSB7CisgIEdDT2JqZWN0ICoqaGFzaDsKKyAgbHVfaW50MzIgbnVzZTsgIC8qIG51bWJlciBvZiBlbGVtZW50cyAqLworICBpbnQgc2l6ZTsKK30gc3RyaW5ndGFibGU7CisKKworLyoKKyoqIGluZm9ybWF0aW9ucyBhYm91dCBhIGNhbGwKKyovCit0eXBlZGVmIHN0cnVjdCBDYWxsSW5mbyB7CisgIFN0a0lkIGJhc2U7ICAvKiBiYXNlIGZvciB0aGlzIGZ1bmN0aW9uICovCisgIFN0a0lkIGZ1bmM7ICAvKiBmdW5jdGlvbiBpbmRleCBpbiB0aGUgc3RhY2sgKi8KKyAgU3RrSWQJdG9wOyAgLyogdG9wIGZvciB0aGlzIGZ1bmN0aW9uICovCisgIGNvbnN0IEluc3RydWN0aW9uICpzYXZlZHBjOworICBpbnQgbnJlc3VsdHM7ICAvKiBleHBlY3RlZCBudW1iZXIgb2YgcmVzdWx0cyBmcm9tIHRoaXMgZnVuY3Rpb24gKi8KKyAgaW50IHRhaWxjYWxsczsgIC8qIG51bWJlciBvZiB0YWlsIGNhbGxzIGxvc3QgdW5kZXIgdGhpcyBlbnRyeSAqLworfSBDYWxsSW5mbzsKKworCisKKyNkZWZpbmUgY3Vycl9mdW5jKEwpCShjbHZhbHVlKEwtPmNpLT5mdW5jKSkKKyNkZWZpbmUgY2lfZnVuYyhjaSkJKGNsdmFsdWUoKGNpKS0+ZnVuYykpCisjZGVmaW5lIGZfaXNMdWEoY2kpCSghY2lfZnVuYyhjaSktPmMuaXNDKQorI2RlZmluZSBpc0x1YShjaSkJKHR0aXNmdW5jdGlvbigoY2kpLT5mdW5jKSAmJiBmX2lzTHVhKGNpKSkKKworCisvKgorKiogYGdsb2JhbCBzdGF0ZScsIHNoYXJlZCBieSBhbGwgdGhyZWFkcyBvZiB0aGlzIHN0YXRlCisqLwordHlwZWRlZiBzdHJ1Y3QgZ2xvYmFsX1N0YXRlIHsKKyAgc3RyaW5ndGFibGUgc3RydDsgIC8qIGhhc2ggdGFibGUgZm9yIHN0cmluZ3MgKi8KKyAgbHVhX0FsbG9jIGZyZWFsbG9jOyAgLyogZnVuY3Rpb24gdG8gcmVhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgdm9pZCAqdWQ7ICAgICAgICAgLyogYXV4aWxpYXJ5IGRhdGEgdG8gYGZyZWFsbG9jJyAqLworICBsdV9ieXRlIGN1cnJlbnR3aGl0ZTsKKyAgbHVfYnl0ZSBnY3N0YXRlOyAgLyogc3RhdGUgb2YgZ2FyYmFnZSBjb2xsZWN0b3IgKi8KKyAgaW50IHN3ZWVwc3RyZ2M7ICAvKiBwb3NpdGlvbiBvZiBzd2VlcCBpbiBgc3RydCcgKi8KKyAgR0NPYmplY3QgKnJvb3RnYzsgIC8qIGxpc3Qgb2YgYWxsIGNvbGxlY3RhYmxlIG9iamVjdHMgKi8KKyAgR0NPYmplY3QgKipzd2VlcGdjOyAgLyogcG9zaXRpb24gb2Ygc3dlZXAgaW4gYHJvb3RnYycgKi8KKyAgR0NPYmplY3QgKmdyYXk7ICAvKiBsaXN0IG9mIGdyYXkgb2JqZWN0cyAqLworICBHQ09iamVjdCAqZ3JheWFnYWluOyAgLyogbGlzdCBvZiBvYmplY3RzIHRvIGJlIHRyYXZlcnNlZCBhdG9taWNhbGx5ICovCisgIEdDT2JqZWN0ICp3ZWFrOyAgLyogbGlzdCBvZiB3ZWFrIHRhYmxlcyAodG8gYmUgY2xlYXJlZCkgKi8KKyAgR0NPYmplY3QgKnRtdWRhdGE7ICAvKiBsYXN0IGVsZW1lbnQgb2YgbGlzdCBvZiB1c2VyZGF0YSB0byBiZSBHQyAqLworICBNYnVmZmVyIGJ1ZmY7ICAvKiB0ZW1wb3JhcnkgYnVmZmVyIGZvciBzdHJpbmcgY29uY2F0ZW50YXRpb24gKi8KKyAgbHVfbWVtIEdDdGhyZXNob2xkOworICBsdV9tZW0gdG90YWxieXRlczsgIC8qIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYWxsb2NhdGVkICovCisgIGx1X21lbSBlc3RpbWF0ZTsgIC8qIGFuIGVzdGltYXRlIG9mIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBpbiB1c2UgKi8KKyAgbHVfbWVtIGdjZGVwdDsgIC8qIGhvdyBtdWNoIEdDIGlzIGBiZWhpbmQgc2NoZWR1bGUnICovCisgIGludCBnY3BhdXNlOyAgLyogc2l6ZSBvZiBwYXVzZSBiZXR3ZWVuIHN1Y2Nlc3NpdmUgR0NzICovCisgIGludCBnY3N0ZXBtdWw7ICAvKiBHQyBgZ3JhbnVsYXJpdHknICovCisgIGx1YV9DRnVuY3Rpb24gcGFuaWM7ICAvKiB0byBiZSBjYWxsZWQgaW4gdW5wcm90ZWN0ZWQgZXJyb3JzICovCisgIFRWYWx1ZSBsX3JlZ2lzdHJ5OworICBzdHJ1Y3QgbHVhX1N0YXRlICptYWludGhyZWFkOworICBVcFZhbCB1dmhlYWQ7ICAvKiBoZWFkIG9mIGRvdWJsZS1saW5rZWQgbGlzdCBvZiBhbGwgb3BlbiB1cHZhbHVlcyAqLworICBzdHJ1Y3QgVGFibGUgKm10W05VTV9UQUdTXTsgIC8qIG1ldGF0YWJsZXMgZm9yIGJhc2ljIHR5cGVzICovCisgIFRTdHJpbmcgKnRtbmFtZVtUTV9OXTsgIC8qIGFycmF5IHdpdGggdGFnLW1ldGhvZCBuYW1lcyAqLworfSBnbG9iYWxfU3RhdGU7CisKKworLyoKKyoqIGBwZXIgdGhyZWFkJyBzdGF0ZQorKi8KK3N0cnVjdCBsdWFfU3RhdGUgeworICBDb21tb25IZWFkZXI7CisgIGx1X2J5dGUgc3RhdHVzOworICBTdGtJZCB0b3A7ICAvKiBmaXJzdCBmcmVlIHNsb3QgaW4gdGhlIHN0YWNrICovCisgIFN0a0lkIGJhc2U7ICAvKiBiYXNlIG9mIGN1cnJlbnQgZnVuY3Rpb24gKi8KKyAgZ2xvYmFsX1N0YXRlICpsX0c7CisgIENhbGxJbmZvICpjaTsgIC8qIGNhbGwgaW5mbyBmb3IgY3VycmVudCBmdW5jdGlvbiAqLworICBjb25zdCBJbnN0cnVjdGlvbiAqc2F2ZWRwYzsgIC8qIGBzYXZlZHBjJyBvZiBjdXJyZW50IGZ1bmN0aW9uICovCisgIFN0a0lkIHN0YWNrX2xhc3Q7ICAvKiBsYXN0IGZyZWUgc2xvdCBpbiB0aGUgc3RhY2sgKi8KKyAgU3RrSWQgc3RhY2s7ICAvKiBzdGFjayBiYXNlICovCisgIENhbGxJbmZvICplbmRfY2k7ICAvKiBwb2ludHMgYWZ0ZXIgZW5kIG9mIGNpIGFycmF5Ki8KKyAgQ2FsbEluZm8gKmJhc2VfY2k7ICAvKiBhcnJheSBvZiBDYWxsSW5mbydzICovCisgIGludCBzdGFja3NpemU7CisgIGludCBzaXplX2NpOyAgLyogc2l6ZSBvZiBhcnJheSBgYmFzZV9jaScgKi8KKyAgdW5zaWduZWQgc2hvcnQgbkNjYWxsczsgIC8qIG51bWJlciBvZiBuZXN0ZWQgQyBjYWxscyAqLworICB1bnNpZ25lZCBzaG9ydCBiYXNlQ2NhbGxzOyAgLyogbmVzdGVkIEMgY2FsbHMgd2hlbiByZXN1bWluZyBjb3JvdXRpbmUgKi8KKyAgbHVfYnl0ZSBob29rbWFzazsKKyAgbHVfYnl0ZSBhbGxvd2hvb2s7CisgIGludCBiYXNlaG9va2NvdW50OworICBpbnQgaG9va2NvdW50OworICBsdWFfSG9vayBob29rOworICBUVmFsdWUgbF9ndDsgIC8qIHRhYmxlIG9mIGdsb2JhbHMgKi8KKyAgVFZhbHVlIGVudjsgIC8qIHRlbXBvcmFyeSBwbGFjZSBmb3IgZW52aXJvbm1lbnRzICovCisgIEdDT2JqZWN0ICpvcGVudXB2YWw7ICAvKiBsaXN0IG9mIG9wZW4gdXB2YWx1ZXMgaW4gdGhpcyBzdGFjayAqLworICBHQ09iamVjdCAqZ2NsaXN0OworICBzdHJ1Y3QgbHVhX2xvbmdqbXAgKmVycm9ySm1wOyAgLyogY3VycmVudCBlcnJvciByZWNvdmVyIHBvaW50ICovCisgIHB0cmRpZmZfdCBlcnJmdW5jOyAgLyogY3VycmVudCBlcnJvciBoYW5kbGluZyBmdW5jdGlvbiAoc3RhY2sgaW5kZXgpICovCit9OworCisKKyNkZWZpbmUgRyhMKQkoTC0+bF9HKQorCisKKy8qCisqKiBVbmlvbiBvZiBhbGwgY29sbGVjdGFibGUgb2JqZWN0cworKi8KK3VuaW9uIEdDT2JqZWN0IHsKKyAgR0NoZWFkZXIgZ2NoOworICB1bmlvbiBUU3RyaW5nIHRzOworICB1bmlvbiBVZGF0YSB1OworICB1bmlvbiBDbG9zdXJlIGNsOworICBzdHJ1Y3QgVGFibGUgaDsKKyAgc3RydWN0IFByb3RvIHA7CisgIHN0cnVjdCBVcFZhbCB1djsKKyAgc3RydWN0IGx1YV9TdGF0ZSB0aDsgIC8qIHRocmVhZCAqLworfTsKKworCisvKiBtYWNyb3MgdG8gY29udmVydCBhIEdDT2JqZWN0IGludG8gYSBzcGVjaWZpYyB2YWx1ZSAqLworI2RlZmluZSByYXdnY28ydHMobykJY2hlY2tfZXhwKChvKS0+Z2NoLnR0ID09IExVQV9UU1RSSU5HLCAmKChvKS0+dHMpKQorI2RlZmluZSBnY28ydHMobykJKCZyYXdnY28ydHMobyktPnRzdikKKyNkZWZpbmUgcmF3Z2NvMnUobykJY2hlY2tfZXhwKChvKS0+Z2NoLnR0ID09IExVQV9UVVNFUkRBVEEsICYoKG8pLT51KSkKKyNkZWZpbmUgZ2NvMnUobykJKCZyYXdnY28ydShvKS0+dXYpCisjZGVmaW5lIGdjbzJjbChvKQljaGVja19leHAoKG8pLT5nY2gudHQgPT0gTFVBX1RGVU5DVElPTiwgJigobyktPmNsKSkKKyNkZWZpbmUgZ2NvMmgobykJY2hlY2tfZXhwKChvKS0+Z2NoLnR0ID09IExVQV9UVEFCTEUsICYoKG8pLT5oKSkKKyNkZWZpbmUgZ2NvMnAobykJY2hlY2tfZXhwKChvKS0+Z2NoLnR0ID09IExVQV9UUFJPVE8sICYoKG8pLT5wKSkKKyNkZWZpbmUgZ2NvMnV2KG8pCWNoZWNrX2V4cCgobyktPmdjaC50dCA9PSBMVUFfVFVQVkFMLCAmKChvKS0+dXYpKQorI2RlZmluZSBuZ2NvdG91dihvKSBcCisJY2hlY2tfZXhwKChvKSA9PSBOVUxMIHx8IChvKS0+Z2NoLnR0ID09IExVQV9UVVBWQUwsICYoKG8pLT51dikpCisjZGVmaW5lIGdjbzJ0aChvKQljaGVja19leHAoKG8pLT5nY2gudHQgPT0gTFVBX1RUSFJFQUQsICYoKG8pLT50aCkpCisKKy8qIG1hY3JvIHRvIGNvbnZlcnQgYW55IEx1YSBvYmplY3QgaW50byBhIEdDT2JqZWN0ICovCisjZGVmaW5lIG9iajJnY28odikJKGNhc3QoR0NPYmplY3QgKiwgKHYpKSkKKworCitMVUFJX0ZVTkMgbHVhX1N0YXRlICpsdWFFX25ld3RocmVhZCAobHVhX1N0YXRlICpMKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUVfZnJlZXRocmVhZCAobHVhX1N0YXRlICpMLCBsdWFfU3RhdGUgKkwxKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHN0cmluZy5jIGIvbHVhLTUuMS40L3NyYy9sc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxMTMxNQotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHN0cmluZy5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorKiogJElkOiBsc3RyaW5nLmMsdiAyLjguMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogU3RyaW5nIHRhYmxlIChrZWVwcyBhbGwgc3RyaW5ncyBoYW5kbGVkIGJ5IEx1YSkKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsc3RyaW5nX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisKKworCit2b2lkIGx1YVNfcmVzaXplIChsdWFfU3RhdGUgKkwsIGludCBuZXdzaXplKSB7CisgIEdDT2JqZWN0ICoqbmV3aGFzaDsKKyAgc3RyaW5ndGFibGUgKnRiOworICBpbnQgaTsKKyAgaWYgKEcoTCktPmdjc3RhdGUgPT0gR0NTc3dlZXBzdHJpbmcpCisgICAgcmV0dXJuOyAgLyogY2Fubm90IHJlc2l6ZSBkdXJpbmcgR0MgdHJhdmVyc2UgKi8KKyAgbmV3aGFzaCA9IGx1YU1fbmV3dmVjdG9yKEwsIG5ld3NpemUsIEdDT2JqZWN0ICopOworICB0YiA9ICZHKEwpLT5zdHJ0OworICBmb3IgKGk9MDsgaTxuZXdzaXplOyBpKyspIG5ld2hhc2hbaV0gPSBOVUxMOworICAvKiByZWhhc2ggKi8KKyAgZm9yIChpPTA7IGk8dGItPnNpemU7IGkrKykgeworICAgIEdDT2JqZWN0ICpwID0gdGItPmhhc2hbaV07CisgICAgd2hpbGUgKHApIHsgIC8qIGZvciBlYWNoIG5vZGUgaW4gdGhlIGxpc3QgKi8KKyAgICAgIEdDT2JqZWN0ICpuZXh0ID0gcC0+Z2NoLm5leHQ7ICAvKiBzYXZlIG5leHQgKi8KKyAgICAgIHVuc2lnbmVkIGludCBoID0gZ2NvMnRzKHApLT5oYXNoOworICAgICAgaW50IGgxID0gbG1vZChoLCBuZXdzaXplKTsgIC8qIG5ldyBwb3NpdGlvbiAqLworICAgICAgbHVhX2Fzc2VydChjYXN0X2ludChoJW5ld3NpemUpID09IGxtb2QoaCwgbmV3c2l6ZSkpOworICAgICAgcC0+Z2NoLm5leHQgPSBuZXdoYXNoW2gxXTsgIC8qIGNoYWluIGl0ICovCisgICAgICBuZXdoYXNoW2gxXSA9IHA7CisgICAgICBwID0gbmV4dDsKKyAgICB9CisgIH0KKyAgbHVhTV9mcmVlYXJyYXkoTCwgdGItPmhhc2gsIHRiLT5zaXplLCBUU3RyaW5nICopOworICB0Yi0+c2l6ZSA9IG5ld3NpemU7CisgIHRiLT5oYXNoID0gbmV3aGFzaDsKK30KKworCitzdGF0aWMgVFN0cmluZyAqbmV3bHN0ciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGgpIHsKKyAgVFN0cmluZyAqdHM7CisgIHN0cmluZ3RhYmxlICp0YjsKKyAgaWYgKGwrMSA+IChNQVhfU0laRVQgLSBzaXplb2YoVFN0cmluZykpL3NpemVvZihjaGFyKSkKKyAgICBsdWFNX3Rvb2JpZyhMKTsKKyAgdHMgPSBjYXN0KFRTdHJpbmcgKiwgbHVhTV9tYWxsb2MoTCwgKGwrMSkqc2l6ZW9mKGNoYXIpK3NpemVvZihUU3RyaW5nKSkpOworICB0cy0+dHN2LmxlbiA9IGw7CisgIHRzLT50c3YuaGFzaCA9IGg7CisgIHRzLT50c3YubWFya2VkID0gbHVhQ193aGl0ZShHKEwpKTsKKyAgdHMtPnRzdi50dCA9IExVQV9UU1RSSU5HOworICB0cy0+dHN2LnJlc2VydmVkID0gMDsKKyAgbWVtY3B5KHRzKzEsIHN0ciwgbCpzaXplb2YoY2hhcikpOworICAoKGNoYXIgKikodHMrMSkpW2xdID0gJ1wwJzsgIC8qIGVuZGluZyAwICovCisgIHRiID0gJkcoTCktPnN0cnQ7CisgIGggPSBsbW9kKGgsIHRiLT5zaXplKTsKKyAgdHMtPnRzdi5uZXh0ID0gdGItPmhhc2hbaF07ICAvKiBjaGFpbiBuZXcgZW50cnkgKi8KKyAgdGItPmhhc2hbaF0gPSBvYmoyZ2NvKHRzKTsKKyAgdGItPm51c2UrKzsKKyAgaWYgKHRiLT5udXNlID4gY2FzdChsdV9pbnQzMiwgdGItPnNpemUpICYmIHRiLT5zaXplIDw9IE1BWF9JTlQvMikKKyAgICBsdWFTX3Jlc2l6ZShMLCB0Yi0+c2l6ZSoyKTsgIC8qIHRvbyBjcm93ZGVkICovCisgIHJldHVybiB0czsKK30KKworCitUU3RyaW5nICpsdWFTX25ld2xzdHIgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbCkgeworICBHQ09iamVjdCAqbzsKKyAgdW5zaWduZWQgaW50IGggPSBjYXN0KHVuc2lnbmVkIGludCwgbCk7ICAvKiBzZWVkICovCisgIHNpemVfdCBzdGVwID0gKGw+PjUpKzE7ICAvKiBpZiBzdHJpbmcgaXMgdG9vIGxvbmcsIGRvbid0IGhhc2ggYWxsIGl0cyBjaGFycyAqLworICBzaXplX3QgbDE7CisgIGZvciAobDE9bDsgbDE+PXN0ZXA7IGwxLT1zdGVwKSAgLyogY29tcHV0ZSBoYXNoICovCisgICAgaCA9IGggXiAoKGg8PDUpKyhoPj4yKStjYXN0KHVuc2lnbmVkIGNoYXIsIHN0cltsMS0xXSkpOworICBmb3IgKG8gPSBHKEwpLT5zdHJ0Lmhhc2hbbG1vZChoLCBHKEwpLT5zdHJ0LnNpemUpXTsKKyAgICAgICBvICE9IE5VTEw7CisgICAgICAgbyA9IG8tPmdjaC5uZXh0KSB7CisgICAgVFN0cmluZyAqdHMgPSByYXdnY28ydHMobyk7CisgICAgaWYgKHRzLT50c3YubGVuID09IGwgJiYgKG1lbWNtcChzdHIsIGdldHN0cih0cyksIGwpID09IDApKSB7CisgICAgICAvKiBzdHJpbmcgbWF5IGJlIGRlYWQgKi8KKyAgICAgIGlmIChpc2RlYWQoRyhMKSwgbykpIGNoYW5nZXdoaXRlKG8pOworICAgICAgcmV0dXJuIHRzOworICAgIH0KKyAgfQorICByZXR1cm4gbmV3bHN0cihMLCBzdHIsIGwsIGgpOyAgLyogbm90IGZvdW5kICovCit9CisKKworVWRhdGEgKmx1YVNfbmV3dWRhdGEgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHMsIFRhYmxlICplKSB7CisgIFVkYXRhICp1OworICBpZiAocyA+IE1BWF9TSVpFVCAtIHNpemVvZihVZGF0YSkpCisgICAgbHVhTV90b29iaWcoTCk7CisgIHUgPSBjYXN0KFVkYXRhICosIGx1YU1fbWFsbG9jKEwsIHMgKyBzaXplb2YoVWRhdGEpKSk7CisgIHUtPnV2Lm1hcmtlZCA9IGx1YUNfd2hpdGUoRyhMKSk7ICAvKiBpcyBub3QgZmluYWxpemVkICovCisgIHUtPnV2LnR0ID0gTFVBX1RVU0VSREFUQTsKKyAgdS0+dXYubGVuID0gczsKKyAgdS0+dXYubWV0YXRhYmxlID0gTlVMTDsKKyAgdS0+dXYuZW52ID0gZTsKKyAgLyogY2hhaW4gaXQgb24gdWRhdGEgbGlzdCAoYWZ0ZXIgbWFpbiB0aHJlYWQpICovCisgIHUtPnV2Lm5leHQgPSBHKEwpLT5tYWludGhyZWFkLT5uZXh0OworICBHKEwpLT5tYWludGhyZWFkLT5uZXh0ID0gb2JqMmdjbyh1KTsKKyAgcmV0dXJuIHU7Cit9CisKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHN0cmluZy5oIGIvbHVhLTUuMS40L3NyYy9sc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhMmZmOAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHN0cmluZy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisqKiAkSWQ6IGxzdHJpbmcuaCx2IDEuNDMuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogU3RyaW5nIHRhYmxlIChrZWVwIGFsbCBzdHJpbmdzIGhhbmRsZWQgYnkgTHVhKQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbHN0cmluZ19oCisjZGVmaW5lIGxzdHJpbmdfaAorCisKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisKKworI2RlZmluZSBzaXplc3RyaW5nKHMpCShzaXplb2YodW5pb24gVFN0cmluZykrKChzKS0+bGVuKzEpKnNpemVvZihjaGFyKSkKKworI2RlZmluZSBzaXpldWRhdGEodSkJKHNpemVvZih1bmlvbiBVZGF0YSkrKHUpLT5sZW4pCisKKyNkZWZpbmUgbHVhU19uZXcoTCwgcykJKGx1YVNfbmV3bHN0cihMLCBzLCBzdHJsZW4ocykpKQorI2RlZmluZSBsdWFTX25ld2xpdGVyYWwoTCwgcykJKGx1YVNfbmV3bHN0cihMLCAiIiBzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHMpL3NpemVvZihjaGFyKSktMSkpCisKKyNkZWZpbmUgbHVhU19maXgocykJbF9zZXRiaXQoKHMpLT50c3YubWFya2VkLCBGSVhFREJJVCkKKworTFVBSV9GVU5DIHZvaWQgbHVhU19yZXNpemUgKGx1YV9TdGF0ZSAqTCwgaW50IG5ld3NpemUpOworTFVBSV9GVU5DIFVkYXRhICpsdWFTX25ld3VkYXRhIChsdWFfU3RhdGUgKkwsIHNpemVfdCBzLCBUYWJsZSAqZSk7CitMVUFJX0ZVTkMgVFN0cmluZyAqbHVhU19uZXdsc3RyIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGwpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sc3RybGliLmMgYi9sdWEtNS4xLjQvc3JjL2xzdHJsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQ3NjNkCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sc3RybGliLmMKQEAgLTAsMCArMSw4NjkgQEAKKy8qCisqKiAkSWQ6IGxzdHJsaWIuYyx2IDEuMTMyLjEuNCAyMDA4LzA3LzExIDE3OjI3OjIxIHJvYmVydG8gRXhwICQKKyoqIFN0YW5kYXJkIGxpYnJhcnkgZm9yIHN0cmluZyBvcGVyYXRpb25zIGFuZCBwYXR0ZXJuLW1hdGNoaW5nCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGxzdHJsaWJfYworI2RlZmluZSBMVUFfTElCCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKworCisvKiBtYWNybyB0byBgdW5zaWduJyBhIGNoYXJhY3RlciAqLworI2RlZmluZSB1Y2hhcihjKSAgICAgICAgKCh1bnNpZ25lZCBjaGFyKShjKSkKKworCisKK3N0YXRpYyBpbnQgc3RyX2xlbiAobHVhX1N0YXRlICpMKSB7CisgIHNpemVfdCBsOworICBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbCk7CisgIGx1YV9wdXNoaW50ZWdlcihMLCBsKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHB0cmRpZmZfdCBwb3NyZWxhdCAocHRyZGlmZl90IHBvcywgc2l6ZV90IGxlbikgeworICAvKiByZWxhdGl2ZSBzdHJpbmcgcG9zaXRpb246IG5lZ2F0aXZlIG1lYW5zIGJhY2sgZnJvbSBlbmQgKi8KKyAgaWYgKHBvcyA8IDApIHBvcyArPSAocHRyZGlmZl90KWxlbiArIDE7CisgIHJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKK30KKworCitzdGF0aWMgaW50IHN0cl9zdWIgKGx1YV9TdGF0ZSAqTCkgeworICBzaXplX3QgbDsKKyAgY29uc3QgY2hhciAqcyA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDEsICZsKTsKKyAgcHRyZGlmZl90IHN0YXJ0ID0gcG9zcmVsYXQobHVhTF9jaGVja2ludGVnZXIoTCwgMiksIGwpOworICBwdHJkaWZmX3QgZW5kID0gcG9zcmVsYXQobHVhTF9vcHRpbnRlZ2VyKEwsIDMsIC0xKSwgbCk7CisgIGlmIChzdGFydCA8IDEpIHN0YXJ0ID0gMTsKKyAgaWYgKGVuZCA+IChwdHJkaWZmX3QpbCkgZW5kID0gKHB0cmRpZmZfdClsOworICBpZiAoc3RhcnQgPD0gZW5kKQorICAgIGx1YV9wdXNobHN0cmluZyhMLCBzK3N0YXJ0LTEsIGVuZC1zdGFydCsxKTsKKyAgZWxzZSBsdWFfcHVzaGxpdGVyYWwoTCwgIiIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHN0cl9yZXZlcnNlIChsdWFfU3RhdGUgKkwpIHsKKyAgc2l6ZV90IGw7CisgIGx1YUxfQnVmZmVyIGI7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbCk7CisgIGx1YUxfYnVmZmluaXQoTCwgJmIpOworICB3aGlsZSAobC0tKSBsdWFMX2FkZGNoYXIoJmIsIHNbbF0pOworICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHN0cl9sb3dlciAobHVhX1N0YXRlICpMKSB7CisgIHNpemVfdCBsOworICBzaXplX3QgaTsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgY29uc3QgY2hhciAqcyA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDEsICZsKTsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIGZvciAoaT0wOyBpPGw7IGkrKykKKyAgICBsdWFMX2FkZGNoYXIoJmIsIHRvbG93ZXIodWNoYXIoc1tpXSkpKTsKKyAgbHVhTF9wdXNocmVzdWx0KCZiKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBzdHJfdXBwZXIgKGx1YV9TdGF0ZSAqTCkgeworICBzaXplX3QgbDsKKyAgc2l6ZV90IGk7CisgIGx1YUxfQnVmZmVyIGI7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbCk7CisgIGx1YUxfYnVmZmluaXQoTCwgJmIpOworICBmb3IgKGk9MDsgaTxsOyBpKyspCisgICAgbHVhTF9hZGRjaGFyKCZiLCB0b3VwcGVyKHVjaGFyKHNbaV0pKSk7CisgIGx1YUxfcHVzaHJlc3VsdCgmYik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHN0cl9yZXAgKGx1YV9TdGF0ZSAqTCkgeworICBzaXplX3QgbDsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgY29uc3QgY2hhciAqcyA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDEsICZsKTsKKyAgaW50IG4gPSBsdWFMX2NoZWNraW50KEwsIDIpOworICBsdWFMX2J1ZmZpbml0KEwsICZiKTsKKyAgd2hpbGUgKG4tLSA+IDApCisgICAgbHVhTF9hZGRsc3RyaW5nKCZiLCBzLCBsKTsKKyAgbHVhTF9wdXNocmVzdWx0KCZiKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBzdHJfYnl0ZSAobHVhX1N0YXRlICpMKSB7CisgIHNpemVfdCBsOworICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMSwgJmwpOworICBwdHJkaWZmX3QgcG9zaSA9IHBvc3JlbGF0KGx1YUxfb3B0aW50ZWdlcihMLCAyLCAxKSwgbCk7CisgIHB0cmRpZmZfdCBwb3NlID0gcG9zcmVsYXQobHVhTF9vcHRpbnRlZ2VyKEwsIDMsIHBvc2kpLCBsKTsKKyAgaW50IG4sIGk7CisgIGlmIChwb3NpIDw9IDApIHBvc2kgPSAxOworICBpZiAoKHNpemVfdClwb3NlID4gbCkgcG9zZSA9IGw7CisgIGlmIChwb3NpID4gcG9zZSkgcmV0dXJuIDA7ICAvKiBlbXB0eSBpbnRlcnZhbDsgcmV0dXJuIG5vIHZhbHVlcyAqLworICBuID0gKGludCkocG9zZSAtICBwb3NpICsgMSk7CisgIGlmIChwb3NpICsgbiA8PSBwb3NlKSAgLyogb3ZlcmZsb3c/ICovCisgICAgbHVhTF9lcnJvcihMLCAic3RyaW5nIHNsaWNlIHRvbyBsb25nIik7CisgIGx1YUxfY2hlY2tzdGFjayhMLCBuLCAic3RyaW5nIHNsaWNlIHRvbyBsb25nIik7CisgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgICBsdWFfcHVzaGludGVnZXIoTCwgdWNoYXIoc1twb3NpK2ktMV0pKTsKKyAgcmV0dXJuIG47Cit9CisKKworc3RhdGljIGludCBzdHJfY2hhciAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gbHVhX2dldHRvcChMKTsgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgaW50IGk7CisgIGx1YUxfQnVmZmVyIGI7CisgIGx1YUxfYnVmZmluaXQoTCwgJmIpOworICBmb3IgKGk9MTsgaTw9bjsgaSsrKSB7CisgICAgaW50IGMgPSBsdWFMX2NoZWNraW50KEwsIGkpOworICAgIGx1YUxfYXJnY2hlY2soTCwgdWNoYXIoYykgPT0gYywgaSwgImludmFsaWQgdmFsdWUiKTsKKyAgICBsdWFMX2FkZGNoYXIoJmIsIHVjaGFyKGMpKTsKKyAgfQorICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHdyaXRlciAobHVhX1N0YXRlICpMLCBjb25zdCB2b2lkKiBiLCBzaXplX3Qgc2l6ZSwgdm9pZCogQikgeworICAodm9pZClMOworICBsdWFMX2FkZGxzdHJpbmcoKGx1YUxfQnVmZmVyKikgQiwgKGNvbnN0IGNoYXIgKiliLCBzaXplKTsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzdHJfZHVtcCAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfQnVmZmVyIGI7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9URlVOQ1RJT04pOworICBsdWFfc2V0dG9wKEwsIDEpOworICBsdWFMX2J1ZmZpbml0KEwsJmIpOworICBpZiAobHVhX2R1bXAoTCwgd3JpdGVyLCAmYikgIT0gMCkKKyAgICBsdWFMX2Vycm9yKEwsICJ1bmFibGUgdG8gZHVtcCBnaXZlbiBmdW5jdGlvbiIpOworICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICByZXR1cm4gMTsKK30KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBQQVRURVJOIE1BVENISU5HCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKyNkZWZpbmUgQ0FQX1VORklOSVNIRUQJKC0xKQorI2RlZmluZSBDQVBfUE9TSVRJT04JKC0yKQorCit0eXBlZGVmIHN0cnVjdCBNYXRjaFN0YXRlIHsKKyAgY29uc3QgY2hhciAqc3JjX2luaXQ7ICAvKiBpbml0IG9mIHNvdXJjZSBzdHJpbmcgKi8KKyAgY29uc3QgY2hhciAqc3JjX2VuZDsgIC8qIGVuZCAoYFwwJykgb2Ygc291cmNlIHN0cmluZyAqLworICBsdWFfU3RhdGUgKkw7CisgIGludCBsZXZlbDsgIC8qIHRvdGFsIG51bWJlciBvZiBjYXB0dXJlcyAoZmluaXNoZWQgb3IgdW5maW5pc2hlZCkgKi8KKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICppbml0OworICAgIHB0cmRpZmZfdCBsZW47CisgIH0gY2FwdHVyZVtMVUFfTUFYQ0FQVFVSRVNdOworfSBNYXRjaFN0YXRlOworCisKKyNkZWZpbmUgTF9FU0MJCSclJworI2RlZmluZSBTUEVDSUFMUwkiXiQqKz8uKFslLSIKKworCitzdGF0aWMgaW50IGNoZWNrX2NhcHR1cmUgKE1hdGNoU3RhdGUgKm1zLCBpbnQgbCkgeworICBsIC09ICcxJzsKKyAgaWYgKGwgPCAwIHx8IGwgPj0gbXMtPmxldmVsIHx8IG1zLT5jYXB0dXJlW2xdLmxlbiA9PSBDQVBfVU5GSU5JU0hFRCkKKyAgICByZXR1cm4gbHVhTF9lcnJvcihtcy0+TCwgImludmFsaWQgY2FwdHVyZSBpbmRleCIpOworICByZXR1cm4gbDsKK30KKworCitzdGF0aWMgaW50IGNhcHR1cmVfdG9fY2xvc2UgKE1hdGNoU3RhdGUgKm1zKSB7CisgIGludCBsZXZlbCA9IG1zLT5sZXZlbDsKKyAgZm9yIChsZXZlbC0tOyBsZXZlbD49MDsgbGV2ZWwtLSkKKyAgICBpZiAobXMtPmNhcHR1cmVbbGV2ZWxdLmxlbiA9PSBDQVBfVU5GSU5JU0hFRCkgcmV0dXJuIGxldmVsOworICByZXR1cm4gbHVhTF9lcnJvcihtcy0+TCwgImludmFsaWQgcGF0dGVybiBjYXB0dXJlIik7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzZW5kIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcCkgeworICBzd2l0Y2ggKCpwKyspIHsKKyAgICBjYXNlIExfRVNDOiB7CisgICAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICAgbHVhTF9lcnJvcihtcy0+TCwgIm1hbGZvcm1lZCBwYXR0ZXJuIChlbmRzIHdpdGggIiBMVUFfUUwoIiUlIikgIikiKTsKKyAgICAgIHJldHVybiBwKzE7CisgICAgfQorICAgIGNhc2UgJ1snOiB7CisgICAgICBpZiAoKnAgPT0gJ14nKSBwKys7CisgICAgICBkbyB7ICAvKiBsb29rIGZvciBhIGBdJyAqLworICAgICAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICAgICBsdWFMX2Vycm9yKG1zLT5MLCAibWFsZm9ybWVkIHBhdHRlcm4gKG1pc3NpbmcgIiBMVUFfUUwoIl0iKSAiKSIpOworICAgICAgICBpZiAoKihwKyspID09IExfRVNDICYmICpwICE9ICdcMCcpCisgICAgICAgICAgcCsrOyAgLyogc2tpcCBlc2NhcGVzIChlLmcuIGAlXScpICovCisgICAgICB9IHdoaWxlICgqcCAhPSAnXScpOworICAgICAgcmV0dXJuIHArMTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgcmV0dXJuIHA7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIGludCBtYXRjaF9jbGFzcyAoaW50IGMsIGludCBjbCkgeworICBpbnQgcmVzOworICBzd2l0Y2ggKHRvbG93ZXIoY2wpKSB7CisgICAgY2FzZSAnYScgOiByZXMgPSBpc2FscGhhKGMpOyBicmVhazsKKyAgICBjYXNlICdjJyA6IHJlcyA9IGlzY250cmwoYyk7IGJyZWFrOworICAgIGNhc2UgJ2QnIDogcmVzID0gaXNkaWdpdChjKTsgYnJlYWs7CisgICAgY2FzZSAnbCcgOiByZXMgPSBpc2xvd2VyKGMpOyBicmVhazsKKyAgICBjYXNlICdwJyA6IHJlcyA9IGlzcHVuY3QoYyk7IGJyZWFrOworICAgIGNhc2UgJ3MnIDogcmVzID0gaXNzcGFjZShjKTsgYnJlYWs7CisgICAgY2FzZSAndScgOiByZXMgPSBpc3VwcGVyKGMpOyBicmVhazsKKyAgICBjYXNlICd3JyA6IHJlcyA9IGlzYWxudW0oYyk7IGJyZWFrOworICAgIGNhc2UgJ3gnIDogcmVzID0gaXN4ZGlnaXQoYyk7IGJyZWFrOworICAgIGNhc2UgJ3onIDogcmVzID0gKGMgPT0gMCk7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiAoY2wgPT0gYyk7CisgIH0KKyAgcmV0dXJuIChpc2xvd2VyKGNsKSA/IHJlcyA6ICFyZXMpOworfQorCisKK3N0YXRpYyBpbnQgbWF0Y2hicmFja2V0Y2xhc3MgKGludCBjLCBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICplYykgeworICBpbnQgc2lnID0gMTsKKyAgaWYgKCoocCsxKSA9PSAnXicpIHsKKyAgICBzaWcgPSAwOworICAgIHArKzsgIC8qIHNraXAgdGhlIGBeJyAqLworICB9CisgIHdoaWxlICgrK3AgPCBlYykgeworICAgIGlmICgqcCA9PSBMX0VTQykgeworICAgICAgcCsrOworICAgICAgaWYgKG1hdGNoX2NsYXNzKGMsIHVjaGFyKCpwKSkpCisgICAgICAgIHJldHVybiBzaWc7CisgICAgfQorICAgIGVsc2UgaWYgKCgqKHArMSkgPT0gJy0nKSAmJiAocCsyIDwgZWMpKSB7CisgICAgICBwKz0yOworICAgICAgaWYgKHVjaGFyKCoocC0yKSkgPD0gYyAmJiBjIDw9IHVjaGFyKCpwKSkKKyAgICAgICAgcmV0dXJuIHNpZzsKKyAgICB9CisgICAgZWxzZSBpZiAodWNoYXIoKnApID09IGMpIHJldHVybiBzaWc7CisgIH0KKyAgcmV0dXJuICFzaWc7Cit9CisKKworc3RhdGljIGludCBzaW5nbGVtYXRjaCAoaW50IGMsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKmVwKSB7CisgIHN3aXRjaCAoKnApIHsKKyAgICBjYXNlICcuJzogcmV0dXJuIDE7ICAvKiBtYXRjaGVzIGFueSBjaGFyICovCisgICAgY2FzZSBMX0VTQzogcmV0dXJuIG1hdGNoX2NsYXNzKGMsIHVjaGFyKCoocCsxKSkpOworICAgIGNhc2UgJ1snOiByZXR1cm4gbWF0Y2hicmFja2V0Y2xhc3MoYywgcCwgZXAtMSk7CisgICAgZGVmYXVsdDogIHJldHVybiAodWNoYXIoKnApID09IGMpOworICB9Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKm1hdGNoIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCk7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKm1hdGNoYmFsYW5jZSAoTWF0Y2hTdGF0ZSAqbXMsIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnApIHsKKyAgaWYgKCpwID09IDAgfHwgKihwKzEpID09IDApCisgICAgbHVhTF9lcnJvcihtcy0+TCwgInVuYmFsYW5jZWQgcGF0dGVybiIpOworICBpZiAoKnMgIT0gKnApIHJldHVybiBOVUxMOworICBlbHNlIHsKKyAgICBpbnQgYiA9ICpwOworICAgIGludCBlID0gKihwKzEpOworICAgIGludCBjb250ID0gMTsKKyAgICB3aGlsZSAoKytzIDwgbXMtPnNyY19lbmQpIHsKKyAgICAgIGlmICgqcyA9PSBlKSB7CisgICAgICAgIGlmICgtLWNvbnQgPT0gMCkgcmV0dXJuIHMrMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCpzID09IGIpIGNvbnQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7ICAvKiBzdHJpbmcgZW5kcyBvdXQgb2YgYmFsYW5jZSAqLworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICptYXhfZXhwYW5kIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKmVwKSB7CisgIHB0cmRpZmZfdCBpID0gMDsgIC8qIGNvdW50cyBtYXhpbXVtIGV4cGFuZCBmb3IgaXRlbSAqLworICB3aGlsZSAoKHMraSk8bXMtPnNyY19lbmQgJiYgc2luZ2xlbWF0Y2godWNoYXIoKihzK2kpKSwgcCwgZXApKQorICAgIGkrKzsKKyAgLyoga2VlcHMgdHJ5aW5nIHRvIG1hdGNoIHdpdGggdGhlIG1heGltdW0gcmVwZXRpdGlvbnMgKi8KKyAgd2hpbGUgKGk+PTApIHsKKyAgICBjb25zdCBjaGFyICpyZXMgPSBtYXRjaChtcywgKHMraSksIGVwKzEpOworICAgIGlmIChyZXMpIHJldHVybiByZXM7CisgICAgaS0tOyAgLyogZWxzZSBkaWRuJ3QgbWF0Y2g7IHJlZHVjZSAxIHJlcGV0aXRpb24gdG8gdHJ5IGFnYWluICovCisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKm1pbl9leHBhbmQgKE1hdGNoU3RhdGUgKm1zLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqZXApIHsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKnJlcyA9IG1hdGNoKG1zLCBzLCBlcCsxKTsKKyAgICBpZiAocmVzICE9IE5VTEwpCisgICAgICByZXR1cm4gcmVzOworICAgIGVsc2UgaWYgKHM8bXMtPnNyY19lbmQgJiYgc2luZ2xlbWF0Y2godWNoYXIoKnMpLCBwLCBlcCkpCisgICAgICBzKys7ICAvKiB0cnkgd2l0aCBvbmUgbW9yZSByZXBldGl0aW9uICovCisgICAgZWxzZSByZXR1cm4gTlVMTDsKKyAgfQorfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpzdGFydF9jYXB0dXJlIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAsIGludCB3aGF0KSB7CisgIGNvbnN0IGNoYXIgKnJlczsKKyAgaW50IGxldmVsID0gbXMtPmxldmVsOworICBpZiAobGV2ZWwgPj0gTFVBX01BWENBUFRVUkVTKSBsdWFMX2Vycm9yKG1zLT5MLCAidG9vIG1hbnkgY2FwdHVyZXMiKTsKKyAgbXMtPmNhcHR1cmVbbGV2ZWxdLmluaXQgPSBzOworICBtcy0+Y2FwdHVyZVtsZXZlbF0ubGVuID0gd2hhdDsKKyAgbXMtPmxldmVsID0gbGV2ZWwrMTsKKyAgaWYgKChyZXM9bWF0Y2gobXMsIHMsIHApKSA9PSBOVUxMKSAgLyogbWF0Y2ggZmFpbGVkPyAqLworICAgIG1zLT5sZXZlbC0tOyAgLyogdW5kbyBjYXB0dXJlICovCisgIHJldHVybiByZXM7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmVuZF9jYXB0dXJlIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwKSB7CisgIGludCBsID0gY2FwdHVyZV90b19jbG9zZShtcyk7CisgIGNvbnN0IGNoYXIgKnJlczsKKyAgbXMtPmNhcHR1cmVbbF0ubGVuID0gcyAtIG1zLT5jYXB0dXJlW2xdLmluaXQ7ICAvKiBjbG9zZSBjYXB0dXJlICovCisgIGlmICgocmVzID0gbWF0Y2gobXMsIHMsIHApKSA9PSBOVUxMKSAgLyogbWF0Y2ggZmFpbGVkPyAqLworICAgIG1zLT5jYXB0dXJlW2xdLmxlbiA9IENBUF9VTkZJTklTSEVEOyAgLyogdW5kbyBjYXB0dXJlICovCisgIHJldHVybiByZXM7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKm1hdGNoX2NhcHR1cmUgKE1hdGNoU3RhdGUgKm1zLCBjb25zdCBjaGFyICpzLCBpbnQgbCkgeworICBzaXplX3QgbGVuOworICBsID0gY2hlY2tfY2FwdHVyZShtcywgbCk7CisgIGxlbiA9IG1zLT5jYXB0dXJlW2xdLmxlbjsKKyAgaWYgKChzaXplX3QpKG1zLT5zcmNfZW5kLXMpID49IGxlbiAmJgorICAgICAgbWVtY21wKG1zLT5jYXB0dXJlW2xdLmluaXQsIHMsIGxlbikgPT0gMCkKKyAgICByZXR1cm4gcytsZW47CisgIGVsc2UgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKm1hdGNoIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCkgeworICBpbml0OiAvKiB1c2luZyBnb3RvJ3MgdG8gb3B0aW1pemUgdGFpbCByZWN1cnNpb24gKi8KKyAgc3dpdGNoICgqcCkgeworICAgIGNhc2UgJygnOiB7ICAvKiBzdGFydCBjYXB0dXJlICovCisgICAgICBpZiAoKihwKzEpID09ICcpJykgIC8qIHBvc2l0aW9uIGNhcHR1cmU/ICovCisgICAgICAgIHJldHVybiBzdGFydF9jYXB0dXJlKG1zLCBzLCBwKzIsIENBUF9QT1NJVElPTik7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzdGFydF9jYXB0dXJlKG1zLCBzLCBwKzEsIENBUF9VTkZJTklTSEVEKTsKKyAgICB9CisgICAgY2FzZSAnKSc6IHsgIC8qIGVuZCBjYXB0dXJlICovCisgICAgICByZXR1cm4gZW5kX2NhcHR1cmUobXMsIHMsIHArMSk7CisgICAgfQorICAgIGNhc2UgTF9FU0M6IHsKKyAgICAgIHN3aXRjaCAoKihwKzEpKSB7CisgICAgICAgIGNhc2UgJ2InOiB7ICAvKiBiYWxhbmNlZCBzdHJpbmc/ICovCisgICAgICAgICAgcyA9IG1hdGNoYmFsYW5jZShtcywgcywgcCsyKTsKKyAgICAgICAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICBwKz00OyBnb3RvIGluaXQ7ICAvKiBlbHNlIHJldHVybiBtYXRjaChtcywgcywgcCs0KTsgKi8KKyAgICAgICAgfQorICAgICAgICBjYXNlICdmJzogeyAgLyogZnJvbnRpZXI/ICovCisgICAgICAgICAgY29uc3QgY2hhciAqZXA7IGNoYXIgcHJldmlvdXM7CisgICAgICAgICAgcCArPSAyOworICAgICAgICAgIGlmICgqcCAhPSAnWycpCisgICAgICAgICAgICBsdWFMX2Vycm9yKG1zLT5MLCAibWlzc2luZyAiIExVQV9RTCgiWyIpICIgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExVQV9RTCgiJSVmIikgIiBpbiBwYXR0ZXJuIik7CisgICAgICAgICAgZXAgPSBjbGFzc2VuZChtcywgcCk7ICAvKiBwb2ludHMgdG8gd2hhdCBpcyBuZXh0ICovCisgICAgICAgICAgcHJldmlvdXMgPSAocyA9PSBtcy0+c3JjX2luaXQpID8gJ1wwJyA6ICoocy0xKTsKKyAgICAgICAgICBpZiAobWF0Y2hicmFja2V0Y2xhc3ModWNoYXIocHJldmlvdXMpLCBwLCBlcC0xKSB8fAorICAgICAgICAgICAgICFtYXRjaGJyYWNrZXRjbGFzcyh1Y2hhcigqcyksIHAsIGVwLTEpKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICBwPWVwOyBnb3RvIGluaXQ7ICAvKiBlbHNlIHJldHVybiBtYXRjaChtcywgcywgZXApOyAqLworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICBpZiAoaXNkaWdpdCh1Y2hhcigqKHArMSkpKSkgeyAgLyogY2FwdHVyZSByZXN1bHRzICglMC0lOSk/ICovCisgICAgICAgICAgICBzID0gbWF0Y2hfY2FwdHVyZShtcywgcywgdWNoYXIoKihwKzEpKSk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHArPTI7IGdvdG8gaW5pdDsgIC8qIGVsc2UgcmV0dXJuIG1hdGNoKG1zLCBzLCBwKzIpICovCisgICAgICAgICAgfQorICAgICAgICAgIGdvdG8gZGZsdDsgIC8qIGNhc2UgZGVmYXVsdCAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNhc2UgJ1wwJzogeyAgLyogZW5kIG9mIHBhdHRlcm4gKi8KKyAgICAgIHJldHVybiBzOyAgLyogbWF0Y2ggc3VjY2VlZGVkICovCisgICAgfQorICAgIGNhc2UgJyQnOiB7CisgICAgICBpZiAoKihwKzEpID09ICdcMCcpICAvKiBpcyB0aGUgYCQnIHRoZSBsYXN0IGNoYXIgaW4gcGF0dGVybj8gKi8KKyAgICAgICAgcmV0dXJuIChzID09IG1zLT5zcmNfZW5kKSA/IHMgOiBOVUxMOyAgLyogY2hlY2sgZW5kIG9mIHN0cmluZyAqLworICAgICAgZWxzZSBnb3RvIGRmbHQ7CisgICAgfQorICAgIGRlZmF1bHQ6IGRmbHQ6IHsgIC8qIGl0IGlzIGEgcGF0dGVybiBpdGVtICovCisgICAgICBjb25zdCBjaGFyICplcCA9IGNsYXNzZW5kKG1zLCBwKTsgIC8qIHBvaW50cyB0byB3aGF0IGlzIG5leHQgKi8KKyAgICAgIGludCBtID0gczxtcy0+c3JjX2VuZCAmJiBzaW5nbGVtYXRjaCh1Y2hhcigqcyksIHAsIGVwKTsKKyAgICAgIHN3aXRjaCAoKmVwKSB7CisgICAgICAgIGNhc2UgJz8nOiB7ICAvKiBvcHRpb25hbCAqLworICAgICAgICAgIGNvbnN0IGNoYXIgKnJlczsKKyAgICAgICAgICBpZiAobSAmJiAoKHJlcz1tYXRjaChtcywgcysxLCBlcCsxKSkgIT0gTlVMTCkpCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgIHA9ZXArMTsgZ290byBpbml0OyAgLyogZWxzZSByZXR1cm4gbWF0Y2gobXMsIHMsIGVwKzEpOyAqLworICAgICAgICB9CisgICAgICAgIGNhc2UgJyonOiB7ICAvKiAwIG9yIG1vcmUgcmVwZXRpdGlvbnMgKi8KKyAgICAgICAgICByZXR1cm4gbWF4X2V4cGFuZChtcywgcywgcCwgZXApOworICAgICAgICB9CisgICAgICAgIGNhc2UgJysnOiB7ICAvKiAxIG9yIG1vcmUgcmVwZXRpdGlvbnMgKi8KKyAgICAgICAgICByZXR1cm4gKG0gPyBtYXhfZXhwYW5kKG1zLCBzKzEsIHAsIGVwKSA6IE5VTEwpOworICAgICAgICB9CisgICAgICAgIGNhc2UgJy0nOiB7ICAvKiAwIG9yIG1vcmUgcmVwZXRpdGlvbnMgKG1pbmltdW0pICovCisgICAgICAgICAgcmV0dXJuIG1pbl9leHBhbmQobXMsIHMsIHAsIGVwKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgaWYgKCFtKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICBzKys7IHA9ZXA7IGdvdG8gaW5pdDsgIC8qIGVsc2UgcmV0dXJuIG1hdGNoKG1zLCBzKzEsIGVwKTsgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmxtZW1maW5kIChjb25zdCBjaGFyICpzMSwgc2l6ZV90IGwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbDIpIHsKKyAgaWYgKGwyID09IDApIHJldHVybiBzMTsgIC8qIGVtcHR5IHN0cmluZ3MgYXJlIGV2ZXJ5d2hlcmUgKi8KKyAgZWxzZSBpZiAobDIgPiBsMSkgcmV0dXJuIE5VTEw7ICAvKiBhdm9pZHMgYSBuZWdhdGl2ZSBgbDEnICovCisgIGVsc2UgeworICAgIGNvbnN0IGNoYXIgKmluaXQ7ICAvKiB0byBzZWFyY2ggZm9yIGEgYCpzMicgaW5zaWRlIGBzMScgKi8KKyAgICBsMi0tOyAgLyogMXN0IGNoYXIgd2lsbCBiZSBjaGVja2VkIGJ5IGBtZW1jaHInICovCisgICAgbDEgPSBsMS1sMjsgIC8qIGBzMicgY2Fubm90IGJlIGZvdW5kIGFmdGVyIHRoYXQgKi8KKyAgICB3aGlsZSAobDEgPiAwICYmIChpbml0ID0gKGNvbnN0IGNoYXIgKiltZW1jaHIoczEsICpzMiwgbDEpKSAhPSBOVUxMKSB7CisgICAgICBpbml0Kys7ICAgLyogMXN0IGNoYXIgaXMgYWxyZWFkeSBjaGVja2VkICovCisgICAgICBpZiAobWVtY21wKGluaXQsIHMyKzEsIGwyKSA9PSAwKQorICAgICAgICByZXR1cm4gaW5pdC0xOworICAgICAgZWxzZSB7ICAvKiBjb3JyZWN0IGBsMScgYW5kIGBzMScgdG8gdHJ5IGFnYWluICovCisgICAgICAgIGwxIC09IGluaXQtczE7CisgICAgICAgIHMxID0gaW5pdDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7ICAvKiBub3QgZm91bmQgKi8KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHB1c2hfb25lY2FwdHVyZSAoTWF0Y2hTdGF0ZSAqbXMsIGludCBpLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmUpIHsKKyAgaWYgKGkgPj0gbXMtPmxldmVsKSB7CisgICAgaWYgKGkgPT0gMCkgIC8qIG1zLT5sZXZlbCA9PSAwLCB0b28gKi8KKyAgICAgIGx1YV9wdXNobHN0cmluZyhtcy0+TCwgcywgZSAtIHMpOyAgLyogYWRkIHdob2xlIG1hdGNoICovCisgICAgZWxzZQorICAgICAgbHVhTF9lcnJvcihtcy0+TCwgImludmFsaWQgY2FwdHVyZSBpbmRleCIpOworICB9CisgIGVsc2UgeworICAgIHB0cmRpZmZfdCBsID0gbXMtPmNhcHR1cmVbaV0ubGVuOworICAgIGlmIChsID09IENBUF9VTkZJTklTSEVEKSBsdWFMX2Vycm9yKG1zLT5MLCAidW5maW5pc2hlZCBjYXB0dXJlIik7CisgICAgaWYgKGwgPT0gQ0FQX1BPU0lUSU9OKQorICAgICAgbHVhX3B1c2hpbnRlZ2VyKG1zLT5MLCBtcy0+Y2FwdHVyZVtpXS5pbml0IC0gbXMtPnNyY19pbml0ICsgMSk7CisgICAgZWxzZQorICAgICAgbHVhX3B1c2hsc3RyaW5nKG1zLT5MLCBtcy0+Y2FwdHVyZVtpXS5pbml0LCBsKTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgcHVzaF9jYXB0dXJlcyAoTWF0Y2hTdGF0ZSAqbXMsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmUpIHsKKyAgaW50IGk7CisgIGludCBubGV2ZWxzID0gKG1zLT5sZXZlbCA9PSAwICYmIHMpID8gMSA6IG1zLT5sZXZlbDsKKyAgbHVhTF9jaGVja3N0YWNrKG1zLT5MLCBubGV2ZWxzLCAidG9vIG1hbnkgY2FwdHVyZXMiKTsKKyAgZm9yIChpID0gMDsgaSA8IG5sZXZlbHM7IGkrKykKKyAgICBwdXNoX29uZWNhcHR1cmUobXMsIGksIHMsIGUpOworICByZXR1cm4gbmxldmVsczsgIC8qIG51bWJlciBvZiBzdHJpbmdzIHB1c2hlZCAqLworfQorCisKK3N0YXRpYyBpbnQgc3RyX2ZpbmRfYXV4IChsdWFfU3RhdGUgKkwsIGludCBmaW5kKSB7CisgIHNpemVfdCBsMSwgbDI7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbDEpOworICBjb25zdCBjaGFyICpwID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMiwgJmwyKTsKKyAgcHRyZGlmZl90IGluaXQgPSBwb3NyZWxhdChsdWFMX29wdGludGVnZXIoTCwgMywgMSksIGwxKSAtIDE7CisgIGlmIChpbml0IDwgMCkgaW5pdCA9IDA7CisgIGVsc2UgaWYgKChzaXplX3QpKGluaXQpID4gbDEpIGluaXQgPSAocHRyZGlmZl90KWwxOworICBpZiAoZmluZCAmJiAobHVhX3RvYm9vbGVhbihMLCA0KSB8fCAgLyogZXhwbGljaXQgcmVxdWVzdD8gKi8KKyAgICAgIHN0cnBicmsocCwgU1BFQ0lBTFMpID09IE5VTEwpKSB7ICAvKiBvciBubyBzcGVjaWFsIGNoYXJhY3RlcnM/ICovCisgICAgLyogZG8gYSBwbGFpbiBzZWFyY2ggKi8KKyAgICBjb25zdCBjaGFyICpzMiA9IGxtZW1maW5kKHMraW5pdCwgbDEtaW5pdCwgcCwgbDIpOworICAgIGlmIChzMikgeworICAgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIHMyLXMrMSk7CisgICAgICBsdWFfcHVzaGludGVnZXIoTCwgczItcytsMik7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgTWF0Y2hTdGF0ZSBtczsKKyAgICBpbnQgYW5jaG9yID0gKCpwID09ICdeJykgPyAocCsrLCAxKSA6IDA7CisgICAgY29uc3QgY2hhciAqczE9cytpbml0OworICAgIG1zLkwgPSBMOworICAgIG1zLnNyY19pbml0ID0gczsKKyAgICBtcy5zcmNfZW5kID0gcytsMTsKKyAgICBkbyB7CisgICAgICBjb25zdCBjaGFyICpyZXM7CisgICAgICBtcy5sZXZlbCA9IDA7CisgICAgICBpZiAoKHJlcz1tYXRjaCgmbXMsIHMxLCBwKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZmluZCkgeworICAgICAgICAgIGx1YV9wdXNoaW50ZWdlcihMLCBzMS1zKzEpOyAgLyogc3RhcnQgKi8KKyAgICAgICAgICBsdWFfcHVzaGludGVnZXIoTCwgcmVzLXMpOyAgIC8qIGVuZCAqLworICAgICAgICAgIHJldHVybiBwdXNoX2NhcHR1cmVzKCZtcywgTlVMTCwgMCkgKyAyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gcHVzaF9jYXB0dXJlcygmbXMsIHMxLCByZXMpOworICAgICAgfQorICAgIH0gd2hpbGUgKHMxKysgPCBtcy5zcmNfZW5kICYmICFhbmNob3IpOworICB9CisgIGx1YV9wdXNobmlsKEwpOyAgLyogbm90IGZvdW5kICovCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc3RyX2ZpbmQgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gc3RyX2ZpbmRfYXV4KEwsIDEpOworfQorCisKK3N0YXRpYyBpbnQgc3RyX21hdGNoIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIHN0cl9maW5kX2F1eChMLCAwKTsKK30KKworCitzdGF0aWMgaW50IGdtYXRjaF9hdXggKGx1YV9TdGF0ZSAqTCkgeworICBNYXRjaFN0YXRlIG1zOworICBzaXplX3QgbHM7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFfdG9sc3RyaW5nKEwsIGx1YV91cHZhbHVlaW5kZXgoMSksICZscyk7CisgIGNvbnN0IGNoYXIgKnAgPSBsdWFfdG9zdHJpbmcoTCwgbHVhX3VwdmFsdWVpbmRleCgyKSk7CisgIGNvbnN0IGNoYXIgKnNyYzsKKyAgbXMuTCA9IEw7CisgIG1zLnNyY19pbml0ID0gczsKKyAgbXMuc3JjX2VuZCA9IHMrbHM7CisgIGZvciAoc3JjID0gcyArIChzaXplX3QpbHVhX3RvaW50ZWdlcihMLCBsdWFfdXB2YWx1ZWluZGV4KDMpKTsKKyAgICAgICBzcmMgPD0gbXMuc3JjX2VuZDsKKyAgICAgICBzcmMrKykgeworICAgIGNvbnN0IGNoYXIgKmU7CisgICAgbXMubGV2ZWwgPSAwOworICAgIGlmICgoZSA9IG1hdGNoKCZtcywgc3JjLCBwKSkgIT0gTlVMTCkgeworICAgICAgbHVhX0ludGVnZXIgbmV3c3RhcnQgPSBlLXM7CisgICAgICBpZiAoZSA9PSBzcmMpIG5ld3N0YXJ0Kys7ICAvKiBlbXB0eSBtYXRjaD8gZ28gYXQgbGVhc3Qgb25lIHBvc2l0aW9uICovCisgICAgICBsdWFfcHVzaGludGVnZXIoTCwgbmV3c3RhcnQpOworICAgICAgbHVhX3JlcGxhY2UoTCwgbHVhX3VwdmFsdWVpbmRleCgzKSk7CisgICAgICByZXR1cm4gcHVzaF9jYXB0dXJlcygmbXMsIHNyYywgZSk7CisgICAgfQorICB9CisgIHJldHVybiAwOyAgLyogbm90IGZvdW5kICovCit9CisKKworc3RhdGljIGludCBnbWF0Y2ggKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICBsdWFfc2V0dG9wKEwsIDIpOworICBsdWFfcHVzaGludGVnZXIoTCwgMCk7CisgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgZ21hdGNoX2F1eCwgMyk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZ2ZpbmRfbm9kZWYgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gbHVhTF9lcnJvcihMLCBMVUFfUUwoInN0cmluZy5nZmluZCIpICIgd2FzIHJlbmFtZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICBMVUFfUUwoInN0cmluZy5nbWF0Y2giKSk7Cit9CisKKworc3RhdGljIHZvaWQgYWRkX3MgKE1hdGNoU3RhdGUgKm1zLCBsdWFMX0J1ZmZlciAqYiwgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmUpIHsKKyAgc2l6ZV90IGwsIGk7CisgIGNvbnN0IGNoYXIgKm5ld3MgPSBsdWFfdG9sc3RyaW5nKG1zLT5MLCAzLCAmbCk7CisgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKKyAgICBpZiAobmV3c1tpXSAhPSBMX0VTQykKKyAgICAgIGx1YUxfYWRkY2hhcihiLCBuZXdzW2ldKTsKKyAgICBlbHNlIHsKKyAgICAgIGkrKzsgIC8qIHNraXAgRVNDICovCisgICAgICBpZiAoIWlzZGlnaXQodWNoYXIobmV3c1tpXSkpKQorICAgICAgICBsdWFMX2FkZGNoYXIoYiwgbmV3c1tpXSk7CisgICAgICBlbHNlIGlmIChuZXdzW2ldID09ICcwJykKKyAgICAgICAgICBsdWFMX2FkZGxzdHJpbmcoYiwgcywgZSAtIHMpOworICAgICAgZWxzZSB7CisgICAgICAgIHB1c2hfb25lY2FwdHVyZShtcywgbmV3c1tpXSAtICcxJywgcywgZSk7CisgICAgICAgIGx1YUxfYWRkdmFsdWUoYik7ICAvKiBhZGQgY2FwdHVyZSB0byBhY2N1bXVsYXRlZCByZXN1bHQgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBhZGRfdmFsdWUgKE1hdGNoU3RhdGUgKm1zLCBsdWFMX0J1ZmZlciAqYiwgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplKSB7CisgIGx1YV9TdGF0ZSAqTCA9IG1zLT5MOworICBzd2l0Y2ggKGx1YV90eXBlKEwsIDMpKSB7CisgICAgY2FzZSBMVUFfVE5VTUJFUjoKKyAgICBjYXNlIExVQV9UU1RSSU5HOiB7CisgICAgICBhZGRfcyhtcywgYiwgcywgZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgTFVBX1RGVU5DVElPTjogeworICAgICAgaW50IG47CisgICAgICBsdWFfcHVzaHZhbHVlKEwsIDMpOworICAgICAgbiA9IHB1c2hfY2FwdHVyZXMobXMsIHMsIGUpOworICAgICAgbHVhX2NhbGwoTCwgbiwgMSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfVFRBQkxFOiB7CisgICAgICBwdXNoX29uZWNhcHR1cmUobXMsIDAsIHMsIGUpOworICAgICAgbHVhX2dldHRhYmxlKEwsIDMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghbHVhX3RvYm9vbGVhbihMLCAtMSkpIHsgIC8qIG5pbCBvciBmYWxzZT8gKi8KKyAgICBsdWFfcG9wKEwsIDEpOworICAgIGx1YV9wdXNobHN0cmluZyhMLCBzLCBlIC0gcyk7ICAvKiBrZWVwIG9yaWdpbmFsIHRleHQgKi8KKyAgfQorICBlbHNlIGlmICghbHVhX2lzc3RyaW5nKEwsIC0xKSkKKyAgICBsdWFMX2Vycm9yKEwsICJpbnZhbGlkIHJlcGxhY2VtZW50IHZhbHVlIChhICVzKSIsIGx1YUxfdHlwZW5hbWUoTCwgLTEpKTsgCisgIGx1YUxfYWRkdmFsdWUoYik7ICAvKiBhZGQgcmVzdWx0IHRvIGFjY3VtdWxhdG9yICovCit9CisKKworc3RhdGljIGludCBzdHJfZ3N1YiAobHVhX1N0YXRlICpMKSB7CisgIHNpemVfdCBzcmNsOworICBjb25zdCBjaGFyICpzcmMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmc3JjbCk7CisgIGNvbnN0IGNoYXIgKnAgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICBpbnQgIHRyID0gbHVhX3R5cGUoTCwgMyk7CisgIGludCBtYXhfcyA9IGx1YUxfb3B0aW50KEwsIDQsIHNyY2wrMSk7CisgIGludCBhbmNob3IgPSAoKnAgPT0gJ14nKSA/IChwKyssIDEpIDogMDsKKyAgaW50IG4gPSAwOworICBNYXRjaFN0YXRlIG1zOworICBsdWFMX0J1ZmZlciBiOworICBsdWFMX2FyZ2NoZWNrKEwsIHRyID09IExVQV9UTlVNQkVSIHx8IHRyID09IExVQV9UU1RSSU5HIHx8CisgICAgICAgICAgICAgICAgICAgdHIgPT0gTFVBX1RGVU5DVElPTiB8fCB0ciA9PSBMVUFfVFRBQkxFLCAzLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcvZnVuY3Rpb24vdGFibGUgZXhwZWN0ZWQiKTsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIG1zLkwgPSBMOworICBtcy5zcmNfaW5pdCA9IHNyYzsKKyAgbXMuc3JjX2VuZCA9IHNyYytzcmNsOworICB3aGlsZSAobiA8IG1heF9zKSB7CisgICAgY29uc3QgY2hhciAqZTsKKyAgICBtcy5sZXZlbCA9IDA7CisgICAgZSA9IG1hdGNoKCZtcywgc3JjLCBwKTsKKyAgICBpZiAoZSkgeworICAgICAgbisrOworICAgICAgYWRkX3ZhbHVlKCZtcywgJmIsIHNyYywgZSk7CisgICAgfQorICAgIGlmIChlICYmIGU+c3JjKSAvKiBub24gZW1wdHkgbWF0Y2g/ICovCisgICAgICBzcmMgPSBlOyAgLyogc2tpcCBpdCAqLworICAgIGVsc2UgaWYgKHNyYyA8IG1zLnNyY19lbmQpCisgICAgICBsdWFMX2FkZGNoYXIoJmIsICpzcmMrKyk7CisgICAgZWxzZSBicmVhazsKKyAgICBpZiAoYW5jaG9yKSBicmVhazsKKyAgfQorICBsdWFMX2FkZGxzdHJpbmcoJmIsIHNyYywgbXMuc3JjX2VuZC1zcmMpOworICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICBsdWFfcHVzaGludGVnZXIoTCwgbik7ICAvKiBudW1iZXIgb2Ygc3Vic3RpdHV0aW9ucyAqLworICByZXR1cm4gMjsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKy8qIG1heGltdW0gc2l6ZSBvZiBlYWNoIGZvcm1hdHRlZCBpdGVtICg+IGxlbihmb3JtYXQoJyU5OS45OWYnLCAtMWUzMDgpKSkgKi8KKyNkZWZpbmUgTUFYX0lURU0JNTEyCisvKiB2YWxpZCBmbGFncyBpbiBhIGZvcm1hdCBzcGVjaWZpY2F0aW9uICovCisjZGVmaW5lIEZMQUdTCSItKyAjMCIKKy8qCisqKiBtYXhpbXVtIHNpemUgb2YgZWFjaCBmb3JtYXQgc3BlY2lmaWNhdGlvbiAoc3VjaCBhcyAnJS0wOTkuOTlkJykKKyoqICgrMTAgYWNjb3VudHMgZm9yICU5OS45OXggcGx1cyBtYXJnaW4gb2YgZXJyb3IpCisqLworI2RlZmluZSBNQVhfRk9STUFUCShzaXplb2YoRkxBR1MpICsgc2l6ZW9mKExVQV9JTlRGUk1MRU4pICsgMTApCisKKworc3RhdGljIHZvaWQgYWRkcXVvdGVkIChsdWFfU3RhdGUgKkwsIGx1YUxfQnVmZmVyICpiLCBpbnQgYXJnKSB7CisgIHNpemVfdCBsOworICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgYXJnLCAmbCk7CisgIGx1YUxfYWRkY2hhcihiLCAnIicpOworICB3aGlsZSAobC0tKSB7CisgICAgc3dpdGNoICgqcykgeworICAgICAgY2FzZSAnIic6IGNhc2UgJ1xcJzogY2FzZSAnXG4nOiB7CisgICAgICAgIGx1YUxfYWRkY2hhcihiLCAnXFwnKTsKKyAgICAgICAgbHVhTF9hZGRjaGFyKGIsICpzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdccic6IHsKKyAgICAgICAgbHVhTF9hZGRsc3RyaW5nKGIsICJcXHIiLCAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdcMCc6IHsKKyAgICAgICAgbHVhTF9hZGRsc3RyaW5nKGIsICJcXDAwMCIsIDQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgbHVhTF9hZGRjaGFyKGIsICpzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHMrKzsKKyAgfQorICBsdWFMX2FkZGNoYXIoYiwgJyInKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNjYW5mb3JtYXQgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqc3RyZnJtdCwgY2hhciAqZm9ybSkgeworICBjb25zdCBjaGFyICpwID0gc3RyZnJtdDsKKyAgd2hpbGUgKCpwICE9ICdcMCcgJiYgc3RyY2hyKEZMQUdTLCAqcCkgIT0gTlVMTCkgcCsrOyAgLyogc2tpcCBmbGFncyAqLworICBpZiAoKHNpemVfdCkocCAtIHN0cmZybXQpID49IHNpemVvZihGTEFHUykpCisgICAgbHVhTF9lcnJvcihMLCAiaW52YWxpZCBmb3JtYXQgKHJlcGVhdGVkIGZsYWdzKSIpOworICBpZiAoaXNkaWdpdCh1Y2hhcigqcCkpKSBwKys7ICAvKiBza2lwIHdpZHRoICovCisgIGlmIChpc2RpZ2l0KHVjaGFyKCpwKSkpIHArKzsgIC8qICgyIGRpZ2l0cyBhdCBtb3N0KSAqLworICBpZiAoKnAgPT0gJy4nKSB7CisgICAgcCsrOworICAgIGlmIChpc2RpZ2l0KHVjaGFyKCpwKSkpIHArKzsgIC8qIHNraXAgcHJlY2lzaW9uICovCisgICAgaWYgKGlzZGlnaXQodWNoYXIoKnApKSkgcCsrOyAgLyogKDIgZGlnaXRzIGF0IG1vc3QpICovCisgIH0KKyAgaWYgKGlzZGlnaXQodWNoYXIoKnApKSkKKyAgICBsdWFMX2Vycm9yKEwsICJpbnZhbGlkIGZvcm1hdCAod2lkdGggb3IgcHJlY2lzaW9uIHRvbyBsb25nKSIpOworICAqKGZvcm0rKykgPSAnJSc7CisgIHN0cm5jcHkoZm9ybSwgc3RyZnJtdCwgcCAtIHN0cmZybXQgKyAxKTsKKyAgZm9ybSArPSBwIC0gc3RyZnJtdCArIDE7CisgICpmb3JtID0gJ1wwJzsKKyAgcmV0dXJuIHA7Cit9CisKKworc3RhdGljIHZvaWQgYWRkaW50bGVuIChjaGFyICpmb3JtKSB7CisgIHNpemVfdCBsID0gc3RybGVuKGZvcm0pOworICBjaGFyIHNwZWMgPSBmb3JtW2wgLSAxXTsKKyAgc3RyY3B5KGZvcm0gKyBsIC0gMSwgTFVBX0lOVEZSTUxFTik7CisgIGZvcm1bbCArIHNpemVvZihMVUFfSU5URlJNTEVOKSAtIDJdID0gc3BlYzsKKyAgZm9ybVtsICsgc2l6ZW9mKExVQV9JTlRGUk1MRU4pIC0gMV0gPSAnXDAnOworfQorCisKK3N0YXRpYyBpbnQgc3RyX2Zvcm1hdCAobHVhX1N0YXRlICpMKSB7CisgIGludCBhcmcgPSAxOworICBzaXplX3Qgc2ZsOworICBjb25zdCBjaGFyICpzdHJmcm10ID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgYXJnLCAmc2ZsKTsKKyAgY29uc3QgY2hhciAqc3RyZnJtdF9lbmQgPSBzdHJmcm10K3NmbDsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIHdoaWxlIChzdHJmcm10IDwgc3RyZnJtdF9lbmQpIHsKKyAgICBpZiAoKnN0cmZybXQgIT0gTF9FU0MpCisgICAgICBsdWFMX2FkZGNoYXIoJmIsICpzdHJmcm10KyspOworICAgIGVsc2UgaWYgKCorK3N0cmZybXQgPT0gTF9FU0MpCisgICAgICBsdWFMX2FkZGNoYXIoJmIsICpzdHJmcm10KyspOyAgLyogJSUgKi8KKyAgICBlbHNlIHsgLyogZm9ybWF0IGl0ZW0gKi8KKyAgICAgIGNoYXIgZm9ybVtNQVhfRk9STUFUXTsgIC8qIHRvIHN0b3JlIHRoZSBmb3JtYXQgKGAlLi4uJykgKi8KKyAgICAgIGNoYXIgYnVmZltNQVhfSVRFTV07ICAvKiB0byBzdG9yZSB0aGUgZm9ybWF0dGVkIGl0ZW0gKi8KKyAgICAgIGFyZysrOworICAgICAgc3RyZnJtdCA9IHNjYW5mb3JtYXQoTCwgc3RyZnJtdCwgZm9ybSk7CisgICAgICBzd2l0Y2ggKCpzdHJmcm10KyspIHsKKyAgICAgICAgY2FzZSAnYyc6IHsKKyAgICAgICAgICBzcHJpbnRmKGJ1ZmYsIGZvcm0sIChpbnQpbHVhTF9jaGVja251bWJlcihMLCBhcmcpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICdkJzogIGNhc2UgJ2knOiB7CisgICAgICAgICAgYWRkaW50bGVuKGZvcm0pOworICAgICAgICAgIHNwcmludGYoYnVmZiwgZm9ybSwgKExVQV9JTlRGUk1fVClsdWFMX2NoZWNrbnVtYmVyKEwsIGFyZykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ28nOiAgY2FzZSAndSc6ICBjYXNlICd4JzogIGNhc2UgJ1gnOiB7CisgICAgICAgICAgYWRkaW50bGVuKGZvcm0pOworICAgICAgICAgIHNwcmludGYoYnVmZiwgZm9ybSwgKHVuc2lnbmVkIExVQV9JTlRGUk1fVClsdWFMX2NoZWNrbnVtYmVyKEwsIGFyZykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ2UnOiAgY2FzZSAnRSc6IGNhc2UgJ2YnOgorICAgICAgICBjYXNlICdnJzogY2FzZSAnRyc6IHsKKyAgICAgICAgICBzcHJpbnRmKGJ1ZmYsIGZvcm0sIChkb3VibGUpbHVhTF9jaGVja251bWJlcihMLCBhcmcpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICdxJzogeworICAgICAgICAgIGFkZHF1b3RlZChMLCAmYiwgYXJnKTsKKyAgICAgICAgICBjb250aW51ZTsgIC8qIHNraXAgdGhlICdhZGRzaXplJyBhdCB0aGUgZW5kICovCisgICAgICAgIH0KKyAgICAgICAgY2FzZSAncyc6IHsKKyAgICAgICAgICBzaXplX3QgbDsKKyAgICAgICAgICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgYXJnLCAmbCk7CisgICAgICAgICAgaWYgKCFzdHJjaHIoZm9ybSwgJy4nKSAmJiBsID49IDEwMCkgeworICAgICAgICAgICAgLyogbm8gcHJlY2lzaW9uIGFuZCBzdHJpbmcgaXMgdG9vIGxvbmcgdG8gYmUgZm9ybWF0dGVkOworICAgICAgICAgICAgICAga2VlcCBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGx1YV9wdXNodmFsdWUoTCwgYXJnKTsKKyAgICAgICAgICAgIGx1YUxfYWRkdmFsdWUoJmIpOworICAgICAgICAgICAgY29udGludWU7ICAvKiBza2lwIHRoZSBgYWRkc2l6ZScgYXQgdGhlIGVuZCAqLworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZiwgZm9ybSwgcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeyAgLyogYWxzbyB0cmVhdCBjYXNlcyBgcG5MbGgnICovCisgICAgICAgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImludmFsaWQgb3B0aW9uICIgTFVBX1FMKCIlJSVjIikgIiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFVBX1FMKCJmb3JtYXQiKSwgKihzdHJmcm10IC0gMSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmIsIGJ1ZmYsIHN0cmxlbihidWZmKSk7CisgICAgfQorICB9CisgIGx1YUxfcHVzaHJlc3VsdCgmYik7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBzdHJsaWJbXSA9IHsKKyAgeyJieXRlIiwgc3RyX2J5dGV9LAorICB7ImNoYXIiLCBzdHJfY2hhcn0sCisgIHsiZHVtcCIsIHN0cl9kdW1wfSwKKyAgeyJmaW5kIiwgc3RyX2ZpbmR9LAorICB7ImZvcm1hdCIsIHN0cl9mb3JtYXR9LAorICB7ImdmaW5kIiwgZ2ZpbmRfbm9kZWZ9LAorICB7ImdtYXRjaCIsIGdtYXRjaH0sCisgIHsiZ3N1YiIsIHN0cl9nc3VifSwKKyAgeyJsZW4iLCBzdHJfbGVufSwKKyAgeyJsb3dlciIsIHN0cl9sb3dlcn0sCisgIHsibWF0Y2giLCBzdHJfbWF0Y2h9LAorICB7InJlcCIsIHN0cl9yZXB9LAorICB7InJldmVyc2UiLCBzdHJfcmV2ZXJzZX0sCisgIHsic3ViIiwgc3RyX3N1Yn0sCisgIHsidXBwZXIiLCBzdHJfdXBwZXJ9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworc3RhdGljIHZvaWQgY3JlYXRlbWV0YXRhYmxlIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX2NyZWF0ZXRhYmxlKEwsIDAsIDEpOyAgLyogY3JlYXRlIG1ldGF0YWJsZSBmb3Igc3RyaW5ncyAqLworICBsdWFfcHVzaGxpdGVyYWwoTCwgIiIpOyAgLyogZHVtbXkgc3RyaW5nICovCisgIGx1YV9wdXNodmFsdWUoTCwgLTIpOworICBsdWFfc2V0bWV0YXRhYmxlKEwsIC0yKTsgIC8qIHNldCBzdHJpbmcgbWV0YXRhYmxlICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiBwb3AgZHVtbXkgc3RyaW5nICovCisgIGx1YV9wdXNodmFsdWUoTCwgLTIpOyAgLyogc3RyaW5nIGxpYnJhcnkuLi4gKi8KKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX19pbmRleCIpOyAgLyogLi4uaXMgdGhlIF9faW5kZXggbWV0YW1ldGhvZCAqLworICBsdWFfcG9wKEwsIDEpOyAgLyogcG9wIG1ldGF0YWJsZSAqLworfQorCisKKy8qCisqKiBPcGVuIHN0cmluZyBsaWJyYXJ5CisqLworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9zdHJpbmcgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX3JlZ2lzdGVyKEwsIExVQV9TVFJMSUJOQU1FLCBzdHJsaWIpOworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9HRklORCkKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCAiZ21hdGNoIik7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgImdmaW5kIik7CisjZW5kaWYKKyAgY3JlYXRlbWV0YXRhYmxlKEwpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sdGFibGUuYyBiL2x1YS01LjEuNC9zcmMvbHRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4NGY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHRhYmxlLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qCisqKiAkSWQ6IGx0YWJsZS5jLHYgMi4zMi4xLjIgMjAwNy8xMi8yOCAxNTozMjoyMyByb2JlcnRvIEV4cCAkCisqKiBMdWEgdGFibGVzIChoYXNoKQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworLyoKKyoqIEltcGxlbWVudGF0aW9uIG9mIHRhYmxlcyAoYWthIGFycmF5cywgb2JqZWN0cywgb3IgaGFzaCB0YWJsZXMpLgorKiogVGFibGVzIGtlZXAgaXRzIGVsZW1lbnRzIGluIHR3byBwYXJ0czogYW4gYXJyYXkgcGFydCBhbmQgYSBoYXNoIHBhcnQuCisqKiBOb24tbmVnYXRpdmUgaW50ZWdlciBrZXlzIGFyZSBhbGwgY2FuZGlkYXRlcyB0byBiZSBrZXB0IGluIHRoZSBhcnJheQorKiogcGFydC4gVGhlIGFjdHVhbCBzaXplIG9mIHRoZSBhcnJheSBpcyB0aGUgbGFyZ2VzdCBgbicgc3VjaCB0aGF0IGF0CisqKiBsZWFzdCBoYWxmIHRoZSBzbG90cyBiZXR3ZWVuIDAgYW5kIG4gYXJlIGluIHVzZS4KKyoqIEhhc2ggdXNlcyBhIG1peCBvZiBjaGFpbmVkIHNjYXR0ZXIgdGFibGUgd2l0aCBCcmVudCdzIHZhcmlhdGlvbi4KKyoqIEEgbWFpbiBpbnZhcmlhbnQgb2YgdGhlc2UgdGFibGVzIGlzIHRoYXQsIGlmIGFuIGVsZW1lbnQgaXMgbm90CisqKiBpbiBpdHMgbWFpbiBwb3NpdGlvbiAoaS5lLiB0aGUgYG9yaWdpbmFsJyBwb3NpdGlvbiB0aGF0IGl0cyBoYXNoIGdpdmVzCisqKiB0byBpdCksIHRoZW4gdGhlIGNvbGxpZGluZyBlbGVtZW50IGlzIGluIGl0cyBvd24gbWFpbiBwb3NpdGlvbi4KKyoqIEhlbmNlIGV2ZW4gd2hlbiB0aGUgbG9hZCBmYWN0b3IgcmVhY2hlcyAxMDAlLCBwZXJmb3JtYW5jZSByZW1haW5zIGdvb2QuCisqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGx0YWJsZV9jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxnYy5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisKKworLyoKKyoqIG1heCBzaXplIG9mIGFycmF5IHBhcnQgaXMgMl5NQVhCSVRTCisqLworI2lmIExVQUlfQklUU0lOVCA+IDI2CisjZGVmaW5lIE1BWEJJVFMJCTI2CisjZWxzZQorI2RlZmluZSBNQVhCSVRTCQkoTFVBSV9CSVRTSU5ULTIpCisjZW5kaWYKKworI2RlZmluZSBNQVhBU0laRQkoMSA8PCBNQVhCSVRTKQorCisKKyNkZWZpbmUgaGFzaHBvdzIodCxuKSAgICAgIChnbm9kZSh0LCBsbW9kKChuKSwgc2l6ZW5vZGUodCkpKSkKKyAgCisjZGVmaW5lIGhhc2hzdHIodCxzdHIpICBoYXNocG93Mih0LCAoc3RyKS0+dHN2Lmhhc2gpCisjZGVmaW5lIGhhc2hib29sZWFuKHQscCkgICAgICAgIGhhc2hwb3cyKHQsIHApCisKKworLyoKKyoqIGZvciBzb21lIHR5cGVzLCBpdCBpcyBiZXR0ZXIgdG8gYXZvaWQgbW9kdWx1cyBieSBwb3dlciBvZiAyLCBhcworKiogdGhleSB0ZW5kIHRvIGhhdmUgbWFueSAyIGZhY3RvcnMuCisqLworI2RlZmluZSBoYXNobW9kKHQsbikJKGdub2RlKHQsICgobikgJSAoKHNpemVub2RlKHQpLTEpfDEpKSkpCisKKworI2RlZmluZSBoYXNocG9pbnRlcih0LHApCWhhc2htb2QodCwgSW50UG9pbnQocCkpCisKKworLyoKKyoqIG51bWJlciBvZiBpbnRzIGluc2lkZSBhIGx1YV9OdW1iZXIKKyovCisjZGVmaW5lIG51bWludHMJCWNhc3RfaW50KHNpemVvZihsdWFfTnVtYmVyKS9zaXplb2YoaW50KSkKKworCisKKyNkZWZpbmUgZHVtbXlub2RlCQkoJmR1bW15bm9kZV8pCisKK3N0YXRpYyBjb25zdCBOb2RlIGR1bW15bm9kZV8gPSB7CisgIHt7TlVMTH0sIExVQV9UTklMfSwgIC8qIHZhbHVlICovCisgIHt7e05VTEx9LCBMVUFfVE5JTCwgTlVMTH19ICAvKiBrZXkgKi8KK307CisKKworLyoKKyoqIGhhc2ggZm9yIGx1YV9OdW1iZXJzCisqLworc3RhdGljIE5vZGUgKmhhc2hudW0gKGNvbnN0IFRhYmxlICp0LCBsdWFfTnVtYmVyIG4pIHsKKyAgdW5zaWduZWQgaW50IGFbbnVtaW50c107CisgIGludCBpOworICBpZiAobHVhaV9udW1lcShuLCAwKSkgIC8qIGF2b2lkIHByb2JsZW1zIHdpdGggLTAgKi8KKyAgICByZXR1cm4gZ25vZGUodCwgMCk7CisgIG1lbWNweShhLCAmbiwgc2l6ZW9mKGEpKTsKKyAgZm9yIChpID0gMTsgaSA8IG51bWludHM7IGkrKykgYVswXSArPSBhW2ldOworICByZXR1cm4gaGFzaG1vZCh0LCBhWzBdKTsKK30KKworCisKKy8qCisqKiByZXR1cm5zIHRoZSBgbWFpbicgcG9zaXRpb24gb2YgYW4gZWxlbWVudCBpbiBhIHRhYmxlICh0aGF0IGlzLCB0aGUgaW5kZXgKKyoqIG9mIGl0cyBoYXNoIHZhbHVlKQorKi8KK3N0YXRpYyBOb2RlICptYWlucG9zaXRpb24gKGNvbnN0IFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmtleSkgeworICBzd2l0Y2ggKHR0eXBlKGtleSkpIHsKKyAgICBjYXNlIExVQV9UTlVNQkVSOgorICAgICAgcmV0dXJuIGhhc2hudW0odCwgbnZhbHVlKGtleSkpOworICAgIGNhc2UgTFVBX1RTVFJJTkc6CisgICAgICByZXR1cm4gaGFzaHN0cih0LCByYXd0c3ZhbHVlKGtleSkpOworICAgIGNhc2UgTFVBX1RCT09MRUFOOgorICAgICAgcmV0dXJuIGhhc2hib29sZWFuKHQsIGJ2YWx1ZShrZXkpKTsKKyAgICBjYXNlIExVQV9UTElHSFRVU0VSREFUQToKKyAgICAgIHJldHVybiBoYXNocG9pbnRlcih0LCBwdmFsdWUoa2V5KSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBoYXNocG9pbnRlcih0LCBnY3ZhbHVlKGtleSkpOworICB9Cit9CisKKworLyoKKyoqIHJldHVybnMgdGhlIGluZGV4IGZvciBga2V5JyBpZiBga2V5JyBpcyBhbiBhcHByb3ByaWF0ZSBrZXkgdG8gbGl2ZSBpbgorKiogdGhlIGFycmF5IHBhcnQgb2YgdGhlIHRhYmxlLCAtMSBvdGhlcndpc2UuCisqLworc3RhdGljIGludCBhcnJheWluZGV4IChjb25zdCBUVmFsdWUgKmtleSkgeworICBpZiAodHRpc251bWJlcihrZXkpKSB7CisgICAgbHVhX051bWJlciBuID0gbnZhbHVlKGtleSk7CisgICAgaW50IGs7CisgICAgbHVhX251bWJlcjJpbnQoaywgbik7CisgICAgaWYgKGx1YWlfbnVtZXEoY2FzdF9udW0oayksIG4pKQorICAgICAgcmV0dXJuIGs7CisgIH0KKyAgcmV0dXJuIC0xOyAgLyogYGtleScgZGlkIG5vdCBtYXRjaCBzb21lIGNvbmRpdGlvbiAqLworfQorCisKKy8qCisqKiByZXR1cm5zIHRoZSBpbmRleCBvZiBhIGBrZXknIGZvciB0YWJsZSB0cmF2ZXJzYWxzLiBGaXJzdCBnb2VzIGFsbAorKiogZWxlbWVudHMgaW4gdGhlIGFycmF5IHBhcnQsIHRoZW4gZWxlbWVudHMgaW4gdGhlIGhhc2ggcGFydC4gVGhlCisqKiBiZWdpbm5pbmcgb2YgYSB0cmF2ZXJzYWwgaXMgc2lnbmFsbGVkIGJ5IC0xLgorKi8KK3N0YXRpYyBpbnQgZmluZGluZGV4IChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBTdGtJZCBrZXkpIHsKKyAgaW50IGk7CisgIGlmICh0dGlzbmlsKGtleSkpIHJldHVybiAtMTsgIC8qIGZpcnN0IGl0ZXJhdGlvbiAqLworICBpID0gYXJyYXlpbmRleChrZXkpOworICBpZiAoMCA8IGkgJiYgaSA8PSB0LT5zaXplYXJyYXkpICAvKiBpcyBga2V5JyBpbnNpZGUgYXJyYXkgcGFydD8gKi8KKyAgICByZXR1cm4gaS0xOyAgLyogeWVzOyB0aGF0J3MgdGhlIGluZGV4IChjb3JyZWN0ZWQgdG8gQykgKi8KKyAgZWxzZSB7CisgICAgTm9kZSAqbiA9IG1haW5wb3NpdGlvbih0LCBrZXkpOworICAgIGRvIHsgIC8qIGNoZWNrIHdoZXRoZXIgYGtleScgaXMgc29tZXdoZXJlIGluIHRoZSBjaGFpbiAqLworICAgICAgLyoga2V5IG1heSBiZSBkZWFkIGFscmVhZHksIGJ1dCBpdCBpcyBvayB0byB1c2UgaXQgaW4gYG5leHQnICovCisgICAgICBpZiAobHVhT19yYXdlcXVhbE9iaihrZXkydHZhbChuKSwga2V5KSB8fAorICAgICAgICAgICAgKHR0eXBlKGdrZXkobikpID09IExVQV9UREVBREtFWSAmJiBpc2NvbGxlY3RhYmxlKGtleSkgJiYKKyAgICAgICAgICAgICBnY3ZhbHVlKGdrZXkobikpID09IGdjdmFsdWUoa2V5KSkpIHsKKyAgICAgICAgaSA9IGNhc3RfaW50KG4gLSBnbm9kZSh0LCAwKSk7ICAvKiBrZXkgaW5kZXggaW4gaGFzaCB0YWJsZSAqLworICAgICAgICAvKiBoYXNoIGVsZW1lbnRzIGFyZSBudW1iZXJlZCBhZnRlciBhcnJheSBvbmVzICovCisgICAgICAgIHJldHVybiBpICsgdC0+c2l6ZWFycmF5OworICAgICAgfQorICAgICAgZWxzZSBuID0gZ25leHQobik7CisgICAgfSB3aGlsZSAobik7CisgICAgbHVhR19ydW5lcnJvcihMLCAiaW52YWxpZCBrZXkgdG8gIiBMVUFfUUwoIm5leHQiKSk7ICAvKiBrZXkgbm90IGZvdW5kICovCisgICAgcmV0dXJuIDA7ICAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLworICB9Cit9CisKKworaW50IGx1YUhfbmV4dCAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgU3RrSWQga2V5KSB7CisgIGludCBpID0gZmluZGluZGV4KEwsIHQsIGtleSk7ICAvKiBmaW5kIG9yaWdpbmFsIGVsZW1lbnQgKi8KKyAgZm9yIChpKys7IGkgPCB0LT5zaXplYXJyYXk7IGkrKykgeyAgLyogdHJ5IGZpcnN0IGFycmF5IHBhcnQgKi8KKyAgICBpZiAoIXR0aXNuaWwoJnQtPmFycmF5W2ldKSkgeyAgLyogYSBub24tbmlsIHZhbHVlPyAqLworICAgICAgc2V0bnZhbHVlKGtleSwgY2FzdF9udW0oaSsxKSk7CisgICAgICBzZXRvYmoycyhMLCBrZXkrMSwgJnQtPmFycmF5W2ldKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBmb3IgKGkgLT0gdC0+c2l6ZWFycmF5OyBpIDwgc2l6ZW5vZGUodCk7IGkrKykgeyAgLyogdGhlbiBoYXNoIHBhcnQgKi8KKyAgICBpZiAoIXR0aXNuaWwoZ3ZhbChnbm9kZSh0LCBpKSkpKSB7ICAvKiBhIG5vbi1uaWwgdmFsdWU/ICovCisgICAgICBzZXRvYmoycyhMLCBrZXksIGtleTJ0dmFsKGdub2RlKHQsIGkpKSk7CisgICAgICBzZXRvYmoycyhMLCBrZXkrMSwgZ3ZhbChnbm9kZSh0LCBpKSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOyAgLyogbm8gbW9yZSBlbGVtZW50cyAqLworfQorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogUmVoYXNoCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCitzdGF0aWMgaW50IGNvbXB1dGVzaXplcyAoaW50IG51bXNbXSwgaW50ICpuYXJyYXkpIHsKKyAgaW50IGk7CisgIGludCB0d290b2k7ICAvKiAyXmkgKi8KKyAgaW50IGEgPSAwOyAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHNtYWxsZXIgdGhhbiAyXmkgKi8KKyAgaW50IG5hID0gMDsgIC8qIG51bWJlciBvZiBlbGVtZW50cyB0byBnbyB0byBhcnJheSBwYXJ0ICovCisgIGludCBuID0gMDsgIC8qIG9wdGltYWwgc2l6ZSBmb3IgYXJyYXkgcGFydCAqLworICBmb3IgKGkgPSAwLCB0d290b2kgPSAxOyB0d290b2kvMiA8ICpuYXJyYXk7IGkrKywgdHdvdG9pICo9IDIpIHsKKyAgICBpZiAobnVtc1tpXSA+IDApIHsKKyAgICAgIGEgKz0gbnVtc1tpXTsKKyAgICAgIGlmIChhID4gdHdvdG9pLzIpIHsgIC8qIG1vcmUgdGhhbiBoYWxmIGVsZW1lbnRzIHByZXNlbnQ/ICovCisgICAgICAgIG4gPSB0d290b2k7ICAvKiBvcHRpbWFsIHNpemUgKHRpbGwgbm93KSAqLworICAgICAgICBuYSA9IGE7ICAvKiBhbGwgZWxlbWVudHMgc21hbGxlciB0aGFuIG4gd2lsbCBnbyB0byBhcnJheSBwYXJ0ICovCisgICAgICB9CisgICAgfQorICAgIGlmIChhID09ICpuYXJyYXkpIGJyZWFrOyAgLyogYWxsIGVsZW1lbnRzIGFscmVhZHkgY291bnRlZCAqLworICB9CisgICpuYXJyYXkgPSBuOworICBsdWFfYXNzZXJ0KCpuYXJyYXkvMiA8PSBuYSAmJiBuYSA8PSAqbmFycmF5KTsKKyAgcmV0dXJuIG5hOworfQorCisKK3N0YXRpYyBpbnQgY291bnRpbnQgKGNvbnN0IFRWYWx1ZSAqa2V5LCBpbnQgKm51bXMpIHsKKyAgaW50IGsgPSBhcnJheWluZGV4KGtleSk7CisgIGlmICgwIDwgayAmJiBrIDw9IE1BWEFTSVpFKSB7ICAvKiBpcyBga2V5JyBhbiBhcHByb3ByaWF0ZSBhcnJheSBpbmRleD8gKi8KKyAgICBudW1zW2NlaWxsb2cyKGspXSsrOyAgLyogY291bnQgYXMgc3VjaCAqLworICAgIHJldHVybiAxOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG51bXVzZWFycmF5IChjb25zdCBUYWJsZSAqdCwgaW50ICpudW1zKSB7CisgIGludCBsZzsKKyAgaW50IHR0bGc7ICAvKiAyXmxnICovCisgIGludCBhdXNlID0gMDsgIC8qIHN1bW1hdGlvbiBvZiBgbnVtcycgKi8KKyAgaW50IGkgPSAxOyAgLyogY291bnQgdG8gdHJhdmVyc2UgYWxsIGFycmF5IGtleXMgKi8KKyAgZm9yIChsZz0wLCB0dGxnPTE7IGxnPD1NQVhCSVRTOyBsZysrLCB0dGxnKj0yKSB7ICAvKiBmb3IgZWFjaCBzbGljZSAqLworICAgIGludCBsYyA9IDA7ICAvKiBjb3VudGVyICovCisgICAgaW50IGxpbSA9IHR0bGc7CisgICAgaWYgKGxpbSA+IHQtPnNpemVhcnJheSkgeworICAgICAgbGltID0gdC0+c2l6ZWFycmF5OyAgLyogYWRqdXN0IHVwcGVyIGxpbWl0ICovCisgICAgICBpZiAoaSA+IGxpbSkKKyAgICAgICAgYnJlYWs7ICAvKiBubyBtb3JlIGVsZW1lbnRzIHRvIGNvdW50ICovCisgICAgfQorICAgIC8qIGNvdW50IGVsZW1lbnRzIGluIHJhbmdlICgyXihsZy0xKSwgMl5sZ10gKi8KKyAgICBmb3IgKDsgaSA8PSBsaW07IGkrKykgeworICAgICAgaWYgKCF0dGlzbmlsKCZ0LT5hcnJheVtpLTFdKSkKKyAgICAgICAgbGMrKzsKKyAgICB9CisgICAgbnVtc1tsZ10gKz0gbGM7CisgICAgYXVzZSArPSBsYzsKKyAgfQorICByZXR1cm4gYXVzZTsKK30KKworCitzdGF0aWMgaW50IG51bXVzZWhhc2ggKGNvbnN0IFRhYmxlICp0LCBpbnQgKm51bXMsIGludCAqcG5hc2l6ZSkgeworICBpbnQgdG90YWx1c2UgPSAwOyAgLyogdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzICovCisgIGludCBhdXNlID0gMDsgIC8qIHN1bW1hdGlvbiBvZiBgbnVtcycgKi8KKyAgaW50IGkgPSBzaXplbm9kZSh0KTsKKyAgd2hpbGUgKGktLSkgeworICAgIE5vZGUgKm4gPSAmdC0+bm9kZVtpXTsKKyAgICBpZiAoIXR0aXNuaWwoZ3ZhbChuKSkpIHsKKyAgICAgIGF1c2UgKz0gY291bnRpbnQoa2V5MnR2YWwobiksIG51bXMpOworICAgICAgdG90YWx1c2UrKzsKKyAgICB9CisgIH0KKyAgKnBuYXNpemUgKz0gYXVzZTsKKyAgcmV0dXJuIHRvdGFsdXNlOworfQorCisKK3N0YXRpYyB2b2lkIHNldGFycmF5dmVjdG9yIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIHQtPmFycmF5LCB0LT5zaXplYXJyYXksIHNpemUsIFRWYWx1ZSk7CisgIGZvciAoaT10LT5zaXplYXJyYXk7IGk8c2l6ZTsgaSsrKQorICAgICBzZXRuaWx2YWx1ZSgmdC0+YXJyYXlbaV0pOworICB0LT5zaXplYXJyYXkgPSBzaXplOworfQorCisKK3N0YXRpYyB2b2lkIHNldG5vZGV2ZWN0b3IgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIGludCBzaXplKSB7CisgIGludCBsc2l6ZTsKKyAgaWYgKHNpemUgPT0gMCkgeyAgLyogbm8gZWxlbWVudHMgdG8gaGFzaCBwYXJ0PyAqLworICAgIHQtPm5vZGUgPSBjYXN0KE5vZGUgKiwgZHVtbXlub2RlKTsgIC8qIHVzZSBjb21tb24gYGR1bW15bm9kZScgKi8KKyAgICBsc2l6ZSA9IDA7CisgIH0KKyAgZWxzZSB7CisgICAgaW50IGk7CisgICAgbHNpemUgPSBjZWlsbG9nMihzaXplKTsKKyAgICBpZiAobHNpemUgPiBNQVhCSVRTKQorICAgICAgbHVhR19ydW5lcnJvcihMLCAidGFibGUgb3ZlcmZsb3ciKTsKKyAgICBzaXplID0gdHdvdG8obHNpemUpOworICAgIHQtPm5vZGUgPSBsdWFNX25ld3ZlY3RvcihMLCBzaXplLCBOb2RlKTsKKyAgICBmb3IgKGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgIE5vZGUgKm4gPSBnbm9kZSh0LCBpKTsKKyAgICAgIGduZXh0KG4pID0gTlVMTDsKKyAgICAgIHNldG5pbHZhbHVlKGdrZXkobikpOworICAgICAgc2V0bmlsdmFsdWUoZ3ZhbChuKSk7CisgICAgfQorICB9CisgIHQtPmxzaXplbm9kZSA9IGNhc3RfYnl0ZShsc2l6ZSk7CisgIHQtPmxhc3RmcmVlID0gZ25vZGUodCwgc2l6ZSk7ICAvKiBhbGwgcG9zaXRpb25zIGFyZSBmcmVlICovCit9CisKKworc3RhdGljIHZvaWQgcmVzaXplIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBpbnQgbmFzaXplLCBpbnQgbmhzaXplKSB7CisgIGludCBpOworICBpbnQgb2xkYXNpemUgPSB0LT5zaXplYXJyYXk7CisgIGludCBvbGRoc2l6ZSA9IHQtPmxzaXplbm9kZTsKKyAgTm9kZSAqbm9sZCA9IHQtPm5vZGU7ICAvKiBzYXZlIG9sZCBoYXNoIC4uLiAqLworICBpZiAobmFzaXplID4gb2xkYXNpemUpICAvKiBhcnJheSBwYXJ0IG11c3QgZ3Jvdz8gKi8KKyAgICBzZXRhcnJheXZlY3RvcihMLCB0LCBuYXNpemUpOworICAvKiBjcmVhdGUgbmV3IGhhc2ggcGFydCB3aXRoIGFwcHJvcHJpYXRlIHNpemUgKi8KKyAgc2V0bm9kZXZlY3RvcihMLCB0LCBuaHNpemUpOyAgCisgIGlmIChuYXNpemUgPCBvbGRhc2l6ZSkgeyAgLyogYXJyYXkgcGFydCBtdXN0IHNocmluaz8gKi8KKyAgICB0LT5zaXplYXJyYXkgPSBuYXNpemU7CisgICAgLyogcmUtaW5zZXJ0IGVsZW1lbnRzIGZyb20gdmFuaXNoaW5nIHNsaWNlICovCisgICAgZm9yIChpPW5hc2l6ZTsgaTxvbGRhc2l6ZTsgaSsrKSB7CisgICAgICBpZiAoIXR0aXNuaWwoJnQtPmFycmF5W2ldKSkKKyAgICAgICAgc2V0b2JqdDJ0KEwsIGx1YUhfc2V0bnVtKEwsIHQsIGkrMSksICZ0LT5hcnJheVtpXSk7CisgICAgfQorICAgIC8qIHNocmluayBhcnJheSAqLworICAgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCB0LT5hcnJheSwgb2xkYXNpemUsIG5hc2l6ZSwgVFZhbHVlKTsKKyAgfQorICAvKiByZS1pbnNlcnQgZWxlbWVudHMgZnJvbSBoYXNoIHBhcnQgKi8KKyAgZm9yIChpID0gdHdvdG8ob2xkaHNpemUpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBOb2RlICpvbGQgPSBub2xkK2k7CisgICAgaWYgKCF0dGlzbmlsKGd2YWwob2xkKSkpCisgICAgICBzZXRvYmp0MnQoTCwgbHVhSF9zZXQoTCwgdCwga2V5MnR2YWwob2xkKSksIGd2YWwob2xkKSk7CisgIH0KKyAgaWYgKG5vbGQgIT0gZHVtbXlub2RlKQorICAgIGx1YU1fZnJlZWFycmF5KEwsIG5vbGQsIHR3b3RvKG9sZGhzaXplKSwgTm9kZSk7ICAvKiBmcmVlIG9sZCBhcnJheSAqLworfQorCisKK3ZvaWQgbHVhSF9yZXNpemVhcnJheSAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgaW50IG5hc2l6ZSkgeworICBpbnQgbnNpemUgPSAodC0+bm9kZSA9PSBkdW1teW5vZGUpID8gMCA6IHNpemVub2RlKHQpOworICByZXNpemUoTCwgdCwgbmFzaXplLCBuc2l6ZSk7Cit9CisKKworc3RhdGljIHZvaWQgcmVoYXNoIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmVrKSB7CisgIGludCBuYXNpemUsIG5hOworICBpbnQgbnVtc1tNQVhCSVRTKzFdOyAgLyogbnVtc1tpXSA9IG51bWJlciBvZiBrZXlzIGJldHdlZW4gMl4oaS0xKSBhbmQgMl5pICovCisgIGludCBpOworICBpbnQgdG90YWx1c2U7CisgIGZvciAoaT0wOyBpPD1NQVhCSVRTOyBpKyspIG51bXNbaV0gPSAwOyAgLyogcmVzZXQgY291bnRzICovCisgIG5hc2l6ZSA9IG51bXVzZWFycmF5KHQsIG51bXMpOyAgLyogY291bnQga2V5cyBpbiBhcnJheSBwYXJ0ICovCisgIHRvdGFsdXNlID0gbmFzaXplOyAgLyogYWxsIHRob3NlIGtleXMgYXJlIGludGVnZXIga2V5cyAqLworICB0b3RhbHVzZSArPSBudW11c2VoYXNoKHQsIG51bXMsICZuYXNpemUpOyAgLyogY291bnQga2V5cyBpbiBoYXNoIHBhcnQgKi8KKyAgLyogY291bnQgZXh0cmEga2V5ICovCisgIG5hc2l6ZSArPSBjb3VudGludChlaywgbnVtcyk7CisgIHRvdGFsdXNlKys7CisgIC8qIGNvbXB1dGUgbmV3IHNpemUgZm9yIGFycmF5IHBhcnQgKi8KKyAgbmEgPSBjb21wdXRlc2l6ZXMobnVtcywgJm5hc2l6ZSk7CisgIC8qIHJlc2l6ZSB0aGUgdGFibGUgdG8gbmV3IGNvbXB1dGVkIHNpemVzICovCisgIHJlc2l6ZShMLCB0LCBuYXNpemUsIHRvdGFsdXNlIC0gbmEpOworfQorCisKKworLyoKKyoqIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKK1RhYmxlICpsdWFIX25ldyAobHVhX1N0YXRlICpMLCBpbnQgbmFycmF5LCBpbnQgbmhhc2gpIHsKKyAgVGFibGUgKnQgPSBsdWFNX25ldyhMLCBUYWJsZSk7CisgIGx1YUNfbGluayhMLCBvYmoyZ2NvKHQpLCBMVUFfVFRBQkxFKTsKKyAgdC0+bWV0YXRhYmxlID0gTlVMTDsKKyAgdC0+ZmxhZ3MgPSBjYXN0X2J5dGUofjApOworICAvKiB0ZW1wb3JhcnkgdmFsdWVzIChrZXB0IG9ubHkgaWYgc29tZSBtYWxsb2MgZmFpbHMpICovCisgIHQtPmFycmF5ID0gTlVMTDsKKyAgdC0+c2l6ZWFycmF5ID0gMDsKKyAgdC0+bHNpemVub2RlID0gMDsKKyAgdC0+bm9kZSA9IGNhc3QoTm9kZSAqLCBkdW1teW5vZGUpOworICBzZXRhcnJheXZlY3RvcihMLCB0LCBuYXJyYXkpOworICBzZXRub2RldmVjdG9yKEwsIHQsIG5oYXNoKTsKKyAgcmV0dXJuIHQ7Cit9CisKKwordm9pZCBsdWFIX2ZyZWUgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQpIHsKKyAgaWYgKHQtPm5vZGUgIT0gZHVtbXlub2RlKQorICAgIGx1YU1fZnJlZWFycmF5KEwsIHQtPm5vZGUsIHNpemVub2RlKHQpLCBOb2RlKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgdC0+YXJyYXksIHQtPnNpemVhcnJheSwgVFZhbHVlKTsKKyAgbHVhTV9mcmVlKEwsIHQpOworfQorCisKK3N0YXRpYyBOb2RlICpnZXRmcmVlcG9zIChUYWJsZSAqdCkgeworICB3aGlsZSAodC0+bGFzdGZyZWUtLSA+IHQtPm5vZGUpIHsKKyAgICBpZiAodHRpc25pbChna2V5KHQtPmxhc3RmcmVlKSkpCisgICAgICByZXR1cm4gdC0+bGFzdGZyZWU7CisgIH0KKyAgcmV0dXJuIE5VTEw7ICAvKiBjb3VsZCBub3QgZmluZCBhIGZyZWUgcGxhY2UgKi8KK30KKworCisKKy8qCisqKiBpbnNlcnRzIGEgbmV3IGtleSBpbnRvIGEgaGFzaCB0YWJsZTsgZmlyc3QsIGNoZWNrIHdoZXRoZXIga2V5J3MgbWFpbiAKKyoqIHBvc2l0aW9uIGlzIGZyZWUuIElmIG5vdCwgY2hlY2sgd2hldGhlciBjb2xsaWRpbmcgbm9kZSBpcyBpbiBpdHMgbWFpbiAKKyoqIHBvc2l0aW9uIG9yIG5vdDogaWYgaXQgaXMgbm90LCBtb3ZlIGNvbGxpZGluZyBub2RlIHRvIGFuIGVtcHR5IHBsYWNlIGFuZCAKKyoqIHB1dCBuZXcga2V5IGluIGl0cyBtYWluIHBvc2l0aW9uOyBvdGhlcndpc2UgKGNvbGxpZGluZyBub2RlIGlzIGluIGl0cyBtYWluIAorKiogcG9zaXRpb24pLCBuZXcga2V5IGdvZXMgdG8gYW4gZW1wdHkgcG9zaXRpb24uIAorKi8KK3N0YXRpYyBUVmFsdWUgKm5ld2tleSAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpIHsKKyAgTm9kZSAqbXAgPSBtYWlucG9zaXRpb24odCwga2V5KTsKKyAgaWYgKCF0dGlzbmlsKGd2YWwobXApKSB8fCBtcCA9PSBkdW1teW5vZGUpIHsKKyAgICBOb2RlICpvdGhlcm47CisgICAgTm9kZSAqbiA9IGdldGZyZWVwb3ModCk7ICAvKiBnZXQgYSBmcmVlIHBsYWNlICovCisgICAgaWYgKG4gPT0gTlVMTCkgeyAgLyogY2Fubm90IGZpbmQgYSBmcmVlIHBsYWNlPyAqLworICAgICAgcmVoYXNoKEwsIHQsIGtleSk7ICAvKiBncm93IHRhYmxlICovCisgICAgICByZXR1cm4gbHVhSF9zZXQoTCwgdCwga2V5KTsgIC8qIHJlLWluc2VydCBrZXkgaW50byBncm93biB0YWJsZSAqLworICAgIH0KKyAgICBsdWFfYXNzZXJ0KG4gIT0gZHVtbXlub2RlKTsKKyAgICBvdGhlcm4gPSBtYWlucG9zaXRpb24odCwga2V5MnR2YWwobXApKTsKKyAgICBpZiAob3RoZXJuICE9IG1wKSB7ICAvKiBpcyBjb2xsaWRpbmcgbm9kZSBvdXQgb2YgaXRzIG1haW4gcG9zaXRpb24/ICovCisgICAgICAvKiB5ZXM7IG1vdmUgY29sbGlkaW5nIG5vZGUgaW50byBmcmVlIHBvc2l0aW9uICovCisgICAgICB3aGlsZSAoZ25leHQob3RoZXJuKSAhPSBtcCkgb3RoZXJuID0gZ25leHQob3RoZXJuKTsgIC8qIGZpbmQgcHJldmlvdXMgKi8KKyAgICAgIGduZXh0KG90aGVybikgPSBuOyAgLyogcmVkbyB0aGUgY2hhaW4gd2l0aCBgbicgaW4gcGxhY2Ugb2YgYG1wJyAqLworICAgICAgKm4gPSAqbXA7ICAvKiBjb3B5IGNvbGxpZGluZyBub2RlIGludG8gZnJlZSBwb3MuIChtcC0+bmV4dCBhbHNvIGdvZXMpICovCisgICAgICBnbmV4dChtcCkgPSBOVUxMOyAgLyogbm93IGBtcCcgaXMgZnJlZSAqLworICAgICAgc2V0bmlsdmFsdWUoZ3ZhbChtcCkpOworICAgIH0KKyAgICBlbHNlIHsgIC8qIGNvbGxpZGluZyBub2RlIGlzIGluIGl0cyBvd24gbWFpbiBwb3NpdGlvbiAqLworICAgICAgLyogbmV3IG5vZGUgd2lsbCBnbyBpbnRvIGZyZWUgcG9zaXRpb24gKi8KKyAgICAgIGduZXh0KG4pID0gZ25leHQobXApOyAgLyogY2hhaW4gbmV3IHBvc2l0aW9uICovCisgICAgICBnbmV4dChtcCkgPSBuOworICAgICAgbXAgPSBuOworICAgIH0KKyAgfQorICBna2V5KG1wKS0+dmFsdWUgPSBrZXktPnZhbHVlOyBna2V5KG1wKS0+dHQgPSBrZXktPnR0OworICBsdWFDX2JhcnJpZXJ0KEwsIHQsIGtleSk7CisgIGx1YV9hc3NlcnQodHRpc25pbChndmFsKG1wKSkpOworICByZXR1cm4gZ3ZhbChtcCk7Cit9CisKKworLyoKKyoqIHNlYXJjaCBmdW5jdGlvbiBmb3IgaW50ZWdlcnMKKyovCitjb25zdCBUVmFsdWUgKmx1YUhfZ2V0bnVtIChUYWJsZSAqdCwgaW50IGtleSkgeworICAvKiAoMSA8PSBrZXkgJiYga2V5IDw9IHQtPnNpemVhcnJheSkgKi8KKyAgaWYgKGNhc3QodW5zaWduZWQgaW50LCBrZXktMSkgPCBjYXN0KHVuc2lnbmVkIGludCwgdC0+c2l6ZWFycmF5KSkKKyAgICByZXR1cm4gJnQtPmFycmF5W2tleS0xXTsKKyAgZWxzZSB7CisgICAgbHVhX051bWJlciBuayA9IGNhc3RfbnVtKGtleSk7CisgICAgTm9kZSAqbiA9IGhhc2hudW0odCwgbmspOworICAgIGRvIHsgIC8qIGNoZWNrIHdoZXRoZXIgYGtleScgaXMgc29tZXdoZXJlIGluIHRoZSBjaGFpbiAqLworICAgICAgaWYgKHR0aXNudW1iZXIoZ2tleShuKSkgJiYgbHVhaV9udW1lcShudmFsdWUoZ2tleShuKSksIG5rKSkKKyAgICAgICAgcmV0dXJuIGd2YWwobik7ICAvKiB0aGF0J3MgaXQgKi8KKyAgICAgIGVsc2UgbiA9IGduZXh0KG4pOworICAgIH0gd2hpbGUgKG4pOworICAgIHJldHVybiBsdWFPX25pbG9iamVjdDsKKyAgfQorfQorCisKKy8qCisqKiBzZWFyY2ggZnVuY3Rpb24gZm9yIHN0cmluZ3MKKyovCitjb25zdCBUVmFsdWUgKmx1YUhfZ2V0c3RyIChUYWJsZSAqdCwgVFN0cmluZyAqa2V5KSB7CisgIE5vZGUgKm4gPSBoYXNoc3RyKHQsIGtleSk7CisgIGRvIHsgIC8qIGNoZWNrIHdoZXRoZXIgYGtleScgaXMgc29tZXdoZXJlIGluIHRoZSBjaGFpbiAqLworICAgIGlmICh0dGlzc3RyaW5nKGdrZXkobikpICYmIHJhd3RzdmFsdWUoZ2tleShuKSkgPT0ga2V5KQorICAgICAgcmV0dXJuIGd2YWwobik7ICAvKiB0aGF0J3MgaXQgKi8KKyAgICBlbHNlIG4gPSBnbmV4dChuKTsKKyAgfSB3aGlsZSAobik7CisgIHJldHVybiBsdWFPX25pbG9iamVjdDsKK30KKworCisvKgorKiogbWFpbiBzZWFyY2ggZnVuY3Rpb24KKyovCitjb25zdCBUVmFsdWUgKmx1YUhfZ2V0IChUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpIHsKKyAgc3dpdGNoICh0dHlwZShrZXkpKSB7CisgICAgY2FzZSBMVUFfVE5JTDogcmV0dXJuIGx1YU9fbmlsb2JqZWN0OworICAgIGNhc2UgTFVBX1RTVFJJTkc6IHJldHVybiBsdWFIX2dldHN0cih0LCByYXd0c3ZhbHVlKGtleSkpOworICAgIGNhc2UgTFVBX1ROVU1CRVI6IHsKKyAgICAgIGludCBrOworICAgICAgbHVhX051bWJlciBuID0gbnZhbHVlKGtleSk7CisgICAgICBsdWFfbnVtYmVyMmludChrLCBuKTsKKyAgICAgIGlmIChsdWFpX251bWVxKGNhc3RfbnVtKGspLCBudmFsdWUoa2V5KSkpIC8qIGluZGV4IGlzIGludD8gKi8KKyAgICAgICAgcmV0dXJuIGx1YUhfZ2V0bnVtKHQsIGspOyAgLyogdXNlIHNwZWNpYWxpemVkIHZlcnNpb24gKi8KKyAgICAgIC8qIGVsc2UgZ28gdGhyb3VnaCAqLworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBOb2RlICpuID0gbWFpbnBvc2l0aW9uKHQsIGtleSk7CisgICAgICBkbyB7ICAvKiBjaGVjayB3aGV0aGVyIGBrZXknIGlzIHNvbWV3aGVyZSBpbiB0aGUgY2hhaW4gKi8KKyAgICAgICAgaWYgKGx1YU9fcmF3ZXF1YWxPYmooa2V5MnR2YWwobiksIGtleSkpCisgICAgICAgICAgcmV0dXJuIGd2YWwobik7ICAvKiB0aGF0J3MgaXQgKi8KKyAgICAgICAgZWxzZSBuID0gZ25leHQobik7CisgICAgICB9IHdoaWxlIChuKTsKKyAgICAgIHJldHVybiBsdWFPX25pbG9iamVjdDsKKyAgICB9CisgIH0KK30KKworCitUVmFsdWUgKmx1YUhfc2V0IChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmtleSkgeworICBjb25zdCBUVmFsdWUgKnAgPSBsdWFIX2dldCh0LCBrZXkpOworICB0LT5mbGFncyA9IDA7CisgIGlmIChwICE9IGx1YU9fbmlsb2JqZWN0KQorICAgIHJldHVybiBjYXN0KFRWYWx1ZSAqLCBwKTsKKyAgZWxzZSB7CisgICAgaWYgKHR0aXNuaWwoa2V5KSkgbHVhR19ydW5lcnJvcihMLCAidGFibGUgaW5kZXggaXMgbmlsIik7CisgICAgZWxzZSBpZiAodHRpc251bWJlcihrZXkpICYmIGx1YWlfbnVtaXNuYW4obnZhbHVlKGtleSkpKQorICAgICAgbHVhR19ydW5lcnJvcihMLCAidGFibGUgaW5kZXggaXMgTmFOIik7CisgICAgcmV0dXJuIG5ld2tleShMLCB0LCBrZXkpOworICB9Cit9CisKKworVFZhbHVlICpsdWFIX3NldG51bSAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgaW50IGtleSkgeworICBjb25zdCBUVmFsdWUgKnAgPSBsdWFIX2dldG51bSh0LCBrZXkpOworICBpZiAocCAhPSBsdWFPX25pbG9iamVjdCkKKyAgICByZXR1cm4gY2FzdChUVmFsdWUgKiwgcCk7CisgIGVsc2UgeworICAgIFRWYWx1ZSBrOworICAgIHNldG52YWx1ZSgmaywgY2FzdF9udW0oa2V5KSk7CisgICAgcmV0dXJuIG5ld2tleShMLCB0LCAmayk7CisgIH0KK30KKworCitUVmFsdWUgKmx1YUhfc2V0c3RyIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBUU3RyaW5nICprZXkpIHsKKyAgY29uc3QgVFZhbHVlICpwID0gbHVhSF9nZXRzdHIodCwga2V5KTsKKyAgaWYgKHAgIT0gbHVhT19uaWxvYmplY3QpCisgICAgcmV0dXJuIGNhc3QoVFZhbHVlICosIHApOworICBlbHNlIHsKKyAgICBUVmFsdWUgazsKKyAgICBzZXRzdmFsdWUoTCwgJmssIGtleSk7CisgICAgcmV0dXJuIG5ld2tleShMLCB0LCAmayk7CisgIH0KK30KKworCitzdGF0aWMgaW50IHVuYm91bmRfc2VhcmNoIChUYWJsZSAqdCwgdW5zaWduZWQgaW50IGopIHsKKyAgdW5zaWduZWQgaW50IGkgPSBqOyAgLyogaSBpcyB6ZXJvIG9yIGEgcHJlc2VudCBpbmRleCAqLworICBqKys7CisgIC8qIGZpbmQgYGknIGFuZCBgaicgc3VjaCB0aGF0IGkgaXMgcHJlc2VudCBhbmQgaiBpcyBub3QgKi8KKyAgd2hpbGUgKCF0dGlzbmlsKGx1YUhfZ2V0bnVtKHQsIGopKSkgeworICAgIGkgPSBqOworICAgIGogKj0gMjsKKyAgICBpZiAoaiA+IGNhc3QodW5zaWduZWQgaW50LCBNQVhfSU5UKSkgeyAgLyogb3ZlcmZsb3c/ICovCisgICAgICAvKiB0YWJsZSB3YXMgYnVpbHQgd2l0aCBiYWQgcHVycG9zZXM6IHJlc29ydCB0byBsaW5lYXIgc2VhcmNoICovCisgICAgICBpID0gMTsKKyAgICAgIHdoaWxlICghdHRpc25pbChsdWFIX2dldG51bSh0LCBpKSkpIGkrKzsKKyAgICAgIHJldHVybiBpIC0gMTsKKyAgICB9CisgIH0KKyAgLyogbm93IGRvIGEgYmluYXJ5IHNlYXJjaCBiZXR3ZWVuIHRoZW0gKi8KKyAgd2hpbGUgKGogLSBpID4gMSkgeworICAgIHVuc2lnbmVkIGludCBtID0gKGkraikvMjsKKyAgICBpZiAodHRpc25pbChsdWFIX2dldG51bSh0LCBtKSkpIGogPSBtOworICAgIGVsc2UgaSA9IG07CisgIH0KKyAgcmV0dXJuIGk7Cit9CisKKworLyoKKyoqIFRyeSB0byBmaW5kIGEgYm91bmRhcnkgaW4gdGFibGUgYHQnLiBBIGBib3VuZGFyeScgaXMgYW4gaW50ZWdlciBpbmRleAorKiogc3VjaCB0aGF0IHRbaV0gaXMgbm9uLW5pbCBhbmQgdFtpKzFdIGlzIG5pbCAoYW5kIDAgaWYgdFsxXSBpcyBuaWwpLgorKi8KK2ludCBsdWFIX2dldG4gKFRhYmxlICp0KSB7CisgIHVuc2lnbmVkIGludCBqID0gdC0+c2l6ZWFycmF5OworICBpZiAoaiA+IDAgJiYgdHRpc25pbCgmdC0+YXJyYXlbaiAtIDFdKSkgeworICAgIC8qIHRoZXJlIGlzIGEgYm91bmRhcnkgaW4gdGhlIGFycmF5IHBhcnQ6IChiaW5hcnkpIHNlYXJjaCBmb3IgaXQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGogLSBpID4gMSkgeworICAgICAgdW5zaWduZWQgaW50IG0gPSAoaStqKS8yOworICAgICAgaWYgKHR0aXNuaWwoJnQtPmFycmF5W20gLSAxXSkpIGogPSBtOworICAgICAgZWxzZSBpID0gbTsKKyAgICB9CisgICAgcmV0dXJuIGk7CisgIH0KKyAgLyogZWxzZSBtdXN0IGZpbmQgYSBib3VuZGFyeSBpbiBoYXNoIHBhcnQgKi8KKyAgZWxzZSBpZiAodC0+bm9kZSA9PSBkdW1teW5vZGUpICAvKiBoYXNoIHBhcnQgaXMgZW1wdHk/ICovCisgICAgcmV0dXJuIGo7ICAvKiB0aGF0IGlzIGVhc3kuLi4gKi8KKyAgZWxzZSByZXR1cm4gdW5ib3VuZF9zZWFyY2godCwgaik7Cit9CisKKworCisjaWYgZGVmaW5lZChMVUFfREVCVUcpCisKK05vZGUgKmx1YUhfbWFpbnBvc2l0aW9uIChjb25zdCBUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpIHsKKyAgcmV0dXJuIG1haW5wb3NpdGlvbih0LCBrZXkpOworfQorCitpbnQgbHVhSF9pc2R1bW15IChOb2RlICpuKSB7IHJldHVybiBuID09IGR1bW15bm9kZTsgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHRhYmxlLmggYi9sdWEtNS4xLjQvc3JjL2x0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjlkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2x0YWJsZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisqKiAkSWQ6IGx0YWJsZS5oLHYgMi4xMC4xLjEgMjAwNy8xMi8yNyAxMzowMjoyNSByb2JlcnRvIEV4cCAkCisqKiBMdWEgdGFibGVzIChoYXNoKQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbHRhYmxlX2gKKyNkZWZpbmUgbHRhYmxlX2gKKworI2luY2x1ZGUgImxvYmplY3QuaCIKKworCisjZGVmaW5lIGdub2RlKHQsaSkJKCYodCktPm5vZGVbaV0pCisjZGVmaW5lIGdrZXkobikJCSgmKG4pLT5pX2tleS5uaykKKyNkZWZpbmUgZ3ZhbChuKQkJKCYobiktPmlfdmFsKQorI2RlZmluZSBnbmV4dChuKQkoKG4pLT5pX2tleS5uay5uZXh0KQorCisjZGVmaW5lIGtleTJ0dmFsKG4pCSgmKG4pLT5pX2tleS50dmspCisKKworTFVBSV9GVU5DIGNvbnN0IFRWYWx1ZSAqbHVhSF9nZXRudW0gKFRhYmxlICp0LCBpbnQga2V5KTsKK0xVQUlfRlVOQyBUVmFsdWUgKmx1YUhfc2V0bnVtIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBpbnQga2V5KTsKK0xVQUlfRlVOQyBjb25zdCBUVmFsdWUgKmx1YUhfZ2V0c3RyIChUYWJsZSAqdCwgVFN0cmluZyAqa2V5KTsKK0xVQUlfRlVOQyBUVmFsdWUgKmx1YUhfc2V0c3RyIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBUU3RyaW5nICprZXkpOworTFVBSV9GVU5DIGNvbnN0IFRWYWx1ZSAqbHVhSF9nZXQgKFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmtleSk7CitMVUFJX0ZVTkMgVFZhbHVlICpsdWFIX3NldCAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpOworTFVBSV9GVU5DIFRhYmxlICpsdWFIX25ldyAobHVhX1N0YXRlICpMLCBpbnQgbmFycmF5LCBpbnQgbG5oYXNoKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUhfcmVzaXplYXJyYXkgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIGludCBuYXNpemUpOworTFVBSV9GVU5DIHZvaWQgbHVhSF9mcmVlIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0KTsKK0xVQUlfRlVOQyBpbnQgbHVhSF9uZXh0IChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBTdGtJZCBrZXkpOworTFVBSV9GVU5DIGludCBsdWFIX2dldG4gKFRhYmxlICp0KTsKKworCisjaWYgZGVmaW5lZChMVUFfREVCVUcpCitMVUFJX0ZVTkMgTm9kZSAqbHVhSF9tYWlucG9zaXRpb24gKGNvbnN0IFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmtleSk7CitMVUFJX0ZVTkMgaW50IGx1YUhfaXNkdW1teSAoTm9kZSAqbik7CisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHRhYmxpYi5jIGIvbHVhLTUuMS40L3NyYy9sdGFibGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkOWNiNAotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHRhYmxpYi5jCkBAIC0wLDAgKzEsMjg3IEBACisvKgorKiogJElkOiBsdGFibGliLmMsdiAxLjM4LjEuMyAyMDA4LzAyLzE0IDE2OjQ2OjU4IHJvYmVydG8gRXhwICQKKyoqIExpYnJhcnkgZm9yIFRhYmxlIE1hbmlwdWxhdGlvbgorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIGx0YWJsaWJfYworI2RlZmluZSBMVUFfTElCCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKworCisjZGVmaW5lIGF1eF9nZXRuKEwsbikJKGx1YUxfY2hlY2t0eXBlKEwsIG4sIExVQV9UVEFCTEUpLCBsdWFMX2dldG4oTCwgbikpCisKKworc3RhdGljIGludCBmb3JlYWNoaSAobHVhX1N0YXRlICpMKSB7CisgIGludCBpOworICBpbnQgbiA9IGF1eF9nZXRuKEwsIDEpOworICBsdWFMX2NoZWNrdHlwZShMLCAyLCBMVUFfVEZVTkNUSU9OKTsKKyAgZm9yIChpPTE7IGkgPD0gbjsgaSsrKSB7CisgICAgbHVhX3B1c2h2YWx1ZShMLCAyKTsgIC8qIGZ1bmN0aW9uICovCisgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIGkpOyAgLyogMXN0IGFyZ3VtZW50ICovCisgICAgbHVhX3Jhd2dldGkoTCwgMSwgaSk7ICAvKiAybmQgYXJndW1lbnQgKi8KKyAgICBsdWFfY2FsbChMLCAyLCAxKTsKKyAgICBpZiAoIWx1YV9pc25pbChMLCAtMSkpCisgICAgICByZXR1cm4gMTsKKyAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIG5pbCByZXN1bHQgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGZvcmVhY2ggKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMiwgTFVBX1RGVU5DVElPTik7CisgIGx1YV9wdXNobmlsKEwpOyAgLyogZmlyc3Qga2V5ICovCisgIHdoaWxlIChsdWFfbmV4dChMLCAxKSkgeworICAgIGx1YV9wdXNodmFsdWUoTCwgMik7ICAvKiBmdW5jdGlvbiAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTMpOyAgLyoga2V5ICovCisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMyk7ICAvKiB2YWx1ZSAqLworICAgIGx1YV9jYWxsKEwsIDIsIDEpOworICAgIGlmICghbHVhX2lzbmlsKEwsIC0xKSkKKyAgICAgIHJldHVybiAxOworICAgIGx1YV9wb3AoTCwgMik7ICAvKiByZW1vdmUgdmFsdWUgYW5kIHJlc3VsdCAqLworICB9CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbWF4biAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9OdW1iZXIgbWF4ID0gMDsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RUQUJMRSk7CisgIGx1YV9wdXNobmlsKEwpOyAgLyogZmlyc3Qga2V5ICovCisgIHdoaWxlIChsdWFfbmV4dChMLCAxKSkgeworICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgdmFsdWUgKi8KKyAgICBpZiAobHVhX3R5cGUoTCwgLTEpID09IExVQV9UTlVNQkVSKSB7CisgICAgICBsdWFfTnVtYmVyIHYgPSBsdWFfdG9udW1iZXIoTCwgLTEpOworICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHY7CisgICAgfQorICB9CisgIGx1YV9wdXNobnVtYmVyKEwsIG1heCk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZ2V0biAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNoaW50ZWdlcihMLCBhdXhfZ2V0bihMLCAxKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc2V0biAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOworI2lmbmRlZiBsdWFMX3NldG4KKyAgbHVhTF9zZXRuKEwsIDEsIGx1YUxfY2hlY2tpbnQoTCwgMikpOworI2Vsc2UKKyAgbHVhTF9lcnJvcihMLCBMVUFfUUwoInNldG4iKSAiIGlzIG9ic29sZXRlIik7CisjZW5kaWYKKyAgbHVhX3B1c2h2YWx1ZShMLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCB0aW5zZXJ0IChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGUgPSBhdXhfZ2V0bihMLCAxKSArIDE7ICAvKiBmaXJzdCBlbXB0eSBlbGVtZW50ICovCisgIGludCBwb3M7ICAvKiB3aGVyZSB0byBpbnNlcnQgbmV3IGVsZW1lbnQgKi8KKyAgc3dpdGNoIChsdWFfZ2V0dG9wKEwpKSB7CisgICAgY2FzZSAyOiB7ICAvKiBjYWxsZWQgd2l0aCBvbmx5IDIgYXJndW1lbnRzICovCisgICAgICBwb3MgPSBlOyAgLyogaW5zZXJ0IG5ldyBlbGVtZW50IGF0IHRoZSBlbmQgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDM6IHsKKyAgICAgIGludCBpOworICAgICAgcG9zID0gbHVhTF9jaGVja2ludChMLCAyKTsgIC8qIDJuZCBhcmd1bWVudCBpcyB0aGUgcG9zaXRpb24gKi8KKyAgICAgIGlmIChwb3MgPiBlKSBlID0gcG9zOyAgLyogYGdyb3cnIGFycmF5IGlmIG5lY2Vzc2FyeSAqLworICAgICAgZm9yIChpID0gZTsgaSA+IHBvczsgaS0tKSB7ICAvKiBtb3ZlIHVwIGVsZW1lbnRzICovCisgICAgICAgIGx1YV9yYXdnZXRpKEwsIDEsIGktMSk7CisgICAgICAgIGx1YV9yYXdzZXRpKEwsIDEsIGkpOyAgLyogdFtpXSA9IHRbaS0xXSAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIHRvICIgTFVBX1FMKCJpbnNlcnQiKSk7CisgICAgfQorICB9CisgIGx1YUxfc2V0bihMLCAxLCBlKTsgIC8qIG5ldyBzaXplICovCisgIGx1YV9yYXdzZXRpKEwsIDEsIHBvcyk7ICAvKiB0W3Bvc10gPSB2ICovCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdHJlbW92ZSAobHVhX1N0YXRlICpMKSB7CisgIGludCBlID0gYXV4X2dldG4oTCwgMSk7CisgIGludCBwb3MgPSBsdWFMX29wdGludChMLCAyLCBlKTsKKyAgaWYgKCEoMSA8PSBwb3MgJiYgcG9zIDw9IGUpKSAgLyogcG9zaXRpb24gaXMgb3V0c2lkZSBib3VuZHM/ICovCisgICByZXR1cm4gMDsgIC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovCisgIGx1YUxfc2V0bihMLCAxLCBlIC0gMSk7ICAvKiB0Lm4gPSBuLTEgKi8KKyAgbHVhX3Jhd2dldGkoTCwgMSwgcG9zKTsgIC8qIHJlc3VsdCA9IHRbcG9zXSAqLworICBmb3IgKCA7cG9zPGU7IHBvcysrKSB7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgcG9zKzEpOworICAgIGx1YV9yYXdzZXRpKEwsIDEsIHBvcyk7ICAvKiB0W3Bvc10gPSB0W3BvcysxXSAqLworICB9CisgIGx1YV9wdXNobmlsKEwpOworICBsdWFfcmF3c2V0aShMLCAxLCBlKTsgIC8qIHRbZV0gPSBuaWwgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgYWRkZmllbGQgKGx1YV9TdGF0ZSAqTCwgbHVhTF9CdWZmZXIgKmIsIGludCBpKSB7CisgIGx1YV9yYXdnZXRpKEwsIDEsIGkpOworICBpZiAoIWx1YV9pc3N0cmluZyhMLCAtMSkpCisgICAgbHVhTF9lcnJvcihMLCAiaW52YWxpZCB2YWx1ZSAoJXMpIGF0IGluZGV4ICVkIGluIHRhYmxlIGZvciAiCisgICAgICAgICAgICAgICAgICBMVUFfUUwoImNvbmNhdCIpLCBsdWFMX3R5cGVuYW1lKEwsIC0xKSwgaSk7CisgICAgbHVhTF9hZGR2YWx1ZShiKTsKK30KKworCitzdGF0aWMgaW50IHRjb25jYXQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX0J1ZmZlciBiOworICBzaXplX3QgbHNlcDsKKyAgaW50IGksIGxhc3Q7CisgIGNvbnN0IGNoYXIgKnNlcCA9IGx1YUxfb3B0bHN0cmluZyhMLCAyLCAiIiwgJmxzZXApOworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgaSA9IGx1YUxfb3B0aW50KEwsIDMsIDEpOworICBsYXN0ID0gbHVhTF9vcHQoTCwgbHVhTF9jaGVja2ludCwgNCwgbHVhTF9nZXRuKEwsIDEpKTsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIGZvciAoOyBpIDwgbGFzdDsgaSsrKSB7CisgICAgYWRkZmllbGQoTCwgJmIsIGkpOworICAgIGx1YUxfYWRkbHN0cmluZygmYiwgc2VwLCBsc2VwKTsKKyAgfQorICBpZiAoaSA9PSBsYXN0KSAgLyogYWRkIGxhc3QgdmFsdWUgKGlmIGludGVydmFsIHdhcyBub3QgZW1wdHkpICovCisgICAgYWRkZmllbGQoTCwgJmIsIGkpOworICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICByZXR1cm4gMTsKK30KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBRdWlja3NvcnQKKyoqIChiYXNlZCBvbiBgQWxnb3JpdGhtcyBpbiBNT0RVTEEtMycsIFJvYmVydCBTZWRnZXdpY2s7CisqKiAgQWRkaXNvbi1XZXNsZXksIDE5OTMuKQorKi8KKworCitzdGF0aWMgdm9pZCBzZXQyIChsdWFfU3RhdGUgKkwsIGludCBpLCBpbnQgaikgeworICBsdWFfcmF3c2V0aShMLCAxLCBpKTsKKyAgbHVhX3Jhd3NldGkoTCwgMSwgaik7Cit9CisKK3N0YXRpYyBpbnQgc29ydF9jb21wIChsdWFfU3RhdGUgKkwsIGludCBhLCBpbnQgYikgeworICBpZiAoIWx1YV9pc25pbChMLCAyKSkgeyAgLyogZnVuY3Rpb24/ICovCisgICAgaW50IHJlczsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIDIpOworICAgIGx1YV9wdXNodmFsdWUoTCwgYS0xKTsgIC8qIC0xIHRvIGNvbXBlbnNhdGUgZnVuY3Rpb24gKi8KKyAgICBsdWFfcHVzaHZhbHVlKEwsIGItMik7ICAvKiAtMiB0byBjb21wZW5zYXRlIGZ1bmN0aW9uIGFuZCBgYScgKi8KKyAgICBsdWFfY2FsbChMLCAyLCAxKTsKKyAgICByZXMgPSBsdWFfdG9ib29sZWFuKEwsIC0xKTsKKyAgICBsdWFfcG9wKEwsIDEpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgZWxzZSAgLyogYSA8IGI/ICovCisgICAgcmV0dXJuIGx1YV9sZXNzdGhhbihMLCBhLCBiKTsKK30KKworc3RhdGljIHZvaWQgYXV4c29ydCAobHVhX1N0YXRlICpMLCBpbnQgbCwgaW50IHUpIHsKKyAgd2hpbGUgKGwgPCB1KSB7ICAvKiBmb3IgdGFpbCByZWN1cnNpb24gKi8KKyAgICBpbnQgaSwgajsKKyAgICAvKiBzb3J0IGVsZW1lbnRzIGFbbF0sIGFbKGwrdSkvMl0gYW5kIGFbdV0gKi8KKyAgICBsdWFfcmF3Z2V0aShMLCAxLCBsKTsKKyAgICBsdWFfcmF3Z2V0aShMLCAxLCB1KTsKKyAgICBpZiAoc29ydF9jb21wKEwsIC0xLCAtMikpICAvKiBhW3VdIDwgYVtsXT8gKi8KKyAgICAgIHNldDIoTCwgbCwgdSk7ICAvKiBzd2FwIGFbbF0gLSBhW3VdICovCisgICAgZWxzZQorICAgICAgbHVhX3BvcChMLCAyKTsKKyAgICBpZiAodS1sID09IDEpIGJyZWFrOyAgLyogb25seSAyIGVsZW1lbnRzICovCisgICAgaSA9IChsK3UpLzI7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgaSk7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgbCk7CisgICAgaWYgKHNvcnRfY29tcChMLCAtMiwgLTEpKSAgLyogYVtpXTxhW2xdPyAqLworICAgICAgc2V0MihMLCBpLCBsKTsKKyAgICBlbHNlIHsKKyAgICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgYVtsXSAqLworICAgICAgbHVhX3Jhd2dldGkoTCwgMSwgdSk7CisgICAgICBpZiAoc29ydF9jb21wKEwsIC0xLCAtMikpICAvKiBhW3VdPGFbaV0/ICovCisgICAgICAgIHNldDIoTCwgaSwgdSk7CisgICAgICBlbHNlCisgICAgICAgIGx1YV9wb3AoTCwgMik7CisgICAgfQorICAgIGlmICh1LWwgPT0gMikgYnJlYWs7ICAvKiBvbmx5IDMgZWxlbWVudHMgKi8KKyAgICBsdWFfcmF3Z2V0aShMLCAxLCBpKTsgIC8qIFBpdm90ICovCisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgdS0xKTsKKyAgICBzZXQyKEwsIGksIHUtMSk7CisgICAgLyogYVtsXSA8PSBQID09IGFbdS0xXSA8PSBhW3VdLCBvbmx5IG5lZWQgdG8gc29ydCBmcm9tIGwrMSB0byB1LTIgKi8KKyAgICBpID0gbDsgaiA9IHUtMTsKKyAgICBmb3IgKDs7KSB7ICAvKiBpbnZhcmlhbnQ6IGFbbC4uaV0gPD0gUCA8PSBhW2ouLnVdICovCisgICAgICAvKiByZXBlYXQgKytpIHVudGlsIGFbaV0gPj0gUCAqLworICAgICAgd2hpbGUgKGx1YV9yYXdnZXRpKEwsIDEsICsraSksIHNvcnRfY29tcChMLCAtMSwgLTIpKSB7CisgICAgICAgIGlmIChpPnUpIGx1YUxfZXJyb3IoTCwgImludmFsaWQgb3JkZXIgZnVuY3Rpb24gZm9yIHNvcnRpbmciKTsKKyAgICAgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSBhW2ldICovCisgICAgICB9CisgICAgICAvKiByZXBlYXQgLS1qIHVudGlsIGFbal0gPD0gUCAqLworICAgICAgd2hpbGUgKGx1YV9yYXdnZXRpKEwsIDEsIC0taiksIHNvcnRfY29tcChMLCAtMywgLTEpKSB7CisgICAgICAgIGlmIChqPGwpIGx1YUxfZXJyb3IoTCwgImludmFsaWQgb3JkZXIgZnVuY3Rpb24gZm9yIHNvcnRpbmciKTsKKyAgICAgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSBhW2pdICovCisgICAgICB9CisgICAgICBpZiAoajxpKSB7CisgICAgICAgIGx1YV9wb3AoTCwgMyk7ICAvKiBwb3AgcGl2b3QsIGFbaV0sIGFbal0gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzZXQyKEwsIGksIGopOworICAgIH0KKyAgICBsdWFfcmF3Z2V0aShMLCAxLCB1LTEpOworICAgIGx1YV9yYXdnZXRpKEwsIDEsIGkpOworICAgIHNldDIoTCwgdS0xLCBpKTsgIC8qIHN3YXAgcGl2b3QgKGFbdS0xXSkgd2l0aCBhW2ldICovCisgICAgLyogYVtsLi5pLTFdIDw9IGFbaV0gPT0gUCA8PSBhW2krMS4udV0gKi8KKyAgICAvKiBhZGp1c3Qgc28gdGhhdCBzbWFsbGVyIGhhbGYgaXMgaW4gW2ouLmldIGFuZCBsYXJnZXIgb25lIGluIFtsLi51XSAqLworICAgIGlmIChpLWwgPCB1LWkpIHsKKyAgICAgIGo9bDsgaT1pLTE7IGw9aSsyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGo9aSsxOyBpPXU7IHU9ai0yOworICAgIH0KKyAgICBhdXhzb3J0KEwsIGosIGkpOyAgLyogY2FsbCByZWN1cnNpdmVseSB0aGUgc21hbGxlciBvbmUgKi8KKyAgfSAgLyogcmVwZWF0IHRoZSByb3V0aW5lIGZvciB0aGUgbGFyZ2VyIG9uZSAqLworfQorCitzdGF0aWMgaW50IHNvcnQgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgbiA9IGF1eF9nZXRuKEwsIDEpOworICBsdWFMX2NoZWNrc3RhY2soTCwgNDAsICIiKTsgIC8qIGFzc3VtZSBhcnJheSBpcyBzbWFsbGVyIHRoYW4gMl40MCAqLworICBpZiAoIWx1YV9pc25vbmVvcm5pbChMLCAyKSkgIC8qIGlzIHRoZXJlIGEgMm5kIGFyZ3VtZW50PyAqLworICAgIGx1YUxfY2hlY2t0eXBlKEwsIDIsIExVQV9URlVOQ1RJT04pOworICBsdWFfc2V0dG9wKEwsIDIpOyAgLyogbWFrZSBzdXJlIHRoZXJlIGlzIHR3byBhcmd1bWVudHMgKi8KKyAgYXV4c29ydChMLCAxLCBuKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgdGFiX2Z1bmNzW10gPSB7CisgIHsiY29uY2F0IiwgdGNvbmNhdH0sCisgIHsiZm9yZWFjaCIsIGZvcmVhY2h9LAorICB7ImZvcmVhY2hpIiwgZm9yZWFjaGl9LAorICB7ImdldG4iLCBnZXRufSwKKyAgeyJtYXhuIiwgbWF4bn0sCisgIHsiaW5zZXJ0IiwgdGluc2VydH0sCisgIHsicmVtb3ZlIiwgdHJlbW92ZX0sCisgIHsic2V0biIsIHNldG59LAorICB7InNvcnQiLCBzb3J0fSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKK0xVQUxJQl9BUEkgaW50IGx1YW9wZW5fdGFibGUgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX3JlZ2lzdGVyKEwsIExVQV9UQUJMSUJOQU1FLCB0YWJfZnVuY3MpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sdG0uYyBiL2x1YS01LjEuNC9zcmMvbHRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3ZjBmNgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHRtLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyoqICRJZDogbHRtLmMsdiAyLjguMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogVGFnIG1ldGhvZHMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsdG1fYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx0YWJsZS5oIgorI2luY2x1ZGUgImx0bS5oIgorCisKKworY29uc3QgY2hhciAqY29uc3QgbHVhVF90eXBlbmFtZXNbXSA9IHsKKyAgIm5pbCIsICJib29sZWFuIiwgInVzZXJkYXRhIiwgIm51bWJlciIsCisgICJzdHJpbmciLCAidGFibGUiLCAiZnVuY3Rpb24iLCAidXNlcmRhdGEiLCAidGhyZWFkIiwKKyAgInByb3RvIiwgInVwdmFsIgorfTsKKworCit2b2lkIGx1YVRfaW5pdCAobHVhX1N0YXRlICpMKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsdWFUX2V2ZW50bmFtZVtdID0geyAgLyogT1JERVIgVE0gKi8KKyAgICAiX19pbmRleCIsICJfX25ld2luZGV4IiwKKyAgICAiX19nYyIsICJfX21vZGUiLCAiX19lcSIsCisgICAgIl9fYWRkIiwgIl9fc3ViIiwgIl9fbXVsIiwgIl9fZGl2IiwgIl9fbW9kIiwKKyAgICAiX19wb3ciLCAiX191bm0iLCAiX19sZW4iLCAiX19sdCIsICJfX2xlIiwKKyAgICAiX19jb25jYXQiLCAiX19jYWxsIgorICB9OworICBpbnQgaTsKKyAgZm9yIChpPTA7IGk8VE1fTjsgaSsrKSB7CisgICAgRyhMKS0+dG1uYW1lW2ldID0gbHVhU19uZXcoTCwgbHVhVF9ldmVudG5hbWVbaV0pOworICAgIGx1YVNfZml4KEcoTCktPnRtbmFtZVtpXSk7ICAvKiBuZXZlciBjb2xsZWN0IHRoZXNlIG5hbWVzICovCisgIH0KK30KKworCisvKgorKiogZnVuY3Rpb24gdG8gYmUgdXNlZCB3aXRoIG1hY3JvICJmYXN0dG0iOiBvcHRpbWl6ZWQgZm9yIGFic2VuY2Ugb2YKKyoqIHRhZyBtZXRob2RzCisqLworY29uc3QgVFZhbHVlICpsdWFUX2dldHRtIChUYWJsZSAqZXZlbnRzLCBUTVMgZXZlbnQsIFRTdHJpbmcgKmVuYW1lKSB7CisgIGNvbnN0IFRWYWx1ZSAqdG0gPSBsdWFIX2dldHN0cihldmVudHMsIGVuYW1lKTsKKyAgbHVhX2Fzc2VydChldmVudCA8PSBUTV9FUSk7CisgIGlmICh0dGlzbmlsKHRtKSkgeyAgLyogbm8gdGFnIG1ldGhvZD8gKi8KKyAgICBldmVudHMtPmZsYWdzIHw9IGNhc3RfYnl0ZSgxdTw8ZXZlbnQpOyAgLyogY2FjaGUgdGhpcyBmYWN0ICovCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSByZXR1cm4gdG07Cit9CisKKworY29uc3QgVFZhbHVlICpsdWFUX2dldHRtYnlvYmogKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpvLCBUTVMgZXZlbnQpIHsKKyAgVGFibGUgKm10OworICBzd2l0Y2ggKHR0eXBlKG8pKSB7CisgICAgY2FzZSBMVUFfVFRBQkxFOgorICAgICAgbXQgPSBodmFsdWUobyktPm1ldGF0YWJsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTFVBX1RVU0VSREFUQToKKyAgICAgIG10ID0gdXZhbHVlKG8pLT5tZXRhdGFibGU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbXQgPSBHKEwpLT5tdFt0dHlwZShvKV07CisgIH0KKyAgcmV0dXJuIChtdCA/IGx1YUhfZ2V0c3RyKG10LCBHKEwpLT50bW5hbWVbZXZlbnRdKSA6IGx1YU9fbmlsb2JqZWN0KTsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sdG0uaCBiL2x1YS01LjEuNC9zcmMvbHRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNDNiNwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHRtLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyoqICRJZDogbHRtLmgsdiAyLjYuMS4xIDIwMDcvMTIvMjcgMTM6MDI6MjUgcm9iZXJ0byBFeHAgJAorKiogVGFnIG1ldGhvZHMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGx0bV9oCisjZGVmaW5lIGx0bV9oCisKKworI2luY2x1ZGUgImxvYmplY3QuaCIKKworCisvKgorKiBXQVJOSU5HOiBpZiB5b3UgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGlzIGVudW1lcmF0aW9uLAorKiBncmVwICJPUkRFUiBUTSIKKyovCit0eXBlZGVmIGVudW0geworICBUTV9JTkRFWCwKKyAgVE1fTkVXSU5ERVgsCisgIFRNX0dDLAorICBUTV9NT0RFLAorICBUTV9FUSwgIC8qIGxhc3QgdGFnIG1ldGhvZCB3aXRoIGBmYXN0JyBhY2Nlc3MgKi8KKyAgVE1fQURELAorICBUTV9TVUIsCisgIFRNX01VTCwKKyAgVE1fRElWLAorICBUTV9NT0QsCisgIFRNX1BPVywKKyAgVE1fVU5NLAorICBUTV9MRU4sCisgIFRNX0xULAorICBUTV9MRSwKKyAgVE1fQ09OQ0FULAorICBUTV9DQUxMLAorICBUTV9OCQkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGVudW0gKi8KK30gVE1TOworCisKKworI2RlZmluZSBnZmFzdHRtKGcsZXQsZSkgKChldCkgPT0gTlVMTCA/IE5VTEwgOiBcCisgICgoZXQpLT5mbGFncyAmICgxdTw8KGUpKSkgPyBOVUxMIDogbHVhVF9nZXR0bShldCwgZSwgKGcpLT50bW5hbWVbZV0pKQorCisjZGVmaW5lIGZhc3R0bShsLGV0LGUpCWdmYXN0dG0oRyhsKSwgZXQsIGUpCisKK0xVQUlfREFUQSBjb25zdCBjaGFyICpjb25zdCBsdWFUX3R5cGVuYW1lc1tdOworCisKK0xVQUlfRlVOQyBjb25zdCBUVmFsdWUgKmx1YVRfZ2V0dG0gKFRhYmxlICpldmVudHMsIFRNUyBldmVudCwgVFN0cmluZyAqZW5hbWUpOworTFVBSV9GVU5DIGNvbnN0IFRWYWx1ZSAqbHVhVF9nZXR0bWJ5b2JqIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTVMgZXZlbnQpOworTFVBSV9GVU5DIHZvaWQgbHVhVF9pbml0IChsdWFfU3RhdGUgKkwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHVhLmMgYi9sdWEtNS4xLjQvc3JjL2x1YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDY2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2x1YS5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorKiogJElkOiBsdWEuYyx2IDEuMTYwLjEuMiAyMDA3LzEyLzI4IDE1OjMyOjIzIHJvYmVydG8gRXhwICQKKyoqIEx1YSBzdGFuZC1hbG9uZSBpbnRlcnByZXRlcgorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbHVhX2MKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorCisKKworc3RhdGljIGx1YV9TdGF0ZSAqZ2xvYmFsTCA9IE5VTEw7CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9nbmFtZSA9IExVQV9QUk9HTkFNRTsKKworCisKK3N0YXRpYyB2b2lkIGxzdG9wIChsdWFfU3RhdGUgKkwsIGx1YV9EZWJ1ZyAqYXIpIHsKKyAgKHZvaWQpYXI7ICAvKiB1bnVzZWQgYXJnLiAqLworICBsdWFfc2V0aG9vayhMLCBOVUxMLCAwLCAwKTsKKyAgbHVhTF9lcnJvcihMLCAiaW50ZXJydXB0ZWQhIik7Cit9CisKKworc3RhdGljIHZvaWQgbGFjdGlvbiAoaW50IGkpIHsKKyAgc2lnbmFsKGksIFNJR19ERkwpOyAvKiBpZiBhbm90aGVyIFNJR0lOVCBoYXBwZW5zIGJlZm9yZSBsc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9jZXNzIChkZWZhdWx0IGFjdGlvbikgKi8KKyAgbHVhX3NldGhvb2soZ2xvYmFsTCwgbHN0b3AsIExVQV9NQVNLQ0FMTCB8IExVQV9NQVNLUkVUIHwgTFVBX01BU0tDT1VOVCwgMSk7Cit9CisKKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UgKHZvaWQpIHsKKyAgZnByaW50ZihzdGRlcnIsCisgICJ1c2FnZTogJXMgW29wdGlvbnNdIFtzY3JpcHQgW2FyZ3NdXS5cbiIKKyAgIkF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiIKKyAgIiAgLWUgc3RhdCAgZXhlY3V0ZSBzdHJpbmcgIiBMVUFfUUwoInN0YXQiKSAiXG4iCisgICIgIC1sIG5hbWUgIHJlcXVpcmUgbGlicmFyeSAiIExVQV9RTCgibmFtZSIpICJcbiIKKyAgIiAgLWkgICAgICAgZW50ZXIgaW50ZXJhY3RpdmUgbW9kZSBhZnRlciBleGVjdXRpbmcgIiBMVUFfUUwoInNjcmlwdCIpICJcbiIKKyAgIiAgLXYgICAgICAgc2hvdyB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCisgICIgIC0tICAgICAgIHN0b3AgaGFuZGxpbmcgb3B0aW9uc1xuIgorICAiICAtICAgICAgICBleGVjdXRlIHN0ZGluIGFuZCBzdG9wIGhhbmRsaW5nIG9wdGlvbnNcbiIKKyAgLAorICBwcm9nbmFtZSk7CisgIGZmbHVzaChzdGRlcnIpOworfQorCisKK3N0YXRpYyB2b2lkIGxfbWVzc2FnZSAoY29uc3QgY2hhciAqcG5hbWUsIGNvbnN0IGNoYXIgKm1zZykgeworICBpZiAocG5hbWUpIGZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHBuYW1lKTsKKyAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKTsKKyAgZmZsdXNoKHN0ZGVycik7Cit9CisKKworc3RhdGljIGludCByZXBvcnQgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXR1cykgeworICBpZiAoc3RhdHVzICYmICFsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgY29uc3QgY2hhciAqbXNnID0gbHVhX3Rvc3RyaW5nKEwsIC0xKTsKKyAgICBpZiAobXNnID09IE5VTEwpIG1zZyA9ICIoZXJyb3Igb2JqZWN0IGlzIG5vdCBhIHN0cmluZykiOworICAgIGxfbWVzc2FnZShwcm9nbmFtZSwgbXNnKTsKKyAgICBsdWFfcG9wKEwsIDEpOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCB0cmFjZWJhY2sgKGx1YV9TdGF0ZSAqTCkgeworICBpZiAoIWx1YV9pc3N0cmluZyhMLCAxKSkgIC8qICdtZXNzYWdlJyBub3QgYSBzdHJpbmc/ICovCisgICAgcmV0dXJuIDE7ICAvKiBrZWVwIGl0IGludGFjdCAqLworICBsdWFfZ2V0ZmllbGQoTCwgTFVBX0dMT0JBTFNJTkRFWCwgImRlYnVnIik7CisgIGlmICghbHVhX2lzdGFibGUoTCwgLTEpKSB7CisgICAgbHVhX3BvcChMLCAxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBsdWFfZ2V0ZmllbGQoTCwgLTEsICJ0cmFjZWJhY2siKTsKKyAgaWYgKCFsdWFfaXNmdW5jdGlvbihMLCAtMSkpIHsKKyAgICBsdWFfcG9wKEwsIDIpOworICAgIHJldHVybiAxOworICB9CisgIGx1YV9wdXNodmFsdWUoTCwgMSk7ICAvKiBwYXNzIGVycm9yIG1lc3NhZ2UgKi8KKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIDIpOyAgLyogc2tpcCB0aGlzIGZ1bmN0aW9uIGFuZCB0cmFjZWJhY2sgKi8KKyAgbHVhX2NhbGwoTCwgMiwgMSk7ICAvKiBjYWxsIGRlYnVnLnRyYWNlYmFjayAqLworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGRvY2FsbCAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgaW50IGNsZWFyKSB7CisgIGludCBzdGF0dXM7CisgIGludCBiYXNlID0gbHVhX2dldHRvcChMKSAtIG5hcmc7ICAvKiBmdW5jdGlvbiBpbmRleCAqLworICBsdWFfcHVzaGNmdW5jdGlvbihMLCB0cmFjZWJhY2spOyAgLyogcHVzaCB0cmFjZWJhY2sgZnVuY3Rpb24gKi8KKyAgbHVhX2luc2VydChMLCBiYXNlKTsgIC8qIHB1dCBpdCB1bmRlciBjaHVuayBhbmQgYXJncyAqLworICBzaWduYWwoU0lHSU5ULCBsYWN0aW9uKTsKKyAgc3RhdHVzID0gbHVhX3BjYWxsKEwsIG5hcmcsIChjbGVhciA/IDAgOiBMVUFfTVVMVFJFVCksIGJhc2UpOworICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyAgbHVhX3JlbW92ZShMLCBiYXNlKTsgIC8qIHJlbW92ZSB0cmFjZWJhY2sgZnVuY3Rpb24gKi8KKyAgLyogZm9yY2UgYSBjb21wbGV0ZSBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gY2FzZSBvZiBlcnJvcnMgKi8KKyAgaWYgKHN0YXR1cyAhPSAwKSBsdWFfZ2MoTCwgTFVBX0dDQ09MTEVDVCwgMCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIHZvaWQgcHJpbnRfdmVyc2lvbiAodm9pZCkgeworICBsX21lc3NhZ2UoTlVMTCwgTFVBX1JFTEVBU0UgIiAgIiBMVUFfQ09QWVJJR0hUKTsKK30KKworCitzdGF0aWMgaW50IGdldGFyZ3MgKGx1YV9TdGF0ZSAqTCwgY2hhciAqKmFyZ3YsIGludCBuKSB7CisgIGludCBuYXJnOworICBpbnQgaTsKKyAgaW50IGFyZ2MgPSAwOworICB3aGlsZSAoYXJndlthcmdjXSkgYXJnYysrOyAgLyogY291bnQgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICBuYXJnID0gYXJnYyAtIChuICsgMSk7ICAvKiBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHRoZSBzY3JpcHQgKi8KKyAgbHVhTF9jaGVja3N0YWNrKEwsIG5hcmcgKyAzLCAidG9vIG1hbnkgYXJndW1lbnRzIHRvIHNjcmlwdCIpOworICBmb3IgKGk9bisxOyBpIDwgYXJnYzsgaSsrKQorICAgIGx1YV9wdXNoc3RyaW5nKEwsIGFyZ3ZbaV0pOworICBsdWFfY3JlYXRldGFibGUoTCwgbmFyZywgbiArIDEpOworICBmb3IgKGk9MDsgaSA8IGFyZ2M7IGkrKykgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsIGFyZ3ZbaV0pOworICAgIGx1YV9yYXdzZXRpKEwsIC0yLCBpIC0gbik7CisgIH0KKyAgcmV0dXJuIG5hcmc7Cit9CisKKworc3RhdGljIGludCBkb2ZpbGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSkgeworICBpbnQgc3RhdHVzID0gbHVhTF9sb2FkZmlsZShMLCBuYW1lKSB8fCBkb2NhbGwoTCwgMCwgMSk7CisgIHJldHVybiByZXBvcnQoTCwgc3RhdHVzKTsKK30KKworCitzdGF0aWMgaW50IGRvc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgaW50IHN0YXR1cyA9IGx1YUxfbG9hZGJ1ZmZlcihMLCBzLCBzdHJsZW4ocyksIG5hbWUpIHx8IGRvY2FsbChMLCAwLCAxKTsKKyAgcmV0dXJuIHJlcG9ydChMLCBzdGF0dXMpOworfQorCisKK3N0YXRpYyBpbnQgZG9saWJyYXJ5IChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgbHVhX2dldGdsb2JhbChMLCAicmVxdWlyZSIpOworICBsdWFfcHVzaHN0cmluZyhMLCBuYW1lKTsKKyAgcmV0dXJuIHJlcG9ydChMLCBkb2NhbGwoTCwgMSwgMSkpOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfcHJvbXB0IChsdWFfU3RhdGUgKkwsIGludCBmaXJzdGxpbmUpIHsKKyAgY29uc3QgY2hhciAqcDsKKyAgbHVhX2dldGZpZWxkKEwsIExVQV9HTE9CQUxTSU5ERVgsIGZpcnN0bGluZSA/ICJfUFJPTVBUIiA6ICJfUFJPTVBUMiIpOworICBwID0gbHVhX3Rvc3RyaW5nKEwsIC0xKTsKKyAgaWYgKHAgPT0gTlVMTCkgcCA9IChmaXJzdGxpbmUgPyBMVUFfUFJPTVBUIDogTFVBX1BST01QVDIpOworICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGdsb2JhbCAqLworICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgaW50IGluY29tcGxldGUgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXR1cykgeworICBpZiAoc3RhdHVzID09IExVQV9FUlJTWU5UQVgpIHsKKyAgICBzaXplX3QgbG1zZzsKKyAgICBjb25zdCBjaGFyICptc2cgPSBsdWFfdG9sc3RyaW5nKEwsIC0xLCAmbG1zZyk7CisgICAgY29uc3QgY2hhciAqdHAgPSBtc2cgKyBsbXNnIC0gKHNpemVvZihMVUFfUUwoIjxlb2Y+IikpIC0gMSk7CisgICAgaWYgKHN0cnN0cihtc2csIExVQV9RTCgiPGVvZj4iKSkgPT0gdHApIHsKKyAgICAgIGx1YV9wb3AoTCwgMSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7ICAvKiBlbHNlLi4uICovCit9CisKKworc3RhdGljIGludCBwdXNobGluZSAobHVhX1N0YXRlICpMLCBpbnQgZmlyc3RsaW5lKSB7CisgIGNoYXIgYnVmZmVyW0xVQV9NQVhJTlBVVF07CisgIGNoYXIgKmIgPSBidWZmZXI7CisgIHNpemVfdCBsOworICBjb25zdCBjaGFyICpwcm10ID0gZ2V0X3Byb21wdChMLCBmaXJzdGxpbmUpOworICBpZiAobHVhX3JlYWRsaW5lKEwsIGIsIHBybXQpID09IDApCisgICAgcmV0dXJuIDA7ICAvKiBubyBpbnB1dCAqLworICBsID0gc3RybGVuKGIpOworICBpZiAobCA+IDAgJiYgYltsLTFdID09ICdcbicpICAvKiBsaW5lIGVuZHMgd2l0aCBuZXdsaW5lPyAqLworICAgIGJbbC0xXSA9ICdcMCc7ICAvKiByZW1vdmUgaXQgKi8KKyAgaWYgKGZpcnN0bGluZSAmJiBiWzBdID09ICc9JykgIC8qIGZpcnN0IGxpbmUgc3RhcnRzIHdpdGggYD0nID8gKi8KKyAgICBsdWFfcHVzaGZzdHJpbmcoTCwgInJldHVybiAlcyIsIGIrMSk7ICAvKiBjaGFuZ2UgaXQgdG8gYHJldHVybicgKi8KKyAgZWxzZQorICAgIGx1YV9wdXNoc3RyaW5nKEwsIGIpOworICBsdWFfZnJlZWxpbmUoTCwgYik7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbG9hZGxpbmUgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc3RhdHVzOworICBsdWFfc2V0dG9wKEwsIDApOworICBpZiAoIXB1c2hsaW5lKEwsIDEpKQorICAgIHJldHVybiAtMTsgIC8qIG5vIGlucHV0ICovCisgIGZvciAoOzspIHsgIC8qIHJlcGVhdCB1bnRpbCBnZXRzIGEgY29tcGxldGUgbGluZSAqLworICAgIHN0YXR1cyA9IGx1YUxfbG9hZGJ1ZmZlcihMLCBsdWFfdG9zdHJpbmcoTCwgMSksIGx1YV9zdHJsZW4oTCwgMSksICI9c3RkaW4iKTsKKyAgICBpZiAoIWluY29tcGxldGUoTCwgc3RhdHVzKSkgYnJlYWs7ICAvKiBjYW5ub3QgdHJ5IHRvIGFkZCBsaW5lcz8gKi8KKyAgICBpZiAoIXB1c2hsaW5lKEwsIDApKSAgLyogbm8gbW9yZSBpbnB1dD8gKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIlxuIik7ICAvKiBhZGQgYSBuZXcgbGluZS4uLiAqLworICAgIGx1YV9pbnNlcnQoTCwgLTIpOyAgLyogLi4uYmV0d2VlbiB0aGUgdHdvIGxpbmVzICovCisgICAgbHVhX2NvbmNhdChMLCAzKTsgIC8qIGpvaW4gdGhlbSAqLworICB9CisgIGx1YV9zYXZlbGluZShMLCAxKTsKKyAgbHVhX3JlbW92ZShMLCAxKTsgIC8qIHJlbW92ZSBsaW5lICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIHZvaWQgZG90dHkgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc3RhdHVzOworICBjb25zdCBjaGFyICpvbGRwcm9nbmFtZSA9IHByb2duYW1lOworICBwcm9nbmFtZSA9IE5VTEw7CisgIHdoaWxlICgoc3RhdHVzID0gbG9hZGxpbmUoTCkpICE9IC0xKSB7CisgICAgaWYgKHN0YXR1cyA9PSAwKSBzdGF0dXMgPSBkb2NhbGwoTCwgMCwgMCk7CisgICAgcmVwb3J0KEwsIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSAwICYmIGx1YV9nZXR0b3AoTCkgPiAwKSB7ICAvKiBhbnkgcmVzdWx0IHRvIHByaW50PyAqLworICAgICAgbHVhX2dldGdsb2JhbChMLCAicHJpbnQiKTsKKyAgICAgIGx1YV9pbnNlcnQoTCwgMSk7CisgICAgICBpZiAobHVhX3BjYWxsKEwsIGx1YV9nZXR0b3AoTCktMSwgMCwgMCkgIT0gMCkKKyAgICAgICAgbF9tZXNzYWdlKHByb2duYW1lLCBsdWFfcHVzaGZzdHJpbmcoTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgY2FsbGluZyAiIExVQV9RTCgicHJpbnQiKSAiICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV90b3N0cmluZyhMLCAtMSkpKTsKKyAgICB9CisgIH0KKyAgbHVhX3NldHRvcChMLCAwKTsgIC8qIGNsZWFyIHN0YWNrICovCisgIGZwdXRzKCJcbiIsIHN0ZG91dCk7CisgIGZmbHVzaChzdGRvdXQpOworICBwcm9nbmFtZSA9IG9sZHByb2duYW1lOworfQorCisKK3N0YXRpYyBpbnQgaGFuZGxlX3NjcmlwdCAobHVhX1N0YXRlICpMLCBjaGFyICoqYXJndiwgaW50IG4pIHsKKyAgaW50IHN0YXR1czsKKyAgY29uc3QgY2hhciAqZm5hbWU7CisgIGludCBuYXJnID0gZ2V0YXJncyhMLCBhcmd2LCBuKTsgIC8qIGNvbGxlY3QgYXJndW1lbnRzICovCisgIGx1YV9zZXRnbG9iYWwoTCwgImFyZyIpOworICBmbmFtZSA9IGFyZ3Zbbl07CisgIGlmIChzdHJjbXAoZm5hbWUsICItIikgPT0gMCAmJiBzdHJjbXAoYXJndltuLTFdLCAiLS0iKSAhPSAwKSAKKyAgICBmbmFtZSA9IE5VTEw7ICAvKiBzdGRpbiAqLworICBzdGF0dXMgPSBsdWFMX2xvYWRmaWxlKEwsIGZuYW1lKTsKKyAgbHVhX2luc2VydChMLCAtKG5hcmcrMSkpOworICBpZiAoc3RhdHVzID09IDApCisgICAgc3RhdHVzID0gZG9jYWxsKEwsIG5hcmcsIDApOworICBlbHNlCisgICAgbHVhX3BvcChMLCBuYXJnKTsgICAgICAKKyAgcmV0dXJuIHJlcG9ydChMLCBzdGF0dXMpOworfQorCisKKy8qIGNoZWNrIHRoYXQgYXJndW1lbnQgaGFzIG5vIGV4dHJhIGNoYXJhY3RlcnMgYXQgdGhlIGVuZCAqLworI2RlZmluZSBub3RhaWwoeCkJe2lmICgoeClbMl0gIT0gJ1wwJykgcmV0dXJuIC0xO30KKworCitzdGF0aWMgaW50IGNvbGxlY3RhcmdzIChjaGFyICoqYXJndiwgaW50ICpwaSwgaW50ICpwdiwgaW50ICpwZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgYXJndltpXSAhPSBOVUxMOyBpKyspIHsKKyAgICBpZiAoYXJndltpXVswXSAhPSAnLScpICAvKiBub3QgYW4gb3B0aW9uPyAqLworICAgICAgICByZXR1cm4gaTsKKyAgICBzd2l0Y2ggKGFyZ3ZbaV1bMV0pIHsgIC8qIG9wdGlvbiAqLworICAgICAgY2FzZSAnLSc6CisgICAgICAgIG5vdGFpbChhcmd2W2ldKTsKKyAgICAgICAgcmV0dXJuIChhcmd2W2krMV0gIT0gTlVMTCA/IGkrMSA6IDApOworICAgICAgY2FzZSAnXDAnOgorICAgICAgICByZXR1cm4gaTsKKyAgICAgIGNhc2UgJ2knOgorICAgICAgICBub3RhaWwoYXJndltpXSk7CisgICAgICAgICpwaSA9IDE7ICAvKiBnbyB0aHJvdWdoICovCisgICAgICBjYXNlICd2JzoKKyAgICAgICAgbm90YWlsKGFyZ3ZbaV0pOworICAgICAgICAqcHYgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgorICAgICAgICAqcGUgPSAxOyAgLyogZ28gdGhyb3VnaCAqLworICAgICAgY2FzZSAnbCc6CisgICAgICAgIGlmIChhcmd2W2ldWzJdID09ICdcMCcpIHsKKyAgICAgICAgICBpKys7CisgICAgICAgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOyAgLyogaW52YWxpZCBvcHRpb24gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBydW5hcmdzIChsdWFfU3RhdGUgKkwsIGNoYXIgKiphcmd2LCBpbnQgbikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworICAgIGlmIChhcmd2W2ldID09IE5VTEwpIGNvbnRpbnVlOworICAgIGx1YV9hc3NlcnQoYXJndltpXVswXSA9PSAnLScpOworICAgIHN3aXRjaCAoYXJndltpXVsxXSkgeyAgLyogb3B0aW9uICovCisgICAgICBjYXNlICdlJzogeworICAgICAgICBjb25zdCBjaGFyICpjaHVuayA9IGFyZ3ZbaV0gKyAyOworICAgICAgICBpZiAoKmNodW5rID09ICdcMCcpIGNodW5rID0gYXJndlsrK2ldOworICAgICAgICBsdWFfYXNzZXJ0KGNodW5rICE9IE5VTEwpOworICAgICAgICBpZiAoZG9zdHJpbmcoTCwgY2h1bmssICI9KGNvbW1hbmQgbGluZSkiKSAhPSAwKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ2wnOiB7CisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltpXSArIDI7CisgICAgICAgIGlmICgqZmlsZW5hbWUgPT0gJ1wwJykgZmlsZW5hbWUgPSBhcmd2WysraV07CisgICAgICAgIGx1YV9hc3NlcnQoZmlsZW5hbWUgIT0gTlVMTCk7CisgICAgICAgIGlmIChkb2xpYnJhcnkoTCwgZmlsZW5hbWUpKQorICAgICAgICAgIHJldHVybiAxOyAgLyogc3RvcCBpZiBmaWxlIGZhaWxzICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaGFuZGxlX2x1YWluaXQgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICppbml0ID0gZ2V0ZW52KExVQV9JTklUKTsKKyAgaWYgKGluaXQgPT0gTlVMTCkgcmV0dXJuIDA7ICAvKiBzdGF0dXMgT0sgKi8KKyAgZWxzZSBpZiAoaW5pdFswXSA9PSAnQCcpCisgICAgcmV0dXJuIGRvZmlsZShMLCBpbml0KzEpOworICBlbHNlCisgICAgcmV0dXJuIGRvc3RyaW5nKEwsIGluaXQsICI9IiBMVUFfSU5JVCk7Cit9CisKKworc3RydWN0IFNtYWluIHsKKyAgaW50IGFyZ2M7CisgIGNoYXIgKiphcmd2OworICBpbnQgc3RhdHVzOworfTsKKworCitzdGF0aWMgaW50IHBtYWluIChsdWFfU3RhdGUgKkwpIHsKKyAgc3RydWN0IFNtYWluICpzID0gKHN0cnVjdCBTbWFpbiAqKWx1YV90b3VzZXJkYXRhKEwsIDEpOworICBjaGFyICoqYXJndiA9IHMtPmFyZ3Y7CisgIGludCBzY3JpcHQ7CisgIGludCBoYXNfaSA9IDAsIGhhc192ID0gMCwgaGFzX2UgPSAwOworICBnbG9iYWxMID0gTDsKKyAgaWYgKGFyZ3ZbMF0gJiYgYXJndlswXVswXSkgcHJvZ25hbWUgPSBhcmd2WzBdOworICBsdWFfZ2MoTCwgTFVBX0dDU1RPUCwgMCk7ICAvKiBzdG9wIGNvbGxlY3RvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KKyAgbHVhTF9vcGVubGlicyhMKTsgIC8qIG9wZW4gbGlicmFyaWVzICovCisgIGx1YV9nYyhMLCBMVUFfR0NSRVNUQVJULCAwKTsKKyAgcy0+c3RhdHVzID0gaGFuZGxlX2x1YWluaXQoTCk7CisgIGlmIChzLT5zdGF0dXMgIT0gMCkgcmV0dXJuIDA7CisgIHNjcmlwdCA9IGNvbGxlY3RhcmdzKGFyZ3YsICZoYXNfaSwgJmhhc192LCAmaGFzX2UpOworICBpZiAoc2NyaXB0IDwgMCkgeyAgLyogaW52YWxpZCBhcmdzPyAqLworICAgIHByaW50X3VzYWdlKCk7CisgICAgcy0+c3RhdHVzID0gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaGFzX3YpIHByaW50X3ZlcnNpb24oKTsKKyAgcy0+c3RhdHVzID0gcnVuYXJncyhMLCBhcmd2LCAoc2NyaXB0ID4gMCkgPyBzY3JpcHQgOiBzLT5hcmdjKTsKKyAgaWYgKHMtPnN0YXR1cyAhPSAwKSByZXR1cm4gMDsKKyAgaWYgKHNjcmlwdCkKKyAgICBzLT5zdGF0dXMgPSBoYW5kbGVfc2NyaXB0KEwsIGFyZ3YsIHNjcmlwdCk7CisgIGlmIChzLT5zdGF0dXMgIT0gMCkgcmV0dXJuIDA7CisgIGlmIChoYXNfaSkKKyAgICBkb3R0eShMKTsKKyAgZWxzZSBpZiAoc2NyaXB0ID09IDAgJiYgIWhhc19lICYmICFoYXNfdikgeworICAgIGlmIChsdWFfc3RkaW5faXNfdHR5KCkpIHsKKyAgICAgIHByaW50X3ZlcnNpb24oKTsKKyAgICAgIGRvdHR5KEwpOworICAgIH0KKyAgICBlbHNlIGRvZmlsZShMLCBOVUxMKTsgIC8qIGV4ZWN1dGVzIHN0ZGluIGFzIGEgZmlsZSAqLworICB9CisgIHJldHVybiAwOworfQorCisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgaW50IHN0YXR1czsKKyAgc3RydWN0IFNtYWluIHM7CisgIGx1YV9TdGF0ZSAqTCA9IGx1YV9vcGVuKCk7ICAvKiBjcmVhdGUgc3RhdGUgKi8KKyAgaWYgKEwgPT0gTlVMTCkgeworICAgIGxfbWVzc2FnZShhcmd2WzBdLCAiY2Fubm90IGNyZWF0ZSBzdGF0ZTogbm90IGVub3VnaCBtZW1vcnkiKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisgIHMuYXJnYyA9IGFyZ2M7CisgIHMuYXJndiA9IGFyZ3Y7CisgIHN0YXR1cyA9IGx1YV9jcGNhbGwoTCwgJnBtYWluLCAmcyk7CisgIHJlcG9ydChMLCBzdGF0dXMpOworICBsdWFfY2xvc2UoTCk7CisgIHJldHVybiAoc3RhdHVzIHx8IHMuc3RhdHVzKSA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sdWEuaCBiL2x1YS01LjEuNC9zcmMvbHVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiZGZkMwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHVhLmgKQEAgLTAsMCArMSwzODggQEAKKy8qCisqKiAkSWQ6IGx1YS5oLHYgMS4yMTguMS41IDIwMDgvMDgvMDYgMTM6MzA6MTIgcm9iZXJ0byBFeHAgJAorKiogTHVhIC0gQW4gRXh0ZW5zaWJsZSBFeHRlbnNpb24gTGFuZ3VhZ2UKKyoqIEx1YS5vcmcsIFBVQy1SaW8sIEJyYXppbCAoaHR0cDovL3d3dy5sdWEub3JnKQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUKKyovCisKKworI2lmbmRlZiBsdWFfaAorI2RlZmluZSBsdWFfaAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworI2luY2x1ZGUgImx1YWNvbmYuaCIKKworCisjZGVmaW5lIExVQV9WRVJTSU9OCSJMdWEgNS4xIgorI2RlZmluZSBMVUFfUkVMRUFTRQkiTHVhIDUuMS40IgorI2RlZmluZSBMVUFfVkVSU0lPTl9OVU0JNTAxCisjZGVmaW5lIExVQV9DT1BZUklHSFQJIkNvcHlyaWdodCAoQykgMTk5NC0yMDA4IEx1YS5vcmcsIFBVQy1SaW8iCisjZGVmaW5lIExVQV9BVVRIT1JTIAkiUi4gSWVydXNhbGltc2NoeSwgTC4gSC4gZGUgRmlndWVpcmVkbyAmIFcuIENlbGVzIgorCisKKy8qIG1hcmsgZm9yIHByZWNvbXBpbGVkIGNvZGUgKGA8ZXNjPkx1YScpICovCisjZGVmaW5lCUxVQV9TSUdOQVRVUkUJIlwwMzNMdWEiCisKKy8qIG9wdGlvbiBmb3IgbXVsdGlwbGUgcmV0dXJucyBpbiBgbHVhX3BjYWxsJyBhbmQgYGx1YV9jYWxsJyAqLworI2RlZmluZSBMVUFfTVVMVFJFVAkoLTEpCisKKworLyoKKyoqIHBzZXVkby1pbmRpY2VzCisqLworI2RlZmluZSBMVUFfUkVHSVNUUllJTkRFWAkoLTEwMDAwKQorI2RlZmluZSBMVUFfRU5WSVJPTklOREVYCSgtMTAwMDEpCisjZGVmaW5lIExVQV9HTE9CQUxTSU5ERVgJKC0xMDAwMikKKyNkZWZpbmUgbHVhX3VwdmFsdWVpbmRleChpKQkoTFVBX0dMT0JBTFNJTkRFWC0oaSkpCisKKworLyogdGhyZWFkIHN0YXR1czsgMCBpcyBPSyAqLworI2RlZmluZSBMVUFfWUlFTEQJMQorI2RlZmluZSBMVUFfRVJSUlVOCTIKKyNkZWZpbmUgTFVBX0VSUlNZTlRBWAkzCisjZGVmaW5lIExVQV9FUlJNRU0JNAorI2RlZmluZSBMVUFfRVJSRVJSCTUKKworCit0eXBlZGVmIHN0cnVjdCBsdWFfU3RhdGUgbHVhX1N0YXRlOworCit0eXBlZGVmIGludCAoKmx1YV9DRnVuY3Rpb24pIChsdWFfU3RhdGUgKkwpOworCisKKy8qCisqKiBmdW5jdGlvbnMgdGhhdCByZWFkL3dyaXRlIGJsb2NrcyB3aGVuIGxvYWRpbmcvZHVtcGluZyBMdWEgY2h1bmtzCisqLwordHlwZWRlZiBjb25zdCBjaGFyICogKCpsdWFfUmVhZGVyKSAobHVhX1N0YXRlICpMLCB2b2lkICp1ZCwgc2l6ZV90ICpzeik7CisKK3R5cGVkZWYgaW50ICgqbHVhX1dyaXRlcikgKGx1YV9TdGF0ZSAqTCwgY29uc3Qgdm9pZCogcCwgc2l6ZV90IHN6LCB2b2lkKiB1ZCk7CisKKworLyoKKyoqIHByb3RvdHlwZSBmb3IgbWVtb3J5LWFsbG9jYXRpb24gZnVuY3Rpb25zCisqLwordHlwZWRlZiB2b2lkICogKCpsdWFfQWxsb2MpICh2b2lkICp1ZCwgdm9pZCAqcHRyLCBzaXplX3Qgb3NpemUsIHNpemVfdCBuc2l6ZSk7CisKKworLyoKKyoqIGJhc2ljIHR5cGVzCisqLworI2RlZmluZSBMVUFfVE5PTkUJCSgtMSkKKworI2RlZmluZSBMVUFfVE5JTAkJMAorI2RlZmluZSBMVUFfVEJPT0xFQU4JCTEKKyNkZWZpbmUgTFVBX1RMSUdIVFVTRVJEQVRBCTIKKyNkZWZpbmUgTFVBX1ROVU1CRVIJCTMKKyNkZWZpbmUgTFVBX1RTVFJJTkcJCTQKKyNkZWZpbmUgTFVBX1RUQUJMRQkJNQorI2RlZmluZSBMVUFfVEZVTkNUSU9OCQk2CisjZGVmaW5lIExVQV9UVVNFUkRBVEEJCTcKKyNkZWZpbmUgTFVBX1RUSFJFQUQJCTgKKworCisKKy8qIG1pbmltdW0gTHVhIHN0YWNrIGF2YWlsYWJsZSB0byBhIEMgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTFVBX01JTlNUQUNLCTIwCisKKworLyoKKyoqIGdlbmVyaWMgZXh0cmEgaW5jbHVkZSBmaWxlCisqLworI2lmIGRlZmluZWQoTFVBX1VTRVJfSCkKKyNpbmNsdWRlIExVQV9VU0VSX0gKKyNlbmRpZgorCisKKy8qIHR5cGUgb2YgbnVtYmVycyBpbiBMdWEgKi8KK3R5cGVkZWYgTFVBX05VTUJFUiBsdWFfTnVtYmVyOworCisKKy8qIHR5cGUgZm9yIGludGVnZXIgZnVuY3Rpb25zICovCit0eXBlZGVmIExVQV9JTlRFR0VSIGx1YV9JbnRlZ2VyOworCisKKworLyoKKyoqIHN0YXRlIG1hbmlwdWxhdGlvbgorKi8KK0xVQV9BUEkgbHVhX1N0YXRlICoobHVhX25ld3N0YXRlKSAobHVhX0FsbG9jIGYsIHZvaWQgKnVkKTsKK0xVQV9BUEkgdm9pZCAgICAgICAobHVhX2Nsb3NlKSAobHVhX1N0YXRlICpMKTsKK0xVQV9BUEkgbHVhX1N0YXRlICoobHVhX25ld3RocmVhZCkgKGx1YV9TdGF0ZSAqTCk7CisKK0xVQV9BUEkgbHVhX0NGdW5jdGlvbiAobHVhX2F0cGFuaWMpIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gcGFuaWNmKTsKKworCisvKgorKiogYmFzaWMgc3RhY2sgbWFuaXB1bGF0aW9uCisqLworTFVBX0FQSSBpbnQgICAobHVhX2dldHRvcCkgKGx1YV9TdGF0ZSAqTCk7CitMVUFfQVBJIHZvaWQgIChsdWFfc2V0dG9wKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9wdXNodmFsdWUpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3JlbW92ZSkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIHZvaWQgIChsdWFfaW5zZXJ0KSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9yZXBsYWNlKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgaW50ICAgKGx1YV9jaGVja3N0YWNrKSAobHVhX1N0YXRlICpMLCBpbnQgc3opOworCitMVUFfQVBJIHZvaWQgIChsdWFfeG1vdmUpIChsdWFfU3RhdGUgKmZyb20sIGx1YV9TdGF0ZSAqdG8sIGludCBuKTsKKworCisvKgorKiogYWNjZXNzIGZ1bmN0aW9ucyAoc3RhY2sgLT4gQykKKyovCisKK0xVQV9BUEkgaW50ICAgICAgICAgICAgIChsdWFfaXNudW1iZXIpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSBpbnQgICAgICAgICAgICAgKGx1YV9pc3N0cmluZykgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGludCAgICAgICAgICAgICAobHVhX2lzY2Z1bmN0aW9uKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgaW50ICAgICAgICAgICAgIChsdWFfaXN1c2VyZGF0YSkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGludCAgICAgICAgICAgICAobHVhX3R5cGUpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSBjb25zdCBjaGFyICAgICAqKGx1YV90eXBlbmFtZSkgKGx1YV9TdGF0ZSAqTCwgaW50IHRwKTsKKworTFVBX0FQSSBpbnQgICAgICAgICAgICAobHVhX2VxdWFsKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4MSwgaW50IGlkeDIpOworTFVBX0FQSSBpbnQgICAgICAgICAgICAobHVhX3Jhd2VxdWFsKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4MSwgaW50IGlkeDIpOworTFVBX0FQSSBpbnQgICAgICAgICAgICAobHVhX2xlc3N0aGFuKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4MSwgaW50IGlkeDIpOworCitMVUFfQVBJIGx1YV9OdW1iZXIgICAgICAobHVhX3RvbnVtYmVyKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgbHVhX0ludGVnZXIgICAgIChsdWFfdG9pbnRlZ2VyKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgaW50ICAgICAgICAgICAgIChsdWFfdG9ib29sZWFuKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgY29uc3QgY2hhciAgICAgKihsdWFfdG9sc3RyaW5nKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBzaXplX3QgKmxlbik7CitMVUFfQVBJIHNpemVfdCAgICAgICAgICAobHVhX29iamxlbikgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGx1YV9DRnVuY3Rpb24gICAobHVhX3RvY2Z1bmN0aW9uKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgdm9pZAkgICAgICAgKihsdWFfdG91c2VyZGF0YSkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGx1YV9TdGF0ZSAgICAgICoobHVhX3RvdGhyZWFkKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgY29uc3Qgdm9pZCAgICAgKihsdWFfdG9wb2ludGVyKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKKworCisvKgorKiogcHVzaCBmdW5jdGlvbnMgKEMgLT4gc3RhY2spCisqLworTFVBX0FQSSB2b2lkICAobHVhX3B1c2huaWwpIChsdWFfU3RhdGUgKkwpOworTFVBX0FQSSB2b2lkICAobHVhX3B1c2hudW1iZXIpIChsdWFfU3RhdGUgKkwsIGx1YV9OdW1iZXIgbik7CitMVUFfQVBJIHZvaWQgIChsdWFfcHVzaGludGVnZXIpIChsdWFfU3RhdGUgKkwsIGx1YV9JbnRlZ2VyIG4pOworTFVBX0FQSSB2b2lkICAobHVhX3B1c2hsc3RyaW5nKSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbCk7CitMVUFfQVBJIHZvaWQgIChsdWFfcHVzaHN0cmluZykgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcyk7CitMVUFfQVBJIGNvbnN0IGNoYXIgKihsdWFfcHVzaHZmc3RyaW5nKSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3ApOworTFVBX0FQSSBjb25zdCBjaGFyICoobHVhX3B1c2hmc3RyaW5nKSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitMVUFfQVBJIHZvaWQgIChsdWFfcHVzaGNjbG9zdXJlKSAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIGZuLCBpbnQgbik7CitMVUFfQVBJIHZvaWQgIChsdWFfcHVzaGJvb2xlYW4pIChsdWFfU3RhdGUgKkwsIGludCBiKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9wdXNobGlnaHR1c2VyZGF0YSkgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqcCk7CitMVUFfQVBJIGludCAgIChsdWFfcHVzaHRocmVhZCkgKGx1YV9TdGF0ZSAqTCk7CisKKworLyoKKyoqIGdldCBmdW5jdGlvbnMgKEx1YSAtPiBzdGFjaykKKyovCitMVUFfQVBJIHZvaWQgIChsdWFfZ2V0dGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX2dldGZpZWxkKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCBjaGFyICprKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9yYXdnZXQpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3Jhd2dldGkpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCBuKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9jcmVhdGV0YWJsZSkgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcnIsIGludCBucmVjKTsKK0xVQV9BUEkgdm9pZCAqKGx1YV9uZXd1c2VyZGF0YSkgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHN6KTsKK0xVQV9BUEkgaW50ICAgKGx1YV9nZXRtZXRhdGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBvYmppbmRleCk7CitMVUFfQVBJIHZvaWQgIChsdWFfZ2V0ZmVudikgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CisKKworLyoKKyoqIHNldCBmdW5jdGlvbnMgKHN0YWNrIC0+IEx1YSkKKyovCitMVUFfQVBJIHZvaWQgIChsdWFfc2V0dGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3NldGZpZWxkKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCBjaGFyICprKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9yYXdzZXQpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3Jhd3NldGkpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCBuKTsKK0xVQV9BUEkgaW50ICAgKGx1YV9zZXRtZXRhdGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBvYmppbmRleCk7CitMVUFfQVBJIGludCAgIChsdWFfc2V0ZmVudikgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CisKKworLyoKKyoqIGBsb2FkJyBhbmQgYGNhbGwnIGZ1bmN0aW9ucyAobG9hZCBhbmQgcnVuIEx1YSBjb2RlKQorKi8KK0xVQV9BUEkgdm9pZCAgKGx1YV9jYWxsKSAobHVhX1N0YXRlICpMLCBpbnQgbmFyZ3MsIGludCBucmVzdWx0cyk7CitMVUFfQVBJIGludCAgIChsdWFfcGNhbGwpIChsdWFfU3RhdGUgKkwsIGludCBuYXJncywgaW50IG5yZXN1bHRzLCBpbnQgZXJyZnVuYyk7CitMVUFfQVBJIGludCAgIChsdWFfY3BjYWxsKSAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIGZ1bmMsIHZvaWQgKnVkKTsKK0xVQV9BUEkgaW50ICAgKGx1YV9sb2FkKSAobHVhX1N0YXRlICpMLCBsdWFfUmVhZGVyIHJlYWRlciwgdm9pZCAqZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY2h1bmtuYW1lKTsKKworTFVBX0FQSSBpbnQgKGx1YV9kdW1wKSAobHVhX1N0YXRlICpMLCBsdWFfV3JpdGVyIHdyaXRlciwgdm9pZCAqZGF0YSk7CisKKworLyoKKyoqIGNvcm91dGluZSBmdW5jdGlvbnMKKyovCitMVUFfQVBJIGludCAgKGx1YV95aWVsZCkgKGx1YV9TdGF0ZSAqTCwgaW50IG5yZXN1bHRzKTsKK0xVQV9BUEkgaW50ICAobHVhX3Jlc3VtZSkgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpOworTFVBX0FQSSBpbnQgIChsdWFfc3RhdHVzKSAobHVhX1N0YXRlICpMKTsKKworLyoKKyoqIGdhcmJhZ2UtY29sbGVjdGlvbiBmdW5jdGlvbiBhbmQgb3B0aW9ucworKi8KKworI2RlZmluZSBMVUFfR0NTVE9QCQkwCisjZGVmaW5lIExVQV9HQ1JFU1RBUlQJCTEKKyNkZWZpbmUgTFVBX0dDQ09MTEVDVAkJMgorI2RlZmluZSBMVUFfR0NDT1VOVAkJMworI2RlZmluZSBMVUFfR0NDT1VOVEIJCTQKKyNkZWZpbmUgTFVBX0dDU1RFUAkJNQorI2RlZmluZSBMVUFfR0NTRVRQQVVTRQkJNgorI2RlZmluZSBMVUFfR0NTRVRTVEVQTVVMCTcKKworTFVBX0FQSSBpbnQgKGx1YV9nYykgKGx1YV9TdGF0ZSAqTCwgaW50IHdoYXQsIGludCBkYXRhKTsKKworCisvKgorKiogbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMKKyovCisKK0xVQV9BUEkgaW50ICAgKGx1YV9lcnJvcikgKGx1YV9TdGF0ZSAqTCk7CisKK0xVQV9BUEkgaW50ICAgKGx1YV9uZXh0KSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKKworTFVBX0FQSSB2b2lkICAobHVhX2NvbmNhdCkgKGx1YV9TdGF0ZSAqTCwgaW50IG4pOworCitMVUFfQVBJIGx1YV9BbGxvYyAobHVhX2dldGFsbG9jZikgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqKnVkKTsKK0xVQV9BUEkgdm9pZCBsdWFfc2V0YWxsb2NmIChsdWFfU3RhdGUgKkwsIGx1YV9BbGxvYyBmLCB2b2lkICp1ZCk7CisKKworCisvKiAKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogc29tZSB1c2VmdWwgbWFjcm9zCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNkZWZpbmUgbHVhX3BvcChMLG4pCQlsdWFfc2V0dG9wKEwsIC0obiktMSkKKworI2RlZmluZSBsdWFfbmV3dGFibGUoTCkJCWx1YV9jcmVhdGV0YWJsZShMLCAwLCAwKQorCisjZGVmaW5lIGx1YV9yZWdpc3RlcihMLG4sZikgKGx1YV9wdXNoY2Z1bmN0aW9uKEwsIChmKSksIGx1YV9zZXRnbG9iYWwoTCwgKG4pKSkKKworI2RlZmluZSBsdWFfcHVzaGNmdW5jdGlvbihMLGYpCWx1YV9wdXNoY2Nsb3N1cmUoTCwgKGYpLCAwKQorCisjZGVmaW5lIGx1YV9zdHJsZW4oTCxpKQkJbHVhX29iamxlbihMLCAoaSkpCisKKyNkZWZpbmUgbHVhX2lzZnVuY3Rpb24oTCxuKQkobHVhX3R5cGUoTCwgKG4pKSA9PSBMVUFfVEZVTkNUSU9OKQorI2RlZmluZSBsdWFfaXN0YWJsZShMLG4pCShsdWFfdHlwZShMLCAobikpID09IExVQV9UVEFCTEUpCisjZGVmaW5lIGx1YV9pc2xpZ2h0dXNlcmRhdGEoTCxuKQkobHVhX3R5cGUoTCwgKG4pKSA9PSBMVUFfVExJR0hUVVNFUkRBVEEpCisjZGVmaW5lIGx1YV9pc25pbChMLG4pCQkobHVhX3R5cGUoTCwgKG4pKSA9PSBMVUFfVE5JTCkKKyNkZWZpbmUgbHVhX2lzYm9vbGVhbihMLG4pCShsdWFfdHlwZShMLCAobikpID09IExVQV9UQk9PTEVBTikKKyNkZWZpbmUgbHVhX2lzdGhyZWFkKEwsbikJKGx1YV90eXBlKEwsIChuKSkgPT0gTFVBX1RUSFJFQUQpCisjZGVmaW5lIGx1YV9pc25vbmUoTCxuKQkJKGx1YV90eXBlKEwsIChuKSkgPT0gTFVBX1ROT05FKQorI2RlZmluZSBsdWFfaXNub25lb3JuaWwoTCwgbikJKGx1YV90eXBlKEwsIChuKSkgPD0gMCkKKworI2RlZmluZSBsdWFfcHVzaGxpdGVyYWwoTCwgcykJXAorCWx1YV9wdXNobHN0cmluZyhMLCAiIiBzLCAoc2l6ZW9mKHMpL3NpemVvZihjaGFyKSktMSkKKworI2RlZmluZSBsdWFfc2V0Z2xvYmFsKEwscykJbHVhX3NldGZpZWxkKEwsIExVQV9HTE9CQUxTSU5ERVgsIChzKSkKKyNkZWZpbmUgbHVhX2dldGdsb2JhbChMLHMpCWx1YV9nZXRmaWVsZChMLCBMVUFfR0xPQkFMU0lOREVYLCAocykpCisKKyNkZWZpbmUgbHVhX3Rvc3RyaW5nKEwsaSkJbHVhX3RvbHN0cmluZyhMLCAoaSksIE5VTEwpCisKKworCisvKgorKiogY29tcGF0aWJpbGl0eSBtYWNyb3MgYW5kIGZ1bmN0aW9ucworKi8KKworI2RlZmluZSBsdWFfb3BlbigpCWx1YUxfbmV3c3RhdGUoKQorCisjZGVmaW5lIGx1YV9nZXRyZWdpc3RyeShMKQlsdWFfcHVzaHZhbHVlKEwsIExVQV9SRUdJU1RSWUlOREVYKQorCisjZGVmaW5lIGx1YV9nZXRnY2NvdW50KEwpCWx1YV9nYyhMLCBMVUFfR0NDT1VOVCwgMCkKKworI2RlZmluZSBsdWFfQ2h1bmtyZWFkZXIJCWx1YV9SZWFkZXIKKyNkZWZpbmUgbHVhX0NodW5rd3JpdGVyCQlsdWFfV3JpdGVyCisKKworLyogaGFjayAqLworTFVBX0FQSSB2b2lkIGx1YV9zZXRsZXZlbAkobHVhX1N0YXRlICpmcm9tLCBsdWFfU3RhdGUgKnRvKTsKKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIERlYnVnIEFQSQorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworLyoKKyoqIEV2ZW50IGNvZGVzCisqLworI2RlZmluZSBMVUFfSE9PS0NBTEwJMAorI2RlZmluZSBMVUFfSE9PS1JFVAkxCisjZGVmaW5lIExVQV9IT09LTElORQkyCisjZGVmaW5lIExVQV9IT09LQ09VTlQJMworI2RlZmluZSBMVUFfSE9PS1RBSUxSRVQgNAorCisKKy8qCisqKiBFdmVudCBtYXNrcworKi8KKyNkZWZpbmUgTFVBX01BU0tDQUxMCSgxIDw8IExVQV9IT09LQ0FMTCkKKyNkZWZpbmUgTFVBX01BU0tSRVQJKDEgPDwgTFVBX0hPT0tSRVQpCisjZGVmaW5lIExVQV9NQVNLTElORQkoMSA8PCBMVUFfSE9PS0xJTkUpCisjZGVmaW5lIExVQV9NQVNLQ09VTlQJKDEgPDwgTFVBX0hPT0tDT1VOVCkKKwordHlwZWRlZiBzdHJ1Y3QgbHVhX0RlYnVnIGx1YV9EZWJ1ZzsgIC8qIGFjdGl2YXRpb24gcmVjb3JkICovCisKKworLyogRnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBieSB0aGUgZGVidWdlciBpbiBzcGVjaWZpYyBldmVudHMgKi8KK3R5cGVkZWYgdm9pZCAoKmx1YV9Ib29rKSAobHVhX1N0YXRlICpMLCBsdWFfRGVidWcgKmFyKTsKKworCitMVUFfQVBJIGludCBsdWFfZ2V0c3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IGxldmVsLCBsdWFfRGVidWcgKmFyKTsKK0xVQV9BUEkgaW50IGx1YV9nZXRpbmZvIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKndoYXQsIGx1YV9EZWJ1ZyAqYXIpOworTFVBX0FQSSBjb25zdCBjaGFyICpsdWFfZ2V0bG9jYWwgKGx1YV9TdGF0ZSAqTCwgY29uc3QgbHVhX0RlYnVnICphciwgaW50IG4pOworTFVBX0FQSSBjb25zdCBjaGFyICpsdWFfc2V0bG9jYWwgKGx1YV9TdGF0ZSAqTCwgY29uc3QgbHVhX0RlYnVnICphciwgaW50IG4pOworTFVBX0FQSSBjb25zdCBjaGFyICpsdWFfZ2V0dXB2YWx1ZSAobHVhX1N0YXRlICpMLCBpbnQgZnVuY2luZGV4LCBpbnQgbik7CitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV9zZXR1cHZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBmdW5jaW5kZXgsIGludCBuKTsKKworTFVBX0FQSSBpbnQgbHVhX3NldGhvb2sgKGx1YV9TdGF0ZSAqTCwgbHVhX0hvb2sgZnVuYywgaW50IG1hc2ssIGludCBjb3VudCk7CitMVUFfQVBJIGx1YV9Ib29rIGx1YV9nZXRob29rIChsdWFfU3RhdGUgKkwpOworTFVBX0FQSSBpbnQgbHVhX2dldGhvb2ttYXNrIChsdWFfU3RhdGUgKkwpOworTFVBX0FQSSBpbnQgbHVhX2dldGhvb2tjb3VudCAobHVhX1N0YXRlICpMKTsKKworCitzdHJ1Y3QgbHVhX0RlYnVnIHsKKyAgaW50IGV2ZW50OworICBjb25zdCBjaGFyICpuYW1lOwkvKiAobikgKi8KKyAgY29uc3QgY2hhciAqbmFtZXdoYXQ7CS8qIChuKSBgZ2xvYmFsJywgYGxvY2FsJywgYGZpZWxkJywgYG1ldGhvZCcgKi8KKyAgY29uc3QgY2hhciAqd2hhdDsJLyogKFMpIGBMdWEnLCBgQycsIGBtYWluJywgYHRhaWwnICovCisgIGNvbnN0IGNoYXIgKnNvdXJjZTsJLyogKFMpICovCisgIGludCBjdXJyZW50bGluZTsJLyogKGwpICovCisgIGludCBudXBzOwkJLyogKHUpIG51bWJlciBvZiB1cHZhbHVlcyAqLworICBpbnQgbGluZWRlZmluZWQ7CS8qIChTKSAqLworICBpbnQgbGFzdGxpbmVkZWZpbmVkOwkvKiAoUykgKi8KKyAgY2hhciBzaG9ydF9zcmNbTFVBX0lEU0laRV07IC8qIChTKSAqLworICAvKiBwcml2YXRlIHBhcnQgKi8KKyAgaW50IGlfY2k7ICAvKiBhY3RpdmUgZnVuY3Rpb24gKi8KK307CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwOCBMdWEub3JnLCBQVUMtUmlvLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqCisqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKgorKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2x1YWMuYyBiL2x1YS01LjEuNC9zcmMvbHVhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzAxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2x1YWMuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyoqICRJZDogbHVhYy5jLHYgMS41NCAyMDA2LzA2LzAyIDE3OjM3OjExIGxoZiBFeHAgJAorKiogTHVhIGNvbXBpbGVyIChzYXZlcyBieXRlY29kZXMgdG8gZmlsZXM7IGFsc28gbGlzdCBieXRlY29kZXMpCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsdWFjX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKworI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxmdW5jLmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsb3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdW5kdW1wLmgiCisKKyNkZWZpbmUgUFJPR05BTUUJImx1YWMiCQkvKiBkZWZhdWx0IHByb2dyYW0gbmFtZSAqLworI2RlZmluZQlPVVRQVVQJCVBST0dOQU1FICIub3V0IgkvKiBkZWZhdWx0IG91dHB1dCBmaWxlICovCisKK3N0YXRpYyBpbnQgbGlzdGluZz0wOwkJCS8qIGxpc3QgYnl0ZWNvZGVzPyAqLworc3RhdGljIGludCBkdW1waW5nPTE7CQkJLyogZHVtcCBieXRlY29kZXM/ICovCitzdGF0aWMgaW50IHN0cmlwcGluZz0wOwkJCS8qIHN0cmlwIGRlYnVnIGluZm9ybWF0aW9uPyAqLworc3RhdGljIGNoYXIgT3V0cHV0W109eyBPVVRQVVQgfTsJLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lICovCitzdGF0aWMgY29uc3QgY2hhciogb3V0cHV0PU91dHB1dDsJLyogYWN0dWFsIG91dHB1dCBmaWxlIG5hbWUgKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBwcm9nbmFtZT1QUk9HTkFNRTsJLyogYWN0dWFsIHByb2dyYW0gbmFtZSAqLworCitzdGF0aWMgdm9pZCBmYXRhbChjb25zdCBjaGFyKiBtZXNzYWdlKQoreworIGZwcmludGYoc3RkZXJyLCIlczogJXNcbiIscHJvZ25hbWUsbWVzc2FnZSk7CisgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitzdGF0aWMgdm9pZCBjYW5ub3QoY29uc3QgY2hhciogd2hhdCkKK3sKKyBmcHJpbnRmKHN0ZGVyciwiJXM6IGNhbm5vdCAlcyAlczogJXNcbiIscHJvZ25hbWUsd2hhdCxvdXRwdXQsc3RyZXJyb3IoZXJybm8pKTsKKyBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7CisgaWYgKCptZXNzYWdlPT0nLScpCisgIGZwcmludGYoc3RkZXJyLCIlczogdW5yZWNvZ25pemVkIG9wdGlvbiAiIExVQV9RUyAiXG4iLHByb2duYW1lLG1lc3NhZ2UpOworIGVsc2UKKyAgZnByaW50ZihzdGRlcnIsIiVzOiAlc1xuIixwcm9nbmFtZSxtZXNzYWdlKTsKKyBmcHJpbnRmKHN0ZGVyciwKKyAidXNhZ2U6ICVzIFtvcHRpb25zXSBbZmlsZW5hbWVzXS5cbiIKKyAiQXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuIgorICIgIC0gICAgICAgIHByb2Nlc3Mgc3RkaW5cbiIKKyAiICAtbCAgICAgICBsaXN0XG4iCisgIiAgLW8gbmFtZSAgb3V0cHV0IHRvIGZpbGUgIiBMVUFfUUwoIm5hbWUiKSAiIChkZWZhdWx0IGlzIFwiJXNcIilcbiIKKyAiICAtcCAgICAgICBwYXJzZSBvbmx5XG4iCisgIiAgLXMgICAgICAgc3RyaXAgZGVidWcgaW5mb3JtYXRpb25cbiIKKyAiICAtdiAgICAgICBzaG93IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKKyAiICAtLSAgICAgICBzdG9wIGhhbmRsaW5nIG9wdGlvbnNcbiIsCisgcHJvZ25hbWUsT3V0cHV0KTsKKyBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKyNkZWZpbmUJSVMocykJKHN0cmNtcChhcmd2W2ldLHMpPT0wKQorCitzdGF0aWMgaW50IGRvYXJncyhpbnQgYXJnYywgY2hhciogYXJndltdKQoreworIGludCBpOworIGludCB2ZXJzaW9uPTA7CisgaWYgKGFyZ3ZbMF0hPU5VTEwgJiYgKmFyZ3ZbMF0hPTApIHByb2duYW1lPWFyZ3ZbMF07CisgZm9yIChpPTE7IGk8YXJnYzsgaSsrKQorIHsKKyAgaWYgKCphcmd2W2ldIT0nLScpCQkJLyogZW5kIG9mIG9wdGlvbnM7IGtlZXAgaXQgKi8KKyAgIGJyZWFrOworICBlbHNlIGlmIChJUygiLS0iKSkJCQkvKiBlbmQgb2Ygb3B0aW9uczsgc2tpcCBpdCAqLworICB7CisgICArK2k7CisgICBpZiAodmVyc2lvbikgKyt2ZXJzaW9uOworICAgYnJlYWs7CisgIH0KKyAgZWxzZSBpZiAoSVMoIi0iKSkJCQkvKiBlbmQgb2Ygb3B0aW9uczsgdXNlIHN0ZGluICovCisgICBicmVhazsKKyAgZWxzZSBpZiAoSVMoIi1sIikpCQkJLyogbGlzdCAqLworICAgKytsaXN0aW5nOworICBlbHNlIGlmIChJUygiLW8iKSkJCQkvKiBvdXRwdXQgZmlsZSAqLworICB7CisgICBvdXRwdXQ9YXJndlsrK2ldOworICAgaWYgKG91dHB1dD09TlVMTCB8fCAqb3V0cHV0PT0wKSB1c2FnZShMVUFfUUwoIi1vIikgIiBuZWVkcyBhcmd1bWVudCIpOworICAgaWYgKElTKCItIikpIG91dHB1dD1OVUxMOworICB9CisgIGVsc2UgaWYgKElTKCItcCIpKQkJCS8qIHBhcnNlIG9ubHkgKi8KKyAgIGR1bXBpbmc9MDsKKyAgZWxzZSBpZiAoSVMoIi1zIikpCQkJLyogc3RyaXAgZGVidWcgaW5mb3JtYXRpb24gKi8KKyAgIHN0cmlwcGluZz0xOworICBlbHNlIGlmIChJUygiLXYiKSkJCQkvKiBzaG93IHZlcnNpb24gKi8KKyAgICsrdmVyc2lvbjsKKyAgZWxzZQkJCQkJLyogdW5rbm93biBvcHRpb24gKi8KKyAgIHVzYWdlKGFyZ3ZbaV0pOworIH0KKyBpZiAoaT09YXJnYyAmJiAobGlzdGluZyB8fCAhZHVtcGluZykpCisgeworICBkdW1waW5nPTA7CisgIGFyZ3ZbLS1pXT1PdXRwdXQ7CisgfQorIGlmICh2ZXJzaW9uKQorIHsKKyAgcHJpbnRmKCIlcyAgJXNcbiIsTFVBX1JFTEVBU0UsTFVBX0NPUFlSSUdIVCk7CisgIGlmICh2ZXJzaW9uPT1hcmdjLTEpIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyB9CisgcmV0dXJuIGk7Cit9CisKKyNkZWZpbmUgdG9wcm90byhMLGkpIChjbHZhbHVlKEwtPnRvcCsoaSkpLT5sLnApCisKK3N0YXRpYyBjb25zdCBQcm90byogY29tYmluZShsdWFfU3RhdGUqIEwsIGludCBuKQoreworIGlmIChuPT0xKQorICByZXR1cm4gdG9wcm90byhMLC0xKTsKKyBlbHNlCisgeworICBpbnQgaSxwYzsKKyAgUHJvdG8qIGY9bHVhRl9uZXdwcm90byhMKTsKKyAgc2V0cHR2YWx1ZTJzKEwsTC0+dG9wLGYpOyBpbmNyX3RvcChMKTsKKyAgZi0+c291cmNlPWx1YVNfbmV3bGl0ZXJhbChMLCI9KCIgUFJPR05BTUUgIikiKTsKKyAgZi0+bWF4c3RhY2tzaXplPTE7CisgIHBjPTIqbisxOworICBmLT5jb2RlPWx1YU1fbmV3dmVjdG9yKEwscGMsSW5zdHJ1Y3Rpb24pOworICBmLT5zaXplY29kZT1wYzsKKyAgZi0+cD1sdWFNX25ld3ZlY3RvcihMLG4sUHJvdG8qKTsKKyAgZi0+c2l6ZXA9bjsKKyAgcGM9MDsKKyAgZm9yIChpPTA7IGk8bjsgaSsrKQorICB7CisgICBmLT5wW2ldPXRvcHJvdG8oTCxpLW4tMSk7CisgICBmLT5jb2RlW3BjKytdPUNSRUFURV9BQngoT1BfQ0xPU1VSRSwwLGkpOworICAgZi0+Y29kZVtwYysrXT1DUkVBVEVfQUJDKE9QX0NBTEwsMCwxLDEpOworICB9CisgIGYtPmNvZGVbcGMrK109Q1JFQVRFX0FCQyhPUF9SRVRVUk4sMCwxLDApOworICByZXR1cm4gZjsKKyB9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVyKGx1YV9TdGF0ZSogTCwgY29uc3Qgdm9pZCogcCwgc2l6ZV90IHNpemUsIHZvaWQqIHUpCit7CisgVU5VU0VEKEwpOworIHJldHVybiAoZndyaXRlKHAsc2l6ZSwxLChGSUxFKil1KSE9MSkgJiYgKHNpemUhPTApOworfQorCitzdHJ1Y3QgU21haW4geworIGludCBhcmdjOworIGNoYXIqKiBhcmd2OworfTsKKworc3RhdGljIGludCBwbWFpbihsdWFfU3RhdGUqIEwpCit7Cisgc3RydWN0IFNtYWluKiBzID0gKHN0cnVjdCBTbWFpbiopbHVhX3RvdXNlcmRhdGEoTCwgMSk7CisgaW50IGFyZ2M9cy0+YXJnYzsKKyBjaGFyKiogYXJndj1zLT5hcmd2OworIGNvbnN0IFByb3RvKiBmOworIGludCBpOworIGlmICghbHVhX2NoZWNrc3RhY2soTCxhcmdjKSkgZmF0YWwoInRvbyBtYW55IGlucHV0IGZpbGVzIik7CisgZm9yIChpPTA7IGk8YXJnYzsgaSsrKQorIHsKKyAgY29uc3QgY2hhciogZmlsZW5hbWU9SVMoIi0iKSA/IE5VTEwgOiBhcmd2W2ldOworICBpZiAobHVhTF9sb2FkZmlsZShMLGZpbGVuYW1lKSE9MCkgZmF0YWwobHVhX3Rvc3RyaW5nKEwsLTEpKTsKKyB9CisgZj1jb21iaW5lKEwsYXJnYyk7CisgaWYgKGxpc3RpbmcpIGx1YVVfcHJpbnQoZixsaXN0aW5nPjEpOworIGlmIChkdW1waW5nKQorIHsKKyAgRklMRSogRD0gKG91dHB1dD09TlVMTCkgPyBzdGRvdXQgOiBmb3BlbihvdXRwdXQsIndiIik7CisgIGlmIChEPT1OVUxMKSBjYW5ub3QoIm9wZW4iKTsKKyAgbHVhX2xvY2soTCk7CisgIGx1YVVfZHVtcChMLGYsd3JpdGVyLEQsc3RyaXBwaW5nKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgaWYgKGZlcnJvcihEKSkgY2Fubm90KCJ3cml0ZSIpOworICBpZiAoZmNsb3NlKEQpKSBjYW5ub3QoImNsb3NlIik7CisgfQorIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworIGx1YV9TdGF0ZSogTDsKKyBzdHJ1Y3QgU21haW4gczsKKyBpbnQgaT1kb2FyZ3MoYXJnYyxhcmd2KTsKKyBhcmdjLT1pOyBhcmd2Kz1pOworIGlmIChhcmdjPD0wKSB1c2FnZSgibm8gaW5wdXQgZmlsZXMgZ2l2ZW4iKTsKKyBMPWx1YV9vcGVuKCk7CisgaWYgKEw9PU5VTEwpIGZhdGFsKCJub3QgZW5vdWdoIG1lbW9yeSBmb3Igc3RhdGUiKTsKKyBzLmFyZ2M9YXJnYzsKKyBzLmFyZ3Y9YXJndjsKKyBpZiAobHVhX2NwY2FsbChMLHBtYWluLCZzKSE9MCkgZmF0YWwobHVhX3Rvc3RyaW5nKEwsLTEpKTsKKyBsdWFfY2xvc2UoTCk7CisgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHVhY29uZi5oIGIvbHVhLTUuMS40L3NyYy9sdWFjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2OTJmMwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHVhY29uZi5oCkBAIC0wLDAgKzEsNzYzIEBACisvKgorKiogJElkOiBsdWFjb25mLmgsdiAxLjgyLjEuNyAyMDA4LzAyLzExIDE2OjI1OjA4IHJvYmVydG8gRXhwICQKKyoqIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgTHVhCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaWZuZGVmIGxjb25maWdfaAorI2RlZmluZSBsY29uZmlnX2gKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8qCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFNlYXJjaCBmb3IgIkBAIiB0byBmaW5kIGFsbCBjb25maWd1cmFibGUgZGVmaW5pdGlvbnMuCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKy8qCitAQCBMVUFfQU5TSSBjb250cm9scyB0aGUgdXNlIG9mIG5vbi1hbnNpIGZlYXR1cmVzLgorKiogQ0hBTkdFIGl0IChkZWZpbmUgaXQpIGlmIHlvdSB3YW50IEx1YSB0byBhdm9pZCB0aGUgdXNlIG9mIGFueQorKiogbm9uLWFuc2kgZmVhdHVyZSBvciBsaWJyYXJ5LgorKi8KKyNpZiBkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKKyNkZWZpbmUgTFVBX0FOU0kKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChMVUFfQU5TSSkgJiYgZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIExVQV9XSU4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChMVUFfVVNFX0xJTlVYKQorI2RlZmluZSBMVUFfVVNFX1BPU0lYCisjZGVmaW5lIExVQV9VU0VfRExPUEVOCQkvKiBuZWVkcyBhbiBleHRyYSBsaWJyYXJ5OiAtbGRsICovCisjZGVmaW5lIExVQV9VU0VfUkVBRExJTkUJLyogbmVlZHMgc29tZSBleHRyYSBsaWJyYXJpZXMgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChMVUFfVVNFX01BQ09TWCkKKyNkZWZpbmUgTFVBX1VTRV9QT1NJWAorI2RlZmluZSBMVUFfRExfRFlMRAkJLyogZG9lcyBub3QgbmVlZCBleHRyYSBsaWJyYXJ5ICovCisjZW5kaWYKKworCisKKy8qCitAQCBMVUFfVVNFX1BPU0lYIGluY2x1ZGVzIGFsbCBmdW5jdGlvbmFsbGl0eSBsaXN0ZWQgYXMgWC9PcGVuIFN5c3RlbQorQCogSW50ZXJmYWNlcyBFeHRlbnNpb24gKFhTSSkuCisqKiBDSEFOR0UgaXQgKGRlZmluZSBpdCkgaWYgeW91ciBzeXN0ZW0gaXMgWFNJIGNvbXBhdGlibGUuCisqLworI2lmIGRlZmluZWQoTFVBX1VTRV9QT1NJWCkKKyNkZWZpbmUgTFVBX1VTRV9NS1NURU1QCisjZGVmaW5lIExVQV9VU0VfSVNBVFRZCisjZGVmaW5lIExVQV9VU0VfUE9QRU4KKyNkZWZpbmUgTFVBX1VTRV9VTE9OR0pNUAorI2VuZGlmCisKKworLyoKK0BAIExVQV9QQVRIIGFuZCBMVUFfQ1BBVEggYXJlIHRoZSBuYW1lcyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQKK0AqIEx1YSBjaGVjayB0byBzZXQgaXRzIHBhdGhzLgorQEAgTFVBX0lOSVQgaXMgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgTHVhCitAKiBjaGVja3MgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUuCisqKiBDSEFOR0UgdGhlbSBpZiB5b3Ugd2FudCBkaWZmZXJlbnQgbmFtZXMuCisqLworI2RlZmluZSBMVUFfUEFUSCAgICAgICAgIkxVQV9QQVRIIgorI2RlZmluZSBMVUFfQ1BBVEggICAgICAgIkxVQV9DUEFUSCIKKyNkZWZpbmUgTFVBX0lOSVQJIkxVQV9JTklUIgorCisKKy8qCitAQCBMVUFfUEFUSF9ERUZBVUxUIGlzIHRoZSBkZWZhdWx0IHBhdGggdGhhdCBMdWEgdXNlcyB0byBsb29rIGZvcgorQCogTHVhIGxpYnJhcmllcy4KK0BAIExVQV9DUEFUSF9ERUZBVUxUIGlzIHRoZSBkZWZhdWx0IHBhdGggdGhhdCBMdWEgdXNlcyB0byBsb29rIGZvcgorQCogQyBsaWJyYXJpZXMuCisqKiBDSEFOR0UgdGhlbSBpZiB5b3VyIG1hY2hpbmUgaGFzIGEgbm9uLWNvbnZlbnRpb25hbCBkaXJlY3RvcnkKKyoqIGhpZXJhcmNoeSBvciBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIHlvdXIgbGlicmFyaWVzIGluCisqKiBub24tY29udmVudGlvbmFsIGRpcmVjdG9yaWVzLgorKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikKKy8qCisqKiBJbiBXaW5kb3dzLCBhbnkgZXhjbGFtYXRpb24gbWFyayAoJyEnKSBpbiB0aGUgcGF0aCBpcyByZXBsYWNlZCBieSB0aGUKKyoqIHBhdGggb2YgdGhlIGRpcmVjdG9yeSBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisqLworI2RlZmluZSBMVUFfTERJUgkiIVxcbHVhXFwiCisjZGVmaW5lIExVQV9DRElSCSIhXFwiCisjZGVmaW5lIExVQV9QQVRIX0RFRkFVTFQgIFwKKwkJIi5cXD8ubHVhOyIgIExVQV9MRElSIj8ubHVhOyIgIExVQV9MRElSIj9cXGluaXQubHVhOyIgXAorCQkgICAgICAgICAgICAgTFVBX0NESVIiPy5sdWE7IiAgTFVBX0NESVIiP1xcaW5pdC5sdWEiCisjZGVmaW5lIExVQV9DUEFUSF9ERUZBVUxUIFwKKwkiLlxcPy5kbGw7IiAgTFVBX0NESVIiPy5kbGw7IiBMVUFfQ0RJUiJsb2FkYWxsLmRsbCIKKworI2Vsc2UKKyNkZWZpbmUgTFVBX1JPT1QJIi91c3IvIgorI2RlZmluZSBMVUFfTERJUglMVUFfUk9PVCAic2hhcmUvbHVhLzUuMS8iCisjZGVmaW5lIExVQV9DRElSCUxVQV9ST09UICJsaWIvbHVhLzUuMS8iCisjZGVmaW5lIExVQV9QQVRIX0RFRkFVTFQgIFwKKwkJIi4vPy5sdWE7IiAgTFVBX0xESVIiPy5sdWE7IiAgTFVBX0xESVIiPy9pbml0Lmx1YTsiIFwKKwkJICAgICAgICAgICAgTFVBX0NESVIiPy5sdWE7IiAgTFVBX0NESVIiPy9pbml0Lmx1YSIKKyNkZWZpbmUgTFVBX0NQQVRIX0RFRkFVTFQgXAorCSIuLz8uc287IiAgTFVBX0NESVIiPy5zbzsiIExVQV9DRElSImxvYWRhbGwuc28iCisjZW5kaWYKKworCisvKgorQEAgTFVBX0RJUlNFUCBpcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciAoZm9yIHN1Ym1vZHVsZXMpLgorKiogQ0hBTkdFIGl0IGlmIHlvdXIgbWFjaGluZSBkb2VzIG5vdCB1c2UgIi8iIGFzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yCisqKiBhbmQgaXMgbm90IFdpbmRvd3MuIChPbiBXaW5kb3dzIEx1YSBhdXRvbWF0aWNhbGx5IHVzZXMgIlwiLikKKyovCisjaWYgZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIExVQV9ESVJTRVAJIlxcIgorI2Vsc2UKKyNkZWZpbmUgTFVBX0RJUlNFUAkiLyIKKyNlbmRpZgorCisKKy8qCitAQCBMVUFfUEFUSFNFUCBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgc2VwYXJhdGVzIHRlbXBsYXRlcyBpbiBhIHBhdGguCitAQCBMVUFfUEFUSF9NQVJLIGlzIHRoZSBzdHJpbmcgdGhhdCBtYXJrcyB0aGUgc3Vic3RpdHV0aW9uIHBvaW50cyBpbiBhCitAKiB0ZW1wbGF0ZS4KK0BAIExVQV9FWEVDRElSIGluIGEgV2luZG93cyBwYXRoIGlzIHJlcGxhY2VkIGJ5IHRoZSBleGVjdXRhYmxlJ3MKK0AqIGRpcmVjdG9yeS4KK0BAIExVQV9JR01BUksgaXMgYSBtYXJrIHRvIGlnbm9yZSBhbGwgYmVmb3JlIGl0IHdoZW4gYnVsZGluZyB0aGUKK0AqIGx1YW9wZW5fIGZ1bmN0aW9uIG5hbWUuCisqKiBDSEFOR0UgdGhlbSBpZiBmb3Igc29tZSByZWFzb24geW91ciBzeXN0ZW0gY2Fubm90IHVzZSB0aG9zZQorKiogY2hhcmFjdGVycy4gKEUuZy4sIGlmIG9uZSBvZiB0aG9zZSBjaGFyYWN0ZXJzIGlzIGEgY29tbW9uIGNoYXJhY3RlcgorKiogaW4gZmlsZS9kaXJlY3RvcnkgbmFtZXMuKSBQcm9iYWJseSB5b3UgZG8gbm90IG5lZWQgdG8gY2hhbmdlIHRoZW0uCisqLworI2RlZmluZSBMVUFfUEFUSFNFUAkiOyIKKyNkZWZpbmUgTFVBX1BBVEhfTUFSSwkiPyIKKyNkZWZpbmUgTFVBX0VYRUNESVIJIiEiCisjZGVmaW5lIExVQV9JR01BUksJIi0iCisKKworLyoKK0BAIExVQV9JTlRFR0VSIGlzIHRoZSBpbnRlZ3JhbCB0eXBlIHVzZWQgYnkgbHVhX3B1c2hpbnRlZ2VyL2x1YV90b2ludGVnZXIuCisqKiBDSEFOR0UgdGhhdCBpZiBwdHJkaWZmX3QgaXMgbm90IGFkZXF1YXRlIG9uIHlvdXIgbWFjaGluZS4gKE9uIG1vc3QKKyoqIG1hY2hpbmVzLCBwdHJkaWZmX3QgZ2l2ZXMgYSBnb29kIGNob2ljZSBiZXR3ZWVuIGludCBvciBsb25nLikKKyovCisjZGVmaW5lIExVQV9JTlRFR0VSCXB0cmRpZmZfdAorCisKKy8qCitAQCBMVUFfQVBJIGlzIGEgbWFyayBmb3IgYWxsIGNvcmUgQVBJIGZ1bmN0aW9ucy4KK0BAIExVQUxJQl9BUEkgaXMgYSBtYXJrIGZvciBhbGwgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMuCisqKiBDSEFOR0UgdGhlbSBpZiB5b3UgbmVlZCB0byBkZWZpbmUgdGhvc2UgZnVuY3Rpb25zIGluIHNvbWUgc3BlY2lhbCB3YXkuCisqKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBvbmUgV2luZG93cyBETEwgd2l0aCB0aGUgY29yZSBhbmQKKyoqIHRoZSBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byB1c2UgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIChkZWZpbmUKKyoqIExVQV9CVUlMRF9BU19ETEwgdG8gZ2V0IGl0KS4KKyovCisjaWYgZGVmaW5lZChMVUFfQlVJTERfQVNfRExMKQorCisjaWYgZGVmaW5lZChMVUFfQ09SRSkgfHwgZGVmaW5lZChMVUFfTElCKQorI2RlZmluZSBMVUFfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2Vsc2UKKyNkZWZpbmUgTFVBX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgorCisjZWxzZQorCisjZGVmaW5lIExVQV9BUEkJCWV4dGVybgorCisjZW5kaWYKKworLyogbW9yZSBvZnRlbiB0aGFuIG5vdCB0aGUgbGlicyBnbyB0b2dldGhlciB3aXRoIHRoZSBjb3JlICovCisjZGVmaW5lIExVQUxJQl9BUEkJTFVBX0FQSQorCisKKy8qCitAQCBMVUFJX0ZVTkMgaXMgYSBtYXJrIGZvciBhbGwgZXh0ZXJuIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgdG8gYmUKK0AqIGV4cG9ydGVkIHRvIG91dHNpZGUgbW9kdWxlcy4KK0BAIExVQUlfREFUQSBpcyBhIG1hcmsgZm9yIGFsbCBleHRlcm4gKGNvbnN0KSB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IHRvCitAKiBiZSBleHBvcnRlZCB0byBvdXRzaWRlIG1vZHVsZXMuCisqKiBDSEFOR0UgdGhlbSBpZiB5b3UgbmVlZCB0byBtYXJrIHRoZW0gaW4gc29tZSBzcGVjaWFsIHdheS4gRWxmL2djYworKiogKHZlcnNpb25zIDMuMiBhbmQgbGF0ZXIpIG1hcmsgdGhlbSBhcyAiaGlkZGVuIiB0byBvcHRpbWl6ZSBhY2Nlc3MKKyoqIHdoZW4gTHVhIGlzIGNvbXBpbGVkIGFzIGEgc2hhcmVkIGxpYnJhcnkuCisqLworI2lmIGRlZmluZWQobHVhYWxsX2MpCisjZGVmaW5lIExVQUlfRlVOQwlzdGF0aWMKKyNkZWZpbmUgTFVBSV9EQVRBCS8qIGVtcHR5ICovCisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18qMTAwICsgX19HTlVDX01JTk9SX18pID49IDMwMikgJiYgXAorICAgICAgZGVmaW5lZChfX0VMRl9fKQorI2RlZmluZSBMVUFJX0ZVTkMJX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKSBleHRlcm4KKyNkZWZpbmUgTFVBSV9EQVRBCUxVQUlfRlVOQworCisjZWxzZQorI2RlZmluZSBMVUFJX0ZVTkMJZXh0ZXJuCisjZGVmaW5lIExVQUlfREFUQQlleHRlcm4KKyNlbmRpZgorCisKKworLyoKK0BAIExVQV9RTCBkZXNjcmliZXMgaG93IGVycm9yIG1lc3NhZ2VzIHF1b3RlIHByb2dyYW0gZWxlbWVudHMuCisqKiBDSEFOR0UgaXQgaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgYXBwZWFyYW5jZS4KKyovCisjZGVmaW5lIExVQV9RTCh4KQkiJyIgeCAiJyIKKyNkZWZpbmUgTFVBX1FTCQlMVUFfUUwoIiVzIikKKworCisvKgorQEAgTFVBX0lEU0laRSBnaXZlcyB0aGUgbWF4aW11bSBzaXplIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNvdXJjZQorQCogb2YgYSBmdW5jdGlvbiBpbiBkZWJ1ZyBpbmZvcm1hdGlvbi4KKyoqIENIQU5HRSBpdCBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBzaXplLgorKi8KKyNkZWZpbmUgTFVBX0lEU0laRQk2MAorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBTdGFuZC1hbG9uZSBjb25maWd1cmF0aW9uCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgZGVmaW5lZChsdWFfYykgfHwgZGVmaW5lZChsdWFhbGxfYykKKworLyoKK0BAIGx1YV9zdGRpbl9pc190dHkgZGV0ZWN0cyB3aGV0aGVyIHRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhICd0dHknICh0aGF0CitAKiBpcywgd2hldGhlciB3ZSdyZSBydW5uaW5nIGx1YSBpbnRlcmFjdGl2ZWx5KS4KKyoqIENIQU5HRSBpdCBpZiB5b3UgaGF2ZSBhIGJldHRlciBkZWZpbml0aW9uIGZvciBub24tUE9TSVgvbm9uLVdpbmRvd3MKKyoqIHN5c3RlbXMuCisqLworI2lmIGRlZmluZWQoTFVBX1VTRV9JU0FUVFkpCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIGx1YV9zdGRpbl9pc190dHkoKQlpc2F0dHkoMCkKKyNlbGlmIGRlZmluZWQoTFVBX1dJTikKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIGx1YV9zdGRpbl9pc190dHkoKQlfaXNhdHR5KF9maWxlbm8oc3RkaW4pKQorI2Vsc2UKKyNkZWZpbmUgbHVhX3N0ZGluX2lzX3R0eSgpCTEgIC8qIGFzc3VtZSBzdGRpbiBpcyBhIHR0eSAqLworI2VuZGlmCisKKworLyoKK0BAIExVQV9QUk9NUFQgaXMgdGhlIGRlZmF1bHQgcHJvbXB0IHVzZWQgYnkgc3RhbmQtYWxvbmUgTHVhLgorQEAgTFVBX1BST01QVDIgaXMgdGhlIGRlZmF1bHQgY29udGludWF0aW9uIHByb21wdCB1c2VkIGJ5IHN0YW5kLWFsb25lIEx1YS4KKyoqIENIQU5HRSB0aGVtIGlmIHlvdSB3YW50IGRpZmZlcmVudCBwcm9tcHRzLiAoWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUKKyoqIHByb21wdHMgZHluYW1pY2FsbHksIGFzc2lnbmluZyB0byBnbG9iYWxzIF9QUk9NUFQvX1BST01QVDIuKQorKi8KKyNkZWZpbmUgTFVBX1BST01QVAkJIj4gIgorI2RlZmluZSBMVUFfUFJPTVBUMgkJIj4+ICIKKworCisvKgorQEAgTFVBX1BST0dOQU1FIGlzIHRoZSBkZWZhdWx0IG5hbWUgZm9yIHRoZSBzdGFuZC1hbG9uZSBMdWEgcHJvZ3JhbS4KKyoqIENIQU5HRSBpdCBpZiB5b3VyIHN0YW5kLWFsb25lIGludGVycHJldGVyIGhhcyBhIGRpZmZlcmVudCBuYW1lIGFuZAorKiogeW91ciBzeXN0ZW0gaXMgbm90IGFibGUgdG8gZGV0ZWN0IHRoYXQgbmFtZSBhdXRvbWF0aWNhbGx5LgorKi8KKyNkZWZpbmUgTFVBX1BST0dOQU1FCQkibHVhIgorCisKKy8qCitAQCBMVUFfTUFYSU5QVVQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIGZvciBhbiBpbnB1dCBsaW5lIGluIHRoZQorQCogc3RhbmQtYWxvbmUgaW50ZXJwcmV0ZXIuCisqKiBDSEFOR0UgaXQgaWYgeW91IG5lZWQgbG9uZ2VyIGxpbmVzLgorKi8KKyNkZWZpbmUgTFVBX01BWElOUFVUCTUxMgorCisKKy8qCitAQCBsdWFfcmVhZGxpbmUgZGVmaW5lcyBob3cgdG8gc2hvdyBhIHByb21wdCBhbmQgdGhlbiByZWFkIGEgbGluZSBmcm9tCitAKiB0aGUgc3RhbmRhcmQgaW5wdXQuCitAQCBsdWFfc2F2ZWxpbmUgZGVmaW5lcyBob3cgdG8gInNhdmUiIGEgcmVhZCBsaW5lIGluIGEgImhpc3RvcnkiLgorQEAgbHVhX2ZyZWVsaW5lIGRlZmluZXMgaG93IHRvIGZyZWUgYSBsaW5lIHJlYWQgYnkgbHVhX3JlYWRsaW5lLgorKiogQ0hBTkdFIHRoZW0gaWYgeW91IHdhbnQgdG8gaW1wcm92ZSB0aGlzIGZ1bmN0aW9uYWxpdHkgKGUuZy4sIGJ5IHVzaW5nCisqKiBHTlUgcmVhZGxpbmUgYW5kIGhpc3RvcnkgZmFjaWxpdGllcykuCisqLworI2lmIGRlZmluZWQoTFVBX1VTRV9SRUFETElORSkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+CisjaW5jbHVkZSA8cmVhZGxpbmUvaGlzdG9yeS5oPgorI2RlZmluZSBsdWFfcmVhZGxpbmUoTCxiLHApCSgodm9pZClMLCAoKGIpPXJlYWRsaW5lKHApKSAhPSBOVUxMKQorI2RlZmluZSBsdWFfc2F2ZWxpbmUoTCxpZHgpIFwKKwlpZiAobHVhX3N0cmxlbihMLGlkeCkgPiAwKSAgLyogbm9uLWVtcHR5IGxpbmU/ICovIFwKKwkgIGFkZF9oaXN0b3J5KGx1YV90b3N0cmluZyhMLCBpZHgpKTsgIC8qIGFkZCBpdCB0byBoaXN0b3J5ICovCisjZGVmaW5lIGx1YV9mcmVlbGluZShMLGIpCSgodm9pZClMLCBmcmVlKGIpKQorI2Vsc2UKKyNkZWZpbmUgbHVhX3JlYWRsaW5lKEwsYixwKQlcCisJKCh2b2lkKUwsIGZwdXRzKHAsIHN0ZG91dCksIGZmbHVzaChzdGRvdXQpLCAgLyogc2hvdyBwcm9tcHQgKi8gXAorCWZnZXRzKGIsIExVQV9NQVhJTlBVVCwgc3RkaW4pICE9IE5VTEwpICAvKiBnZXQgbGluZSAqLworI2RlZmluZSBsdWFfc2F2ZWxpbmUoTCxpZHgpCXsgKHZvaWQpTDsgKHZvaWQpaWR4OyB9CisjZGVmaW5lIGx1YV9mcmVlbGluZShMLGIpCXsgKHZvaWQpTDsgKHZvaWQpYjsgfQorI2VuZGlmCisKKyNlbmRpZgorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworLyoKK0BAIExVQUlfR0NQQVVTRSBkZWZpbmVzIHRoZSBkZWZhdWx0IHBhdXNlIGJldHdlZW4gZ2FyYmFnZS1jb2xsZWN0b3IgY3ljbGVzCitAKiBhcyBhIHBlcmNlbnRhZ2UuCisqKiBDSEFOR0UgaXQgaWYgeW91IHdhbnQgdGhlIEdDIHRvIHJ1biBmYXN0ZXIgb3Igc2xvd2VyIChoaWdoZXIgdmFsdWVzCisqKiBtZWFuIGxhcmdlciBwYXVzZXMgd2hpY2ggbWVhbiBzbG93ZXIgY29sbGVjdGlvbi4pIFlvdSBjYW4gYWxzbyBjaGFuZ2UKKyoqIHRoaXMgdmFsdWUgZHluYW1pY2FsbHkuCisqLworI2RlZmluZSBMVUFJX0dDUEFVU0UJMjAwICAvKiAyMDAlICh3YWl0IG1lbW9yeSB0byBkb3VibGUgYmVmb3JlIG5leHQgR0MpICovCisKKworLyoKK0BAIExVQUlfR0NNVUwgZGVmaW5lcyB0aGUgZGVmYXVsdCBzcGVlZCBvZiBnYXJiYWdlIGNvbGxlY3Rpb24gcmVsYXRpdmUgdG8KK0AqIG1lbW9yeSBhbGxvY2F0aW9uIGFzIGEgcGVyY2VudGFnZS4KKyoqIENIQU5HRSBpdCBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBnYXJiYWdlCisqKiBjb2xsZWN0aW9uLiAoSGlnaGVyIHZhbHVlcyBtZWFuIGNvYXJzZXIgY29sbGVjdGlvbnMuIDAgcmVwcmVzZW50cworKiogaW5maW5pdHksIHdoZXJlIGVhY2ggc3RlcCBwZXJmb3JtcyBhIGZ1bGwgY29sbGVjdGlvbi4pIFlvdSBjYW4gYWxzbworKiogY2hhbmdlIHRoaXMgdmFsdWUgZHluYW1pY2FsbHkuCisqLworI2RlZmluZSBMVUFJX0dDTVVMCTIwMCAvKiBHQyBydW5zICd0d2ljZSB0aGUgc3BlZWQnIG9mIG1lbW9yeSBhbGxvY2F0aW9uICovCisKKworCisvKgorQEAgTFVBX0NPTVBBVF9HRVROIGNvbnRyb2xzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZ2V0biBiZWhhdmlvci4KKyoqIENIQU5HRSBpdCAoZGVmaW5lIGl0KSBpZiB5b3Ugd2FudCBleGFjdCBjb21wYXRpYmlsaXR5IHdpdGggdGhlCisqKiBiZWhhdmlvciBvZiBzZXRuL2dldG4gaW4gTHVhIDUuMC4KKyovCisjdW5kZWYgTFVBX0NPTVBBVF9HRVROCisKKy8qCitAQCBMVUFfQ09NUEFUX0xPQURMSUIgY29udHJvbHMgY29tcGF0aWJpbGl0eSBhYm91dCBnbG9iYWwgbG9hZGxpYi4KKyoqIENIQU5HRSBpdCB0byB1bmRlZmluZWQgYXMgc29vbiBhcyB5b3UgZG8gbm90IG5lZWQgYSBnbG9iYWwgJ2xvYWRsaWInCisqKiBmdW5jdGlvbiAodGhlIGZ1bmN0aW9uIGlzIHN0aWxsIGF2YWlsYWJsZSBhcyAncGFja2FnZS5sb2FkbGliJykuCisqLworI3VuZGVmIExVQV9DT01QQVRfTE9BRExJQgorCisvKgorQEAgTFVBX0NPTVBBVF9WQVJBUkcgY29udHJvbHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2YXJhcmcgZmVhdHVyZS4KKyoqIENIQU5HRSBpdCB0byB1bmRlZmluZWQgYXMgc29vbiBhcyB5b3VyIHByb2dyYW1zIHVzZSBvbmx5ICcuLi4nIHRvCisqKiBhY2Nlc3MgdmFyYXJnIHBhcmFtZXRlcnMgKGluc3RlYWQgb2YgdGhlIG9sZCAnYXJnJyB0YWJsZSkuCisqLworI2RlZmluZSBMVUFfQ09NUEFUX1ZBUkFSRworCisvKgorQEAgTFVBX0NPTVBBVF9NT0QgY29udHJvbHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBtYXRoLm1vZCBmdW5jdGlvbi4KKyoqIENIQU5HRSBpdCB0byB1bmRlZmluZWQgYXMgc29vbiBhcyB5b3VyIHByb2dyYW1zIHVzZSAnbWF0aC5mbW9kJyBvcgorKiogdGhlIG5ldyAnJScgb3BlcmF0b3IgaW5zdGVhZCBvZiAnbWF0aC5tb2QnLgorKi8KKyNkZWZpbmUgTFVBX0NPTVBBVF9NT0QKKworLyoKK0BAIExVQV9DT01QQVRfTFNUUiBjb250cm9scyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGxvbmcgc3RyaW5nIG5lc3RpbmcKK0AqIGZhY2lsaXR5LgorKiogQ0hBTkdFIGl0IHRvIDIgaWYgeW91IHdhbnQgdGhlIG9sZCBiZWhhdmlvdXIsIG9yIHVuZGVmaW5lIGl0IHRvIHR1cm4KKyoqIG9mZiB0aGUgYWR2aXNvcnkgZXJyb3Igd2hlbiBuZXN0aW5nIFtbLi4uXV0uCisqLworI2RlZmluZSBMVUFfQ09NUEFUX0xTVFIJCTEKKworLyoKK0BAIExVQV9DT01QQVRfR0ZJTkQgY29udHJvbHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCAnc3RyaW5nLmdmaW5kJyBuYW1lLgorKiogQ0hBTkdFIGl0IHRvIHVuZGVmaW5lZCBhcyBzb29uIGFzIHlvdSByZW5hbWUgJ3N0cmluZy5nZmluZCcgdG8KKyoqICdzdHJpbmcuZ21hdGNoJy4KKyovCisjZGVmaW5lIExVQV9DT01QQVRfR0ZJTkQKKworLyoKK0BAIExVQV9DT01QQVRfT1BFTkxJQiBjb250cm9scyBjb21wYXRpYmlsaXR5IHdpdGggb2xkICdsdWFMX29wZW5saWInCitAKiBiZWhhdmlvci4KKyoqIENIQU5HRSBpdCB0byB1bmRlZmluZWQgYXMgc29vbiBhcyB5b3UgcmVwbGFjZSB0byAnbHVhTF9yZWdpc3RlcicKKyoqIHlvdXIgdXNlcyBvZiAnbHVhTF9vcGVubGliJworKi8KKyNkZWZpbmUgTFVBX0NPTVBBVF9PUEVOTElCCisKKworCisvKgorQEAgbHVhaV9hcGljaGVjayBpcyB0aGUgYXNzZXJ0IG1hY3JvIHVzZWQgYnkgdGhlIEx1YS1DIEFQSS4KKyoqIENIQU5HRSBsdWFpX2FwaWNoZWNrIGlmIHlvdSB3YW50IEx1YSB0byBwZXJmb3JtIHNvbWUgY2hlY2tzIGluIHRoZQorKiogcGFyYW1ldGVycyBpdCBnZXRzIGZyb20gQVBJIGNhbGxzLiBUaGlzIG1heSBzbG93IGRvd24gdGhlIGludGVycHJldGVyCisqKiBhIGJpdCwgYnV0IG1heSBiZSBxdWl0ZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgQyBjb2RlIHRoYXQgaW50ZXJmYWNlcworKiogd2l0aCBMdWEuIEEgdXNlZnVsIHJlZGVmaW5pdGlvbiBpcyB0byB1c2UgYXNzZXJ0LmguCisqLworI2lmIGRlZmluZWQoTFVBX1VTRV9BUElDSEVDSykKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNkZWZpbmUgbHVhaV9hcGljaGVjayhMLG8pCXsgKHZvaWQpTDsgYXNzZXJ0KG8pOyB9CisjZWxzZQorI2RlZmluZSBsdWFpX2FwaWNoZWNrKEwsbykJeyAodm9pZClMOyB9CisjZW5kaWYKKworCisvKgorQEAgTFVBSV9CSVRTSU5UIGRlZmluZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIGFuIGludC4KKyoqIENIQU5HRSBoZXJlIGlmIEx1YSBjYW5ub3QgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIG51bWJlciBvZiBiaXRzIG9mCisqKiB5b3VyIG1hY2hpbmUuIFByb2JhYmx5IHlvdSBkbyBub3QgbmVlZCB0byBjaGFuZ2UgdGhpcy4KKyovCisvKiBhdm9pZCBvdmVyZmxvd3MgaW4gY29tcGFyaXNvbiAqLworI2lmIElOVF9NQVgtMjAgPCAzMjc2MAorI2RlZmluZSBMVUFJX0JJVFNJTlQJMTYKKyNlbGlmIElOVF9NQVggPiAyMTQ3NDgzNjQwTAorLyogaW50IGhhcyBhdCBsZWFzdCAzMiBiaXRzICovCisjZGVmaW5lIExVQUlfQklUU0lOVAkzMgorI2Vsc2UKKyNlcnJvciAieW91IG11c3QgZGVmaW5lIExVQV9CSVRTSU5UIHdpdGggbnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50ZWdlciIKKyNlbmRpZgorCisKKy8qCitAQCBMVUFJX1VJTlQzMiBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggYXQgbGVhc3QgMzIgYml0cy4KK0BAIExVQUlfSU5UMzIgaXMgYW4gc2lnbmVkIGludGVnZXIgd2l0aCBhdCBsZWFzdCAzMiBiaXRzLgorQEAgTFVBSV9VTUVNIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgYmlnIGVub3VnaCB0byBjb3VudCB0aGUgdG90YWwKK0AqIG1lbW9yeSB1c2VkIGJ5IEx1YS4KK0BAIExVQUlfTUVNIGlzIGEgc2lnbmVkIGludGVnZXIgYmlnIGVub3VnaCB0byBjb3VudCB0aGUgdG90YWwgbWVtb3J5CitAKiB1c2VkIGJ5IEx1YS4KKyoqIENIQU5HRSBoZXJlIGlmIGZvciBzb21lIHdlaXJkIHJlYXNvbiB0aGUgZGVmYXVsdCBkZWZpbml0aW9ucyBhcmUgbm90CisqKiBnb29kIGVub3VnaCBmb3IgeW91ciBtYWNoaW5lLiAoVGhlIGRlZmluaXRpb25zIGluIHRoZSAnZWxzZScKKyoqIHBhcnQgYWx3YXlzIHdvcmtzLCBidXQgbWF5IHdhc3RlIHNwYWNlIG9uIG1hY2hpbmVzIHdpdGggNjQtYml0CisqKiBsb25ncy4pIFByb2JhYmx5IHlvdSBkbyBub3QgbmVlZCB0byBjaGFuZ2UgdGhpcy4KKyovCisjaWYgTFVBSV9CSVRTSU5UID49IDMyCisjZGVmaW5lIExVQUlfVUlOVDMyCXVuc2lnbmVkIGludAorI2RlZmluZSBMVUFJX0lOVDMyCWludAorI2RlZmluZSBMVUFJX01BWElOVDMyCUlOVF9NQVgKKyNkZWZpbmUgTFVBSV9VTUVNCXNpemVfdAorI2RlZmluZSBMVUFJX01FTQlwdHJkaWZmX3QKKyNlbHNlCisvKiAxNi1iaXQgaW50cyAqLworI2RlZmluZSBMVUFJX1VJTlQzMgl1bnNpZ25lZCBsb25nCisjZGVmaW5lIExVQUlfSU5UMzIJbG9uZworI2RlZmluZSBMVUFJX01BWElOVDMyCUxPTkdfTUFYCisjZGVmaW5lIExVQUlfVU1FTQl1bnNpZ25lZCBsb25nCisjZGVmaW5lIExVQUlfTUVNCWxvbmcKKyNlbmRpZgorCisKKy8qCitAQCBMVUFJX01BWENBTExTIGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCBjYWxscy4KKyoqIENIQU5HRSBpdCBpZiB5b3UgbmVlZCByZWFsbHkgZGVlcCByZWN1cnNpdmUgY2FsbHMuIFRoaXMgbGltaXQgaXMKKyoqIGFyYml0cmFyeTsgaXRzIG9ubHkgcHVycG9zZSBpcyB0byBzdG9wIGluZmluaXRlIHJlY3Vyc2lvbiBiZWZvcmUKKyoqIGV4aGF1c3RpbmcgbWVtb3J5LgorKi8KKyNkZWZpbmUgTFVBSV9NQVhDQUxMUwkyMDAwMAorCisKKy8qCitAQCBMVUFJX01BWENTVEFDSyBsaW1pdHMgdGhlIG51bWJlciBvZiBMdWEgc3RhY2sgc2xvdHMgdGhhdCBhIEMgZnVuY3Rpb24KK0AqIGNhbiB1c2UuCisqKiBDSEFOR0UgaXQgaWYgeW91IG5lZWQgbG90cyBvZiAoTHVhKSBzdGFjayBzcGFjZSBmb3IgeW91ciBDCisqKiBmdW5jdGlvbnMuIFRoaXMgbGltaXQgaXMgYXJiaXRyYXJ5OyBpdHMgb25seSBwdXJwb3NlIGlzIHRvIHN0b3AgQworKiogZnVuY3Rpb25zIHRvIGNvbnN1bWUgdW5saW1pdGVkIHN0YWNrIHNwYWNlLiAobXVzdCBiZSBzbWFsbGVyIHRoYW4KKyoqIC1MVUFfUkVHSVNUUllJTkRFWCkKKyovCisjZGVmaW5lIExVQUlfTUFYQ1NUQUNLCTgwMDAKKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBDSEFOR0UgKHRvIHNtYWxsZXIgdmFsdWVzKSB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGlmIHlvdXIgc3lzdGVtCisqKiBoYXMgYSBzbWFsbCBDIHN0YWNrLiAoT3IgeW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGVtIHRvIGxhcmdlcgorKiogdmFsdWVzIGlmIHlvdXIgc3lzdGVtIGhhcyBhIGxhcmdlIEMgc3RhY2sgYW5kIHRoZXNlIGxpbWl0cyBhcmUKKyoqIHRvbyByaWdpZCBmb3IgeW91LikgU29tZSBvZiB0aGVzZSBjb25zdGFudHMgY29udHJvbCB0aGUgc2l6ZSBvZgorKiogc3RhY2stYWxsb2NhdGVkIGFycmF5cyB1c2VkIGJ5IHRoZSBjb21waWxlciBvciB0aGUgaW50ZXJwcmV0ZXIsIHdoaWxlCisqKiBvdGhlcnMgbGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyB0aGF0IHRoZSBjb21waWxlcgorKiogb3IgdGhlIGludGVycHJldGVyIGNhbiBwZXJmb3JtLiBWYWx1ZXMgdG9vIGxhcmdlIG1heSBjYXVzZSBhIEMgc3RhY2sKKyoqIG92ZXJmbG93IGZvciBzb21lIGZvcm1zIG9mIGRlZXAgY29uc3RydWN0cy4KKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworLyoKK0BAIExVQUlfTUFYQ0NBTExTIGlzIHRoZSBtYXhpbXVtIGRlcHRoIGZvciBuZXN0ZWQgQyBjYWxscyAoc2hvcnQpIGFuZAorQCogc3ludGFjdGljYWwgbmVzdGVkIG5vbi10ZXJtaW5hbHMgaW4gYSBwcm9ncmFtLgorKi8KKyNkZWZpbmUgTFVBSV9NQVhDQ0FMTFMJCTIwMAorCisKKy8qCitAQCBMVUFJX01BWFZBUlMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBwZXIgZnVuY3Rpb24KK0AqIChtdXN0IGJlIHNtYWxsZXIgdGhhbiAyNTApLgorKi8KKyNkZWZpbmUgTFVBSV9NQVhWQVJTCQkyMDAKKworCisvKgorQEAgTFVBSV9NQVhVUFZBTFVFUyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdXB2YWx1ZXMgcGVyIGZ1bmN0aW9uCitAKiAobXVzdCBiZSBzbWFsbGVyIHRoYW4gMjUwKS4KKyovCisjZGVmaW5lIExVQUlfTUFYVVBWQUxVRVMJNjAKKworCisvKgorQEAgTFVBTF9CVUZGRVJTSVpFIGlzIHRoZSBidWZmZXIgc2l6ZSB1c2VkIGJ5IHRoZSBsYXV4bGliIGJ1ZmZlciBzeXN0ZW0uCisqLworI2RlZmluZSBMVUFMX0JVRkZFUlNJWkUJCUJVRlNJWgorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAQCBMVUFfTlVNQkVSIGlzIHRoZSB0eXBlIG9mIG51bWJlcnMgaW4gTHVhLgorKiogQ0hBTkdFIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgb25seSBpZiB5b3Ugd2FudCB0byBidWlsZCBMdWEKKyoqIHdpdGggYSBudW1iZXIgdHlwZSBkaWZmZXJlbnQgZnJvbSBkb3VibGUuIFlvdSBtYXkgYWxzbyBuZWVkIHRvCisqKiBjaGFuZ2UgbHVhX251bWJlcjJpbnQgJiBsdWFfbnVtYmVyMmludGVnZXIuCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIExVQV9OVU1CRVJfRE9VQkxFCisjZGVmaW5lIExVQV9OVU1CRVIJZG91YmxlCisKKy8qCitAQCBMVUFJX1VBQ05VTUJFUiBpcyB0aGUgcmVzdWx0IG9mIGFuICd1c3VhbCBhcmd1bWVudCBjb252ZXJzaW9uJworQCogb3ZlciBhIG51bWJlci4KKyovCisjZGVmaW5lIExVQUlfVUFDTlVNQkVSCWRvdWJsZQorCisKKy8qCitAQCBMVUFfTlVNQkVSX1NDQU4gaXMgdGhlIGZvcm1hdCBmb3IgcmVhZGluZyBudW1iZXJzLgorQEAgTFVBX05VTUJFUl9GTVQgaXMgdGhlIGZvcm1hdCBmb3Igd3JpdGluZyBudW1iZXJzLgorQEAgbHVhX251bWJlcjJzdHIgY29udmVydHMgYSBudW1iZXIgdG8gYSBzdHJpbmcuCitAQCBMVUFJX01BWE5VTUJFUjJTVFIgaXMgbWF4aW11bSBzaXplIG9mIHByZXZpb3VzIGNvbnZlcnNpb24uCitAQCBsdWFfc3RyMm51bWJlciBjb252ZXJ0cyBhIHN0cmluZyB0byBhIG51bWJlci4KKyovCisjZGVmaW5lIExVQV9OVU1CRVJfU0NBTgkJIiVsZiIKKyNkZWZpbmUgTFVBX05VTUJFUl9GTVQJCSIlLjE0ZyIKKyNkZWZpbmUgbHVhX251bWJlcjJzdHIocyxuKQlzcHJpbnRmKChzKSwgTFVBX05VTUJFUl9GTVQsIChuKSkKKyNkZWZpbmUgTFVBSV9NQVhOVU1CRVIyU1RSCTMyIC8qIDE2IGRpZ2l0cywgc2lnbiwgcG9pbnQsIGFuZCBcMCAqLworI2RlZmluZSBsdWFfc3RyMm51bWJlcihzLHApCXN0cnRvZCgocyksIChwKSkKKworCisvKgorQEAgVGhlIGx1YWlfbnVtKiBtYWNyb3MgZGVmaW5lIHRoZSBwcmltaXRpdmUgb3BlcmF0aW9ucyBvdmVyIG51bWJlcnMuCisqLworI2lmIGRlZmluZWQoTFVBX0NPUkUpCisjaW5jbHVkZSA8bWF0aC5oPgorI2RlZmluZSBsdWFpX251bWFkZChhLGIpCSgoYSkrKGIpKQorI2RlZmluZSBsdWFpX251bXN1YihhLGIpCSgoYSktKGIpKQorI2RlZmluZSBsdWFpX251bW11bChhLGIpCSgoYSkqKGIpKQorI2RlZmluZSBsdWFpX251bWRpdihhLGIpCSgoYSkvKGIpKQorI2RlZmluZSBsdWFpX251bW1vZChhLGIpCSgoYSkgLSBmbG9vcigoYSkvKGIpKSooYikpCisjZGVmaW5lIGx1YWlfbnVtcG93KGEsYikJKHBvdyhhLGIpKQorI2RlZmluZSBsdWFpX251bXVubShhKQkJKC0oYSkpCisjZGVmaW5lIGx1YWlfbnVtZXEoYSxiKQkJKChhKT09KGIpKQorI2RlZmluZSBsdWFpX251bWx0KGEsYikJCSgoYSk8KGIpKQorI2RlZmluZSBsdWFpX251bWxlKGEsYikJCSgoYSk8PShiKSkKKyNkZWZpbmUgbHVhaV9udW1pc25hbihhKQkoIWx1YWlfbnVtZXEoKGEpLCAoYSkpKQorI2VuZGlmCisKKworLyoKK0BAIGx1YV9udW1iZXIyaW50IGlzIGEgbWFjcm8gdG8gY29udmVydCBsdWFfTnVtYmVyIHRvIGludC4KK0BAIGx1YV9udW1iZXIyaW50ZWdlciBpcyBhIG1hY3JvIHRvIGNvbnZlcnQgbHVhX051bWJlciB0byBsdWFfSW50ZWdlci4KKyoqIENIQU5HRSB0aGVtIGlmIHlvdSBrbm93IGEgZmFzdGVyIHdheSB0byBjb252ZXJ0IGEgbHVhX051bWJlciB0bworKiogaW50ICh3aXRoIGFueSByb3VuZGluZyBtZXRob2QgYW5kIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzKSBpbiB5b3VyCisqKiBzeXN0ZW0uIEluIFBlbnRpdW0gbWFjaGluZXMsIGEgbmFpdmUgdHlwZWNhc3QgZnJvbSBkb3VibGUgdG8gaW50CisqKiBpbiBDIGlzIGV4dHJlbWVseSBzbG93LCBzbyBhbnkgYWx0ZXJuYXRpdmUgaXMgd29ydGggdHJ5aW5nLgorKi8KKworLyogT24gYSBQZW50aXVtLCByZXNvcnQgdG8gYSB0cmljayAqLworI2lmIGRlZmluZWQoTFVBX05VTUJFUl9ET1VCTEUpICYmICFkZWZpbmVkKExVQV9BTlNJKSAmJiAhZGVmaW5lZChfX1NTRTJfXykgJiYgXAorICAgIChkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZCAoX01fSVg4NikgfHwgZGVmaW5lZChfX2kzODZfXykpCisKKy8qIE9uIGEgTWljcm9zb2Z0IGNvbXBpbGVyLCB1c2UgYXNzZW1ibGVyICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKworI2RlZmluZSBsdWFfbnVtYmVyMmludChpLGQpICAgX19hc20gZmxkIGQgICBfX2FzbSBmaXN0cCBpCisjZGVmaW5lIGx1YV9udW1iZXIyaW50ZWdlcihpLG4pCQlsdWFfbnVtYmVyMmludChpLCBuKQorCisvKiB0aGUgbmV4dCB0cmljayBzaG91bGQgd29yayBvbiBhbnkgUGVudGl1bSwgYnV0IHNvbWV0aW1lcyBjbGFzaGVzCisgICB3aXRoIGEgRGlyZWN0WCBpZGlvc3luY3Jhc3kgKi8KKyNlbHNlCisKK3VuaW9uIGx1YWlfQ2FzdCB7IGRvdWJsZSBsX2Q7IGxvbmcgbF9sOyB9OworI2RlZmluZSBsdWFfbnVtYmVyMmludChpLGQpIFwKKyAgeyB2b2xhdGlsZSB1bmlvbiBsdWFpX0Nhc3QgdTsgdS5sX2QgPSAoZCkgKyA2NzU1Mzk5NDQxMDU1NzQ0LjA7IChpKSA9IHUubF9sOyB9CisjZGVmaW5lIGx1YV9udW1iZXIyaW50ZWdlcihpLG4pCQlsdWFfbnVtYmVyMmludChpLCBuKQorCisjZW5kaWYKKworCisvKiB0aGlzIG9wdGlvbiBhbHdheXMgd29ya3MsIGJ1dCBtYXkgYmUgc2xvdyAqLworI2Vsc2UKKyNkZWZpbmUgbHVhX251bWJlcjJpbnQoaSxkKQkoKGkpPShpbnQpKGQpKQorI2RlZmluZSBsdWFfbnVtYmVyMmludGVnZXIoaSxkKQkoKGkpPShsdWFfSW50ZWdlcikoZCkpCisKKyNlbmRpZgorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworLyoKK0BAIExVQUlfVVNFUl9BTElHTk1FTlRfVCBpcyBhIHR5cGUgdGhhdCByZXF1aXJlcyBtYXhpbXVtIGFsaWdubWVudC4KKyoqIENIQU5HRSBpdCBpZiB5b3VyIHN5c3RlbSByZXF1aXJlcyBhbGlnbm1lbnRzIGxhcmdlciB0aGFuIGRvdWJsZS4gKEZvcgorKiogaW5zdGFuY2UsIGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIGxvbmcgZG91YmxlcyBhbmQgdGhleSBtdXN0IGJlCisqKiBhbGlnbmVkIGluIDE2LWJ5dGUgYm91bmRhcmllcywgdGhlbiB5b3Ugc2hvdWxkIGFkZCBsb25nIGRvdWJsZSBpbiB0aGUKKyoqIHVuaW9uLikgUHJvYmFibHkgeW91IGRvIG5vdCBuZWVkIHRvIGNoYW5nZSB0aGlzLgorKi8KKyNkZWZpbmUgTFVBSV9VU0VSX0FMSUdOTUVOVF9UCXVuaW9uIHsgZG91YmxlIHU7IHZvaWQgKnM7IGxvbmcgbDsgfQorCisKKy8qCitAQCBMVUFJX1RIUk9XL0xVQUlfVFJZIGRlZmluZSBob3cgTHVhIGRvZXMgZXhjZXB0aW9uIGhhbmRsaW5nLgorKiogQ0hBTkdFIHRoZW0gaWYgeW91IHByZWZlciB0byB1c2UgbG9uZ2ptcC9zZXRqbXAgZXZlbiB3aXRoIEMrKworKiogb3IgaWYgd2FudC9kb24ndCB0byB1c2UgX2xvbmdqbXAvX3NldGptcCBpbnN0ZWFkIG9mIHJlZ3VsYXIKKyoqIGxvbmdqbXAvc2V0am1wLiBCeSBkZWZhdWx0LCBMdWEgaGFuZGxlcyBlcnJvcnMgd2l0aCBleGNlcHRpb25zIHdoZW4KKyoqIGNvbXBpbGluZyBhcyBDKysgY29kZSwgd2l0aCBfbG9uZ2ptcC9fc2V0am1wIHdoZW4gYXNrZWQgdG8gdXNlIHRoZW0sCisqKiBhbmQgd2l0aCBsb25nam1wL3NldGptcCBvdGhlcndpc2UuCisqLworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisvKiBDKysgZXhjZXB0aW9ucyAqLworI2RlZmluZSBMVUFJX1RIUk9XKEwsYykJdGhyb3coYykKKyNkZWZpbmUgTFVBSV9UUlkoTCxjLGEpCXRyeSB7IGEgfSBjYXRjaCguLi4pIFwKKwl7IGlmICgoYyktPnN0YXR1cyA9PSAwKSAoYyktPnN0YXR1cyA9IC0xOyB9CisjZGVmaW5lIGx1YWlfam1wYnVmCWludCAgLyogZHVtbXkgdmFyaWFibGUgKi8KKworI2VsaWYgZGVmaW5lZChMVUFfVVNFX1VMT05HSk1QKQorLyogaW4gVW5peCwgdHJ5IF9sb25nam1wL19zZXRqbXAgKG1vcmUgZWZmaWNpZW50KSAqLworI2RlZmluZSBMVUFJX1RIUk9XKEwsYykJX2xvbmdqbXAoKGMpLT5iLCAxKQorI2RlZmluZSBMVUFJX1RSWShMLGMsYSkJaWYgKF9zZXRqbXAoKGMpLT5iKSA9PSAwKSB7IGEgfQorI2RlZmluZSBsdWFpX2ptcGJ1ZglqbXBfYnVmCisKKyNlbHNlCisvKiBkZWZhdWx0IGhhbmRsaW5nIHdpdGggbG9uZyBqdW1wcyAqLworI2RlZmluZSBMVUFJX1RIUk9XKEwsYykJbG9uZ2ptcCgoYyktPmIsIDEpCisjZGVmaW5lIExVQUlfVFJZKEwsYyxhKQlpZiAoc2V0am1wKChjKS0+YikgPT0gMCkgeyBhIH0KKyNkZWZpbmUgbHVhaV9qbXBidWYJam1wX2J1ZgorCisjZW5kaWYKKworCisvKgorQEAgTFVBX01BWENBUFRVUkVTIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXB0dXJlcyB0aGF0IGEgcGF0dGVybgorQCogY2FuIGRvIGR1cmluZyBwYXR0ZXJuLW1hdGNoaW5nLgorKiogQ0hBTkdFIGl0IGlmIHlvdSBuZWVkIG1vcmUgY2FwdHVyZXMuIFRoaXMgbGltaXQgaXMgYXJiaXRyYXJ5LgorKi8KKyNkZWZpbmUgTFVBX01BWENBUFRVUkVTCQkzMgorCisKKy8qCitAQCBsdWFfdG1wbmFtIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRoZSBPUyBsaWJyYXJ5IHVzZXMgdG8gY3JlYXRlIGEKK0AqIHRlbXBvcmFyeSBuYW1lLgorQEAgTFVBX1RNUE5BTUJVRlNJWkUgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhIG5hbWUgY3JlYXRlZCBieSBsdWFfdG1wbmFtLgorKiogQ0hBTkdFIHRoZW0gaWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gdG1wbmFtICh3aGljaCBpcyBjb25zaWRlcmVkCisqKiBpbnNlY3VyZSkgb3IgaWYgeW91IHdhbnQgdGhlIG9yaWdpbmFsIHRtcG5hbSBhbnl3YXkuICBCeSBkZWZhdWx0LCBMdWEKKyoqIHVzZXMgdG1wbmFtIGV4Y2VwdCB3aGVuIFBPU0lYIGlzIGF2YWlsYWJsZSwgd2hlcmUgaXQgdXNlcyBta3N0ZW1wLgorKi8KKyNpZiBkZWZpbmVkKGxvc2xpYl9jKSB8fCBkZWZpbmVkKGx1YWFsbF9jKQorCisjaWYgZGVmaW5lZChMVUFfVVNFX01LU1RFTVApCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIExVQV9UTVBOQU1CVUZTSVpFCTMyCisjZGVmaW5lIGx1YV90bXBuYW0oYixlKQl7IFwKKwlzdHJjcHkoYiwgIi90bXAvbHVhX1hYWFhYWCIpOyBcCisJZSA9IG1rc3RlbXAoYik7IFwKKwlpZiAoZSAhPSAtMSkgY2xvc2UoZSk7IFwKKwllID0gKGUgPT0gLTEpOyB9CisKKyNlbHNlCisjZGVmaW5lIExVQV9UTVBOQU1CVUZTSVpFCUxfdG1wbmFtCisjZGVmaW5lIGx1YV90bXBuYW0oYixlKQkJeyBlID0gKHRtcG5hbShiKSA9PSBOVUxMKTsgfQorI2VuZGlmCisKKyNlbmRpZgorCisKKy8qCitAQCBsdWFfcG9wZW4gc3Bhd25zIGEgbmV3IHByb2Nlc3MgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IG9uZSB0aHJvdWdoCitAKiB0aGUgZmlsZSBzdHJlYW1zLgorKiogQ0hBTkdFIGl0IGlmIHlvdSBoYXZlIGEgd2F5IHRvIGltcGxlbWVudCBpdCBpbiB5b3VyIHN5c3RlbS4KKyovCisjaWYgZGVmaW5lZChMVUFfVVNFX1BPUEVOKQorCisjZGVmaW5lIGx1YV9wb3BlbihMLGMsbSkJKCh2b2lkKUwsIGZmbHVzaChOVUxMKSwgcG9wZW4oYyxtKSkKKyNkZWZpbmUgbHVhX3BjbG9zZShMLGZpbGUpCSgodm9pZClMLCAocGNsb3NlKGZpbGUpICE9IC0xKSkKKworI2VsaWYgZGVmaW5lZChMVUFfV0lOKQorCisjZGVmaW5lIGx1YV9wb3BlbihMLGMsbSkJKCh2b2lkKUwsIF9wb3BlbihjLG0pKQorI2RlZmluZSBsdWFfcGNsb3NlKEwsZmlsZSkJKCh2b2lkKUwsIChfcGNsb3NlKGZpbGUpICE9IC0xKSkKKworI2Vsc2UKKworI2RlZmluZSBsdWFfcG9wZW4oTCxjLG0pCSgodm9pZCkoKHZvaWQpYywgbSksICBcCisJCWx1YUxfZXJyb3IoTCwgTFVBX1FMKCJwb3BlbiIpICIgbm90IHN1cHBvcnRlZCIpLCAoRklMRSopMCkKKyNkZWZpbmUgbHVhX3BjbG9zZShMLGZpbGUpCQkoKHZvaWQpKCh2b2lkKUwsIGZpbGUpLCAwKQorCisjZW5kaWYKKworLyoKK0BAIExVQV9ETF8qIGRlZmluZSB3aGljaCBkeW5hbWljLWxpYnJhcnkgc3lzdGVtIEx1YSBzaG91bGQgdXNlLgorKiogQ0hBTkdFIGhlcmUgaWYgTHVhIGhhcyBwcm9ibGVtcyBjaG9vc2luZyB0aGUgYXBwcm9wcmlhdGUKKyoqIGR5bmFtaWMtbGlicmFyeSBzeXN0ZW0gZm9yIHlvdXIgcGxhdGZvcm0gKGVpdGhlciBXaW5kb3dzJyBETEwsIE1hYydzCisqKiBkeWxkLCBvciBVbml4J3MgZGxvcGVuKS4gSWYgeW91ciBzeXN0ZW0gaXMgc29tZSBraW5kIG9mIFVuaXgsIHRoZXJlCisqKiBpcyBhIGdvb2QgY2hhbmNlIHRoYXQgaXQgaGFzIGRsb3Blbiwgc28gTFVBX0RMX0RMT1BFTiB3aWxsIHdvcmsgZm9yCisqKiBpdC4gIFRvIHVzZSBkbG9wZW4geW91IGFsc28gbmVlZCB0byBhZGFwdCB0aGUgc3JjL01ha2VmaWxlIChwcm9iYWJseQorKiogYWRkaW5nIC1sZGwgdG8gdGhlIGxpbmtlciBvcHRpb25zKSwgc28gTHVhIGRvZXMgbm90IHNlbGVjdCBpdAorKiogYXV0b21hdGljYWxseS4gIChXaGVuIHlvdSBjaGFuZ2UgdGhlIG1ha2VmaWxlIHRvIGFkZCAtbGRsLCB5b3UgbXVzdAorKiogYWxzbyBhZGQgLURMVUFfVVNFX0RMT1BFTi4pCisqKiBJZiB5b3UgZG8gbm90IHdhbnQgYW55IGtpbmQgb2YgZHluYW1pYyBsaWJyYXJ5LCB1bmRlZmluZSBhbGwgdGhlc2UKKyoqIG9wdGlvbnMuCisqKiBCeSBkZWZhdWx0LCBfV0lOMzIgZ2V0cyBMVUFfRExfRExMIGFuZCBNQUMgT1MgWCBnZXRzIExVQV9ETF9EWUxELgorKi8KKyNpZiBkZWZpbmVkKExVQV9VU0VfRExPUEVOKQorI2RlZmluZSBMVUFfRExfRExPUEVOCisjZW5kaWYKKworI2lmIGRlZmluZWQoTFVBX1dJTikKKyNkZWZpbmUgTFVBX0RMX0RMTAorI2VuZGlmCisKKworLyoKK0BAIExVQUlfRVhUUkFTUEFDRSBhbGxvd3MgeW91IHRvIGFkZCB1c2VyLXNwZWNpZmljIGRhdGEgaW4gYSBsdWFfU3RhdGUKK0AqICh0aGUgZGF0YSBnb2VzIGp1c3QgKmJlZm9yZSogdGhlIGx1YV9TdGF0ZSBwb2ludGVyKS4KKyoqIENIQU5HRSAoZGVmaW5lKSB0aGlzIGlmIHlvdSByZWFsbHkgbmVlZCB0aGF0LiBUaGlzIHZhbHVlIG11c3QgYmUKKyoqIGEgbXVsdGlwbGUgb2YgdGhlIG1heGltdW0gYWxpZ25tZW50IHJlcXVpcmVkIGZvciB5b3VyIG1hY2hpbmUuCisqLworI2RlZmluZSBMVUFJX0VYVFJBU1BBQ0UJCTAKKworCisvKgorQEAgbHVhaV91c2Vyc3RhdGUqIGFsbG93IHVzZXItc3BlY2lmaWMgYWN0aW9ucyBvbiB0aHJlYWRzLgorKiogQ0hBTkdFIHRoZW0gaWYgeW91IGRlZmluZWQgTFVBSV9FWFRSQVNQQUNFIGFuZCBuZWVkIHRvIGRvIHNvbWV0aGluZworKiogZXh0cmEgd2hlbiBhIHRocmVhZCBpcyBjcmVhdGVkL2RlbGV0ZWQvcmVzdW1lZC95aWVsZGVkLgorKi8KKyNkZWZpbmUgbHVhaV91c2Vyc3RhdGVvcGVuKEwpCQkoKHZvaWQpTCkKKyNkZWZpbmUgbHVhaV91c2Vyc3RhdGVjbG9zZShMKQkJKCh2b2lkKUwpCisjZGVmaW5lIGx1YWlfdXNlcnN0YXRldGhyZWFkKEwsTDEpCSgodm9pZClMKQorI2RlZmluZSBsdWFpX3VzZXJzdGF0ZWZyZWUoTCkJCSgodm9pZClMKQorI2RlZmluZSBsdWFpX3VzZXJzdGF0ZXJlc3VtZShMLG4pCSgodm9pZClMKQorI2RlZmluZSBsdWFpX3VzZXJzdGF0ZXlpZWxkKEwsbikJKCh2b2lkKUwpCisKKworLyoKK0BAIExVQV9JTlRGUk1MRU4gaXMgdGhlIGxlbmd0aCBtb2RpZmllciBmb3IgaW50ZWdlciBjb252ZXJzaW9ucworQCogaW4gJ3N0cmluZy5mb3JtYXQnLgorQEAgTFVBX0lOVEZSTV9UIGlzIHRoZSBpbnRlZ2VyIHR5cGUgY29ycmVzcG9kaW5nIHRvIHRoZSBwcmV2aW91cyBsZW5ndGgKK0AqIG1vZGlmaWVyLgorKiogQ0hBTkdFIHRoZW0gaWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgbG9uZyBsb25nIG9yIGRvZXMgbm90IHN1cHBvcnQgbG9uZy4KKyovCisKKyNpZiBkZWZpbmVkKExVQV9VU0VMT05HTE9ORykKKworI2RlZmluZSBMVUFfSU5URlJNTEVOCQkibGwiCisjZGVmaW5lIExVQV9JTlRGUk1fVAkJbG9uZyBsb25nCisKKyNlbHNlCisKKyNkZWZpbmUgTFVBX0lOVEZSTUxFTgkJImwiCisjZGVmaW5lIExVQV9JTlRGUk1fVAkJbG9uZworCisjZW5kaWYKKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyoqIExvY2FsIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gdXNlIHRoaXMgc3BhY2UgdG8gYWRkIHlvdXIgcmVkZWZpbml0aW9ucworKiogd2l0aG91dCBtb2RpZnlpbmcgdGhlIG1haW4gcGFydCBvZiB0aGUgZmlsZS4KKyovCisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9sdWFsaWIuaCBiL2x1YS01LjEuNC9zcmMvbHVhbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5NDE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC9zcmMvbHVhbGliLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyoqICRJZDogbHVhbGliLmgsdiAxLjM2LjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIEx1YSBzdGFuZGFyZCBsaWJyYXJpZXMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpZm5kZWYgbHVhbGliX2gKKyNkZWZpbmUgbHVhbGliX2gKKworI2luY2x1ZGUgImx1YS5oIgorCisKKy8qIEtleSB0byBmaWxlLWhhbmRsZSB0eXBlICovCisjZGVmaW5lIExVQV9GSUxFSEFORExFCQkiRklMRSoiCisKKworI2RlZmluZSBMVUFfQ09MSUJOQU1FCSJjb3JvdXRpbmUiCitMVUFMSUJfQVBJIGludCAobHVhb3Blbl9iYXNlKSAobHVhX1N0YXRlICpMKTsKKworI2RlZmluZSBMVUFfVEFCTElCTkFNRQkidGFibGUiCitMVUFMSUJfQVBJIGludCAobHVhb3Blbl90YWJsZSkgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX0lPTElCTkFNRQkiaW8iCitMVUFMSUJfQVBJIGludCAobHVhb3Blbl9pbykgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX09TTElCTkFNRQkib3MiCitMVUFMSUJfQVBJIGludCAobHVhb3Blbl9vcykgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX1NUUkxJQk5BTUUJInN0cmluZyIKK0xVQUxJQl9BUEkgaW50IChsdWFvcGVuX3N0cmluZykgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX01BVEhMSUJOQU1FCSJtYXRoIgorTFVBTElCX0FQSSBpbnQgKGx1YW9wZW5fbWF0aCkgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX0RCTElCTkFNRQkiZGVidWciCitMVUFMSUJfQVBJIGludCAobHVhb3Blbl9kZWJ1ZykgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX0xPQURMSUJOQU1FCSJwYWNrYWdlIgorTFVBTElCX0FQSSBpbnQgKGx1YW9wZW5fcGFja2FnZSkgKGx1YV9TdGF0ZSAqTCk7CisKKworLyogb3BlbiBhbGwgcHJldmlvdXMgbGlicmFyaWVzICovCitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfb3BlbmxpYnMpIChsdWFfU3RhdGUgKkwpOyAKKworCisKKyNpZm5kZWYgbHVhX2Fzc2VydAorI2RlZmluZSBsdWFfYXNzZXJ0KHgpCSgodm9pZCkwKQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2x1bmR1bXAuYyBiL2x1YS01LjEuNC9zcmMvbHVuZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTBhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2x1bmR1bXAuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyoqICRJZDogbHVuZHVtcC5jLHYgMi43LjEuNCAyMDA4LzA0LzA0IDE5OjUxOjQxIHJvYmVydG8gRXhwICQKKyoqIGxvYWQgcHJlY29tcGlsZWQgTHVhIGNodW5rcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsdW5kdW1wX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdW5kdW1wLmgiCisjaW5jbHVkZSAibHppby5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgbHVhX1N0YXRlKiBMOworIFpJTyogWjsKKyBNYnVmZmVyKiBiOworIGNvbnN0IGNoYXIqIG5hbWU7Cit9IExvYWRTdGF0ZTsKKworI2lmZGVmIExVQUNfVFJVU1RfQklOQVJJRVMKKyNkZWZpbmUgSUYoYyxzKQorI2RlZmluZSBlcnJvcihTLHMpCisjZWxzZQorI2RlZmluZSBJRihjLHMpCQlpZiAoYykgZXJyb3IoUyxzKQorCitzdGF0aWMgdm9pZCBlcnJvcihMb2FkU3RhdGUqIFMsIGNvbnN0IGNoYXIqIHdoeSkKK3sKKyBsdWFPX3B1c2hmc3RyaW5nKFMtPkwsIiVzOiAlcyBpbiBwcmVjb21waWxlZCBjaHVuayIsUy0+bmFtZSx3aHkpOworIGx1YURfdGhyb3coUy0+TCxMVUFfRVJSU1lOVEFYKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIExvYWRNZW0oUyxiLG4sc2l6ZSkJTG9hZEJsb2NrKFMsYiwobikqKHNpemUpKQorI2RlZmluZQlMb2FkQnl0ZShTKQkJKGx1X2J5dGUpTG9hZENoYXIoUykKKyNkZWZpbmUgTG9hZFZhcihTLHgpCQlMb2FkTWVtKFMsJngsMSxzaXplb2YoeCkpCisjZGVmaW5lIExvYWRWZWN0b3IoUyxiLG4sc2l6ZSkJTG9hZE1lbShTLGIsbixzaXplKQorCitzdGF0aWMgdm9pZCBMb2FkQmxvY2soTG9hZFN0YXRlKiBTLCB2b2lkKiBiLCBzaXplX3Qgc2l6ZSkKK3sKKyBzaXplX3Qgcj1sdWFaX3JlYWQoUy0+WixiLHNpemUpOworIElGIChyIT0wLCAidW5leHBlY3RlZCBlbmQiKTsKK30KKworc3RhdGljIGludCBMb2FkQ2hhcihMb2FkU3RhdGUqIFMpCit7CisgY2hhciB4OworIExvYWRWYXIoUyx4KTsKKyByZXR1cm4geDsKK30KKworc3RhdGljIGludCBMb2FkSW50KExvYWRTdGF0ZSogUykKK3sKKyBpbnQgeDsKKyBMb2FkVmFyKFMseCk7CisgSUYgKHg8MCwgImJhZCBpbnRlZ2VyIik7CisgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBsdWFfTnVtYmVyIExvYWROdW1iZXIoTG9hZFN0YXRlKiBTKQoreworIGx1YV9OdW1iZXIgeDsKKyBMb2FkVmFyKFMseCk7CisgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBUU3RyaW5nKiBMb2FkU3RyaW5nKExvYWRTdGF0ZSogUykKK3sKKyBzaXplX3Qgc2l6ZTsKKyBMb2FkVmFyKFMsc2l6ZSk7CisgaWYgKHNpemU9PTApCisgIHJldHVybiBOVUxMOworIGVsc2UKKyB7CisgIGNoYXIqIHM9bHVhWl9vcGVuc3BhY2UoUy0+TCxTLT5iLHNpemUpOworICBMb2FkQmxvY2soUyxzLHNpemUpOworICByZXR1cm4gbHVhU19uZXdsc3RyKFMtPkwscyxzaXplLTEpOwkJLyogcmVtb3ZlIHRyYWlsaW5nICdcMCcgKi8KKyB9Cit9CisKK3N0YXRpYyB2b2lkIExvYWRDb2RlKExvYWRTdGF0ZSogUywgUHJvdG8qIGYpCit7CisgaW50IG49TG9hZEludChTKTsKKyBmLT5jb2RlPWx1YU1fbmV3dmVjdG9yKFMtPkwsbixJbnN0cnVjdGlvbik7CisgZi0+c2l6ZWNvZGU9bjsKKyBMb2FkVmVjdG9yKFMsZi0+Y29kZSxuLHNpemVvZihJbnN0cnVjdGlvbikpOworfQorCitzdGF0aWMgUHJvdG8qIExvYWRGdW5jdGlvbihMb2FkU3RhdGUqIFMsIFRTdHJpbmcqIHApOworCitzdGF0aWMgdm9pZCBMb2FkQ29uc3RhbnRzKExvYWRTdGF0ZSogUywgUHJvdG8qIGYpCit7CisgaW50IGksbjsKKyBuPUxvYWRJbnQoUyk7CisgZi0+az1sdWFNX25ld3ZlY3RvcihTLT5MLG4sVFZhbHVlKTsKKyBmLT5zaXplaz1uOworIGZvciAoaT0wOyBpPG47IGkrKykgc2V0bmlsdmFsdWUoJmYtPmtbaV0pOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIFRWYWx1ZSogbz0mZi0+a1tpXTsKKyAgaW50IHQ9TG9hZENoYXIoUyk7CisgIHN3aXRjaCAodCkKKyAgeworICAgY2FzZSBMVUFfVE5JTDoKKyAgIAlzZXRuaWx2YWx1ZShvKTsKKwlicmVhazsKKyAgIGNhc2UgTFVBX1RCT09MRUFOOgorICAgCXNldGJ2YWx1ZShvLExvYWRDaGFyKFMpIT0wKTsKKwlicmVhazsKKyAgIGNhc2UgTFVBX1ROVU1CRVI6CisJc2V0bnZhbHVlKG8sTG9hZE51bWJlcihTKSk7CisJYnJlYWs7CisgICBjYXNlIExVQV9UU1RSSU5HOgorCXNldHN2YWx1ZTJuKFMtPkwsbyxMb2FkU3RyaW5nKFMpKTsKKwlicmVhazsKKyAgIGRlZmF1bHQ6CisJZXJyb3IoUywiYmFkIGNvbnN0YW50Iik7CisJYnJlYWs7CisgIH0KKyB9Cisgbj1Mb2FkSW50KFMpOworIGYtPnA9bHVhTV9uZXd2ZWN0b3IoUy0+TCxuLFByb3RvKik7CisgZi0+c2l6ZXA9bjsKKyBmb3IgKGk9MDsgaTxuOyBpKyspIGYtPnBbaV09TlVMTDsKKyBmb3IgKGk9MDsgaTxuOyBpKyspIGYtPnBbaV09TG9hZEZ1bmN0aW9uKFMsZi0+c291cmNlKTsKK30KKworc3RhdGljIHZvaWQgTG9hZERlYnVnKExvYWRTdGF0ZSogUywgUHJvdG8qIGYpCit7CisgaW50IGksbjsKKyBuPUxvYWRJbnQoUyk7CisgZi0+bGluZWluZm89bHVhTV9uZXd2ZWN0b3IoUy0+TCxuLGludCk7CisgZi0+c2l6ZWxpbmVpbmZvPW47CisgTG9hZFZlY3RvcihTLGYtPmxpbmVpbmZvLG4sc2l6ZW9mKGludCkpOworIG49TG9hZEludChTKTsKKyBmLT5sb2N2YXJzPWx1YU1fbmV3dmVjdG9yKFMtPkwsbixMb2NWYXIpOworIGYtPnNpemVsb2N2YXJzPW47CisgZm9yIChpPTA7IGk8bjsgaSsrKSBmLT5sb2N2YXJzW2ldLnZhcm5hbWU9TlVMTDsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBmLT5sb2N2YXJzW2ldLnZhcm5hbWU9TG9hZFN0cmluZyhTKTsKKyAgZi0+bG9jdmFyc1tpXS5zdGFydHBjPUxvYWRJbnQoUyk7CisgIGYtPmxvY3ZhcnNbaV0uZW5kcGM9TG9hZEludChTKTsKKyB9Cisgbj1Mb2FkSW50KFMpOworIGYtPnVwdmFsdWVzPWx1YU1fbmV3dmVjdG9yKFMtPkwsbixUU3RyaW5nKik7CisgZi0+c2l6ZXVwdmFsdWVzPW47CisgZm9yIChpPTA7IGk8bjsgaSsrKSBmLT51cHZhbHVlc1tpXT1OVUxMOworIGZvciAoaT0wOyBpPG47IGkrKykgZi0+dXB2YWx1ZXNbaV09TG9hZFN0cmluZyhTKTsKK30KKworc3RhdGljIFByb3RvKiBMb2FkRnVuY3Rpb24oTG9hZFN0YXRlKiBTLCBUU3RyaW5nKiBwKQoreworIFByb3RvKiBmOworIGlmICgrK1MtPkwtPm5DY2FsbHMgPiBMVUFJX01BWENDQUxMUykgZXJyb3IoUywiY29kZSB0b28gZGVlcCIpOworIGY9bHVhRl9uZXdwcm90byhTLT5MKTsKKyBzZXRwdHZhbHVlMnMoUy0+TCxTLT5MLT50b3AsZik7IGluY3JfdG9wKFMtPkwpOworIGYtPnNvdXJjZT1Mb2FkU3RyaW5nKFMpOyBpZiAoZi0+c291cmNlPT1OVUxMKSBmLT5zb3VyY2U9cDsKKyBmLT5saW5lZGVmaW5lZD1Mb2FkSW50KFMpOworIGYtPmxhc3RsaW5lZGVmaW5lZD1Mb2FkSW50KFMpOworIGYtPm51cHM9TG9hZEJ5dGUoUyk7CisgZi0+bnVtcGFyYW1zPUxvYWRCeXRlKFMpOworIGYtPmlzX3ZhcmFyZz1Mb2FkQnl0ZShTKTsKKyBmLT5tYXhzdGFja3NpemU9TG9hZEJ5dGUoUyk7CisgTG9hZENvZGUoUyxmKTsKKyBMb2FkQ29uc3RhbnRzKFMsZik7CisgTG9hZERlYnVnKFMsZik7CisgSUYgKCFsdWFHX2NoZWNrY29kZShmKSwgImJhZCBjb2RlIik7CisgUy0+TC0+dG9wLS07CisgUy0+TC0+bkNjYWxscy0tOworIHJldHVybiBmOworfQorCitzdGF0aWMgdm9pZCBMb2FkSGVhZGVyKExvYWRTdGF0ZSogUykKK3sKKyBjaGFyIGhbTFVBQ19IRUFERVJTSVpFXTsKKyBjaGFyIHNbTFVBQ19IRUFERVJTSVpFXTsKKyBsdWFVX2hlYWRlcihoKTsKKyBMb2FkQmxvY2soUyxzLExVQUNfSEVBREVSU0laRSk7CisgSUYgKG1lbWNtcChoLHMsTFVBQ19IRUFERVJTSVpFKSE9MCwgImJhZCBoZWFkZXIiKTsKK30KKworLyoKKyoqIGxvYWQgcHJlY29tcGlsZWQgY2h1bmsKKyovCitQcm90byogbHVhVV91bmR1bXAgKGx1YV9TdGF0ZSogTCwgWklPKiBaLCBNYnVmZmVyKiBidWZmLCBjb25zdCBjaGFyKiBuYW1lKQoreworIExvYWRTdGF0ZSBTOworIGlmICgqbmFtZT09J0AnIHx8ICpuYW1lPT0nPScpCisgIFMubmFtZT1uYW1lKzE7CisgZWxzZSBpZiAoKm5hbWU9PUxVQV9TSUdOQVRVUkVbMF0pCisgIFMubmFtZT0iYmluYXJ5IHN0cmluZyI7CisgZWxzZQorICBTLm5hbWU9bmFtZTsKKyBTLkw9TDsKKyBTLlo9WjsKKyBTLmI9YnVmZjsKKyBMb2FkSGVhZGVyKCZTKTsKKyByZXR1cm4gTG9hZEZ1bmN0aW9uKCZTLGx1YVNfbmV3bGl0ZXJhbChMLCI9PyIpKTsKK30KKworLyoKKyogbWFrZSBoZWFkZXIKKyovCit2b2lkIGx1YVVfaGVhZGVyIChjaGFyKiBoKQoreworIGludCB4PTE7CisgbWVtY3B5KGgsTFVBX1NJR05BVFVSRSxzaXplb2YoTFVBX1NJR05BVFVSRSktMSk7CisgaCs9c2l6ZW9mKExVQV9TSUdOQVRVUkUpLTE7CisgKmgrKz0oY2hhcilMVUFDX1ZFUlNJT047CisgKmgrKz0oY2hhcilMVUFDX0ZPUk1BVDsKKyAqaCsrPShjaGFyKSooY2hhciopJng7CQkJCS8qIGVuZGlhbm5lc3MgKi8KKyAqaCsrPShjaGFyKXNpemVvZihpbnQpOworICpoKys9KGNoYXIpc2l6ZW9mKHNpemVfdCk7CisgKmgrKz0oY2hhcilzaXplb2YoSW5zdHJ1Y3Rpb24pOworICpoKys9KGNoYXIpc2l6ZW9mKGx1YV9OdW1iZXIpOworICpoKys9KGNoYXIpKCgobHVhX051bWJlcikwLjUpPT0wKTsJCS8qIGlzIGx1YV9OdW1iZXIgaW50ZWdyYWw/ICovCit9CmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2x1bmR1bXAuaCBiL2x1YS01LjEuNC9zcmMvbHVuZHVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDE4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2x1bmR1bXAuaApAQCAtMCwwICsxLDM2IEBACisvKgorKiogJElkOiBsdW5kdW1wLmgsdiAxLjM3LjEuMSAyMDA3LzEyLzI3IDEzOjAyOjI1IHJvYmVydG8gRXhwICQKKyoqIGxvYWQgcHJlY29tcGlsZWQgTHVhIGNodW5rcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbHVuZHVtcF9oCisjZGVmaW5lIGx1bmR1bXBfaAorCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworLyogbG9hZCBvbmUgY2h1bms7IGZyb20gbHVuZHVtcC5jICovCitMVUFJX0ZVTkMgUHJvdG8qIGx1YVVfdW5kdW1wIChsdWFfU3RhdGUqIEwsIFpJTyogWiwgTWJ1ZmZlciogYnVmZiwgY29uc3QgY2hhciogbmFtZSk7CisKKy8qIG1ha2UgaGVhZGVyOyBmcm9tIGx1bmR1bXAuYyAqLworTFVBSV9GVU5DIHZvaWQgbHVhVV9oZWFkZXIgKGNoYXIqIGgpOworCisvKiBkdW1wIG9uZSBjaHVuazsgZnJvbSBsZHVtcC5jICovCitMVUFJX0ZVTkMgaW50IGx1YVVfZHVtcCAobHVhX1N0YXRlKiBMLCBjb25zdCBQcm90byogZiwgbHVhX1dyaXRlciB3LCB2b2lkKiBkYXRhLCBpbnQgc3RyaXApOworCisjaWZkZWYgbHVhY19jCisvKiBwcmludCBvbmUgY2h1bms7IGZyb20gcHJpbnQuYyAqLworTFVBSV9GVU5DIHZvaWQgbHVhVV9wcmludCAoY29uc3QgUHJvdG8qIGYsIGludCBmdWxsKTsKKyNlbmRpZgorCisvKiBmb3IgaGVhZGVyIG9mIGJpbmFyeSBmaWxlcyAtLSB0aGlzIGlzIEx1YSA1LjEgKi8KKyNkZWZpbmUgTFVBQ19WRVJTSU9OCQkweDUxCisKKy8qIGZvciBoZWFkZXIgb2YgYmluYXJ5IGZpbGVzIC0tIHRoaXMgaXMgdGhlIG9mZmljaWFsIGZvcm1hdCAqLworI2RlZmluZSBMVUFDX0ZPUk1BVAkJMAorCisvKiBzaXplIG9mIGhlYWRlciBvZiBiaW5hcnkgZmlsZXMgKi8KKyNkZWZpbmUgTFVBQ19IRUFERVJTSVpFCQkxMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC9zcmMvbHZtLmMgYi9sdWEtNS4xLjQvc3JjL2x2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzI1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL2x2bS5jCkBAIC0wLDAgKzEsNzYzIEBACisvKgorKiogJElkOiBsdm0uYyx2IDIuNjMuMS4zIDIwMDcvMTIvMjggMTU6MzI6MjMgcm9iZXJ0byBFeHAgJAorKiogTHVhIHZpcnR1YWwgbWFjaGluZQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbHZtX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibG9wY29kZXMuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisjaW5jbHVkZSAibHRtLmgiCisjaW5jbHVkZSAibHZtLmgiCisKKworCisvKiBsaW1pdCBmb3IgdGFibGUgdGFnLW1ldGhvZCBjaGFpbnMgKHRvIGF2b2lkIGxvb3BzKSAqLworI2RlZmluZSBNQVhUQUdMT09QCTEwMAorCisKK2NvbnN0IFRWYWx1ZSAqbHVhVl90b251bWJlciAoY29uc3QgVFZhbHVlICpvYmosIFRWYWx1ZSAqbikgeworICBsdWFfTnVtYmVyIG51bTsKKyAgaWYgKHR0aXNudW1iZXIob2JqKSkgcmV0dXJuIG9iajsKKyAgaWYgKHR0aXNzdHJpbmcob2JqKSAmJiBsdWFPX3N0cjJkKHN2YWx1ZShvYmopLCAmbnVtKSkgeworICAgIHNldG52YWx1ZShuLCBudW0pOworICAgIHJldHVybiBuOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitpbnQgbHVhVl90b3N0cmluZyAobHVhX1N0YXRlICpMLCBTdGtJZCBvYmopIHsKKyAgaWYgKCF0dGlzbnVtYmVyKG9iaikpCisgICAgcmV0dXJuIDA7CisgIGVsc2UgeworICAgIGNoYXIgc1tMVUFJX01BWE5VTUJFUjJTVFJdOworICAgIGx1YV9OdW1iZXIgbiA9IG52YWx1ZShvYmopOworICAgIGx1YV9udW1iZXIyc3RyKHMsIG4pOworICAgIHNldHN2YWx1ZTJzKEwsIG9iaiwgbHVhU19uZXcoTCwgcykpOworICAgIHJldHVybiAxOworICB9Cit9CisKKworc3RhdGljIHZvaWQgdHJhY2VleGVjIChsdWFfU3RhdGUgKkwsIGNvbnN0IEluc3RydWN0aW9uICpwYykgeworICBsdV9ieXRlIG1hc2sgPSBMLT5ob29rbWFzazsKKyAgY29uc3QgSW5zdHJ1Y3Rpb24gKm9sZHBjID0gTC0+c2F2ZWRwYzsKKyAgTC0+c2F2ZWRwYyA9IHBjOworICBpZiAoKG1hc2sgJiBMVUFfTUFTS0NPVU5UKSAmJiBMLT5ob29rY291bnQgPT0gMCkgeworICAgIHJlc2V0aG9va2NvdW50KEwpOworICAgIGx1YURfY2FsbGhvb2soTCwgTFVBX0hPT0tDT1VOVCwgLTEpOworICB9CisgIGlmIChtYXNrICYgTFVBX01BU0tMSU5FKSB7CisgICAgUHJvdG8gKnAgPSBjaV9mdW5jKEwtPmNpKS0+bC5wOworICAgIGludCBucGMgPSBwY1JlbChwYywgcCk7CisgICAgaW50IG5ld2xpbmUgPSBnZXRsaW5lKHAsIG5wYyk7CisgICAgLyogY2FsbCBsaW5laG9vayB3aGVuIGVudGVyIGEgbmV3IGZ1bmN0aW9uLCB3aGVuIGp1bXAgYmFjayAobG9vcCksCisgICAgICAgb3Igd2hlbiBlbnRlciBhIG5ldyBsaW5lICovCisgICAgaWYgKG5wYyA9PSAwIHx8IHBjIDw9IG9sZHBjIHx8IG5ld2xpbmUgIT0gZ2V0bGluZShwLCBwY1JlbChvbGRwYywgcCkpKQorICAgICAgbHVhRF9jYWxsaG9vayhMLCBMVUFfSE9PS0xJTkUsIG5ld2xpbmUpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgY2FsbFRNcmVzIChsdWFfU3RhdGUgKkwsIFN0a0lkIHJlcywgY29uc3QgVFZhbHVlICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFZhbHVlICpwMSwgY29uc3QgVFZhbHVlICpwMikgeworICBwdHJkaWZmX3QgcmVzdWx0ID0gc2F2ZXN0YWNrKEwsIHJlcyk7CisgIHNldG9iajJzKEwsIEwtPnRvcCwgZik7ICAvKiBwdXNoIGZ1bmN0aW9uICovCisgIHNldG9iajJzKEwsIEwtPnRvcCsxLCBwMSk7ICAvKiAxc3QgYXJndW1lbnQgKi8KKyAgc2V0b2JqMnMoTCwgTC0+dG9wKzIsIHAyKTsgIC8qIDJuZCBhcmd1bWVudCAqLworICBsdWFEX2NoZWNrc3RhY2soTCwgMyk7CisgIEwtPnRvcCArPSAzOworICBsdWFEX2NhbGwoTCwgTC0+dG9wIC0gMywgMSk7CisgIHJlcyA9IHJlc3RvcmVzdGFjayhMLCByZXN1bHQpOworICBMLT50b3AtLTsKKyAgc2V0b2JqczJzKEwsIHJlcywgTC0+dG9wKTsKK30KKworCisKK3N0YXRpYyB2b2lkIGNhbGxUTSAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKmYsIGNvbnN0IFRWYWx1ZSAqcDEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRWYWx1ZSAqcDIsIGNvbnN0IFRWYWx1ZSAqcDMpIHsKKyAgc2V0b2JqMnMoTCwgTC0+dG9wLCBmKTsgIC8qIHB1c2ggZnVuY3Rpb24gKi8KKyAgc2V0b2JqMnMoTCwgTC0+dG9wKzEsIHAxKTsgIC8qIDFzdCBhcmd1bWVudCAqLworICBzZXRvYmoycyhMLCBMLT50b3ArMiwgcDIpOyAgLyogMm5kIGFyZ3VtZW50ICovCisgIHNldG9iajJzKEwsIEwtPnRvcCszLCBwMyk7ICAvKiAzdGggYXJndW1lbnQgKi8KKyAgbHVhRF9jaGVja3N0YWNrKEwsIDQpOworICBMLT50b3AgKz0gNDsKKyAgbHVhRF9jYWxsKEwsIEwtPnRvcCAtIDQsIDApOworfQorCisKK3ZvaWQgbHVhVl9nZXR0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnQsIFRWYWx1ZSAqa2V5LCBTdGtJZCB2YWwpIHsKKyAgaW50IGxvb3A7CisgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBNQVhUQUdMT09QOyBsb29wKyspIHsKKyAgICBjb25zdCBUVmFsdWUgKnRtOworICAgIGlmICh0dGlzdGFibGUodCkpIHsgIC8qIGB0JyBpcyBhIHRhYmxlPyAqLworICAgICAgVGFibGUgKmggPSBodmFsdWUodCk7CisgICAgICBjb25zdCBUVmFsdWUgKnJlcyA9IGx1YUhfZ2V0KGgsIGtleSk7IC8qIGRvIGEgcHJpbWl0aXZlIGdldCAqLworICAgICAgaWYgKCF0dGlzbmlsKHJlcykgfHwgIC8qIHJlc3VsdCBpcyBubyBuaWw/ICovCisgICAgICAgICAgKHRtID0gZmFzdHRtKEwsIGgtPm1ldGF0YWJsZSwgVE1fSU5ERVgpKSA9PSBOVUxMKSB7IC8qIG9yIG5vIFRNPyAqLworICAgICAgICBzZXRvYmoycyhMLCB2YWwsIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIGVsc2Ugd2lsbCB0cnkgdGhlIHRhZyBtZXRob2QgKi8KKyAgICB9CisgICAgZWxzZSBpZiAodHRpc25pbCh0bSA9IGx1YVRfZ2V0dG1ieW9iaihMLCB0LCBUTV9JTkRFWCkpKQorICAgICAgbHVhR190eXBlZXJyb3IoTCwgdCwgImluZGV4Iik7CisgICAgaWYgKHR0aXNmdW5jdGlvbih0bSkpIHsKKyAgICAgIGNhbGxUTXJlcyhMLCB2YWwsIHRtLCB0LCBrZXkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0ID0gdG07ICAvKiBlbHNlIHJlcGVhdCB3aXRoIGB0bScgKi8gCisgIH0KKyAgbHVhR19ydW5lcnJvcihMLCAibG9vcCBpbiBnZXR0YWJsZSIpOworfQorCisKK3ZvaWQgbHVhVl9zZXR0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnQsIFRWYWx1ZSAqa2V5LCBTdGtJZCB2YWwpIHsKKyAgaW50IGxvb3A7CisgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBNQVhUQUdMT09QOyBsb29wKyspIHsKKyAgICBjb25zdCBUVmFsdWUgKnRtOworICAgIGlmICh0dGlzdGFibGUodCkpIHsgIC8qIGB0JyBpcyBhIHRhYmxlPyAqLworICAgICAgVGFibGUgKmggPSBodmFsdWUodCk7CisgICAgICBUVmFsdWUgKm9sZHZhbCA9IGx1YUhfc2V0KEwsIGgsIGtleSk7IC8qIGRvIGEgcHJpbWl0aXZlIHNldCAqLworICAgICAgaWYgKCF0dGlzbmlsKG9sZHZhbCkgfHwgIC8qIHJlc3VsdCBpcyBubyBuaWw/ICovCisgICAgICAgICAgKHRtID0gZmFzdHRtKEwsIGgtPm1ldGF0YWJsZSwgVE1fTkVXSU5ERVgpKSA9PSBOVUxMKSB7IC8qIG9yIG5vIFRNPyAqLworICAgICAgICBzZXRvYmoydChMLCBvbGR2YWwsIHZhbCk7CisgICAgICAgIGx1YUNfYmFycmllcnQoTCwgaCwgdmFsKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogZWxzZSB3aWxsIHRyeSB0aGUgdGFnIG1ldGhvZCAqLworICAgIH0KKyAgICBlbHNlIGlmICh0dGlzbmlsKHRtID0gbHVhVF9nZXR0bWJ5b2JqKEwsIHQsIFRNX05FV0lOREVYKSkpCisgICAgICBsdWFHX3R5cGVlcnJvcihMLCB0LCAiaW5kZXgiKTsKKyAgICBpZiAodHRpc2Z1bmN0aW9uKHRtKSkgeworICAgICAgY2FsbFRNKEwsIHRtLCB0LCBrZXksIHZhbCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHQgPSB0bTsgIC8qIGVsc2UgcmVwZWF0IHdpdGggYHRtJyAqLyAKKyAgfQorICBsdWFHX3J1bmVycm9yKEwsICJsb29wIGluIHNldHRhYmxlIik7Cit9CisKKworc3RhdGljIGludCBjYWxsX2JpblRNIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqcDEsIGNvbnN0IFRWYWx1ZSAqcDIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0a0lkIHJlcywgVE1TIGV2ZW50KSB7CisgIGNvbnN0IFRWYWx1ZSAqdG0gPSBsdWFUX2dldHRtYnlvYmooTCwgcDEsIGV2ZW50KTsgIC8qIHRyeSBmaXJzdCBvcGVyYW5kICovCisgIGlmICh0dGlzbmlsKHRtKSkKKyAgICB0bSA9IGx1YVRfZ2V0dG1ieW9iaihMLCBwMiwgZXZlbnQpOyAgLyogdHJ5IHNlY29uZCBvcGVyYW5kICovCisgIGlmICh0dGlzbmlsKHRtKSkgcmV0dXJuIDA7CisgIGNhbGxUTXJlcyhMLCByZXMsIHRtLCBwMSwgcDIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgY29uc3QgVFZhbHVlICpnZXRfY29tcFRNIChsdWFfU3RhdGUgKkwsIFRhYmxlICptdDEsIFRhYmxlICptdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1TIGV2ZW50KSB7CisgIGNvbnN0IFRWYWx1ZSAqdG0xID0gZmFzdHRtKEwsIG10MSwgZXZlbnQpOworICBjb25zdCBUVmFsdWUgKnRtMjsKKyAgaWYgKHRtMSA9PSBOVUxMKSByZXR1cm4gTlVMTDsgIC8qIG5vIG1ldGFtZXRob2QgKi8KKyAgaWYgKG10MSA9PSBtdDIpIHJldHVybiB0bTE7ICAvKiBzYW1lIG1ldGF0YWJsZXMgPT4gc2FtZSBtZXRhbWV0aG9kcyAqLworICB0bTIgPSBmYXN0dG0oTCwgbXQyLCBldmVudCk7CisgIGlmICh0bTIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7ICAvKiBubyBtZXRhbWV0aG9kICovCisgIGlmIChsdWFPX3Jhd2VxdWFsT2JqKHRtMSwgdG0yKSkgIC8qIHNhbWUgbWV0YW1ldGhvZHM/ICovCisgICAgcmV0dXJuIHRtMTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGludCBjYWxsX29yZGVyVE0gKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpwMSwgY29uc3QgVFZhbHVlICpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUTVMgZXZlbnQpIHsKKyAgY29uc3QgVFZhbHVlICp0bTEgPSBsdWFUX2dldHRtYnlvYmooTCwgcDEsIGV2ZW50KTsKKyAgY29uc3QgVFZhbHVlICp0bTI7CisgIGlmICh0dGlzbmlsKHRtMSkpIHJldHVybiAtMTsgIC8qIG5vIG1ldGFtZXRob2Q/ICovCisgIHRtMiA9IGx1YVRfZ2V0dG1ieW9iaihMLCBwMiwgZXZlbnQpOworICBpZiAoIWx1YU9fcmF3ZXF1YWxPYmoodG0xLCB0bTIpKSAgLyogZGlmZmVyZW50IG1ldGFtZXRob2RzPyAqLworICAgIHJldHVybiAtMTsKKyAgY2FsbFRNcmVzKEwsIEwtPnRvcCwgdG0xLCBwMSwgcDIpOworICByZXR1cm4gIWxfaXNmYWxzZShMLT50b3ApOworfQorCisKK3N0YXRpYyBpbnQgbF9zdHJjbXAgKGNvbnN0IFRTdHJpbmcgKmxzLCBjb25zdCBUU3RyaW5nICpycykgeworICBjb25zdCBjaGFyICpsID0gZ2V0c3RyKGxzKTsKKyAgc2l6ZV90IGxsID0gbHMtPnRzdi5sZW47CisgIGNvbnN0IGNoYXIgKnIgPSBnZXRzdHIocnMpOworICBzaXplX3QgbHIgPSBycy0+dHN2LmxlbjsKKyAgZm9yICg7OykgeworICAgIGludCB0ZW1wID0gc3RyY29sbChsLCByKTsKKyAgICBpZiAodGVtcCAhPSAwKSByZXR1cm4gdGVtcDsKKyAgICBlbHNlIHsgIC8qIHN0cmluZ3MgYXJlIGVxdWFsIHVwIHRvIGEgYFwwJyAqLworICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihsKTsgIC8qIGluZGV4IG9mIGZpcnN0IGBcMCcgaW4gYm90aCBzdHJpbmdzICovCisgICAgICBpZiAobGVuID09IGxyKSAgLyogciBpcyBmaW5pc2hlZD8gKi8KKyAgICAgICAgcmV0dXJuIChsZW4gPT0gbGwpID8gMCA6IDE7CisgICAgICBlbHNlIGlmIChsZW4gPT0gbGwpICAvKiBsIGlzIGZpbmlzaGVkPyAqLworICAgICAgICByZXR1cm4gLTE7ICAvKiBsIGlzIHNtYWxsZXIgdGhhbiByIChiZWNhdXNlIHIgaXMgbm90IGZpbmlzaGVkKSAqLworICAgICAgLyogYm90aCBzdHJpbmdzIGxvbmdlciB0aGFuIGBsZW4nOyBnbyBvbiBjb21wYXJpbmcgKGFmdGVyIHRoZSBgXDAnKSAqLworICAgICAgbGVuKys7CisgICAgICBsICs9IGxlbjsgbGwgLT0gbGVuOyByICs9IGxlbjsgbHIgLT0gbGVuOworICAgIH0KKyAgfQorfQorCisKK2ludCBsdWFWX2xlc3N0aGFuIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqbCwgY29uc3QgVFZhbHVlICpyKSB7CisgIGludCByZXM7CisgIGlmICh0dHlwZShsKSAhPSB0dHlwZShyKSkKKyAgICByZXR1cm4gbHVhR19vcmRlcmVycm9yKEwsIGwsIHIpOworICBlbHNlIGlmICh0dGlzbnVtYmVyKGwpKQorICAgIHJldHVybiBsdWFpX251bWx0KG52YWx1ZShsKSwgbnZhbHVlKHIpKTsKKyAgZWxzZSBpZiAodHRpc3N0cmluZyhsKSkKKyAgICByZXR1cm4gbF9zdHJjbXAocmF3dHN2YWx1ZShsKSwgcmF3dHN2YWx1ZShyKSkgPCAwOworICBlbHNlIGlmICgocmVzID0gY2FsbF9vcmRlclRNKEwsIGwsIHIsIFRNX0xUKSkgIT0gLTEpCisgICAgcmV0dXJuIHJlczsKKyAgcmV0dXJuIGx1YUdfb3JkZXJlcnJvcihMLCBsLCByKTsKK30KKworCitzdGF0aWMgaW50IGxlc3NlcXVhbCAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKmwsIGNvbnN0IFRWYWx1ZSAqcikgeworICBpbnQgcmVzOworICBpZiAodHR5cGUobCkgIT0gdHR5cGUocikpCisgICAgcmV0dXJuIGx1YUdfb3JkZXJlcnJvcihMLCBsLCByKTsKKyAgZWxzZSBpZiAodHRpc251bWJlcihsKSkKKyAgICByZXR1cm4gbHVhaV9udW1sZShudmFsdWUobCksIG52YWx1ZShyKSk7CisgIGVsc2UgaWYgKHR0aXNzdHJpbmcobCkpCisgICAgcmV0dXJuIGxfc3RyY21wKHJhd3RzdmFsdWUobCksIHJhd3RzdmFsdWUocikpIDw9IDA7CisgIGVsc2UgaWYgKChyZXMgPSBjYWxsX29yZGVyVE0oTCwgbCwgciwgVE1fTEUpKSAhPSAtMSkgIC8qIGZpcnN0IHRyeSBgbGUnICovCisgICAgcmV0dXJuIHJlczsKKyAgZWxzZSBpZiAoKHJlcyA9IGNhbGxfb3JkZXJUTShMLCByLCBsLCBUTV9MVCkpICE9IC0xKSAgLyogZWxzZSB0cnkgYGx0JyAqLworICAgIHJldHVybiAhcmVzOworICByZXR1cm4gbHVhR19vcmRlcmVycm9yKEwsIGwsIHIpOworfQorCisKK2ludCBsdWFWX2VxdWFsdmFsIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqdDEsIGNvbnN0IFRWYWx1ZSAqdDIpIHsKKyAgY29uc3QgVFZhbHVlICp0bTsKKyAgbHVhX2Fzc2VydCh0dHlwZSh0MSkgPT0gdHR5cGUodDIpKTsKKyAgc3dpdGNoICh0dHlwZSh0MSkpIHsKKyAgICBjYXNlIExVQV9UTklMOiByZXR1cm4gMTsKKyAgICBjYXNlIExVQV9UTlVNQkVSOiByZXR1cm4gbHVhaV9udW1lcShudmFsdWUodDEpLCBudmFsdWUodDIpKTsKKyAgICBjYXNlIExVQV9UQk9PTEVBTjogcmV0dXJuIGJ2YWx1ZSh0MSkgPT0gYnZhbHVlKHQyKTsgIC8qIHRydWUgbXVzdCBiZSAxICEhICovCisgICAgY2FzZSBMVUFfVExJR0hUVVNFUkRBVEE6IHJldHVybiBwdmFsdWUodDEpID09IHB2YWx1ZSh0Mik7CisgICAgY2FzZSBMVUFfVFVTRVJEQVRBOiB7CisgICAgICBpZiAodXZhbHVlKHQxKSA9PSB1dmFsdWUodDIpKSByZXR1cm4gMTsKKyAgICAgIHRtID0gZ2V0X2NvbXBUTShMLCB1dmFsdWUodDEpLT5tZXRhdGFibGUsIHV2YWx1ZSh0MiktPm1ldGF0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUTV9FUSk7CisgICAgICBicmVhazsgIC8qIHdpbGwgdHJ5IFRNICovCisgICAgfQorICAgIGNhc2UgTFVBX1RUQUJMRTogeworICAgICAgaWYgKGh2YWx1ZSh0MSkgPT0gaHZhbHVlKHQyKSkgcmV0dXJuIDE7CisgICAgICB0bSA9IGdldF9jb21wVE0oTCwgaHZhbHVlKHQxKS0+bWV0YXRhYmxlLCBodmFsdWUodDIpLT5tZXRhdGFibGUsIFRNX0VRKTsKKyAgICAgIGJyZWFrOyAgLyogd2lsbCB0cnkgVE0gKi8KKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIGdjdmFsdWUodDEpID09IGdjdmFsdWUodDIpOworICB9CisgIGlmICh0bSA9PSBOVUxMKSByZXR1cm4gMDsgIC8qIG5vIFRNPyAqLworICBjYWxsVE1yZXMoTCwgTC0+dG9wLCB0bSwgdDEsIHQyKTsgIC8qIGNhbGwgVE0gKi8KKyAgcmV0dXJuICFsX2lzZmFsc2UoTC0+dG9wKTsKK30KKworCit2b2lkIGx1YVZfY29uY2F0IChsdWFfU3RhdGUgKkwsIGludCB0b3RhbCwgaW50IGxhc3QpIHsKKyAgZG8geworICAgIFN0a0lkIHRvcCA9IEwtPmJhc2UgKyBsYXN0ICsgMTsKKyAgICBpbnQgbiA9IDI7ICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaGFuZGxlZCBpbiB0aGlzIHBhc3MgKGF0IGxlYXN0IDIpICovCisgICAgaWYgKCEodHRpc3N0cmluZyh0b3AtMikgfHwgdHRpc251bWJlcih0b3AtMikpIHx8ICF0b3N0cmluZyhMLCB0b3AtMSkpIHsKKyAgICAgIGlmICghY2FsbF9iaW5UTShMLCB0b3AtMiwgdG9wLTEsIHRvcC0yLCBUTV9DT05DQVQpKQorICAgICAgICBsdWFHX2NvbmNhdGVycm9yKEwsIHRvcC0yLCB0b3AtMSk7CisgICAgfSBlbHNlIGlmICh0c3ZhbHVlKHRvcC0xKS0+bGVuID09IDApICAvKiBzZWNvbmQgb3AgaXMgZW1wdHk/ICovCisgICAgICAodm9pZCl0b3N0cmluZyhMLCB0b3AgLSAyKTsgIC8qIHJlc3VsdCBpcyBmaXJzdCBvcCAoYXMgc3RyaW5nKSAqLworICAgIGVsc2UgeworICAgICAgLyogYXQgbGVhc3QgdHdvIHN0cmluZyB2YWx1ZXM7IGdldCBhcyBtYW55IGFzIHBvc3NpYmxlICovCisgICAgICBzaXplX3QgdGwgPSB0c3ZhbHVlKHRvcC0xKS0+bGVuOworICAgICAgY2hhciAqYnVmZmVyOworICAgICAgaW50IGk7CisgICAgICAvKiBjb2xsZWN0IHRvdGFsIGxlbmd0aCAqLworICAgICAgZm9yIChuID0gMTsgbiA8IHRvdGFsICYmIHRvc3RyaW5nKEwsIHRvcC1uLTEpOyBuKyspIHsKKyAgICAgICAgc2l6ZV90IGwgPSB0c3ZhbHVlKHRvcC1uLTEpLT5sZW47CisgICAgICAgIGlmIChsID49IE1BWF9TSVpFVCAtIHRsKSBsdWFHX3J1bmVycm9yKEwsICJzdHJpbmcgbGVuZ3RoIG92ZXJmbG93Iik7CisgICAgICAgIHRsICs9IGw7CisgICAgICB9CisgICAgICBidWZmZXIgPSBsdWFaX29wZW5zcGFjZShMLCAmRyhMKS0+YnVmZiwgdGwpOworICAgICAgdGwgPSAwOworICAgICAgZm9yIChpPW47IGk+MDsgaS0tKSB7ICAvKiBjb25jYXQgYWxsIHN0cmluZ3MgKi8KKyAgICAgICAgc2l6ZV90IGwgPSB0c3ZhbHVlKHRvcC1pKS0+bGVuOworICAgICAgICBtZW1jcHkoYnVmZmVyK3RsLCBzdmFsdWUodG9wLWkpLCBsKTsKKyAgICAgICAgdGwgKz0gbDsKKyAgICAgIH0KKyAgICAgIHNldHN2YWx1ZTJzKEwsIHRvcC1uLCBsdWFTX25ld2xzdHIoTCwgYnVmZmVyLCB0bCkpOworICAgIH0KKyAgICB0b3RhbCAtPSBuLTE7ICAvKiBnb3QgYG4nIHN0cmluZ3MgdG8gY3JlYXRlIDEgbmV3ICovCisgICAgbGFzdCAtPSBuLTE7CisgIH0gd2hpbGUgKHRvdGFsID4gMSk7ICAvKiByZXBlYXQgdW50aWwgb25seSAxIHJlc3VsdCBsZWZ0ICovCit9CisKKworc3RhdGljIHZvaWQgQXJpdGggKGx1YV9TdGF0ZSAqTCwgU3RrSWQgcmEsIGNvbnN0IFRWYWx1ZSAqcmIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVFZhbHVlICpyYywgVE1TIG9wKSB7CisgIFRWYWx1ZSB0ZW1wYiwgdGVtcGM7CisgIGNvbnN0IFRWYWx1ZSAqYiwgKmM7CisgIGlmICgoYiA9IGx1YVZfdG9udW1iZXIocmIsICZ0ZW1wYikpICE9IE5VTEwgJiYKKyAgICAgIChjID0gbHVhVl90b251bWJlcihyYywgJnRlbXBjKSkgIT0gTlVMTCkgeworICAgIGx1YV9OdW1iZXIgbmIgPSBudmFsdWUoYiksIG5jID0gbnZhbHVlKGMpOworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgIGNhc2UgVE1fQUREOiBzZXRudmFsdWUocmEsIGx1YWlfbnVtYWRkKG5iLCBuYykpOyBicmVhazsKKyAgICAgIGNhc2UgVE1fU1VCOiBzZXRudmFsdWUocmEsIGx1YWlfbnVtc3ViKG5iLCBuYykpOyBicmVhazsKKyAgICAgIGNhc2UgVE1fTVVMOiBzZXRudmFsdWUocmEsIGx1YWlfbnVtbXVsKG5iLCBuYykpOyBicmVhazsKKyAgICAgIGNhc2UgVE1fRElWOiBzZXRudmFsdWUocmEsIGx1YWlfbnVtZGl2KG5iLCBuYykpOyBicmVhazsKKyAgICAgIGNhc2UgVE1fTU9EOiBzZXRudmFsdWUocmEsIGx1YWlfbnVtbW9kKG5iLCBuYykpOyBicmVhazsKKyAgICAgIGNhc2UgVE1fUE9XOiBzZXRudmFsdWUocmEsIGx1YWlfbnVtcG93KG5iLCBuYykpOyBicmVhazsKKyAgICAgIGNhc2UgVE1fVU5NOiBzZXRudmFsdWUocmEsIGx1YWlfbnVtdW5tKG5iKSk7IGJyZWFrOworICAgICAgZGVmYXVsdDogbHVhX2Fzc2VydCgwKTsgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFjYWxsX2JpblRNKEwsIHJiLCByYywgcmEsIG9wKSkKKyAgICBsdWFHX2FyaXRoZXJyb3IoTCwgcmIsIHJjKTsKK30KKworCisKKy8qCisqKiBzb21lIG1hY3JvcyBmb3IgY29tbW9uIHRhc2tzIGluIGBsdWFWX2V4ZWN1dGUnCisqLworCisjZGVmaW5lIHJ1bnRpbWVfY2hlY2soTCwgYykJeyBpZiAoIShjKSkgYnJlYWs7IH0KKworI2RlZmluZSBSQShpKQkoYmFzZStHRVRBUkdfQShpKSkKKy8qIHRvIGJlIHVzZWQgYWZ0ZXIgcG9zc2libGUgc3RhY2sgcmVhbGxvY2F0aW9uICovCisjZGVmaW5lIFJCKGkpCWNoZWNrX2V4cChnZXRCTW9kZShHRVRfT1BDT0RFKGkpKSA9PSBPcEFyZ1IsIGJhc2UrR0VUQVJHX0IoaSkpCisjZGVmaW5lIFJDKGkpCWNoZWNrX2V4cChnZXRDTW9kZShHRVRfT1BDT0RFKGkpKSA9PSBPcEFyZ1IsIGJhc2UrR0VUQVJHX0MoaSkpCisjZGVmaW5lIFJLQihpKQljaGVja19leHAoZ2V0Qk1vZGUoR0VUX09QQ09ERShpKSkgPT0gT3BBcmdLLCBcCisJSVNLKEdFVEFSR19CKGkpKSA/IGsrSU5ERVhLKEdFVEFSR19CKGkpKSA6IGJhc2UrR0VUQVJHX0IoaSkpCisjZGVmaW5lIFJLQyhpKQljaGVja19leHAoZ2V0Q01vZGUoR0VUX09QQ09ERShpKSkgPT0gT3BBcmdLLCBcCisJSVNLKEdFVEFSR19DKGkpKSA/IGsrSU5ERVhLKEdFVEFSR19DKGkpKSA6IGJhc2UrR0VUQVJHX0MoaSkpCisjZGVmaW5lIEtCeChpKQljaGVja19leHAoZ2V0Qk1vZGUoR0VUX09QQ09ERShpKSkgPT0gT3BBcmdLLCBrK0dFVEFSR19CeChpKSkKKworCisjZGVmaW5lIGRvanVtcChMLHBjLGkpCXsocGMpICs9IChpKTsgbHVhaV90aHJlYWR5aWVsZChMKTt9CisKKworI2RlZmluZSBQcm90ZWN0KHgpCXsgTC0+c2F2ZWRwYyA9IHBjOyB7eDt9OyBiYXNlID0gTC0+YmFzZTsgfQorCisKKyNkZWZpbmUgYXJpdGhfb3Aob3AsdG0pIHsgXAorICAgICAgICBUVmFsdWUgKnJiID0gUktCKGkpOyBcCisgICAgICAgIFRWYWx1ZSAqcmMgPSBSS0MoaSk7IFwKKyAgICAgICAgaWYgKHR0aXNudW1iZXIocmIpICYmIHR0aXNudW1iZXIocmMpKSB7IFwKKyAgICAgICAgICBsdWFfTnVtYmVyIG5iID0gbnZhbHVlKHJiKSwgbmMgPSBudmFsdWUocmMpOyBcCisgICAgICAgICAgc2V0bnZhbHVlKHJhLCBvcChuYiwgbmMpKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgUHJvdGVjdChBcml0aChMLCByYSwgcmIsIHJjLCB0bSkpOyBcCisgICAgICB9CisKKworCit2b2lkIGx1YVZfZXhlY3V0ZSAobHVhX1N0YXRlICpMLCBpbnQgbmV4ZWNjYWxscykgeworICBMQ2xvc3VyZSAqY2w7CisgIFN0a0lkIGJhc2U7CisgIFRWYWx1ZSAqazsKKyAgY29uc3QgSW5zdHJ1Y3Rpb24gKnBjOworIHJlZW50cnk6ICAvKiBlbnRyeSBwb2ludCAqLworICBsdWFfYXNzZXJ0KGlzTHVhKEwtPmNpKSk7CisgIHBjID0gTC0+c2F2ZWRwYzsKKyAgY2wgPSAmY2x2YWx1ZShMLT5jaS0+ZnVuYyktPmw7CisgIGJhc2UgPSBMLT5iYXNlOworICBrID0gY2wtPnAtPms7CisgIC8qIG1haW4gbG9vcCBvZiBpbnRlcnByZXRlciAqLworICBmb3IgKDs7KSB7CisgICAgY29uc3QgSW5zdHJ1Y3Rpb24gaSA9ICpwYysrOworICAgIFN0a0lkIHJhOworICAgIGlmICgoTC0+aG9va21hc2sgJiAoTFVBX01BU0tMSU5FIHwgTFVBX01BU0tDT1VOVCkpICYmCisgICAgICAgICgtLUwtPmhvb2tjb3VudCA9PSAwIHx8IEwtPmhvb2ttYXNrICYgTFVBX01BU0tMSU5FKSkgeworICAgICAgdHJhY2VleGVjKEwsIHBjKTsKKyAgICAgIGlmIChMLT5zdGF0dXMgPT0gTFVBX1lJRUxEKSB7ICAvKiBkaWQgaG9vayB5aWVsZD8gKi8KKyAgICAgICAgTC0+c2F2ZWRwYyA9IHBjIC0gMTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYmFzZSA9IEwtPmJhc2U7CisgICAgfQorICAgIC8qIHdhcm5pbmchISBzZXZlcmFsIGNhbGxzIG1heSByZWFsbG9jIHRoZSBzdGFjayBhbmQgaW52YWxpZGF0ZSBgcmEnICovCisgICAgcmEgPSBSQShpKTsKKyAgICBsdWFfYXNzZXJ0KGJhc2UgPT0gTC0+YmFzZSAmJiBMLT5iYXNlID09IEwtPmNpLT5iYXNlKTsKKyAgICBsdWFfYXNzZXJ0KGJhc2UgPD0gTC0+dG9wICYmIEwtPnRvcCA8PSBMLT5zdGFjayArIEwtPnN0YWNrc2l6ZSk7CisgICAgbHVhX2Fzc2VydChMLT50b3AgPT0gTC0+Y2ktPnRvcCB8fCBsdWFHX2NoZWNrb3Blbm9wKGkpKTsKKyAgICBzd2l0Y2ggKEdFVF9PUENPREUoaSkpIHsKKyAgICAgIGNhc2UgT1BfTU9WRTogeworICAgICAgICBzZXRvYmpzMnMoTCwgcmEsIFJCKGkpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX0xPQURLOiB7CisgICAgICAgIHNldG9iajJzKEwsIHJhLCBLQngoaSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfTE9BREJPT0w6IHsKKyAgICAgICAgc2V0YnZhbHVlKHJhLCBHRVRBUkdfQihpKSk7CisgICAgICAgIGlmIChHRVRBUkdfQyhpKSkgcGMrKzsgIC8qIHNraXAgbmV4dCBpbnN0cnVjdGlvbiAoaWYgQykgKi8KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX0xPQUROSUw6IHsKKyAgICAgICAgVFZhbHVlICpyYiA9IFJCKGkpOworICAgICAgICBkbyB7CisgICAgICAgICAgc2V0bmlsdmFsdWUocmItLSk7CisgICAgICAgIH0gd2hpbGUgKHJiID49IHJhKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX0dFVFVQVkFMOiB7CisgICAgICAgIGludCBiID0gR0VUQVJHX0IoaSk7CisgICAgICAgIHNldG9iajJzKEwsIHJhLCBjbC0+dXB2YWxzW2JdLT52KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX0dFVEdMT0JBTDogeworICAgICAgICBUVmFsdWUgZzsKKyAgICAgICAgVFZhbHVlICpyYiA9IEtCeChpKTsKKyAgICAgICAgc2V0aHZhbHVlKEwsICZnLCBjbC0+ZW52KTsKKyAgICAgICAgbHVhX2Fzc2VydCh0dGlzc3RyaW5nKHJiKSk7CisgICAgICAgIFByb3RlY3QobHVhVl9nZXR0YWJsZShMLCAmZywgcmIsIHJhKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9HRVRUQUJMRTogeworICAgICAgICBQcm90ZWN0KGx1YVZfZ2V0dGFibGUoTCwgUkIoaSksIFJLQyhpKSwgcmEpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX1NFVEdMT0JBTDogeworICAgICAgICBUVmFsdWUgZzsKKyAgICAgICAgc2V0aHZhbHVlKEwsICZnLCBjbC0+ZW52KTsKKyAgICAgICAgbHVhX2Fzc2VydCh0dGlzc3RyaW5nKEtCeChpKSkpOworICAgICAgICBQcm90ZWN0KGx1YVZfc2V0dGFibGUoTCwgJmcsIEtCeChpKSwgcmEpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX1NFVFVQVkFMOiB7CisgICAgICAgIFVwVmFsICp1diA9IGNsLT51cHZhbHNbR0VUQVJHX0IoaSldOworICAgICAgICBzZXRvYmooTCwgdXYtPnYsIHJhKTsKKyAgICAgICAgbHVhQ19iYXJyaWVyKEwsIHV2LCByYSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9TRVRUQUJMRTogeworICAgICAgICBQcm90ZWN0KGx1YVZfc2V0dGFibGUoTCwgcmEsIFJLQihpKSwgUktDKGkpKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9ORVdUQUJMRTogeworICAgICAgICBpbnQgYiA9IEdFVEFSR19CKGkpOworICAgICAgICBpbnQgYyA9IEdFVEFSR19DKGkpOworICAgICAgICBzZXRodmFsdWUoTCwgcmEsIGx1YUhfbmV3KEwsIGx1YU9fZmIyaW50KGIpLCBsdWFPX2ZiMmludChjKSkpOworICAgICAgICBQcm90ZWN0KGx1YUNfY2hlY2tHQyhMKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9TRUxGOiB7CisgICAgICAgIFN0a0lkIHJiID0gUkIoaSk7CisgICAgICAgIHNldG9ianMycyhMLCByYSsxLCByYik7CisgICAgICAgIFByb3RlY3QobHVhVl9nZXR0YWJsZShMLCByYiwgUktDKGkpLCByYSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtYWRkLCBUTV9BREQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfU1VCOiB7CisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtc3ViLCBUTV9TVUIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfTVVMOiB7CisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtbXVsLCBUTV9NVUwpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfRElWOiB7CisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtZGl2LCBUTV9ESVYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfTU9EOiB7CisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtbW9kLCBUTV9NT0QpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfUE9XOiB7CisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtcG93LCBUTV9QT1cpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfVU5NOiB7CisgICAgICAgIFRWYWx1ZSAqcmIgPSBSQihpKTsKKyAgICAgICAgaWYgKHR0aXNudW1iZXIocmIpKSB7CisgICAgICAgICAgbHVhX051bWJlciBuYiA9IG52YWx1ZShyYik7CisgICAgICAgICAgc2V0bnZhbHVlKHJhLCBsdWFpX251bXVubShuYikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIFByb3RlY3QoQXJpdGgoTCwgcmEsIHJiLCByYiwgVE1fVU5NKSk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX05PVDogeworICAgICAgICBpbnQgcmVzID0gbF9pc2ZhbHNlKFJCKGkpKTsgIC8qIG5leHQgYXNzaWdubWVudCBtYXkgY2hhbmdlIHRoaXMgdmFsdWUgKi8KKyAgICAgICAgc2V0YnZhbHVlKHJhLCByZXMpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfTEVOOiB7CisgICAgICAgIGNvbnN0IFRWYWx1ZSAqcmIgPSBSQihpKTsKKyAgICAgICAgc3dpdGNoICh0dHlwZShyYikpIHsKKyAgICAgICAgICBjYXNlIExVQV9UVEFCTEU6IHsKKyAgICAgICAgICAgIHNldG52YWx1ZShyYSwgY2FzdF9udW0obHVhSF9nZXRuKGh2YWx1ZShyYikpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBMVUFfVFNUUklORzogeworICAgICAgICAgICAgc2V0bnZhbHVlKHJhLCBjYXN0X251bSh0c3ZhbHVlKHJiKS0+bGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDogeyAgLyogdHJ5IG1ldGFtZXRob2QgKi8KKyAgICAgICAgICAgIFByb3RlY3QoCisgICAgICAgICAgICAgIGlmICghY2FsbF9iaW5UTShMLCByYiwgbHVhT19uaWxvYmplY3QsIHJhLCBUTV9MRU4pKQorICAgICAgICAgICAgICAgIGx1YUdfdHlwZWVycm9yKEwsIHJiLCAiZ2V0IGxlbmd0aCBvZiIpOworICAgICAgICAgICAgKQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfQ09OQ0FUOiB7CisgICAgICAgIGludCBiID0gR0VUQVJHX0IoaSk7CisgICAgICAgIGludCBjID0gR0VUQVJHX0MoaSk7CisgICAgICAgIFByb3RlY3QobHVhVl9jb25jYXQoTCwgYy1iKzEsIGMpOyBsdWFDX2NoZWNrR0MoTCkpOworICAgICAgICBzZXRvYmpzMnMoTCwgUkEoaSksIGJhc2UrYik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9KTVA6IHsKKyAgICAgICAgZG9qdW1wKEwsIHBjLCBHRVRBUkdfc0J4KGkpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX0VROiB7CisgICAgICAgIFRWYWx1ZSAqcmIgPSBSS0IoaSk7CisgICAgICAgIFRWYWx1ZSAqcmMgPSBSS0MoaSk7CisgICAgICAgIFByb3RlY3QoCisgICAgICAgICAgaWYgKGVxdWFsb2JqKEwsIHJiLCByYykgPT0gR0VUQVJHX0EoaSkpCisgICAgICAgICAgICBkb2p1bXAoTCwgcGMsIEdFVEFSR19zQngoKnBjKSk7CisgICAgICAgICkKKyAgICAgICAgcGMrKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX0xUOiB7CisgICAgICAgIFByb3RlY3QoCisgICAgICAgICAgaWYgKGx1YVZfbGVzc3RoYW4oTCwgUktCKGkpLCBSS0MoaSkpID09IEdFVEFSR19BKGkpKQorICAgICAgICAgICAgZG9qdW1wKEwsIHBjLCBHRVRBUkdfc0J4KCpwYykpOworICAgICAgICApCisgICAgICAgIHBjKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9MRTogeworICAgICAgICBQcm90ZWN0KAorICAgICAgICAgIGlmIChsZXNzZXF1YWwoTCwgUktCKGkpLCBSS0MoaSkpID09IEdFVEFSR19BKGkpKQorICAgICAgICAgICAgZG9qdW1wKEwsIHBjLCBHRVRBUkdfc0J4KCpwYykpOworICAgICAgICApCisgICAgICAgIHBjKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9URVNUOiB7CisgICAgICAgIGlmIChsX2lzZmFsc2UocmEpICE9IEdFVEFSR19DKGkpKQorICAgICAgICAgIGRvanVtcChMLCBwYywgR0VUQVJHX3NCeCgqcGMpKTsKKyAgICAgICAgcGMrKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX1RFU1RTRVQ6IHsKKyAgICAgICAgVFZhbHVlICpyYiA9IFJCKGkpOworICAgICAgICBpZiAobF9pc2ZhbHNlKHJiKSAhPSBHRVRBUkdfQyhpKSkgeworICAgICAgICAgIHNldG9ianMycyhMLCByYSwgcmIpOworICAgICAgICAgIGRvanVtcChMLCBwYywgR0VUQVJHX3NCeCgqcGMpKTsKKyAgICAgICAgfQorICAgICAgICBwYysrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfQ0FMTDogeworICAgICAgICBpbnQgYiA9IEdFVEFSR19CKGkpOworICAgICAgICBpbnQgbnJlc3VsdHMgPSBHRVRBUkdfQyhpKSAtIDE7CisgICAgICAgIGlmIChiICE9IDApIEwtPnRvcCA9IHJhK2I7ICAvKiBlbHNlIHByZXZpb3VzIGluc3RydWN0aW9uIHNldCB0b3AgKi8KKyAgICAgICAgTC0+c2F2ZWRwYyA9IHBjOworICAgICAgICBzd2l0Y2ggKGx1YURfcHJlY2FsbChMLCByYSwgbnJlc3VsdHMpKSB7CisgICAgICAgICAgY2FzZSBQQ1JMVUE6IHsKKyAgICAgICAgICAgIG5leGVjY2FsbHMrKzsKKyAgICAgICAgICAgIGdvdG8gcmVlbnRyeTsgIC8qIHJlc3RhcnQgbHVhVl9leGVjdXRlIG92ZXIgbmV3IEx1YSBmdW5jdGlvbiAqLworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFBDUkM6IHsKKyAgICAgICAgICAgIC8qIGl0IHdhcyBhIEMgZnVuY3Rpb24gKGBwcmVjYWxsJyBjYWxsZWQgaXQpOyBhZGp1c3QgcmVzdWx0cyAqLworICAgICAgICAgICAgaWYgKG5yZXN1bHRzID49IDApIEwtPnRvcCA9IEwtPmNpLT50b3A7CisgICAgICAgICAgICBiYXNlID0gTC0+YmFzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICByZXR1cm47ICAvKiB5aWVsZCAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2FzZSBPUF9UQUlMQ0FMTDogeworICAgICAgICBpbnQgYiA9IEdFVEFSR19CKGkpOworICAgICAgICBpZiAoYiAhPSAwKSBMLT50b3AgPSByYStiOyAgLyogZWxzZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBzZXQgdG9wICovCisgICAgICAgIEwtPnNhdmVkcGMgPSBwYzsKKyAgICAgICAgbHVhX2Fzc2VydChHRVRBUkdfQyhpKSAtIDEgPT0gTFVBX01VTFRSRVQpOworICAgICAgICBzd2l0Y2ggKGx1YURfcHJlY2FsbChMLCByYSwgTFVBX01VTFRSRVQpKSB7CisgICAgICAgICAgY2FzZSBQQ1JMVUE6IHsKKyAgICAgICAgICAgIC8qIHRhaWwgY2FsbDogcHV0IG5ldyBmcmFtZSBpbiBwbGFjZSBvZiBwcmV2aW91cyBvbmUgKi8KKyAgICAgICAgICAgIENhbGxJbmZvICpjaSA9IEwtPmNpIC0gMTsgIC8qIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICBpbnQgYXV4OworICAgICAgICAgICAgU3RrSWQgZnVuYyA9IGNpLT5mdW5jOworICAgICAgICAgICAgU3RrSWQgcGZ1bmMgPSAoY2krMSktPmZ1bmM7ICAvKiBwcmV2aW91cyBmdW5jdGlvbiBpbmRleCAqLworICAgICAgICAgICAgaWYgKEwtPm9wZW51cHZhbCkgbHVhRl9jbG9zZShMLCBjaS0+YmFzZSk7CisgICAgICAgICAgICBMLT5iYXNlID0gY2ktPmJhc2UgPSBjaS0+ZnVuYyArICgoY2krMSktPmJhc2UgLSBwZnVuYyk7CisgICAgICAgICAgICBmb3IgKGF1eCA9IDA7IHBmdW5jK2F1eCA8IEwtPnRvcDsgYXV4KyspICAvKiBtb3ZlIGZyYW1lIGRvd24gKi8KKyAgICAgICAgICAgICAgc2V0b2JqczJzKEwsIGZ1bmMrYXV4LCBwZnVuYythdXgpOworICAgICAgICAgICAgY2ktPnRvcCA9IEwtPnRvcCA9IGZ1bmMrYXV4OyAgLyogY29ycmVjdCB0b3AgKi8KKyAgICAgICAgICAgIGx1YV9hc3NlcnQoTC0+dG9wID09IEwtPmJhc2UgKyBjbHZhbHVlKGZ1bmMpLT5sLnAtPm1heHN0YWNrc2l6ZSk7CisgICAgICAgICAgICBjaS0+c2F2ZWRwYyA9IEwtPnNhdmVkcGM7CisgICAgICAgICAgICBjaS0+dGFpbGNhbGxzKys7ICAvKiBvbmUgbW9yZSBjYWxsIGxvc3QgKi8KKyAgICAgICAgICAgIEwtPmNpLS07ICAvKiByZW1vdmUgbmV3IGZyYW1lICovCisgICAgICAgICAgICBnb3RvIHJlZW50cnk7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgUENSQzogeyAgLyogaXQgd2FzIGEgQyBmdW5jdGlvbiAoYHByZWNhbGwnIGNhbGxlZCBpdCkgKi8KKyAgICAgICAgICAgIGJhc2UgPSBMLT5iYXNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHJldHVybjsgIC8qIHlpZWxkICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBjYXNlIE9QX1JFVFVSTjogeworICAgICAgICBpbnQgYiA9IEdFVEFSR19CKGkpOworICAgICAgICBpZiAoYiAhPSAwKSBMLT50b3AgPSByYStiLTE7CisgICAgICAgIGlmIChMLT5vcGVudXB2YWwpIGx1YUZfY2xvc2UoTCwgYmFzZSk7CisgICAgICAgIEwtPnNhdmVkcGMgPSBwYzsKKyAgICAgICAgYiA9IGx1YURfcG9zY2FsbChMLCByYSk7CisgICAgICAgIGlmICgtLW5leGVjY2FsbHMgPT0gMCkgIC8qIHdhcyBwcmV2aW91cyBmdW5jdGlvbiBydW5uaW5nIGBoZXJlJz8gKi8KKyAgICAgICAgICByZXR1cm47ICAvKiBubzogcmV0dXJuICovCisgICAgICAgIGVsc2UgeyAgLyogeWVzOiBjb250aW51ZSBpdHMgZXhlY3V0aW9uICovCisgICAgICAgICAgaWYgKGIpIEwtPnRvcCA9IEwtPmNpLT50b3A7CisgICAgICAgICAgbHVhX2Fzc2VydChpc0x1YShMLT5jaSkpOworICAgICAgICAgIGx1YV9hc3NlcnQoR0VUX09QQ09ERSgqKChMLT5jaSktPnNhdmVkcGMgLSAxKSkgPT0gT1BfQ0FMTCk7CisgICAgICAgICAgZ290byByZWVudHJ5OworICAgICAgICB9CisgICAgICB9CisgICAgICBjYXNlIE9QX0ZPUkxPT1A6IHsKKyAgICAgICAgbHVhX051bWJlciBzdGVwID0gbnZhbHVlKHJhKzIpOworICAgICAgICBsdWFfTnVtYmVyIGlkeCA9IGx1YWlfbnVtYWRkKG52YWx1ZShyYSksIHN0ZXApOyAvKiBpbmNyZW1lbnQgaW5kZXggKi8KKyAgICAgICAgbHVhX051bWJlciBsaW1pdCA9IG52YWx1ZShyYSsxKTsKKyAgICAgICAgaWYgKGx1YWlfbnVtbHQoMCwgc3RlcCkgPyBsdWFpX251bWxlKGlkeCwgbGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbHVhaV9udW1sZShsaW1pdCwgaWR4KSkgeworICAgICAgICAgIGRvanVtcChMLCBwYywgR0VUQVJHX3NCeChpKSk7ICAvKiBqdW1wIGJhY2sgKi8KKyAgICAgICAgICBzZXRudmFsdWUocmEsIGlkeCk7ICAvKiB1cGRhdGUgaW50ZXJuYWwgaW5kZXguLi4gKi8KKyAgICAgICAgICBzZXRudmFsdWUocmErMywgaWR4KTsgIC8qIC4uLmFuZCBleHRlcm5hbCBpbmRleCAqLworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9GT1JQUkVQOiB7CisgICAgICAgIGNvbnN0IFRWYWx1ZSAqaW5pdCA9IHJhOworICAgICAgICBjb25zdCBUVmFsdWUgKnBsaW1pdCA9IHJhKzE7CisgICAgICAgIGNvbnN0IFRWYWx1ZSAqcHN0ZXAgPSByYSsyOworICAgICAgICBMLT5zYXZlZHBjID0gcGM7ICAvKiBuZXh0IHN0ZXBzIG1heSB0aHJvdyBlcnJvcnMgKi8KKyAgICAgICAgaWYgKCF0b251bWJlcihpbml0LCByYSkpCisgICAgICAgICAgbHVhR19ydW5lcnJvcihMLCBMVUFfUUwoImZvciIpICIgaW5pdGlhbCB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIik7CisgICAgICAgIGVsc2UgaWYgKCF0b251bWJlcihwbGltaXQsIHJhKzEpKQorICAgICAgICAgIGx1YUdfcnVuZXJyb3IoTCwgTFVBX1FMKCJmb3IiKSAiIGxpbWl0IG11c3QgYmUgYSBudW1iZXIiKTsKKyAgICAgICAgZWxzZSBpZiAoIXRvbnVtYmVyKHBzdGVwLCByYSsyKSkKKyAgICAgICAgICBsdWFHX3J1bmVycm9yKEwsIExVQV9RTCgiZm9yIikgIiBzdGVwIG11c3QgYmUgYSBudW1iZXIiKTsKKyAgICAgICAgc2V0bnZhbHVlKHJhLCBsdWFpX251bXN1YihudmFsdWUocmEpLCBudmFsdWUocHN0ZXApKSk7CisgICAgICAgIGRvanVtcChMLCBwYywgR0VUQVJHX3NCeChpKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9URk9STE9PUDogeworICAgICAgICBTdGtJZCBjYiA9IHJhICsgMzsgIC8qIGNhbGwgYmFzZSAqLworICAgICAgICBzZXRvYmpzMnMoTCwgY2IrMiwgcmErMik7CisgICAgICAgIHNldG9ianMycyhMLCBjYisxLCByYSsxKTsKKyAgICAgICAgc2V0b2JqczJzKEwsIGNiLCByYSk7CisgICAgICAgIEwtPnRvcCA9IGNiKzM7ICAvKiBmdW5jLiArIDIgYXJncyAoc3RhdGUgYW5kIGluZGV4KSAqLworICAgICAgICBQcm90ZWN0KGx1YURfY2FsbChMLCBjYiwgR0VUQVJHX0MoaSkpKTsKKyAgICAgICAgTC0+dG9wID0gTC0+Y2ktPnRvcDsKKyAgICAgICAgY2IgPSBSQShpKSArIDM7ICAvKiBwcmV2aW91cyBjYWxsIG1heSBjaGFuZ2UgdGhlIHN0YWNrICovCisgICAgICAgIGlmICghdHRpc25pbChjYikpIHsgIC8qIGNvbnRpbnVlIGxvb3A/ICovCisgICAgICAgICAgc2V0b2JqczJzKEwsIGNiLTEsIGNiKTsgIC8qIHNhdmUgY29udHJvbCB2YXJpYWJsZSAqLworICAgICAgICAgIGRvanVtcChMLCBwYywgR0VUQVJHX3NCeCgqcGMpKTsgIC8qIGp1bXAgYmFjayAqLworICAgICAgICB9CisgICAgICAgIHBjKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9TRVRMSVNUOiB7CisgICAgICAgIGludCBuID0gR0VUQVJHX0IoaSk7CisgICAgICAgIGludCBjID0gR0VUQVJHX0MoaSk7CisgICAgICAgIGludCBsYXN0OworICAgICAgICBUYWJsZSAqaDsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgIG4gPSBjYXN0X2ludChMLT50b3AgLSByYSkgLSAxOworICAgICAgICAgIEwtPnRvcCA9IEwtPmNpLT50b3A7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gMCkgYyA9IGNhc3RfaW50KCpwYysrKTsKKyAgICAgICAgcnVudGltZV9jaGVjayhMLCB0dGlzdGFibGUocmEpKTsKKyAgICAgICAgaCA9IGh2YWx1ZShyYSk7CisgICAgICAgIGxhc3QgPSAoKGMtMSkqTEZJRUxEU19QRVJfRkxVU0gpICsgbjsKKyAgICAgICAgaWYgKGxhc3QgPiBoLT5zaXplYXJyYXkpICAvKiBuZWVkcyBtb3JlIHNwYWNlPyAqLworICAgICAgICAgIGx1YUhfcmVzaXplYXJyYXkoTCwgaCwgbGFzdCk7ICAvKiBwcmUtYWxsb2MgaXQgYXQgb25jZSAqLworICAgICAgICBmb3IgKDsgbiA+IDA7IG4tLSkgeworICAgICAgICAgIFRWYWx1ZSAqdmFsID0gcmErbjsKKyAgICAgICAgICBzZXRvYmoydChMLCBsdWFIX3NldG51bShMLCBoLCBsYXN0LS0pLCB2YWwpOworICAgICAgICAgIGx1YUNfYmFycmllcnQoTCwgaCwgdmFsKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfQ0xPU0U6IHsKKyAgICAgICAgbHVhRl9jbG9zZShMLCByYSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBPUF9DTE9TVVJFOiB7CisgICAgICAgIFByb3RvICpwOworICAgICAgICBDbG9zdXJlICpuY2w7CisgICAgICAgIGludCBudXAsIGo7CisgICAgICAgIHAgPSBjbC0+cC0+cFtHRVRBUkdfQngoaSldOworICAgICAgICBudXAgPSBwLT5udXBzOworICAgICAgICBuY2wgPSBsdWFGX25ld0xjbG9zdXJlKEwsIG51cCwgY2wtPmVudik7CisgICAgICAgIG5jbC0+bC5wID0gcDsKKyAgICAgICAgZm9yIChqPTA7IGo8bnVwOyBqKyssIHBjKyspIHsKKyAgICAgICAgICBpZiAoR0VUX09QQ09ERSgqcGMpID09IE9QX0dFVFVQVkFMKQorICAgICAgICAgICAgbmNsLT5sLnVwdmFsc1tqXSA9IGNsLT51cHZhbHNbR0VUQVJHX0IoKnBjKV07CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsdWFfYXNzZXJ0KEdFVF9PUENPREUoKnBjKSA9PSBPUF9NT1ZFKTsKKyAgICAgICAgICAgIG5jbC0+bC51cHZhbHNbal0gPSBsdWFGX2ZpbmR1cHZhbChMLCBiYXNlICsgR0VUQVJHX0IoKnBjKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldGNsdmFsdWUoTCwgcmEsIG5jbCk7CisgICAgICAgIFByb3RlY3QobHVhQ19jaGVja0dDKEwpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjYXNlIE9QX1ZBUkFSRzogeworICAgICAgICBpbnQgYiA9IEdFVEFSR19CKGkpIC0gMTsKKyAgICAgICAgaW50IGo7CisgICAgICAgIENhbGxJbmZvICpjaSA9IEwtPmNpOworICAgICAgICBpbnQgbiA9IGNhc3RfaW50KGNpLT5iYXNlIC0gY2ktPmZ1bmMpIC0gY2wtPnAtPm51bXBhcmFtcyAtIDE7CisgICAgICAgIGlmIChiID09IExVQV9NVUxUUkVUKSB7CisgICAgICAgICAgUHJvdGVjdChsdWFEX2NoZWNrc3RhY2soTCwgbikpOworICAgICAgICAgIHJhID0gUkEoaSk7ICAvKiBwcmV2aW91cyBjYWxsIG1heSBjaGFuZ2UgdGhlIHN0YWNrICovCisgICAgICAgICAgYiA9IG47CisgICAgICAgICAgTC0+dG9wID0gcmEgKyBuOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBiOyBqKyspIHsKKyAgICAgICAgICBpZiAoaiA8IG4pIHsKKyAgICAgICAgICAgIHNldG9ianMycyhMLCByYSArIGosIGNpLT5iYXNlIC0gbiArIGopOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNldG5pbHZhbHVlKHJhICsgaik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvc3JjL2x2bS5oIGIvbHVhLTUuMS40L3NyYy9sdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU0ZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9sdm0uaApAQCAtMCwwICsxLDM2IEBACisvKgorKiogJElkOiBsdm0uaCx2IDIuNS4xLjEgMjAwNy8xMi8yNyAxMzowMjoyNSByb2JlcnRvIEV4cCAkCisqKiBMdWEgdmlydHVhbCBtYWNoaW5lCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsdm1faAorI2RlZmluZSBsdm1faAorCisKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHRtLmgiCisKKworI2RlZmluZSB0b3N0cmluZyhMLG8pICgodHR5cGUobykgPT0gTFVBX1RTVFJJTkcpIHx8IChsdWFWX3Rvc3RyaW5nKEwsIG8pKSkKKworI2RlZmluZSB0b251bWJlcihvLG4pCSh0dHlwZShvKSA9PSBMVUFfVE5VTUJFUiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgobykgPSBsdWFWX3RvbnVtYmVyKG8sbikpICE9IE5VTEwpKQorCisjZGVmaW5lIGVxdWFsb2JqKEwsbzEsbzIpIFwKKwkodHR5cGUobzEpID09IHR0eXBlKG8yKSAmJiBsdWFWX2VxdWFsdmFsKEwsIG8xLCBvMikpCisKKworTFVBSV9GVU5DIGludCBsdWFWX2xlc3N0aGFuIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqbCwgY29uc3QgVFZhbHVlICpyKTsKK0xVQUlfRlVOQyBpbnQgbHVhVl9lcXVhbHZhbCAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnQxLCBjb25zdCBUVmFsdWUgKnQyKTsKK0xVQUlfRlVOQyBjb25zdCBUVmFsdWUgKmx1YVZfdG9udW1iZXIgKGNvbnN0IFRWYWx1ZSAqb2JqLCBUVmFsdWUgKm4pOworTFVBSV9GVU5DIGludCBsdWFWX3Rvc3RyaW5nIChsdWFfU3RhdGUgKkwsIFN0a0lkIG9iaik7CitMVUFJX0ZVTkMgdm9pZCBsdWFWX2dldHRhYmxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqdCwgVFZhbHVlICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0a0lkIHZhbCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFWX3NldHRhYmxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqdCwgVFZhbHVlICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0a0lkIHZhbCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFWX2V4ZWN1dGUgKGx1YV9TdGF0ZSAqTCwgaW50IG5leGVjY2FsbHMpOworTFVBSV9GVU5DIHZvaWQgbHVhVl9jb25jYXQgKGx1YV9TdGF0ZSAqTCwgaW50IHRvdGFsLCBpbnQgbGFzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9semlvLmMgYi9sdWEtNS4xLjQvc3JjL2x6aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNlZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9semlvLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyoqICRJZDogbHppby5jLHYgMS4zMS4xLjEgMjAwNy8xMi8yNyAxMzowMjoyNSByb2JlcnRvIEV4cCAkCisqKiBhIGdlbmVyaWMgaW5wdXQgc3RyZWFtIGludGVyZmFjZQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGx6aW9fYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsbGltaXRzLmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworCitpbnQgbHVhWl9maWxsIChaSU8gKnopIHsKKyAgc2l6ZV90IHNpemU7CisgIGx1YV9TdGF0ZSAqTCA9IHotPkw7CisgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgIGx1YV91bmxvY2soTCk7CisgIGJ1ZmYgPSB6LT5yZWFkZXIoTCwgei0+ZGF0YSwgJnNpemUpOworICBsdWFfbG9jayhMKTsKKyAgaWYgKGJ1ZmYgPT0gTlVMTCB8fCBzaXplID09IDApIHJldHVybiBFT1o7CisgIHotPm4gPSBzaXplIC0gMTsKKyAgei0+cCA9IGJ1ZmY7CisgIHJldHVybiBjaGFyMmludCgqKHotPnArKykpOworfQorCisKK2ludCBsdWFaX2xvb2thaGVhZCAoWklPICp6KSB7CisgIGlmICh6LT5uID09IDApIHsKKyAgICBpZiAobHVhWl9maWxsKHopID09IEVPWikKKyAgICAgIHJldHVybiBFT1o7CisgICAgZWxzZSB7CisgICAgICB6LT5uKys7ICAvKiBsdWFaX2ZpbGwgcmVtb3ZlZCBmaXJzdCBieXRlOyBwdXQgYmFjayBpdCAqLworICAgICAgei0+cC0tOworICAgIH0KKyAgfQorICByZXR1cm4gY2hhcjJpbnQoKnotPnApOworfQorCisKK3ZvaWQgbHVhWl9pbml0IChsdWFfU3RhdGUgKkwsIFpJTyAqeiwgbHVhX1JlYWRlciByZWFkZXIsIHZvaWQgKmRhdGEpIHsKKyAgei0+TCA9IEw7CisgIHotPnJlYWRlciA9IHJlYWRlcjsKKyAgei0+ZGF0YSA9IGRhdGE7CisgIHotPm4gPSAwOworICB6LT5wID0gTlVMTDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVhZCAtLS0gKi8KK3NpemVfdCBsdWFaX3JlYWQgKFpJTyAqeiwgdm9pZCAqYiwgc2l6ZV90IG4pIHsKKyAgd2hpbGUgKG4pIHsKKyAgICBzaXplX3QgbTsKKyAgICBpZiAobHVhWl9sb29rYWhlYWQoeikgPT0gRU9aKQorICAgICAgcmV0dXJuIG47ICAvKiByZXR1cm4gbnVtYmVyIG9mIG1pc3NpbmcgYnl0ZXMgKi8KKyAgICBtID0gKG4gPD0gei0+bikgPyBuIDogei0+bjsgIC8qIG1pbi4gYmV0d2VlbiBuIGFuZCB6LT5uICovCisgICAgbWVtY3B5KGIsIHotPnAsIG0pOworICAgIHotPm4gLT0gbTsKKyAgICB6LT5wICs9IG07CisgICAgYiA9IChjaGFyICopYiArIG07CisgICAgbiAtPSBtOworICB9CisgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NoYXIgKmx1YVpfb3BlbnNwYWNlIChsdWFfU3RhdGUgKkwsIE1idWZmZXIgKmJ1ZmYsIHNpemVfdCBuKSB7CisgIGlmIChuID4gYnVmZi0+YnVmZnNpemUpIHsKKyAgICBpZiAobiA8IExVQV9NSU5CVUZGRVIpIG4gPSBMVUFfTUlOQlVGRkVSOworICAgIGx1YVpfcmVzaXplYnVmZmVyKEwsIGJ1ZmYsIG4pOworICB9CisgIHJldHVybiBidWZmLT5idWZmZXI7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9semlvLmggYi9sdWEtNS4xLjQvc3JjL2x6aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ2OTVkCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3NyYy9semlvLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyoqICRJZDogbHppby5oLHYgMS4yMS4xLjEgMjAwNy8xMi8yNyAxMzowMjoyNSByb2JlcnRvIEV4cCAkCisqKiBCdWZmZXJlZCBzdHJlYW1zCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaWZuZGVmIGx6aW9faAorI2RlZmluZSBsemlvX2gKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibG1lbS5oIgorCisKKyNkZWZpbmUgRU9aCSgtMSkJCQkvKiBlbmQgb2Ygc3RyZWFtICovCisKK3R5cGVkZWYgc3RydWN0IFppbyBaSU87CisKKyNkZWZpbmUgY2hhcjJpbnQoYykJY2FzdChpbnQsIGNhc3QodW5zaWduZWQgY2hhciwgKGMpKSkKKworI2RlZmluZSB6Z2V0Yyh6KSAgKCgoeiktPm4tLSk+MCA/ICBjaGFyMmludCgqKHopLT5wKyspIDogbHVhWl9maWxsKHopKQorCit0eXBlZGVmIHN0cnVjdCBNYnVmZmVyIHsKKyAgY2hhciAqYnVmZmVyOworICBzaXplX3QgbjsKKyAgc2l6ZV90IGJ1ZmZzaXplOworfSBNYnVmZmVyOworCisjZGVmaW5lIGx1YVpfaW5pdGJ1ZmZlcihMLCBidWZmKSAoKGJ1ZmYpLT5idWZmZXIgPSBOVUxMLCAoYnVmZiktPmJ1ZmZzaXplID0gMCkKKworI2RlZmluZSBsdWFaX2J1ZmZlcihidWZmKQkoKGJ1ZmYpLT5idWZmZXIpCisjZGVmaW5lIGx1YVpfc2l6ZWJ1ZmZlcihidWZmKQkoKGJ1ZmYpLT5idWZmc2l6ZSkKKyNkZWZpbmUgbHVhWl9idWZmbGVuKGJ1ZmYpCSgoYnVmZiktPm4pCisKKyNkZWZpbmUgbHVhWl9yZXNldGJ1ZmZlcihidWZmKSAoKGJ1ZmYpLT5uID0gMCkKKworCisjZGVmaW5lIGx1YVpfcmVzaXplYnVmZmVyKEwsIGJ1ZmYsIHNpemUpIFwKKwkobHVhTV9yZWFsbG9jdmVjdG9yKEwsIChidWZmKS0+YnVmZmVyLCAoYnVmZiktPmJ1ZmZzaXplLCBzaXplLCBjaGFyKSwgXAorCShidWZmKS0+YnVmZnNpemUgPSBzaXplKQorCisjZGVmaW5lIGx1YVpfZnJlZWJ1ZmZlcihMLCBidWZmKQlsdWFaX3Jlc2l6ZWJ1ZmZlcihMLCBidWZmLCAwKQorCisKK0xVQUlfRlVOQyBjaGFyICpsdWFaX29wZW5zcGFjZSAobHVhX1N0YXRlICpMLCBNYnVmZmVyICpidWZmLCBzaXplX3Qgbik7CitMVUFJX0ZVTkMgdm9pZCBsdWFaX2luaXQgKGx1YV9TdGF0ZSAqTCwgWklPICp6LCBsdWFfUmVhZGVyIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKK0xVQUlfRlVOQyBzaXplX3QgbHVhWl9yZWFkIChaSU8qIHosIHZvaWQqIGIsIHNpemVfdCBuKTsJLyogcmVhZCBuZXh0IG4gYnl0ZXMgKi8KK0xVQUlfRlVOQyBpbnQgbHVhWl9sb29rYWhlYWQgKFpJTyAqeik7CisKKworCisvKiAtLS0tLS0tLS0gUHJpdmF0ZSBQYXJ0IC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgWmlvIHsKKyAgc2l6ZV90IG47CQkJLyogYnl0ZXMgc3RpbGwgdW5yZWFkICovCisgIGNvbnN0IGNoYXIgKnA7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLworICBsdWFfUmVhZGVyIHJlYWRlcjsKKyAgdm9pZCogZGF0YTsJCQkvKiBhZGRpdGlvbmFsIGRhdGEgKi8KKyAgbHVhX1N0YXRlICpMOwkJCS8qIEx1YSBzdGF0ZSAoZm9yIHJlYWRlcikgKi8KK307CisKKworTFVBSV9GVU5DIGludCBsdWFaX2ZpbGwgKFpJTyAqeik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3NyYy9wcmludC5jIGIvbHVhLTUuMS40L3NyYy9wcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDBjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvc3JjL3ByaW50LmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisqKiAkSWQ6IHByaW50LmMsdiAxLjU1YSAyMDA2LzA1LzMxIDEzOjMwOjA1IGxoZiBFeHAgJAorKiogcHJpbnQgYnl0ZWNvZGVzCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBsdWFjX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsb3Bjb2Rlcy5oIgorI2luY2x1ZGUgImx1bmR1bXAuaCIKKworI2RlZmluZSBQcmludEZ1bmN0aW9uCWx1YVVfcHJpbnQKKworI2RlZmluZSBTaXplb2YoeCkJKChpbnQpc2l6ZW9mKHgpKQorI2RlZmluZSBWT0lEKHApCQkoKGNvbnN0IHZvaWQqKShwKSkKKworc3RhdGljIHZvaWQgUHJpbnRTdHJpbmcoY29uc3QgVFN0cmluZyogdHMpCit7CisgY29uc3QgY2hhciogcz1nZXRzdHIodHMpOworIHNpemVfdCBpLG49dHMtPnRzdi5sZW47CisgcHV0Y2hhcignIicpOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIGludCBjPXNbaV07CisgIHN3aXRjaCAoYykKKyAgeworICAgY2FzZSAnIic6IHByaW50ZigiXFxcIiIpOyBicmVhazsKKyAgIGNhc2UgJ1xcJzogcHJpbnRmKCJcXFxcIik7IGJyZWFrOworICAgY2FzZSAnXGEnOiBwcmludGYoIlxcYSIpOyBicmVhazsKKyAgIGNhc2UgJ1xiJzogcHJpbnRmKCJcXGIiKTsgYnJlYWs7CisgICBjYXNlICdcZic6IHByaW50ZigiXFxmIik7IGJyZWFrOworICAgY2FzZSAnXG4nOiBwcmludGYoIlxcbiIpOyBicmVhazsKKyAgIGNhc2UgJ1xyJzogcHJpbnRmKCJcXHIiKTsgYnJlYWs7CisgICBjYXNlICdcdCc6IHByaW50ZigiXFx0Iik7IGJyZWFrOworICAgY2FzZSAnXHYnOiBwcmludGYoIlxcdiIpOyBicmVhazsKKyAgIGRlZmF1bHQ6CWlmIChpc3ByaW50KCh1bnNpZ25lZCBjaGFyKWMpKQorICAgCQkJcHV0Y2hhcihjKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJcXCUwM3UiLCh1bnNpZ25lZCBjaGFyKWMpOworICB9CisgfQorIHB1dGNoYXIoJyInKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRDb25zdGFudChjb25zdCBQcm90byogZiwgaW50IGkpCit7CisgY29uc3QgVFZhbHVlKiBvPSZmLT5rW2ldOworIHN3aXRjaCAodHR5cGUobykpCisgeworICBjYXNlIExVQV9UTklMOgorCXByaW50ZigibmlsIik7CisJYnJlYWs7CisgIGNhc2UgTFVBX1RCT09MRUFOOgorCXByaW50ZihidmFsdWUobykgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwlicmVhazsKKyAgY2FzZSBMVUFfVE5VTUJFUjoKKwlwcmludGYoTFVBX05VTUJFUl9GTVQsbnZhbHVlKG8pKTsKKwlicmVhazsKKyAgY2FzZSBMVUFfVFNUUklORzoKKwlQcmludFN0cmluZyhyYXd0c3ZhbHVlKG8pKTsKKwlicmVhazsKKyAgZGVmYXVsdDoJCQkJLyogY2Fubm90IGhhcHBlbiAqLworCXByaW50ZigiPyB0eXBlPSVkIix0dHlwZShvKSk7CisJYnJlYWs7CisgfQorfQorCitzdGF0aWMgdm9pZCBQcmludENvZGUoY29uc3QgUHJvdG8qIGYpCit7CisgY29uc3QgSW5zdHJ1Y3Rpb24qIGNvZGU9Zi0+Y29kZTsKKyBpbnQgcGMsbj1mLT5zaXplY29kZTsKKyBmb3IgKHBjPTA7IHBjPG47IHBjKyspCisgeworICBJbnN0cnVjdGlvbiBpPWNvZGVbcGNdOworICBPcENvZGUgbz1HRVRfT1BDT0RFKGkpOworICBpbnQgYT1HRVRBUkdfQShpKTsKKyAgaW50IGI9R0VUQVJHX0IoaSk7CisgIGludCBjPUdFVEFSR19DKGkpOworICBpbnQgYng9R0VUQVJHX0J4KGkpOworICBpbnQgc2J4PUdFVEFSR19zQngoaSk7CisgIGludCBsaW5lPWdldGxpbmUoZixwYyk7CisgIHByaW50ZigiXHQlZFx0IixwYysxKTsKKyAgaWYgKGxpbmU+MCkgcHJpbnRmKCJbJWRdXHQiLGxpbmUpOyBlbHNlIHByaW50ZigiWy1dXHQiKTsKKyAgcHJpbnRmKCIlLTlzXHQiLGx1YVBfb3BuYW1lc1tvXSk7CisgIHN3aXRjaCAoZ2V0T3BNb2RlKG8pKQorICB7CisgICBjYXNlIGlBQkM6CisgICAgcHJpbnRmKCIlZCIsYSk7CisgICAgaWYgKGdldEJNb2RlKG8pIT1PcEFyZ04pIHByaW50ZigiICVkIixJU0soYikgPyAoLTEtSU5ERVhLKGIpKSA6IGIpOworICAgIGlmIChnZXRDTW9kZShvKSE9T3BBcmdOKSBwcmludGYoIiAlZCIsSVNLKGMpID8gKC0xLUlOREVYSyhjKSkgOiBjKTsKKyAgICBicmVhazsKKyAgIGNhc2UgaUFCeDoKKyAgICBpZiAoZ2V0Qk1vZGUobyk9PU9wQXJnSykgcHJpbnRmKCIlZCAlZCIsYSwtMS1ieCk7IGVsc2UgcHJpbnRmKCIlZCAlZCIsYSxieCk7CisgICAgYnJlYWs7CisgICBjYXNlIGlBc0J4OgorICAgIGlmIChvPT1PUF9KTVApIHByaW50ZigiJWQiLHNieCk7IGVsc2UgcHJpbnRmKCIlZCAlZCIsYSxzYngpOworICAgIGJyZWFrOworICB9CisgIHN3aXRjaCAobykKKyAgeworICAgY2FzZSBPUF9MT0FESzoKKyAgICBwcmludGYoIlx0OyAiKTsgUHJpbnRDb25zdGFudChmLGJ4KTsKKyAgICBicmVhazsKKyAgIGNhc2UgT1BfR0VUVVBWQUw6CisgICBjYXNlIE9QX1NFVFVQVkFMOgorICAgIHByaW50ZigiXHQ7ICVzIiwgKGYtPnNpemV1cHZhbHVlcz4wKSA/IGdldHN0cihmLT51cHZhbHVlc1tiXSkgOiAiLSIpOworICAgIGJyZWFrOworICAgY2FzZSBPUF9HRVRHTE9CQUw6CisgICBjYXNlIE9QX1NFVEdMT0JBTDoKKyAgICBwcmludGYoIlx0OyAlcyIsc3ZhbHVlKCZmLT5rW2J4XSkpOworICAgIGJyZWFrOworICAgY2FzZSBPUF9HRVRUQUJMRToKKyAgIGNhc2UgT1BfU0VMRjoKKyAgICBpZiAoSVNLKGMpKSB7IHByaW50ZigiXHQ7ICIpOyBQcmludENvbnN0YW50KGYsSU5ERVhLKGMpKTsgfQorICAgIGJyZWFrOworICAgY2FzZSBPUF9TRVRUQUJMRToKKyAgIGNhc2UgT1BfQUREOgorICAgY2FzZSBPUF9TVUI6CisgICBjYXNlIE9QX01VTDoKKyAgIGNhc2UgT1BfRElWOgorICAgY2FzZSBPUF9QT1c6CisgICBjYXNlIE9QX0VROgorICAgY2FzZSBPUF9MVDoKKyAgIGNhc2UgT1BfTEU6CisgICAgaWYgKElTSyhiKSB8fCBJU0soYykpCisgICAgeworICAgICBwcmludGYoIlx0OyAiKTsKKyAgICAgaWYgKElTSyhiKSkgUHJpbnRDb25zdGFudChmLElOREVYSyhiKSk7IGVsc2UgcHJpbnRmKCItIik7CisgICAgIHByaW50ZigiICIpOworICAgICBpZiAoSVNLKGMpKSBQcmludENvbnN0YW50KGYsSU5ERVhLKGMpKTsgZWxzZSBwcmludGYoIi0iKTsKKyAgICB9CisgICAgYnJlYWs7CisgICBjYXNlIE9QX0pNUDoKKyAgIGNhc2UgT1BfRk9STE9PUDoKKyAgIGNhc2UgT1BfRk9SUFJFUDoKKyAgICBwcmludGYoIlx0OyB0byAlZCIsc2J4K3BjKzIpOworICAgIGJyZWFrOworICAgY2FzZSBPUF9DTE9TVVJFOgorICAgIHByaW50ZigiXHQ7ICVwIixWT0lEKGYtPnBbYnhdKSk7CisgICAgYnJlYWs7CisgICBjYXNlIE9QX1NFVExJU1Q6CisgICAgaWYgKGM9PTApIHByaW50ZigiXHQ7ICVkIiwoaW50KWNvZGVbKytwY10pOworICAgIGVsc2UgcHJpbnRmKCJcdDsgJWQiLGMpOworICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICBwcmludGYoIlxuIik7CisgfQorfQorCisjZGVmaW5lIFNTKHgpCSh4PT0xKT8iIjoicyIKKyNkZWZpbmUgUyh4KQl4LFNTKHgpCisKK3N0YXRpYyB2b2lkIFByaW50SGVhZGVyKGNvbnN0IFByb3RvKiBmKQoreworIGNvbnN0IGNoYXIqIHM9Z2V0c3RyKGYtPnNvdXJjZSk7CisgaWYgKCpzPT0nQCcgfHwgKnM9PSc9JykKKyAgcysrOworIGVsc2UgaWYgKCpzPT1MVUFfU0lHTkFUVVJFWzBdKQorICBzPSIoYnN0cmluZykiOworIGVsc2UKKyAgcz0iKHN0cmluZykiOworIHByaW50ZigiXG4lcyA8JXM6JWQsJWQ+ICglZCBpbnN0cnVjdGlvbiVzLCAlZCBieXRlcyBhdCAlcClcbiIsCisgCShmLT5saW5lZGVmaW5lZD09MCk/Im1haW4iOiJmdW5jdGlvbiIscywKKwlmLT5saW5lZGVmaW5lZCxmLT5sYXN0bGluZWRlZmluZWQsCisJUyhmLT5zaXplY29kZSksZi0+c2l6ZWNvZGUqU2l6ZW9mKEluc3RydWN0aW9uKSxWT0lEKGYpKTsKKyBwcmludGYoIiVkJXMgcGFyYW0lcywgJWQgc2xvdCVzLCAlZCB1cHZhbHVlJXMsICIsCisJZi0+bnVtcGFyYW1zLGYtPmlzX3ZhcmFyZz8iKyI6IiIsU1MoZi0+bnVtcGFyYW1zKSwKKwlTKGYtPm1heHN0YWNrc2l6ZSksUyhmLT5udXBzKSk7CisgcHJpbnRmKCIlZCBsb2NhbCVzLCAlZCBjb25zdGFudCVzLCAlZCBmdW5jdGlvbiVzXG4iLAorCVMoZi0+c2l6ZWxvY3ZhcnMpLFMoZi0+c2l6ZWspLFMoZi0+c2l6ZXApKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRDb25zdGFudHMoY29uc3QgUHJvdG8qIGYpCit7CisgaW50IGksbj1mLT5zaXplazsKKyBwcmludGYoImNvbnN0YW50cyAoJWQpIGZvciAlcDpcbiIsbixWT0lEKGYpKTsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBwcmludGYoIlx0JWRcdCIsaSsxKTsKKyAgUHJpbnRDb25zdGFudChmLGkpOworICBwcmludGYoIlxuIik7CisgfQorfQorCitzdGF0aWMgdm9pZCBQcmludExvY2Fscyhjb25zdCBQcm90byogZikKK3sKKyBpbnQgaSxuPWYtPnNpemVsb2N2YXJzOworIHByaW50ZigibG9jYWxzICglZCkgZm9yICVwOlxuIixuLFZPSUQoZikpOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIHByaW50ZigiXHQlZFx0JXNcdCVkXHQlZFxuIiwKKyAgaSxnZXRzdHIoZi0+bG9jdmFyc1tpXS52YXJuYW1lKSxmLT5sb2N2YXJzW2ldLnN0YXJ0cGMrMSxmLT5sb2N2YXJzW2ldLmVuZHBjKzEpOworIH0KK30KKworc3RhdGljIHZvaWQgUHJpbnRVcHZhbHVlcyhjb25zdCBQcm90byogZikKK3sKKyBpbnQgaSxuPWYtPnNpemV1cHZhbHVlczsKKyBwcmludGYoInVwdmFsdWVzICglZCkgZm9yICVwOlxuIixuLFZPSUQoZikpOworIGlmIChmLT51cHZhbHVlcz09TlVMTCkgcmV0dXJuOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIHByaW50ZigiXHQlZFx0JXNcbiIsaSxnZXRzdHIoZi0+dXB2YWx1ZXNbaV0pKTsKKyB9Cit9CisKK3ZvaWQgUHJpbnRGdW5jdGlvbihjb25zdCBQcm90byogZiwgaW50IGZ1bGwpCit7CisgaW50IGksbj1mLT5zaXplcDsKKyBQcmludEhlYWRlcihmKTsKKyBQcmludENvZGUoZik7CisgaWYgKGZ1bGwpCisgeworICBQcmludENvbnN0YW50cyhmKTsKKyAgUHJpbnRMb2NhbHMoZik7CisgIFByaW50VXB2YWx1ZXMoZik7CisgfQorIGZvciAoaT0wOyBpPG47IGkrKykgUHJpbnRGdW5jdGlvbihmLT5wW2ldLGZ1bGwpOworfQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3QvUkVBRE1FIGIvbHVhLTUuMS40L3Rlc3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjN2YzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC9SRUFETUUKQEAgLTAsMCArMSwyNiBAQAorVGhlc2UgYXJlIHNpbXBsZSB0ZXN0cyBmb3IgTHVhLiAgU29tZSBvZiB0aGVtIGNvbnRhaW4gdXNlZnVsIGNvZGUuCitUaGV5IGFyZSBtZWFudCB0byBiZSBydW4gdG8gbWFrZSBzdXJlIEx1YSBpcyBidWlsdCBjb3JyZWN0bHkgYW5kIGFsc28KK3RvIGJlIHJlYWQsIHRvIHNlZSBob3cgTHVhIHByb2dyYW1zIGxvb2suCisKK0hlcmUgaXMgYSBvbmUtbGluZSBzdW1tYXJ5IG9mIGVhY2ggcHJvZ3JhbToKKworICAgYmlzZWN0Lmx1YQkJYmlzZWN0aW9uIG1ldGhvZCBmb3Igc29sdmluZyBub24tbGluZWFyIGVxdWF0aW9ucworICAgY2YubHVhCQl0ZW1wZXJhdHVyZSBjb252ZXJzaW9uIHRhYmxlIChjZWxzaXVzIHRvIGZhcmVuaGVpdCkKKyAgIGVjaG8ubHVhICAgICAgICAgICAgIGVjaG8gY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgZW52Lmx1YSAgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIGF1dG9tYXRpYyBnbG9iYWwgdmFyaWFibGVzCisgICBmYWN0b3JpYWwubHVhCWZhY3RvcmlhbCB3aXRob3V0IHJlY3Vyc2lvbgorICAgZmliLmx1YQkJZmlib25hY2NpIGZ1bmN0aW9uIHdpdGggY2FjaGUKKyAgIGZpYmZvci5sdWEJCWZpYm9uYWNjaSBudW1iZXJzIHdpdGggY29yb3V0aW5lcyBhbmQgZ2VuZXJhdG9ycworICAgZ2xvYmFscy5sdWEJCXJlcG9ydCBnbG9iYWwgdmFyaWFibGUgdXNhZ2UKKyAgIGhlbGxvLmx1YQkJdGhlIGZpcnN0IHByb2dyYW0gaW4gZXZlcnkgbGFuZ3VhZ2UKKyAgIGxpZmUubHVhCQlDb253YXkncyBHYW1lIG9mIExpZmUKKyAgIGx1YWMubHVhCSAJYmFyZS1ib25lcyBsdWFjCisgICBwcmludGYubHVhCQlhbiBpbXBsZW1lbnRhdGlvbiBvZiBwcmludGYKKyAgIHJlYWRvbmx5Lmx1YQkJbWFrZSBnbG9iYWwgdmFyaWFibGVzIHJlYWRvbmx5CisgICBzaWV2ZS5sdWEJCXRoZSBzaWV2ZSBvZiBvZiBFcmF0b3N0aGVuZXMgcHJvZ3JhbW1lZCB3aXRoIGNvcm91dGluZXMKKyAgIHNvcnQubHVhCQl0d28gaW1wbGVtZW50YXRpb25zIG9mIGEgc29ydCBmdW5jdGlvbgorICAgdGFibGUubHVhCQltYWtlIHRhYmxlLCBncm91cGluZyBhbGwgZGF0YSBmb3IgdGhlIHNhbWUgaXRlbQorICAgdHJhY2UtY2FsbHMubHVhCXRyYWNlIGNhbGxzCisgICB0cmFjZS1nbG9iYWxzLmx1YQl0cmFjZSBhc3NpZ21lbnRzIHRvIGdsb2JhbCB2YXJpYWJsZXMKKyAgIHhkLmx1YQkJaGV4IGR1bXAKKwpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3QvYmlzZWN0Lmx1YSBiL2x1YS01LjEuNC90ZXN0L2Jpc2VjdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxZTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC90ZXN0L2Jpc2VjdC5sdWEKQEAgLTAsMCArMSwyNyBAQAorLS0gYmlzZWN0aW9uIG1ldGhvZCBmb3Igc29sdmluZyBub24tbGluZWFyIGVxdWF0aW9ucworCitkZWx0YT0xZS02CS0tIHRvbGVyYW5jZQorCitmdW5jdGlvbiBiaXNlY3QoZixhLGIsZmEsZmIpCisgbG9jYWwgYz0oYStiKS8yCisgaW8ud3JpdGUobiwiIGM9IixjLCIgYT0iLGEsIiBiPSIsYiwiXG4iKQorIGlmIGM9PWEgb3IgYz09YiBvciBtYXRoLmFicyhhLWIpPGRlbHRhIHRoZW4gcmV0dXJuIGMsYi1hIGVuZAorIG49bisxCisgbG9jYWwgZmM9ZihjKQorIGlmIGZhKmZjPDAgdGhlbiByZXR1cm4gYmlzZWN0KGYsYSxjLGZhLGZjKSBlbHNlIHJldHVybiBiaXNlY3QoZixjLGIsZmMsZmIpIGVuZAorZW5kCisKKy0tIGZpbmQgcm9vdCBvZiBmIGluIHRoZSBpbnZlcnZhbCBbYSxiXS4gbmVlZHMgZihhKSpmKGIpPDAKK2Z1bmN0aW9uIHNvbHZlKGYsYSxiKQorIG49MAorIGxvY2FsIHosZT1iaXNlY3QoZixhLGIsZihhKSxmKGIpKQorIGlvLndyaXRlKHN0cmluZy5mb3JtYXQoImFmdGVyICVkIHN0ZXBzLCByb290IGlzICUuMTdnIHdpdGggZXJyb3IgJS4xZSwgZj0lLjFlXG4iLG4seixlLGYoeikpKQorZW5kCisKKy0tIG91ciBmdW5jdGlvbgorZnVuY3Rpb24gZih4KQorIHJldHVybiB4KngqeC14LTEKK2VuZAorCistLSBmaW5kIHplcm8gaW4gWzEsMl0KK3NvbHZlKGYsMSwyKQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3QvY2YubHVhIGIvbHVhLTUuMS40L3Rlc3QvY2YubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZGE1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC9jZi5sdWEKQEAgLTAsMCArMSwxNiBAQAorLS0gdGVtcGVyYXR1cmUgY29udmVyc2lvbiB0YWJsZSAoY2Vsc2l1cyB0byBmYXJlbmhlaXQpCisKK2ZvciBjMD0tMjAsNTAtMSwxMCBkbworCWlvLndyaXRlKCJDICIpCisJZm9yIGM9YzAsYzArMTAtMSBkbworCQlpby53cml0ZShzdHJpbmcuZm9ybWF0KCIlMy4wZiAiLGMpKQorCWVuZAorCWlvLndyaXRlKCJcbiIpCisJCisJaW8ud3JpdGUoIkYgIikKKwlmb3IgYz1jMCxjMCsxMC0xIGRvCisJCWY9KDkvNSkqYyszMgorCQlpby53cml0ZShzdHJpbmcuZm9ybWF0KCIlMy4wZiAiLGYpKQorCWVuZAorCWlvLndyaXRlKCJcblxuIikKK2VuZApkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3QvZWNoby5sdWEgYi9sdWEtNS4xLjQvdGVzdC9lY2hvLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzEzNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3Rlc3QvZWNoby5sdWEKQEAgLTAsMCArMSw1IEBACistLSBlY2hvIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKworZm9yIGk9MCx0YWJsZS5nZXRuKGFyZykgZG8KKyBwcmludChpLGFyZ1tpXSkKK2VuZApkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3QvZW52Lmx1YSBiL2x1YS01LjEuNC90ZXN0L2Vudi5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2MmE1NwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC90ZXN0L2Vudi5sdWEKQEAgLTAsMCArMSw3IEBACistLSByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBpZiB0aGV5IHdlcmUgZ2xvYmFsIHZhcmlhYmxlcworCitsb2NhbCBmPWZ1bmN0aW9uICh0LGkpIHJldHVybiBvcy5nZXRlbnYoaSkgZW5kCitzZXRtZXRhdGFibGUoZ2V0ZmVudigpLHtfX2luZGV4PWZ9KQorCistLSBhbiBleGFtcGxlCitwcmludChhLFVTRVIsUEFUSCkKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC90ZXN0L2ZhY3RvcmlhbC5sdWEgYi9sdWEtNS4xLjQvdGVzdC9mYWN0b3JpYWwubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGNmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC9mYWN0b3JpYWwubHVhCkBAIC0wLDAgKzEsMzIgQEAKKy0tIGZ1bmN0aW9uIGNsb3N1cmVzIGFyZSBwb3dlcmZ1bAorCistLSB0cmFkaXRpb25hbCBmaXhlZC1wb2ludCBvcGVyYXRvciBmcm9tIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcKK1kgPSBmdW5jdGlvbiAoZykKKyAgICAgIGxvY2FsIGEgPSBmdW5jdGlvbiAoZikgcmV0dXJuIGYoZikgZW5kCisgICAgICByZXR1cm4gYShmdW5jdGlvbiAoZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGcoZnVuY3Rpb24gKHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsIGM9ZihmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyh4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKQorICAgICAgICAgICAgICAgZW5kKQorZW5kCisKKworLS0gZmFjdG9yaWFsIHdpdGhvdXQgcmVjdXJzaW9uCitGID0gZnVuY3Rpb24gKGYpCisgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pCisgICAgICAgICAgICAgICBpZiBuID09IDAgdGhlbiByZXR1cm4gMQorICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gbipmKG4tMSkgZW5kCisgICAgICAgICAgICAgZW5kCisgICAgZW5kCisKK2ZhY3RvcmlhbCA9IFkoRikgICAtLSBmYWN0b3JpYWwgaXMgdGhlIGZpeGVkIHBvaW50IG9mIEYKKworLS0gbm93IHRlc3QgaXQKK2Z1bmN0aW9uIHRlc3QoeCkKKwlpby53cml0ZSh4LCIhID0gIixmYWN0b3JpYWwoeCksIlxuIikKK2VuZAorCitmb3Igbj0wLDE2IGRvCisJdGVzdChuKQorZW5kCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvdGVzdC9maWIubHVhIGIvbHVhLTUuMS40L3Rlc3QvZmliLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E5MjFiCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3Rlc3QvZmliLmx1YQpAQCAtMCwwICsxLDQwIEBACistLSBmaWJvbmFjY2kgZnVuY3Rpb24gd2l0aCBjYWNoZQorCistLSB2ZXJ5IGluZWZmaWNpZW50IGZpYm9uYWNjaSBmdW5jdGlvbgorZnVuY3Rpb24gZmliKG4pCisJTj1OKzEKKwlpZiBuPDIgdGhlbgorCQlyZXR1cm4gbgorCWVsc2UKKwkJcmV0dXJuIGZpYihuLTEpK2ZpYihuLTIpCisJZW5kCitlbmQKKworLS0gYSBnZW5lcmFsLXB1cnBvc2UgdmFsdWUgY2FjaGUKK2Z1bmN0aW9uIGNhY2hlKGYpCisJbG9jYWwgYz17fQorCXJldHVybiBmdW5jdGlvbiAoeCkKKwkJbG9jYWwgeT1jW3hdCisJCWlmIG5vdCB5IHRoZW4KKwkJCXk9Zih4KQorCQkJY1t4XT15CisJCWVuZAorCQlyZXR1cm4geQorCWVuZAorZW5kCisKKy0tIHJ1biBhbmQgdGltZSBpdAorZnVuY3Rpb24gdGVzdChzLGYpCisJTj0wCisJbG9jYWwgYz1vcy5jbG9jaygpCisJbG9jYWwgdj1mKG4pCisJbG9jYWwgdD1vcy5jbG9jaygpLWMKKwlwcmludChzLG4sdix0LE4pCitlbmQKKworbj1hcmdbMV0gb3IgMjQJCS0tIGZvciBvdGhlciB2YWx1ZXMsIGRvIGx1YSBmaWIubHVhIFhYCituPXRvbnVtYmVyKG4pCitwcmludCgiIiwibiIsInZhbHVlIiwidGltZSIsImV2YWxzIikKK3Rlc3QoInBsYWluIixmaWIpCitmaWI9Y2FjaGUoZmliKQordGVzdCgiY2FjaGVkIixmaWIpCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvdGVzdC9maWJmb3IubHVhIGIvbHVhLTUuMS40L3Rlc3QvZmliZm9yLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJiYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3Rlc3QvZmliZm9yLmx1YQpAQCAtMCwwICsxLDEzIEBACistLSBleGFtcGxlIG9mIGZvciB3aXRoIGdlbmVyYXRvciBmdW5jdGlvbnMKKworZnVuY3Rpb24gZ2VuZXJhdGVmaWIgKG4pCisgIHJldHVybiBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoKQorICAgIGxvY2FsIGEsYiA9IDEsIDEKKyAgICB3aGlsZSBhIDw9IG4gZG8KKyAgICAgIGNvcm91dGluZS55aWVsZChhKQorICAgICAgYSwgYiA9IGIsIGErYgorICAgIGVuZAorICBlbmQpCitlbmQKKworZm9yIGkgaW4gZ2VuZXJhdGVmaWIoMTAwMCkgZG8gcHJpbnQoaSkgZW5kCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvdGVzdC9nbG9iYWxzLmx1YSBiL2x1YS01LjEuNC90ZXN0L2dsb2JhbHMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzIwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC9nbG9iYWxzLmx1YQpAQCAtMCwwICsxLDEzIEBACistLSByZWFkcyBsdWFjIGxpc3RpbmdzIGFuZCByZXBvcnRzIGdsb2JhbCB2YXJpYWJsZSB1c2FnZQorLS0gbGluZXMgd2hlcmUgYSBnbG9iYWwgaXMgd3JpdHRlbiB0byBhcmUgbWFya2VkIHdpdGggIioiCistLSB0eXBpY2FsIHVzYWdlOiBsdWFjIC1wIC1sIGZpbGUubHVhIHwgbHVhIGdsb2JhbHMubHVhIHwgc29ydCB8IGx1YSB0YWJsZS5sdWEKKword2hpbGUgMSBkbworIGxvY2FsIHM9aW8ucmVhZCgpCisgaWYgcz09bmlsIHRoZW4gYnJlYWsgZW5kCisgbG9jYWwgb2ssXyxsLG9wLGc9c3RyaW5nLmZpbmQocywiJVslLT8oJWQqKSVdJXMqKFtHU10pRVRHTE9CQUwuLTslcysoLiopJCIpCisgaWYgb2sgdGhlbgorICBpZiBvcD09IlMiIHRoZW4gb3A9IioiIGVsc2Ugb3A9IiIgZW5kCisgIGlvLndyaXRlKGcsIlx0IixsLG9wLCJcbiIpCisgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC90ZXN0L2hlbGxvLmx1YSBiL2x1YS01LjEuNC90ZXN0L2hlbGxvLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTI1NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3Rlc3QvaGVsbG8ubHVhCkBAIC0wLDAgKzEsMyBAQAorLS0gdGhlIGZpcnN0IHByb2dyYW0gaW4gZXZlcnkgbGFuZ3VhZ2UKKworaW8ud3JpdGUoIkhlbGxvIHdvcmxkLCBmcm9tICIsX1ZFUlNJT04sIiFcbiIpCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvdGVzdC9saWZlLmx1YSBiL2x1YS01LjEuNC90ZXN0L2xpZmUubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMWQ5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC9saWZlLmx1YQpAQCAtMCwwICsxLDExMSBAQAorLS0gbGlmZS5sdWEKKy0tIG9yaWdpbmFsIGJ5IERhdmUgQm9sbGluZ2VyIDxEQm9sbGluZ2VyQGNvbXB1c2VydmUuY29tPiBwb3N0ZWQgdG8gbHVhLWwKKy0tIG1vZGlmaWVkIHRvIHVzZSBBTlNJIHRlcm1pbmFsIGVzY2FwZSBzZXF1ZW5jZXMKKy0tIG1vZGlmaWVkIHRvIHVzZSBmb3IgaW5zdGVhZCBvZiB3aGlsZQorCitsb2NhbCB3cml0ZT1pby53cml0ZQorCitBTElWRT0ipSIJREVBRD0i/iIKK0FMSVZFPSJPIglERUFEPSItIgorCitmdW5jdGlvbiBkZWxheSgpIC0tIE5PVEU6IFNZU1RFTS1ERVBFTkRFTlQsIGFkanVzdCBhcyBuZWNlc3NhcnkKKyAgZm9yIGk9MSwxMDAwMCBkbyBlbmQKKyAgLS0gbG9jYWwgaT1vcy5jbG9jaygpKzEgd2hpbGUob3MuY2xvY2soKTxpKSBkbyBlbmQKK2VuZAorCitmdW5jdGlvbiBBUlJBWTJEKHcsaCkKKyAgbG9jYWwgdCA9IHt3PXcsaD1ofQorICBmb3IgeT0xLGggZG8KKyAgICB0W3ldID0ge30KKyAgICBmb3IgeD0xLHcgZG8KKyAgICAgIHRbeV1beF09MAorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIHQKK2VuZAorCitfQ0VMTFMgPSB7fQorCistLSBnaXZlIGJpcnRoIHRvIGEgInNoYXBlIiB3aXRoaW4gdGhlIGNlbGwgYXJyYXkKK2Z1bmN0aW9uIF9DRUxMUzpzcGF3bihzaGFwZSxsZWZ0LHRvcCkKKyAgZm9yIHk9MCxzaGFwZS5oLTEgZG8KKyAgICBmb3IgeD0wLHNoYXBlLnctMSBkbworICAgICAgc2VsZlt0b3AreV1bbGVmdCt4XSA9IHNoYXBlW3kqc2hhcGUudyt4KzFdCisgICAgZW5kCisgIGVuZAorZW5kCisKKy0tIHJ1biB0aGUgQ0EgYW5kIHByb2R1Y2UgdGhlIG5leHQgZ2VuZXJhdGlvbgorZnVuY3Rpb24gX0NFTExTOmV2b2x2ZShuZXh0KQorICBsb2NhbCB5bTEseSx5cDEseWk9c2VsZi5oLTEsc2VsZi5oLDEsc2VsZi5oCisgIHdoaWxlIHlpID4gMCBkbworICAgIGxvY2FsIHhtMSx4LHhwMSx4aT1zZWxmLnctMSxzZWxmLncsMSxzZWxmLncKKyAgICB3aGlsZSB4aSA+IDAgZG8KKyAgICAgIGxvY2FsIHN1bSA9IHNlbGZbeW0xXVt4bTFdICsgc2VsZlt5bTFdW3hdICsgc2VsZlt5bTFdW3hwMV0gKworICAgICAgICAgICAgICAgICAgc2VsZlt5XVt4bTFdICsgc2VsZlt5XVt4cDFdICsKKyAgICAgICAgICAgICAgICAgIHNlbGZbeXAxXVt4bTFdICsgc2VsZlt5cDFdW3hdICsgc2VsZlt5cDFdW3hwMV0KKyAgICAgIG5leHRbeV1beF0gPSAoKHN1bT09MikgYW5kIHNlbGZbeV1beF0pIG9yICgoc3VtPT0zKSBhbmQgMSkgb3IgMAorICAgICAgeG0xLHgseHAxLHhpID0geCx4cDEseHAxKzEseGktMQorICAgIGVuZAorICAgIHltMSx5LHlwMSx5aSA9IHkseXAxLHlwMSsxLHlpLTEKKyAgZW5kCitlbmQKKworLS0gb3V0cHV0IHRoZSBhcnJheSB0byBzY3JlZW4KK2Z1bmN0aW9uIF9DRUxMUzpkcmF3KCkKKyAgbG9jYWwgb3V0PSIiIC0tIGFjY3VtdWxhdGUgdG8gcmVkdWNlIGZsaWNrZXIKKyAgZm9yIHk9MSxzZWxmLmggZG8KKyAgIGZvciB4PTEsc2VsZi53IGRvCisgICAgICBvdXQ9b3V0Li4oKChzZWxmW3ldW3hdPjApIGFuZCBBTElWRSkgb3IgREVBRCkKKyAgICBlbmQKKyAgICBvdXQ9b3V0Li4iXG4iCisgIGVuZAorICB3cml0ZShvdXQpCitlbmQKKworLS0gY29uc3RydWN0b3IKK2Z1bmN0aW9uIENFTExTKHcsaCkKKyAgbG9jYWwgYyA9IEFSUkFZMkQodyxoKQorICBjLnNwYXduID0gX0NFTExTLnNwYXduCisgIGMuZXZvbHZlID0gX0NFTExTLmV2b2x2ZQorICBjLmRyYXcgPSBfQ0VMTFMuZHJhdworICByZXR1cm4gYworZW5kCisKKy0tCistLSBzaGFwZXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHNwYXduKCkgYWJvdmUKKy0tCitIRUFSVCA9IHsgMSwwLDEsMSwwLDEsMSwxLDE7IHc9MyxoPTMgfQorR0xJREVSID0geyAwLDAsMSwxLDAsMSwwLDEsMTsgdz0zLGg9MyB9CitFWFBMT0RFID0geyAwLDEsMCwxLDEsMSwxLDAsMSwwLDEsMDsgdz0zLGg9NCB9CitGSVNIID0geyAwLDEsMSwxLDEsMSwwLDAsMCwxLDAsMCwwLDAsMSwxLDAsMCwxLDA7IHc9NSxoPTQgfQorQlVUVEVSRkxZID0geyAxLDAsMCwwLDEsMCwxLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwwLDEsMSwwLDAsMCwxOyB3PTUsaD01IH0KKworLS0gdGhlIG1haW4gcm91dGluZQorZnVuY3Rpb24gTElGRSh3LGgpCisgIC0tIGNyZWF0ZSB0d28gYXJyYXlzCisgIGxvY2FsIHRoaXNnZW4gPSBDRUxMUyh3LGgpCisgIGxvY2FsIG5leHRnZW4gPSBDRUxMUyh3LGgpCisKKyAgLS0gY3JlYXRlIHNvbWUgbGlmZQorICAtLSBhYm91dCAxMDAwIGdlbmVyYXRpb25zIG9mIGZ1biwgdGhlbiBhIGdsaWRlciBzdGVhZHktc3RhdGUKKyAgdGhpc2dlbjpzcGF3bihHTElERVIsNSw0KQorICB0aGlzZ2VuOnNwYXduKEVYUExPREUsMjUsMTApCisgIHRoaXNnZW46c3Bhd24oRklTSCw0LDEyKQorCisgIC0tIHJ1biB1bnRpbCBicmVhaworICBsb2NhbCBnZW49MQorICB3cml0ZSgiXDAyN1sySiIpCS0tIEFOU0kgY2xlYXIgc2NyZWVuCisgIHdoaWxlIDEgZG8KKyAgICB0aGlzZ2VuOmV2b2x2ZShuZXh0Z2VuKQorICAgIHRoaXNnZW4sbmV4dGdlbiA9IG5leHRnZW4sdGhpc2dlbgorICAgIHdyaXRlKCJcMDI3W0giKQktLSBBTlNJIGhvbWUgY3Vyc29yCisgICAgdGhpc2dlbjpkcmF3KCkKKyAgICB3cml0ZSgiTGlmZSAtIGdlbmVyYXRpb24gIixnZW4sIlxuIikKKyAgICBnZW49Z2VuKzEKKyAgICBpZiBnZW4+MjAwMCB0aGVuIGJyZWFrIGVuZAorICAgIC0tZGVsYXkoKQkJLS0gbm8gZGVsYXkKKyAgZW5kCitlbmQKKworTElGRSg0MCwyMCkKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC90ZXN0L2x1YWMubHVhIGIvbHVhLTUuMS40L3Rlc3QvbHVhYy5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhMGE5NwotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC90ZXN0L2x1YWMubHVhCkBAIC0wLDAgKzEsNyBAQAorLS0gYmFyZS1ib25lcyBsdWFjIGluIEx1YQorLS0gdXNhZ2U6IGx1YSBsdWFjLmx1YSBmaWxlLmx1YQorCithc3NlcnQoYXJnWzFdfj1uaWwgYW5kIGFyZ1syXT09bmlsLCJ1c2FnZTogbHVhIGx1YWMubHVhIGZpbGUubHVhIikKK2Y9YXNzZXJ0KGlvLm9wZW4oImx1YWMub3V0Iiwid2IiKSkKK2Fzc2VydChmOndyaXRlKHN0cmluZy5kdW1wKGFzc2VydChsb2FkZmlsZShhcmdbMV0pKSkpKQorYXNzZXJ0KGY6Y2xvc2UoKSkKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC90ZXN0L3ByaW50Zi5sdWEgYi9sdWEtNS4xLjQvdGVzdC9wcmludGYubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzYzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC9wcmludGYubHVhCkBAIC0wLDAgKzEsNyBAQAorLS0gYW4gaW1wbGVtZW50YXRpb24gb2YgcHJpbnRmCisKK2Z1bmN0aW9uIHByaW50ZiguLi4pCisgaW8ud3JpdGUoc3RyaW5nLmZvcm1hdCguLi4pKQorZW5kCisKK3ByaW50ZigiSGVsbG8gJXMgZnJvbSAlcyBvbiAlc1xuIixvcy5nZXRlbnYiVVNFUiIgb3IgInRoZXJlIixfVkVSU0lPTixvcy5kYXRlKCkpCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvdGVzdC9yZWFkb25seS5sdWEgYi9sdWEtNS4xLjQvdGVzdC9yZWFkb25seS5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjMGI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2x1YS01LjEuNC90ZXN0L3JlYWRvbmx5Lmx1YQpAQCAtMCwwICsxLDEyIEBACistLSBtYWtlIGdsb2JhbCB2YXJpYWJsZXMgcmVhZG9ubHkKKworbG9jYWwgZj1mdW5jdGlvbiAodCxpKSBlcnJvcigiY2Fubm90IHJlZGVmaW5lIGdsb2JhbCB2YXJpYWJsZSBgIi4uaS4uIiciLDIpIGVuZAorbG9jYWwgZz17fQorbG9jYWwgRz1nZXRmZW52KCkKK3NldG1ldGF0YWJsZShnLHtfX2luZGV4PUcsX19uZXdpbmRleD1mfSkKK3NldGZlbnYoMSxnKQorCistLSBhbiBleGFtcGxlCityYXdzZXQoZywieCIsMykKK3g9MgoreT0xCS0tIGNhbm5vdCByZWRlZmluZSBgeScKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC90ZXN0L3NpZXZlLmx1YSBiL2x1YS01LjEuNC90ZXN0L3NpZXZlLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODcxYmIyCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3Rlc3Qvc2lldmUubHVhCkBAIC0wLDAgKzEsMjkgQEAKKy0tIHRoZSBzaWV2ZSBvZiBvZiBFcmF0b3N0aGVuZXMgcHJvZ3JhbW1lZCB3aXRoIGNvcm91dGluZXMKKy0tIHR5cGljYWwgdXNhZ2U6IGx1YSAtZSBOPTEwMDAgc2lldmUubHVhIHwgY29sdW1uCisKKy0tIGdlbmVyYXRlIGFsbCB0aGUgbnVtYmVycyBmcm9tIDIgdG8gbgorZnVuY3Rpb24gZ2VuIChuKQorICByZXR1cm4gY29yb3V0aW5lLndyYXAoZnVuY3Rpb24gKCkKKyAgICBmb3IgaT0yLG4gZG8gY29yb3V0aW5lLnlpZWxkKGkpIGVuZAorICBlbmQpCitlbmQKKworLS0gZmlsdGVyIHRoZSBudW1iZXJzIGdlbmVyYXRlZCBieSBgZycsIHJlbW92aW5nIG11bHRpcGxlcyBvZiBgcCcKK2Z1bmN0aW9uIGZpbHRlciAocCwgZykKKyAgcmV0dXJuIGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgd2hpbGUgMSBkbworICAgICAgbG9jYWwgbiA9IGcoKQorICAgICAgaWYgbiA9PSBuaWwgdGhlbiByZXR1cm4gZW5kCisgICAgICBpZiBtYXRoLm1vZChuLCBwKSB+PSAwIHRoZW4gY29yb3V0aW5lLnlpZWxkKG4pIGVuZAorICAgIGVuZAorICBlbmQpCitlbmQKKworTj1OIG9yIDEwMDAJCS0tIGZyb20gY29tbWFuZCBsaW5lCit4ID0gZ2VuKE4pCQktLSBnZW5lcmF0ZSBwcmltZXMgdXAgdG8gTgord2hpbGUgMSBkbworICBsb2NhbCBuID0geCgpCQktLSBwaWNrIGEgbnVtYmVyIHVudGlsIGRvbmUKKyAgaWYgbiA9PSBuaWwgdGhlbiBicmVhayBlbmQKKyAgcHJpbnQobikJCS0tIG11c3QgYmUgYSBwcmltZSBudW1iZXIKKyAgeCA9IGZpbHRlcihuLCB4KQktLSBub3cgcmVtb3ZlIGl0cyBtdWx0aXBsZXMKK2VuZApkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3Qvc29ydC5sdWEgYi9sdWEtNS4xLjQvdGVzdC9zb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNiMTVmCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3Rlc3Qvc29ydC5sdWEKQEAgLTAsMCArMSw2NiBAQAorLS0gdHdvIGltcGxlbWVudGF0aW9ucyBvZiBhIHNvcnQgZnVuY3Rpb24KKy0tIHRoaXMgaXMgYW4gZXhhbXBsZSBvbmx5LiBMdWEgaGFzIG5vdyBhIGJ1aWx0LWluIGZ1bmN0aW9uICJzb3J0IgorCistLSBleHRyYWN0ZWQgZnJvbSBQcm9ncmFtbWluZyBQZWFybHMsIHBhZ2UgMTEwCitmdW5jdGlvbiBxc29ydCh4LGwsdSxmKQorIGlmIGw8dSB0aGVuCisgIGxvY2FsIG09bWF0aC5yYW5kb20odS0obC0xKSkrbC0xCS0tIGNob29zZSBhIHJhbmRvbSBwaXZvdCBpbiByYW5nZSBsLi51CisgIHhbbF0seFttXT14W21dLHhbbF0JCQktLSBzd2FwIHBpdm90IHRvIGZpcnN0IHBvc2l0aW9uCisgIGxvY2FsIHQ9eFtsXQkJCQktLSBwaXZvdCB2YWx1ZQorICBtPWwKKyAgbG9jYWwgaT1sKzEKKyAgd2hpbGUgaTw9dSBkbworICAgIC0tIGludmFyaWFudDogeFtsKzEuLm1dIDwgdCA8PSB4W20rMS4uaS0xXQorICAgIGlmIGYoeFtpXSx0KSB0aGVuCisgICAgICBtPW0rMQorICAgICAgeFttXSx4W2ldPXhbaV0seFttXQkJLS0gc3dhcCB4W2ldIGFuZCB4W21dCisgICAgZW5kCisgICAgaT1pKzEKKyAgZW5kCisgIHhbbF0seFttXT14W21dLHhbbF0JCQktLSBzd2FwIHBpdm90IHRvIGEgdmFsaWQgcGxhY2UKKyAgLS0geFtsKzEuLm0tMV0gPCB4W21dIDw9IHhbbSsxLi51XQorICBxc29ydCh4LGwsbS0xLGYpCisgIHFzb3J0KHgsbSsxLHUsZikKKyBlbmQKK2VuZAorCitmdW5jdGlvbiBzZWxlY3Rpb25zb3J0KHgsbixmKQorIGxvY2FsIGk9MQorIHdoaWxlIGk8PW4gZG8KKyAgbG9jYWwgbSxqPWksaSsxCisgIHdoaWxlIGo8PW4gZG8KKyAgIGlmIGYoeFtqXSx4W21dKSB0aGVuIG09aiBlbmQKKyAgIGo9aisxCisgIGVuZAorIHhbaV0seFttXT14W21dLHhbaV0JCQktLSBzd2FwIHhbaV0gYW5kIHhbbV0KKyBpPWkrMQorIGVuZAorZW5kCisKK2Z1bmN0aW9uIHNob3cobSx4KQorIGlvLndyaXRlKG0sIlxuXHQiKQorIGxvY2FsIGk9MQorIHdoaWxlIHhbaV0gZG8KKyAgaW8ud3JpdGUoeFtpXSkKKyAgaT1pKzEKKyAgaWYgeFtpXSB0aGVuIGlvLndyaXRlKCIsIikgZW5kCisgZW5kCisgaW8ud3JpdGUoIlxuIikKK2VuZAorCitmdW5jdGlvbiB0ZXN0c29ydHMoeCkKKyBsb2NhbCBuPTEKKyB3aGlsZSB4W25dIGRvIG49bisxIGVuZDsgbj1uLTEJCS0tIGNvdW50IGVsZW1lbnRzCisgc2hvdygib3JpZ2luYWwiLHgpCisgcXNvcnQoeCwxLG4sZnVuY3Rpb24gKHgseSkgcmV0dXJuIHg8eSBlbmQpCisgc2hvdygiYWZ0ZXIgcXVpY2tzb3J0Iix4KQorIHNlbGVjdGlvbnNvcnQoeCxuLGZ1bmN0aW9uICh4LHkpIHJldHVybiB4PnkgZW5kKQorIHNob3coImFmdGVyIHJldmVyc2Ugc2VsZWN0aW9uIHNvcnQiLHgpCisgcXNvcnQoeCwxLG4sZnVuY3Rpb24gKHgseSkgcmV0dXJuIHg8eSBlbmQpCisgc2hvdygiYWZ0ZXIgcXVpY2tzb3J0IGFnYWluIix4KQorZW5kCisKKy0tIGFycmF5IHRvIGJlIHNvcnRlZAoreD17IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJ9CisKK3Rlc3Rzb3J0cyh4KQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3QvdGFibGUubHVhIGIvbHVhLTUuMS40L3Rlc3QvdGFibGUubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTA4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC90YWJsZS5sdWEKQEAgLTAsMCArMSwxMiBAQAorLS0gbWFrZSB0YWJsZSwgZ3JvdXBpbmcgYWxsIGRhdGEgZm9yIHRoZSBzYW1lIGl0ZW0KKy0tIGlucHV0IGlzIDIgY29sdW1ucyAoaXRlbSwgZGF0YSkKKworbG9jYWwgQQord2hpbGUgMSBkbworIGxvY2FsIGw9aW8ucmVhZCgpCisgaWYgbD09bmlsIHRoZW4gYnJlYWsgZW5kCisgbG9jYWwgXyxfLGEsYj1zdHJpbmcuZmluZChsLCciPyhbXyV3XSspIj8lcyooLiopJCcpCisgaWYgYX49QSB0aGVuIEE9YSBpby53cml0ZSgiXG4iLGEsIjoiKSBlbmQKKyBpby53cml0ZSgiICIsYikKK2VuZAoraW8ud3JpdGUoIlxuIikKZGlmZiAtLWdpdCBhL2x1YS01LjEuNC90ZXN0L3RyYWNlLWNhbGxzLmx1YSBiL2x1YS01LjEuNC90ZXN0L3RyYWNlLWNhbGxzLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdhN2IzCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLTUuMS40L3Rlc3QvdHJhY2UtY2FsbHMubHVhCkBAIC0wLDAgKzEsMzIgQEAKKy0tIHRyYWNlIGNhbGxzCistLSBleGFtcGxlOiBsdWEgLWx0cmFjZS1jYWxscyBiaXNlY3QubHVhCisKK2xvY2FsIGxldmVsPTAKKworbG9jYWwgZnVuY3Rpb24gaG9vayhldmVudCkKKyBsb2NhbCB0PWRlYnVnLmdldGluZm8oMykKKyBpby53cml0ZShsZXZlbCwiID4+PiAiLHN0cmluZy5yZXAoIiAiLGxldmVsKSkKKyBpZiB0fj1uaWwgYW5kIHQuY3VycmVudGxpbmU+PTAgdGhlbiBpby53cml0ZSh0LnNob3J0X3NyYywiOiIsdC5jdXJyZW50bGluZSwiICIpIGVuZAorIHQ9ZGVidWcuZ2V0aW5mbygyKQorIGlmIGV2ZW50PT0iY2FsbCIgdGhlbgorICBsZXZlbD1sZXZlbCsxCisgZWxzZQorICBsZXZlbD1sZXZlbC0xIGlmIGxldmVsPDAgdGhlbiBsZXZlbD0wIGVuZAorIGVuZAorIGlmIHQud2hhdD09Im1haW4iIHRoZW4KKyAgaWYgZXZlbnQ9PSJjYWxsIiB0aGVuCisgICBpby53cml0ZSgiYmVnaW4gIix0LnNob3J0X3NyYykKKyAgZWxzZQorICAgaW8ud3JpdGUoImVuZCAiLHQuc2hvcnRfc3JjKQorICBlbmQKKyBlbHNlaWYgdC53aGF0PT0iTHVhIiB0aGVuCistLSB0YWJsZS5mb3JlYWNoKHQscHJpbnQpCisgIGlvLndyaXRlKGV2ZW50LCIgIix0Lm5hbWUgb3IgIihMdWEpIiwiIDwiLHQubGluZWRlZmluZWQsIjoiLHQuc2hvcnRfc3JjLCI+IikKKyBlbHNlCisgaW8ud3JpdGUoZXZlbnQsIiAiLHQubmFtZSBvciAiKEMpIiwiIFsiLHQud2hhdCwiXSAiKQorIGVuZAorIGlvLndyaXRlKCJcbiIpCitlbmQKKworZGVidWcuc2V0aG9vayhob29rLCJjciIpCitsZXZlbD0wCmRpZmYgLS1naXQgYS9sdWEtNS4xLjQvdGVzdC90cmFjZS1nbG9iYWxzLmx1YSBiL2x1YS01LjEuNC90ZXN0L3RyYWNlLWdsb2JhbHMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWU2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC90cmFjZS1nbG9iYWxzLmx1YQpAQCAtMCwwICsxLDM4IEBACistLSB0cmFjZSBhc3NpZ21lbnRzIHRvIGdsb2JhbCB2YXJpYWJsZXMKKworZG8KKyAtLSBhIHRvc3RyaW5nIHRoYXQgcXVvdGVzIHN0cmluZ3MuIG5vdGUgdGhlIHVzZSBvZiB0aGUgb3JpZ2luYWwgdG9zdHJpbmcuCisgbG9jYWwgX3Rvc3RyaW5nPXRvc3RyaW5nCisgbG9jYWwgdG9zdHJpbmc9ZnVuY3Rpb24oYSkKKyAgaWYgdHlwZShhKT09InN0cmluZyIgdGhlbgorICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoIiVxIixhKQorICBlbHNlCisgICByZXR1cm4gX3Rvc3RyaW5nKGEpCisgIGVuZAorIGVuZAorCisgbG9jYWwgbG9nPWZ1bmN0aW9uIChuYW1lLG9sZCxuZXcpCisgIGxvY2FsIHQ9ZGVidWcuZ2V0aW5mbygzLCJTbCIpCisgIGxvY2FsIGxpbmU9dC5jdXJyZW50bGluZQorICBpby53cml0ZSh0LnNob3J0X3NyYykKKyAgaWYgbGluZT49MCB0aGVuIGlvLndyaXRlKCI6IixsaW5lKSBlbmQKKyAgaW8ud3JpdGUoIjogIixuYW1lLCIgaXMgbm93ICIsdG9zdHJpbmcobmV3KSwiICh3YXMgIix0b3N0cmluZyhvbGQpLCIpIiwiXG4iKQorIGVuZAorCisgbG9jYWwgZz17fQorIGxvY2FsIHNldD1mdW5jdGlvbiAodCxuYW1lLHZhbHVlKQorICBsb2cobmFtZSxnW25hbWVdLHZhbHVlKQorICBnW25hbWVdPXZhbHVlCisgZW5kCisgc2V0bWV0YXRhYmxlKGdldGZlbnYoKSx7X19pbmRleD1nLF9fbmV3aW5kZXg9c2V0fSkKK2VuZAorCistLSBhbiBleGFtcGxlCisKK2E9MQorYj0yCithPTEwCitiPTIwCitiPW5pbAorYj0yMDAKK3ByaW50KGEsYixjKQpkaWZmIC0tZ2l0IGEvbHVhLTUuMS40L3Rlc3QveGQubHVhIGIvbHVhLTUuMS40L3Rlc3QveGQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzNlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEtNS4xLjQvdGVzdC94ZC5sdWEKQEAgLTAsMCArMSwxNCBAQAorLS0gaGV4IGR1bXAKKy0tIHVzYWdlOiBsdWEgeGQubHVhIDwgZmlsZQorCitsb2NhbCBvZmZzZXQ9MAord2hpbGUgdHJ1ZSBkbworIGxvY2FsIHM9aW8ucmVhZCgxNikKKyBpZiBzPT1uaWwgdGhlbiByZXR1cm4gZW5kCisgaW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgiJTA4WCAgIixvZmZzZXQpKQorIHN0cmluZy5nc3ViKHMsIiguKSIsCisJZnVuY3Rpb24gKGMpIGlvLndyaXRlKHN0cmluZy5mb3JtYXQoIiUwMlggIixzdHJpbmcuYnl0ZShjKSkpIGVuZCkKKyBpby53cml0ZShzdHJpbmcucmVwKCIgIiwzKigxNi1zdHJpbmcubGVuKHMpKSkpCisgaW8ud3JpdGUoIiAiLHN0cmluZy5nc3ViKHMsIiVjIiwiLiIpLCJcbiIpIAorIG9mZnNldD1vZmZzZXQrMTYKK2VuZApkaWZmIC0tZ2l0IGEvbHVhLnBhdGNoZXMvbHVhLTUwLmRlc2NyaXB0aW9uIGIvbHVhLnBhdGNoZXMvbHVhLTUwLmRlc2NyaXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTY0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEucGF0Y2hlcy9sdWEtNTAuZGVzY3JpcHRpb24KQEAgLTAsMCArMSBAQAorTWFrZSBMVUFfUk9PVD0vdXNyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgL3Vzci9sb2NhbApkaWZmIC0tZ2l0IGEvbHVhLnBhdGNoZXMvbHVhLTUwLnBhdGNoIGIvbHVhLnBhdGNoZXMvbHVhLTUwLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODNiODcKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEucGF0Y2hlcy9sdWEtNTAucGF0Y2gKQEAgLTAsMCArMSwxMiBAQAorZGlmZiAtYXJ1TiBsdWEtNS4xLjQvc3JjL2x1YWNvbmYuaCBsdWEtNS4xLjQuTi9zcmMvbHVhY29uZi5oCistLS0gbHVhLTUuMS40L3NyYy9sdWFjb25mLmgJMjAwOC0wMi0xMSAwODoyNTowOC4wMDAwMDAwMDAgLTA4MDAKKysrKyBsdWEtNS4xLjQuTi9zcmMvbHVhY29uZi5oCTIwMTEtMDMtMDkgMTA6NTY6NDcuMDA3OTYwMzkwIC0wODAwCitAQCAtOTQsNyArOTQsNyBAQAorIAkiLlxcPy5kbGw7IiAgTFVBX0NESVIiPy5kbGw7IiBMVUFfQ0RJUiJsb2FkYWxsLmRsbCIKKyAKKyAjZWxzZQorLSNkZWZpbmUgTFVBX1JPT1QJIi91c3IvbG9jYWwvIgorKyNkZWZpbmUgTFVBX1JPT1QJIi91c3IvIgorICNkZWZpbmUgTFVBX0xESVIJTFVBX1JPT1QgInNoYXJlL2x1YS81LjEvIgorICNkZWZpbmUgTFVBX0NESVIJTFVBX1JPT1QgImxpYi9sdWEvNS4xLyIKKyAjZGVmaW5lIExVQV9QQVRIX0RFRkFVTFQgIFwKZGlmZiAtLWdpdCBhL2x1YS50YXIuZ3ogYi9sdWEudGFyLmd6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOWY1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEudGFyLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2x1YS51cmwgYi9sdWEudXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjU0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWEudXJsCkBAIC0wLDAgKzEgQEAKK2h0dHA6Ly93d3cubHVhLm9yZy9mdHAvbHVhLTUuMS40LnRhci5negpkaWZmIC0tZ2l0IGEvbHVhLnZlcnNpb24gYi9sdWEudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU5ZTYxCi0tLSAvZGV2L251bGwKKysrIGIvbHVhLnZlcnNpb24KQEAgLTAsMCArMSBAQAorNS4xLjQK