ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjNGVjNgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTE3IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgIFRoaXMgTWFrZWZpbGUgaXMgdXNlZCB0byBidWlsZCBsdWFzb2NrZXQsIGEgZnVsbHkgZmxlZGdlZCB5ZXQgbGlnaHR3ZWlnaHQgc29ja2V0IGxpYnJhcnkgZm9yIGx1YQorIworCitCdWlsZENvbmZpZ1NwZWNpYWxpemVkCTo9IE5vCitCdWlsZFByb2R1Y3RTcGVjaWFsaXplZAk6PSBObworCitpbmNsdWRlIHByZS5tYWsKKworUGFja2FnZU5hbWUJCTo9IGx1YXNvY2tldAorCitQYWNrYWdlRXh0ZW5zaW9uCTo9IHRhci5negorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VBcmNoaXZlCQk6PSAkKFBhY2thZ2VOYW1lKS4kKFBhY2thZ2VFeHRlbnNpb24pCitQYWNrYWdlU291cmNlRGlyCTo9ICQoUGFja2FnZU5hbWUpJChQYWNrYWdlU2VwYXJhdG9yKSQoUGFja2FnZVZlcnNpb24pCisKK1BhY2thZ2VCdWlsZE1ha2VmaWxlCT0gJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxtYWtlZmlsZSkKKworTHVhRGlyCQkJOj0gc3cvdHBzL2x1YQorTHVhSW5jRGlycwkJOj0gJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsJChMdWFEaXIpLGluY2x1ZGUpCitMdWFMaWJEaXIJCTo9ICQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCQoTHVhRGlyKSxsaWIpCisKK0NsZWFuUGF0aHMJCSs9ICQoUGFja2FnZUxpY2Vuc2VGaWxlKQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvTElDRU5TRTogc291cmNlCisKKyQoUGFja2FnZUxpY2Vuc2VGaWxlKTogJChQYWNrYWdlU291cmNlRGlyKS9MSUNFTlNFCisJJChjb3B5LXJlc3VsdCkKKworIyBFeHRyYWN0IHRoZSBzb3VyY2UgZnJvbSB0aGUgYXJjaGl2ZSBhbmQgYXBwbHkgcGF0Y2hlcywgaWYgYW55LgorCiskKFBhY2thZ2VTb3VyY2VEaXIpOiAkKFBhY2thZ2VBcmNoaXZlKSAkKFBhY2thZ2VQYXRjaFBhdGhzKQorCSQoZXhwYW5kLWFuZC1wYXRjaC1wYWNrYWdlKQorCisjIFByZXBhcmUgdGhlIHNvdXJjZXMuCisKKy5QSE9OWTogc291cmNlCitzb3VyY2U6IHwgJHtQYWNrYWdlU291cmNlRGlyfQorCisjIFBhdGNoIHRoZSBzb3VyY2VzLCBpZiBuZWNlc3NhcnkuCisKKy5QSE9OWTogcGF0Y2gKK3BhdGNoOiBzb3VyY2UKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBidWlsZCBtYWtlZmlsZS4KKworJChQYWNrYWdlQnVpbGRNYWtlZmlsZSk6IHwgJChQYWNrYWdlU291cmNlRGlyKSAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoY2FsbCBjcmVhdGUtbGlua3MsJChDVVJESVIpLyQoUGFja2FnZVNvdXJjZURpciksJChCdWlsZERpcmVjdG9yeSkpCisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCisuUEhPTlk6IGNvbmZpZ3VyZQorY29uZmlndXJlOiBwYXRjaCB8ICR7UGFja2FnZUJ1aWxkTWFrZWZpbGV9CisKKyMgQnVpbGQgdGhlIHNvdXJjZS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworaWZlcSAoJChUYXJnZXRPUyksZGFyd2luKQorTERGTEFHUz0iLWJ1bmRsZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwIgorZWxzZQorTERGTEFHUz0iLU8gLXNoYXJlZCAtZnBpYyIKK2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GRUFUVVJFX1NJTVVMQVRPUgorQ0ZMQUdTKz0gLWZQSUMKKyNlbmRpZgorCisuUEhPTlk6IGJ1aWxkCitidWlsZDogY29uZmlndXJlIHwgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoQnVpbGREaXJlY3RvcnkpIFwKKwlDQz0iJChDQykiIFwKKwlMRD0iJChMRCkiIFwKKwlMREZMQUdTPSQoTERGTEFHUykgXAorCUNGTEFHUz0iJHtDRkxBR1N9ICQoYWRkcHJlZml4IC1JLCAkKEx1YUluY0RpcnMpKSIgXAorCUlOU1RBTEw9IiQoSU5TVEFMTCkgJChJTlNUQUxMRkxBR1MpIiBcCisJUkFOTElCPSQoUkFOTElCKSBcCisJU1RSSVA9JChTVFJJUCkgXAorCVBMQVQ9cG9zaXggXAorCWFsbAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwlJTlNUQUxMX1RPUF9TSEFSRT0kKFJlc3VsdERpcmVjdG9yeSkvc2hhcmUvbHVhLzUuMSBcCisJSU5TVEFMTF9UT1BfTElCPSQoUmVzdWx0RGlyZWN0b3J5KS9saWIvbHVhLzUuMSBcCisJaW5zdGFsbAorCitjbGVhbjoKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFBhY2thZ2VTb3VyY2VEaXIpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFJlc3VsdERpcmVjdG9yeSkKKworaW5jbHVkZSBwb3N0Lm1hawpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL0xJQ0VOU0UgYi9sdWFzb2NrZXQtMi4wLjIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzNjZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL0xJQ0VOU0UKQEAgLTAsMCArMSwyMCBAQAorTHVhU29ja2V0IDIuMC4yIGxpY2Vuc2UKK0NvcHlyaWdodCCpIDIwMDQtMjAwNyBEaWVnbyBOZWhhYgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCitTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKK0ZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKK0RFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9ORVcgYi9sdWFzb2NrZXQtMi4wLjIvTkVXCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTFjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvTkVXCkBAIC0wLDAgKzEsMTQgQEAKK1doYXQncyBOZXcKKworVGhpcyBpcyBqdXN0IGEgYnVnLWZpeC91cGRhdGUgcmVsZWFzZS4KKworICAgICogSW1wcm92ZWQ6IGh0dHAucmVxdWVzdCgpIG5vdyBzdXBwb3J0cyBkZXByZWNhdGVkIEhUVFAvMC45CisgICAgICBzZXJ2ZXJzIChGbG9yaWFuIEJlcmdlcikKKyAgICAqIEZpeGVkOiBjb3VsZCByZXR1cm4gInRpbWVkb3V0IiBpbnN0ZWFkIG9mICJ0aW1lb3V0IiAoTGVvIExlbykKKyAgICAqIEZpeGVkOiBjcmFzaCB3aGVuIHJlYWRpbmcgJyphJyBvbiBjbG9zZWQgc29ja2V0IChQYXVsIER1Y2tsaW4pOworICAgICogRml4ZWQ6IHJldHVybiB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgd2hlbiByZWFkaW5nIGZyb20gY2xvc2VkIHNvY2tldHM7CisgICAgKiBGaXhlZDogY2FzZSBzZW5zaXRpdml0eSBpbiBoZWFkZXJzIG9mIG11bHRpcGFydCBtZXNzYWdlcyBpbiAKKyAgICAgIHNtdHAubWVzc2FnZSgpIChHcmFoYW0gSGVuc3RyaWRnZSk7CisgICAgKiBGaXhlZCBhIGNvdXBsZSBpbnN0YW5jZXMgb2YgZXJyb3IoKSBiZWluZyBjYWxsZWQgaW5zdGVhZCBvZiBiYXNlLmVycm9yKCkuICAgICAgIFRoZXNlIHdvdWxkIGNhdXNlIGFuIGVycm9yIHdoZW4gYW4gZXJyb3Igd2FzIHJlcG9ydGVkLiA6KSAgKEtldG1hciBEYXJrKTsKKyAgICAqIEZpeGVkOiB0ZXN0IHNjcmlwdCBub3cgdXNlcyBwYWlycygpIGl0ZXJhdG9yIGluc3RlYWQgb2YgdGhlIG9sZCAKKyAgICAgIEx1YSBzeW50YXggKFJvYmVydCBEb2RpZXIpLgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL1JFQURNRSBiL2x1YXNvY2tldC0yLjAuMi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NWY4OAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9SRUFETUUKQEAgLTAsMCArMSw2IEBACitUaGlzIGlzIHRoZSBMdWFTb2NrZXQgMi4wLjEuIEl0IGhhcyBiZWVuIHRlc3RlZCBvbiBXaW5YUCwgTWFjIE9TIFgsCithbmQgTGludXguICBQbGVhc2UgdXNlIHRoZSBMdWEgbWFpbGluZyBsaXN0IHRvIHJlcG9ydCBhbnkgYnVncyAKKyhvciAiZmVhdHVyZXMiKSB5b3UgZW5jb3VudGVyLiAKKworSGF2ZSBmdW4sCitEaWVnbyBOZWhhYi4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9jb25maWcgYi9sdWFzb2NrZXQtMi4wLjIvY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTU4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvY29uZmlnCkBAIC0wLDAgKzEsNjAgQEAKKyMtLS0tLS0KKyMgTHVhU29ja2V0IG1ha2VmaWxlIGNvbmZpZ3VyYXRpb24KKyMKKworIy0tLS0tLQorIyBPdXRwdXQgZmlsZSBuYW1lcworIworRVhUPXNvCitTT0NLRVRfVj0yLjAuMgorTUlNRV9WPTEuMC4yCitTT0NLRVRfU089c29ja2V0LiQoRVhUKS4kKFNPQ0tFVF9WKSAKK01JTUVfU089bWltZS4kKEVYVCkuJChNSU1FX1YpCitVTklYX1NPPXVuaXguJChFWFQpCisKKyMtLS0tLS0KKyMgTHVhIGluY2x1ZGVzIGFuZCBsaWJyYXJpZXMKKyMKKyNMVUFJTkM9LUkvdXNyL2xvY2FsL2luY2x1ZGUvbHVhNTAKKyNMVUFJTkM9LUkvdXNyL2xvY2FsL2luY2x1ZGUvbHVhNS4xCisjTFVBSU5DPS1JbHVhLTUuMS4xL3NyYworCisjLS0tLS0tCisjIENvbXBhdC01LjEgZGlyZWN0b3J5CisjCisjQ09NUEFUPWNvbXBhdC01LjFyNQorCisjLS0tLS0tCisjIFRvcCBvZiB5b3VyIEx1YSBpbnN0YWxsYXRpb24KKyMgUmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBpbnNpZGUgdGhlIHNyYyB0cmVlCisjCisjSU5TVEFMTF9UT1BfU0hBUkU9L3Vzci9sb2NhbC9zaGFyZS9sdWEvNS4wCisjSU5TVEFMTF9UT1BfTElCPS91c3IvbG9jYWwvbGliL2x1YS81LjAKK0lOU1RBTExfVE9QX1NIQVJFPS91c3IvbG9jYWwvc2hhcmUvbHVhLzUuMQorSU5TVEFMTF9UT1BfTElCPS91c3IvbG9jYWwvbGliL2x1YS81LjEKKworSU5TVEFMTF9EQVRBPWNwCitJTlNUQUxMX0VYRUM9Y3AKKworIy0tLS0tLQorIyBDb21waWxlciBhbmQgbGlua2VyIHNldHRpbmdzCisjIGZvciBNYWMgT1MgWAorIworI0NDPWdjYworI0RFRj0gLURMVUFTT0NLRVRfREVCVUcgLURVTklYX0hBU19TVU5fTEVOCisjQ0ZMQUdTPSAkKExVQUlOQykgLUkkKENPTVBBVCkgJChERUYpIC1wZWRhbnRpYyAtV2FsbCAtTzIgLWZuby1jb21tb24KKyNMREZMQUdTPS1idW5kbGUgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cAorI0xEPWV4cG9ydCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9IjEwLjMiOyBnY2MKKworIy0tLS0tLQorIyBDb21waWxlciBhbmQgbGlua2VyIHNldHRpbmdzCisjIGZvciBMaW51eAorQ0M9Z2NjCitERUY9LURMVUFTT0NLRVRfREVCVUcgCitDRkxBR1M9ICQoTFVBSU5DKSAkKERFRikgLXBlZGFudGljIC1XYWxsIC1PMiAtZnBpYworTERGTEFHUz0tTyAtc2hhcmVkIC1mcGljCitMRD1nY2MgCisKKyMtLS0tLS0KKyMgRW5kIG9mIG1ha2VmaWxlIGNvbmZpZ3VyYXRpb24KKyMKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2MvZG5zLmh0bWwgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL2Rucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzNiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL2Rucy5odG1sCkBAIC0wLDAgKzEsMTMyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIAorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJMdWFTb2NrZXQ6IEROUyBzdXBwb3J0Ij4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJMdWEsIEx1YVNvY2tldCwgRE5TLCBOZXR3b3JrLCBMaWJyYXJ5LCBTdXBwb3J0Ij4KKzx0aXRsZT5MdWFTb2NrZXQ6IEROUyBzdXBwb3J0PC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0icmVmZXJlbmNlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorCis8Ym9keT4KKworPCEtLSBoZWFkZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1oZWFkZXI+Cis8aHI+Cis8Y2VudGVyPgorPHRhYmxlIHN1bW1hcnk9Ikx1YVNvY2tldCBsb2dvIj4KKzx0cj48dGQgYWxpZ249Y2VudGVyPjxhIGhyZWY9Imh0dHA6Ly93d3cubHVhLm9yZyI+Cis8aW1nIHdpZHRoPTEyOCBoZWlnaHQ9MTI4IGJvcmRlcj0wIGFsdD0iTHVhU29ja2V0IiBzcmM9Imx1YXNvY2tldC5wbmciPgorPC9hPjwvdGQ+PC90cj4KKzx0cj48dGQgYWxpZ249Y2VudGVyIHZhbGlnbj10b3A+TmV0d29yayBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd25sb2FkIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4gCis8L3A+Cis8L2NlbnRlcj4KKzxocj4KKzwvZGl2PgorCis8IS0tIGRucyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDIgaWQ9ZG5zPkROUzwvaDI+IAorCis8cD4KK05hbWUgcmVzb2x1dGlvbiBmdW5jdGlvbnMgcmV0dXJuIDxlbT5hbGw8L2VtPiBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZQorcmVzb2x2ZXIgaW4gYSB0YWJsZSBvZiB0aGUgZm9ybToKKzwvcD4KKworPGJsb2NrcXVvdGU+PHR0PgorcmVzb2x2ZWQgPSB7PGJyPgorJm5ic3A7Jm5ic3A7bmFtZSA9IDxpPmNhbm9uaWMtbmFtZTwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7YWxpYXMgPSA8aT5hbGlhcy1saXN0PC9pPiw8YnI+CismbmJzcDsmbmJzcDtpcCA9IDxpPmlwLWFkZHJlc3MtbGlzdDwvaT48YnI+Cit9Cis8L3R0PiA8L2Jsb2NrcXVvdGU+CisKKzxwPgorTm90ZSB0aGF0IHRoZSA8dHQ+YWxpYXM8L3R0PiBsaXN0IGNhbiBiZSBlbXB0eS4KKzwvcD4KKworPCEtLSBnZXRob3N0bmFtZSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1nZXRob3N0bmFtZT4gCitzb2NrZXQuZG5zLjxiPmdldGhvc3RuYW1lKCk8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorUmV0dXJucyB0aGUgc3RhbmRhcmQgaG9zdCBuYW1lIGZvciB0aGUgbWFjaGluZSBhcyBhIHN0cmluZy4gCis8L3A+CisKKzwhLS0gdG9ob3N0bmFtZSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9dG9ob3N0bmFtZT4gCitzb2NrZXQuZG5zLjxiPnRvaG9zdG5hbWUoPC9iPmFkZHJlc3M8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0NvbnZlcnRzIGZyb20gSVAgYWRkcmVzcyB0byBob3N0IG5hbWUuCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+QWRkcmVzczwvdHQ+IGNhbiAgYmUgYW4gSVAgYWRkcmVzcyAgb3IgaG9zdCBuYW1lLiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgIHdpdGggdGhlIGNhbm9uaWMgaG9zdCBuYW1lIG9mIHRoZSBnaXZlbgorPHR0PmFkZHJlc3M8L3R0PiwgZm9sbG93ZWQgIGJ5IGEgIHRhYmxlIHdpdGggIGFsbCAgaW5mb3JtYXRpb24gcmV0dXJuZWQgIGJ5Cit0aGUgIHJlc29sdmVyLiAgSW4gIGNhc2Ugb2YgZXJyb3IsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDxiPjx0dD5uaWw8L3R0PjwvYj4KK2ZvbGxvd2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UuICAKKzwvcD4KKworPCEtLSB0b2lwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD10b2lwPiAKK3NvY2tldC5kbnMuPGI+dG9pcCg8L2I+YWRkcmVzczxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQ29udmVydHMgZnJvbSBob3N0IG5hbWUgdG8gSVAgYWRkcmVzcy4KKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5BZGRyZXNzPC90dD4gY2FuICBiZSBhbiBJUCBhZGRyZXNzICBvciBob3N0IG5hbWUuIAorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+IAorUmV0dXJucyBhIHN0cmluZyAgd2l0aCB0aGUgZmlyc3QgSVAgYWRkcmVzcyAgZm91bmQgZm9yIDx0dD5hZGRyZXNzPC90dD4sCitmb2xsb3dlZCAgYnkgYSAgdGFibGUgd2l0aCAgYWxsICBpbmZvcm1hdGlvbiByZXR1cm5lZCAgYnkgdGhlICByZXNvbHZlci4KK0luICBjYXNlIG9mIGVycm9yLCB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Yj48dHQ+bmlsPC90dD48L2I+IGZvbGxvd2VkIGJ5IGFuIGVycm9yCittZXNzYWdlLiAKKzwvcD4KKworPCEtLSBmb290ZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1mb290ZXI+Cis8aHI+Cis8Y2VudGVyPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd24iPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPgorPC9wPgorPHA+Cis8c21hbGw+CitMYXN0IG1vZGlmaWVkIGJ5IERpZWdvIE5laGFiIG9uIDxicj4KK1RodSBBcHIgMjAgMDA6MjU6MDcgRURUIDIwMDYKKzwvc21hbGw+Cis8L3A+Cis8L2NlbnRlcj4KKzwvZGl2PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZG9jL2Z0cC5odG1sIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9mdHAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODg0ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9mdHAuaHRtbApAQCAtMCwwICsxLDI4OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+IAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9Ikx1YVNvY2tldDogRlRQIHN1cHBvcnQiPgorPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Ikx1YSwgTHVhU29ja2V0LCBGVFAsIE5ldHdvcmssIExpYnJhcnksIFN1cHBvcnQiPgorPHRpdGxlPkx1YVNvY2tldDogRlRQIHN1cHBvcnQ8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJyZWZlcmVuY2UuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8IS0tIGhlYWRlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9aGVhZGVyPgorPGhyPgorPGNlbnRlcj4KKzx0YWJsZSBzdW1tYXJ5PSJMdWFTb2NrZXQgbG9nbyI+Cis8dHI+PHRkIGFsaWduPWNlbnRlcj48YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPgorPGltZyB3aWR0aD0xMjggaGVpZ2h0PTEyOCBib3JkZXI9MCBhbHQ9Ikx1YVNvY2tldCIgc3JjPSJsdWFzb2NrZXQucG5nIj4KKzwvYT48L3RkPjwvdHI+Cis8dHI+PHRkIGFsaWduPWNlbnRlciB2YWxpZ249dG9wPk5ldHdvcmsgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorPC90ZD48L3RyPgorPC90YWJsZT4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3dubG9hZCI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+IAorPC9wPgorPC9jZW50ZXI+Cis8aHI+Cis8L2Rpdj4KKworPCEtLSBmdHAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgyIGlkPWZ0cD5GVFA8L2gyPiAKKworPHA+CitGVFAgIChGaWxlIFRyYW5zZmVyICBQcm90b2NvbCkgIGlzIGEgIHByb3RvY29sICB1c2VkICB0byB0cmFuc2ZlciAgZmlsZXMKK2JldHdlZW4gaG9zdHMuICBUaGUgPHR0PmZ0cDwvdHQ+IG5hbWVzcGFjZSBvZmZlcnMgdGhvcm91Z2ggc3VwcG9ydAordG8gRlRQLCB1bmRlciBhIHNpbXBsZSBpbnRlcmZhY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBjb25mb3JtcyB0bworPGEgaHJlZj0iaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35kaWVnby9yZmMvcmZjMDk1OS50eHQiPlJGQyA5NTk8L2E+LgorPC9wPgorCis8cD4KK0hpZ2ggbGV2ZWwgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBzdXBwb3J0aW5nIHRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb25zLgorVGhlc2UgaGlnaCBsZXZlbCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiBhIGxvd2VyIGxldmVsCitpbnRlcmZhY2UuIFVzaW5nIHRoZSBsb3ctbGV2ZWwgaW50ZXJmYWNlLCB1c2VycyBjYW4gZWFzaWx5IGNyZWF0ZSB0aGVpcgorb3duIGZ1bmN0aW9ucyB0byBhY2Nlc3MgPGVtPmFueTwvZW0+IG9wZXJhdGlvbiBzdXBwb3J0ZWQgYnkgdGhlIEZUUAorcHJvdG9jb2wuICBGb3IgdGhhdCwgY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uLiAgCis8L3A+CisKKzxwPgorVG8gcmVhbGx5IGJlbmVmaXQgZnJvbSB0aGlzIG1vZHVsZSwgYSBnb29kIHVuZGVyc3RhbmRpbmcgb2YgCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPgorTFROMDEyLCBGaWx0ZXJzIHNvdXJjZXMgYW5kIHNpbmtzPC9hPiBpcyBuZWNlc3NhcnkuIAorPC9wPgorCis8cD4gCitUbyBvYnRhaW4gdGhlIDx0dD5mdHA8L3R0PiBuYW1lc3BhY2UsIHJ1bjoKKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorLS0gbG9hZHMgdGhlIEZUUCBtb2R1bGUgYW5kIGFueSBsaWJyYXJpZXMgaXQgcmVxdWlyZXMKK2xvY2FsIGZ0cCA9IHJlcXVpcmUoInNvY2tldC5mdHAiKQorPC9wcmU+CisKKzxwPgorVVJMcyBNVVNUIGNvbmZvcm0gdG8KKzxhIGhyZWY9Imh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+ZGllZ28vcmZjL3JmYzE3MzgudHh0Ij5SRkMKKzE3Mzg8L2E+LCB0aGF0IGlzLCBhbiBVUkwgaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm06IAorPC9wPgorCis8YmxvY2txdW90ZT4KKzx0dD4KK1tmdHA6Ly9dWyZsdDt1c2VyJmd0O1s6Jmx0O3Bhc3N3b3JkJmd0O11AXSZsdDtob3N0Jmd0O1s6Jmx0O3BvcnQmZ3Q7XVsvJmx0O3BhdGgmZ3Q7XVs8aT50eXBlPC9pPj1hfGldPC90dD4KKzwvYmxvY2txdW90ZT4KKworPHA+CitUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBpbiB0aGUgbmFtZXNwYWNlIGNhbiBiZSBzZXQgdG8gY29udHJvbCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZgordGhlIEZUUCBtb2R1bGU6IAorPC9wPgorCis8dWw+Cis8bGk+IDx0dD5QQVNTV09SRDwvdHQ+OiBkZWZhdWx0IGFub255bW91cyBwYXNzd29yZC4KKzxsaT4gPHR0PlBPUlQ8L3R0PjogZGVmYXVsdCBwb3J0IHVzZWQgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb247Cis8bGk+IDx0dD5USU1FT1VUPC90dD46IHNldHMgdGhlIHRpbWVvdXQgZm9yIGFsbCBJL08gb3BlcmF0aW9uczsKKzxsaT4gPHR0PlVTRVI8L3R0PjogZGVmYXVsdCBhbm9ueW1vdXMgdXNlcjsKKzwvdWw+CisKKworPCEtLSBmdHAuZ2V0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1nZXQ+CitmdHAuPGI+Z2V0KDwvYj51cmw8Yj4pPC9iPjxicj4KK2Z0cC48Yj5nZXR7PC9iPjxicj4KKyZuYnNwOyZuYnNwO2hvc3QgPSA8aT5zdHJpbmc8L2k+LDxicj4KKyZuYnNwOyZuYnNwO3NpbmsgPSA8aT5MVE4xMiBzaW5rPC9pPiw8YnI+CismbmJzcDsmbmJzcDthcmd1bWVudCA8aT5vcjwvaT4gcGF0aCA9IDxpPnN0cmluZzwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7W3VzZXIgPSA8aT5zdHJpbmc8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbcGFzc3dvcmQgPSA8aT5zdHJpbmc8L2k+XTxicj4KKyZuYnNwOyZuYnNwO1tjb21tYW5kID0gPGk+c3RyaW5nPC9pPixdPGJyPgorJm5ic3A7Jm5ic3A7W3BvcnQgPSA8aT5udW1iZXI8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbdHlwZSA9IDxpPnN0cmluZzwvaT4sXTxicj4KKyZuYnNwOyZuYnNwO1tzdGVwID0gPGk+TFROMTIgcHVtcCBzdGVwPC9pPixdPGJyPgorJm5ic3A7Jm5ic3A7W2NyZWF0ZSA9IDxpPmZ1bmN0aW9uPC9pPl08YnI+Cis8Yj59PC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1RoZSA8dHQ+Z2V0PC90dD4gZnVuY3Rpb24gaGFzIHR3byBmb3Jtcy4gVGhlIHNpbXBsZSBmb3JtIGhhcyBmaXhlZAorZnVuY3Rpb25hbGl0eTogaXQgZG93bmxvYWRzIHRoZSBjb250ZW50cyBvZiBhIFVSTCBhbmQgcmV0dXJucyBpdCBhcyBhCitzdHJpbmcuIFRoZSBnZW5lcmljIGZvcm0gYWxsb3dzIGEgPGVtPmxvdDwvZW0+IG1vcmUgY29udHJvbCwgYXMgZXhwbGFpbmVkCitiZWxvdy4KKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KK0lmIHRoZSBhcmd1bWVudCBvZiB0aGUgPHR0PmdldDwvdHQ+IGZ1bmN0aW9uIGlzIGEgdGFibGUsIHRoZSBmdW5jdGlvbgorZXhwZWN0cyBhdCBsZWFzdCB0aGUgZmllbGRzIDx0dD5ob3N0PC90dD4sIDx0dD5zaW5rPC90dD4sIGFuZCBvbmUgb2YgCis8dHQ+YXJndW1lbnQ8L3R0PiBvciA8dHQ+cGF0aDwvdHQ+ICg8dHQ+YXJndW1lbnQ8L3R0PiB0YWtlcworcHJlY2VkZW5jZSkuIDx0dD5Ib3N0PC90dD4gaXMgdGhlIHNlcnZlciB0byBjb25uZWN0IHRvLiA8dHQ+U2luazwvdHQ+IGlzCit0aGUgPGVtPnNpbXBsZTwvZW0+IAorPGEgaHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj5MVE4xMjwvYT4KK3NpbmsgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGRvd25sb2FkZWQgZGF0YS4gPHR0PkFyZ3VtZW50PC90dD4gb3IKKzx0dD5wYXRoPC90dD4gZ2l2ZSB0aGUgdGFyZ2V0IHBhdGggdG8gdGhlIHJlc291cmNlIGluIHRoZSBzZXJ2ZXIuIFRoZQorb3B0aW9uYWwgYXJndW1lbnRzIGFyZSB0aGUgZm9sbG93aW5nOgorPC9wPgorPHVsPgorPGxpPjx0dD51c2VyPC90dD4sIDx0dD5wYXNzd29yZDwvdHQ+OiBVc2VyIG5hbWUgYW5kIHBhc3N3b3JkIHVzZWQgZm9yCithdXRoZW50aWNhdGlvbi4gRGVmYXVsdHMgdG8gIjx0dD5mdHA6YW5vbnltb3VzQGFub255bW91cy5vcmc8L3R0PiI7Cis8bGk+PHR0PmNvbW1hbmQ8L3R0PjogVGhlIEZUUCBjb21tYW5kIHVzZWQgdG8gb2J0YWluIGRhdGEuIERlZmF1bHRzIHRvCisiPHR0PnJldHI8L3R0PiIsIGJ1dCBzZWUgZXhhbXBsZSBiZWxvdzsKKzxsaT48dHQ+cG9ydDwvdHQ+OiBUaGUgcG9ydCB0byB1c2VkIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBEZWZhdWx0cyB0byAyMTsKKzxsaT48dHQ+dHlwZTwvdHQ+OiBUaGUgdHJhbnNmZXIgbW9kZS4gQ2FuIHRha2UgdmFsdWVzICI8dHQ+aTwvdHQ+IiBvcgorIjx0dD5hPC90dD4iLiBEZWZhdWx0cyB0byB3aGF0ZXZlciBpcyB0aGUgc2VydmVyIGRlZmF1bHQ7Cis8bGk+PHR0PnN0ZXA8L3R0PjogCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPkxUTjEyPC9hPgorcHVtcCBzdGVwIGZ1bmN0aW9uIHVzZWQgdG8gcGFzcyBkYXRhIGZyb20gdGhlCitzZXJ2ZXIgdG8gdGhlIHNpbmsuIERlZmF1bHRzIHRvIHRoZSBMVE4xMiA8dHQ+cHVtcC5zdGVwPC90dD4gZnVuY3Rpb247Cis8bGk+PHR0PmNyZWF0ZTwvdHQ+OiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGluc3RlYWQgb2YKKzxhIGhyZWY9dGNwLmh0bWwjc29ja2V0LnRjcD48dHQ+c29ja2V0LnRjcDwvdHQ+PC9hPiB3aGVuIHRoZSBjb21tdW5pY2F0aW9ucyBzb2NrZXQgaXMgY3JlYXRlZC4gCis8L3VsPgorCis8cCBjbGFzcz1yZXR1cm4+CitJZiBzdWNjZXNzZnVsLCB0aGUgc2ltcGxlIHZlcnNpb24gcmV0dXJucyB0aGUgVVJMICBjb250ZW50cyBhcyBhCitzdHJpbmcsIGFuZCB0aGUgZ2VuZXJpYyBmdW5jdGlvbiByZXR1cm5zIDEuICBJbiBjYXNlIG9mIGVycm9yLCAgYm90aAorZnVuY3Rpb25zIHJldHVybiA8Yj48dHQ+bmlsPC90dD48L2I+IGFuZCBhbiBlcnJvciBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlCitlcnJvci4gIAorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIHRoZSBmdHAgc3VwcG9ydAorbG9jYWwgZnRwID0gcmVxdWlyZSgic29ja2V0LmZ0cCIpCisKKy0tIExvZyBhcyB1c2VyICJhbm9ueW1vdXMiIG9uIHNlcnZlciAiZnRwLnRlY2dyYWYucHVjLXJpby5iciIsCistLSBhbmQgZ2V0IGZpbGUgImx1YS50YXIuZ3oiIGZyb20gZGlyZWN0b3J5ICJwdWIvbHVhIiBhcyBiaW5hcnkuCitmLCBlID0gZnRwLmdldCgiZnRwOi8vZnRwLnRlY2dyYWYucHVjLXJpby5ici9wdWIvbHVhL2x1YS50YXIuZ3o7dHlwZT1pIikKKzwvcHJlPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIG5lZWRlZCBtb2R1bGVzCitsb2NhbCBmdHAgPSByZXF1aXJlKCJzb2NrZXQuZnRwIikKK2xvY2FsIGx0bjEyID0gcmVxdWlyZSgibHRuMTIiKQorbG9jYWwgdXJsID0gcmVxdWlyZSgic29ja2V0LnVybCIpCisKKy0tIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZGlyZWN0b3J5IGxpc3RpbmcKK2Z1bmN0aW9uIG5sc3QodSkKKyAgICBsb2NhbCB0ID0ge30KKyAgICBsb2NhbCBwID0gdXJsLnBhcnNlKHUpCisgICAgcC5jb21tYW5kID0gIm5sc3QiCisgICAgcC5zaW5rID0gbHRuMTIuc2luay50YWJsZSh0KQorICAgIGxvY2FsIHIsIGUgPSBmdHAuZ2V0KHApCisgICAgcmV0dXJuIHIgYW5kIHRhYmxlLmNvbmNhdCh0KSwgZQorZW5kCis8L3ByZT4KKworPCEtLSBwdXQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1wdXQ+CitmdHAuPGI+cHV0KDwvYj51cmwsIGNvbnRlbnQ8Yj4pPC9iPjxicj4KK2Z0cC48Yj5wdXR7PC9iPjxicj4KKyZuYnNwOyZuYnNwO2hvc3QgPSA8aT5zdHJpbmc8L2k+LDxicj4KKyZuYnNwOyZuYnNwO3NvdXJjZSA9IDxpPkxUTjEyIHNpbms8L2k+LDxicj4KKyZuYnNwOyZuYnNwO2FyZ3VtZW50IDxpPm9yPC9pPiBwYXRoID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDtbdXNlciA9IDxpPnN0cmluZzwvaT4sXTxicj4KKyZuYnNwOyZuYnNwO1twYXNzd29yZCA9IDxpPnN0cmluZzwvaT5dPGJyPgorJm5ic3A7Jm5ic3A7W2NvbW1hbmQgPSA8aT5zdHJpbmc8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbcG9ydCA9IDxpPm51bWJlcjwvaT4sXTxicj4KKyZuYnNwOyZuYnNwO1t0eXBlID0gPGk+c3RyaW5nPC9pPixdPGJyPgorJm5ic3A7Jm5ic3A7W3N0ZXAgPSA8aT5MVE4xMiBwdW1wIHN0ZXA8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbY3JlYXRlID0gPGk+ZnVuY3Rpb248L2k+XTxicj4KKzxiPn08L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorVGhlIDx0dD5wdXQ8L3R0PiBmdW5jdGlvbiBoYXMgdHdvIGZvcm1zLiBUaGUgc2ltcGxlIGZvcm0gaGFzIGZpeGVkCitmdW5jdGlvbmFsaXR5OiBpdCB1cGxvYWRzIGEgc3RyaW5nIG9mIGNvbnRlbnQgaW50byBhIFVSTC4gVGhlIGdlbmVyaWMgZm9ybQorYWxsb3dzIGEgPGVtPmxvdDwvZW0+IG1vcmUgY29udHJvbCwgYXMgZXhwbGFpbmVkIGJlbG93LiAgCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+CitJZiB0aGUgYXJndW1lbnQgb2YgdGhlIDx0dD5wdXQ8L3R0PiBmdW5jdGlvbiBpcyBhIHRhYmxlLCB0aGUgZnVuY3Rpb24KK2V4cGVjdHMgYXQgbGVhc3QgdGhlIGZpZWxkcyA8dHQ+aG9zdDwvdHQ+LCA8dHQ+c291cmNlPC90dD4sIGFuZCBvbmUgb2YgCis8dHQ+YXJndW1lbnQ8L3R0PiBvciA8dHQ+cGF0aDwvdHQ+ICg8dHQ+YXJndW1lbnQ8L3R0PiB0YWtlcworcHJlY2VkZW5jZSkuIDx0dD5Ib3N0PC90dD4gaXMgdGhlIHNlcnZlciB0byBjb25uZWN0IHRvLiA8dHQ+U291cmNlPC90dD4gaXMKK3RoZSA8ZW0+c2ltcGxlPC9lbT4gCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPkxUTjEyPC9hPiAKK3NvdXJjZSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgY29udGVudHMgdG8gYmUgdXBsb2FkZWQuIAorPHR0PkFyZ3VtZW50PC90dD4gb3IKKzx0dD5wYXRoPC90dD4gZ2l2ZSB0aGUgdGFyZ2V0IHBhdGggdG8gdGhlIHJlc291cmNlIGluIHRoZSBzZXJ2ZXIuIFRoZQorb3B0aW9uYWwgYXJndW1lbnRzIGFyZSB0aGUgZm9sbG93aW5nOgorPC9wPgorPHVsPgorPGxpPjx0dD51c2VyPC90dD4sIDx0dD5wYXNzd29yZDwvdHQ+OiBVc2VyIG5hbWUgYW5kIHBhc3N3b3JkIHVzZWQgZm9yCithdXRoZW50aWNhdGlvbi4gRGVmYXVsdHMgdG8gIjx0dD5mdHA6YW5vbnltb3VzQGFub255bW91cy5vcmc8L3R0PiI7Cis8bGk+PHR0PmNvbW1hbmQ8L3R0PjogVGhlIEZUUCBjb21tYW5kIHVzZWQgdG8gc2VuZCBkYXRhLiBEZWZhdWx0cyB0bworIjx0dD5zdG9yPC90dD4iLCBidXQgc2VlIGV4YW1wbGUgYmVsb3c7Cis8bGk+PHR0PnBvcnQ8L3R0PjogVGhlIHBvcnQgdG8gdXNlZCBmb3IgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gRGVmYXVsdHMgdG8gMjE7Cis8bGk+PHR0PnR5cGU8L3R0PjogVGhlIHRyYW5zZmVyIG1vZGUuIENhbiB0YWtlIHZhbHVlcyAiPHR0Pmk8L3R0PiIgb3IKKyI8dHQ+YTwvdHQ+Ii4gRGVmYXVsdHMgdG8gd2hhdGV2ZXIgaXMgdGhlIHNlcnZlciBkZWZhdWx0OworPGxpPjx0dD5zdGVwPC90dD46IAorPGEgaHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj5MVE4xMjwvYT4gCitwdW1wIHN0ZXAgZnVuY3Rpb24gdXNlZCB0byBwYXNzIGRhdGEgZnJvbSB0aGUKK3NlcnZlciB0byB0aGUgc2luay4gRGVmYXVsdHMgdG8gdGhlIExUTjEyIDx0dD5wdW1wLnN0ZXA8L3R0PiBmdW5jdGlvbjsKKzxsaT48dHQ+Y3JlYXRlPC90dD46IEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW5zdGVhZCBvZgorPGEgaHJlZj10Y3AuaHRtbCNzb2NrZXQudGNwPjx0dD5zb2NrZXQudGNwPC90dD48L2E+IHdoZW4gdGhlIGNvbW11bmljYXRpb25zIHNvY2tldCBpcyBjcmVhdGVkLiAKKzwvdWw+CisKKzxwIGNsYXNzPXJldHVybj4KK0JvdGggZnVuY3Rpb25zIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIG9yIDxiPjx0dD5uaWw8L3R0PjwvYj4gYW5kIGFuIGVycm9yCittZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorLS0gbG9hZCB0aGUgZnRwIHN1cHBvcnQKK2xvY2FsIGZ0cCA9IHJlcXVpcmUoInNvY2tldC5mdHAiKQorCistLSBMb2cgYXMgdXNlciAiZnVsYW5vIiBvbiBzZXJ2ZXIgImZ0cC5leGFtcGxlLmNvbSIsCistLSB1c2luZyBwYXNzd29yZCAic2lsdmEiLCBhbmQgc3RvcmUgYSBmaWxlICJSRUFETUUiIHdpdGggY29udGVudHMgCistLSAid3JvbmcgcGFzc3dvcmQsIG9mIGNvdXJzZSIKK2YsIGUgPSBmdHAucHV0KCJmdHA6Ly9mdWxhbm86c2lsdmFAZnRwLmV4YW1wbGUuY29tL1JFQURNRSIsIAorICAgICJ3cm9uZyBwYXNzd29yZCwgb2YgY291cnNlIikKKzwvcHJlPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIHRoZSBmdHAgc3VwcG9ydAorbG9jYWwgZnRwID0gcmVxdWlyZSgic29ja2V0LmZ0cCIpCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKKworLS0gTG9nIGFzIHVzZXIgImZ1bGFubyIgb24gc2VydmVyICJmdHAuZXhhbXBsZS5jb20iLAorLS0gdXNpbmcgcGFzc3dvcmQgInNpbHZhIiwgYW5kIGFwcGVuZCB0byB0aGUgcmVtb3RlIGZpbGUgIkxPRyIsIHNlbmRpbmcgdGhlCistLSBjb250ZW50cyBvZiB0aGUgbG9jYWwgZmlsZSAiTE9DQUwtTE9HIgorZiwgZSA9IGZ0cC5wdXR7CisgIGhvc3QgPSAiZnRwLmV4YW1wbGUuY29tIiwgCisgIHVzZXIgPSAiZnVsYW5vIiwKKyAgcGFzc3dvcmQgPSAic2lsdmEiLAorICBjb21tYW5kID0gImFwcGUiLAorICBhcmd1bWVudCA9ICJMT0ciLAorICBzb3VyY2UgPSBsdG4xMi5zb3VyY2UuZmlsZShpby5vcGVuKCJMT0NBTC1MT0ciLCAiciIpKQorfQorPC9wcmU+CisKKworPCEtLSBmb290ZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1mb290ZXI+Cis8aHI+Cis8Y2VudGVyPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd25sb2FkIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4gCis8L3A+Cis8cD4KKzxzbWFsbD4KK0xhc3QgbW9kaWZpZWQgYnkgRGllZ28gTmVoYWIgb24gPGJyPgorVGh1IEFwciAyMCAwMDoyNToxOCBFRFQgMjAwNgorPC9zbWFsbD4KKzwvcD4KKzwvY2VudGVyPgorPC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2MvaHR0cC5odG1sIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9odHRwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjYWMxMwotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9kb2MvaHR0cC5odG1sCkBAIC0wLDAgKzEsMzMzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIAorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJMdWFTb2NrZXQ6IEhUVFAgc3VwcG9ydCI+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iTHVhLCBIVFRQLCBMaWJyYXJ5LCBXV1csIEJyb3dzZXIsIE5ldHdvcmssIFN1cHBvcnQiPiAKKzx0aXRsZT5MdWFTb2NrZXQ6IEhUVFAgc3VwcG9ydDwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InJlZmVyZW5jZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+CisKKzwhLS0gaGVhZGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1oZWFkZXI+Cis8aHI+Cis8Y2VudGVyPgorPHRhYmxlIHN1bW1hcnk9Ikx1YVNvY2tldCBsb2dvIj4KKzx0cj48dGQgYWxpZ249Y2VudGVyPjxhIGhyZWY9Imh0dHA6Ly93d3cubHVhLm9yZyI+Cis8aW1nIHdpZHRoPTEyOCBoZWlnaHQ9MTI4IGJvcmRlcj0wIGFsdD0iTHVhU29ja2V0IiBzcmM9Imx1YXNvY2tldC5wbmciPgorPC9hPjwvdGQ+PC90cj4KKzx0cj48dGQgYWxpZ249Y2VudGVyIHZhbGlnbj10b3A+TmV0d29yayBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd25sb2FkIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4gCis8L3A+Cis8L2NlbnRlcj4KKzxocj4KKzwvZGl2PgorCis8IS0tIGh0dHAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDIgaWQ9aHR0cD5IVFRQPC9oMj4gCisKKzxwPgorSFRUUCAoSHlwZXIgVGV4dCAgVHJhbnNmZXIgUHJvdG9jb2wpIGlzIHRoZSBwcm90b2NvbCAgdXNlZCB0byBleGNoYW5nZQoraW5mb3JtYXRpb24gIGJldHdlZW4gIHdlYi1icm93c2VycyBhbmQgIHNlcnZlcnMuICBUaGUgIDx0dD5odHRwPC90dD4KK25hbWVzcGFjZSBvZmZlcnMgIGZ1bGwgc3VwcG9ydCBmb3IgdGhlIGNsaWVudCAgc2lkZSBvZiB0aGUgSFRUUCAgCitwcm90b2NvbCAoaS5lLiwKK3RoZSBmYWNpbGl0aWVzIHRoYXQgd291bGQgYmUgIHVzZWQgYnkgYSB3ZWItYnJvd3NlciBpbXBsZW1lbnRhdGlvbikuIFRoZQoraW1wbGVtZW50YXRpb24gICAgY29uZm9ybXMgICAgIHRvICAgIHRoZSAgICBIVFRQLzEuMSAgICAgc3RhbmRhcmQsCis8YSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3JmYy9yZmMyNjE2LnR4dCI+UkZDCisyNjE2PC9hPi4KKzwvcD4KKworPHA+CitUaGUgbW9kdWxlIGV4cG9ydHMgZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSBIVFRQIGZ1bmN0aW9uYWxpdHkgaW4gZGlmZmVyZW50CitsZXZlbHMgb2YgYWJzdHJhY3Rpb24uIEZyb20gdGhlIHNpbXBsZSAKK3N0cmluZyBvcmllbnRlZCByZXF1ZXN0cywgdGhyb3VnaCBnZW5lcmljCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPkxUTjEyPC9hPiBiYXNlZCwgZG93biB0byBldmVuIGxvd2VyLWxldmVsIGlmIHlvdSBib3RoZXIgdG8gbG9vayB0aHJvdWdoIHRoZSBzb3VyY2UgY29kZS4KKzwvcD4KKworPHA+IAorVG8gb2J0YWluIHRoZSA8dHQ+aHR0cDwvdHQ+IG5hbWVzcGFjZSwgcnVuOgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkcyB0aGUgSFRUUCBtb2R1bGUgYW5kIGFueSBsaWJyYXJpZXMgaXQgcmVxdWlyZXMKK2xvY2FsIGh0dHAgPSByZXF1aXJlKCJzb2NrZXQuaHR0cCIpCis8L3ByZT4KKworPHA+CitVUkxzIG11c3QgY29uZm9ybSB0bworPGEgaHJlZj0iaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35kaWVnby9yZmMvcmZjMTczOC50eHQiPlJGQworMTczODwvYT4sCit0aGF0IGlzLCBhbiBVUkwgaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm06IAorPC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CitbaHR0cDovL11bJmx0O3VzZXImZ3Q7WzombHQ7cGFzc3dvcmQmZ3Q7XUBdJmx0O2hvc3QmZ3Q7WzombHQ7cG9ydCZndDtdWy8mbHQ7cGF0aCZndDtdIAorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorTUlNRSBoZWFkZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIEx1YSB0YWJsZSBpbiB0aGUgZm9ybToKKzwvcD4KKworPGJsb2NrcXVvdGU+Cis8dGFibGUgc3VtbWFyeT0iTUlNRSBoZWFkZXJzIGluIEx1YSB0YWJsZSI+Cis8dHI+PHRkPjx0dD4KK2hlYWRlcnMgPSB7PGJyPgorJm5ic3A7Jm5ic3A7ZmllbGQtMS1uYW1lID0gPGk+ZmllbGQtMS12YWx1ZTwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7ZmllbGQtMi1uYW1lID0gPGk+ZmllbGQtMi12YWx1ZTwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7ZmllbGQtMy1uYW1lID0gPGk+ZmllbGQtMy12YWx1ZTwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7Li4uPGJyPgorJm5ic3A7Jm5ic3A7ZmllbGQtbi1uYW1lID0gPGk+ZmllbGQtbi12YWx1ZTwvaT48YnI+Cit9Cis8L3R0PjwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorRmllbGQgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUgKGFzICBzcGVjaWZpZWQgYnkgdGhlIHN0YW5kYXJkKSBhbmQgYWxsCitmdW5jdGlvbnMgIHdvcmsgd2l0aCAgbG93ZXJjYXNlIGZpZWxkIG5hbWVzLiAgCitGaWVsZCB2YWx1ZXMgYXJlIGxlZnQgdW5tb2RpZmllZC4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IE1JTUUgaGVhZGVycyBhcmUgaW5kZXBlbmRlbnQgb2Ygb3JkZXIuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcHJvYmxlbQoraW4gcmVwcmVzZW50aW5nIHRoZW0gaW4gYSBMdWEgdGFibGUuIAorPC9wPgorCis8cD4KK1RoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGNhbiBiZSBzZXQgdG8gY29udHJvbCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZgordGhlIEhUVFAgbW9kdWxlOiAKKzwvcD4KKworPHVsPgorPGxpPiA8dHQ+UE9SVDwvdHQ+OiBkZWZhdWx0IHBvcnQgdXNlZCBmb3IgY29ubmVjdGlvbnM7IAorPGxpPiA8dHQ+UFJPWFk8L3R0PjogZGVmYXVsdCBwcm94eSB1c2VkIGZvciBjb25uZWN0aW9uczsgCis8bGk+IDx0dD5USU1FT1VUPC90dD46IHNldHMgdGhlIHRpbWVvdXQgZm9yIGFsbCBJL08gb3BlcmF0aW9uczsKKzxsaT4gPHR0PlVTRVJBR0VOVDwvdHQ+OiBkZWZhdWx0IHVzZXIgYWdlbnQgcmVwb3J0ZWQgdG8gc2VydmVyLgorPC91bD4KKworPCEtLSBodHRwLnJlcXVlc3QgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPXJlcXVlc3Q+CitodHRwLjxiPnJlcXVlc3QoPC9iPnVybCBbLCBib2R5XTxiPik8L2I+PGJyPgoraHR0cC48Yj5yZXF1ZXN0ezwvYj48YnI+CismbmJzcDsmbmJzcDt1cmwgPSA8aT5zdHJpbmc8L2k+LDxicj4KKyZuYnNwOyZuYnNwO1tzaW5rID0gPGk+TFROMTIgc2luazwvaT4sXTxicj4KKyZuYnNwOyZuYnNwO1ttZXRob2QgPSA8aT5zdHJpbmc8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbaGVhZGVycyA9IDxpPmhlYWRlci10YWJsZTwvaT4sXTxicj4KKyZuYnNwOyZuYnNwO1tzb3VyY2UgPSA8aT5MVE4xMiBzb3VyY2U8L2k+XSw8YnI+CismbmJzcDsmbmJzcDtbc3RlcCA9IDxpPkxUTjEyIHB1bXAgc3RlcDwvaT4sXTxicj4KKyZuYnNwOyZuYnNwO1twcm94eSA9IDxpPnN0cmluZzwvaT4sXTxicj4KKyZuYnNwOyZuYnNwO1tyZWRpcmVjdCA9IDxpPmJvb2xlYW48L2k+LF08YnI+CismbmJzcDsmbmJzcDtbY3JlYXRlID0gPGk+ZnVuY3Rpb248L2k+XTxicj4KKzxiPn08L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorVGhlIHJlcXVlc3QgZnVuY3Rpb24gaGFzIHR3byBmb3Jtcy4gVGhlIHNpbXBsZSBmb3JtIGRvd25sb2FkcyAKK2EgVVJMIHVzaW5nIHRoZSA8dHQ+R0VUPC90dD4gb3IgPHR0PlBPU1Q8L3R0PiBtZXRob2QgYW5kIGlzIGJhc2VkIAorb24gc3RyaW5ncy4gVGhlIGdlbmVyaWMgZm9ybSBwZXJmb3JtcyBhbnkgSFRUUCBtZXRob2QgYW5kIGlzIAorPGEgaHJlZj1odHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3M+TFROMTI8L2E+IGJhc2VkLgorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorSWYgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSA8dHQ+cmVxdWVzdDwvdHQ+IGZ1bmN0aW9uIGlzIGEgc3RyaW5nLCBpdAorc2hvdWxkIGJlIGFuIDx0dD51cmw8L3R0Pi4gSW4gdGhhdCBjYXNlLCBpZiBhIDx0dD5ib2R5PC90dD4KK2lzIHByb3ZpZGVkIGFzIGEgc3RyaW5nLCB0aGUgZnVuY3Rpb24gd2lsbCBwZXJmb3JtIGEgPHR0PlBPU1Q8L3R0PiBtZXRob2QKK2luIHRoZSA8dHQ+dXJsPC90dD4uIE90aGVyd2lzZSwgaXQgcGVyZm9ybXMgYSA8dHQ+R0VUPC90dD4gaW4gdGhlCis8dHQ+dXJsPC90dD4gCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+CitJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgaW5zdGVhZCBhIHRhYmxlLCB0aGUgbW9zdCBpbXBvcnRhbnQgZmllbGRzIGFyZSAKK3RoZSA8dHQ+dXJsPC90dD4gYW5kIHRoZSA8ZW0+c2ltcGxlPC9lbT4KKzxhIGhyZWY9Imh0dHA6Ly9sdWEtdXNlcnMub3JnL3dpa2kvRmlsdGVyc1NvdXJjZXNBbmRTaW5rcyI+TFROMTI8L2E+IAorPHR0PnNpbms8L3R0PiB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZG93bmxvYWRlZCBjb250ZW50LiAgCitBbnkgcGFydCBvZiB0aGUgPHR0PnVybDwvdHQ+IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGluY2x1ZGluZwordGhlIGFwcHJvcHJpYXRlIGZpZWxkIGluIHRoZSByZXF1ZXN0IHRhYmxlLgorSWYgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbgordXNlcyB0aGUgIEJhc2ljIEF1dGhlbnRpY2F0aW9uIFNjaGVtZSAoc2VlICA8YSBocmVmPSIjYXV0aGVudGljYXRpb24iPm5vdGU8L2E+KQordG8gcmV0cmlldmUgIHRoZSBkb2N1bWVudC4gSWYgPHR0PnNpbms8L3R0PiBpcyA8dHQ+PGI+bmlsPC9iPjwvdHQ+LCB0aGUKK2Z1bmN0aW9uIGRpc2NhcmRzIHRoZSBkb3dubG9hZGVkIGRhdGEuIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSB0aGUKK2ZvbGxvd2luZzoKKzwvcD4KKzx1bD4KKzxsaT48dHQ+bWV0aG9kPC90dD46IFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kLiBEZWZhdWx0cyB0byAiR0VUIjsgCis8bGk+PHR0PmhlYWRlcnM8L3R0PjogQW55IGFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzIHRvIHNlbmQgd2l0aCB0aGUgcmVxdWVzdDsgCis8bGk+PHR0PnNvdXJjZTwvdHQ+OiA8ZW0+c2ltcGxlPC9lbT4gCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPkxUTjEyPC9hPiAKK3NvdXJjZSB0byBwcm92aWRlIHRoZSByZXF1ZXN0IGJvZHkuIElmIHRoZXJlCitpcyBhIGJvZHksIHlvdSBuZWVkIHRvIHByb3ZpZGUgYW4gYXBwcm9wcmlhdGUgIjx0dD5jb250ZW50LWxlbmd0aDwvdHQ+IgorcmVxdWVzdCBoZWFkZXIgZmllbGQsIG9yIHRoZSBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gc2VuZCB0aGUgYm9keSBhcworIjx0dD5jaHVua2VkPC90dD4iIChzb21ldGhpbmcgZmV3IHNlcnZlcnMgc3VwcG9ydCkuIERlZmF1bHRzIHRvIHRoZSBlbXB0eSBzb3VyY2U7IAorPGxpPjx0dD5zdGVwPC90dD46IAorPGEgaHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj5MVE4xMjwvYT4gCitwdW1wIHN0ZXAgZnVuY3Rpb24gdXNlZCB0byBtb3ZlIGRhdGEuICAKK0RlZmF1bHRzIHRvIHRoZSBMVE4xMiA8dHQ+cHVtcC5zdGVwPC90dD4gZnVuY3Rpb24uCis8bGk+PHR0PnByb3h5PC90dD46IFRoZSBVUkwgb2YgYSBwcm94eSBzZXJ2ZXIgdG8gdXNlLiBEZWZhdWx0cyB0byBubyBwcm94eTsgCis8bGk+PHR0PnJlZGlyZWN0PC90dD46IFNldCB0byA8dHQ+PGI+ZmFsc2U8L2I+PC90dD4gdG8gcHJldmVudCB0aGUgCitmdW5jdGlvbiBmcm9tICBhdXRvbWF0aWNhbGx5IGZvbGxvd2luZyAzMDEgb3IgMzAyIHNlcnZlciByZWRpcmVjdCBtZXNzYWdlczsgCis8bGk+PHR0PmNyZWF0ZTwvdHQ+OiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGluc3RlYWQgb2YKKzxhIGhyZWY9dGNwLmh0bWwjc29ja2V0LnRjcD48dHQ+c29ja2V0LnRjcDwvdHQ+PC9hPiB3aGVuIHRoZSBjb21tdW5pY2F0aW9ucyBzb2NrZXQgaXMgY3JlYXRlZC4gCis8L3VsPgorCis8cCBjbGFzcz1yZXR1cm4+CitJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDx0dD48Yj5uaWw8L2I+PC90dD4gZm9sbG93ZWQgYnkgYW4KK2Vycm9yIG1lc3NhZ2UuIElmIHN1Y2Nlc3NmdWwsIHRoZSBzaW1wbGUgZm9ybSByZXR1cm5zIHRoZSByZXNwb25zZSAKK2JvZHkgYXMgYSBzdHJpbmcsIGZvbGxvd2VkIGJ5IHRoZSByZXNwb25zZSBzdGF0dXMgY29kZSwgdGhlIHJlc3BvbnNlCitoZWFkZXJzIGFuZCB0aGUgcmVzcG9uc2Ugc3RhdHVzIGxpbmUuIFRoZSBnZW5lcmljIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUKK2luZm9ybWF0aW9uLCBleGNlcHQgdGhlIGZpcnN0IHJldHVybiB2YWx1ZSBpcyBqdXN0IHRoZSBudW1iZXIgMSAodGhlIGJvZHkKK2dvZXMgdG8gdGhlIDx0dD5zaW5rPC90dD4pLgorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitFdmVuICB3aGVuIHRoZSBzZXJ2ZXIgZmFpbHMgdG8gcHJvdmlkZSB0aGUgY29udGVudHMgb2YgdGhlIHJlcXVlc3RlZCBVUkwgKFVSTCBub3QgIGZvdW5kLCBmb3IgIGV4YW1wbGUpLCAKK2l0IHVzdWFsbHkgcmV0dXJucyBhIG1lc3NhZ2UgYm9keSAoYSB3ZWIgcGFnZSBpbmZvcm1pbmcgdGhlCitVUkwgIHdhcyAgbm90IGZvdW5kICBvciAgc29tZSAgb3RoZXIgdXNlbGVzcyAgcGFnZSkuICBUbyAgbWFrZSBzdXJlICB0aGUKK29wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgY2hlY2sgIHRoZSByZXR1cm5lZCBzdGF0dXMgPHR0PmNvZGU8L3R0Pi4gRm9yCithICBsaXN0ICBvZiAgdGhlICBwb3NzaWJsZSAgdmFsdWVzICBhbmQgIHRoZWlyICBtZWFuaW5ncywgIHJlZmVyICB0byAgPGEKK2hyZWY9Imh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+ZGllZ28vcmZjL3JmYzI2MTYudHh0Ij5SRkMKKzI2MTY8L2E+LiAKKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitIZXJlIGFyZSBhIGZldyBleGFtcGxlcyB3aXRoIHRoZSBzaW1wbGUgaW50ZXJmYWNlOgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIHRoZSBodHRwIG1vZHVsZQorbG9jYWwgaW8gPSByZXF1aXJlKCJpbyIpCitsb2NhbCBodHRwID0gcmVxdWlyZSgic29ja2V0Lmh0dHAiKQorbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCisKKy0tIGNvbm5lY3QgdG8gc2VydmVyICJ3d3cuY3MucHJpbmNldG9uLmVkdSIgYW5kIHJldHJpZXZlcyB0aGlzIG1hbnVhbAorLS0gZmlsZSBmcm9tICJ+ZGllZ28vcHJvZmVzc2lvbmFsL2x1YXNvY2tldC9odHRwLmh0bWwiIGFuZCBwcmludCBpdCB0byBzdGRvdXQKK2h0dHAucmVxdWVzdHsgCisgICAgdXJsID0gImh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+ZGllZ28vcHJvZmVzc2lvbmFsL2x1YXNvY2tldC9odHRwLmh0bWwiLCAKKyAgICBzaW5rID0gbHRuMTIuc2luay5maWxlKGlvLnN0ZG91dCkKK30KKworLS0gY29ubmVjdCB0byBzZXJ2ZXIgInd3dy5leGFtcGxlLmNvbSIgYW5kIHRyaWVzIHRvIHJldHJpZXZlCistLSAiL3ByaXZhdGUvaW5kZXguaHRtbCIuIEZhaWxzIGJlY2F1c2UgYXV0aGVudGljYXRpb24gaXMgbmVlZGVkLgorYiwgYywgaCA9IGh0dHAucmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wcml2YXRlL2luZGV4Lmh0bWwiKQorLS0gYiByZXR1cm5zIHNvbWUgdXNlbGVzcyBwYWdlIHRlbGxpbmcgYWJvdXQgdGhlIGRlbmllZCBhY2Nlc3MsIAorLS0gaCByZXR1cm5zIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uCistLSBhbmQgYyByZXR1cm5zIHdpdGggdmFsdWUgNDAxIChBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCkKKworLS0gdHJpZXMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgIndyb25nLmhvc3QiIHRvIHJldHJpZXZlICIvIgorLS0gYW5kIGZhaWxzIGJlY2F1c2UgdGhlIGhvc3QgZG9lcyBub3QgZXhpc3QuCityLCBlID0gaHR0cC5yZXF1ZXN0KCJodHRwOi8vd3JvbmcuaG9zdC8iKQorLS0gciBpcyBuaWwsIGFuZCBlIHJldHVybnMgd2l0aCB2YWx1ZSAiaG9zdCBub3QgZm91bmQiCis8L3ByZT4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitBbmQgaGVyZSBpcyBhbiBleGFtcGxlIHVzaW5nIHRoZSBnZW5lcmljIGludGVyZmFjZToKKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorLS0gbG9hZCB0aGUgaHR0cCBtb2R1bGUKK2h0dHAgPSByZXF1aXJlKCJzb2NrZXQuaHR0cCIpCisKKy0tIFJlcXVlc3RzIGluZm9ybWF0aW9uIGFib3V0IGEgZG9jdW1lbnQsIHdpdGhvdXQgZG93bmxvYWRpbmcgaXQuCistLSBVc2VmdWwsIGZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBkaXNwbGF5IGEgZG93bmxvYWQgZ2F1Z2UgYW5kIG5lZWQKKy0tIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIGRvY3VtZW50IGluIGFkdmFuY2UKK3IsIGMsIGggPSBodHRwLnJlcXVlc3QgeworICBtZXRob2QgPSAiSEVBRCIsCisgIHVybCA9ICJodHRwOi8vd3d3LnRlY2dyYWYucHVjLXJpby5ici9+ZGllZ28iCit9CistLSByIGlzIDEsIGMgaXMgMjAwLCBhbmQgaCB3b3VsZCByZXR1cm4gdGhlIGZvbGxvd2luZyBoZWFkZXJzOgorLS0gaCA9IHsKKy0tICAgZGF0ZSA9ICJUdWUsIDE4IFNlcCAyMDAxIDIwOjQyOjIxIEdNVCIsCistLSAgIHNlcnZlciA9ICJBcGFjaGUvMS4zLjEyIChVbml4KSAgKFJlZCBIYXQvTGludXgpIiwKKy0tICAgWyJsYXN0LW1vZGlmaWVkIl0gPSAiV2VkLCAwNSBTZXAgMjAwMSAwNjoxMToyMCBHTVQiLAorLS0gICBbImNvbnRlbnQtbGVuZ3RoIl0gPSAxNTY1MiwKKy0tICAgWyJjb25uZWN0aW9uIl0gPSAiY2xvc2UiLAorLS0gICBbImNvbnRlbnQtVHlwZSJdID0gInRleHQvaHRtbCIKKy0tIH0KKzwvcHJlPgorCis8cCBjbGFzcz1ub3RlIGlkPXBvc3Q+IAorTm90ZTogV2hlbiBzZW5kaW5nIGEgUE9TVCByZXF1ZXN0LCBzaW1wbGUgaW50ZXJmYWNlIGFkZHMgYQorIjx0dD5Db250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvdHQ+IgoraGVhZGVyIHRvIHRoZSByZXF1ZXN0LiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgYnkKK0hUTUwgZm9ybXMuIElmIHlvdSBuZWVkIGFub3RoZXIgdHlwZSwgdXNlIHRoZSBnZW5lcmljCitpbnRlcmZhY2UuCis8L3A+CisKKzxwIGNsYXNzPW5vdGUgaWQ9YXV0aGVudGljYXRpb24+IAorTm90ZTogU29tZSBVUkxzIGFyZSBwcm90ZWN0ZWQgYnkgdGhlaXIKK3NlcnZlcnMgZnJvbSBhbm9ueW1vdXMgZG93bmxvYWQuIEZvciB0aG9zZSBVUkxzLCB0aGUgc2VydmVyIG11c3QgcmVjZWl2ZQorc29tZSAgc29ydCBvZiAgYXV0aGVudGljYXRpb24gYWxvbmcgIHdpdGggdGhlICByZXF1ZXN0IG9yICBpdCB3aWxsICBkZW55Citkb3dubG9hZCBhbmQgcmV0dXJuIHN0YXR1cyAiNDAxJm5ic3A7QXV0aGVudGljYXRpb24gUmVxdWlyZWQiLiAKKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK1RoZSAgSFRUUC8xLjEgc3RhbmRhcmQgIGRlZmluZXMgIHR3byBhdXRoZW50aWNhdGlvbiAgbWV0aG9kczogdGhlICBCYXNpYworQXV0aGVudGljYXRpb24gIFNjaGVtZSAgYW5kICB0aGUgICBEaWdlc3QgIEF1dGhlbnRpY2F0aW9uICBTY2hlbWUsICBib3RoCitleHBsYWluZWQgaW4gZGV0YWlsIGluCis8YSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3JmYy9yZmMyMDY4LnR4dCI+UkZDIDIwNjg8L2E+LgorPC9wPgorCis8cCBjbGFzcz1ub3RlPlRoZSBCYXNpYyAgQXV0aGVudGljYXRpb24gICBTY2hlbWUgIHNlbmRzICAgCis8dHQ+Jmx0O3VzZXImZ3Q7PC90dD4gIGFuZAorPHR0PiZsdDtwYXNzd29yZCZndDs8L3R0PiAgdW5lbmNyeXB0ZWQgdG8gIHRoZSBzZXJ2ZXIgIGFuZCBpcyAgdGhlcmVmb3JlCitjb25zaWRlcmVkIHVuc2FmZS4gIFVuZm9ydHVuYXRlbHksIGJ5ICB0aGUgdGltZSBvZiAgdGhpcyBpbXBsZW1lbnRhdGlvbiwKK3RoZSB3aWRlIG1ham9yaXR5IG9mIHNlcnZlcnMgYW5kIGJyb3dzZXJzIHN1cHBvcnQgdGhlIEJhc2ljIFNjaGVtZSBvbmx5LgorVGhlcmVmb3JlLCAgIHRoaXMgIGlzICAgdGhlICBtZXRob2QgICB1c2VkICBieSAgIHRoZSAgdG9vbGtpdCAgIHdoZW5ldmVyCithdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZC4KKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorLS0gbG9hZCByZXF1aXJlZCBtb2R1bGVzCitodHRwID0gcmVxdWlyZSgic29ja2V0Lmh0dHAiKQorbWltZSA9IHJlcXVpcmUoIm1pbWUiKQorCistLSBDb25uZWN0IHRvIHNlcnZlciAid3d3LmV4YW1wbGUuY29tIiBhbmQgdHJpZXMgdG8gcmV0cmlldmUKKy0tICIvcHJpdmF0ZS9pbmRleC5odG1sIiwgdXNpbmcgdGhlIHByb3ZpZGVkIG5hbWUgYW5kIHBhc3N3b3JkIHRvCistLSBhdXRoZW50aWNhdGUgdGhlIHJlcXVlc3QKK2IsIGMsIGggPSBodHRwLnJlcXVlc3QoImh0dHA6Ly9mdWxhbm86c2lsdmFAd3d3LmV4YW1wbGUuY29tL3ByaXZhdGUvaW5kZXguaHRtbCIpCisKKy0tIEFsdGVybmF0aXZlbHksIG9uZSBjb3VsZCBmaWxsIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXIgYW5kIGF1dGhlbnRpY2F0ZQorLS0gdGhlIHJlcXVlc3QgZGlyZWN0bHkuCityLCBjID0gaHR0cC5yZXF1ZXN0IHsKKyAgdXJsID0gImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vcHJpdmF0ZS9pbmRleC5odG1sIiwKKyAgaGVhZGVycyA9IHsgYXV0aGVudGljYXRpb24gPSAiQmFzaWMgIiAuLiAobWltZS5iNjQoImZ1bGFubzpzaWx2YSIpKSB9Cit9Cis8L3ByZT4KKworPCEtLSBmb290ZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1mb290ZXI+Cis8aHI+Cis8Y2VudGVyPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd25sb2FkIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4gCis8L3A+Cis8cD4KKzxzbWFsbD4KK0xhc3QgbW9kaWZpZWQgYnkgRGllZ28gTmVoYWIgb24gPGJyPgorVGh1IEFwciAyMCAwMDoyNToyNiBFRFQgMjAwNgorPC9zbWFsbD4KKzwvcD4KKzwvY2VudGVyPgorPC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2MvaW5kZXguaHRtbCBiL2x1YXNvY2tldC0yLjAuMi9kb2MvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E3OTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMjA4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIAorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgTHVhU29ja2V0IEhvbWVwYWdlIj4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJMdWEsIEx1YVNvY2tldCwgTmV0d29yaywgTGlicmFyeSwgU3VwcG9ydCwgSW50ZXJuZXQiPgorPHRpdGxlPkx1YVNvY2tldDogTmV0d29yayBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlIDwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InJlZmVyZW5jZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+CisKKzwhLS0gaGVhZGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9aGVhZGVyPgorPGhyPgorPGNlbnRlcj4KKzx0YWJsZSBzdW1tYXJ5PSJMdWFTb2NrZXQgbG9nbyI+Cis8dHI+PHRkIGFsaWduPWNlbnRlcj48YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPgorPGltZyB3aWR0aD0xMjggaGVpZ2h0PTEyOCBib3JkZXI9MCBhbHQ9Ikx1YVNvY2tldCIgc3JjPSJsdWFzb2NrZXQucG5nIj4KKzwvYT48L3RkPjwvdHI+Cis8dHI+PHRkIGFsaWduPWNlbnRlciB2YWxpZ249dG9wPk5ldHdvcmsgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorPC90ZD48L3RyPgorPC90YWJsZT4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3dubG9hZCI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+IAorPC9wPgorPC9jZW50ZXI+Cis8aHI+Cis8L2Rpdj4KKworPCEtLSB3aGF0aXMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgyIGlkPXdoYXRpcz5XaGF0IGlzIEx1YVNvY2tldD88L2gyPgorCis8cD4KK0x1YVNvY2tldCAgaXMgYSAgPGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnIj5MdWE8L2E+ICBleHRlbnNpb24gbGlicmFyeQordGhhdCBpcyBjb21wb3NlZCBieSB0d28gcGFydHM6IGEgQyBjb3JlIHRoYXQgcHJvdmlkZXMgIHN1cHBvcnQgZm9yIHRoZSBUQ1AKK2FuZCBVRFAgdHJhbnNwb3J0IGxheWVycywgYW5kIGEgc2V0IG9mIEx1YSBtb2R1bGVzIHRoYXQgYWRkIHN1cHBvcnQgZm9yCitmdW5jdGlvbmFsaXR5IGNvbW1vbmx5IG5lZWRlZCBieSBhcHBsaWNhdGlvbnMgdGhhdCBkZWFsIHdpdGggdGhlIEludGVybmV0LiAKKzwvcD4KKworPHA+CitUaGUgY29yZSBzdXBwb3J0IGhhcyBiZWVuICBpbXBsZW1lbnRlZCBzbyB0aGF0IGl0ICBpcyBib3RoIGVmZmljaWVudCBhbmQKK3NpbXBsZSB0byB1c2UuICBJdCBpcyBhdmFpbGFibGUgdG8gYW55IEx1YSBhcHBsaWNhdGlvbiBvbmNlIGl0IGhhcyBiZWVuCitwcm9wZXJseSBpbml0aWFsaXplZCBieSB0aGUgaW50ZXJwcmV0ZXIgaW4gdXNlLiBUaGUgY29kZSBoYXMgYmVlbiB0ZXN0ZWQKK2FuZCBydW5zIHdlbGwgb24gc2V2ZXJhbCBXaW5kb3dzIGFuZCBVbml4IHBsYXRmb3Jtcy4gPC9wPgorCis8cD4KK0Ftb25nIHRoZSBzdXBwb3J0IG1vZHVsZXMsIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgaW1wbGVtZW50IHRoZSAKKzxhIGhyZWY9c210cC5odG1sPlNNVFA8L2E+Cisoc2VuZGluZyAgZS1tYWlscyksICAKKzxhIGhyZWY9aHR0cC5odG1sPkhUVFA8L2E+CisoV1dXIGFjY2VzcykgIGFuZCAgCis8YSBocmVmPWZ0cC5odG1sPkZUUDwvYT4gIAorKHVwbG9hZGluZyAgYW5kIGRvd25sb2FkaW5nIGZpbGVzKSBjbGllbnQKK3Byb3RvY29scy4gVGhlc2UgcHJvdmlkZSBhIHZlcnkgbmF0dXJhbCBhbmQgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gdGhlCitmdW5jdGlvbmFsaXR5IGRlZmluZWQgYnkgZWFjaCBwcm90b2NvbC4gCitJbiBhZGRpdGlvbiwgeW91IHdpbGwgZmluZCB0aGF0IHRoZSAKKzxhIGhyZWY9bWltZS5odG1sPk1JTUU8L2E+IChjb21tb24gZW5jb2RpbmdzKSwgCis8YSBocmVmPXVybC5odG1sPlVSTDwvYT4gCisoYW55dGhpbmcgeW91IGNvdWxkIHBvc3NpYmxlIHdhbnQgdG8gZG8gd2l0aCBvbmUpIGFuZCAKKzxhIGhyZWY9bHRuMTIuaHRtbD5MVE4xMjwvYT4gCisoZmlsdGVycywgc2lua3MsIHNvdXJjZXMgYW5kIHB1bXBzKSBtb2R1bGVzIGNhbiBiZSB2ZXJ5IGhhbmR5LiAKKzwvcD4KKworPHA+CitUaGUgbGlicmFyeSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHNhbWUgIAorPGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnL2NvcHlyaWdodC5odG1sIj4KK3Rlcm1zIGFuZCBjb25kaXRpb25zPC9hPiBhcyB0aGUgTHVhIGxhbmd1YWdlLCB0aGUgTUlUIGxpY2Vuc2UuIFRoZSBpZGVhIGlzCit0aGF0IGlmIHlvdSBjYW4gdXNlIEx1YSBpbiBhIHByb2plY3QsIHlvdSBzaG91bGQgYWxzbyBiZSBhYmxlIHRvIHVzZSAKK0x1YVNvY2tldC4KKzwvcD4KKworPHA+CitDb3B5cmlnaHQgJmNvcHk7IDIwMDQtMjAwNyBEaWVnbyBOZWhhYi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gPGJyPgorQXV0aG9yOiA8QSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvIj5EaWVnbyBOZWhhYjwvYT4KKzwvcD4KKworPCEtLSBkb3dubG9hZCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgyIGlkPWRvd25sb2FkPkRvd25sb2FkPC9oMj4KKworPHA+CitMdWFTb2NrZXQgdmVyc2lvbiAyLjAuMiBpcyBub3cgIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQhIEl0ICBpcworY29tcGF0aWJsZSB3aXRoICBMdWEmbmJzcDs1LjEsIGFuZCBoYXMgICAgCitiZWVuIHRlc3RlZCBvbiBXaW5kb3dzJm5ic3A7WFAsIExpbnV4LCBhbmQgTWFjIE9TIFguIENoYW5jZXMKK2FyZSBpdCB3b3JrcyB3ZWxsIG9uIG1vc3QgVU5JWCBkaXN0cmlidXRpb25zIGFuZCBXaW5kb3dzIGZsYXZvcnMuCis8L3A+CisKKzxwPgorVGhlIGxpYnJhcnkgY2FuIGJlIGRvd25sb2FkZWQgaW4gc291cmNlIGNvZGUgZnJvbSB0aGUKKzxhIGhyZWY9aHR0cDovL2x1YWZvcmdlLm5ldC9wcm9qZWN0cy9sdWFzb2NrZXQvPkx1YVNvY2tldAorcHJvamVjdCBwYWdlPC9hPiBhdCBMdWFGb3JnZS4gCitCZXNpZGVzIHRoZSBmdWxsIEMgYW5kIEx1YSBzb3VyY2UgY29kZSBmb3IgdGhlIGxpYnJhcnksIHRoZSBkaXN0cmlidXRpb24KK2NvbnRhaW5zIHNldmVyYWwgZXhhbXBsZXMsIHRoaXMgdXNlcidzIG1hbnVhbCBhbmQgYmFzaWMgdGVzdCBwcm9jZWR1cmVzLgorPC9wPgorCis8cD4KK0RhbmlsbyBUdWxlciBpcyBtYWludGFpbmluZyBXaW4zMiBiaW5hcmllcyBmb3IgTHVhU29ja2V0LCB3aGljaCBhcmUgYWxzbworYXZhaWxhYmxlIGZyb20gTHVhRm9yZ2UuICBUaGVzZSBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSAKKzxhIGhyZWY9aHR0cDovL2x1YWZvcmdlLm5ldC9wcm9qZWN0cy9sdWFiaW5hcmllcz5MdWFCaW5hcmllczwvYT4sCithbHNvIGF2YWlsYWJsZSBmcm9tIEx1YUZvcmdlLiAKKzwvcD4KKworPHA+IFRha2UgYSBsb29rIGF0IHRoZSA8YQoraHJlZj1pbnN0YWxsYXRpb24uaHRtbD5pbnN0YWxsYXRpb248L2E+IHNlY3Rpb24gb2YgdGhlCittYW51YWwgdG8gZmluZCBvdXQgaG93IHRvIHByb3Blcmx5IGluc3RhbGwgdGhlIGxpYnJhcnkuCis8L3A+CisKKzwhLS0gdGhhbmtzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMiBpZD10aGFua3M+U3BlY2lhbCB0aGFua3M8L2gyPgorCis8cD4KK1Rocm91Z2hvdXQgTHVhU29ja2V0J3MgaGlzdG9yeSwgbWFueSBwZW9wbGUgZ2F2ZSBzdWdnZXN0aW9ucyB0aGF0IGhlbHBlZAoraW1wcm92ZSBpdC4gRm9yIHRoYXQsIEkgdGhhbmsgdGhlIEx1YSBjb21tdW5pdHkuIAorU3BlY2lhbCB0aGFua3MgZ28gdG8KK0RhdmlkIEJ1cmdlc3MsIHdobyBoYXMgaGVscGVkIHB1c2ggdGhlIGxpYnJhcnkgdG8gYSBuZXcgbGV2ZWwgb2YgcXVhbGl0eSBhbmQKK2Zyb20gd2hvbSBJIGhhdmUgbGVhcm5lZCBhIGxvdCBvZiBzdHVmZiB0aGF0IGRvZXNuJ3Qgc2hvdyB1cCBpbiBSRkNzLgorU3BlY2lhbCB0aGFua3MgYWxzbyB0byBDYXJsb3MgQ2Fzc2lubywgd2hvIHBsYXllZCBhIGJpZyBwYXJ0IGluIHRoZSAKK2V4dGVuc2libGUgZGVzaWduIHNlZW4gaW4gdGhlIEMgY29yZSBvZiBMdWFTb2NrZXQgMi4wLiBNaWtlIFBhbGwKK2hhcyBiZWVuIGhlbHBpbmcgYSBsb3QgdG9vISBUaGFua3MgdG8geW91IGFsbCEgCis8L3A+CisKKzwhLS0gd2hhdHNuZXcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMiBpZD1uZXc+V2hhdCdzIE5ldzwvaDI+CisKKzxwPgorMi4wLjIgaXMganVzdCBhIGJ1Zy1maXgvdXBkYXRlIHJlbGVhc2UuIAorPC9wPgorCis8dWw+Cis8bGk+IEltcHJvdmVkOiBodHRwLnJlcXVlc3QoKSBub3cgc3VwcG9ydHMgZGVwcmVjYXRlZAorSFRUUC8wLjkgc2VydmVycyAoRmxvcmlhbiBCZXJnZXIpOworPGxpPiBGaXhlZDogY291bGQgcmV0dXJuICJ0aW1lZG91dCIgaW5zdGVhZCBvZiAidGltZW91dCIgKExlbyBMZW8pOworPGxpPiBGaXhlZDogY3Jhc2ggd2hlbiByZWFkaW5nICcqYScgb24gY2xvc2VkIHNvY2tldCAoUGF1bCBEdWNrbGluKTsKKzxsaT4gRml4ZWQ6IHJldHVybiB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgd2hlbiByZWFkaW5nIGZyb20gY2xvc2VkIHNvY2tldHM7Cis8bGk+IEZpeGVkOiBjYXNlIHNlbnNpdGl2aXR5IGluIGhlYWRlcnMgb2YgbXVsdGlwYXJ0CittZXNzYWdlcyBpbiBzbXRwLm1lc3NhZ2UoKSAoR3JhaGFtIEhlbnN0cmlkZ2UpOworPGxpPiBGaXhlZCBhIGNvdXBsZSBpbnN0YW5jZXMgb2YgZXJyb3IoKSBiZWluZyBjYWxsZWQgaW5zdGVhZCBvZgorYmFzZS5lcnJvcigpLiBUaGVzZSB3b3VsZCBjYXVzZSBhbiBlcnJvciB3aGVuIGFuIGVycm9yIHdhcworcmVwb3J0ZWQgOikgIChLZXRtYXIgRGFyayk7Cis8bGk+IEZpeGVkOiB0ZXN0IHNjcmlwdCBub3cgdXNlcyBwYWlycygpIGl0ZXJhdG9yIGluc3RlYWQKK29mIHRoZSBvbGQgTHVhIHN5bnRheCAoUm9iZXJ0IERvZGllcikuCis8L3VsPgorCis8cD4KKzIuMC4xIGlzIGp1c3QgYSBidWctZml4L3VwZGF0ZSByZWxlYXNlLiAKKzwvcD4KKworPHVsPgorPGxpPiBVcGRhdGVkOiBub3cgdXNpbmcgPHR0PmNvbXBhdC01LjFyNTwvdHQ+OyAKKzxsaT4gSW1wcm92ZWQ6IDx0dD5odHRwLnJlcXVlc3Q8L3R0PiBpcyBtb3JlIHJvYnVzdCB0bworbWFsZm9ybWVkIFVSTHMgKEFkcmlhbiBTaWV0c21hKTsKKzxsaT4gSW1wcm92ZWQ6IHRoZSBzaW1wbGUgPHR0Pmh0dHAucmVxdWVzdDwvdHQ+IGludGVyZmFjZSBzZW5kcyBhCisiPHR0PkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC90dD4iCitoZWFkZXIgKFdpbGxpYW0gVHJlbmtlcik7Cis8bGk+IEltcHJvdmVkOiA8dHQ+aHR0cC5yZXF1ZXN0PC90dD4gaXMgcm9idXN0IHRvIGV2aWwKK3NlcnZlcnMgdGhhdCBzZW5kIGluYXBwcm9wcmlhdGUgMTAwLWNvbnRpbnVlIG1lc3NhZ2VzCisoRGF2aWQgQnVyZ2Vzcyk7Cis8bGk+IEZpeGVkOiA8dHQ+aHR0cC5yZXF1ZXN0PC90dD4gd2FzIHVzaW5nIHRoZSBvbGQgaG9zdCBoZWFkZXIgZHVyaW5nCityZWRpcmVjdHMgKEZsb3JpYW4gQmVyZ2VyKTsKKzxsaT4gRml4ZWQ6IHNhbXBsZSA8dHQ+dW5peC5jPC90dD4gaGFkIGZhbGxlbiB0aHJvdWdoIHRoZQorY3JhY2tzIGR1cmluZyBkZXZlbG9wbWVudCAoTWF0dGhldyBQZXJjaXZhbCk7IAorPGxpPiBGaXhlZDogZXJyb3IgY29kZSB3YXMgbm90IGJlaW5nIHByb3BhZ2F0ZWQgY29ycmVjdGx5IGluCitmdHAubHVhIChEYXZpZCBCdXJnZXNzKS4gCis8L3VsPgorCis8IS0tIG9sZCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDIgaWQ9b2xkPk9sZCBWZXJzaW9uczwvaDI+CisKKzxwPgorQWxsICBwcmV2aW91cyB2ZXJzaW9ucyAgb2YgdGhlICBMdWFTb2NrZXQgbGlicmFyeSAgY2FuIGJlICBkb3dubG9hZGVkIDxhCitocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3Byb2Zlc3Npb25hbC9sdWFzb2NrZXQvb2xkIj4KK2hlcmU8L2E+LiBBbHRob3VnaCB0aGVzZSAgdmVyc2lvbnMgYXJlICBubyBsb25nZXIgIHN1cHBvcnRlZCwgdGhleSAgYXJlCitzdGlsbCBhdmFpbGFibGUgZm9yIHRob3NlIHRoYXQgaGF2ZSBjb21wYXRpYmlsaXR5IGlzc3Vlcy4gCis8L3A+CisKKzwhLS0gZm9vdGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9Zm9vdGVyPgorPGhyPgorPGNlbnRlcj4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3dubG9hZCI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+Cis8L3A+Cis8cD4KKzxzbWFsbD4KK0xhc3QgbW9kaWZpZWQgYnkgRGllZ28gTmVoYWIgb24gPGJyPgorV2VkIE9jdCAzIDAyOjA3OjU5IEJSVCAyMDA3Cis8L3NtYWxsPgorPC9wPgorPC9jZW50ZXI+Cis8L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2RvYy9pbnN0YWxsYXRpb24uaHRtbCBiL2x1YXNvY2tldC0yLjAuMi9kb2MvaW5zdGFsbGF0aW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4OGY0YQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9kb2MvaW5zdGFsbGF0aW9uLmh0bWwKQEAgLTAsMCArMSwxNjMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9Ikx1YVNvY2tldDogSW50cm9kdWN0aW9uIHRvIHRoZSBjb3JlIj4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJMdWEsIEx1YVNvY2tldCwgVENQLCBVRFAsIE5ldHdvcmssIFN1cHBvcnQsCitJbnN0YWxsYXRpb24iPiAKKzx0aXRsZT5MdWFTb2NrZXQ6IEluc3RhbGxhdGlvbjwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InJlZmVyZW5jZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+CisKKzwhLS0gaGVhZGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9aGVhZGVyPgorPGhyPgorPGNlbnRlcj4KKzx0YWJsZSBzdW1tYXJ5PSJMdWFTb2NrZXQgbG9nbyI+Cis8dHI+PHRkIGFsaWduPWNlbnRlcj48YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPgorPGltZyB3aWR0aD0xMjggaGVpZ2h0PTEyOCBib3JkZXI9MCBhbHQ9Ikx1YVNvY2tldCIgc3JjPSJsdWFzb2NrZXQucG5nIj4KKzwvYT48L3RkPjwvdHI+Cis8dHI+PHRkIGFsaWduPWNlbnRlciB2YWxpZ249dG9wPk5ldHdvcmsgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorPC90ZD48L3RyPgorPC90YWJsZT4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3dubG9hZCI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+IAorPC9wPgorPC9jZW50ZXI+Cis8aHI+Cis8L2Rpdj4KKworPCEtLSBpbnN0YWxsYXRpb24gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMj5JbnN0YWxsYXRpb248L2gyPgorCis8cD4gTHVhU29ja2V0IDIuMC4yIHVzZXMgdGhlIG5ldyBwYWNrYWdlIHN5c3RlbSBmb3IgTHVhIDUuMS4gIAorQWxsIEx1YSBsaWJyYXJ5IGRldmVsb3BlcnMgYXJlIGVuY291cmFnZWQgdG8gdXBkYXRlIHRoZWlyIGxpYnJhcmllcyBzbyB0aGF0CithbGwgbGlicmFyaWVzIGNhbiBjb2V4aXN0IHBlYWNlZnVsbHkgYW5kIHVzZXJzIGNhbiBiZW5lZml0IGZyb20gdGhlCitzdGFuZGFyZGl6YXRpb24gYW5kIGZsZXhpYmlsaXR5IG9mIHRoZSBzdGFuZGFyZC4KKzwvcD4KKworPHA+IAorVGhvc2Ugc3R1Y2sgd2l0aCBMdWEgNS4wIHdpbGwgbmVlZCB0aGUgCis8YSBocmVmPWh0dHA6Ly93d3cua2VwbGVycHJvamVjdC5vcmcvY29tcGF0Lz5jb21wYXQtNS4xPC9hPiAKK21vZHVsZS4gSXQgaXMgbWFpbnRhaW5lZCBieSAKKzxhIGhyZWY9aHR0cDovL3d3dy5rZXBsZXJwcm9qZWN0Lm9yZy8+VGhlIEtlcGxlcgorUHJvamVjdDwvYT4ncyB0ZWFtLCBhbmQgaW1wbGVtZW50cyB0aGUgTHVhIDUuMSBwYWNrYWdlIHByb3Bvc2FsIAorb24gdG9wIG9mIEx1YSA1LjAuIDwvcD4KKworPHA+IEhlcmUgd2Ugd2lsbCBvbmx5IGRlc2NyaWJlIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24uCitJZiB0aGUgc3RhbmRhcmQgZG9lc24ndCBtZWV0IHlvdXIgbmVlZHMsIHdlIHJlZmVyIHlvdSB0byB0aGUKK0x1YSBkaXNjdXNzaW9uIGxpc3QsIHdoZXJlIGFueSBxdWVzdGlvbiBhYm91dCB0aGUgcGFja2FnZQorc2NoZW1lIHdpbGwgbGlrZWx5IGFscmVhZHkgaGF2ZSBiZWVuIGFuc3dlcmVkLiAgPC9wPgorCis8aDM+RGlyZWN0b3J5IHN0cnVjdHVyZTwvaDM+CisKKzxwPiBPbiBVbml4IHN5c3RlbXMsIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24gdXNlcyB0d28gYmFzZQorZGlyZWN0b3JpZXMsIG9uZSBmb3Igc3lzdGVtIGRlcGVuZGVudCBmaWxlcywgYW5kIGFub3RoZXIgZm9yIHN5c3RlbQoraW5kZXBlbmRlbnQgZmlsZXMuIExldCdzIGNhbGwgdGhlc2UgZGlyZWN0b3JpZXMgPHR0PiZsdDtDRElSJmd0OzwvdHQ+IAorYW5kIDx0dD4mbHQ7TERJUiZndDs8L3R0PiwgcmVzcGVjdGl2ZWx5LiAKK0ZvciBpbnN0YW5jZSwgaW4gbXkgbGFwdG9wLCBJIHVzZSAnPHR0Pi91c3IvbG9jYWwvbGliL2x1YS81LjA8L3R0PicgZm9yCis8dHQ+Jmx0O0NESVImZ3Q7PC90dD4gYW5kICc8dHQ+L3Vzci9sb2NhbC9zaGFyZS9sdWEvNS4wPC90dD4nIGZvcgorPHR0PiZsdDtMRElSJmd0OzwvdHQ+LiBPbiBXaW5kb3dzLCBzb21ldGltZXMgb25seSBvbmUgZGlyZWN0b3J5IGlzIHVzZWQsIHNheQorJzx0dD5jOlxwcm9ncmFtIGZpbGVzXGx1YVw1LjA8L3R0PicuIEhlcmUgaXMgdGhlIHN0YW5kYXJkIEx1YVNvY2tldCAKK2Rpc3RyaWJ1dGlvbiBkaXJlY3Rvcnkgc3RydWN0dXJlOjwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorJmx0O0xESVImZ3Q7L2NvbXBhdC01LjEubHVhCismbHQ7TERJUiZndDsvbHRuMTIubHVhCismbHQ7TERJUiZndDsvc29ja2V0Lmx1YQorJmx0O0NESVImZ3Q7L3NvY2tldC9jb3JlLmRsbAorJmx0O0xESVImZ3Q7L3NvY2tldC9odHRwLmx1YQorJmx0O0xESVImZ3Q7L3NvY2tldC90cC5sdWEKKyZsdDtMRElSJmd0Oy9zb2NrZXQvZnRwLmx1YQorJmx0O0xESVImZ3Q7L3NvY2tldC9zbXRwLmx1YQorJmx0O0xESVImZ3Q7L3NvY2tldC91cmwubHVhCismbHQ7TERJUiZndDsvbWltZS5sdWEKKyZsdDtDRElSJmd0Oy9taW1lL2NvcmUuZGxsCis8L3ByZT4KKworPHA+IE5hdHVyYWxseSwgb24gVW5peCBzeXN0ZW1zLCA8dHQ+Y29yZS5kbGw8L3R0Pgord291bGQgYmUgcmVwbGFjZWQgYnkgPHR0PmNvcmUuc288L3R0Pi4gIAorPC9wPgorCis8cD4gSW4gb3JkZXIgZm9yIHRoZSBpbnRlcnByZXRlciB0byBmaW5kIGFsbCBMdWFTb2NrZXQgY29tcG9uZW50cywgdGhyZWUKK2Vudmlyb25tZW50IHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC4gVGhlIGZpcnN0IGVudmlyb25tZW50IHZhcmlhYmxlIHRlbGxzCit0aGUgaW50ZXJwcmV0ZXIgdG8gbG9hZCB0aGUgPHR0PmNvbXBhdC01LjEubHVhPC90dD4gbW9kdWxlIGF0IHN0YXJ0dXA6IDwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorTFVBX0lOSVQ9QCZsdDtMRElSJmd0Oy9jb21wYXQtNS4xLmx1YQorPC9wcmU+CisKKzxwPgorVGhpcyBpcyBvbmx5IG5lZWQgZm9yIEx1YSZuYnNwOzUuMCEgTHVhJm5ic3A7NS4xIGNvbWVzIHdpdGgKK3RoZSBwYWNrYWdlIHN5c3RlbSBidWlsdCBpbiwgb2YgY291cnNlLiAKKzwvcD4KKworPHA+CitUaGUgb3RoZXIgdHdvIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbnN0cnVjdCB0aGUgY29tcGF0aWJpbGl0eSBtb2R1bGUgdG8KK2xvb2sgZm9yIGR5bmFtaWMgbGlicmFyaWVzIGFuZCBleHRlbnNpb24gbW9kdWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUKK2RpcmVjdG9yaWVzIGFuZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBleHRlbnNpb25zLgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CitMVUFfUEFUSD0mbHQ7TERJUiZndDsvPy5sdWE7Py5sdWEKK0xVQV9DUEFUSD0mbHQ7Q0RJUiZndDsvPy5kbGw7Py5kbGwKKzwvcHJlPgorCis8cD4gQWdhaW4sIG5hdHVyYWxseSwgb24gVW5peCBzeXN0ZW1zIHRoZSBzaGFyZWQgbGlicmFyeSBleHRlbnNpb24gd291bGQgYmUKKzx0dD4uc288L3R0PiBpbnN0ZWFkIG9mIDx0dD4uZGxsPC90dD4uPC9wPgorCis8aDM+VXNpbmcgTHVhU29ja2V0PC9oMz4KKworPHA+IFdpdGggdGhlIGFib3ZlIHNldHVwLCBhbmQgYW4gaW50ZXJwcmV0ZXIgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LAoraXQgc2hvdWxkIGJlIGVhc3kgdG8gdXNlIEx1YVNvY2tldC4gSnVzdCBmaXJlIHRoZSBpbnRlcnByZXRlciBhbmQgdXNlIHRoZQorPHR0PnJlcXVpcmU8L3R0PiBmdW5jdGlvbiB0byBnYWluIGFjY2VzcyB0byB3aGF0ZXZlciBtb2R1bGUgeW91IG5lZWQ6PC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CitMdWEgNS4xLjIgIENvcHlyaWdodCAoQykgMTk5NC0yMDA3IEx1YS5vcmcsIFBVQy1SaW8KKyZndDsgc29ja2V0ID0gcmVxdWlyZSgic29ja2V0IikKKyZndDsgcHJpbnQoc29ja2V0Ll9WRVJTSU9OKQorLS0mZ3Q7IEx1YVNvY2tldCAyLjAuMgorPC9wcmU+CisKKzxwPiBFYWNoIG1vZHVsZSBsb2FkcyB0aGVpciBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseSwgc28geW91IG9ubHkgbmVlZCB0bworbG9hZCB0aGUgbW9kdWxlcyB5b3UgZGlyZWN0bHkgZGVwZW5kIHVwb246IDwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorTHVhIDUuMS4yICBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwNyBMdWEub3JnLCBQVUMtUmlvCismZ3Q7IGh0dHAgPSByZXF1aXJlKCJzb2NrZXQuaHR0cCIpCismZ3Q7IHByaW50KGh0dHAucmVxdWVzdCgiaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35kaWVnby9wcm9mZXNzaW9uYWwvbHVhc29ja2V0IikpCistLSZndDsgaG9tZXBhZ2UgZ2V0cyBkdW1wZWQgdG8gdGVybWluYWwKKzwvcHJlPgorCis8IS0tIGZvb3RlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWZvb3Rlcj4KKzxocj4KKzxjZW50ZXI+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93biI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+Cis8L3A+Cis8cD4KKzxzbWFsbD4KK0xhc3QgbW9kaWZpZWQgYnkgRGllZ28gTmVoYWIgb24gPGJyPgorVGh1IEFwciAyMCAwMDoyNTozMCBFRFQgMjAwNgorPC9zbWFsbD4KKzwvcD4KKzwvY2VudGVyPgorPC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2MvaW50cm9kdWN0aW9uLmh0bWwgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL2ludHJvZHVjdGlvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjYzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL2ludHJvZHVjdGlvbi5odG1sCkBAIC0wLDAgKzEsMzMzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIAorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJMdWFTb2NrZXQ6IEludHJvZHVjdGlvbiB0byB0aGUgY29yZSI+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iTHVhLCBMdWFTb2NrZXQsIFRDUCwgVURQLCBOZXR3b3JrLAorTGlicmFyeSwgU3VwcG9ydCI+IAorPHRpdGxlPkx1YVNvY2tldDogSW50cm9kdWN0aW9uIHRvIHRoZSBjb3JlPC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0icmVmZXJlbmNlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorCis8Ym9keT4KKworPCEtLSBoZWFkZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1oZWFkZXI+Cis8aHI+Cis8Y2VudGVyPgorPHRhYmxlIHN1bW1hcnk9Ikx1YVNvY2tldCBsb2dvIj4KKzx0cj48dGQgYWxpZ249Y2VudGVyPjxhIGhyZWY9Imh0dHA6Ly93d3cubHVhLm9yZyI+Cis8aW1nIHdpZHRoPTEyOCBoZWlnaHQ9MTI4IGJvcmRlcj0wIGFsdD0iTHVhU29ja2V0IiBzcmM9Imx1YXNvY2tldC5wbmciPgorPC9hPjwvdGQ+PC90cj4KKzx0cj48dGQgYWxpZ249Y2VudGVyIHZhbGlnbj10b3A+TmV0d29yayBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd25sb2FkIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4gCis8L3A+Cis8L2NlbnRlcj4KKzxocj4KKzwvZGl2PgorCis8IS0tIGludHJvZHVjdGlvbiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDI+SW50cm9kdWN0aW9uPC9oMj4KKworPHA+CitMdWFTb2NrZXQgIGlzIGEgIDxhIGhyZWY9Imh0dHA6Ly93d3cubHVhLm9yZyI+THVhPC9hPiAgZXh0ZW5zaW9uIGxpYnJhcnkKK3RoYXQgaXMgY29tcG9zZWQgYnkgdHdvIHBhcnRzOiBhIEMgY29yZSB0aGF0IHByb3ZpZGVzICBzdXBwb3J0IGZvciB0aGUgVENQCithbmQgVURQIHRyYW5zcG9ydCBsYXllcnMsIGFuZCBhIHNldCBvZiBMdWEgbW9kdWxlcyB0aGF0IGFkZCBzdXBwb3J0IGZvcgordGhlIFNNVFAgKHNlbmRpbmcgIGUtbWFpbHMpLCAgSFRUUCAgKFdXVyBhY2Nlc3MpICBhbmQgIEZUUCAgKHVwbG9hZGluZyAgYW5kCitkb3dubG9hZGluZyBmaWxlcykgcHJvdG9jb2xzIGFuZCBvdGhlciBmdW5jdGlvbmFsaXR5IGNvbW1vbmx5IG5lZWRlZCBieQorYXBwbGljYXRpb25zIHRoYXQgZGVhbCB3aXRoIHRoZSBJbnRlcm5ldC4gVGhpcyBpbnRyb2R1Y3Rpb24gaXMgYWJvdXQgdGhlIEMKK2NvcmUuCis8L3A+CisKKzxwPgorQ29tbXVuaWNhdGlvbiBpbiBMdWFTb2NrZXQgaXMgcGVyZm9ybWVkIHZpYSBJL08gb2JqZWN0cy4gVGhlc2UgY2FuCityZXByZXNlbnQgZGlmZmVyZW50IG5ldHdvcmsgZG9tYWlucy4gQ3VycmVudGx5LCBzdXBwb3J0IGlzIHByb3ZpZGVkIGZvciBUQ1AKK2FuZCBVRFAsIGJ1dCBub3RoaW5nIHByZXZlbnRzIG90aGVyIGRldmVsb3BlcnMgZnJvbSBpbXBsZW1lbnRpbmcgU1NMLCBMb2NhbAorRG9tYWluLCBQaXBlcywgRmlsZSBEZXNjcmlwdG9ycyBldGMuIEkvTyBvYmplY3RzIHByb3ZpZGUgYSBzdGFuZGFyZAoraW50ZXJmYWNlIHRvIEkvTyBhY3Jvc3MgZGlmZmVyZW50IGRvbWFpbnMgYW5kIG9wZXJhdGluZyBzeXN0ZW1zLgorPC9wPgorCis8cD4KK1RoZSBBUEkgZGVzaWduIGhhZCB0d28gZ29hbHMgaW4gbWluZC4gRmlyc3QsIHVzZXJzCitleHBlcmllbmNlZCB3aXRoIHRoZSBDIEFQSSB0byBzb2NrZXRzIHNob3VsZCBmZWVsIGNvbWZvcnRhYmxlIHVzaW5nIEx1YVNvY2tldC4KK1NlY29uZCwgdGhlIHNpbXBsaWNpdHkgYW5kIHRoZSBmZWVsIG9mIHRoZSBMdWEgbGFuZ3VhZ2Ugc2hvdWxkIGJlCitwcmVzZXJ2ZWQuIFRvIGFjaGlldmUgdGhlc2UgZ29hbHMsIHRoZSBMdWFTb2NrZXQgQVBJIGtlZXBzIHRoZSBmdW5jdGlvbiBuYW1lcyBhbmQgc2VtYW50aWNzIHRoZSBDIEFQSSB3aGVuZXZlciBwb3NzaWJsZSwgYnV0IHRoZWlyIHVzYWdlIGluIEx1YSBoYXMgYmVlbiBncmVhdGx5IHNpbXBsaWZpZWQuICAKKzwvcD4KKworCis8cD4KK09uZSBvZiB0aGUgc2ltcGxpZmljYXRpb25zIGlzIHRoZSByZWNlaXZlIHBhdHRlcm4gY2FwYWJpbGl0eS4KK0FwcGxpY2F0aW9ucyBjYW4gcmVhZCAgZGF0YSBmcm9tIHN0cmVhbSBkb21haW5zIChzdWNoIGFzIFRDUCkgCitsaW5lICBieSBsaW5lLCBibG9jayAgYnkgYmxvY2ssIG9yIHVudGlsIHRoZSBjb25uZWN0aW9uICBpcyBjbG9zZWQuCitBbGwgSS9PIHJlYWRzIGFyZSBidWZmZXJlZCBhbmQgdGhlIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2VzIGJldHdlZW4KK2RpZmZlcmVudCByZWNlaXZlIHBhdHRlcm5zIGFyZSBuZWdsaWdpYmxlLiAgCis8L3A+CisKKzxwPgorQW5vdGhlciBhZHZhbnRhZ2UgaXMgdGhlIGZsZXhpYmxlIHRpbWVvdXQgY29udHJvbAorbWVjaGFuaXNtLiBBcyBpbiBDLCBhbGwgSS9PICBvcGVyYXRpb25zIGFyZSBibG9ja2luZyBieSBkZWZhdWx0LiBGb3IKK2V4YW1wbGUsIHRoZSAgPGEgaHJlZj10Y3AuaHRtbCNzZW5kPjx0dD5zZW5kPC90dD48L2E+LCAgCis8YSBocmVmPXRjcC5odG1sI3JlY2VpdmU+PHR0PnJlY2VpdmU8L3R0PjwvYT4gYW5kIAorPGEgaHJlZj10Y3AuaHRtbCNhY2NlcHQ+PHR0PmFjY2VwdDwvdHQ+PC9hPiBtZXRob2RzCitvZiB0aGUgVENQIGRvbWFpbiB3aWxsIGJsb2NrICB0aGUgIGNhbGxlciBhcHBsaWNhdGlvbiAgdW50aWwKK3RoZSBvcGVyYXRpb24gIGlzIGNvbXBsZXRlZCAoaWYgZXZlciEpLiBIb3dldmVyLCB3aXRoIGEgY2FsbCB0byB0aGUKKzxhIGhyZWY9dGNwLmh0bWwjc2V0dGltZW91dD48dHQ+c2V0dGltZW91dDwvdHQ+PC9hPgorbWV0aG9kLCBhbiBhcHBsaWNhdGlvbiAgY2FuIHNwZWNpZnkgdXBwZXIgbGltaXRzIG9uCit0aGUgdGltZSBpdCBjYW4gIGJlIGJsb2NrZWQgYnkgTHVhU29ja2V0ICh0aGUgIjx0dD50b3RhbDwvdHQ+IiB0aW1lb3V0KSwgb24KK3RoZSB0aW1lICBMdWFTb2NrZXQgY2FuICBpbnRlcm5hbGx5IGJlICBibG9ja2VkIGJ5ICBhbnkgT1MgY2FsbCAodGhlCisiPHR0PmJsb2NrPC90dD4iIHRpbWVvdXQpIG9yIGEgY29tYmluYXRpb24gb2YgdGhlICB0d28uICBFYWNoIEx1YVNvY2tldAorY2FsbCBtaWdodCBwZXJmb3JtIHNldmVyYWwgT1MgY2FsbHMsIHNvIHRoYXQgdGhlIHR3byB0aW1lb3V0IHZhbHVlcyBhcmUKKzxlbT5ub3Q8L2VtPiBlcXVpdmFsZW50LiAgCis8L3A+CisKKzxwPgorRmluYWxseSwgIHRoZSBob3N0ICBuYW1lICByZXNvbHV0aW9uICAgaXMgIHRyYW5zcGFyZW50LCAgbWVhbmluZyAgdGhhdCAgbW9zdAorZnVuY3Rpb25zIGFuZCBtZXRob2RzIGFjY2VwdCBib3RoICBJUCBhZGRyZXNzZXMgYW5kIGhvc3QgbmFtZXMuIEluICBjYXNlIGEKK2hvc3QgbmFtZSBpcyBnaXZlbiwgdGhlICBsaWJyYXJ5ICBxdWVyaWVzIHRoZSAgc3lzdGVtJ3MgIHJlc29sdmVyICBhbmQKK3RyaWVzICB0aGUgbWFpbiBJUCBhZGRyZXNzIHJldHVybmVkLiBOb3RlIHRoYXQgZGlyZWN0IHVzZSBvZiBJUCBhZGRyZXNzZXMKK2lzIG1vcmUgZWZmaWNpZW50LCBvZiBjb3Vyc2UuIFRoZSAKKzxhIGhyZWY9ZG5zLmh0bWwjdG9pcD48dHQ+dG9pcDwvdHQ+PC9hPiAKK2FuZCA8YSBocmVmPWRucy5odG1sI3RvaG9zdG5hbWU+PHR0PnRvaG9zdG5hbWU8L3R0PjwvYT4gCitmdW5jdGlvbnMgZnJvbSB0aGUgRE5TIG1vZHVsZSBhcmUgcHJvdmlkZWQgdG8gY29udmVydCBiZXR3ZWVuIGhvc3QgbmFtZXMgYW5kIElQIGFkZHJlc3Nlcy4gCis8L3A+CisKKzxwPgorVG9nZXRoZXIsIHRoZXNlIGNoYW5nZXMgbWFrZSBuZXR3b3JrIHByb2dyYW1taW5nIGluIEx1YVNvY2tldCBtdWNoIHNpbXBsZXIKK3RoYW4gaXQgaXMgaW4gQywgYXMgdGhlIGZvbGxvd2luZyBzZWN0aW9ucyB3aWxsIHNob3cuCis8L3A+CisKKzwhLS0gdGNwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMyBpZD10Y3A+VENQPC9oMz4KKworPHA+CitUQ1AgKFRyYW5zZmVyICBDb250cm9sIFByb3RvY29sKSBpcyAgcmVsaWFibGUgc3RyZWFtIHByb3RvY29sLiAgSW4gb3RoZXIKK3dvcmRzLCBhcHBsaWNhdGlvbnMgY29tbXVuaWNhdGluZyB0aHJvdWdoIFRDUCAgY2FuIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBhcworYW4gIGVycm9yIGZyZWUgIHN0cmVhbSAgb2YgIGJ5dGVzLiBEYXRhICBpcyAgc3BsaXQgIGluIG9uZSAgZW5kICBhbmQKK3JlYXNzZW1ibGVkIHRyYW5zcGFyZW50bHkgb24gIHRoZSBvdGhlciBlbmQuIFRoZXJlIGFyZSAgbm8gYm91bmRhcmllcyBpbgordGhlICBkYXRhIHRyYW5zZmVycy4gIFRoZSBsaWJyYXJ5ICBhbGxvd3MgdXNlcnMgIHRvIHJlYWQgIGRhdGEgZnJvbSAgdGhlCitzb2NrZXRzIGluICBzZXZlcmFsIGRpZmZlcmVudCBncmFudWxhcml0aWVzOiBwYXR0ZXJucyAgYXJlIGF2YWlsYWJsZSBmb3IKK2xpbmVzLCBhcmJpdHJhcnkgc2l6ZWQgYmxvY2tzICBvciAicmVhZCB1cCB0byBjb25uZWN0aW9uIGNsb3NlZCIsIGFsbCB3aXRoCitnb29kIHBlcmZvcm1hbmNlLiAKKzwvcD4KKworPHA+CitUaGUgbGlicmFyeSBkaXN0aW5ndWlzaGVzICB0aHJlZSB0eXBlcyBvZiBUQ1Agc29ja2V0czogIDxlbT5tYXN0ZXI8L2VtPiwgCis8ZW0+Y2xpZW50PC9lbT4gYW5kIDxlbT5zZXJ2ZXI8L2VtPiBzb2NrZXRzLiAKKzwvcD4KKworPHA+CitNYXN0ZXIgc29ja2V0cyBhcmUgbmV3bHkgY3JlYXRlZCBUQ1Agc29ja2V0cyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24KKzxhIGhyZWY9dGNwLmh0bWwjdGNwPjx0dD5zb2NrZXQudGNwPC90dD48L2E+LiBBIG1hc3RlciBzb2NrZXQgaXMgCit0cmFuc2Zvcm1lZCBpbnRvIGEgc2VydmVyIHNvY2tldAorYWZ0ZXIgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgPGVtPmxvY2FsPC9lbT4gYWRkcmVzcyBieSBhIGNhbGwgdG8gdGhlCis8YSBocmVmPXRjcC5odG1sI2JpbmQ+PHR0PmJpbmQ8L3R0PjwvYT4gbWV0aG9kIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byB0aGUgCis8YSBocmVmPXRjcC5odG1sI2xpc3Rlbj48dHQ+bGlzdGVuPC90dD48L2E+LiBDb252ZXJzZWx5LCBhIG1hc3RlciBzb2NrZXQgCitjYW4gYmUgY2hhbmdlZCBpbnRvIGEgY2xpZW50IHNvY2tldCB3aXRoIHRoZSBtZXRob2QgCis8YSBocmVmPXRjcC5odG1sI2Nvbm5lY3Q+PHR0PmNvbm5lY3Q8L3R0PjwvYT4sIAord2hpY2ggYXNzb2NpYXRlcyBpdCB3aXRoIGEgPGVtPnJlbW90ZTwvZW0+IGFkZHJlc3MuIAorPC9wPgorCis8cD4KK09uIHNlcnZlciBzb2NrZXRzLCBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGUgCis8YSBocmVmPXRjcC5odG1sI2FjY2VwdD48dHQ+YWNjZXB0PC90dD48L2E+IG1ldGhvZAordG8gd2FpdCBmb3IgYSBjbGllbnQgY29ubmVjdGlvbi4gT25jZSBhICBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhCitjbGllbnQgc29ja2V0IG9iamVjdCAgaXMgIHJldHVybmVkIHJlcHJlc2VudGluZyAgdGhpcyAgY29ubmVjdGlvbi4gIFRoZQorb3RoZXIgbWV0aG9kcyBhdmFpbGFibGUgICBmb3IgICBzZXJ2ZXIgICBzb2NrZXQgIG9iamVjdHMgICBhcmUKKzxhIGhyZWY9dGNwLmh0bWwjZ2V0c29ja25hbWU+PHR0PmdldHNvY2tuYW1lPC90dD48L2E+LCAgCis8YSBocmVmPXRjcC5odG1sI3NldG9wdGlvbj48dHQ+c2V0b3B0aW9uPC90dD48L2E+LAorPGEgaHJlZj10Y3AuaHRtbCNzZXR0aW1lb3V0Pjx0dD5zZXR0aW1lb3V0PC90dD48L2E+LCBhbmQgCis8YSBocmVmPXRjcC5odG1sI2Nsb3NlPjx0dD5jbG9zZTwvdHQ+PC9hPi4gCis8L3A+CisKKzxwPgorQ2xpZW50IHNvY2tldHMgYXJlICB1c2VkIHRvIGV4Y2hhbmdlIGRhdGEgYmV0d2VlbiAgdHdvIGFwcGxpY2F0aW9ucyBvdmVyCit0aGUgSW50ZXJuZXQuIEFwcGxpY2F0aW9ucyBjYW4gY2FsbCB0aGUgIG1ldGhvZHMgCis8YSBocmVmPXRjcC5odG1sI3NlbmQ+PHR0PnNlbmQ8L3R0PjwvYT4gYW5kCis8YSBocmVmPXRjcC5odG1sI3JlY2VpdmU+PHR0PnJlY2VpdmU8L3R0PjwvYT4gCit0byBzZW5kIGFuZCAgcmVjZWl2ZSBkYXRhLiAgVGhlIG90aGVyIG1ldGhvZHMKK2F2YWlsYWJsZSBmb3IgIGNsaWVudCBzb2NrZXQgb2JqZWN0cyBhcmUgCis8YSBocmVmPXRjcC5odG1sI2dldHNvY2tuYW1lPjx0dD5nZXRzb2NrbmFtZTwvdHQ+PC9hPiwKKzxhIGhyZWY9dGNwLmh0bWwjZ2V0cGVlcm5hbWU+PHR0PmdldHBlZXJuYW1lPC90dD48L2E+LCAKKzxhIGhyZWY9dGNwLmh0bWwjc2V0b3B0aW9uPjx0dD5zZXRvcHRpb248L3R0PjwvYT4sCis8YSBocmVmPXRjcC5odG1sI3NldHRpbWVvdXQ+PHR0PnNldHRpbWVvdXQ8L3R0PjwvYT4sCis8YSBocmVmPXRjcC5odG1sI3NodXRkb3duPjx0dD5zaHV0ZG93bjwvdHQ+PC9hPiwgYW5kCis8YSBocmVmPXRjcC5odG1sI2Nsb3NlPjx0dD5jbG9zZTwvdHQ+PC9hPi4KKzwvcD4KKworPHA+CitFeGFtcGxlOgorPC9wPgorPGJsb2NrcXVvdGU+Cis8cD4KK0Egc2ltcGxlIGVjaG8gc2VydmVyLCB1c2luZyBMdWFTb2NrZXQuIFRoZSBwcm9ncmFtIGJpbmRzIHRvIGFuIGVwaGVtZXJhbAorcG9ydCAob25lIHRoYXQgaXMgY2hvc2VuIGJ5IHRoZSAgb3BlcmF0aW5nIHN5c3RlbSkgb24gdGhlIGxvY2FsIGhvc3QgYW5kCithd2FpdHMgY2xpZW50IGNvbm5lY3Rpb25zIG9uIHRoYXQgcG9ydC4gV2hlbiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsCit0aGUgcHJvZ3JhbSByZWFkcyBhIGxpbmUgZnJvbSB0aGUgIHJlbW90ZSBlbmQgYW5kIHNlbmRzIGl0IGJhY2ssIGNsb3NpbmcKK3RoZSAgY29ubmVjdGlvbiBpbW1lZGlhdGVseS4gWW91ICBjYW4gIHRlc3QgaXQgIHVzaW5nIHRoZSAgdGVsbmV0Citwcm9ncmFtLiAKKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorLS0gbG9hZCBuYW1lc3BhY2UKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCistLSBjcmVhdGUgYSBUQ1Agc29ja2V0IGFuZCBiaW5kIGl0IHRvIHRoZSBsb2NhbCBob3N0LCBhdCBhbnkgcG9ydAorbG9jYWwgc2VydmVyID0gYXNzZXJ0KHNvY2tldC5iaW5kKCIqIiwgMCkpCistLSBmaW5kIG91dCB3aGljaCBwb3J0IHRoZSBPUyBjaG9zZSBmb3IgdXMKK2xvY2FsIGlwLCBwb3J0ID0gc2VydmVyOmdldHNvY2tuYW1lKCkKKy0tIHByaW50IGEgbWVzc2FnZSBpbmZvcm1pbmcgd2hhdCdzIHVwCitwcmludCgiUGxlYXNlIHRlbG5ldCB0byBsb2NhbGhvc3Qgb24gcG9ydCAiIC4uIHBvcnQpCitwcmludCgiQWZ0ZXIgY29ubmVjdGluZywgeW91IGhhdmUgMTBzIHRvIGVudGVyIGEgbGluZSB0byBiZSBlY2hvZWQiKQorLS0gbG9vcCBmb3JldmVyIHdhaXRpbmcgZm9yIGNsaWVudHMKK3doaWxlIDEgZG8KKyAgLS0gd2FpdCBmb3IgYSBjb25uZWN0aW9uIGZyb20gYW55IGNsaWVudAorICBsb2NhbCBjbGllbnQgPSBzZXJ2ZXI6YWNjZXB0KCkKKyAgLS0gbWFrZSBzdXJlIHdlIGRvbid0IGJsb2NrIHdhaXRpbmcgZm9yIHRoaXMgY2xpZW50J3MgbGluZQorICBjbGllbnQ6c2V0dGltZW91dCgxMCkKKyAgLS0gcmVjZWl2ZSB0aGUgbGluZQorICBsb2NhbCBsaW5lLCBlcnIgPSBjbGllbnQ6cmVjZWl2ZSgpCisgIC0tIGlmIHRoZXJlIHdhcyBubyBlcnJvciwgc2VuZCBpdCBiYWNrIHRvIHRoZSBjbGllbnQKKyAgaWYgbm90IGVyciB0aGVuIGNsaWVudDpzZW5kKGxpbmUgLi4gIlxuIikgZW5kCisgIC0tIGRvbmUgd2l0aCBjbGllbnQsIGNsb3NlIHRoZSBvYmplY3QKKyAgY2xpZW50OmNsb3NlKCkKK2VuZAorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzwhLS0gdWRwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMyBpZD11ZHA+VURQPC9oMz4KKworPHA+CitVRFAgKFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wpICBpcyBhICBub24tcmVsaWFibGUgZGF0YWdyYW0gIHByb3RvY29sLiBJbgorb3RoZXIgIHdvcmRzLCBhcHBsaWNhdGlvbnMgIGNvbW11bmljYXRpbmcgdGhyb3VnaCAgVURQIHNlbmQgIGFuZCByZWNlaXZlCitkYXRhIGFzIGluZGVwZW5kZW50IGJsb2Nrcywgd2hpY2ggYXJlICBub3QgZ3VhcmFudGVlZCB0byByZWFjaCB0aGUgb3RoZXIKK2VuZC4gRXZlbiB3aGVuIHRoZXkgIGRvIHJlYWNoIHRoZSBvdGhlciBlbmQsIHRoZXkgYXJlICBub3QgZ3VhcmFudGVlZCB0byBiZQorZXJyb3IgZnJlZS4gRGF0YSAgdHJhbnNmZXJzIGFyZSBhdG9taWMsIG9uZSBkYXRhZ3JhbSBhdCAgYSB0aW1lLiBSZWFkaW5nCitvbmx5ICBwYXJ0IG9mICBhICBkYXRhZ3JhbSBkaXNjYXJkcyAgdGhlICByZXN0LCBzbyAgdGhhdCAgdGhlIGZvbGxvd2luZyByZWFkCitvcGVyYXRpb24gIHdpbGwgIGFjdCAgb24gIHRoZSAgbmV4dCAgZGF0YWdyYW0uICBUaGUgIGFkdmFudGFnZXMgIGFyZSAgaW4KK3NpbXBsaWNpdHkgKG5vIGNvbm5lY3Rpb24gIHNldHVwKSBhbmQgcGVyZm9ybWFuY2UgKG5vICBlcnJvciBjaGVja2luZyBvcgorZXJyb3IgY29ycmVjdGlvbikuIAorPC9wPgorCis8cD4KK05vdGUgdGhhdCBhbHRob3VnaCBubyBndWFyYW50ZWVzIGFyZSBtYWRlLCB0aGVzZSBkYXlzCituZXR3b3JrcyBhcmUgc28gZ29vZCB0aGF0LCB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgZmV3IGVycm9ycyAKK2hhcHBlbiBpbiBwcmFjdGljZS4KKzwvcD4KKworPHA+CitBbiBVRFAgc29ja2V0IG9iamVjdCBpcyAgY3JlYXRlZCBieSB0aGUgCis8YSBocmVmPXVkcC5odG1sI3VkcD48dHQ+c29ja2V0LnVkcDwvdHQ+PC9hPiBmdW5jdGlvbi4gVURQCitzb2NrZXRzICBkbyAgIG5vdCAgbmVlZCAgIHRvICBiZSAgY29ubmVjdGVkICAgYmVmb3JlICB1c2UuICAgVGhlICBtZXRob2QKKzxhIGhyZWY9dWRwLmh0bWwjc2VuZHRvPjx0dD5zZW5kdG88L3R0PjwvYT4gIAorY2FuICBiZSAgdXNlZCAgaW1tZWRpYXRlbHkgYWZ0ZXIgIGNyZWF0aW9uICB0bworc2VuZCAgYSBkYXRhZ3JhbSB0byAgSVAgYWRkcmVzcyBhbmQgcG9ydC4gSG9zdCBuYW1lcyAgYXJlIG5vdCBhbGxvd2VkCitiZWNhdXNlIHBlcmZvcm1pbmcgbmFtZSByZXNvbHV0aW9uIGZvciBlYWNoIHBhY2tldCB3b3VsZCBiZSBmb3JiaWRkaW5nbHkKK3Nsb3cuICBNZXRob2RzIAorPGEgaHJlZj11ZHAuaHRtbCNyZWNlaXZlPjx0dD5yZWNlaXZlPC90dD48L2E+ICBhbmQgCis8YSBocmVmPXVkcC5odG1sI3JlY2VpdmVmcm9tPjx0dD5yZWNlaXZlZnJvbTwvdHQ+PC9hPgorY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgZGF0YWdyYW1zLCB0aGUgbGF0dGVyIHJldHVybmluZyB0aGUgSVAgYW5kIHBvcnQgb2YKK3RoZSAgc2VuZGVyICBhcyAgZXh0cmEgIHJldHVybiAgdmFsdWVzICh0aHVzIGJlaW5nICBzbGlnaHRseSAgbGVzcworZWZmaWNpZW50KS4gCis8L3A+CisKKzxwPgorV2hlbiAgY29tbXVuaWNhdGlvbiAgaXMgcGVyZm9ybWVkICByZXBlYXRlZGx5ICB3aXRoICBhIHNpbmdsZSAgcGVlciwgIGFuCithcHBsaWNhdGlvbiAgc2hvdWxkIGNhbGwgIHRoZSAKKzxhIGhyZWY9dWRwLmh0bWwjc2V0cGVlcm5hbWU+PHR0PnNldHBlZXJuYW1lPC90dD48L2E+IG1ldGhvZCB0byBzcGVjaWZ5IGEKK3Blcm1hbmVudCBwYXJ0bmVyLiAgTWV0aG9kcyAKKzxhIGhyZWY9dWRwLmh0bWwjc2VuZHRvPjx0dD5zZW5kdG88L3R0PjwvYT4gYW5kCis8YSBocmVmPXVkcC5odG1sI3JlY2VpdmVmcm9tPjx0dD5yZWNlaXZlZnJvbTwvdHQ+PC9hPiAKK2NhbiBubyBsb25nZXIgYmUgdXNlZCwgYnV0IHRoZSBtZXRob2QKKzxhIGhyZWY9dWRwLmh0bWwjc2VuZD48dHQ+c2VuZDwvdHQ+PC9hPiBjYW4gYmUgdXNlZCB0byBzZW5kIGRhdGEgCitkaXJlY3RseSAgdG8gICB0aGUgICBwZWVyLCBhbmQgdGhlIG1ldGhvZCAKKzxhIGhyZWY9dWRwLmh0bWwjcmVjZWl2ZT48dHQ+cmVjZWl2ZTwvdHQ+PC9hPiAKK3dpbGwgIG9ubHkgcmV0dXJuICBkYXRhZ3JhbXMgb3JpZ2luYXRpbmcKK2Zyb20gdGhhdCBwZWVyLiBUaGVyZSBpcyBhYm91dCAzMCUgcGVyZm9ybWFuY2UgZ2FpbiBkdWUgdG8gdGhpcyBwcmFjdGljZS4KKzwvcD4KKworPHA+CitUbyBhc3NvY2lhdGUgIGFuIFVEUCBzb2NrZXQgd2l0aCAgYSBsb2NhbCBhZGRyZXNzLCBhbiAgYXBwbGljYXRpb24gY2FsbHMgdGhlICAgCis8YSBocmVmPXVkcC5odG1sI3NldHNvY2tuYW1lPjx0dD5zZXRzb2NrbmFtZTwvdHQ+PC9hPiAKK21ldGhvZCA8ZW0+YmVmb3JlPC9lbT4gc2VuZGluZyBhbnkgZGF0YWdyYW1zLiAgIE90aGVyd2lzZSwgdGhlIHNvY2tldCBpcworYXV0b21hdGljYWxseSAgYm91bmQgIHRvIGFuICBlcGhlbWVyYWwgIGFkZHJlc3MgIGJlZm9yZSB0aGUgIGZpcnN0ICBkYXRhCit0cmFuc21pc3Npb24gYW5kIG9uY2UgYm91bmQgdGhlIGxvY2FsIGFkZHJlc3MgY2Fubm90IGJlIGNoYW5nZWQuICAKK1RoZSAgIG90aGVyICBtZXRob2RzICAgYXZhaWxhYmxlICBmb3IgIFVEUCAgIHNvY2tldHMgIGFyZQorPGEgaHJlZj11ZHAuaHRtbCNnZXRwZWVybmFtZT48dHQ+Z2V0cGVlcm5hbWU8L3R0PjwvYT4sICAKKzxhIGhyZWY9dWRwLmh0bWwjZ2V0c29ja25hbWU+PHR0PmdldHNvY2tuYW1lPC90dD48L2E+LCAKKzxhIGhyZWY9dWRwLmh0bWwjc2V0dGltZW91dD48dHQ+c2V0dGltZW91dDwvdHQ+PC9hPiwKKzxhIGhyZWY9dWRwLmh0bWwjc2V0b3B0aW9uPjx0dD5zZXRvcHRpb248L3R0PjwvYT4gYW5kIAorPGEgaHJlZj11ZHAuaHRtbCNjbG9zZT48dHQ+Y2xvc2U8L3R0PjwvYT4uIAorPC9wPgorCis8cD4KK0V4YW1wbGU6IAorPC9wPgorPGJsb2NrcXVvdGU+Cis8cD4KK0Egc2ltcGxlIGRheXRpbWUgY2xpZW50LCB1c2luZyBMdWFTb2NrZXQuIFRoZSBwcm9ncmFtIGNvbm5lY3RzIHRvIGEgcmVtb3RlCitzZXJ2ZXIgYW5kIHRyaWVzIHRvIHJldHJpZXZlIHRoZSBkYXl0aW1lLCBwcmludGluZyB0aGUgYW5zd2VyIGl0IGdvdCBvciBhbgorZXJyb3IgbWVzc2FnZS4gCis8L3A+CisKKzxwcmUgY2xhc3M9ZXhhbXBsZT4KKy0tIGNoYW5nZSBoZXJlIHRvIHRoZSBob3N0IGFuIHBvcnQgeW91IHdhbnQgdG8gY29udGFjdAorbG9jYWwgaG9zdCwgcG9ydCA9ICJsb2NhbGhvc3QiLCAxMworLS0gbG9hZCBuYW1lc3BhY2UKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCistLSBjb252ZXJ0IGhvc3QgbmFtZSB0byBpcCBhZGRyZXNzCitsb2NhbCBpcCA9IGFzc2VydChzb2NrZXQuZG5zLnRvaXAoaG9zdCkpCistLSBjcmVhdGUgYSBuZXcgVURQIG9iamVjdAorbG9jYWwgdWRwID0gYXNzZXJ0KHNvY2tldC51ZHAoKSkKKy0tIGNvbnRhY3QgZGF5dGltZSBob3N0Cithc3NlcnQodWRwOnNlbmR0bygiYW55dGhpbmciLCBpcCwgcG9ydCkpCistLSByZXRyaWV2ZSB0aGUgYW5zd2VyIGFuZCBwcmludCByZXN1bHRzCitpby53cml0ZShhc3NlcnQodWRwOnJlY2VpdmUoKSkpCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPCEtLSBNb3JlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgzIGlkPW1vcmU+U3VwcG9ydCBtb2R1bGVzPC9oMz4KKworPHA+IEFsdGhvdWdoIG5vdCBjb3ZlcmVkIGluIHRoZSBpbnRyb2R1Y3Rpb24sIEx1YVNvY2tldCBvZmZlcnMgCittdWNoIG1vcmUgdGhhbiBUQ1AgYW5kIFVEUCBmdW5jdGlvbmFsaXR5LiBBcyB0aGUgbGlicmFyeQorZXZvbHZlZCwgc3VwcG9ydCBmb3IgPGEgaHJlZj1odHRwLmh0bWw+SFRUUDwvYT4sIDxhIGhyZWY9ZnRwLmh0bWw+RlRQPC9hPiwKK2FuZCA8YSBocmVmPXNtdHAuaHRtbD5TTVRQPC9hPiB3ZXJlIGJ1aWx0IG9uIHRvcCBvZiB0aGVzZS4gVGhlc2UgbW9kdWxlcworYW5kIG1hbnkgb3RoZXJzIGFyZSBjb3ZlcmVkIGJ5IHRoZSA8YSBocmVmPXJlZmVyZW5jZS5odG1sPnJlZmVyZW5jZSBtYW51YWw8L2E+LiAKKzwvcD4KKworPCEtLSBmb290ZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1mb290ZXI+Cis8aHI+Cis8Y2VudGVyPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd24iPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPgorPC9wPgorPHA+Cis8c21hbGw+CitMYXN0IG1vZGlmaWVkIGJ5IERpZWdvIE5laGFiIG9uIDxicj4KK1RodSBBcHIgMjAgMDA6MjU6MzYgRURUIDIwMDYKKzwvc21hbGw+Cis8L3A+Cis8L2NlbnRlcj4KKzwvZGl2PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZG9jL2x0bjEyLmh0bWwgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL2x0bjEyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxMzk1MAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9kb2MvbHRuMTIuaHRtbApAQCAtMCwwICsxLDQzMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iTHVhU29ja2V0OiBMVE4xMiBzdXBwb3J0Ij4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJMdWEsIEx1YVNvY2tldCwgRmlsdGVycywgU291cmNlLCBTaW5rLAorUHVtcCwgU3VwcG9ydCwgTGlicmFyeSI+Cis8dGl0bGU+THVhU29ja2V0OiBMVE4xMiBtb2R1bGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJyZWZlcmVuY2UuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8IS0tIGhlYWRlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWhlYWRlcj4KKzxocj4KKzxjZW50ZXI+Cis8dGFibGUgc3VtbWFyeT0iTHVhU29ja2V0IGxvZ28iPgorPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnIj4KKzxpbWcgd2lkdGg9MTI4IGhlaWdodD0xMjggYm9yZGVyPTAgYWx0PSJMdWFTb2NrZXQiIHNyYz0ibHVhc29ja2V0LnBuZyI+Cis8L2E+PC90ZD48L3RyPgorPHRyPjx0ZCBhbGlnbj1jZW50ZXIgdmFsaWduPXRvcD5OZXR3b3JrIHN1cHBvcnQgZm9yIHRoZSBMdWEgbGFuZ3VhZ2UKKzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93bmxvYWQiPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPiAKKzwvcD4KKzwvY2VudGVyPgorPGhyPgorPC9kaXY+CisKKzwhLS0gbHRuMTIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMiBpZD1sdG4xMj5MVE4xMjwvaDI+IAorCis8cD4gVGhlIDx0dD5sdG4xMjwvdHQ+IG5hbWVzcGFjZSBpbXBsZW1lbnRzIHRoZSBpZGVhcyBkZXNjcmliZWQgaW4KKzxhIGhyZWY9Imh0dHA6Ly9sdWEtdXNlcnMub3JnL3dpa2kvRmlsdGVyc1NvdXJjZXNBbmRTaW5rcyI+CitMVE4wMTIsIEZpbHRlcnMgc291cmNlcyBhbmQgc2lua3M8L2E+LiBUaGlzIG1hbnVhbCBzaW1wbHkgZGVzY3JpYmVzIHRoZQorZnVuY3Rpb25zLiBQbGVhc2UgcmVmZXIgdG8gdGhlIExUTiBmb3IgYSBkZWVwZXIgZXhwbGFuYXRpb24gb2YgdGhlCitmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlLgorPC9wPgorCis8cD4gCitUbyBvYnRhaW4gdGhlIDx0dD5sdG4xMjwvdHQ+IG5hbWVzcGFjZSwgcnVuOgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkcyB0aGUgTFROMjEgbW9kdWxlCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKKzwvcHJlPgorCis8IS0tIGZpbHRlcnMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDMgaWQ9ImZpbHRlciI+RmlsdGVyczwvaDM+CisKKzwhLS0gY2hhaW4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9ImZpbHRlci5jaGFpbiI+CitsdG4xMi5maWx0ZXIuPGI+Y2hhaW4oPC9iPmZpbHRlcjxzdWI+MTwvc3ViPiwgZmlsdGVyPHN1Yj4yPC9zdWI+IAorWywgLi4uIGZpbHRlcjxzdWI+Tjwvc3ViPl08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1JldHVybnMgYSBmaWx0ZXIgdGhhdCBwYXNzZXMgYWxsIGRhdGEgaXQgcmVjZWl2ZXMgdGhyb3VnaCBlYWNoIG9mIGEKK3NlcmllcyBvZiBnaXZlbiBmaWx0ZXJzLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5GaWx0ZXI8c3ViPjE8L3N1Yj48L3R0PiB0byA8dHQ+ZmlsdGVyPHN1Yj5OPC9zdWI+PC90dD4gYXJlIHNpbXBsZQorZmlsdGVycy4gCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjaGFpbmVkIGZpbHRlci4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK1RoZSBuZXN0aW5nIG9mIGZpbHRlcnMgY2FuIGJlIGFyYml0cmFyeS4gRm9yIGluc3RhbmNlLCB0aGUgdXNlbGVzcyBmaWx0ZXIKK2JlbG93IGRvZXNuJ3QgZG8gYW55dGhpbmcgYnV0IHJldHVybiB0aGUgZGF0YSB0aGF0IHdhcyBwYXNzZWQgdG8gaXQsCit1bmFsdGVyZWQuCis8L3A+CisKKzxwcmUgY2xhc3M9ZXhhbXBsZT4KKy0tIGxvYWQgcmVxdWlyZWQgbW9kdWxlcworbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCitsb2NhbCBtaW1lID0gcmVxdWlyZSgibWltZSIpCisKKy0tIGNyZWF0ZSBhIHNpbGx5IGlkZW50aXR5IGZpbHRlcgoraWQgPSBsdG4xMi5maWx0ZXIuY2hhaW4oCisgIG1pbWUuZW5jb2RlKCJxdW90ZWQtcHJpbnRhYmxlIiksCisgIG1pbWUuZW5jb2RlKCJiYXNlNjQiKSwKKyAgbWltZS5kZWNvZGUoImJhc2U2NCIpLAorICBtaW1lLmRlY29kZSgicXVvdGVkLXByaW50YWJsZSIpCispCis8L3ByZT4KKworPCEtLSBjeWNsZSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0iZmlsdGVyLmN5Y2xlIj4KK2x0bjEyLmZpbHRlci48Yj5jeWNsZSg8L2I+bG93IFssIGN0eCwgZXh0cmFdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitSZXR1cm5zIGEgaGlnaC1sZXZlbCBmaWx0ZXIgdGhhdCBjeWNsZXMgdGhvdWdoIGEgbG93LWxldmVsIGZpbHRlciBieQorcGFzc2luZyBpdCBlYWNoIGNodW5rIGFuZCB1cGRhdGluZyBhIGNvbnRleHQgYmV0d2VlbiBjYWxscy4gCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+TG93PC90dD4gaXMgdGhlIGxvdy1sZXZlbCBmaWx0ZXIgdG8gYmUgY3ljbGVkLCAKKzx0dD5jdHg8L3R0PiBpcyB0aGUgaW5pdGlhbCBjb250ZXh0IGFuZCA8dHQ+ZXh0cmE8L3R0PiBpcyBhbnkgZXh0cmEKK2FyZ3VtZW50IHRoZSBsb3ctbGV2ZWwgZmlsdGVyIG1pZ2h0IHRha2UuCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBoaWdoLWxldmVsIGZpbHRlci4gCis8L3A+CisKKzxwcmUgY2xhc3M9ZXhhbXBsZT4KKy0tIGxvYWQgdGhlIGx0bjEyIG1vZHVsZQorbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCisKKy0tIHRoZSBiYXNlNjQgbWltZSBmaWx0ZXIgZmFjdG9yeQorZW5jb2RldFsnYmFzZTY0J10gPSBmdW5jdGlvbigpCisgICAgcmV0dXJuIGx0bjEyLmZpbHRlci5jeWNsZShiNjQsICIiKQorZW5kCis8L3ByZT4KKworPCEtLSBwdW1wcyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgzIGlkPSJwdW1wIj5QdW1wczwvaDM+CisKKzwhLS0gYWxsICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InB1bXAuYWxsIj4KK2x0bjEyLnB1bXAuPGI+YWxsKDwvYj5zb3VyY2UsIHNpbms8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1B1bXBzIDxlbT5hbGw8L2VtPiBkYXRhIGZyb20gYSA8dHQ+c291cmNlPC90dD4gdG8gYSA8dHQ+c2luazwvdHQ+LiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorSWYgc3VjY2Vzc2Z1bCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSB0aGF0IGV2YWx1YXRlcyB0bworPGI+PHR0PnRydWU8L3R0PjwvYj4uIEluIGNhc2UKK29mIGVycm9yLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIDxiPjx0dD5mYWxzZTwvdHQ+PC9iPiB2YWx1ZSwgZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZS4KKzwvcD4KKworPCEtLSBzdGVwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0icHVtcC5zdGVwIj4KK2x0bjEyLnB1bXAuPGI+c3RlcCg8L2I+c291cmNlLCBzaW5rPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitQdW1wcyA8ZW0+b25lPC9lbT4gY2h1bmsgb2YgZGF0YSBmcm9tIGEgPHR0PnNvdXJjZTwvdHQ+IHRvIGEgPHR0PnNpbms8L3R0Pi4gCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK0lmIHN1Y2Nlc3NmdWwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgdGhhdCBldmFsdWF0ZXMgdG8KKzxiPjx0dD50cnVlPC90dD48L2I+LiBJbiBjYXNlCitvZiBlcnJvciwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSA8Yj48dHQ+ZmFsc2U8L3R0PjwvYj4gdmFsdWUsIGZvbGxvd2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UuCis8L3A+CisKKzwhLS0gc2lua3MgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMyBpZD0ic2luayI+U2lua3M8L2gzPgorCis8IS0tIGNoYWluICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJzaW5rLmNoYWluIj4KK2x0bjEyLnNpbmsuPGI+Y2hhaW4oPC9iPmZpbHRlciwgc2luazxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBzaW5rIHRoYXQgcGFzc2VzIGRhdGEgdGhyb3VnaCBhIDx0dD5maWx0ZXI8L3R0PiBiZWZvcmUgc2VuZGluZyBpdCB0byBhIGdpdmVuIDx0dD5zaW5rPC90dD4uIAorPC9wPgorCis8IS0tIGVycm9yICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJzaW5rLmVycm9yIj4KK2x0bjEyLnNpbmsuPGI+ZXJyb3IoPC9iPm1lc3NhZ2U8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0NyZWF0ZXMgYW5kIHJldHVybnMgYSBzaW5rIHRoYXQgYWJvcnRzIHRyYW5zbWlzc2lvbiB3aXRoIHRoZSBlcnJvcgorPHR0Pm1lc3NhZ2U8L3R0Pi4KKzwvcD4KKworPCEtLSBmaWxlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0ic2luay5maWxlIj4KK2x0bjEyLnNpbmsuPGI+ZmlsZSg8L2I+aGFuZGxlLCBtZXNzYWdlPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGEgc2luayB0aGF0IHNlbmRzIGRhdGEgdG8gYSBmaWxlLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5IYW5kbGU8L3R0PiBpcyBhIGZpbGUgaGFuZGxlLiBJZiA8dHQ+aGFuZGxlPC90dD4gaXMgPHR0PjxiPm5pbDwvYj48L3R0PiwgCis8dHQ+bWVzc2FnZTwvdHQ+IHNob3VsZCBnaXZlIHRoZSByZWFzb24gZm9yIGZhaWx1cmUuIAorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHNpbmsgdGhhdCBzZW5kcyBhbGwgZGF0YSB0byB0aGUgZ2l2ZW4gPHR0PmhhbmRsZTwvdHQ+CithbmQgY2xvc2VzIHRoZSBmaWxlIHdoZW4gZG9uZSwgb3IgYSBzaW5rIHRoYXQgYWJvcnRzIHRoZSB0cmFuc21pc3Npb24gd2l0aAordGhlIGVycm9yIDx0dD5tZXNzYWdlPC90dD4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK0luIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgbm90aWNlIGhvdyB0aGUgcHJvdG90eXBlIGlzIGRlc2lnbmVkIHRvIAorZml0IG5pY2VseSB3aXRoIHRoZSA8dHQ+aW8ub3BlbjwvdHQ+IGZ1bmN0aW9uLgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIHRoZSBsdG4xMiBtb2R1bGUKK2xvY2FsIGx0bjEyID0gcmVxdWlyZSgibHRuMTIiKQorCistLSBjb3B5IGEgZmlsZQorbHRuMTIucHVtcC5hbGwoCisgIGx0bjEyLnNvdXJjZS5maWxlKGlvLm9wZW4oIm9yaWdpbmFsLnBuZyIpKSwKKyAgbHRuMTIuc2luay5maWxlKGlvLm9wZW4oImNvcHkucG5nIikpCispCis8L3ByZT4KKworPCEtLSBudWxsICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0ic2luay5udWxsIj4KK2x0bjEyLnNpbmsuPGI+bnVsbCgpPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1JldHVybnMgYSBzaW5rIHRoYXQgaWdub3JlcyBhbGwgZGF0YSBpdCByZWNlaXZlcy4gCis8L3A+CisKKzwhLS0gc2ltcGxpZnkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InNpbmsuc2ltcGxpZnkiPgorbHRuMTIuc2luay48Yj5zaW1wbGlmeSg8L2I+c2luazxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHNpbXBsZSBzaW5rIGdpdmVuIGEgZmFuY3kgPHR0PnNpbms8L3R0Pi4gCis8L3A+CisKKzwhLS0gdGFibGUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InNpbmsudGFibGUiPgorbHRuMTIuc2luay48Yj50YWJsZSg8L2I+W3RhYmxlXTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQ3JlYXRlcyBhIHNpbmsgdGhhdCBzdG9yZXMgYWxsIGNodW5rcyBpbiBhIHRhYmxlLiBUaGUgY2h1bmtzIGNhbiBsYXRlciBiZQorZWZmaWNpZW50bHkgY29uY2F0ZW5hdGVkIGludG8gYSBzaW5nbGUgc3RyaW5nLgorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PlRhYmxlPC90dD4gaXMgdXNlZCB0byBob2xkIHRoZSBjaHVua3MuIElmCis8dHQ+PGI+bmlsPC9iPjwvdHQ+LCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBpdHMgb3duIHRhYmxlLiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpbmsgYW5kIHRoZSB0YWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBjaHVua3MuIAorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIG5lZWRlZCBtb2R1bGVzCitsb2NhbCBodHRwID0gcmVxdWlyZSgic29ja2V0Lmh0dHAiKQorbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCisKKy0tIGEgc2ltcGxpZmllZCBodHRwLmdldCBmdW5jdGlvbgorZnVuY3Rpb24gaHR0cC5nZXQodSkKKyAgbG9jYWwgdCA9IHt9CisgIGxvY2FsIHJlc3B0ID0gcmVxdWVzdHsKKyAgICB1cmwgPSB1LAorICAgIHNpbmsgPSBsdG4xMi5zaW5rLnRhYmxlKHQpCisgIH0KKyAgcmV0dXJuIHRhYmxlLmNvbmNhdCh0KSwgcmVzcHQuaGVhZGVycywgcmVzcHQuY29kZQorZW5kCis8L3ByZT4KKworPCEtLSBzaW5rcyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgzIGlkPSJzb3VyY2UiPlNvdXJjZXM8L2gzPgorCis8IS0tIGNhdCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJzb3VyY2UuY2F0Ij4KK2x0bjEyLnNvdXJjZS48Yj5jYXQoPC9iPnNvdXJjZTxzdWI+MTwvc3ViPiBbLCBzb3VyY2U8c3ViPjI8L3N1Yj4sIC4uLiwKK3NvdXJjZTxzdWI+Tjwvc3ViPl08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0NyZWF0ZXMgYSBuZXcgc291cmNlIHRoYXQgcHJvZHVjZXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGRhdGEgcHJvZHVjZWQKK2J5IGEgbnVtYmVyIG9mIHNvdXJjZXMuIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PlNvdXJjZTxzdWI+MTwvc3ViPjwvdHQ+IHRvIDx0dD5zb3VyY2U8c3ViPk48L3N1Yj48L3R0PiBhcmUgdGhlIG9yaWdpbmFsCitzb3VyY2VzLiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5ldyBzb3VyY2UuCis8L3A+CisKKzwhLS0gY2hhaW4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InNvdXJjZS5jaGFpbiI+CitsdG4xMi5zb3VyY2UuPGI+Y2hhaW4oPC9iPnNvdXJjZSwgZmlsdGVyPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGEgbmV3IDx0dD5zb3VyY2U8L3R0PiB0aGF0IHBhc3NlcyBkYXRhIHRocm91Z2ggYSA8dHQ+ZmlsdGVyPC90dD4gCitiZWZvcmUgcmV0dXJuaW5nIGl0LiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5ldyBzb3VyY2UuCis8L3A+CisKKzwhLS0gZW1wdHkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InNvdXJjZS5lbXB0eSI+CitsdG4xMi5zb3VyY2UuPGI+ZW1wdHkoKTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IHNvdXJjZS4gCis8L3A+CisKKzwhLS0gZXJyb3IgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InNvdXJjZS5lcnJvciI+CitsdG4xMi5zb3VyY2UuPGI+ZXJyb3IoPC9iPm1lc3NhZ2U8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0NyZWF0ZXMgYW5kIHJldHVybnMgYSBzb3VyY2UgdGhhdCBhYm9ydHMgdHJhbnNtaXNzaW9uIHdpdGggdGhlIGVycm9yCis8dHQ+bWVzc2FnZTwvdHQ+LgorPC9wPgorCis8IS0tIGZpbGUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJzb3VyY2UuZmlsZSI+CitsdG4xMi5zb3VyY2UuPGI+ZmlsZSg8L2I+aGFuZGxlLCBtZXNzYWdlPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGEgc291cmNlIHRoYXQgcHJvZHVjZXMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4gCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+SGFuZGxlPC90dD4gaXMgYSBmaWxlIGhhbmRsZS4gSWYgPHR0PmhhbmRsZTwvdHQ+IGlzIDx0dD48Yj5uaWw8L2I+PC90dD4sIAorPHR0Pm1lc3NhZ2U8L3R0PiBzaG91bGQgZ2l2ZSB0aGUgcmVhc29uIGZvciBmYWlsdXJlLiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzb3VyY2UgdGhhdCByZWFkcyBjaHVua3Mgb2YgZGF0YSBmcm9tIAorZ2l2ZW4gPHR0PmhhbmRsZTwvdHQ+IGFuZCByZXR1cm5zIGl0IHRvIHRoZSB1c2VyLAorY2xvc2luZyB0aGUgZmlsZSB3aGVuIGRvbmUsIG9yIGEgc291cmNlIHRoYXQgYWJvcnRzIHRoZSB0cmFuc21pc3Npb24gd2l0aAordGhlIGVycm9yIDx0dD5tZXNzYWdlPC90dD4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK0luIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgbm90aWNlIGhvdyB0aGUgcHJvdG90eXBlIGlzIGRlc2lnbmVkIHRvIAorZml0IG5pY2VseSB3aXRoIHRoZSA8dHQ+aW8ub3BlbjwvdHQ+IGZ1bmN0aW9uLgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIHRoZSBsdG4xMiBtb2R1bGUKK2xvY2FsIGx0bjEyID0gcmVxdWlyZSgibHRuMTIiKQorCistLSBjb3B5IGEgZmlsZQorbHRuMTIucHVtcC5hbGwoCisgIGx0bjEyLnNvdXJjZS5maWxlKGlvLm9wZW4oIm9yaWdpbmFsLnBuZyIpKSwKKyAgbHRuMTIuc2luay5maWxlKGlvLm9wZW4oImNvcHkucG5nIikpCispCis8L3ByZT4KKworPCEtLSBzaW1wbGlmeSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0ic291cmNlLnNpbXBsaWZ5Ij4KK2x0bjEyLnNvdXJjZS48Yj5zaW1wbGlmeSg8L2I+c291cmNlPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGFuZCByZXR1cm5zIGEgc2ltcGxlIHNvdXJjZSBnaXZlbiBhIGZhbmN5IDx0dD5zb3VyY2U8L3R0Pi4gCis8L3A+CisKKzwhLS0gc3RyaW5nICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InNvdXJjZS5zdHJpbmciPgorbHRuMTIuc291cmNlLjxiPnN0cmluZyg8L2I+c3RyaW5nPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGFuZCByZXR1cm5zIGEgc291cmNlIHRoYXQgcHJvZHVjZXMgdGhlIGNvbnRlbnRzIG9mIGEKKzx0dD5zdHJpbmc8L3R0PiwgY2h1bmsgYnkgY2h1bmsuIAorPC9wPgorCis8IS0tIGZvb3RlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWZvb3Rlcj4KKzxocj4KKzxjZW50ZXI+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93biI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+Cis8L3A+Cis8cD4KKzxzbWFsbD4KK0xhc3QgbW9kaWZpZWQgYnkgRGllZ28gTmVoYWIgb24gPGJyPgorVGh1IEFwciAyMCAwMDoyNTo0MSBFRFQgMjAwNgorPC9zbWFsbD4KKzwvcD4KKzwvY2VudGVyPgorPC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2MvbHVhc29ja2V0LnBuZyBiL2x1YXNvY2tldC0yLjAuMi9kb2MvbHVhc29ja2V0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjRhOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9sdWFzb2NrZXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2MvbWltZS5odG1sIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9taW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmYWY1MgotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9kb2MvbWltZS5odG1sCkBAIC0wLDAgKzEsNDc2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIAorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJMdWFTb2NrZXQ6IE1JTUUgc3VwcG9ydCI+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iTHVhLCBMdWFTb2NrZXQsIE1JTUUsIExpYnJhcnksIFN1cHBvcnQiPiAKKzx0aXRsZT5MdWFTb2NrZXQ6IE1JTUUgbW9kdWxlPC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0icmVmZXJlbmNlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorCis8Ym9keT4KKworPCEtLSBoZWFkZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1oZWFkZXI+Cis8aHI+Cis8Y2VudGVyPgorPHRhYmxlIHN1bW1hcnk9Ikx1YVNvY2tldCBsb2dvIj4KKzx0cj48dGQgYWxpZ249Y2VudGVyPjxhIGhyZWY9Imh0dHA6Ly93d3cubHVhLm9yZyI+Cis8aW1nIHdpZHRoPTEyOCBoZWlnaHQ9MTI4IGJvcmRlcj0wIGFsdD0iTHVhU29ja2V0IiBzcmM9Imx1YXNvY2tldC5wbmciPgorPC9hPjwvdGQ+PC90cj4KKzx0cj48dGQgYWxpZ249Y2VudGVyIHZhbGlnbj10b3A+TmV0d29yayBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd25sb2FkIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4gCis8L3A+Cis8L2NlbnRlcj4KKzxocj4KKzwvZGl2PgorCis8IS0tIG1pbWUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDIgaWQ9bWltZT5NSU1FPC9oMj4gCisKKzxwPgorVGhlIDx0dD5taW1lPC90dD4gbmFtZXNwYWNlIG9mZmVycyBmaWx0ZXJzIHRoYXQgYXBwbHkgYW5kIHJlbW92ZSBjb21tb24KK2NvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmdzLCBzdWNoIGFzIEJhc2U2NCBhbmQgUXVvdGVkLVByaW50YWJsZS4KK0l0IGFsc28gcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGJyZWFrIHRleHQgaW50byBsaW5lcyBhbmQgY2hhbmdlCit0aGUgZW5kLW9mLWxpbmUgY29udmVudGlvbi4KK01JTUUgaXMgZGVzY3JpYmVkIG1haW5seSBpbiAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+ZGllZ28vcmZjL3JmYzIwNDUudHh0Ij5SRkMgMjA0NTwvYT4sCis8YSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3JmYy9yZmMyMDQ2LnR4dCI+MjA0NjwvYT4sCis8YSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3JmYy9yZmMyMDQ3LnR4dCI+MjA0NzwvYT4sCis8YSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3JmYy9yZmMyMDQ3LnR4dCI+MjA0ODwvYT4sIGFuZAorPGEgaHJlZj0iaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35kaWVnby9yZmMvcmZjMjA0OC50eHQiPjIwNDk8L2E+LgorPC9wPgorCis8cD4KK0FsbCBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZSBNSU1FIG1vZHVsZSAKK2ZvbGxvd3MgdGhlIGlkZWFzIHByZXNlbnRlZCBpbiAKKzxhIGhyZWY9Imh0dHA6Ly9sdWEtdXNlcnMub3JnL3dpa2kvRmlsdGVyc1NvdXJjZXNBbmRTaW5rcyI+CitMVE4wMTIsIEZpbHRlcnMgc291cmNlcyBhbmQgc2lua3M8L2E+LiAKKzwvcD4KKworPHA+IAorVG8gb2J0YWluIHRoZSA8dHQ+bWltZTwvdHQ+IG5hbWVzcGFjZSwgcnVuOgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkcyB0aGUgTUlNRSBtb2R1bGUgYW5kIGV2ZXJ5dGhpbmcgaXQgcmVxdWlyZXMKK2xvY2FsIG1pbWUgPSByZXF1aXJlKCJtaW1lIikKKzwvcHJlPgorCisKKzwhLS0gSGlnaC1sZXZlbCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMyBpZD1oaWdoPkhpZ2gtbGV2ZWwgZmlsdGVyczwvaDM+CisKKzwhLS0gbm9ybWFsaXplICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0ibm9ybWFsaXplIj4KK21pbWUuPGI+bm9ybWFsaXplKDwvYj5bbWFya2VyXTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQ29udmVydHMgbW9zdCBjb21tb24gZW5kLW9mLWxpbmUgbWFya2VycyB0byBhIHNwZWNpZmljIGdpdmVuIG1hcmtlci4gCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+TWFya2VyPC90dD4gaXMgdGhlIG5ldyBtYXJrZXIuIEl0IGRlZmF1bHRzIHRvIENSTEYsIHRoZSBjYW5vbmljIAorZW5kLW9mLWxpbmUgbWFya2VyIGRlZmluZWQgYnkgdGhlIE1JTUUgc3RhbmRhcmQuCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmlsdGVyIHRoYXQgcGVyZm9ybXMgdGhlIGNvbnZlcnNpb24uIAorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogVGhlcmUgaXMgbm8gcGVyZmVjdCBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0uIERpZmZlcmVudCBlbmQtb2YtbGluZQorbWFya2VycyBhcmUgYW4gZXZpbCB0aGF0IHdpbGwgcHJvYmFibHkgcGxhZ3VlIGRldmVsb3BlcnMgZm9yZXZlci4gCitUaGlzIGZ1bmN0aW9uLCBob3dldmVyLCB3aWxsIHdvcmsgcGVyZmVjdGx5IGZvciB0ZXh0IGNyZWF0ZWQgd2l0aCBhbnkgb2YKK3RoZSBtb3N0IGNvbW1vbiBlbmQtb2YtbGluZSBtYXJrZXJzLCBpLmUuIHRoZSBNYWMgT1MgKENSKSwgdGhlIFVuaXggKExGKSwgCitvciB0aGUgRE9TIChDUkxGKSBjb252ZW50aW9ucy4gRXZlbiBpZiB0aGUgZGF0YSBoYXMgbWl4ZWQgZW5kLW9mLWxpbmUKK21hcmtlcnMsIHRoZSBmdW5jdGlvbiB3aWxsIHN0aWxsIHdvcmsgd2VsbCwgYWx0aG91Z2ggaXQgZG9lc24ndCAKK2d1YXJhbnRlZSB0aGF0IHRoZSBudW1iZXIgb2YgZW1wdHkgbGluZXMgd2lsbCBiZSBjb3JyZWN0LgorPC9wPgorCis8IS0tIGRlY29kZSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJkZWNvZGUiPgorbWltZS48Yj5kZWNvZGUoPC9iPiJiYXNlNjQiPGI+KTwvYj48YnI+CittaW1lLjxiPmRlY29kZSg8L2I+InF1b3RlZC1wcmludGFibGUiPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitSZXR1cm5zIGEgZmlsdGVyIHRoYXQgZGVjb2RlcyBkYXRhIGZyb20gYSBnaXZlbiB0cmFuc2ZlciBjb250ZW50CitlbmNvZGluZy4KKzwvcD4KKworPCEtLSBlbmNvZGUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0iZW5jb2RlIj4KK21pbWUuPGI+ZW5jb2RlKDwvYj4iYmFzZTY0IjxiPik8L2I+PGJyPgorbWltZS48Yj5lbmNvZGUoPC9iPiJxdW90ZWQtcHJpbnRhYmxlIiBbLCBtb2RlXTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorUmV0dXJucyBhIGZpbHRlciB0aGF0IGVuY29kZXMgZGF0YSBhY2NvcmRpbmcgdG8gYSBnaXZlbiB0cmFuc2ZlciBjb250ZW50CitlbmNvZGluZy4KKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KK0luIHRoZSBRdW90ZWQtUHJpbnRhYmxlIGNhc2UsIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHdoZXRoZXIgdGhlIGRhdGEgaXMKK3RleHR1YWwgb3IgYmluYXJ5LCBieSBwYXNzaW5nIHRoZSA8dHQ+bW9kZTwvdHQ+IHN0cmluZ3MgIjx0dD50ZXh0PC90dD4iIG9yCisiPHR0PmJpbmFyeTwvdHQ+Ii4gPHR0Pk1vZGU8L3R0PiBkZWZhdWx0cyB0byAiPHR0PnRleHQ8L3R0PiIuCis8L3A+CisKKzxwIGNsYXNzPW5vdGU+CitBbHRob3VnaCBib3RoIHRyYW5zZmVyIGNvbnRlbnQgZW5jb2RpbmdzIHNwZWNpZnkgYSBsaW1pdCBmb3IgdGhlIGxpbmUKK2xlbmd0aCwgdGhlIGVuY29kaW5nIGZpbHRlcnMgZG8gPGVtPm5vdDwvZW0+IGJyZWFrIHRleHQgaW50byBsaW5lcyAoZm9yCithZGRlZCBmbGV4aWJpbGl0eSkuIAorQmVsb3cgaXMgYSBmaWx0ZXIgdGhhdCBjb252ZXJ0cyBiaW5hcnkgZGF0YSB0byB0aGUgQmFzZTY0IHRyYW5zZmVyIGNvbnRlbnQKK2VuY29kaW5nIGFuZCBicmVha3MgaXQgaW50byBsaW5lcyBvZiB0aGUgY29ycmVjdCBzaXplLgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CitiYXNlNjQgPSBsdG4xMi5maWx0ZXIuY2hhaW4oCisgIG1pbWUuZW5jb2RlKCJiYXNlNjQiKSwKKyAgbWltZS53cmFwKCJiYXNlNjQiKQorKQorPC9wcmU+CisKKzxwIGNsYXNzPW5vdGU+CitOb3RlOiBUZXh0IGRhdGEgPGVtPmhhczwvZW0+IHRvIGJlIGNvbnZlcnRlZCB0byBjYW5vbmljIGZvcm0KKzxlbT5iZWZvcmU8L2VtPiBiZWluZyBlbmNvZGVkLgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CitiYXNlNjQgPSBsdG4xMi5maWx0ZXIuY2hhaW4oCisgIG1pbWUubm9ybWFsaXplKCksCisgIG1pbWUuZW5jb2RlKCJiYXNlNjQiKSwKKyAgbWltZS53cmFwKCJiYXNlNjQiKQorKQorPC9wcmU+CisKKzwhLS0gc3R1ZmYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJzdHVmZiI+CittaW1lLjxiPnN0dWZmKCk8L2I+PGJyPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0NyZWF0ZXMgYW5kIHJldHVybnMgYSBmaWx0ZXIgdGhhdCBwZXJmb3JtcyBzdHVmZmluZyBvZiBTTVRQIG1lc3NhZ2VzLgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogVGhlIDxhIGhyZWY9c210cC5odG1sI3NlbmQ+PHR0PnNtdHAuc2VuZDwvdHQ+PC9hPiBmdW5jdGlvbiAKK3VzZXMgdGhpcyBmaWx0ZXIgYXV0b21hdGljYWxseS4gWW91IGRvbid0IG5lZWQgdG8gY2hhaW4gaXQgd2l0aCB5b3VyCitzb3VyY2UsIG9yIGFwcGx5IGl0IHRvIHlvdXIgbWVzc2FnZSBib2R5LiAgCis8L3A+CisKKzwhLS0gd3JhcCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9IndyYXAiPgorbWltZS48Yj53cmFwKDwvYj4idGV4dCIgWywgbGVuZ3RoXTxiPik8L2I+PGJyPgorbWltZS48Yj53cmFwKDwvYj4iYmFzZTY0IjxiPik8L2I+PGJyPgorbWltZS48Yj53cmFwKDwvYj4icXVvdGVkLXByaW50YWJsZSI8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1JldHVybnMgYSBmaWx0ZXIgdGhhdCBicmVha3MgZGF0YSBpbnRvIGxpbmVzLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KK1RoZSAiPHR0PnRleHQ8L3R0PiIgbGluZS13cmFwIGZpbHRlciBzaW1wbHkgYnJlYWtzIHRleHQgaW50byBsaW5lcyBieSAKK2luc2VydGluZyBDUkxGIGVuZC1vZi1saW5lIG1hcmtlcnMgYXQgYXBwcm9wcmlhdGUgcG9zaXRpb25zLiAKKzx0dD5MZW5ndGg8L3R0PiBkZWZhdWx0cyA3Ni4gCitUaGUgIjx0dD5iYXNlNjQ8L3R0PiIgbGluZS13cmFwIGZpbHRlciB3b3JrcyBqdXN0IGxpa2UgdGhlIGRlZmF1bHQKKyI8dHQ+dGV4dDwvdHQ+IiBsaW5lLXdyYXAgZmlsdGVyIHdpdGggZGVmYXVsdCBsZW5ndGguIAorVGhlIGZ1bmN0aW9uIGNhbiBhbHNvIHdyYXAgIjx0dD5xdW90ZWQtcHJpbnRhYmxlPC90dD4iIGxpbmVzLCB0YWtpbmcgY2FyZQorbm90IHRvIGJyZWFrIGxpbmVzIGluIHRoZSBtaWRkbGUgb2YgYW4gZXNjYXBlZCBjaGFyYWN0ZXIuIEluIHRoYXQgY2FzZSwgdGhlCitsaW5lIGxlbmd0aCBpcyBmaXhlZCBhdCA3Ni4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK0ZvciBleGFtcGxlLCB0byBjcmVhdGUgYW4gZW5jb2RpbmcgZmlsdGVyIGZvciB0aGUgUXVvdGVkLVByaW50YWJsZSB0cmFuc2ZlciBjb250ZW50IGVuY29kaW5nIG9mIHRleHQgZGF0YSwgZG8gdGhlIGZvbGxvd2luZzoKKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorcXAgPSBsdG4xMi5maWx0ZXIuY2hhaW4oCisgIG1pbWUubm9ybWFsaXplKCksCisgIG1pbWUuZW5jb2RlKCJxdW90ZWQtcHJpbnRhYmxlIiksCisgIG1pbWUud3JhcCgicXVvdGVkLXByaW50YWJsZSIpCispCis8L3ByZT4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFRvIGJyZWFrIGludG8gbGluZXMgd2l0aCBhIGRpZmZlcmVudCBlbmQtb2YtbGluZSBjb252ZW50aW9uLCBhcHBseQorYSBub3JtYWxpemF0aW9uIGZpbHRlciBhZnRlciB0aGUgbGluZSBicmVhayBmaWx0ZXIuIAorPC9wPgorCis8IS0tIExvdy1sZXZlbCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDMgaWQ9bG93Pkxvdy1sZXZlbCBmaWx0ZXJzPC9oMz4KKworPCEtLSBiNjQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0iYjY0Ij4KK0EsIEIgPSBtaW1lLjxiPmI2NCg8L2I+QyBbLCBEXTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorTG93LWxldmVsIGZpbHRlciB0byBwZXJmb3JtIEJhc2U2NCBlbmNvZGluZy4gCis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorPHR0PkE8L3R0PiBpcyB0aGUgZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBsYXJnZXN0IHByZWZpeCBvZiAKKzx0dD5DLi5EPC90dD4gCit0aGF0IGNhbiBiZSBlbmNvZGVkIHVuYW1iaWd1b3VzbHkuIDx0dD5CPC90dD4gaGFzIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgCis8dHQ+Qy4uRDwvdHQ+LCA8ZW0+YmVmb3JlPC9lbT4gZW5jb2RpbmcuIAorSWYgPHR0PkQ8L3R0PiBpcyA8dHQ+PGI+bmlsPC9iPjwvdHQ+LCA8dHQ+QTwvdHQ+IGlzIHBhZGRlZCB3aXRoIAordGhlIGVuY29kaW5nIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgPHR0PkM8L3R0Pi4gCis8L3A+CisKKzxwIGNsYXNzPW5vdGU+CitOb3RlOiBUaGUgc2ltcGxlc3QgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZW5jb2RlIGEgc3RyaW5nIGludG8gaXQncworQmFzZTY0IHRyYW5zZmVyIGNvbnRlbnQgZW5jb2RpbmcuIE5vdGljZSB0aGUgZXh0cmEgcGFyZW50aGVzaXMgYXJvdW5kIHRoZQorY2FsbCB0byA8dHQ+bWltZS5iNjQ8L3R0PiwgdG8gZGlzY2FyZCB0aGUgc2Vjb25kIHJldHVybiB2YWx1ZS4KKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorcHJpbnQoKG1pbWUuYjY0KCJkaWVnbzpwYXNzd29yZCIpKSkKKy0tJmd0OyBaR2xsWjI4NmNHRnpjM2R2Y21RPQorPC9wcmU+CisKKzwhLS0gZG90ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorPHAgY2xhc3M9bmFtZSBpZD0iZG90Ij4KK0EsIG4gPSBtaW1lLjxiPmRvdCg8L2I+bSBbLCBCXTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorTG93LWxldmVsIGZpbHRlciB0byBwZXJmb3JtIFNNVFAgc3R1ZmZpbmcgYW5kIGVuYWJsZSB0cmFuc21pc3Npb24gb2YKK21lc3NhZ2VzIGNvbnRhaW5pbmcgdGhlIHNlcXVlbmNlICJDUkxGLkNSTEYiLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5BPC90dD4gaXMgdGhlIHN0dWZmZWQgdmVyc2lvbiBvZiA8dHQ+QjwvdHQ+LiAnPHR0Pm48L3R0PicgZ2l2ZXMgdGhlCitudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzZXF1ZW5jZSBDUkxGIHNlZW4gaW4gdGhlIGVuZCBvZiA8dHQ+QjwvdHQ+LgorJzx0dD5tPC90dD4nIHNob3VsZCB0ZWxsIHRoZSBzYW1lLCBidXQgZm9yIHRoZSBwcmV2aW91cyBjaHVuay4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT5Ob3RlOiBUaGUgbWVzc2FnZSBib2R5IGlzIGRlZmluZWQgdG8gYmVnaW4gd2l0aCAKK2FuIGltcGxpY2l0IENSTEYuIFRoZXJlZm9yZSwgdG8gc3R1ZmYgYSBtZXNzYWdlIGNvcnJlY3RseSwgdGhlCitmaXJzdCA8dHQ+bTwvdHQ+IHNob3VsZCBoYXZlIHRoZSB2YWx1ZSAyLiAKKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorcHJpbnQoKHN0cmluZy5nc3ViKG1pbWUuZG90KDIsICIuXHJcblN0dWZmaW5nIHRoZSBtZXNzYWdlLlxyXG4uXHJcbi4iKSwgIlxyXG4iLCAiXFxuIikpKQorLS0mZ3Q7IC4uXG5TdHVmZmluZyB0aGUgbWVzc2FnZS5cbi4uXG4uLgorPC9wcmU+CisKKzxwIGNsYXNzPW5vdGU+CitOb3RlOiBUaGUgPGEgaHJlZj1zbXRwLmh0bWwjc2VuZD48dHQ+c210cC5zZW5kPC90dD48L2E+IGZ1bmN0aW9uIAordXNlcyB0aGlzIGZpbHRlciBhdXRvbWF0aWNhbGx5LiBZb3UgZG9uJ3QgbmVlZCB0byAKK2FwcGx5IGl0IGFnYWluLiAKKzwvcD4KKworPCEtLSBlb2wgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0iZW9sIj4KK0EsIEIgPSBtaW1lLjxiPmVvbCg8L2I+QyBbLCBELCBtYXJrZXJdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitMb3ctbGV2ZWwgZmlsdGVyIHRvIHBlcmZvcm0gZW5kLW9mLWxpbmUgbWFya2VyIHRyYW5zbGF0aW9uLiAKK0ZvciBlYWNoIGNodW5rLCB0aGUgZnVuY3Rpb24gbmVlZHMgdG8ga25vdyBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCitwcmV2aW91cyBjaHVuayBjb3VsZCBiZSBwYXJ0IG9mIGFuIGVuZC1vZi1saW5lIG1hcmtlciBvciBub3QuIFRoaXMgaXMgdGhlCitjb250ZXh0IHRoZSBmdW5jdGlvbiByZWNlaXZlcyBiZXNpZGVzIHRoZSBjaHVuay4gIEFuIHVwZGF0ZWQgdmVyc2lvbiBvZgordGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgYWZ0ZXIgZWFjaCBuZXcgY2h1bmsuIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PkE8L3R0PiBpcyB0aGUgdHJhbnNsYXRlZCB2ZXJzaW9uIG9mIDx0dD5EPC90dD4uIDx0dD5DPC90dD4gaXMgdGhlCitBU0NJSSB2YWx1ZSBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHByZXZpb3VzIGNodW5rLCBpZiBpdCB3YXMgYQorY2FuZGlkYXRlIGZvciBsaW5lIGJyZWFrLCBvciAwIG90aGVyd2lzZS4gCis8dHQ+QjwvdHQ+IGlzIHRoZSBzYW1lIGFzIDx0dD5DPC90dD4sIGJ1dCBmb3IgdGhlIGN1cnJlbnQKK2NodW5rLiA8dHQ+TWFya2VyPC90dD4gZ2l2ZXMgdGhlIG5ldyBlbmQtb2YtbGluZSBtYXJrZXIgYW5kIGRlZmF1bHRzIHRvIENSTEYuCis8L3A+CisKKzxwcmUgY2xhc3M9ZXhhbXBsZT4KKy0tIHRyYW5zbGF0ZXMgdGhlIGVuZC1vZi1saW5lIG1hcmtlciB0byBVTklYCit1bml4ID0gbWltZS5lb2woMCwgZG9zLCAiXG4iKSAKKzwvcHJlPgorCis8IS0tIHFwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InFwIj4KK0EsIEIgPSBtaW1lLjxiPnFwKDwvYj5DIFssIEQsIG1hcmtlcl08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0xvdy1sZXZlbCBmaWx0ZXIgdG8gcGVyZm9ybSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5BPC90dD4gaXMgdGhlIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgbGFyZ2VzdCBwcmVmaXggb2YgCis8dHQ+Qy4uRDwvdHQ+IAordGhhdCBjYW4gYmUgZW5jb2RlZCB1bmFtYmlndW91c2x5LiA8dHQ+QjwvdHQ+IGhhcyB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIAorPHR0PkMuLkQ8L3R0PiwgPGVtPmJlZm9yZTwvZW0+IGVuY29kaW5nLiAKK0lmIDx0dD5EPC90dD4gaXMgPHR0PjxiPm5pbDwvYj48L3R0PiwgPHR0PkE8L3R0PiBpcyBwYWRkZWQgd2l0aCAKK3RoZSBlbmNvZGluZyBvZiB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIDx0dD5DPC90dD4uIAorVGhyb3VnaG91dCBlbmNvZGluZywgb2NjdXJyZW5jZXMgb2YgQ1JMRiBhcmUgcmVwbGFjZWQgYnkgdGhlIAorPHR0Pm1hcmtlcjwvdHQ+LCB3aGljaCBpdHNlbGYgZGVmYXVsdHMgdG8gQ1JMRi4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFRoZSBzaW1wbGVzdCB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBlbmNvZGUgYSBzdHJpbmcgaW50byBpdCdzCitRdW90ZWQtUHJpbnRhYmxlIHRyYW5zZmVyIGNvbnRlbnQgZW5jb2RpbmcuIAorTm90aWNlIHRoZSBleHRyYSBwYXJlbnRoZXNpcyBhcm91bmQgdGhlIGNhbGwgdG8gPHR0Pm1pbWUucXA8L3R0PiwgdG8gZGlzY2FyZCB0aGUgc2Vjb25kIHJldHVybiB2YWx1ZS4KKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorcHJpbnQoKG1pbWUucXAoIm1h5+MiKSkpCistLSZndDsgbWE9RTc9RTM9Cis8L3ByZT4KKworPCEtLSBxcHdycCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJxcHdycCI+CitBLCBtID0gbWltZS48Yj5xcHdycCg8L2I+biBbLCBCLCBsZW5ndGhdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitMb3ctbGV2ZWwgZmlsdGVyIHRvIGJyZWFrIFF1b3RlZC1QcmludGFibGUgdGV4dCBpbnRvIGxpbmVzLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5BPC90dD4gaXMgYSBjb3B5IG9mIDx0dD5CPC90dD4sIGJyb2tlbiBpbnRvIGxpbmVzIG9mIGF0IG1vc3QgCis8dHQ+bGVuZ3RoPC90dD4gYnl0ZXMgKGRlZmF1bHRzIHRvIDc2KS4gCisnPHR0Pm48L3R0Picgc2hvdWxkIHRlbGwgaG93IG1hbnkgYnl0ZXMgYXJlIGxlZnQgZm9yIHRoZSBmaXJzdCAKK2xpbmUgb2YgPHR0PkI8L3R0PiBhbmQgJzx0dD5tPC90dD4nIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyAKK2xlZnQgaW4gdGhlIGxhc3QgbGluZSBvZiA8dHQ+QTwvdHQ+LiAKKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IEJlc2lkZXMgYnJlYWtpbmcgdGV4dCBpbnRvIGxpbmVzLCB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGxpbmUKK2JyZWFrcyBkb24ndCBmYWxsIGluIHRoZSBtaWRkbGUgb2YgYW4gZXNjYXBlZCBjaGFyYWN0ZXIgY29tYmluYXRpb24uIEFsc28sCit0aGlzIGZ1bmN0aW9uIG9ubHkgYnJlYWtzIGxpbmVzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIDx0dD5sZW5ndGg8L3R0PiBieXRlcy4KKzwvcD4KKworPCEtLSB1bmI2NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9InVuYjY0Ij4KK0EsIEIgPSBtaW1lLjxiPnVuYjY0KDwvYj5DIFssIERdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitMb3ctbGV2ZWwgZmlsdGVyIHRvIHBlcmZvcm0gQmFzZTY0IGRlY29kaW5nLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5BPC90dD4gaXMgdGhlIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgbGFyZ2VzdCBwcmVmaXggb2YgCis8dHQ+Qy4uRDwvdHQ+IAordGhhdCBjYW4gYmUgZGVjb2RlZCB1bmFtYmlndW91c2x5LiA8dHQ+QjwvdHQ+IGhhcyB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIAorPHR0PkMuLkQ8L3R0PiwgPGVtPmJlZm9yZTwvZW0+IGRlY29kaW5nLiAKK0lmIDx0dD5EPC90dD4gaXMgPHR0PjxiPm5pbDwvYj48L3R0PiwgPHR0PkE8L3R0PiBpcyB0aGUgZW1wdHkgc3RyaW5nCithbmQgPHR0PkI8L3R0PiByZXR1cm5zIHdoYXRldmVyIGNvdWxkbid0IGJlIGRlY29kZWQuIAorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogVGhlIHNpbXBsZXN0IHVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGRlY29kZSBhIHN0cmluZyBmcm9tIGl0J3MKK0Jhc2U2NCB0cmFuc2ZlciBjb250ZW50IGVuY29kaW5nLiAKK05vdGljZSB0aGUgZXh0cmEgcGFyZW50aGVzaXMgYXJvdW5kIHRoZSBjYWxsIHRvIDx0dD5taW1lLnVucXA8L3R0PiwgdG8gZGlzY2FyZCB0aGUgc2Vjb25kIHJldHVybiB2YWx1ZS4KKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorcHJpbnQoKG1pbWUudW5iNjQoIlpHbGxaMjg2Y0dGemMzZHZjbVE9IikpKQorLS0mZ3Q7IGRpZWdvOnBhc3N3b3JkCis8L3ByZT4KKworPCEtLSB1bnFwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0idW5xcCI+CitBLCBCID0gbWltZS48Yj51bnFwKDwvYj5DIFssIERdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitMb3ctbGV2ZWwgZmlsdGVyIHRvIHJlbW92ZSB0aGUgUXVvdGVkLVByaW50YWJsZSB0cmFuc2ZlciBjb250ZW50IGVuY29kaW5nCitmcm9tIGRhdGEuIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PkE8L3R0PiBpcyB0aGUgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSBsYXJnZXN0IHByZWZpeCBvZiAKKzx0dD5DLi5EPC90dD4gCit0aGF0IGNhbiBiZSBkZWNvZGVkIHVuYW1iaWd1b3VzbHkuIDx0dD5CPC90dD4gaGFzIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgCis8dHQ+Qy4uRDwvdHQ+LCA8ZW0+YmVmb3JlPC9lbT4gZGVjb2RpbmcuIAorSWYgPHR0PkQ8L3R0PiBpcyA8dHQ+PGI+bmlsPC9iPjwvdHQ+LCA8dHQ+QTwvdHQ+IGlzIGF1Z21lbnRlZCB3aXRoIAordGhlIGVuY29kaW5nIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgPHR0PkM8L3R0Pi4gCis8L3A+CisKKzxwIGNsYXNzPW5vdGU+CitOb3RlOiBUaGUgc2ltcGxlc3QgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZGVjb2RlIGEgc3RyaW5nIGZyb20gaXQncworUXVvdGVkLVByaW50YWJsZSB0cmFuc2ZlciBjb250ZW50IGVuY29kaW5nLiAKK05vdGljZSB0aGUgZXh0cmEgcGFyZW50aGVzaXMgYXJvdW5kIHRoZSBjYWxsIHRvIDx0dD5taW1lLnVucXA8L3R0PiwgdG8gZGlzY2FyZCB0aGUgc2Vjb25kIHJldHVybiB2YWx1ZS4KKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorcHJpbnQoKG1pbWUucXAoIm1hPUU3PUUzPSIpKSkKKy0tJmd0OyBtYefjCis8L3ByZT4KKworPCEtLSB3cnAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0id3JwIj4KK0EsIG0gPSBtaW1lLjxiPndycCg8L2I+biBbLCBCLCBsZW5ndGhdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitMb3ctbGV2ZWwgZmlsdGVyIHRvIGJyZWFrIHRleHQgaW50byBsaW5lcyB3aXRoIENSTEYgbWFya2VyLiAKK1RleHQgaXMgYXNzdW1lZCB0byBiZSBpbiB0aGUgPGEgaHJlZj0jbm9ybWFsaXplPjx0dD5ub3JtYWxpemU8L3R0PjwvYT4gZm9ybS4KKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5BPC90dD4gaXMgYSBjb3B5IG9mIDx0dD5CPC90dD4sIGJyb2tlbiBpbnRvIGxpbmVzIG9mIGF0IG1vc3QgCis8dHQ+bGVuZ3RoPC90dD4gYnl0ZXMgKGRlZmF1bHRzIHRvIDc2KS4gCisnPHR0Pm48L3R0Picgc2hvdWxkIHRlbGwgaG93IG1hbnkgYnl0ZXMgYXJlIGxlZnQgZm9yIHRoZSBmaXJzdCAKK2xpbmUgb2YgPHR0PkI8L3R0PiBhbmQgJzx0dD5tPC90dD4nIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyAKK2xlZnQgaW4gdGhlIGxhc3QgbGluZSBvZiA8dHQ+QTwvdHQ+LiAKKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFRoaXMgZnVuY3Rpb24gb25seSBicmVha3MgbGluZXMgdGhhdCBhcmUgYmlnZ2VyIHRoYW4gCis8dHQ+bGVuZ3RoPC90dD4gYnl0ZXMuIFRoZSByZXN1bHRpbmcgbGluZSBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSB0aGUgQ1JMRgorbWFya2VyLgorPC9wPgorCisKKzwhLS0gZm9vdGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9Zm9vdGVyPgorPGhyPgorPGNlbnRlcj4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3duIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4KKzwvcD4KKzxwPgorPHNtYWxsPgorTGFzdCBtb2RpZmllZCBieSBEaWVnbyBOZWhhYiBvbiA8YnI+CitUaHUgQXByIDIwIDAwOjI1OjQ0IEVEVCAyMDA2Cis8L3NtYWxsPgorPC9wPgorPC9jZW50ZXI+Cis8L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2RvYy9yZWZlcmVuY2UuY3NzIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9yZWZlcmVuY2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGQyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL3JlZmVyZW5jZS5jc3MKQEAgLTAsMCArMSw1NCBAQAorYm9keSB7IAorICAgIG1hcmdpbi1sZWZ0OiAxZW07IAorICAgIG1hcmdpbi1yaWdodDogMWVtOyAKKyAgICBmb250LWZhbWlseTogIlZlcmRhbmEiLCBzYW5zLXNlcmlmOyAKK30KKwordHQgeworICAgIGZvbnQtZmFtaWx5OiAiQW5kYWxlIE1vbm8iLCBtb25vc3BhY2U7IAorfQorCitoMSwgaDIsIGgzLCBoNCB7IG1hcmdpbi1sZWZ0OiAwZW07IH0KKworCitoMyB7IHBhZGRpbmctdG9wOiAxZW07IH0KKworcCB7IG1hcmdpbi1sZWZ0OiAxZW07IH0KKworcC5uYW1lIHsgCisgICAgZm9udC1mYW1pbHk6ICJBbmRhbGUgTW9ubyIsIG1vbm9zcGFjZTsgCisgICAgcGFkZGluZy10b3A6IDFlbTsKKyAgICBtYXJnaW4tbGVmdDogMGVtOyAKK30KKworYVtocmVmXSB7IGNvbG9yOiAjMDAwMDdmOyB9CisKK2Jsb2NrcXVvdGUgeyBtYXJnaW4tbGVmdDogM2VtOyB9CisKK3ByZS5leGFtcGxlIHsKKyAgICBiYWNrZ3JvdW5kOiAjY2NjOworICAgIHBhZGRpbmc6IDFlbTsKKyAgICBtYXJnaW4tbGVmdDogMWVtOworICAgIGZvbnQtZmFtaWx5OiAiQW5kYWxlIE1vbm8iLCBtb25vc3BhY2U7IAorICAgIGZvbnQtc2l6ZTogc21hbGw7Cit9CisKK2hyIHsgCisgICAgbWFyZ2luLWxlZnQ6IDBlbTsKKwliYWNrZ3JvdW5kOiAjMDAwMDdmOyAKKwlib3JkZXI6IDBweDsKKwloZWlnaHQ6IDFweDsKK30KKwordWwgeyBsaXN0LXN0eWxlLXR5cGU6IGRpc2M7IH0KKwordGFibGUuaW5kZXggeyBib3JkZXI6IDFweCAjMDAwMDdmOyB9Cit0YWJsZS5pbmRleCB0ZCB7IHRleHQtYWxpZ246IGxlZnQ7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0KK3RhYmxlLmluZGV4IHVsIHsgcGFkZGluZy10b3A6IDBlbTsgbWFyZ2luLXRvcDogMGVtOyB9CisKK2gxOmZpcnN0LWxldHRlciwgCitoMjpmaXJzdC1sZXR0ZXIsIAoraDI6Zmlyc3QtbGV0dGVyLCAKK2gzOmZpcnN0LWxldHRlciB7IGNvbG9yOiAjMDAwMDdmOyB9CisKK2Rpdi5oZWFkZXIsIGRpdi5mb290ZXIgeyBtYXJnaW4tbGVmdDogMGVtOyB9CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZG9jL3JlZmVyZW5jZS5odG1sIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9yZWZlcmVuY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI5ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2RvYy9yZWZlcmVuY2UuaHRtbApAQCAtMCwwICsxLDIzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iTHVhU29ja2V0OiBJbmRleCB0byByZWZlcmVuY2UgbWFudWFsIj4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJMdWEsIEx1YVNvY2tldCwgSW5kZXgsIE1hbnVhbCwgTmV0d29yaywgTGlicmFyeSwKK1N1cHBvcnQsIE1hbnVhbCI+IAorPHRpdGxlPkx1YVNvY2tldDogSW5kZXggdG8gcmVmZXJlbmNlIG1hbnVhbDwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InJlZmVyZW5jZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+CisKKzwhLS0gaGVhZGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1oZWFkZXI+Cis8aHI+Cis8Y2VudGVyPgorPHRhYmxlIHN1bW1hcnk9Ikx1YVNvY2tldCBsb2dvIj4KKzx0cj48dGQgYWxpZ249Y2VudGVyPjxhIGhyZWY9Imh0dHA6Ly93d3cubHVhLm9yZyI+Cis8aW1nIHdpZHRoPTEyOCBoZWlnaHQ9MTI4IGJvcmRlcj0wIGFsdD0iTHVhU29ja2V0IiBzcmM9Imx1YXNvY2tldC5wbmciPgorPC9hPjwvdGQ+PC90cj4KKzx0cj48dGQgYWxpZ249Y2VudGVyIHZhbGlnbj10b3A+TmV0d29yayBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd25sb2FkIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4gCis8L3A+Cis8L2NlbnRlcj4KKzxocj4KKzwvZGl2PgorCis8IS0tIHJlZmVyZW5jZSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMj5SZWZlcmVuY2U8L2gyPgorCis8YmxvY2txdW90ZT4KKzxhIGhyZWY9ImRucy5odG1sIj5ETlMgKGluIHNvY2tldCk8L2E+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9ImRucy5odG1sI3RvaXAiPnRvaXA8L2E+LAorPGEgaHJlZj0iZG5zLmh0bWwjdG9ob3N0bmFtZSI+dG9ob3N0bmFtZTwvYT4sCis8YSBocmVmPSJkbnMuaHRtbCNnZXRob3N0bmFtZSI+Z2V0aG9zdG5hbWU8L2E+LgorPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8IS0tIGZ0cCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8YmxvY2txdW90ZT4KKzxhIGhyZWY9ImZ0cC5odG1sIj5GVFA8L2E+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9ImZ0cC5odG1sI2dldCI+Z2V0PC9hPiwKKzxhIGhyZWY9ImZ0cC5odG1sI3B1dCI+cHV0PC9hPi4KKzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPCEtLSBodHRwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJodHRwLmh0bWwiPkhUVFA8L2E+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9Imh0dHAuaHRtbCNyZXF1ZXN0Ij5yZXF1ZXN0PC9hPi4KKzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPCEtLSBsdG4xMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxibG9ja3F1b3RlPgorPGEgaHJlZj0ibHRuMTIuaHRtbCI+TFROMTI8L2E+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9Imx0bjEyLmh0bWwjZmlsdGVyIj5maWx0ZXI8L2E+OgorPGEgaHJlZj0ibHRuMTIuaHRtbCNmaWx0ZXIuY2hhaW4iPmNoYWluPC9hPiwKKzxhIGhyZWY9Imx0bjEyLmh0bWwjZmlsdGVyLmN5Y2xlIj5jeWNsZTwvYT4uCis8L2Jsb2NrcXVvdGU+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9Imx0bjEyLmh0bWwjcHVtcCI+cHVtcDwvYT46Cis8YSBocmVmPSJsdG4xMi5odG1sI3B1bXAuYWxsIj5hbGw8L2E+LAorPGEgaHJlZj0ibHRuMTIuaHRtbCNwdW1wLnN0ZXAiPnN0ZXA8L2E+LgorPC9ibG9ja3F1b3RlPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJsdG4xMi5odG1sI3NpbmsiPnNpbms8L2E+OgorPGEgaHJlZj0ibHRuMTIuaHRtbCNzaW5rLmNoYWluIj5jaGFpbjwvYT4sCis8YSBocmVmPSJsdG4xMi5odG1sI3NpbmsuZXJyb3IiPmVycm9yPC9hPiwKKzxhIGhyZWY9Imx0bjEyLmh0bWwjc2luay5maWxlIj5maWxlPC9hPiwKKzxhIGhyZWY9Imx0bjEyLmh0bWwjc2luay5udWxsIj5udWxsPC9hPiwKKzxhIGhyZWY9Imx0bjEyLmh0bWwjc2luay5zaW1wbGlmeSI+c2ltcGxpZnk8L2E+LAorPGEgaHJlZj0ibHRuMTIuaHRtbCNzaW5rLnRhYmxlIj50YWJsZTwvYT4uCis8L2Jsb2NrcXVvdGU+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9Imx0bjEyLmh0bWwjc291cmNlIj5zb3VyY2U8L2E+OiAKKzxhIGhyZWY9Imx0bjEyLmh0bWwjc291cmNlLmNhdCI+Y2F0PC9hPiwKKzxhIGhyZWY9Imx0bjEyLmh0bWwjc291cmNlLmNoYWluIj5jaGFpbjwvYT4sCis8YSBocmVmPSJsdG4xMi5odG1sI3NvdXJjZS5lbXB0eSI+ZW1wdHk8L2E+LAorPGEgaHJlZj0ibHRuMTIuaHRtbCNzb3VyY2UuZXJyb3IiPmVycm9yPC9hPiwKKzxhIGhyZWY9Imx0bjEyLmh0bWwjc291cmNlLmZpbGUiPmZpbGU8L2E+LAorPGEgaHJlZj0ibHRuMTIuaHRtbCNzb3VyY2Uuc2ltcGxpZnkiPnNpbXBsaWZ5PC9hPiwKKzxhIGhyZWY9Imx0bjEyLmh0bWwjc291cmNlLnN0cmluZyI+c3RyaW5nPC9hPi4KKzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPCEtLSBtaW1lICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJtaW1lLmh0bWwiPk1JTUU8L2E+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9Im1pbWUuaHRtbCNoaWdoIj5oaWdoLWxldmVsPC9hPjoKKzxhIGhyZWY9Im1pbWUuaHRtbCNub3JtYWxpemUiPm5vcm1hbGl6ZTwvYT4sCis8YSBocmVmPSJtaW1lLmh0bWwjZGVjb2RlIj5kZWNvZGU8L2E+LAorPGEgaHJlZj0ibWltZS5odG1sI2VuY29kZSI+ZW5jb2RlPC9hPiwKKzxhIGhyZWY9Im1pbWUuaHRtbCNzdHVmZiI+c3R1ZmY8L2E+LAorPGEgaHJlZj0ibWltZS5odG1sI3dyYXAiPndyYXA8L2E+LgorPC9ibG9ja3F1b3RlPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJtaW1lLmh0bWwjbG93Ij5sb3ctbGV2ZWw8L2E+OgorPGEgaHJlZj0ibWltZS5odG1sI2I2NCI+YjY0PC9hPiwKKzxhIGhyZWY9Im1pbWUuaHRtbCNkb3QiPmRvdDwvYT4sCis8YSBocmVmPSJtaW1lLmh0bWwjZW9sIj5lb2w8L2E+LAorPGEgaHJlZj0ibWltZS5odG1sI3FwIj5xcDwvYT4sCis8YSBocmVmPSJtaW1lLmh0bWwjd3JwIj53cnA8L2E+LAorPGEgaHJlZj0ibWltZS5odG1sI3Fwd3JwIj5xcHdycDwvYT4uCis8YSBocmVmPSJtaW1lLmh0bWwjdW5iNjQiPnVuYjY0PC9hPiwKKzxhIGhyZWY9Im1pbWUuaHRtbCN1bnFwIj51bnFwPC9hPiwKKzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPCEtLSBzbXRwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJzbXRwLmh0bWwiPlNNVFA8L2E+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9InNtdHAuaHRtbCNtZXNzYWdlIj5tZXNzYWdlPC9hPiwKKzxhIGhyZWY9InNtdHAuaHRtbCNzZW5kIj5zZW5kPC9hPi4KKzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPCEtLSBzb2NrZXQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJzb2NrZXQuaHRtbCI+U29ja2V0PC9hPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJzb2NrZXQuaHRtbCNkZWJ1ZyI+X0RFQlVHPC9hPiwKKzxhIGhyZWY9ImRucy5odG1sI2RucyI+ZG5zPC9hPiwKKzxhIGhyZWY9InNvY2tldC5odG1sI2dldHRpbWUiPmdldHRpbWU8L2E+LAorPGEgaHJlZj0ic29ja2V0Lmh0bWwjbmV3dHJ5Ij5uZXd0cnk8L2E+LAorPGEgaHJlZj0ic29ja2V0Lmh0bWwjcHJvdGVjdCI+cHJvdGVjdDwvYT4sCis8YSBocmVmPSJzb2NrZXQuaHRtbCNzZWxlY3QiPnNlbGVjdDwvYT4sCis8YSBocmVmPSJzb2NrZXQuaHRtbCNzaW5rIj5zaW5rPC9hPiwKKzxhIGhyZWY9InNvY2tldC5odG1sI3NraXAiPnNraXA8L2E+LAorPGEgaHJlZj0ic29ja2V0Lmh0bWwjc2xlZXAiPnNsZWVwPC9hPiwKKzxhIGhyZWY9InNvY2tldC5odG1sI3NvdXJjZSI+c291cmNlPC9hPiwKKzxhIGhyZWY9InRjcC5odG1sI3RjcCI+dGNwPC9hPiwKKzxhIGhyZWY9InNvY2tldC5odG1sI3RyeSI+dHJ5PC9hPiwKKzxhIGhyZWY9InVkcC5odG1sI3VkcCI+dWRwPC9hPiwKKzxhIGhyZWY9InNvY2tldC5odG1sI3ZlcnNpb24iPl9WRVJTSU9OPC9hPi4KKzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPCEtLSB0Y3AgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8YmxvY2txdW90ZT4KKzxhIGhyZWY9InRjcC5odG1sIj5UQ1AgKGluIHNvY2tldCk8L2E+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9InRjcC5odG1sI2FjY2VwdCI+YWNjZXB0PC9hPiwKKzxhIGhyZWY9InRjcC5odG1sI2JpbmQiPmJpbmQ8L2E+LAorPGEgaHJlZj0idGNwLmh0bWwjY2xvc2UiPmNsb3NlPC9hPiwKKzxhIGhyZWY9InRjcC5odG1sI2Nvbm5lY3QiPmNvbm5lY3Q8L2E+LAorPGEgaHJlZj0idGNwLmh0bWwjZ2V0cGVlcm5hbWUiPmdldHBlZXJuYW1lPC9hPiwKKzxhIGhyZWY9InRjcC5odG1sI2dldHNvY2tuYW1lIj5nZXRzb2NrbmFtZTwvYT4sCis8YSBocmVmPSJ0Y3AuaHRtbCNnZXRzdGF0cyI+Z2V0c3RhdHM8L2E+LAorPGEgaHJlZj0idGNwLmh0bWwjcmVjZWl2ZSI+cmVjZWl2ZTwvYT4sCis8YSBocmVmPSJ0Y3AuaHRtbCNzZW5kIj5zZW5kPC9hPiwKKzxhIGhyZWY9InRjcC5odG1sI3NldG9wdGlvbiI+c2V0b3B0aW9uPC9hPiwKKzxhIGhyZWY9InRjcC5odG1sI3NldHN0YXRzIj5zZXRzdGF0czwvYT4sCis8YSBocmVmPSJ0Y3AuaHRtbCNzZXR0aW1lb3V0Ij5zZXR0aW1lb3V0PC9hPiwKKzxhIGhyZWY9InRjcC5odG1sI3NodXRkb3duIj5zaHV0ZG93bjwvYT4uCis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzwhLS0gdWRwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJ1ZHAuaHRtbCI+VURQIChpbiBzb2NrZXQpPC9hPgorPGJsb2NrcXVvdGU+Cis8YSBocmVmPSJ1ZHAuaHRtbCNjbG9zZSI+Y2xvc2U8L2E+LAorPGEgaHJlZj0idWRwLmh0bWwjZ2V0cGVlcm5hbWUiPmdldHBlZXJuYW1lPC9hPiwKKzxhIGhyZWY9InVkcC5odG1sI2dldHNvY2tuYW1lIj5nZXRzb2NrbmFtZTwvYT4sCis8YSBocmVmPSJ1ZHAuaHRtbCNyZWNlaXZlIj5yZWNlaXZlPC9hPiwKKzxhIGhyZWY9InVkcC5odG1sI3JlY2VpdmVmcm9tIj5yZWNlaXZlZnJvbTwvYT4sCis8YSBocmVmPSJ1ZHAuaHRtbCNzZW5kIj5zZW5kPC9hPiwKKzxhIGhyZWY9InVkcC5odG1sI3NlbmR0byI+c2VuZHRvPC9hPiwKKzxhIGhyZWY9InVkcC5odG1sI3NldHBlZXJuYW1lIj5zZXRwZWVybmFtZTwvYT4sCis8YSBocmVmPSJ1ZHAuaHRtbCNzZXRzb2NrbmFtZSI+c2V0c29ja25hbWU8L2E+LAorPGEgaHJlZj0idWRwLmh0bWwjc2V0b3B0aW9uIj5zZXRvcHRpb248L2E+LAorPGEgaHJlZj0idWRwLmh0bWwjc2V0dGltZW91dCI+c2V0dGltZW91dDwvYT4uCis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzwhLS0gdXJsICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxibG9ja3F1b3RlPgorPGEgaHJlZj0idXJsLmh0bWwiPlVSTDwvYT4KKzxibG9ja3F1b3RlPgorPGEgaHJlZj0idXJsLmh0bWwjYWJzb2x1dGUiPmFic29sdXRlPC9hPiwKKzxhIGhyZWY9InVybC5odG1sI2J1aWxkIj5idWlsZDwvYT4sCis8YSBocmVmPSJ1cmwuaHRtbCNidWlsZF9wYXRoIj5idWlsZF9wYXRoPC9hPiwKKzxhIGhyZWY9InVybC5odG1sI2VzY2FwZSI+ZXNjYXBlPC9hPiwKKzxhIGhyZWY9InVybC5odG1sI3BhcnNlIj5wYXJzZTwvYT4sCis8YSBocmVmPSJ1cmwuaHRtbCNwYXJzZV9wYXRoIj5wYXJzZV9wYXRoPC9hPiwKKzxhIGhyZWY9InVybC5odG1sI3VuZXNjYXBlIj51bmVzY2FwZTwvYT4uCis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzwhLS0gZm9vdGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1mb290ZXI+Cis8aHI+Cis8Y2VudGVyPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd24iPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPgorPC9wPgorPHA+Cis8c21hbGw+CitMYXN0IG1vZGlmaWVkIGJ5IERpZWdvIE5laGFiIG9uIDxicj4KK1RodSBBcHIgMjAgMDA6MjU6NDcgRURUIDIwMDYKKzwvc21hbGw+Cis8L3A+Cis8L2NlbnRlcj4KKzwvZGl2PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZG9jL3NtdHAuaHRtbCBiL2x1YXNvY2tldC0yLjAuMi9kb2Mvc210cC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZGQ0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL3NtdHAuaHRtbApAQCAtMCwwICsxLDQxNyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iTHVhU29ja2V0OiBTTVRQIHN1cHBvcnQiPgorPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Ikx1YSwgTHVhU29ja2V0LCBTTVRQLCBFLU1haWwsIE1JTUUsIE11bHRpcGFydCwKK0xpYnJhcnksIFN1cHBvcnQiPiAKKzx0aXRsZT5MdWFTb2NrZXQ6IFNNVFAgc3VwcG9ydDwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InJlZmVyZW5jZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+CisKKzwhLS0gaGVhZGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9aGVhZGVyPgorPGhyPgorPGNlbnRlcj4KKzx0YWJsZSBzdW1tYXJ5PSJMdWFTb2NrZXQgbG9nbyI+Cis8dHI+PHRkIGFsaWduPWNlbnRlcj48YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPgorPGltZyB3aWR0aD0xMjggaGVpZ2h0PTEyOCBib3JkZXI9MCBhbHQ9Ikx1YVNvY2tldCIgc3JjPSJsdWFzb2NrZXQucG5nIj4KKzwvYT48L3RkPjwvdHI+Cis8dHI+PHRkIGFsaWduPWNlbnRlciB2YWxpZ249dG9wPk5ldHdvcmsgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorPC90ZD48L3RyPgorPC90YWJsZT4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3dubG9hZCI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+IAorPC9wPgorPC9jZW50ZXI+Cis8aHI+Cis8L2Rpdj4KKworPCEtLSBzbXRwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgyIGlkPXNtdHA+U01UUDwvaDI+IAorCis8cD4gVGhlICA8dHQ+c210cDwvdHQ+IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIHNlbmQgZS1tYWlsCittZXNzYWdlcy4gVGhlIGhpZ2gtbGV2ZWwgQVBJIGNvbnNpc3RzIG9mIHR3byBmdW5jdGlvbnM6IG9uZSB0byAKK2RlZmluZSBhbiBlLW1haWwgbWVzc2FnZSwgYW5kIGFub3RoZXIgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZS4KK0FsdGhvdWdoIGFsbW9zdCBhbGwgdXNlcnMgd2lsbCBmaW5kIHRoYXQgdGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgbW9yZSB0aGFuCitlbm91Z2ggZnVuY3Rpb25hbGl0eSwgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBldmVuIG1vcmUKK2NvbnRyb2wgKGlmIHlvdSBib3RoZXIgdG8gcmVhZCB0aGUgY29kZSkuICAKKzwvcD4KKworPHA+VGhlIGltcGxlbWVudGF0aW9uIGNvbmZvcm1zIHRvIHRoZSBTaW1wbGUgTWFpbCBUcmFuc2ZlciBQcm90b2NvbCwKKzxhIGhyZWY9Imh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+ZGllZ28vcmZjL3JmYzI4MjEudHh0Ij5SRkMgMjgyMTwvYT4uCitBbm90aGVyIFJGQyBvZiBpbnRlcmVzdCBpcyA8YQoraHJlZj0iaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35kaWVnby9yZmMvcmZjMjgyMi50eHQiPlJGQyAyODIyPC9hPiwKK3doaWNoIGdvdmVybnMgdGhlIEludGVybmV0IE1lc3NhZ2UgRm9ybWF0LgorTXVsdGlwYXJ0IG1lc3NhZ2VzICh0aG9zZSB0aGF0IGNvbnRhaW4gYXR0YWNobWVudHMpIGFyZSBwYXJ0CitvZiB0aGUgTUlNRSBzdGFuZGFyZCwgYnV0IGRlc2NyaWJlZCBtYWlubHkKK2luIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+ZGllZ28vcmZjL3JmYzIwNDYudHh0Ij5SRkMKKzIwNDY8L2E+CisKKzxwPiBJbiB0aGUgZGVzY3JpcHRpb24gYmVsb3csIGdvb2QgdW5kZXJzdGFuZGluZyBvZiA8YQoraHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj4gTFROMDEyLCBGaWx0ZXJzCitzb3VyY2VzIGFuZCBzaW5rczwvYT4gYW5kIHRoZSAgPGEgaHJlZj1taW1lLmh0bWw+TUlNRTwvYT4gbW9kdWxlIGlzCithc3N1bWVkLiAgSW4gZmFjdCwgdGhlIFNNVFAgbW9kdWxlIHdhcyB0aGUgbWFpbiByZWFzb24gZm9yIHRoZWlyIAorY3JlYXRpb24uIDwvcD4KKworPHA+IAorVG8gb2J0YWluIHRoZSA8dHQ+c210cDwvdHQ+IG5hbWVzcGFjZSwgcnVuOgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkcyB0aGUgU01UUCBtb2R1bGUgYW5kIGV2ZXJ5dGhpbmcgaXQgcmVxdWlyZXMKK2xvY2FsIHNtdHAgPSByZXF1aXJlKCJzb2NrZXQuc210cCIpCis8L3ByZT4KKworPHA+CitNSU1FIGhlYWRlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgTHVhIHRhYmxlIGluIHRoZSBmb3JtOgorPC9wPgorCis8YmxvY2txdW90ZT4KKzx0YWJsZSBzdW1tYXJ5PSJNSU1FIGhlYWRlcnMgaW4gTHVhIHRhYmxlIj4KKzx0cj48dGQ+PHR0PgoraGVhZGVycyA9IHs8YnI+CismbmJzcDsmbmJzcDtmaWVsZC0xLW5hbWUgPSA8aT5maWVsZC0xLXZhbHVlPC9pPiw8YnI+CismbmJzcDsmbmJzcDtmaWVsZC0yLW5hbWUgPSA8aT5maWVsZC0yLXZhbHVlPC9pPiw8YnI+CismbmJzcDsmbmJzcDtmaWVsZC0zLW5hbWUgPSA8aT5maWVsZC0zLXZhbHVlPC9pPiw8YnI+CismbmJzcDsmbmJzcDsuLi48YnI+CismbmJzcDsmbmJzcDtmaWVsZC1uLW5hbWUgPSA8aT5maWVsZC1uLXZhbHVlPC9pPjxicj4KK30KKzwvdHQ+PC90ZD48L3RyPgorPC90YWJsZT4KKzwvYmxvY2txdW90ZT4KKworPHA+CitGaWVsZCBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSAoYXMgIHNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQpIGFuZCBhbGwKK2Z1bmN0aW9ucyAgd29yayB3aXRoICBsb3dlcmNhc2UgZmllbGQgbmFtZXMuICAKK0ZpZWxkIHZhbHVlcyBhcmUgbGVmdCB1bm1vZGlmaWVkLgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogTUlNRSBoZWFkZXJzIGFyZSBpbmRlcGVuZGVudCBvZiBvcmRlci4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBwcm9ibGVtCitpbiByZXByZXNlbnRpbmcgdGhlbSBpbiBhIEx1YSB0YWJsZS4gCis8L3A+CisKKzxwPgorVGhlIGZvbGxvd2luZyBjb25zdGFudHMgY2FuIGJlIHNldCB0byBjb250cm9sIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mCit0aGUgU01UUCBtb2R1bGU6IAorPC9wPgorCis8dWw+Cis8bGk+IDx0dD5ET01BSU48L3R0PjogZG9tYWluIHVzZWQgdG8gZ3JlZXQgdGhlIHNlcnZlcjsKKzxsaT4gPHR0PlBPUlQ8L3R0PjogZGVmYXVsdCBwb3J0IHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uOworPGxpPiA8dHQ+U0VSVkVSPC90dD46IGRlZmF1bHQgc2VydmVyIHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uOworPGxpPiA8dHQ+VElNRU9VVDwvdHQ+OiBkZWZhdWx0IHRpbWVvdXQgZm9yIGFsbCBJL08gb3BlcmF0aW9uczsKKzxsaT4gPHR0PlpPTkU8L3R0PjogZGVmYXVsdCB0aW1lIHpvbmUuCis8L3VsPgorCis8IS0tIHNlbmQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPXNlbmQ+IAorc210cC48Yj5zZW5kezwvYj48YnI+CismbmJzcDsmbmJzcDtmcm9tID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDtyY3B0ID0gPGk+c3RyaW5nPC9pPiBvciA8aT5zdHJpbmctdGFibGU8L2k+LDxicj4KKyZuYnNwOyZuYnNwO3NvdXJjZSA9IDxpPkxUTjEyIHNvdXJjZTwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7W3VzZXIgPSA8aT5zdHJpbmc8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbcGFzc3dvcmQgPSA8aT5zdHJpbmc8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbc2VydmVyID0gPGk+c3RyaW5nPC9pPixdPGJyPgorJm5ic3A7Jm5ic3A7W3BvcnQgPSA8aT5udW1iZXI8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbZG9tYWluID0gPGk+c3RyaW5nPC9pPixdPGJyPgorJm5ic3A7Jm5ic3A7W3N0ZXAgPSA8aT5MVE4xMiBwdW1wIHN0ZXA8L2k+LF08YnI+CismbmJzcDsmbmJzcDtbY3JlYXRlID0gPGk+ZnVuY3Rpb248L2k+XTxicj4KKzxiPn08L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorU2VuZHMgYSBtZXNzYWdlIHRvIGEgcmVjaXBpZW50IGxpc3QuIFNpbmNlIHNlbmRpbmcgbWVzc2FnZXMgaXMgbm90IGFzCitzaW1wbGUgYXMgZG93bmxvYWRpbmcgYW4gVVJMIGZyb20gYSBGVFAgb3IgSFRUUCBzZXJ2ZXIsIHRoaXMgZnVuY3Rpb24gCitkb2Vzbid0IGhhdmUgYSBzaW1wbGUgaW50ZXJmYWNlLiBIb3dldmVyLCBzZWUgdGhlIAorPGEgaHJlZj0jbWVzc2FnZT48dHQ+bWVzc2FnZTwvdHQ+PC9hPiBzb3VyY2UgZmFjdG9yeSBmb3IgCithIHZlcnkgcG93ZXJmdWwgd2F5IHRvIGRlZmluZSB0aGUgbWVzc2FnZSBjb250ZW50cy4KKzwvcD4KKworCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorVGhlIHNlbmRlciBpcyBnaXZlbiBieSB0aGUgZS1tYWlsIGFkZHJlc3MgaW4gdGhlIDx0dD5mcm9tPC90dD4gZmllbGQuIAorPHR0PlJjcHQ8L3R0PiBpcyBhIEx1YSB0YWJsZSB3aXRoIG9uZSBlbnRyeSBmb3IgZWFjaCByZWNpcGllbnQgZS1tYWlsCithZGRyZXNzLCBvciBhIHN0cmluZworaW4gY2FzZSB0aGVyZSBpcyBqdXN0IG9uZSByZWNpcGllbnQuIAorVGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGFyZSBnaXZlbiBieSBhIDxlbT5zaW1wbGU8L2VtPiAKKzxhIGhyZWY9Imh0dHA6Ly9sdWEtdXNlcnMub3JnL3dpa2kvRmlsdGVyc1NvdXJjZXNBbmRTaW5rcyI+TFROMTI8L2E+IAorPHR0PnNvdXJjZTwvdHQ+LiBTZXZlcmFsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWw6Cis8L3A+Cis8dWw+Cis8bGk+IDx0dD51c2VyPC90dD4sIDx0dD5wYXNzd29yZDwvdHQ+OiBVc2VyIGFuZCBwYXNzd29yZCBmb3IKK2F1dGhlbnRpY2F0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IExPR0lOIGFuZCBQTEFJTiBhdXRoZW50aWNhdGlvbgorbWV0aG9kcyBpZiBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciAoYm90aCBhcmUgdW5zYWZlKTsKKzxsaT4gPHR0PnNlcnZlcjwvdHQ+OiBTZXJ2ZXIgdG8gY29ubmVjdCB0by4gRGVmYXVsdHMgdG8gImxvY2FsaG9zdCI7Cis8bGk+IDx0dD5wb3J0PC90dD46IFBvcnQgdG8gY29ubmVjdCB0by4gRGVmYXVsdHMgdG8gMjU7Cis8bGk+IDx0dD5kb21haW48L3R0PjogRG9tYWluIG5hbWUgdXNlZCB0byBncmVldCB0aGUgc2VydmVyOyBEZWZhdWx0cyB0byB0aGUKK2xvY2FsIG1hY2hpbmUgaG9zdCBuYW1lOyAKKzxsaT4gPHR0PnN0ZXA8L3R0PjogCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPkxUTjEyPC9hPiAKK3B1bXAgc3RlcCBmdW5jdGlvbiB1c2VkIHRvIHBhc3MgZGF0YSBmcm9tIHRoZQorc291cmNlIHRvIHRoZSBzZXJ2ZXIuIERlZmF1bHRzIHRvIHRoZSBMVE4xMiA8dHQ+cHVtcC5zdGVwPC90dD4gZnVuY3Rpb247Cis8bGk+PHR0PmNyZWF0ZTwvdHQ+OiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGluc3RlYWQgb2YKKzxhIGhyZWY9dGNwLmh0bWwjc29ja2V0LnRjcD48dHQ+c29ja2V0LnRjcDwvdHQ+PC9hPiB3aGVuIHRoZSBjb21tdW5pY2F0aW9ucyBzb2NrZXQgaXMgY3JlYXRlZC4gCis8L3VsPgorCis8cCBjbGFzcz1yZXR1cm4+IAorSWYgIHN1Y2Nlc3NmdWwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMKKzxiPjx0dD5uaWw8L3R0PjwvYj4gZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZS4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFNNVFAgc2VydmVycyBjYW4gYmUgdmVyeSBwaWNreSB3aXRoIHRoZSBmb3JtYXQgb2YgZS1tYWlsCithZGRyZXNzZXMuIFRvIGJlIHNhZmUsIHVzZSBvbmx5IGFkZHJlc3NlcyBvZiB0aGUgZm9ybQorIjx0dD4mbHQ7ZnVsYW5vQGV4YW1wbGUuY29tJmd0OzwvdHQ+IiBpbiB0aGUgPHR0PmZyb208L3R0PiBhbmQKKzx0dD5yY3B0PC90dD4gYXJndW1lbnRzIHRvIHRoZSA8dHQ+c2VuZDwvdHQ+IGZ1bmN0aW9uLiBJbiBoZWFkZXJzLCBlLW1haWwKK2FkZHJlc3NlcyBjYW4gdGFrZSB3aGF0ZXZlciBmb3JtIHlvdSBsaWtlLiAgPC9wPgorCis8cCBjbGFzcz1ub3RlPgorQmlnIG5vdGU6IFRoZXJlIGlzIGEgZ29vZCBkZWFsIG9mIG1pc2NvbmNlcHRpb24gd2l0aCB0aGUgdXNlIG9mIHRoZQorZGVzdGluYXRpb24gYWRkcmVzcyBmaWVsZCBoZWFkZXJzLCBpLmUuLCB0aGUgJzx0dD5UbzwvdHQ+JywgJzx0dD5DYzwvdHQ+JywKK2FuZCwgbW9yZSBpbXBvcnRhbnRseSwgdGhlICc8dHQ+QmNjPC90dD4nIGhlYWRlcnMuIERvIDxlbT5ub3Q8L2VtPiBhZGQgYQorJzx0dD5CY2M8L3R0PicgaGVhZGVyIHRvIHlvdXIgbWVzc2FnZXMgYmVjYXVzZSBpdCB3aWxsIHByb2JhYmx5IGRvIHRoZQorZXhhY3Qgb3Bwb3NpdGUgb2Ygd2hhdCB5b3UgZXhwZWN0LgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorT25seSByZWNpcGllbnRzIHNwZWNpZmllZCBpbiB0aGUgPHR0PnJjcHQ8L3R0PiBsaXN0IHdpbGwgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlCittZXNzYWdlLiAgRWFjaCByZWNpcGllbnQgb2YgYW4gU01UUCBtYWlsIG1lc3NhZ2UgcmVjZWl2ZXMgYSBjb3B5IG9mIHRoZQorbWVzc2FnZSBib2R5IGFsb25nIHdpdGggdGhlIGhlYWRlcnMsIGFuZCBub3RoaW5nIG1vcmUuICBUaGUgaGVhZGVycworPGVtPmFyZTwvZW0+IHBhcnQgb2YgdGhlIG1lc3NhZ2UgYW5kIHNob3VsZCBiZSBwcm9kdWNlZCBieSB0aGUgCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPkxUTjEyPC9hPiAKKzx0dD5zb3VyY2U8L3R0PiBmdW5jdGlvbi4gVGhlIDx0dD5yY3B0PC90dD4gbGlzdCBpcyA8ZW0+bm90PC9lbT4KK3BhcnQgb2YgdGhlIG1lc3NhZ2UgYW5kIHdpbGwgbm90IGJlIHNlbnQgdG8gYW55b25lLgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorPGEgaHJlZj0iaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35kaWVnby9yZmMvcmZjMjgyMi50eHQiPlJGQyAyODIyPC9hPgoraGFzIHR3byA8ZW0+aW1wb3J0YW50IGFuZCBzaG9ydDwvZW0+IHNlY3Rpb25zLCAiMy42LjMuIERlc3RpbmF0aW9uIGFkZHJlc3MKK2ZpZWxkcyIgYW5kICI1LiBTZWN1cml0eSBjb25zaWRlcmF0aW9ucyIsICBleHBsYWluaW5nIHRoZSBwcm9wZXIKK3VzZSBvZiB0aGVzZSBoZWFkZXJzLiBIZXJlIGlzIGEgc3VtbWFyeSBvZiB3aGF0IGl0IHNheXM6IAorPC9wPgorCis8dWw+Cis8bGk+IDx0dD5UbzwvdHQ+OiBjb250YWlucyB0aGUgYWRkcmVzcyhlcykgb2YgdGhlIHByaW1hcnkgcmVjaXBpZW50KHMpCitvZiB0aGUgbWVzc2FnZTsKKzxsaT4gPHR0PkNjPC90dD46ICh3aGVyZSB0aGUgIkNjIiBtZWFucyAiQ2FyYm9uIENvcHkiIGluIHRoZSBzZW5zZSBvZgorbWFraW5nIGEgY29weSBvbiBhIHR5cGV3cml0ZXIgdXNpbmcgY2FyYm9uIHBhcGVyKSBjb250YWlucyB0aGUKK2FkZHJlc3NlcyBvZiBvdGhlcnMgd2hvIGFyZSB0byByZWNlaXZlIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlCitjb250ZW50IG9mIHRoZSBtZXNzYWdlIG1heSBub3QgYmUgZGlyZWN0ZWQgYXQgdGhlbTsKKzxsaT4gPHR0PkJjYzwvdHQ+OiAod2hlcmUgdGhlICJCY2MiIG1lYW5zICJCbGluZCBDYXJib24KK0NvcHkiKSBjb250YWlucyBhZGRyZXNzZXMgb2YgcmVjaXBpZW50cyBvZiB0aGUgbWVzc2FnZSB3aG9zZSBhZGRyZXNzZXMgYXJlIG5vdCB0byBiZSByZXZlYWxlZCB0byBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBtZXNzYWdlLgorPC91bD4gCisKKzxwIGNsYXNzPW5vdGU+CitUaGUgTHVhU29ja2V0IDx0dD5zZW5kPC90dD4gZnVuY3Rpb24gZG9lcyBub3QgY2FyZSBvciBpbnRlcnByZXQgdGhlIAoraGVhZGVycyB5b3Ugc2VuZCwgYnV0IGl0IGdpdmVzIHlvdSBmdWxsIGNvbnRyb2wgb3ZlciB3aGF0IGlzIHNlbnQgYW5kIAordG8gd2hvbSBpdCBpcyBzZW50OgorPC9wPgorPHVsPgorPGxpPiBJZiBzb21lb25lIGlzIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UsIHRoZSBlLW1haWwgYWRkcmVzcyA8ZW0+aGFzPC9lbT4KK3RvIGJlIGluIHRoZSByZWNpcGllbnQgbGlzdC4gVGhpcyBpcyB0aGUgb25seSBwYXJhbWV0ZXIgdGhhdCBjb250cm9scyB3aG8KK2dldHMgYSBjb3B5IG9mIHRoZSBtZXNzYWdlOworPGxpPiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmVjaXBpZW50cywgbm9uZSBvZiB0aGVtIHdpbGwgYXV0b21hdGljYWxseSAKK2tub3cgdGhhdCBzb21lb25lIGVsc2UgZ290IHRoYXQgbWVzc2FnZS4gVGhhdCBpcywgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKK3NpbWlsYXIgdG8gdGhlIDx0dD5CY2M8L3R0PiBmaWVsZCBvZiBwb3B1bGFyIGUtbWFpbCBjbGllbnRzOyAKKzxsaT4gSXQgaXMgdXAgdG8geW91IHRvIGFkZCB0aGUgPHR0PlRvPC90dD4gaGVhZGVyIHdpdGggdGhlIGxpc3Qgb2YgcHJpbWFyeQorcmVjaXBpZW50cyBzbyB0aGF0IG90aGVyIHJlY2lwaWVudHMgY2FuIHNlZSBpdDsKKzxsaT4gSXQgaXMgYWxzbyB1cCB0byB5b3UgdG8gYWRkIHRoZSA8dHQ+Q2M8L3R0PiBoZWFkZXIgd2l0aCB0aGUgCitsaXN0IG9mIGFkZGl0aW9uYWwgcmVjaXBpZW50cyBzbyB0aGF0IGV2ZXJ5b25lIGVsc2Ugc2VlcyBpdDsKKzxsaT4gQWRkaW5nIGEgaGVhZGVyIDx0dD5CY2M8L3R0PiBpcyBub25zZW5zZSwgdW5sZXNzIGl0IGlzIAorZW1wdHkuIE90aGVyd2lzZSwgZXZlcnlvbmUgcmVjZWl2aW5nIHRoZSBtZXNzYWdlIHdpbGwgc2VlIGl0IGFuZCB0aGF0IGlzCitleGFjdGx5IHdoYXQgeW91IDxlbT5kb24ndDwvZW0+IHdhbnQgdG8gaGFwcGVuIQorPC91bD4KKworPHAgY2xhc3M9bm90ZT4KK0kgaG9wZSB0aGlzIGNsYXJpZmllcyB0aGUgaXNzdWUuIE90aGVyd2lzZSwgcGxlYXNlIHJlZmVyIHRvIAorPGEgaHJlZj0iaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35kaWVnby9yZmMvcmZjMjgyMS50eHQiPlJGQyAyODIxPC9hPgorYW5kCis8YSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3JmYy9yZmMyODIyLnR4dCI+UkZDIDI4MjI8L2E+LgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIHRoZSBzbXRwIHN1cHBvcnQKK2xvY2FsIHNtdHAgPSByZXF1aXJlKCJzb2NrZXQuc210cCIpCisKKy0tIENvbm5lY3RzIHRvIHNlcnZlciAibG9jYWxob3N0IiBhbmQgc2VuZHMgYSBtZXNzYWdlIHRvIHVzZXJzCistLSAiZnVsYW5vQGV4YW1wbGUuY29tIiwgICJiZWx0cmFub0BleGFtcGxlLmNvbSIsIAorLS0gYW5kICJzaWNyYW5vQGV4YW1wbGUuY29tIi4KKy0tIE5vdGUgdGhhdCAiZnVsYW5vIiBpcyB0aGUgcHJpbWFyeSByZWNpcGllbnQsICJiZWx0cmFubyIgcmVjZWl2ZXMgYQorLS0gY2FyYm9uIGNvcHkgYW5kIG5laXRoZXIgb2YgdGhlbSBrbm93cyB0aGF0ICJzaWNyYW5vIiByZWNlaXZlZCBhIGJsaW5kCistLSBjYXJib24gY29weSBvZiB0aGUgbWVzc2FnZS4KK2Zyb20gPSAiJmx0O2x1YXNvY2tldEBleGFtcGxlLmNvbSZndDsiCisKK3JjcHQgPSB7CisgICImbHQ7ZnVsYW5vQGV4YW1wbGUuY29tJmd0OyIsCisgICImbHQ7YmVsdHJhbm9AZXhhbXBsZS5jb20mZ3Q7IiwKKyAgIiZsdDtzaWNyYW5vQGV4YW1wbGUuY29tJmd0OyIKK30KKworbWVzZ3QgPSB7CisgIGhlYWRlcnMgPSB7CisgICAgdG8gPSAiRnVsYW5vIGRhIFNpbHZhICZsdDtmdWxhbm9AZXhhbXBsZS5jb20mZ3Q7IiwKKyAgICBjYyA9ICciQmVsdHJhbm8gRi4gTnVuZXMiICZsdDtiZWx0cmFub0BleGFtcGxlLmNvbSZndDsnLAorICAgIHN1YmplY3QgPSAiTXkgZmlyc3QgbWVzc2FnZSIKKyAgfSwKKyAgYm9keSA9ICJJIGhvcGUgdGhpcyB3b3Jrcy4gSWYgaXQgZG9lcywgSSBjYW4gc2VuZCB5b3UgYW5vdGhlciAxMDAwIGNvcGllcy4iCit9CisKK3IsIGUgPSBzbXRwLnNlbmR7CisgIGZyb20gPSBmcm9tLAorICByY3B0ID0gcmNwdCwgCisgIHNvdXJjZSA9IHNtdHAubWVzc2FnZShtZXNndCkKK30KKzwvcHJlPgorCis8IS0tIG1lc3NhZ2UgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPW1lc3NhZ2U+IAorc210cC48Yj5tZXNzYWdlKDwvYj5tZXNndDxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorUmV0dXJucyBhIDxlbT5zaW1wbGU8L2VtPgorPGEgaHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj5MVE4xMjwvYT4gc291cmNlIHRoYXQgc2VuZHMgYW4gU01UUCBtZXNzYWdlIGJvZHksIHBvc3NpYmx5IG11bHRpcGFydCAoYXJiaXRyYXJpbHkgZGVlcCkuIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorVGhlIG9ubHkgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiBpcyBhIHRhYmxlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UuCis8dHQ+TWVzZ3Q8L3R0PiBoYXMgdGhlIGZvbGxvd2luZyBmb3JtIChub3RpY2UgdGhlIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmUpOgorPC9wPgorCis8YmxvY2txdW90ZT4KKzx0YWJsZSBzdW1tYXJ5PSJNZXNndCB0YWJsZSBzdHJ1Y3R1cmUiPgorPHRyPjx0ZD48dHQ+CittZXNndCA9IHs8YnI+CismbmJzcDsmbmJzcDtoZWFkZXJzID0gPGk+aGVhZGVyLXRhYmxlPC9pPiw8YnI+CismbmJzcDsmbmJzcDtib2R5ID0gPGk+TFROMTIgc291cmNlPC9pPiBvciA8aT5zdHJpbmc8L2k+IG9yIAorPGk+bXVsdGlwYXJ0LW1lc2d0PC9pPjxicj4KK308YnI+CismbmJzcDs8YnI+CittdWx0aXBhcnQtbWVzZ3QgPSB7PGJyPgorJm5ic3A7Jm5ic3A7W3ByZWFtYmxlID0gPGk+c3RyaW5nPC9pPixdPGJyPgorJm5ic3A7Jm5ic3A7WzFdID0gPGk+bWVzZ3Q8L2k+LDxicj4KKyZuYnNwOyZuYnNwO1syXSA9IDxpPm1lc2d0PC9pPiw8YnI+CismbmJzcDsmbmJzcDsuLi48YnI+CismbmJzcDsmbmJzcDtbPGk+bjwvaT5dID0gPGk+bWVzZ3Q8L2k+LDxicj4KKyZuYnNwOyZuYnNwO1tlcGlsb2d1ZSA9IDxpPnN0cmluZzwvaT4sXTxicj4KK308YnI+Cis8L3R0PjwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+CitGb3IgYSBzaW1wbGUgbWVzc2FnZSwgYWxsIHRoYXQgaXMgbmVlZGVkIGlzIGEgc2V0IG9mIDx0dD5oZWFkZXJzPC90dD4KK2FuZCB0aGUgPHR0PmJvZHk8L3R0Pi4gVGhlIG1lc3NhZ2UgPHR0PmJvZHk8L3R0PiBjYW4gYmUgZ2l2ZW4gYXMgYSBzdHJpbmcKK29yIGFzIGEgPGVtPnNpbXBsZTwvZW0+IAorPGEgaHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj5MVE4xMjwvYT4gCitzb3VyY2UuIEZvciBtdWx0aXBhcnQgbWVzc2FnZXMsIHRoZSBib2R5IGlzIGEgdGFibGUgdGhhdAorcmVjdXJzaXZlbHkgZGVmaW5lcyBlYWNoIHBhcnQgYXMgYW4gaW5kZXBlbmRlbnQgbWVzc2FnZSwgcGx1cyBhbiBvcHRpb25hbAorPHR0PnByZWFtYmxlPC90dD4gYW5kIDx0dD5lcGlsb2d1ZTwvdHQ+LgorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+IAorVGhlIGZ1bmN0aW9uIHJldHVybnMgYSA8ZW0+c2ltcGxlPC9lbT4gCis8YSBocmVmPSJodHRwOi8vbHVhLXVzZXJzLm9yZy93aWtpL0ZpbHRlcnNTb3VyY2VzQW5kU2lua3MiPkxUTjEyPC9hPiAKK3NvdXJjZSB0aGF0IHByb2R1Y2VzIHRoZQorbWVzc2FnZSBjb250ZW50cyBhcyBkZWZpbmVkIGJ5IDx0dD5tZXNndDwvdHQ+LCBjaHVuayBieSBjaHVuay4gCitIb3BlZnVsbHksIHRoZSBmb2xsb3dpbmcKK2V4YW1wbGUgd2lsbCBtYWtlIHRoaW5ncyBjbGVhci4gV2hlbiBpbiBkb3VidCwgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIFJGQworYXMgbGlzdGVkIGluIHRoZSBpbnRyb2R1Y3Rpb24uICA8L3A+CisKKzxwcmUgY2xhc3M9ZXhhbXBsZT4KKy0tIGxvYWQgdGhlIHNtdHAgc3VwcG9ydCBhbmQgaXRzIGZyaWVuZHMKK2xvY2FsIHNtdHAgPSByZXF1aXJlKCJzb2NrZXQuc210cCIpCitsb2NhbCBtaW1lID0gcmVxdWlyZSgibWltZSIpCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKKworLS0gY3JlYXRlcyBhIHNvdXJjZSB0byBzZW5kIGEgbWVzc2FnZSB3aXRoIHR3byBwYXJ0cy4gVGhlIGZpcnN0IHBhcnQgaXMgCistLSBwbGFpbiB0ZXh0LCB0aGUgc2Vjb25kIHBhcnQgaXMgYSBQTkcgaW1hZ2UsIGVuY29kZWQgYXMgYmFzZTY0Lgorc291cmNlID0gc210cC5tZXNzYWdleworICBoZWFkZXJzID0geworICAgICAtLSBSZW1lbWJlciB0aGF0IGhlYWRlcnMgYXJlICppZ25vcmVkKiBieSBzbXRwLnNlbmQuIAorICAgICBmcm9tID0gIlNpY3Jhbm8gZGUgT2xpdmVpcmEgJmx0O3NpY3Jhbm9AZXhhbXBsZS5jb20mZ3Q7IiwKKyAgICAgdG8gPSAiRnVsYW5vIGRhIFNpbHZhICZsdDtmdWxhbm9AZXhhbXBsZS5jb20mZ3Q7IiwKKyAgICAgc3ViamVjdCA9ICJIZXJlIGlzIGEgbWVzc2FnZSB3aXRoIGF0dGFjaG1lbnRzIgorICB9LAorICBib2R5ID0geworICAgIHByZWFtYmxlID0gIklmIHlvdXIgY2xpZW50IGRvZXNuJ3QgdW5kZXJzdGFuZCBhdHRhY2htZW50cywgXHJcbiIgLi4KKyAgICAgICAgICAgICAgICJpdCB3aWxsIHN0aWxsIGRpc3BsYXkgdGhlIHByZWFtYmxlIGFuZCB0aGUgZXBpbG9ndWUuXHJcbiIgLi4KKyAgICAgICAgICAgICAgICJQcmVhbWJsZSB3aWxsIHByb2JhYmx5IGFwcGVhciBldmVuIGluIGEgTUlNRSBlbmFibGVkIGNsaWVudC4iLAorICAgIC0tIGZpcnN0IHBhcnQ6IG5vIGhlYWRlcnMgbWVhbnMgcGxhaW4gdGV4dCwgdXMtYXNjaWkuCisgICAgLS0gVGhlIG1pbWUuZW9sIGxvdy1sZXZlbCBmaWx0ZXIgbm9ybWFsaXplcyBlbmQtb2YtbGluZSBtYXJrZXJzLgorICAgIFsxXSA9IHsgCisgICAgICBib2R5ID0gbWltZS5lb2woMCwgW1sKKyAgICAgICAgTGluZXMgaW4gYSBtZXNzYWdlIGJvZHkgc2hvdWxkIGFsd2F5cyBlbmQgd2l0aCBDUkxGLiAKKyAgICAgICAgVGhlIHNtdHAgbW9kdWxlIHdpbGwgKk5PVCogcGVyZm9ybSB0cmFuc2xhdGlvbi4gSG93ZXZlciwgdGhlIAorICAgICAgICBzZW5kIGZ1bmN0aW9uICpET0VTKiBwZXJmb3JtIFNNVFAgc3R1ZmZpbmcsIHdoZXJlYXMgdGhlIG1lc3NhZ2UKKyAgICAgICAgZnVuY3Rpb24gZG9lcyAqTk9UKi4KKyAgICAgIF1dKQorICAgIH0sCisgICAgLS0gc2Vjb25kIHBhcnQ6IGhlYWRlcnMgZGVzY3JpYmUgY29udGVudCB0byBiZSBhIHBuZyBpbWFnZSwgCisgICAgLS0gc2VudCB1bmRlciB0aGUgYmFzZTY0IHRyYW5zZmVyIGNvbnRlbnQgZW5jb2RpbmcuCisgICAgLS0gbm90aWNlIHRoYXQgbm90aGluZyBoYXBwZW5zIHVudGlsIHRoZSBtZXNzYWdlIGlzIGFjdHVhbGx5IHNlbnQuIAorICAgIC0tIHNtYWxsIGNodW5rcyBhcmUgbG9hZGVkIGludG8gbWVtb3J5IHJpZ2h0IGJlZm9yZSB0cmFuc21pc3Npb24gYW5kIAorICAgIC0tIHRyYW5zbGF0aW9uIGhhcHBlbnMgb24gdGhlIGZseS4KKyAgICBbMl0gPSB7IAorICAgICAgaGVhZGVycyA9IHsKKyAgICAgICAgWyJjb250ZW50LXR5cGUiXSA9ICdpbWFnZS9wbmc7IG5hbWU9ImltYWdlLnBuZyInLAorICAgICAgICBbImNvbnRlbnQtZGlzcG9zaXRpb24iXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iaW1hZ2UucG5nIicsCisgICAgICAgIFsiY29udGVudC1kZXNjcmlwdGlvbiJdID0gJ2EgYmVhdXRpZnVsIGltYWdlJywKKyAgICAgICAgWyJjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nIl0gPSAiQkFTRTY0IgorICAgICAgfSwKKyAgICAgIGJvZHkgPSBsdG4xMi5zb3VyY2UuY2hhaW4oCisgICAgICAgIGx0bjEyLnNvdXJjZS5maWxlKGlvLm9wZW4oImltYWdlLnBuZyIsICJyYiIpKSwKKyAgICAgICAgbHRuMTIuZmlsdGVyLmNoYWluKAorICAgICAgICAgIG1pbWUuZW5jb2RlKCJiYXNlNjQiKSwKKyAgICAgICAgICBtaW1lLndyYXAoKQorICAgICAgICApCisgICAgICApCisgICAgfSwKKyAgICBlcGlsb2d1ZSA9ICJUaGlzIG1pZ2h0IGFsc28gc2hvdyB1cCwgYnV0IGFmdGVyIHRoZSBhdHRhY2htZW50cyIKKyAgfQorfQorCistLSBmaW5hbGx5IHNlbmQgaXQKK3IsIGUgPSBzbXRwLnNlbmR7CisgICAgZnJvbSA9ICImbHQ7c2ljcmFub0BleGFtcGxlLmNvbSZndDsiLAorICAgIHJjcHQgPSAiJmx0O2Z1bGFub0BleGFtcGxlLmNvbSZndDsiLAorICAgIHNvdXJjZSA9IHNvdXJjZSwKK30KKzwvcHJlPgorCis8IS0tIGZvb3RlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWZvb3Rlcj4KKzxocj4KKzxjZW50ZXI+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93biI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+Cis8L3A+Cis8cD4KKzxzbWFsbD4KK0xhc3QgbW9kaWZpZWQgYnkgRGllZ28gTmVoYWIgb24gPGJyPgorVGh1IEFwciAyMCAwMDoyNTo1MSBFRFQgMjAwNgorPC9zbWFsbD4KKzwvcD4KKzwvY2VudGVyPgorPC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2Mvc29ja2V0Lmh0bWwgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL3NvY2tldC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGI3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL3NvY2tldC5odG1sCkBAIC0wLDAgKzEsNDA0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIAorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJMdWFTb2NrZXQ6IFRoZSBjb3JlIG5hbWVzcGFjZSI+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iTHVhLCBMdWFTb2NrZXQsIFNvY2tldCwgTmV0d29yaywgTGlicmFyeSwgU3VwcG9ydCI+IAorPHRpdGxlPkx1YVNvY2tldDogVGhlIHNvY2tldCBuYW1lc3BhY2U8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJyZWZlcmVuY2UuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8IS0tIGhlYWRlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWhlYWRlcj4KKzxocj4KKzxjZW50ZXI+Cis8dGFibGUgc3VtbWFyeT0iTHVhU29ja2V0IGxvZ28iPgorPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnIj4KKzxpbWcgd2lkdGg9MTI4IGhlaWdodD0xMjggYm9yZGVyPTAgYWx0PSJMdWFTb2NrZXQiIHNyYz0ibHVhc29ja2V0LnBuZyI+Cis8L2E+PC90ZD48L3RyPgorPHRyPjx0ZCBhbGlnbj1jZW50ZXIgdmFsaWduPXRvcD5OZXR3b3JrIHN1cHBvcnQgZm9yIHRoZSBMdWEgbGFuZ3VhZ2UKKzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93bmxvYWQiPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPiAKKzwvcD4KKzwvY2VudGVyPgorPGhyPgorPC9kaXY+CisKKzwhLS0gc29ja2V0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMiBpZD1zb2NrZXQ+VGhlIHNvY2tldCBuYW1lc3BhY2U8L2gyPiAKKworPHA+CitUaGUgPHR0PnNvY2tldDwvdHQ+IG5hbWVzcGFjZSBjb250YWlucyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IG9mIEx1YVNvY2tldC4gCis8L3A+CisKKzxwPiAKK1RvIG9idGFpbiB0aGUgPHR0PnNvY2tldDwvdHQ+IG5hbWVzcGFjZSwgcnVuOgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkcyB0aGUgc29ja2V0IG1vZHVsZSAKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCis8L3ByZT4KKworPCEtLSBiaW5kICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWJpbmQ+IAorc29ja2V0LjxiPmJpbmQoPC9iPmFkZHJlc3MsIHBvcnQgWywgYmFja2xvZ108Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1RoaXMgZnVuY3Rpb24gaXMgYSBzaG9ydGN1dCB0aGF0IGNyZWF0ZXMgYW5kIHJldHVybnMgYSBUQ1Agc2VydmVyIG9iamVjdAorYm91bmQgdG8gYSBsb2NhbCA8dHQ+YWRkcmVzczwvdHQ+IGFuZCA8dHQ+cG9ydDwvdHQ+LCByZWFkeSB0byAKK2FjY2VwdCBjbGllbnQgY29ubmVjdGlvbnMuIE9wdGlvbmFsbHksCit1c2VyIGNhbiBhbHNvIHNwZWNpZnkgdGhlIDx0dD5iYWNrbG9nPC90dD4gYXJndW1lbnQgdG8gdGhlIAorPGEgaHJlZj10Y3AuaHRtbCNsaXN0ZW4+PHR0Pmxpc3RlbjwvdHQ+PC9hPiBtZXRob2QgKGRlZmF1bHRzIHRvIDMyKS4gCis8L3A+CisKKzxwIGNsYXNzPW5vdGU+CitOb3RlOiBUaGUgc2VydmVyIG9iamVjdCByZXR1cm5lZCB3aWxsIGhhdmUgdGhlIG9wdGlvbiAiPHR0PnJldXNlYWRkcjwvdHQ+IiAKK3NldCB0byA8dHQ+PGI+dHJ1ZTwvYj48L3R0Pi4KKzwvcD4KKworPCEtLSBjb25uZWN0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWNvbm5lY3Q+IAorc29ja2V0LjxiPmNvbm5lY3QoPC9iPmFkZHJlc3MsIHBvcnQgWywgbG9jYWRkciwgbG9jcG9ydF08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1RoaXMgZnVuY3Rpb24gaXMgYSBzaG9ydGN1dCB0aGF0IGNyZWF0ZXMgYW5kIHJldHVybnMgYSBUQ1AgY2xpZW50IG9iamVjdAorY29ubmVjdGVkIHRvIGEgcmVtb3RlIDx0dD5ob3N0PC90dD4gYXQgYSBnaXZlbiA8dHQ+cG9ydDwvdHQ+LiBPcHRpb25hbGx5LAordGhlIHVzZXIgY2FuIGFsc28gc3BlY2lmeSB0aGUgbG9jYWwgYWRkcmVzcyBhbmQgcG9ydCB0byBiaW5kCisoPHR0PmxvY2FkZHI8L3R0PiBhbmQgPHR0PmxvY3BvcnQ8L3R0PikuCis8L3A+CisKKzwhLS0gZGVidWcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9ZGVidWc+IAorc29ja2V0LjxiPl9ERUJVRzwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitUaGlzIGNvbnN0YW50IGlzIHNldCB0byA8dHQ+PGI+dHJ1ZTwvYj48L3R0PiBpZiB0aGUgbGlicmFyeSB3YXMgY29tcGlsZWQKK3dpdGggZGVidWcgc3VwcG9ydC4KKzwvcD4KKworPCEtLSBuZXd0cnkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1uZXd0cnk+IAorc29ja2V0LjxiPm5ld3RyeSg8L2I+ZmluYWxpemVyPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGFuZCByZXR1cm5zIGEgPGVtPmNsZWFuPC9lbT4gCis8YSBocmVmPSIjdHJ5Ij48dHQ+dHJ5PC90dD48L2E+CitmdW5jdGlvbiB0aGF0IGFsbG93cyBmb3IgY2xlYW51cCBiZWZvcmUgdGhlIGV4Y2VwdGlvbiAKK2lzICByYWlzZWQuIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPiAKKzx0dD5GaW5hbGl6ZXI8L3R0PiBpcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlCis8dHQ+dHJ5PC90dD4gdGhyb3dzIHRoZSBleGNlcHRpb24uIEl0IHdpbGwgYmUgY2FsbGVkIAoraW4gPGVtPnByb3RlY3RlZDwvZW0+IG1vZGUuCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4gCitUaGUgZnVuY3Rpb24gcmV0dXJucyB5b3VyIGN1c3RvbWl6ZWQgPHR0PnRyeTwvdHQ+IGZ1bmN0aW9uLiAKKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFRoaXMgaWRlYSBzYXZlZCBhIDxlbT5sb3Q8L2VtPiBvZiB3b3JrIHdpdGggdGhlIAoraW1wbGVtZW50YXRpb24gb2YgcHJvdG9jb2xzIGluIEx1YVNvY2tldDogCis8L3A+CisKKzxwcmUgY2xhc3M9ZXhhbXBsZT4KK2ZvbyA9IHNvY2tldC5wcm90ZWN0KGZ1bmN0aW9uKCkKKyAgICAtLSBjb25uZWN0IHNvbWV3aGVyZQorICAgIGxvY2FsIGMgPSBzb2NrZXQudHJ5KHNvY2tldC5jb25uZWN0KCJzb21ld2hlcmUiLCA0MikpCisgICAgLS0gY3JlYXRlIGEgdHJ5IGZ1bmN0aW9uIHRoYXQgY2xvc2VzICdjJyBvbiBlcnJvcgorICAgIGxvY2FsIHRyeSA9IHNvY2tldC5uZXd0cnkoZnVuY3Rpb24oKSBjOmNsb3NlKCkgZW5kKQorICAgIC0tIGRvIGV2ZXJ5dGhpbmcgcmVhc3N1cmVkIGMgd2lsbCBiZSBjbG9zZWQgCisgICAgdHJ5KGM6c2VuZCgiaGVsbG8gdGhlcmU/XHJcbiIpKQorICAgIGxvY2FsIGFuc3dlciA9IHRyeShjOnJlY2VpdmUoKSkKKyAgICAuLi4KKyAgICB0cnkoYzpzZW5kKCJnb29kIGJ5ZVxyXG4iKSkKKyAgICBjOmNsb3NlKCkKK2VuZCkKKzwvcHJlPgorCisKKzwhLS0gcHJvdGVjdCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1wcm90ZWN0PiAKK3NvY2tldC48Yj5wcm90ZWN0KDwvYj5mdW5jPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDb252ZXJ0cyBhIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGV4Y2VwdGlvbnMgaW50byBhIHNhZmUgZnVuY3Rpb24uIFRoaXMKK2Z1bmN0aW9uIG9ubHkgY2F0Y2hlcyBleGNlcHRpb25zIHRocm93biBieSB0aGUgPGEgaHJlZj0jdHJ5Pjx0dD50cnk8L3R0PjwvYT4KK2FuZCA8YSBocmVmPSNuZXd0cnk+PHR0Pm5ld3RyeTwvdHQ+PC9hPiBmdW5jdGlvbnMuIEl0IGRvZXMgbm90IGNhdGNoIG5vcm1hbCAKK0x1YSBlcnJvcnMuCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+RnVuYzwvdHQ+IGlzIGEgZnVuY3Rpb24gdGhhdCBjYWxscyAKKzxhIGhyZWY9I3RyeT48dHQ+dHJ5PC90dD48L2E+IChvciA8dHQ+YXNzZXJ0PC90dD4sIG9yIDx0dD5lcnJvcjwvdHQ+KSAKK3RvIHRocm93IGV4Y2VwdGlvbnMuIAorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitSZXR1cm5zIGFuIGVxdWl2YWxlbnQgZnVuY3Rpb24gdGhhdCBpbnN0ZWFkIG9mIHRocm93aW5nIGV4Y2VwdGlvbnMsCityZXR1cm5zIDx0dD48Yj5uaWw8L2I+PC90dD4gZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZS4gCis8L3A+CisKKzxwIGNsYXNzPW5vdGU+CitOb3RlOiBCZXdhcmUgdGhhdCBpZiB5b3VyIGZ1bmN0aW9uIHBlcmZvcm1zIHNvbWUgaWxsZWdhbCBvcGVyYXRpb24gdGhhdAorcmFpc2VzIGFuIGVycm9yLCB0aGUgcHJvdGVjdGVkIGZ1bmN0aW9uIHdpbGwgY2F0Y2ggdGhlIGVycm9yIGFuZCByZXR1cm4gaXQKK2FzIGEgc3RyaW5nLiBUaGlzIGlzIGJlY2F1c2UgdGhlIDxhIGhyZWY9I3RyeT48dHQ+dHJ5PC90dD48L2E+IGZ1bmN0aW9uCit1c2VzIGVycm9ycyBhcyB0aGUgbWVjaGFuaXNtIHRvIHRocm93IGV4Y2VwdGlvbnMuICAKKzwvcD4KKworPCEtLSBzZWxlY3QgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1zZWxlY3Q+IAorc29ja2V0LjxiPnNlbGVjdCg8L2I+cmVjdnQsIHNlbmR0IFssIHRpbWVvdXRdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitXYWl0cyBmb3IgYSBudW1iZXIgb2Ygc29ja2V0cyB0byBjaGFuZ2Ugc3RhdHVzLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5SZWN2dDwvdHQ+IGlzIGFuIGFycmF5IHdpdGggdGhlIHNvY2tldHMgdG8gdGVzdCBmb3IgY2hhcmFjdGVycworYXZhaWxhYmxlIGZvciByZWFkaW5nLiBTb2NrZXRzIGluIHRoZSA8dHQ+c2VuZHQ8L3R0PiBhcnJheSBhcmUgd2F0Y2hlZCB0bworc2VlIGlmIGl0IGlzIE9LIHRvIGltbWVkaWF0ZWx5IHdyaXRlIG9uIHRoZW0uICA8dHQ+VGltZW91dDwvdHQ+IGlzIHRoZQorbWF4aW11bSBhbW91bnQgb2YgdGltZSAoaW4gc2Vjb25kcykgdG8gd2FpdCBmb3IgYSBjaGFuZ2UgaW4gc3RhdHVzLiAgQQorPHR0PjxiPm5pbDwvYj48L3R0PiwgbmVnYXRpdmUgb3Igb21pdHRlZCA8dHQ+dGltZW91dDwvdHQ+IHZhbHVlIGFsbG93cyB0aGUKK2Z1bmN0aW9uIHRvIGJsb2NrIGluZGVmaW5pdGVseS4gPHR0PlJlY3Z0PC90dD4gYW5kIDx0dD5zZW5kdDwvdHQ+IGNhbiBhbHNvCitiZSBlbXB0eSB0YWJsZXMgb3IgPHR0PjxiPm5pbDwvYj48L3R0Pi4gTm9uLXNvY2tldCB2YWx1ZXMgKG9yIHZhbHVlcyB3aXRoCitub24tbnVtZXJpYyBpbmRpY2VzKSBpbiB0aGUgYXJyYXlzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGxpc3Qgd2l0aCB0aGUgc29ja2V0cyByZWFkeSBmb3IKK3JlYWRpbmcsIGEgbGlzdCB3aXRoIHRoZSBzb2NrZXRzIHJlYWR5IGZvciB3cml0aW5nIGFuZCBhbiBlcnJvciBtZXNzYWdlLgorVGhlIGVycm9yIG1lc3NhZ2UgaXMgIjx0dD50aW1lb3V0PC90dD4iIGlmIGEgdGltZW91dCBjb25kaXRpb24gd2FzIG1ldCBhbmQKKzx0dD48Yj5uaWw8L2I+PC90dD4gb3RoZXJ3aXNlLiBUaGUgcmV0dXJuZWQgdGFibGVzIGFyZQorZG91Ymx5IGtleWVkIGJvdGggYnkgaW50ZWdlcnMgYW5kIGFsc28gYnkgdGhlIHNvY2tldHMKK3RoZW1zZWx2ZXMsIHRvIHNpbXBsaWZ5IHRoZSB0ZXN0IGlmIGEgc3BlY2lmaWMgc29ja2V0IGhhcworY2hhbmdlZCBzdGF0dXMuIAorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorPGI+SW1wb3J0YW50IG5vdGU8L2I+OiBhIGtub3duIGJ1ZyBpbiBXaW5Tb2NrIGNhdXNlcyA8dHQ+c2VsZWN0PC90dD4gdG8gZmFpbCAKK29uIG5vbi1ibG9ja2luZyBUQ1Agc29ja2V0cy4gVGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gYSBzb2NrZXQgYXMKK3dyaXRhYmxlIGV2ZW4gdGhvdWdoIHRoZSBzb2NrZXQgaXMgPGVtPm5vdDwvZW0+IHJlYWR5IGZvciBzZW5kaW5nLgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorPGI+QW5vdGhlciBpbXBvcnRhbnQgbm90ZTwvYj46IGNhbGxpbmcgc2VsZWN0IHdpdGggYSBzZXJ2ZXIgc29ja2V0IGluIHRoZSByZWNlaXZlIHBhcmFtZXRlciBiZWZvcmUgYSBjYWxsIHRvIGFjY2VwdCBkb2VzIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWUKKzxhIGhyZWY9dGNwLmh0bWwjYWNjZXB0Pjx0dD5hY2NlcHQ8L3R0PjwvYT4gd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuIAorVXNlIHRoZSA8YSBocmVmPXRjcC5odG1sI3NldHRpbWVvdXQ+PHR0PnNldHRpbWVvdXQ8L3R0PjwvYT4gCittZXRob2Qgb3IgPHR0PmFjY2VwdDwvdHQ+IG1pZ2h0IGJsb2NrIGZvcmV2ZXIuICAKKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KKzxiPllldCBhbm90aGVyIG5vdGU8L2I+OiBJZiB5b3UgY2xvc2UgYSBzb2NrZXQgYW5kIHBhc3MKK2l0IHRvIDx0dD5zZWxlY3Q8L3R0PiwgaXQgd2lsbCBiZSBpZ25vcmVkLgorPC9wPgorCis8IS0tIHNpbmsgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9c2luaz4gCitzb2NrZXQuPGI+c2luayg8L2I+bW9kZSwgc29ja2V0PGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGFuIAorPGEgaHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj5MVE4xMjwvYT4KK3NpbmsgZnJvbSBhIHN0cmVhbSBzb2NrZXQgb2JqZWN0LiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5Nb2RlPC90dD4gZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHNpbmsuIFRoZSBmb2xsb3dpbmcKK29wdGlvbnMgYXJlIGF2YWlsYWJsZToKKzwvcD4KKzx1bD4KKzxsaT4gPHR0PiJodHRwLWNodW5rZWQiPC90dD46IHNlbmRzIGRhdGEgdGhyb3VnaCBzb2NrZXQgYWZ0ZXIgYXBwbHlpbmcgdGhlCis8ZW0+Y2h1bmtlZCB0cmFuc2ZlciBjb2Rpbmc8L2VtPiwgY2xvc2luZyB0aGUgc29ja2V0IHdoZW4gZG9uZTsKKzxsaT4gPHR0PiJjbG9zZS13aGVuLWRvbmUiPC90dD46IHNlbmRzIGFsbCByZWNlaXZlZCBkYXRhIHRocm91Z2ggdGhlCitzb2NrZXQsIGNsb3NpbmcgdGhlIHNvY2tldCB3aGVuIGRvbmU7IAorPGxpPiA8dHQ+ImtlZXAtb3BlbiI8L3R0Pjogc2VuZHMgYWxsIHJlY2VpdmVkIGRhdGEgdGhyb3VnaCB0aGUKK3NvY2tldCwgbGVhdmluZyBpdCBvcGVuIHdoZW4gZG9uZS4gCis8L3VsPgorPHA+Cis8dHQ+U29ja2V0PC90dD4gaXMgdGhlIHN0cmVhbSBzb2NrZXQgb2JqZWN0IHVzZWQgdG8gc2VuZCB0aGUgZGF0YS4gCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIGEgc2luayB3aXRoIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvci4gCis8L3A+CisKKzwhLS0gc2tpcCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1za2lwPiAKK3NvY2tldC48Yj5za2lwKDwvYj5kIFssIHJldDxzdWI+MTwvc3ViPiwgcmV0PHN1Yj4yPC9zdWI+IC4uLiAgcmV0PHN1Yj5OPC9zdWI+XTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorRHJvcHMgYSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZW1haW5pbmcuCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+RDwvdHQ+IGlzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRyb3AuIDx0dD5SZXQ8c3ViPjE8L3N1Yj48L3R0PiB0bworPHR0PnJldDxzdWI+Tjwvc3ViPjwvdHQ+IGFyZSB0aGUgYXJndW1lbnRzLgorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+IAorVGhlIGZ1bmN0aW9uIHJldHVybnMgPHR0PnJldDxzdWI+ZCsxPC9zdWI+PC90dD4gdG8gPHR0PnJldDxzdWI+Tjwvc3ViPjwvdHQ+LgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG8gYXZvaWQgY3JlYXRpb24gb2YgZHVtbXkgdmFyaWFibGVzOgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBnZXQgdGhlIHN0YXR1cyBjb2RlIGFuZCBzZXBhcmF0b3IgZnJvbSBTTVRQIHNlcnZlciByZXBseSAKK2xvY2FsIGNvZGUsIHNlcCA9IHNvY2tldC5za2lwKDIsIHN0cmluZy5maW5kKGxpbmUsICJeKCVkJWQlZCkoLj8pIikpCis8L3ByZT4KKworPCEtLSBzbGVlcCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1zbGVlcD4gCitzb2NrZXQuPGI+c2xlZXAoPC9iPnRpbWU8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0ZyZWV6ZXMgdGhlIHByb2dyYW0gZXhlY3V0aW9uIGR1cmluZyBhIGdpdmVuIGFtb3VudCBvZiB0aW1lLgorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPiAKKzx0dD5UaW1lPC90dD4gaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwIGZvci4gCis8L3A+CisKKzwhLS0gc291cmNlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9c291cmNlPiAKK3NvY2tldC48Yj5zb3VyY2UoPC9iPm1vZGUsIHNvY2tldCBbLCBsZW5ndGhdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitDcmVhdGVzIGFuIAorPGEgaHJlZj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9GaWx0ZXJzU291cmNlc0FuZFNpbmtzIj5MVE4xMjwvYT4KK3NvdXJjZSBmcm9tIGEgc3RyZWFtIHNvY2tldCBvYmplY3QuIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0Pk1vZGU8L3R0PiBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgc291cmNlLiBUaGUgZm9sbG93aW5nCitvcHRpb25zIGFyZSBhdmFpbGFibGU6Cis8L3A+Cis8dWw+Cis8bGk+IDx0dD4iaHR0cC1jaHVua2VkIjwvdHQ+OiByZWNlaXZlcyBkYXRhIGZyb20gc29ja2V0IGFuZCByZW1vdmVzIHRoZQorPGVtPmNodW5rZWQgdHJhbnNmZXIgY29kaW5nPC9lbT4gYmVmb3JlIHJldHVybmluZyB0aGUgZGF0YTsKKzxsaT4gPHR0PiJieS1sZW5ndGgiPC90dD46IHJlY2VpdmVzIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlCitzb2NrZXQuIFRoaXMgbW9kZSByZXF1aXJlcyB0aGUgZXh0cmEgYXJndW1lbnQgPHR0Pmxlbmd0aDwvdHQ+OyAKKzxsaT4gPHR0PiJ1bnRpbC1jbG9zZWQiPC90dD46IHJlY2VpdmVzIGRhdGEgZnJvbSBhIHNvY2tldCB1bnRpbCB0aGUgb3RoZXIKK3NpZGUgY2xvc2VzIHRoZSBjb25uZWN0aW9uLiAKKzwvdWw+Cis8cD4KKzx0dD5Tb2NrZXQ8L3R0PiBpcyB0aGUgc3RyZWFtIHNvY2tldCBvYmplY3QgdXNlZCB0byByZWNlaXZlIHRoZSBkYXRhLiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzb3VyY2Ugd2l0aCB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IuIAorPC9wPgorCis8IS0tIHRpbWUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1nZXR0aW1lPiAKK3NvY2tldC48Yj5nZXR0aW1lKCk8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorUmV0dXJucyB0aGUgdGltZSBpbiBzZWNvbmRzLCByZWxhdGl2ZSB0byB0aGUgb3JpZ2luIG9mIHRoZSAKK3VuaXZlcnNlLiBZb3Ugc2hvdWxkIHN1YnRyYWN0IHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbgordG8gZ2V0IG1lYW5pbmdmdWwgdmFsdWVzLiAKKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgordCA9IHNvY2tldC5nZXR0aW1lKCkKKy0tIGRvIHN0dWZmCitwcmludChzb2NrZXQuZ2V0dGltZSgpIC0gdCAuLiAiIHNlY29uZHMgZWxhcHNlZCIpCis8L3ByZT4KKworPCEtLSB0cnkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD10cnk+IAorc29ja2V0LjxiPnRyeSg8L2I+cmV0PHN1Yj4xPC9zdWI+IFssIHJldDxzdWI+Mjwvc3ViPiAuLi4gcmV0PHN1Yj5OPC9zdWI+XTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorVGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yLiBUaGUgZXhjZXB0aW9uIGNhbiBvbmx5IGJlIGNhdWdodCAKK2J5IHRoZSA8YSBocmVmPSNwcm90ZWN0Pjx0dD5wcm90ZWN0PC90dD48L2E+IGZ1bmN0aW9uLiBJdCBkb2VzIG5vdCBleHBsb2RlCitpbnRvIGFuIGVycm9yIG1lc3NhZ2UuCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+UmV0PHN1Yj4xPC9zdWI+PC90dD4gdG8gPHR0PnJldDxzdWI+Tjwvc3ViPjwvdHQ+IGNhbiBiZSBhcmJpdHJhcnkKK2FyZ3VtZW50cywgYnV0IGFyZSB1c3VhbGx5IHRoZSByZXR1cm4gdmFsdWVzIG9mIGEgZnVuY3Rpb24gY2FsbCAKK25lc3RlZCB3aXRoIDx0dD50cnk8L3R0Pi4gCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4gCitUaGUgZnVuY3Rpb24gcmV0dXJucyA8dHQ+cmV0PC90dD48c3ViPjE8L3N1Yj4gdG8gPHR0PnJldDwvdHQ+PHN1Yj5OPC9zdWI+IGlmCis8dHQ+cmV0PC90dD48c3ViPjE8L3N1Yj4gaXMgbm90IDx0dD48Yj5uaWw8L2I+PC90dD4uIE90aGVyd2lzZSwgaXQgY2FsbHMgPHR0PmVycm9yPC90dD4gcGFzc2luZyA8dHQ+cmV0PC90dD48c3ViPjI8L3N1Yj4uCis8L3A+CisKKzxwcmUgY2xhc3M9ZXhhbXBsZT4KKy0tIGNvbm5lY3RzIG9yIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQorYyA9IHNvY2tldC50cnkoc29ja2V0LmNvbm5lY3QoImxvY2FsaG9zdCIsIDgwKSkKKzwvcHJlPgorCis8IS0tIHZlcnNpb24gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPXZlcnNpb24+IAorc29ja2V0LjxiPl9WRVJTSU9OPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1RoaXMgY29uc3RhbnQgaGFzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgTHVhU29ja2V0IHZlcnNpb24uIAorPC9wPgorCis8IS0tIGZvb3RlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWZvb3Rlcj4KKzxocj4KKzxjZW50ZXI+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93biI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+Cis8L3A+Cis8cD4KKzxzbWFsbD4KK0xhc3QgbW9kaWZpZWQgYnkgRGllZ28gTmVoYWIgb24gPGJyPgorVGh1IEFwciAyMCAwMDoyNTo1NCBFRFQgMjAwNgorPC9zbWFsbD4KKzwvcD4KKzwvY2VudGVyPgorPC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9kb2MvdGNwLmh0bWwgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL3RjcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmEwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZG9jL3RjcC5odG1sCkBAIC0wLDAgKzEsNTMzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIAorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJMdWFTb2NrZXQ6IFRoZSBUQ1AvSVAgc3VwcG9ydCI+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iTHVhLCBMdWFTb2NrZXQsIFNvY2tldCwgVENQLCBMaWJyYXJ5LCBOZXR3b3JrLCBTdXBwb3J0Ij4gCis8dGl0bGU+THVhU29ja2V0OiBUQ1AvSVAgc3VwcG9ydDwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InJlZmVyZW5jZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+CisKKzwhLS0gaGVhZGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9aGVhZGVyPgorPGhyPgorPGNlbnRlcj4KKzx0YWJsZSBzdW1tYXJ5PSJMdWFTb2NrZXQgbG9nbyI+Cis8dHI+PHRkIGFsaWduPWNlbnRlcj48YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPgorPGltZyB3aWR0aD0xMjggaGVpZ2h0PTEyOCBib3JkZXI9MCBhbHQ9Ikx1YVNvY2tldCIgc3JjPSJsdWFzb2NrZXQucG5nIj4KKzwvYT48L3RkPjwvdHI+Cis8dHI+PHRkIGFsaWduPWNlbnRlciB2YWxpZ249dG9wPk5ldHdvcmsgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorPC90ZD48L3RyPgorPC90YWJsZT4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3dubG9hZCI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+IAorPC9wPgorPC9jZW50ZXI+Cis8aHI+Cis8L2Rpdj4KKworPCEtLSB0Y3AgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGgyIGlkPXRjcD5UQ1A8L2gyPiAKKworPCEtLSBzb2NrZXQudGNwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1zb2NrZXQudGNwPiAKK3NvY2tldC48Yj50Y3AoKTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+IAorQ3JlYXRlcyBhbmQgcmV0dXJucyBhIFRDUCBtYXN0ZXIgb2JqZWN0LiBBIG1hc3RlciBvYmplY3QgY2FuCitiZSB0cmFuc2Zvcm1lZCBpbnRvIGEgc2VydmVyIG9iamVjdCB3aXRoIHRoZSBtZXRob2QgCis8YSBocmVmPSNsaXN0ZW4+PHR0Pmxpc3RlbjwvdHQ+PC9hPiAoYWZ0ZXIgYSBjYWxsIHRvIDxhCitocmVmPSNiaW5kPjx0dD5iaW5kPC90dD48L2E+KSBvciBpbnRvIGEgY2xpZW50IG9iamVjdCB3aXRoIAordGhlIG1ldGhvZCA8YSBocmVmPSNjb25uZWN0Pjx0dD5jb25uZWN0PC90dD48L2E+LiBUaGUgb25seSBvdGhlciAKK21ldGhvZCBzdXBwb3J0ZWQgYnkgYSBtYXN0ZXIgb2JqZWN0IGlzIHRoZSAKKzxhIGhyZWY9I2Nsb3NlPjx0dD5jbG9zZTwvdHQ+PC9hPiBtZXRob2QuPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitJbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmV3IG1hc3RlciBvYmplY3QgaXMgcmV0dXJuZWQuIEluIGNhc2Ugb2YgZXJyb3IsCis8Yj48dHQ+bmlsPC90dD48L2I+IGlzIHJldHVybmVkLCBmb2xsb3dlZCBieSBhbiBlcnJvciBtZXNzYWdlLgorPC9wPgorCis8IS0tIGFjY2VwdCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWFjY2VwdD4gCitzZXJ2ZXI6PGI+YWNjZXB0KCk8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorV2FpdHMgIGZvciAgYSAgcmVtb3RlIGNvbm5lY3Rpb24gb24gdGhlIHNlcnZlcgorb2JqZWN0IGFuZCByZXR1cm5zIGEgY2xpZW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhhdCBjb25uZWN0aW9uLgorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitJZiBhIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCwgYSBjbGllbnQgb2JqZWN0IGlzIHJldHVybmVkLiAgCitJZiBhICB0aW1lb3V0IGNvbmRpdGlvbiAgaXMgIG1ldCwgIHRoZSBtZXRob2QgIHJldHVybnMgPGI+PHR0Pm5pbDwvdHQ+PC9iPgorZm9sbG93ZWQgYnkgdGhlIGVycm9yIHN0cmluZyAnPHR0PnRpbWVvdXQ8L3R0PicuIE90aGVyIGVycm9ycyBhcmUgCityZXBvcnRlZCBieSA8Yj48dHQ+bmlsPC90dD48L2I+IGZvbGxvd2VkIGJ5IGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBlcnJvci4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IGNhbGxpbmcgPGEgaHJlZj1zb2NrZXQuaHRtbCNzZWxlY3Q+PHR0PnNvY2tldC5zZWxlY3Q8L3R0PjwvYT4KK3dpdGggICBhICBzZXJ2ZXIgICBvYmplY3QgICBpbgordGhlIDx0dD5yZWN2dDwvdHQ+ICBwYXJhbWV0ZXIgIGJlZm9yZSAgYSAgIGNhbGwgIHRvICA8dHQ+YWNjZXB0PC90dD4gZG9lcworPGVtPm5vdDwvZW0+IGd1YXJhbnRlZSAgPHR0PmFjY2VwdDwvdHQ+IHdpbGwgIHJldHVybiBpbW1lZGlhdGVseS4gIFVzZSB0aGUgPGEKK2hyZWY9I3NldHRpbWVvdXQ+PHR0PnNldHRpbWVvdXQ8L3R0PjwvYT4gbWV0aG9kIG9yIDx0dD5hY2NlcHQ8L3R0PgorbWlnaHQgYmxvY2sgdW50aWwgPGVtPmFub3RoZXI8L2VtPiBjbGllbnQgc2hvd3MgdXAuIAorPC9wPgorCis8IS0tIGJpbmQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWJpbmQ+IAorbWFzdGVyOjxiPmJpbmQoPC9iPmFkZHJlc3MsIHBvcnQ8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0JpbmRzIGEgbWFzdGVyIG9iamVjdCB0byA8dHQ+YWRkcmVzczwvdHQ+IGFuZCA8dHQ+cG9ydDwvdHQ+IG9uIHRoZQorbG9jYWwgaG9zdC4gCisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+QWRkcmVzczwvdHQ+IGNhbiBiZSBhbiBJUCBhZGRyZXNzIG9yIGEgaG9zdCBuYW1lLiAKKzx0dD5Qb3J0PC90dD4gbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAuLjY0SykuIAorSWYgPHR0PmFkZHJlc3M8L3R0PgoraXMgJzx0dD4qPC90dD4nLCB0aGUgc3lzdGVtIGJpbmRzIHRvIGFsbCBsb2NhbCBpbnRlcmZhY2VzCit1c2luZyB0aGUgPHR0PklOQUREUl9BTlk8L3R0PiBjb25zdGFudC4gSWYgPHR0PnBvcnQ8L3R0PiBpcyAwLCB0aGUgc3lzdGVtIGF1dG9tYXRpY2FsbHkKK2Nob29zZXMgYW4gZXBoZW1lcmFsIHBvcnQuICAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorSW4gY2FzZSBvZiAgc3VjY2VzcywgdGhlICBtZXRob2QgcmV0dXJucyAgMS4gSW4gY2FzZSBvZiBlcnJvciwgdGhlCittZXRob2QgcmV0dXJucyA8Yj48dHQ+bmlsPC90dD48L2I+IGZvbGxvd2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UuCis8L3A+CisKKzxwIGNsYXNzPW5vdGU+CitOb3RlOiBUaGUgZnVuY3Rpb24gPGEgaHJlZj1zb2NrZXQuaHRtbCNiaW5kPjx0dD5zb2NrZXQuYmluZDwvdHQ+PC9hPiAKK2lzIGF2YWlsYWJsZSBhbmQgaXMgYSBzaG9ydGN1dCBmb3IgdGhlIGNyZWF0aW9uIG9mIHNlcnZlciBzb2NrZXRzLgorPC9wPgorCis8IS0tIGNsb3NlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWNsb3NlPiAKK21hc3Rlcjo8Yj5jbG9zZSgpPC9iPjxicj4KK2NsaWVudDo8Yj5jbG9zZSgpPC9iPjxicj4KK3NlcnZlcjo8Yj5jbG9zZSgpPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0Nsb3NlcyAgYSBUQ1Agb2JqZWN0LiBUaGUgaW50ZXJuYWwgc29ja2V0IHVzZWQgYnkgdGhlIG9iamVjdCBpcyBjbG9zZWQKK2FuZCB0aGUgbG9jYWwgIGFkZHJlc3MgICB0byAgd2hpY2ggdGhlIG9iamVjdCB3YXMKK2JvdW5kIGlzIG1hZGUgIGF2YWlsYWJsZSB0byBvdGhlciAgYXBwbGljYXRpb25zLiBObyBmdXJ0aGVyICBvcGVyYXRpb25zCisoZXhjZXB0ICBmb3IgIGZ1cnRoZXIgY2FsbHMgIHRvIHRoZSA8dHQ+Y2xvc2U8L3R0PiBtZXRob2QpICBhcmUgYWxsb3dlZCBvbgorYSBjbG9zZWQgc29ja2V0LiAKKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6ICBJdCBpcyAgaW1wb3J0YW50IHRvICBjbG9zZSBhbGwgIHVzZWQgIHNvY2tldHMgb25jZSAgdGhleSBhcmUgIG5vdAorbmVlZGVkLCAgc2luY2UsIGluICBtYW55IHN5c3RlbXMsICBlYWNoIHNvY2tldCAgdXNlcyBhICBmaWxlIGRlc2NyaXB0b3IsCit3aGljaCBhcmUgbGltaXRlZCBzeXN0ZW0gcmVzb3VyY2VzLiBHYXJiYWdlLWNvbGxlY3RlZCBvYmplY3RzIGFyZQorYXV0b21hdGljYWxseSBjbG9zZWQgYmVmb3JlIGRlc3RydWN0aW9uLCB0aG91Z2guIAorPC9wPgorCis8IS0tIGNvbm5lY3QgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWNvbm5lY3Q+CittYXN0ZXI6PGI+Y29ubmVjdCg8L2I+YWRkcmVzcywgcG9ydDxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQXR0ZW1wdHMgdG8gY29ubmVjdCBhIG1hc3RlciBvYmplY3QgdG8gYSByZW1vdGUgaG9zdCwgdHJhbnNmb3JtaW5nIGl0IGludG8gYQorY2xpZW50IG9iamVjdC4gCitDbGllbnQgb2JqZWN0cyBzdXBwb3J0IG1ldGhvZHMgCis8YSBocmVmPSNzZW5kPjx0dD5zZW5kPC90dD48L2E+LAorPGEgaHJlZj0jcmVjZWl2ZT48dHQ+cmVjZWl2ZTwvdHQ+PC9hPiwgCis8YSBocmVmPSNnZXRzb2NrbmFtZT48dHQ+Z2V0c29ja25hbWU8L3R0PjwvYT4sIAorPGEgaHJlZj0jZ2V0cGVlcm5hbWU+PHR0PmdldHBlZXJuYW1lPC90dD48L2E+LAorPGEgaHJlZj0jc2V0dGltZW91dD48dHQ+c2V0dGltZW91dDwvdHQ+PC9hPiwgCithbmQgPGEgaHJlZj0jY2xvc2U+PHR0PmNsb3NlPC90dD48L2E+LgorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PkFkZHJlc3M8L3R0PiBjYW4gYmUgYW4gSVAgYWRkcmVzcyBvciBhIGhvc3QgbmFtZS4gCis8dHQ+UG9ydDwvdHQ+IG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi42NEspLiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorSW4gY2FzZSBvZiBlcnJvciwgdGhlIG1ldGhvZCByZXR1cm5zIDxiPjx0dD5uaWw8L3R0PjwvYj4gZm9sbG93ZWQgYnkgYSBzdHJpbmcKK2Rlc2NyaWJpbmcgdGhlIGVycm9yLiBJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSBtZXRob2QgcmV0dXJucyAxLgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogVGhlIGZ1bmN0aW9uIDxhIGhyZWY9c29ja2V0Lmh0bWwjY29ubmVjdD48dHQ+c29ja2V0LmNvbm5lY3Q8L3R0PjwvYT4gCitpcyBhdmFpbGFibGUgYW5kIGlzIGEgc2hvcnRjdXQgZm9yIHRoZSBjcmVhdGlvbiBvZiBjbGllbnQgc29ja2V0cy4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFN0YXJ0aW5nIHdpdGggTHVhU29ja2V0IDIuMCwgCit0aGUgPGEgaHJlZj0jc2V0dGltZW91dD48dHQ+c2V0dGltZW91dDwvdHQ+PC9hPgorbWV0aG9kIGFmZmVjdHMgdGhlIGJlaGF2aW9yIG9mIDx0dD5jb25uZWN0PC90dD4sIGNhdXNpbmcgaXQgdG8gcmV0dXJuIAord2l0aCBhbiBlcnJvciBpbiBjYXNlIG9mIGEgdGltZW91dC4gSWYgdGhhdCBoYXBwZW5zLCB5b3UgY2FuIHN0aWxsIGNhbGwgPGEKK2hyZWY9c29ja2V0Lmh0bWwjc2VsZWN0Pjx0dD5zb2NrZXQuc2VsZWN0PC90dD48L2E+IHdpdGggdGhlIHNvY2tldCBpbiB0aGUKKzx0dD5zZW5kdDwvdHQ+IHRhYmxlLiBUaGUgc29ja2V0IHdpbGwgYmUgd3JpdGFibGUgd2hlbiB0aGUgY29ubmVjdGlvbiBpcworZXN0YWJsaXNoZWQuCis8L3A+CisKKzwhLS0gZ2V0cGVlcm5hbWUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9Z2V0cGVlcm5hbWU+CitjbGllbnQ6PGI+Z2V0cGVlcm5hbWUoKTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW1vdGUgc2lkZSBvZiBhIGNvbm5lY3RlZCBjbGllbnQgb2JqZWN0LgorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHBlZXIsIGZvbGxvd2VkIGJ5IHRoZSAKK3BvcnQgbnVtYmVyIHRoYXQgcGVlciBpcyB1c2luZyBmb3IgdGhlIGNvbm5lY3Rpb24uIAorSW4gY2FzZSBvZiBlcnJvciwgdGhlIG1ldGhvZCByZXR1cm5zIDxiPjx0dD5uaWw8L3R0PjwvYj4uIAorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogSXQgbWFrZXMgbm8gc2Vuc2UgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbiBzZXJ2ZXIgb2JqZWN0cy4KKzwvcD4KKworPCEtLSBnZXRzb2NrbmFtZSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1nZXRzb2NrbmFtZT4KK21hc3Rlcjo8Yj5nZXRzb2NrbmFtZSgpPC9iPjxicj4KK2NsaWVudDo8Yj5nZXRzb2NrbmFtZSgpPC9iPjxicj4KK3NlcnZlcjo8Yj5nZXRzb2NrbmFtZSgpPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1JldHVybnMgdGhlIGxvY2FsIGFkZHJlc3MgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB0byB0aGUgb2JqZWN0LiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIHdpdGggbG9jYWwgSVAgYWRkcmVzcyBhbmQgYSBudW1iZXIgd2l0aCAKK3RoZSBwb3J0LiBJbiBjYXNlIG9mIGVycm9yLCB0aGUgbWV0aG9kIHJldHVybnMgPGI+PHR0Pm5pbDwvdHQ+PC9iPi4KKzwvcD4KKworPCEtLSBnZXRzdGF0cyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1nZXRzdGF0cz4KK21hc3Rlcjo8Yj5nZXRzdGF0cygpPC9iPjxicj4KK2NsaWVudDo8Yj5nZXRzdGF0cygpPC9iPjxicj4KK3NlcnZlcjo8Yj5nZXRzdGF0cygpPC9iPjxicj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitSZXR1cm5zIGFjY291bnRpbmcgaW5mb3JtYXRpb24gb24gdGhlIHNvY2tldCwgdXNlZnVsIGZvciB0aHJvdHRsaW5nCitvZiBiYW5kd2lkdGguIAorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitUaGUgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgdGhlIG51bWJlciBvZiBieXRlcyBzZW50LAorYW5kIHRoZSBhZ2Ugb2YgdGhlIHNvY2tldCBvYmplY3QgaW4gc2Vjb25kcy4gCis8L3A+CisKKzwhLS0gbGlzdGVuICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWxpc3Rlbj4gCittYXN0ZXI6PGI+bGlzdGVuKDwvYj5iYWNrbG9nPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitTcGVjaWZpZXMgdGhlIHNvY2tldCBpcyB3aWxsaW5nIHRvIHJlY2VpdmUgY29ubmVjdGlvbnMsIHRyYW5zZm9ybWluZyB0aGUKK29iamVjdCBpbnRvIGEgc2VydmVyIG9iamVjdC4gIFNlcnZlciBvYmplY3RzIHN1cHBvcnQgdGhlIAorPGEgaHJlZj0jYWNjZXB0Pjx0dD5hY2NlcHQ8L3R0PjwvYT4sICAKKzxhIGhyZWY9I2dldHNvY2tuYW1lPjx0dD5nZXRzb2NrbmFtZTwvdHQ+PC9hPiwgCis8YSBocmVmPSNzZXRvcHRpb24+PHR0PnNldG9wdGlvbjwvdHQ+PC9hPiwgCis8YSBocmVmPSNzZXR0aW1lb3V0Pjx0dD5zZXR0aW1lb3V0PC90dD48L2E+LCAKK2FuZCA8YSBocmVmPSNjbG9zZT48dHQ+Y2xvc2U8L3R0PjwvYT4gbWV0aG9kcy4gIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorVGhlIHBhcmFtZXRlciA8dHQ+YmFja2xvZzwvdHQ+IHNwZWNpZmllcyB0aGUgIG51bWJlciAgb2YgIGNsaWVudCAKK2Nvbm5lY3Rpb25zIHRoYXQgY2FuCitiZSBxdWV1ZWQgd2FpdGluZyBmb3Igc2VydmljZS4gSWYgdGhlIHF1ZXVlIGlzIGZ1bGwgYW5kIGFub3RoZXIgIGNsaWVudAorYXR0ZW1wdHMgY29ubmVjdGlvbiwgIHRoZSBjb25uZWN0aW9uIGlzICByZWZ1c2VkLgorPC9wPgorCis8cCBjbGFzcz1yZXR1cm4+CitJbiBjYXNlIG9mICBzdWNjZXNzLCB0aGUgIG1ldGhvZCByZXR1cm5zICAxLiBJbiBjYXNlIG9mIGVycm9yLCB0aGUKK21ldGhvZCByZXR1cm5zIDxiPjx0dD5uaWw8L3R0PjwvYj4gZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZS4KKzwvcD4KKworPCEtLSByZWNlaXZlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1yZWNlaXZlPgorY2xpZW50OjxiPnJlY2VpdmUoPC9iPltwYXR0ZXJuIFssIHByZWZpeF1dPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitSZWFkcyBkYXRhIGZyb20gYSBjbGllbnQgb2JqZWN0LCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCA8ZW0+cmVhZAorcGF0dGVybjwvZW0+LiAgUGF0dGVybnMgZm9sbG93IHRoZSBMdWEgZmlsZSBJL08gZm9ybWF0LCBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gcGVyZm9ybWFuY2UgYmV0d2VlbiBhbGwgcGF0dGVybnMgaXMgbmVnbGlnaWJsZS4gCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+UGF0dGVybjwvdHQ+IGNhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzogCis8L3A+CisKKzx1bD4KKzxsaT4gJzx0dD4qYTwvdHQ+JzogIHJlYWRzIGZyb20gIHRoZSAgc29ja2V0ICB1bnRpbCB0aGUgIGNvbm5lY3Rpb24gIGlzCitjbG9zZWQuIE5vIGVuZC1vZi1saW5lIHRyYW5zbGF0aW9uIGlzIHBlcmZvcm1lZDsKKzxsaT4gJzx0dD4qbDwvdHQ+JzogIHJlYWRzIGEgbGluZSBvZiAgdGV4dCBmcm9tIHRoZSBzb2NrZXQuICBUaGUgbGluZSBpcwordGVybWluYXRlZCBieSBhICBMRiBjaGFyYWN0ZXIgKEFTQ0lJJm5ic3A7MTApLCBvcHRpb25hbGx5ICBwcmVjZWRlZCBieSBhCitDUiBjaGFyYWN0ZXIgKEFTQ0lJJm5ic3A7MTMpLiBUaGUgQ1IgYW5kIExGIGNoYXJhY3RlcnMgYXJlIG5vdCBpbmNsdWRlZCBpbgordGhlIHJldHVybmVkIGxpbmUuIEluIGZhY3QsIDxlbT5hbGw8L2VtPiBDUiBjaGFyYWN0ZXJzIGFyZQoraWdub3JlZCBieSB0aGUgcGF0dGVybi4gVGhpcyBpcyB0aGUgZGVmYXVsdCBwYXR0ZXJuOworPGxpPiA8dHQ+bnVtYmVyPC90dD46ICBjYXVzZXMgdGhlICBtZXRob2QgdG8gcmVhZCAgYSBzcGVjaWZpZWQgPHR0Pm51bWJlcjwvdHQ+IAorb2YgYnl0ZXMgZnJvbSB0aGUgc29ja2V0LgorPC91bD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5QcmVmaXg8L3R0PiBpcyBhbiBvcHRpb25hbCBzdHJpbmcgdG8gYmUgY29uY2F0ZW5hdGVkIHRvIHRoZSBiZWdpbm5pbmcKK29mIGFueSByZWNlaXZlZCBkYXRhIGJlZm9yZSByZXR1cm4uCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK0lmIHN1Y2Nlc3NmdWwsIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgcmVjZWl2ZWQgcGF0dGVybi4gSW4gY2FzZSBvZiBlcnJvciwKK3RoZSBtZXRob2QgcmV0dXJucyA8dHQ+PGI+bmlsPC9iPjwvdHQ+IGZvbGxvd2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2Ugd2hpY2gKK2NhbiBiZSB0aGUgc3RyaW5nICc8dHQ+Y2xvc2VkPC90dD4nICBpbiAgIGNhc2UgIHRoZSAgY29ubmVjdGlvbiAgd2FzCitjbG9zZWQgIGJlZm9yZSAgdGhlIHRyYW5zbWlzc2lvbiAgd2FzIGNvbXBsZXRlZCAgb3IgIHRoZSBzdHJpbmcKKyc8dHQ+dGltZW91dDwvdHQ+JyBpbiAgY2FzZSB0aGVyZSB3YXMgYSB0aW1lb3V0IGR1cmluZyAgdGhlIG9wZXJhdGlvbi4KK0Fsc28sIGFmdGVyIHRoZSBlcnJvciBtZXNzYWdlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGFydGlhbCByZXN1bHQgb2YKK3RoZSB0cmFuc21pc3Npb24uCis8L3A+CisKKzxwIGNsYXNzPW5vdGU+Cis8Yj5JbXBvcnRhbnQgbm90ZTwvYj46IFRoaXMgZnVuY3Rpb24gd2FzIGNoYW5nZWQgPGVtPnNldmVyZWx5PC9lbT4uIEl0IHVzZWQKK3RvIHN1cHBvcnQgbXVsdGlwbGUgcGF0dGVybnMgKGJ1dCBJIGhhdmUgbmV2ZXIgc2VlbiB0aGlzIGZlYXR1cmUgdXNlZCkgYW5kCitub3cgaXQgZG9lc24ndCBhbnltb3JlLiAgUGFydGlhbCByZXN1bHRzIHVzZWQgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgCit3YXkgYXMgc3VjY2Vzc2Z1bCByZXN1bHRzLiBUaGlzIGxhc3QgZmVhdHVyZSB2aW9sYXRlZCB0aGUgaWRlYSB0aGF0IGFsbAorZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gPHR0PjxiPm5pbDwvYj48L3R0PiBvbiBlcnJvci4gIFRodXMgaXQgd2FzIGNoYW5nZWQKK3Rvby4gCis8L3A+CisKKzwhLS0gc2VuZCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9c2VuZD4KK2NsaWVudDo8Yj5zZW5kKDwvYj5kYXRhIFssIGkgWywgal1dPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitTZW5kcyA8dHQ+ZGF0YTwvdHQ+IHRocm91Z2ggY2xpZW50IG9iamVjdC4KKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5EYXRhPC90dD4gaXMgdGhlIHN0cmluZyB0byBiZSBzZW50LiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzCis8dHQ+aTwvdHQ+IGFuZCA8dHQ+ajwvdHQ+IHdvcmsgZXhhY3RseSBsaWtlIHRoZSBzdGFuZGFyZAorPHR0PnN0cmluZy5zdWI8L3R0PiBMdWEgZnVuY3Rpb24gdG8gYWxsb3cgdGhlIHNlbGVjdGlvbiBvZiBhIAorc3Vic3RyaW5nIHRvIGJlIHNlbnQuCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK0lmIHN1Y2Nlc3NmdWwsIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgYnl0ZQord2l0aGluIDx0dD5baSwgal08L3R0PiB0aGF0IGhhcyBiZWVuIHNlbnQuICBOb3RpY2UgdGhhdCwgaWYKKzx0dD5pPC90dD4gaXMgMSBvciBhYnNlbnQsIHRoaXMgaXMgZWZmZWN0aXZlbHkgdGhlIHRvdGFsCitudW1iZXIgb2YgYnl0ZXMgc2VudC4gIEluIGNhc2Ugb2YgZXJyb3IsIHRoZSBtZXRob2QgcmV0dXJucworPGI+PHR0Pm5pbDwvdHQ+PC9iPiwgZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZSwgZm9sbG93ZWQKK2J5IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBieXRlIHdpdGhpbiA8dHQ+W2ksIGpdPC90dD4gdGhhdAoraGFzIGJlZW4gc2VudC4gWW91IG1pZ2h0IHdhbnQgdG8gdHJ5IGFnYWluIGZyb20gdGhlIGJ5dGUKK2ZvbGxvd2luZyB0aGF0LiAgVGhlIGVycm9yIG1lc3NhZ2UgY2FuIGJlICc8dHQ+Y2xvc2VkPC90dD4nCitpbiBjYXNlIHRoZSBjb25uZWN0aW9uIHdhcyAgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNtaXNzaW9uCit3YXMgIGNvbXBsZXRlZCBvciB0aGUgc3RyaW5nICAnPHR0PnRpbWVvdXQ8L3R0PicgIGluICBjYXNlCit0aGVyZSB3YXMgIGEgIHRpbWVvdXQgIGR1cmluZyAgdGhlIG9wZXJhdGlvbi4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IE91dHB1dCBpcyA8ZW0+bm90PC9lbT4gYnVmZmVyZWQuIEZvciBzbWFsbCBzdHJpbmdzLCAKK2l0IGlzIGFsd2F5cyBiZXR0ZXIgdG8gY29uY2F0ZW5hdGUgdGhlbSBpbiBMdWEgCisod2l0aCB0aGUgJzx0dD4uLjwvdHQ+JyBvcGVyYXRvcikgYW5kIHNlbmQgdGhlIHJlc3VsdCBpbiBvbmUgY2FsbCAKK2luc3RlYWQgb2YgY2FsbGluZyB0aGUgbWV0aG9kIHNldmVyYWwgdGltZXMuIAorPC9wPgorCis8IS0tIHNldG9wdGlvbiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPXNldG9wdGlvbj4KK2NsaWVudDo8Yj5zZXRvcHRpb24oPC9iPm9wdGlvbiBbLCB2YWx1ZV08Yj4pPC9iPjxicj4KK3NlcnZlcjo8Yj5zZXRvcHRpb24oPC9iPm9wdGlvbiBbLCB2YWx1ZV08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1NldHMgb3B0aW9ucyBmb3IgdGhlIFRDUCBvYmplY3QuIE9wdGlvbnMgYXJlIG9ubHkgbmVlZGVkIGJ5IGxvdy1sZXZlbCBvcgordGltZS1jcml0aWNhbCBhcHBsaWNhdGlvbnMuIFlvdSBzaG91bGQgb25seSBtb2RpZnkgYW4gb3B0aW9uIGlmIHlvdSAKK2FyZSBzdXJlIHlvdSBuZWVkIGl0LiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5PcHRpb248L3R0PiBpcyBhIHN0cmluZyB3aXRoIHRoZSBvcHRpb24gbmFtZSwgYW5kIDx0dD52YWx1ZTwvdHQ+IAorZGVwZW5kcyBvbiB0aGUgb3B0aW9uIGJlaW5nIHNldDoKKworPHVsPgorCis8bGk+ICc8dHQ+a2VlcGFsaXZlPC90dD4nOiAgU2V0dGluZyB0aGlzIG9wdGlvbiB0byA8dHQ+dHJ1ZTwvdHQ+IGVuYWJsZXMKK3RoZSBwZXJpb2RpYyB0cmFuc21pc3Npb24gb2YgbWVzc2FnZXMgb24gYSBjb25uZWN0ZWQgc29ja2V0LiBTaG91bGQgdGhlCitjb25uZWN0ZWQgcGFydHkgZmFpbCB0byByZXNwb25kIHRvIHRoZXNlIG1lc3NhZ2VzLCB0aGUgY29ubmVjdGlvbiBpcworY29uc2lkZXJlZCBicm9rZW4gYW5kIHByb2Nlc3NlcyB1c2luZyB0aGUgc29ja2V0IGFyZSBub3RpZmllZDsgCisKKzxsaT4gJzx0dD5saW5nZXI8L3R0Pic6IENvbnRyb2xzIHRoZSBhY3Rpb24gdGFrZW4gd2hlbiB1bnNlbnQgZGF0YSBhcmUKK3F1ZXVlZCBvbiBhIHNvY2tldCBhbmQgYSBjbG9zZSBpcyBwZXJmb3JtZWQuICBUaGUgdmFsdWUgaXMgYSB0YWJsZSB3aXRoIGEKK2Jvb2xlYW4gZW50cnkgJzx0dD5vbjwvdHQ+JyBhbmQgYSBudW1lcmljIGVudHJ5IGZvciB0aGUgdGltZSBpbnRlcnZhbAorJzx0dD50aW1lb3V0PC90dD4nIGluIHNlY29uZHMuIElmIHRoZSAnPHR0Pm9uPC90dD4nIGZpZWxkIGlzIHNldCB0bworPHR0PnRydWU8L3R0PiwgdGhlIHN5c3RlbSB3aWxsIGJsb2NrIHRoZSBwcm9jZXNzIG9uIHRoZSBjbG9zZSBhdHRlbXB0IHVudGlsCitpdCBpcyBhYmxlIHRvIHRyYW5zbWl0IHRoZSBkYXRhIG9yIHVudGlsICc8dHQ+dGltZW91dDwvdHQ+JyBoYXMgcGFzc2VkLiBJZgorJzx0dD5vbjwvdHQ+JyBpcyA8dHQ+ZmFsc2U8L3R0PiBhbmQgYSBjbG9zZSBpcyBpc3N1ZWQsIHRoZSBzeXN0ZW0gd2lsbAorcHJvY2VzcyB0aGUgY2xvc2UgaW4gYSBtYW5uZXIgdGhhdCBhbGxvd3MgdGhlIHByb2Nlc3MgdG8gY29udGludWUgYXMKK3F1aWNrbHkgYXMgcG9zc2libGUuIEkgZG8gbm90IGFkdmlzZSB5b3UgdG8gc2V0IHRoaXMgdG8gYW55dGhpbmcgb3RoZXIgdGhhbgoremVybzsgCisKKzxsaT4gJzx0dD5yZXVzZWFkZHI8L3R0Pic6IFNldHRpbmcgdGhpcyBvcHRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGVzCit1c2VkIGluIHZhbGlkYXRpbmcgYWRkcmVzc2VzIHN1cHBsaWVkIGluIGEgY2FsbCB0byAKKzxhIGhyZWY9I2JpbmQ+PHR0PmJpbmQ8L3R0PjwvYT4gc2hvdWxkIGFsbG93IHJldXNlIG9mIGxvY2FsIGFkZHJlc3NlczsKKworPGxpPiAnPHR0PnRjcC1ub2RlbGF5PC90dD4nOiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDx0dD50cnVlPC90dD4gCitkaXNhYmxlcyB0aGUgTmFnbGUncyBhbGdvcml0aG0gZm9yIHRoZSBjb25uZWN0aW9uLgorCis8L3VsPgorCis8cCBjbGFzcz1yZXR1cm4+CitUaGUgbWV0aG9kIHJldHVybnMgMSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG9yIDxiPjx0dD5uaWw8L3R0PjwvYj4gb3RoZXJ3aXNlLgorPC9wPgorCis8cCBjbGFzcz1ub3RlPgorTm90ZTogVGhlIGRlc2NyaXB0aW9ucyBhYm92ZSBjb21lIGZyb20gdGhlIG1hbiBwYWdlcy4KKzwvcD4KKworPCEtLSBzZXRzdGF0cyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD1zZXRzdGF0cz4KK21hc3Rlcjo8Yj5zZXRzdGF0cyg8L2I+cmVjZWl2ZWQsIHNlbnQsIGFnZTxiPik8L2I+PGJyPgorY2xpZW50OjxiPnNldHN0YXRzKDwvYj5yZWNlaXZlZCwgc2VudCwgYWdlPGI+KTwvYj48YnI+CitzZXJ2ZXI6PGI+c2V0c3RhdHMoPC9iPnJlY2VpdmVkLCBzZW50LCBhZ2U8Yj4pPC9iPjxicj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitSZXNldHMgYWNjb3VudGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgc29ja2V0LCB1c2VmdWwgZm9yIHRocm90dGxpbmcKK29mIGJhbmR3aWR0aC4gCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+UmVjZWl2ZWQ8L3R0PiBpcyBhIG51bWJlciB3aXRoIHRoZSBuZXcgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgorPHR0PlNlbnQ8L3R0PiBpcyBhIG51bWJlciB3aXRoIHRoZSBuZXcgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCis8dHQ+QWdlPC90dD4gaXMgdGhlIG5ldyBhZ2UgaW4gc2Vjb25kcy4KKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIG1ldGhvZCByZXR1cm5zIDEgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCA8dHQ+PGI+bmlsPC9iPjwvdHQ+IG90aGVyd2lzZS4gCis8L3A+CisKKzwhLS0gc2V0dGltZW91dCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9c2V0dGltZW91dD4KK21hc3Rlcjo8Yj5zZXR0aW1lb3V0KDwvYj52YWx1ZSBbLCBtb2RlXTxiPik8L2I+PGJyPgorY2xpZW50OjxiPnNldHRpbWVvdXQoPC9iPnZhbHVlIFssIG1vZGVdPGI+KTwvYj48YnI+CitzZXJ2ZXI6PGI+c2V0dGltZW91dCg8L2I+dmFsdWUgWywgbW9kZV08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0NoYW5nZXMgdGhlIHRpbWVvdXQgIHZhbHVlcyBmb3IgdGhlIG9iamVjdC4gQnkgZGVmYXVsdCwKK2FsbCBJL08gIG9wZXJhdGlvbnMgYXJlICBibG9ja2luZy4gVGhhdCAgaXMsIGFueSAgY2FsbCB0byAgdGhlIG1ldGhvZHMKKzxhIGhyZWY9I3NlbmQ+PHR0PnNlbmQ8L3R0PjwvYT4sIAorPGEgaHJlZj0jcmVjZWl2ZT48dHQ+cmVjZWl2ZTwvdHQ+PC9hPiwgYW5kIAorPGEgaHJlZj0jYWNjZXB0Pjx0dD5hY2NlcHQ8L3R0PjwvYT4KK3dpbGwgIGJsb2NrIGluZGVmaW5pdGVseSwgIHVudGlsIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLiAgVGhlCis8dHQ+c2V0dGltZW91dDwvdHQ+ICBtZXRob2QgZGVmaW5lcyBhICBsaW1pdCBvbiB0aGUgIGFtb3VudCAgb2YgICB0aW1lICB0aGUKK0kvTyBtZXRob2RzIGNhbiAgYmxvY2suIFdoZW4gYSB0aW1lb3V0IGlzIHNldCBhbmQgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YKK3RpbWUgaGFzIGVsYXBzZWQsIHRoZSBhZmZlY3RlZCBtZXRob2RzIGdpdmUgdXAgYW5kIGZhaWwgd2l0aCBhbiBlcnJvciBjb2RlLgorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorVGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgaXMgc3BlY2lmaWVkICBhcyAgdGhlCis8dHQ+dmFsdWU8L3R0PiBwYXJhbWV0ZXIsIGluIHNlY29uZHMuIFRoZXJlICBhcmUgdHdvIHRpbWVvdXQgIG1vZGVzIGFuZAorYm90aCBjYW4gYmUgdXNlZCB0b2dldGhlciBmb3IgZmluZSB0dW5pbmc6IAorPC9wPgorCis8dWw+Cis8bGk+ICc8dHQ+YjwvdHQ+JzogPGVtPmJsb2NrPC9lbT4gdGltZW91dC4gIFNwZWNpZmllcyB0aGUgdXBwZXIgbGltaXQgb24KK3RoZSBhbW91bnQgIG9mIHRpbWUgIEx1YVNvY2tldCBjYW4gIGJlIGJsb2NrZWQgIGJ5IHRoZSAgb3BlcmF0aW5nIHN5c3RlbQord2hpbGUgd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiBhbnkgc2luZ2xlIEkvTyBvcGVyYXRpb24uIFRoaXMgaXMgdGhlCitkZWZhdWx0IG1vZGU7PC9saT4KKworPGxpPiAnPHR0PnQ8L3R0Pic6ICA8ZW0+dG90YWw8L2VtPiB0aW1lb3V0LiBTcGVjaWZpZXMgdGhlICB1cHBlciBsaW1pdCBvbgordGhlIGFtb3VudCBvZiAgdGltZSBMdWFTb2NrZXQgY2FuIGJsb2NrIGEgTHVhICBzY3JpcHQgYmVmb3JlIHJldHVybmluZyBmcm9tCithIGNhbGwuPC9saT4gCis8L3VsPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorVGhlICA8Yj48dHQ+bmlsPC90dD48L2I+ICB0aW1lb3V0ICA8dHQ+dmFsdWU8L3R0PiBhbGxvd3MgIG9wZXJhdGlvbnMgIHRvICBibG9jaworaW5kZWZpbml0ZWx5LiBOZWdhdGl2ZSB0aW1lb3V0IHZhbHVlcyBoYXZlIHRoZSBzYW1lIGVmZmVjdC4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IGFsdGhvdWdoICB0aW1lb3V0IHZhbHVlcyAgaGF2ZSBtaWxsaXNlY29uZCAgcHJlY2lzaW9uIGluIEx1YVNvY2tldCwKK2xhcmdlICBibG9ja3MgY2FuIGNhdXNlIEkvTyBmdW5jdGlvbnMgbm90IHRvICByZXNwZWN0IHRpbWVvdXQgdmFsdWVzIGR1ZQordG8gdGhlIHRpbWUgdGhlIGxpYnJhcnkgdGFrZXMgdG8gIHRyYW5zZmVyIGJsb2NrcyB0byBhbmQgZnJvbSB0aGUgIE9TCithbmQgdG8gYW5kIGZyb20gdGhlIEx1YSBpbnRlcnByZXRlci4gQWxzbywgZnVuY3Rpb24gdGhhdCBhY2NlcHQgaG9zdCBuYW1lcworYW5kIHBlcmZvcm0gYXV0b21hdGljIG5hbWUgcmVzb2x1dGlvbiBtaWdodCBiZSBibG9ja2VkIGJ5IHRoZSByZXNvbHZlciBmb3IKK2xvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgdGltZW91dCB2YWx1ZS4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFRoZSBvbGQgPHR0PnRpbWVvdXQ8L3R0PiBtZXRob2QgaXMgZGVwcmVjYXRlZC4gVGhlIG5hbWUgaGFzIGJlZW4KK2NoYW5nZWQgZm9yIHNha2Ugb2YgdW5pZm9ybWl0eSwgc2luY2UgYWxsIG90aGVyIG1ldGhvZCBuYW1lcyBhbHJlYWR5Citjb250YWluZWQgdmVyYnMgbWFraW5nIHRoZWlyIGltcGVyYXRpdmUgbmF0dXJlIG9idmlvdXMuCis8L3A+CisKKzwhLS0gc2h1dGRvd24gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9c2h1dGRvd24+CitjbGllbnQ6PGI+c2h1dGRvd24oPC9iPm1vZGU8Yj4pPC9iPjxicj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitTaHV0cyBkb3duIHBhcnQgb2YgYSBmdWxsLWR1cGxleCBjb25uZWN0aW9uLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KK01vZGUgdGVsbHMgd2hpY2ggd2F5IG9mIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBzaHV0IGRvd24gYW5kIGNhbgordGFrZSB0aGUgdmFsdWU6Cis8dWw+Cis8bGk+Ijx0dD5ib3RoPC90dD4iOiBkaXNhbGxvdyBmdXJ0aGVyIHNlbmRzIGFuZCByZWNlaXZlcyBvbiB0aGUgb2JqZWN0LgorVGhpcyBpcyB0aGUgZGVmYXVsdCBtb2RlOworPGxpPiI8dHQ+c2VuZDwvdHQ+IjogZGlzYWxsb3cgZnVydGhlciBzZW5kcyBvbiB0aGUgb2JqZWN0OworPGxpPiI8dHQ+cmVjZWl2ZTwvdHQ+IjogZGlzYWxsb3cgZnVydGhlciByZWNlaXZlcyBvbiB0aGUgb2JqZWN0LgorPC91bD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEuCis8L3A+CisKKzwhLS0gZm9vdGVyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9Zm9vdGVyPgorPGhyPgorPGNlbnRlcj4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3duIj5kb3dubG9hZDwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIj5pbnN0YWxsYXRpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCI+aW50cm9kdWN0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPnJlZmVyZW5jZTwvYT4KKzwvcD4KKzxwPgorPHNtYWxsPgorTGFzdCBtb2RpZmllZCBieSBEaWVnbyBOZWhhYiBvbiA8YnI+CitUaHUgQXByIDIwIDAwOjI1OjU3IEVEVCAyMDA2Cis8L3NtYWxsPgorPC9wPgorPC9jZW50ZXI+Cis8L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2RvYy91ZHAuaHRtbCBiL2x1YXNvY2tldC0yLjAuMi9kb2MvdWRwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4NjQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9kb2MvdWRwLmh0bWwKQEAgLTAsMCArMSw0MTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iTHVhU29ja2V0OiBUaGUgVURQIHN1cHBvcnQiPgorPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Ikx1YSwgTHVhU29ja2V0LCBTb2NrZXQsIFVEUCwgTGlicmFyeSwgTmV0d29yaywgU3VwcG9ydCI+IAorPHRpdGxlPkx1YVNvY2tldDogVURQIHN1cHBvcnQ8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJyZWZlcmVuY2UuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8IS0tIGhlYWRlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxkaXYgY2xhc3M9aGVhZGVyPgorPGhyPgorPGNlbnRlcj4KKzx0YWJsZSBzdW1tYXJ5PSJMdWFTb2NrZXQgbG9nbyI+Cis8dHI+PHRkIGFsaWduPWNlbnRlcj48YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmciPgorPGltZyB3aWR0aD0xMjggaGVpZ2h0PTEyOCBib3JkZXI9MCBhbHQ9Ikx1YVNvY2tldCIgc3JjPSJsdWFzb2NrZXQucG5nIj4KKzwvYT48L3RkPjwvdHI+Cis8dHI+PHRkIGFsaWduPWNlbnRlciB2YWxpZ249dG9wPk5ldHdvcmsgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorPC90ZD48L3RyPgorPC90YWJsZT4KKzxwIGNsYXNzPWJhcj4KKzxhIGhyZWY9ImhvbWUuaHRtbCI+aG9tZTwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImhvbWUuaHRtbCNkb3dubG9hZCI+ZG93bmxvYWQ8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+aW5zdGFsbGF0aW9uPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPmludHJvZHVjdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5yZWZlcmVuY2U8L2E+IAorPC9wPgorPC9jZW50ZXI+Cis8aHI+Cis8L2Rpdj4KKworCis8IS0tIHVkcCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8aDIgaWQ9dWRwPlVEUDwvaDI+IAorCis8IS0tIHNvY2tldC51ZHAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPSJuYW1lIiBpZD0ic29ja2V0LnVkcCI+Citzb2NrZXQuPGI+dWRwKCk8L2I+Cis8L3A+CisKKzxwIGNsYXNzPSJkZXNjcmlwdGlvbiI+CitDcmVhdGVzIGFuZCByZXR1cm5zIGFuIHVuY29ubmVjdGVkIFVEUCBvYmplY3QuIFVuY29ubmVjdGVkIG9iamVjdHMgc3VwcG9ydCB0aGUgCis8YSBocmVmPSIjc2VuZHRvIj48dHQ+c2VuZHRvPC90dD48L2E+LCAKKzxhIGhyZWY9IiNyZWNlaXZlIj48dHQ+cmVjZWl2ZTwvdHQ+PC9hPiwgCis8YSBocmVmPSIjcmVjZWl2ZWZyb20iPjx0dD5yZWNlaXZlZnJvbTwvdHQ+PC9hPiwgCis8YSBocmVmPSIjZ2V0c29ja25hbWUiPjx0dD5nZXRzb2NrbmFtZTwvdHQ+PC9hPiwgCis8YSBocmVmPSIjc2V0b3B0aW9uIj48dHQ+c2V0b3B0aW9uPC90dD48L2E+LCAKKzxhIGhyZWY9IiNzZXR0aW1lb3V0Ij48dHQ+c2V0dGltZW91dDwvdHQ+PC9hPiwgCis8YSBocmVmPSIjc2V0cGVlcm5hbWUiPjx0dD5zZXRwZWVybmFtZTwvdHQ+PC9hPiwgCis8YSBocmVmPSIjc2V0c29ja25hbWUiPjx0dD5zZXRzb2NrbmFtZTwvdHQ+PC9hPiwgYW5kIAorPGEgaHJlZj0iI2Nsb3NlIj48dHQ+Y2xvc2U8L3R0PjwvYT4uIAorVGhlIDxhIGhyZWY9IiNzZXRwZWVybmFtZSI+PHR0PnNldHBlZXJuYW1lPC90dD48L2E+IAoraXMgdXNlZCB0byBjb25uZWN0IHRoZSBvYmplY3QuCis8L3A+CisKKzxwIGNsYXNzPSJyZXR1cm4iPgorSW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5ldyB1bmNvbm5lY3RlZCBVRFAgb2JqZWN0CityZXR1cm5lZC4gSW4gY2FzZSBvZiBlcnJvciwgPGI+PHR0Pm5pbDwvdHQ+PC9iPiBpcyByZXR1cm5lZCwgZm9sbG93ZWQgYnkKK2FuIGVycm9yIG1lc3NhZ2UuCis8L3A+CisKKzwhLS0gY2xvc2UgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9Im5hbWUiIGlkPSJjbG9zZSI+Citjb25uZWN0ZWQ6PGI+Y2xvc2UoKTwvYj48YnI+Cit1bmNvbm5lY3RlZDo8Yj5jbG9zZSgpPC9iPgorPC9wPgorCis8cCBjbGFzcz0iZGVzY3JpcHRpb24iPgorQ2xvc2VzIGEgVURQIG9iamVjdC4gVGhlIGludGVybmFsIHNvY2tldAordXNlZCBieSB0aGUgb2JqZWN0IGlzIGNsb3NlZCBhbmQgdGhlIGxvY2FsIGFkZHJlc3MgdG8gd2hpY2ggdGhlCitvYmplY3Qgd2FzIGJvdW5kIGlzIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4gTm8KK2Z1cnRoZXIgb3BlcmF0aW9ucyAoZXhjZXB0IGZvciBmdXJ0aGVyIGNhbGxzIHRvIHRoZSA8dHQ+Y2xvc2U8L3R0PgorbWV0aG9kKSBhcmUgYWxsb3dlZCBvbiBhIGNsb3NlZCBzb2NrZXQuCis8L3A+CisKKzxwIGNsYXNzPSJub3RlIj4KK05vdGU6IEl0IGlzIGltcG9ydGFudCB0byBjbG9zZSBhbGwgdXNlZCBzb2NrZXRzCitvbmNlIHRoZXkgYXJlIG5vdCBuZWVkZWQsIHNpbmNlLCBpbiBtYW55IHN5c3RlbXMsIGVhY2ggc29ja2V0IHVzZXMKK2EgZmlsZSBkZXNjcmlwdG9yLCB3aGljaCBhcmUgbGltaXRlZCBzeXN0ZW0gcmVzb3VyY2VzLgorR2FyYmFnZS1jb2xsZWN0ZWQgb2JqZWN0cyBhcmUgYXV0b21hdGljYWxseSBjbG9zZWQgYmVmb3JlCitkZXN0cnVjdGlvbiwgdGhvdWdoLgorPC9wPgorCis8IS0tIGdldHBlZXJuYW1lICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPSJuYW1lIiBpZD0iZ2V0cGVlcm5hbWUiPgorY29ubmVjdGVkOjxiPmdldHBlZXJuYW1lKCk8L2I+Cis8L3A+CisKKzxwIGNsYXNzPSJkZXNjcmlwdGlvbiI+CitSZXRyaWV2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBlZXIKK2Fzc29jaWF0ZWQgd2l0aCBhIGNvbm5lY3RlZCBVRFAgb2JqZWN0LgorPC9wPgorCis8cCBjbGFzcz0icmV0dXJuIj4KK1JldHVybnMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIG9mIHRoZSBwZWVyLgorPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+CitOb3RlOiBJdCBtYWtlcyBubyBzZW5zZSB0byBjYWxsIHRoaXMgbWV0aG9kIG9uIHVuY29ubmVjdGVkIG9iamVjdHMuCis8L3A+CisKKzwhLS0gZ2V0c29ja25hbWUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9Im5hbWUiIGlkPSJnZXRzb2NrbmFtZSI+Citjb25uZWN0ZWQ6PGI+Z2V0c29ja25hbWUoKTwvYj48YnI+Cit1bmNvbm5lY3RlZDo8Yj5nZXRzb2NrbmFtZSgpPC9iPgorPC9wPgorCis8cCBjbGFzcz0iZGVzY3JpcHRpb24iPgorUmV0dXJucyB0aGUgbG9jYWwgYWRkcmVzcyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSBvYmplY3QuCis8L3A+CisKKzxwIGNsYXNzPSJyZXR1cm4iPgorVGhlIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIHdpdGggbG9jYWwgSVAKK2FkZHJlc3MgYW5kIGEgbnVtYmVyIHdpdGggdGhlIHBvcnQuIEluIGNhc2Ugb2YgZXJyb3IsIHRoZSBtZXRob2QKK3JldHVybnMgPGI+PHR0Pm5pbDwvdHQ+PC9iPi4KKzwvcD4KKworPHAgY2xhc3M9Im5vdGUiPgorTm90ZTogVURQIHNvY2tldHMgYXJlIG5vdCBib3VuZCB0byBhbnkgYWRkcmVzcwordW50aWwgdGhlIDxhIGhyZWY9IiNzZXRzb2NrbmFtZSI+PHR0PnNldHNvY2tuYW1lPC90dD48L2E+IG9yIHRoZQorPGEgaHJlZj0iI3NlbmR0byI+PHR0PnNlbmR0bzwvdHQ+PC9hPiBtZXRob2QgaXMgY2FsbGVkIGZvciB0aGUKK2ZpcnN0IHRpbWUgKGluIHdoaWNoIGNhc2UgaXQgaXMgYm91bmQgdG8gYW4gZXBoZW1lcmFsIHBvcnQgYW5kIHRoZQord2lsZC1jYXJkIGFkZHJlc3MpLgorPC9wPgorCis8IS0tIHJlY2VpdmUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPSJuYW1lIiBpZD0icmVjZWl2ZSI+Citjb25uZWN0ZWQ6PGI+cmVjZWl2ZSg8L2I+W3NpemVdPGI+KTwvYj48YnI+Cit1bmNvbm5lY3RlZDo8Yj5yZWNlaXZlKDwvYj5bc2l6ZV08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz0iZGVzY3JpcHRpb24iPgorUmVjZWl2ZXMgYSBkYXRhZ3JhbSBmcm9tIHRoZSBVRFAgb2JqZWN0LiBJZgordGhlIFVEUCBvYmplY3QgaXMgY29ubmVjdGVkLCBvbmx5IGRhdGFncmFtcyBjb21pbmcgZnJvbSB0aGUgcGVlcgorYXJlIGFjY2VwdGVkLiBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCBkYXRhZ3JhbSBjYW4gY29tZSBmcm9tIGFueQoraG9zdC4KKzwvcD4KKworPHAgY2xhc3M9InBhcmFtZXRlcnMiPgorVGhlIG9wdGlvbmFsIDx0dD5zaXplPC90dD4gcGFyYW1ldGVyCitzcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YWdyYW0gdG8gYmUgcmV0cmlldmVkLiBJZgordGhlcmUgYXJlIG1vcmUgdGhhbiA8dHQ+c2l6ZTwvdHQ+IGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGF0YWdyYW0sCit0aGUgZXhjZXNzIGJ5dGVzIGFyZSBkaXNjYXJkZWQuIElmIHRoZXJlIGFyZSBsZXNzIHRoZW4KKzx0dD5zaXplPC90dD4gYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGRhdGFncmFtLCB0aGUKK2F2YWlsYWJsZSBieXRlcyBhcmUgcmV0dXJuZWQuIElmIDx0dD5zaXplPC90dD4gaXMgb21pdHRlZCwgdGhlCittYXhpbXVtIGRhdGFncmFtIHNpemUgaXMgdXNlZCAod2hpY2ggaXMgY3VycmVudGx5IGxpbWl0ZWQgYnkgdGhlCitpbXBsZW1lbnRhdGlvbiB0byA4MTkyIGJ5dGVzKS4KKzwvcD4KKworPHAgY2xhc3M9InJldHVybiI+CitJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSBtZXRob2QgcmV0dXJucyB0aGUKK3JlY2VpdmVkIGRhdGFncmFtLiBJbiBjYXNlIG9mIHRpbWVvdXQsIHRoZSBtZXRob2QgcmV0dXJucworPGI+PHR0Pm5pbDwvdHQ+PC9iPiBmb2xsb3dlZCBieSB0aGUgc3RyaW5nICc8dHQ+dGltZW91dDwvdHQ+Jy4KKzwvcD4KKworPCEtLSByZWNlaXZlZnJvbSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz0ibmFtZSIgaWQ9InJlY2VpdmVmcm9tIj4KK3VuY29ubmVjdGVkOjxiPnJlY2VpdmVmcm9tKDwvYj5bc2l6ZV08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz0iZGVzY3JpcHRpb24iPgorV29ya3MgZXhhY3RseSBhcyB0aGUgPGEgaHJlZj0iI3JlY2VpdmUiPjx0dD5yZWNlaXZlPC90dD48L2E+IAorbWV0aG9kLCBleGNlcHQgaXQgcmV0dXJucyB0aGUgSVAKK2FkZHJlc3MgYW5kIHBvcnQgYXMgZXh0cmEgcmV0dXJuIHZhbHVlcyAoYW5kIGlzIHRoZXJlZm9yZSBzbGlnaHRseSBsZXNzCitlZmZpY2llbnQpLgorPC9wPgorCis8IS0tIHNlbmQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPSJuYW1lIiBpZD0ic2VuZCI+Citjb25uZWN0ZWQ6PGI+c2VuZCg8L2I+ZGF0YWdyYW08Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz0iZGVzY3JpcHRpb24iPgorU2VuZHMgYSBkYXRhZ3JhbSB0byB0aGUgVURQIHBlZXIgb2YgYSBjb25uZWN0ZWQgb2JqZWN0LgorPC9wPgorCis8cCBjbGFzcz0icGFyYW1ldGVycyI+Cis8dHQ+RGF0YWdyYW08L3R0PiBpcyBhIHN0cmluZyB3aXRoIHRoZSBkYXRhZ3JhbSBjb250ZW50cy4gCitUaGUgbWF4aW11bSBkYXRhZ3JhbSBzaXplIGZvciBVRFAgaXMgNjRLIG1pbnVzIElQIGxheWVyIG92ZXJoZWFkLgorSG93ZXZlciBkYXRhZ3JhbXMgbGFyZ2VyIHRoYW4gdGhlIGxpbmsgbGF5ZXIgcGFja2V0IHNpemUgd2lsbCBiZQorZnJhZ21lbnRlZCwgd2hpY2ggbWF5IGRldGVyaW9yYXRlIHBlcmZvcm1hbmNlIGFuZC9vciByZWxpYWJpbGl0eS4KKzwvcD4KKworPHAgY2xhc3M9InJldHVybiI+CitJZiBzdWNjZXNzZnVsLCB0aGUgbWV0aG9kIHJldHVybnMgMS4gSW4gY2FzZSBvZgorZXJyb3IsIHRoZSBtZXRob2QgcmV0dXJucyA8Yj48dHQ+bmlsPC90dD48L2I+IGZvbGxvd2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UuCis8L3A+CisKKzxwIGNsYXNzPSJub3RlIj4KK05vdGU6IEluIFVEUCwgdGhlIDx0dD5zZW5kPC90dD4gbWV0aG9kIG5ldmVyIGJsb2NrcworYW5kIHRoZSBvbmx5IHdheSBpdCBjYW4gZmFpbCBpcyBpZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIKK3JlZnVzZXMgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzIChpLmUuIG5vCitpbnRlcmZhY2UgYWNjZXB0cyB0aGUgYWRkcmVzcykuCis8L3A+CisKKzwhLS0gc2VuZHRvICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9Im5hbWUiIGlkPSJzZW5kdG8iPgordW5jb25uZWN0ZWQ6PGI+c2VuZHRvKDwvYj5kYXRhZ3JhbSwgaXAsIHBvcnQ8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz0iZGVzY3JpcHRpb24iPgorU2VuZHMgYSBkYXRhZ3JhbSB0byB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyLgorPC9wPgorCis8cCBjbGFzcz0icGFyYW1ldGVycyI+Cis8dHQ+RGF0YWdyYW08L3R0PiBpcyBhIHN0cmluZyB3aXRoIHRoZQorZGF0YWdyYW0gY29udGVudHMuIAorVGhlIG1heGltdW0gZGF0YWdyYW0gc2l6ZSBmb3IgVURQIGlzIDY0SyBtaW51cyBJUCBsYXllciBvdmVyaGVhZC4KK0hvd2V2ZXIgZGF0YWdyYW1zIGxhcmdlciB0aGFuIHRoZSBsaW5rIGxheWVyIHBhY2tldCBzaXplIHdpbGwgYmUKK2ZyYWdtZW50ZWQsIHdoaWNoIG1heSBkZXRlcmlvcmF0ZSBwZXJmb3JtYW5jZSBhbmQvb3IgcmVsaWFiaWxpdHkuCis8dHQ+SXA8L3R0PiBpcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LiAKK0hvc3QgbmFtZXMgYXJlIDxlbT5ub3Q8L2VtPiBhbGxvd2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorCis8dHQ+UG9ydDwvdHQ+IGlzIHRoZSBwb3J0IG51bWJlciBhdCB0aGUgcmVjaXBpZW50LgorPC9wPgorCis8cCBjbGFzcz0icmV0dXJuIj4KK0lmIHN1Y2Nlc3NmdWwsIHRoZSBtZXRob2QgcmV0dXJucyAxLiBJbiBjYXNlIG9mCitlcnJvciwgdGhlIG1ldGhvZCByZXR1cm5zIDxiPjx0dD5uaWw8L3R0PjwvYj4gZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZS4KKzwvcD4KKworPHAgY2xhc3M9Im5vdGUiPgorTm90ZTogSW4gVURQLCB0aGUgPHR0PnNlbmQ8L3R0PiBtZXRob2QgbmV2ZXIgYmxvY2tzCithbmQgdGhlIG9ubHkgd2F5IGl0IGNhbiBmYWlsIGlzIGlmIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBsYXllcgorcmVmdXNlcyB0byBzZW5kIGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgKGkuZS4gbm8KK2ludGVyZmFjZSBhY2NlcHRzIHRoZSBhZGRyZXNzKS4KKzwvcD4KKworPCEtLSBzZXRwZWVybmFtZSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz0ibmFtZSIgaWQ9InNldHBlZXJuYW1lIj4KK2Nvbm5lY3RlZDo8Yj5zZXRwZWVybmFtZSg8L2I+JyonPGI+KTwvYj48YnI+Cit1bmNvbm5lY3RlZDo8Yj5zZXRwZWVybmFtZSg8L2I+YWRkcmVzcywgcG9ydDxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPSJkZXNjcmlwdGlvbiI+CitDaGFuZ2VzIHRoZSBwZWVyIG9mIGEgVURQIG9iamVjdC4gVGhpcworbWV0aG9kIHR1cm5zIGFuIHVuY29ubmVjdGVkIFVEUCBvYmplY3QgaW50byBhIGNvbm5lY3RlZCBVRFAKK29iamVjdCBvciB2aWNlIHZlcnNhLgorPC9wPgorCis8cCBjbGFzcz0iZGVzY3JpcHRpb24iPgorRm9yIGNvbm5lY3RlZCBvYmplY3RzLCBvdXRnb2luZyBkYXRhZ3JhbXMKK3dpbGwgYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkIHBlZXIsIGFuZCBkYXRhZ3JhbXMgcmVjZWl2ZWQgZnJvbQorb3RoZXIgcGVlcnMgd2lsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIE9TLiBDb25uZWN0ZWQgVURQIG9iamVjdHMgbXVzdAordXNlIHRoZSA8YSBocmVmPSIjc2VuZCI+PHR0PnNlbmQ8L3R0PjwvYT4gYW5kIAorPGEgaHJlZj0iI3JlY2VpdmUiPjx0dD5yZWNlaXZlPC90dD48L2E+IG1ldGhvZHMgaW5zdGVhZCBvZiAKKzxhIGhyZWY9IiNzZW5kdG8iPjx0dD5zZW5kdG88L3R0PjwvYT4gYW5kIAorPGEgaHJlZj0iI3JlY2VpdmVmcm9tIj48dHQ+cmVjZWl2ZWZyb208L3R0PjwvYT4uCis8L3A+CisKKzxwIGNsYXNzPSJwYXJhbWV0ZXJzIj4KKzx0dD5BZGRyZXNzPC90dD4gY2FuIGJlIGFuIElQIGFkZHJlc3Mgb3IgYQoraG9zdCBuYW1lLiA8dHQ+UG9ydDwvdHQ+IGlzIHRoZSBwb3J0IG51bWJlci4gSWYgPHR0PmFkZHJlc3M8L3R0PiBpcworJzx0dD4qPC90dD4nIGFuZCB0aGUgb2JqZWN0IGlzIGNvbm5lY3RlZCwgdGhlIHBlZXIgYXNzb2NpYXRpb24gaXMKK3JlbW92ZWQgYW5kIHRoZSBvYmplY3QgYmVjb21lcyBhbiB1bmNvbm5lY3RlZCBvYmplY3QgYWdhaW4uIEluIHRoYXQKK2Nhc2UsIHRoZSA8dHQ+cG9ydDwvdHQ+IGFyZ3VtZW50IGlzIGlnbm9yZWQuCis8L3A+CisKKzxwIGNsYXNzPSJyZXR1cm4iPgorSW4gY2FzZSBvZiBlcnJvciB0aGUgbWV0aG9kIHJldHVybnMKKzxiPjx0dD5uaWw8L3R0PjwvYj4gZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZS4gSW4gY2FzZSBvZiBzdWNjZXNzLCB0aGUKK21ldGhvZCByZXR1cm5zIDEuCis8L3A+CisKKzxwIGNsYXNzPSJub3RlIj4KK05vdGU6IFNpbmNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwZWVyIGRvZXMgbm90IGhhdmUKK3RvIGJlIHBhc3NlZCB0byBhbmQgZnJvbSB0aGUgT1MsIHRoZSB1c2Ugb2YgY29ubmVjdGVkIFVEUCBvYmplY3RzCitpcyByZWNvbW1lbmRlZCB3aGVuIHRoZSBzYW1lIHBlZXIgaXMgdXNlZCBmb3Igc2V2ZXJhbCB0cmFuc21pc3Npb25zCithbmQgY2FuIHJlc3VsdCBpbiB1cCB0byAzMCUgcGVyZm9ybWFuY2UgZ2FpbnMuCis8L3A+CisKKzwhLS0gc2V0c29ja25hbWUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9Im5hbWUiIGlkPSJzZXRzb2NrbmFtZSI+Cit1bmNvbm5lY3RlZDo8Yj5zZXRzb2NrbmFtZSg8L2I+YWRkcmVzcywgcG9ydDxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPSJkZXNjcmlwdGlvbiI+CitCaW5kcyB0aGUgVURQIG9iamVjdCB0byBhIGxvY2FsIGFkZHJlc3MuCis8L3A+CisKKzxwIGNsYXNzPSJwYXJhbWV0ZXJzIj4KKzx0dD5BZGRyZXNzPC90dD4gY2FuIGJlIGFuIElQIGFkZHJlc3Mgb3IgYQoraG9zdCBuYW1lLiBJZiA8dHQ+YWRkcmVzczwvdHQ+IGlzICc8dHQ+KjwvdHQ+JyB0aGUgc3lzdGVtIGJpbmRzIHRvCithbGwgbG9jYWwgaW50ZXJmYWNlcyB1c2luZyB0aGUgY29uc3RhbnQgPHR0PklOQUREUl9BTlk8L3R0Pi4gSWYKKzx0dD5wb3J0PC90dD4gaXMgMCwgdGhlIHN5c3RlbSBjaG9vc2VzIGFuIGVwaGVtZXJhbCBwb3J0LgorPC9wPgorCis8cCBjbGFzcz0icmV0dXJuIj4KK0lmIHN1Y2Nlc3NmdWwsIHRoZSBtZXRob2QgcmV0dXJucyAxLiBJbiBjYXNlIG9mCitlcnJvciwgdGhlIG1ldGhvZCByZXR1cm5zIDxiPjx0dD5uaWw8L3R0PjwvYj4gZm9sbG93ZWQgYnkgYW4gZXJyb3IKK21lc3NhZ2UuCis8L3A+CisKKzxwIGNsYXNzPSJub3RlIj4KK05vdGU6IFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgYW55CitkYXRhZ3JhbSBpcyBzZW50IHRocm91Z2ggdGhlIFVEUCBvYmplY3QsIGFuZCBvbmx5IG9uY2UuIE90aGVyd2lzZSwKK3RoZSBzeXN0ZW0gYXV0b21hdGljYWxseSBiaW5kcyB0aGUgb2JqZWN0IHRvIGFsbCBsb2NhbCBpbnRlcmZhY2VzCithbmQgY2hvb3NlcyBhbiBlcGhlbWVyYWwgcG9ydCBhcyBzb29uIGFzIHRoZSBmaXJzdCBkYXRhZ3JhbSBpcworc2VudC4gQWZ0ZXIgdGhlIGxvY2FsIGFkZHJlc3MgaXMgc2V0LCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUKK3N5c3RlbSBvciBleHBsaWNpdGx5IGJ5IDx0dD5zZXRzb2NrbmFtZTwvdHQ+LCBpdCBjYW5ub3QgYmUKK2NoYW5nZWQuCis8L3A+CisKKzwhLS0gc2V0b3B0aW9uICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9Im5hbWUiIGlkPSJzZXRvcHRpb24iPgorY29ubmVjdGVkOjxiPnNldG9wdGlvbig8L2I+b3B0aW9uIFssIHZhbHVlXTxiPik8L2I+PGJyPgordW5jb25uZWN0ZWQ6PGI+c2V0b3B0aW9uKDwvYj5vcHRpb24gWywgdmFsdWVdPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ImRlc2NyaXB0aW9uIj4KK1NldHMgb3B0aW9ucyBmb3IgdGhlIFVEUCBvYmplY3QuIE9wdGlvbnMgYXJlCitvbmx5IG5lZWRlZCBieSBsb3ctbGV2ZWwgb3IgdGltZS1jcml0aWNhbCBhcHBsaWNhdGlvbnMuIFlvdSBzaG91bGQKK29ubHkgbW9kaWZ5IGFuIG9wdGlvbiBpZiB5b3UgYXJlIHN1cmUgeW91IG5lZWQgaXQuPC9wPgorPHAgY2xhc3M9InBhcmFtZXRlcnMiPjx0dD5PcHRpb248L3R0PiBpcyBhIHN0cmluZyB3aXRoIHRoZSBvcHRpb24KK25hbWUsIGFuZCA8dHQ+dmFsdWU8L3R0PiBkZXBlbmRzIG9uIHRoZSBvcHRpb24gYmVpbmcgc2V0OgorPC9wPgorCis8dWw+Cis8bGk+Jzx0dD5kb250cm91dGU8L3R0Pic6IFNldHRpbmcgdGhpcyBvcHRpb24gdG8gPHR0PnRydWU8L3R0PgoraW5kaWNhdGVzIHRoYXQgb3V0Z29pbmcgbWVzc2FnZXMgc2hvdWxkIGJ5cGFzcyB0aGUgc3RhbmRhcmQgcm91dGluZworZmFjaWxpdGllczs8L2xpPgorPGxpPic8dHQ+YnJvYWRjYXN0PC90dD4nOiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDx0dD50cnVlPC90dD4KK3JlcXVlc3RzIHBlcm1pc3Npb24gdG8gc2VuZCBicm9hZGNhc3QgZGF0YWdyYW1zIG9uIHRoZQorc29ja2V0LjwvbGk+Cis8L3VsPgorCis8cCBjbGFzcz0icmV0dXJuIj4KK1RoZSBtZXRob2QgcmV0dXJucyAxIGluIGNhc2Ugb2Ygc3VjY2Vzcywgb3IKKzxiPjx0dD5uaWw8L3R0PjwvYj4gZm9sbG93ZWQgYnkgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCis8L3A+CisKKzxwIGNsYXNzPSJub3RlIj4KK05vdGU6IFRoZSBkZXNjcmlwdGlvbnMgYWJvdmUgY29tZSBmcm9tIHRoZSBtYW4KK3BhZ2VzLgorPC9wPgorCis8IS0tIHNldHRpbWVvdXQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz0ibmFtZSIgaWQ9InNldHRpbWVvdXQiPgorY29ubmVjdGVkOjxiPnNldHRpbWVvdXQoPC9iPnZhbHVlPGI+KTwvYj48YnI+Cit1bmNvbm5lY3RlZDo8Yj5zZXR0aW1lb3V0KDwvYj52YWx1ZTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPSJkZXNjcmlwdGlvbiI+CitDaGFuZ2VzIHRoZSB0aW1lb3V0IHZhbHVlcyBmb3IgdGhlIG9iamVjdC4gIEJ5IGRlZmF1bHQsIHRoZSAKKzxhIGhyZWY9IiNyZWNlaXZlIj48dHQ+cmVjZWl2ZTwvdHQ+PC9hPiBhbmQgCis8YSBocmVmPSIjcmVjZWl2ZWZyb20iPjx0dD5yZWNlaXZlZnJvbTwvdHQ+PC9hPiAKK29wZXJhdGlvbnMgYXJlIGJsb2NraW5nLiBUaGF0IGlzLCBhbnkgY2FsbCB0byB0aGUgbWV0aG9kcyB3aWxsIGJsb2NrCitpbmRlZmluaXRlbHksIHVudGlsIGRhdGEgYXJyaXZlcy4gIFRoZSA8dHQ+c2V0dGltZW91dDwvdHQ+IGZ1bmN0aW9uIGRlZmluZXMKK2EgbGltaXQgb24gdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBmdW5jdGlvbnMgY2FuIGJsb2NrLiBXaGVuIGEgdGltZW91dCBpcworc2V0IGFuZCB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGhhcyBlbGFwc2VkLCB0aGUgYWZmZWN0ZWQgbWV0aG9kcworZ2l2ZSB1cCBhbmQgZmFpbCB3aXRoIGFuIGVycm9yIGNvZGUuICAKKzwvcD4KKworPHAgY2xhc3M9InBhcmFtZXRlcnMiPgorVGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgaXMgc3BlY2lmaWVkIGFzCit0aGUgPHR0PnZhbHVlPC90dD4gcGFyYW1ldGVyLCBpbiBzZWNvbmRzLiBUaGUgPGI+PHR0Pm5pbDwvdHQ+PC9iPiB0aW1lb3V0Cis8dHQ+dmFsdWU8L3R0PiBhbGxvd3Mgb3BlcmF0aW9ucyB0byBibG9jayBpbmRlZmluaXRlbHkuIE5lZ2F0aXZlCit0aW1lb3V0IHZhbHVlcyBoYXZlIHRoZSBzYW1lIGVmZmVjdC4KKzwvcD4KKworPHAgY2xhc3M9Im5vdGUiPgorTm90ZTogSW4gVURQLCB0aGUgPGEgaHJlZj0iI3NlbmQiPjx0dD5zZW5kPC90dD48L2E+CithbmQgPGEgaHJlZj0iI3NlbnRkbyI+PHR0PnNlbmR0bzwvdHQ+PC9hPiBtZXRob2RzIG5ldmVyIGJsb2NrICh0aGUKK2RhdGFncmFtIGlzIGp1c3QgcGFzc2VkIHRvIHRoZSBPUyBhbmQgdGhlIGNhbGwgcmV0dXJucworaW1tZWRpYXRlbHkpLiBUaGVyZWZvcmUsIHRoZSA8dHQ+c2V0dGltZW91dDwvdHQ+IG1ldGhvZCBoYXMgbm8KK2VmZmVjdCBvbiB0aGVtLgorPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+CitOb3RlOiBUaGUgb2xkIDx0dD50aW1lb3V0PC90dD4gbWV0aG9kIGlzCitkZXByZWNhdGVkLiBUaGUgbmFtZSBoYXMgYmVlbiBjaGFuZ2VkIGZvciBzYWtlIG9mIHVuaWZvcm1pdHksIHNpbmNlCithbGwgb3RoZXIgbWV0aG9kIG5hbWVzIGFscmVhZHkgY29udGFpbmVkIHZlcmJzIG1ha2luZyB0aGVpcgoraW1wZXJhdGl2ZSBuYXR1cmUgb2J2aW91cy4KKzwvcD4KKworPCEtLSBmb290ZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWZvb3Rlcj4KKzxocj4KKzxjZW50ZXI+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93bmxvYWQiPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPiAKKzwvcD4KKzxwPgorPHNtYWxsPgorTGFzdCBtb2RpZmllZCBieSBEaWVnbyBOZWhhYiBvbiA8YnI+CitUaHUgQXByIDIwIDAwOjI2OjAxIEVEVCAyMDA2Cis8L3NtYWxsPgorPC9wPgorPC9jZW50ZXI+Cis8L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2RvYy91cmwuaHRtbCBiL2x1YXNvY2tldC0yLjAuMi9kb2MvdXJsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3MTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9kb2MvdXJsLmh0bWwKQEAgLTAsMCArMSwzMjkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9Ikx1YVNvY2tldDogVVJMIG1hbmlwdWxhdGlvbiI+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iTHVhLCBMdWFTb2NrZXQsIFVSTCwgTGlicmFyeSwgTGluaywgTmV0d29yaywgU3VwcG9ydCI+IAorPHRpdGxlPkx1YVNvY2tldDogVVJMIHN1cHBvcnQ8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJyZWZlcmVuY2UuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8IS0tIGhlYWRlciArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8ZGl2IGNsYXNzPWhlYWRlcj4KKzxocj4KKzxjZW50ZXI+Cis8dGFibGUgc3VtbWFyeT0iTHVhU29ja2V0IGxvZ28iPgorPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnIj4KKzxpbWcgd2lkdGg9MTI4IGhlaWdodD0xMjggYm9yZGVyPTAgYWx0PSJMdWFTb2NrZXQiIHNyYz0ibHVhc29ja2V0LnBuZyI+Cis8L2E+PC90ZD48L3RyPgorPHRyPjx0ZCBhbGlnbj1jZW50ZXIgdmFsaWduPXRvcD5OZXR3b3JrIHN1cHBvcnQgZm9yIHRoZSBMdWEgbGFuZ3VhZ2UKKzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8cCBjbGFzcz1iYXI+Cis8YSBocmVmPSJob21lLmh0bWwiPmhvbWU8L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJob21lLmh0bWwjZG93bmxvYWQiPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPiAKKzwvcD4KKzwvY2VudGVyPgorPGhyPgorPC9kaXY+CisKKzwhLS0gdXJsICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxoMiBpZD11cmw+VVJMPC9oMj4gCisKKzxwPgorVGhlICA8dHQ+dXJsPC90dD4gIG5hbWVzcGFjZSBwcm92aWRlcyAgZnVuY3Rpb25zICB0byAgcGFyc2UsICBwcm90ZWN0LAorYW5kIGJ1aWxkIFVSTHMsIGFzIHdlbGwgIGFzIGZ1bmN0aW9ucyB0byBjb21wb3NlICBhYnNvbHV0ZSBVUkxzCitmcm9tIGJhc2UgYW5kIHJlbGF0aXZlIFVSTHMsIGFjY29yZGluZyB0byAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+ZGllZ28vcmZjL3JmYzIzOTYudHh0Ij5SRkMKKzIzOTY8L2E+LgorPC9wPgorCis8cD4gCitUbyBvYnRhaW4gdGhlIDx0dD51cmw8L3R0PiBuYW1lc3BhY2UsIHJ1bjoKKzwvcD4KKworPHByZSBjbGFzcz1leGFtcGxlPgorLS0gbG9hZHMgdGhlIFVSTCBtb2R1bGUgCitsb2NhbCB1cmwgPSByZXF1aXJlKCJzb2NrZXQudXJsIikKKzwvcHJlPgorCis8cD4KK0FuIFVSTCBpcyBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKzwvcD4KKworPGJsb2NrcXVvdGU+Cis8dHQ+CismbHQ7dXJsJmd0OyA6Oj0gWyZsdDtzY2hlbWUmZ3Q7Ol1bLy8mbHQ7YXV0aG9yaXR5Jmd0O11bLyZsdDtwYXRoJmd0O11bOyZsdDtwYXJhbXMmZ3Q7XVs/Jmx0O3F1ZXJ5Jmd0O11bIyZsdDtmcmFnbWVudCZndDtdPGJyPgorJmx0O2F1dGhvcml0eSZndDsgOjo9IFsmbHQ7dXNlcmluZm8mZ3Q7QF0mbHQ7aG9zdCZndDtbOiZsdDtwb3J0Jmd0O108YnI+CismbHQ7dXNlcmluZm8mZ3Q7IDo6PSAmbHQ7dXNlciZndDtbOiZsdDtwYXNzd29yZCZndDtdPGJyPgorJmx0O3BhdGgmZ3Q7IDo6PSB7Jmx0O3NlZ21lbnQmZ3Q7L30mbHQ7c2VnbWVudCZndDs8YnI+Cis8L3R0PgorPC9ibG9ja3F1b3RlPgorCis8IS0tIGFic29sdXRlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWFic29sdXRlPgordXJsLjxiPmFic29sdXRlKDwvYj5iYXNlLCByZWxhdGl2ZTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQnVpbGRzIGFuIGFic29sdXRlIFVSTCBmcm9tIGEgYmFzZSBVUkwgYW5kIGEgcmVsYXRpdmUgVVJMLiAKKzwvcD4KKworPHAgY2xhc3M9cGFyYW1ldGVycz4KKzx0dD5CYXNlPC90dD4gaXMgYSBzdHJpbmcgd2l0aCB0aGUgYmFzZSBVUkwgb3IKK2EgcGFyc2VkIFVSTCB0YWJsZS4gIDx0dD5SZWxhdGl2ZTwvdHQ+IGlzIGEKK3N0cmluZyB3aXRoIHRoZSByZWxhdGl2ZSBVUkwuCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGFic29sdXRlIFVSTC4KKzwvcD4KKworPHAgY2xhc3M9bm90ZT4KK05vdGU6IFRoZSBydWxlcyB0aGF0Citnb3Zlcm4gdGhlIGNvbXBvc2l0aW9uIGFyZSBmYWlybHkgY29tcGxleCwgYW5kIGFyZSBkZXNjcmliZWQgaW4gZGV0YWlsIGluCis8YSBocmVmPSJodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRpZWdvL3JmYy9yZmMyMzk2LnR4dCI+UkZDIDIzOTY8L2E+LgorVGhlIGV4YW1wbGUgYmVsbG93IHNob3VsZCBnaXZlIGFuIGlkZWEgb2Ygd2hhdCB0aGUgcnVsZXMgYXJlLgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CitodHRwOi8vYS9iL2MvZDtwP3EKKworKworCitnOmggICAgICA9ICBnOmgKK2cgICAgICAgID0gIGh0dHA6Ly9hL2IvYy9nCisuL2cgICAgICA9ICBodHRwOi8vYS9iL2MvZworZy8gICAgICAgPSAgaHR0cDovL2EvYi9jL2cvCisvZyAgICAgICA9ICBodHRwOi8vYS9nCisvL2cgICAgICA9ICBodHRwOi8vZworP3kgICAgICAgPSAgaHR0cDovL2EvYi9jLz95CitnP3kgICAgICA9ICBodHRwOi8vYS9iL2MvZz95CisjcyAgICAgICA9ICBodHRwOi8vYS9iL2MvZDtwP3EjcworZyNzICAgICAgPSAgaHR0cDovL2EvYi9jL2cjcworZz95I3MgICAgPSAgaHR0cDovL2EvYi9jL2c/eSNzCis7eCAgICAgICA9ICBodHRwOi8vYS9iL2MvO3gKK2c7eCAgICAgID0gIGh0dHA6Ly9hL2IvYy9nO3gKK2c7eD95I3MgID0gIGh0dHA6Ly9hL2IvYy9nO3g/eSNzCisuICAgICAgICA9ICBodHRwOi8vYS9iL2MvCisuLyAgICAgICA9ICBodHRwOi8vYS9iL2MvCisuLiAgICAgICA9ICBodHRwOi8vYS9iLworLi4vICAgICAgPSAgaHR0cDovL2EvYi8KKy4uL2cgICAgID0gIGh0dHA6Ly9hL2IvZworLi4vLi4gICAgPSAgaHR0cDovL2EvCisuLi8uLi8gICA9ICBodHRwOi8vYS8KKy4uLy4uL2cgID0gIGh0dHA6Ly9hL2cKKzwvcHJlPgorCis8IS0tIGJ1aWxkICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWJ1aWxkPgordXJsLjxiPmJ1aWxkKDwvYj5wYXJzZWRfdXJsPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitSZWJ1aWxkcyBhbiBVUkwgZnJvbSBpdHMgcGFydHMuIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PlBhcnNlZF91cmw8L3R0PiBpcyBhIHRhYmxlIHdpdGggc2FtZSBjb21wb25lbnRzIHJldHVybmVkIGJ5Cis8YSBocmVmPSIjcGFyc2UiPjx0dD5wYXJzZTwvdHQ+PC9hPi4KK0xvd2VyIGxldmVsIGNvbXBvbmVudHMsIGlmIHNwZWNpZmllZCwKK3Rha2UgIHByZWNlZGVuY2Ugb3ZlciAgaGlnaCBsZXZlbCAgY29tcG9uZW50cyBvZiAgdGhlIFVSTCBncmFtbWFyLiAKKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgYnVpbHQgVVJMLgorPC9wPgorCis8IS0tIGJ1aWxkX3BhdGggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPWJ1aWxkX3BhdGg+Cit1cmwuPGI+YnVpbGRfcGF0aCg8L2I+c2VnbWVudHMsIHVuc2FmZTxiPik8L2I+Cis8L3A+CisKKzxwIGNsYXNzPWRlc2NyaXB0aW9uPgorQnVpbGRzIGEgPHR0PiZsdDtwYXRoJmd0OzwvdHQ+IGNvbXBvbmVudCBmcm9tICBhIGxpc3Qgb2YKKzx0dD4mbHQ7c2VnbWVudCZndDs8L3R0PiBwYXJ0cy4gCitCZWZvcmUgY29tcG9zaXRpb24sIGFueSByZXNlcnZlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGEgc2VnbWVudCBhcmUgZXNjYXBlZCBpbnRvCit0aGVpciBwcm90ZWN0ZWQgIGZvcm0sIHNvIHRoYXQgIHRoZSByZXN1bHRpbmcgcGF0aCAgaXMgYSB2YWxpZCAgVVJMIHBhdGgKK2NvbXBvbmVudC4gIAorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PlNlZ21lbnRzPC90dD4gaXMgYSBsaXN0IG9mIHN0cmluZ3Mgd2l0aCB0aGUgPHR0PiZsdDtzZWdtZW50Jmd0OzwvdHQ+CitwYXJ0cy4gSWYgPHR0PnVuc2FmZTwvdHQ+ICBpcyBhbnl0aGluZyAgYnV0IDxiPjx0dD5uaWw8L3R0PjwvYj4sICByZXNlcnZlZAorY2hhcmFjdGVycyBhcmUgbGVmdCB1bnRvdWNoZWQuCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK1RoZSAgZnVuY3Rpb24gIHJldHVybnMgICBhIHN0cmluZyB3aXRoIHRoZSAgCitidWlsdCA8dHQ+Jmx0O3BhdGgmZ3Q7PC90dD4gY29tcG9uZW50LiAKKzwvcD4KKworPCEtLSBlc2NhcGUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPHAgY2xhc3M9bmFtZSBpZD0iZXNjYXBlIj4KK3VybC48Yj5lc2NhcGUoPC9iPmNvbnRlbnQ8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK0FwcGxpZXMgdGhlIFVSTCBlc2NhcGluZyBjb250ZW50IGNvZGluZyB0byBhIHN0cmluZworRWFjaCBieXRlIGlzIGVuY29kZWQgYXMgYSBwZXJjZW50IGNoYXJhY3RlciBmb2xsb3dlZAorYnkgdGhlIHR3byBieXRlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGl0cyBpbnRlZ2VyIAordmFsdWUuCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+Q29udGVudDwvdHQ+IGlzIHRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC4KKzwvcD4KKworPHAgY2xhc3M9cmVzdWx0PgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVuY29kZWQgc3RyaW5nLgorPC9wPgorCis8cHJlIGNsYXNzPWV4YW1wbGU+CistLSBsb2FkIHVybCBtb2R1bGUKK3VybCA9IHJlcXVpcmUoInNvY2tldC51cmwiKQorCitjb2RlID0gdXJsLmVzY2FwZSgiLyM/OyIpCistLSBjb2RlID0gIiUyZiUyMyUzZiUzYiIKKzwvcHJlPgorCis8IS0tIHBhcnNlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPXBhcnNlPgordXJsLjxiPnBhcnNlKDwvYj51cmwsIGRlZmF1bHQ8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1BhcnNlcyBhbiBVUkwgZ2l2ZW4gYXMgYSBzdHJpbmcgaW50byBhIEx1YSB0YWJsZSB3aXRoIGl0cyBjb21wb25lbnRzLgorPC9wPgorCis8cCBjbGFzcz1wYXJhbWV0ZXJzPgorPHR0PlVybDwvdHQ+IGlzIHRoZSBVUkwgdG8gYmUgcGFyc2VkLiBJZiB0aGUgPHR0PmRlZmF1bHQ8L3R0PiB0YWJsZSBpcworcHJlc2VudCwgaXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgcGFyc2VkIGZpZWxkcy4gT25seSBmaWVsZHMgcHJlc2VudCBpbiB0aGUKK1VSTCBhcmUgb3ZlcndyaXR0ZW4uIFRoZXJlZm9yZSwgdGhpcyB0YWJsZSBjYW4gYmUgdXNlZCB0byBwYXNzIGRlZmF1bHQKK3ZhbHVlcyBmb3IgZWFjaCBmaWVsZC4KKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgYSB0YWJsZSB3aXRoIGFsbCB0aGUgVVJMIGNvbXBvbmVudHM6Cis8L3A+CisKKzxibG9ja3F1b3RlPjx0dD4KK3BhcnNlZF91cmwgPSB7PGJyPgorJm5ic3A7Jm5ic3A7dXJsID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDtzY2hlbWUgPSA8aT5zdHJpbmc8L2k+LDxicj4KKyZuYnNwOyZuYnNwO2F1dGhvcml0eSA9IDxpPnN0cmluZzwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7cGF0aCA9IDxpPnN0cmluZzwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7cGFyYW1zID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDtxdWVyeSA9IDxpPnN0cmluZzwvaT4sPGJyPgorJm5ic3A7Jm5ic3A7ZnJhZ21lbnQgPSA8aT5zdHJpbmc8L2k+LDxicj4KKyZuYnNwOyZuYnNwO3VzZXJpbmZvID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDtob3N0ID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDtwb3J0ID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDt1c2VyID0gPGk+c3RyaW5nPC9pPiw8YnI+CismbmJzcDsmbmJzcDtwYXNzd29yZCA9IDxpPnN0cmluZzwvaT48YnI+Cit9Cis8L3R0PjwvYmxvY2txdW90ZT4KKworPHByZSBjbGFzcz1leGFtcGxlPgorLS0gbG9hZCB1cmwgbW9kdWxlCit1cmwgPSByZXF1aXJlKCJzb2NrZXQudXJsIikKKworcGFyc2VkX3VybCA9IHVybC5wYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jZ2lsdWEvaW5kZXgubHVhP2E9MiN0aGVyZSIpCistLSBwYXJzZWRfdXJsID0geworLS0gICBzY2hlbWUgPSAiaHR0cCIsCistLSAgIGF1dGhvcml0eSA9ICJ3d3cuZXhhbXBsZS5jb20iLAorLS0gICBwYXRoID0gIi9jZ2lsdWEvaW5kZXgubHVhIgorLS0gICBxdWVyeSA9ICJhPTIiLAorLS0gICBmcmFnbWVudCA9ICJ0aGVyZSIsCistLSAgIGhvc3QgPSAid3d3LnB1Yy1yaW8uYnIiLAorLS0gfQorCitwYXJzZWRfdXJsID0gdXJsLnBhcnNlKCJmdHA6Ly9yb290OnBhc3N3ZEB1bnNhZmUub3JnL3B1Yi92aXJ1cy5leGU7dHlwZT1pIikKKy0tIHBhcnNlZF91cmwgPSB7CistLSAgIHNjaGVtZSA9ICJmdHAiLAorLS0gICBhdXRob3JpdHkgPSAicm9vdDpwYXNzd2RAdW5zYWZlLm9yZyIsCistLSAgIHBhdGggPSAiL3B1Yi92aXJ1cy5leGUiLAorLS0gICBwYXJhbXMgPSAidHlwZT1pIiwKKy0tICAgdXNlcmluZm8gPSAicm9vdDpwYXNzd2QiLAorLS0gICBob3N0ID0gInVuc2FmZS5vcmciLAorLS0gICB1c2VyID0gInJvb3QiLAorLS0gICBwYXNzd29yZCA9ICJwYXNzd2QiLAorLS0gfQorPC9wcmU+CisKKzwhLS0gcGFyc2VfcGF0aCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+CisKKzxwIGNsYXNzPW5hbWUgaWQ9cGFyc2VfcGF0aD4KK3VybC48Yj5wYXJzZV9wYXRoKDwvYj5wYXRoPGI+KTwvYj4KKzwvcD4KKworPHAgY2xhc3M9ZGVzY3JpcHRpb24+CitCcmVha3MgYSA8dHQ+Jmx0O3BhdGgmZ3Q7PC90dD4gVVJMIGNvbXBvbmVudCBpbnRvIGFsbCBpdHMgCis8dHQ+Jmx0O3NlZ21lbnQmZ3Q7PC90dD4gcGFydHMuIAorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KKzx0dD5QYXRoPC90dD4gaXMgYSBzdHJpbmcgd2l0aCB0aGUgcGF0aCB0byBiZSBwYXJzZWQuCis8L3A+CisKKzxwIGNsYXNzPXJldHVybj4KK1NpbmNlICBzb21lIGNoYXJhY3RlcnMgICBhcmUgICByZXNlcnZlZCAgIGluICAgVVJMcywgIHRoZXkgbXVzdCBiZSBlc2NhcGVkCit3aGVuZXZlciBwcmVzZW50IGluIGEgPHR0PiZsdDtwYXRoJmd0OzwvdHQ+IGNvbXBvbmVudC4gVGhlcmVmb3JlLCBiZWZvcmUKK3JldHVybmluZyBhIGxpc3Qgd2l0aCBhbGwgdGhlIHBhcnNlZCBzZWdtZW50cywgdGhlIGZ1bmN0aW9uIHJlbW92ZXMKK2VzY2FwaW5nIGZyb20gYWxsIG9mIHRoZW0uIAorPC9wPgorCis8IS0tIHVuZXNjYXBlICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgorCis8cCBjbGFzcz1uYW1lIGlkPSJ1bmVzY2FwZSI+Cit1cmwuPGI+dW5lc2NhcGUoPC9iPmNvbnRlbnQ8Yj4pPC9iPgorPC9wPgorCis8cCBjbGFzcz1kZXNjcmlwdGlvbj4KK1JlbW92ZXMgIHRoZSAgIFVSTCAgIGVzY2FwaW5nICAgIGNvbnRlbnQgICBjb2RpbmcgICBmcm9tICAgYSBzdHJpbmcuCis8L3A+CisKKzxwIGNsYXNzPXBhcmFtZXRlcnM+Cis8dHQ+Q29udGVudDwvdHQ+IGlzIHRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZC4KKzwvcD4KKworPHAgY2xhc3M9cmV0dXJuPgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRlY29kZWQgc3RyaW5nLiAKKzwvcD4KKworPCEtLSBmb290ZXIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KKworPGRpdiBjbGFzcz1mb290ZXI+Cis8aHI+Cis8Y2VudGVyPgorPHAgY2xhc3M9YmFyPgorPGEgaHJlZj0iaG9tZS5odG1sIj5ob21lPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaG9tZS5odG1sI2Rvd24iPmRvd25sb2FkPC9hPiAmbWlkZG90OworPGEgaHJlZj0iaW5zdGFsbGF0aW9uLmh0bWwiPmluc3RhbGxhdGlvbjwvYT4gJm1pZGRvdDsKKzxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5pbnRyb2R1Y3Rpb248L2E+ICZtaWRkb3Q7Cis8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+cmVmZXJlbmNlPC9hPgorPC9wPgorPHA+Cis8c21hbGw+CitMYXN0IG1vZGlmaWVkIGJ5IERpZWdvIE5laGFiIG9uIDxicj4KK1RodSBBcHIgMjAgMDA6MjY6MDUgRURUIDIwMDYKKzwvc21hbGw+Cis8L3A+Cis8L2NlbnRlcj4KKzwvZGl2PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZXRjL1JFQURNRSBiL2x1YXNvY2tldC0yLjAuMi9ldGMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDNlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL1JFQURNRQpAQCAtMCwwICsxLDg5IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBjb2RlIHRoYXQgaXMgbW9yZSB1c2VmdWwgdGhhbiB0aGUKK3NhbXBsZXMuIFRoaXMgY29kZSAqaXMqIHN1cHBvcnRlZC4KKworICAgIHRmdHAubHVhICAgICAgICAgICAgICAgIC0tIFRyaXZpYWwgRlRQIGNsaWVudAorCitUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGZpbGUgcmV0cmlldmFsIGJ5IHRoZSBURlRQIHByb3RvY29sLgorSXRzIG1haW4gdXNlIHdhcyB0byB0ZXN0IHRoZSBVRFAgY29kZSwgYnV0IHNpbmNlIHNvbWVvbmUKK2ZvdW5kIGl0IHVzZWZ1bGwsIEkgdHVybmVkIGl0IGludG8gYSBtb2R1bGUgdGhhdCBpcyBhbG1vc3QKK29mZmljaWFsIChubyB1cGxvYWRzLCB5ZXQpLgorCisgICAgZGljdC5sdWEgICAgICAgICAgICAgICAgLS0gRGljdCBjbGllbnQKKworVGhlIGRpY3QubHVhICBtb2R1bGUgc3RhcnRlZCB3aXRoICBhIGNvb2wgIHNpbXBsZSBjbGllbnQKK2ZvciB0aGUgIERJQ1QgcHJvdG9jb2wsIHdyaXR0ZW4gYnkgTHVpeiBIZW5yaXF1ZSBGaWd1ZWlyZWRvLgorVGhpcyBuZXcgdmVyc2lvbiBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIGxpYnJhcnksIHNpbWlsYXIKK3RvIHRoZSBIVFRQICBhbmQgRlRQIGxpYnJhcmllcywgdGhhdCBjYW4gYmUgdXNlZCBmcm9tIHdpdGhpbgorYW55IGx1YXNvY2tldCBhcHBsaWNhdGlvbi4gVGFrZSAgYSBsb29rIG9uIHRoZSAgc291cmNlIGNvZGUKK2FuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBpdC4KKworICAgIGxwLmx1YSAgICAgICAgICAgICAgICAgIC0tIExQRCBjbGllbnQgbGlicmFyeQorCitUaGUgbHAubHVhIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBjbGllbnQgcGFydCBvZiB0aGUgTGluZQorUHJpbnRlciBEYWVtb24gcHJvdG9jb2wsIHVzZWQgdG8gcHJpbnQgZmlsZXMgb24gVW5peAorbWFjaGluZXMuIEl0IGlzIGNvdXJ0ZXN5IG9mIERhdmlkIEJ1cmdlc3MhICBTZWUgdGhlIHNvdXJjZQorY29kZSBhbmQgdGhlIGxwci5sdWEgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4KKworICAgIGI2NC5sdWEKKyAgICBxcC5sdWEKKyAgICBlb2wubHVhCisKK1RoZXNlIGFyZSB0aW55IHByb2dyYW1zIHRoYXQgcGVyZm9ybSBCYXNlNjQsCitRdW90ZWQtUHJpbnRhYmxlIGFuZCBlbmQtb2YtbGluZSBtYXJrZXIgY29udmVyc2lvbnMuCisKKyAgICBnZXQubHVhICAgICAgICAgICAgICAgICAtLSBmaWxlIHJldHJpZXZlcgorCitUaGlzIGxpdHRsZSAgcHJvZ3JhbSBpcyAgYSBjbGllbnQgIHRoYXQgdXNlcyAgdGhlIEZUUCAgYW5kCitIVFRQICBjb2RlIHRvIGltcGxlbWVudCBhICBjb21tYW5kIGxpbmUgIGZpbGUgZ3JhYmVyLiBKdXN0CitydW4gCisKKwlsdWEgZ2V0Lmx1YSA8cmVtb3RlLWZpbGU+IFs8bG9jYWwtZmlsZT5dCisKK3RvIGRvd25sb2FkICBhIHJlbW90ZSBmaWxlIChlaXRoZXIgIGZ0cDovLyBvciBodHRwOi8vKSB0bwordGhlIHNwZWNpZmllZCBsb2NhbCBmaWxlLiAgVGhlIHByb2dyYW0gIGFsc28gcHJpbnRzICB0aGUKK2Rvd25sb2FkICB0aHJvdWdocHV0LCBlbGFwc2VkIHRpbWUsIGJ5dGVzIGFscmVhZHkgZG93bmxvYWRlZAorZXRjIGR1cmluZyBkb3dubG9hZC4KKworICAgIGNoZWNrLW1lbW9yeS5sdWEgICAgICAgIC0tIGNoZWNrcyBtZW1vcnkgY29uc3VtcHRpb24KKworVGhpcyBpcyBqdXN0IHRvIHNlZSBob3cgbXVjaCBtZW1vcnkgZWFjaCBtb2R1bGUgdXNlcy4KKworICAgIGRpc3BhdGNoLmx1YSAgICAgICAgICAgIC0tIGNvcm91dGluZSBiYXNlZCBkaXNwYXRjaGVyCisKK1RoaXMgaXMgYSBmaXJzdCB0cnkgYXQgYSBjb3JvdXRpbmUgYmFzZWQgbm9uLWJsb2NraW5nCitkaXNwYXRjaGVyIGZvciBMdWFTb2NrZXQuIFRha2UgYSBsb29rIGF0ICdjaGVjay1saW5rcy5sdWEnCithbmQgYXQgJ2ZvcndhcmQubHVhJyB0byBzZWUgaG93IHRvIHVzZSBpdC4KKworCWNoZWNrLWxpbmtzLmx1YQkJCS0tIEhUTUwgbGluayBjaGVja2VyIHByb2dyYW0KKworVGhpcyBsaXR0bGUgcHJvZ3JhbSBzY2FucyBhIEhUTUwgZmlsZSBhbmQgY2hlY2tzIGZvciBicm9rZW4KK2xpbmtzLiBJdCBpcyBzaW1pbGFyIHRvIGNoZWNrLWxpbmtzLnBsIGJ5IEphbWllIFphd2luc2tpLAorYnV0IHVzZXMgYWxsIGZhY2lsaXRpZXMgb2YgdGhlIEx1YVNvY2tldCBsaWJyYXJ5IGFuZCB0aGUgTHVhCitsYW5ndWFnZS4gSXQgaGFzIG5vdCBiZWVuIHRob3JvdWdobHkgdGVzdGVkLCBidXQgaXQgc2hvdWxkCit3b3JrLiBKdXN0IHJ1bgorCisJbHVhIGNoZWNrLWxpbmtzLmx1YSBbLW5dIHs8dXJsPn0gPiBvdXRwdXQKKworYW5kIG9wZW4gdGhlIHJlc3VsdCB0byBzZWUgYSBsaXN0IG9mIGJyb2tlbiBsaW5rcy4gTWFrZSBzdXJlCit5b3UgY2hlY2sgdGhlICctbicgc3dpdGNoLiBJdCBydW5zIGluIG5vbi1ibG9ja2luZyBtb2RlLAordXNpbmcgY29yb3V0aW5lcywgYW5kIGlzIE1VQ0ggZmFzdGVyIQorCisgICAgZm9yd2FyZC5sdWEgICAgICAgICAgICAgLS0gY29yb3V0aW5lIGJhc2VkIGZvcndhcmQgc2VydmVyCisKK1RoaXMgaXMgYSBmb3J3YXJkIHNlcnZlciB0aGF0IGNhbiBhY2NlcHQgc2V2ZXJhbCBjb25uZWN0aW9ucworYW5kIHRyYW5zZmVycyBzaW11bHRhbmVvdXNseSB1c2luZyBub24tYmxvY2tpbmcgSS9PIGFuZCB0aGUKK2Nvcm91dGluZS1iYXNlZCBkaXNwYXRjaGVyLiBZb3UgY2FuIHJ1biwgZm9yIGV4YW1wbGUKKworICAgIGx1YSBmb3J3YXJkLmx1YSA4MDgwOnByb3h5LmNvbTozMTI4IAorCit0byByZWRpcmVjdCBhbGwgbG9jYWwgY29uZWN0aW9ucyB0byBwb3J0IDgwODAgdG8gdGhlIGhvc3QgCisncHJveHkuY29tJyBhdCBwb3J0IDMxMjguCisKKyAgICB1bml4LmMgYW5kIHVuaXguaAorCitUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFVuaXggbG9jYWwgZG9tYWluIHNvY2tldHMgYW5kCitkZW1vbnN0cmF0ZXMgaG93IHRvIGV4dGVuZCBMdWFTb2NrZXQgd2l0aCBhIG5ldyB0eXBlIG9mCit0cmFuc3BvcnQuIEl0IGhhcyBiZWVuIHRlc3RlZCBvbiBMaW51eCBhbmQgb24gTWFjIE9TIFguCisKK0dvb2QgbHVjaywKK0RpZWdvLgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2V0Yy9iNjQubHVhIGIvbHVhc29ja2V0LTIuMC4yL2V0Yy9iNjQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NWM0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL2I2NC5sdWEKQEAgLTAsMCArMSwyMCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIExpdHRsZSBwcm9ncmFtIHRvIGNvbnZlcnQgdG8gYW5kIGZyb20gQmFzZTY0CistLSBMdWFTb2NrZXQgc2FtcGxlIGZpbGVzCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogYjY0Lmx1YSx2IDEuOCAyMDA0LzA2LzE2IDA0OjI4OjIxIGRpZWdvIEV4cCAkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCitsb2NhbCBtaW1lID0gcmVxdWlyZSgibWltZSIpCitsb2NhbCBzb3VyY2UgPSBsdG4xMi5zb3VyY2UuZmlsZShpby5zdGRpbikKK2xvY2FsIHNpbmsgPSBsdG4xMi5zaW5rLmZpbGUoaW8uc3Rkb3V0KQorbG9jYWwgY29udmVydAoraWYgYXJnIGFuZCBhcmdbMV0gPT0gJy1kJyB0aGVuCisgICAgY29udmVydCA9IG1pbWUuZGVjb2RlKCJiYXNlNjQiKQorZWxzZQorICAgIGxvY2FsIGJhc2U2NCA9IG1pbWUuZW5jb2RlKCJiYXNlNjQiKQorICAgIGxvY2FsIHdyYXAgPSBtaW1lLndyYXAoKQorICAgIGNvbnZlcnQgPSBsdG4xMi5maWx0ZXIuY2hhaW4oYmFzZTY0LCB3cmFwKQorZW5kCitzaW5rID0gbHRuMTIuc2luay5jaGFpbihjb252ZXJ0LCBzaW5rKQorbHRuMTIucHVtcC5hbGwoc291cmNlLCBzaW5rKQpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2V0Yy9jaGVjay1saW5rcy5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL2NoZWNrLWxpbmtzLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg5ZjhjCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2V0Yy9jaGVjay1saW5rcy5sdWEKQEAgLTAsMCArMSwxMTIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBMaXR0bGUgcHJvZ3JhbSB0aGF0IGNoZWNrcyBsaW5rcyBpbiBIVE1MIGZpbGVzLCB1c2luZyBjb3JvdXRpbmVzIGFuZAorLS0gbm9uLWJsb2NraW5nIEkvTyB2aWEgdGhlIGRpc3BhdGNoZXIgbW9kdWxlLgorLS0gTHVhU29ja2V0IHNhbXBsZSBmaWxlcworLS0gQXV0aG9yOiBEaWVnbyBOZWhhYgorLS0gUkNTIElEOiAkJAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIHVybCA9IHJlcXVpcmUoInNvY2tldC51cmwiKQorbG9jYWwgZGlzcGF0Y2ggPSByZXF1aXJlKCJkaXNwYXRjaCIpCitsb2NhbCBodHRwID0gcmVxdWlyZSgic29ja2V0Lmh0dHAiKQorZGlzcGF0Y2guVElNRU9VVCA9IDEwCisKKy0tIG1ha2Ugc3VyZSB0aGUgdXNlciBrbm93cyBob3cgdG8gaW52b2tlIHVzCithcmcgPSBhcmcgb3Ige30KK2lmIHRhYmxlLmdldG4oYXJnKSA8IDEgdGhlbgorICAgIHByaW50KCJVc2FnZTpcbiAgbHVhc29ja2V0IGNoZWNrLWxpbmtzLmx1YSBbLW5dIHs8dXJsPn0iKQorICAgIGV4aXQoKQorZW5kCisKKy0tICctbicgbWVhbnMgd2UgYXJlIHJ1bm5pbmcgaW4gbm9uLWJsb2NraW5nIG1vZGUKK2lmIGFyZ1sxXSA9PSAiLW4iIHRoZW4KKyAgICAtLSBpZiBub24tYmxvY2tpbmcgSS9PIHdhcyByZXF1ZXN0ZWQsIHVzZSByZWFsIGRpc3BhdGNoZXIgaW50ZXJmYWNlCisgICAgdGFibGUucmVtb3ZlKGFyZywgMSkKKyAgICBoYW5kbGVyID0gZGlzcGF0Y2gubmV3aGFuZGxlcigiY29yb3V0aW5lIikKK2Vsc2UKKyAgICAtLSBpZiB1c2luZyBibG9ja2luZyBJL08sIHVzZSBmYWtlIGRpc3BhdGNoZXIgaW50ZXJmYWNlCisgICAgaGFuZGxlciA9IGRpc3BhdGNoLm5ld2hhbmRsZXIoInNlcXVlbnRpYWwiKQorZW5kCisKK2xvY2FsIG50aHJlYWRzID0gMAorCistLSBnZXQgdGhlIHN0YXR1cyBvZiBhIFVSTCB1c2luZyB0aGUgZGlzcGF0Y2hlcgorZnVuY3Rpb24gZ2V0c3RhdHVzKGxpbmspCisgICAgbG9jYWwgcGFyc2VkID0gdXJsLnBhcnNlKGxpbmssIHtzY2hlbWUgPSAiZmlsZSJ9KQorICAgIGlmIHBhcnNlZC5zY2hlbWUgPT0gImh0dHAiIHRoZW4KKyAgICAgICAgbnRocmVhZHMgPSBudGhyZWFkcyArIDEKKyAgICAgICAgaGFuZGxlcjpzdGFydChmdW5jdGlvbigpCisgICAgICAgICAgICBsb2NhbCByLCBjLCBoLCBzID0gaHR0cC5yZXF1ZXN0eworICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJIRUFEIiwKKyAgICAgICAgICAgICAgICB1cmwgPSBsaW5rLAorICAgICAgICAgICAgICAgIGNyZWF0ZSA9IGhhbmRsZXIudGNwCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiByIGFuZCBjID09IDIwMCB0aGVuIGlvLndyaXRlKCdcdCcsIGxpbmssICdcbicpCisgICAgICAgICAgICBlbHNlIGlvLndyaXRlKCdcdCcsIGxpbmssICc6ICcsIHRvc3RyaW5nKGMpLCAnXG4nKSBlbmQKKyAgICAgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgLSAxCisgICAgICAgIGVuZCkKKyAgICBlbmQKK2VuZAorCitmdW5jdGlvbiByZWFkZmlsZShwYXRoKQorICAgIHBhdGggPSB1cmwudW5lc2NhcGUocGF0aCkKKyAgICBsb2NhbCBmaWxlLCBlcnJvciA9IGlvLm9wZW4ocGF0aCwgInIiKQorICAgIGlmIGZpbGUgdGhlbgorICAgICAgICBsb2NhbCBib2R5ID0gZmlsZTpyZWFkKCIqYSIpCisgICAgICAgIGZpbGU6Y2xvc2UoKQorICAgICAgICByZXR1cm4gYm9keQorICAgIGVsc2UgcmV0dXJuIG5pbCwgZXJyb3IgZW5kCitlbmQKKworZnVuY3Rpb24gbG9hZCh1KQorICAgIGxvY2FsIHBhcnNlZCA9IHVybC5wYXJzZSh1LCB7IHNjaGVtZSA9ICJmaWxlIiB9KQorICAgIGxvY2FsIGJvZHksIGhlYWRlcnMsIGNvZGUsIGVycm9yCisgICAgbG9jYWwgYmFzZSA9IHUKKyAgICBpZiBwYXJzZWQuc2NoZW1lID09ICJodHRwIiB0aGVuCisgICAgICAgIGJvZHksIGNvZGUsIGhlYWRlcnMgPSBodHRwLnJlcXVlc3QodSkKKyAgICAgICAgaWYgY29kZSA9PSAyMDAgdGhlbgorICAgICAgICAgICAgLS0gaWYgdGhlcmUgd2FzIGEgcmVkaXJlY3QsIHVwZGF0ZSBiYXNlIHRvIHJlZmxlY3QgaXQKKyAgICAgICAgICAgIGJhc2UgPSBoZWFkZXJzLmxvY2F0aW9uIG9yIGJhc2UKKyAgICAgICAgZW5kCisgICAgICAgIGlmIG5vdCBib2R5IHRoZW4KKyAgICAgICAgICAgIGVycm9yID0gY29kZQorICAgICAgICBlbmQKKyAgICBlbHNlaWYgcGFyc2VkLnNjaGVtZSA9PSAiZmlsZSIgdGhlbgorICAgICAgICBib2R5LCBlcnJvciA9IHJlYWRmaWxlKHBhcnNlZC5wYXRoKQorICAgIGVsc2UgZXJyb3IgPSBzdHJpbmcuZm9ybWF0KCJ1bmhhbmRsZWQgc2NoZW1lICclcyciLCBwYXJzZWQuc2NoZW1lKSBlbmQKKyAgICByZXR1cm4gYmFzZSwgYm9keSwgZXJyb3IKK2VuZAorCitmdW5jdGlvbiBnZXRsaW5rcyhib2R5LCBiYXNlKQorICAgIC0tIGdldCByaWQgb2YgY29tbWVudHMKKyAgICBib2R5ID0gc3RyaW5nLmdzdWIoYm9keSwgIiU8JSElLSUtLi0lLSUtJT4iLCAiIikKKyAgICBsb2NhbCBsaW5rcyA9IHt9CisgICAgLS0gZXh0cmFjdCBsaW5rcworICAgIGJvZHkgPSBzdHJpbmcuZ3N1Yihib2R5LCAnW0hoXVtScl1bRWVdW0ZmXSVzKj0lcyoiKFteIl0qKSInLCBmdW5jdGlvbihocmVmKQorICAgICAgICB0YWJsZS5pbnNlcnQobGlua3MsIHVybC5hYnNvbHV0ZShiYXNlLCBocmVmKSkKKyAgICBlbmQpCisgICAgYm9keSA9IHN0cmluZy5nc3ViKGJvZHksICJbSGhdW1JyXVtFZV1bRmZdJXMqPSVzKicoW14nXSopJyIsIGZ1bmN0aW9uKGhyZWYpCisgICAgICAgIHRhYmxlLmluc2VydChsaW5rcywgdXJsLmFic29sdXRlKGJhc2UsIGhyZWYpKQorICAgIGVuZCkKKyAgICBzdHJpbmcuZ3N1Yihib2R5LCAiW0hoXVtScl1bRWVdW0ZmXSVzKj0lcyooLi0pPiIsIGZ1bmN0aW9uKGhyZWYpCisgICAgICAgIHRhYmxlLmluc2VydChsaW5rcywgdXJsLmFic29sdXRlKGJhc2UsIGhyZWYpKQorICAgIGVuZCkKKyAgICByZXR1cm4gbGlua3MKK2VuZAorCitmdW5jdGlvbiBjaGVja2xpbmtzKGFkZHJlc3MpCisgICAgbG9jYWwgYmFzZSwgYm9keSwgZXJyb3IgPSBsb2FkKGFkZHJlc3MpCisgICAgaWYgbm90IGJvZHkgdGhlbiBwcmludChlcnJvcikgcmV0dXJuIGVuZAorICAgIHByaW50KCJDaGVja2luZyAiLCBiYXNlKQorICAgIGxvY2FsIGxpbmtzID0gZ2V0bGlua3MoYm9keSwgYmFzZSkKKyAgICBmb3IgXywgbGluayBpbiBpcGFpcnMobGlua3MpIGRvCisgICAgICAgIGdldHN0YXR1cyhsaW5rKQorICAgIGVuZAorZW5kCisKK2ZvciBfLCBhZGRyZXNzIGluIGlwYWlycyhhcmcpIGRvCisgICAgY2hlY2tsaW5rcyh1cmwuYWJzb2x1dGUoImZpbGU6IiwgYWRkcmVzcykpCitlbmQKKword2hpbGUgbnRocmVhZHMgPiAwIGRvCisgICAgaGFuZGxlcjpzdGVwKCkKK2VuZApkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2V0Yy9jaGVjay1tZW1vcnkubHVhIGIvbHVhc29ja2V0LTIuMC4yL2V0Yy9jaGVjay1tZW1vcnkubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDk4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL2NoZWNrLW1lbW9yeS5sdWEKQEAgLTAsMCArMSwxNyBAQAorZnVuY3Rpb24gbG9hZChzKQorICAgIGNvbGxlY3RnYXJiYWdlKCkKKyAgICBsb2NhbCBhID0gZ2NpbmZvKCkKKyAgICBfR1tzXSA9IHJlcXVpcmUocykKKyAgICBjb2xsZWN0Z2FyYmFnZSgpCisgICAgbG9jYWwgYiA9IGdjaW5mbygpCisgICAgcHJpbnQocyAuLiAiOlx0ICIgLi4gKGItYSkgLi4gImsiKQorZW5kCisKK2xvYWQoInNvY2tldC51cmwiKQorbG9hZCgibHRuMTIiKQorbG9hZCgic29ja2V0IikKK2xvYWQoIm1pbWUiKQorbG9hZCgic29ja2V0LnRwIikKK2xvYWQoInNvY2tldC5zbXRwIikKK2xvYWQoInNvY2tldC5odHRwIikKK2xvYWQoInNvY2tldC5mdHAiKQpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2V0Yy9kaWN0Lmx1YSBiL2x1YXNvY2tldC0yLjAuMi9ldGMvZGljdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MmMyNAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9ldGMvZGljdC5sdWEKQEAgLTAsMCArMSwxNTIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBMaXR0bGUgcHJvZ3JhbSB0byBkb3dubG9hZCBESUNUIHdvcmQgZGVmaW5pdGlvbnMKKy0tIEx1YVNvY2tldCBzYW1wbGUgZmlsZXMKKy0tIEF1dGhvcjogRGllZ28gTmVoYWIKKy0tIFJDUyBJRDogJElkOiBkaWN0Lmx1YSx2IDEuMjIgMjAwNS8xMS8yMiAwODozMzoyOSBkaWVnbyBFeHAgJAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIExvYWQgcmVxdWlyZWQgbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGJhc2UgPSBfRworbG9jYWwgc3RyaW5nID0gcmVxdWlyZSgic3RyaW5nIikKK2xvY2FsIHRhYmxlID0gcmVxdWlyZSgidGFibGUiKQorbG9jYWwgc29ja2V0ID0gcmVxdWlyZSgic29ja2V0IikKK2xvY2FsIHVybCA9IHJlcXVpcmUoInNvY2tldC51cmwiKQorbG9jYWwgdHAgPSByZXF1aXJlKCJzb2NrZXQudHAiKQorbW9kdWxlKCJzb2NrZXQuZGljdCIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBHbG9iYWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSE9TVCA9ICJkaWN0Lm9yZyIKK1BPUlQgPSAyNjI4CitUSU1FT1VUID0gMTAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIExvdy1sZXZlbCBkaWN0IEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIG1ldGF0ID0geyBfX2luZGV4ID0ge30gfQorCitmdW5jdGlvbiBvcGVuKGhvc3QsIHBvcnQpCisgICAgbG9jYWwgdHAgPSBzb2NrZXQudHJ5KHRwLmNvbm5lY3QoaG9zdCBvciBIT1NULCBwb3J0IG9yIFBPUlQsIFRJTUVPVVQpKQorICAgIHJldHVybiBiYXNlLnNldG1ldGF0YWJsZSh7dHAgPSB0cH0sIG1ldGF0KQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6Z3JlZXQoKQorICAgIHJldHVybiBzb2NrZXQudHJ5KHNlbGYudHA6Y2hlY2soMjIwKSkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmNoZWNrKG9rKQorICAgIGxvY2FsIGNvZGUsIHN0YXR1cyA9IHNvY2tldC50cnkoc2VsZi50cDpjaGVjayhvaykpCisgICAgcmV0dXJuIGNvZGUsCisgICAgICAgIGJhc2UudG9udW1iZXIoc29ja2V0LnNraXAoMiwgc3RyaW5nLmZpbmQoc3RhdHVzLCAiXiVkJWQlZCAoJWQqKSIpKSkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmdldGRlZigpCisJbG9jYWwgbGluZSA9IHNvY2tldC50cnkoc2VsZi50cDpyZWNlaXZlKCkpCisJbG9jYWwgZGVmID0ge30KKwl3aGlsZSBsaW5lIH49ICIuIiBkbworCQl0YWJsZS5pbnNlcnQoZGVmLCBsaW5lKQorCQlsaW5lID0gc29ja2V0LnRyeShzZWxmLnRwOnJlY2VpdmUoKSkKKwllbmQKKwlyZXR1cm4gdGFibGUuY29uY2F0KGRlZiwgIlxuIikKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmRlZmluZShkYXRhYmFzZSwgd29yZCkKKyAgICBkYXRhYmFzZSA9IGRhdGFiYXNlIG9yICIhIgorICAJc29ja2V0LnRyeShzZWxmLnRwOmNvbW1hbmQoIkRFRklORSIsICBkYXRhYmFzZSAuLiAiICIgLi4gd29yZCkpCisgICAgbG9jYWwgY29kZSwgY291bnQgPSBzZWxmOmNoZWNrKDE1MCkKKwlsb2NhbCBkZWZzID0ge30KKwlmb3IgaSA9IDEsIGNvdW50IGRvCisgIAkJc2VsZjpjaGVjaygxNTEpCisJCXRhYmxlLmluc2VydChkZWZzLCBzZWxmOmdldGRlZigpKQorCWVuZAorICAJc2VsZjpjaGVjaygyNTApCisgICAgcmV0dXJuIGRlZnMKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4Om1hdGNoKGRhdGFiYXNlLCBzdHJhdCwgd29yZCkKKyAgICBkYXRhYmFzZSA9IGRhdGFiYXNlIG9yICIhIgorICAgIHN0cmF0ID0gc3RyYXQgb3IgIi4iCisgIAlzb2NrZXQudHJ5KHNlbGYudHA6Y29tbWFuZCgiTUFUQ0giLCAgZGF0YWJhc2UgLi4iICIuLiBzdHJhdCAuLiIgIi4uIHdvcmQpKQorICAgIHNlbGY6Y2hlY2soMTUyKQorCWxvY2FsIG1hdCA9IHt9CisJbG9jYWwgbGluZSA9IHNvY2tldC50cnkoc2VsZi50cDpyZWNlaXZlKCkpCisgICAgd2hpbGUgbGluZSB+PSAnLicgZG8KKyAgICAgICAgZGF0YWJhc2UsIHdvcmQgPSBzb2NrZXQuc2tpcCgyLCBzdHJpbmcuZmluZChsaW5lLCAiKCVTKykgKC4qKSIpKQorICAgICAgICBpZiBub3QgbWF0W2RhdGFiYXNlXSB0aGVuIG1hdFtkYXRhYmFzZV0gPSB7fSBlbmQKKyAgICAgICAgdGFibGUuaW5zZXJ0KG1hdFtkYXRhYmFzZV0sIHdvcmQpCisJICAgIGxpbmUgPSBzb2NrZXQudHJ5KHNlbGYudHA6cmVjZWl2ZSgpKQorCWVuZAorICAJc2VsZjpjaGVjaygyNTApCisgICAgcmV0dXJuIG1hdAorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6cXVpdCgpCisJc2VsZi50cDpjb21tYW5kKCJRVUlUIikKKwlyZXR1cm4gc2VsZjpjaGVjaygyMjEpCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpjbG9zZSgpCisgICAgcmV0dXJuIHNlbGYudHA6Y2xvc2UoKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBIaWdoLWxldmVsIGRpY3QgQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgZGVmYXVsdCA9IHsKKyAgICBzY2hlbWUgPSAiZGljdCIsCisgICAgaG9zdCA9ICJkaWN0Lm9yZyIKK30KKworbG9jYWwgZnVuY3Rpb24gdGhlcmUoZikKKyAgICBpZiBmID09ICIiIHRoZW4gcmV0dXJuIG5pbAorICAgIGVsc2UgcmV0dXJuIGYgZW5kCitlbmQKKworbG9jYWwgZnVuY3Rpb24gcGFyc2UodSkKKyAgICBsb2NhbCB0ID0gc29ja2V0LnRyeSh1cmwucGFyc2UodSwgZGVmYXVsdCkpCisgICAgc29ja2V0LnRyeSh0LnNjaGVtZSA9PSAiZGljdCIsICJpbnZhbGlkIHNjaGVtZSAnIiAuLiB0LnNjaGVtZSAuLiAiJyIpCisgICAgc29ja2V0LnRyeSh0LnBhdGgsICJpbnZhbGlkIHBhdGggaW4gdXJsIikKKyAgICBsb2NhbCBjbWQsIGFyZyA9IHNvY2tldC5za2lwKDIsIHN0cmluZy5maW5kKHQucGF0aCwgIl4vKC4pKC4qKSQiKSkKKyAgICBzb2NrZXQudHJ5KGNtZCA9PSAiZCIgb3IgY21kID09ICJtIiwgIjxjb21tYW5kPiBzaG91bGQgYmUgJ20nIG9yICdkJyIpCisgICAgc29ja2V0LnRyeShhcmcgYW5kIGFyZyB+PSAiIiwgIm5lZWQgYXQgbGVhc3QgPHdvcmQ+IGluIFVSTCIpCisgICAgdC5jb21tYW5kLCB0LmFyZ3VtZW50ID0gY21kLCBhcmcKKyAgICBhcmcgPSBzdHJpbmcuZ3N1YihhcmcsICJeOihbXjpdKykiLCBmdW5jdGlvbihmKSB0LndvcmQgPSBmIGVuZCkKKyAgICBzb2NrZXQudHJ5KHQud29yZCwgIm5lZWQgYXQgbGVhc3QgPHdvcmQ+IGluIFVSTCIpCisgICAgYXJnID0gc3RyaW5nLmdzdWIoYXJnLCAiXjooW146XSopIiwgZnVuY3Rpb24oZikgdC5kYXRhYmFzZSA9IHRoZXJlKGYpIGVuZCkKKyAgICBpZiBjbWQgPT0gIm0iIHRoZW4KKyAgICAgICAgYXJnID0gc3RyaW5nLmdzdWIoYXJnLCAiXjooW146XSopIiwgZnVuY3Rpb24oZikgdC5zdHJhdCA9IHRoZXJlKGYpIGVuZCkKKyAgICBlbmQKKyAgICBzdHJpbmcuZ3N1YihhcmcsICI6KFteOl0qKSQiLCBmdW5jdGlvbihmKSB0Lm4gPSBiYXNlLnRvbnVtYmVyKGYpIGVuZCkKKyAgICByZXR1cm4gdAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHRnZXQoZ2V0dCkKKyAgICBsb2NhbCBjb24gPSBvcGVuKGdldHQuaG9zdCwgZ2V0dC5wb3J0KQorICAgIGNvbjpncmVldCgpCisgICAgaWYgZ2V0dC5jb21tYW5kID09ICJkIiB0aGVuCisgICAgICAgIGxvY2FsIGRlZiA9IGNvbjpkZWZpbmUoZ2V0dC5kYXRhYmFzZSwgZ2V0dC53b3JkKQorICAgICAgICBjb246cXVpdCgpCisgICAgICAgIGNvbjpjbG9zZSgpCisgICAgICAgIGlmIGdldHQubiB0aGVuIHJldHVybiBkZWZbZ2V0dC5uXQorICAgICAgICBlbHNlIHJldHVybiBkZWYgZW5kCisgICAgZWxzZWlmIGdldHQuY29tbWFuZCA9PSAibSIgdGhlbgorICAgICAgICBsb2NhbCBtYXQgPSBjb246bWF0Y2goZ2V0dC5kYXRhYmFzZSwgZ2V0dC5zdHJhdCwgZ2V0dC53b3JkKQorICAgICAgICBjb246cXVpdCgpCisgICAgICAgIGNvbjpjbG9zZSgpCisgICAgICAgIHJldHVybiBtYXQKKyAgICBlbHNlIHJldHVybiBuaWwsICJpbnZhbGlkIGNvbW1hbmQiIGVuZAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHNnZXQodSkKKyAgICBsb2NhbCBnZXR0ID0gcGFyc2UodSkKKyAgICByZXR1cm4gdGdldChnZXR0KQorZW5kCisKK2dldCA9IHNvY2tldC5wcm90ZWN0KGZ1bmN0aW9uKGdldHQpCisgICAgaWYgYmFzZS50eXBlKGdldHQpID09ICJzdHJpbmciIHRoZW4gcmV0dXJuIHNnZXQoZ2V0dCkKKyAgICBlbHNlIHJldHVybiB0Z2V0KGdldHQpIGVuZAorZW5kKQorCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZXRjL2Rpc3BhdGNoLmx1YSBiL2x1YXNvY2tldC0yLjAuMi9ldGMvZGlzcGF0Y2gubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjFlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL2Rpc3BhdGNoLmx1YQpAQCAtMCwwICsxLDMwMiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIEEgaGFja2VkIGRpc3BhdGNoZXIgbW9kdWxlCistLSBMdWFTb2NrZXQgc2FtcGxlIGZpbGVzCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICQkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgYmFzZSA9IF9HCitsb2NhbCB0YWJsZSA9IHJlcXVpcmUoInRhYmxlIikKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCitsb2NhbCBjb3JvdXRpbmUgPSByZXF1aXJlKCJjb3JvdXRpbmUiKQorbW9kdWxlKCJkaXNwYXRjaCIpCisKKy0tIGlmIHRvbyBtdWNoIHRpbWUgZ29lcyBieSB3aXRob3V0IGFueSBhY3Rpdml0eSBpbiBvbmUgb2Ygb3VyIHNvY2tldHMsIHdlCistLSBqdXN0IGtpbGwgaXQKK1RJTUVPVVQgPSA2MAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gV2UgaW1wbGVtZW50IDMgdHlwZXMgb2YgZGlzcGF0Y2hlcnM6CistLSAgICAgc2VxdWVudGlhbAorLS0gICAgIGNvcm91dGluZQorLS0gICAgIHRocmVhZGVkCistLSBUaGUgdXNlciBjYW4gY2hvb3NlIHdoYXRldmVyIG9uZSBpcyBuZWVkZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBoYW5kbGVydCA9IHt9CisKKy0tIGRlZmF1bHQgaGFuZGxlciBpcyBjb3JvdXRpbmUKK2Z1bmN0aW9uIG5ld2hhbmRsZXIobW9kZSkKKyAgICBtb2RlID0gbW9kZSBvciAiY29yb3V0aW5lIgorICAgIHJldHVybiBoYW5kbGVydFttb2RlXSgpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gc2Vxc3RhcnQoc2VsZiwgZnVuYykKKyAgICByZXR1cm4gZnVuYygpCitlbmQKKworLS0gc2VxdWVudGlhbCBoYW5kbGVyIHNpbXBseSBjYWxscyB0aGUgZnVuY3Rpb25zIGFuZCBkb2Vzbid0IHdyYXAgSS9PCitmdW5jdGlvbiBoYW5kbGVydC5zZXF1ZW50aWFsKCkKKyAgICByZXR1cm4geworICAgICAgICB0Y3AgPSBzb2NrZXQudGNwLAorICAgICAgICBzdGFydCA9IHNlcXN0YXJ0CisgICAgfQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBNZWdhIGhhY2suIERvbid0IHRyeSB0byBkbyB0aGlzIGF0IGhvbWUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gd2UgY2FuJ3QgeWllbGQgYWNyb3NzIGNhbGxzIHRvIHByb3RlY3QsIHNvIHdlIHJld3JpdGUgaXQgd2l0aCBjb3hwY2FsbAorLS0gbWFrZSBzdXJlIHlvdSBkb24ndCByZXF1aXJlIGFueSBtb2R1bGUgdGhhdCB1c2VzIHNvY2tldC5wcm90ZWN0IGJlZm9yZQorLS0gbG9hZGluZyBvdXIgaGFjaworZnVuY3Rpb24gc29ja2V0LnByb3RlY3QoZikKKyAgcmV0dXJuIGZ1bmN0aW9uKC4uLikKKyAgICBsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZikKKyAgICB3aGlsZSB0cnVlIGRvCisgICAgICBsb2NhbCByZXN1bHRzID0ge2Nvcm91dGluZS5yZXN1bWUoY28sIGJhc2UudW5wYWNrKGFyZykpfQorICAgICAgbG9jYWwgc3RhdHVzID0gdGFibGUucmVtb3ZlKHJlc3VsdHMsIDEpCisgICAgICBpZiBub3Qgc3RhdHVzIHRoZW4KKyAgICAgICAgaWYgdHlwZShyZXN1bHRzWzFdKSA9PSAndGFibGUnIHRoZW4KKyAgICAgICAgICByZXR1cm4gbmlsLCByZXN1bHRzWzFdWzFdCisgICAgICAgIGVsc2UgYmFzZS5lcnJvcihyZXN1bHRzWzFdKSBlbmQKKyAgICAgIGVuZAorICAgICAgaWYgY29yb3V0aW5lLnN0YXR1cyhjbykgPT0gInN1c3BlbmRlZCIgdGhlbgorICAgICAgICBhcmcgPSB7Y29yb3V0aW5lLnlpZWxkKGJhc2UudW5wYWNrKHJlc3VsdHMpKX0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGJhc2UudW5wYWNrKHJlc3VsdHMpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFNpbXBsZSBzZXQgZGF0YSBzdHJ1Y3R1cmUuIE8oMSkgZXZlcnl0aGluZy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBmdW5jdGlvbiBuZXdzZXQoKQorICAgIGxvY2FsIHJldmVyc2UgPSB7fQorICAgIGxvY2FsIHNldCA9IHt9CisgICAgcmV0dXJuIGJhc2Uuc2V0bWV0YXRhYmxlKHNldCwge19faW5kZXggPSB7CisgICAgICAgIGluc2VydCA9IGZ1bmN0aW9uKHNldCwgdmFsdWUpCisgICAgICAgICAgICBpZiBub3QgcmV2ZXJzZVt2YWx1ZV0gdGhlbgorICAgICAgICAgICAgICAgIHRhYmxlLmluc2VydChzZXQsIHZhbHVlKQorICAgICAgICAgICAgICAgIHJldmVyc2VbdmFsdWVdID0gdGFibGUuZ2V0bihzZXQpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kLAorICAgICAgICByZW1vdmUgPSBmdW5jdGlvbihzZXQsIHZhbHVlKQorICAgICAgICAgICAgbG9jYWwgaW5kZXggPSByZXZlcnNlW3ZhbHVlXQorICAgICAgICAgICAgaWYgaW5kZXggdGhlbgorICAgICAgICAgICAgICAgIHJldmVyc2VbdmFsdWVdID0gbmlsCisgICAgICAgICAgICAgICAgbG9jYWwgdG9wID0gdGFibGUucmVtb3ZlKHNldCkKKyAgICAgICAgICAgICAgICBpZiB0b3Agfj0gdmFsdWUgdGhlbgorICAgICAgICAgICAgICAgICAgICByZXZlcnNlW3RvcF0gPSBpbmRleAorICAgICAgICAgICAgICAgICAgICBzZXRbaW5kZXhdID0gdG9wCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgfX0pCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHNvY2tldC50Y3AoKSB3cmFwcGVyIGZvciB0aGUgY29yb3V0aW5lIGRpc3BhdGNoZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBmdW5jdGlvbiBjb3dyYXAoZGlzcGF0Y2hlciwgdGNwLCBlcnJvcikKKyAgICBpZiBub3QgdGNwIHRoZW4gcmV0dXJuIG5pbCwgZXJyb3IgZW5kCisgICAgLS0gcHV0IGl0IGluIG5vbi1ibG9ja2luZyBtb2RlIHJpZ2h0IGF3YXkKKyAgICB0Y3A6c2V0dGltZW91dCgwKQorICAgIC0tIG1ldGF0YWJsZSBmb3Igd3JhcCBwcm9kdWNlcyBuZXcgbWV0aG9kcyBvbiBkZW1hbmQgZm9yIHRob3NlIHRoYXQgd2UKKyAgICAtLSBkb24ndCBvdmVycmlkZSBleHBsaWNpdGx5LgorICAgIGxvY2FsIG1ldGF0ID0geyBfX2luZGV4ID0gZnVuY3Rpb24odGFibGUsIGtleSkKKyAgICAgICAgdGFibGVba2V5XSA9IGZ1bmN0aW9uKC4uLikKKyAgICAgICAgICAgIGFyZ1sxXSA9IHRjcAorICAgICAgICAgICAgcmV0dXJuIHRjcFtrZXldKGJhc2UudW5wYWNrKGFyZykpCisgICAgICAgIGVuZAorICAgICAgICByZXR1cm4gdGFibGVba2V5XQorICAgIGVuZH0KKyAgICAtLSBkb2VzIG91ciB1c2VyIHdhbnQgdG8gZG8gaGlzIG93biBub24tYmxvY2tpbmcgSS9PPworICAgIGxvY2FsIHplcm8gPSBmYWxzZQorICAgIC0tIGNyZWF0ZSBhIHdyYXAgb2JqZWN0IHRoYXQgd2lsbCBiZWhhdmUganVzdCBsaWtlIGEgcmVhbCBzb2NrZXQgb2JqZWN0CisgICAgbG9jYWwgd3JhcCA9IHsgIH0KKyAgICAtLSB3ZSBpZ25vcmUgc2V0dGltZW91dCB0byBwcmVzZXJ2ZSBvdXIgMCB0aW1lb3V0LCBidXQgcmVjb3JkIHdoZXRoZXIKKyAgICAtLSB0aGUgdXNlciB3YW50cyB0byBkbyBoaXMgb3duIG5vbi1ibG9ja2luZyBJL08KKyAgICBmdW5jdGlvbiB3cmFwOnNldHRpbWVvdXQodmFsdWUsIG1vZGUpCisgICAgICAgIGlmIHZhbHVlID09IDAgdGhlbiB6ZXJvID0gdHJ1ZQorICAgICAgICBlbHNlIHplcm8gPSBmYWxzZSBlbmQKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbmQKKyAgICAtLSBzZW5kIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCB5aWVsZCBvbiB0aW1lb3V0CisgICAgZnVuY3Rpb24gd3JhcDpzZW5kKGRhdGEsIGZpcnN0LCBsYXN0KQorICAgICAgICBmaXJzdCA9IChmaXJzdCBvciAxKSAtIDEKKyAgICAgICAgbG9jYWwgcmVzdWx0LCBlcnJvcgorICAgICAgICB3aGlsZSB0cnVlIGRvCisgICAgICAgICAgICAtLSByZXR1cm4gY29udHJvbCB0byBkaXNwYXRjaGVyIGFuZCB0ZWxsIGl0IHdlIHdhbnQgdG8gc2VuZAorICAgICAgICAgICAgLS0gaWYgdXBvbiByZXR1cm4gdGhlIGRpc3BhdGNoZXIgdGVsbHMgdXMgd2UgdGltZWQgb3V0LAorICAgICAgICAgICAgLS0gcmV0dXJuIGFuIGVycm9yIHRvIHdob2V2ZXIgY2FsbGVkIHVzCisgICAgICAgICAgICBpZiBjb3JvdXRpbmUueWllbGQoZGlzcGF0Y2hlci5zZW5kaW5nLCB0Y3ApID09ICJ0aW1lb3V0IiB0aGVuCisgICAgICAgICAgICAgICAgcmV0dXJuIG5pbCwgInRpbWVvdXQiCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIC0tIHRyeSBzZW5kaW5nCisgICAgICAgICAgICByZXN1bHQsIGVycm9yLCBmaXJzdCA9IHRjcDpzZW5kKGRhdGEsIGZpcnN0KzEsIGxhc3QpCisgICAgICAgICAgICAtLSBpZiB3ZSBhcmUgZG9uZSwgb3IgdGhlcmUgd2FzIGFuIHVuZXhwZWN0ZWQgZXJyb3IsCisgICAgICAgICAgICAtLSBicmVhayBhd2F5IGZyb20gbG9vcAorICAgICAgICAgICAgaWYgZXJyb3Igfj0gInRpbWVvdXQiIHRoZW4gcmV0dXJuIHJlc3VsdCwgZXJyb3IsIGZpcnN0IGVuZAorICAgICAgICBlbmQKKyAgICBlbmQKKyAgICAtLSByZWNlaXZlIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCB5aWVsZCBvbiB0aW1lb3V0CisgICAgLS0gb3Igc2ltcGx5IHJldHVybiBwYXJ0aWFsIHJlYWQsIGlmIHVzZXIgcmVxdWVzdGVkIHRpbWVvdXQgPSAwCisgICAgZnVuY3Rpb24gd3JhcDpyZWNlaXZlKHBhdHRlcm4sIHBhcnRpYWwpCisgICAgICAgIGxvY2FsIGVycm9yID0gInRpbWVvdXQiCisgICAgICAgIGxvY2FsIHZhbHVlCisgICAgICAgIHdoaWxlIHRydWUgZG8KKyAgICAgICAgICAgIC0tIHJldHVybiBjb250cm9sIHRvIGRpc3BhdGNoZXIgYW5kIHRlbGwgaXQgd2Ugd2FudCB0byByZWNlaXZlCisgICAgICAgICAgICAtLSBpZiB1cG9uIHJldHVybiB0aGUgZGlzcGF0Y2hlciB0ZWxscyB1cyB3ZSB0aW1lZCBvdXQsCisgICAgICAgICAgICAtLSByZXR1cm4gYW4gZXJyb3IgdG8gd2hvZXZlciBjYWxsZWQgdXMKKyAgICAgICAgICAgIGlmIGNvcm91dGluZS55aWVsZChkaXNwYXRjaGVyLnJlY2VpdmluZywgdGNwKSA9PSAidGltZW91dCIgdGhlbgorICAgICAgICAgICAgICAgIHJldHVybiBuaWwsICJ0aW1lb3V0IgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAtLSB0cnkgcmVjZWl2aW5nCisgICAgICAgICAgICB2YWx1ZSwgZXJyb3IsIHBhcnRpYWwgPSB0Y3A6cmVjZWl2ZShwYXR0ZXJuLCBwYXJ0aWFsKQorICAgICAgICAgICAgLS0gaWYgd2UgYXJlIGRvbmUsIG9yIHRoZXJlIHdhcyBhbiB1bmV4cGVjdGVkIGVycm9yLAorICAgICAgICAgICAgLS0gYnJlYWsgYXdheSBmcm9tIGxvb3AuIGFsc28sIGlmIHRoZSB1c2VyIHJlcXVlc3RlZAorICAgICAgICAgICAgLS0gemVybyB0aW1lb3V0LCByZXR1cm4gYWxsIHdlIGdvdAorICAgICAgICAgICAgaWYgKGVycm9yIH49ICJ0aW1lb3V0Iikgb3IgemVybyB0aGVuCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLCBlcnJvciwgcGFydGlhbAorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorICAgIC0tIGNvbm5lY3QgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIHlpZWxkIG9uIHRpbWVvdXQKKyAgICBmdW5jdGlvbiB3cmFwOmNvbm5lY3QoaG9zdCwgcG9ydCkKKyAgICAgICAgbG9jYWwgcmVzdWx0LCBlcnJvciA9IHRjcDpjb25uZWN0KGhvc3QsIHBvcnQpCisgICAgICAgIGlmIGVycm9yID09ICJ0aW1lb3V0IiB0aGVuCisgICAgICAgICAgICAtLSByZXR1cm4gY29udHJvbCB0byBkaXNwYXRjaGVyLiB3ZSB3aWxsIGJlIHdyaXRhYmxlIHdoZW4KKyAgICAgICAgICAgIC0tIGNvbm5lY3Rpb24gc3VjY2VlZHMuCisgICAgICAgICAgICAtLSBpZiB1cG9uIHJldHVybiB0aGUgZGlzcGF0Y2hlciB0ZWxscyB1cyB3ZSBoYXZlIGEKKyAgICAgICAgICAgIC0tIHRpbWVvdXQsIGp1c3QgYWJvcnQKKyAgICAgICAgICAgIGlmIGNvcm91dGluZS55aWVsZChkaXNwYXRjaGVyLnNlbmRpbmcsIHRjcCkgPT0gInRpbWVvdXQiIHRoZW4KKyAgICAgICAgICAgICAgICByZXR1cm4gbmlsLCAidGltZW91dCIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgLS0gd2hlbiB3ZSBjb21lIGJhY2ssIGNoZWNrIGlmIGNvbm5lY3Rpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgIHJlc3VsdCwgZXJyb3IgPSB0Y3A6Y29ubmVjdChob3N0LCBwb3J0KQorICAgICAgICAgICAgaWYgcmVzdWx0IG9yIGVycm9yID09ICJhbHJlYWR5IGNvbm5lY3RlZCIgdGhlbiByZXR1cm4gMQorICAgICAgICAgICAgZWxzZSByZXR1cm4gbmlsLCAibm9uLWJsb2NraW5nIGNvbm5lY3QgZmFpbGVkIiBlbmQKKyAgICAgICAgZWxzZSByZXR1cm4gcmVzdWx0LCBlcnJvciBlbmQKKyAgICBlbmQKKyAgICAtLSBhY2NlcHQgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIHlpZWxkIG9uIHRpbWVvdXQKKyAgICBmdW5jdGlvbiB3cmFwOmFjY2VwdCgpCisgICAgICAgIHdoaWxlIDEgZG8KKyAgICAgICAgICAgIC0tIHJldHVybiBjb250cm9sIHRvIGRpc3BhdGNoZXIuIHdlIHdpbGwgYmUgcmVhZGFibGUgd2hlbiBhCisgICAgICAgICAgICAtLSBjb25uZWN0aW9uIGFycml2ZXMuCisgICAgICAgICAgICAtLSBpZiB1cG9uIHJldHVybiB0aGUgZGlzcGF0Y2hlciB0ZWxscyB1cyB3ZSBoYXZlIGEKKyAgICAgICAgICAgIC0tIHRpbWVvdXQsIGp1c3QgYWJvcnQKKyAgICAgICAgICAgIGlmIGNvcm91dGluZS55aWVsZChkaXNwYXRjaGVyLnJlY2VpdmluZywgdGNwKSA9PSAidGltZW91dCIgdGhlbgorICAgICAgICAgICAgICAgIHJldHVybiBuaWwsICJ0aW1lb3V0IgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBsb2NhbCBjbGllbnQsIGVycm9yID0gdGNwOmFjY2VwdCgpCisgICAgICAgICAgICBpZiBlcnJvciB+PSAidGltZW91dCIgdGhlbgorICAgICAgICAgICAgICAgIHJldHVybiBjb3dyYXAoZGlzcGF0Y2hlciwgY2xpZW50LCBlcnJvcikKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICBlbmQKKyAgICAtLSByZW1vdmUgY29ydG4gZnJvbSBjb250ZXh0CisgICAgZnVuY3Rpb24gd3JhcDpjbG9zZSgpCisgICAgICAgIGRpc3BhdGNoZXIuc3RhbXBbdGNwXSA9IG5pbAorICAgICAgICBkaXNwYXRjaGVyLnNlbmRpbmcuc2V0OnJlbW92ZSh0Y3ApCisgICAgICAgIGRpc3BhdGNoZXIuc2VuZGluZy5jb3J0blt0Y3BdID0gbmlsCisgICAgICAgIGRpc3BhdGNoZXIucmVjZWl2aW5nLnNldDpyZW1vdmUodGNwKQorICAgICAgICBkaXNwYXRjaGVyLnJlY2VpdmluZy5jb3J0blt0Y3BdID0gbmlsCisgICAgICAgIHJldHVybiB0Y3A6Y2xvc2UoKQorICAgIGVuZAorICAgIHJldHVybiBiYXNlLnNldG1ldGF0YWJsZSh3cmFwLCBtZXRhdCkKK2VuZAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBPdXIgY29yb3V0aW5lIGRpc3BhdGNoZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBjb21ldGF0ID0geyBfX2luZGV4ID0ge30gfQorCitmdW5jdGlvbiBzY2hlZHVsZShjb3J0biwgc3RhdHVzLCBvcGVyYXRpb24sIHRjcCkKKyAgICBpZiBzdGF0dXMgdGhlbgorICAgICAgICBpZiBjb3J0biBhbmQgb3BlcmF0aW9uIHRoZW4KKyAgICAgICAgICAgIG9wZXJhdGlvbi5zZXQ6aW5zZXJ0KHRjcCkKKyAgICAgICAgICAgIG9wZXJhdGlvbi5jb3J0blt0Y3BdID0gY29ydG4KKyAgICAgICAgICAgIG9wZXJhdGlvbi5zdGFtcFt0Y3BdID0gc29ja2V0LmdldHRpbWUoKQorICAgICAgICBlbmQKKyAgICBlbHNlIGJhc2UuZXJyb3Iob3BlcmF0aW9uKSBlbmQKK2VuZAorCitmdW5jdGlvbiBraWNrKG9wZXJhdGlvbiwgdGNwKQorICAgIG9wZXJhdGlvbi5jb3J0blt0Y3BdID0gbmlsCisgICAgb3BlcmF0aW9uLnNldDpyZW1vdmUodGNwKQorZW5kCisKK2Z1bmN0aW9uIHdha2V1cChvcGVyYXRpb24sIHRjcCkKKyAgICBsb2NhbCBjb3J0biA9IG9wZXJhdGlvbi5jb3J0blt0Y3BdCisgICAgLS0gaWYgY29ydG4gaXMgc3RpbGwgdmFsaWQsIHdha2UgaXQgdXAKKyAgICBpZiBjb3J0biB0aGVuCisgICAgICAgIGtpY2sob3BlcmF0aW9uLCB0Y3ApCisgICAgICAgIHJldHVybiBjb3J0biwgY29yb3V0aW5lLnJlc3VtZShjb3J0bikKKyAgICAtLSBvdGhyZXdpc2UsIGp1c3QgZ2V0IHNjaGVkdWxlciBub3QgdG8gZG8gYW55dGhpbmcKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBuaWwsIHRydWUKKyAgICBlbmQKK2VuZAorCitmdW5jdGlvbiBhYm9ydChvcGVyYXRpb24sIHRjcCkKKyAgICBsb2NhbCBjb3J0biA9IG9wZXJhdGlvbi5jb3J0blt0Y3BdCisgICAgaWYgY29ydG4gdGhlbgorICAgICAgICBraWNrKG9wZXJhdGlvbiwgdGNwKQorICAgICAgICBjb3JvdXRpbmUucmVzdW1lKGNvcnRuLCAidGltZW91dCIpCisgICAgZW5kCitlbmQKKworLS0gc3RlcCB0aHJvdWdoIGFsbCBhY3RpdmUgY29ydG5zCitmdW5jdGlvbiBjb21ldGF0Ll9faW5kZXg6c3RlcCgpCisgICAgLS0gY2hlY2sgd2hpY2ggc29ja2V0cyBhcmUgaW50ZXJlc3RpbmcgYW5kIGFjdCBvbiB0aGVtCisgICAgbG9jYWwgcmVhZGFibGUsIHdyaXRhYmxlID0gc29ja2V0LnNlbGVjdChzZWxmLnJlY2VpdmluZy5zZXQsCisgICAgICAgIHNlbGYuc2VuZGluZy5zZXQsIDEpCisgICAgLS0gZm9yIGFsbCByZWFkYWJsZSBjb25uZWN0aW9ucywgcmVzdW1lIHRoZWlyIGNvcnRucyBhbmQgcmVzY2hlZHVsZQorICAgIC0tIHdoZW4gdGhleSB5aWVsZCBiYWNrIHRvIHVzCisgICAgZm9yIF8sIHRjcCBpbiBiYXNlLmlwYWlycyhyZWFkYWJsZSkgZG8KKyAgICAgICAgc2NoZWR1bGUod2FrZXVwKHNlbGYucmVjZWl2aW5nLCB0Y3ApKQorICAgIGVuZAorICAgIC0tIGZvciBhbGwgd3JpdGFibGUgY29ubmVjdGlvbnMsIGRvIHRoZSBzYW1lCisgICAgZm9yIF8sIHRjcCBpbiBiYXNlLmlwYWlycyh3cml0YWJsZSkgZG8KKyAgICAgICAgc2NoZWR1bGUod2FrZXVwKHNlbGYuc2VuZGluZywgdGNwKSkKKyAgICBlbmQKKyAgICAtLSBwb2xpdGVseSBhc2sgcmVwbGFjZW1lbnQgSS9PIGZ1bmN0aW9ucyBpbiBpZGxlIGNvcnRucyB0bworICAgIC0tIHJldHVybiByZXBvcnRpbmcgYSB0aW1lb3V0CisgICAgbG9jYWwgbm93ID0gc29ja2V0LmdldHRpbWUoKQorICAgIGZvciB0Y3AsIHN0YW1wIGluIGJhc2UucGFpcnMoc2VsZi5zdGFtcCkgZG8KKyAgICAgICAgaWYgdGNwLmNsYXNzID09ICJ0Y3B7Y2xpZW50fSIgYW5kIG5vdyAtIHN0YW1wID4gVElNRU9VVCB0aGVuCisgICAgICAgICAgICBhYm9ydChzZWxmLnNlbmRpbmcsIHRjcCkKKyAgICAgICAgICAgIGFib3J0KHNlbGYucmVjZWl2aW5nLCB0Y3ApCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2Z1bmN0aW9uIGNvbWV0YXQuX19pbmRleDpzdGFydChmdW5jKQorICAgIGxvY2FsIGNvcnRuID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jKQorICAgIHNjaGVkdWxlKGNvcnRuLCBjb3JvdXRpbmUucmVzdW1lKGNvcnRuKSkKK2VuZAorCitmdW5jdGlvbiBoYW5kbGVydC5jb3JvdXRpbmUoKQorICAgIGxvY2FsIHN0YW1wID0ge30KKyAgICBsb2NhbCBkaXNwYXRjaGVyID0geworICAgICAgICBzdGFtcCA9IHN0YW1wLAorICAgICAgICBzZW5kaW5nICA9IHsKKyAgICAgICAgICAgIG5hbWUgPSAic2VuZGluZyIsCisgICAgICAgICAgICBzZXQgPSBuZXdzZXQoKSwKKyAgICAgICAgICAgIGNvcnRuID0ge30sCisgICAgICAgICAgICBzdGFtcCA9IHN0YW1wCisgICAgICAgIH0sCisgICAgICAgIHJlY2VpdmluZyA9IHsKKyAgICAgICAgICAgIG5hbWUgPSAicmVjZWl2aW5nIiwKKyAgICAgICAgICAgIHNldCA9IG5ld3NldCgpLAorICAgICAgICAgICAgY29ydG4gPSB7fSwKKyAgICAgICAgICAgIHN0YW1wID0gc3RhbXAKKyAgICAgICAgfSwKKyAgICB9CisgICAgZnVuY3Rpb24gZGlzcGF0Y2hlci50Y3AoKQorICAgICAgICByZXR1cm4gY293cmFwKGRpc3BhdGNoZXIsIHNvY2tldC50Y3AoKSkKKyAgICBlbmQKKyAgICByZXR1cm4gYmFzZS5zZXRtZXRhdGFibGUoZGlzcGF0Y2hlciwgY29tZXRhdCkKK2VuZAorCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZXRjL2VvbC5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL2VvbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwYmU3OQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9ldGMvZW9sLmx1YQpAQCAtMCwwICsxLDE0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gTGl0dGxlIHByb2dyYW0gdG8gYWRqdXN0IGVuZCBvZiBsaW5lIG1hcmtlcnMuCistLSBMdWFTb2NrZXQgc2FtcGxlIGZpbGVzCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogZW9sLmx1YSx2IDEuOCAyMDA1LzExLzIyIDA4OjMzOjI5IGRpZWdvIEV4cCAkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgbWltZSA9IHJlcXVpcmUoIm1pbWUiKQorbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCitsb2NhbCBtYXJrZXIgPSAnXG4nCitpZiBhcmcgYW5kIGFyZ1sxXSA9PSAnLWQnIHRoZW4gbWFya2VyID0gJ1xyXG4nIGVuZAorbG9jYWwgZmlsdGVyID0gbWltZS5ub3JtYWxpemUobWFya2VyKQorbG9jYWwgc291cmNlID0gbHRuMTIuc291cmNlLmNoYWluKGx0bjEyLnNvdXJjZS5maWxlKGlvLnN0ZGluKSwgZmlsdGVyKQorbG9jYWwgc2luayA9IGx0bjEyLnNpbmsuZmlsZShpby5zdGRvdXQpCitsdG4xMi5wdW1wLmFsbChzb3VyY2UsIHNpbmspCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZXRjL2ZvcndhcmQubHVhIGIvbHVhc29ja2V0LTIuMC4yL2V0Yy9mb3J3YXJkLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDczYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2V0Yy9mb3J3YXJkLmx1YQpAQCAtMCwwICsxLDY1IEBACistLSBsb2FkIG91ciBmYXZvdXJpdGUgbGlicmFyeQorbG9jYWwgZGlzcGF0Y2ggPSByZXF1aXJlKCJkaXNwYXRjaCIpCitsb2NhbCBoYW5kbGVyID0gZGlzcGF0Y2gubmV3aGFuZGxlcigpCisKKy0tIG1ha2Ugc3VyZSB0aGUgdXNlciBrbm93cyBob3cgdG8gaW52b2tlIHVzCitpZiB0YWJsZS5nZXRuKGFyZykgPCAxIHRoZW4KKyAgICBwcmludCgiVXNhZ2UiKQorICAgIHByaW50KCIgICAgbHVhIGZvcndhcmQubHVhIDxpcG9ydDpvaG9zdDpvcG9ydD4gLi4uIikKKyAgICBvcy5leGl0KDEpCitlbmQKKworLS0gZnVuY3Rpb24gdG8gbW92ZSBkYXRhIGZyb20gb25lIHNvY2tldCB0byB0aGUgb3RoZXIKK2xvY2FsIGZ1bmN0aW9uIG1vdmUoZm9vLCBiYXIpCisgICAgbG9jYWwgbGl2ZQorICAgIHdoaWxlIDEgZG8KKyAgICAgICAgbG9jYWwgZGF0YSwgZXJyb3IsIHBhcnRpYWwgPSBmb286cmVjZWl2ZSgyMDQ4KQorICAgICAgICBsaXZlID0gZGF0YSBvciBlcnJvciA9PSAidGltZW91dCIKKyAgICAgICAgZGF0YSA9IGRhdGEgb3IgcGFydGlhbAorICAgICAgICBsb2NhbCByZXN1bHQsIGVycm9yID0gYmFyOnNlbmQoZGF0YSkKKyAgICAgICAgaWYgbm90IGxpdmUgb3Igbm90IHJlc3VsdCB0aGVuCisgICAgICAgICAgICBmb286Y2xvc2UoKQorICAgICAgICAgICAgYmFyOmNsb3NlKCkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKKy0tIGZvciBlYWNoIHR1bm5lbCwgc3RhcnQgYSBuZXcgc2VydmVyCitmb3IgaSwgdiBpbiBpcGFpcnMoYXJnKSBkbworICAgIC0tIGNhcHR1cmUgZm9yd2FyZGluZyBwYXJhbWV0ZXJzCisgICAgbG9jYWwgXywgXywgaXBvcnQsIG9ob3N0LCBvcG9ydCA9IHN0cmluZy5maW5kKHYsICIoW146XSspOihbXjpdKyk6KFteOl0rKSIpCisgICAgYXNzZXJ0KGlwb3J0LCAiaW52YWxpZCBhcmd1bWVudHMiKQorICAgIC0tIGNyZWF0ZSBvdXIgc2VydmVyIHNvY2tldAorICAgIGxvY2FsIHNlcnZlciA9IGFzc2VydChoYW5kbGVyLnRjcCgpKQorICAgIGFzc2VydChzZXJ2ZXI6c2V0b3B0aW9uKCJyZXVzZWFkZHIiLCB0cnVlKSkKKyAgICBhc3NlcnQoc2VydmVyOmJpbmQoIioiLCBpcG9ydCkpCisgICAgYXNzZXJ0KHNlcnZlcjpsaXN0ZW4oMzIpKQorICAgIC0tIGhhbmRsZXIgZm9yIHRoZSBzZXJ2ZXIgb2JqZWN0IGxvb3BzIGFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMKKyAgICBoYW5kbGVyOnN0YXJ0KGZ1bmN0aW9uKCkKKyAgICAgICAgd2hpbGUgMSBkbworICAgICAgICAgICAgbG9jYWwgY2xpZW50ID0gYXNzZXJ0KHNlcnZlcjphY2NlcHQoKSkKKyAgICAgICAgICAgIGFzc2VydChjbGllbnQ6c2V0dGltZW91dCgwKSkKKyAgICAgICAgICAgIC0tIGZvciBlYWNoIG5ldyBjb25uZWN0aW9uLCBzdGFydCBhIG5ldyBjbGllbnQgaGFuZGxlcgorICAgICAgICAgICAgaGFuZGxlcjpzdGFydChmdW5jdGlvbigpCisgICAgICAgICAgICAgICAgLS0gaGFuZGxlciB0cmllcyB0byBjb25uZWN0IHRvIHBlZXIKKyAgICAgICAgICAgICAgICBsb2NhbCBwZWVyID0gYXNzZXJ0KGhhbmRsZXIudGNwKCkpCisgICAgICAgICAgICAgICAgYXNzZXJ0KHBlZXI6c2V0dGltZW91dCgwKSkKKyAgICAgICAgICAgICAgICBhc3NlcnQocGVlcjpjb25uZWN0KG9ob3N0LCBvcG9ydCkpCisgICAgICAgICAgICAgICAgLS0gaWYgc3VjZXNzZnVsLCBzdGFydHMgYSBuZXcgaGFuZGxlciB0byBzZW5kIGRhdGEgZnJvbQorICAgICAgICAgICAgICAgIC0tIGNsaWVudCB0byBwZWVyCisgICAgICAgICAgICAgICAgaGFuZGxlcjpzdGFydChmdW5jdGlvbigpCisgICAgICAgICAgICAgICAgICAgIG1vdmUoY2xpZW50LCBwZWVyKQorICAgICAgICAgICAgICAgIGVuZCkKKyAgICAgICAgICAgICAgICAtLSBhZnRlIHN0YXJ0aW5nIG5ldyBoYW5kbGVyLCBlbnRlciBpbiBsb29wIHNlbmRpbmcgZGF0YSBmcm9tCisgICAgICAgICAgICAgICAgLS0gcGVlciB0byBjbGllbnQKKyAgICAgICAgICAgICAgICBtb3ZlKHBlZXIsIGNsaWVudCkKKyAgICAgICAgICAgIGVuZCkKKyAgICAgICAgZW5kCisgICAgZW5kKQorZW5kCisKKy0tIHNpbXBseSBsb29wIHN0ZXBwaW5nIHRoZSBzZXJ2ZXIKK3doaWxlIDEgZG8KKyAgICBoYW5kbGVyOnN0ZXAoKQorZW5kCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZXRjL2dldC5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL2dldC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmNmE0NQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9ldGMvZ2V0Lmx1YQpAQCAtMCwwICsxLDE0MiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIExpdHRsZSBwcm9ncmFtIHRvIGRvd25sb2FkIGZpbGVzIGZyb20gVVJMcworLS0gTHVhU29ja2V0IHNhbXBsZSBmaWxlcworLS0gQXV0aG9yOiBEaWVnbyBOZWhhYgorLS0gUkNTIElEOiAkSWQ6IGdldC5sdWEsdiAxLjI1IDIwMDcvMDMvMTIgMDQ6MDg6NDAgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBzb2NrZXQgPSByZXF1aXJlKCJzb2NrZXQiKQorbG9jYWwgaHR0cCA9IHJlcXVpcmUoInNvY2tldC5odHRwIikKK2xvY2FsIGZ0cCA9IHJlcXVpcmUoInNvY2tldC5mdHAiKQorbG9jYWwgdXJsID0gcmVxdWlyZSgic29ja2V0LnVybCIpCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKKworLS0gZm9ybWF0cyBhIG51bWJlciBvZiBzZWNvbmRzIGludG8gaHVtYW4gcmVhZGFibGUgZm9ybQorZnVuY3Rpb24gbmljZXRpbWUocykKKwlsb2NhbCBsID0gInMiCisJaWYgcyA+IDYwIHRoZW4KKwkJcyA9IHMgLyA2MAorCQlsID0gIm0iCisJCWlmIHMgPiA2MCB0aGVuCisJCQlzID0gcyAvIDYwCisJCQlsID0gImgiCisJCQlpZiBzID4gMjQgdGhlbgorCQkJCXMgPSBzIC8gMjQKKwkJCQlsID0gImQiIC0tIGhtbW0KKwkJCWVuZAorCQllbmQKKwllbmQKKwlpZiBsID09ICJzIiB0aGVuIHJldHVybiBzdHJpbmcuZm9ybWF0KCIlNS4wZiVzIiwgcywgbCkKKwllbHNlIHJldHVybiBzdHJpbmcuZm9ybWF0KCIlNS4yZiVzIiwgcywgbCkgZW5kCitlbmQKKworLS0gZm9ybWF0cyBhIG51bWJlciBvZiBieXRlcyBpbnRvIGh1bWFuIHJlYWRhYmxlIGZvcm0KK2Z1bmN0aW9uIG5pY2VzaXplKGIpCisJbG9jYWwgbCA9ICJCIgorCWlmIGIgPiAxMDI0IHRoZW4KKwkJYiA9IGIgLyAxMDI0CisJCWwgPSAiS0IiCisJCWlmIGIgPiAxMDI0IHRoZW4KKwkJCWIgPSBiIC8gMTAyNAorCQkJbCA9ICJNQiIKKwkJCWlmIGIgPiAxMDI0IHRoZW4KKwkJCQliID0gYiAvIDEwMjQKKwkJCQlsID0gIkdCIiAtLSBobW1tCisJCQllbmQKKwkJZW5kCisJZW5kCisJcmV0dXJuIHN0cmluZy5mb3JtYXQoIiU3LjJmJTJzIiwgYiwgbCkKK2VuZAorCistLSByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvd25sb2FkCitsb2NhbCByZW1haW5pbmdfcyA9ICIlcyByZWNlaXZlZCwgJXMvcyB0aHJvdWdocHV0LCAlMi4wZiUlIGRvbmUsICVzIHJlbWFpbmluZyIKK2xvY2FsIGVsYXBzZWRfcyA9ICAgIiVzIHJlY2VpdmVkLCAlcy9zIHRocm91Z2hwdXQsICVzIGVsYXBzZWQgICAgICAgICAgICAgICAgIgorZnVuY3Rpb24gZ2F1Z2UoZ290LCBkZWx0YSwgc2l6ZSkKKwlsb2NhbCByYXRlID0gZ290IC8gZGVsdGEKKwlpZiBzaXplIGFuZCBzaXplID49IDEgdGhlbgorCQlyZXR1cm4gc3RyaW5nLmZvcm1hdChyZW1haW5pbmdfcywgbmljZXNpemUoZ290KSwgIG5pY2VzaXplKHJhdGUpLAorCQkJMTAwKmdvdC9zaXplLCBuaWNldGltZSgoc2l6ZS1nb3QpL3JhdGUpKQorCWVsc2UKKwkJcmV0dXJuIHN0cmluZy5mb3JtYXQoZWxhcHNlZF9zLCBuaWNlc2l6ZShnb3QpLAorCQkJbmljZXNpemUocmF0ZSksIG5pY2V0aW1lKGRlbHRhKSkKKwllbmQKK2VuZAorCistLSBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGEgcmVjZWl2ZV9jYiB0aGF0IHNhdmVzIHRvIGRpc2sKKy0tIGtpbmQgb2YgY29waWVkIGZyb20gbHVhc29ja2V0J3MgbWFudWFsIGNhbGxiYWNrIGV4YW1wbGVzCitmdW5jdGlvbiBzdGF0cyhzaXplKQorICAgIGxvY2FsIHN0YXJ0ID0gc29ja2V0LmdldHRpbWUoKQorICAgIGxvY2FsIGxhc3QgPSBzdGFydAorICAgIGxvY2FsIGdvdCA9IDAKKyAgICByZXR1cm4gZnVuY3Rpb24oY2h1bmspCisgICAgICAgIC0tIGVsYXBzZWQgdGltZSBzaW5jZSBzdGFydAorICAgICAgICBsb2NhbCBjdXJyZW50ID0gc29ja2V0LmdldHRpbWUoKQorICAgICAgICBpZiBjaHVuayB0aGVuCisgICAgICAgICAgICAtLSB0b3RhbCBieXRlcyByZWNlaXZlZAorICAgICAgICAgICAgZ290ID0gZ290ICsgc3RyaW5nLmxlbihjaHVuaykgICAKKyAgICAgICAgICAgIC0tIG5vdCBlbm91Z2ggdGltZSBmb3IgZXN0aW1hdGUKKyAgICAgICAgICAgIGlmIGN1cnJlbnQgLSBsYXN0ID4gMSB0aGVuCisgICAgICAgICAgICAgICAgaW8uc3RkZXJyOndyaXRlKCJcciIsIGdhdWdlKGdvdCwgY3VycmVudCAtIHN0YXJ0LCBzaXplKSkKKyAgICAgICAgICAgICAgICBpby5zdGRlcnI6Zmx1c2goKQorICAgICAgICAgICAgICAgIGxhc3QgPSBjdXJyZW50CisgICAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLS0gY2xvc2UgdXAKKyAgICAgICAgICAgIGlvLnN0ZGVycjp3cml0ZSgiXHIiLCBnYXVnZShnb3QsIGN1cnJlbnQgLSBzdGFydCksICJcbiIpCisgICAgICAgIGVuZAorICAgICAgICByZXR1cm4gY2h1bmsKKyAgICBlbmQKK2VuZAorCistLSBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIGEgaHR0cCBmaWxlCitmdW5jdGlvbiBnZXRodHRwc2l6ZSh1KQorCWxvY2FsIHIsIGMsIGggPSBodHRwLnJlcXVlc3Qge21ldGhvZCA9ICJIRUFEIiwgdXJsID0gdX0KKwlpZiBjID09IDIwMCB0aGVuCisJCXJldHVybiB0b251bWJlcihoWyJjb250ZW50LWxlbmd0aCJdKQorCWVuZAorZW5kCisKKy0tIGRvd25sb2FkcyBhIGZpbGUgdXNpbmcgdGhlIGh0dHAgcHJvdG9jb2wKK2Z1bmN0aW9uIGdldGJ5aHR0cCh1LCBmaWxlKQorICAgIGxvY2FsIHNhdmUgPSBsdG4xMi5zaW5rLmZpbGUoZmlsZSBvciBpby5zdGRvdXQpCisgICAgLS0gb25seSBwcmludCBmZWVkYmFjayBpZiBvdXRwdXQgaXMgbm90IHN0ZG91dAorICAgIGlmIGZpbGUgdGhlbiBzYXZlID0gbHRuMTIuc2luay5jaGFpbihzdGF0cyhnZXRodHRwc2l6ZSh1KSksIHNhdmUpIGVuZAorICAgIGxvY2FsIHIsIGMsIGgsIHMgPSBodHRwLnJlcXVlc3Qge3VybCA9IHUsIHNpbmsgPSBzYXZlIH0KKwlpZiBjIH49IDIwMCB0aGVuIGlvLnN0ZGVycjp3cml0ZShzIG9yIGMsICJcbiIpIGVuZAorZW5kCisKKy0tIGRvd25sb2FkcyBhIGZpbGUgdXNpbmcgdGhlIGZ0cCBwcm90b2NvbAorZnVuY3Rpb24gZ2V0YnlmdHAodSwgZmlsZSkKKyAgICBsb2NhbCBzYXZlID0gbHRuMTIuc2luay5maWxlKGZpbGUgb3IgaW8uc3Rkb3V0KQorICAgIC0tIG9ubHkgcHJpbnQgZmVlZGJhY2sgaWYgb3V0cHV0IGlzIG5vdCBzdGRvdXQKKyAgICAtLSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgYmlnIHRoZSBmaWxlIGlzCisgICAgaWYgZmlsZSB0aGVuIHNhdmUgPSBsdG4xMi5zaW5rLmNoYWluKHN0YXRzKCksIHNhdmUpIGVuZAorICAgIGxvY2FsIGdldHQgPSB1cmwucGFyc2UodSkKKyAgICBnZXR0LnNpbmsgPSBzYXZlCisgICAgZ2V0dC50eXBlID0gImkiCisgICAgbG9jYWwgcmV0LCBlcnIgPSBmdHAuZ2V0KGdldHQpCisJaWYgZXJyIHRoZW4gcHJpbnQoZXJyKSBlbmQKK2VuZAorCistLSBkZXRlcm1pbmVzIHRoZSBzY2hlbWUKK2Z1bmN0aW9uIGdldHNjaGVtZSh1KQorCS0tIHRoaXMgaXMgYW4gaGV1cmlzdGljIHRvIHNvbHZlIGEgY29tbW9uIGludmFsaWQgdXJsIHBvYmxlbQorCWlmIG5vdCBzdHJpbmcuZmluZCh1LCAiLy8iKSB0aGVuIHUgPSAiLy8iIC4uIHUgZW5kCisJbG9jYWwgcGFyc2VkID0gdXJsLnBhcnNlKHUsIHtzY2hlbWUgPSAiaHR0cCJ9KQorCXJldHVybiBwYXJzZWQuc2NoZW1lCitlbmQKKworLS0gZ2V0cyBhIGZpbGUgZWl0aGVyIGJ5IGh0dHAgb3IgZnRwLCBzYXZpbmcgYXMgPG5hbWU+CitmdW5jdGlvbiBnZXQodSwgbmFtZSkKKyAgICBsb2NhbCBmb3V0ID0gbmFtZSBhbmQgaW8ub3BlbihuYW1lLCAid2IiKQorCWxvY2FsIHNjaGVtZSA9IGdldHNjaGVtZSh1KQorCWlmIHNjaGVtZSA9PSAiZnRwIiB0aGVuIGdldGJ5ZnRwKHUsIGZvdXQpCisJZWxzZWlmIHNjaGVtZSA9PSAiaHR0cCIgdGhlbiBnZXRieWh0dHAodSwgZm91dCkKKwllbHNlIHByaW50KCJ1bmtub3duIHNjaGVtZSIgLi4gc2NoZW1lKSBlbmQKK2VuZAorCistLSBtYWluIHByb2dyYW0KK2FyZyA9IGFyZyBvciB7fQoraWYgdGFibGUuZ2V0bihhcmcpIDwgMSB0aGVuCisJaW8ud3JpdGUoIlVzYWdlOlxuICBsdWEgZ2V0Lmx1YSA8cmVtb3RlLXVybD4gWzxsb2NhbC1maWxlPl1cbiIpCisJb3MuZXhpdCgxKQorZWxzZSBnZXQoYXJnWzFdLCBhcmdbMl0pIGVuZApkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2V0Yy9scC5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL2xwLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjY5OTIwCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2V0Yy9scC5sdWEKQEAgLTAsMCArMSwzMjQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBMUEQgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorLS0gTHVhU29ja2V0IHRvb2xraXQuCistLSBBdXRob3I6IERhdmlkIEJ1cmdlc3MKKy0tIE1vZGlmaWVkIGJ5IERpZWdvIE5laGFiLCBidXQgRGF2aWQgaXMgaW4gY2hhcmdlCistLSBSQ1MgSUQ6ICRJZDogbHAubHVhLHYgMS4xNCAyMDA1LzExLzIxIDA3OjA0OjQ0IGRpZWdvIEV4cCAkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS1bWworICAgICBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zOiBSRkMgMTE3OQorXV0KKy0tIG1ha2Ugc3VyZSBMdWFTb2NrZXQgaXMgbG9hZGVkCitsb2NhbCBpbyA9IHJlcXVpcmUoImlvIikKK2xvY2FsIGJhc2UgPSBfRworbG9jYWwgb3MgPSByZXF1aXJlKCJvcyIpCitsb2NhbCBtYXRoID0gcmVxdWlyZSgibWF0aCIpCitsb2NhbCBzdHJpbmcgPSByZXF1aXJlKCJzdHJpbmciKQorbG9jYWwgc29ja2V0ID0gcmVxdWlyZSgic29ja2V0IikKK2xvY2FsIGx0bjEyID0gcmVxdWlyZSgibHRuMTIiKQorbW9kdWxlKCJzb2NrZXQubHAiKQorCistLSBkZWZhdWx0IHBvcnQKK1BPUlQgPSA1MTUKK1NFUlZFUiA9IG9zLmdldGVudigiU0VSVkVSX05BTUUiKSBvciBvcy5nZXRlbnYoIkNPTVBVVEVSTkFNRSIpIG9yICJsb2NhbGhvc3QiCitQUklOVEVSID0gb3MuZ2V0ZW52KCJQUklOVEVSIikgb3IgInByaW50ZXIiCisKK2xvY2FsIGZ1bmN0aW9uIGNvbm5lY3QobG9jYWxob3N0LCBvcHRpb24pCisgICAgbG9jYWwgaG9zdCA9IG9wdGlvbi5ob3N0IG9yIFNFUlZFUgorICAgIGxvY2FsIHBvcnQgPSBvcHRpb24ucG9ydCBvciBQT1JUCisgICAgbG9jYWwgc2t0CisgICAgbG9jYWwgdHJ5ID0gc29ja2V0Lm5ld3RyeShmdW5jdGlvbigpIGlmIHNrdCB0aGVuIHNrdDpjbG9zZSgpIGVuZCBlbmQpCisgICAgaWYgb3B0aW9uLmxvY2FsYmluZCB0aGVuCisgICAgICAgIC0tIGJpbmQgdG8gYSBsb2NhbCBwb3J0IChpZiB3ZSBjYW4pCisgICAgICAgIGxvY2FsIGxvY2FscG9ydCA9IDcyMQorICAgICAgICBsb2NhbCBkb25lLCBlcnIKKyAgICAgICAgcmVwZWF0CisgICAgICAgICAgICBza3QgPSBzb2NrZXQudHJ5KHNvY2tldC50Y3AoKSkKKyAgICAgICAgICAgIHRyeShza3Q6c2V0dGltZW91dCgzMCkpCisgICAgICAgICAgICBkb25lLCBlcnIgPSBza3Q6YmluZChsb2NhbGhvc3QsIGxvY2FscG9ydCkKKyAgICAgICAgICAgIGlmIG5vdCBkb25lIHRoZW4KKyAgICAgICAgICAgICAgICBsb2NhbHBvcnQgPSBsb2NhbHBvcnQgKyAxCisgICAgICAgICAgICAgICAgc2t0OmNsb3NlKCkKKyAgICAgICAgICAgICAgICBza3QgPSBuaWwKKyAgICAgICAgICAgIGVsc2UgYnJlYWsgZW5kCisgICAgICAgIHVudGlsIGxvY2FscG9ydCA+IDczMQorICAgICAgICBzb2NrZXQudHJ5KHNrdCwgZXJyKQorICAgIGVsc2Ugc2t0ID0gc29ja2V0LnRyeShzb2NrZXQudGNwKCkpIGVuZAorICAgIHRyeShza3Q6Y29ubmVjdChob3N0LCBwb3J0KSkKKyAgICByZXR1cm4geyBza3QgPSBza3QsIHRyeSA9IHRyeSB9CitlbmQKKworLS1bWworUkZDIDExNzkKKzUuMyAwMyAtIFNlbmQgcXVldWUgc3RhdGUgKHNob3J0KQorCisgICAgICArLS0tLSstLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0rCisgICAgICB8IDAzIHwgUXVldWUgfCBTUCB8IExpc3QgfCBMRiB8CisgICAgICArLS0tLSstLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0rCisgICAgICBDb21tYW5kIGNvZGUgLSAzCisgICAgICBPcGVyYW5kIDEgLSBQcmludGVyIHF1ZXVlIG5hbWUKKyAgICAgIE90aGVyIG9wZXJhbmRzIC0gVXNlciBuYW1lcyBvciBqb2IgbnVtYmVycworCisgICBJZiB0aGUgdXNlciBuYW1lcyBvciBqb2IgbnVtYmVycyBvciBib3RoIGFyZSBzdXBwbGllZCB0aGVuIG9ubHkgdGhvc2UKKyAgIGpvYnMgZm9yIHRob3NlIHVzZXJzIG9yIHdpdGggdGhvc2UgbnVtYmVycyB3aWxsIGJlIHNlbnQuCisKKyAgIFRoZSByZXNwb25zZSBpcyBhbiBBU0NJSSBzdHJlYW0gd2hpY2ggZGVzY3JpYmVzIHRoZSBwcmludGVyIHF1ZXVlLgorICAgVGhlIHN0cmVhbSBjb250aW51ZXMgdW50aWwgdGhlIGNvbm5lY3Rpb24gY2xvc2VzLiAgRW5kcyBvZiBsaW5lcyBhcmUKKyAgIGluZGljYXRlZCB3aXRoIEFTQ0lJIExGIGNvbnRyb2wgY2hhcmFjdGVycy4gIFRoZSBsaW5lcyBtYXkgYWxzbworICAgY29udGFpbiBBU0NJSSBIVCBjb250cm9sIGNoYXJhY3RlcnMuCisKKzUuNCAwNCAtIFNlbmQgcXVldWUgc3RhdGUgKGxvbmcpCisKKyAgICAgICstLS0tKy0tLS0tLS0rLS0tLSstLS0tLS0rLS0tLSsKKyAgICAgIHwgMDQgfCBRdWV1ZSB8IFNQIHwgTGlzdCB8IExGIHwKKyAgICAgICstLS0tKy0tLS0tLS0rLS0tLSstLS0tLS0rLS0tLSsKKyAgICAgIENvbW1hbmQgY29kZSAtIDQKKyAgICAgIE9wZXJhbmQgMSAtIFByaW50ZXIgcXVldWUgbmFtZQorICAgICAgT3RoZXIgb3BlcmFuZHMgLSBVc2VyIG5hbWVzIG9yIGpvYiBudW1iZXJzCisKKyAgIElmIHRoZSB1c2VyIG5hbWVzIG9yIGpvYiBudW1iZXJzIG9yIGJvdGggYXJlIHN1cHBsaWVkIHRoZW4gb25seSB0aG9zZQorICAgam9icyBmb3IgdGhvc2UgdXNlcnMgb3Igd2l0aCB0aG9zZSBudW1iZXJzIHdpbGwgYmUgc2VudC4KKworICAgVGhlIHJlc3BvbnNlIGlzIGFuIEFTQ0lJIHN0cmVhbSB3aGljaCBkZXNjcmliZXMgdGhlIHByaW50ZXIgcXVldWUuCisgICBUaGUgc3RyZWFtIGNvbnRpbnVlcyB1bnRpbCB0aGUgY29ubmVjdGlvbiBjbG9zZXMuICBFbmRzIG9mIGxpbmVzIGFyZQorICAgaW5kaWNhdGVkIHdpdGggQVNDSUkgTEYgY29udHJvbCBjaGFyYWN0ZXJzLiAgVGhlIGxpbmVzIG1heSBhbHNvCisgICBjb250YWluIEFTQ0lJIEhUIGNvbnRyb2wgY2hhcmFjdGVycy4KK11dCisKKy0tIGdldHMgc2VydmVyIGFja25vd2xlZGVtZW50Citsb2NhbCBmdW5jdGlvbiByZWN2X2Fjayhjb24pCisgIGxvY2FsIGFjayA9IGNvbi5za3Q6cmVjZWl2ZSgxKQorICBjb24udHJ5KHN0cmluZy5jaGFyKDApID09IGFjaywgImZhaWxlZCB0byByZWNlaXZlIHNlcnZlciBhY2tub3dsZWRnZW1lbnQiKQorZW5kCisKKy0tIHNlbmRzIGNsaWVudCBhY2tub3dsZWRlbWVudAorbG9jYWwgZnVuY3Rpb24gc2VuZF9hY2soY29uKQorICBsb2NhbCBzZW50ID0gY29uLnNrdDpzZW5kKHN0cmluZy5jaGFyKDApKQorICBjb24udHJ5KHNlbnQgPT0gMSwgImZhaWxlZCB0byBzZW5kIGFja25vd2xlZGdlbWVudCIpCitlbmQKKworLS0gc2VuZHMgcXVldWUgcmVxdWVzdAorLS0gNS4yIDAyIC0gUmVjZWl2ZSBhIHByaW50ZXIgam9iCistLQorLS0gICAgICAgKy0tLS0rLS0tLS0tLSstLS0tKworLS0gICAgICAgfCAwMiB8IFF1ZXVlIHwgTEYgfAorLS0gICAgICAgKy0tLS0rLS0tLS0tLSstLS0tKworLS0gICAgICAgQ29tbWFuZCBjb2RlIC0gMgorLS0gICAgICAgT3BlcmFuZCAtIFByaW50ZXIgcXVldWUgbmFtZQorLS0KKy0tICAgIFJlY2VpdmluZyBhIGpvYiBpcyBjb250cm9sbGVkIGJ5IGEgc2Vjb25kIGxldmVsIG9mIGNvbW1hbmRzLiAgVGhlCistLSAgICBkYWVtb24gaXMgZ2l2ZW4gY29tbWFuZHMgYnkgc2VuZGluZyB0aGVtIG92ZXIgdGhlIHNhbWUgY29ubmVjdGlvbi4KKy0tICAgIFRoZSBjb21tYW5kcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24gKDYpLgorLS0KKy0tICAgIEFmdGVyIHRoaXMgY29tbWFuZCBpcyBzZW50LCB0aGUgY2xpZW50IG11c3QgcmVhZCBhbiBhY2tub3dsZWRnZW1lbnQKKy0tICAgIG9jdGV0IGZyb20gdGhlIGRhZW1vbi4gIEEgcG9zaXRpdmUgYWNrbm93bGVkZ2VtZW50IGlzIGFuIG9jdGV0IG9mCistLSAgICB6ZXJvIGJpdHMuICBBIG5lZ2F0aXZlIGFja25vd2xlZGdlbWVudCBpcyBhbiBvY3RldCBvZiBhbnkgb3RoZXIKKy0tICAgIHBhdHRlcm4uCitsb2NhbCBmdW5jdGlvbiBzZW5kX3F1ZXVlKGNvbiwgcXVldWUpCisgIHF1ZXVlID0gcXVldWUgb3IgUFJJTlRFUgorICBsb2NhbCBzdHIgPSBzdHJpbmcuZm9ybWF0KCJcMiVzXDEwIiwgcXVldWUpCisgIGxvY2FsIHNlbnQgPSBjb24uc2t0OnNlbmQoc3RyKQorICBjb24udHJ5KHNlbnQgPT0gc3RyaW5nLmxlbihzdHIpLCAiZmFpbGVkIHRvIHNlbmQgcHJpbnQgcmVxdWVzdCIpCisgIHJlY3ZfYWNrKGNvbikKK2VuZAorCistLSBzZW5kcyBjb250cm9sIGZpbGUKKy0tIDYuMiAwMiAtIFJlY2VpdmUgY29udHJvbCBmaWxlCistLQorLS0gICAgICAgKy0tLS0rLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tKworLS0gICAgICAgfCAwMiB8IENvdW50IHwgU1AgfCBOYW1lIHwgTEYgfAorLS0gICAgICAgKy0tLS0rLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tKworLS0gICAgICAgQ29tbWFuZCBjb2RlIC0gMgorLS0gICAgICAgT3BlcmFuZCAxIC0gTnVtYmVyIG9mIGJ5dGVzIGluIGNvbnRyb2wgZmlsZQorLS0gICAgICAgT3BlcmFuZCAyIC0gTmFtZSBvZiBjb250cm9sIGZpbGUKKy0tCistLSAgICBUaGUgY29udHJvbCBmaWxlIG11c3QgYmUgYW4gQVNDSUkgc3RyZWFtIHdpdGggdGhlIGVuZHMgb2YgbGluZXMKKy0tICAgIGluZGljYXRlZCBieSBBU0NJSSBMRi4gIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmVhbSBpcworLS0gICAgc2VudCBhcyB0aGUgZmlyc3Qgb3BlcmFuZC4gIFRoZSBuYW1lIG9mIHRoZSBjb250cm9sIGZpbGUgaXMgc2VudCBhcworLS0gICAgdGhlIHNlY29uZC4gIEl0IHNob3VsZCBzdGFydCB3aXRoIEFTQ0lJICJjZkEiLCBmb2xsb3dlZCBieSBhIHRocmVlCistLSAgICBkaWdpdCBqb2IgbnVtYmVyLCBmb2xsb3dlZCBieSB0aGUgaG9zdCBuYW1lIHdoaWNoIGhhcyBjb25zdHJ1Y3RlZCB0aGUKKy0tICAgIGNvbnRyb2wgZmlsZS4gIEFja25vd2xlZGdlbWVudCBwcm9jZXNzaW5nIG11c3Qgb2NjdXIgYXMgdXN1YWwgYWZ0ZXIKKy0tICAgIHRoZSBjb21tYW5kIGlzIHNlbnQuCistLQorLS0gICAgVGhlIG5leHQgIk9wZXJhbmQgMSIgb2N0ZXRzIG92ZXIgdGhlIHNhbWUgVENQIGNvbm5lY3Rpb24gYXJlIHRoZQorLS0gICAgaW50ZW5kZWQgY29udGVudHMgb2YgdGhlIGNvbnRyb2wgZmlsZS4gIE9uY2UgYWxsIG9mIHRoZSBjb250ZW50cyBoYXZlCistLSAgICBiZWVuIGRlbGl2ZXJlZCwgYW4gb2N0ZXQgb2YgemVybyBiaXRzIGlzIHNlbnQgYXMgYW4gaW5kaWNhdGlvbiB0aGF0CistLSAgICB0aGUgZmlsZSBiZWluZyBzZW50IGlzIGNvbXBsZXRlLiAgQSBzZWNvbmQgbGV2ZWwgb2YgYWNrbm93bGVkZ2VtZW50CistLSAgICBwcm9jZXNzaW5nIG11c3Qgb2NjdXIgYXQgdGhpcyBwb2ludC4KKworLS0gc2VuZHMgZGF0YSBmaWxlCistLSA2LjMgMDMgLSBSZWNlaXZlIGRhdGEgZmlsZQorLS0KKy0tICAgICAgICstLS0tKy0tLS0tLS0rLS0tLSstLS0tLS0rLS0tLSsKKy0tICAgICAgIHwgMDMgfCBDb3VudCB8IFNQIHwgTmFtZSB8IExGIHwKKy0tICAgICAgICstLS0tKy0tLS0tLS0rLS0tLSstLS0tLS0rLS0tLSsKKy0tICAgICAgIENvbW1hbmQgY29kZSAtIDMKKy0tICAgICAgIE9wZXJhbmQgMSAtIE51bWJlciBvZiBieXRlcyBpbiBkYXRhIGZpbGUKKy0tICAgICAgIE9wZXJhbmQgMiAtIE5hbWUgb2YgZGF0YSBmaWxlCistLQorLS0gICAgVGhlIGRhdGEgZmlsZSBtYXkgY29udGFpbiBhbnkgOCBiaXQgdmFsdWVzIGF0IGFsbC4gIFRoZSB0b3RhbCBudW1iZXIKKy0tICAgIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW0gbWF5IGJlIHNlbnQgYXMgdGhlIGZpcnN0IG9wZXJhbmQsIG90aGVyd2lzZQorLS0gICAgdGhlIGZpZWxkIHNob3VsZCBiZSBjbGVhcmVkIHRvIDAuICBUaGUgbmFtZSBvZiB0aGUgZGF0YSBmaWxlIHNob3VsZAorLS0gICAgc3RhcnQgd2l0aCBBU0NJSSAiZGZBIi4gIFRoaXMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgdGhyZWUgZGlnaXQgam9iCistLSAgICBudW1iZXIuICBUaGUgam9iIG51bWJlciBzaG91bGQgYmUgZm9sbG93ZWQgYnkgdGhlIGhvc3QgbmFtZSB3aGljaCBoYXMKKy0tICAgIGNvbnN0cnVjdGVkIHRoZSBkYXRhIGZpbGUuICBJbnRlcnByZXRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgdGhlCistLSAgICBkYXRhIGZpbGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbAorLS0gICAgZmlsZS4gIElmIGEgZGF0YSBmaWxlIGxlbmd0aCBoYXMgYmVlbiBzcGVjaWZpZWQsIHRoZSBuZXh0ICJPcGVyYW5kIDEiCistLSAgICBvY3RldHMgb3ZlciB0aGUgc2FtZSBUQ1AgY29ubmVjdGlvbiBhcmUgdGhlIGludGVuZGVkIGNvbnRlbnRzIG9mIHRoZQorLS0gICAgZGF0YSBmaWxlLiAgSW4gdGhpcyBjYXNlLCBvbmNlIGFsbCBvZiB0aGUgY29udGVudHMgaGF2ZSBiZWVuCistLSAgICBkZWxpdmVyZWQsIGFuIG9jdGV0IG9mIHplcm8gYml0cyBpcyBzZW50IGFzIGFuIGluZGljYXRpb24gdGhhdCB0aGUKKy0tICAgIGZpbGUgYmVpbmcgc2VudCBpcyBjb21wbGV0ZS4gIEEgc2Vjb25kIGxldmVsIG9mIGFja25vd2xlZGdlbWVudAorLS0gICAgcHJvY2Vzc2luZyBtdXN0IG9jY3VyIGF0IHRoaXMgcG9pbnQuCisKKworbG9jYWwgZnVuY3Rpb24gc2VuZF9oZHIoY29uLCBjb250cm9sKQorICBsb2NhbCBzZW50ID0gY29uLnNrdDpzZW5kKGNvbnRyb2wpCisgIGNvbi50cnkoc2VudCBhbmQgc2VudCA+PSAxICwgImZhaWxlZCB0byBzZW5kIGhlYWRlciBmaWxlIikKKyAgcmVjdl9hY2soY29uKQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHNlbmRfY29udHJvbChjb24sIGNvbnRyb2wpCisgIGxvY2FsIHNlbnQgPSBjb24uc2t0OnNlbmQoY29udHJvbCkKKyAgY29uLnRyeShzZW50IGFuZCBzZW50ID49IDEsICJmYWlsZWQgdG8gc2VuZCBjb250cm9sIGZpbGUiKQorICBzZW5kX2Fjayhjb24pCitlbmQKKworbG9jYWwgZnVuY3Rpb24gc2VuZF9kYXRhKGNvbixmaCxzaXplKQorICBsb2NhbCBidWYKKyAgd2hpbGUgc2l6ZSA+IDAgZG8KKyAgICBidWYsbWVzc2FnZSA9IGZoOnJlYWQoODE5MikKKyAgICBpZiBidWYgdGhlbgorICAgICAgc3QgPSBjb24udHJ5KGNvbi5za3Q6c2VuZChidWYpKQorICAgICAgc2l6ZSA9IHNpemUgLSBzdAorICAgIGVsc2UKKyAgICAgIGNvbi50cnkoc2l6ZSA9PSAwLCAiZmlsZSBzaXplIG1pc21hdGNoIikKKyAgICBlbmQKKyAgZW5kCisgIHJlY3ZfYWNrKGNvbikgLS0gbm90ZSB0aGUgZG91YmxlIGFja25vd2xlZGdlbWVudAorICBzZW5kX2Fjayhjb24pCisgIHJlY3ZfYWNrKGNvbikKKyAgcmV0dXJuIHNpemUKK2VuZAorCisKKy0tW1sKK2xvY2FsIGNvbnRyb2xfZGZsdCA9IHsKKyAgIkgiLi5zdHJpbmcuc3ViKHNvY2tldC5ob3N0bmFtZSwxLDMxKS4uIlwxMCIsICAgICAgICAtLSBob3N0CisgICJDIi4uc3RyaW5nLnN1Yihzb2NrZXQuaG9zdG5hbWUsMSwzMSkuLiJcMTAiLCAgICAgICAgLS0gY2xhc3MKKyAgIkoiLi5zdHJpbmcuc3ViKGZpbGVuYW1lLDEsOTkpLi4iXDEwIiwgICAgICAgICAgICAgICAtLSBqb2JuYW1lCisgICJMIi4uc3RyaW5nLnN1Yih1c2VyLDEsMzEpLi4iXDEwIiwgICAgICAgICAgICAgICAgICAgLS0gcHJpbnQgYmFubmVyIHBhZ2UKKyAgIkkiLi50b251bWJlcihpbmRlbnQpLi4iXDEwIiwgICAgICAgICAgICAgICAgICAgICAgICAtLSBpbmRlbnQgY29sdW1uIGNvdW50ICgnZicgb25seSkKKyAgIk0iLi5zdHJpbmcuc3ViKG1haWwsMSwxMjgpLi4iXDEwIiwgICAgICAgICAgICAgICAgICAtLSBtYWlsIHdoZW4gcHJpbnRlZCB1c2VyQGhvc3QKKyAgIk4iLi5zdHJpbmcuc3ViKGZpbGVuYW1lLDEsMTMxKS4uIlwxMCIsICAgICAgICAgICAgICAtLSBuYW1lIG9mIHNvdXJjZSBmaWxlCisgICJQIi4uc3RyaW5nLnN1Yih1c2VyLDEsMzEpLi4iXDEwIiwgICAgICAgICAgICAgICAgICAgLS0gdXNlciBuYW1lCisgICJUIi4uc3RyaW5nLnN1Yih0aXRsZSwxLDc5KS4uIlwxMCIsICAgICAgICAgICAgICAgICAgLS0gdGl0bGUgZm9yIGJhbm5lciAoJ3AnIG9ubHkpCisgICJXIi4udG9udW1iZXIod2lkdGggb3IgMTMyKS4uIlwxMCIsICAgICAgICAgICAgICAgICAgLS0gd2lkdGggb2YgcHJpbnQgZixsLHAgb25seQorCisgICJmIi4uZmlsZS4uIlwxMCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gZm9ybWF0dGVkIHByaW50IChyZW1vdmUgY29udHJvbCBjaGFycykKKyAgImwiLi5maWxlLi4iXDEwIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBwcmludAorICAibyIuLmZpbGUuLiJcMTAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHBvc3RzY3JpcHQKKyAgInAiLi5maWxlLi4iXDEwIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBwciBmb3JtYXQgLSByZXF1aXJlcyBULCBMCisgICJyIi4uZmlsZS4uIlwxMCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gZm9ydHJhbiBmb3JtYXQKKyAgIlUiLi5maWxlLi4iXDEwIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBVbmxpbmsgKGRhdGEgZmlsZSBvbmx5KQorfQorXV0KKworLS0gZ2VuZXJhdGUgYSB2YXJ5aW5nIGpvYiBudW1iZXIKK2xvY2FsIHNlcSA9IDAKK2xvY2FsIGZ1bmN0aW9uIG5ld2pvYihjb25uZWN0aW9uKQorICAgIHNlcSA9IHNlcSArIDEKKyAgICByZXR1cm4gbWF0aC5mbG9vcihzb2NrZXQuZ2V0dGltZSgpICogMTAwMCArIHNlcSklMTAwMAorZW5kCisKKworbG9jYWwgZm9ybWF0X2NvZGVzID0geworICBiaW5hcnkgPSAnbCcsCisgIHRleHQgPSAnZicsCisgIHBzID0gJ28nLAorICBwciA9ICdwJywKKyAgZm9ydHJhbiA9ICdyJywKKyAgbCA9ICdsJywKKyAgciA9ICdyJywKKyAgbyA9ICdvJywKKyAgcCA9ICdwJywKKyAgZiA9ICdmJworfQorCistLSBscC5zZW5ke29wdGlvbn0KKy0tIHJlcXVpcmVzIG9wdGlvbi5maWxlCisKK3NlbmQgPSBzb2NrZXQucHJvdGVjdChmdW5jdGlvbihvcHRpb24pCisgIHNvY2tldC50cnkob3B0aW9uIGFuZCBiYXNlLnR5cGUob3B0aW9uKSA9PSAidGFibGUiLCAiaW52YWxpZCBvcHRpb25zIikKKyAgbG9jYWwgZmlsZSA9IG9wdGlvbi5maWxlCisgIHNvY2tldC50cnkoZmlsZSwgImludmFsaWQgZmlsZSBuYW1lIikKKyAgbG9jYWwgZmggPSBzb2NrZXQudHJ5KGlvLm9wZW4oZmlsZSwicmIiKSkKKyAgbG9jYWwgZGF0YWZpbGVfc2l6ZSA9IGZoOnNlZWsoImVuZCIpIC0tIGdldCB0b3RhbCBzaXplCisgIGZoOnNlZWsoInNldCIpICAgICAgICAgICAgICAgICAgICAgICAtLSBnbyBiYWNrIHRvIHN0YXJ0IG9mIGZpbGUKKyAgbG9jYWwgbG9jYWxob3N0ID0gc29ja2V0LmRucy5nZXRob3N0bmFtZSgpIG9yIG9zLmdldGVudigiQ09NUFVURVJOQU1FIikKKyAgICBvciAibG9jYWxob3N0IgorICBsb2NhbCBjb24gPSBjb25uZWN0KGxvY2FsaG9zdCwgb3B0aW9uKQorLS0gZm9ybWF0IHRoZSBjb250cm9sIGZpbGUKKyAgbG9jYWwgam9ibm8gPSBuZXdqb2IoKQorICBsb2NhbCBsb2NhbGlwID0gc29ja2V0LmRucy50b2lwKGxvY2FsaG9zdCkKKyAgbG9jYWxob3N0ID0gc3RyaW5nLnN1Yihsb2NhbGhvc3QsMSwzMSkKKyAgbG9jYWwgdXNlciA9IHN0cmluZy5zdWIob3B0aW9uLnVzZXIgb3Igb3MuZ2V0ZW52KCJMUFJVU0VSIikgb3IKKyAgICBvcy5nZXRlbnYoIlVTRVJOQU1FIikgb3Igb3MuZ2V0ZW52KCJVU0VSIikgb3IgImFub255bW91cyIsIDEsMzEpCisgIGxvY2FsIGxwZmlsZSA9IHN0cmluZy5mb3JtYXQoImRmQSUzLjNkJS1zIiwgam9ibm8sIGxvY2FsaG9zdCk7CisgIGxvY2FsIGZtdCA9IGZvcm1hdF9jb2Rlc1tvcHRpb24uZm9ybWF0XSBvciAnbCcKKyAgbG9jYWwgY2xhc3MgPSBzdHJpbmcuc3ViKG9wdGlvbi5jbGFzcyBvciBsb2NhbGlwIG9yIGxvY2FsaG9zdCwxLDMxKQorICBsb2NhbCBfLF8sY3RsZm4gPSBzdHJpbmcuZmluZChmaWxlLCIuKlslLyVcXF0oLiopIikKKyAgY3RsZm4gPSBzdHJpbmcuc3ViKGN0bGZuICBvciBmaWxlLDEsMTMxKQorCWxvY2FsIGNmaWxlID0KKwkgIHN0cmluZy5mb3JtYXQoIkglLXNcbkMlLXNcbkolLXNcblAlLXNcbiUuMXMlLXNcblUlLXNcbk4lLXNcbiIsCisJICBsb2NhbGhvc3QsCisgICAgY2xhc3MsCisJICBvcHRpb24uam9iIG9yICJMdWFTb2NrZXQiLAorICAgIHVzZXIsCisgICAgZm10LCBscGZpbGUsCisgICAgbHBmaWxlLAorICAgIGN0bGZuKTsgLS0gbWFuZGF0b3J5IHBhcnQgb2YgY3RsIGZpbGUKKyAgaWYgKG9wdGlvbi5iYW5uZXIpIHRoZW4gY2ZpbGUgPSBjZmlsZSAuLiAnTCcuLnVzZXIuLidcMTAnIGVuZAorICBpZiAob3B0aW9uLmluZGVudCkgdGhlbiBjZmlsZSA9IGNmaWxlIC4uICdJJy4uYmFzZS50b251bWJlcihvcHRpb24uaW5kZW50KS4uJ1wxMCcgZW5kCisgIGlmIChvcHRpb24ubWFpbCkgdGhlbiBjZmlsZSA9IGNmaWxlIC4uICdNJy4uc3RyaW5nLnN1Yigob3B0aW9uLm1haWwpLDEsMTI4KS4uJ1wxMCcgZW5kCisgIGlmIChmbXQgPT0gJ3AnIGFuZCBvcHRpb24udGl0bGUpIHRoZW4gY2ZpbGUgPSBjZmlsZSAuLiAnVCcuLnN0cmluZy5zdWIoKG9wdGlvbi50aXRsZSksMSw3OSkuLidcMTAnIGVuZAorICBpZiAoKGZtdCA9PSAncCcgb3IgZm10ID09ICdsJyBvciBmbXQgPT0gJ2YnKSBhbmQgb3B0aW9uLndpZHRoKSB0aGVuCisgICAgY2ZpbGUgPSBjZmlsZSAuLiAnVycuLmJhc2UudG9udW1iZXIob3B0aW9uLHdpZHRoKS4uJ1wxMCcKKyAgZW5kCisKKyAgY29uLnNrdDpzZXR0aW1lb3V0KG9wdGlvbi50aW1lb3V0IG9yIDY1KQorLS0gc2VuZCB0aGUgcXVldWUgaGVhZGVyCisgIHNlbmRfcXVldWUoY29uLCBvcHRpb24ucXVldWUpCistLSBzZW5kIHRoZSBjb250cm9sIGZpbGUgaGVhZGVyCisgIGxvY2FsIGNmaWxlY21kID0gc3RyaW5nLmZvcm1hdCgiXDIlZCBjZkElMy4zZCUtc1xuIixzdHJpbmcubGVuKGNmaWxlKSwgam9ibm8sIGxvY2FsaG9zdCk7CisgIHNlbmRfaGRyKGNvbixjZmlsZWNtZCkKKworLS0gc2VuZCB0aGUgY29udHJvbCBmaWxlCisgIHNlbmRfY29udHJvbChjb24sY2ZpbGUpCisKKy0tIHNlbmQgdGhlIGRhdGEgZmlsZSBoZWFkZXIKKyAgbG9jYWwgZGZpbGVjbWQgPSBzdHJpbmcuZm9ybWF0KCJcMyVkIGRmQSUzLjNkJS1zXG4iLGRhdGFmaWxlX3NpemUsIGpvYm5vLCBsb2NhbGhvc3QpOworICBzZW5kX2hkcihjb24sZGZpbGVjbWQpCisKKy0tIHNlbmQgdGhlIGRhdGEgZmlsZQorICBzZW5kX2RhdGEoY29uLGZoLGRhdGFmaWxlX3NpemUpCisgIGZoOmNsb3NlKCkKKyAgY29uLnNrdDpjbG9zZSgpOworICByZXR1cm4gam9ibm8sIGRhdGFmaWxlX3NpemUKK2VuZCkKKworLS0KKy0tIGxwLnF1ZXJ5KHtob3N0PSxxdWV1ZT1wcmludGVyfCcqJywgZm9ybWF0PSdsJ3wncycsIGxpc3Q9fSkKKy0tCitxdWVyeSA9IHNvY2tldC5wcm90ZWN0KGZ1bmN0aW9uKHApCisgIHAgPSBwIG9yIHt9CisgIGxvY2FsIGxvY2FsaG9zdCA9IHNvY2tldC5kbnMuZ2V0aG9zdG5hbWUoKSBvciBvcy5nZXRlbnYoIkNPTVBVVEVSTkFNRSIpCisgICAgb3IgImxvY2FsaG9zdCIKKyAgbG9jYWwgY29uID0gY29ubmVjdChsb2NhbGhvc3QscCkKKyAgbG9jYWwgZm10CisgIGlmIHN0cmluZy5zdWIocC5mb3JtYXQgb3IgJ3MnLDEsMSkgPT0gJ3MnIHRoZW4gZm10ID0gMyBlbHNlIGZtdCA9IDQgZW5kCisgIGNvbi50cnkoY29uLnNrdDpzZW5kKHN0cmluZy5mb3JtYXQoIiVjJXMgJXNcbiIsIGZtdCwgcC5xdWV1ZSBvciAiKiIsCisgICAgcC5saXN0IG9yICIiKSkpCisgIGxvY2FsIGRhdGEgPSBjb24udHJ5KGNvbi5za3Q6cmVjZWl2ZSgiKmEiKSkKKyAgY29uLnNrdDpjbG9zZSgpCisgIHJldHVybiBkYXRhCitlbmQpCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvZXRjL3FwLmx1YSBiL2x1YXNvY2tldC0yLjAuMi9ldGMvcXAubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzBjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL3FwLmx1YQpAQCAtMCwwICsxLDI0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gTGl0dGxlIHByb2dyYW0gdG8gY29udmVydCB0byBhbmQgZnJvbSBRdW90ZWQtUHJpbnRhYmxlCistLSBMdWFTb2NrZXQgc2FtcGxlIGZpbGVzCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogcXAubHVhLHYgMS41IDIwMDQvMDYvMTcgMjE6NDY6MjIgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKK2xvY2FsIG1pbWUgPSByZXF1aXJlKCJtaW1lIikKK2xvY2FsIGNvbnZlcnQKK2FyZyA9IGFyZyBvciB7fQorbG9jYWwgbW9kZSA9IGFyZyBhbmQgYXJnWzFdIG9yICItZXQiCitpZiBtb2RlID09ICItZXQiIHRoZW4KKyAgICBsb2NhbCBub3JtYWxpemUgPSBtaW1lLm5vcm1hbGl6ZSgpCisgICAgbG9jYWwgcXAgPSBtaW1lLmVuY29kZSgicXVvdGVkLXByaW50YWJsZSIpCisgICAgbG9jYWwgd3JhcCA9IG1pbWUud3JhcCgicXVvdGVkLXByaW50YWJsZSIpCisgICAgY29udmVydCA9IGx0bjEyLmZpbHRlci5jaGFpbihub3JtYWxpemUsIHFwLCB3cmFwKQorZWxzZWlmIG1vZGUgPT0gIi1lYiIgdGhlbgorICAgIGxvY2FsIHFwID0gbWltZS5lbmNvZGUoInF1b3RlZC1wcmludGFibGUiLCAiYmluYXJ5IikKKyAgICBsb2NhbCB3cmFwID0gbWltZS53cmFwKCJxdW90ZWQtcHJpbnRhYmxlIikKKyAgICBjb252ZXJ0ID0gbHRuMTIuZmlsdGVyLmNoYWluKHFwLCB3cmFwKQorZWxzZSBjb252ZXJ0ID0gbWltZS5kZWNvZGUoInF1b3RlZC1wcmludGFibGUiKSBlbmQKK2xvY2FsIHNvdXJjZSA9IGx0bjEyLnNvdXJjZS5jaGFpbihsdG4xMi5zb3VyY2UuZmlsZShpby5zdGRpbiksIGNvbnZlcnQpCitsb2NhbCBzaW5rID0gbHRuMTIuc2luay5maWxlKGlvLnN0ZG91dCkKK2x0bjEyLnB1bXAuYWxsKHNvdXJjZSwgc2luaykKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9ldGMvdGZ0cC5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL3RmdHAubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZWFmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvZXRjL3RmdHAubHVhCkBAIC0wLDAgKzEsMTU1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVEZUUCBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlCistLSBMdWFTb2NrZXQgdG9vbGtpdC4KKy0tIEF1dGhvcjogRGllZ28gTmVoYWIKKy0tIFJDUyBJRDogJElkOiB0ZnRwLmx1YSx2IDEuMTYgMjAwNS8xMS8yMiAwODozMzoyOSBkaWVnbyBFeHAgJAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIExvYWQgcmVxdWlyZWQgZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBiYXNlID0gX0cKK2xvY2FsIHRhYmxlID0gcmVxdWlyZSgidGFibGUiKQorbG9jYWwgbWF0aCA9IHJlcXVpcmUoIm1hdGgiKQorbG9jYWwgc3RyaW5nID0gcmVxdWlyZSgic3RyaW5nIikKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKK2xvY2FsIHVybCA9IHJlcXVpcmUoInNvY2tldC51cmwiKQorbW9kdWxlKCJzb2NrZXQudGZ0cCIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQcm9ncmFtIGNvbnN0YW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGNoYXIgPSBzdHJpbmcuY2hhcgorbG9jYWwgYnl0ZSA9IHN0cmluZy5ieXRlCisKK1BPUlQgPSA2OQorbG9jYWwgT1BfUlJRID0gMQorbG9jYWwgT1BfV1JRID0gMgorbG9jYWwgT1BfREFUQSA9IDMKK2xvY2FsIE9QX0FDSyA9IDQKK2xvY2FsIE9QX0VSUk9SID0gNQorbG9jYWwgT1BfSU5WID0geyJSUlEiLCAiV1JRIiwgIkRBVEEiLCAiQUNLIiwgIkVSUk9SIn0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBhY2tldCBjcmVhdGlvbiBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBmdW5jdGlvbiBSUlEoc291cmNlLCBtb2RlKQorCXJldHVybiBjaGFyKDAsIE9QX1JSUSkgLi4gc291cmNlIC4uIGNoYXIoMCkgLi4gbW9kZSAuLiBjaGFyKDApCitlbmQKKworbG9jYWwgZnVuY3Rpb24gV1JRKHNvdXJjZSwgbW9kZSkKKwlyZXR1cm4gY2hhcigwLCBPUF9SUlEpIC4uIHNvdXJjZSAuLiBjaGFyKDApIC4uIG1vZGUgLi4gY2hhcigwKQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIEFDSyhibG9jaykKKwlsb2NhbCBsb3csIGhpZ2gKKwlsb3cgPSBtYXRoLm1vZChibG9jaywgMjU2KQorCWhpZ2ggPSAoYmxvY2sgLSBsb3cpLzI1NgorCXJldHVybiBjaGFyKDAsIE9QX0FDSywgaGlnaCwgbG93KQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGdldF9PUChkZ3JhbSkKKyAgICBsb2NhbCBvcCA9IGJ5dGUoZGdyYW0sIDEpKjI1NiArIGJ5dGUoZGdyYW0sIDIpCisgICAgcmV0dXJuIG9wCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBhY2tldCBhbmFseXNpcyBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBmdW5jdGlvbiBzcGxpdF9EQVRBKGRncmFtKQorCWxvY2FsIGJsb2NrID0gYnl0ZShkZ3JhbSwgMykqMjU2ICsgYnl0ZShkZ3JhbSwgNCkKKwlsb2NhbCBkYXRhID0gc3RyaW5nLnN1YihkZ3JhbSwgNSkKKwlyZXR1cm4gYmxvY2ssIGRhdGEKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBnZXRfRVJST1IoZGdyYW0pCisJbG9jYWwgY29kZSA9IGJ5dGUoZGdyYW0sIDMpKjI1NiArIGJ5dGUoZGdyYW0sIDQpCisJbG9jYWwgbXNnCisJXyxfLCBtc2cgPSBzdHJpbmcuZmluZChkZ3JhbSwgIiguKilcMDAwIiwgNSkKKwlyZXR1cm4gc3RyaW5nLmZvcm1hdCgiZXJyb3IgY29kZSAlZDogJXMiLCBjb2RlLCBtc2cpCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFRoZSByZWFsIHdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBmdW5jdGlvbiB0Z2V0KGdldHQpCisgICAgbG9jYWwgcmV0cmllcywgZGdyYW0sIHNlbnQsIGRhdGFob3N0LCBkYXRhcG9ydCwgY29kZQorICAgIGxvY2FsIGxhc3QgPSAwCisgICAgc29ja2V0LnRyeShnZXR0Lmhvc3QsICJtaXNzaW5nIGhvc3QiKQorCWxvY2FsIGNvbiA9IHNvY2tldC50cnkoc29ja2V0LnVkcCgpKQorICAgIGxvY2FsIHRyeSA9IHNvY2tldC5uZXd0cnkoZnVuY3Rpb24oKSBjb246Y2xvc2UoKSBlbmQpCisgICAgLS0gY29udmVydCBmcm9tIG5hbWUgdG8gaXAgaWYgbmVlZGVkCisJZ2V0dC5ob3N0ID0gdHJ5KHNvY2tldC5kbnMudG9pcChnZXR0Lmhvc3QpKQorCWNvbjpzZXR0aW1lb3V0KDEpCisgICAgLS0gZmlyc3QgcGFja2V0IGdpdmVzIGRhdGEgaG9zdC9wb3J0IHRvIGJlIHVzZWQgZm9yIGRhdGEgdHJhbnNmZXJzCisgICAgbG9jYWwgcGF0aCA9IHN0cmluZy5nc3ViKGdldHQucGF0aCBvciAiIiwgIl4vIiwgIiIpCisgICAgcGF0aCA9IHVybC51bmVzY2FwZShwYXRoKQorICAgIHJldHJpZXMgPSAwCisJcmVwZWF0CisJCXNlbnQgPSB0cnkoY29uOnNlbmR0byhSUlEocGF0aCwgIm9jdGV0IiksIGdldHQuaG9zdCwgZ2V0dC5wb3J0KSkKKwkJZGdyYW0sIGRhdGFob3N0LCBkYXRhcG9ydCA9IGNvbjpyZWNlaXZlZnJvbSgpCisgICAgICAgIHJldHJpZXMgPSByZXRyaWVzICsgMQorCXVudGlsIGRncmFtIG9yIGRhdGFob3N0IH49ICJ0aW1lb3V0IiBvciByZXRyaWVzID4gNQorCXRyeShkZ3JhbSwgZGF0YWhvc3QpCisgICAgLS0gYXNzb2NpYXRlIHNvY2tldCB3aXRoIGRhdGEgaG9zdC9wb3J0CisJdHJ5KGNvbjpzZXRwZWVybmFtZShkYXRhaG9zdCwgZGF0YXBvcnQpKQorICAgIC0tIGRlZmF1bHQgc2luaworICAgIGxvY2FsIHNpbmsgPSBnZXR0LnNpbmsgb3IgbHRuMTIuc2luay5udWxsKCkKKyAgICAtLSBwcm9jZXNzIGFsbCBkYXRhIHBhY2tldHMKKwl3aGlsZSAxIGRvCisgICAgICAgIC0tIGRlY29kZSBwYWNrZXQKKwkJY29kZSA9IGdldF9PUChkZ3JhbSkKKwkJdHJ5KGNvZGUgfj0gT1BfRVJST1IsIGdldF9FUlJPUihkZ3JhbSkpCisgICAgICAgIHRyeShjb2RlID09IE9QX0RBVEEsICJ1bmhhbmRsZWQgb3Bjb2RlICIgLi4gY29kZSkKKyAgICAgICAgLS0gZ2V0IGRhdGEgcGFja2V0IHBhcnRzCisJCWxvY2FsIGJsb2NrLCBkYXRhID0gc3BsaXRfREFUQShkZ3JhbSkKKyAgICAgICAgLS0gaWYgbm90IHJlcGVhdGVkLCB3cml0ZQorICAgICAgICBpZiBibG9jayA9PSBsYXN0KzEgdGhlbgorCQkgICAgdHJ5KHNpbmsoZGF0YSkpCisgICAgICAgICAgICBsYXN0ID0gYmxvY2sKKyAgICAgICAgZW5kCisgICAgICAgIC0tIGxhc3QgcGFja2V0IGJyaW5ncyBsZXNzIHRoYW4gNTEyIGJ5dGVzIG9mIGRhdGEKKwkJaWYgc3RyaW5nLmxlbihkYXRhKSA8IDUxMiB0aGVuCisgICAgICAgICAgICB0cnkoY29uOnNlbmQoQUNLKGJsb2NrKSkpCisgICAgICAgICAgICB0cnkoY29uOmNsb3NlKCkpCisgICAgICAgICAgICB0cnkoc2luayhuaWwpKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZW5kCisgICAgICAgIC0tIGdldCB0aGUgbmV4dCBwYWNrZXQKKyAgICAgICAgcmV0cmllcyA9IDAKKwkJcmVwZWF0CisJCQlzZW50ID0gdHJ5KGNvbjpzZW5kKEFDSyhsYXN0KSkpCisJCQlkZ3JhbSwgZXJyID0gY29uOnJlY2VpdmUoKQorICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMgKyAxCisJCXVudGlsIGRncmFtIG9yIGVyciB+PSAidGltZW91dCIgb3IgcmV0cmllcyA+IDUKKwkJdHJ5KGRncmFtLCBlcnIpCisJZW5kCitlbmQKKworbG9jYWwgZGVmYXVsdCA9IHsKKyAgICBwb3J0ID0gUE9SVCwKKyAgICBwYXRoID0iLyIsCisgICAgc2NoZW1lID0gInRmdHAiCit9CisKK2xvY2FsIGZ1bmN0aW9uIHBhcnNlKHUpCisgICAgbG9jYWwgdCA9IHNvY2tldC50cnkodXJsLnBhcnNlKHUsIGRlZmF1bHQpKQorICAgIHNvY2tldC50cnkodC5zY2hlbWUgPT0gInRmdHAiLCAiaW52YWxpZCBzY2hlbWUgJyIgLi4gdC5zY2hlbWUgLi4gIiciKQorICAgIHNvY2tldC50cnkodC5ob3N0LCAiaW52YWxpZCBob3N0IikKKyAgICByZXR1cm4gdAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHNnZXQodSkKKyAgICBsb2NhbCBnZXR0ID0gcGFyc2UodSkKKyAgICBsb2NhbCB0ID0ge30KKyAgICBnZXR0LnNpbmsgPSBsdG4xMi5zaW5rLnRhYmxlKHQpCisgICAgdGdldChnZXR0KQorICAgIHJldHVybiB0YWJsZS5jb25jYXQodCkKK2VuZAorCitnZXQgPSBzb2NrZXQucHJvdGVjdChmdW5jdGlvbihnZXR0KQorICAgIGlmIGJhc2UudHlwZShnZXR0KSA9PSAic3RyaW5nIiB0aGVuIHJldHVybiBzZ2V0KGdldHQpCisgICAgZWxzZSByZXR1cm4gdGdldChnZXR0KSBlbmQKK2VuZCkKKwpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL2x1YXNvY2tldC5zbG4gYi9sdWFzb2NrZXQtMi4wLjIvbHVhc29ja2V0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc0YzMzCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL2x1YXNvY2tldC5zbG4KQEAgLTAsMCArMSwzNyBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOC4wMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAic29ja2V0IiwgInNvY2tldC52Y3Byb2oiLCAiezY2RTNDRTE0LTg4NEQtNEFFQS05RjIwLTE1QTBCRUFGOEM1QX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJtaW1lIiwgIm1pbWUudmNwcm9qIiwgInsxMjhFOEJEMC0xNzRBLTQ4RjAtODc3MS05MkIxRThEMTg3MTN9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGlibHVhc29ja2V0IiwgImxpYmx1YXNvY2tldC52Y3Byb2oiLCAiezU5OUVBRDQwLTYwRUUtNDA0My05QzE0LUFFMDkwQThBMDkyRH0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1ZyA9IERlYnVnDQorCQlSZWxlYXNlID0gUmVsZWFzZQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQorCQl7NjZFM0NFMTQtODg0RC00QUVBLTlGMjAtMTVBMEJFQUY4QzVBfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezY2RTNDRTE0LTg4NEQtNEFFQS05RjIwLTE1QTBCRUFGOEM1QX0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7NjZFM0NFMTQtODg0RC00QUVBLTlGMjAtMTVBMEJFQUY4QzVBfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs2NkUzQ0UxNC04ODRELTRBRUEtOUYyMC0xNUEwQkVBRjhDNUF9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsxMjhFOEJEMC0xNzRBLTQ4RjAtODc3MS05MkIxRThEMTg3MTN9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MTI4RThCRDAtMTc0QS00OEYwLTg3NzEtOTJCMUU4RDE4NzEzfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsxMjhFOEJEMC0xNzRBLTQ4RjAtODc3MS05MkIxRThEMTg3MTN9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezEyOEU4QkQwLTE3NEEtNDhGMC04NzcxLTkyQjFFOEQxODcxM30uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezU5OUVBRDQwLTYwRUUtNDA0My05QzE0LUFFMDkwQThBMDkyRH0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs1OTlFQUQ0MC02MEVFLTQwNDMtOUMxNC1BRTA5MEE4QTA5MkR9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezU5OUVBRDQwLTYwRUUtNDA0My05QzE0LUFFMDkwQThBMDkyRH0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NTk5RUFENDAtNjBFRS00MDQzLTlDMTQtQUUwOTBBOEEwOTJEfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlBZGRJbnMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvbWFrZWZpbGUgYi9sdWFzb2NrZXQtMi4wLjIvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3MDAzOQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9tYWtlZmlsZQpAQCAtMCwwICsxLDUxIEBACisjLS0tLS0tCisjIExvYWQgY29uZmlndXJhdGlvbgorIworaW5jbHVkZSBjb25maWcKKworIy0tLS0tLQorIyBIb3BlZnVsbHkgbm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lCisjCitJTlNUQUxMX1NPQ0tFVF9TSEFSRT0kKElOU1RBTExfVE9QX1NIQVJFKS9zb2NrZXQKK0lOU1RBTExfU09DS0VUX0xJQj0kKElOU1RBTExfVE9QX0xJQikvc29ja2V0CitJTlNUQUxMX01JTUVfU0hBUkU9JChJTlNUQUxMX1RPUF9TSEFSRSkvbWltZQorSU5TVEFMTF9NSU1FX0xJQj0kKElOU1RBTExfVE9QX0xJQikvbWltZQorCithbGwgY2xlYW46CisJY2Qgc3JjOyAkKE1BS0UpICRACisKKyMtLS0tLS0KKyMgRmlsZXMgdG8gaW5zdGFsbAorIworVE9fU09DS0VUX1NIQVJFOj0gXAorCWh0dHAubHVhIFwKKwl1cmwubHVhIFwKKwl0cC5sdWEgXAorCWZ0cC5sdWEgXAorCXNtdHAubHVhCisKK1RPX1RPUF9TSEFSRTo9IFwKKwlsdG4xMi5sdWEgXAorCXNvY2tldC5sdWEgXAorCW1pbWUubHVhCisKK1RPX01JTUVfU0hBUkU6PSAKKworIy0tLS0tLQorIyBJbnN0YWxsIEx1YVNvY2tldCBhY2NvcmRpbmcgdG8gcmVjb21tZW5kYXRpb24KKyMKK2luc3RhbGw6IGFsbAorCWNkIHNyYzsgbWtkaXIgLXAgJChJTlNUQUxMX1RPUF9TSEFSRSkKKwljZCBzcmM7ICQoSU5TVEFMTF9EQVRBKSAkKFRPX1RPUF9TSEFSRSkgJChJTlNUQUxMX1RPUF9TSEFSRSkKKwljZCBzcmM7IG1rZGlyIC1wICQoSU5TVEFMTF9TT0NLRVRfU0hBUkUpCisJY2Qgc3JjOyAkKElOU1RBTExfREFUQSkgJChUT19TT0NLRVRfU0hBUkUpICQoSU5TVEFMTF9TT0NLRVRfU0hBUkUpCisJY2Qgc3JjOyBta2RpciAtcCAkKElOU1RBTExfU09DS0VUX0xJQikKKwljZCBzcmM7ICQoSU5TVEFMTF9FWEVDKSAkKFNPQ0tFVF9TTykgJChJTlNUQUxMX1NPQ0tFVF9MSUIpL2NvcmUuJChFWFQpCisJI2NkIHNyYzsgbWtkaXIgLXAgJChJTlNUQUxMX01JTUVfU0hBUkUpCisJI2NkIHNyYzsgJChJTlNUQUxMX0RBVEEpICQoVE9fTUlNRV9TSEFSRSkgJChJTlNUQUxMX01JTUVfU0hBUkUpCisJY2Qgc3JjOyBta2RpciAtcCAkKElOU1RBTExfTUlNRV9MSUIpCisJY2Qgc3JjOyAkKElOU1RBTExfRVhFQykgJChNSU1FX1NPKSAkKElOU1RBTExfTUlNRV9MSUIpL2NvcmUuJChFWFQpCisKKyMtLS0tLS0KKyMgRW5kIG9mIG1ha2VmaWxlCisjCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvbWltZS52Y3Byb2ogYi9sdWFzb2NrZXQtMi4wLjIvbWltZS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkNzkwMAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9taW1lLnZjcHJvagpAQCAtMCwwICsxLDE0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Im1pbWUiDQorCVByb2plY3RHVUlEPSJ7MTI4RThCRDAtMTc0QS00OEYwLTg3NzEtOTJCMUU4RDE4NzEzfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ic3JjIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ic3JjIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSJoOlxpbmNsdWRlXGx1YTUuMSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO01JTUVfRVhQT1JUUztNSU1FX0FQST1fX2RlY2xzcGVjKGRsbGV4cG9ydCkiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbWUuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Img6XGxpYiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbWltZS5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL21pbWUubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9InNyYyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9InNyYyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Img6XGluY2x1ZGVcbHVhNS4xIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TUlNRV9FWFBPUlRTOyBNSU1FX0FQST1fX2RlY2xzcGVjKGRsbGV4cG9ydCkiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSI0Ig0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbWUuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Img6XGxpYiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL21pbWUubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNyY1xtaW1lLmMiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9Ij4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGxpYlxsdWE1LjEuZGxsLmxpYiI+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL1JFQURNRSBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjNhNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NhbXBsZXMvUkVBRE1FCkBAIC0wLDAgKzEsNTAgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHNvbWUgc2FtcGxlIHByb2dyYW1zIHVzaW5nCitMdWFTb2NrZXQuIFRoaXMgY29kZSBpcyBub3Qgc3VwcG9ydGVkLgorCisgICAgbGlzdGVuZXIubHVhICAgICAgICAgICAgLS0gc29ja2V0IHRvIHN0ZG91dAorICAgIHRhbGtlci5sdWEgICAgICAgICAgICAgIC0tIHN0ZGluIHRvIHNvY2tldAorCitsaXN0ZW5lci5sdWEgYW5kIHRhbGtlci5sdWEgYXJlIGFib3V0ICB0aGUgc2ltcGxlc3QKK2FwcGxpY2F0aW9ucyB5b3UgY2FuIHdyaXRlICB1c2luZyAgTHVhU29ja2V0LiAgUnVuICAgCisKKwknbHVhIGxpc3RlbmVyLmx1YScgIGFuZCAgJ2x1YSB0YWxrZXIubHVhJworCitvbiBkaWZmZXJlbnQgdGVybWluYWxzLiBXaGF0ZXZlciB5b3UgdHlwZSBvbiB0YWxrLmx1YSB3aWxsCitiZSBwcmludGVkIGJ5IGxpc3Rlbi5sdWEuCisKKyAgICBscHIubHVhICAgICAgICAgICAgICAgICAtLSBscHIgY2xpZW50CisKK1RoaXMgaXMgYSBjb29sIHByb2dyYW0gd3JpdHRlbiBieSBEYXZpZCBCdXJnZXNzIHRvIHByaW50CitmaWxlcyB1c2luZyB0aGUgTGluZSBQcmludGVyIERhZW1vbiBwcm90b2NvbCwgd2lkZWx5IHVzZWQgaW4KK1VuaXggbWFjaGluZXMuICBJdCB1c2VzIHRoZSBscC5sdWEgaW1wbGVtZW50YXRpb24sIGluIHRoZQorZXRjIGRpcmVjdG9yeS4gIEp1c3QgcnVuICdsdWEgbHByLmx1YSA8ZmlsZW5hbWU+CitxdWV1ZT08cHJpbnRlcm5hbWU+JyBhbmQgdGhlIGZpbGUgd2lsbCBwcmludCEKKworICAgIGNkZGIubHVhICAgICAgICAgICAgICAgIC0tIENEREIgY2xpZW50CisKK1RoaXMgaXMgdGhlIGZpcnN0IHRyeSBvbiBhIHNpbXBsZSBDRERCIGNsaWVudC4gTm90IHJlYWxseQordXNlZnVsLCBidXQgb25lIGRheSBpdCBtaWdodCBiZWNvbWUgYSBtb2R1bGUuIAorCisgICAgZGF5dGltZWNsbnQubHVhICAgICAgICAgLS0gZGF5IHRpbWUgY2xpZW50CisKK0p1c3QgcnVuIHRoZSBwcm9ncmFtIHRvIHJldHJpZXZlIHRoZSBob3VyIGFuZCBkYXRlIGluCityZWFkYWJsZSBmb3JtIGZyb20gYW55IHNlcnZlciBydW5uaW5nIGFuIFVEUCBkYXl0aW1lIGRhZW1vbi4KKworICAgIGVjaG9jbG50Lmx1YSAgICAgICAgICAgIC0tIFVEUCBlY2hvIGNsaWVudAorICAgIGVjaG9zcnZyLmx1YSAgICAgICAgICAgIC0tIFVEUCBlY2hvIHNlcnZlcgorCitUaGVzZSBhcmUgYSBVRFAgZWNobyBjbGllbnQvc2VydmVyIHBhaXIuIFRoZXkgd29yayB3aXRoCitvdGhlciBjbGllbnQgYW5kIHNlcnZlcnMgYXMgd2VsbC4KKworICAgIHRpbnlpcmMubHVhICAgICAgICAgICAgIC0tIGlyYyBsaWtlIGJyb2FkY2FzdCBzZXJ2ZXIKKworVGhpcyBpcyBhIHNpbXBsZSBzZXJ2ZXIgdGhhdCAgd2FpdHMgc2ltdWx0YW5lb3VzbHkgb24gdHdvCitzZXJ2ZXIgc29ja2V0cyBmb3IgdGVsbmV0IGNvbm5lY3Rpb25zLiAgRXZlcnl0aGluZyBpdAorcmVjZWl2ZXMgZnJvbSAgdGhlIHRlbG5ldCBjbGllbnRzIGlzICBicm9hZGNhc3RlZCB0byAgZXZlcnkKK290aGVyICBjb25uZWN0ZWQgY2xpZW50LiAgSXQgdGVzdHMgIHRoZSBzZWxlY3QgZnVuY3Rpb24gYW5kCitzaG93cyAgaG93IHRvIGNyZWF0ZSBhIHNpbXBsZSBzZXJ2ZXIgIHdoaXRoIEx1YVNvY2tldC4gSnVzdAorcnVuIHRpbnlpcmMubHVhIGFuZCAgdGhlbiBvcGVuIGFzIG1hbnkgdGVsbmV0IGNvbm5lY3Rpb25zCithcyB5b3Ugd2FudCB0byBwb3J0cyA4MDgwIGFuZCA4MDgxLgorCitHb29kIGx1Y2ssCitEaWVnby4KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2NkZGIubHVhIGIvbHVhc29ja2V0LTIuMC4yL3NhbXBsZXMvY2RkYi5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzNzMwYwotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2NkZGIubHVhCkBAIC0wLDAgKzEsNDYgQEAKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCitsb2NhbCBodHRwID0gcmVxdWlyZSgic29ja2V0Lmh0dHAiKQorCitpZiBub3QgYXJnIG9yIG5vdCBhcmdbMV0gb3Igbm90IGFyZ1syXSB0aGVuCisgICAgcHJpbnQoImx1YXNvY2tldCBjZGRiLmx1YSA8Y2F0ZWdvcnk+IDxkaXNjLWlkPiBbPHNlcnZlcj5dIikKKyAgICBvcy5leGl0KDEpCitlbmQKKworbG9jYWwgc2VydmVyID0gYXJnWzNdIG9yICJodHRwOi8vZnJlZWRiLmZyZWVkYi5vcmcvfmNkZGIvY2RkYi5jZ2kiCisKK2Z1bmN0aW9uIHBhcnNlKGJvZHkpCisgICAgbG9jYWwgbGluZXMgPSBzdHJpbmcuZ2ZpbmQoYm9keSwgIiguLSlcclxuIikKKyAgICBsb2NhbCBzdGF0dXMgPSBsaW5lcygpCisgICAgbG9jYWwgY29kZSwgbWVzc2FnZSA9IHNvY2tldC5za2lwKDIsIHN0cmluZy5maW5kKHN0YXR1cywgIiglZCVkJWQpICguKikiKSkKKyAgICBpZiB0b251bWJlcihjb2RlKSB+PSAyMTAgdGhlbgorICAgICAgICByZXR1cm4gbmlsLCBjb2RlLCBtZXNzYWdlCisgICAgZW5kCisgICAgbG9jYWwgZGF0YSA9IHt9CisgICAgZm9yIGwgaW4gbGluZXMgZG8KKyAgICAgICAgbG9jYWwgYyA9IHN0cmluZy5zdWIobCwgMSwgMSkKKyAgICAgICAgaWYgYyB+PSAnIycgYW5kIGMgfj0gJy4nIHRoZW4KKyAgICAgICAgICAgIGxvY2FsIGtleSwgdmFsdWUgPSBzb2NrZXQuc2tpcCgyLCBzdHJpbmcuZmluZChsLCAiKC4tKT0oLiopIikpCisgICAgICAgICAgICB2YWx1ZSA9IHN0cmluZy5nc3ViKHZhbHVlLCAiXFxuIiwgIlxuIikKKyAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nLmdzdWIodmFsdWUsICJcXFxcIiwgIlxcIikKKyAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nLmdzdWIodmFsdWUsICJcXHQiLCAiXHQiKQorICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsdWUKKyAgICAgICAgZW5kCisgICAgZW5kCisgICAgcmV0dXJuIGRhdGEsIGNvZGUsIG1lc3NhZ2UgCitlbmQKKworbG9jYWwgaG9zdCA9IHNvY2tldC5kbnMuZ2V0aG9zdG5hbWUoKQorbG9jYWwgcXVlcnkgPSAiJXM/Y21kPWNkZGIrcmVhZCslcyslcyZoZWxsbz1MdWFTb2NrZXQrJXMrTHVhU29ja2V0KzIuMCZwcm90bz02IgorbG9jYWwgdXJsID0gc3RyaW5nLmZvcm1hdChxdWVyeSwgc2VydmVyLCBhcmdbMV0sIGFyZ1syXSwgaG9zdCkKK2xvY2FsIGJvZHksIGhlYWRlcnMsIGNvZGUgPSBodHRwLmdldCh1cmwpCisKK2lmIGNvZGUgPT0gMjAwIHRoZW4KKyAgICBsb2NhbCBkYXRhLCBjb2RlLCBlcnJvciA9IHBhcnNlKGJvZHkpCisgICAgaWYgbm90IGRhdGEgdGhlbgorICAgICAgICBwcmludChlcnJvciBvciBjb2RlKQorICAgIGVsc2UKKyAgICAgICAgZm9yIGksdiBpbiBwYWlycyhkYXRhKSBkbworICAgICAgICAgICAgaW8ud3JpdGUoaSwgJzogJywgdiwgJ1xuJykKKyAgICAgICAgZW5kCisgICAgZW5kCitlbHNlIHByaW50KGVycm9yKSBlbmQKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2RheXRpbWVjbG50Lmx1YSBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2RheXRpbWVjbG50Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGFiMzllCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NhbXBsZXMvZGF5dGltZWNsbnQubHVhCkBAIC0wLDAgKzEsMjMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBVRFAgc2FtcGxlOiBkYXl0aW1lIHByb3RvY29sIGNsaWVudAorLS0gTHVhU29ja2V0IHNhbXBsZSBmaWxlcworLS0gQXV0aG9yOiBEaWVnbyBOZWhhYgorLS0gUkNTIElEOiAkSWQ6IGRheXRpbWVjbG50Lmx1YSx2IDEuMTEgMjAwNC8wNi8yMSAwNjowNzo1NyBkaWVnbyBFeHAgJAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUic29ja2V0IgoraG9zdCA9IGhvc3Qgb3IgIjEyNy4wLjAuMSIKK3BvcnQgPSBwb3J0IG9yIDEzCitpZiBhcmcgdGhlbgorICAgIGhvc3QgPSBhcmdbMV0gb3IgaG9zdAorICAgIHBvcnQgPSBhcmdbMl0gb3IgcG9ydAorZW5kCitob3N0ID0gc29ja2V0LmRucy50b2lwKGhvc3QpCit1ZHAgPSBzb2NrZXQudWRwKCkKK3ByaW50KCJVc2luZyBob3N0ICciIC4uaG9zdC4uICInIGFuZCBwb3J0ICIgLi5wb3J0Li4gIi4uLiIpCit1ZHA6c2V0cGVlcm5hbWUoaG9zdCwgcG9ydCkKK3VkcDpzZXR0aW1lb3V0KDMpCitzZW50LCBlcnIgPSB1ZHA6c2VuZCgiYW55dGhpbmciKQoraWYgZXJyIHRoZW4gcHJpbnQoZXJyKSBvcy5leGl0KCkgZW5kCitkZ3JhbSwgZXJyID0gdWRwOnJlY2VpdmUoKQoraWYgbm90IGRncmFtIHRoZW4gcHJpbnQoZXJyKSBvcy5leGl0KCkgZW5kCitpby53cml0ZShkZ3JhbSkKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2VjaG9jbG50Lmx1YSBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2VjaG9jbG50Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzhiZTRjCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NhbXBsZXMvZWNob2NsbnQubHVhCkBAIC0wLDAgKzEsMjQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBVRFAgc2FtcGxlOiBlY2hvIHByb3RvY29sIGNsaWVudAorLS0gTHVhU29ja2V0IHNhbXBsZSBmaWxlcworLS0gQXV0aG9yOiBEaWVnbyBOZWhhYgorLS0gUkNTIElEOiAkSWQ6IGVjaG9jbG50Lmx1YSx2IDEuMTAgMjAwNS8wMS8wMiAyMjo0NDowMCBkaWVnbyBFeHAgJAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCitob3N0ID0gaG9zdCBvciAibG9jYWxob3N0IgorcG9ydCA9IHBvcnQgb3IgNworaWYgYXJnIHRoZW4KKyAgICBob3N0ID0gYXJnWzFdIG9yIGhvc3QKKyAgICBwb3J0ID0gYXJnWzJdIG9yIHBvcnQKK2VuZAoraG9zdCA9IHNvY2tldC5kbnMudG9pcChob3N0KQordWRwID0gYXNzZXJ0KHNvY2tldC51ZHAoKSkKK2Fzc2VydCh1ZHA6c2V0cGVlcm5hbWUoaG9zdCwgcG9ydCkpCitwcmludCgiVXNpbmcgcmVtb3RlIGhvc3QgJyIgLi5ob3N0Li4gIicgYW5kIHBvcnQgIiAuLiBwb3J0IC4uICIuLi4iKQord2hpbGUgMSBkbworCWxpbmUgPSBpby5yZWFkKCkKKwlpZiBub3QgbGluZSBvciBsaW5lID09ICIiIHRoZW4gb3MuZXhpdCgpIGVuZAorCWFzc2VydCh1ZHA6c2VuZChsaW5lKSkKKwlkZ3JhbSA9IGFzc2VydCh1ZHA6cmVjZWl2ZSgpKQorCXByaW50KGRncmFtKQorZW5kCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc2FtcGxlcy9lY2hvc3J2ci5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvc2FtcGxlcy9lY2hvc3J2ci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5N2NhNAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2VjaG9zcnZyLmx1YQpAQCAtMCwwICsxLDI5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVURQIHNhbXBsZTogZWNobyBwcm90b2NvbCBzZXJ2ZXIKKy0tIEx1YVNvY2tldCBzYW1wbGUgZmlsZXMKKy0tIEF1dGhvcjogRGllZ28gTmVoYWIKKy0tIFJDUyBJRDogJElkOiBlY2hvc3J2ci5sdWEsdiAxLjEyIDIwMDUvMTEvMjIgMDg6MzM6MjkgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBzb2NrZXQgPSByZXF1aXJlKCJzb2NrZXQiKQoraG9zdCA9IGhvc3Qgb3IgIjEyNy4wLjAuMSIKK3BvcnQgPSBwb3J0IG9yIDcKK2lmIGFyZyB0aGVuCisgICAgaG9zdCA9IGFyZ1sxXSBvciBob3N0CisgICAgcG9ydCA9IGFyZ1syXSBvciBwb3J0CitlbmQKK3ByaW50KCJCaW5kaW5nIHRvIGhvc3QgJyIgLi5ob3N0Li4gIicgYW5kIHBvcnQgIiAuLnBvcnQuLiAiLi4uIikKK3VkcCA9IGFzc2VydChzb2NrZXQudWRwKCkpCithc3NlcnQodWRwOnNldHNvY2tuYW1lKGhvc3QsIHBvcnQpKQorYXNzZXJ0KHVkcDpzZXR0aW1lb3V0KDUpKQoraXAsIHBvcnQgPSB1ZHA6Z2V0c29ja25hbWUoKQorYXNzZXJ0KGlwLCBwb3J0KQorcHJpbnQoIldhaXRpbmcgcGFja2V0cyBvbiAiIC4uIGlwIC4uICI6IiAuLiBwb3J0IC4uICIuLi4iKQord2hpbGUgMSBkbworCWRncmFtLCBpcCwgcG9ydCA9IHVkcDpyZWNlaXZlZnJvbSgpCisJaWYgZGdyYW0gdGhlbgorCQlwcmludCgiRWNob2luZyAnIiAuLiBkZ3JhbSAuLiAiJyB0byAiIC4uIGlwIC4uICI6IiAuLiBwb3J0KQorCQl1ZHA6c2VuZHRvKGRncmFtLCBpcCwgcG9ydCkKKwllbHNlCisgICAgICAgIHByaW50KGlwKQorICAgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc2FtcGxlcy9saXN0ZW5lci5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvc2FtcGxlcy9saXN0ZW5lci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2MGZiYgotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2xpc3RlbmVyLmx1YQpAQCAtMCwwICsxLDI2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVENQIHNhbXBsZTogTGl0dGxlIHByb2dyYW0gdG8gZHVtcCBsaW5lcyByZWNlaXZlZCBhdCBhIGdpdmVuIHBvcnQKKy0tIEx1YVNvY2tldCBzYW1wbGUgZmlsZXMKKy0tIEF1dGhvcjogRGllZ28gTmVoYWIKKy0tIFJDUyBJRDogJElkOiBsaXN0ZW5lci5sdWEsdiAxLjExIDIwMDUvMDEvMDIgMjI6NDQ6MDAgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBzb2NrZXQgPSByZXF1aXJlKCJzb2NrZXQiKQoraG9zdCA9IGhvc3Qgb3IgIioiCitwb3J0ID0gcG9ydCBvciA4MDgwCitpZiBhcmcgdGhlbgorCWhvc3QgPSBhcmdbMV0gb3IgaG9zdAorCXBvcnQgPSBhcmdbMl0gb3IgcG9ydAorZW5kCitwcmludCgiQmluZGluZyB0byBob3N0ICciIC4uaG9zdC4uICInIGFuZCBwb3J0ICIgLi5wb3J0Li4gIi4uLiIpCitzID0gYXNzZXJ0KHNvY2tldC5iaW5kKGhvc3QsIHBvcnQpKQoraSwgcCAgID0gczpnZXRzb2NrbmFtZSgpCithc3NlcnQoaSwgcCkKK3ByaW50KCJXYWl0aW5nIGNvbm5lY3Rpb24gZnJvbSB0YWxrZXIgb24gIiAuLiBpIC4uICI6IiAuLiBwIC4uICIuLi4iKQorYyA9IGFzc2VydChzOmFjY2VwdCgpKQorcHJpbnQoIkNvbm5lY3RlZC4gSGVyZSBpcyB0aGUgc3R1ZmY6IikKK2wsIGUgPSBjOnJlY2VpdmUoKQord2hpbGUgbm90IGUgZG8KKwlwcmludChsKQorCWwsIGUgPSBjOnJlY2VpdmUoKQorZW5kCitwcmludChlKQpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NhbXBsZXMvbHByLmx1YSBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2xwci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwNTliMQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL2xwci5sdWEKQEAgLTAsMCArMSw1MSBAQAorbG9jYWwgbHAgPSByZXF1aXJlKCJzb2NrZXQubHAiKQorCitsb2NhbCBmdW5jdGlvbiB1c2FnZSgpCisgIHByaW50KCdcblVzYWdlOiBsdWEgbHByLmx1YSBbZmlsZW5hbWVdIFtrZXl3b3JkPXZhbC4uLl1cbicpCisgIHByaW50KCdWYWxpZCBrZXl3b3JkcyBhcmUgOicpCisgIHByaW50KAorICAgICAnICBob3N0PXJlbW90ZSBob3N0IG9yIElQIGFkZHJlc3MgKGRlZmF1bHQgImxvY2FsaG9zdCIpXG4nIC4uCisgICAgICcgIHF1ZXVlPXJlbW90ZSBxdWV1ZSBvciBwcmludGVyIG5hbWUgKGRlZmF1bHQgInByaW50ZXIiKVxuJyAuLgorICAgICAnICBwb3J0PXJlbW90ZSBwb3J0IG51bWJlciAoZGVmYXVsdCA1MTUpXG4nIC4uCisgICAgICcgIHVzZXI9c2VuZGluZyB1c2VyIG5hbWVcbicgLi4KKyAgICAgJyAgZm9ybWF0PVsiYmluYXJ5IiB8ICJ0ZXh0IiB8ICJwcyIgfCAicHIiIHwgImZvcnRyYW4iXSAoZGVmYXVsdCAiYmluYXJ5IilcbicgLi4KKyAgICAgJyAgYmFubmVyPXRydWV8ZmFsc2VcbicgLi4KKyAgICAgJyAgaW5kZW50PW51bWJlciBvZiBjb2x1bW5zIHRvIGluZGVudFxuJyAuLgorICAgICAnICBtYWlsPWVtYWlsIG9mIGFkZHJlc3MgdG8gbm90aWZ5IHdoZW4gcHJpbnQgaXMgY29tcGxldGVcbicgLi4KKyAgICAgJyAgdGl0bGU9dGl0bGUgdG8gdXNlIGZvciAicHIiIGZvcm1hdFxuJyAuLgorICAgICAnICB3aWR0aD13aWR0aCBmb3IgInRleHQiIG9yICJwciIgZm9ybWF0c1xuJyAuLgorICAgICAnICBjbGFzcz1cbicgLi4KKyAgICAgJyAgam9iPVxuJyAuLgorICAgICAnICBuYW1lPVxuJyAuLgorICAgICAnICBsb2NhbGJpbmQ9dHJ1ZXxmYWxzZVxuJworICAgICApCisgIHJldHVybiBuaWwKK2VuZAorCitpZiBub3QgYXJnIG9yIG5vdCBhcmdbMV0gdGhlbgorICByZXR1cm4gdXNhZ2UoKQorZW5kCisKK2RvCisgICAgbG9jYWwgb3B0ID0ge30KKyAgICBsb2NhbCBwYXQgPSAiWyVzJWMlcF0qKFsld10qKT0oW1wiXT9bJXclc18hQCMkJSVeJiooKTw+OjtdK1tcIl1cP1wuPykiCisgICAgZm9yIGkgPSAyLCB0YWJsZS5nZXRuKGFyZyksIDEgZG8KKyAgICAgIHN0cmluZy5nc3ViKGFyZ1tpXSwgcGF0LCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgb3B0W25hbWVdID0gdmFsdWUgZW5kKQorICAgIGVuZAorICAgIGlmIG5vdCBhcmdbMl0gdGhlbgorICAgICAgcmV0dXJuIHVzYWdlKCkKKyAgICBlbmQKKyAgICBpZiBhcmdbMV0gfj0gInF1ZXJ5IiB0aGVuCisgICAgICAgIG9wdC5maWxlID0gYXJnWzFdCisgICAgICAgIHIsZT1scC5zZW5kKG9wdCkKKyAgICAgICAgaW8uc3Rkb3V0OndyaXRlKHRvc3RyaW5nKHIgb3IgZSksJ1xuJykKKyAgICBlbHNlCisgICAgICAgIHIsZT1scC5xdWVyeShvcHQpCisgICAgICAgIGlvLnN0ZG91dDp3cml0ZSh0b3N0cmluZyhyIG9yIGUpLCAnXG4nKQorICAgIGVuZAorZW5kCisKKy0tIHRyaXZpYWwgdGVzdHMKKy0tbHVhIGxwLmx1YSBscC5sdWEgcXVldWU9ZGVmYXVsdCBob3N0PWxvY2FsaG9zdAorLS1sdWEgbHAubHVhIGxwLmx1YSBxdWV1ZT1kZWZhdWx0IGhvc3Q9bG9jYWxob3N0IGZvcm1hdD1iaW5hcnkgbG9jYWxiaW5kPTEKKy0tbHVhIGxwLmx1YSBxdWVyeSBxdWV1ZT1kZWZhdWx0IGhvc3Q9bG9jYWxob3N0CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc2FtcGxlcy90YWxrZXIubHVhIGIvbHVhc29ja2V0LTIuMC4yL3NhbXBsZXMvdGFsa2VyLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDdmZjMxCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NhbXBsZXMvdGFsa2VyLmx1YQpAQCAtMCwwICsxLDIxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0tIFRDUCBzYW1wbGU6IExpdHRsZSBwcm9ncmFtIHRvIHNlbmQgdGV4dCBsaW5lcyB0byBhIGdpdmVuIGhvc3QvcG9ydA0KKy0tIEx1YVNvY2tldCBzYW1wbGUgZmlsZXMNCistLSBBdXRob3I6IERpZWdvIE5laGFiDQorLS0gUkNTIElEOiAkSWQ6IHRhbGtlci5sdWEsdiAxLjkgMjAwNS8wMS8wMiAyMjo0NDowMCBkaWVnbyBFeHAgJA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorbG9jYWwgc29ja2V0ID0gcmVxdWlyZSgic29ja2V0IikNCitob3N0ID0gaG9zdCBvciAibG9jYWxob3N0Ig0KK3BvcnQgPSBwb3J0IG9yIDgwODANCitpZiBhcmcgdGhlbg0KKwlob3N0ID0gYXJnWzFdIG9yIGhvc3QNCisJcG9ydCA9IGFyZ1syXSBvciBwb3J0DQorZW5kDQorcHJpbnQoIkF0dGVtcHRpbmcgY29ubmVjdGlvbiB0byBob3N0ICciIC4uaG9zdC4uICInIGFuZCBwb3J0ICIgLi5wb3J0Li4gIi4uLiIpDQorYyA9IGFzc2VydChzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KSkNCitwcmludCgiQ29ubmVjdGVkISBQbGVhc2UgdHlwZSBzdHVmZiAoZW1wdHkgbGluZSB0byBzdG9wKToiKQ0KK2wgPSBpby5yZWFkKCkNCit3aGlsZSBsIGFuZCBsIH49ICIiIGFuZCBub3QgZSBkbw0KKwlhc3NlcnQoYzpzZW5kKGwgLi4gIlxuIikpDQorCWwgPSBpby5yZWFkKCkNCitlbmQNCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc2FtcGxlcy90aW55aXJjLmx1YSBiL2x1YXNvY2tldC0yLjAuMi9zYW1wbGVzL3RpbnlpcmMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NzQzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc2FtcGxlcy90aW55aXJjLmx1YQpAQCAtMCwwICsxLDkwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gU2VsZWN0IHNhbXBsZTogc2ltcGxlIHRleHQgbGluZSBzZXJ2ZXIKKy0tIEx1YVNvY2tldCBzYW1wbGUgZmlsZXMuCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogdGlueWlyYy5sdWEsdiAxLjE0IDIwMDUvMTEvMjIgMDg6MzM6MjkgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBzb2NrZXQgPSByZXF1aXJlKCJzb2NrZXQiKQoraG9zdCA9IGhvc3Qgb3IgIioiCitwb3J0MSA9IHBvcnQxIG9yIDgwODAKK3BvcnQyID0gcG9ydDIgb3IgODE4MQoraWYgYXJnIHRoZW4KKyAgICBob3N0ID0gYXJnWzFdIG9yIGhvc3QKKyAgICBwb3J0MSA9IGFyZ1syXSBvciBwb3J0MQorICAgIHBvcnQyID0gYXJnWzNdIG9yIHBvcnQyCitlbmQKKworc2VydmVyMSA9IGFzc2VydChzb2NrZXQuYmluZChob3N0LCBwb3J0MSkpCitzZXJ2ZXIyID0gYXNzZXJ0KHNvY2tldC5iaW5kKGhvc3QsIHBvcnQyKSkKK3NlcnZlcjE6c2V0dGltZW91dCgxKSAtLSBtYWtlIHN1cmUgd2UgZG9uJ3QgYmxvY2sgaW4gYWNjZXB0CitzZXJ2ZXIyOnNldHRpbWVvdXQoMSkKKworaW8ud3JpdGUoIlNlcnZlcnMgYm91bmRcbiIpCisKKy0tIHNpbXBsZSBzZXQgaW1wbGVtZW50YXRpb24KKy0tIHRoZSBzZWxlY3QgZnVuY3Rpb24gZG9lc24ndCBjYXJlIGFib3V0IHdoYXQgaXMgcGFzc2VkIHRvIGl0IGFzIGxvbmcgYXMKKy0tIGl0IGJlaGF2ZXMgbGlrZSBhIHRhYmxlCistLSBjcmVhdGVzIGEgbmV3IHNldCBkYXRhIHN0cnVjdHVyZQorZnVuY3Rpb24gbmV3c2V0KCkKKyAgICBsb2NhbCByZXZlcnNlID0ge30KKyAgICBsb2NhbCBzZXQgPSB7fQorICAgIHJldHVybiBzZXRtZXRhdGFibGUoc2V0LCB7X19pbmRleCA9IHsKKyAgICAgICAgaW5zZXJ0ID0gZnVuY3Rpb24oc2V0LCB2YWx1ZSkKKyAgICAgICAgICAgIGlmIG5vdCByZXZlcnNlW3ZhbHVlXSB0aGVuCisgICAgICAgICAgICAgICAgdGFibGUuaW5zZXJ0KHNldCwgdmFsdWUpCisgICAgICAgICAgICAgICAgcmV2ZXJzZVt2YWx1ZV0gPSB0YWJsZS5nZXRuKHNldCkKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQsCisgICAgICAgIHJlbW92ZSA9IGZ1bmN0aW9uKHNldCwgdmFsdWUpCisgICAgICAgICAgICBsb2NhbCBpbmRleCA9IHJldmVyc2VbdmFsdWVdCisgICAgICAgICAgICBpZiBpbmRleCB0aGVuCisgICAgICAgICAgICAgICAgcmV2ZXJzZVt2YWx1ZV0gPSBuaWwKKyAgICAgICAgICAgICAgICBsb2NhbCB0b3AgPSB0YWJsZS5yZW1vdmUoc2V0KQorICAgICAgICAgICAgICAgIGlmIHRvcCB+PSB2YWx1ZSB0aGVuCisgICAgICAgICAgICAgICAgICAgIHJldmVyc2VbdG9wXSA9IGluZGV4CisgICAgICAgICAgICAgICAgICAgIHNldFtpbmRleF0gPSB0b3AKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICB9fSkKK2VuZAorCitzZXQgPSBuZXdzZXQoKQorCitpby53cml0ZSgiSW5zZXJ0aW5nIHNlcnZlcnMgaW4gc2V0XG4iKQorc2V0Omluc2VydChzZXJ2ZXIxKQorc2V0Omluc2VydChzZXJ2ZXIyKQorCit3aGlsZSAxIGRvCisgICAgbG9jYWwgcmVhZGFibGUsIF8sIGVycm9yID0gc29ja2V0LnNlbGVjdChzZXQsIG5pbCkKKyAgICBmb3IgXywgaW5wdXQgaW4gaXBhaXJzKHJlYWRhYmxlKSBkbworICAgICAgICAtLSBpcyBpdCBhIHNlcnZlciBzb2NrZXQ/CisgICAgICAgIGlmIGlucHV0ID09IHNlcnZlcjEgb3IgaW5wdXQgPT0gc2VydmVyMiB0aGVuCisgICAgICAgICAgICBpby53cml0ZSgiV2FpdGluZyBmb3IgY2xpZW50c1xuIikKKyAgICAgICAgICAgIGxvY2FsIG5ldyA9IGlucHV0OmFjY2VwdCgpCisgICAgICAgICAgICBpZiBuZXcgdGhlbgorICAgICAgICAgICAgICAgIG5ldzpzZXR0aW1lb3V0KDEpCisgICAgICAgICAgICAgICAgaW8ud3JpdGUoIkluc2VydGluZyBjbGllbnQgaW4gc2V0XG4iKQorICAgICAgICAgICAgICAgIHNldDppbnNlcnQobmV3KQorICAgICAgICAgICAgZW5kCisgICAgICAgIC0tIGl0IGlzIGEgY2xpZW50IHNvY2tldAorICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2NhbCBsaW5lLCBlcnJvciA9IGlucHV0OnJlY2VpdmUoKQorICAgICAgICAgICAgaWYgZXJyb3IgdGhlbgorICAgICAgICAgICAgICAgIGlucHV0OmNsb3NlKCkKKyAgICAgICAgICAgICAgICBpby53cml0ZSgiUmVtb3ZpbmcgY2xpZW50IGZyb20gc2V0XG4iKQorICAgICAgICAgICAgICAgIHNldDpyZW1vdmUoaW5wdXQpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAJaW8ud3JpdGUoIkJyb2FkY2FzdGluZyBsaW5lICciLCBsaW5lLCAiJ1xuIikKKyAgICAgICAgICAgIAl3cml0YWJsZSwgZXJyb3IgPSBzb2NrZXQuc2tpcCgxLCBzb2NrZXQuc2VsZWN0KG5pbCwgc2V0LCAxKSkKKyAgICAgICAgICAgIAlpZiBub3QgZXJyb3IgdGhlbgorICAgICAgICAgICAgICAgIAlmb3IgX18sIG91dHB1dCBpbiBpcGFpcnMod3JpdGFibGUpIGRvCisgICAgICAgICAgICAgICAgICAgIAlpZiBvdXRwdXQgfj0gaW5wdXQgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDpzZW5kKGxpbmUgLi4gIlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIAllbmQKKyAgICAgICAgICAgIAllbHNlIGlvLndyaXRlKCJObyBjbGllbnQgcmVhZHkgdG8gcmVjZWl2ZSEhIVxuIikgZW5kCisJCQllbmQKKyAgICAgICAgZW5kCisgICAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zb2NrZXQudmNwcm9qIGIvbHVhc29ja2V0LTIuMC4yL3NvY2tldC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zb2NrZXQudmNwcm9qCkBAIC0wLDAgKzEsMTgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0ic29ja2V0Ig0KKwlQcm9qZWN0R1VJRD0iezY2RTNDRTE0LTg4NEQtNEFFQS05RjIwLTE1QTBCRUFGOEM1QX0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9InNyYyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9InNyYyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iaDpcaW5jbHVkZVxsdWE1LjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMVUFTT0NLRVRfRVhQT1JUUztMVUFTT0NLRVRfQVBJPV9fZGVjbHNwZWMoZGxsZXhwb3J0KSINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3czJfMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvc29ja2V0LmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSJoOlxsaWIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3NvY2tldC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3NvY2tldC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLi9zcmMiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuL3NyYyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Img6XGluY2x1ZGVcbHVhNS4xIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TFVBU09DS0VUX0VYUE9SVFM7TFVBU09DS0VUX0FQST1fX2RlY2xzcGVjKGRsbGV4cG9ydCk7ICBMVUFTT0NLRVRfREVCVUciDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id3MyXzMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3NvY2tldC5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iaDpcbGliIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvc29ja2V0LmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzcmNcYXV4aWxpYXIuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic3JjXGJ1ZmZlci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzcmNcZXhjZXB0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNyY1xpbmV0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNyY1xpby5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzcmNcbHVhc29ja2V0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNyY1xvcHRpb25zLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNyY1xzZWxlY3QuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic3JjXHRjcC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzcmNcdGltZW91dC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzcmNcdWRwLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNyY1x3c29ja2V0LmMiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9Ij4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGxpYlxsdWE1LjEuZGxsLmxpYiI+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvYXV4aWxpYXIuYyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvYXV4aWxpYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTE0OTcwCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9hdXhpbGlhci5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBBdXhpbGlhciByb3V0aW5lcyBmb3IgY2xhc3MgaGllcmFyY2h5IG1hbmlwdWxhdGlvbgorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBSQ1MgSUQ6ICRJZDogYXV4aWxpYXIuYyx2IDEuMTQgMjAwNS8xMC8wNyAwNDo0MDo1OSBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYXV4aWxpYXIuaCIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogRXhwb3J0ZWQgZnVuY3Rpb25zCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgdGhlIG1vZHVsZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBhdXhpbGlhcl9vcGVuKGx1YV9TdGF0ZSAqTCkgeworICAgICh2b2lkKSBMOworICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDcmVhdGVzIGEgbmV3IGNsYXNzIHdpdGggZ2l2ZW4gbWV0aG9kcworKiBNZXRob2RzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggX18gYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgbWV0YXRhYmxlLgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgYXV4aWxpYXJfbmV3Y2xhc3MobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpjbGFzc25hbWUsIGx1YUxfcmVnICpmdW5jKSB7CisgICAgbHVhTF9uZXdtZXRhdGFibGUoTCwgY2xhc3NuYW1lKTsgLyogbXQgKi8KKyAgICAvKiBjcmVhdGUgX19pbmRleCB0YWJsZSB0byBwbGFjZSBtZXRob2RzICovCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgIl9faW5kZXgiKTsgICAgLyogbXQsIl9faW5kZXgiICovCisgICAgbHVhX25ld3RhYmxlKEwpOyAgICAgICAgICAgICAgICAgLyogbXQsIl9faW5kZXgiLGl0ICovIAorICAgIC8qIHB1dCBjbGFzcyBuYW1lIGludG8gY2xhc3MgbWV0YXRhYmxlICovCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgImNsYXNzIik7ICAgICAgLyogbXQsIl9faW5kZXgiLGl0LCJjbGFzcyIgKi8KKyAgICBsdWFfcHVzaHN0cmluZyhMLCBjbGFzc25hbWUpOyAgICAvKiBtdCwiX19pbmRleCIsaXQsImNsYXNzIixjbGFzc25hbWUgKi8KKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAvKiBtdCwiX19pbmRleCIsaXQgKi8KKyAgICAvKiBwYXNzIGFsbCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIHRvIHRoZSBtZXRhdGFibGUsIGFuZCBhbGwgb3RoZXJzCisgICAgICogdG8gdGhlIGluZGV4IHRhYmxlICovCisgICAgZm9yICg7IGZ1bmMtPm5hbWU7IGZ1bmMrKykgeyAgICAgLyogbXQsIl9faW5kZXgiLGl0ICovCisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIGZ1bmMtPm5hbWUpOworICAgICAgICBsdWFfcHVzaGNmdW5jdGlvbihMLCBmdW5jLT5mdW5jKTsKKyAgICAgICAgbHVhX3Jhd3NldChMLCBmdW5jLT5uYW1lWzBdID09ICdfJyA/IC01OiAtMyk7CisgICAgfQorICAgIGx1YV9yYXdzZXQoTCwgLTMpOyAgICAgICAgICAgICAgIC8qIG10ICovCisgICAgbHVhX3BvcChMLCAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIGluIGEgbmljZSB3YXkKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYXV4aWxpYXJfdG9zdHJpbmcobHVhX1N0YXRlICpMKSB7CisgICAgY2hhciBidWZbMzJdOworICAgIGlmICghbHVhX2dldG1ldGF0YWJsZShMLCAxKSkgZ290byBlcnJvcjsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiX19pbmRleCIpOworICAgIGx1YV9nZXR0YWJsZShMLCAtMik7CisgICAgaWYgKCFsdWFfaXN0YWJsZShMLCAtMSkpIGdvdG8gZXJyb3I7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgImNsYXNzIik7CisgICAgbHVhX2dldHRhYmxlKEwsIC0yKTsKKyAgICBpZiAoIWx1YV9pc3N0cmluZyhMLCAtMSkpIGdvdG8gZXJyb3I7CisgICAgc3ByaW50ZihidWYsICIlcCIsIGx1YV90b3VzZXJkYXRhKEwsIDEpKTsKKyAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzOiAlcyIsIGx1YV90b3N0cmluZyhMLCAtMSksIGJ1Zik7CisgICAgcmV0dXJuIDE7CitlcnJvcjoKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiaW52YWxpZCBvYmplY3QgcGFzc2VkIHRvICdhdXhpbGlhci5jOl9fdG9zdHJpbmcnIik7CisgICAgbHVhX2Vycm9yKEwpOworICAgIHJldHVybiAxOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBJbnNlcnQgY2xhc3MgaW50byBncm91cAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgYXV4aWxpYXJfYWRkMmdyb3VwKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqY2xhc3NuYW1lLCBjb25zdCBjaGFyICpncm91cG5hbWUpIHsKKyAgICBsdWFMX2dldG1ldGF0YWJsZShMLCBjbGFzc25hbWUpOworICAgIGx1YV9wdXNoc3RyaW5nKEwsIGdyb3VwbmFtZSk7CisgICAgbHVhX3B1c2hib29sZWFuKEwsIDEpOworICAgIGx1YV9yYXdzZXQoTCwgLTMpOworICAgIGx1YV9wb3AoTCwgMSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIE1ha2Ugc3VyZSBhcmd1bWVudCBpcyBhIGJvb2xlYW4KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYXV4aWxpYXJfY2hlY2tib29sZWFuKGx1YV9TdGF0ZSAqTCwgaW50IG9iamlkeCkgeworICAgIGlmICghbHVhX2lzYm9vbGVhbihMLCBvYmppZHgpKQorICAgICAgICBsdWFMX3R5cGVycm9yKEwsIG9iamlkeCwgbHVhX3R5cGVuYW1lKEwsIExVQV9UQk9PTEVBTikpOworICAgIHJldHVybiBsdWFfdG9ib29sZWFuKEwsIG9iamlkeCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJldHVybiB1c2VyZGF0YSBwb2ludGVyIGlmIG9iamVjdCBiZWxvbmdzIHRvIGEgZ2l2ZW4gY2xhc3MsIGFib3J0IHdpdGggCisqIGVycm9yIG90aGVyd2lzZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgKmF1eGlsaWFyX2NoZWNrY2xhc3MobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpjbGFzc25hbWUsIGludCBvYmppZHgpIHsKKyAgICB2b2lkICpkYXRhID0gYXV4aWxpYXJfZ2V0Y2xhc3N1ZGF0YShMLCBjbGFzc25hbWUsIG9iamlkeCk7CisgICAgaWYgKCFkYXRhKSB7CisgICAgICAgIGNoYXIgbXNnWzQ1XTsKKyAgICAgICAgc3ByaW50Zihtc2csICIlLjM1cyBleHBlY3RlZCIsIGNsYXNzbmFtZSk7CisgICAgICAgIGx1YUxfYXJnZXJyb3IoTCwgb2JqaWR4LCBtc2cpOworICAgIH0KKyAgICByZXR1cm4gZGF0YTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUmV0dXJuIHVzZXJkYXRhIHBvaW50ZXIgaWYgb2JqZWN0IGJlbG9uZ3MgdG8gYSBnaXZlbiBncm91cCwgYWJvcnQgd2l0aCAKKyogZXJyb3Igb3RoZXJ3aXNlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCAqYXV4aWxpYXJfY2hlY2tncm91cChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmdyb3VwbmFtZSwgaW50IG9iamlkeCkgeworICAgIHZvaWQgKmRhdGEgPSBhdXhpbGlhcl9nZXRncm91cHVkYXRhKEwsIGdyb3VwbmFtZSwgb2JqaWR4KTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgY2hhciBtc2dbNDVdOworICAgICAgICBzcHJpbnRmKG1zZywgIiUuMzVzIGV4cGVjdGVkIiwgZ3JvdXBuYW1lKTsKKyAgICAgICAgbHVhTF9hcmdlcnJvcihMLCBvYmppZHgsIG1zZyk7CisgICAgfQorICAgIHJldHVybiBkYXRhOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBTZXQgb2JqZWN0IGNsYXNzCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBhdXhpbGlhcl9zZXRjbGFzcyhsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSwgaW50IG9iamlkeCkgeworICAgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIGNsYXNzbmFtZSk7CisgICAgaWYgKG9iamlkeCA8IDApIG9iamlkeC0tOworICAgIGx1YV9zZXRtZXRhdGFibGUoTCwgb2JqaWR4KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogR2V0IGEgdXNlcmRhdGEgcG9pbnRlciBpZiBvYmplY3QgYmVsb25ncyB0byBhIGdpdmVuIGdyb3VwLiBSZXR1cm4gTlVMTCAKKyogb3RoZXJ3aXNlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCAqYXV4aWxpYXJfZ2V0Z3JvdXB1ZGF0YShsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmdyb3VwbmFtZSwgaW50IG9iamlkeCkgeworICAgIGlmICghbHVhX2dldG1ldGF0YWJsZShMLCBvYmppZHgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBncm91cG5hbWUpOworICAgIGx1YV9yYXdnZXQoTCwgLTIpOworICAgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgICAgIGx1YV9wb3AoTCwgMik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGx1YV9wb3AoTCwgMik7CisgICAgICAgIHJldHVybiBsdWFfdG91c2VyZGF0YShMLCBvYmppZHgpOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogR2V0IGEgdXNlcmRhdGEgcG9pbnRlciBpZiBvYmplY3QgYmVsb25ncyB0byBhIGdpdmVuIGNsYXNzLiBSZXR1cm4gTlVMTCAKKyogb3RoZXJ3aXNlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCAqYXV4aWxpYXJfZ2V0Y2xhc3N1ZGF0YShsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSwgaW50IG9iamlkeCkgeworICAgIHJldHVybiBsdWFMX2NoZWNrdWRhdGEoTCwgb2JqaWR4LCBjbGFzc25hbWUpOworfQpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy9hdXhpbGlhci5oIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9hdXhpbGlhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Yjg0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL2F1eGlsaWFyLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBBVVhJTElBUl9ICisjZGVmaW5lIEFVWElMSUFSX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEF1eGlsaWFyIHJvdXRpbmVzIGZvciBjbGFzcyBoaWVyYXJjaHkgbWFuaXB1bGF0aW9uCisqIEx1YVNvY2tldCB0b29sa2l0IChidXQgY29tcGxldGVseSBpbmRlcGVuZGVudCBvZiBvdGhlciBMdWFTb2NrZXQgbW9kdWxlcykKKyoKKyogQSBMdWFTb2NrZXQgY2xhc3MgaXMgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBMdWEgbWV0YXRhYmxlcy4gQSBMdWFTb2NrZXQgCisqIGdyb3VwIGlzIGEgbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBjbGFzcy4gQSBjbGFzcyBjYW4gYmVsb25nIHRvIGFueSBudW1iZXIgCisqIG9mIGdyb3Vwcy4gVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG86CisqCisqICAgLSBjcmVhdGUgbmV3IGNsYXNzZXMgCisqICAgLSBhZGQgY2xhc3NlcyB0byBncm91cHMgCisqICAgLSBzZXQgdGhlIGNsYXNzIG9mIG9iamVjdHMKKyogICAtIGNoZWNrIGlmIGFuIG9iamVjdCBiZWxvbmdzIHRvIGEgZ2l2ZW4gY2xhc3Mgb3IgZ3JvdXAKKyogICAtIGdldCB0aGUgdXNlcmRhdGEgYXNzb2NpYXRlZCB0byBvYmplY3RzCisqICAgLSBwcmludCBvYmplY3RzIGluIGEgcHJldHR5IHdheQorKgorKiBMdWFTb2NrZXQgY2xhc3MgbmFtZXMgZm9sbG93IHRoZSBjb252ZW50aW9uIDxtb2R1bGU+ezxjbGFzcz59LiBNb2R1bGVzCisqIGNhbiBkZWZpbmUgYW55IG51bWJlciBvZiBjbGFzc2VzIGFuZCBncm91cHMuIFRoZSBtb2R1bGUgdGNwLmMsIGZvcgorKiBleGFtcGxlLCBkZWZpbmVzIHRoZSBjbGFzc2VzIHRjcHttYXN0ZXJ9LCB0Y3B7Y2xpZW50fSBhbmQgdGNwe3NlcnZlcn0gYW5kCisqIHRoZSBncm91cHMgdGNwe2NsaWVudCxzZXJ2ZXJ9IGFuZCB0Y3B7YW55fS4gTW9kdWxlIGZ1bmN0aW9ucyBjYW4gdGhlbgorKiBwZXJmb3JtIHR5cGUtY2hlY2tpbmcgb24gdGhlaXIgYXJndW1lbnRzIGJ5IGVpdGhlciBjbGFzcyBvciBncm91cC4KKyoKKyogTHVhU29ja2V0IG1ldGF0YWJsZXMgZGVmaW5lIHRoZSBfX2luZGV4IG1ldGFtZXRob2QgYXMgYmVpbmcgYSB0YWJsZS4gVGhpcworKiB0YWJsZSBoYXMgb25lIGZpZWxkIGZvciBlYWNoIG1ldGhvZCBzdXBwb3J0ZWQgYnkgdGhlIGNsYXNzLCBhbmQgYSBmaWVsZAorKiAiY2xhc3MiIHdpdGggdGhlIGNsYXNzIG5hbWUuCisqCisqIFRoZSBtYXBwaW5nIGZyb20gY2xhc3MgbmFtZSB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRhdGFibGUgYW5kIHRoZQorKiByZXZlcnNlIG1hcHBpbmcgYXJlIGRvbmUgdXNpbmcgbGF1eGxpYi4gCisqCisqIFJDUyBJRDogJElkOiBhdXhpbGlhci5oLHYgMS45IDIwMDUvMTAvMDcgMDQ6NDA6NTkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKK2ludCBhdXhpbGlhcl9vcGVuKGx1YV9TdGF0ZSAqTCk7Cit2b2lkIGF1eGlsaWFyX25ld2NsYXNzKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqY2xhc3NuYW1lLCBsdWFMX3JlZyAqZnVuYyk7Cit2b2lkIGF1eGlsaWFyX2FkZDJncm91cChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSwgY29uc3QgY2hhciAqZ3JvdXApOwordm9pZCBhdXhpbGlhcl9zZXRjbGFzcyhsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSwgaW50IG9iamlkeCk7Cit2b2lkICphdXhpbGlhcl9jaGVja2NsYXNzKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqY2xhc3NuYW1lLCBpbnQgb2JqaWR4KTsKK3ZvaWQgKmF1eGlsaWFyX2NoZWNrZ3JvdXAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpncm91cG5hbWUsIGludCBvYmppZHgpOwordm9pZCAqYXV4aWxpYXJfZ2V0Y2xhc3N1ZGF0YShsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmdyb3VwbmFtZSwgaW50IG9iamlkeCk7Cit2b2lkICphdXhpbGlhcl9nZXRncm91cHVkYXRhKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZ3JvdXBuYW1lLCBpbnQgb2JqaWR4KTsKK2ludCBhdXhpbGlhcl9jaGVja2Jvb2xlYW4obHVhX1N0YXRlICpMLCBpbnQgb2JqaWR4KTsKK2ludCBhdXhpbGlhcl90b3N0cmluZyhsdWFfU3RhdGUgKkwpOworCisjZW5kaWYgLyogQVVYSUxJQVJfSCAqLwpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy9idWZmZXIuYyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmNGZmYQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvYnVmZmVyLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIElucHV0L091dHB1dCBpbnRlcmZhY2UgZm9yIEx1YSBwcm9ncmFtcworKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBSQ1MgSUQ6ICRJZDogYnVmZmVyLmMsdiAxLjI4IDIwMDcvMDYvMTEgMjM6NDQ6NTQgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAibGF1eGxpYi5oIgorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJlY3ZyYXcocF9idWZmZXIgYnVmLCBzaXplX3Qgd2FudGVkLCBsdWFMX0J1ZmZlciAqYik7CitzdGF0aWMgaW50IHJlY3ZsaW5lKHBfYnVmZmVyIGJ1ZiwgbHVhTF9CdWZmZXIgKmIpOworc3RhdGljIGludCByZWN2YWxsKHBfYnVmZmVyIGJ1ZiwgbHVhTF9CdWZmZXIgKmIpOworc3RhdGljIGludCBidWZmZXJfZ2V0KHBfYnVmZmVyIGJ1ZiwgY29uc3QgY2hhciAqKmRhdGEsIHNpemVfdCAqY291bnQpOworc3RhdGljIHZvaWQgYnVmZmVyX3NraXAocF9idWZmZXIgYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIGludCBzZW5kcmF3KHBfYnVmZmVyIGJ1ZiwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCBzaXplX3QgKnNlbnQpOworCisvKiBtaW4gYW5kIG1heCBtYWNyb3MgKi8KKyNpZm5kZWYgTUlOCisjZGVmaW5lIE1JTih4LCB5KSAoKHgpIDwgKHkpID8geCA6IHkpCisjZW5kaWYKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWCh4LCB5KSAoKHgpID4gKHkpID8geCA6IHkpCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogRXhwb3J0ZWQgZnVuY3Rpb25zCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgbW9kdWxlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGJ1ZmZlcl9vcGVuKGx1YV9TdGF0ZSAqTCkgeworICAgICh2b2lkKSBMOworICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBJbml0aWFsaXplcyBDIHN0cnVjdHVyZSAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGJ1ZmZlcl9pbml0KHBfYnVmZmVyIGJ1ZiwgcF9pbyBpbywgcF90aW1lb3V0IHRtKSB7CisJYnVmLT5maXJzdCA9IGJ1Zi0+bGFzdCA9IDA7CisgICAgYnVmLT5pbyA9IGlvOworICAgIGJ1Zi0+dG0gPSB0bTsKKyAgICBidWYtPnJlY2VpdmVkID0gYnVmLT5zZW50ID0gMDsKKyAgICBidWYtPmJpcnRoZGF5ID0gdGltZW91dF9nZXR0aW1lKCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIG9iamVjdDpnZXRzdGF0cygpIGludGVyZmFjZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBidWZmZXJfbWV0aF9nZXRzdGF0cyhsdWFfU3RhdGUgKkwsIHBfYnVmZmVyIGJ1ZikgeworICAgIGx1YV9wdXNobnVtYmVyKEwsIGJ1Zi0+cmVjZWl2ZWQpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIGJ1Zi0+c2VudCk7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgdGltZW91dF9nZXR0aW1lKCkgLSBidWYtPmJpcnRoZGF5KTsKKyAgICByZXR1cm4gMzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogb2JqZWN0OnNldHN0YXRzKCkgaW50ZXJmYWNlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGJ1ZmZlcl9tZXRoX3NldHN0YXRzKGx1YV9TdGF0ZSAqTCwgcF9idWZmZXIgYnVmKSB7CisgICAgYnVmLT5yZWNlaXZlZCA9IChsb25nKSBsdWFMX29wdG51bWJlcihMLCAyLCBidWYtPnJlY2VpdmVkKTsgCisgICAgYnVmLT5zZW50ID0gKGxvbmcpIGx1YUxfb3B0bnVtYmVyKEwsIDMsIGJ1Zi0+c2VudCk7IAorICAgIGlmIChsdWFfaXNudW1iZXIoTCwgNCkpIGJ1Zi0+YmlydGhkYXkgPSB0aW1lb3V0X2dldHRpbWUoKSAtIGx1YV90b251bWJlcihMLCA0KTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogb2JqZWN0OnNlbmQoKSBpbnRlcmZhY2UKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYnVmZmVyX21ldGhfc2VuZChsdWFfU3RhdGUgKkwsIHBfYnVmZmVyIGJ1ZikgeworICAgIGludCB0b3AgPSBsdWFfZ2V0dG9wKEwpOworICAgIGludCBlcnIgPSBJT19ET05FOworICAgIHNpemVfdCBzaXplID0gMCwgc2VudCA9IDA7CisgICAgY29uc3QgY2hhciAqZGF0YSA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDIsICZzaXplKTsKKyAgICBsb25nIHN0YXJ0ID0gKGxvbmcpIGx1YUxfb3B0bnVtYmVyKEwsIDMsIDEpOworICAgIGxvbmcgZW5kID0gKGxvbmcpIGx1YUxfb3B0bnVtYmVyKEwsIDQsIC0xKTsKKyAgICBwX3RpbWVvdXQgdG0gPSB0aW1lb3V0X21hcmtzdGFydChidWYtPnRtKTsKKyAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IChsb25nKSAoc2l6ZStzdGFydCsxKTsKKyAgICBpZiAoZW5kIDwgMCkgZW5kID0gKGxvbmcpIChzaXplK2VuZCsxKTsKKyAgICBpZiAoc3RhcnQgPCAxKSBzdGFydCA9IChsb25nKSAxOworICAgIGlmIChlbmQgPiAobG9uZykgc2l6ZSkgZW5kID0gKGxvbmcpIHNpemU7CisgICAgaWYgKHN0YXJ0IDw9IGVuZCkgZXJyID0gc2VuZHJhdyhidWYsIGRhdGErc3RhcnQtMSwgZW5kLXN0YXJ0KzEsICZzZW50KTsKKyAgICAvKiBjaGVjayBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgKi8KKyAgICBpZiAoZXJyICE9IElPX0RPTkUpIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIGJ1Zi0+aW8tPmVycm9yKGJ1Zi0+aW8tPmN0eCwgZXJyKSk7IAorICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBzZW50K3N0YXJ0LTEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHNlbnQrc3RhcnQtMSk7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICB9CisjaWZkZWYgTFVBU09DS0VUX0RFQlVHCisgICAgLyogcHVzaCB0aW1lIGVsYXBzZWQgZHVyaW5nIG9wZXJhdGlvbiBhcyB0aGUgbGFzdCByZXR1cm4gdmFsdWUgKi8KKyAgICBsdWFfcHVzaG51bWJlcihMLCB0aW1lb3V0X2dldHRpbWUoKSAtIHRpbWVvdXRfZ2V0c3RhcnQodG0pKTsKKyNlbmRpZgorICAgIHJldHVybiBsdWFfZ2V0dG9wKEwpIC0gdG9wOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBvYmplY3Q6cmVjZWl2ZSgpIGludGVyZmFjZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBidWZmZXJfbWV0aF9yZWNlaXZlKGx1YV9TdGF0ZSAqTCwgcF9idWZmZXIgYnVmKSB7CisgICAgaW50IGVyciA9IElPX0RPTkUsIHRvcCA9IGx1YV9nZXR0b3AoTCk7CisgICAgbHVhTF9CdWZmZXIgYjsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBjb25zdCBjaGFyICpwYXJ0ID0gbHVhTF9vcHRsc3RyaW5nKEwsIDMsICIiLCAmc2l6ZSk7CisgICAgcF90aW1lb3V0IHRtID0gdGltZW91dF9tYXJrc3RhcnQoYnVmLT50bSk7CisgICAgLyogaW5pdGlhbGl6ZSBidWZmZXIgd2l0aCBvcHRpb25hbCBleHRyYSBwcmVmaXggCisgICAgICogKHVzZWZ1bCBmb3IgY29uY2F0ZW5hdGluZyBwcmV2aW91cyBwYXJ0aWFsIHJlc3VsdHMpICovCisgICAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgICAgbHVhTF9hZGRsc3RyaW5nKCZiLCBwYXJ0LCBzaXplKTsKKyAgICAvKiByZWNlaXZlIG5ldyBwYXR0ZXJucyAqLworICAgIGlmICghbHVhX2lzbnVtYmVyKEwsIDIpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnA9IGx1YUxfb3B0c3RyaW5nKEwsIDIsICIqbCIpOworICAgICAgICBpZiAocFswXSA9PSAnKicgJiYgcFsxXSA9PSAnbCcpIGVyciA9IHJlY3ZsaW5lKGJ1ZiwgJmIpOworICAgICAgICBlbHNlIGlmIChwWzBdID09ICcqJyAmJiBwWzFdID09ICdhJykgZXJyID0gcmVjdmFsbChidWYsICZiKTsgCisgICAgICAgIGVsc2UgbHVhTF9hcmdjaGVjayhMLCAwLCAyLCAiaW52YWxpZCByZWNlaXZlIHBhdHRlcm4iKTsKKyAgICAgICAgLyogZ2V0IGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzIChtaW51cyB3aGF0IHdhcyBhbHJlYWR5IHBhcnRpYWxseSAKKyAgICAgICAgICogcmVjZWl2ZWQpICovCisgICAgfSBlbHNlIGVyciA9IHJlY3ZyYXcoYnVmLCAoc2l6ZV90KSBsdWFfdG9udW1iZXIoTCwgMiktc2l6ZSwgJmIpOworICAgIC8qIGNoZWNrIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAqLworICAgIGlmIChlcnIgIT0gSU9fRE9ORSkgeworICAgICAgICAvKiB3ZSBjYW4ndCBwdXNoIGFueXRpbmcgaW4gdGhlIHN0YWNrIGJlZm9yZSBwdXNoaW5nIHRoZQorICAgICAgICAgKiBjb250ZW50cyBvZiB0aGUgYnVmZmVyLiB0aGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSBjb21wbGljYXRpb24gKi8KKyAgICAgICAgbHVhTF9wdXNocmVzdWx0KCZiKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgYnVmLT5pby0+ZXJyb3IoYnVmLT5pby0+Y3R4LCBlcnIpKTsgCisgICAgICAgIGx1YV9wdXNodmFsdWUoTCwgLTIpOyAKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9yZXBsYWNlKEwsIC00KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgfQorI2lmZGVmIExVQVNPQ0tFVF9ERUJVRworICAgIC8qIHB1c2ggdGltZSBlbGFwc2VkIGR1cmluZyBvcGVyYXRpb24gYXMgdGhlIGxhc3QgcmV0dXJuIHZhbHVlICovCisgICAgbHVhX3B1c2hudW1iZXIoTCwgdGltZW91dF9nZXR0aW1lKCkgLSB0aW1lb3V0X2dldHN0YXJ0KHRtKSk7CisjZW5kaWYKKyAgICByZXR1cm4gbHVhX2dldHRvcChMKSAtIHRvcDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbnkgZGF0YSBpbiB0aGUgcmVhZCBidWZmZXIKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYnVmZmVyX2lzZW1wdHkocF9idWZmZXIgYnVmKSB7CisgICAgcmV0dXJuIGJ1Zi0+Zmlyc3QgPj0gYnVmLT5sYXN0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBJbnRlcm5hbCBmdW5jdGlvbnMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBTZW5kcyBhIGJsb2NrIG9mIGRhdGEgKHVuYnVmZmVyZWQpCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVEVQU0laRSA4MTkyCitzdGF0aWMgaW50IHNlbmRyYXcocF9idWZmZXIgYnVmLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQsIHNpemVfdCAqc2VudCkgeworICAgIHBfaW8gaW8gPSBidWYtPmlvOworICAgIHBfdGltZW91dCB0bSA9IGJ1Zi0+dG07CisgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICBpbnQgZXJyID0gSU9fRE9ORTsKKyAgICB3aGlsZSAodG90YWwgPCBjb3VudCAmJiBlcnIgPT0gSU9fRE9ORSkgeworICAgICAgICBzaXplX3QgZG9uZTsKKyAgICAgICAgc2l6ZV90IHN0ZXAgPSAoY291bnQtdG90YWwgPD0gU1RFUFNJWkUpPyBjb3VudC10b3RhbDogU1RFUFNJWkU7CisgICAgICAgIGVyciA9IGlvLT5zZW5kKGlvLT5jdHgsIGRhdGErdG90YWwsIHN0ZXAsICZkb25lLCB0bSk7CisgICAgICAgIHRvdGFsICs9IGRvbmU7CisgICAgfQorICAgICpzZW50ID0gdG90YWw7CisgICAgYnVmLT5zZW50ICs9IHRvdGFsOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJlYWRzIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzIChidWZmZXJlZCkKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHJlY3ZyYXcocF9idWZmZXIgYnVmLCBzaXplX3Qgd2FudGVkLCBsdWFMX0J1ZmZlciAqYikgeworICAgIGludCBlcnIgPSBJT19ET05FOworICAgIHNpemVfdCB0b3RhbCA9IDA7CisgICAgd2hpbGUgKGVyciA9PSBJT19ET05FKSB7CisgICAgICAgIHNpemVfdCBjb3VudDsgY29uc3QgY2hhciAqZGF0YTsKKyAgICAgICAgZXJyID0gYnVmZmVyX2dldChidWYsICZkYXRhLCAmY291bnQpOworICAgICAgICBjb3VudCA9IE1JTihjb3VudCwgd2FudGVkIC0gdG90YWwpOworICAgICAgICBsdWFMX2FkZGxzdHJpbmcoYiwgZGF0YSwgY291bnQpOworICAgICAgICBidWZmZXJfc2tpcChidWYsIGNvdW50KTsKKyAgICAgICAgdG90YWwgKz0gY291bnQ7CisgICAgICAgIGlmICh0b3RhbCA+PSB3YW50ZWQpIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBSZWFkcyBldmVyeXRoaW5nIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCAoYnVmZmVyZWQpCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCByZWN2YWxsKHBfYnVmZmVyIGJ1ZiwgbHVhTF9CdWZmZXIgKmIpIHsKKyAgICBpbnQgZXJyID0gSU9fRE9ORTsKKyAgICBzaXplX3QgdG90YWwgPSAwOworICAgIHdoaWxlIChlcnIgPT0gSU9fRE9ORSkgeworICAgICAgICBjb25zdCBjaGFyICpkYXRhOyBzaXplX3QgY291bnQ7CisgICAgICAgIGVyciA9IGJ1ZmZlcl9nZXQoYnVmLCAmZGF0YSwgJmNvdW50KTsKKyAgICAgICAgdG90YWwgKz0gY291bnQ7CisgICAgICAgIGx1YUxfYWRkbHN0cmluZyhiLCBkYXRhLCBjb3VudCk7CisgICAgICAgIGJ1ZmZlcl9za2lwKGJ1ZiwgY291bnQpOworICAgIH0KKyAgICBpZiAoZXJyID09IElPX0NMT1NFRCkgeworICAgICAgICBpZiAodG90YWwgPiAwKSByZXR1cm4gSU9fRE9ORTsKKyAgICAgICAgZWxzZSByZXR1cm4gSU9fQ0xPU0VEOworICAgIH0gZWxzZSByZXR1cm4gZXJyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBSZWFkcyBhIGxpbmUgdGVybWluYXRlZCBieSBhIENSIExGIHBhaXIgb3IganVzdCBieSBhIExGLiBUaGUgQ1IgYW5kIExGIAorKiBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgYXJlIGRpc2NhcmRlZCBmcm9tIHRoZSBidWZmZXIKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHJlY3ZsaW5lKHBfYnVmZmVyIGJ1ZiwgbHVhTF9CdWZmZXIgKmIpIHsKKyAgICBpbnQgZXJyID0gSU9fRE9ORTsKKyAgICB3aGlsZSAoZXJyID09IElPX0RPTkUpIHsKKyAgICAgICAgc2l6ZV90IGNvdW50LCBwb3M7IGNvbnN0IGNoYXIgKmRhdGE7CisgICAgICAgIGVyciA9IGJ1ZmZlcl9nZXQoYnVmLCAmZGF0YSwgJmNvdW50KTsKKyAgICAgICAgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ICYmIGRhdGFbcG9zXSAhPSAnXG4nKSB7CisgICAgICAgICAgICAvKiB3ZSBpZ25vcmUgYWxsIFxyJ3MgKi8KKyAgICAgICAgICAgIGlmIChkYXRhW3Bvc10gIT0gJ1xyJykgbHVhTF9wdXRjaGFyKGIsIGRhdGFbcG9zXSk7CisgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zIDwgY291bnQpIHsgLyogZm91bmQgJ1xuJyAqLworICAgICAgICAgICAgYnVmZmVyX3NraXAoYnVmLCBwb3MrMSk7IC8qIHNraXAgJ1xuJyB0b28gKi8KKyAgICAgICAgICAgIGJyZWFrOyAvKiB3ZSBhcmUgZG9uZSAqLworICAgICAgICB9IGVsc2UgLyogcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGJ1ZmZlcl9za2lwKGJ1ZiwgcG9zKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogU2tpcHMgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgZnJvbSByZWFkIGJ1ZmZlci4gTm8gZGF0YSBpcyByZWFkIGZyb20gdGhlCisqIHRyYW5zcG9ydCBsYXllcgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGJ1ZmZlcl9za2lwKHBfYnVmZmVyIGJ1Ziwgc2l6ZV90IGNvdW50KSB7CisgICAgYnVmLT5yZWNlaXZlZCArPSBjb3VudDsKKyAgICBidWYtPmZpcnN0ICs9IGNvdW50OworICAgIGlmIChidWZmZXJfaXNlbXB0eShidWYpKSAKKyAgICAgICAgYnVmLT5maXJzdCA9IGJ1Zi0+bGFzdCA9IDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJldHVybiBhbnkgZGF0YSBhdmFpbGFibGUgaW4gYnVmZmVyLCBvciBnZXQgbW9yZSBkYXRhIGZyb20gdHJhbnNwb3J0IGxheWVyCisqIGlmIGJ1ZmZlciBpcyBlbXB0eQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgYnVmZmVyX2dldChwX2J1ZmZlciBidWYsIGNvbnN0IGNoYXIgKipkYXRhLCBzaXplX3QgKmNvdW50KSB7CisgICAgaW50IGVyciA9IElPX0RPTkU7CisgICAgcF9pbyBpbyA9IGJ1Zi0+aW87CisgICAgcF90aW1lb3V0IHRtID0gYnVmLT50bTsKKyAgICBpZiAoYnVmZmVyX2lzZW1wdHkoYnVmKSkgeworICAgICAgICBzaXplX3QgZ290OworICAgICAgICBlcnIgPSBpby0+cmVjdihpby0+Y3R4LCBidWYtPmRhdGEsIEJVRl9TSVpFLCAmZ290LCB0bSk7CisgICAgICAgIGJ1Zi0+Zmlyc3QgPSAwOworICAgICAgICBidWYtPmxhc3QgPSBnb3Q7CisgICAgfQorICAgICpjb3VudCA9IGJ1Zi0+bGFzdCAtIGJ1Zi0+Zmlyc3Q7CisgICAgKmRhdGEgPSBidWYtPmRhdGEgKyBidWYtPmZpcnN0OworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL2J1ZmZlci5oIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY5M2NhCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9idWZmZXIuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIEJVRl9ICisjZGVmaW5lIEJVRl9IIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogSW5wdXQvT3V0cHV0IGludGVyZmFjZSBmb3IgTHVhIHByb2dyYW1zCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIExpbmUgcGF0dGVybnMgcmVxdWlyZSBidWZmZXJpbmcuIFJlYWRpbmcgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUgaW52b2x2ZXMKKyogdG9vIG1hbnkgc3lzdGVtIGNhbGxzIGFuZCBpcyB2ZXJ5IHNsb3cuIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlCisqIEx1YVNvY2tldCBpbnRlcmZhY2UgZm9yIGlucHV0L291dHB1dCBvbiBjb25uZWN0ZWQgb2JqZWN0cywgYXMgc2VlbiBieSAKKyogTHVhIHByb2dyYW1zLiAKKyoKKyogSW5wdXQgaXMgYnVmZmVyZWQuIE91dHB1dCBpcyAqbm90KiBidWZmZXJlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyBzaW1wbGUKKyogd2F5IG9mIG1ha2luZyBzdXJlIHRoZSBidWZmZXJlZCBvdXRwdXQgZGF0YSB3b3VsZCBldmVyIGJlIHNlbnQuCisqCisqIFRoZSBtb2R1bGUgaXMgYnVpbHQgb24gdG9wIG9mIHRoZSBJL08gYWJzdHJhY3Rpb24gZGVmaW5lZCBpbiBpby5oIGFuZCB0aGUKKyogdGltZW91dCBtYW5hZ2VtZW50IGlzIGRvbmUgd2l0aCB0aGUgdGltZW91dC5oIGludGVyZmFjZS4KKyoKKyogUkNTIElEOiAkSWQ6IGJ1ZmZlci5oLHYgMS4xMiAyMDA1LzEwLzA3IDA0OjQwOjU5IGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJ0aW1lb3V0LmgiCisKKy8qIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIEJVRl9TSVpFIDgxOTIKKworLyogYnVmZmVyIGNvbnRyb2wgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB0X2J1ZmZlcl8geworICAgIGRvdWJsZSBiaXJ0aGRheTsgICAgICAgIC8qIHRocm90dGxlIHN1cHBvcnQgaW5mbzogY3JlYXRpb24gdGltZSwgKi8KKyAgICBzaXplX3Qgc2VudCwgcmVjZWl2ZWQ7ICAvKiBieXRlcyBzZW50LCBhbmQgYnl0ZXMgcmVjZWl2ZWQgKi8KKyAgICBwX2lvIGlvOyAgICAgICAgICAgICAgICAvKiBJTyBkcml2ZXIgdXNlZCBmb3IgdGhpcyBidWZmZXIgKi8KKyAgICBwX3RpbWVvdXQgdG07ICAgICAgICAgICAvKiB0aW1lb3V0IG1hbmFnZW1lbnQgZm9yIHRoaXMgYnVmZmVyICovCisJc2l6ZV90IGZpcnN0LCBsYXN0OyAgICAgLyogaW5kZXggb2YgZmlyc3QgYW5kIGxhc3QgYnl0ZXMgb2Ygc3RvcmVkIGRhdGEgKi8KKwljaGFyIGRhdGFbQlVGX1NJWkVdOyAgICAvKiBzdG9yYWdlIHNwYWNlIGZvciBidWZmZXIgZGF0YSAqLworfSB0X2J1ZmZlcjsKK3R5cGVkZWYgdF9idWZmZXIgKnBfYnVmZmVyOworCitpbnQgYnVmZmVyX29wZW4obHVhX1N0YXRlICpMKTsKK3ZvaWQgYnVmZmVyX2luaXQocF9idWZmZXIgYnVmLCBwX2lvIGlvLCBwX3RpbWVvdXQgdG0pOworaW50IGJ1ZmZlcl9tZXRoX3NlbmQobHVhX1N0YXRlICpMLCBwX2J1ZmZlciBidWYpOworaW50IGJ1ZmZlcl9tZXRoX3JlY2VpdmUobHVhX1N0YXRlICpMLCBwX2J1ZmZlciBidWYpOworaW50IGJ1ZmZlcl9tZXRoX2dldHN0YXRzKGx1YV9TdGF0ZSAqTCwgcF9idWZmZXIgYnVmKTsKK2ludCBidWZmZXJfbWV0aF9zZXRzdGF0cyhsdWFfU3RhdGUgKkwsIHBfYnVmZmVyIGJ1Zik7CitpbnQgYnVmZmVyX2lzZW1wdHkocF9idWZmZXIgYnVmKTsKKworI2VuZGlmIC8qIEJVRl9IICovCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL2V4Y2VwdC5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9leGNlcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFhNWJlCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9leGNlcHQuYwpAQCAtMCwwICsxLDk5IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBTaW1wbGUgZXhjZXB0aW9uIHN1cHBvcnQKKyogTHVhU29ja2V0IHRvb2xraXQKKyoKKyogUkNTIElEOiAkSWQ6IGV4Y2VwdC5jLHYgMS44IDIwMDUvMDkvMjkgMDY6MTE6NDEgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKworI2luY2x1ZGUgImV4Y2VwdC5oIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzLgorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgZ2xvYmFsX3Byb3RlY3QobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgZ2xvYmFsX25ld3RyeShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBwcm90ZWN0ZWRfKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGZpbmFsaXplKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGRvX25vdGhpbmcobHVhX1N0YXRlICpMKTsKKworLyogZXhjZXB0IGZ1bmN0aW9ucyAqLworc3RhdGljIGx1YUxfcmVnIGZ1bmNbXSA9IHsKKyAgICB7Im5ld3RyeSIsICAgIGdsb2JhbF9uZXd0cnl9LAorICAgIHsicHJvdGVjdCIsICAgZ2xvYmFsX3Byb3RlY3R9LAorICAgIHtOVUxMLCAgICAgICAgTlVMTH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFRyeSBmYWN0b3J5CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgd3JhcChsdWFfU3RhdGUgKkwpIHsKKyAgICBsdWFfbmV3dGFibGUoTCk7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMyk7CisgICAgbHVhX3NldHRhYmxlKEwsIC0zKTsKKyAgICBsdWFfaW5zZXJ0KEwsIC0yKTsKKyAgICBsdWFfcG9wKEwsIDEpOworfQorCitzdGF0aWMgaW50IGZpbmFsaXplKGx1YV9TdGF0ZSAqTCkgeworICAgIGlmICghbHVhX3RvYm9vbGVhbihMLCAxKSkgeworICAgICAgICBsdWFfcHVzaHZhbHVlKEwsIGx1YV91cHZhbHVlaW5kZXgoMSkpOworICAgICAgICBsdWFfcGNhbGwoTCwgMCwgMCwgMCk7CisgICAgICAgIGx1YV9zZXR0b3AoTCwgMik7CisgICAgICAgIHdyYXAoTCk7CisgICAgICAgIGx1YV9lcnJvcihMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHJldHVybiBsdWFfZ2V0dG9wKEwpOworfQorCitzdGF0aWMgaW50IGRvX25vdGhpbmcobHVhX1N0YXRlICpMKSB7IAorICAgICh2b2lkKSBMOworICAgIHJldHVybiAwOyAKK30KKworc3RhdGljIGludCBnbG9iYWxfbmV3dHJ5KGx1YV9TdGF0ZSAqTCkgeworICAgIGx1YV9zZXR0b3AoTCwgMSk7CisgICAgaWYgKGx1YV9pc25pbChMLCAxKSkgbHVhX3B1c2hjZnVuY3Rpb24oTCwgZG9fbm90aGluZyk7CisgICAgbHVhX3B1c2hjY2xvc3VyZShMLCBmaW5hbGl6ZSwgMSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFByb3RlY3QgZmFjdG9yeQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdW53cmFwKGx1YV9TdGF0ZSAqTCkgeworICAgIGlmIChsdWFfaXN0YWJsZShMLCAtMSkpIHsKKyAgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgICAgIGx1YV9nZXR0YWJsZShMLCAtMik7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfaW5zZXJ0KEwsIC0yKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb3RlY3RlZF8obHVhX1N0YXRlICpMKSB7CisgICAgbHVhX3B1c2h2YWx1ZShMLCBsdWFfdXB2YWx1ZWluZGV4KDEpKTsKKyAgICBsdWFfaW5zZXJ0KEwsIDEpOworICAgIGlmIChsdWFfcGNhbGwoTCwgbHVhX2dldHRvcChMKSAtIDEsIExVQV9NVUxUUkVULCAwKSAhPSAwKSB7CisgICAgICAgIGlmICh1bndyYXAoTCkpIHJldHVybiAyOworICAgICAgICBlbHNlIGx1YV9lcnJvcihMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHJldHVybiBsdWFfZ2V0dG9wKEwpOworfQorCitzdGF0aWMgaW50IGdsb2JhbF9wcm90ZWN0KGx1YV9TdGF0ZSAqTCkgeworICAgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgcHJvdGVjdGVkXywgMSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluaXQgbW9kdWxlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGV4Y2VwdF9vcGVuKGx1YV9TdGF0ZSAqTCkgeworICAgIGx1YUxfb3BlbmxpYihMLCBOVUxMLCBmdW5jLCAwKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvZXhjZXB0LmggYi9sdWFzb2NrZXQtMi4wLjIvc3JjL2V4Y2VwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWZiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL2V4Y2VwdC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgRVhDRVBUX0gKKyNkZWZpbmUgRVhDRVBUX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEV4Y2VwdGlvbiBjb250cm9sCisqIEx1YVNvY2tldCB0b29sa2l0IChidXQgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIG90aGVyIG1vZHVsZXMpCisqCisqIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3Igc2ltcGxlIGV4Y2VwdGlvbnMgaW4gTHVhLiBEdXJpbmcgdGhlCisqIGRldmVsb3BtZW50IG9mIHRoZSBIVFRQL0ZUUC9TTVRQIHN1cHBvcnQsIGl0IGJlY2FtZSBhcGFyZW50IHRoYXQKKyogZXJyb3IgY2hlY2tpbmcgd2FzIHRha2luZyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiB0aGUgY29kaW5nLiBUaGVzZQorKiBmdW5jdGlvbiBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGNoZWNraW5nIGVycm9ycy4KKyoKKyogVGhlIG1haW4gaWRlYSBpcyB0aGF0IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIG5pbCBhcyBpdHMgZmlyc3QgcmV0dXJuCisqIHZhbHVlIHdoZW4gaXQgZmluZHMgYW4gZXJyb3IsIGFuZCByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSAob3IgdmFsdWUpCisqIGZvbGxvd2luZyBuaWwuIEluIGNhc2Ugb2Ygc3VjY2VzcywgYXMgbG9uZyBhcyB0aGUgZmlyc3QgdmFsdWUgaXMgbm90IG5pbCwKKyogdGhlIG90aGVyIHZhbHVlcyBkb24ndCBtYXR0ZXIuCisqCisqIFRoZSBpZGVhIGlzIHRvIG5lc3QgZnVuY3Rpb24gY2FsbHMgd2l0aCB0aGUgInRyeSIgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24KKyogY2hlY2tzIHRoZSBmaXJzdCB2YWx1ZSwgYW5kIGNhbGxzICJlcnJvciIgb24gdGhlIHNlY29uZCBpZiB0aGUgZmlyc3QgaXMKKyogbmlsLiBPdGhlcndpc2UsIGl0IHJldHVybnMgYWxsIHZhbHVlcyBpdCByZWNlaXZlZC4gCisqCisqIFRoZSBwcm90ZWN0IGZ1bmN0aW9uIHJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCBiZWhhdmVzIGV4YWN0bHkgbGlrZSB0aGUKKyogZnVuY3Rpb24gaXQgcmVjZWl2ZXMsIGJ1dCB0aGUgbmV3IGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3cgZXhjZXB0aW9uczogaXQKKyogcmV0dXJucyBuaWwgZm9sbG93ZWQgYnkgdGhlIGVycm9yIG1lc3NhZ2UgaW5zdGVhZC4KKyoKKyogV2l0aCB0aGVzZSB0d28gZnVuY3Rpb24sIGl0J3MgZWFzeSB0byB3cml0ZSBmdW5jdGlvbnMgdGhhdCB0aHJvdworKiBleGNlcHRpb25zIG9uIGVycm9yLCBidXQgdGhhdCBkb24ndCBpbnRlcnJ1cHQgdGhlIHVzZXIgc2NyaXB0LiAKKyoKKyogUkNTIElEOiAkSWQ6IGV4Y2VwdC5oLHYgMS4yIDIwMDUvMDkvMjkgMDY6MTE6NDEgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJsdWEuaCIKKworaW50IGV4Y2VwdF9vcGVuKGx1YV9TdGF0ZSAqTCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy9mdHAubHVhIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9mdHAubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGY2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL2Z0cC5sdWEKQEAgLTAsMCArMSwyODEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBGVFAgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorLS0gTHVhU29ja2V0IHRvb2xraXQuCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogZnRwLmx1YSx2IDEuNDUgMjAwNy8wNy8xMSAxOToyNTo0NyBkaWVnbyBFeHAgJAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIERlY2xhcmUgbW9kdWxlIGFuZCBpbXBvcnQgZGVwZW5kZW5jaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgYmFzZSA9IF9HCitsb2NhbCB0YWJsZSA9IHJlcXVpcmUoInRhYmxlIikKK2xvY2FsIHN0cmluZyA9IHJlcXVpcmUoInN0cmluZyIpCitsb2NhbCBtYXRoID0gcmVxdWlyZSgibWF0aCIpCitsb2NhbCBzb2NrZXQgPSByZXF1aXJlKCJzb2NrZXQiKQorbG9jYWwgdXJsID0gcmVxdWlyZSgic29ja2V0LnVybCIpCitsb2NhbCB0cCA9IHJlcXVpcmUoInNvY2tldC50cCIpCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKK21vZHVsZSgic29ja2V0LmZ0cCIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQcm9ncmFtIGNvbnN0YW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHRpbWVvdXQgaW4gc2Vjb25kcyBiZWZvcmUgdGhlIHByb2dyYW0gZ2l2ZXMgdXAgb24gYSBjb25uZWN0aW9uCitUSU1FT1VUID0gNjAKKy0tIGRlZmF1bHQgcG9ydCBmb3IgZnRwIHNlcnZpY2UKK1BPUlQgPSAyMQorLS0gdGhpcyBpcyB0aGUgZGVmYXVsdCBhbm9ueW1vdXMgcGFzc3dvcmQuIHVzZWQgd2hlbiBubyBwYXNzd29yZCBpcworLS0gcHJvdmlkZWQgaW4gdXJsLiBzaG91bGQgYmUgY2hhbmdlZCB0byB5b3VyIGUtbWFpbC4KK1VTRVIgPSAiZnRwIgorUEFTU1dPUkQgPSAiYW5vbnltb3VzQGFub255bW91cy5vcmciCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBMb3cgbGV2ZWwgRlRQIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIG1ldGF0ID0geyBfX2luZGV4ID0ge30gfQorCitmdW5jdGlvbiBvcGVuKHNlcnZlciwgcG9ydCwgY3JlYXRlKQorICAgIGxvY2FsIHRwID0gc29ja2V0LnRyeSh0cC5jb25uZWN0KHNlcnZlciwgcG9ydCBvciBQT1JULCBUSU1FT1VULCBjcmVhdGUpKQorICAgIGxvY2FsIGYgPSBiYXNlLnNldG1ldGF0YWJsZSh7IHRwID0gdHAgfSwgbWV0YXQpCisgICAgLS0gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgZ2V0cyBjbG9zZWQgaW4gYW4gZXhjZXB0aW9uCisgICAgZi50cnkgPSBzb2NrZXQubmV3dHJ5KGZ1bmN0aW9uKCkgZjpjbG9zZSgpIGVuZCkKKyAgICByZXR1cm4gZgorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6cG9ydGNvbm5lY3QoKQorICAgIHNlbGYudHJ5KHNlbGYuc2VydmVyOnNldHRpbWVvdXQoVElNRU9VVCkpCisgICAgc2VsZi5kYXRhID0gc2VsZi50cnkoc2VsZi5zZXJ2ZXI6YWNjZXB0KCkpCisgICAgc2VsZi50cnkoc2VsZi5kYXRhOnNldHRpbWVvdXQoVElNRU9VVCkpCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpwYXN2Y29ubmVjdCgpCisgICAgc2VsZi5kYXRhID0gc2VsZi50cnkoc29ja2V0LnRjcCgpKQorICAgIHNlbGYudHJ5KHNlbGYuZGF0YTpzZXR0aW1lb3V0KFRJTUVPVVQpKQorICAgIHNlbGYudHJ5KHNlbGYuZGF0YTpjb25uZWN0KHNlbGYucGFzdnQuaXAsIHNlbGYucGFzdnQucG9ydCkpCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpsb2dpbih1c2VyLCBwYXNzd29yZCkKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoInVzZXIiLCB1c2VyIG9yIFVTRVIpKQorICAgIGxvY2FsIGNvZGUsIHJlcGx5ID0gc2VsZi50cnkoc2VsZi50cDpjaGVja3siMi4uIiwgMzMxfSkKKyAgICBpZiBjb2RlID09IDMzMSB0aGVuCisgICAgICAgIHNlbGYudHJ5KHNlbGYudHA6Y29tbWFuZCgicGFzcyIsIHBhc3N3b3JkIG9yIFBBU1NXT1JEKSkKKyAgICAgICAgc2VsZi50cnkoc2VsZi50cDpjaGVjaygiMi4uIikpCisgICAgZW5kCisgICAgcmV0dXJuIDEKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnBhc3YoKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y29tbWFuZCgicGFzdiIpKQorICAgIGxvY2FsIGNvZGUsIHJlcGx5ID0gc2VsZi50cnkoc2VsZi50cDpjaGVjaygiMi4uIikpCisgICAgbG9jYWwgcGF0dGVybiA9ICIoJWQrKSVEKCVkKyklRCglZCspJUQoJWQrKSVEKCVkKyklRCglZCspIgorICAgIGxvY2FsIGEsIGIsIGMsIGQsIHAxLCBwMiA9IHNvY2tldC5za2lwKDIsIHN0cmluZy5maW5kKHJlcGx5LCBwYXR0ZXJuKSkKKyAgICBzZWxmLnRyeShhIGFuZCBiIGFuZCBjIGFuZCBkIGFuZCBwMSBhbmQgcDIsIHJlcGx5KQorICAgIHNlbGYucGFzdnQgPSB7CisgICAgICAgIGlwID0gc3RyaW5nLmZvcm1hdCgiJWQuJWQuJWQuJWQiLCBhLCBiLCBjLCBkKSwKKyAgICAgICAgcG9ydCA9IHAxKjI1NiArIHAyCisgICAgfQorICAgIGlmIHNlbGYuc2VydmVyIHRoZW4KKyAgICAgICAgc2VsZi5zZXJ2ZXI6Y2xvc2UoKQorICAgICAgICBzZWxmLnNlcnZlciA9IG5pbAorICAgIGVuZAorICAgIHJldHVybiBzZWxmLnBhc3Z0LmlwLCBzZWxmLnBhc3Z0LnBvcnQKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnBvcnQoaXAsIHBvcnQpCisgICAgc2VsZi5wYXN2dCA9IG5pbAorICAgIGlmIG5vdCBpcCB0aGVuCisgICAgICAgIGlwLCBwb3J0ID0gc2VsZi50cnkoc2VsZi50cDpnZXRjb250cm9sKCk6Z2V0c29ja25hbWUoKSkKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZWxmLnRyeShzb2NrZXQuYmluZChpcCwgMCkpCisgICAgICAgIGlwLCBwb3J0ID0gc2VsZi50cnkoc2VsZi5zZXJ2ZXI6Z2V0c29ja25hbWUoKSkKKyAgICAgICAgc2VsZi50cnkoc2VsZi5zZXJ2ZXI6c2V0dGltZW91dChUSU1FT1VUKSkKKyAgICBlbmQKKyAgICBsb2NhbCBwbCA9IG1hdGgubW9kKHBvcnQsIDI1NikKKyAgICBsb2NhbCBwaCA9IChwb3J0IC0gcGwpLzI1NgorICAgIGxvY2FsIGFyZyA9IHN0cmluZy5nc3ViKHN0cmluZy5mb3JtYXQoIiVzLCVkLCVkIiwgaXAsIHBoLCBwbCksICIlLiIsICIsIikKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoInBvcnQiLCBhcmcpKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y2hlY2soIjIuLiIpKQorICAgIHJldHVybiAxCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpzZW5kKHNlbmR0KQorICAgIHNlbGYudHJ5KHNlbGYucGFzdnQgb3Igc2VsZi5zZXJ2ZXIsICJuZWVkIHBvcnQgb3IgcGFzdiBmaXJzdCIpCisgICAgLS0gaWYgdGhlcmUgaXMgYSBwYXN2dCB0YWJsZSwgd2UgYWxyZWFkeSBzZW50IGEgUEFTViBjb21tYW5kCisgICAgLS0gd2UganVzdCBnZXQgdGhlIGRhdGEgY29ubmVjdGlvbiBpbnRvIHNlbGYuZGF0YQorICAgIGlmIHNlbGYucGFzdnQgdGhlbiBzZWxmOnBhc3Zjb25uZWN0KCkgZW5kCisgICAgLS0gZ2V0IHRoZSB0cmFuc2ZlciBhcmd1bWVudCBhbmQgY29tbWFuZAorICAgIGxvY2FsIGFyZ3VtZW50ID0gc2VuZHQuYXJndW1lbnQgb3IKKyAgICAgICAgdXJsLnVuZXNjYXBlKHN0cmluZy5nc3ViKHNlbmR0LnBhdGggb3IgIiIsICJeWy9cXF0iLCAiIikpCisgICAgaWYgYXJndW1lbnQgPT0gIiIgdGhlbiBhcmd1bWVudCA9IG5pbCBlbmQKKyAgICBsb2NhbCBjb21tYW5kID0gc2VuZHQuY29tbWFuZCBvciAic3RvciIKKyAgICAtLSBzZW5kIHRoZSB0cmFuc2ZlciBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVwbHkKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoY29tbWFuZCwgYXJndW1lbnQpKQorICAgIGxvY2FsIGNvZGUsIHJlcGx5ID0gc2VsZi50cnkoc2VsZi50cDpjaGVja3siMi4uIiwgIjEuLiJ9KQorICAgIC0tIGlmIHRoZXJlIGlzIG5vdCBhIGEgcGFzdnQgdGFibGUsIHRoZW4gdGhlcmUgaXMgYSBzZXJ2ZXIKKyAgICAtLSBhbmQgd2UgYWxyZWFkeSBzZW50IGEgUE9SVCBjb21tYW5kCisgICAgaWYgbm90IHNlbGYucGFzdnQgdGhlbiBzZWxmOnBvcnRjb25uZWN0KCkgZW5kCisgICAgLS0gZ2V0IHRoZSBzaW5rLCBzb3VyY2UgYW5kIHN0ZXAgZm9yIHRoZSB0cmFuc2ZlcgorICAgIGxvY2FsIHN0ZXAgPSBzZW5kdC5zdGVwIG9yIGx0bjEyLnB1bXAuc3RlcAorICAgIGxvY2FsIHJlYWR0ID0ge3NlbGYudHAuY30KKyAgICBsb2NhbCBjaGVja3N0ZXAgPSBmdW5jdGlvbihzcmMsIHNuaykKKyAgICAgICAgLS0gY2hlY2sgc3RhdHVzIGluIGNvbnRyb2wgY29ubmVjdGlvbiB3aGlsZSBkb3dubG9hZGluZworICAgICAgICBsb2NhbCByZWFkeXQgPSBzb2NrZXQuc2VsZWN0KHJlYWR0LCBuaWwsIDApCisgICAgICAgIGlmIHJlYWR5dFt0cF0gdGhlbiBjb2RlID0gc2VsZi50cnkoc2VsZi50cDpjaGVjaygiMi4uIikpIGVuZAorICAgICAgICByZXR1cm4gc3RlcChzcmMsIHNuaykKKyAgICBlbmQKKyAgICBsb2NhbCBzaW5rID0gc29ja2V0LnNpbmsoImNsb3NlLXdoZW4tZG9uZSIsIHNlbGYuZGF0YSkKKyAgICAtLSB0cmFuc2ZlciBhbGwgZGF0YSBhbmQgY2hlY2sgZXJyb3IKKyAgICBzZWxmLnRyeShsdG4xMi5wdW1wLmFsbChzZW5kdC5zb3VyY2UsIHNpbmssIGNoZWNrc3RlcCkpCisgICAgaWYgc3RyaW5nLmZpbmQoY29kZSwgIjEuLiIpIHRoZW4gc2VsZi50cnkoc2VsZi50cDpjaGVjaygiMi4uIikpIGVuZAorICAgIC0tIGRvbmUgd2l0aCBkYXRhIGNvbm5lY3Rpb24KKyAgICBzZWxmLmRhdGE6Y2xvc2UoKQorICAgIC0tIGZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIHdlcmUgc2VudAorICAgIGxvY2FsIHNlbnQgPSBzb2NrZXQuc2tpcCgxLCBzZWxmLmRhdGE6Z2V0c3RhdHMoKSkKKyAgICBzZWxmLmRhdGEgPSBuaWwKKyAgICByZXR1cm4gc2VudAorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6cmVjZWl2ZShyZWN2dCkKKyAgICBzZWxmLnRyeShzZWxmLnBhc3Z0IG9yIHNlbGYuc2VydmVyLCAibmVlZCBwb3J0IG9yIHBhc3YgZmlyc3QiKQorICAgIGlmIHNlbGYucGFzdnQgdGhlbiBzZWxmOnBhc3Zjb25uZWN0KCkgZW5kCisgICAgbG9jYWwgYXJndW1lbnQgPSByZWN2dC5hcmd1bWVudCBvcgorICAgICAgICB1cmwudW5lc2NhcGUoc3RyaW5nLmdzdWIocmVjdnQucGF0aCBvciAiIiwgIl5bL1xcXSIsICIiKSkKKyAgICBpZiBhcmd1bWVudCA9PSAiIiB0aGVuIGFyZ3VtZW50ID0gbmlsIGVuZAorICAgIGxvY2FsIGNvbW1hbmQgPSByZWN2dC5jb21tYW5kIG9yICJyZXRyIgorICAgIHNlbGYudHJ5KHNlbGYudHA6Y29tbWFuZChjb21tYW5kLCBhcmd1bWVudCkpCisgICAgbG9jYWwgY29kZSA9IHNlbGYudHJ5KHNlbGYudHA6Y2hlY2t7IjEuLiIsICIyLi4ifSkKKyAgICBpZiBub3Qgc2VsZi5wYXN2dCB0aGVuIHNlbGY6cG9ydGNvbm5lY3QoKSBlbmQKKyAgICBsb2NhbCBzb3VyY2UgPSBzb2NrZXQuc291cmNlKCJ1bnRpbC1jbG9zZWQiLCBzZWxmLmRhdGEpCisgICAgbG9jYWwgc3RlcCA9IHJlY3Z0LnN0ZXAgb3IgbHRuMTIucHVtcC5zdGVwCisgICAgc2VsZi50cnkobHRuMTIucHVtcC5hbGwoc291cmNlLCByZWN2dC5zaW5rLCBzdGVwKSkKKyAgICBpZiBzdHJpbmcuZmluZChjb2RlLCAiMS4uIikgdGhlbiBzZWxmLnRyeShzZWxmLnRwOmNoZWNrKCIyLi4iKSkgZW5kCisgICAgc2VsZi5kYXRhOmNsb3NlKCkKKyAgICBzZWxmLmRhdGEgPSBuaWwKKyAgICByZXR1cm4gMQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6Y3dkKGRpcikKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoImN3ZCIsIGRpcikpCisgICAgc2VsZi50cnkoc2VsZi50cDpjaGVjaygyNTApKQorICAgIHJldHVybiAxCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDp0eXBlKHR5cGUpCisgICAgc2VsZi50cnkoc2VsZi50cDpjb21tYW5kKCJ0eXBlIiwgdHlwZSkpCisgICAgc2VsZi50cnkoc2VsZi50cDpjaGVjaygyMDApKQorICAgIHJldHVybiAxCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpncmVldCgpCisgICAgbG9jYWwgY29kZSA9IHNlbGYudHJ5KHNlbGYudHA6Y2hlY2t7IjEuLiIsICIyLi4ifSkKKyAgICBpZiBzdHJpbmcuZmluZChjb2RlLCAiMS4uIikgdGhlbiBzZWxmLnRyeShzZWxmLnRwOmNoZWNrKCIyLi4iKSkgZW5kCisgICAgcmV0dXJuIDEKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnF1aXQoKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y29tbWFuZCgicXVpdCIpKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y2hlY2soIjIuLiIpKQorICAgIHJldHVybiAxCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpjbG9zZSgpCisgICAgaWYgc2VsZi5kYXRhIHRoZW4gc2VsZi5kYXRhOmNsb3NlKCkgZW5kCisgICAgaWYgc2VsZi5zZXJ2ZXIgdGhlbiBzZWxmLnNlcnZlcjpjbG9zZSgpIGVuZAorICAgIHJldHVybiBzZWxmLnRwOmNsb3NlKCkKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gSGlnaCBsZXZlbCBGVFAgQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgZnVuY3Rpb24gb3ZlcnJpZGUodCkKKyAgICBpZiB0LnVybCB0aGVuCisgICAgICAgIGxvY2FsIHUgPSB1cmwucGFyc2UodC51cmwpCisgICAgICAgIGZvciBpLHYgaW4gYmFzZS5wYWlycyh0KSBkbworICAgICAgICAgICAgdVtpXSA9IHYKKyAgICAgICAgZW5kCisgICAgICAgIHJldHVybiB1CisgICAgZWxzZSByZXR1cm4gdCBlbmQKK2VuZAorCitsb2NhbCBmdW5jdGlvbiB0cHV0KHB1dHQpCisgICAgcHV0dCA9IG92ZXJyaWRlKHB1dHQpCisgICAgc29ja2V0LnRyeShwdXR0Lmhvc3QsICJtaXNzaW5nIGhvc3RuYW1lIikKKyAgICBsb2NhbCBmID0gb3BlbihwdXR0Lmhvc3QsIHB1dHQucG9ydCwgcHV0dC5jcmVhdGUpCisgICAgZjpncmVldCgpCisgICAgZjpsb2dpbihwdXR0LnVzZXIsIHB1dHQucGFzc3dvcmQpCisgICAgaWYgcHV0dC50eXBlIHRoZW4gZjp0eXBlKHB1dHQudHlwZSkgZW5kCisgICAgZjpwYXN2KCkKKyAgICBsb2NhbCBzZW50ID0gZjpzZW5kKHB1dHQpCisgICAgZjpxdWl0KCkKKyAgICBmOmNsb3NlKCkKKyAgICByZXR1cm4gc2VudAorZW5kCisKK2xvY2FsIGRlZmF1bHQgPSB7CisJcGF0aCA9ICIvIiwKKwlzY2hlbWUgPSAiZnRwIgorfQorCitsb2NhbCBmdW5jdGlvbiBwYXJzZSh1KQorICAgIGxvY2FsIHQgPSBzb2NrZXQudHJ5KHVybC5wYXJzZSh1LCBkZWZhdWx0KSkKKyAgICBzb2NrZXQudHJ5KHQuc2NoZW1lID09ICJmdHAiLCAid3Jvbmcgc2NoZW1lICciIC4uIHQuc2NoZW1lIC4uICInIikKKyAgICBzb2NrZXQudHJ5KHQuaG9zdCwgIm1pc3NpbmcgaG9zdG5hbWUiKQorICAgIGxvY2FsIHBhdCA9ICJedHlwZT0oLikkIgorICAgIGlmIHQucGFyYW1zIHRoZW4KKyAgICAgICAgdC50eXBlID0gc29ja2V0LnNraXAoMiwgc3RyaW5nLmZpbmQodC5wYXJhbXMsIHBhdCkpCisgICAgICAgIHNvY2tldC50cnkodC50eXBlID09ICJhIiBvciB0LnR5cGUgPT0gImkiLAorICAgICAgICAgICAgImludmFsaWQgdHlwZSAnIiAuLiB0LnR5cGUgLi4gIiciKQorICAgIGVuZAorICAgIHJldHVybiB0CitlbmQKKworbG9jYWwgZnVuY3Rpb24gc3B1dCh1LCBib2R5KQorICAgIGxvY2FsIHB1dHQgPSBwYXJzZSh1KQorICAgIHB1dHQuc291cmNlID0gbHRuMTIuc291cmNlLnN0cmluZyhib2R5KQorICAgIHJldHVybiB0cHV0KHB1dHQpCitlbmQKKworcHV0ID0gc29ja2V0LnByb3RlY3QoZnVuY3Rpb24ocHV0dCwgYm9keSkKKyAgICBpZiBiYXNlLnR5cGUocHV0dCkgPT0gInN0cmluZyIgdGhlbiByZXR1cm4gc3B1dChwdXR0LCBib2R5KQorICAgIGVsc2UgcmV0dXJuIHRwdXQocHV0dCkgZW5kCitlbmQpCisKK2xvY2FsIGZ1bmN0aW9uIHRnZXQoZ2V0dCkKKyAgICBnZXR0ID0gb3ZlcnJpZGUoZ2V0dCkKKyAgICBzb2NrZXQudHJ5KGdldHQuaG9zdCwgIm1pc3NpbmcgaG9zdG5hbWUiKQorICAgIGxvY2FsIGYgPSBvcGVuKGdldHQuaG9zdCwgZ2V0dC5wb3J0LCBnZXR0LmNyZWF0ZSkKKyAgICBmOmdyZWV0KCkKKyAgICBmOmxvZ2luKGdldHQudXNlciwgZ2V0dC5wYXNzd29yZCkKKyAgICBpZiBnZXR0LnR5cGUgdGhlbiBmOnR5cGUoZ2V0dC50eXBlKSBlbmQKKyAgICBmOnBhc3YoKQorICAgIGY6cmVjZWl2ZShnZXR0KQorICAgIGY6cXVpdCgpCisgICAgcmV0dXJuIGY6Y2xvc2UoKQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHNnZXQodSkKKyAgICBsb2NhbCBnZXR0ID0gcGFyc2UodSkKKyAgICBsb2NhbCB0ID0ge30KKyAgICBnZXR0LnNpbmsgPSBsdG4xMi5zaW5rLnRhYmxlKHQpCisgICAgdGdldChnZXR0KQorICAgIHJldHVybiB0YWJsZS5jb25jYXQodCkKK2VuZAorCitjb21tYW5kID0gc29ja2V0LnByb3RlY3QoZnVuY3Rpb24oY21kdCkKKyAgICBjbWR0ID0gb3ZlcnJpZGUoY21kdCkKKyAgICBzb2NrZXQudHJ5KGNtZHQuaG9zdCwgIm1pc3NpbmcgaG9zdG5hbWUiKQorICAgIHNvY2tldC50cnkoY21kdC5jb21tYW5kLCAibWlzc2luZyBjb21tYW5kIikKKyAgICBsb2NhbCBmID0gb3BlbihjbWR0Lmhvc3QsIGNtZHQucG9ydCwgY21kdC5jcmVhdGUpCisgICAgZjpncmVldCgpCisgICAgZjpsb2dpbihjbWR0LnVzZXIsIGNtZHQucGFzc3dvcmQpCisgICAgZi50cnkoZi50cDpjb21tYW5kKGNtZHQuY29tbWFuZCwgY21kdC5hcmd1bWVudCkpCisgICAgaWYgY21kdC5jaGVjayB0aGVuIGYudHJ5KGYudHA6Y2hlY2soY21kdC5jaGVjaykpIGVuZAorICAgIGY6cXVpdCgpCisgICAgcmV0dXJuIGY6Y2xvc2UoKQorZW5kKQorCitnZXQgPSBzb2NrZXQucHJvdGVjdChmdW5jdGlvbihnZXR0KQorICAgIGlmIGJhc2UudHlwZShnZXR0KSA9PSAic3RyaW5nIiB0aGVuIHJldHVybiBzZ2V0KGdldHQpCisgICAgZWxzZSByZXR1cm4gdGdldChnZXR0KSBlbmQKK2VuZCkKKwpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy9odHRwLmx1YSBiL2x1YXNvY2tldC0yLjAuMi9zcmMvaHR0cC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ZGIxZQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvaHR0cC5sdWEKQEAgLTAsMCArMSwzNTAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBIVFRQLzEuMSBjbGllbnQgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZS4KKy0tIEx1YVNvY2tldCB0b29sa2l0LgorLS0gQXV0aG9yOiBEaWVnbyBOZWhhYgorLS0gUkNTIElEOiAkSWQ6IGh0dHAubHVhLHYgMS43MSAyMDA3LzEwLzEzIDIzOjU1OjIwIGRpZWdvIEV4cCAkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gRGVjbGFyZSBtb2R1bGUgYW5kIGltcG9ydCBkZXBlbmRlbmNpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCitsb2NhbCB1cmwgPSByZXF1aXJlKCJzb2NrZXQudXJsIikKK2xvY2FsIGx0bjEyID0gcmVxdWlyZSgibHRuMTIiKQorbG9jYWwgbWltZSA9IHJlcXVpcmUoIm1pbWUiKQorbG9jYWwgc3RyaW5nID0gcmVxdWlyZSgic3RyaW5nIikKK2xvY2FsIGJhc2UgPSBfRworbG9jYWwgdGFibGUgPSByZXF1aXJlKCJ0YWJsZSIpCittb2R1bGUoInNvY2tldC5odHRwIikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFByb2dyYW0gY29uc3RhbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMKK1RJTUVPVVQgPSA2MAorLS0gZGVmYXVsdCBwb3J0IGZvciBkb2N1bWVudCByZXRyaWV2YWwKK1BPUlQgPSA4MAorLS0gdXNlciBhZ2VudCBmaWVsZCBzZW50IGluIHJlcXVlc3QKK1VTRVJBR0VOVCA9IHNvY2tldC5fVkVSU0lPTgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUmVhZHMgTUlNRSBoZWFkZXJzIGZyb20gYSBjb25uZWN0aW9uLCB1bmZvbGRpbmcgd2hlcmUgbmVlZGVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgZnVuY3Rpb24gcmVjZWl2ZWhlYWRlcnMoc29jaywgaGVhZGVycykKKyAgICBsb2NhbCBsaW5lLCBuYW1lLCB2YWx1ZSwgZXJyCisgICAgaGVhZGVycyA9IGhlYWRlcnMgb3Ige30KKyAgICAtLSBnZXQgZmlyc3QgbGluZQorICAgIGxpbmUsIGVyciA9IHNvY2s6cmVjZWl2ZSgpCisgICAgaWYgZXJyIHRoZW4gcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgIC0tIGhlYWRlcnMgZ28gdW50aWwgYSBibGFuayBsaW5lIGlzIGZvdW5kCisgICAgd2hpbGUgbGluZSB+PSAiIiBkbworICAgICAgICAtLSBnZXQgZmllbGQtbmFtZSBhbmQgdmFsdWUKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBzb2NrZXQuc2tpcCgyLCBzdHJpbmcuZmluZChsaW5lLCAiXiguLSk6JXMqKC4qKSIpKQorICAgICAgICBpZiBub3QgKG5hbWUgYW5kIHZhbHVlKSB0aGVuIHJldHVybiBuaWwsICJtYWxmb3JtZWQgcmVwb25zZSBoZWFkZXJzIiBlbmQKKyAgICAgICAgbmFtZSA9IHN0cmluZy5sb3dlcihuYW1lKQorICAgICAgICAtLSBnZXQgbmV4dCBsaW5lICh2YWx1ZSBtaWdodCBiZSBmb2xkZWQpCisgICAgICAgIGxpbmUsIGVyciAgPSBzb2NrOnJlY2VpdmUoKQorICAgICAgICBpZiBlcnIgdGhlbiByZXR1cm4gbmlsLCBlcnIgZW5kCisgICAgICAgIC0tIHVuZm9sZCBhbnkgZm9sZGVkIHZhbHVlcworICAgICAgICB3aGlsZSBzdHJpbmcuZmluZChsaW5lLCAiXiVzIikgZG8KKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgLi4gbGluZQorICAgICAgICAgICAgbGluZSA9IHNvY2s6cmVjZWl2ZSgpCisgICAgICAgICAgICBpZiBlcnIgdGhlbiByZXR1cm4gbmlsLCBlcnIgZW5kCisgICAgICAgIGVuZAorICAgICAgICAtLSBzYXZlIHBhaXIgaW4gdGFibGUKKyAgICAgICAgaWYgaGVhZGVyc1tuYW1lXSB0aGVuIGhlYWRlcnNbbmFtZV0gPSBoZWFkZXJzW25hbWVdIC4uICIsICIgLi4gdmFsdWUKKyAgICAgICAgZWxzZSBoZWFkZXJzW25hbWVdID0gdmFsdWUgZW5kCisgICAgZW5kCisgICAgcmV0dXJuIGhlYWRlcnMKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gRXh0cmEgc291cmNlcyBhbmQgc2lua3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzb2NrZXQuc291cmNldFsiaHR0cC1jaHVua2VkIl0gPSBmdW5jdGlvbihzb2NrLCBoZWFkZXJzKQorICAgIHJldHVybiBiYXNlLnNldG1ldGF0YWJsZSh7CisgICAgICAgIGdldGZkID0gZnVuY3Rpb24oKSByZXR1cm4gc29jazpnZXRmZCgpIGVuZCwKKyAgICAgICAgZGlydHkgPSBmdW5jdGlvbigpIHJldHVybiBzb2NrOmRpcnR5KCkgZW5kCisgICAgfSwgeworICAgICAgICBfX2NhbGwgPSBmdW5jdGlvbigpCisgICAgICAgICAgICAtLSBnZXQgY2h1bmsgc2l6ZSwgc2tpcCBleHRlbnRpb24KKyAgICAgICAgICAgIGxvY2FsIGxpbmUsIGVyciA9IHNvY2s6cmVjZWl2ZSgpCisgICAgICAgICAgICBpZiBlcnIgdGhlbiByZXR1cm4gbmlsLCBlcnIgZW5kCisgICAgICAgICAgICBsb2NhbCBzaXplID0gYmFzZS50b251bWJlcihzdHJpbmcuZ3N1YihsaW5lLCAiOy4qIiwgIiIpLCAxNikKKyAgICAgICAgICAgIGlmIG5vdCBzaXplIHRoZW4gcmV0dXJuIG5pbCwgImludmFsaWQgY2h1bmsgc2l6ZSIgZW5kCisgICAgICAgICAgICAtLSB3YXMgaXQgdGhlIGxhc3QgY2h1bms/CisgICAgICAgICAgICBpZiBzaXplID4gMCB0aGVuCisgICAgICAgICAgICAgICAgLS0gaWYgbm90LCBnZXQgY2h1bmsgYW5kIHNraXAgdGVybWluYXRpbmcgQ1JMRgorICAgICAgICAgICAgICAgIGxvY2FsIGNodW5rLCBlcnIsIHBhcnQgPSBzb2NrOnJlY2VpdmUoc2l6ZSkKKyAgICAgICAgICAgICAgICBpZiBjaHVuayB0aGVuIHNvY2s6cmVjZWl2ZSgpIGVuZAorICAgICAgICAgICAgICAgIHJldHVybiBjaHVuaywgZXJyCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLS0gaWYgaXQgd2FzLCByZWFkIHRyYWlsZXJzIGludG8gaGVhZGVycyB0YWJsZQorICAgICAgICAgICAgICAgIGhlYWRlcnMsIGVyciA9IHJlY2VpdmVoZWFkZXJzKHNvY2ssIGhlYWRlcnMpCisgICAgICAgICAgICAgICAgaWYgbm90IGhlYWRlcnMgdGhlbiByZXR1cm4gbmlsLCBlcnIgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgfSkKK2VuZAorCitzb2NrZXQuc2lua3RbImh0dHAtY2h1bmtlZCJdID0gZnVuY3Rpb24oc29jaykKKyAgICByZXR1cm4gYmFzZS5zZXRtZXRhdGFibGUoeworICAgICAgICBnZXRmZCA9IGZ1bmN0aW9uKCkgcmV0dXJuIHNvY2s6Z2V0ZmQoKSBlbmQsCisgICAgICAgIGRpcnR5ID0gZnVuY3Rpb24oKSByZXR1cm4gc29jazpkaXJ0eSgpIGVuZAorICAgIH0sIHsKKyAgICAgICAgX19jYWxsID0gZnVuY3Rpb24oc2VsZiwgY2h1bmssIGVycikKKyAgICAgICAgICAgIGlmIG5vdCBjaHVuayB0aGVuIHJldHVybiBzb2NrOnNlbmQoIjBcclxuXHJcbiIpIGVuZAorICAgICAgICAgICAgbG9jYWwgc2l6ZSA9IHN0cmluZy5mb3JtYXQoIiVYXHJcbiIsIHN0cmluZy5sZW4oY2h1bmspKQorICAgICAgICAgICAgcmV0dXJuIHNvY2s6c2VuZChzaXplIC4uICBjaHVuayAuLiAiXHJcbiIpCisgICAgICAgIGVuZAorICAgIH0pCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIExvdyBsZXZlbCBIVFRQIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIG1ldGF0ID0geyBfX2luZGV4ID0ge30gfQorCitmdW5jdGlvbiBvcGVuKGhvc3QsIHBvcnQsIGNyZWF0ZSkKKyAgICAtLSBjcmVhdGUgc29ja2V0IHdpdGggdXNlciBjb25uZWN0IGZ1bmN0aW9uLCBvciB3aXRoIGRlZmF1bHQKKyAgICBsb2NhbCBjID0gc29ja2V0LnRyeSgoY3JlYXRlIG9yIHNvY2tldC50Y3ApKCkpCisgICAgbG9jYWwgaCA9IGJhc2Uuc2V0bWV0YXRhYmxlKHsgYyA9IGMgfSwgbWV0YXQpCisgICAgLS0gY3JlYXRlIGZpbmFsaXplZCB0cnkKKyAgICBoLnRyeSA9IHNvY2tldC5uZXd0cnkoZnVuY3Rpb24oKSBoOmNsb3NlKCkgZW5kKQorICAgIC0tIHNldCB0aW1lb3V0IGJlZm9yZSBjb25uZWN0aW5nCisgICAgaC50cnkoYzpzZXR0aW1lb3V0KFRJTUVPVVQpKQorICAgIGgudHJ5KGM6Y29ubmVjdChob3N0LCBwb3J0IG9yIFBPUlQpKQorICAgIC0tIGhlcmUgZXZlcnl0aGluZyB3b3JrZWQKKyAgICByZXR1cm4gaAorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6c2VuZHJlcXVlc3RsaW5lKG1ldGhvZCwgdXJpKQorICAgIGxvY2FsIHJlcWxpbmUgPSBzdHJpbmcuZm9ybWF0KCIlcyAlcyBIVFRQLzEuMVxyXG4iLCBtZXRob2Qgb3IgIkdFVCIsIHVyaSkKKyAgICByZXR1cm4gc2VsZi50cnkoc2VsZi5jOnNlbmQocmVxbGluZSkpCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpzZW5kaGVhZGVycyhoZWFkZXJzKQorICAgIGxvY2FsIGggPSAiXHJcbiIKKyAgICBmb3IgaSwgdiBpbiBiYXNlLnBhaXJzKGhlYWRlcnMpIGRvCisgICAgICAgIGggPSBpIC4uICI6ICIgLi4gdiAuLiAiXHJcbiIgLi4gaAorICAgIGVuZAorICAgIHNlbGYudHJ5KHNlbGYuYzpzZW5kKGgpKQorICAgIHJldHVybiAxCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpzZW5kYm9keShoZWFkZXJzLCBzb3VyY2UsIHN0ZXApCisgICAgc291cmNlID0gc291cmNlIG9yIGx0bjEyLnNvdXJjZS5lbXB0eSgpCisgICAgc3RlcCA9IHN0ZXAgb3IgbHRuMTIucHVtcC5zdGVwCisgICAgLS0gaWYgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBpbiBhZHZhbmNlLCBzZW5kIGNodW5rZWQgYW5kIGhvcGUgZm9yIHRoZSBiZXN0CisgICAgbG9jYWwgbW9kZSA9ICJodHRwLWNodW5rZWQiCisgICAgaWYgaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSB0aGVuIG1vZGUgPSAia2VlcC1vcGVuIiBlbmQKKyAgICByZXR1cm4gc2VsZi50cnkobHRuMTIucHVtcC5hbGwoc291cmNlLCBzb2NrZXQuc2luayhtb2RlLCBzZWxmLmMpLCBzdGVwKSkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnJlY2VpdmVzdGF0dXNsaW5lKCkKKyAgICBsb2NhbCBzdGF0dXMgPSBzZWxmLnRyeShzZWxmLmM6cmVjZWl2ZSg1KSkKKyAgICAtLSBpZGVudGlmeSBIVFRQLzAuOSByZXNwb25zZXMsIHdoaWNoIGRvIG5vdCBjb250YWluIGEgc3RhdHVzIGxpbmUKKyAgICAtLSB0aGlzIGlzIGp1c3QgYSBoZXVyaXN0aWMsIGJ1dCBpcyB3aGF0IHRoZSBSRkMgcmVjb21tZW5kcworICAgIGlmIHN0YXR1cyB+PSAiSFRUUC8iIHRoZW4gcmV0dXJuIG5pbCwgc3RhdHVzIGVuZAorICAgIC0tIG90aGVyd2lzZSBwcm9jZWVkIHJlYWRpbmcgYSBzdGF0dXMgbGluZQorICAgIHN0YXR1cyA9IHNlbGYudHJ5KHNlbGYuYzpyZWNlaXZlKCIqbCIsIHN0YXR1cykpCisgICAgbG9jYWwgY29kZSA9IHNvY2tldC5za2lwKDIsIHN0cmluZy5maW5kKHN0YXR1cywgIkhUVFAvJWQqJS4lZCogKCVkJWQlZCkiKSkKKyAgICByZXR1cm4gc2VsZi50cnkoYmFzZS50b251bWJlcihjb2RlKSwgc3RhdHVzKQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6cmVjZWl2ZWhlYWRlcnMoKQorICAgIHJldHVybiBzZWxmLnRyeShyZWNlaXZlaGVhZGVycyhzZWxmLmMpKQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6cmVjZWl2ZWJvZHkoaGVhZGVycywgc2luaywgc3RlcCkKKyAgICBzaW5rID0gc2luayBvciBsdG4xMi5zaW5rLm51bGwoKQorICAgIHN0ZXAgPSBzdGVwIG9yIGx0bjEyLnB1bXAuc3RlcAorICAgIGxvY2FsIGxlbmd0aCA9IGJhc2UudG9udW1iZXIoaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSkKKyAgICBsb2NhbCB0ID0gaGVhZGVyc1sidHJhbnNmZXItZW5jb2RpbmciXSAtLSBzaG9ydGN1dAorICAgIGxvY2FsIG1vZGUgPSAiZGVmYXVsdCIgLS0gY29ubmVjdGlvbiBjbG9zZQorICAgIGlmIHQgYW5kIHQgfj0gImlkZW50aXR5IiB0aGVuIG1vZGUgPSAiaHR0cC1jaHVua2VkIgorICAgIGVsc2VpZiBiYXNlLnRvbnVtYmVyKGhlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0pIHRoZW4gbW9kZSA9ICJieS1sZW5ndGgiIGVuZAorICAgIHJldHVybiBzZWxmLnRyeShsdG4xMi5wdW1wLmFsbChzb2NrZXQuc291cmNlKG1vZGUsIHNlbGYuYywgbGVuZ3RoKSwKKyAgICAgICAgc2luaywgc3RlcCkpCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpyZWNlaXZlMDlib2R5KHN0YXR1cywgc2luaywgc3RlcCkKKyAgICBsb2NhbCBzb3VyY2UgPSBsdG4xMi5zb3VyY2UucmV3aW5kKHNvY2tldC5zb3VyY2UoInVudGlsLWNsb3NlZCIsIHNlbGYuYykpCisgICAgc291cmNlKHN0YXR1cykKKyAgICByZXR1cm4gc2VsZi50cnkobHRuMTIucHVtcC5hbGwoc291cmNlLCBzaW5rLCBzdGVwKSkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmNsb3NlKCkKKyAgICByZXR1cm4gc2VsZi5jOmNsb3NlKCkKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gSGlnaCBsZXZlbCBIVFRQIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGZ1bmN0aW9uIGFkanVzdHVyaShyZXF0KQorICAgIGxvY2FsIHUgPSByZXF0CisgICAgLS0gaWYgdGhlcmUgaXMgYSBwcm94eSwgd2UgbmVlZCB0aGUgZnVsbCB1cmwuIG90aGVyd2lzZSwganVzdCBhIHBhcnQuCisgICAgaWYgbm90IHJlcXQucHJveHkgYW5kIG5vdCBQUk9YWSB0aGVuCisgICAgICAgIHUgPSB7CisgICAgICAgICAgIHBhdGggPSBzb2NrZXQudHJ5KHJlcXQucGF0aCwgImludmFsaWQgcGF0aCAnbmlsJyIpLAorICAgICAgICAgICBwYXJhbXMgPSByZXF0LnBhcmFtcywKKyAgICAgICAgICAgcXVlcnkgPSByZXF0LnF1ZXJ5LAorICAgICAgICAgICBmcmFnbWVudCA9IHJlcXQuZnJhZ21lbnQKKyAgICAgICAgfQorICAgIGVuZAorICAgIHJldHVybiB1cmwuYnVpbGQodSkKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBhZGp1c3Rwcm94eShyZXF0KQorICAgIGxvY2FsIHByb3h5ID0gcmVxdC5wcm94eSBvciBQUk9YWQorICAgIGlmIHByb3h5IHRoZW4KKyAgICAgICAgcHJveHkgPSB1cmwucGFyc2UocHJveHkpCisgICAgICAgIHJldHVybiBwcm94eS5ob3N0LCBwcm94eS5wb3J0IG9yIDMxMjgKKyAgICBlbHNlCisgICAgICAgIHJldHVybiByZXF0Lmhvc3QsIHJlcXQucG9ydAorICAgIGVuZAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGFkanVzdGhlYWRlcnMocmVxdCkKKyAgICAtLSBkZWZhdWx0IGhlYWRlcnMKKyAgICBsb2NhbCBsb3dlciA9IHsKKyAgICAgICAgWyJ1c2VyLWFnZW50Il0gPSBVU0VSQUdFTlQsCisgICAgICAgIFsiaG9zdCJdID0gcmVxdC5ob3N0LAorICAgICAgICBbImNvbm5lY3Rpb24iXSA9ICJjbG9zZSwgVEUiLAorICAgICAgICBbInRlIl0gPSAidHJhaWxlcnMiCisgICAgfQorICAgIC0tIGlmIHdlIGhhdmUgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24sIHBhc3MgaXQgYWxvbmcKKyAgICBpZiByZXF0LnVzZXIgYW5kIHJlcXQucGFzc3dvcmQgdGhlbgorICAgICAgICBsb3dlclsiYXV0aG9yaXphdGlvbiJdID0gCisgICAgICAgICAgICAiQmFzaWMgIiAuLiAgKG1pbWUuYjY0KHJlcXQudXNlciAuLiAiOiIgLi4gcmVxdC5wYXNzd29yZCkpCisgICAgZW5kCisgICAgLS0gb3ZlcnJpZGUgd2l0aCB1c2VyIGhlYWRlcnMKKyAgICBmb3IgaSx2IGluIGJhc2UucGFpcnMocmVxdC5oZWFkZXJzIG9yIGxvd2VyKSBkbworICAgICAgICBsb3dlcltzdHJpbmcubG93ZXIoaSldID0gdgorICAgIGVuZAorICAgIHJldHVybiBsb3dlcgorZW5kCisKKy0tIGRlZmF1bHQgdXJsIHBhcnRzCitsb2NhbCBkZWZhdWx0ID0geworICAgIGhvc3QgPSAiIiwKKyAgICBwb3J0ID0gUE9SVCwKKyAgICBwYXRoID0iLyIsCisgICAgc2NoZW1lID0gImh0dHAiCit9CisKK2xvY2FsIGZ1bmN0aW9uIGFkanVzdHJlcXVlc3QocmVxdCkKKyAgICAtLSBwYXJzZSB1cmwgaWYgcHJvdmlkZWQKKyAgICBsb2NhbCBucmVxdCA9IHJlcXQudXJsIGFuZCB1cmwucGFyc2UocmVxdC51cmwsIGRlZmF1bHQpIG9yIHt9CisgICAgLS0gZXhwbGljaXQgY29tcG9uZW50cyBvdmVycmlkZSB1cmwKKyAgICBmb3IgaSx2IGluIGJhc2UucGFpcnMocmVxdCkgZG8gbnJlcXRbaV0gPSB2IGVuZAorICAgIGlmIG5yZXF0LnBvcnQgPT0gIiIgdGhlbiBucmVxdC5wb3J0ID0gODAgZW5kCisgICAgc29ja2V0LnRyeShucmVxdC5ob3N0IGFuZCBucmVxdC5ob3N0IH49ICIiLCAKKyAgICAgICAgImludmFsaWQgaG9zdCAnIiAuLiBiYXNlLnRvc3RyaW5nKG5yZXF0Lmhvc3QpIC4uICInIikKKyAgICAtLSBjb21wdXRlIHVyaSBpZiB1c2VyIGhhc24ndCBvdmVycmlkZW4KKyAgICBucmVxdC51cmkgPSByZXF0LnVyaSBvciBhZGp1c3R1cmkobnJlcXQpCisgICAgLS0gYWp1c3QgaG9zdCBhbmQgcG9ydCBpZiB0aGVyZSBpcyBhIHByb3h5CisgICAgbnJlcXQuaG9zdCwgbnJlcXQucG9ydCA9IGFkanVzdHByb3h5KG5yZXF0KQorICAgIC0tIGFkanVzdCBoZWFkZXJzIGluIHJlcXVlc3QKKyAgICBucmVxdC5oZWFkZXJzID0gYWRqdXN0aGVhZGVycyhucmVxdCkKKyAgICByZXR1cm4gbnJlcXQKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBzaG91bGRyZWRpcmVjdChyZXF0LCBjb2RlLCBoZWFkZXJzKQorICAgIHJldHVybiBoZWFkZXJzLmxvY2F0aW9uIGFuZAorICAgICAgICAgICBzdHJpbmcuZ3N1YihoZWFkZXJzLmxvY2F0aW9uLCAiJXMiLCAiIikgfj0gIiIgYW5kCisgICAgICAgICAgIChyZXF0LnJlZGlyZWN0IH49IGZhbHNlKSBhbmQKKyAgICAgICAgICAgKGNvZGUgPT0gMzAxIG9yIGNvZGUgPT0gMzAyKSBhbmQKKyAgICAgICAgICAgKG5vdCByZXF0Lm1ldGhvZCBvciByZXF0Lm1ldGhvZCA9PSAiR0VUIiBvciByZXF0Lm1ldGhvZCA9PSAiSEVBRCIpCisgICAgICAgICAgIGFuZCAobm90IHJlcXQubnJlZGlyZWN0cyBvciByZXF0Lm5yZWRpcmVjdHMgPCA1KQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHNob3VsZHJlY2VpdmVib2R5KHJlcXQsIGNvZGUpCisgICAgaWYgcmVxdC5tZXRob2QgPT0gIkhFQUQiIHRoZW4gcmV0dXJuIG5pbCBlbmQKKyAgICBpZiBjb2RlID09IDIwNCBvciBjb2RlID09IDMwNCB0aGVuIHJldHVybiBuaWwgZW5kCisgICAgaWYgY29kZSA+PSAxMDAgYW5kIGNvZGUgPCAyMDAgdGhlbiByZXR1cm4gbmlsIGVuZAorICAgIHJldHVybiAxCitlbmQKKworLS0gZm9yd2FyZCBkZWNsYXJhdGlvbnMKK2xvY2FsIHRyZXF1ZXN0LCB0cmVkaXJlY3QKKworZnVuY3Rpb24gdHJlZGlyZWN0KHJlcXQsIGxvY2F0aW9uKQorICAgIGxvY2FsIHJlc3VsdCwgY29kZSwgaGVhZGVycywgc3RhdHVzID0gdHJlcXVlc3QgeworICAgICAgICAtLSB0aGUgUkZDIHNheXMgdGhlIHJlZGlyZWN0IFVSTCBoYXMgdG8gYmUgYWJzb2x1dGUsIGJ1dCBzb21lCisgICAgICAgIC0tIHNlcnZlcnMgZG8gbm90IHJlc3BlY3QgdGhhdAorICAgICAgICB1cmwgPSB1cmwuYWJzb2x1dGUocmVxdC51cmwsIGxvY2F0aW9uKSwKKyAgICAgICAgc291cmNlID0gcmVxdC5zb3VyY2UsCisgICAgICAgIHNpbmsgPSByZXF0LnNpbmssCisgICAgICAgIGhlYWRlcnMgPSByZXF0LmhlYWRlcnMsCisgICAgICAgIHByb3h5ID0gcmVxdC5wcm94eSwgCisgICAgICAgIG5yZWRpcmVjdHMgPSAocmVxdC5ucmVkaXJlY3RzIG9yIDApICsgMSwKKyAgICAgICAgY3JlYXRlID0gcmVxdC5jcmVhdGUKKyAgICB9ICAgCisgICAgLS0gcGFzcyBsb2NhdGlvbiBoZWFkZXIgYmFjayBhcyBhIGhpbnQgd2UgcmVkaXJlY3RlZAorICAgIGhlYWRlcnMgPSBoZWFkZXJzIG9yIHt9CisgICAgaGVhZGVycy5sb2NhdGlvbiA9IGhlYWRlcnMubG9jYXRpb24gb3IgbG9jYXRpb24KKyAgICByZXR1cm4gcmVzdWx0LCBjb2RlLCBoZWFkZXJzLCBzdGF0dXMKK2VuZAorCitmdW5jdGlvbiB0cmVxdWVzdChyZXF0KQorICAgIC0tIHdlIGxvb3AgdW50aWwgd2UgZ2V0IHdoYXQgd2Ugd2FudCwgb3IKKyAgICAtLSB1bnRpbCB3ZSBhcmUgc3VyZSB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IGl0CisgICAgbG9jYWwgbnJlcXQgPSBhZGp1c3RyZXF1ZXN0KHJlcXQpCisgICAgbG9jYWwgaCA9IG9wZW4obnJlcXQuaG9zdCwgbnJlcXQucG9ydCwgbnJlcXQuY3JlYXRlKQorICAgIC0tIHNlbmQgcmVxdWVzdCBsaW5lIGFuZCBoZWFkZXJzCisgICAgaDpzZW5kcmVxdWVzdGxpbmUobnJlcXQubWV0aG9kLCBucmVxdC51cmkpCisgICAgaDpzZW5kaGVhZGVycyhucmVxdC5oZWFkZXJzKQorICAgIC0tIGlmIHRoZXJlIGlzIGEgYm9keSwgc2VuZCBpdAorICAgIGlmIG5yZXF0LnNvdXJjZSB0aGVuCisgICAgICAgIGg6c2VuZGJvZHkobnJlcXQuaGVhZGVycywgbnJlcXQuc291cmNlLCBucmVxdC5zdGVwKSAKKyAgICBlbmQKKyAgICBsb2NhbCBjb2RlLCBzdGF0dXMgPSBoOnJlY2VpdmVzdGF0dXNsaW5lKCkKKyAgICAtLSBpZiBpdCBpcyBhbiBIVFRQLzAuOSBzZXJ2ZXIsIHNpbXBseSBnZXQgdGhlIGJvZHkgYW5kIHdlIGFyZSBkb25lCisgICAgaWYgbm90IGNvZGUgdGhlbgorICAgICAgICBoOnJlY2VpdmUwOWJvZHkoc3RhdHVzLCBucmVxdC5zaW5rLCBucmVxdC5zdGVwKQorICAgICAgICByZXR1cm4gMSwgMjAwCisgICAgZW5kCisgICAgbG9jYWwgaGVhZGVycworICAgIC0tIGlnbm9yZSBhbnkgMTAwLWNvbnRpbnVlIG1lc3NhZ2VzCisgICAgd2hpbGUgY29kZSA9PSAxMDAgZG8gCisgICAgICAgIGhlYWRlcnMgPSBoOnJlY2VpdmVoZWFkZXJzKCkKKyAgICAgICAgY29kZSwgc3RhdHVzID0gaDpyZWNlaXZlc3RhdHVzbGluZSgpCisgICAgZW5kCisgICAgaGVhZGVycyA9IGg6cmVjZWl2ZWhlYWRlcnMoKQorICAgIC0tIGF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGhhdmUgYSBob25lc3QgcmVwbHkgZnJvbSB0aGUgc2VydmVyCisgICAgLS0gd2UgY2FuJ3QgcmVkaXJlY3QgaWYgd2UgYWxyZWFkeSB1c2VkIHRoZSBzb3VyY2UsIHNvIHdlIHJlcG9ydCB0aGUgZXJyb3IgCisgICAgaWYgc2hvdWxkcmVkaXJlY3QobnJlcXQsIGNvZGUsIGhlYWRlcnMpIGFuZCBub3QgbnJlcXQuc291cmNlIHRoZW4KKyAgICAgICAgaDpjbG9zZSgpCisgICAgICAgIHJldHVybiB0cmVkaXJlY3QocmVxdCwgaGVhZGVycy5sb2NhdGlvbikKKyAgICBlbmQKKyAgICAtLSBoZXJlIHdlIGFyZSBmaW5hbGx5IGRvbmUKKyAgICBpZiBzaG91bGRyZWNlaXZlYm9keShucmVxdCwgY29kZSkgdGhlbgorICAgICAgICBoOnJlY2VpdmVib2R5KGhlYWRlcnMsIG5yZXF0LnNpbmssIG5yZXF0LnN0ZXApCisgICAgZW5kCisgICAgaDpjbG9zZSgpCisgICAgcmV0dXJuIDEsIGNvZGUsIGhlYWRlcnMsIHN0YXR1cworZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHNyZXF1ZXN0KHUsIGIpCisgICAgbG9jYWwgdCA9IHt9CisgICAgbG9jYWwgcmVxdCA9IHsKKyAgICAgICAgdXJsID0gdSwKKyAgICAgICAgc2luayA9IGx0bjEyLnNpbmsudGFibGUodCkKKyAgICB9CisgICAgaWYgYiB0aGVuCisgICAgICAgIHJlcXQuc291cmNlID0gbHRuMTIuc291cmNlLnN0cmluZyhiKQorICAgICAgICByZXF0LmhlYWRlcnMgPSB7CisgICAgICAgICAgICBbImNvbnRlbnQtbGVuZ3RoIl0gPSBzdHJpbmcubGVuKGIpLAorICAgICAgICAgICAgWyJjb250ZW50LXR5cGUiXSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCisgICAgICAgIH0KKyAgICAgICAgcmVxdC5tZXRob2QgPSAiUE9TVCIKKyAgICBlbmQKKyAgICBsb2NhbCBjb2RlLCBoZWFkZXJzLCBzdGF0dXMgPSBzb2NrZXQuc2tpcCgxLCB0cmVxdWVzdChyZXF0KSkKKyAgICByZXR1cm4gdGFibGUuY29uY2F0KHQpLCBjb2RlLCBoZWFkZXJzLCBzdGF0dXMKK2VuZAorCityZXF1ZXN0ID0gc29ja2V0LnByb3RlY3QoZnVuY3Rpb24ocmVxdCwgYm9keSkKKyAgICBpZiBiYXNlLnR5cGUocmVxdCkgPT0gInN0cmluZyIgdGhlbiByZXR1cm4gc3JlcXVlc3QocmVxdCwgYm9keSkKKyAgICBlbHNlIHJldHVybiB0cmVxdWVzdChyZXF0KSBlbmQKK2VuZCkKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvaW5ldC5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9pbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjZGRlZQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvaW5ldC5jCkBAIC0wLDAgKzEsMjgxIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBJbnRlcm5ldCBkb21haW4gZnVuY3Rpb25zCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFJDUyBJRDogJElkOiBpbmV0LmMsdiAxLjI4IDIwMDUvMTAvMDcgMDQ6NDA6NTkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKworI2luY2x1ZGUgImluZXQuaCIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcy4KK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IGluZXRfZ2xvYmFsX3RvaXAobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgaW5ldF9nbG9iYWxfdG9ob3N0bmFtZShsdWFfU3RhdGUgKkwpOworc3RhdGljIHZvaWQgaW5ldF9wdXNocmVzb2x2ZWQobHVhX1N0YXRlICpMLCBzdHJ1Y3QgaG9zdGVudCAqaHApOworc3RhdGljIGludCBpbmV0X2dsb2JhbF9nZXRob3N0bmFtZShsdWFfU3RhdGUgKkwpOworCisvKiBETlMgZnVuY3Rpb25zICovCitzdGF0aWMgbHVhTF9yZWcgZnVuY1tdID0geworICAgIHsgInRvaXAiLCBpbmV0X2dsb2JhbF90b2lwIH0sCisgICAgeyAidG9ob3N0bmFtZSIsIGluZXRfZ2xvYmFsX3RvaG9zdG5hbWUgfSwKKyAgICB7ICJnZXRob3N0bmFtZSIsIGluZXRfZ2xvYmFsX2dldGhvc3RuYW1lfSwKKyAgICB7IE5VTEwsIE5VTEx9Cit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBFeHBvcnRlZCBmdW5jdGlvbnMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBJbml0aWFsaXplcyBtb2R1bGUKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaW5ldF9vcGVuKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiZG5zIik7CisgICAgbHVhX25ld3RhYmxlKEwpOworICAgIGx1YUxfb3BlbmxpYihMLCBOVUxMLCBmdW5jLCAwKTsKKyAgICBsdWFfc2V0dGFibGUoTCwgLTMpOworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBHbG9iYWwgTHVhIGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJldHVybnMgYWxsIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSByZXNvbHZlciBnaXZlbiBhIGhvc3QgbmFtZQorKiBvciBpcCBhZGRyZXNzCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBpbmV0X2dldGhvc3QoY29uc3QgY2hhciAqYWRkcmVzcywgc3RydWN0IGhvc3RlbnQgKipocCkgeworICAgIHN0cnVjdCBpbl9hZGRyIGFkZHI7CisgICAgaWYgKGluZXRfYXRvbihhZGRyZXNzLCAmYWRkcikpCisgICAgICAgIHJldHVybiBzb2NrZXRfZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpLCBocCk7CisgICAgZWxzZSAKKyAgICAgICAgcmV0dXJuIHNvY2tldF9nZXRob3N0YnluYW1lKGFkZHJlc3MsIGhwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUmV0dXJucyBhbGwgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHJlc29sdmVyIGdpdmVuIGEgaG9zdCBuYW1lCisqIG9yIGlwIGFkZHJlc3MKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGluZXRfZ2xvYmFsX3RvaG9zdG5hbWUobHVhX1N0YXRlICpMKSB7CisgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsgCisgICAgaW50IGVyciA9IGluZXRfZ2V0aG9zdChhZGRyZXNzLCAmaHApOworICAgIGlmIChlcnIgIT0gSU9fRE9ORSkgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgc29ja2V0X2hvc3RzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGx1YV9wdXNoc3RyaW5nKEwsIGhwLT5oX25hbWUpOworICAgIGluZXRfcHVzaHJlc29sdmVkKEwsIGhwKTsKKyAgICByZXR1cm4gMjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUmV0dXJucyBhbGwgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHJlc29sdmVyIGdpdmVuIGEgaG9zdCBuYW1lCisqIG9yIGlwIGFkZHJlc3MKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGluZXRfZ2xvYmFsX3RvaXAobHVhX1N0YXRlICpMKQoreworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7IAorICAgIGludCBlcnIgPSBpbmV0X2dldGhvc3QoYWRkcmVzcywgJmhwKTsKKyAgICBpZiAoZXJyICE9IElPX0RPTkUpIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIHNvY2tldF9ob3N0c3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBsdWFfcHVzaHN0cmluZyhMLCBpbmV0X250b2EoKigoc3RydWN0IGluX2FkZHIgKikgaHAtPmhfYWRkcikpKTsKKyAgICBpbmV0X3B1c2hyZXNvbHZlZChMLCBocCk7CisgICAgcmV0dXJuIDI7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogR2V0cyB0aGUgaG9zdCBuYW1lCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBpbmV0X2dsb2JhbF9nZXRob3N0bmFtZShsdWFfU3RhdGUgKkwpCit7CisgICAgY2hhciBuYW1lWzI1N107CisgICAgbmFtZVsyNTZdID0gJ1wwJzsKKyAgICBpZiAoZ2V0aG9zdG5hbWUobmFtZSwgMjU2KSA8IDApIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJnZXRob3N0bmFtZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEx1YSBtZXRob2RzCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUmV0cmlldmVzIHNvY2tldCBwZWVyIG5hbWUKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaW5ldF9tZXRoX2dldHBlZXJuYW1lKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHBlZXI7CisgICAgc29ja2xlbl90IHBlZXJfbGVuID0gc2l6ZW9mKHBlZXIpOworICAgIGlmIChnZXRwZWVybmFtZSgqcHMsIChTQSAqKSAmcGVlciwgJnBlZXJfbGVuKSA8IDApIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJnZXRwZWVybmFtZSBmYWlsZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBpbmV0X250b2EocGVlci5zaW5fYWRkcikpOworICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBudG9ocyhwZWVyLnNpbl9wb3J0KSk7CisgICAgfQorICAgIHJldHVybiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBSZXRyaWV2ZXMgc29ja2V0IGxvY2FsIG5hbWUKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaW5ldF9tZXRoX2dldHNvY2tuYW1lKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGxvY2FsOworICAgIHNvY2tsZW5fdCBsb2NhbF9sZW4gPSBzaXplb2YobG9jYWwpOworICAgIGlmIChnZXRzb2NrbmFtZSgqcHMsIChTQSAqKSAmbG9jYWwsICZsb2NhbF9sZW4pIDwgMCkgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgImdldHNvY2tuYW1lIGZhaWxlZCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIGluZXRfbnRvYShsb2NhbC5zaW5fYWRkcikpOworICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBudG9ocyhsb2NhbC5zaW5fcG9ydCkpOworICAgIH0KKyAgICByZXR1cm4gMjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogSW50ZXJuYWwgZnVuY3Rpb25zCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUGFzc2VzIGFsbCByZXNvbHZlciBpbmZvcm1hdGlvbiB0byBMdWEgYXMgYSB0YWJsZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGluZXRfcHVzaHJlc29sdmVkKGx1YV9TdGF0ZSAqTCwgc3RydWN0IGhvc3RlbnQgKmhwKQoreworICAgIGNoYXIgKiphbGlhczsKKyAgICBzdHJ1Y3QgaW5fYWRkciAqKmFkZHI7CisgICAgaW50IGksIHJlc29sdmVkOworICAgIGx1YV9uZXd0YWJsZShMKTsgcmVzb2x2ZWQgPSBsdWFfZ2V0dG9wKEwpOworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJuYW1lIik7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgaHAtPmhfbmFtZSk7CisgICAgbHVhX3NldHRhYmxlKEwsIHJlc29sdmVkKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiaXAiKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiYWxpYXMiKTsKKyAgICBpID0gMTsKKyAgICBhbGlhcyA9IGhwLT5oX2FsaWFzZXM7CisgICAgbHVhX25ld3RhYmxlKEwpOworICAgIGlmIChhbGlhcykgeworICAgICAgICB3aGlsZSAoKmFsaWFzKSB7CisgICAgICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBpKTsKKyAgICAgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICphbGlhcyk7CisgICAgICAgICAgICBsdWFfc2V0dGFibGUoTCwgLTMpOworICAgICAgICAgICAgaSsrOyBhbGlhcysrOworICAgICAgICB9CisgICAgfQorICAgIGx1YV9zZXR0YWJsZShMLCByZXNvbHZlZCk7CisgICAgaSA9IDE7CisgICAgbHVhX25ld3RhYmxlKEwpOworICAgIGFkZHIgPSAoc3RydWN0IGluX2FkZHIgKiopIGhwLT5oX2FkZHJfbGlzdDsKKyAgICBpZiAoYWRkcikgeworICAgICAgICB3aGlsZSAoKmFkZHIpIHsKKyAgICAgICAgICAgIGx1YV9wdXNobnVtYmVyKEwsIGkpOworICAgICAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgaW5ldF9udG9hKCoqYWRkcikpOworICAgICAgICAgICAgbHVhX3NldHRhYmxlKEwsIC0zKTsKKyAgICAgICAgICAgIGkrKzsgYWRkcisrOworICAgICAgICB9CisgICAgfQorICAgIGx1YV9zZXR0YWJsZShMLCByZXNvbHZlZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFRyaWVzIHRvIGNyZWF0ZSBhIG5ldyBpbmV0IHNvY2tldAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IGNoYXIgKmluZXRfdHJ5Y3JlYXRlKHBfc29ja2V0IHBzLCBpbnQgdHlwZSkgeworICAgIHJldHVybiBzb2NrZXRfc3RyZXJyb3Ioc29ja2V0X2NyZWF0ZShwcywgQUZfSU5FVCwgdHlwZSwgMCkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBUcmllcyB0byBjb25uZWN0IHRvIHJlbW90ZSBhZGRyZXNzIChhZGRyZXNzLCBwb3J0KQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IGNoYXIgKmluZXRfdHJ5Y29ubmVjdChwX3NvY2tldCBwcywgY29uc3QgY2hhciAqYWRkcmVzcywgCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHBvcnQsIHBfdGltZW91dCB0bSkKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlOworICAgIGludCBlcnI7CisgICAgbWVtc2V0KCZyZW1vdGUsIDAsIHNpemVvZihyZW1vdGUpKTsKKyAgICByZW1vdGUuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgcmVtb3RlLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJaWYgKHN0cmNtcChhZGRyZXNzLCAiKiIpKSB7CisgICAgICAgIGlmICghaW5ldF9hdG9uKGFkZHJlc3MsICZyZW1vdGUuc2luX2FkZHIpKSB7CisgICAgICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworICAgICAgICAgICAgc3RydWN0IGluX2FkZHIgKiphZGRyOworICAgICAgICAgICAgZXJyID0gc29ja2V0X2dldGhvc3RieW5hbWUoYWRkcmVzcywgJmhwKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gSU9fRE9ORSkgcmV0dXJuIHNvY2tldF9ob3N0c3RyZXJyb3IoZXJyKTsKKyAgICAgICAgICAgIGFkZHIgPSAoc3RydWN0IGluX2FkZHIgKiopIGhwLT5oX2FkZHJfbGlzdDsKKyAgICAgICAgICAgIG1lbWNweSgmcmVtb3RlLnNpbl9hZGRyLCAqYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgcmVtb3RlLnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7CisgICAgZXJyID0gc29ja2V0X2Nvbm5lY3QocHMsIChTQSAqKSAmcmVtb3RlLCBzaXplb2YocmVtb3RlKSwgdG0pOworICAgIHJldHVybiBzb2NrZXRfc3RyZXJyb3IoZXJyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogVHJpZXMgdG8gYmluZCBzb2NrZXQgdG8gKGFkZHJlc3MsIHBvcnQpCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY29uc3QgY2hhciAqaW5ldF90cnliaW5kKHBfc29ja2V0IHBzLCBjb25zdCBjaGFyICphZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbDsKKyAgICBpbnQgZXJyOworICAgIG1lbXNldCgmbG9jYWwsIDAsIHNpemVvZihsb2NhbCkpOworICAgIC8qIGFkZHJlc3MgaXMgZWl0aGVyIHdpbGRjYXJkIG9yIGEgdmFsaWQgaXAgYWRkcmVzcyAqLworICAgIGxvY2FsLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICAgIGxvY2FsLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisgICAgbG9jYWwuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgaWYgKHN0cmNtcChhZGRyZXNzLCAiKiIpICYmICFpbmV0X2F0b24oYWRkcmVzcywgJmxvY2FsLnNpbl9hZGRyKSkgeworICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgaW5fYWRkciAqKmFkZHI7CisgICAgICAgIGVyciA9IHNvY2tldF9nZXRob3N0YnluYW1lKGFkZHJlc3MsICZocCk7CisgICAgICAgIGlmIChlcnIgIT0gSU9fRE9ORSkgcmV0dXJuIHNvY2tldF9ob3N0c3RyZXJyb3IoZXJyKTsKKyAgICAgICAgYWRkciA9IChzdHJ1Y3QgaW5fYWRkciAqKikgaHAtPmhfYWRkcl9saXN0OworICAgICAgICBtZW1jcHkoJmxvY2FsLnNpbl9hZGRyLCAqYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgICAgfQorICAgIGVyciA9IHNvY2tldF9iaW5kKHBzLCAoU0EgKikgJmxvY2FsLCBzaXplb2YobG9jYWwpKTsKKyAgICBpZiAoZXJyICE9IElPX0RPTkUpIHNvY2tldF9kZXN0cm95KHBzKTsKKyAgICByZXR1cm4gc29ja2V0X3N0cmVycm9yKGVycik7IAorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBTb21lIHN5c3RlbXMgZG8gbm90IHByb3ZpZGUgdGhpcyBzbyB0aGF0IHdlIHByb3ZpZGUgb3VyIG93bi4gSXQncyBub3QKKyogbWFydmVsb3VzbHkgZmFzdCwgYnV0IGl0IHdvcmtzIGp1c3QgZmluZS4KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgSU5FVF9BVE9OCitpbnQgaW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqaW5wKQoreworICAgIHVuc2lnbmVkIGludCBhID0gMCwgYiA9IDAsIGMgPSAwLCBkID0gMDsKKyAgICBpbnQgbiA9IDAsIHI7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgYWRkciA9IDA7CisgICAgciA9IHNzY2FuZihjcCwgIiV1LiV1LiV1LiV1JW4iLCAmYSwgJmIsICZjLCAmZCwgJm4pOworICAgIGlmIChyID09IDAgfHwgbiA9PSAwKSByZXR1cm4gMDsKKyAgICBjcCArPSBuOworICAgIGlmICgqY3ApIHJldHVybiAwOworICAgIGlmIChhID4gMjU1IHx8IGIgPiAyNTUgfHwgYyA+IDI1NSB8fCBkID4gMjU1KSByZXR1cm4gMDsKKyAgICBpZiAoaW5wKSB7CisgICAgICAgIGFkZHIgKz0gYTsgYWRkciA8PD0gODsKKyAgICAgICAgYWRkciArPSBiOyBhZGRyIDw8PSA4OworICAgICAgICBhZGRyICs9IGM7IGFkZHIgPDw9IDg7CisgICAgICAgIGFkZHIgKz0gZDsKKyAgICAgICAgaW5wLT5zX2FkZHIgPSBodG9ubChhZGRyKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL2luZXQuaCBiL2x1YXNvY2tldC0yLjAuMi9zcmMvaW5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjIyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL2luZXQuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIElORVRfSCAKKyNkZWZpbmUgSU5FVF9IIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogSW50ZXJuZXQgZG9tYWluIGZ1bmN0aW9ucworKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBjcmVhdGlvbiBhbmQgY29ubmVjdGlvbiBvZiBpbnRlcm5ldCBkb21haW4KKyogc29ja2V0cywgb24gdG9wIG9mIHRoZSBzb2NrZXQuaCBpbnRlcmZhY2UsIGFuZCB0aGUgaW50ZXJmYWNlIG9mIHdpdGggdGhlCisqIHJlc29sdmVyLiAKKyoKKyogVGhlIGZ1bmN0aW9uIGluZXRfYXRvbiBpcyBwcm92aWRlZCBmb3IgdGhlIHBsYXRmb3JtcyB3aGVyZSBpdCBpcyBub3QKKyogYXZhaWxhYmxlLiBUaGUgbW9kdWxlIGFsc28gaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIG9mIHRoZSBpbnRlcm5ldAorKiBnZXRwZWVybmFtZSBhbmQgZ2V0c29ja25hbWUgZnVuY3Rpb25zIGFzIHNlZW4gYnkgTHVhIHByb2dyYW1zLgorKgorKiBUaGUgTHVhIGZ1bmN0aW9ucyB0b2lwIGFuZCB0b2hvc3RuYW1lIGFyZSBhbHNvIGltcGxlbWVudGVkIGhlcmUuCisqCisqIFJDUyBJRDogJElkOiBpbmV0LmgsdiAxLjE2IDIwMDUvMTAvMDcgMDQ6NDA6NTkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAic29ja2V0LmgiCisjaW5jbHVkZSAidGltZW91dC5oIgorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIElORVRfQVRPTgorI2VuZGlmCisKK2ludCBpbmV0X29wZW4obHVhX1N0YXRlICpMKTsKKworY29uc3QgY2hhciAqaW5ldF90cnljcmVhdGUocF9zb2NrZXQgcHMsIGludCB0eXBlKTsKK2NvbnN0IGNoYXIgKmluZXRfdHJ5Y29ubmVjdChwX3NvY2tldCBwcywgY29uc3QgY2hhciAqYWRkcmVzcywgCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHBvcnQsIHBfdGltZW91dCB0bSk7Citjb25zdCBjaGFyICppbmV0X3RyeWJpbmQocF9zb2NrZXQgcHMsIGNvbnN0IGNoYXIgKmFkZHJlc3MsIAorICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0KTsKKworaW50IGluZXRfbWV0aF9nZXRwZWVybmFtZShsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzKTsKK2ludCBpbmV0X21ldGhfZ2V0c29ja25hbWUobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcyk7CisKKyNpZmRlZiBJTkVUX0FUT04KK2ludCBpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbl9hZGRyICppbnApOworI2VuZGlmCisKKyNlbmRpZiAvKiBJTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvaW8uYyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9pby5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIElucHV0L091dHB1dCBhYnN0cmFjdGlvbgorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBSQ1MgSUQ6ICRJZDogaW8uYyx2IDEuNiAyMDA1LzA5LzI5IDA2OjExOjQxIGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgImlvLmgiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEV4cG9ydGVkIGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluaXRpYWxpemVzIEMgc3RydWN0dXJlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBpb19pbml0KHBfaW8gaW8sIHBfc2VuZCBzZW5kLCBwX3JlY3YgcmVjdiwgcF9lcnJvciBlcnJvciwgdm9pZCAqY3R4KSB7CisgICAgaW8tPnNlbmQgPSBzZW5kOworICAgIGlvLT5yZWN2ID0gcmVjdjsKKyAgICBpby0+ZXJyb3IgPSBlcnJvcjsKKyAgICBpby0+Y3R4ID0gY3R4OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBJL08gZXJyb3Igc3RyaW5ncworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IGNoYXIgKmlvX3N0cmVycm9yKGludCBlcnIpIHsKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIElPX0RPTkU6IHJldHVybiBOVUxMOworICAgICAgICBjYXNlIElPX0NMT1NFRDogcmV0dXJuICJjbG9zZWQiOworICAgICAgICBjYXNlIElPX1RJTUVPVVQ6IHJldHVybiAidGltZW91dCI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAidW5rbm93biBlcnJvciI7IAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvaW8uaCBiL2x1YXNvY2tldC0yLjAuMi9zcmMvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2UzYWFmCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9pby5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgSU9fSAorI2RlZmluZSBJT19ICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBJbnB1dC9PdXRwdXQgYWJzdHJhY3Rpb24KKyogTHVhU29ja2V0IHRvb2xraXQKKyoKKyogVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRoYXQgTHVhU29ja2V0IGV4cGVjdHMgZnJvbSB0aGUKKyogdHJhbnNwb3J0IGxheWVyIGZvciBzdHJlYW1lZCBpbnB1dC9vdXRwdXQuIFRoZSBpZGVhIGlzIHRoYXQgaWYgYW55CisqIHRyYW5zcG9ydCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLCB0aGVuIHRoZSBidWZmZXIuYyBmdW5jdGlvbnMKKyogYXV0b21hdGljYWxseSB3b3JrIG9uIGl0LgorKgorKiBUaGUgbW9kdWxlIHNvY2tldC5oIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UsIGFuZCB0aHVzIHRoZSBtb2R1bGUgdGNwLmgKKyogaXMgdmVyeSBzaW1wbGUuCisqCisqIFJDUyBJRDogJElkOiBpby5oLHYgMS4xMSAyMDA1LzEwLzA3IDA0OjQwOjU5IGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJ0aW1lb3V0LmgiCisKKy8qIElPIGVycm9yIGNvZGVzICovCitlbnVtIHsKKyAgICBJT19ET05FID0gMCwgICAgICAgIC8qIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgSU9fVElNRU9VVCA9IC0xLCAgICAvKiBvcGVyYXRpb24gdGltZWQgb3V0ICovCisgICAgSU9fQ0xPU0VEID0gLTIsICAgICAvKiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQgKi8KKwlJT19VTktOT1dOID0gLTMKK307CisKKy8qIGludGVyZmFjZSB0byBlcnJvciBtZXNzYWdlIGZ1bmN0aW9uICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKigqcF9lcnJvcikgKAorICAgIHZvaWQgKmN0eCwgICAgICAgICAgLyogY29udGV4dCBuZWVkZWQgYnkgc2VuZCAqLworICAgIGludCBlcnIgICAgICAgICAgICAgLyogZXJyb3IgY29kZSAqLworKTsKKworLyogaW50ZXJmYWNlIHRvIHNlbmQgZnVuY3Rpb24gKi8KK3R5cGVkZWYgaW50ICgqcF9zZW5kKSAoCisgICAgdm9pZCAqY3R4LCAgICAgICAgICAvKiBjb250ZXh0IG5lZWRlZCBieSBzZW5kICovCisgICAgY29uc3QgY2hhciAqZGF0YSwgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciB3aXRoIGRhdGEgdG8gc2VuZCAqLworICAgIHNpemVfdCBjb3VudCwgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQgZnJvbSBidWZmZXIgKi8KKyAgICBzaXplX3QgKnNlbnQsICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBzZW50IHVwcG9uIHJldHVybiAqLworICAgIHBfdGltZW91dCB0bSAgICAgICAgLyogdGltZW91dCBjb250cm9sICovCispOworCisvKiBpbnRlcmZhY2UgdG8gcmVjdiBmdW5jdGlvbiAqLwordHlwZWRlZiBpbnQgKCpwX3JlY3YpICgKKyAgICB2b2lkICpjdHgsICAgICAgICAgIC8qIGNvbnRleHQgbmVlZGVkIGJ5IHJlY3YgKi8KKyAgICBjaGFyICpkYXRhLCAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnVmZmVyIHdoZXJlIGRhdGEgd2lsbCBiZSB3cml0ZW4gKi8KKyAgICBzaXplX3QgY291bnQsICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGludG8gYnVmZmVyICovCisgICAgc2l6ZV90ICpnb3QsICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgdXBwb24gcmV0dXJuICovCisgICAgcF90aW1lb3V0IHRtICAgICAgICAvKiB0aW1lb3V0IGNvbnRyb2wgKi8KKyk7CisKKy8qIElPIGRyaXZlciBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdCB0X2lvXyB7CisgICAgdm9pZCAqY3R4OyAgICAgICAgICAvKiBjb250ZXh0IG5lZWRlZCBieSBzZW5kL3JlY3YgKi8KKyAgICBwX3NlbmQgc2VuZDsgICAgICAgIC8qIHNlbmQgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIHBfcmVjdiByZWN2OyAgICAgICAgLyogcmVjZWl2ZSBmdW5jdGlvbiBwb2ludGVyICovCisgICAgcF9lcnJvciBlcnJvcjsgICAgICAvKiBzdHJlcnJvciBmdW5jdGlvbiAqLworfSB0X2lvOwordHlwZWRlZiB0X2lvICpwX2lvOworCit2b2lkIGlvX2luaXQocF9pbyBpbywgcF9zZW5kIHNlbmQsIHBfcmVjdiByZWN2LCBwX2Vycm9yIGVycm9yLCB2b2lkICpjdHgpOworY29uc3QgY2hhciAqaW9fc3RyZXJyb3IoaW50IGVycik7CisKKyNlbmRpZiAvKiBJT19IICovCisKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvbHRuMTIubHVhIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9sdG4xMi5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyNjg5YQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvbHRuMTIubHVhCkBAIC0wLDAgKzEsMjkyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gTFROMTIgLSBGaWx0ZXJzLCBzb3VyY2VzLCBzaW5rcyBhbmQgcHVtcHMuCistLSBMdWFTb2NrZXQgdG9vbGtpdC4KKy0tIEF1dGhvcjogRGllZ28gTmVoYWIKKy0tIFJDUyBJRDogJElkOiBsdG4xMi5sdWEsdiAxLjMxIDIwMDYvMDQvMDMgMDQ6NDU6NDIgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBEZWNsYXJlIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIHN0cmluZyA9IHJlcXVpcmUoInN0cmluZyIpCitsb2NhbCB0YWJsZSA9IHJlcXVpcmUoInRhYmxlIikKK2xvY2FsIGJhc2UgPSBfRworbW9kdWxlKCJsdG4xMiIpCisKK2ZpbHRlciA9IHt9Citzb3VyY2UgPSB7fQorc2luayA9IHt9CitwdW1wID0ge30KKworLS0gMjA0OCBzZWVtcyB0byBiZSBiZXR0ZXIgaW4gd2luZG93cy4uLgorQkxPQ0tTSVpFID0gMjA0OAorX1ZFUlNJT04gPSAiTFROMTIgMS4wLjEiCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBGaWx0ZXIgc3R1ZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByZXR1cm5zIGEgaGlnaCBsZXZlbCBmaWx0ZXIgdGhhdCBjeWNsZXMgYSBsb3ctbGV2ZWwgZmlsdGVyCitmdW5jdGlvbiBmaWx0ZXIuY3ljbGUobG93LCBjdHgsIGV4dHJhKQorICAgIGJhc2UuYXNzZXJ0KGxvdykKKyAgICByZXR1cm4gZnVuY3Rpb24oY2h1bmspCisgICAgICAgIGxvY2FsIHJldAorICAgICAgICByZXQsIGN0eCA9IGxvdyhjdHgsIGNodW5rLCBleHRyYSkKKyAgICAgICAgcmV0dXJuIHJldAorICAgIGVuZAorZW5kCisKKy0tIGNoYWlucyBhIGJ1bmNoIG9mIGZpbHRlcnMgdG9nZXRoZXIKKy0tICh0aGFua3MgdG8gV2ltIENvdXdlbmJlcmcpCitmdW5jdGlvbiBmaWx0ZXIuY2hhaW4oLi4uKQorICAgIGxvY2FsIG4gPSB0YWJsZS5nZXRuKGFyZykKKyAgICBsb2NhbCB0b3AsIGluZGV4ID0gMSwgMQorICAgIGxvY2FsIHJldHJ5ID0gIiIKKyAgICByZXR1cm4gZnVuY3Rpb24oY2h1bmspCisgICAgICAgIHJldHJ5ID0gY2h1bmsgYW5kIHJldHJ5CisgICAgICAgIHdoaWxlIHRydWUgZG8KKyAgICAgICAgICAgIGlmIGluZGV4ID09IHRvcCB0aGVuCisgICAgICAgICAgICAgICAgY2h1bmsgPSBhcmdbaW5kZXhdKGNodW5rKQorICAgICAgICAgICAgICAgIGlmIGNodW5rID09ICIiIG9yIHRvcCA9PSBuIHRoZW4gcmV0dXJuIGNodW5rCisgICAgICAgICAgICAgICAgZWxzZWlmIGNodW5rIHRoZW4gaW5kZXggPSBpbmRleCArIDEKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcCsxCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdG9wCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2h1bmsgPSBhcmdbaW5kZXhdKGNodW5rIG9yICIiKQorICAgICAgICAgICAgICAgIGlmIGNodW5rID09ICIiIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCAtIDEKKyAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSByZXRyeQorICAgICAgICAgICAgICAgIGVsc2VpZiBjaHVuayB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IG4gdGhlbiByZXR1cm4gY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpbmRleCA9IGluZGV4ICsgMSBlbmQKKyAgICAgICAgICAgICAgICBlbHNlIGJhc2UuZXJyb3IoImZpbHRlciByZXR1cm5lZCBpbmFwcHJvcHJpYXRlIG5pbCIpIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBTb3VyY2Ugc3R1ZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjcmVhdGUgYW4gZW1wdHkgc291cmNlCitsb2NhbCBmdW5jdGlvbiBlbXB0eSgpCisgICAgcmV0dXJuIG5pbAorZW5kCisKK2Z1bmN0aW9uIHNvdXJjZS5lbXB0eSgpCisgICAgcmV0dXJuIGVtcHR5CitlbmQKKworLS0gcmV0dXJucyBhIHNvdXJjZSB0aGF0IGp1c3Qgb3V0cHV0cyBhbiBlcnJvcgorZnVuY3Rpb24gc291cmNlLmVycm9yKGVycikKKyAgICByZXR1cm4gZnVuY3Rpb24oKQorICAgICAgICByZXR1cm4gbmlsLCBlcnIKKyAgICBlbmQKK2VuZAorCistLSBjcmVhdGVzIGEgZmlsZSBzb3VyY2UKK2Z1bmN0aW9uIHNvdXJjZS5maWxlKGhhbmRsZSwgaW9fZXJyKQorICAgIGlmIGhhbmRsZSB0aGVuCisgICAgICAgIHJldHVybiBmdW5jdGlvbigpCisgICAgICAgICAgICBsb2NhbCBjaHVuayA9IGhhbmRsZTpyZWFkKEJMT0NLU0laRSkKKyAgICAgICAgICAgIGlmIG5vdCBjaHVuayB0aGVuIGhhbmRsZTpjbG9zZSgpIGVuZAorICAgICAgICAgICAgcmV0dXJuIGNodW5rCisgICAgICAgIGVuZAorICAgIGVsc2UgcmV0dXJuIHNvdXJjZS5lcnJvcihpb19lcnIgb3IgInVuYWJsZSB0byBvcGVuIGZpbGUiKSBlbmQKK2VuZAorCistLSB0dXJucyBhIGZhbmN5IHNvdXJjZSBpbnRvIGEgc2ltcGxlIHNvdXJjZQorZnVuY3Rpb24gc291cmNlLnNpbXBsaWZ5KHNyYykKKyAgICBiYXNlLmFzc2VydChzcmMpCisgICAgcmV0dXJuIGZ1bmN0aW9uKCkKKyAgICAgICAgbG9jYWwgY2h1bmssIGVycl9vcl9uZXcgPSBzcmMoKQorICAgICAgICBzcmMgPSBlcnJfb3JfbmV3IG9yIHNyYworICAgICAgICBpZiBub3QgY2h1bmsgdGhlbiByZXR1cm4gbmlsLCBlcnJfb3JfbmV3CisgICAgICAgIGVsc2UgcmV0dXJuIGNodW5rIGVuZAorICAgIGVuZAorZW5kCisKKy0tIGNyZWF0ZXMgc3RyaW5nIHNvdXJjZQorZnVuY3Rpb24gc291cmNlLnN0cmluZyhzKQorICAgIGlmIHMgdGhlbgorICAgICAgICBsb2NhbCBpID0gMQorICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQorICAgICAgICAgICAgbG9jYWwgY2h1bmsgPSBzdHJpbmcuc3ViKHMsIGksIGkrQkxPQ0tTSVpFLTEpCisgICAgICAgICAgICBpID0gaSArIEJMT0NLU0laRQorICAgICAgICAgICAgaWYgY2h1bmsgfj0gIiIgdGhlbiByZXR1cm4gY2h1bmsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIG5pbCBlbmQKKyAgICAgICAgZW5kCisgICAgZWxzZSByZXR1cm4gc291cmNlLmVtcHR5KCkgZW5kCitlbmQKKworLS0gY3JlYXRlcyByZXdpbmRhYmxlIHNvdXJjZQorZnVuY3Rpb24gc291cmNlLnJld2luZChzcmMpCisgICAgYmFzZS5hc3NlcnQoc3JjKQorICAgIGxvY2FsIHQgPSB7fQorICAgIHJldHVybiBmdW5jdGlvbihjaHVuaykKKyAgICAgICAgaWYgbm90IGNodW5rIHRoZW4KKyAgICAgICAgICAgIGNodW5rID0gdGFibGUucmVtb3ZlKHQpCisgICAgICAgICAgICBpZiBub3QgY2h1bmsgdGhlbiByZXR1cm4gc3JjKCkKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNodW5rIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgICB0YWJsZS5pbnNlcnQodCwgY2h1bmspCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2Z1bmN0aW9uIHNvdXJjZS5jaGFpbihzcmMsIGYpCisgICAgYmFzZS5hc3NlcnQoc3JjIGFuZCBmKQorICAgIGxvY2FsIGxhc3RfaW4sIGxhc3Rfb3V0ID0gIiIsICIiCisgICAgbG9jYWwgc3RhdGUgPSAiZmVlZGluZyIKKyAgICBsb2NhbCBlcnIKKyAgICByZXR1cm4gZnVuY3Rpb24oKQorICAgICAgICBpZiBub3QgbGFzdF9vdXQgdGhlbgorICAgICAgICAgICAgYmFzZS5lcnJvcignc291cmNlIGlzIGVtcHR5IScsIDIpCisgICAgICAgIGVuZAorICAgICAgICB3aGlsZSB0cnVlIGRvCisgICAgICAgICAgICBpZiBzdGF0ZSA9PSAiZmVlZGluZyIgdGhlbgorICAgICAgICAgICAgICAgIGxhc3RfaW4sIGVyciA9IHNyYygpCisgICAgICAgICAgICAgICAgaWYgZXJyIHRoZW4gcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgICAgICAgICAgICAgIGxhc3Rfb3V0ID0gZihsYXN0X2luKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsYXN0X291dCB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIGxhc3RfaW4gdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS5lcnJvcignZmlsdGVyIHJldHVybmVkIGluYXBwcm9wcmlhdGUgbmlsJykKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5pbAorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbHNlaWYgbGFzdF9vdXQgfj0gIiIgdGhlbgorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJlYXRpbmciCisgICAgICAgICAgICAgICAgICAgIGlmIGxhc3RfaW4gdGhlbiBsYXN0X2luID0gIiIgZW5kCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0X291dAorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxhc3Rfb3V0ID0gZihsYXN0X2luKQorICAgICAgICAgICAgICAgIGlmIGxhc3Rfb3V0ID09ICIiIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgbGFzdF9pbiA9PSAiIiB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJmZWVkaW5nIgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLmVycm9yKCdmaWx0ZXIgcmV0dXJuZWQgIiInKQorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbHNlaWYgbm90IGxhc3Rfb3V0IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgbGFzdF9pbiB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLmVycm9yKCdmaWx0ZXIgcmV0dXJuZWQgaW5hcHByb3ByaWF0ZSBuaWwnKQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmlsCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Rfb3V0CisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgZW5kCitlbmQKKworLS0gY3JlYXRlcyBhIHNvdXJjZSB0aGF0IHByb2R1Y2VzIGNvbnRlbnRzIG9mIHNldmVyYWwgc291cmNlcywgb25lIGFmdGVyIHRoZQorLS0gb3RoZXIsIGFzIGlmIHRoZXkgd2VyZSBjb25jYXRlbmF0ZWQKKy0tICh0aGFua3MgdG8gV2ltIENvdXdlbmJlcmcpCitmdW5jdGlvbiBzb3VyY2UuY2F0KC4uLikKKyAgICBsb2NhbCBzcmMgPSB0YWJsZS5yZW1vdmUoYXJnLCAxKQorICAgIHJldHVybiBmdW5jdGlvbigpCisgICAgICAgIHdoaWxlIHNyYyBkbworICAgICAgICAgICAgbG9jYWwgY2h1bmssIGVyciA9IHNyYygpCisgICAgICAgICAgICBpZiBjaHVuayB0aGVuIHJldHVybiBjaHVuayBlbmQKKyAgICAgICAgICAgIGlmIGVyciB0aGVuIHJldHVybiBuaWwsIGVyciBlbmQKKyAgICAgICAgICAgIHNyYyA9IHRhYmxlLnJlbW92ZShhcmcsIDEpCisgICAgICAgIGVuZAorICAgIGVuZAorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBTaW5rIHN0dWZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY3JlYXRlcyBhIHNpbmsgdGhhdCBzdG9yZXMgaW50byBhIHRhYmxlCitmdW5jdGlvbiBzaW5rLnRhYmxlKHQpCisgICAgdCA9IHQgb3Ige30KKyAgICBsb2NhbCBmID0gZnVuY3Rpb24oY2h1bmssIGVycikKKyAgICAgICAgaWYgY2h1bmsgdGhlbiB0YWJsZS5pbnNlcnQodCwgY2h1bmspIGVuZAorICAgICAgICByZXR1cm4gMQorICAgIGVuZAorICAgIHJldHVybiBmLCB0CitlbmQKKworLS0gdHVybnMgYSBmYW5jeSBzaW5rIGludG8gYSBzaW1wbGUgc2luaworZnVuY3Rpb24gc2luay5zaW1wbGlmeShzbmspCisgICAgYmFzZS5hc3NlcnQoc25rKQorICAgIHJldHVybiBmdW5jdGlvbihjaHVuaywgZXJyKQorICAgICAgICBsb2NhbCByZXQsIGVycl9vcl9uZXcgPSBzbmsoY2h1bmssIGVycikKKyAgICAgICAgaWYgbm90IHJldCB0aGVuIHJldHVybiBuaWwsIGVycl9vcl9uZXcgZW5kCisgICAgICAgIHNuayA9IGVycl9vcl9uZXcgb3Igc25rCisgICAgICAgIHJldHVybiAxCisgICAgZW5kCitlbmQKKworLS0gY3JlYXRlcyBhIGZpbGUgc2luaworZnVuY3Rpb24gc2luay5maWxlKGhhbmRsZSwgaW9fZXJyKQorICAgIGlmIGhhbmRsZSB0aGVuCisgICAgICAgIHJldHVybiBmdW5jdGlvbihjaHVuaywgZXJyKQorICAgICAgICAgICAgaWYgbm90IGNodW5rIHRoZW4KKyAgICAgICAgICAgICAgICBoYW5kbGU6Y2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBlbHNlIHJldHVybiBoYW5kbGU6d3JpdGUoY2h1bmspIGVuZAorICAgICAgICBlbmQKKyAgICBlbHNlIHJldHVybiBzaW5rLmVycm9yKGlvX2VyciBvciAidW5hYmxlIHRvIG9wZW4gZmlsZSIpIGVuZAorZW5kCisKKy0tIGNyZWF0ZXMgYSBzaW5rIHRoYXQgZGlzY2FyZHMgZGF0YQorbG9jYWwgZnVuY3Rpb24gbnVsbCgpCisgICAgcmV0dXJuIDEKK2VuZAorCitmdW5jdGlvbiBzaW5rLm51bGwoKQorICAgIHJldHVybiBudWxsCitlbmQKKworLS0gY3JlYXRlcyBhIHNpbmsgdGhhdCBqdXN0IHJldHVybnMgYW4gZXJyb3IKK2Z1bmN0aW9uIHNpbmsuZXJyb3IoZXJyKQorICAgIHJldHVybiBmdW5jdGlvbigpCisgICAgICAgIHJldHVybiBuaWwsIGVycgorICAgIGVuZAorZW5kCisKKy0tIGNoYWlucyBhIHNpbmsgd2l0aCBhIGZpbHRlcgorZnVuY3Rpb24gc2luay5jaGFpbihmLCBzbmspCisgICAgYmFzZS5hc3NlcnQoZiBhbmQgc25rKQorICAgIHJldHVybiBmdW5jdGlvbihjaHVuaywgZXJyKQorICAgICAgICBpZiBjaHVuayB+PSAiIiB0aGVuCisgICAgICAgICAgICBsb2NhbCBmaWx0ZXJlZCA9IGYoY2h1bmspCisgICAgICAgICAgICBsb2NhbCBkb25lID0gY2h1bmsgYW5kICIiCisgICAgICAgICAgICB3aGlsZSB0cnVlIGRvCisgICAgICAgICAgICAgICAgbG9jYWwgcmV0LCBzbmtlcnIgPSBzbmsoZmlsdGVyZWQsIGVycikKKyAgICAgICAgICAgICAgICBpZiBub3QgcmV0IHRoZW4gcmV0dXJuIG5pbCwgc25rZXJyIGVuZAorICAgICAgICAgICAgICAgIGlmIGZpbHRlcmVkID09IGRvbmUgdGhlbiByZXR1cm4gMSBlbmQKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZCA9IGYoZG9uZSkKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbHNlIHJldHVybiAxIGVuZAorICAgIGVuZAorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQdW1wIHN0dWZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcHVtcHMgb25lIGNodW5rIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgc2luaworZnVuY3Rpb24gcHVtcC5zdGVwKHNyYywgc25rKQorICAgIGxvY2FsIGNodW5rLCBzcmNfZXJyID0gc3JjKCkKKyAgICBsb2NhbCByZXQsIHNua19lcnIgPSBzbmsoY2h1bmssIHNyY19lcnIpCisgICAgaWYgY2h1bmsgYW5kIHJldCB0aGVuIHJldHVybiAxCisgICAgZWxzZSByZXR1cm4gbmlsLCBzcmNfZXJyIG9yIHNua19lcnIgZW5kCitlbmQKKworLS0gcHVtcHMgYWxsIGRhdGEgZnJvbSBhIHNvdXJjZSB0byBhIHNpbmssIHVzaW5nIGEgc3RlcCBmdW5jdGlvbgorZnVuY3Rpb24gcHVtcC5hbGwoc3JjLCBzbmssIHN0ZXApCisgICAgYmFzZS5hc3NlcnQoc3JjIGFuZCBzbmspCisgICAgc3RlcCA9IHN0ZXAgb3IgcHVtcC5zdGVwCisgICAgd2hpbGUgdHJ1ZSBkbworICAgICAgICBsb2NhbCByZXQsIGVyciA9IHN0ZXAoc3JjLCBzbmspCisgICAgICAgIGlmIG5vdCByZXQgdGhlbgorICAgICAgICAgICAgaWYgZXJyIHRoZW4gcmV0dXJuIG5pbCwgZXJyCisgICAgICAgICAgICBlbHNlIHJldHVybiAxIGVuZAorICAgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL2x1YXNvY2tldC5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9sdWFzb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZmZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9sdWFzb2NrZXQuYwpAQCAtMCwwICsxLDExOCBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogTHVhU29ja2V0IHRvb2xraXQKKyogTmV0d29ya2luZyBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlCisqIERpZWdvIE5laGFiCisqIDI2LzExLzE5OTkKKyoKKyogVGhpcyBsaWJyYXJ5IGlzIHBhcnQgb2YgYW4gIGVmZm9ydCB0byBwcm9ncmVzc2l2ZWx5IGluY3JlYXNlIHRoZSBuZXR3b3JrCisqIGNvbm5lY3Rpdml0eSAgb2YgIHRoZSBMdWEgIGxhbmd1YWdlLiAgVGhlICBMdWEgaW50ZXJmYWNlICB0byAgbmV0d29ya2luZworKiBmdW5jdGlvbnMgZm9sbG93cyB0aGUgU29ja2V0cyBBUEkgIGNsb3NlbHksIHRyeWluZyB0byBzaW1wbGlmeSBhbGwgdGFza3MKKyogaW52b2x2ZWQgaW4gc2V0dGluZyB1cCBib3RoICBjbGllbnQgYW5kIHNlcnZlciBjb25uZWN0aW9ucy4gVGhlIHByb3ZpZGVkCisqIElPIHJvdXRpbmVzLCBob3dldmVyLCBmb2xsb3cgdGhlIEx1YSAgc3R5bGUsIGJlaW5nIHZlcnkgc2ltaWxhciAgdG8gdGhlCisqIHN0YW5kYXJkIEx1YSByZWFkIGFuZCB3cml0ZSBmdW5jdGlvbnMuCisqCisqIFJDUyBJRDogJElkOiBsdWFzb2NrZXQuYyx2IDEuNTMgMjAwNS8xMC8wNyAwNDo0MDo1OSBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogU3RhbmRhcmQgaW5jbHVkZSBmaWxlcworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKKyNpZiAhZGVmaW5lZChMVUFfVkVSU0lPTl9OVU0pIHx8IChMVUFfVkVSU0lPTl9OVU0gPCA1MDEpCisjaW5jbHVkZSAiY29tcGF0LTUuMS5oIgorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEx1YVNvY2tldCBpbmNsdWRlcworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlICJsdWFzb2NrZXQuaCIKKyNpbmNsdWRlICJhdXhpbGlhci5oIgorI2luY2x1ZGUgImV4Y2VwdC5oIgorI2luY2x1ZGUgInRpbWVvdXQuaCIKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJpbmV0LmgiCisjaW5jbHVkZSAidGNwLmgiCisjaW5jbHVkZSAidWRwLmgiCisjaW5jbHVkZSAic2VsZWN0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGdsb2JhbF9za2lwKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGdsb2JhbF91bmxvYWQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgYmFzZV9vcGVuKGx1YV9TdGF0ZSAqTCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIE1vZHVsZXMgYW5kIGZ1bmN0aW9ucworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBjb25zdCBsdWFMX3JlZyBtb2RbXSA9IHsKKyAgICB7ImF1eGlsaWFyIiwgYXV4aWxpYXJfb3Blbn0sCisgICAgeyJleGNlcHQiLCBleGNlcHRfb3Blbn0sCisgICAgeyJ0aW1lb3V0IiwgdGltZW91dF9vcGVufSwKKyAgICB7ImJ1ZmZlciIsIGJ1ZmZlcl9vcGVufSwKKyAgICB7ImluZXQiLCBpbmV0X29wZW59LAorICAgIHsidGNwIiwgdGNwX29wZW59LAorICAgIHsidWRwIiwgdWRwX29wZW59LAorICAgIHsic2VsZWN0Iiwgc2VsZWN0X29wZW59LAorICAgIHtOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGx1YUxfcmVnIGZ1bmNbXSA9IHsKKyAgICB7InNraXAiLCAgICAgIGdsb2JhbF9za2lwfSwKKyAgICB7Il9fdW5sb2FkIiwgIGdsb2JhbF91bmxvYWR9LAorICAgIHtOVUxMLCAgICAgICAgTlVMTH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNraXAgYSBmZXcgYXJndW1lbnRzCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBnbG9iYWxfc2tpcChsdWFfU3RhdGUgKkwpIHsKKyAgICBpbnQgYW1vdW50ID0gbHVhTF9jaGVja2ludChMLCAxKTsKKyAgICBpbnQgcmV0ID0gbHVhX2dldHRvcChMKSAtIGFtb3VudCAtIDE7CisgICAgcmV0dXJuIHJldCA+PSAwID8gcmV0IDogMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogVW5sb2FkcyB0aGUgbGlicmFyeQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgZ2xvYmFsX3VubG9hZChsdWFfU3RhdGUgKkwpIHsKKyAgICAodm9pZCkgTDsKKyAgICBzb2NrZXRfY2xvc2UoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogU2V0dXAgYmFzaWMgc3R1ZmYuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBiYXNlX29wZW4obHVhX1N0YXRlICpMKSB7CisgICAgaWYgKHNvY2tldF9vcGVuKCkpIHsKKyAgICAgICAgLyogZXhwb3J0IGZ1bmN0aW9ucyAoYW5kIGxlYXZlIG5hbWVzcGFjZSB0YWJsZSBvbiB0b3Agb2Ygc3RhY2spICovCisgICAgICAgIGx1YUxfb3BlbmxpYihMLCAic29ja2V0IiwgZnVuYywgMCk7CisjaWZkZWYgTFVBU09DS0VUX0RFQlVHCisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJfREVCVUciKTsKKyAgICAgICAgbHVhX3B1c2hib29sZWFuKEwsIDEpOworICAgICAgICBsdWFfcmF3c2V0KEwsIC0zKTsKKyNlbmRpZgorICAgICAgICAvKiBtYWtlIHZlcnNpb24gc3RyaW5nIGF2YWlsYWJsZSB0byBzY3JpcHRzICovCisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJfVkVSU0lPTiIpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBMVUFTT0NLRVRfVkVSU0lPTik7CisgICAgICAgIGx1YV9yYXdzZXQoTCwgLTMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCAidW5hYmxlIHRvIGluaXRpYWxpemUgbGlicmFyeSIpOworICAgICAgICBsdWFfZXJyb3IoTCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgYWxsIGxpYnJhcnkgbW9kdWxlcy4KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitMVUFTT0NLRVRfQVBJIGludCBsdWFvcGVuX3NvY2tldF9jb3JlKGx1YV9TdGF0ZSAqTCkgeworICAgIGludCBpOworICAgIGJhc2Vfb3BlbihMKTsKKyAgICBmb3IgKGkgPSAwOyBtb2RbaV0ubmFtZTsgaSsrKSBtb2RbaV0uZnVuYyhMKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvbHVhc29ja2V0LmggYi9sdWFzb2NrZXQtMi4wLjIvc3JjL2x1YXNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjcwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL2x1YXNvY2tldC5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgTFVBU09DS0VUX0gKKyNkZWZpbmUgTFVBU09DS0VUX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEx1YVNvY2tldCB0b29sa2l0CisqIE5ldHdvcmtpbmcgc3VwcG9ydCBmb3IgdGhlIEx1YSBsYW5ndWFnZQorKiBEaWVnbyBOZWhhYgorKiA5LzExLzE5OTkKKyoKKyogUkNTIElEOiAkSWQ6IGx1YXNvY2tldC5oLHYgMS4yNSAyMDA3LzA2LzExIDIzOjQ0OjU0IGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgImx1YS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDdXJyZW50IHNvY2tldCBsaWJyYXJ5IHZlcnNpb24KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIExVQVNPQ0tFVF9WRVJTSU9OICAgICJMdWFTb2NrZXQgMi4wLjIiCisjZGVmaW5lIExVQVNPQ0tFVF9DT1BZUklHSFQgICJDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBEaWVnbyBOZWhhYiIKKyNkZWZpbmUgTFVBU09DS0VUX0FVVEhPUlMgICAgIkRpZWdvIE5laGFiIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBUaGlzIG1hY3JvIHByZWZpeGVzIGFsbCBleHBvcnRlZCBBUEkgZnVuY3Rpb25zCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBMVUFTT0NLRVRfQVBJCisjZGVmaW5lIExVQVNPQ0tFVF9BUEkgZXh0ZXJuCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworTFVBU09DS0VUX0FQSSBpbnQgbHVhb3Blbl9zb2NrZXRfY29yZShsdWFfU3RhdGUgKkwpOworCisjZW5kaWYgLyogTFVBU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvbWFrZWZpbGUgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTRmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL21ha2VmaWxlCkBAIC0wLDAgKzEsOTAgQEAKKyMtLS0tLS0KKyMgTG9hZCBjb25maWd1cmF0aW9uCisjCitpbmNsdWRlIC4uL2NvbmZpZworCisjLS0tLS0tCisjIEhvcGVmdWxseSBubyBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUKKyMKKworIy0tLS0tLQorIyBNb2R1bGVzIGJlbG9uZ2luZyB0byBzb2NrZXQtY29yZQorIworCisjJChDT01QQVQpL2NvbXBhdC01LjEubyBcCisKK1NPQ0tFVF9PQkpTOj0gXAorCWx1YXNvY2tldC5vIFwKKwl0aW1lb3V0Lm8gXAorCWJ1ZmZlci5vIFwKKwlpby5vIFwKKwlhdXhpbGlhci5vIFwKKwlvcHRpb25zLm8gXAorCWluZXQubyBcCisJdGNwLm8gXAorCXVkcC5vIFwKKwlleGNlcHQubyBcCisJc2VsZWN0Lm8gXAorCXVzb2NrZXQubyAKKworIy0tLS0tLQorIyBNb2R1bGVzIGJlbG9uZ2luZyBtaW1lLWNvcmUKKyMKKyMkKENPTVBBVCkvY29tcGF0LTUuMS5vIFwKKworTUlNRV9PQkpTOj1cCisJbWltZS5vIAorCisjLS0tLS0tCisjIE1vZHVsZXMgYmVsb25naW5nIHVuaXggKGxvY2FsIGRvbWFpbiBzb2NrZXRzKQorIworVU5JWF9PQkpTOj1cCisJYnVmZmVyLm8gXAorCWF1eGlsaWFyLm8gXAorCW9wdGlvbnMubyBcCisJdGltZW91dC5vIFwKKwlpby5vIFwKKwl1c29ja2V0Lm8gXAorCXVuaXgubworCithbGw6ICQoU09DS0VUX1NPKSAkKE1JTUVfU08pIAorCiskKFNPQ0tFVF9TTyk6ICQoU09DS0VUX09CSlMpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFNPQ0tFVF9PQkpTKQorCiskKE1JTUVfU08pOiAkKE1JTUVfT0JKUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoTUlNRV9PQkpTKQorCiskKFVOSVhfU08pOiAkKFVOSVhfT0JKUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQoVU5JWF9PQkpTKQorCisjLS0tLS0tCisjIExpc3Qgb2YgZGVwZW5kZW5jaWVzCisjCithdXhpbGlhci5vOiBhdXhpbGlhci5jIGF1eGlsaWFyLmgKK2J1ZmZlci5vOiBidWZmZXIuYyBidWZmZXIuaCBpby5oIHRpbWVvdXQuaAorZXhjZXB0Lm86IGV4Y2VwdC5jIGV4Y2VwdC5oCitpbmV0Lm86IGluZXQuYyBpbmV0Lmggc29ja2V0LmggaW8uaCB0aW1lb3V0LmggdXNvY2tldC5oCitpby5vOiBpby5jIGlvLmggdGltZW91dC5oCitsdWFzb2NrZXQubzogbHVhc29ja2V0LmMgbHVhc29ja2V0LmggYXV4aWxpYXIuaCBleGNlcHQuaCB0aW1lb3V0LmggXAorICBidWZmZXIuaCBpby5oIGluZXQuaCBzb2NrZXQuaCB1c29ja2V0LmggdGNwLmggdWRwLmggc2VsZWN0LmgKK21pbWUubzogbWltZS5jIG1pbWUuaAorb3B0aW9ucy5vOiBvcHRpb25zLmMgYXV4aWxpYXIuaCBvcHRpb25zLmggc29ja2V0LmggaW8uaCB0aW1lb3V0LmggXAorICB1c29ja2V0LmggaW5ldC5oCitzZWxlY3Qubzogc2VsZWN0LmMgc29ja2V0LmggaW8uaCB0aW1lb3V0LmggdXNvY2tldC5oIHNlbGVjdC5oCit0Y3AubzogdGNwLmMgYXV4aWxpYXIuaCBzb2NrZXQuaCBpby5oIHRpbWVvdXQuaCB1c29ja2V0LmggaW5ldC5oIFwKKyAgb3B0aW9ucy5oIHRjcC5oIGJ1ZmZlci5oCit0aW1lb3V0Lm86IHRpbWVvdXQuYyBhdXhpbGlhci5oIHRpbWVvdXQuaAordWRwLm86IHVkcC5jIGF1eGlsaWFyLmggc29ja2V0LmggaW8uaCB0aW1lb3V0LmggdXNvY2tldC5oIGluZXQuaCBcCisgIG9wdGlvbnMuaCB1ZHAuaAordW5peC5vOiB1bml4LmMgYXV4aWxpYXIuaCBzb2NrZXQuaCBpby5oIHRpbWVvdXQuaCB1c29ja2V0Lmggb3B0aW9ucy5oIFwKKyAgdW5peC5oIGJ1ZmZlci5oCit1c29ja2V0Lm86IHVzb2NrZXQuYyBzb2NrZXQuaCBpby5oIHRpbWVvdXQuaCB1c29ja2V0LmgKKworY2xlYW46CisJcm0gLWYgJChTT0NLRVRfU08pICQoU09DS0VUX09CSlMpIAorCXJtIC1mICQoTUlNRV9TTykgJChVTklYX1NPKSAkKE1JTUVfT0JKUykgJChVTklYX09CSlMpCisKKyMtLS0tLS0KKyMgRW5kIG9mIG1ha2VmaWxlIGNvbmZpZ3VyYXRpb24KKyMKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvbWltZS5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9taW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwZmEwNQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvbWltZS5jCkBAIC0wLDAgKzEsNzExIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBNSU1FIHN1cHBvcnQgZnVuY3Rpb25zCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFJDUyBJRDogJElkOiBtaW1lLmMsdiAxLjI4IDIwMDUvMTEvMjAgMDc6MjA6MjMgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKKyNpZiAhZGVmaW5lZChMVUFfVkVSU0lPTl9OVU0pIHx8IChMVUFfVkVSU0lPTl9OVU0gPCA1MDEpCisjaW5jbHVkZSAiY29tcGF0LTUuMS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJtaW1lLmgiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIERvbid0IHdhbnQgdG8gdHJ1c3QgZXNjYXBlIGNoYXJhY3RlciBjb25zdGFudHMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUM7CitzdGF0aWMgY29uc3QgY2hhciBDUkxGW10gPSAiXHJcbiI7CitzdGF0aWMgY29uc3QgY2hhciBFUUNSTEZbXSA9ICI9XHJcbiI7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMuCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBtaW1lX2dsb2JhbF93cnAobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWltZV9nbG9iYWxfYjY0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1pbWVfZ2xvYmFsX3VuYjY0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1pbWVfZ2xvYmFsX3FwKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1pbWVfZ2xvYmFsX3VucXAobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWltZV9nbG9iYWxfcXB3cnAobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWltZV9nbG9iYWxfZW9sKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1pbWVfZ2xvYmFsX2RvdChsdWFfU3RhdGUgKkwpOworCitzdGF0aWMgc2l6ZV90IGRvdChpbnQgYywgc2l6ZV90IHN0YXRlLCBsdWFMX0J1ZmZlciAqYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGI2NHNldHVwKFVDICpiNjR1bmJhc2UpOworc3RhdGljIHNpemVfdCBiNjRlbmNvZGUoVUMgYywgVUMgKmlucHV0LCBzaXplX3Qgc2l6ZSwgbHVhTF9CdWZmZXIgKmJ1ZmZlcik7CitzdGF0aWMgc2l6ZV90IGI2NHBhZChjb25zdCBVQyAqaW5wdXQsIHNpemVfdCBzaXplLCBsdWFMX0J1ZmZlciAqYnVmZmVyKTsKK3N0YXRpYyBzaXplX3QgYjY0ZGVjb2RlKFVDIGMsIFVDICppbnB1dCwgc2l6ZV90IHNpemUsIGx1YUxfQnVmZmVyICpidWZmZXIpOworCitzdGF0aWMgdm9pZCBxcHNldHVwKFVDICpxcGNsYXNzLCBVQyAqcXB1bmJhc2UpOworc3RhdGljIHZvaWQgcXBxdW90ZShVQyBjLCBsdWFMX0J1ZmZlciAqYnVmZmVyKTsKK3N0YXRpYyBzaXplX3QgcXBkZWNvZGUoVUMgYywgVUMgKmlucHV0LCBzaXplX3Qgc2l6ZSwgbHVhTF9CdWZmZXIgKmJ1ZmZlcik7CitzdGF0aWMgc2l6ZV90IHFwZW5jb2RlKFVDIGMsIFVDICppbnB1dCwgc2l6ZV90IHNpemUsIAorICAgICAgICBjb25zdCBjaGFyICptYXJrZXIsIGx1YUxfQnVmZmVyICpidWZmZXIpOworc3RhdGljIHNpemVfdCBxcHBhZChVQyAqaW5wdXQsIHNpemVfdCBzaXplLCBsdWFMX0J1ZmZlciAqYnVmZmVyKTsKKworLyogY29kZSBzdXBwb3J0IGZ1bmN0aW9ucyAqLworc3RhdGljIGx1YUxfcmVnIGZ1bmNbXSA9IHsKKyAgICB7ICJkb3QiLCBtaW1lX2dsb2JhbF9kb3QgfSwKKyAgICB7ICJiNjQiLCBtaW1lX2dsb2JhbF9iNjQgfSwKKyAgICB7ICJlb2wiLCBtaW1lX2dsb2JhbF9lb2wgfSwKKyAgICB7ICJxcCIsIG1pbWVfZ2xvYmFsX3FwIH0sCisgICAgeyAicXB3cnAiLCBtaW1lX2dsb2JhbF9xcHdycCB9LAorICAgIHsgInVuYjY0IiwgbWltZV9nbG9iYWxfdW5iNjQgfSwKKyAgICB7ICJ1bnFwIiwgbWltZV9nbG9iYWxfdW5xcCB9LAorICAgIHsgIndycCIsIG1pbWVfZ2xvYmFsX3dycCB9LAorICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBRdW90ZWQtcHJpbnRhYmxlIGdsb2JhbHMKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgVUMgcXBjbGFzc1syNTZdOworc3RhdGljIFVDIHFwYmFzZVtdID0gIjAxMjM0NTY3ODlBQkNERUYiOworc3RhdGljIFVDIHFwdW5iYXNlWzI1Nl07CitlbnVtIHtRUF9QTEFJTiwgUVBfUVVPVEVELCBRUF9DUiwgUVBfSUZfTEFTVH07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEJhc2U2NCBnbG9iYWxzCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGNvbnN0IFVDIGI2NGJhc2VbXSA9CisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKK3N0YXRpYyBVQyBiNjR1bmJhc2VbMjU2XTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogRXhwb3J0ZWQgZnVuY3Rpb25zCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgbW9kdWxlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworTUlNRV9BUEkgaW50IGx1YW9wZW5fbWltZV9jb3JlKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBsdWFMX29wZW5saWIoTCwgIm1pbWUiLCBmdW5jLCAwKTsKKyAgICAvKiBtYWtlIHZlcnNpb24gc3RyaW5nIGF2YWlsYWJsZSB0byBzY3JpcHRzICovCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgIl9WRVJTSU9OIik7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgTUlNRV9WRVJTSU9OKTsKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsKKyAgICAvKiBpbml0aWFsaXplIGxvb2t1cCB0YWJsZXMgKi8KKyAgICBxcHNldHVwKHFwY2xhc3MsIHFwdW5iYXNlKTsKKyAgICBiNjRzZXR1cChiNjR1bmJhc2UpOworICAgIHJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBHbG9iYWwgTHVhIGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluY3JlbWVudGFseSBicmVha3MgYSBzdHJpbmcgaW50byBsaW5lcy4gVGhlIHN0cmluZyBjYW4gaGF2ZSBDUkxGIGJyZWFrcy4KKyogQSwgbiA9IHdycChsLCBCLCBsZW5ndGgpCisqIEEgaXMgYSBjb3B5IG9mIEIsIGJyb2tlbiBpbnRvIGxpbmVzIG9mIGF0IG1vc3QgJ2xlbmd0aCcgYnl0ZXMuIAorKiAnbCcgaXMgaG93IG1hbnkgYnl0ZXMgYXJlIGxlZnQgZm9yIHRoZSBmaXJzdCBsaW5lIG9mIEIuIAorKiAnbicgaXMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IGluIHRoZSBsYXN0IGxpbmUgb2YgQS4gCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtaW1lX2dsb2JhbF93cnAobHVhX1N0YXRlICpMKQoreworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBpbnQgbGVmdCA9IChpbnQpIGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgICAgY29uc3QgVUMgKmlucHV0ID0gKFVDICopIGx1YUxfb3B0bHN0cmluZyhMLCAyLCBOVUxMLCAmc2l6ZSk7CisgICAgY29uc3QgVUMgKmxhc3QgPSBpbnB1dCArIHNpemU7CisgICAgaW50IGxlbmd0aCA9IChpbnQpIGx1YUxfb3B0bnVtYmVyKEwsIDMsIDc2KTsKKyAgICBsdWFMX0J1ZmZlciBidWZmZXI7CisgICAgLyogZW5kIG9mIGlucHV0IGJsYWNrLWhvbGUgKi8KKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIC8qIGlmIGxhc3QgbGluZSBoYXMgbm90IGJlZW4gdGVybWluYXRlZCwgYWRkIGEgbGluZSBicmVhayAqLworICAgICAgICBpZiAobGVmdCA8IGxlbmd0aCkgbHVhX3B1c2hzdHJpbmcoTCwgQ1JMRik7CisgICAgICAgIC8qIG90aGVyd2lzZSwgd2UgYXJlIGRvbmUgKi8KKyAgICAgICAgZWxzZSBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSAKKyAgICBsdWFMX2J1ZmZpbml0KEwsICZidWZmZXIpOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpIHsKKyAgICAgICAgc3dpdGNoICgqaW5wdXQpIHsKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBsdWFMX2FkZHN0cmluZygmYnVmZmVyLCBDUkxGKTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAobGVmdCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGx1YUxfYWRkc3RyaW5nKCZidWZmZXIsIENSTEYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsdWFMX3B1dGNoYXIoJmJ1ZmZlciwgKmlucHV0KTsKKyAgICAgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXQrKzsKKyAgICB9CisgICAgbHVhTF9wdXNocmVzdWx0KCZidWZmZXIpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIGxlZnQpOworICAgIHJldHVybiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBGaWxsIGJhc2U2NCBkZWNvZGUgbWFwLiAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBiNjRzZXR1cChVQyAqYjY0dW5iYXNlKSAKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSBiNjR1bmJhc2VbaV0gPSAoVUMpIDI1NTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgYjY0dW5iYXNlW2I2NGJhc2VbaV1dID0gKFVDKSBpOworICAgIGI2NHVuYmFzZVsnPSddID0gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQWN1bXVsYXRlcyBieXRlcyBpbiBpbnB1dCBidWZmZXIgdW50aWwgMyBieXRlcyBhcmUgYXZhaWxhYmxlLiAKKyogVHJhbnNsYXRlIHRoZSAzIGJ5dGVzIGludG8gQmFzZTY0IGZvcm0gYW5kIGFwcGVuZCB0byBidWZmZXIuCisqIFJldHVybnMgbmV3IG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHNpemVfdCBiNjRlbmNvZGUoVUMgYywgVUMgKmlucHV0LCBzaXplX3Qgc2l6ZSwgCisgICAgICAgIGx1YUxfQnVmZmVyICpidWZmZXIpCit7CisgICAgaW5wdXRbc2l6ZSsrXSA9IGM7CisgICAgaWYgKHNpemUgPT0gMykgeworICAgICAgICBVQyBjb2RlWzRdOworICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKyAgICAgICAgdmFsdWUgKz0gaW5wdXRbMF07IHZhbHVlIDw8PSA4OworICAgICAgICB2YWx1ZSArPSBpbnB1dFsxXTsgdmFsdWUgPDw9IDg7CisgICAgICAgIHZhbHVlICs9IGlucHV0WzJdOyAKKyAgICAgICAgY29kZVszXSA9IGI2NGJhc2VbdmFsdWUgJiAweDNmXTsgdmFsdWUgPj49IDY7CisgICAgICAgIGNvZGVbMl0gPSBiNjRiYXNlW3ZhbHVlICYgMHgzZl07IHZhbHVlID4+PSA2OworICAgICAgICBjb2RlWzFdID0gYjY0YmFzZVt2YWx1ZSAmIDB4M2ZdOyB2YWx1ZSA+Pj0gNjsKKyAgICAgICAgY29kZVswXSA9IGI2NGJhc2VbdmFsdWVdOworICAgICAgICBsdWFMX2FkZGxzdHJpbmcoYnVmZmVyLCAoY2hhciAqKSBjb2RlLCA0KTsKKyAgICAgICAgc2l6ZSA9IDA7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBFbmNvZGVzIHRoZSBCYXNlNjQgbGFzdCAxIG9yIDIgYnl0ZXMgYW5kIGFkZHMgcGFkZGluZyAnPScgCisqIFJlc3VsdCwgaWYgYW55LCBpcyBhcHBlbmRlZCB0byBidWZmZXIuCisqIFJldHVybnMgMC4KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc2l6ZV90IGI2NHBhZChjb25zdCBVQyAqaW5wdXQsIHNpemVfdCBzaXplLCAKKyAgICAgICAgbHVhTF9CdWZmZXIgKmJ1ZmZlcikKK3sKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKyAgICBVQyBjb2RlWzRdID0geyc9JywgJz0nLCAnPScsICc9J307CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHZhbHVlID0gaW5wdXRbMF0gPDwgNDsKKyAgICAgICAgICAgIGNvZGVbMV0gPSBiNjRiYXNlW3ZhbHVlICYgMHgzZl07IHZhbHVlID4+PSA2OworICAgICAgICAgICAgY29kZVswXSA9IGI2NGJhc2VbdmFsdWVdOworICAgICAgICAgICAgbHVhTF9hZGRsc3RyaW5nKGJ1ZmZlciwgKGNoYXIgKikgY29kZSwgNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdmFsdWUgPSBpbnB1dFswXTsgdmFsdWUgPDw9IDg7IAorICAgICAgICAgICAgdmFsdWUgfD0gaW5wdXRbMV07IHZhbHVlIDw8PSAyOworICAgICAgICAgICAgY29kZVsyXSA9IGI2NGJhc2VbdmFsdWUgJiAweDNmXTsgdmFsdWUgPj49IDY7CisgICAgICAgICAgICBjb2RlWzFdID0gYjY0YmFzZVt2YWx1ZSAmIDB4M2ZdOyB2YWx1ZSA+Pj0gNjsKKyAgICAgICAgICAgIGNvZGVbMF0gPSBiNjRiYXNlW3ZhbHVlXTsKKyAgICAgICAgICAgIGx1YUxfYWRkbHN0cmluZyhidWZmZXIsIChjaGFyICopIGNvZGUsIDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEFjdW11bGF0ZXMgYnl0ZXMgaW4gaW5wdXQgYnVmZmVyIHVudGlsIDQgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gCisqIFRyYW5zbGF0ZSB0aGUgNCBieXRlcyBmcm9tIEJhc2U2NCBmb3JtIGFuZCBhcHBlbmQgdG8gYnVmZmVyLgorKiBSZXR1cm5zIG5ldyBudW1iZXIgb2YgYnl0ZXMgaW4gYnVmZmVyLgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzaXplX3QgYjY0ZGVjb2RlKFVDIGMsIFVDICppbnB1dCwgc2l6ZV90IHNpemUsIAorICAgICAgICBsdWFMX0J1ZmZlciAqYnVmZmVyKQoreworICAgIC8qIGlnbm9yZSBpbnZhbGlkIGNoYXJhY3RlcnMgKi8KKyAgICBpZiAoYjY0dW5iYXNlW2NdID4gNjQpIHJldHVybiBzaXplOworICAgIGlucHV0W3NpemUrK10gPSBjOworICAgIC8qIGRlY29kZSBhdG9tICovCisgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICBVQyBkZWNvZGVkWzNdOworICAgICAgICBpbnQgdmFsaWQsIHZhbHVlID0gMDsKKyAgICAgICAgdmFsdWUgPSAgYjY0dW5iYXNlW2lucHV0WzBdXTsgdmFsdWUgPDw9IDY7CisgICAgICAgIHZhbHVlIHw9IGI2NHVuYmFzZVtpbnB1dFsxXV07IHZhbHVlIDw8PSA2OworICAgICAgICB2YWx1ZSB8PSBiNjR1bmJhc2VbaW5wdXRbMl1dOyB2YWx1ZSA8PD0gNjsKKyAgICAgICAgdmFsdWUgfD0gYjY0dW5iYXNlW2lucHV0WzNdXTsKKyAgICAgICAgZGVjb2RlZFsyXSA9IChVQykgKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OworICAgICAgICBkZWNvZGVkWzFdID0gKFVDKSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7CisgICAgICAgIGRlY29kZWRbMF0gPSAoVUMpIHZhbHVlOworICAgICAgICAvKiB0YWtlIGNhcmUgb2YgcGFkZGRpbmcgKi8KKyAgICAgICAgdmFsaWQgPSAoaW5wdXRbMl0gPT0gJz0nKSA/IDEgOiAoaW5wdXRbM10gPT0gJz0nKSA/IDIgOiAzOyAKKyAgICAgICAgbHVhTF9hZGRsc3RyaW5nKGJ1ZmZlciwgKGNoYXIgKikgZGVjb2RlZCwgdmFsaWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBuZWVkIG1vcmUgZGF0YSAqLworICAgIH0gZWxzZSByZXR1cm4gc2l6ZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5jcmVtZW50YWxseSBhcHBsaWVzIHRoZSBCYXNlNjQgdHJhbnNmZXIgY29udGVudCBlbmNvZGluZyB0byBhIHN0cmluZworKiBBLCBCID0gYjY0KEMsIEQpCisqIEEgaXMgdGhlIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgbGFyZ2VzdCBwcmVmaXggb2YgQyAuLiBEIHRoYXQgaXMKKyogZGl2aXNpYmxlIGJ5IDMuIEIgaGFzIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgQyAuLiBELCAqd2l0aG91dCogZW5jb2RpbmcuCisqIFRoZSBlYXNpZXN0IHRoaW5nIHdvdWxkIGJlIHRvIGNvbmNhdGVuYXRlIHRoZSB0d28gc3RyaW5ncyBhbmQgCisqIGVuY29kZSB0aGUgcmVzdWx0LCBidXQgd2UgY2FuJ3QgYWZmb3JkIHRoYXQgb3IgTHVhIHdvdWxkIGR1cHBsaWNhdGUKKyogZXZlcnkgY2h1bmsgd2UgcmVjZWl2ZWQuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtaW1lX2dsb2JhbF9iNjQobHVhX1N0YXRlICpMKQoreworICAgIFVDIGF0b21bM107CisgICAgc2l6ZV90IGlzaXplID0gMCwgYXNpemUgPSAwOworICAgIGNvbnN0IFVDICppbnB1dCA9IChVQyAqKSBsdWFMX29wdGxzdHJpbmcoTCwgMSwgTlVMTCwgJmlzaXplKTsKKyAgICBjb25zdCBVQyAqbGFzdCA9IGlucHV0ICsgaXNpemU7CisgICAgbHVhTF9CdWZmZXIgYnVmZmVyOworICAgIC8qIGVuZC1vZi1pbnB1dCBibGFja2hvbGUgKi8KKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIC8qIHByb2Nlc3MgZmlyc3QgcGFydCBvZiB0aGUgaW5wdXQgKi8KKyAgICBsdWFMX2J1ZmZpbml0KEwsICZidWZmZXIpOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpIAorICAgICAgICBhc2l6ZSA9IGI2NGVuY29kZSgqaW5wdXQrKywgYXRvbSwgYXNpemUsICZidWZmZXIpOworICAgIGlucHV0ID0gKFVDICopIGx1YUxfb3B0bHN0cmluZyhMLCAyLCBOVUxMLCAmaXNpemUpOworICAgIC8qIGlmIHNlY29uZCBwYXJ0IGlzIG5pbCwgd2UgYXJlIGRvbmUgKi8KKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIGFzaXplID0gYjY0cGFkKGF0b20sIGFzaXplLCAmYnVmZmVyKTsKKyAgICAgICAgbHVhTF9wdXNocmVzdWx0KCZidWZmZXIpOworICAgICAgICBpZiAoISgqbHVhX3Rvc3RyaW5nKEwsIC0xKSkpIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIC8qIG90aGVyd2lzZSBwcm9jZXNzIHRoZSBzZWNvbmQgcGFydCAqLworICAgIGxhc3QgPSBpbnB1dCArIGlzaXplOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpIAorICAgICAgICBhc2l6ZSA9IGI2NGVuY29kZSgqaW5wdXQrKywgYXRvbSwgYXNpemUsICZidWZmZXIpOworICAgIGx1YUxfcHVzaHJlc3VsdCgmYnVmZmVyKTsKKyAgICBsdWFfcHVzaGxzdHJpbmcoTCwgKGNoYXIgKikgYXRvbSwgYXNpemUpOworICAgIHJldHVybiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBJbmNyZW1lbnRhbGx5IHJlbW92ZXMgdGhlIEJhc2U2NCB0cmFuc2ZlciBjb250ZW50IGVuY29kaW5nIGZyb20gYSBzdHJpbmcKKyogQSwgQiA9IGI2NChDLCBEKQorKiBBIGlzIHRoZSBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIGxhcmdlc3QgcHJlZml4IG9mIEMgLi4gRCB0aGF0IGlzCisqIGRpdmlzaWJsZSBieSA0LiBCIGhhcyB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIEMgLi4gRCwgKndpdGhvdXQqIGVuY29kaW5nLgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWltZV9nbG9iYWxfdW5iNjQobHVhX1N0YXRlICpMKQoreworICAgIFVDIGF0b21bNF07CisgICAgc2l6ZV90IGlzaXplID0gMCwgYXNpemUgPSAwOworICAgIGNvbnN0IFVDICppbnB1dCA9IChVQyAqKSBsdWFMX29wdGxzdHJpbmcoTCwgMSwgTlVMTCwgJmlzaXplKTsKKyAgICBjb25zdCBVQyAqbGFzdCA9IGlucHV0ICsgaXNpemU7CisgICAgbHVhTF9CdWZmZXIgYnVmZmVyOworICAgIC8qIGVuZC1vZi1pbnB1dCBibGFja2hvbGUgKi8KKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIC8qIHByb2Nlc3MgZmlyc3QgcGFydCBvZiB0aGUgaW5wdXQgKi8KKyAgICBsdWFMX2J1ZmZpbml0KEwsICZidWZmZXIpOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpIAorICAgICAgICBhc2l6ZSA9IGI2NGRlY29kZSgqaW5wdXQrKywgYXRvbSwgYXNpemUsICZidWZmZXIpOworICAgIGlucHV0ID0gKFVDICopIGx1YUxfb3B0bHN0cmluZyhMLCAyLCBOVUxMLCAmaXNpemUpOworICAgIC8qIGlmIHNlY29uZCBpcyBuaWwsIHdlIGFyZSBkb25lICovCisgICAgaWYgKCFpbnB1dCkgeworICAgICAgICBsdWFMX3B1c2hyZXN1bHQoJmJ1ZmZlcik7CisgICAgICAgIGlmICghKCpsdWFfdG9zdHJpbmcoTCwgLTEpKSkgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgLyogb3RoZXJ3aXNlLCBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBpbnB1dCAqLworICAgIGxhc3QgPSBpbnB1dCArIGlzaXplOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpIAorICAgICAgICBhc2l6ZSA9IGI2NGRlY29kZSgqaW5wdXQrKywgYXRvbSwgYXNpemUsICZidWZmZXIpOworICAgIGx1YUxfcHVzaHJlc3VsdCgmYnVmZmVyKTsKKyAgICBsdWFfcHVzaGxzdHJpbmcoTCwgKGNoYXIgKikgYXRvbSwgYXNpemUpOworICAgIHJldHVybiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBRdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHNjaGVtZQorKiBhbGwgKGV4Y2VwdCBDUkxGIGluIHRleHQpIGNhbiBiZSA9WFgKKyogQ0xSTCBpbiBub3QgdGV4dCBtdXN0IGJlID1YWD1YWAorKiAzMyB0aHJvdWdoIDYwIGluY2x1c2l2ZSBjYW4gYmUgcGxhaW4KKyogNjIgdGhyb3VnaCAxMjYgaW5jbHVzaXZlIGNhbiBiZSBwbGFpbgorKiA5IGFuZCAzMiBjYW4gYmUgcGxhaW4sIHVubGVzcyBpbiB0aGUgZW5kIG9mIGEgbGluZSwgd2hlcmUgbXVzdCBiZSA9WFgKKyogZW5jb2RlZCBsaW5lcyBtdXN0IGJlIG5vIGxvbmdlciB0aGFuIDc2IG5vdCBjb3VudGluZyBDUkxGCisqIHNvZnQgbGluZS1icmVhayBhcmUgPUNSTEYKKyogVG8gZW5jb2RlIG9uZSBieXRlLCB3ZSBuZWVkIHRvIHNlZSB0aGUgbmV4dCB0d28uIAorKiBXb3JzdCBjYXNlIGlzIHdoZW4gd2Ugc2VlIGEgc3BhY2UsIGFuZCB3b25kZXIgaWYgYSBDUkxGIGlzIGNvbW1pbmcKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBTcGxpdCBxdW90ZWQtcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW50byBjbGFzc2VzCisqIFByZWNvbXB1dGUgcmV2ZXJzZSBtYXAgZm9yIGVuY29kaW5nCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgcXBzZXR1cChVQyAqcXBjbGFzcywgVUMgKnFwdW5iYXNlKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgcXBjbGFzc1tpXSA9IFFQX1FVT1RFRDsKKyAgICBmb3IgKGkgPSAzMzsgaSA8PSA2MDsgaSsrKSBxcGNsYXNzW2ldID0gUVBfUExBSU47CisgICAgZm9yIChpID0gNjI7IGkgPD0gMTI2OyBpKyspIHFwY2xhc3NbaV0gPSBRUF9QTEFJTjsKKyAgICBxcGNsYXNzWydcdCddID0gUVBfSUZfTEFTVDsgCisgICAgcXBjbGFzc1snICddID0gUVBfSUZfTEFTVDsKKyAgICBxcGNsYXNzWydcciddID0gUVBfQ1I7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBxcHVuYmFzZVtpXSA9IDI1NTsKKyAgICBxcHVuYmFzZVsnMCddID0gMDsgcXB1bmJhc2VbJzEnXSA9IDE7IHFwdW5iYXNlWycyJ10gPSAyOworICAgIHFwdW5iYXNlWyczJ10gPSAzOyBxcHVuYmFzZVsnNCddID0gNDsgcXB1bmJhc2VbJzUnXSA9IDU7CisgICAgcXB1bmJhc2VbJzYnXSA9IDY7IHFwdW5iYXNlWyc3J10gPSA3OyBxcHVuYmFzZVsnOCddID0gODsKKyAgICBxcHVuYmFzZVsnOSddID0gOTsgcXB1bmJhc2VbJ0EnXSA9IDEwOyBxcHVuYmFzZVsnYSddID0gMTA7CisgICAgcXB1bmJhc2VbJ0InXSA9IDExOyBxcHVuYmFzZVsnYiddID0gMTE7IHFwdW5iYXNlWydDJ10gPSAxMjsKKyAgICBxcHVuYmFzZVsnYyddID0gMTI7IHFwdW5iYXNlWydEJ10gPSAxMzsgcXB1bmJhc2VbJ2QnXSA9IDEzOworICAgIHFwdW5iYXNlWydFJ10gPSAxNDsgcXB1bmJhc2VbJ2UnXSA9IDE0OyBxcHVuYmFzZVsnRiddID0gMTU7CisgICAgcXB1bmJhc2VbJ2YnXSA9IDE1OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBPdXRwdXQgb25lIGNoYXJhY3RlciBpbiBmb3JtID1YWAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHFwcXVvdGUoVUMgYywgbHVhTF9CdWZmZXIgKmJ1ZmZlcikKK3sKKyAgICBsdWFMX3B1dGNoYXIoYnVmZmVyLCAnPScpOworICAgIGx1YUxfcHV0Y2hhcihidWZmZXIsIHFwYmFzZVtjID4+IDRdKTsKKyAgICBsdWFMX3B1dGNoYXIoYnVmZmVyLCBxcGJhc2VbYyAmIDB4MEZdKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQWNjdW11bGF0ZSBjaGFyYWN0ZXJzIHVudGlsIHdlIGFyZSBzdXJlIGFib3V0IGhvdyB0byBkZWFsIHdpdGggdGhlbS4KKyogT25jZSB3ZSBhcmUgc3VyZSwgb3V0cHV0IHRvIHRoZSBidWZmZXIsIGluIHRoZSBjb3JyZWN0IGZvcm0uIAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzaXplX3QgcXBlbmNvZGUoVUMgYywgVUMgKmlucHV0LCBzaXplX3Qgc2l6ZSwgCisgICAgICAgIGNvbnN0IGNoYXIgKm1hcmtlciwgbHVhTF9CdWZmZXIgKmJ1ZmZlcikKK3sKKyAgICBpbnB1dFtzaXplKytdID0gYzsKKyAgICAvKiBkZWFsIHdpdGggYWxsIGNoYXJhY3RlcnMgd2UgY2FuIGhhdmUgKi8KKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgc3dpdGNoIChxcGNsYXNzW2lucHV0WzBdXSkgeworICAgICAgICAgICAgLyogbWlnaHQgYmUgdGhlIENSIG9mIGEgQ1JMRiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgY2FzZSBRUF9DUjoKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIpIHJldHVybiBzaXplOworICAgICAgICAgICAgICAgIGlmIChpbnB1dFsxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgIGx1YUxfYWRkc3RyaW5nKGJ1ZmZlciwgbWFya2VyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHFwcXVvdGUoaW5wdXRbMF0sIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBtaWdodCBiZSBhIHNwYWNlIGFuZCB0aGF0IGhhcyB0byBiZSBxdW90ZWQgaWYgbGFzdCBpbiBsaW5lICovCisgICAgICAgICAgICBjYXNlIFFQX0lGX0xBU1Q6CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCAzKSByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgICAgICAvKiBpZiBpdCBpcyB0aGUgbGFzdCwgcXVvdGUgaXQgYW5kIHdlIGFyZSBkb25lICovCisgICAgICAgICAgICAgICAgaWYgKGlucHV0WzFdID09ICdccicgJiYgaW5wdXRbMl0gPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICBxcHF1b3RlKGlucHV0WzBdLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBsdWFMX2FkZHN0cmluZyhidWZmZXIsIG1hcmtlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSBsdWFMX3B1dGNoYXIoYnVmZmVyLCBpbnB1dFswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogbWlnaHQgaGF2ZSB0byBiZSBxdW90ZWQgYWx3YXlzICovCisgICAgICAgICAgICBjYXNlIFFQX1FVT1RFRDoKKyAgICAgICAgICAgICAgICBxcHF1b3RlKGlucHV0WzBdLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIG1pZ2h0IG5ldmVyIGhhdmUgdG8gYmUgcXVvdGVkICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGx1YUxfcHV0Y2hhcihidWZmZXIsIGlucHV0WzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnB1dFswXSA9IGlucHV0WzFdOyBpbnB1dFsxXSA9IGlucHV0WzJdOworICAgICAgICBzaXplLS07CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBEZWFsIHdpdGggdGhlIGZpbmFsIGNoYXJhY3RlcnMgCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHNpemVfdCBxcHBhZChVQyAqaW5wdXQsIHNpemVfdCBzaXplLCBsdWFMX0J1ZmZlciAqYnVmZmVyKQoreworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHFwY2xhc3NbaW5wdXRbaV1dID09IFFQX1BMQUlOKSBsdWFMX3B1dGNoYXIoYnVmZmVyLCBpbnB1dFtpXSk7CisgICAgICAgIGVsc2UgcXBxdW90ZShpbnB1dFtpXSwgYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKHNpemUgPiAwKSBsdWFMX2FkZHN0cmluZyhidWZmZXIsIEVRQ1JMRik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluY3JlbWVudGFsbHkgY29udmVydHMgYSBzdHJpbmcgdG8gcXVvdGVkLXByaW50YWJsZQorKiBBLCBCID0gcXAoQywgRCwgbWFya2VyKQorKiBNYXJrZXIgaXMgdGhlIHRleHQgdG8gYmUgdXNlZCB0byByZXBsYWNlIENSTEYgc2VxdWVuY2VzIGZvdW5kIGluIEEuCisqIEEgaXMgdGhlIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgbGFyZ2VzdCBwcmVmaXggb2YgQyAuLiBEIHRoYXQgCisqIGNhbiBiZSBlbmNvZGVkIHdpdGhvdXQgZG91YnRzLiAKKyogQiBoYXMgdGhlIHJlbWFpbmluZyBieXRlcyBvZiBDIC4uIEQsICp3aXRob3V0KiBlbmNvZGluZy4KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1pbWVfZ2xvYmFsX3FwKGx1YV9TdGF0ZSAqTCkKK3sKKworICAgIHNpemVfdCBhc2l6ZSA9IDAsIGlzaXplID0gMDsKKyAgICBVQyBhdG9tWzNdOworICAgIGNvbnN0IFVDICppbnB1dCA9IChVQyAqKSBsdWFMX29wdGxzdHJpbmcoTCwgMSwgTlVMTCwgJmlzaXplKTsKKyAgICBjb25zdCBVQyAqbGFzdCA9IGlucHV0ICsgaXNpemU7CisgICAgY29uc3QgY2hhciAqbWFya2VyID0gbHVhTF9vcHRzdHJpbmcoTCwgMywgQ1JMRik7CisgICAgbHVhTF9CdWZmZXIgYnVmZmVyOworICAgIC8qIGVuZC1vZi1pbnB1dCBibGFja2hvbGUgKi8KKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIC8qIHByb2Nlc3MgZmlyc3QgcGFydCBvZiBpbnB1dCAqLworICAgIGx1YUxfYnVmZmluaXQoTCwgJmJ1ZmZlcik7CisgICAgd2hpbGUgKGlucHV0IDwgbGFzdCkKKyAgICAgICAgYXNpemUgPSBxcGVuY29kZSgqaW5wdXQrKywgYXRvbSwgYXNpemUsIG1hcmtlciwgJmJ1ZmZlcik7CisgICAgaW5wdXQgPSAoVUMgKikgbHVhTF9vcHRsc3RyaW5nKEwsIDIsIE5VTEwsICZpc2l6ZSk7CisgICAgLyogaWYgc2Vjb25kIHBhcnQgaXMgbmlsLCB3ZSBhcmUgZG9uZSAqLworICAgIGlmICghaW5wdXQpIHsKKyAgICAgICAgYXNpemUgPSBxcHBhZChhdG9tLCBhc2l6ZSwgJmJ1ZmZlcik7CisgICAgICAgIGx1YUxfcHVzaHJlc3VsdCgmYnVmZmVyKTsKKyAgICAgICAgaWYgKCEoKmx1YV90b3N0cmluZyhMLCAtMSkpKSBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICAvKiBvdGhlcndpc2UgcHJvY2VzcyByZXN0IG9mIGlucHV0ICovCisgICAgbGFzdCA9IGlucHV0ICsgaXNpemU7CisgICAgd2hpbGUgKGlucHV0IDwgbGFzdCkKKyAgICAgICAgYXNpemUgPSBxcGVuY29kZSgqaW5wdXQrKywgYXRvbSwgYXNpemUsIG1hcmtlciwgJmJ1ZmZlcik7CisgICAgbHVhTF9wdXNocmVzdWx0KCZidWZmZXIpOworICAgIGx1YV9wdXNobHN0cmluZyhMLCAoY2hhciAqKSBhdG9tLCBhc2l6ZSk7CisgICAgcmV0dXJuIDI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEFjY3VtdWxhdGUgY2hhcmFjdGVycyB1bnRpbCB3ZSBhcmUgc3VyZSBhYm91dCBob3cgdG8gZGVhbCB3aXRoIHRoZW0uCisqIE9uY2Ugd2UgYXJlIHN1cmUsIG91dHB1dCB0aGUgdG8gdGhlIGJ1ZmZlciwgaW4gdGhlIGNvcnJlY3QgZm9ybS4gCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHNpemVfdCBxcGRlY29kZShVQyBjLCBVQyAqaW5wdXQsIHNpemVfdCBzaXplLCBsdWFMX0J1ZmZlciAqYnVmZmVyKSB7CisgICAgaW50IGQ7CisgICAgaW5wdXRbc2l6ZSsrXSA9IGM7CisgICAgLyogZGVhbCB3aXRoIGFsbCBjaGFyYWN0ZXJzIHdlIGNhbiBkZWFsICovCisgICAgc3dpdGNoIChpbnB1dFswXSkgeworICAgICAgICAvKiBpZiB3ZSBoYXZlIGFuIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgY2FzZSAnPSc6IAorICAgICAgICAgICAgaWYgKHNpemUgPCAzKSByZXR1cm4gc2l6ZTsgCisgICAgICAgICAgICAvKiBlbGltaW5hdGUgc29mdCBsaW5lIGJyZWFrICovCisgICAgICAgICAgICBpZiAoaW5wdXRbMV0gPT0gJ1xyJyAmJiBpbnB1dFsyXSA9PSAnXG4nKSByZXR1cm4gMDsKKyAgICAgICAgICAgIC8qIGRlY29kZSBxdW90ZWQgcmVwcmVzZW50YXRpb24gKi8KKyAgICAgICAgICAgIGMgPSBxcHVuYmFzZVtpbnB1dFsxXV07IGQgPSBxcHVuYmFzZVtpbnB1dFsyXV07CisgICAgICAgICAgICAvKiBpZiBpdCBpcyBhbiBpbnZhbGlkLCBkbyBub3QgZGVjb2RlICovCisgICAgICAgICAgICBpZiAoYyA+IDE1IHx8IGQgPiAxNSkgbHVhTF9hZGRsc3RyaW5nKGJ1ZmZlciwgKGNoYXIgKilpbnB1dCwgMyk7CisgICAgICAgICAgICBlbHNlIGx1YUxfcHV0Y2hhcihidWZmZXIsIChjIDw8IDQpICsgZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgaWYgKHNpemUgPCAyKSByZXR1cm4gc2l6ZTsgCisgICAgICAgICAgICBpZiAoaW5wdXRbMV0gPT0gJ1xuJykgbHVhTF9hZGRsc3RyaW5nKGJ1ZmZlciwgKGNoYXIgKilpbnB1dCwgMik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PSAnXHQnIHx8IChpbnB1dFswXSA+IDMxICYmIGlucHV0WzBdIDwgMTI3KSkKKyAgICAgICAgICAgICAgICBsdWFMX3B1dGNoYXIoYnVmZmVyLCBpbnB1dFswXSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluY3JlbWVudGFsbHkgZGVjb2RlcyBhIHN0cmluZyBpbiBxdW90ZWQtcHJpbnRhYmxlCisqIEEsIEIgPSBxcChDLCBEKQorKiBBIGlzIHRoZSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIGxhcmdlc3QgcHJlZml4IG9mIEMgLi4gRCB0aGF0IAorKiBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IGRvdWJ0cy4gCisqIEIgaGFzIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgQyAuLiBELCAqd2l0aG91dCogZGVjb2RpbmcuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtaW1lX2dsb2JhbF91bnFwKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBzaXplX3QgYXNpemUgPSAwLCBpc2l6ZSA9IDA7CisgICAgVUMgYXRvbVszXTsKKyAgICBjb25zdCBVQyAqaW5wdXQgPSAoVUMgKikgbHVhTF9vcHRsc3RyaW5nKEwsIDEsIE5VTEwsICZpc2l6ZSk7CisgICAgY29uc3QgVUMgKmxhc3QgPSBpbnB1dCArIGlzaXplOworICAgIGx1YUxfQnVmZmVyIGJ1ZmZlcjsKKyAgICAvKiBlbmQtb2YtaW5wdXQgYmxhY2tob2xlICovCisgICAgaWYgKCFpbnB1dCkgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICAvKiBwcm9jZXNzIGZpcnN0IHBhcnQgb2YgaW5wdXQgKi8KKyAgICBsdWFMX2J1ZmZpbml0KEwsICZidWZmZXIpOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpCisgICAgICAgIGFzaXplID0gcXBkZWNvZGUoKmlucHV0KyssIGF0b20sIGFzaXplLCAmYnVmZmVyKTsKKyAgICBpbnB1dCA9IChVQyAqKSBsdWFMX29wdGxzdHJpbmcoTCwgMiwgTlVMTCwgJmlzaXplKTsKKyAgICAvKiBpZiBzZWNvbmQgcGFydCBpcyBuaWwsIHdlIGFyZSBkb25lICovCisgICAgaWYgKCFpbnB1dCkgeworICAgICAgICBsdWFMX3B1c2hyZXN1bHQoJmJ1ZmZlcik7CisgICAgICAgIGlmICghKCpsdWFfdG9zdHJpbmcoTCwgLTEpKSkgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9IAorICAgIC8qIG90aGVyd2lzZSBwcm9jZXNzIHJlc3Qgb2YgaW5wdXQgKi8KKyAgICBsYXN0ID0gaW5wdXQgKyBpc2l6ZTsKKyAgICB3aGlsZSAoaW5wdXQgPCBsYXN0KQorICAgICAgICBhc2l6ZSA9IHFwZGVjb2RlKCppbnB1dCsrLCBhdG9tLCBhc2l6ZSwgJmJ1ZmZlcik7CisgICAgbHVhTF9wdXNocmVzdWx0KCZidWZmZXIpOworICAgIGx1YV9wdXNobHN0cmluZyhMLCAoY2hhciAqKSBhdG9tLCBhc2l6ZSk7CisgICAgcmV0dXJuIDI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluY3JlbWVudGFsbHkgYnJlYWtzIGEgcXVvdGVkLXByaW50ZWQgc3RyaW5nIGludG8gbGluZXMKKyogQSwgbiA9IHFwd3JwKGwsIEIsIGxlbmd0aCkKKyogQSBpcyBhIGNvcHkgb2YgQiwgYnJva2VuIGludG8gbGluZXMgb2YgYXQgbW9zdCAnbGVuZ3RoJyBieXRlcy4gCisqICdsJyBpcyBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBmb3IgdGhlIGZpcnN0IGxpbmUgb2YgQi4gCisqICduJyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4gdGhlIGxhc3QgbGluZSBvZiBBLiAKKyogVGhlcmUgYXJlIHR3byBjb21wbGljYXRpb25zOiBsaW5lcyBjYW4ndCBiZSBicm9rZW4gaW4gdGhlIG1pZGRsZQorKiBvZiBhbiBlbmNvZGVkID1YWCwgYW5kIHRoZXJlIG1pZ2h0IGJlIGxpbmUgYnJlYWtzIGFscmVhZHkKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1pbWVfZ2xvYmFsX3Fwd3JwKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaW50IGxlZnQgPSAoaW50KSBsdWFMX2NoZWNrbnVtYmVyKEwsIDEpOworICAgIGNvbnN0IFVDICppbnB1dCA9IChVQyAqKSBsdWFMX29wdGxzdHJpbmcoTCwgMiwgTlVMTCwgJnNpemUpOworICAgIGNvbnN0IFVDICpsYXN0ID0gaW5wdXQgKyBzaXplOworICAgIGludCBsZW5ndGggPSAoaW50KSBsdWFMX29wdG51bWJlcihMLCAzLCA3Nik7CisgICAgbHVhTF9CdWZmZXIgYnVmZmVyOworICAgIC8qIGVuZC1vZi1pbnB1dCBibGFja2hvbGUgKi8KKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIGlmIChsZWZ0IDwgbGVuZ3RoKSBsdWFfcHVzaHN0cmluZyhMLCBFUUNSTEYpOworICAgICAgICBlbHNlIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgLyogcHJvY2VzcyBhbGwgaW5wdXQgKi8KKyAgICBsdWFMX2J1ZmZpbml0KEwsICZidWZmZXIpOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpIHsKKyAgICAgICAgc3dpdGNoICgqaW5wdXQpIHsKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIGx1YUxfYWRkc3RyaW5nKCZidWZmZXIsIENSTEYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgaWYgKGxlZnQgPD0gMykgeworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBsdWFMX2FkZHN0cmluZygmYnVmZmVyLCBFUUNSTEYpOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgbHVhTF9wdXRjaGFyKCZidWZmZXIsICppbnB1dCk7CisgICAgICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogCisgICAgICAgICAgICAgICAgaWYgKGxlZnQgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBsdWFMX2FkZHN0cmluZygmYnVmZmVyLCBFUUNSTEYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsdWFMX3B1dGNoYXIoJmJ1ZmZlciwgKmlucHV0KTsKKyAgICAgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXQrKzsKKyAgICB9CisgICAgbHVhTF9wdXNocmVzdWx0KCZidWZmZXIpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIGxlZnQpOworICAgIHJldHVybiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBIZXJlIGlzIHdoYXQgd2UgZG86IFxuLCBhbmQgXHIgYXJlIGNvbnNpZGVyZWQgY2FuZGlkYXRlcyBmb3IgbGluZQorKiBicmVhay4gV2UgaXNzdWUgKm9uZSogbmV3IGxpbmUgbWFya2VyIGlmIGFueSBvZiB0aGVtIGlzIHNlZW4gYWxvbmUsIG9yCisqIGZvbGxvd2VkIGJ5IGEgZGlmZmVyZW50IG9uZS4gVGhhdCBpcywgXG5cbiBhbmQgXHJcciB3aWxsIGlzc3VlIHR3bworKiBlbmQgb2YgbGluZSBtYXJrZXJzIGVhY2gsIGJ1dCBcclxuLCBcblxyIGV0YyB3aWxsIG9ubHkgaXNzdWUgKm9uZSoKKyogbWFya2VyLiAgVGhpcyBjb3ZlcnMgTWFjIE9TLCBNYWMgT1MgWCwgVk1TLCBVbml4IGFuZCBET1MsIGFzIHdlbGwgYXMKKyogcHJvYmFibHkgb3RoZXIgbW9yZSBvYnNjdXJlIGNvbnZlbnRpb25zLgorKgorKiBjIGlzIHRoZSBjdXJyZW50IGNoYXJhY3RlciBiZWluZyBwcm9jZXNzZWQKKyogbGFzdCBpcyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBlb2xjYW5kaWRhdGUoYykgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCitzdGF0aWMgaW50IGVvbHByb2Nlc3MoaW50IGMsIGludCBsYXN0LCBjb25zdCBjaGFyICptYXJrZXIsIAorICAgICAgICBsdWFMX0J1ZmZlciAqYnVmZmVyKQoreworICAgIGlmIChlb2xjYW5kaWRhdGUoYykpIHsKKyAgICAgICAgaWYgKGVvbGNhbmRpZGF0ZShsYXN0KSkgeworICAgICAgICAgICAgaWYgKGMgPT0gbGFzdCkgbHVhTF9hZGRzdHJpbmcoYnVmZmVyLCBtYXJrZXIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsdWFMX2FkZHN0cmluZyhidWZmZXIsIG1hcmtlcik7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGx1YUxfcHV0Y2hhcihidWZmZXIsIGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIENvbnZlcnRzIGEgc3RyaW5nIHRvIHVuaWZvcm0gRU9MIGNvbnZlbnRpb24uIAorKiBBLCBuID0gZW9sKG8sIEIsIG1hcmtlcikKKyogQSBpcyB0aGUgY29udmVydGVkIHZlcnNpb24gb2YgdGhlIGxhcmdlc3QgcHJlZml4IG9mIEIgdGhhdCBjYW4gYmUKKyogY29udmVydGVkIHVuYW1iaWd1b3VzbHkuICdvJyBpcyB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgCisqIGNhbGwuICduJyBpcyB0aGUgbmV3IGNvbnRleHQuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtaW1lX2dsb2JhbF9lb2wobHVhX1N0YXRlICpMKQoreworICAgIGludCBjdHggPSBsdWFMX2NoZWNraW50KEwsIDEpOworICAgIHNpemVfdCBpc2l6ZSA9IDA7CisgICAgY29uc3QgY2hhciAqaW5wdXQgPSBsdWFMX29wdGxzdHJpbmcoTCwgMiwgTlVMTCwgJmlzaXplKTsKKyAgICBjb25zdCBjaGFyICpsYXN0ID0gaW5wdXQgKyBpc2l6ZTsKKyAgICBjb25zdCBjaGFyICptYXJrZXIgPSBsdWFMX29wdHN0cmluZyhMLCAzLCBDUkxGKTsKKyAgICBsdWFMX0J1ZmZlciBidWZmZXI7CisgICAgbHVhTF9idWZmaW5pdChMLCAmYnVmZmVyKTsKKyAgICAvKiBlbmQgb2YgaW5wdXQgYmxhY2tob2xlICovCisgICAgaWYgKCFpbnB1dCkgeworICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgIGx1YV9wdXNobnVtYmVyKEwsIDApOworICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICAvKiBwcm9jZXNzIGFsbCBpbnB1dCAqLworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpCisgICAgICAgIGN0eCA9IGVvbHByb2Nlc3MoKmlucHV0KyssIGN0eCwgbWFya2VyLCAmYnVmZmVyKTsKKyAgICBsdWFMX3B1c2hyZXN1bHQoJmJ1ZmZlcik7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgY3R4KTsKKyAgICByZXR1cm4gMjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogVGFrZXMgb25lIGJ5dGUgYW5kIHN0dWZmIGl0IGlmIG5lZWRlZC4gCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHNpemVfdCBkb3QoaW50IGMsIHNpemVfdCBzdGF0ZSwgbHVhTF9CdWZmZXIgKmJ1ZmZlcikKK3sKKyAgICBsdWFMX3B1dGNoYXIoYnVmZmVyLCBjKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnXHInOiAKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlICdcbic6IAorICAgICAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSAxKT8gMjogMDsgCisgICAgICAgIGNhc2UgJy4nOiAgCisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMikgCisgICAgICAgICAgICAgICAgbHVhTF9wdXRjaGFyKGJ1ZmZlciwgJy4nKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5jcmVtZW50YWxseSBhcHBsaWVzIHNtdHAgc3R1ZmZpbmcgdG8gYSBzdHJpbmcKKyogQSwgbiA9IGRvdChsLCBEKQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWltZV9nbG9iYWxfZG90KGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBzaXplX3QgaXNpemUgPSAwLCBzdGF0ZSA9IChzaXplX3QpIGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgICAgY29uc3QgY2hhciAqaW5wdXQgPSBsdWFMX29wdGxzdHJpbmcoTCwgMiwgTlVMTCwgJmlzaXplKTsKKyAgICBjb25zdCBjaGFyICpsYXN0ID0gaW5wdXQgKyBpc2l6ZTsKKyAgICBsdWFMX0J1ZmZlciBidWZmZXI7CisgICAgLyogZW5kLW9mLWlucHV0IGJsYWNraG9sZSAqLworICAgIGlmICghaW5wdXQpIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNobnVtYmVyKEwsIDIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgLyogcHJvY2VzcyBhbGwgaW5wdXQgKi8KKyAgICBsdWFMX2J1ZmZpbml0KEwsICZidWZmZXIpOworICAgIHdoaWxlIChpbnB1dCA8IGxhc3QpIAorICAgICAgICBzdGF0ZSA9IGRvdCgqaW5wdXQrKywgc3RhdGUsICZidWZmZXIpOworICAgIGx1YUxfcHVzaHJlc3VsdCgmYnVmZmVyKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCBzdGF0ZSk7CisgICAgcmV0dXJuIDI7Cit9CisKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvbWltZS5oIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9taW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlZTJhMwotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvbWltZS5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgTUlNRV9IIAorI2RlZmluZSBNSU1FX0ggCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBDb3JlIE1JTUUgc3VwcG9ydAorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IHRyYW5zZmVyIGNvbnRlbnQgZW5jb2RpbmdzCisqIGFuZCBmb3JtYXR0aW5nIGNvbmZvcm1pbmcgdG8gUkZDIDIwNDUuIEl0IGlzIHVzZWQgYnkgbWltZS5sdWEsIHdoaWNoCisqIHByb3ZpZGUgYSBoaWdoZXIgbGV2ZWwgaW50ZXJmYWNlIHRvIHRoaXMgZnVuY3Rpb25hbGl0eS4gCisqCisqIFJDUyBJRDogJElkOiBtaW1lLmgsdiAxLjE1IDIwMDcvMDYvMTEgMjM6NDQ6NTQgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSAibHVhLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEN1cnJlbnQgTUlNRSBsaWJyYXJ5IHZlcnNpb24KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1JTUVfVkVSU0lPTiAgICAiTUlNRSAxLjAuMiIKKyNkZWZpbmUgTUlNRV9DT1BZUklHSFQgICJDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBEaWVnbyBOZWhhYiIKKyNkZWZpbmUgTUlNRV9BVVRIT1JTICAgICJEaWVnbyBOZWhhYiIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogVGhpcyBtYWNybyBwcmVmaXhlcyBhbGwgZXhwb3J0ZWQgQVBJIGZ1bmN0aW9ucworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgTUlNRV9BUEkKKyNkZWZpbmUgTUlNRV9BUEkgZXh0ZXJuCisjZW5kaWYKKworTUlNRV9BUEkgaW50IGx1YW9wZW5fbWltZV9jb3JlKGx1YV9TdGF0ZSAqTCk7CisKKyNlbmRpZiAvKiBNSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvbWltZS5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL21pbWUubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWVkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL21pbWUubHVhCkBAIC0wLDAgKzEsODcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBNSU1FIHN1cHBvcnQgZm9yIHRoZSBMdWEgbGFuZ3VhZ2UuCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBDb25mb3JtaW5nIHRvIFJGQ3MgMjA0NS0yMDQ5CistLSBSQ1MgSUQ6ICRJZDogbWltZS5sdWEsdiAxLjI5IDIwMDcvMDYvMTEgMjM6NDQ6NTQgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBEZWNsYXJlIG1vZHVsZSBhbmQgaW1wb3J0IGRlcGVuZGVuY2llcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGJhc2UgPSBfRworbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCitsb2NhbCBtaW1lID0gcmVxdWlyZSgibWltZS5jb3JlIikKK2xvY2FsIGlvID0gcmVxdWlyZSgiaW8iKQorbG9jYWwgc3RyaW5nID0gcmVxdWlyZSgic3RyaW5nIikKK21vZHVsZSgibWltZSIpCisKKy0tIGVuY29kZSwgZGVjb2RlIGFuZCB3cmFwIGFsZ29yaXRobSB0YWJsZXMKK2VuY29kZXQgPSB7fQorZGVjb2RldCA9IHt9Cit3cmFwdCA9IHt9CisKKy0tIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNob29zZXMgYSBmaWx0ZXIgYnkgbmFtZSBmcm9tIGEgZ2l2ZW4gdGFibGUKK2xvY2FsIGZ1bmN0aW9uIGNob29zZSh0YWJsZSkKKyAgICByZXR1cm4gZnVuY3Rpb24obmFtZSwgb3B0MSwgb3B0MikKKyAgICAgICAgaWYgYmFzZS50eXBlKG5hbWUpIH49ICJzdHJpbmciIHRoZW4KKyAgICAgICAgICAgIG5hbWUsIG9wdDEsIG9wdDIgPSAiZGVmYXVsdCIsIG5hbWUsIG9wdDEKKyAgICAgICAgZW5kCisgICAgICAgIGxvY2FsIGYgPSB0YWJsZVtuYW1lIG9yICJuaWwiXQorICAgICAgICBpZiBub3QgZiB0aGVuIAorICAgICAgICAgICAgYmFzZS5lcnJvcigidW5rbm93biBrZXkgKCIgLi4gYmFzZS50b3N0cmluZyhuYW1lKSAuLiAiKSIsIDMpCisgICAgICAgIGVsc2UgcmV0dXJuIGYob3B0MSwgb3B0MikgZW5kCisgICAgZW5kCitlbmQKKworLS0gZGVmaW5lIHRoZSBlbmNvZGluZyBmaWx0ZXJzCitlbmNvZGV0WydiYXNlNjQnXSA9IGZ1bmN0aW9uKCkKKyAgICByZXR1cm4gbHRuMTIuZmlsdGVyLmN5Y2xlKGI2NCwgIiIpCitlbmQKKworZW5jb2RldFsncXVvdGVkLXByaW50YWJsZSddID0gZnVuY3Rpb24obW9kZSkKKyAgICByZXR1cm4gbHRuMTIuZmlsdGVyLmN5Y2xlKHFwLCAiIiwKKyAgICAgICAgKG1vZGUgPT0gImJpbmFyeSIpIGFuZCAiPTBEPTBBIiBvciAiXHJcbiIpCitlbmQKKworLS0gZGVmaW5lIHRoZSBkZWNvZGluZyBmaWx0ZXJzCitkZWNvZGV0WydiYXNlNjQnXSA9IGZ1bmN0aW9uKCkKKyAgICByZXR1cm4gbHRuMTIuZmlsdGVyLmN5Y2xlKHVuYjY0LCAiIikKK2VuZAorCitkZWNvZGV0WydxdW90ZWQtcHJpbnRhYmxlJ10gPSBmdW5jdGlvbigpCisgICAgcmV0dXJuIGx0bjEyLmZpbHRlci5jeWNsZSh1bnFwLCAiIikKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBmb3JtYXQoY2h1bmspCisgICAgaWYgY2h1bmsgdGhlbgorICAgICAgICBpZiBjaHVuayA9PSAiIiB0aGVuIHJldHVybiAiJyciCisgICAgICAgIGVsc2UgcmV0dXJuIHN0cmluZy5sZW4oY2h1bmspIGVuZAorICAgIGVsc2UgcmV0dXJuICJuaWwiIGVuZAorZW5kCisKKy0tIGRlZmluZSB0aGUgbGluZS13cmFwIGZpbHRlcnMKK3dyYXB0Wyd0ZXh0J10gPSBmdW5jdGlvbihsZW5ndGgpCisgICAgbGVuZ3RoID0gbGVuZ3RoIG9yIDc2CisgICAgcmV0dXJuIGx0bjEyLmZpbHRlci5jeWNsZSh3cnAsIGxlbmd0aCwgbGVuZ3RoKQorZW5kCit3cmFwdFsnYmFzZTY0J10gPSB3cmFwdFsndGV4dCddCit3cmFwdFsnZGVmYXVsdCddID0gd3JhcHRbJ3RleHQnXQorCit3cmFwdFsncXVvdGVkLXByaW50YWJsZSddID0gZnVuY3Rpb24oKQorICAgIHJldHVybiBsdG4xMi5maWx0ZXIuY3ljbGUocXB3cnAsIDc2LCA3NikKK2VuZAorCistLSBmdW5jdGlvbiB0aGF0IGNob29zZSB0aGUgZW5jb2RpbmcsIGRlY29kaW5nIG9yIHdyYXAgYWxnb3JpdGhtCitlbmNvZGUgPSBjaG9vc2UoZW5jb2RldCkKK2RlY29kZSA9IGNob29zZShkZWNvZGV0KQord3JhcCA9IGNob29zZSh3cmFwdCkKKworLS0gZGVmaW5lIHRoZSBlbmQtb2YtbGluZSBub3JtYWxpemF0aW9uIGZpbHRlcgorZnVuY3Rpb24gbm9ybWFsaXplKG1hcmtlcikKKyAgICByZXR1cm4gbHRuMTIuZmlsdGVyLmN5Y2xlKGVvbCwgMCwgbWFya2VyKQorZW5kCisKKy0tIGhpZ2ggbGV2ZWwgc3R1ZmZpbmcgZmlsdGVyCitmdW5jdGlvbiBzdHVmZigpCisgICAgcmV0dXJuIGx0bjEyLmZpbHRlci5jeWNsZShkb3QsIDIpCitlbmQKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvb3B0aW9ucy5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhM2M1MQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvb3B0aW9ucy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBDb21tb24gb3B0aW9uIGludGVyZmFjZSAKKyogTHVhU29ja2V0IHRvb2xraXQKKyoKKyogUkNTIElEOiAkSWQ6IG9wdGlvbnMuYyx2IDEuNiAyMDA1LzExLzIwIDA3OjIwOjIzIGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPHN0cmluZy5oPiAKKworI2luY2x1ZGUgImxhdXhsaWIuaCIKKworI2luY2x1ZGUgImF1eGlsaWFyLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgImluZXQuaCIKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBJbnRlcm5hbCBmdW5jdGlvbnMgcHJvdG90eXBlcworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgb3B0X3NldG1lbWJlcnNoaXAobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcywgaW50IGxldmVsLCBpbnQgbmFtZSk7CitzdGF0aWMgaW50IG9wdF9zZXRib29sZWFuKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMsIGludCBsZXZlbCwgaW50IG5hbWUpOworc3RhdGljIGludCBvcHRfc2V0KGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMsIGludCBsZXZlbCwgaW50IG5hbWUsIAorICAgICAgICB2b2lkICp2YWwsIGludCBsZW4pOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBFeHBvcnRlZCBmdW5jdGlvbnMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDYWxscyBhcHByb3ByaWF0ZSBvcHRpb24gaGFuZGxlcgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBvcHRfbWV0aF9zZXRvcHRpb24obHVhX1N0YXRlICpMLCBwX29wdCBvcHQsIHBfc29ja2V0IHBzKQoreworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOyAgICAgIC8qIG9iaiwgbmFtZSwgLi4uICovCisgICAgd2hpbGUgKG9wdC0+bmFtZSAmJiBzdHJjbXAobmFtZSwgb3B0LT5uYW1lKSkKKyAgICAgICAgb3B0Kys7CisgICAgaWYgKCFvcHQtPmZ1bmMpIHsKKyAgICAgICAgY2hhciBtc2dbNDVdOworICAgICAgICBzcHJpbnRmKG1zZywgInVuc3VwcG9ydGVkIG9wdGlvbiBgJS4zNXMnIiwgbmFtZSk7CisgICAgICAgIGx1YUxfYXJnZXJyb3IoTCwgMiwgbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIG9wdC0+ZnVuYyhMLCBwcyk7Cit9CisKKy8qIGVuYWJsZXMgcmV1c2Ugb2YgbG9jYWwgYWRkcmVzcyAqLworaW50IG9wdF9yZXVzZWFkZHIobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcykKK3sKKyAgICByZXR1cm4gb3B0X3NldGJvb2xlYW4oTCwgcHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUik7IAorfQorCisvKiBkaXNhYmxlcyB0aGUgTmFnZ2xlIGFsZ29yaXRobSAqLworaW50IG9wdF90Y3Bfbm9kZWxheShsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzKQoreworICAgIHJldHVybiBvcHRfc2V0Ym9vbGVhbihMLCBwcywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZKTsgCit9CisKK2ludCBvcHRfa2VlcGFsaXZlKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgcmV0dXJuIG9wdF9zZXRib29sZWFuKEwsIHBzLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUpOyAKK30KKworaW50IG9wdF9kb250cm91dGUobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcykKK3sKKyAgICByZXR1cm4gb3B0X3NldGJvb2xlYW4oTCwgcHMsIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSk7Cit9CisKK2ludCBvcHRfYnJvYWRjYXN0KGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgcmV0dXJuIG9wdF9zZXRib29sZWFuKEwsIHBzLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QpOworfQorCitpbnQgb3B0X2lwX211bHRpY2FzdF9sb29wKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgcmV0dXJuIG9wdF9zZXRib29sZWFuKEwsIHBzLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfTE9PUCk7Cit9CisKK2ludCBvcHRfbGluZ2VyKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgc3RydWN0IGxpbmdlciBsaTsgICAgICAgICAgICAgICAgICAgICAgLyogb2JqLCBuYW1lLCB0YWJsZSAqLworICAgIGlmICghbHVhX2lzdGFibGUoTCwgMykpIGx1YUxfdHlwZXJyb3IoTCwgMywgbHVhX3R5cGVuYW1lKEwsIExVQV9UVEFCTEUpKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAib24iKTsKKyAgICBsdWFfZ2V0dGFibGUoTCwgMyk7CisgICAgaWYgKCFsdWFfaXNib29sZWFuKEwsIC0xKSkgCisgICAgICAgIGx1YUxfYXJnZXJyb3IoTCwgMywgImJvb2xlYW4gJ29uJyBmaWVsZCBleHBlY3RlZCIpOworICAgIGxpLmxfb25vZmYgPSAodV9zaG9ydCkgbHVhX3RvYm9vbGVhbihMLCAtMSk7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgInRpbWVvdXQiKTsKKyAgICBsdWFfZ2V0dGFibGUoTCwgMyk7CisgICAgaWYgKCFsdWFfaXNudW1iZXIoTCwgLTEpKSAKKyAgICAgICAgbHVhTF9hcmdlcnJvcihMLCAzLCAibnVtYmVyICd0aW1lb3V0JyBmaWVsZCBleHBlY3RlZCIpOworICAgIGxpLmxfbGluZ2VyID0gKHVfc2hvcnQpIGx1YV90b251bWJlcihMLCAtMSk7CisgICAgcmV0dXJuIG9wdF9zZXQoTCwgcHMsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIgKikgJmxpLCBzaXplb2YobGkpKTsKK30KKworaW50IG9wdF9pcF9tdWx0aWNhc3RfdHRsKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgaW50IHZhbCA9IChpbnQpIGx1YUxfY2hlY2tudW1iZXIoTCwgMyk7ICAgIC8qIG9iaiwgbmFtZSwgaW50ICovCisgICAgcmV0dXJuIG9wdF9zZXQoTCwgcHMsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIgKikgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCitpbnQgb3B0X2lwX2FkZF9tZW1iZXJzaGlwKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpCit7CisgICAgcmV0dXJuIG9wdF9zZXRtZW1iZXJzaGlwKEwsIHBzLCBJUFBST1RPX0lQLCBJUF9BRERfTUVNQkVSU0hJUCk7Cit9CisKK2ludCBvcHRfaXBfZHJvcF9tZW1iZXJzaXAobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcykKK3sKKyAgICByZXR1cm4gb3B0X3NldG1lbWJlcnNoaXAoTCwgcHMsIElQUFJPVE9fSVAsIElQX0RST1BfTUVNQkVSU0hJUCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEF1eGlsaWFyIGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgb3B0X3NldG1lbWJlcnNoaXAobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcywgaW50IGxldmVsLCBpbnQgbmFtZSkKK3sKKyAgICBzdHJ1Y3QgaXBfbXJlcSB2YWw7ICAgICAgICAgICAgICAgICAgIC8qIG9iaiwgbmFtZSwgdGFibGUgKi8KKyAgICBpZiAoIWx1YV9pc3RhYmxlKEwsIDMpKSBsdWFMX3R5cGVycm9yKEwsIDMsIGx1YV90eXBlbmFtZShMLCBMVUFfVFRBQkxFKSk7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgIm11bHRpYWRkciIpOworICAgIGx1YV9nZXR0YWJsZShMLCAzKTsKKyAgICBpZiAoIWx1YV9pc3N0cmluZyhMLCAtMSkpIAorICAgICAgICBsdWFMX2FyZ2Vycm9yKEwsIDMsICJzdHJpbmcgJ211bHRpYWRkcicgZmllbGQgZXhwZWN0ZWQiKTsKKyAgICBpZiAoIWluZXRfYXRvbihsdWFfdG9zdHJpbmcoTCwgLTEpLCAmdmFsLmltcl9tdWx0aWFkZHIpKSAKKyAgICAgICAgbHVhTF9hcmdlcnJvcihMLCAzLCAiaW52YWxpZCAnbXVsdGlhZGRyJyBpcCBhZGRyZXNzIik7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgImludGVyZmFjZSIpOworICAgIGx1YV9nZXR0YWJsZShMLCAzKTsKKyAgICBpZiAoIWx1YV9pc3N0cmluZyhMLCAtMSkpIAorICAgICAgICBsdWFMX2FyZ2Vycm9yKEwsIDMsICJzdHJpbmcgJ2ludGVyZmFjZScgZmllbGQgZXhwZWN0ZWQiKTsKKyAgICB2YWwuaW1yX2ludGVyZmFjZS5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKyAgICBpZiAoc3RyY21wKGx1YV90b3N0cmluZyhMLCAtMSksICIqIikgJiYKKyAgICAgICAgICAgICFpbmV0X2F0b24obHVhX3Rvc3RyaW5nKEwsIC0xKSwgJnZhbC5pbXJfaW50ZXJmYWNlKSkgCisgICAgICAgIGx1YUxfYXJnZXJyb3IoTCwgMywgImludmFsaWQgJ2ludGVyZmFjZScgaXAgYWRkcmVzcyIpOworICAgIHJldHVybiBvcHRfc2V0KEwsIHBzLCBsZXZlbCwgbmFtZSwgKGNoYXIgKikgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCitzdGF0aWMgCitpbnQgb3B0X3NldChsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzLCBpbnQgbGV2ZWwsIGludCBuYW1lLCB2b2lkICp2YWwsIGludCBsZW4pCit7CisgICAgaWYgKHNldHNvY2tvcHQoKnBzLCBsZXZlbCwgbmFtZSwgKGNoYXIgKikgdmFsLCBsZW4pIDwgMCkgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgInNldHNvY2tvcHQgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBvcHRfc2V0Ym9vbGVhbihsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzLCBpbnQgbGV2ZWwsIGludCBuYW1lKQoreworICAgIGludCB2YWwgPSBhdXhpbGlhcl9jaGVja2Jvb2xlYW4oTCwgMyk7ICAgICAgICAgICAgIC8qIG9iaiwgbmFtZSwgYm9vbCAqLworICAgIHJldHVybiBvcHRfc2V0KEwsIHBzLCBsZXZlbCwgbmFtZSwgKGNoYXIgKikgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL29wdGlvbnMuaCBiL2x1YXNvY2tldC0yLjAuMi9zcmMvb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL29wdGlvbnMuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIE9QVElPTlNfSAorI2RlZmluZSBPUFRJT05TX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIENvbW1vbiBvcHRpb24gaW50ZXJmYWNlIAorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgdG8gc29ja2V0IG9wdGlvbnMsIHVzZWQgbWFpbmx5IGJ5CisqIG1vZHVsZXMgVURQIGFuZCBUQ1AuIAorKgorKiBSQ1MgSUQ6ICRJZDogb3B0aW9ucy5oLHYgMS40IDIwMDUvMTAvMDcgMDQ6NDA6NTkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKworLyogb3B0aW9uIHJlZ2lzdHJ5ICovCit0eXBlZGVmIHN0cnVjdCB0X29wdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCAoKmZ1bmMpKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpOworfSB0X29wdDsKK3R5cGVkZWYgdF9vcHQgKnBfb3B0OworCisvKiBzdXBwb3J0ZWQgb3B0aW9ucyAqLworaW50IG9wdF9kb250cm91dGUobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcyk7CitpbnQgb3B0X2Jyb2FkY2FzdChsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzKTsKK2ludCBvcHRfcmV1c2VhZGRyKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpOworaW50IG9wdF90Y3Bfbm9kZWxheShsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzKTsKK2ludCBvcHRfa2VlcGFsaXZlKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpOworaW50IG9wdF9saW5nZXIobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcyk7CitpbnQgb3B0X3JldXNlYWRkcihsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzKTsKK2ludCBvcHRfaXBfbXVsdGljYXN0X3R0bChsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzKTsKK2ludCBvcHRfaXBfbXVsdGljYXN0X2xvb3AobHVhX1N0YXRlICpMLCBwX3NvY2tldCBwcyk7CitpbnQgb3B0X2lwX2FkZF9tZW1iZXJzaGlwKGx1YV9TdGF0ZSAqTCwgcF9zb2NrZXQgcHMpOworaW50IG9wdF9pcF9kcm9wX21lbWJlcnNpcChsdWFfU3RhdGUgKkwsIHBfc29ja2V0IHBzKTsKKworLyogaW52b2tlcyB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uIGhhbmRsZXIgKi8KK2ludCBvcHRfbWV0aF9zZXRvcHRpb24obHVhX1N0YXRlICpMLCBwX29wdCBvcHQsIHBfc29ja2V0IHBzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL3NlbGVjdC5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9zZWxlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzBmNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9zZWxlY3QuYwpAQCAtMCwwICsxLDIwMCBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogU2VsZWN0IGltcGxlbWVudGF0aW9uCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFJDUyBJRDogJElkOiBzZWxlY3QuYyx2IDEuMjIgMjAwNS8xMS8yMCAwNzoyMDoyMyBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKworI2luY2x1ZGUgInNvY2tldC5oIgorI2luY2x1ZGUgInRpbWVvdXQuaCIKKyNpbmNsdWRlICJzZWxlY3QuaCIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcy4KK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdF9zb2NrZXQgZ2V0ZmQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgZGlydHkobHVhX1N0YXRlICpMKTsKK3N0YXRpYyB0X3NvY2tldCBjb2xsZWN0X2ZkKGx1YV9TdGF0ZSAqTCwgaW50IHRhYiwgdF9zb2NrZXQgbWF4X2ZkLCAKKyAgICAgICAgaW50IGl0YWIsIGZkX3NldCAqc2V0KTsKK3N0YXRpYyBpbnQgY2hlY2tfZGlydHkobHVhX1N0YXRlICpMLCBpbnQgdGFiLCBpbnQgZHRhYiwgZmRfc2V0ICpzZXQpOworc3RhdGljIHZvaWQgcmV0dXJuX2ZkKGx1YV9TdGF0ZSAqTCwgZmRfc2V0ICpzZXQsIHRfc29ja2V0IG1heF9mZCwgCisgICAgICAgIGludCBpdGFiLCBpbnQgdGFiLCBpbnQgc3RhcnQpOworc3RhdGljIHZvaWQgbWFrZV9hc3NvYyhsdWFfU3RhdGUgKkwsIGludCB0YWIpOworc3RhdGljIGludCBnbG9iYWxfc2VsZWN0KGx1YV9TdGF0ZSAqTCk7CisKKy8qIGZ1bmN0aW9ucyBpbiBsaWJyYXJ5IG5hbWVzcGFjZSAqLworc3RhdGljIGx1YUxfcmVnIGZ1bmNbXSA9IHsKKyAgICB7InNlbGVjdCIsIGdsb2JhbF9zZWxlY3R9LAorICAgIHtOVUxMLCAgICAgTlVMTH0KK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEV4cG9ydGVkIGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluaXRpYWxpemVzIG1vZHVsZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzZWxlY3Rfb3BlbihsdWFfU3RhdGUgKkwpIHsKKyAgICBsdWFMX29wZW5saWIoTCwgTlVMTCwgZnVuYywgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEdsb2JhbCBMdWEgZnVuY3Rpb25zCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogV2FpdHMgZm9yIGEgc2V0IG9mIHNvY2tldHMgdW50aWwgYSBjb25kaXRpb24gaXMgbWV0IG9yIHRpbWVvdXQuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBnbG9iYWxfc2VsZWN0KGx1YV9TdGF0ZSAqTCkgeworICAgIGludCBydGFiLCB3dGFiLCBpdGFiLCByZXQsIG5kaXJ0eTsKKyAgICB0X3NvY2tldCBtYXhfZmQ7CisgICAgZmRfc2V0IHJzZXQsIHdzZXQ7CisgICAgdF90aW1lb3V0IHRtOworICAgIGRvdWJsZSB0ID0gbHVhTF9vcHRudW1iZXIoTCwgMywgLTEpOworICAgIEZEX1pFUk8oJnJzZXQpOyBGRF9aRVJPKCZ3c2V0KTsKKyAgICBsdWFfc2V0dG9wKEwsIDMpOworICAgIGx1YV9uZXd0YWJsZShMKTsgaXRhYiA9IGx1YV9nZXR0b3AoTCk7CisgICAgbHVhX25ld3RhYmxlKEwpOyBydGFiID0gbHVhX2dldHRvcChMKTsKKyAgICBsdWFfbmV3dGFibGUoTCk7IHd0YWIgPSBsdWFfZ2V0dG9wKEwpOworICAgIG1heF9mZCA9IGNvbGxlY3RfZmQoTCwgMSwgU09DS0VUX0lOVkFMSUQsIGl0YWIsICZyc2V0KTsKKyAgICBuZGlydHkgPSBjaGVja19kaXJ0eShMLCAxLCBydGFiLCAmcnNldCk7CisgICAgdCA9IG5kaXJ0eSA+IDA/IDAuMDogdDsKKyAgICB0aW1lb3V0X2luaXQoJnRtLCB0LCAtMSk7CisgICAgdGltZW91dF9tYXJrc3RhcnQoJnRtKTsKKyAgICBtYXhfZmQgPSBjb2xsZWN0X2ZkKEwsIDIsIG1heF9mZCwgaXRhYiwgJndzZXQpOworICAgIHJldCA9IHNvY2tldF9zZWxlY3QobWF4X2ZkKzEsICZyc2V0LCAmd3NldCwgTlVMTCwgJnRtKTsKKyAgICBpZiAocmV0ID4gMCB8fCBuZGlydHkgPiAwKSB7CisgICAgICAgIHJldHVybl9mZChMLCAmcnNldCwgbWF4X2ZkKzEsIGl0YWIsIHJ0YWIsIG5kaXJ0eSk7CisgICAgICAgIHJldHVybl9mZChMLCAmd3NldCwgbWF4X2ZkKzEsIGl0YWIsIHd0YWIsIDApOworICAgICAgICBtYWtlX2Fzc29jKEwsIHJ0YWIpOworICAgICAgICBtYWtlX2Fzc29jKEwsIHd0YWIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJ0aW1lb3V0Iik7CisgICAgICAgIHJldHVybiAzOworICAgIH0gZWxzZSB7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJlcnJvciIpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEludGVybmFsIGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB0X3NvY2tldCBnZXRmZChsdWFfU3RhdGUgKkwpIHsKKyAgICB0X3NvY2tldCBmZCA9IFNPQ0tFVF9JTlZBTElEOworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJnZXRmZCIpOworICAgIGx1YV9nZXR0YWJsZShMLCAtMik7CisgICAgaWYgKCFsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgICAgIGx1YV9wdXNodmFsdWUoTCwgLTIpOworICAgICAgICBsdWFfY2FsbChMLCAxLCAxKTsKKyAgICAgICAgaWYgKGx1YV9pc251bWJlcihMLCAtMSkpIAorICAgICAgICAgICAgZmQgPSAodF9zb2NrZXQpIGx1YV90b251bWJlcihMLCAtMSk7IAorICAgIH0gCisgICAgbHVhX3BvcChMLCAxKTsKKyAgICByZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbnQgZGlydHkobHVhX1N0YXRlICpMKSB7CisgICAgaW50IGlzID0gMDsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiZGlydHkiKTsKKyAgICBsdWFfZ2V0dGFibGUoTCwgLTIpOworICAgIGlmICghbHVhX2lzbmlsKEwsIC0xKSkgeworICAgICAgICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsKKyAgICAgICAgbHVhX2NhbGwoTCwgMSwgMSk7CisgICAgICAgIGlzID0gbHVhX3RvYm9vbGVhbihMLCAtMSk7CisgICAgfSAKKyAgICBsdWFfcG9wKEwsIDEpOworICAgIHJldHVybiBpczsKK30KKworc3RhdGljIHRfc29ja2V0IGNvbGxlY3RfZmQobHVhX1N0YXRlICpMLCBpbnQgdGFiLCB0X3NvY2tldCBtYXhfZmQsIAorICAgICAgICBpbnQgaXRhYiwgZmRfc2V0ICpzZXQpIHsKKyAgICBpbnQgaSA9IDE7CisgICAgaWYgKGx1YV9pc25pbChMLCB0YWIpKSAKKyAgICAgICAgcmV0dXJuIG1heF9mZDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB0X3NvY2tldCBmZDsKKyAgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgaSk7CisgICAgICAgIGx1YV9nZXR0YWJsZShMLCB0YWIpOworICAgICAgICBpZiAobHVhX2lzbmlsKEwsIC0xKSkgeworICAgICAgICAgICAgbHVhX3BvcChMLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZkID0gZ2V0ZmQoTCk7CisgICAgICAgIGlmIChmZCAhPSBTT0NLRVRfSU5WQUxJRCkgeworICAgICAgICAgICAgRkRfU0VUKGZkLCBzZXQpOworICAgICAgICAgICAgaWYgKG1heF9mZCA9PSBTT0NLRVRfSU5WQUxJRCB8fCBtYXhfZmQgPCBmZCkgCisgICAgICAgICAgICAgICAgbWF4X2ZkID0gZmQ7CisgICAgICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBmZCk7CisgICAgICAgICAgICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsKKyAgICAgICAgICAgIGx1YV9zZXR0YWJsZShMLCBpdGFiKTsKKyAgICAgICAgfQorICAgICAgICBsdWFfcG9wKEwsIDEpOworICAgICAgICBpID0gaSArIDE7CisgICAgfQorICAgIHJldHVybiBtYXhfZmQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGlydHkobHVhX1N0YXRlICpMLCBpbnQgdGFiLCBpbnQgZHRhYiwgZmRfc2V0ICpzZXQpIHsKKyAgICBpbnQgbmRpcnR5ID0gMCwgaSA9IDE7CisgICAgaWYgKGx1YV9pc25pbChMLCB0YWIpKSAKKyAgICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKDEpIHsgCisgICAgICAgIHRfc29ja2V0IGZkOworICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBpKTsKKyAgICAgICAgbHVhX2dldHRhYmxlKEwsIHRhYik7CisgICAgICAgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgICAgICAgICBsdWFfcG9wKEwsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZmQgPSBnZXRmZChMKTsKKyAgICAgICAgaWYgKGZkICE9IFNPQ0tFVF9JTlZBTElEICYmIGRpcnR5KEwpKSB7CisgICAgICAgICAgICBsdWFfcHVzaG51bWJlcihMLCArK25kaXJ0eSk7CisgICAgICAgICAgICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsKKyAgICAgICAgICAgIGx1YV9zZXR0YWJsZShMLCBkdGFiKTsKKyAgICAgICAgICAgIEZEX0NMUihmZCwgc2V0KTsKKyAgICAgICAgfQorICAgICAgICBsdWFfcG9wKEwsIDEpOworICAgICAgICBpID0gaSArIDE7CisgICAgfQorICAgIHJldHVybiBuZGlydHk7Cit9CisKK3N0YXRpYyB2b2lkIHJldHVybl9mZChsdWFfU3RhdGUgKkwsIGZkX3NldCAqc2V0LCB0X3NvY2tldCBtYXhfZmQsIAorICAgICAgICBpbnQgaXRhYiwgaW50IHRhYiwgaW50IHN0YXJ0KSB7CisgICAgdF9zb2NrZXQgZmQ7CisgICAgZm9yIChmZCA9IDA7IGZkIDwgbWF4X2ZkOyBmZCsrKSB7CisgICAgICAgIGlmIChGRF9JU1NFVChmZCwgc2V0KSkgeworICAgICAgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgKytzdGFydCk7CisgICAgICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBmZCk7CisgICAgICAgICAgICBsdWFfZ2V0dGFibGUoTCwgaXRhYik7CisgICAgICAgICAgICBsdWFfc2V0dGFibGUoTCwgdGFiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbWFrZV9hc3NvYyhsdWFfU3RhdGUgKkwsIGludCB0YWIpIHsKKyAgICBpbnQgaSA9IDEsIGF0YWI7CisgICAgbHVhX25ld3RhYmxlKEwpOyBhdGFiID0gbHVhX2dldHRvcChMKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBsdWFfcHVzaG51bWJlcihMLCBpKTsKKyAgICAgICAgbHVhX2dldHRhYmxlKEwsIHRhYik7CisgICAgICAgIGlmICghbHVhX2lzbmlsKEwsIC0xKSkgeworICAgICAgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgaSk7CisgICAgICAgICAgICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsKKyAgICAgICAgICAgIGx1YV9zZXR0YWJsZShMLCBhdGFiKTsKKyAgICAgICAgICAgIGx1YV9wdXNobnVtYmVyKEwsIGkpOworICAgICAgICAgICAgbHVhX3NldHRhYmxlKEwsIGF0YWIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbHVhX3BvcChMLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkgPSBpKzE7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL3NlbGVjdC5oIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9zZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNkYjRhCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9zZWxlY3QuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIFNFTEVDVF9ICisjZGVmaW5lIFNFTEVDVF9ICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBTZWxlY3QgaW1wbGVtZW50YXRpb24KKyogTHVhU29ja2V0IHRvb2xraXQKKyoKKyogRWFjaCBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBzZWxlY3QgZnVuY3Rpb24gaGFzIHRvIGV4cG9ydCAKKyogbWV0aG9kIGdldGZkKCkgd2hpY2ggcmV0dXJucyB0aGUgZGVzY3JpcHRvciB0byBiZSBwYXNzZWQgdG8gdGhlCisqIHVuZGVybHlpbmcgc2VsZWN0IGZ1bmN0aW9uLiBBbm90aGVyIG1ldGhvZCwgZGlydHkoKSwgc2hvdWxkIHJldHVybiAKKyogdHJ1ZSBpZiB0aGVyZSBpcyBkYXRhIHJlYWR5IGZvciByZWFkaW5nIChyZXF1aXJlZCBmb3IgYnVmZmVyZWQgaW5wdXQpLgorKgorKiBSQ1MgSUQ6ICRJZDogc2VsZWN0LmgsdiAxLjcgMjAwNC8wNi8xNiAwMTowMjowNyBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50IHNlbGVjdF9vcGVuKGx1YV9TdGF0ZSAqTCk7CisKKyNlbmRpZiAvKiBTRUxFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy9zbXRwLmx1YSBiL2x1YXNvY2tldC0yLjAuMi9zcmMvc210cC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzY2ZjZgotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvc210cC5sdWEKQEAgLTAsMCArMSwyNTEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBTTVRQIGNsaWVudCBzdXBwb3J0IGZvciB0aGUgTHVhIGxhbmd1YWdlLgorLS0gTHVhU29ja2V0IHRvb2xraXQuCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogc210cC5sdWEsdiAxLjQ2IDIwMDcvMDMvMTIgMDQ6MDg6NDAgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBEZWNsYXJlIG1vZHVsZSBhbmQgaW1wb3J0IGRlcGVuZGVuY2llcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGJhc2UgPSBfRworbG9jYWwgY29yb3V0aW5lID0gcmVxdWlyZSgiY29yb3V0aW5lIikKK2xvY2FsIHN0cmluZyA9IHJlcXVpcmUoInN0cmluZyIpCitsb2NhbCBtYXRoID0gcmVxdWlyZSgibWF0aCIpCitsb2NhbCBvcyA9IHJlcXVpcmUoIm9zIikKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpCitsb2NhbCB0cCA9IHJlcXVpcmUoInNvY2tldC50cCIpCitsb2NhbCBsdG4xMiA9IHJlcXVpcmUoImx0bjEyIikKK2xvY2FsIG1pbWUgPSByZXF1aXJlKCJtaW1lIikKK21vZHVsZSgic29ja2V0LnNtdHAiKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUHJvZ3JhbSBjb25zdGFudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSB0aW1lb3V0IGZvciBjb25uZWN0aW9uCitUSU1FT1VUID0gNjAKKy0tIGRlZmF1bHQgc2VydmVyIHVzZWQgdG8gc2VuZCBlLW1haWxzCitTRVJWRVIgPSAibG9jYWxob3N0IgorLS0gZGVmYXVsdCBwb3J0CitQT1JUID0gMjUKKy0tIGRvbWFpbiB1c2VkIGluIEhFTE8gY29tbWFuZCBhbmQgZGVmYXVsdCBzZW5kbWFpbAorLS0gSWYgd2UgYXJlIHVuZGVyIGEgQ0dJLCB0cnkgdG8gZ2V0IGZyb20gZW52aXJvbm1lbnQKK0RPTUFJTiA9IG9zLmdldGVudigiU0VSVkVSX05BTUUiKSBvciAibG9jYWxob3N0IgorLS0gZGVmYXVsdCB0aW1lIHpvbmUgKG1lYW5zIHdlIGRvbid0IGtub3cpCitaT05FID0gIi0wMDAwIgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIExvdyBsZXZlbCBTTVRQIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIG1ldGF0ID0geyBfX2luZGV4ID0ge30gfQorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmdyZWV0KGRvbWFpbikKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNoZWNrKCIyLi4iKSkKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoIkVITE8iLCBkb21haW4gb3IgRE9NQUlOKSkKKyAgICByZXR1cm4gc29ja2V0LnNraXAoMSwgc2VsZi50cnkoc2VsZi50cDpjaGVjaygiMi4uIikpKQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6bWFpbChmcm9tKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y29tbWFuZCgiTUFJTCIsICJGUk9NOiIgLi4gZnJvbSkpCisgICAgcmV0dXJuIHNlbGYudHJ5KHNlbGYudHA6Y2hlY2soIjIuLiIpKQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6cmNwdCh0bykKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoIlJDUFQiLCAiVE86IiAuLiB0bykpCisgICAgcmV0dXJuIHNlbGYudHJ5KHNlbGYudHA6Y2hlY2soIjIuLiIpKQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6ZGF0YShzcmMsIHN0ZXApCisgICAgc2VsZi50cnkoc2VsZi50cDpjb21tYW5kKCJEQVRBIikpCisgICAgc2VsZi50cnkoc2VsZi50cDpjaGVjaygiMy4uIikpCisgICAgc2VsZi50cnkoc2VsZi50cDpzb3VyY2Uoc3JjLCBzdGVwKSkKKyAgICBzZWxmLnRyeShzZWxmLnRwOnNlbmQoIlxyXG4uXHJcbiIpKQorICAgIHJldHVybiBzZWxmLnRyeShzZWxmLnRwOmNoZWNrKCIyLi4iKSkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnF1aXQoKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y29tbWFuZCgiUVVJVCIpKQorICAgIHJldHVybiBzZWxmLnRyeShzZWxmLnRwOmNoZWNrKCIyLi4iKSkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmNsb3NlKCkKKyAgICByZXR1cm4gc2VsZi50cDpjbG9zZSgpCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDpsb2dpbih1c2VyLCBwYXNzd29yZCkKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoIkFVVEgiLCAiTE9HSU4iKSkKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNoZWNrKCIzLi4iKSkKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQobWltZS5iNjQodXNlcikpKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y2hlY2soIjMuLiIpKQorICAgIHNlbGYudHJ5KHNlbGYudHA6Y29tbWFuZChtaW1lLmI2NChwYXNzd29yZCkpKQorICAgIHJldHVybiBzZWxmLnRyeShzZWxmLnRwOmNoZWNrKCIyLi4iKSkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnBsYWluKHVzZXIsIHBhc3N3b3JkKQorICAgIGxvY2FsIGF1dGggPSAiUExBSU4gIiAuLiBtaW1lLmI2NCgiXDAiIC4uIHVzZXIgLi4gIlwwIiAuLiBwYXNzd29yZCkKKyAgICBzZWxmLnRyeShzZWxmLnRwOmNvbW1hbmQoIkFVVEgiLCBhdXRoKSkKKyAgICByZXR1cm4gc2VsZi50cnkoc2VsZi50cDpjaGVjaygiMi4uIikpCitlbmQKKworZnVuY3Rpb24gbWV0YXQuX19pbmRleDphdXRoKHVzZXIsIHBhc3N3b3JkLCBleHQpCisgICAgaWYgbm90IHVzZXIgb3Igbm90IHBhc3N3b3JkIHRoZW4gcmV0dXJuIDEgZW5kCisgICAgaWYgc3RyaW5nLmZpbmQoZXh0LCAiQVVUSFteXG5dK0xPR0lOIikgdGhlbgorICAgICAgICByZXR1cm4gc2VsZjpsb2dpbih1c2VyLCBwYXNzd29yZCkKKyAgICBlbHNlaWYgc3RyaW5nLmZpbmQoZXh0LCAiQVVUSFteXG5dK1BMQUlOIikgdGhlbgorICAgICAgICByZXR1cm4gc2VsZjpwbGFpbih1c2VyLCBwYXNzd29yZCkKKyAgICBlbHNlCisgICAgICAgIHNlbGYudHJ5KG5pbCwgImF1dGhlbnRpY2F0aW9uIG5vdCBzdXBwb3J0ZWQiKQorICAgIGVuZAorZW5kCisKKy0tIHNlbmQgbWVzc2FnZSBvciB0aHJvdyBhbiBleGNlcHRpb24KK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6c2VuZChtYWlsdCkKKyAgICBzZWxmOm1haWwobWFpbHQuZnJvbSkKKyAgICBpZiBiYXNlLnR5cGUobWFpbHQucmNwdCkgPT0gInRhYmxlIiB0aGVuCisgICAgICAgIGZvciBpLHYgaW4gYmFzZS5pcGFpcnMobWFpbHQucmNwdCkgZG8KKyAgICAgICAgICAgIHNlbGY6cmNwdCh2KQorICAgICAgICBlbmQKKyAgICBlbHNlCisgICAgICAgIHNlbGY6cmNwdChtYWlsdC5yY3B0KQorICAgIGVuZAorICAgIHNlbGY6ZGF0YShsdG4xMi5zb3VyY2UuY2hhaW4obWFpbHQuc291cmNlLCBtaW1lLnN0dWZmKCkpLCBtYWlsdC5zdGVwKQorZW5kCisKK2Z1bmN0aW9uIG9wZW4oc2VydmVyLCBwb3J0LCBjcmVhdGUpCisgICAgbG9jYWwgdHAgPSBzb2NrZXQudHJ5KHRwLmNvbm5lY3Qoc2VydmVyIG9yIFNFUlZFUiwgcG9ydCBvciBQT1JULAorICAgICAgICBUSU1FT1VULCBjcmVhdGUpKQorICAgIGxvY2FsIHMgPSBiYXNlLnNldG1ldGF0YWJsZSh7dHAgPSB0cH0sIG1ldGF0KQorICAgIC0tIG1ha2Ugc3VyZSB0cCBpcyBjbG9zZWQgaWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbgorICAgIHMudHJ5ID0gc29ja2V0Lm5ld3RyeShmdW5jdGlvbigpCisgICAgICAgIHM6Y2xvc2UoKQorICAgIGVuZCkKKyAgICByZXR1cm4gcworZW5kCisKKy0tIGNvbnZlcnQgaGVhZGVycyB0byBsb3dlcmNhc2UKK2xvY2FsIGZ1bmN0aW9uIGxvd2VyX2hlYWRlcnMoaGVhZGVycykKKyAgICBsb2NhbCBsb3dlciA9IHt9CisgICAgZm9yIGksdiBpbiBiYXNlLnBhaXJzKGhlYWRlcnMgb3IgbG93ZXIpIGRvCisgICAgICAgIGxvd2VyW3N0cmluZy5sb3dlcihpKV0gPSB2CisgICAgZW5kCisgICAgcmV0dXJuIGxvd2VyCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBNdWx0aXBhcnQgbWVzc2FnZSBzb3VyY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByZXR1cm5zIGEgaG9wZWZ1bGx5IHVuaXF1ZSBtaW1lIGJvdW5kYXJ5Citsb2NhbCBzZXFubyA9IDAKK2xvY2FsIGZ1bmN0aW9uIG5ld2JvdW5kYXJ5KCkKKyAgICBzZXFubyA9IHNlcW5vICsgMQorICAgIHJldHVybiBzdHJpbmcuZm9ybWF0KCclcyUwNWQ9PSUwNXUnLCBvcy5kYXRlKCclZCVtJVklSCVNJVMnKSwKKyAgICAgICAgbWF0aC5yYW5kb20oMCwgOTk5OTkpLCBzZXFubykKK2VuZAorCistLSBzZW5kX21lc3NhZ2UgZm9yd2FyZCBkZWNsYXJhdGlvbgorbG9jYWwgc2VuZF9tZXNzYWdlCisKKy0tIHlpZWxkIHRoZSBoZWFkZXJzIGFsbCBhdCBvbmNlLCBpdCdzIGZhc3RlcgorbG9jYWwgZnVuY3Rpb24gc2VuZF9oZWFkZXJzKGhlYWRlcnMpCisgICAgbG9jYWwgaCA9ICJcclxuIgorICAgIGZvciBpLHYgaW4gYmFzZS5wYWlycyhoZWFkZXJzKSBkbworICAgICAgICBoID0gaSAuLiAnOiAnIC4uIHYgLi4gIlxyXG4iIC4uIGgKKyAgICBlbmQKKyAgICBjb3JvdXRpbmUueWllbGQoaCkKK2VuZAorCistLSB5aWVsZCBtdWx0aXBhcnQgbWVzc2FnZSBib2R5IGZyb20gYSBtdWx0aXBhcnQgbWVzc2FnZSB0YWJsZQorbG9jYWwgZnVuY3Rpb24gc2VuZF9tdWx0aXBhcnQobWVzZ3QpCisgICAgLS0gbWFrZSBzdXJlIHdlIGhhdmUgb3VyIGJvdW5kYXJ5IGFuZCBzZW5kIGhlYWRlcnMKKyAgICBsb2NhbCBiZCA9IG5ld2JvdW5kYXJ5KCkKKyAgICBsb2NhbCBoZWFkZXJzID0gbG93ZXJfaGVhZGVycyhtZXNndC5oZWFkZXJzIG9yIHt9KQorICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gaGVhZGVyc1snY29udGVudC10eXBlJ10gb3IgJ211bHRpcGFydC9taXhlZCcKKyAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIC4uCisgICAgICAgICc7IGJvdW5kYXJ5PSInIC4uICBiZCAuLiAnIicKKyAgICBzZW5kX2hlYWRlcnMoaGVhZGVycykKKyAgICAtLSBzZW5kIHByZWFtYmxlCisgICAgaWYgbWVzZ3QuYm9keS5wcmVhbWJsZSB0aGVuCisgICAgICAgIGNvcm91dGluZS55aWVsZChtZXNndC5ib2R5LnByZWFtYmxlKQorICAgICAgICBjb3JvdXRpbmUueWllbGQoIlxyXG4iKQorICAgIGVuZAorICAgIC0tIHNlbmQgZWFjaCBwYXJ0IHNlcGFyYXRlZCBieSBhIGJvdW5kYXJ5CisgICAgZm9yIGksIG0gaW4gYmFzZS5pcGFpcnMobWVzZ3QuYm9keSkgZG8KKyAgICAgICAgY29yb3V0aW5lLnlpZWxkKCJcclxuLS0iIC4uIGJkIC4uICJcclxuIikKKyAgICAgICAgc2VuZF9tZXNzYWdlKG0pCisgICAgZW5kCisgICAgLS0gc2VuZCBsYXN0IGJvdW5kYXJ5CisgICAgY29yb3V0aW5lLnlpZWxkKCJcclxuLS0iIC4uIGJkIC4uICItLVxyXG5cclxuIikKKyAgICAtLSBzZW5kIGVwaWxvZ3VlCisgICAgaWYgbWVzZ3QuYm9keS5lcGlsb2d1ZSB0aGVuCisgICAgICAgIGNvcm91dGluZS55aWVsZChtZXNndC5ib2R5LmVwaWxvZ3VlKQorICAgICAgICBjb3JvdXRpbmUueWllbGQoIlxyXG4iKQorICAgIGVuZAorZW5kCisKKy0tIHlpZWxkIG1lc3NhZ2UgYm9keSBmcm9tIGEgc291cmNlCitsb2NhbCBmdW5jdGlvbiBzZW5kX3NvdXJjZShtZXNndCkKKyAgICAtLSBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNvbnRlbnQtdHlwZQorICAgIGxvY2FsIGhlYWRlcnMgPSBsb3dlcl9oZWFkZXJzKG1lc2d0LmhlYWRlcnMgb3Ige30pCisgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSBvcgorICAgICAgICAndGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMSInCisgICAgc2VuZF9oZWFkZXJzKGhlYWRlcnMpCisgICAgLS0gc2VuZCBib2R5IGZyb20gc291cmNlCisgICAgd2hpbGUgdHJ1ZSBkbworICAgICAgICBsb2NhbCBjaHVuaywgZXJyID0gbWVzZ3QuYm9keSgpCisgICAgICAgIGlmIGVyciB0aGVuIGNvcm91dGluZS55aWVsZChuaWwsIGVycikKKyAgICAgICAgZWxzZWlmIGNodW5rIHRoZW4gY29yb3V0aW5lLnlpZWxkKGNodW5rKQorICAgICAgICBlbHNlIGJyZWFrIGVuZAorICAgIGVuZAorZW5kCisKKy0tIHlpZWxkIG1lc3NhZ2UgYm9keSBmcm9tIGEgc3RyaW5nCitsb2NhbCBmdW5jdGlvbiBzZW5kX3N0cmluZyhtZXNndCkKKyAgICAtLSBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNvbnRlbnQtdHlwZQorICAgIGxvY2FsIGhlYWRlcnMgPSBsb3dlcl9oZWFkZXJzKG1lc2d0LmhlYWRlcnMgb3Ige30pCisgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSBvcgorICAgICAgICAndGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMSInCisgICAgc2VuZF9oZWFkZXJzKGhlYWRlcnMpCisgICAgLS0gc2VuZCBib2R5IGZyb20gc3RyaW5nCisgICAgY29yb3V0aW5lLnlpZWxkKG1lc2d0LmJvZHkpCitlbmQKKworLS0gbWVzc2FnZSBzb3VyY2UKK2Z1bmN0aW9uIHNlbmRfbWVzc2FnZShtZXNndCkKKyAgICBpZiBiYXNlLnR5cGUobWVzZ3QuYm9keSkgPT0gInRhYmxlIiB0aGVuIHNlbmRfbXVsdGlwYXJ0KG1lc2d0KQorICAgIGVsc2VpZiBiYXNlLnR5cGUobWVzZ3QuYm9keSkgPT0gImZ1bmN0aW9uIiB0aGVuIHNlbmRfc291cmNlKG1lc2d0KQorICAgIGVsc2Ugc2VuZF9zdHJpbmcobWVzZ3QpIGVuZAorZW5kCisKKy0tIHNldCBkZWZhdWwgaGVhZGVycworbG9jYWwgZnVuY3Rpb24gYWRqdXN0X2hlYWRlcnMobWVzZ3QpCisgICAgbG9jYWwgbG93ZXIgPSBsb3dlcl9oZWFkZXJzKG1lc2d0LmhlYWRlcnMpCisgICAgbG93ZXJbImRhdGUiXSA9IGxvd2VyWyJkYXRlIl0gb3IKKyAgICAgICAgb3MuZGF0ZSgiISVhLCAlZCAlYiAlWSAlSDolTTolUyAiKSAuLiAobWVzZ3Quem9uZSBvciBaT05FKQorICAgIGxvd2VyWyJ4LW1haWxlciJdID0gbG93ZXJbIngtbWFpbGVyIl0gb3Igc29ja2V0Ll9WRVJTSU9OCisgICAgLS0gdGhpcyBjYW4ndCBiZSBvdmVycmlkZW4KKyAgICBsb3dlclsibWltZS12ZXJzaW9uIl0gPSAiMS4wIgorICAgIHJldHVybiBsb3dlcgorZW5kCisKK2Z1bmN0aW9uIG1lc3NhZ2UobWVzZ3QpCisgICAgbWVzZ3QuaGVhZGVycyA9IGFkanVzdF9oZWFkZXJzKG1lc2d0KQorICAgIC0tIGNyZWF0ZSBhbmQgcmV0dXJuIG1lc3NhZ2Ugc291cmNlCisgICAgbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uKCkgc2VuZF9tZXNzYWdlKG1lc2d0KSBlbmQpCisgICAgcmV0dXJuIGZ1bmN0aW9uKCkKKyAgICAgICAgbG9jYWwgcmV0LCBhLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbykKKyAgICAgICAgaWYgcmV0IHRoZW4gcmV0dXJuIGEsIGIKKyAgICAgICAgZWxzZSByZXR1cm4gbmlsLCBhIGVuZAorICAgIGVuZAorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gSGlnaCBsZXZlbCBTTVRQIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NlbmQgPSBzb2NrZXQucHJvdGVjdChmdW5jdGlvbihtYWlsdCkKKyAgICBsb2NhbCBzID0gb3BlbihtYWlsdC5zZXJ2ZXIsIG1haWx0LnBvcnQsIG1haWx0LmNyZWF0ZSkKKyAgICBsb2NhbCBleHQgPSBzOmdyZWV0KG1haWx0LmRvbWFpbikKKyAgICBzOmF1dGgobWFpbHQudXNlciwgbWFpbHQucGFzc3dvcmQsIGV4dCkKKyAgICBzOnNlbmQobWFpbHQpCisgICAgczpxdWl0KCkKKyAgICByZXR1cm4gczpjbG9zZSgpCitlbmQpCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL3NvY2tldC5oIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZjN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9zb2NrZXQuaApAQCAtMCwwICsxLDc2IEBACisjaWZuZGVmIFNPQ0tFVF9ICisjZGVmaW5lIFNPQ0tFVF9ICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBTb2NrZXQgY29tcGF0aWJpbGl6YXRpb24gbW9kdWxlCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIEJTRCBTb2NrZXRzIGFuZCBXaW5Tb2NrIGFyZSBzaW1pbGFyLCBidXQgdGhlcmUgYXJlIGEgZmV3IGlycml0YXRpbmcKKyogZGlmZmVyZW5jZXMuIEFsc28sIG5vdCBhbGwgKm5peCBwbGF0Zm9ybXMgYmVoYXZlIHRoZSBzYW1lLiBUaGlzIG1vZHVsZQorKiAoYW5kIHRoZSBhc3NvY2lhdGVkIHVzb2NrZXQuaCBhbmQgd3NvY2tldC5oKSBmYWN0b3IgdGhlc2UgZGlmZmVyZW5jZXMgYW5kCisqIGNyZWF0ZXMgYSBpbnRlcmZhY2UgY29tcGF0aWJsZSB3aXRoIHRoZSBpby5oIG1vZHVsZS4KKyoKKyogUkNTIElEOiAkSWQ6IHNvY2tldC5oLHYgMS4yMCAyMDA1LzExLzIwIDA3OjIwOjIzIGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgImlvLmgiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIFBsYXRmb3JtIHNwZWNpZmljIGNvbXBhdGliaWxpemF0aW9uCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgIndzb2NrZXQuaCIKKyNlbHNlCisjaW5jbHVkZSAidXNvY2tldC5oIgorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIFRoZSBjb25uZWN0IGFuZCBhY2NlcHQgZnVuY3Rpb25zIGFjY2VwdCBhIHRpbWVvdXQgYW5kIHRoZWlyCisqIGltcGxlbWVudGF0aW9ucyBhcmUgc29tZXdoYXQgY29tcGxpY2F0ZWQuIFdlIGNob3NlIHRvIG1vdmUKKyogdGhlIHRpbWVvdXQgY29udHJvbCBpbnRvIHRoaXMgbW9kdWxlIGZvciB0aGVzZSBmdW5jdGlvbnMgaW4KKyogb3JkZXIgdG8gc2ltcGxpZnkgdGhlIG1vZHVsZXMgdGhhdCB1c2UgdGhlbS4gCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgInRpbWVvdXQuaCIKKworLyogd2UgYXJlIGxhenkuLi4gKi8KK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyIFNBOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBGdW5jdGlvbnMgYmVsbG93IGltcGxlbWVudCBhIGNvbWZvcnRhYmxlIHBsYXRmb3JtIGluZGVwZW5kZW50IAorKiBpbnRlcmZhY2UgdG8gc29ja2V0cworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBzb2NrZXRfb3Blbih2b2lkKTsKK2ludCBzb2NrZXRfY2xvc2Uodm9pZCk7Cit2b2lkIHNvY2tldF9kZXN0cm95KHBfc29ja2V0IHBzKTsKK3ZvaWQgc29ja2V0X3NodXRkb3duKHBfc29ja2V0IHBzLCBpbnQgaG93KTsgCitpbnQgc29ja2V0X3NlbmR0byhwX3NvY2tldCBwcywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCAKKyAgICAgICAgc2l6ZV90ICpzZW50LCBTQSAqYWRkciwgc29ja2xlbl90IGFkZHJfbGVuLCBwX3RpbWVvdXQgdG0pOworaW50IHNvY2tldF9yZWN2ZnJvbShwX3NvY2tldCBwcywgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCAKKyAgICAgICAgc2l6ZV90ICpnb3QsIFNBICphZGRyLCBzb2NrbGVuX3QgKmFkZHJfbGVuLCBwX3RpbWVvdXQgdG0pOworCit2b2lkIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBwcyk7Cit2b2lkIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBwcyk7CisKK2ludCBzb2NrZXRfd2FpdGZkKHBfc29ja2V0IHBzLCBpbnQgc3csIHBfdGltZW91dCB0bSk7CitpbnQgc29ja2V0X3NlbGVjdCh0X3NvY2tldCBuLCBmZF9zZXQgKnJmZHMsIGZkX3NldCAqd2ZkcywgZmRfc2V0ICplZmRzLCAKKyAgICAgICAgcF90aW1lb3V0IHRtKTsKKworaW50IHNvY2tldF9jb25uZWN0KHBfc29ja2V0IHBzLCBTQSAqYWRkciwgc29ja2xlbl90IGFkZHJfbGVuLCBwX3RpbWVvdXQgdG0pOyAKK2ludCBzb2NrZXRfY3JlYXRlKHBfc29ja2V0IHBzLCBpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTsKK2ludCBzb2NrZXRfYmluZChwX3NvY2tldCBwcywgU0EgKmFkZHIsIHNvY2tsZW5fdCBhZGRyX2xlbik7IAoraW50IHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgcHMsIGludCBiYWNrbG9nKTsKK2ludCBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHBzLCBwX3NvY2tldCBwYSwgU0EgKmFkZHIsIAorICAgICAgICBzb2NrbGVuX3QgKmFkZHJfbGVuLCBwX3RpbWVvdXQgdG0pOworCitjb25zdCBjaGFyICpzb2NrZXRfaG9zdHN0cmVycm9yKGludCBlcnIpOworY29uc3QgY2hhciAqc29ja2V0X3N0cmVycm9yKGludCBlcnIpOworCisvKiB0aGVzZSBhcmUgcGVyZmVjdCB0byB1c2Ugd2l0aCB0aGUgaW8gYWJzdHJhY3Rpb24gbW9kdWxlIAorICAgYW5kIHRoZSBidWZmZXJlZCBpbnB1dCBtb2R1bGUgKi8KK2ludCBzb2NrZXRfc2VuZChwX3NvY2tldCBwcywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCAKKyAgICAgICAgc2l6ZV90ICpzZW50LCBwX3RpbWVvdXQgdG0pOworaW50IHNvY2tldF9yZWN2KHBfc29ja2V0IHBzLCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQsIHNpemVfdCAqZ290LCBwX3RpbWVvdXQgdG0pOworY29uc3QgY2hhciAqc29ja2V0X2lvZXJyb3IocF9zb2NrZXQgcHMsIGludCBlcnIpOworCitpbnQgc29ja2V0X2dldGhvc3RieWFkZHIoY29uc3QgY2hhciAqYWRkciwgc29ja2xlbl90IGxlbiwgc3RydWN0IGhvc3RlbnQgKipocCk7CitpbnQgc29ja2V0X2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGhvc3RlbnQgKipocCk7CisKKyNlbmRpZiAvKiBTT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy9zb2NrZXQubHVhIGIvbHVhc29ja2V0LTIuMC4yL3NyYy9zb2NrZXQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMWFkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3NvY2tldC5sdWEKQEAgLTAsMCArMSwxMzMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBMdWFTb2NrZXQgaGVscGVyIG1vZHVsZQorLS0gQXV0aG9yOiBEaWVnbyBOZWhhYgorLS0gUkNTIElEOiAkSWQ6IHNvY2tldC5sdWEsdiAxLjIyIDIwMDUvMTEvMjIgMDg6MzM6MjkgZGllZ28gRXhwICQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBEZWNsYXJlIG1vZHVsZSBhbmQgaW1wb3J0IGRlcGVuZGVuY2llcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGJhc2UgPSBfRworbG9jYWwgc3RyaW5nID0gcmVxdWlyZSgic3RyaW5nIikKK2xvY2FsIG1hdGggPSByZXF1aXJlKCJtYXRoIikKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUoInNvY2tldC5jb3JlIikKK21vZHVsZSgic29ja2V0IikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIEV4cG9ydGVkIGF1eGlsaWFyIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIGNvbm5lY3QoYWRkcmVzcywgcG9ydCwgbGFkZHJlc3MsIGxwb3J0KQorICAgIGxvY2FsIHNvY2ssIGVyciA9IHNvY2tldC50Y3AoKQorICAgIGlmIG5vdCBzb2NrIHRoZW4gcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgIGlmIGxhZGRyZXNzIHRoZW4KKyAgICAgICAgbG9jYWwgcmVzLCBlcnIgPSBzb2NrOmJpbmQobGFkZHJlc3MsIGxwb3J0LCAtMSkKKyAgICAgICAgaWYgbm90IHJlcyB0aGVuIHJldHVybiBuaWwsIGVyciBlbmQKKyAgICBlbmQKKyAgICBsb2NhbCByZXMsIGVyciA9IHNvY2s6Y29ubmVjdChhZGRyZXNzLCBwb3J0KQorICAgIGlmIG5vdCByZXMgdGhlbiByZXR1cm4gbmlsLCBlcnIgZW5kCisgICAgcmV0dXJuIHNvY2sKK2VuZAorCitmdW5jdGlvbiBiaW5kKGhvc3QsIHBvcnQsIGJhY2tsb2cpCisgICAgbG9jYWwgc29jaywgZXJyID0gc29ja2V0LnRjcCgpCisgICAgaWYgbm90IHNvY2sgdGhlbiByZXR1cm4gbmlsLCBlcnIgZW5kCisgICAgc29jazpzZXRvcHRpb24oInJldXNlYWRkciIsIHRydWUpCisgICAgbG9jYWwgcmVzLCBlcnIgPSBzb2NrOmJpbmQoaG9zdCwgcG9ydCkKKyAgICBpZiBub3QgcmVzIHRoZW4gcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgIHJlcywgZXJyID0gc29jazpsaXN0ZW4oYmFja2xvZykKKyAgICBpZiBub3QgcmVzIHRoZW4gcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgIHJldHVybiBzb2NrCitlbmQKKwordHJ5ID0gbmV3dHJ5KCkKKworZnVuY3Rpb24gY2hvb3NlKHRhYmxlKQorICAgIHJldHVybiBmdW5jdGlvbihuYW1lLCBvcHQxLCBvcHQyKQorICAgICAgICBpZiBiYXNlLnR5cGUobmFtZSkgfj0gInN0cmluZyIgdGhlbgorICAgICAgICAgICAgbmFtZSwgb3B0MSwgb3B0MiA9ICJkZWZhdWx0IiwgbmFtZSwgb3B0MQorICAgICAgICBlbmQKKyAgICAgICAgbG9jYWwgZiA9IHRhYmxlW25hbWUgb3IgIm5pbCJdCisgICAgICAgIGlmIG5vdCBmIHRoZW4gYmFzZS5lcnJvcigidW5rbm93biBrZXkgKCIuLiBiYXNlLnRvc3RyaW5nKG5hbWUpIC4uIikiLCAzKQorICAgICAgICBlbHNlIHJldHVybiBmKG9wdDEsIG9wdDIpIGVuZAorICAgIGVuZAorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBTb2NrZXQgc291cmNlcyBhbmQgc2lua3MsIGNvbmZvcm1pbmcgdG8gTFROMTIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjcmVhdGUgbmFtZXNwYWNlcyBpbnNpZGUgTHVhU29ja2V0IG5hbWVzcGFjZQorc291cmNldCA9IHt9CitzaW5rdCA9IHt9CisKK0JMT0NLU0laRSA9IDIwNDgKKworc2lua3RbImNsb3NlLXdoZW4tZG9uZSJdID0gZnVuY3Rpb24oc29jaykKKyAgICByZXR1cm4gYmFzZS5zZXRtZXRhdGFibGUoeworICAgICAgICBnZXRmZCA9IGZ1bmN0aW9uKCkgcmV0dXJuIHNvY2s6Z2V0ZmQoKSBlbmQsCisgICAgICAgIGRpcnR5ID0gZnVuY3Rpb24oKSByZXR1cm4gc29jazpkaXJ0eSgpIGVuZAorICAgIH0sIHsKKyAgICAgICAgX19jYWxsID0gZnVuY3Rpb24oc2VsZiwgY2h1bmssIGVycikKKyAgICAgICAgICAgIGlmIG5vdCBjaHVuayB0aGVuCisgICAgICAgICAgICAgICAgc29jazpjbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIHNvY2s6c2VuZChjaHVuaykgZW5kCisgICAgICAgIGVuZAorICAgIH0pCitlbmQKKworc2lua3RbImtlZXAtb3BlbiJdID0gZnVuY3Rpb24oc29jaykKKyAgICByZXR1cm4gYmFzZS5zZXRtZXRhdGFibGUoeworICAgICAgICBnZXRmZCA9IGZ1bmN0aW9uKCkgcmV0dXJuIHNvY2s6Z2V0ZmQoKSBlbmQsCisgICAgICAgIGRpcnR5ID0gZnVuY3Rpb24oKSByZXR1cm4gc29jazpkaXJ0eSgpIGVuZAorICAgIH0sIHsKKyAgICAgICAgX19jYWxsID0gZnVuY3Rpb24oc2VsZiwgY2h1bmssIGVycikKKyAgICAgICAgICAgIGlmIGNodW5rIHRoZW4gcmV0dXJuIHNvY2s6c2VuZChjaHVuaykKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIDEgZW5kCisgICAgICAgIGVuZAorICAgIH0pCitlbmQKKworc2lua3RbImRlZmF1bHQiXSA9IHNpbmt0WyJrZWVwLW9wZW4iXQorCitzaW5rID0gY2hvb3NlKHNpbmt0KQorCitzb3VyY2V0WyJieS1sZW5ndGgiXSA9IGZ1bmN0aW9uKHNvY2ssIGxlbmd0aCkKKyAgICByZXR1cm4gYmFzZS5zZXRtZXRhdGFibGUoeworICAgICAgICBnZXRmZCA9IGZ1bmN0aW9uKCkgcmV0dXJuIHNvY2s6Z2V0ZmQoKSBlbmQsCisgICAgICAgIGRpcnR5ID0gZnVuY3Rpb24oKSByZXR1cm4gc29jazpkaXJ0eSgpIGVuZAorICAgIH0sIHsKKyAgICAgICAgX19jYWxsID0gZnVuY3Rpb24oKQorICAgICAgICAgICAgaWYgbGVuZ3RoIDw9IDAgdGhlbiByZXR1cm4gbmlsIGVuZAorICAgICAgICAgICAgbG9jYWwgc2l6ZSA9IG1hdGgubWluKHNvY2tldC5CTE9DS1NJWkUsIGxlbmd0aCkKKyAgICAgICAgICAgIGxvY2FsIGNodW5rLCBlcnIgPSBzb2NrOnJlY2VpdmUoc2l6ZSkKKyAgICAgICAgICAgIGlmIGVyciB0aGVuIHJldHVybiBuaWwsIGVyciBlbmQKKyAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCAtIHN0cmluZy5sZW4oY2h1bmspCisgICAgICAgICAgICByZXR1cm4gY2h1bmsKKyAgICAgICAgZW5kCisgICAgfSkKK2VuZAorCitzb3VyY2V0WyJ1bnRpbC1jbG9zZWQiXSA9IGZ1bmN0aW9uKHNvY2spCisgICAgbG9jYWwgZG9uZQorICAgIHJldHVybiBiYXNlLnNldG1ldGF0YWJsZSh7CisgICAgICAgIGdldGZkID0gZnVuY3Rpb24oKSByZXR1cm4gc29jazpnZXRmZCgpIGVuZCwKKyAgICAgICAgZGlydHkgPSBmdW5jdGlvbigpIHJldHVybiBzb2NrOmRpcnR5KCkgZW5kCisgICAgfSwgeworICAgICAgICBfX2NhbGwgPSBmdW5jdGlvbigpCisgICAgICAgICAgICBpZiBkb25lIHRoZW4gcmV0dXJuIG5pbCBlbmQKKyAgICAgICAgICAgIGxvY2FsIGNodW5rLCBlcnIsIHBhcnRpYWwgPSBzb2NrOnJlY2VpdmUoc29ja2V0LkJMT0NLU0laRSkKKyAgICAgICAgICAgIGlmIG5vdCBlcnIgdGhlbiByZXR1cm4gY2h1bmsKKyAgICAgICAgICAgIGVsc2VpZiBlcnIgPT0gImNsb3NlZCIgdGhlbgorICAgICAgICAgICAgICAgIHNvY2s6Y2xvc2UoKQorICAgICAgICAgICAgICAgIGRvbmUgPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWwKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgICAgICBlbmQKKyAgICB9KQorZW5kCisKKworc291cmNldFsiZGVmYXVsdCJdID0gc291cmNldFsidW50aWwtY2xvc2VkIl0KKworc291cmNlID0gY2hvb3NlKHNvdXJjZXQpCisKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvdGNwLmMgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3RjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGE3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3RjcC5jCkBAIC0wLDAgKzEsMzM5IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBUQ1Agb2JqZWN0IAorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBSQ1MgSUQ6ICRJZDogdGNwLmMsdiAxLjQxIDIwMDUvMTAvMDcgMDQ6NDA6NTkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8c3RyaW5nLmg+IAorCisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAibGF1eGxpYi5oIgorCisjaW5jbHVkZSAiYXV4aWxpYXIuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKyNpbmNsdWRlICJpbmV0LmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInRjcC5oIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBnbG9iYWxfY3JlYXRlKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfY29ubmVjdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2xpc3RlbihsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2JpbmQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9zZW5kKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfZ2V0c3RhdHMobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9zZXRzdGF0cyhsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2dldHNvY2tuYW1lKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfZ2V0cGVlcm5hbWUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9zaHV0ZG93bihsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3JlY2VpdmUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9hY2NlcHQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9jbG9zZShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NldG9wdGlvbihsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NldHRpbWVvdXQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9nZXRmZChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NldGZkKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfZGlydHkobHVhX1N0YXRlICpMKTsKKworLyogdGNwIG9iamVjdCBtZXRob2RzICovCitzdGF0aWMgbHVhTF9yZWcgdGNwW10gPSB7CisgICAgeyJfX2djIiwgICAgICAgIG1ldGhfY2xvc2V9LAorICAgIHsiX190b3N0cmluZyIsICBhdXhpbGlhcl90b3N0cmluZ30sCisgICAgeyJhY2NlcHQiLCAgICAgIG1ldGhfYWNjZXB0fSwKKyAgICB7ImJpbmQiLCAgICAgICAgbWV0aF9iaW5kfSwKKyAgICB7ImNsb3NlIiwgICAgICAgbWV0aF9jbG9zZX0sCisgICAgeyJjb25uZWN0IiwgICAgIG1ldGhfY29ubmVjdH0sCisgICAgeyJkaXJ0eSIsICAgICAgIG1ldGhfZGlydHl9LAorICAgIHsiZ2V0ZmQiLCAgICAgICBtZXRoX2dldGZkfSwKKyAgICB7ImdldHBlZXJuYW1lIiwgbWV0aF9nZXRwZWVybmFtZX0sCisgICAgeyJnZXRzb2NrbmFtZSIsIG1ldGhfZ2V0c29ja25hbWV9LAorICAgIHsiZ2V0c3RhdHMiLCAgICBtZXRoX2dldHN0YXRzfSwKKyAgICB7InNldHN0YXRzIiwgICAgbWV0aF9zZXRzdGF0c30sCisgICAgeyJsaXN0ZW4iLCAgICAgIG1ldGhfbGlzdGVufSwKKyAgICB7InJlY2VpdmUiLCAgICAgbWV0aF9yZWNlaXZlfSwKKyAgICB7InNlbmQiLCAgICAgICAgbWV0aF9zZW5kfSwKKyAgICB7InNldGZkIiwgICAgICAgbWV0aF9zZXRmZH0sCisgICAgeyJzZXRvcHRpb24iLCAgIG1ldGhfc2V0b3B0aW9ufSwKKyAgICB7InNldHBlZXJuYW1lIiwgbWV0aF9jb25uZWN0fSwKKyAgICB7InNldHNvY2tuYW1lIiwgbWV0aF9iaW5kfSwKKyAgICB7InNldHRpbWVvdXQiLCAgbWV0aF9zZXR0aW1lb3V0fSwKKyAgICB7InNodXRkb3duIiwgICAgbWV0aF9zaHV0ZG93bn0sCisgICAge05VTEwsICAgICAgICAgIE5VTEx9Cit9OworCisvKiBzb2NrZXQgb3B0aW9uIGhhbmRsZXJzICovCitzdGF0aWMgdF9vcHQgb3B0W10gPSB7CisgICAgeyJrZWVwYWxpdmUiLCAgIG9wdF9rZWVwYWxpdmV9LAorICAgIHsicmV1c2VhZGRyIiwgICBvcHRfcmV1c2VhZGRyfSwKKyAgICB7InRjcC1ub2RlbGF5Iiwgb3B0X3RjcF9ub2RlbGF5fSwKKyAgICB7ImxpbmdlciIsICAgICAgb3B0X2xpbmdlcn0sCisgICAge05VTEwsICAgICAgICAgIE5VTEx9Cit9OworCisvKiBmdW5jdGlvbnMgaW4gbGlicmFyeSBuYW1lc3BhY2UgKi8KK3N0YXRpYyBsdWFMX3JlZyBmdW5jW10gPSB7CisgICAgeyJ0Y3AiLCBnbG9iYWxfY3JlYXRlfSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluaXRpYWxpemVzIG1vZHVsZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCB0Y3Bfb3BlbihsdWFfU3RhdGUgKkwpCit7CisgICAgLyogY3JlYXRlIGNsYXNzZXMgKi8KKyAgICBhdXhpbGlhcl9uZXdjbGFzcyhMLCAidGNwe21hc3Rlcn0iLCB0Y3ApOworICAgIGF1eGlsaWFyX25ld2NsYXNzKEwsICJ0Y3B7Y2xpZW50fSIsIHRjcCk7CisgICAgYXV4aWxpYXJfbmV3Y2xhc3MoTCwgInRjcHtzZXJ2ZXJ9IiwgdGNwKTsKKyAgICAvKiBjcmVhdGUgY2xhc3MgZ3JvdXBzICovCisgICAgYXV4aWxpYXJfYWRkMmdyb3VwKEwsICJ0Y3B7bWFzdGVyfSIsICJ0Y3B7YW55fSIpOworICAgIGF1eGlsaWFyX2FkZDJncm91cChMLCAidGNwe2NsaWVudH0iLCAidGNwe2FueX0iKTsKKyAgICBhdXhpbGlhcl9hZGQyZ3JvdXAoTCwgInRjcHtzZXJ2ZXJ9IiwgInRjcHthbnl9Iik7CisgICAgLyogZGVmaW5lIGxpYnJhcnkgZnVuY3Rpb25zICovCisgICAgbHVhTF9vcGVubGliKEwsIE5VTEwsIGZ1bmMsIDApOyAKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogTHVhIG1ldGhvZHMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBKdXN0IGNhbGwgYnVmZmVyZWQgSU8gbWV0aG9kcworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9zZW5kKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidGNwe2NsaWVudH0iLCAxKTsKKyAgICByZXR1cm4gYnVmZmVyX21ldGhfc2VuZChMLCAmdGNwLT5idWYpOworfQorCitzdGF0aWMgaW50IG1ldGhfcmVjZWl2ZShsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3RjcCB0Y3AgPSAocF90Y3ApIGF1eGlsaWFyX2NoZWNrY2xhc3MoTCwgInRjcHtjbGllbnR9IiwgMSk7CisgICAgcmV0dXJuIGJ1ZmZlcl9tZXRoX3JlY2VpdmUoTCwgJnRjcC0+YnVmKTsKK30KKworc3RhdGljIGludCBtZXRoX2dldHN0YXRzKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidGNwe2NsaWVudH0iLCAxKTsKKyAgICByZXR1cm4gYnVmZmVyX21ldGhfZ2V0c3RhdHMoTCwgJnRjcC0+YnVmKTsKK30KKworc3RhdGljIGludCBtZXRoX3NldHN0YXRzKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidGNwe2NsaWVudH0iLCAxKTsKKyAgICByZXR1cm4gYnVmZmVyX21ldGhfc2V0c3RhdHMoTCwgJnRjcC0+YnVmKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSnVzdCBjYWxsIG9wdGlvbiBoYW5kbGVyCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX3NldG9wdGlvbihsdWFfU3RhdGUgKkwpCit7CisgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBhdXhpbGlhcl9jaGVja2dyb3VwKEwsICJ0Y3B7YW55fSIsIDEpOworICAgIHJldHVybiBvcHRfbWV0aF9zZXRvcHRpb24oTCwgb3B0LCAmdGNwLT5zb2NrKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogU2VsZWN0IHN1cHBvcnQgbWV0aG9kcworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9nZXRmZChsdWFfU3RhdGUgKkwpCit7CisgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBhdXhpbGlhcl9jaGVja2dyb3VwKEwsICJ0Y3B7YW55fSIsIDEpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIChpbnQpIHRjcC0+c29jayk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIHRoaXMgaXMgdmVyeSBkYW5nZXJvdXMsIGJ1dCBjYW4gYmUgaGFuZHkgZm9yIHRob3NlIHRoYXQgYXJlIGJyYXZlIGVub3VnaCAqLworc3RhdGljIGludCBtZXRoX3NldGZkKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBwX3RjcCB0Y3AgPSAocF90Y3ApIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInRjcHthbnl9IiwgMSk7CisgICAgdGNwLT5zb2NrID0gKHRfc29ja2V0KSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOyAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZXRoX2RpcnR5KGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBwX3RjcCB0Y3AgPSAocF90Y3ApIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInRjcHthbnl9IiwgMSk7CisgICAgbHVhX3B1c2hib29sZWFuKEwsICFidWZmZXJfaXNlbXB0eSgmdGNwLT5idWYpKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogV2FpdHMgZm9yIGFuZCByZXR1cm5zIGEgY2xpZW50IG9iamVjdCBhdHRlbXB0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIAorKiBzZXJ2ZXIgb2JqZWN0IAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9hY2NlcHQobHVhX1N0YXRlICpMKQoreworICAgIHBfdGNwIHNlcnZlciA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidGNwe3NlcnZlcn0iLCAxKTsKKyAgICBwX3RpbWVvdXQgdG0gPSB0aW1lb3V0X21hcmtzdGFydCgmc2VydmVyLT50bSk7CisgICAgdF9zb2NrZXQgc29jazsKKyAgICBpbnQgZXJyID0gc29ja2V0X2FjY2VwdCgmc2VydmVyLT5zb2NrLCAmc29jaywgTlVMTCwgTlVMTCwgdG0pOworICAgIC8qIGlmIHN1Y2Nlc3NmdWwsIHB1c2ggY2xpZW50IHNvY2tldCAqLworICAgIGlmIChlcnIgPT0gSU9fRE9ORSkgeworICAgICAgICBwX3RjcCBjbG50ID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgICAgIGF1eGlsaWFyX3NldGNsYXNzKEwsICJ0Y3B7Y2xpZW50fSIsIC0xKTsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgZmllbGRzICovCisgICAgICAgIHNvY2tldF9zZXRub25ibG9ja2luZygmc29jayk7CisgICAgICAgIGNsbnQtPnNvY2sgPSBzb2NrOworICAgICAgICBpb19pbml0KCZjbG50LT5pbywgKHBfc2VuZCkgc29ja2V0X3NlbmQsIChwX3JlY3YpIHNvY2tldF9yZWN2LCAKKyAgICAgICAgICAgICAgICAocF9lcnJvcikgc29ja2V0X2lvZXJyb3IsICZjbG50LT5zb2NrKTsKKyAgICAgICAgdGltZW91dF9pbml0KCZjbG50LT50bSwgLTEsIC0xKTsKKyAgICAgICAgYnVmZmVyX2luaXQoJmNsbnQtPmJ1ZiwgJmNsbnQtPmlvLCAmY2xudC0+dG0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsgCisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIHNvY2tldF9zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBCaW5kcyBhbiBvYmplY3QgdG8gYW4gYWRkcmVzcyAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfYmluZChsdWFfU3RhdGUgKkwpCit7CisgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBhdXhpbGlhcl9jaGVja2NsYXNzKEwsICJ0Y3B7bWFzdGVyfSIsIDEpOworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAgbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyAgICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gKHVuc2lnbmVkIHNob3J0KSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworICAgIGNvbnN0IGNoYXIgKmVyciA9IGluZXRfdHJ5YmluZCgmdGNwLT5zb2NrLCBhZGRyZXNzLCBwb3J0KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBlcnIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFR1cm5zIGEgbWFzdGVyIHRjcCBvYmplY3QgaW50byBhIGNsaWVudCBvYmplY3QuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX2Nvbm5lY3QobHVhX1N0YXRlICpMKQoreworICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidGNwe2FueX0iLCAxKTsKKyAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIGx1YUxfY2hlY2tzdHJpbmcoTCwgMik7CisgICAgdW5zaWduZWQgc2hvcnQgcG9ydCA9ICh1bnNpZ25lZCBzaG9ydCkgbHVhTF9jaGVja251bWJlcihMLCAzKTsKKyAgICBwX3RpbWVvdXQgdG0gPSB0aW1lb3V0X21hcmtzdGFydCgmdGNwLT50bSk7CisgICAgY29uc3QgY2hhciAqZXJyID0gaW5ldF90cnljb25uZWN0KCZ0Y3AtPnNvY2ssIGFkZHJlc3MsIHBvcnQsIHRtKTsKKyAgICAvKiBoYXZlIHRvIHNldCB0aGUgY2xhc3MgZXZlbiBpZiBpdCBmYWlsZWQgZHVlIHRvIG5vbi1ibG9ja2luZyBjb25uZWN0cyAqLworICAgIGF1eGlsaWFyX3NldGNsYXNzKEwsICJ0Y3B7Y2xpZW50fSIsIDEpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIGVycik7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICAvKiB0dXJuIG1hc3RlciBvYmplY3QgaW50byBhIGNsaWVudCBvYmplY3QgKi8KKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQ2xvc2VzIHNvY2tldCB1c2VkIGJ5IG9iamVjdCAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfY2xvc2UobHVhX1N0YXRlICpMKQoreworICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidGNwe2FueX0iLCAxKTsKKyAgICBzb2NrZXRfZGVzdHJveSgmdGNwLT5zb2NrKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUHV0cyB0aGUgc29ja3QgaW4gbGlzdGVuIG1vZGUKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfbGlzdGVuKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBwX3RjcCB0Y3AgPSAocF90Y3ApIGF1eGlsaWFyX2NoZWNrY2xhc3MoTCwgInRjcHttYXN0ZXJ9IiwgMSk7CisgICAgaW50IGJhY2tsb2cgPSAoaW50KSBsdWFMX29wdG51bWJlcihMLCAyLCAzMik7CisgICAgaW50IGVyciA9IHNvY2tldF9saXN0ZW4oJnRjcC0+c29jaywgYmFja2xvZyk7CisgICAgaWYgKGVyciAhPSBJT19ET05FKSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBzb2NrZXRfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICAvKiB0dXJuIG1hc3RlciBvYmplY3QgaW50byBhIHNlcnZlciBvYmplY3QgKi8KKyAgICBhdXhpbGlhcl9zZXRjbGFzcyhMLCAidGNwe3NlcnZlcn0iLCAxKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogU2h1dHMgdGhlIGNvbm5lY3Rpb24gZG93biBwYXJ0aWFsbHkKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfc2h1dGRvd24obHVhX1N0YXRlICpMKQoreworICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidGNwe2NsaWVudH0iLCAxKTsKKyAgICBjb25zdCBjaGFyICpob3cgPSBsdWFMX29wdHN0cmluZyhMLCAyLCAiYm90aCIpOworICAgIHN3aXRjaCAoaG93WzBdKSB7CisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgaWYgKHN0cmNtcChob3csICJib3RoIikpIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBzb2NrZXRfc2h1dGRvd24oJnRjcC0+c29jaywgMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBpZiAoc3RyY21wKGhvdywgInNlbmQiKSkgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHNvY2tldF9zaHV0ZG93bigmdGNwLT5zb2NrLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIGlmIChzdHJjbXAoaG93LCAicmVjZWl2ZSIpKSBnb3RvIGVycm9yOworICAgICAgICAgICAgc29ja2V0X3NodXRkb3duKCZ0Y3AtPnNvY2ssIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGx1YV9wdXNobnVtYmVyKEwsIDEpOworICAgIHJldHVybiAxOworZXJyb3I6CisgICAgbHVhTF9hcmdlcnJvcihMLCAyLCAiaW52YWxpZCBzaHV0ZG93biBtZXRob2QiKTsKKyAgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSnVzdCBjYWxsIGluZXQgbWV0aG9kcworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9nZXRwZWVybmFtZShsdWFfU3RhdGUgKkwpCit7CisgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBhdXhpbGlhcl9jaGVja2dyb3VwKEwsICJ0Y3B7YW55fSIsIDEpOworICAgIHJldHVybiBpbmV0X21ldGhfZ2V0cGVlcm5hbWUoTCwgJnRjcC0+c29jayk7Cit9CisKK3N0YXRpYyBpbnQgbWV0aF9nZXRzb2NrbmFtZShsdWFfU3RhdGUgKkwpCit7CisgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBhdXhpbGlhcl9jaGVja2dyb3VwKEwsICJ0Y3B7YW55fSIsIDEpOworICAgIHJldHVybiBpbmV0X21ldGhfZ2V0c29ja25hbWUoTCwgJnRjcC0+c29jayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEp1c3QgY2FsbCB0bSBtZXRob2RzCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX3NldHRpbWVvdXQobHVhX1N0YXRlICpMKQoreworICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidGNwe2FueX0iLCAxKTsKKyAgICByZXR1cm4gdGltZW91dF9tZXRoX3NldHRpbWVvdXQoTCwgJnRjcC0+dG0pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBMaWJyYXJ5IGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIENyZWF0ZXMgYSBtYXN0ZXIgdGNwIG9iamVjdCAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGdsb2JhbF9jcmVhdGUobHVhX1N0YXRlICpMKQoreworICAgIHRfc29ja2V0IHNvY2s7CisgICAgY29uc3QgY2hhciAqZXJyID0gaW5ldF90cnljcmVhdGUoJnNvY2ssIFNPQ0tfU1RSRUFNKTsKKyAgICAvKiB0cnkgdG8gYWxsb2NhdGUgYSBzeXN0ZW0gc29ja2V0ICovCisgICAgaWYgKCFlcnIpIHsgCisgICAgICAgIC8qIGFsbG9jYXRlIHRjcCBvYmplY3QgKi8KKyAgICAgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgICAgIC8qIHNldCBpdHMgdHlwZSBhcyBtYXN0ZXIgb2JqZWN0ICovCisgICAgICAgIGF1eGlsaWFyX3NldGNsYXNzKEwsICJ0Y3B7bWFzdGVyfSIsIC0xKTsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSByZW1haW5pbmcgc3RydWN0dXJlIGZpZWxkcyAqLworICAgICAgICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoJnNvY2spOworICAgICAgICB0Y3AtPnNvY2sgPSBzb2NrOworICAgICAgICBpb19pbml0KCZ0Y3AtPmlvLCAocF9zZW5kKSBzb2NrZXRfc2VuZCwgKHBfcmVjdikgc29ja2V0X3JlY3YsIAorICAgICAgICAgICAgICAgIChwX2Vycm9yKSBzb2NrZXRfaW9lcnJvciwgJnRjcC0+c29jayk7CisgICAgICAgIHRpbWVvdXRfaW5pdCgmdGNwLT50bSwgLTEsIC0xKTsKKyAgICAgICAgYnVmZmVyX2luaXQoJnRjcC0+YnVmLCAmdGNwLT5pbywgJnRjcC0+dG0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy90Y3AuaCBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExMzU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdGNwLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBUQ1BfSAorI2RlZmluZSBUQ1BfSAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogVENQIG9iamVjdAorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBUaGUgdGNwLmggbW9kdWxlIGlzIGJhc2ljbHkgYSBnbHVlIHRoYXQgcHV0cyB0b2dldGhlciBtb2R1bGVzIGJ1ZmZlci5oLAorKiB0aW1lb3V0Lmggc29ja2V0LmggYW5kIGluZXQuaCB0byBwcm92aWRlIHRoZSBMdWFTb2NrZXQgVENQIChBRl9JTkVULAorKiBTT0NLX1NUUkVBTSkgc3VwcG9ydC4KKyoKKyogVGhyZWUgY2xhc3NlcyBhcmUgZGVmaW5lZDogbWFzdGVyLCBjbGllbnQgYW5kIHNlcnZlci4gVGhlIG1hc3RlciBjbGFzcyBpcworKiBhIG5ld2x5IGNyZWF0ZWQgdGNwIG9iamVjdCwgdGhhdCBoYXMgbm90IGJlZW4gYm91bmQgb3IgY29ubmVjdGVkLiBTZXJ2ZXIKKyogb2JqZWN0cyBhcmUgdGNwIG9iamVjdHMgYm91bmQgdG8gc29tZSBsb2NhbCBhZGRyZXNzLiBDbGllbnQgb2JqZWN0cyBhcmUKKyogdGNwIG9iamVjdHMgZWl0aGVyIGNvbm5lY3RlZCB0byBzb21lIGFkZHJlc3Mgb3IgcmV0dXJuZWQgYnkgdGhlIGFjY2VwdAorKiBtZXRob2Qgb2YgYSBzZXJ2ZXIgb2JqZWN0LgorKgorKiBSQ1MgSUQ6ICRJZDogdGNwLmgsdiAxLjcgMjAwNS8xMC8wNyAwNDo0MDo1OSBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInRpbWVvdXQuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgdF90Y3BfIHsKKyAgICB0X3NvY2tldCBzb2NrOworICAgIHRfaW8gaW87CisgICAgdF9idWZmZXIgYnVmOworICAgIHRfdGltZW91dCB0bTsKK30gdF90Y3A7CisKK3R5cGVkZWYgdF90Y3AgKnBfdGNwOworCitpbnQgdGNwX29wZW4obHVhX1N0YXRlICpMKTsKKworI2VuZGlmIC8qIFRDUF9IICovCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvc3JjL3RpbWVvdXQuYyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdGltZW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZGYxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3RpbWVvdXQuYwpAQCAtMCwwICsxLDIwNyBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogVGltZW91dCBtYW5hZ2VtZW50IGZ1bmN0aW9ucworKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBSQ1MgSUQ6ICRJZDogdGltZW91dC5jLHYgMS4zMCAyMDA1LzEwLzA3IDA0OjQwOjU5IGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKKyNpbmNsdWRlICJhdXhpbGlhci5oIgorI2luY2x1ZGUgInRpbWVvdXQuaCIKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworLyogbWluIGFuZCBtYXggbWFjcm9zICovCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oeCwgeSkgKCh4KSA8ICh5KSA/IHggOiB5KQorI2VuZGlmCisjaWZuZGVmIE1BWAorI2RlZmluZSBNQVgoeCwgeSkgKCh4KSA+ICh5KSA/IHggOiB5KQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHRpbWVvdXRfbHVhX2dldHRpbWUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgdGltZW91dF9sdWFfc2xlZXAobHVhX1N0YXRlICpMKTsKKworc3RhdGljIGx1YUxfcmVnIGZ1bmNbXSA9IHsKKyAgICB7ICJnZXR0aW1lIiwgdGltZW91dF9sdWFfZ2V0dGltZSB9LAorICAgIHsgInNsZWVwIiwgdGltZW91dF9sdWFfc2xlZXAgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogRXhwb3J0ZWQgZnVuY3Rpb25zLgorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEluaXRpYWxpemUgc3RydWN0dXJlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCB0aW1lb3V0X2luaXQocF90aW1lb3V0IHRtLCBkb3VibGUgYmxvY2ssIGRvdWJsZSB0b3RhbCkgeworICAgIHRtLT5ibG9jayA9IGJsb2NrOworICAgIHRtLT50b3RhbCA9IHRvdGFsOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBEZXRlcm1pbmVzIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSBsZWZ0IGZvciB0aGUgbmV4dCBzeXN0ZW0gY2FsbCwKKyogaWYgdGhlIHByZXZpb3VzIGNhbGwgd2FzIHN1Y2Nlc3NmdWwgCisqIElucHV0CisqICAgdG06IHRpbWVvdXQgY29udHJvbCBzdHJ1Y3R1cmUKKyogUmV0dXJucworKiAgIHRoZSBudW1iZXIgb2YgbXMgbGVmdCBvciAtMSBpZiB0aGVyZSBpcyBubyB0aW1lIGxpbWl0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZG91YmxlIHRpbWVvdXRfZ2V0KHBfdGltZW91dCB0bSkgeworICAgIGlmICh0bS0+YmxvY2sgPCAwLjAgJiYgdG0tPnRvdGFsIDwgMC4wKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKHRtLT5ibG9jayA8IDAuMCkgeworICAgICAgICBkb3VibGUgdCA9IHRtLT50b3RhbCAtIHRpbWVvdXRfZ2V0dGltZSgpICsgdG0tPnN0YXJ0OworICAgICAgICByZXR1cm4gTUFYKHQsIDAuMCk7CisgICAgfSBlbHNlIGlmICh0bS0+dG90YWwgPCAwLjApIHsKKyAgICAgICAgcmV0dXJuIHRtLT5ibG9jazsKKyAgICB9IGVsc2UgeworICAgICAgICBkb3VibGUgdCA9IHRtLT50b3RhbCAtIHRpbWVvdXRfZ2V0dGltZSgpICsgdG0tPnN0YXJ0OworICAgICAgICByZXR1cm4gTUlOKHRtLT5ibG9jaywgTUFYKHQsIDAuMCkpOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUmV0dXJucyB0aW1lIHNpbmNlIHN0YXJ0IG9mIG9wZXJhdGlvbgorKiBJbnB1dAorKiAgIHRtOiB0aW1lb3V0IGNvbnRyb2wgc3RydWN0dXJlCisqIFJldHVybnMKKyogICBzdGFydCBmaWVsZCBvZiBzdHJ1Y3R1cmUKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitkb3VibGUgdGltZW91dF9nZXRzdGFydChwX3RpbWVvdXQgdG0pIHsKKyAgICByZXR1cm4gdG0tPnN0YXJ0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBEZXRlcm1pbmVzIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSBsZWZ0IGZvciB0aGUgbmV4dCBzeXN0ZW0gY2FsbCwKKyogaWYgdGhlIHByZXZpb3VzIGNhbGwgd2FzIGEgZmFpbHVyZQorKiBJbnB1dAorKiAgIHRtOiB0aW1lb3V0IGNvbnRyb2wgc3RydWN0dXJlCisqIFJldHVybnMKKyogICB0aGUgbnVtYmVyIG9mIG1zIGxlZnQgb3IgLTEgaWYgdGhlcmUgaXMgbm8gdGltZSBsaW1pdAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2RvdWJsZSB0aW1lb3V0X2dldHJldHJ5KHBfdGltZW91dCB0bSkgeworICAgIGlmICh0bS0+YmxvY2sgPCAwLjAgJiYgdG0tPnRvdGFsIDwgMC4wKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKHRtLT5ibG9jayA8IDAuMCkgeworICAgICAgICBkb3VibGUgdCA9IHRtLT50b3RhbCAtIHRpbWVvdXRfZ2V0dGltZSgpICsgdG0tPnN0YXJ0OworICAgICAgICByZXR1cm4gTUFYKHQsIDAuMCk7CisgICAgfSBlbHNlIGlmICh0bS0+dG90YWwgPCAwLjApIHsKKyAgICAgICAgZG91YmxlIHQgPSB0bS0+YmxvY2sgLSB0aW1lb3V0X2dldHRpbWUoKSArIHRtLT5zdGFydDsKKyAgICAgICAgcmV0dXJuIE1BWCh0LCAwLjApOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZSB0ID0gdG0tPnRvdGFsIC0gdGltZW91dF9nZXR0aW1lKCkgKyB0bS0+c3RhcnQ7CisgICAgICAgIHJldHVybiBNSU4odG0tPmJsb2NrLCBNQVgodCwgMC4wKSk7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBNYXJrcyB0aGUgb3BlcmF0aW9uIHN0YXJ0IHRpbWUgaW4gc3RydWN0dXJlIAorKiBJbnB1dAorKiAgIHRtOiB0aW1lb3V0IGNvbnRyb2wgc3RydWN0dXJlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcF90aW1lb3V0IHRpbWVvdXRfbWFya3N0YXJ0KHBfdGltZW91dCB0bSkgeworICAgIHRtLT5zdGFydCA9IHRpbWVvdXRfZ2V0dGltZSgpOworICAgIHJldHVybiB0bTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogR2V0cyB0aW1lIGluIHMsIHJlbGF0aXZlIHRvIEphbnVhcnkgMSwgMTk3MCAoVVRDKSAKKyogUmV0dXJucworKiAgIHRpbWUgaW4gcy4KK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgX1dJTjMyCitkb3VibGUgdGltZW91dF9nZXR0aW1lKHZvaWQpIHsKKyAgICBGSUxFVElNRSBmdDsKKyAgICBkb3VibGUgdDsKKyAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOworICAgIC8qIFdpbmRvd3MgZmlsZSB0aW1lICh0aW1lIHNpbmNlIEphbnVhcnkgMSwgMTYwMSAoVVRDKSkgKi8KKyAgICB0ICA9IGZ0LmR3TG93RGF0ZVRpbWUvMS4wZTcgKyBmdC5kd0hpZ2hEYXRlVGltZSooNDI5NDk2NzI5Ni4wLzEuMGU3KTsKKyAgICAvKiBjb252ZXJ0IHRvIFVuaXggRXBvY2ggdGltZSAodGltZSBzaW5jZSBKYW51YXJ5IDEsIDE5NzAgKFVUQykpICovCisgICAgcmV0dXJuICh0IC0gMTE2NDQ0NzM2MDAuMCk7Cit9CisjZWxzZQorZG91YmxlIHRpbWVvdXRfZ2V0dGltZSh2b2lkKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdjsKKyAgICBnZXR0aW1lb2ZkYXkoJnYsIChzdHJ1Y3QgdGltZXpvbmUgKikgTlVMTCk7CisgICAgLyogVW5peCBFcG9jaCB0aW1lICh0aW1lIHNpbmNlIEphbnVhcnkgMSwgMTk3MCAoVVRDKSkgKi8KKyAgICByZXR1cm4gdi50dl9zZWMgKyB2LnR2X3VzZWMvMS4wZTY7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgbW9kdWxlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHRpbWVvdXRfb3BlbihsdWFfU3RhdGUgKkwpIHsKKyAgICBsdWFMX29wZW5saWIoTCwgTlVMTCwgZnVuYywgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNldHMgdGltZW91dCB2YWx1ZXMgZm9yIElPIG9wZXJhdGlvbnMKKyogTHVhIElucHV0OiBiYXNlLCB0aW1lIFssIG1vZGVdCisqICAgdGltZTogdGltZSBvdXQgdmFsdWUgaW4gc2Vjb25kcworKiAgIG1vZGU6ICJiIiBmb3IgYmxvY2sgdGltZW91dCwgInQiIGZvciB0b3RhbCB0aW1lb3V0LiAoZGVmYXVsdDogYikKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgdGltZW91dF9tZXRoX3NldHRpbWVvdXQobHVhX1N0YXRlICpMLCBwX3RpbWVvdXQgdG0pIHsKKyAgICBkb3VibGUgdCA9IGx1YUxfb3B0bnVtYmVyKEwsIDIsIC0xKTsKKyAgICBjb25zdCBjaGFyICptb2RlID0gbHVhTF9vcHRzdHJpbmcoTCwgMywgImIiKTsKKyAgICBzd2l0Y2ggKCptb2RlKSB7CisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgdG0tPmJsb2NrID0gdDsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6IGNhc2UgJ3QnOgorICAgICAgICAgICAgdG0tPnRvdGFsID0gdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbHVhTF9hcmdjaGVjayhMLCAwLCAzLCAiaW52YWxpZCB0aW1lb3V0IG1vZGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogVGVzdCBzdXBwb3J0IGZ1bmN0aW9ucworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJldHVybnMgdGhlIHRpbWUgdGhlIHN5c3RlbSBoYXMgYmVlbiB1cCwgaW4gc2VjY29uZHMuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB0aW1lb3V0X2x1YV9nZXR0aW1lKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBsdWFfcHVzaG51bWJlcihMLCB0aW1lb3V0X2dldHRpbWUoKSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNsZWVwIGZvciBuIHNlY29uZHMuCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHRpbWVvdXRfbHVhX3NsZWVwKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICBkb3VibGUgbiA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisjaWZkZWYgX1dJTjMyCisgICAgU2xlZXAoKGludCkobioxMDAwKSk7CisjZWxzZQorICAgIHN0cnVjdCB0aW1lc3BlYyB0LCByOworICAgIHQudHZfc2VjID0gKGludCkgbjsKKyAgICBuIC09IHQudHZfc2VjOworICAgIHQudHZfbnNlYyA9IChpbnQpIChuICogMTAwMDAwMDAwMCk7CisgICAgaWYgKHQudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB0LnR2X25zZWMgPSA5OTk5OTk5OTk7CisgICAgd2hpbGUgKG5hbm9zbGVlcCgmdCwgJnIpICE9IDApIHsKKyAgICAgICAgdC50dl9zZWMgPSByLnR2X3NlYzsKKyAgICAgICAgdC50dl9uc2VjID0gci50dl9uc2VjOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy90aW1lb3V0LmggYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3RpbWVvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ4OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy90aW1lb3V0LmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBUSU1FT1VUX0gKKyNkZWZpbmUgVElNRU9VVF9ICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBUaW1lb3V0IG1hbmFnZW1lbnQgZnVuY3Rpb25zCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFJDUyBJRDogJElkOiB0aW1lb3V0LmgsdiAxLjE0IDIwMDUvMTAvMDcgMDQ6NDA6NTkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSAibHVhLmgiCisKKy8qIHRpbWVvdXQgY29udHJvbCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHRfdGltZW91dF8geworICAgIGRvdWJsZSBibG9jazsgICAgICAgICAgLyogbWF4aW11bSB0aW1lIGZvciBibG9ja2luZyBjYWxscyAqLworICAgIGRvdWJsZSB0b3RhbDsgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIG1pbGlzZWNvbmRzIGZvciBvcGVyYXRpb24gKi8KKyAgICBkb3VibGUgc3RhcnQ7ICAgICAgICAgIC8qIHRpbWUgb2Ygc3RhcnQgb2Ygb3BlcmF0aW9uICovCit9IHRfdGltZW91dDsKK3R5cGVkZWYgdF90aW1lb3V0ICpwX3RpbWVvdXQ7CisKK2ludCB0aW1lb3V0X29wZW4obHVhX1N0YXRlICpMKTsKK3ZvaWQgdGltZW91dF9pbml0KHBfdGltZW91dCB0bSwgZG91YmxlIGJsb2NrLCBkb3VibGUgdG90YWwpOworZG91YmxlIHRpbWVvdXRfZ2V0KHBfdGltZW91dCB0bSk7Citkb3VibGUgdGltZW91dF9nZXRyZXRyeShwX3RpbWVvdXQgdG0pOworcF90aW1lb3V0IHRpbWVvdXRfbWFya3N0YXJ0KHBfdGltZW91dCB0bSk7Citkb3VibGUgdGltZW91dF9nZXRzdGFydChwX3RpbWVvdXQgdG0pOworZG91YmxlIHRpbWVvdXRfZ2V0dGltZSh2b2lkKTsKK2ludCB0aW1lb3V0X21ldGhfc2V0dGltZW91dChsdWFfU3RhdGUgKkwsIHBfdGltZW91dCB0bSk7CisKKyNkZWZpbmUgdGltZW91dF9pc3plcm8odG0pICAgKCh0bSktPmJsb2NrID09IDAuMCkKKworI2VuZGlmIC8qIFRJTUVPVVRfSCAqLwpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy90cC5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3RwLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjgzODY5Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy90cC5sdWEKQEAgLTAsMCArMSwxMjMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBVbmlmaWVkIFNNVFAvRlRQIHN1YnN5c3RlbQorLS0gTHVhU29ja2V0IHRvb2xraXQuCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogdHAubHVhLHYgMS4yMiAyMDA2LzAzLzE0IDA5OjA0OjE1IGRpZWdvIEV4cCAkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gRGVjbGFyZSBtb2R1bGUgYW5kIGltcG9ydCBkZXBlbmRlbmNpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBiYXNlID0gX0cKK2xvY2FsIHN0cmluZyA9IHJlcXVpcmUoInN0cmluZyIpCitsb2NhbCBzb2NrZXQgPSByZXF1aXJlKCJzb2NrZXQiKQorbG9jYWwgbHRuMTIgPSByZXF1aXJlKCJsdG4xMiIpCittb2R1bGUoInNvY2tldC50cCIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQcm9ncmFtIGNvbnN0YW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RJTUVPVVQgPSA2MAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gSW1wbGVtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBnZXRzIHNlcnZlciByZXBseSAod29ya3MgZm9yIFNNVFAgYW5kIEZUUCkKK2xvY2FsIGZ1bmN0aW9uIGdldF9yZXBseShjKQorICAgIGxvY2FsIGNvZGUsIGN1cnJlbnQsIHNlcAorICAgIGxvY2FsIGxpbmUsIGVyciA9IGM6cmVjZWl2ZSgpCisgICAgbG9jYWwgcmVwbHkgPSBsaW5lCisgICAgaWYgZXJyIHRoZW4gcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgIGNvZGUsIHNlcCA9IHNvY2tldC5za2lwKDIsIHN0cmluZy5maW5kKGxpbmUsICJeKCVkJWQlZCkoLj8pIikpCisgICAgaWYgbm90IGNvZGUgdGhlbiByZXR1cm4gbmlsLCAiaW52YWxpZCBzZXJ2ZXIgcmVwbHkiIGVuZAorICAgIGlmIHNlcCA9PSAiLSIgdGhlbiAtLSByZXBseSBpcyBtdWx0aWxpbmUKKyAgICAgICAgcmVwZWF0CisgICAgICAgICAgICBsaW5lLCBlcnIgPSBjOnJlY2VpdmUoKQorICAgICAgICAgICAgaWYgZXJyIHRoZW4gcmV0dXJuIG5pbCwgZXJyIGVuZAorICAgICAgICAgICAgY3VycmVudCwgc2VwID0gc29ja2V0LnNraXAoMiwgc3RyaW5nLmZpbmQobGluZSwgIl4oJWQlZCVkKSguPykiKSkKKyAgICAgICAgICAgIHJlcGx5ID0gcmVwbHkgLi4gIlxuIiAuLiBsaW5lCisgICAgICAgIC0tIHJlcGx5IGVuZHMgd2l0aCBzYW1lIGNvZGUKKyAgICAgICAgdW50aWwgY29kZSA9PSBjdXJyZW50IGFuZCBzZXAgPT0gIiAiCisgICAgZW5kCisgICAgcmV0dXJuIGNvZGUsIHJlcGx5CitlbmQKKworLS0gbWV0YXRhYmxlIGZvciBzb2NrIG9iamVjdAorbG9jYWwgbWV0YXQgPSB7IF9faW5kZXggPSB7fSB9CisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6Y2hlY2sob2spCisgICAgbG9jYWwgY29kZSwgcmVwbHkgPSBnZXRfcmVwbHkoc2VsZi5jKQorICAgIGlmIG5vdCBjb2RlIHRoZW4gcmV0dXJuIG5pbCwgcmVwbHkgZW5kCisgICAgaWYgYmFzZS50eXBlKG9rKSB+PSAiZnVuY3Rpb24iIHRoZW4KKyAgICAgICAgaWYgYmFzZS50eXBlKG9rKSA9PSAidGFibGUiIHRoZW4KKyAgICAgICAgICAgIGZvciBpLCB2IGluIGJhc2UuaXBhaXJzKG9rKSBkbworICAgICAgICAgICAgICAgIGlmIHN0cmluZy5maW5kKGNvZGUsIHYpIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UudG9udW1iZXIoY29kZSksIHJlcGx5CisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIHJldHVybiBuaWwsIHJlcGx5CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIHN0cmluZy5maW5kKGNvZGUsIG9rKSB0aGVuIHJldHVybiBiYXNlLnRvbnVtYmVyKGNvZGUpLCByZXBseQorICAgICAgICAgICAgZWxzZSByZXR1cm4gbmlsLCByZXBseSBlbmQKKyAgICAgICAgZW5kCisgICAgZWxzZSByZXR1cm4gb2soYmFzZS50b251bWJlcihjb2RlKSwgcmVwbHkpIGVuZAorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6Y29tbWFuZChjbWQsIGFyZykKKyAgICBpZiBhcmcgdGhlbgorICAgICAgICByZXR1cm4gc2VsZi5jOnNlbmQoY21kIC4uICIgIiAuLiBhcmcuLiAiXHJcbiIpCisgICAgZWxzZQorICAgICAgICByZXR1cm4gc2VsZi5jOnNlbmQoY21kIC4uICJcclxuIikKKyAgICBlbmQKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnNpbmsoc25rLCBwYXQpCisgICAgbG9jYWwgY2h1bmssIGVyciA9IGM6cmVjZWl2ZShwYXQpCisgICAgcmV0dXJuIHNuayhjaHVuaywgZXJyKQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6c2VuZChkYXRhKQorICAgIHJldHVybiBzZWxmLmM6c2VuZChkYXRhKQorZW5kCisKK2Z1bmN0aW9uIG1ldGF0Ll9faW5kZXg6cmVjZWl2ZShwYXQpCisgICAgcmV0dXJuIHNlbGYuYzpyZWNlaXZlKHBhdCkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmdldGZkKCkKKyAgICByZXR1cm4gc2VsZi5jOmdldGZkKCkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmRpcnR5KCkKKyAgICByZXR1cm4gc2VsZi5jOmRpcnR5KCkKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmdldGNvbnRyb2woKQorICAgIHJldHVybiBzZWxmLmMKK2VuZAorCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OnNvdXJjZShzb3VyY2UsIHN0ZXApCisgICAgbG9jYWwgc2luayA9IHNvY2tldC5zaW5rKCJrZWVwLW9wZW4iLCBzZWxmLmMpCisgICAgbG9jYWwgcmV0LCBlcnIgPSBsdG4xMi5wdW1wLmFsbChzb3VyY2UsIHNpbmssIHN0ZXAgb3IgbHRuMTIucHVtcC5zdGVwKQorICAgIHJldHVybiByZXQsIGVycgorZW5kCisKKy0tIGNsb3NlcyB0aGUgdW5kZXJseWluZyBjCitmdW5jdGlvbiBtZXRhdC5fX2luZGV4OmNsb3NlKCkKKyAgICBzZWxmLmM6Y2xvc2UoKQorCXJldHVybiAxCitlbmQKKworLS0gY29ubmVjdCB3aXRoIHNlcnZlciBhbmQgcmV0dXJuIGMgb2JqZWN0CitmdW5jdGlvbiBjb25uZWN0KGhvc3QsIHBvcnQsIHRpbWVvdXQsIGNyZWF0ZSkKKyAgICBsb2NhbCBjLCBlID0gKGNyZWF0ZSBvciBzb2NrZXQudGNwKSgpCisgICAgaWYgbm90IGMgdGhlbiByZXR1cm4gbmlsLCBlIGVuZAorICAgIGM6c2V0dGltZW91dCh0aW1lb3V0IG9yIFRJTUVPVVQpCisgICAgbG9jYWwgciwgZSA9IGM6Y29ubmVjdChob3N0LCBwb3J0KQorICAgIGlmIG5vdCByIHRoZW4KKyAgICAgICAgYzpjbG9zZSgpCisgICAgICAgIHJldHVybiBuaWwsIGUKKyAgICBlbmQKKyAgICByZXR1cm4gYmFzZS5zZXRtZXRhdGFibGUoe2MgPSBjfSwgbWV0YXQpCitlbmQKKwpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy91ZHAuYyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyNWFhMAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdWRwLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIFVEUCBvYmplY3QgCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFJDUyBJRDogJElkOiB1ZHAuYyx2IDEuMjkgMjAwNS8xMC8wNyAwNDo0MDo1OSBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gCisKKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKKyNpbmNsdWRlICJhdXhpbGlhci5oIgorI2luY2x1ZGUgInNvY2tldC5oIgorI2luY2x1ZGUgImluZXQuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAidWRwLmgiCisKKy8qIG1pbiBhbmQgbWF4IG1hY3JvcyAqLworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyB4IDogeSkKKyNlbmRpZiAKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWCh4LCB5KSAoKHgpID4gKHkpID8geCA6IHkpCisjZW5kaWYgCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IGdsb2JhbF9jcmVhdGUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9zZW5kKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfc2VuZHRvKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfcmVjZWl2ZShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3JlY2VpdmVmcm9tKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfZ2V0c29ja25hbWUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9nZXRwZWVybmFtZShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NldHNvY2tuYW1lKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfc2V0cGVlcm5hbWUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9jbG9zZShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NldG9wdGlvbihsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NldHRpbWVvdXQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9nZXRmZChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NldGZkKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfZGlydHkobHVhX1N0YXRlICpMKTsKKworLyogdWRwIG9iamVjdCBtZXRob2RzICovCitzdGF0aWMgbHVhTF9yZWcgdWRwW10gPSB7CisgICAgeyJfX2djIiwgICAgICAgIG1ldGhfY2xvc2V9LAorICAgIHsiX190b3N0cmluZyIsICBhdXhpbGlhcl90b3N0cmluZ30sCisgICAgeyJjbG9zZSIsICAgICAgIG1ldGhfY2xvc2V9LAorICAgIHsiZGlydHkiLCAgICAgICBtZXRoX2RpcnR5fSwKKyAgICB7ImdldGZkIiwgICAgICAgbWV0aF9nZXRmZH0sCisgICAgeyJnZXRwZWVybmFtZSIsIG1ldGhfZ2V0cGVlcm5hbWV9LAorICAgIHsiZ2V0c29ja25hbWUiLCBtZXRoX2dldHNvY2tuYW1lfSwKKyAgICB7InJlY2VpdmUiLCAgICAgbWV0aF9yZWNlaXZlfSwKKyAgICB7InJlY2VpdmVmcm9tIiwgbWV0aF9yZWNlaXZlZnJvbX0sCisgICAgeyJzZW5kIiwgICAgICAgIG1ldGhfc2VuZH0sCisgICAgeyJzZW5kdG8iLCAgICAgIG1ldGhfc2VuZHRvfSwKKyAgICB7InNldGZkIiwgICAgICAgbWV0aF9zZXRmZH0sCisgICAgeyJzZXRvcHRpb24iLCAgIG1ldGhfc2V0b3B0aW9ufSwKKyAgICB7InNldHBlZXJuYW1lIiwgbWV0aF9zZXRwZWVybmFtZX0sCisgICAgeyJzZXRzb2NrbmFtZSIsIG1ldGhfc2V0c29ja25hbWV9LAorICAgIHsic2V0dGltZW91dCIsICBtZXRoX3NldHRpbWVvdXR9LAorICAgIHtOVUxMLCAgICAgICAgICBOVUxMfQorfTsKKworLyogc29ja2V0IG9wdGlvbnMgKi8KK3N0YXRpYyB0X29wdCBvcHRbXSA9IHsKKyAgICB7ImRvbnRyb3V0ZSIsICAgICAgICAgIG9wdF9kb250cm91dGV9LAorICAgIHsiYnJvYWRjYXN0IiwgICAgICAgICAgb3B0X2Jyb2FkY2FzdH0sCisgICAgeyJyZXVzZWFkZHIiLCAgICAgICAgICBvcHRfcmV1c2VhZGRyfSwKKyAgICB7ImlwLW11bHRpY2FzdC10dGwiLCAgIG9wdF9pcF9tdWx0aWNhc3RfdHRsfSwKKyAgICB7ImlwLW11bHRpY2FzdC1sb29wIiwgIG9wdF9pcF9tdWx0aWNhc3RfbG9vcH0sCisgICAgeyJpcC1hZGQtbWVtYmVyc2hpcCIsICBvcHRfaXBfYWRkX21lbWJlcnNoaXB9LAorICAgIHsiaXAtZHJvcC1tZW1iZXJzaGlwIiwgb3B0X2lwX2Ryb3BfbWVtYmVyc2lwfSwKKyAgICB7TlVMTCwgICAgICAgICAgTlVMTH0KK307CisKKy8qIGZ1bmN0aW9ucyBpbiBsaWJyYXJ5IG5hbWVzcGFjZSAqLworc3RhdGljIGx1YUxfcmVnIGZ1bmNbXSA9IHsKKyAgICB7InVkcCIsIGdsb2JhbF9jcmVhdGV9LAorICAgIHtOVUxMLCBOVUxMfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgbW9kdWxlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHVkcF9vcGVuKGx1YV9TdGF0ZSAqTCkKK3sKKyAgICAvKiBjcmVhdGUgY2xhc3NlcyAqLworICAgIGF1eGlsaWFyX25ld2NsYXNzKEwsICJ1ZHB7Y29ubmVjdGVkfSIsIHVkcCk7CisgICAgYXV4aWxpYXJfbmV3Y2xhc3MoTCwgInVkcHt1bmNvbm5lY3RlZH0iLCB1ZHApOworICAgIC8qIGNyZWF0ZSBjbGFzcyBncm91cHMgKi8KKyAgICBhdXhpbGlhcl9hZGQyZ3JvdXAoTCwgInVkcHtjb25uZWN0ZWR9IiwgICAidWRwe2FueX0iKTsKKyAgICBhdXhpbGlhcl9hZGQyZ3JvdXAoTCwgInVkcHt1bmNvbm5lY3RlZH0iLCAidWRwe2FueX0iKTsKKyAgICBhdXhpbGlhcl9hZGQyZ3JvdXAoTCwgInVkcHtjb25uZWN0ZWR9IiwgICAic2VsZWN0e2FibGV9Iik7CisgICAgYXV4aWxpYXJfYWRkMmdyb3VwKEwsICJ1ZHB7dW5jb25uZWN0ZWR9IiwgInNlbGVjdHthYmxlfSIpOworICAgIC8qIGRlZmluZSBsaWJyYXJ5IGZ1bmN0aW9ucyAqLworICAgIGx1YUxfb3BlbmxpYihMLCBOVUxMLCBmdW5jLCAwKTsgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEx1YSBtZXRob2RzCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY29uc3QgY2hhciAqdWRwX3N0cmVycm9yKGludCBlcnIpIHsKKyAgICAvKiBhICdjbG9zZWQnIGVycm9yIG9uIGFuIHVuY29ubmVjdGVkIG1lYW5zIHRoZSB0YXJnZXQgYWRkcmVzcyB3YXMgbm90CisgICAgICogYWNjZXB0ZWQgYnkgdGhlIHRyYW5zcG9ydCBsYXllciAqLworICAgIGlmIChlcnIgPT0gSU9fQ0xPU0VEKSByZXR1cm4gInJlZnVzZWQiOworICAgIGVsc2UgcmV0dXJuIHNvY2tldF9zdHJlcnJvcihlcnIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBTZW5kIGRhdGEgdGhyb3VnaCBjb25uZWN0ZWQgdWRwIHNvY2tldAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9zZW5kKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdWRwIHVkcCA9IChwX3VkcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidWRwe2Nvbm5lY3RlZH0iLCAxKTsKKyAgICBwX3RpbWVvdXQgdG0gPSAmdWRwLT50bTsKKyAgICBzaXplX3QgY291bnQsIHNlbnQgPSAwOworICAgIGludCBlcnI7CisgICAgY29uc3QgY2hhciAqZGF0YSA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDIsICZjb3VudCk7CisgICAgdGltZW91dF9tYXJrc3RhcnQodG0pOworICAgIGVyciA9IHNvY2tldF9zZW5kKCZ1ZHAtPnNvY2ssIGRhdGEsIGNvdW50LCAmc2VudCwgdG0pOworICAgIGlmIChlcnIgIT0gSU9fRE9ORSkgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgdWRwX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgbHVhX3B1c2hudW1iZXIoTCwgc2VudCk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNlbmQgZGF0YSB0aHJvdWdoIHVuY29ubmVjdGVkIHVkcCBzb2NrZXQKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfc2VuZHRvKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdWRwIHVkcCA9IChwX3VkcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidWRwe3VuY29ubmVjdGVkfSIsIDEpOworICAgIHNpemVfdCBjb3VudCwgc2VudCA9IDA7CisgICAgY29uc3QgY2hhciAqZGF0YSA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDIsICZjb3VudCk7CisgICAgY29uc3QgY2hhciAqaXAgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDMpOworICAgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSAodW5zaWduZWQgc2hvcnQpIGx1YUxfY2hlY2tudW1iZXIoTCwgNCk7CisgICAgcF90aW1lb3V0IHRtID0gJnVkcC0+dG07CisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgaW50IGVycjsKKyAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisgICAgaWYgKCFpbmV0X2F0b24oaXAsICZhZGRyLnNpbl9hZGRyKSkgCisgICAgICAgIGx1YUxfYXJnZXJyb3IoTCwgMywgImludmFsaWQgaXAgYWRkcmVzcyIpOworICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIHRpbWVvdXRfbWFya3N0YXJ0KHRtKTsKKyAgICBlcnIgPSBzb2NrZXRfc2VuZHRvKCZ1ZHAtPnNvY2ssIGRhdGEsIGNvdW50LCAmc2VudCwgCisgICAgICAgICAgICAoU0EgKikgJmFkZHIsIHNpemVvZihhZGRyKSwgdG0pOworICAgIGlmIChlcnIgIT0gSU9fRE9ORSkgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgdWRwX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgbHVhX3B1c2hudW1iZXIoTCwgc2VudCk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJlY2VpdmVzIGRhdGEgZnJvbSBhIFVEUCBzb2NrZXQKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfcmVjZWl2ZShsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VkcCB1ZHAgPSAocF91ZHApIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVkcHthbnl9IiwgMSk7CisgICAgY2hhciBidWZmZXJbVURQX0RBVEFHUkFNU0laRV07CisgICAgc2l6ZV90IGdvdCwgY291bnQgPSAoc2l6ZV90KSBsdWFMX29wdG51bWJlcihMLCAyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgaW50IGVycjsKKyAgICBwX3RpbWVvdXQgdG0gPSAmdWRwLT50bTsKKyAgICBjb3VudCA9IE1JTihjb3VudCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHRpbWVvdXRfbWFya3N0YXJ0KHRtKTsKKyAgICBlcnIgPSBzb2NrZXRfcmVjdigmdWRwLT5zb2NrLCBidWZmZXIsIGNvdW50LCAmZ290LCB0bSk7CisgICAgaWYgKGVyciAhPSBJT19ET05FKSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCB1ZHBfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBsdWFfcHVzaGxzdHJpbmcoTCwgYnVmZmVyLCBnb3QpOworICAgIHJldHVybiAxOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBSZWNlaXZlcyBkYXRhIGFuZCBzZW5kZXIgZnJvbSBhIFVEUCBzb2NrZXQKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfcmVjZWl2ZWZyb20obHVhX1N0YXRlICpMKSB7CisgICAgcF91ZHAgdWRwID0gKHBfdWRwKSBhdXhpbGlhcl9jaGVja2NsYXNzKEwsICJ1ZHB7dW5jb25uZWN0ZWR9IiwgMSk7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgc29ja2xlbl90IGFkZHJfbGVuID0gc2l6ZW9mKGFkZHIpOworICAgIGNoYXIgYnVmZmVyW1VEUF9EQVRBR1JBTVNJWkVdOworICAgIHNpemVfdCBnb3QsIGNvdW50ID0gKHNpemVfdCkgbHVhTF9vcHRudW1iZXIoTCwgMiwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIGludCBlcnI7CisgICAgcF90aW1lb3V0IHRtID0gJnVkcC0+dG07CisgICAgdGltZW91dF9tYXJrc3RhcnQodG0pOworICAgIGNvdW50ID0gTUlOKGNvdW50LCBzaXplb2YoYnVmZmVyKSk7CisgICAgZXJyID0gc29ja2V0X3JlY3Zmcm9tKCZ1ZHAtPnNvY2ssIGJ1ZmZlciwgY291bnQsICZnb3QsIAorICAgICAgICAgICAgKFNBICopICZhZGRyLCAmYWRkcl9sZW4sIHRtKTsKKyAgICBpZiAoZXJyID09IElPX0RPTkUpIHsKKyAgICAgICAgbHVhX3B1c2hsc3RyaW5nKEwsIGJ1ZmZlciwgZ290KTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgaW5ldF9udG9hKGFkZHIuc2luX2FkZHIpKTsKKyAgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgbnRvaHMoYWRkci5zaW5fcG9ydCkpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9IGVsc2UgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgdWRwX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNlbGVjdCBzdXBwb3J0IG1ldGhvZHMKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfZ2V0ZmQobHVhX1N0YXRlICpMKSB7CisgICAgcF91ZHAgdWRwID0gKHBfdWRwKSBhdXhpbGlhcl9jaGVja2dyb3VwKEwsICJ1ZHB7YW55fSIsIDEpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIChpbnQpIHVkcC0+c29jayk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIHRoaXMgaXMgdmVyeSBkYW5nZXJvdXMsIGJ1dCBjYW4gYmUgaGFuZHkgZm9yIHRob3NlIHRoYXQgYXJlIGJyYXZlIGVub3VnaCAqLworc3RhdGljIGludCBtZXRoX3NldGZkKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdWRwIHVkcCA9IChwX3VkcCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidWRwe2FueX0iLCAxKTsKKyAgICB1ZHAtPnNvY2sgPSAodF9zb2NrZXQpIGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWV0aF9kaXJ0eShsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VkcCB1ZHAgPSAocF91ZHApIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVkcHthbnl9IiwgMSk7CisgICAgKHZvaWQpIHVkcDsKKyAgICBsdWFfcHVzaGJvb2xlYW4oTCwgMCk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEp1c3QgY2FsbCBpbmV0IG1ldGhvZHMKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfZ2V0cGVlcm5hbWUobHVhX1N0YXRlICpMKSB7CisgICAgcF91ZHAgdWRwID0gKHBfdWRwKSBhdXhpbGlhcl9jaGVja2NsYXNzKEwsICJ1ZHB7Y29ubmVjdGVkfSIsIDEpOworICAgIHJldHVybiBpbmV0X21ldGhfZ2V0cGVlcm5hbWUoTCwgJnVkcC0+c29jayk7Cit9CisKK3N0YXRpYyBpbnQgbWV0aF9nZXRzb2NrbmFtZShsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VkcCB1ZHAgPSAocF91ZHApIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVkcHthbnl9IiwgMSk7CisgICAgcmV0dXJuIGluZXRfbWV0aF9nZXRzb2NrbmFtZShMLCAmdWRwLT5zb2NrKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSnVzdCBjYWxsIG9wdGlvbiBoYW5kbGVyCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX3NldG9wdGlvbihsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VkcCB1ZHAgPSAocF91ZHApIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVkcHthbnl9IiwgMSk7CisgICAgcmV0dXJuIG9wdF9tZXRoX3NldG9wdGlvbihMLCBvcHQsICZ1ZHAtPnNvY2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBKdXN0IGNhbGwgdG0gbWV0aG9kcworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9zZXR0aW1lb3V0KGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdWRwIHVkcCA9IChwX3VkcCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidWRwe2FueX0iLCAxKTsKKyAgICByZXR1cm4gdGltZW91dF9tZXRoX3NldHRpbWVvdXQoTCwgJnVkcC0+dG0pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBUdXJucyBhIG1hc3RlciB1ZHAgb2JqZWN0IGludG8gYSBjbGllbnQgb2JqZWN0LgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9zZXRwZWVybmFtZShsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VkcCB1ZHAgPSAocF91ZHApIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVkcHthbnl9IiwgMSk7CisgICAgcF90aW1lb3V0IHRtID0gJnVkcC0+dG07CisgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9ICBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICAgIGludCBjb25uZWN0aW5nID0gc3RyY21wKGFkZHJlc3MsICIqIik7CisgICAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IGNvbm5lY3RpbmcgPyAKKyAgICAgICAgKHVuc2lnbmVkIHNob3J0KSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpIDogCisgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgbHVhTF9vcHRudW1iZXIoTCwgMywgMCk7CisgICAgY29uc3QgY2hhciAqZXJyID0gaW5ldF90cnljb25uZWN0KCZ1ZHAtPnNvY2ssIGFkZHJlc3MsIHBvcnQsIHRtKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBlcnIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgLyogY2hhbmdlIGNsYXNzIHRvIGNvbm5lY3RlZCBvciB1bmNvbm5lY3RlZCBkZXBlbmRpbmcgb24gYWRkcmVzcyAqLworICAgIGlmIChjb25uZWN0aW5nKSBhdXhpbGlhcl9zZXRjbGFzcyhMLCAidWRwe2Nvbm5lY3RlZH0iLCAxKTsKKyAgICBlbHNlIGF1eGlsaWFyX3NldGNsYXNzKEwsICJ1ZHB7dW5jb25uZWN0ZWR9IiwgMSk7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIENsb3NlcyBzb2NrZXQgdXNlZCBieSBvYmplY3QgCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX2Nsb3NlKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdWRwIHVkcCA9IChwX3VkcCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidWRwe2FueX0iLCAxKTsKKyAgICBzb2NrZXRfZGVzdHJveSgmdWRwLT5zb2NrKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogVHVybnMgYSBtYXN0ZXIgb2JqZWN0IGludG8gYSBzZXJ2ZXIgb2JqZWN0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX3NldHNvY2tuYW1lKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdWRwIHVkcCA9IChwX3VkcCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidWRwe3VuY29ubmVjdGVkfSIsIDEpOworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAgbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyAgICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gKHVuc2lnbmVkIHNob3J0KSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworICAgIGNvbnN0IGNoYXIgKmVyciA9IGluZXRfdHJ5YmluZCgmdWRwLT5zb2NrLCBhZGRyZXNzLCBwb3J0KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBlcnIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIExpYnJhcnkgZnVuY3Rpb25zCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQ3JlYXRlcyBhIG1hc3RlciB1ZHAgb2JqZWN0IAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgZ2xvYmFsX2NyZWF0ZShsdWFfU3RhdGUgKkwpIHsKKyAgICB0X3NvY2tldCBzb2NrOworICAgIGNvbnN0IGNoYXIgKmVyciA9IGluZXRfdHJ5Y3JlYXRlKCZzb2NrLCBTT0NLX0RHUkFNKTsKKyAgICAvKiB0cnkgdG8gYWxsb2NhdGUgYSBzeXN0ZW0gc29ja2V0ICovCisgICAgaWYgKCFlcnIpIHsgCisgICAgICAgIC8qIGFsbG9jYXRlIHRjcCBvYmplY3QgKi8KKyAgICAgICAgcF91ZHAgdWRwID0gKHBfdWRwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdWRwKSk7CisgICAgICAgIGF1eGlsaWFyX3NldGNsYXNzKEwsICJ1ZHB7dW5jb25uZWN0ZWR9IiwgLTEpOworICAgICAgICAvKiBpbml0aWFsaXplIHJlbWFpbmluZyBzdHJ1Y3R1cmUgZmllbGRzICovCisgICAgICAgIHNvY2tldF9zZXRub25ibG9ja2luZygmc29jayk7CisgICAgICAgIHVkcC0+c29jayA9IHNvY2s7CisgICAgICAgIHRpbWVvdXRfaW5pdCgmdWRwLT50bSwgLTEsIC0xKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIGVycik7CisgICAgICAgIHJldHVybiAyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvdWRwLmggYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3VkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDE3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3VkcC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgVURQX0gKKyNkZWZpbmUgVURQX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIFVEUCBvYmplY3QKKyogTHVhU29ja2V0IHRvb2xraXQKKyoKKyogVGhlIHVkcC5oIG1vZHVsZSBwcm92aWRlcyBMdWFTb2NrZXQgd2l0aCBzdXBwb3J0IGZvciBVRFAgcHJvdG9jb2wKKyogKEFGX0lORVQsIFNPQ0tfREdSQU0pLgorKgorKiBUd28gY2xhc3NlcyBhcmUgZGVmaW5lZDogY29ubmVjdGVkIGFuZCB1bmNvbm5lY3RlZC4gVURQIG9iamVjdHMgYXJlCisqIG9yaWdpbmFsbHkgdW5jb25uZWN0ZWQuIFRoZXkgY2FuIGJlICJjb25uZWN0ZWQiIHRvIGEgZ2l2ZW4gYWRkcmVzcyAKKyogd2l0aCBhIGNhbGwgdG8gdGhlIHNldHBlZXJuYW1lIGZ1bmN0aW9uLiBUaGUgc2FtZSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0bworKiBicmVhayB0aGUgY29ubmVjdGlvbi4KKyoKKyogUkNTIElEOiAkSWQ6IHVkcC5oLHYgMS4xMCAyMDA1LzEwLzA3IDA0OjQwOjU5IGRpZWdvIEV4cCAkCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAidGltZW91dC5oIgorI2luY2x1ZGUgInNvY2tldC5oIgorCisvKiBjYW4ndCBiZSBsYXJnZXIgdGhhbiB3c29ja2V0LmMgTUFYQ0hVTkshISEgKi8KKyNkZWZpbmUgVURQX0RBVEFHUkFNU0laRSA4MTkyCisKK3R5cGVkZWYgc3RydWN0IHRfdWRwXyB7CisgICAgdF9zb2NrZXQgc29jazsKKyAgICB0X3RpbWVvdXQgdG07Cit9IHRfdWRwOwordHlwZWRlZiB0X3VkcCAqcF91ZHA7CisKK2ludCB1ZHBfb3BlbihsdWFfU3RhdGUgKkwpOworCisjZW5kaWYgLyogVURQX0ggKi8KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvdW5peC5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy91bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4ZDMxOQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdW5peC5jCkBAIC0wLDAgKzEsMzU2IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBVbml4IGRvbWFpbiBzb2NrZXQgCisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFJDUyBJRDogJElkOiB1bml4LmMsdiAxLjEzIDIwMDYvMDMvMTMgMDc6MTY6MzkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8c3RyaW5nLmg+IAorCisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAibGF1eGxpYi5oIgorCisjaW5jbHVkZSAiYXV4aWxpYXIuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAidW5peC5oIgorI2luY2x1ZGUgPHN5cy91bi5oPiAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgZ2xvYmFsX2NyZWF0ZShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2Nvbm5lY3QobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9saXN0ZW4obHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9iaW5kKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfc2VuZChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX3NodXRkb3duKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfcmVjZWl2ZShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2FjY2VwdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2Nsb3NlKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfc2V0b3B0aW9uKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfc2V0dGltZW91dChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2dldGZkKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfc2V0ZmQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbWV0aF9kaXJ0eShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBtZXRoX2dldHN0YXRzKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IG1ldGhfc2V0c3RhdHMobHVhX1N0YXRlICpMKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnVuaXhfdHJ5Y29ubmVjdChwX3VuaXggdW4sIGNvbnN0IGNoYXIgKnBhdGgpOworc3RhdGljIGNvbnN0IGNoYXIgKnVuaXhfdHJ5YmluZChwX3VuaXggdW4sIGNvbnN0IGNoYXIgKnBhdGgpOworCisvKiB1bml4IG9iamVjdCBtZXRob2RzICovCitzdGF0aWMgbHVhTF9yZWcgdW5bXSA9IHsKKyAgICB7Il9fZ2MiLCAgICAgICAgbWV0aF9jbG9zZX0sCisgICAgeyJfX3Rvc3RyaW5nIiwgIGF1eGlsaWFyX3Rvc3RyaW5nfSwKKyAgICB7ImFjY2VwdCIsICAgICAgbWV0aF9hY2NlcHR9LAorICAgIHsiYmluZCIsICAgICAgICBtZXRoX2JpbmR9LAorICAgIHsiY2xvc2UiLCAgICAgICBtZXRoX2Nsb3NlfSwKKyAgICB7ImNvbm5lY3QiLCAgICAgbWV0aF9jb25uZWN0fSwKKyAgICB7ImRpcnR5IiwgICAgICAgbWV0aF9kaXJ0eX0sCisgICAgeyJnZXRmZCIsICAgICAgIG1ldGhfZ2V0ZmR9LAorICAgIHsiZ2V0c3RhdHMiLCAgICBtZXRoX2dldHN0YXRzfSwKKyAgICB7InNldHN0YXRzIiwgICAgbWV0aF9zZXRzdGF0c30sCisgICAgeyJsaXN0ZW4iLCAgICAgIG1ldGhfbGlzdGVufSwKKyAgICB7InJlY2VpdmUiLCAgICAgbWV0aF9yZWNlaXZlfSwKKyAgICB7InNlbmQiLCAgICAgICAgbWV0aF9zZW5kfSwKKyAgICB7InNldGZkIiwgICAgICAgbWV0aF9zZXRmZH0sCisgICAgeyJzZXRvcHRpb24iLCAgIG1ldGhfc2V0b3B0aW9ufSwKKyAgICB7InNldHBlZXJuYW1lIiwgbWV0aF9jb25uZWN0fSwKKyAgICB7InNldHNvY2tuYW1lIiwgbWV0aF9iaW5kfSwKKyAgICB7InNldHRpbWVvdXQiLCAgbWV0aF9zZXR0aW1lb3V0fSwKKyAgICB7InNodXRkb3duIiwgICAgbWV0aF9zaHV0ZG93bn0sCisgICAge05VTEwsICAgICAgICAgIE5VTEx9Cit9OworCisvKiBzb2NrZXQgb3B0aW9uIGhhbmRsZXJzICovCitzdGF0aWMgdF9vcHQgb3B0W10gPSB7CisgICAgeyJrZWVwYWxpdmUiLCAgIG9wdF9rZWVwYWxpdmV9LAorICAgIHsicmV1c2VhZGRyIiwgICBvcHRfcmV1c2VhZGRyfSwKKyAgICB7ImxpbmdlciIsICAgICAgb3B0X2xpbmdlcn0sCisgICAge05VTEwsICAgICAgICAgIE5VTEx9Cit9OworCisvKiBvdXIgc29ja2V0IGNyZWF0aW9uIGZ1bmN0aW9uICovCitzdGF0aWMgbHVhTF9yZWcgZnVuY1tdID0geworICAgIHsidW5peCIsIGdsb2JhbF9jcmVhdGV9LAorICAgIHtOVUxMLCAgICAgICAgICBOVUxMfQorfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBJbml0aWFsaXplcyBtb2R1bGUKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgbHVhb3Blbl9zb2NrZXRfdW5peChsdWFfU3RhdGUgKkwpIHsKKyAgICAvKiBjcmVhdGUgY2xhc3NlcyAqLworICAgIGF1eGlsaWFyX25ld2NsYXNzKEwsICJ1bml4e21hc3Rlcn0iLCB1bik7CisgICAgYXV4aWxpYXJfbmV3Y2xhc3MoTCwgInVuaXh7Y2xpZW50fSIsIHVuKTsKKyAgICBhdXhpbGlhcl9uZXdjbGFzcyhMLCAidW5peHtzZXJ2ZXJ9IiwgdW4pOworICAgIC8qIGNyZWF0ZSBjbGFzcyBncm91cHMgKi8KKyAgICBhdXhpbGlhcl9hZGQyZ3JvdXAoTCwgInVuaXh7bWFzdGVyfSIsICJ1bml4e2FueX0iKTsKKyAgICBhdXhpbGlhcl9hZGQyZ3JvdXAoTCwgInVuaXh7Y2xpZW50fSIsICJ1bml4e2FueX0iKTsKKyAgICBhdXhpbGlhcl9hZGQyZ3JvdXAoTCwgInVuaXh7c2VydmVyfSIsICJ1bml4e2FueX0iKTsKKyAgICAvKiBtYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGVuZHMgdXAgaW4gdGhlIHBhY2thZ2UgdGFibGUgKi8KKyAgICBsdWFMX29wZW5saWIoTCwgInNvY2tldCIsIGZ1bmMsIDApOworICAgIC8qIHJldHVybiB0aGUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgJ3NvY2tldCcgdGFibGUgKi8KKyAgICBsdWFfcHVzaHN0cmluZyhMLCAidW5peCIpOworICAgIGx1YV9nZXR0YWJsZShMLCAtMik7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIEx1YSBtZXRob2RzCitcKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSnVzdCBjYWxsIGJ1ZmZlcmVkIElPIG1ldGhvZHMKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfc2VuZChsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VuaXggdW4gPSAocF91bml4KSBhdXhpbGlhcl9jaGVja2NsYXNzKEwsICJ1bml4e2NsaWVudH0iLCAxKTsKKyAgICByZXR1cm4gYnVmZmVyX21ldGhfc2VuZChMLCAmdW4tPmJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgbWV0aF9yZWNlaXZlKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdW5peCB1biA9IChwX3VuaXgpIGF1eGlsaWFyX2NoZWNrY2xhc3MoTCwgInVuaXh7Y2xpZW50fSIsIDEpOworICAgIHJldHVybiBidWZmZXJfbWV0aF9yZWNlaXZlKEwsICZ1bi0+YnVmKTsKK30KKworc3RhdGljIGludCBtZXRoX2dldHN0YXRzKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdW5peCB1biA9IChwX3VuaXgpIGF1eGlsaWFyX2NoZWNrY2xhc3MoTCwgInVuaXh7Y2xpZW50fSIsIDEpOworICAgIHJldHVybiBidWZmZXJfbWV0aF9nZXRzdGF0cyhMLCAmdW4tPmJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgbWV0aF9zZXRzdGF0cyhsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VuaXggdW4gPSAocF91bml4KSBhdXhpbGlhcl9jaGVja2NsYXNzKEwsICJ1bml4e2NsaWVudH0iLCAxKTsKKyAgICByZXR1cm4gYnVmZmVyX21ldGhfc2V0c3RhdHMoTCwgJnVuLT5idWYpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBKdXN0IGNhbGwgb3B0aW9uIGhhbmRsZXIKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfc2V0b3B0aW9uKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdW5peCB1biA9IChwX3VuaXgpIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVuaXh7YW55fSIsIDEpOworICAgIHJldHVybiBvcHRfbWV0aF9zZXRvcHRpb24oTCwgb3B0LCAmdW4tPnNvY2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBTZWxlY3Qgc3VwcG9ydCBtZXRob2RzCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX2dldGZkKGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdW5peCB1biA9IChwX3VuaXgpIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVuaXh7YW55fSIsIDEpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIChpbnQpIHVuLT5zb2NrKTsKKyAgICByZXR1cm4gMTsKK30KKworLyogdGhpcyBpcyB2ZXJ5IGRhbmdlcm91cywgYnV0IGNhbiBiZSBoYW5keSBmb3IgdGhvc2UgdGhhdCBhcmUgYnJhdmUgZW5vdWdoICovCitzdGF0aWMgaW50IG1ldGhfc2V0ZmQobHVhX1N0YXRlICpMKSB7CisgICAgcF91bml4IHVuID0gKHBfdW5peCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidW5peHthbnl9IiwgMSk7CisgICAgdW4tPnNvY2sgPSAodF9zb2NrZXQpIGx1YUxfY2hlY2tudW1iZXIoTCwgMik7IAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ldGhfZGlydHkobHVhX1N0YXRlICpMKSB7CisgICAgcF91bml4IHVuID0gKHBfdW5peCkgYXV4aWxpYXJfY2hlY2tncm91cChMLCAidW5peHthbnl9IiwgMSk7CisgICAgbHVhX3B1c2hib29sZWFuKEwsICFidWZmZXJfaXNlbXB0eSgmdW4tPmJ1ZikpOworICAgIHJldHVybiAxOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBXYWl0cyBmb3IgYW5kIHJldHVybnMgYSBjbGllbnQgb2JqZWN0IGF0dGVtcHRpbmcgY29ubmVjdGlvbiB0byB0aGUgCisqIHNlcnZlciBvYmplY3QgCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX2FjY2VwdChsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VuaXggc2VydmVyID0gKHBfdW5peCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidW5peHtzZXJ2ZXJ9IiwgMSk7CisgICAgcF90aW1lb3V0IHRtID0gdGltZW91dF9tYXJrc3RhcnQoJnNlcnZlci0+dG0pOworICAgIHRfc29ja2V0IHNvY2s7CisgICAgaW50IGVyciA9IHNvY2tldF9hY2NlcHQoJnNlcnZlci0+c29jaywgJnNvY2ssIE5VTEwsIE5VTEwsIHRtKTsKKyAgICAvKiBpZiBzdWNjZXNzZnVsLCBwdXNoIGNsaWVudCBzb2NrZXQgKi8KKyAgICBpZiAoZXJyID09IElPX0RPTkUpIHsKKyAgICAgICAgcF91bml4IGNsbnQgPSAocF91bml4KSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdW5peCkpOworICAgICAgICBhdXhpbGlhcl9zZXRjbGFzcyhMLCAidW5peHtjbGllbnR9IiwgLTEpOworICAgICAgICAvKiBpbml0aWFsaXplIHN0cnVjdHVyZSBmaWVsZHMgKi8KKyAgICAgICAgc29ja2V0X3NldG5vbmJsb2NraW5nKCZzb2NrKTsKKyAgICAgICAgY2xudC0+c29jayA9IHNvY2s7CisgICAgICAgIGlvX2luaXQoJmNsbnQtPmlvLCAocF9zZW5kKXNvY2tldF9zZW5kLCAocF9yZWN2KXNvY2tldF9yZWN2LCAKKyAgICAgICAgICAgICAgICAocF9lcnJvcikgc29ja2V0X2lvZXJyb3IsICZjbG50LT5zb2NrKTsKKyAgICAgICAgdGltZW91dF9pbml0KCZjbG50LT50bSwgLTEsIC0xKTsKKyAgICAgICAgYnVmZmVyX2luaXQoJmNsbnQtPmJ1ZiwgJmNsbnQtPmlvLCAmY2xudC0+dG0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsgCisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIHNvY2tldF9zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBCaW5kcyBhbiBvYmplY3QgdG8gYW4gYWRkcmVzcyAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgY29uc3QgY2hhciAqdW5peF90cnliaW5kKHBfdW5peCB1biwgY29uc3QgY2hhciAqcGF0aCkgeworICAgIHN0cnVjdCBzb2NrYWRkcl91biBsb2NhbDsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHBhdGgpOworICAgIGludCBlcnI7CisgICAgaWYgKGxlbiA+PSBzaXplb2YobG9jYWwuc3VuX3BhdGgpKSByZXR1cm4gInBhdGggdG9vIGxvbmciOworICAgIG1lbXNldCgmbG9jYWwsIDAsIHNpemVvZihsb2NhbCkpOworICAgIHN0cmNweShsb2NhbC5zdW5fcGF0aCwgcGF0aCk7CisgICAgbG9jYWwuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisjaWZkZWYgVU5JWF9IQVNfU1VOX0xFTgorICAgIGxvY2FsLnN1bl9sZW4gPSBzaXplb2YobG9jYWwuc3VuX2ZhbWlseSkgKyBzaXplb2YobG9jYWwuc3VuX2xlbikgCisgICAgICAgICsgbGVuICsgMTsKKyAgICBlcnIgPSBzb2NrZXRfYmluZCgmdW4tPnNvY2ssIChTQSAqKSAmbG9jYWwsIGxvY2FsLnN1bl9sZW4pOworCisjZWxzZSAKKyAgICBlcnIgPSBzb2NrZXRfYmluZCgmdW4tPnNvY2ssIChTQSAqKSAmbG9jYWwsIAorICAgICAgICAgICAgc2l6ZW9mKGxvY2FsLnN1bl9mYW1pbHkpICsgbGVuKTsKKyNlbmRpZgorICAgIGlmIChlcnIgIT0gSU9fRE9ORSkgc29ja2V0X2Rlc3Ryb3koJnVuLT5zb2NrKTsKKyAgICByZXR1cm4gc29ja2V0X3N0cmVycm9yKGVycik7IAorfQorCitzdGF0aWMgaW50IG1ldGhfYmluZChsdWFfU3RhdGUgKkwpIHsKKyAgICBwX3VuaXggdW4gPSAocF91bml4KSBhdXhpbGlhcl9jaGVja2NsYXNzKEwsICJ1bml4e21hc3Rlcn0iLCAxKTsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gIGx1YUxfY2hlY2tzdHJpbmcoTCwgMik7CisgICAgY29uc3QgY2hhciAqZXJyID0gdW5peF90cnliaW5kKHVuLCBwYXRoKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBlcnIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFR1cm5zIGEgbWFzdGVyIHVuaXggb2JqZWN0IGludG8gYSBjbGllbnQgb2JqZWN0LgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBjb25zdCBjaGFyICp1bml4X3RyeWNvbm5lY3QocF91bml4IHVuLCBjb25zdCBjaGFyICpwYXRoKQoreworICAgIHN0cnVjdCBzb2NrYWRkcl91biByZW1vdGU7CisgICAgaW50IGVycjsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHBhdGgpOworICAgIGlmIChsZW4gPj0gc2l6ZW9mKHJlbW90ZS5zdW5fcGF0aCkpIHJldHVybiAicGF0aCB0b28gbG9uZyI7CisgICAgbWVtc2V0KCZyZW1vdGUsIDAsIHNpemVvZihyZW1vdGUpKTsKKyAgICBzdHJjcHkocmVtb3RlLnN1bl9wYXRoLCBwYXRoKTsKKyAgICByZW1vdGUuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgdGltZW91dF9tYXJrc3RhcnQoJnVuLT50bSk7CisjaWZkZWYgVU5JWF9IQVNfU1VOX0xFTgorICAgIHJlbW90ZS5zdW5fbGVuID0gc2l6ZW9mKHJlbW90ZS5zdW5fZmFtaWx5KSArIHNpemVvZihyZW1vdGUuc3VuX2xlbikgCisgICAgICAgICsgbGVuICsgMTsKKyAgICBlcnIgPSBzb2NrZXRfY29ubmVjdCgmdW4tPnNvY2ssIChTQSAqKSAmcmVtb3RlLCByZW1vdGUuc3VuX2xlbiwgJnVuLT50bSk7CisjZWxzZQorICAgIGVyciA9IHNvY2tldF9jb25uZWN0KCZ1bi0+c29jaywgKFNBICopICZyZW1vdGUsIAorICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZS5zdW5fZmFtaWx5KSArIGxlbiwgJnVuLT50bSk7CisjZW5kaWYKKyAgICBpZiAoZXJyICE9IElPX0RPTkUpIHNvY2tldF9kZXN0cm95KCZ1bi0+c29jayk7CisgICAgcmV0dXJuIHNvY2tldF9zdHJlcnJvcihlcnIpOworfQorCitzdGF0aWMgaW50IG1ldGhfY29ubmVjdChsdWFfU3RhdGUgKkwpCit7CisgICAgcF91bml4IHVuID0gKHBfdW5peCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidW5peHttYXN0ZXJ9IiwgMSk7CisgICAgY29uc3QgY2hhciAqcGF0aCA9ICBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICAgIGNvbnN0IGNoYXIgKmVyciA9IHVuaXhfdHJ5Y29ubmVjdCh1biwgcGF0aCk7CisgICAgaWYgKGVycikgeworICAgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICAgICAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIC8qIHR1cm4gbWFzdGVyIG9iamVjdCBpbnRvIGEgY2xpZW50IG9iamVjdCAqLworICAgIGF1eGlsaWFyX3NldGNsYXNzKEwsICJ1bml4e2NsaWVudH0iLCAxKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQ2xvc2VzIHNvY2tldCB1c2VkIGJ5IG9iamVjdCAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfY2xvc2UobHVhX1N0YXRlICpMKQoreworICAgIHBfdW5peCB1biA9IChwX3VuaXgpIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVuaXh7YW55fSIsIDEpOworICAgIHNvY2tldF9kZXN0cm95KCZ1bi0+c29jayk7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFB1dHMgdGhlIHNvY2t0IGluIGxpc3RlbiBtb2RlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZXRoX2xpc3RlbihsdWFfU3RhdGUgKkwpCit7CisgICAgcF91bml4IHVuID0gKHBfdW5peCkgYXV4aWxpYXJfY2hlY2tjbGFzcyhMLCAidW5peHttYXN0ZXJ9IiwgMSk7CisgICAgaW50IGJhY2tsb2cgPSAoaW50KSBsdWFMX29wdG51bWJlcihMLCAyLCAzMik7CisgICAgaW50IGVyciA9IHNvY2tldF9saXN0ZW4oJnVuLT5zb2NrLCBiYWNrbG9nKTsKKyAgICBpZiAoZXJyICE9IElPX0RPTkUpIHsKKyAgICAgICAgbHVhX3B1c2huaWwoTCk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIHNvY2tldF9zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIC8qIHR1cm4gbWFzdGVyIG9iamVjdCBpbnRvIGEgc2VydmVyIG9iamVjdCAqLworICAgIGF1eGlsaWFyX3NldGNsYXNzKEwsICJ1bml4e3NlcnZlcn0iLCAxKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogU2h1dHMgdGhlIGNvbm5lY3Rpb24gZG93biBwYXJ0aWFsbHkKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1ldGhfc2h1dGRvd24obHVhX1N0YXRlICpMKQoreworICAgIHBfdW5peCB1biA9IChwX3VuaXgpIGF1eGlsaWFyX2NoZWNrY2xhc3MoTCwgInVuaXh7Y2xpZW50fSIsIDEpOworICAgIGNvbnN0IGNoYXIgKmhvdyA9IGx1YUxfb3B0c3RyaW5nKEwsIDIsICJib3RoIik7CisgICAgc3dpdGNoIChob3dbMF0pIHsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICBpZiAoc3RyY21wKGhvdywgImJvdGgiKSkgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHNvY2tldF9zaHV0ZG93bigmdW4tPnNvY2ssIDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgaWYgKHN0cmNtcChob3csICJzZW5kIikpIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBzb2NrZXRfc2h1dGRvd24oJnVuLT5zb2NrLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIGlmIChzdHJjbXAoaG93LCAicmVjZWl2ZSIpKSBnb3RvIGVycm9yOworICAgICAgICAgICAgc29ja2V0X3NodXRkb3duKCZ1bi0+c29jaywgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgICAgcmV0dXJuIDE7CitlcnJvcjoKKyAgICBsdWFMX2FyZ2Vycm9yKEwsIDIsICJpbnZhbGlkIHNodXRkb3duIG1ldGhvZCIpOworICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBKdXN0IGNhbGwgdG0gbWV0aG9kcworXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWV0aF9zZXR0aW1lb3V0KGx1YV9TdGF0ZSAqTCkgeworICAgIHBfdW5peCB1biA9IChwX3VuaXgpIGF1eGlsaWFyX2NoZWNrZ3JvdXAoTCwgInVuaXh7YW55fSIsIDEpOworICAgIHJldHVybiB0aW1lb3V0X21ldGhfc2V0dGltZW91dChMLCAmdW4tPnRtKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogTGlicmFyeSBmdW5jdGlvbnMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDcmVhdGVzIGEgbWFzdGVyIHVuaXggb2JqZWN0IAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgZ2xvYmFsX2NyZWF0ZShsdWFfU3RhdGUgKkwpIHsKKyAgICB0X3NvY2tldCBzb2NrOworICAgIGludCBlcnIgPSBzb2NrZXRfY3JlYXRlKCZzb2NrLCBBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisgICAgLyogdHJ5IHRvIGFsbG9jYXRlIGEgc3lzdGVtIHNvY2tldCAqLworICAgIGlmIChlcnIgPT0gSU9fRE9ORSkgeyAKKyAgICAgICAgLyogYWxsb2NhdGUgdW5peCBvYmplY3QgKi8KKyAgICAgICAgcF91bml4IHVuID0gKHBfdW5peCkgbHVhX25ld3VzZXJkYXRhKEwsIHNpemVvZih0X3VuaXgpKTsKKyAgICAgICAgLyogc2V0IGl0cyB0eXBlIGFzIG1hc3RlciBvYmplY3QgKi8KKyAgICAgICAgYXV4aWxpYXJfc2V0Y2xhc3MoTCwgInVuaXh7bWFzdGVyfSIsIC0xKTsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSByZW1haW5pbmcgc3RydWN0dXJlIGZpZWxkcyAqLworICAgICAgICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoJnNvY2spOworICAgICAgICB1bi0+c29jayA9IHNvY2s7CisgICAgICAgIGlvX2luaXQoJnVuLT5pbywgKHBfc2VuZCkgc29ja2V0X3NlbmQsIChwX3JlY3YpIHNvY2tldF9yZWN2LCAKKyAgICAgICAgICAgICAgICAocF9lcnJvcikgc29ja2V0X2lvZXJyb3IsICZ1bi0+c29jayk7CisgICAgICAgIHRpbWVvdXRfaW5pdCgmdW4tPnRtLCAtMSwgLTEpOworICAgICAgICBidWZmZXJfaW5pdCgmdW4tPmJ1ZiwgJnVuLT5pbywgJnVuLT50bSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGx1YV9wdXNobmlsKEwpOworICAgICAgICBsdWFfcHVzaHN0cmluZyhMLCBzb2NrZXRfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvdW5peC5oIGIvbHVhc29ja2V0LTIuMC4yL3NyYy91bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiNzM4MAotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdW5peC5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgVU5JWF9ICisjZGVmaW5lIFVOSVhfSAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogVW5peCBkb21haW4gb2JqZWN0CisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFRoaXMgbW9kdWxlIGlzIGp1c3QgYW4gZXhhbXBsZSBvZiBob3cgdG8gZXh0ZW5kIEx1YVNvY2tldCB3aXRoIGEgbmV3IAorKiBkb21haW4uCisqCisqIFJDUyBJRDogJElkOiB1bml4LmgsdiAxLjkgMjAwNi8wMy8xMyAwNzoxNjozOSBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInRpbWVvdXQuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgdF91bml4XyB7CisgICAgdF9zb2NrZXQgc29jazsKKyAgICB0X2lvIGlvOworICAgIHRfYnVmZmVyIGJ1ZjsKKyAgICB0X3RpbWVvdXQgdG07Cit9IHRfdW5peDsKK3R5cGVkZWYgdF91bml4ICpwX3VuaXg7CisKK2ludCBsdWFvcGVuX3NvY2tldF91bml4KGx1YV9TdGF0ZSAqTCk7CisKKyNlbmRpZiAvKiBVTklYX0ggKi8KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvdXJsLmx1YSBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdXJsLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTMxZDhhCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy91cmwubHVhCkBAIC0wLDAgKzEsMjk3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVVJJIHBhcnNpbmcsIGNvbXBvc2l0aW9uIGFuZCByZWxhdGl2ZSBVUkwgcmVzb2x1dGlvbgorLS0gTHVhU29ja2V0IHRvb2xraXQuCistLSBBdXRob3I6IERpZWdvIE5laGFiCistLSBSQ1MgSUQ6ICRJZDogdXJsLmx1YSx2IDEuMzggMjAwNi8wNC8wMyAwNDo0NTo0MiBkaWVnbyBFeHAgJAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIERlY2xhcmUgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgc3RyaW5nID0gcmVxdWlyZSgic3RyaW5nIikKK2xvY2FsIGJhc2UgPSBfRworbG9jYWwgdGFibGUgPSByZXF1aXJlKCJ0YWJsZSIpCittb2R1bGUoInNvY2tldC51cmwiKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gTW9kdWxlIHZlcnNpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitfVkVSU0lPTiA9ICJVUkwgMS4wLjEiCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBFbmNvZGVzIGEgc3RyaW5nIGludG8gaXRzIGVzY2FwZWQgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24KKy0tIElucHV0CistLSAgIHM6IGJpbmFyeSBzdHJpbmcgdG8gYmUgZW5jb2RlZAorLS0gUmV0dXJucworLS0gICBlc2NhcGVkIHJlcHJlc2VudGF0aW9uIG9mIHN0cmluZyBiaW5hcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiBlc2NhcGUocykKKyAgICByZXR1cm4gc3RyaW5nLmdzdWIocywgIihbXkEtWmEtejAtOV9dKSIsIGZ1bmN0aW9uKGMpCisgICAgICAgIHJldHVybiBzdHJpbmcuZm9ybWF0KCIlJSUwMngiLCBzdHJpbmcuYnl0ZShjKSkKKyAgICBlbmQpCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFByb3RlY3RzIGEgcGF0aCBzZWdtZW50LCB0byBwcmV2ZW50IGl0IGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0aGUKKy0tIHVybCBwYXJzaW5nLgorLS0gSW5wdXQKKy0tICAgczogYmluYXJ5IHN0cmluZyB0byBiZSBlbmNvZGVkCistLSBSZXR1cm5zCistLSAgIGVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2Ygc3RyaW5nIGJpbmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGZ1bmN0aW9uIG1ha2Vfc2V0KHQpCisJbG9jYWwgcyA9IHt9CisJZm9yIGksdiBpbiBiYXNlLmlwYWlycyh0KSBkbworCQlzW3RbaV1dID0gMQorCWVuZAorCXJldHVybiBzCitlbmQKKworLS0gdGhlc2UgYXJlIGFsbG93ZWQgd2l0aGluZyBhIHBhdGggc2VnbWVudCwgYWxvbmcgd2l0aCBhbHBoYW51bQorLS0gb3RoZXIgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQKK2xvY2FsIHNlZ21lbnRfc2V0ID0gbWFrZV9zZXQgeworICAgICItIiwgIl8iLCAiLiIsICIhIiwgIn4iLCAiKiIsICInIiwgIigiLAorCSIpIiwgIjoiLCAiQCIsICImIiwgIj0iLCAiKyIsICIkIiwgIiwiLAorfQorCitsb2NhbCBmdW5jdGlvbiBwcm90ZWN0X3NlZ21lbnQocykKKwlyZXR1cm4gc3RyaW5nLmdzdWIocywgIihbXkEtWmEtejAtOV9dKSIsIGZ1bmN0aW9uIChjKQorCQlpZiBzZWdtZW50X3NldFtjXSB0aGVuIHJldHVybiBjCisJCWVsc2UgcmV0dXJuIHN0cmluZy5mb3JtYXQoIiUlJTAyeCIsIHN0cmluZy5ieXRlKGMpKSBlbmQKKwllbmQpCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIEVuY29kZXMgYSBzdHJpbmcgaW50byBpdHMgZXNjYXBlZCBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbgorLS0gSW5wdXQKKy0tICAgczogYmluYXJ5IHN0cmluZyB0byBiZSBlbmNvZGVkCistLSBSZXR1cm5zCistLSAgIGVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2Ygc3RyaW5nIGJpbmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIHVuZXNjYXBlKHMpCisgICAgcmV0dXJuIHN0cmluZy5nc3ViKHMsICIlJSgleCV4KSIsIGZ1bmN0aW9uKGhleCkKKyAgICAgICAgcmV0dXJuIHN0cmluZy5jaGFyKGJhc2UudG9udW1iZXIoaGV4LCAxNikpCisgICAgZW5kKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBCdWlsZHMgYSBwYXRoIGZyb20gYSBiYXNlIHBhdGggYW5kIGEgcmVsYXRpdmUgcGF0aAorLS0gSW5wdXQKKy0tICAgYmFzZV9wYXRoCistLSAgIHJlbGF0aXZlX3BhdGgKKy0tIFJldHVybnMKKy0tICAgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBwYXRoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwgZnVuY3Rpb24gYWJzb2x1dGVfcGF0aChiYXNlX3BhdGgsIHJlbGF0aXZlX3BhdGgpCisgICAgaWYgc3RyaW5nLnN1YihyZWxhdGl2ZV9wYXRoLCAxLCAxKSA9PSAiLyIgdGhlbiByZXR1cm4gcmVsYXRpdmVfcGF0aCBlbmQKKyAgICBsb2NhbCBwYXRoID0gc3RyaW5nLmdzdWIoYmFzZV9wYXRoLCAiW14vXSokIiwgIiIpCisgICAgcGF0aCA9IHBhdGggLi4gcmVsYXRpdmVfcGF0aAorICAgIHBhdGggPSBzdHJpbmcuZ3N1YihwYXRoLCAiKFteL10qJS4vKSIsIGZ1bmN0aW9uIChzKQorICAgICAgICBpZiBzIH49ICIuLyIgdGhlbiByZXR1cm4gcyBlbHNlIHJldHVybiAiIiBlbmQKKyAgICBlbmQpCisgICAgcGF0aCA9IHN0cmluZy5nc3ViKHBhdGgsICIvJS4kIiwgIi8iKQorICAgIGxvY2FsIHJlZHVjZWQKKyAgICB3aGlsZSByZWR1Y2VkIH49IHBhdGggZG8KKyAgICAgICAgcmVkdWNlZCA9IHBhdGgKKyAgICAgICAgcGF0aCA9IHN0cmluZy5nc3ViKHJlZHVjZWQsICIoW14vXSovJS4lLi8pIiwgZnVuY3Rpb24gKHMpCisgICAgICAgICAgICBpZiBzIH49ICIuLi8uLi8iIHRoZW4gcmV0dXJuICIiIGVsc2UgcmV0dXJuIHMgZW5kCisgICAgICAgIGVuZCkKKyAgICBlbmQKKyAgICBwYXRoID0gc3RyaW5nLmdzdWIocmVkdWNlZCwgIihbXi9dKi8lLiUuKSQiLCBmdW5jdGlvbiAocykKKyAgICAgICAgaWYgcyB+PSAiLi4vLi4iIHRoZW4gcmV0dXJuICIiIGVsc2UgcmV0dXJuIHMgZW5kCisgICAgZW5kKQorICAgIHJldHVybiBwYXRoCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBhcnNlcyBhIHVybCBhbmQgcmV0dXJucyBhIHRhYmxlIHdpdGggYWxsIGl0cyBwYXJ0cyBhY2NvcmRpbmcgdG8gUkZDIDIzOTYKKy0tIFRoZSBmb2xsb3dpbmcgZ3JhbW1hciBkZXNjcmliZXMgdGhlIG5hbWVzIGdpdmVuIHRvIHRoZSBVUkwgcGFydHMKKy0tIDx1cmw+IDo6PSA8c2NoZW1lPjovLzxhdXRob3JpdHk+LzxwYXRoPjs8cGFyYW1zPj88cXVlcnk+IzxmcmFnbWVudD4KKy0tIDxhdXRob3JpdHk+IDo6PSA8dXNlcmluZm8+QDxob3N0Pjo8cG9ydD4KKy0tIDx1c2VyaW5mbz4gOjo9IDx1c2VyPls6PHBhc3N3b3JkPl0KKy0tIDxwYXRoPiA6OiA9IHs8c2VnbWVudD4vfTxzZWdtZW50PgorLS0gSW5wdXQKKy0tICAgdXJsOiB1bmlmb3JtIHJlc291cmNlIGxvY2F0b3Igb2YgcmVxdWVzdAorLS0gICBkZWZhdWx0OiB0YWJsZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBlYWNoIGZpZWxkCistLSBSZXR1cm5zCistLSAgIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHMsIHdoZXJlIFJGQyBuYW1pbmcgY29udmVudGlvbnMgaGF2ZQorLS0gICBiZWVuIHByZXNlcnZlZDoKKy0tICAgICBzY2hlbWUsIGF1dGhvcml0eSwgdXNlcmluZm8sIHVzZXIsIHBhc3N3b3JkLCBob3N0LCBwb3J0LAorLS0gICAgIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50CistLSBPYnM6CistLSAgIHRoZSBsZWFkaW5nICcvJyBpbiB7LzxwYXRoPn0gaXMgY29uc2lkZXJlZCBwYXJ0IG9mIDxwYXRoPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIHBhcnNlKHVybCwgZGVmYXVsdCkKKyAgICAtLSBpbml0aWFsaXplIGRlZmF1bHQgcGFyYW1ldGVycworICAgIGxvY2FsIHBhcnNlZCA9IHt9CisgICAgZm9yIGksdiBpbiBiYXNlLnBhaXJzKGRlZmF1bHQgb3IgcGFyc2VkKSBkbyBwYXJzZWRbaV0gPSB2IGVuZAorICAgIC0tIGVtcHR5IHVybCBpcyBwYXJzZWQgdG8gbmlsCisgICAgaWYgbm90IHVybCBvciB1cmwgPT0gIiIgdGhlbiByZXR1cm4gbmlsLCAiaW52YWxpZCB1cmwiIGVuZAorICAgIC0tIHJlbW92ZSB3aGl0ZXNwYWNlCisgICAgLS0gdXJsID0gc3RyaW5nLmdzdWIodXJsLCAiJXMiLCAiIikKKyAgICAtLSBnZXQgZnJhZ21lbnQKKyAgICB1cmwgPSBzdHJpbmcuZ3N1Yih1cmwsICIjKC4qKSQiLCBmdW5jdGlvbihmKQorICAgICAgICBwYXJzZWQuZnJhZ21lbnQgPSBmCisgICAgICAgIHJldHVybiAiIgorICAgIGVuZCkKKyAgICAtLSBnZXQgc2NoZW1lCisgICAgdXJsID0gc3RyaW5nLmdzdWIodXJsLCAiXihbJXddWyV3JSslLSUuXSopJToiLAorICAgICAgICBmdW5jdGlvbihzKSBwYXJzZWQuc2NoZW1lID0gczsgcmV0dXJuICIiIGVuZCkKKyAgICAtLSBnZXQgYXV0aG9yaXR5CisgICAgdXJsID0gc3RyaW5nLmdzdWIodXJsLCAiXi8vKFteL10qKSIsIGZ1bmN0aW9uKG4pCisgICAgICAgIHBhcnNlZC5hdXRob3JpdHkgPSBuCisgICAgICAgIHJldHVybiAiIgorICAgIGVuZCkKKyAgICAtLSBnZXQgcXVlcnkgc3RyaW5naW5nCisgICAgdXJsID0gc3RyaW5nLmdzdWIodXJsLCAiJT8oLiopIiwgZnVuY3Rpb24ocSkKKyAgICAgICAgcGFyc2VkLnF1ZXJ5ID0gcQorICAgICAgICByZXR1cm4gIiIKKyAgICBlbmQpCisgICAgLS0gZ2V0IHBhcmFtcworICAgIHVybCA9IHN0cmluZy5nc3ViKHVybCwgIiU7KC4qKSIsIGZ1bmN0aW9uKHApCisgICAgICAgIHBhcnNlZC5wYXJhbXMgPSBwCisgICAgICAgIHJldHVybiAiIgorICAgIGVuZCkKKyAgICAtLSBwYXRoIGlzIHdoYXRldmVyIHdhcyBsZWZ0CisgICAgaWYgdXJsIH49ICIiIHRoZW4gcGFyc2VkLnBhdGggPSB1cmwgZW5kCisgICAgbG9jYWwgYXV0aG9yaXR5ID0gcGFyc2VkLmF1dGhvcml0eQorICAgIGlmIG5vdCBhdXRob3JpdHkgdGhlbiByZXR1cm4gcGFyc2VkIGVuZAorICAgIGF1dGhvcml0eSA9IHN0cmluZy5nc3ViKGF1dGhvcml0eSwiXihbXkBdKilAIiwKKyAgICAgICAgZnVuY3Rpb24odSkgcGFyc2VkLnVzZXJpbmZvID0gdTsgcmV0dXJuICIiIGVuZCkKKyAgICBhdXRob3JpdHkgPSBzdHJpbmcuZ3N1YihhdXRob3JpdHksICI6KFteOl0qKSQiLAorICAgICAgICBmdW5jdGlvbihwKSBwYXJzZWQucG9ydCA9IHA7IHJldHVybiAiIiBlbmQpCisgICAgaWYgYXV0aG9yaXR5IH49ICIiIHRoZW4gcGFyc2VkLmhvc3QgPSBhdXRob3JpdHkgZW5kCisgICAgbG9jYWwgdXNlcmluZm8gPSBwYXJzZWQudXNlcmluZm8KKyAgICBpZiBub3QgdXNlcmluZm8gdGhlbiByZXR1cm4gcGFyc2VkIGVuZAorICAgIHVzZXJpbmZvID0gc3RyaW5nLmdzdWIodXNlcmluZm8sICI6KFteOl0qKSQiLAorICAgICAgICBmdW5jdGlvbihwKSBwYXJzZWQucGFzc3dvcmQgPSBwOyByZXR1cm4gIiIgZW5kKQorICAgIHBhcnNlZC51c2VyID0gdXNlcmluZm8KKyAgICByZXR1cm4gcGFyc2VkCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFJlYnVpbGRzIGEgcGFyc2VkIFVSTCBmcm9tIGl0cyBjb21wb25lbnRzLgorLS0gQ29tcG9uZW50cyBhcmUgcHJvdGVjdGVkIGlmIGFueSByZXNlcnZlZCBvciB1bmFsbG93ZWQgY2hhcmFjdGVycyBhcmUgZm91bmQKKy0tIElucHV0CistLSAgIHBhcnNlZDogcGFyc2VkIFVSTCwgYXMgcmV0dXJuZWQgYnkgcGFyc2UKKy0tIFJldHVybnMKKy0tICAgYSBzdHJpbmdpbmcgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBVUkwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiBidWlsZChwYXJzZWQpCisgICAgbG9jYWwgcHBhdGggPSBwYXJzZV9wYXRoKHBhcnNlZC5wYXRoIG9yICIiKQorICAgIGxvY2FsIHVybCA9IGJ1aWxkX3BhdGgocHBhdGgpCisgICAgaWYgcGFyc2VkLnBhcmFtcyB0aGVuIHVybCA9IHVybCAuLiAiOyIgLi4gcGFyc2VkLnBhcmFtcyBlbmQKKyAgICBpZiBwYXJzZWQucXVlcnkgdGhlbiB1cmwgPSB1cmwgLi4gIj8iIC4uIHBhcnNlZC5xdWVyeSBlbmQKKwlsb2NhbCBhdXRob3JpdHkgPSBwYXJzZWQuYXV0aG9yaXR5CisJaWYgcGFyc2VkLmhvc3QgdGhlbgorCQlhdXRob3JpdHkgPSBwYXJzZWQuaG9zdAorCQlpZiBwYXJzZWQucG9ydCB0aGVuIGF1dGhvcml0eSA9IGF1dGhvcml0eSAuLiAiOiIgLi4gcGFyc2VkLnBvcnQgZW5kCisJCWxvY2FsIHVzZXJpbmZvID0gcGFyc2VkLnVzZXJpbmZvCisJCWlmIHBhcnNlZC51c2VyIHRoZW4KKwkJCXVzZXJpbmZvID0gcGFyc2VkLnVzZXIKKwkJCWlmIHBhcnNlZC5wYXNzd29yZCB0aGVuCisJCQkJdXNlcmluZm8gPSB1c2VyaW5mbyAuLiAiOiIgLi4gcGFyc2VkLnBhc3N3b3JkCisJCQllbmQKKwkJZW5kCisJCWlmIHVzZXJpbmZvIHRoZW4gYXV0aG9yaXR5ID0gdXNlcmluZm8gLi4gIkAiIC4uIGF1dGhvcml0eSBlbmQKKwllbmQKKyAgICBpZiBhdXRob3JpdHkgdGhlbiB1cmwgPSAiLy8iIC4uIGF1dGhvcml0eSAuLiB1cmwgZW5kCisgICAgaWYgcGFyc2VkLnNjaGVtZSB0aGVuIHVybCA9IHBhcnNlZC5zY2hlbWUgLi4gIjoiIC4uIHVybCBlbmQKKyAgICBpZiBwYXJzZWQuZnJhZ21lbnQgdGhlbiB1cmwgPSB1cmwgLi4gIiMiIC4uIHBhcnNlZC5mcmFnbWVudCBlbmQKKyAgICAtLSB1cmwgPSBzdHJpbmcuZ3N1Yih1cmwsICIlcyIsICIiKQorICAgIHJldHVybiB1cmwKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gQnVpbGRzIGEgYWJzb2x1dGUgVVJMIGZyb20gYSBiYXNlIGFuZCBhIHJlbGF0aXZlIFVSTCBhY2NvcmRpbmcgdG8gUkZDIDIzOTYKKy0tIElucHV0CistLSAgIGJhc2VfdXJsCistLSAgIHJlbGF0aXZlX3VybAorLS0gUmV0dXJucworLS0gICBjb3JyZXNwb25kaW5nIGFic29sdXRlIHVybAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIGFic29sdXRlKGJhc2VfdXJsLCByZWxhdGl2ZV91cmwpCisgICAgaWYgYmFzZS50eXBlKGJhc2VfdXJsKSA9PSAidGFibGUiIHRoZW4KKyAgICAgICAgYmFzZV9wYXJzZWQgPSBiYXNlX3VybAorICAgICAgICBiYXNlX3VybCA9IGJ1aWxkKGJhc2VfcGFyc2VkKQorICAgIGVsc2UKKyAgICAgICAgYmFzZV9wYXJzZWQgPSBwYXJzZShiYXNlX3VybCkKKyAgICBlbmQKKyAgICBsb2NhbCByZWxhdGl2ZV9wYXJzZWQgPSBwYXJzZShyZWxhdGl2ZV91cmwpCisgICAgaWYgbm90IGJhc2VfcGFyc2VkIHRoZW4gcmV0dXJuIHJlbGF0aXZlX3VybAorICAgIGVsc2VpZiBub3QgcmVsYXRpdmVfcGFyc2VkIHRoZW4gcmV0dXJuIGJhc2VfdXJsCisgICAgZWxzZWlmIHJlbGF0aXZlX3BhcnNlZC5zY2hlbWUgdGhlbiByZXR1cm4gcmVsYXRpdmVfdXJsCisgICAgZWxzZQorICAgICAgICByZWxhdGl2ZV9wYXJzZWQuc2NoZW1lID0gYmFzZV9wYXJzZWQuc2NoZW1lCisgICAgICAgIGlmIG5vdCByZWxhdGl2ZV9wYXJzZWQuYXV0aG9yaXR5IHRoZW4KKyAgICAgICAgICAgIHJlbGF0aXZlX3BhcnNlZC5hdXRob3JpdHkgPSBiYXNlX3BhcnNlZC5hdXRob3JpdHkKKyAgICAgICAgICAgIGlmIG5vdCByZWxhdGl2ZV9wYXJzZWQucGF0aCB0aGVuCisgICAgICAgICAgICAgICAgcmVsYXRpdmVfcGFyc2VkLnBhdGggPSBiYXNlX3BhcnNlZC5wYXRoCisgICAgICAgICAgICAgICAgaWYgbm90IHJlbGF0aXZlX3BhcnNlZC5wYXJhbXMgdGhlbgorICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV9wYXJzZWQucGFyYW1zID0gYmFzZV9wYXJzZWQucGFyYW1zCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWxhdGl2ZV9wYXJzZWQucXVlcnkgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfcGFyc2VkLnF1ZXJ5ID0gYmFzZV9wYXJzZWQucXVlcnkKKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlICAgIAorICAgICAgICAgICAgICAgIHJlbGF0aXZlX3BhcnNlZC5wYXRoID0gYWJzb2x1dGVfcGF0aChiYXNlX3BhcnNlZC5wYXRoIG9yICIiLAorICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV9wYXJzZWQucGF0aCkKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgcmV0dXJuIGJ1aWxkKHJlbGF0aXZlX3BhcnNlZCkKKyAgICBlbmQKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gQnJlYWtzIGEgcGF0aCBpbnRvIGl0cyBzZWdtZW50cywgdW5lc2NhcGluZyB0aGUgc2VnbWVudHMKKy0tIElucHV0CistLSAgIHBhdGgKKy0tIFJldHVybnMKKy0tICAgc2VnbWVudDogYSB0YWJsZSB3aXRoIG9uZSBlbnRyeSBwZXIgc2VnbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIHBhcnNlX3BhdGgocGF0aCkKKwlsb2NhbCBwYXJzZWQgPSB7fQorCXBhdGggPSBwYXRoIG9yICIiCisJLS1wYXRoID0gc3RyaW5nLmdzdWIocGF0aCwgIiVzIiwgIiIpCisJc3RyaW5nLmdzdWIocGF0aCwgIihbXi9dKykiLCBmdW5jdGlvbiAocykgdGFibGUuaW5zZXJ0KHBhcnNlZCwgcykgZW5kKQorCWZvciBpID0gMSwgdGFibGUuZ2V0bihwYXJzZWQpIGRvCisJCXBhcnNlZFtpXSA9IHVuZXNjYXBlKHBhcnNlZFtpXSkKKwllbmQKKwlpZiBzdHJpbmcuc3ViKHBhdGgsIDEsIDEpID09ICIvIiB0aGVuIHBhcnNlZC5pc19hYnNvbHV0ZSA9IDEgZW5kCisJaWYgc3RyaW5nLnN1YihwYXRoLCAtMSwgLTEpID09ICIvIiB0aGVuIHBhcnNlZC5pc19kaXJlY3RvcnkgPSAxIGVuZAorCXJldHVybiBwYXJzZWQKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gQnVpbGRzIGEgcGF0aCBjb21wb25lbnQgZnJvbSBpdHMgc2VnbWVudHMsIGVzY2FwaW5nIHByb3RlY3RlZCBjaGFyYWN0ZXJzLgorLS0gSW5wdXQKKy0tICAgcGFyc2VkOiBwYXRoIHNlZ21lbnRzCistLSAgIHVuc2FmZTogaWYgdHJ1ZSwgc2VnbWVudHMgYXJlIG5vdCBwcm90ZWN0ZWQgYmVmb3JlIHBhdGggaXMgYnVpbHQKKy0tIFJldHVybnMKKy0tICAgcGF0aDogY29ycmVzcG9uZGluZyBwYXRoIHN0cmluZ2luZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIGJ1aWxkX3BhdGgocGFyc2VkLCB1bnNhZmUpCisJbG9jYWwgcGF0aCA9ICIiCisJbG9jYWwgbiA9IHRhYmxlLmdldG4ocGFyc2VkKQorCWlmIHVuc2FmZSB0aGVuCisJCWZvciBpID0gMSwgbi0xIGRvCisJCQlwYXRoID0gcGF0aCAuLiBwYXJzZWRbaV0KKwkJCXBhdGggPSBwYXRoIC4uICIvIgorCQllbmQKKwkJaWYgbiA+IDAgdGhlbgorCQkJcGF0aCA9IHBhdGggLi4gcGFyc2VkW25dCisJCQlpZiBwYXJzZWQuaXNfZGlyZWN0b3J5IHRoZW4gcGF0aCA9IHBhdGggLi4gIi8iIGVuZAorCQllbmQKKwllbHNlCisJCWZvciBpID0gMSwgbi0xIGRvCisJCQlwYXRoID0gcGF0aCAuLiBwcm90ZWN0X3NlZ21lbnQocGFyc2VkW2ldKQorCQkJcGF0aCA9IHBhdGggLi4gIi8iCisJCWVuZAorCQlpZiBuID4gMCB0aGVuCisJCQlwYXRoID0gcGF0aCAuLiBwcm90ZWN0X3NlZ21lbnQocGFyc2VkW25dKQorCQkJaWYgcGFyc2VkLmlzX2RpcmVjdG9yeSB0aGVuIHBhdGggPSBwYXRoIC4uICIvIiBlbmQKKwkJZW5kCisJZW5kCisJaWYgcGFyc2VkLmlzX2Fic29sdXRlIHRoZW4gcGF0aCA9ICIvIiAuLiBwYXRoIGVuZAorCXJldHVybiBwYXRoCitlbmQKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvdXNvY2tldC5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy91c29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjNmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvdXNvY2tldC5jCkBAIC0wLDAgKzEsMzcwIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBTb2NrZXQgY29tcGF0aWJpbGl6YXRpb24gbW9kdWxlIGZvciBVbml4CisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFRoZSBjb2RlIGlzIG5vdyBpbnRlcnJ1cHQtc2FmZS4KKyogVGhlIHBlbmFsdHkgb2YgY2FsbGluZyBzZWxlY3QgdG8gYXZvaWQgYnVzeS13YWl0IGlzIG9ubHkgcGFpZCB3aGVuCisqIHRoZSBJL08gY2FsbCBmYWlsIGluIHRoZSBmaXJzdCBwbGFjZS4gCisqCisqIFJDUyBJRDogJElkOiB1c29ja2V0LmMsdiAxLjM4IDIwMDcvMTAvMTMgMjM6NTU6MjAgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8c3RyaW5nLmg+IAorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAic29ja2V0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFdhaXQgZm9yIHJlYWRhYmxlL3dyaXRhYmxlL2Nvbm5lY3RlZCBzb2NrZXQgd2l0aCB0aW1lb3V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFNPQ0tFVF9QT0xMCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKworI2RlZmluZSBXQUlURkRfUiAgICAgICAgUE9MTElOCisjZGVmaW5lIFdBSVRGRF9XICAgICAgICBQT0xMT1VUCisjZGVmaW5lIFdBSVRGRF9DICAgICAgICAoUE9MTElOfFBPTExPVVQpCitpbnQgc29ja2V0X3dhaXRmZChwX3NvY2tldCBwcywgaW50IHN3LCBwX3RpbWVvdXQgdG0pIHsKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBwb2xsZmQgcGZkOworICAgIHBmZC5mZCA9ICpwczsKKyAgICBwZmQuZXZlbnRzID0gc3c7CisgICAgcGZkLnJldmVudHMgPSAwOworICAgIGlmICh0aW1lb3V0X2lzemVybyh0bSkpIHJldHVybiBJT19USU1FT1VUOyAgLyogb3B0aW1pemUgdGltZW91dCA9PSAwIGNhc2UgKi8KKyAgICBkbyB7CisJCWludCB0ID0gKGludCkodGltZW91dF9nZXRyZXRyeSh0bSkqMWUzKTsKKwkJcmV0ID0gcG9sbCgmcGZkLCAxLCB0ID49IDA/IHQ6IC0xKTsKKwl9IHdoaWxlIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworICAgIGlmIChyZXQgPT0gLTEpIHJldHVybiBlcnJubzsKKyAgICBpZiAocmV0ID09IDApIHJldHVybiBJT19USU1FT1VUOworICAgIGlmIChzdyA9PSBXQUlURkRfQyAmJiAocGZkLnJldmVudHMgJiAoUE9MTElOfFBPTExFUlIpKSkgcmV0dXJuIElPX0NMT1NFRDsKKyAgICByZXR1cm4gSU9fRE9ORTsKK30KKyNlbHNlCisKKyNkZWZpbmUgV0FJVEZEX1IgICAgICAgIDEKKyNkZWZpbmUgV0FJVEZEX1cgICAgICAgIDIKKyNkZWZpbmUgV0FJVEZEX0MgICAgICAgIChXQUlURkRfUnxXQUlURkRfVykKKworaW50IHNvY2tldF93YWl0ZmQocF9zb2NrZXQgcHMsIGludCBzdywgcF90aW1lb3V0IHRtKSB7CisgICAgaW50IHJldDsKKyAgICBmZF9zZXQgcmZkcywgd2ZkcywgKnJwLCAqd3A7CisgICAgc3RydWN0IHRpbWV2YWwgdHYsICp0cDsKKyAgICBkb3VibGUgdDsKKyAgICBpZiAodGltZW91dF9pc3plcm8odG0pKSByZXR1cm4gSU9fVElNRU9VVDsgIC8qIG9wdGltaXplIHRpbWVvdXQgPT0gMCBjYXNlICovCisgICAgZG8geworICAgICAgICAvKiBtdXN0IHNldCBiaXRzIHdpdGhpbiBsb29wLCBiZWNhdXNlIHNlbGVjdCBtYXkgaGF2ZSBtb2RpZmVkIHRoZW0gKi8KKyAgICAgICAgcnAgPSB3cCA9IE5VTEw7CisgICAgICAgIGlmIChzdyAmIFdBSVRGRF9SKSB7IEZEX1pFUk8oJnJmZHMpOyBGRF9TRVQoKnBzLCAmcmZkcyk7IHJwID0gJnJmZHM7IH0KKyAgICAgICAgaWYgKHN3ICYgV0FJVEZEX1cpIHsgRkRfWkVSTygmd2Zkcyk7IEZEX1NFVCgqcHMsICZ3ZmRzKTsgd3AgPSAmd2ZkczsgfQorICAgICAgICB0ID0gdGltZW91dF9nZXRyZXRyeSh0bSk7CisgICAgICAgIHRwID0gTlVMTDsKKyAgICAgICAgaWYgKHQgPj0gMC4wKSB7CisgICAgICAgICAgICB0di50dl9zZWMgPSAoaW50KXQ7CisgICAgICAgICAgICB0di50dl91c2VjID0gKGludCkoKHQtdHYudHZfc2VjKSoxLjBlNik7CisgICAgICAgICAgICB0cCA9ICZ0djsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBzZWxlY3QoKnBzKzEsIHJwLCB3cCwgTlVMTCwgdHApOworICAgIH0gd2hpbGUgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgaWYgKHJldCA9PSAtMSkgcmV0dXJuIGVycm5vOworICAgIGlmIChyZXQgPT0gMCkgcmV0dXJuIElPX1RJTUVPVVQ7CisgICAgaWYgKHN3ID09IFdBSVRGRF9DICYmIEZEX0lTU0VUKCpwcywgJnJmZHMpKSByZXR1cm4gSU9fQ0xPU0VEOworICAgIHJldHVybiBJT19ET05FOworfQorI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogSW5pdGlhbGl6ZXMgbW9kdWxlIAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfb3Blbih2b2lkKSB7CisgICAgLyogaW5zdGFscyBhIGhhbmRsZXIgdG8gaWdub3JlIHNpZ3BpcGUgb3IgaXQgd2lsbCBjcmFzaCB1cyAqLworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQ2xvc2UgbW9kdWxlIAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfY2xvc2Uodm9pZCkgeworICAgIHJldHVybiAxOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDbG9zZSBhbmQgaW51dGlsaXplIHNvY2tldAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc29ja2V0X2Rlc3Ryb3kocF9zb2NrZXQgcHMpIHsKKyAgICBpZiAoKnBzICE9IFNPQ0tFVF9JTlZBTElEKSB7CisgICAgICAgIHNvY2tldF9zZXRibG9ja2luZyhwcyk7CisgICAgICAgIGNsb3NlKCpwcyk7CisgICAgICAgICpwcyA9IFNPQ0tFVF9JTlZBTElEOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogU2VsZWN0IHdpdGggdGltZW91dCBjb250cm9sCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9zZWxlY3QodF9zb2NrZXQgbiwgZmRfc2V0ICpyZmRzLCBmZF9zZXQgKndmZHMsIGZkX3NldCAqZWZkcywgCisgICAgICAgIHBfdGltZW91dCB0bSkgeworICAgIGludCByZXQ7CisgICAgZG8geworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgZG91YmxlIHQgPSB0aW1lb3V0X2dldHJldHJ5KHRtKTsKKyAgICAgICAgdHYudHZfc2VjID0gKGludCkgdDsKKyAgICAgICAgdHYudHZfdXNlYyA9IChpbnQpICgodCAtIHR2LnR2X3NlYykgKiAxLjBlNik7CisgICAgICAgIC8qIHRpbWVvdXQgPSAwIG1lYW5zIG5vIHdhaXQgKi8KKyAgICAgICAgcmV0ID0gc2VsZWN0KG4sIHJmZHMsIHdmZHMsIGVmZHMsIHQgPj0gMC4wID8gJnR2OiBOVUxMKTsKKyAgICB9IHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDcmVhdGVzIGFuZCBzZXRzIHVwIGEgc29ja2V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9jcmVhdGUocF9zb2NrZXQgcHMsIGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpIHsKKyAgICAqcHMgPSBzb2NrZXQoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgaWYgKCpwcyAhPSBTT0NLRVRfSU5WQUxJRCkgcmV0dXJuIElPX0RPTkU7IAorICAgIGVsc2UgcmV0dXJuIGVycm5vOyAKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQmluZHMgb3IgcmV0dXJucyBlcnJvciBtZXNzYWdlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9iaW5kKHBfc29ja2V0IHBzLCBTQSAqYWRkciwgc29ja2xlbl90IGxlbikgeworICAgIGludCBlcnIgPSBJT19ET05FOworICAgIHNvY2tldF9zZXRibG9ja2luZyhwcyk7CisgICAgaWYgKGJpbmQoKnBzLCBhZGRyLCBsZW4pIDwgMCkgZXJyID0gZXJybm87IAorICAgIHNvY2tldF9zZXRub25ibG9ja2luZyhwcyk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgcHMsIGludCBiYWNrbG9nKSB7CisgICAgaW50IGVyciA9IElPX0RPTkU7IAorICAgIHNvY2tldF9zZXRibG9ja2luZyhwcyk7CisgICAgaWYgKGxpc3RlbigqcHMsIGJhY2tsb2cpKSBlcnIgPSBlcnJubzsgCisgICAgc29ja2V0X3NldG5vbmJsb2NraW5nKHBzKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNvY2tldF9zaHV0ZG93bihwX3NvY2tldCBwcywgaW50IGhvdykgeworICAgIHNvY2tldF9zZXRibG9ja2luZyhwcyk7CisgICAgc2h1dGRvd24oKnBzLCBob3cpOworICAgIHNvY2tldF9zZXRub25ibG9ja2luZyhwcyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIENvbm5lY3RzIG9yIHJldHVybnMgZXJyb3IgbWVzc2FnZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfY29ubmVjdChwX3NvY2tldCBwcywgU0EgKmFkZHIsIHNvY2tsZW5fdCBsZW4sIHBfdGltZW91dCB0bSkgeworICAgIGludCBlcnI7CisgICAgLyogYXZvaWQgY2FsbGluZyBvbiBjbG9zZWQgc29ja2V0cyAqLworICAgIGlmICgqcHMgPT0gU09DS0VUX0lOVkFMSUQpIHJldHVybiBJT19DTE9TRUQ7CisgICAgLyogY2FsbCBjb25uZWN0IHVudGlsIGRvbmUgb3IgZmFpbGVkIHdpdGhvdXQgYmVpbmcgaW50ZXJydXB0ZWQgKi8KKyAgICBkbyBpZiAoY29ubmVjdCgqcHMsIGFkZHIsIGxlbikgPT0gMCkgcmV0dXJuIElPX0RPTkU7CisgICAgd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOworICAgIC8qIGlmIGNvbm5lY3Rpb24gZmFpbGVkIGltbWVkaWF0ZWx5LCByZXR1cm4gZXJyb3IgY29kZSAqLworICAgIGlmIChlcnIgIT0gRUlOUFJPR1JFU1MgJiYgZXJyICE9IEVBR0FJTikgcmV0dXJuIGVycjsgCisgICAgLyogemVybyB0aW1lb3V0IGNhc2Ugb3B0aW1pemF0aW9uICovCisgICAgaWYgKHRpbWVvdXRfaXN6ZXJvKHRtKSkgcmV0dXJuIElPX1RJTUVPVVQ7CisgICAgLyogd2FpdCB1bnRpbCB3ZSBoYXZlIHRoZSByZXN1bHQgb2YgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCBvciB0aW1lb3V0ICovCisgICAgZXJyID0gc29ja2V0X3dhaXRmZChwcywgV0FJVEZEX0MsIHRtKTsKKyAgICBpZiAoZXJyID09IElPX0NMT1NFRCkgeworICAgICAgICBpZiAocmVjdigqcHMsIChjaGFyICopICZlcnIsIDAsIDApID09IDApIHJldHVybiBJT19ET05FOworICAgICAgICBlbHNlIHJldHVybiBlcnJubzsKKyAgICB9IGVsc2UgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQWNjZXB0IHdpdGggdGltZW91dAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHBzLCBwX3NvY2tldCBwYSwgU0EgKmFkZHIsIHNvY2tsZW5fdCAqbGVuLCBwX3RpbWVvdXQgdG0pIHsKKyAgICBTQSBkYWRkcjsKKyAgICBzb2NrbGVuX3QgZGxlbiA9IHNpemVvZihkYWRkcik7CisgICAgaWYgKCpwcyA9PSBTT0NLRVRfSU5WQUxJRCkgcmV0dXJuIElPX0NMT1NFRDsgCisgICAgaWYgKCFhZGRyKSBhZGRyID0gJmRhZGRyOworICAgIGlmICghbGVuKSBsZW4gPSAmZGxlbjsKKyAgICBmb3IgKCA7OyApIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgaWYgKCgqcGEgPSBhY2NlcHQoKnBzLCBhZGRyLCBsZW4pKSAhPSBTT0NLRVRfSU5WQUxJRCkgcmV0dXJuIElPX0RPTkU7CisgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICBpZiAoZXJyID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGVyciAhPSBFQUdBSU4gJiYgZXJyICE9IEVDT05OQUJPUlRFRCkgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChlcnIgPSBzb2NrZXRfd2FpdGZkKHBzLCBXQUlURkRfUiwgdG0pKSAhPSBJT19ET05FKSByZXR1cm4gZXJyOworICAgIH0KKyAgICAvKiBjYW4ndCByZWFjaCBoZXJlICovCisgICAgcmV0dXJuIElPX1VOS05PV047Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNlbmQgd2l0aCB0aW1lb3V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9zZW5kKHBfc29ja2V0IHBzLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQsIAorICAgICAgICBzaXplX3QgKnNlbnQsIHBfdGltZW91dCB0bSkKK3sKKyAgICBpbnQgZXJyOworICAgICpzZW50ID0gMDsKKyAgICAvKiBhdm9pZCBtYWtpbmcgc3lzdGVtIGNhbGxzIG9uIGNsb3NlZCBzb2NrZXRzICovCisgICAgaWYgKCpwcyA9PSBTT0NLRVRfSU5WQUxJRCkgcmV0dXJuIElPX0NMT1NFRDsKKyAgICAvKiBsb29wIHVudGlsIHdlIHNlbmQgc29tZXRoaW5nIG9yIHdlIGdpdmUgdXAgb24gZXJyb3IgKi8KKyAgICBmb3IgKCA7OyApIHsKKyAgICAgICAgbG9uZyBwdXQgPSAobG9uZykgc2VuZCgqcHMsIGRhdGEsIGNvdW50LCAwKTsKKyAgICAgICAgLyogaWYgd2Ugc2VudCBhbnl0aGluZywgd2UgYXJlIGRvbmUgKi8KKyAgICAgICAgaWYgKHB1dCA+IDApIHsKKyAgICAgICAgICAgICpzZW50ID0gcHV0OworICAgICAgICAgICAgcmV0dXJuIElPX0RPTkU7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gZXJybm87CisgICAgICAgIC8qIHNlbmQgY2FuJ3QgcmVhbGx5IHJldHVybiAwLCBidXQgRVBJUEUgbWVhbnMgdGhlIGNvbm5lY3Rpb24gd2FzIAorICAgICAgICAgICBjbG9zZWQgKi8KKyAgICAgICAgaWYgKHB1dCA9PSAwIHx8IGVyciA9PSBFUElQRSkgcmV0dXJuIElPX0NMT1NFRDsKKyAgICAgICAgLyogd2UgY2FsbCB3YXMgaW50ZXJydXB0ZWQsIGp1c3QgdHJ5IGFnYWluICovCisgICAgICAgIGlmIChlcnIgPT0gRUlOVFIpIGNvbnRpbnVlOworICAgICAgICAvKiBpZiBmYWlsZWQgZmF0YWwgcmVhc29uLCByZXBvcnQgZXJyb3IgKi8KKyAgICAgICAgaWYgKGVyciAhPSBFQUdBSU4pIHJldHVybiBlcnI7CisgICAgICAgIC8qIHdhaXQgdW50aWwgd2UgY2FuIHNlbmQgc29tZXRoaW5nIG9yIHdlIHRpbWVvdXQgKi8KKyAgICAgICAgaWYgKChlcnIgPSBzb2NrZXRfd2FpdGZkKHBzLCBXQUlURkRfVywgdG0pKSAhPSBJT19ET05FKSByZXR1cm4gZXJyOworICAgIH0KKyAgICAvKiBjYW4ndCByZWFjaCBoZXJlICovCisgICAgcmV0dXJuIElPX1VOS05PV047Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNlbmR0byB3aXRoIHRpbWVvdXQKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgc29ja2V0X3NlbmR0byhwX3NvY2tldCBwcywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCBzaXplX3QgKnNlbnQsIAorICAgICAgICBTQSAqYWRkciwgc29ja2xlbl90IGxlbiwgcF90aW1lb3V0IHRtKQoreworICAgIGludCBlcnI7CisgICAgKnNlbnQgPSAwOworICAgIGlmICgqcHMgPT0gU09DS0VUX0lOVkFMSUQpIHJldHVybiBJT19DTE9TRUQ7CisgICAgZm9yICggOzsgKSB7CisgICAgICAgIGxvbmcgcHV0ID0gKGxvbmcpIHNlbmR0bygqcHMsIGRhdGEsIGNvdW50LCAwLCBhZGRyLCBsZW4pOyAgCisgICAgICAgIGlmIChwdXQgPiAwKSB7CisgICAgICAgICAgICAqc2VudCA9IHB1dDsKKyAgICAgICAgICAgIHJldHVybiBJT19ET05FOworICAgICAgICB9CisgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICBpZiAocHV0ID09IDAgfHwgZXJyID09IEVQSVBFKSByZXR1cm4gSU9fQ0xPU0VEOworICAgICAgICBpZiAoZXJyID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGVyciAhPSBFQUdBSU4pIHJldHVybiBlcnI7CisgICAgICAgIGlmICgoZXJyID0gc29ja2V0X3dhaXRmZChwcywgV0FJVEZEX1csIHRtKSkgIT0gSU9fRE9ORSkgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIElPX1VOS05PV047Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJlY2VpdmUgd2l0aCB0aW1lb3V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9yZWN2KHBfc29ja2V0IHBzLCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQsIHNpemVfdCAqZ290LCBwX3RpbWVvdXQgdG0pIHsKKyAgICBpbnQgZXJyOworICAgICpnb3QgPSAwOworICAgIGlmICgqcHMgPT0gU09DS0VUX0lOVkFMSUQpIHJldHVybiBJT19DTE9TRUQ7CisgICAgZm9yICggOzsgKSB7CisgICAgICAgIGxvbmcgdGFrZW4gPSAobG9uZykgcmVjdigqcHMsIGRhdGEsIGNvdW50LCAwKTsKKyAgICAgICAgaWYgKHRha2VuID4gMCkgeworICAgICAgICAgICAgKmdvdCA9IHRha2VuOworICAgICAgICAgICAgcmV0dXJuIElPX0RPTkU7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gZXJybm87CisgICAgICAgIGlmICh0YWtlbiA9PSAwKSByZXR1cm4gSU9fQ0xPU0VEOworICAgICAgICBpZiAoZXJyID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGVyciAhPSBFQUdBSU4pIHJldHVybiBlcnI7IAorICAgICAgICBpZiAoKGVyciA9IHNvY2tldF93YWl0ZmQocHMsIFdBSVRGRF9SLCB0bSkpICE9IElPX0RPTkUpIHJldHVybiBlcnI7IAorICAgIH0KKyAgICByZXR1cm4gSU9fVU5LTk9XTjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUmVjdmZyb20gd2l0aCB0aW1lb3V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9yZWN2ZnJvbShwX3NvY2tldCBwcywgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCBzaXplX3QgKmdvdCwgCisgICAgICAgIFNBICphZGRyLCBzb2NrbGVuX3QgKmxlbiwgcF90aW1lb3V0IHRtKSB7CisgICAgaW50IGVycjsKKyAgICAqZ290ID0gMDsKKyAgICBpZiAoKnBzID09IFNPQ0tFVF9JTlZBTElEKSByZXR1cm4gSU9fQ0xPU0VEOworICAgIGZvciAoIDs7ICkgeworICAgICAgICBsb25nIHRha2VuID0gKGxvbmcpIHJlY3Zmcm9tKCpwcywgZGF0YSwgY291bnQsIDAsIGFkZHIsIGxlbik7CisgICAgICAgIGlmICh0YWtlbiA+IDApIHsKKyAgICAgICAgICAgICpnb3QgPSB0YWtlbjsKKyAgICAgICAgICAgIHJldHVybiBJT19ET05FOworICAgICAgICB9CisgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICBpZiAodGFrZW4gPT0gMCkgcmV0dXJuIElPX0NMT1NFRDsKKyAgICAgICAgaWYgKGVyciA9PSBFSU5UUikgY29udGludWU7CisgICAgICAgIGlmIChlcnIgIT0gRUFHQUlOKSByZXR1cm4gZXJyOyAKKyAgICAgICAgaWYgKChlcnIgPSBzb2NrZXRfd2FpdGZkKHBzLCBXQUlURkRfUiwgdG0pKSAhPSBJT19ET05FKSByZXR1cm4gZXJyOyAKKyAgICB9CisgICAgcmV0dXJuIElPX1VOS05PV047Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFB1dCBzb2NrZXQgaW50byBibG9ja2luZyBtb2RlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgcHMpIHsKKyAgICBpbnQgZmxhZ3MgPSBmY250bCgqcHMsIEZfR0VURkwsIDApOworICAgIGZsYWdzICY9ICh+KE9fTk9OQkxPQ0spKTsKKyAgICBmY250bCgqcHMsIEZfU0VURkwsIGZsYWdzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUHV0IHNvY2tldCBpbnRvIG5vbi1ibG9ja2luZyBtb2RlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgcHMpIHsKKyAgICBpbnQgZmxhZ3MgPSBmY250bCgqcHMsIEZfR0VURkwsIDApOworICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgZmNudGwoKnBzLCBGX1NFVEZMLCBmbGFncyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIEROUyBoZWxwZXJzIAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfZ2V0aG9zdGJ5YWRkcihjb25zdCBjaGFyICphZGRyLCBzb2NrbGVuX3QgbGVuLCBzdHJ1Y3QgaG9zdGVudCAqKmhwKSB7CisgICAgKmhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBsZW4sIEFGX0lORVQpOworICAgIGlmICgqaHApIHJldHVybiBJT19ET05FOworICAgIGVsc2UgaWYgKGhfZXJybm8pIHJldHVybiBoX2Vycm5vOworICAgIGVsc2UgaWYgKGVycm5vKSByZXR1cm4gZXJybm87CisgICAgZWxzZSByZXR1cm4gSU9fVU5LTk9XTjsKK30KKworaW50IHNvY2tldF9nZXRob3N0YnluYW1lKGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBob3N0ZW50ICoqaHApIHsKKyAgICAqaHAgPSBnZXRob3N0YnluYW1lKGFkZHIpOworICAgIGlmICgqaHApIHJldHVybiBJT19ET05FOworICAgIGVsc2UgaWYgKGhfZXJybm8pIHJldHVybiBoX2Vycm5vOworICAgIGVsc2UgaWYgKGVycm5vKSByZXR1cm4gZXJybm87CisgICAgZWxzZSByZXR1cm4gSU9fVU5LTk9XTjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogRXJyb3IgdHJhbnNsYXRpb24gZnVuY3Rpb25zCisqIE1ha2Ugc3VyZSBpbXBvcnRhbnQgZXJyb3IgbWVzc2FnZXMgYXJlIHN0YW5kYXJkCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY29uc3QgY2hhciAqc29ja2V0X2hvc3RzdHJlcnJvcihpbnQgZXJyKSB7CisgICAgaWYgKGVyciA8PSAwKSByZXR1cm4gaW9fc3RyZXJyb3IoZXJyKTsKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIEhPU1RfTk9UX0ZPVU5EOiByZXR1cm4gImhvc3Qgbm90IGZvdW5kIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGhzdHJlcnJvcihlcnIpOworICAgIH0KK30KKworY29uc3QgY2hhciAqc29ja2V0X3N0cmVycm9yKGludCBlcnIpIHsKKyAgICBpZiAoZXJyIDw9IDApIHJldHVybiBpb19zdHJlcnJvcihlcnIpOworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgRUFERFJJTlVTRTogcmV0dXJuICJhZGRyZXNzIGFscmVhZHkgaW4gdXNlIjsKKyAgICAgICAgY2FzZSBFSVNDT05OOiByZXR1cm4gImFscmVhZHkgY29ubmVjdGVkIjsKKyAgICAgICAgY2FzZSBFQUNDRVM6IHJldHVybiAicGVybWlzc2lvbiBkZW5pZWQiOworICAgICAgICBjYXNlIEVDT05OUkVGVVNFRDogcmV0dXJuICJjb25uZWN0aW9uIHJlZnVzZWQiOworICAgICAgICBjYXNlIEVDT05OQUJPUlRFRDogcmV0dXJuICJjbG9zZWQiOworICAgICAgICBjYXNlIEVDT05OUkVTRVQ6IHJldHVybiAiY2xvc2VkIjsKKyAgICAgICAgY2FzZSBFVElNRURPVVQ6IHJldHVybiAidGltZW91dCI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBzdHJlcnJvcihlcnJubyk7CisgICAgfQorfQorCitjb25zdCBjaGFyICpzb2NrZXRfaW9lcnJvcihwX3NvY2tldCBwcywgaW50IGVycikgeworICAgICh2b2lkKSBwczsKKyAgICByZXR1cm4gc29ja2V0X3N0cmVycm9yKGVycik7Cit9IApkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy91c29ja2V0LmggYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3Vzb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE4OWFhCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy91c29ja2V0LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBVU09DS0VUX0gKKyNkZWZpbmUgVVNPQ0tFVF9ICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBTb2NrZXQgY29tcGF0aWJpbGl6YXRpb24gbW9kdWxlIGZvciBVbml4CisqIEx1YVNvY2tldCB0b29sa2l0CisqCisqIFJDUyBJRDogJElkOiB1c29ja2V0LmgsdiAxLjcgMjAwNS8xMC8wNyAwNDo0MDo1OSBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KlwKKyogQlNEIGluY2x1ZGUgZmlsZXMKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBlcnJvciBjb2RlcyAqLworI2luY2x1ZGUgPGVycm5vLmg+CisvKiBjbG9zZSBmdW5jdGlvbiAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorLyogZm5jdG5sIGZ1bmN0aW9uIGFuZCBhc3NvY2lhdGVkIGNvbnN0YW50cyAqLworI2luY2x1ZGUgPGZjbnRsLmg+CisvKiBzdHJ1Y3Qgc29ja2FkZHIgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy8qIHNvY2tldCBmdW5jdGlvbiAqLworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKy8qIHN0cnVjdCB0aW1ldmFsICovCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKy8qIGdldGhvc3RieW5hbWUgYW5kIGdldGhvc3RieWFkZHIgZnVuY3Rpb25zICovCisjaW5jbHVkZSA8bmV0ZGIuaD4KKy8qIHNpZ3BpcGUgaGFuZGxpbmcgKi8KKyNpbmNsdWRlIDxzaWduYWwuaD4KKy8qIElQIHN0dWZmKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisvKiBUQ1Agb3B0aW9ucyAobmFnbGUgYWxnb3JpdGhtIGRpc2FibGUpICovCisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKwordHlwZWRlZiBpbnQgdF9zb2NrZXQ7Cit0eXBlZGVmIHRfc29ja2V0ICpwX3NvY2tldDsKKworI2RlZmluZSBTT0NLRVRfSU5WQUxJRCAoLTEpCisKKyNlbmRpZiAvKiBVU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi9zcmMvd3NvY2tldC5jIGIvbHVhc29ja2V0LTIuMC4yL3NyYy93c29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyMjU2NQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi9zcmMvd3NvY2tldC5jCkBAIC0wLDAgKzEsNDAxIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBTb2NrZXQgY29tcGF0aWJpbGl6YXRpb24gbW9kdWxlIGZvciBXaW4zMgorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBUaGUgcGVuYWx0eSBvZiBjYWxsaW5nIHNlbGVjdCB0byBhdm9pZCBidXN5LXdhaXQgaXMgb25seSBwYWlkIHdoZW4KKyogdGhlIEkvTyBjYWxsIGZhaWwgaW4gdGhlIGZpcnN0IHBsYWNlLiAKKyoKKyogUkNTIElEOiAkSWQ6IHdzb2NrZXQuYyx2IDEuMzYgMjAwNy8wNi8xMSAyMzo0NDo1NCBkaWVnbyBFeHAgJAorXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInNvY2tldC5oIgorCisvKiBXaW5Tb2NrIGRvZXNuJ3QgaGF2ZSBhIHN0cmVycm9yLi4uICovCitzdGF0aWMgY29uc3QgY2hhciAqd3N0cmVycm9yKGludCBlcnIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBJbml0aWFsaXplcyBtb2R1bGUgCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9vcGVuKHZvaWQpIHsKKyAgICBXU0FEQVRBIHdzYURhdGE7CisgICAgV09SRCB3VmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEKDIsIDApOyAKKyAgICBpbnQgZXJyID0gV1NBU3RhcnR1cCh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEgKTsKKyAgICBpZiAoZXJyICE9IDApIHJldHVybiAwOworICAgIGlmICgoTE9CWVRFKHdzYURhdGEud1ZlcnNpb24pICE9IDIgfHwgSElCWVRFKHdzYURhdGEud1ZlcnNpb24pICE9IDApICYmCisgICAgICAgIChMT0JZVEUod3NhRGF0YS53VmVyc2lvbikgIT0gMSB8fCBISUJZVEUod3NhRGF0YS53VmVyc2lvbikgIT0gMSkpIHsKKyAgICAgICAgV1NBQ2xlYW51cCgpOworICAgICAgICByZXR1cm4gMDsgCisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDbG9zZSBtb2R1bGUgCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9jbG9zZSh2b2lkKSB7CisgICAgV1NBQ2xlYW51cCgpOworICAgIHJldHVybiAxOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBXYWl0IGZvciByZWFkYWJsZS93cml0YWJsZS9jb25uZWN0ZWQgc29ja2V0IHdpdGggdGltZW91dAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0FJVEZEX1IgICAgICAgIDEKKyNkZWZpbmUgV0FJVEZEX1cgICAgICAgIDIKKyNkZWZpbmUgV0FJVEZEX0UgICAgICAgIDQKKyNkZWZpbmUgV0FJVEZEX0MgICAgICAgIChXQUlURkRfRXxXQUlURkRfVykKKworaW50IHNvY2tldF93YWl0ZmQocF9zb2NrZXQgcHMsIGludCBzdywgcF90aW1lb3V0IHRtKSB7CisgICAgaW50IHJldDsKKyAgICBmZF9zZXQgcmZkcywgd2ZkcywgZWZkcywgKnJwID0gTlVMTCwgKndwID0gTlVMTCwgKmVwID0gTlVMTDsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0diwgKnRwID0gTlVMTDsKKyAgICBkb3VibGUgdDsKKyAgICBpZiAodGltZW91dF9pc3plcm8odG0pKSByZXR1cm4gSU9fVElNRU9VVDsgIC8qIG9wdGltaXplIHRpbWVvdXQgPT0gMCBjYXNlICovCisgICAgaWYgKHN3ICYgV0FJVEZEX1IpIHsgCisgICAgICAgIEZEX1pFUk8oJnJmZHMpOyAKKwkJRkRfU0VUKCpwcywgJnJmZHMpOworICAgICAgICBycCA9ICZyZmRzOyAKKyAgICB9CisgICAgaWYgKHN3ICYgV0FJVEZEX1cpIHsgRkRfWkVSTygmd2Zkcyk7IEZEX1NFVCgqcHMsICZ3ZmRzKTsgd3AgPSAmd2ZkczsgfQorICAgIGlmIChzdyAmIFdBSVRGRF9DKSB7IEZEX1pFUk8oJmVmZHMpOyBGRF9TRVQoKnBzLCAmZWZkcyk7IGVwID0gJmVmZHM7IH0KKyAgICBpZiAoKHQgPSB0aW1lb3V0X2dldCh0bSkpID49IDAuMCkgeworICAgICAgICB0di50dl9zZWMgPSAoaW50KSB0OworICAgICAgICB0di50dl91c2VjID0gKGludCkgKCh0LXR2LnR2X3NlYykqMS4wZTYpOworICAgICAgICB0cCA9ICZ0djsKKyAgICB9CisgICAgcmV0ID0gc2VsZWN0KDAsIHJwLCB3cCwgZXAsIHRwKTsKKyAgICBpZiAocmV0ID09IC0xKSByZXR1cm4gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKHJldCA9PSAwKSByZXR1cm4gSU9fVElNRU9VVDsKKyAgICBpZiAoc3cgPT0gV0FJVEZEX0MgJiYgRkRfSVNTRVQoKnBzLCAmZWZkcykpIHJldHVybiBJT19DTE9TRUQ7CisgICAgcmV0dXJuIElPX0RPTkU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNlbGVjdCB3aXRoIGludCB0aW1lb3V0IGluIG1zCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9zZWxlY3QodF9zb2NrZXQgbiwgZmRfc2V0ICpyZmRzLCBmZF9zZXQgKndmZHMsIGZkX3NldCAqZWZkcywgCisgICAgICAgIHBfdGltZW91dCB0bSkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OyAKKyAgICBkb3VibGUgdCA9IHRpbWVvdXRfZ2V0KHRtKTsKKyAgICB0di50dl9zZWMgPSAoaW50KSB0OworICAgIHR2LnR2X3VzZWMgPSAoaW50KSAoKHQgLSB0di50dl9zZWMpICogMS4wZTYpOworICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgU2xlZXAoKERXT1JEKSAoMTAwMCp0KSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSByZXR1cm4gc2VsZWN0KDAsIHJmZHMsIHdmZHMsIGVmZHMsIHQgPj0gMC4wPyAmdHY6IE5VTEwpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDbG9zZSBhbmQgaW51dGlsaXplIHNvY2tldAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc29ja2V0X2Rlc3Ryb3kocF9zb2NrZXQgcHMpIHsKKyAgICBpZiAoKnBzICE9IFNPQ0tFVF9JTlZBTElEKSB7CisgICAgICAgIHNvY2tldF9zZXRibG9ja2luZyhwcyk7IC8qIGNsb3NlIGNhbiB0YWtlIGEgbG9uZyB0aW1lIG9uIFdJTjMyICovCisgICAgICAgIGNsb3Nlc29ja2V0KCpwcyk7CisgICAgICAgICpwcyA9IFNPQ0tFVF9JTlZBTElEOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzb2NrZXRfc2h1dGRvd24ocF9zb2NrZXQgcHMsIGludCBob3cpIHsKKyAgICBzb2NrZXRfc2V0YmxvY2tpbmcocHMpOworICAgIHNodXRkb3duKCpwcywgaG93KTsKKyAgICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBDcmVhdGVzIGFuZCBzZXRzIHVwIGEgc29ja2V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9jcmVhdGUocF9zb2NrZXQgcHMsIGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpIHsKKyAgICAqcHMgPSBzb2NrZXQoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgaWYgKCpwcyAhPSBTT0NLRVRfSU5WQUxJRCkgcmV0dXJuIElPX0RPTkU7CisgICAgZWxzZSByZXR1cm4gV1NBR2V0TGFzdEVycm9yKCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIENvbm5lY3RzIG9yIHJldHVybnMgZXJyb3IgbWVzc2FnZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfY29ubmVjdChwX3NvY2tldCBwcywgU0EgKmFkZHIsIHNvY2tsZW5fdCBsZW4sIHBfdGltZW91dCB0bSkgeworICAgIGludCBlcnI7CisgICAgLyogZG9uJ3QgY2FsbCBvbiBjbG9zZWQgc29ja2V0ICovCisgICAgaWYgKCpwcyA9PSBTT0NLRVRfSU5WQUxJRCkgcmV0dXJuIElPX0NMT1NFRDsKKyAgICAvKiBhc2sgc3lzdGVtIHRvIGNvbm5lY3QgKi8KKyAgICBpZiAoY29ubmVjdCgqcHMsIGFkZHIsIGxlbikgPT0gMCkgcmV0dXJuIElPX0RPTkU7CisgICAgLyogbWFrZSBzdXJlIHRoZSBzeXN0ZW0gaXMgdHJ5aW5nIHRvIGNvbm5lY3QgKi8KKyAgICBlcnIgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICBpZiAoZXJyICE9IFdTQUVXT1VMREJMT0NLICYmIGVyciAhPSBXU0FFSU5QUk9HUkVTUykgcmV0dXJuIGVycjsKKyAgICAvKiB6ZXJvIHRpbWVvdXQgY2FzZSBvcHRpbWl6YXRpb24gKi8KKyAgICBpZiAodGltZW91dF9pc3plcm8odG0pKSByZXR1cm4gSU9fVElNRU9VVDsKKyAgICAvKiB3ZSB3YWl0IHVudGlsIHNvbWV0aGluZyBoYXBwZW5zICovCisgICAgZXJyID0gc29ja2V0X3dhaXRmZChwcywgV0FJVEZEX0MsIHRtKTsKKyAgICBpZiAoZXJyID09IElPX0NMT1NFRCkgeworICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGVycik7CisgICAgICAgIC8qIGdpdmUgd2luZG93cyB0aW1lIHRvIHNldCB0aGUgZXJyb3IgKHllcywgZGlzZ3VzdGluZykgKi8KKyAgICAgICAgU2xlZXAoMTApOworICAgICAgICAvKiBmaW5kIG91dCB3aHkgd2UgZmFpbGVkICovCisgICAgICAgIGdldHNvY2tvcHQoKnBzLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKGNoYXIgKikmZXJyLCAmbGVuKTsgCisgICAgICAgIC8qIHdlIEtOT1cgdGhlcmUgd2FzIGFuIGVycm9yLiBpZiAnd2h5JyBpcyAwLCB3ZSB3aWxsIHJldHVybgorICAgICAgICAqICJ1bmtub3duIGVycm9yIiwgYnV0IGl0J3Mgbm90IHJlYWxseSBvdXIgZmF1bHQgKi8KKyAgICAgICAgcmV0dXJuIGVyciA+IDA/IGVycjogSU9fVU5LTk9XTjsgCisgICAgfSBlbHNlIHJldHVybiBlcnI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQmluZHMgb3IgcmV0dXJucyBlcnJvciBtZXNzYWdlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9iaW5kKHBfc29ja2V0IHBzLCBTQSAqYWRkciwgc29ja2xlbl90IGxlbikgeworICAgIGludCBlcnIgPSBJT19ET05FOworICAgIHNvY2tldF9zZXRibG9ja2luZyhwcyk7CisgICAgaWYgKGJpbmQoKnBzLCBhZGRyLCBsZW4pIDwgMCkgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgc29ja2V0X3NldG5vbmJsb2NraW5nKHBzKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgc29ja2V0X2xpc3RlbihwX3NvY2tldCBwcywgaW50IGJhY2tsb2cpIHsKKyAgICBpbnQgZXJyID0gSU9fRE9ORTsKKyAgICBzb2NrZXRfc2V0YmxvY2tpbmcocHMpOworICAgIGlmIChsaXN0ZW4oKnBzLCBiYWNrbG9nKSA8IDApIGVyciA9IFdTQUdldExhc3RFcnJvcigpOworICAgIHNvY2tldF9zZXRub25ibG9ja2luZyhwcyk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogQWNjZXB0IHdpdGggdGltZW91dAorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHBzLCBwX3NvY2tldCBwYSwgU0EgKmFkZHIsIHNvY2tsZW5fdCAqbGVuLCAKKyAgICAgICAgcF90aW1lb3V0IHRtKSB7CisgICAgU0EgZGFkZHI7CisgICAgc29ja2xlbl90IGRsZW4gPSBzaXplb2YoZGFkZHIpOworICAgIGlmICgqcHMgPT0gU09DS0VUX0lOVkFMSUQpIHJldHVybiBJT19DTE9TRUQ7CisgICAgaWYgKCFhZGRyKSBhZGRyID0gJmRhZGRyOworICAgIGlmICghbGVuKSBsZW4gPSAmZGxlbjsKKyAgICBmb3IgKCA7OyApIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgLyogdHJ5IHRvIGdldCBjbGllbnQgc29ja2V0ICovCisgICAgICAgIGlmICgoKnBhID0gYWNjZXB0KCpwcywgYWRkciwgbGVuKSkgIT0gU09DS0VUX0lOVkFMSUQpIHJldHVybiBJT19ET05FOworICAgICAgICAvKiBmaW5kIG91dCB3aHkgd2UgZmFpbGVkICovCisgICAgICAgIGVyciA9IFdTQUdldExhc3RFcnJvcigpOyAKKyAgICAgICAgLyogaWYgd2UgZmFpbGVkIGJlY2F1c2UgdGhlcmUgd2FzIG5vIGNvbm5lY3RvaW4sIGtlZXAgdHJ5aW5nICovCisgICAgICAgIGlmIChlcnIgIT0gV1NBRVdPVUxEQkxPQ0sgJiYgZXJyICE9IFdTQUVDT05OQUJPUlRFRCkgcmV0dXJuIGVycjsKKyAgICAgICAgLyogY2FsbCBzZWxlY3QgdG8gYXZvaWQgYnVzeSB3YWl0ICovCisgICAgICAgIGlmICgoZXJyID0gc29ja2V0X3dhaXRmZChwcywgV0FJVEZEX1IsIHRtKSkgIT0gSU9fRE9ORSkgcmV0dXJuIGVycjsKKyAgICB9IAorICAgIC8qIGNhbid0IHJlYWNoIGhlcmUgKi8KKyAgICByZXR1cm4gSU9fVU5LTk9XTjsgCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFNlbmQgd2l0aCB0aW1lb3V0CisqIE9uIHdpbmRvd3MsIGlmIHlvdSB0cnkgdG8gc2VuZCAxME1CLCB0aGUgT1Mgd2lsbCBidWZmZXIgRVZFUllUSElORyAKKyogdGhpcyBjYW4gdGFrZSBhbiBhd2Z1bCBsb3Qgb2YgdGltZSBhbmQgd2Ugd2lsbCBlbmQgdXAgYmxvY2tlZC4gCisqIFRoZXJlZm9yZSwgd2hvZXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgcGFzcyBhIGh1Z2UgYnVmZmVyLgorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBzb2NrZXRfc2VuZChwX3NvY2tldCBwcywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCAKKyAgICAgICAgc2l6ZV90ICpzZW50LCBwX3RpbWVvdXQgdG0pCit7CisgICAgaW50IGVycjsKKyAgICAqc2VudCA9IDA7CisgICAgLyogYXZvaWQgbWFraW5nIHN5c3RlbSBjYWxscyBvbiBjbG9zZWQgc29ja2V0cyAqLworICAgIGlmICgqcHMgPT0gU09DS0VUX0lOVkFMSUQpIHJldHVybiBJT19DTE9TRUQ7CisgICAgLyogbG9vcCB1bnRpbCB3ZSBzZW5kIHNvbWV0aGluZyBvciB3ZSBnaXZlIHVwIG9uIGVycm9yICovCisgICAgZm9yICggOzsgKSB7CisgICAgICAgIC8qIHRyeSB0byBzZW5kIHNvbWV0aGluZyAqLworCQlpbnQgcHV0ID0gc2VuZCgqcHMsIGRhdGEsIChpbnQpIGNvdW50LCAwKTsKKyAgICAgICAgLyogaWYgd2Ugc2VudCBzb21ldGhpbmcsIHdlIGFyZSBkb25lICovCisgICAgICAgIGlmIChwdXQgPiAwKSB7CisgICAgICAgICAgICAqc2VudCA9IHB1dDsKKyAgICAgICAgICAgIHJldHVybiBJT19ET05FOworICAgICAgICB9CisgICAgICAgIC8qIGRlYWwgd2l0aCBmYWlsdXJlICovCisgICAgICAgIGVyciA9IFdTQUdldExhc3RFcnJvcigpOyAKKyAgICAgICAgLyogd2UgY2FuIG9ubHkgcHJvY2VlZCBpZiB0aGVyZSB3YXMgbm8gc2VyaW91cyBlcnJvciAqLworICAgICAgICBpZiAoZXJyICE9IFdTQUVXT1VMREJMT0NLKSByZXR1cm4gZXJyOworICAgICAgICAvKiBhdm9pZCBidXN5IHdhaXQgKi8KKyAgICAgICAgaWYgKChlcnIgPSBzb2NrZXRfd2FpdGZkKHBzLCBXQUlURkRfVywgdG0pKSAhPSBJT19ET05FKSByZXR1cm4gZXJyOworICAgIH0gCisgICAgLyogY2FuJ3QgcmVhY2ggaGVyZSAqLworICAgIHJldHVybiBJT19VTktOT1dOOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBTZW5kdG8gd2l0aCB0aW1lb3V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9zZW5kdG8ocF9zb2NrZXQgcHMsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCwgc2l6ZV90ICpzZW50LCAKKyAgICAgICAgU0EgKmFkZHIsIHNvY2tsZW5fdCBsZW4sIHBfdGltZW91dCB0bSkKK3sKKyAgICBpbnQgZXJyOworICAgICpzZW50ID0gMDsKKyAgICBpZiAoKnBzID09IFNPQ0tFVF9JTlZBTElEKSByZXR1cm4gSU9fQ0xPU0VEOworICAgIGZvciAoIDs7ICkgeworICAgICAgICBpbnQgcHV0ID0gc2VuZHRvKCpwcywgZGF0YSwgKGludCkgY291bnQsIDAsIGFkZHIsIGxlbik7CisgICAgICAgIGlmIChwdXQgPiAwKSB7CisgICAgICAgICAgICAqc2VudCA9IHB1dDsKKyAgICAgICAgICAgIHJldHVybiBJT19ET05FOworICAgICAgICB9CisgICAgICAgIGVyciA9IFdTQUdldExhc3RFcnJvcigpOyAKKyAgICAgICAgaWYgKGVyciAhPSBXU0FFV09VTERCTE9DSykgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChlcnIgPSBzb2NrZXRfd2FpdGZkKHBzLCBXQUlURkRfVywgdG0pKSAhPSBJT19ET05FKSByZXR1cm4gZXJyOworICAgIH0gCisgICAgcmV0dXJuIElPX1VOS05PV047Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFJlY2VpdmUgd2l0aCB0aW1lb3V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9yZWN2KHBfc29ja2V0IHBzLCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQsIHNpemVfdCAqZ290LCBwX3RpbWVvdXQgdG0pIHsKKyAgICBpbnQgZXJyOworICAgICpnb3QgPSAwOworICAgIGlmICgqcHMgPT0gU09DS0VUX0lOVkFMSUQpIHJldHVybiBJT19DTE9TRUQ7CisgICAgZm9yICggOzsgKSB7CisgICAgICAgIGludCB0YWtlbiA9IHJlY3YoKnBzLCBkYXRhLCAoaW50KSBjb3VudCwgMCk7CisgICAgICAgIGlmICh0YWtlbiA+IDApIHsKKyAgICAgICAgICAgICpnb3QgPSB0YWtlbjsKKyAgICAgICAgICAgIHJldHVybiBJT19ET05FOworICAgICAgICB9CisgICAgICAgIGlmICh0YWtlbiA9PSAwKSByZXR1cm4gSU9fQ0xPU0VEOworICAgICAgICBlcnIgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKGVyciAhPSBXU0FFV09VTERCTE9DSykgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChlcnIgPSBzb2NrZXRfd2FpdGZkKHBzLCBXQUlURkRfUiwgdG0pKSAhPSBJT19ET05FKSByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gSU9fVU5LTk9XTjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogUmVjdmZyb20gd2l0aCB0aW1lb3V0CitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHNvY2tldF9yZWN2ZnJvbShwX3NvY2tldCBwcywgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LCBzaXplX3QgKmdvdCwgCisgICAgICAgIFNBICphZGRyLCBzb2NrbGVuX3QgKmxlbiwgcF90aW1lb3V0IHRtKSB7CisgICAgaW50IGVycjsKKyAgICAqZ290ID0gMDsKKyAgICBpZiAoKnBzID09IFNPQ0tFVF9JTlZBTElEKSByZXR1cm4gSU9fQ0xPU0VEOworICAgIGZvciAoIDs7ICkgeworICAgICAgICBpbnQgdGFrZW4gPSByZWN2ZnJvbSgqcHMsIGRhdGEsIChpbnQpIGNvdW50LCAwLCBhZGRyLCBsZW4pOworICAgICAgICBpZiAodGFrZW4gPiAwKSB7CisgICAgICAgICAgICAqZ290ID0gdGFrZW47CisgICAgICAgICAgICByZXR1cm4gSU9fRE9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFrZW4gPT0gMCkgcmV0dXJuIElPX0NMT1NFRDsKKyAgICAgICAgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChlcnIgIT0gV1NBRVdPVUxEQkxPQ0spIHJldHVybiBlcnI7CisgICAgICAgIGlmICgoZXJyID0gc29ja2V0X3dhaXRmZChwcywgV0FJVEZEX1IsIHRtKSkgIT0gSU9fRE9ORSkgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIElPX1VOS05PV047Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFB1dCBzb2NrZXQgaW50byBibG9ja2luZyBtb2RlCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgcHMpIHsKKyAgICB1X2xvbmcgYXJncCA9IDA7CisgICAgaW9jdGxzb2NrZXQoKnBzLCBGSU9OQklPLCAmYXJncCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCisqIFB1dCBzb2NrZXQgaW50byBub24tYmxvY2tpbmcgbW9kZQorXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHBzKSB7CisgICAgdV9sb25nIGFyZ3AgPSAxOworICAgIGlvY3Rsc29ja2V0KCpwcywgRklPTkJJTywgJmFyZ3ApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAorKiBETlMgaGVscGVycyAKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgc29ja2V0X2dldGhvc3RieWFkZHIoY29uc3QgY2hhciAqYWRkciwgc29ja2xlbl90IGxlbiwgc3RydWN0IGhvc3RlbnQgKipocCkgeworICAgICpocCA9IGdldGhvc3RieWFkZHIoYWRkciwgbGVuLCBBRl9JTkVUKTsKKyAgICBpZiAoKmhwKSByZXR1cm4gSU9fRE9ORTsKKyAgICBlbHNlIHJldHVybiBXU0FHZXRMYXN0RXJyb3IoKTsKK30KKworaW50IHNvY2tldF9nZXRob3N0YnluYW1lKGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBob3N0ZW50ICoqaHApIHsKKyAgICAqaHAgPSBnZXRob3N0YnluYW1lKGFkZHIpOworICAgIGlmICgqaHApIHJldHVybiBJT19ET05FOworICAgIGVsc2UgcmV0dXJuICBXU0FHZXRMYXN0RXJyb3IoKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKKyogRXJyb3IgdHJhbnNsYXRpb24gZnVuY3Rpb25zCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY29uc3QgY2hhciAqc29ja2V0X2hvc3RzdHJlcnJvcihpbnQgZXJyKSB7CisgICAgaWYgKGVyciA8PSAwKSByZXR1cm4gaW9fc3RyZXJyb3IoZXJyKTsKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIFdTQUhPU1RfTk9UX0ZPVU5EOiByZXR1cm4gImhvc3Qgbm90IGZvdW5kIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIHdzdHJlcnJvcihlcnIpOyAKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKnNvY2tldF9zdHJlcnJvcihpbnQgZXJyKSB7CisgICAgaWYgKGVyciA8PSAwKSByZXR1cm4gaW9fc3RyZXJyb3IoZXJyKTsKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIFdTQUVBRERSSU5VU0U6IHJldHVybiAiYWRkcmVzcyBhbHJlYWR5IGluIHVzZSI7CisgICAgICAgIGNhc2UgV1NBRUNPTk5SRUZVU0VEOiByZXR1cm4gImNvbm5lY3Rpb24gcmVmdXNlZCI7CisgICAgICAgIGNhc2UgV1NBRUlTQ09OTjogcmV0dXJuICJhbHJlYWR5IGNvbm5lY3RlZCI7CisgICAgICAgIGNhc2UgV1NBRUFDQ0VTOiByZXR1cm4gInBlcm1pc3Npb24gZGVuaWVkIjsKKyAgICAgICAgY2FzZSBXU0FFQ09OTkFCT1JURUQ6IHJldHVybiAiY2xvc2VkIjsKKyAgICAgICAgY2FzZSBXU0FFQ09OTlJFU0VUOiByZXR1cm4gImNsb3NlZCI7CisgICAgICAgIGNhc2UgV1NBRVRJTUVET1VUOiByZXR1cm4gInRpbWVvdXQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gd3N0cmVycm9yKGVycik7CisgICAgfQorfQorCitjb25zdCBjaGFyICpzb2NrZXRfaW9lcnJvcihwX3NvY2tldCBwcywgaW50IGVycikgeworCSh2b2lkKSBwczsKKwlyZXR1cm4gc29ja2V0X3N0cmVycm9yKGVycik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp3c3RyZXJyb3IoaW50IGVycikgeworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgV1NBRUlOVFI6IHJldHVybiAiSW50ZXJydXB0ZWQgZnVuY3Rpb24gY2FsbCI7CisgICAgICAgIGNhc2UgV1NBRUFDQ0VTOiByZXR1cm4gIlBlcm1pc3Npb24gZGVuaWVkIjsKKyAgICAgICAgY2FzZSBXU0FFRkFVTFQ6IHJldHVybiAiQmFkIGFkZHJlc3MiOworICAgICAgICBjYXNlIFdTQUVJTlZBTDogcmV0dXJuICJJbnZhbGlkIGFyZ3VtZW50IjsKKyAgICAgICAgY2FzZSBXU0FFTUZJTEU6IHJldHVybiAiVG9vIG1hbnkgb3BlbiBmaWxlcyI7CisgICAgICAgIGNhc2UgV1NBRVdPVUxEQkxPQ0s6IHJldHVybiAiUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUiOworICAgICAgICBjYXNlIFdTQUVJTlBST0dSRVNTOiByZXR1cm4gIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiOworICAgICAgICBjYXNlIFdTQUVBTFJFQURZOiByZXR1cm4gIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIjsKKyAgICAgICAgY2FzZSBXU0FFTk9UU09DSzogcmV0dXJuICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbnNvY2tldCI7CisgICAgICAgIGNhc2UgV1NBRURFU1RBRERSUkVROiByZXR1cm4gIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiOworICAgICAgICBjYXNlIFdTQUVNU0dTSVpFOiByZXR1cm4gIk1lc3NhZ2UgdG9vIGxvbmciOworICAgICAgICBjYXNlIFdTQUVQUk9UT1RZUEU6IHJldHVybiAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0IjsKKyAgICAgICAgY2FzZSBXU0FFTk9QUk9UT09QVDogcmV0dXJuICJCYWQgcHJvdG9jb2wgb3B0aW9uIjsKKyAgICAgICAgY2FzZSBXU0FFUFJPVE9OT1NVUFBPUlQ6IHJldHVybiAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIGNhc2UgV1NBRVNPQ0tUTk9TVVBQT1JUOiByZXR1cm4gIlNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICBjYXNlIFdTQUVPUE5PVFNVUFA6IHJldHVybiAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICBjYXNlIFdTQUVQRk5PU1VQUE9SVDogcmV0dXJuICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIGNhc2UgV1NBRUFGTk9TVVBQT1JUOiAKKyAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCBmYW1pbHkiOyAKKyAgICAgICAgY2FzZSBXU0FFQUREUklOVVNFOiByZXR1cm4gIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiOworICAgICAgICBjYXNlIFdTQUVBRERSTk9UQVZBSUw6IHJldHVybiAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyI7CisgICAgICAgIGNhc2UgV1NBRU5FVERPV046IHJldHVybiAiTmV0d29yayBpcyBkb3duIjsKKyAgICAgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDogcmV0dXJuICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIjsKKyAgICAgICAgY2FzZSBXU0FFTkVUUkVTRVQ6IHJldHVybiAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gb24gcmVzZXQiOworICAgICAgICBjYXNlIFdTQUVDT05OQUJPUlRFRDogcmV0dXJuICJTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCI7CisgICAgICAgIGNhc2UgV1NBRUNPTk5SRVNFVDogcmV0dXJuICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiOworICAgICAgICBjYXNlIFdTQUVOT0JVRlM6IHJldHVybiAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSI7CisgICAgICAgIGNhc2UgV1NBRUlTQ09OTjogcmV0dXJuICJTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiOworICAgICAgICBjYXNlIFdTQUVOT1RDT05OOiByZXR1cm4gIlNvY2tldCBpcyBub3QgY29ubmVjdGVkIjsKKyAgICAgICAgY2FzZSBXU0FFU0hVVERPV046IHJldHVybiAiQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duIjsKKyAgICAgICAgY2FzZSBXU0FFVElNRURPVVQ6IHJldHVybiAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiOworICAgICAgICBjYXNlIFdTQUVDT05OUkVGVVNFRDogcmV0dXJuICJDb25uZWN0aW9uIHJlZnVzZWQiOworICAgICAgICBjYXNlIFdTQUVIT1NURE9XTjogcmV0dXJuICJIb3N0IGlzIGRvd24iOworICAgICAgICBjYXNlIFdTQUVIT1NUVU5SRUFDSDogcmV0dXJuICJObyByb3V0ZSB0byBob3N0IjsKKyAgICAgICAgY2FzZSBXU0FFUFJPQ0xJTTogcmV0dXJuICJUb28gbWFueSBwcm9jZXNzZXMiOworICAgICAgICBjYXNlIFdTQVNZU05PVFJFQURZOiByZXR1cm4gIk5ldHdvcmsgc3Vic3lzdGVtIGlzIHVuYXZhaWxhYmxlIjsKKyAgICAgICAgY2FzZSBXU0FWRVJOT1RTVVBQT1JURUQ6IHJldHVybiAiV2luc29jay5kbGwgdmVyc2lvbiBvdXQgb2YgcmFuZ2UiOworICAgICAgICBjYXNlIFdTQU5PVElOSVRJQUxJU0VEOiAKKyAgICAgICAgICAgIHJldHVybiAiU3VjY2Vzc2Z1bCBXU0FTdGFydHVwIG5vdCB5ZXQgcGVyZm9ybWVkIjsKKyAgICAgICAgY2FzZSBXU0FFRElTQ09OOiByZXR1cm4gIkdyYWNlZnVsIHNodXRkb3duIGluIHByb2dyZXNzIjsKKyAgICAgICAgY2FzZSBXU0FIT1NUX05PVF9GT1VORDogcmV0dXJuICJIb3N0IG5vdCBmb3VuZCI7CisgICAgICAgIGNhc2UgV1NBVFJZX0FHQUlOOiByZXR1cm4gIk5vbmF1dGhvcml0YXRpdmUgaG9zdCBub3QgZm91bmQiOworICAgICAgICBjYXNlIFdTQU5PX1JFQ09WRVJZOiByZXR1cm4gIk5vbnJlY292ZXJhYmxlIG5hbWUgbG9va3VwIGVycm9yIjsgCisgICAgICAgIGNhc2UgV1NBTk9fREFUQTogcmV0dXJuICJWYWxpZCBuYW1lLCBubyBkYXRhIHJlY29yZCBvZiByZXF1ZXN0ZWQgdHlwZSI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVW5rbm93biBlcnJvciI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3NyYy93c29ja2V0LmggYi9sdWFzb2NrZXQtMi4wLjIvc3JjL3dzb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTM2NjgzCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3NyYy93c29ja2V0LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBXU09DS0VUX0gKKyNkZWZpbmUgV1NPQ0tFVF9ICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qXAorKiBTb2NrZXQgY29tcGF0aWJpbGl6YXRpb24gbW9kdWxlIGZvciBXaW4zMgorKiBMdWFTb2NrZXQgdG9vbGtpdAorKgorKiBSQ1MgSUQ6ICRJZDogd3NvY2tldC5oLHYgMS40IDIwMDUvMTAvMDcgMDQ6NDA6NTkgZGllZ28gRXhwICQKK1wqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSpcCisqIFdpblNvY2sgaW5jbHVkZSBmaWxlcworXCo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlIDx3aW5zb2NrLmg+CisKK3R5cGVkZWYgaW50IHNvY2tsZW5fdDsKK3R5cGVkZWYgU09DS0VUIHRfc29ja2V0OwordHlwZWRlZiB0X3NvY2tldCAqcF9zb2NrZXQ7CisKKyNkZWZpbmUgU09DS0VUX0lOVkFMSUQgKElOVkFMSURfU09DS0VUKQorCisjZW5kaWYgLyogV1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvdGVzdC9SRUFETUUgYi9sdWFzb2NrZXQtMi4wLjIvdGVzdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZmEyNwotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi90ZXN0L1JFQURNRQpAQCAtMCwwICsxLDEyIEBACitUaGlzIHByb3ZpZGVzIHRoZSAgYXV0b21hdGVkIHRlc3Qgc2NyaXB0cyB1c2VkIHRvIG1ha2UgIHN1cmUgdGhlIGxpYnJhcnkKK2lzIHdvcmtpbmcgcHJvcGVybHkuCisKK1RoZSBmaWxlcyBwcm92aWRlZCBhcmU6CisKKyAgICB0ZXN0c3J2ci5sdWEgICAgICAgICAgICAtLSB0ZXN0IHNlcnZlcgorICAgIHRlc3RjbG50Lmx1YSAgICAgICAgICAgIC0tIHRlc3QgY2xpZW50CisKK1RvIHJ1biB0aGVzZSB0ZXN0cywganVzdCBydW4gbHVhIG9uIHRoZSBzZXJ2ZXIgYW5kIHRoZW4gb24gdGhlIGNsaWVudC4gCisKK0dvb2QgbHVjaywKK0RpZWdvLgpkaWZmIC0tZ2l0IGEvbHVhc29ja2V0LTIuMC4yL3Rlc3QvdGVzdGNsbnQubHVhIGIvbHVhc29ja2V0LTIuMC4yL3Rlc3QvdGVzdGNsbnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2ExYmEKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQtMi4wLjIvdGVzdC90ZXN0Y2xudC5sdWEKQEAgLTAsMCArMSw3MTMgQEAKK2xvY2FsIHNvY2tldCA9IHJlcXVpcmUic29ja2V0IgorCitob3N0ID0gaG9zdCBvciAibG9jYWxob3N0IgorcG9ydCA9IHBvcnQgb3IgIjgzODMiCisKK2Z1bmN0aW9uIHBhc3MoLi4uKQorICAgIGxvY2FsIHMgPSBzdHJpbmcuZm9ybWF0KHVucGFjayhhcmcpKQorICAgIGlvLnN0ZGVycjp3cml0ZShzLCAiXG4iKQorZW5kCisKK2Z1bmN0aW9uIGZhaWwoLi4uKQorICAgIGxvY2FsIHMgPSBzdHJpbmcuZm9ybWF0KHVucGFjayhhcmcpKQorICAgIGlvLnN0ZGVycjp3cml0ZSgiRVJST1I6ICIsIHMsICIhXG4iKQorc29ja2V0LnNsZWVwKDMpCisgICAgb3MuZXhpdCgpCitlbmQKKworZnVuY3Rpb24gd2FybiguLi4pCisgICAgbG9jYWwgcyA9IHN0cmluZy5mb3JtYXQodW5wYWNrKGFyZykpCisgICAgaW8uc3RkZXJyOndyaXRlKCJXQVJOSU5HOiAiLCBzLCAiXG4iKQorZW5kCisKK2Z1bmN0aW9uIHJlbW90ZSguLi4pCisgICAgbG9jYWwgcyA9IHN0cmluZy5mb3JtYXQodW5wYWNrKGFyZykpCisgICAgcyA9IHN0cmluZy5nc3ViKHMsICJcbiIsICI7IikKKyAgICBzID0gc3RyaW5nLmdzdWIocywgIiVzKyIsICIgIikKKyAgICBzID0gc3RyaW5nLmdzdWIocywgIl4lcyoiLCAiIikKKyAgICBjb250cm9sOnNlbmQocyAuLiAiXG4iKQorICAgIGNvbnRyb2w6cmVjZWl2ZSgpCitlbmQKKworZnVuY3Rpb24gdGVzdCh0ZXN0KQorICAgIGlvLnN0ZGVycjp3cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwKKyAgICAgICAgInRlc3Rpbmc6ICIsIHRlc3QsICJcbiIsCisgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQorZW5kCisKK2Z1bmN0aW9uIGNoZWNrX3RpbWVvdXQodG0sIHNsLCBlbGFwc2VkLCBlcnIsIG9wcCwgbW9kZSwgYWxsZG9uZSkKKyAgICBpZiB0bSA8IHNsIHRoZW4KKyAgICAgICAgaWYgb3BwID09ICJzZW5kIiB0aGVuCisgICAgICAgICAgICBpZiBub3QgZXJyIHRoZW4gd2FybigibXVzdCBiZSBidWZmZXJlZCIpCisgICAgICAgICAgICBlbHNlaWYgZXJyID09ICJ0aW1lb3V0IiB0aGVuIHBhc3MoInByb3BlciB0aW1lb3V0IikKKyAgICAgICAgICAgIGVsc2UgZmFpbCgidW5leHBlY3RlZCBlcnJvciAnJXMnIiwgZXJyKSBlbmQKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIGlmIGVyciB+PSAidGltZW91dCIgdGhlbiBmYWlsKCJzaG91bGQgaGF2ZSB0aW1lZCBvdXQiKSAKKyAgICAgICAgICAgIGVsc2UgcGFzcygicHJvcGVyIHRpbWVvdXQiKSBlbmQKKyAgICAgICAgZW5kCisgICAgZWxzZQorICAgICAgICBpZiBtb2RlID09ICJ0b3RhbCIgdGhlbgorICAgICAgICAgICAgaWYgZWxhcHNlZCA+IHRtIHRoZW4gCisgICAgICAgICAgICAgICAgaWYgZXJyIH49ICJ0aW1lb3V0IiB0aGVuIGZhaWwoInNob3VsZCBoYXZlIHRpbWVkIG91dCIpCisgICAgICAgICAgICAgICAgZWxzZSBwYXNzKCJwcm9wZXIgdGltZW91dCIpIGVuZAorICAgICAgICAgICAgZWxzZWlmIGVsYXBzZWQgPCB0bSB0aGVuCisgICAgICAgICAgICAgICAgaWYgZXJyIHRoZW4gZmFpbChlcnIpIAorICAgICAgICAgICAgICAgIGVsc2UgcGFzcygib2siKSBlbmQKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgaWYgYWxsZG9uZSB0aGVuIAorICAgICAgICAgICAgICAgICAgICBpZiBlcnIgdGhlbiBmYWlsKCJ1bmV4cGVjdGVkIGVycm9yICclcyciLCBlcnIpIAorICAgICAgICAgICAgICAgICAgICBlbHNlIHBhc3MoIm9rIikgZW5kCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiBlcnIgfj0gInRpbWVvdXQiIHRoZW4gZmFpbChlcnIpIAorICAgICAgICAgICAgICAgICAgICBlbHNlIHBhc3MoInByb3BlciB0aW1lb3V0ayIpIGVuZAorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgIGVsc2UgCisgICAgICAgICAgICBpZiBlcnIgdGhlbiBmYWlsKGVycikgCisgICAgICAgICAgICBlbHNlIHBhc3MoIm9rIikgZW5kIAorICAgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCitpZiBub3Qgc29ja2V0Ll9ERUJVRyB0aGVuCisgICAgZmFpbCgiUGxlYXNlIGRlZmluZSBMVUFTT0NLRVRfREVCVUcgYW5kIHJlY29tcGlsZSBMdWFTb2NrZXQiKQorZW5kCisKK2lvLnN0ZGVycjp3cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwKKyJMdWFTb2NrZXQgVGVzdCBQcm9jZWR1cmVzXG4iLAorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCisKK3N0YXJ0ID0gc29ja2V0LmdldHRpbWUoKQorCitmdW5jdGlvbiByZWNvbm5lY3QoKQorICAgIGlvLnN0ZGVycjp3cml0ZSgiYXR0ZW1wdGluZyBkYXRhIGNvbm5lY3Rpb24uLi4gIikKKyAgICBpZiBkYXRhIHRoZW4gZGF0YTpjbG9zZSgpIGVuZAorICAgIHJlbW90ZSBbWworICAgICAgICBpZiBkYXRhIHRoZW4gZGF0YTpjbG9zZSgpIGRhdGEgPSBuaWwgZW5kCisgICAgICAgIGRhdGEgPSBzZXJ2ZXI6YWNjZXB0KCkKKyAgICAgICAgZGF0YTpzZXRvcHRpb24oInRjcC1ub2RlbGF5IiwgdHJ1ZSkKKyAgICBdXQorICAgIGRhdGEsIGVyciA9IHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpCisgICAgaWYgbm90IGRhdGEgdGhlbiBmYWlsKGVycikgCisgICAgZWxzZSBwYXNzKCJjb25uZWN0ZWQhIikgZW5kCisgICAgZGF0YTpzZXRvcHRpb24oInRjcC1ub2RlbGF5IiwgdHJ1ZSkKK2VuZAorCitwYXNzKCJhdHRlbXB0aW5nIGNvbnRyb2wgY29ubmVjdGlvbi4uLiIpCitjb250cm9sLCBlcnIgPSBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KQoraWYgZXJyIHRoZW4gZmFpbChlcnIpCitlbHNlIHBhc3MoImNvbm5lY3RlZCEiKSBlbmQKK2NvbnRyb2w6c2V0b3B0aW9uKCJ0Y3Atbm9kZWxheSIsIHRydWUpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gdGVzdF9tZXRob2RzKHNvY2ssIG1ldGhvZHMpCisgICAgZm9yIF8sIHYgaW4gcGFpcnMobWV0aG9kcykgZG8KKyAgICAgICAgaWYgdHlwZShzb2NrW3ZdKSB+PSAiZnVuY3Rpb24iIHRoZW4gCisgICAgICAgICAgICBmYWlsKHNvY2suY2xhc3MgLi4gIiBtZXRob2QgJyIgLi4gdiAuLiAiJyBub3QgcmVnaXN0ZXJlZCIpIAorICAgICAgICBlbmQKKyAgICBlbmQKKyAgICBwYXNzKHNvY2suY2xhc3MgLi4gIiBtZXRob2RzIGFyZSBvayIpCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiB0ZXN0X21peGVkKGxlbikKKyAgICByZWNvbm5lY3QoKQorICAgIGxvY2FsIGludGVyID0gbWF0aC5jZWlsKGxlbi80KQorICAgIGxvY2FsIHAxID0gInVuaXggIiAuLiBzdHJpbmcucmVwKCJ4IiwgaW50ZXIpIC4uICJsaW5lXG4iCisgICAgbG9jYWwgcDIgPSAiZG9zICIgLi4gc3RyaW5nLnJlcCgieSIsIGludGVyKSAuLiAibGluZVxyXG4iCisgICAgbG9jYWwgcDMgPSAicmF3ICIgLi4gc3RyaW5nLnJlcCgieiIsIGludGVyKSAuLiAiYnl0ZXMiCisgICAgbG9jYWwgcDQgPSAiZW5kIiAuLiBzdHJpbmcucmVwKCJ3IiwgaW50ZXIpIC4uICJieXRlcyIKKyAgICBsb2NhbCBicDEsIGJwMiwgYnAzLCBicDQKK3JlbW90ZSAoc3RyaW5nLmZvcm1hdCgic3RyID0gZGF0YTpyZWNlaXZlKCVkKSIsIAorICAgICAgICAgICAgc3RyaW5nLmxlbihwMSkrc3RyaW5nLmxlbihwMikrc3RyaW5nLmxlbihwMykrc3RyaW5nLmxlbihwNCkpKQorICAgIHNlbnQsIGVyciA9IGRhdGE6c2VuZChwMS4ucDIuLnAzLi5wNCkKKyAgICBpZiBlcnIgdGhlbiBmYWlsKGVycikgZW5kCityZW1vdGUgImRhdGE6c2VuZChzdHIpOyBkYXRhOmNsb3NlKCkiCisgICAgYnAxLCBlcnIgPSBkYXRhOnJlY2VpdmUoKQorICAgIGlmIGVyciB0aGVuIGZhaWwoZXJyKSBlbmQKKyAgICBicDIsIGVyciA9IGRhdGE6cmVjZWl2ZSgpCisgICAgaWYgZXJyIHRoZW4gZmFpbChlcnIpIGVuZAorICAgIGJwMywgZXJyID0gZGF0YTpyZWNlaXZlKHN0cmluZy5sZW4ocDMpKQorICAgIGlmIGVyciB0aGVuIGZhaWwoZXJyKSBlbmQKKyAgICBicDQsIGVyciA9IGRhdGE6cmVjZWl2ZSgiKmEiKQorICAgIGlmIGVyciB0aGVuIGZhaWwoZXJyKSBlbmQKKyAgICBpZiBicDEuLiJcbiIgPT0gcDEgYW5kIGJwMi4uIlxyXG4iID09IHAyIGFuZCBicDMgPT0gcDMgYW5kIGJwNCA9PSBwNCB0aGVuCisgICAgICAgIHBhc3MoInBhdHRlcm5zIG1hdGNoIikKKyAgICBlbHNlIGZhaWwoInBhdHRlcm5zIGRvbid0IG1hdGNoIikgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiB0ZXN0X2FzY2lpbGluZShsZW4pCisgICAgcmVjb25uZWN0KCkKKyAgICBsb2NhbCBzdHIsIHN0cjEwLCBiYWNrLCBlcnIKKyAgICBzdHIgPSBzdHJpbmcucmVwKCJ4IiwgbWF0aC5tb2QobGVuLCAxMCkpCisgICAgc3RyMTAgPSBzdHJpbmcucmVwKCJhWmIuYyNkQWU/IiwgbWF0aC5mbG9vcihsZW4vMTApKQorICAgIHN0ciA9IHN0ciAuLiBzdHIxMAorcmVtb3RlICJzdHIgPSBkYXRhOnJlY2VpdmUoKSIKKyAgICBzZW50LCBlcnIgPSBkYXRhOnNlbmQoc3RyLi4iXG4iKQorICAgIGlmIGVyciB0aGVuIGZhaWwoZXJyKSBlbmQKK3JlbW90ZSAiZGF0YTpzZW5kKHN0ciAuLidcXG4nKSIKKyAgICBiYWNrLCBlcnIgPSBkYXRhOnJlY2VpdmUoKQorICAgIGlmIGVyciB0aGVuIGZhaWwoZXJyKSBlbmQKKyAgICBpZiBiYWNrID09IHN0ciB0aGVuIHBhc3MoImxpbmVzIG1hdGNoIikKKyAgICBlbHNlIGZhaWwoImxpbmVzIGRvbid0IG1hdGNoIikgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiB0ZXN0X3Jhd2xpbmUobGVuKQorICAgIHJlY29ubmVjdCgpCisgICAgbG9jYWwgc3RyLCBzdHIxMCwgYmFjaywgZXJyCisgICAgc3RyID0gc3RyaW5nLnJlcChzdHJpbmcuY2hhcig0NyksIG1hdGgubW9kKGxlbiwgMTApKQorICAgIHN0cjEwID0gc3RyaW5nLnJlcChzdHJpbmcuY2hhcigxMjAsMjEsNzcsNCw1LDAsNywzNiw0NCwxMDApLCAKKyAgICAgICAgICAgIG1hdGguZmxvb3IobGVuLzEwKSkKKyAgICBzdHIgPSBzdHIgLi4gc3RyMTAKK3JlbW90ZSAic3RyID0gZGF0YTpyZWNlaXZlKCkiCisgICAgc2VudCwgZXJyID0gZGF0YTpzZW5kKHN0ci4uIlxuIikKKyAgICBpZiBlcnIgdGhlbiBmYWlsKGVycikgZW5kCityZW1vdGUgImRhdGE6c2VuZChzdHIuLidcXG4nKSIKKyAgICBiYWNrLCBlcnIgPSBkYXRhOnJlY2VpdmUoKQorICAgIGlmIGVyciB0aGVuIGZhaWwoZXJyKSBlbmQKKyAgICBpZiBiYWNrID09IHN0ciB0aGVuIHBhc3MoImxpbmVzIG1hdGNoIikKKyAgICBlbHNlIGZhaWwoImxpbmVzIGRvbid0IG1hdGNoIikgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiB0ZXN0X3JhdyhsZW4pCisgICAgcmVjb25uZWN0KCkKKyAgICBsb2NhbCBoYWxmID0gbWF0aC5mbG9vcihsZW4vMikKKyAgICBsb2NhbCBzMSwgczIsIGJhY2ssIGVycgorICAgIHMxID0gc3RyaW5nLnJlcCgieCIsIGhhbGYpCisgICAgczIgPSBzdHJpbmcucmVwKCJ5IiwgbGVuLWhhbGYpCityZW1vdGUgKHN0cmluZy5mb3JtYXQoInN0ciA9IGRhdGE6cmVjZWl2ZSglZCkiLCBsZW4pKQorICAgIHNlbnQsIGVyciA9IGRhdGE6c2VuZChzMSkKKyAgICBpZiBlcnIgdGhlbiBmYWlsKGVycikgZW5kCisgICAgc2VudCwgZXJyID0gZGF0YTpzZW5kKHMyKQorICAgIGlmIGVyciB0aGVuIGZhaWwoZXJyKSBlbmQKK3JlbW90ZSAiZGF0YTpzZW5kKHN0cikiCisgICAgYmFjaywgZXJyID0gZGF0YTpyZWNlaXZlKGxlbikKKyAgICBpZiBlcnIgdGhlbiBmYWlsKGVycikgZW5kCisgICAgaWYgYmFjayA9PSBzMS4uczIgdGhlbiBwYXNzKCJibG9ja3MgbWF0Y2giKQorICAgIGVsc2UgZmFpbCgiYmxvY2tzIGRvbid0IG1hdGNoIikgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiB0ZXN0X3RvdGFsdGltZW91dHJlY2VpdmUobGVuLCB0bSwgc2wpCisgICAgcmVjb25uZWN0KCkKKyAgICBsb2NhbCBzdHIsIGVyciwgcGFydGlhbAorICAgIHBhc3MoIiVkIGJ5dGVzLCAlZHMgdG90YWwgdGltZW91dCwgJWRzIHBhdXNlIiwgbGVuLCB0bSwgc2wpCisgICAgcmVtb3RlIChzdHJpbmcuZm9ybWF0IChbWworICAgICAgICBkYXRhOnNldHRpbWVvdXQoJWQpCisgICAgICAgIHN0ciA9IHN0cmluZy5yZXAoJ2EnLCAlZCkKKyAgICAgICAgZGF0YTpzZW5kKHN0cikKKyAgICAgICAgcHJpbnQoJ3NlcnZlcjogc2xlZXBpbmcgZm9yICVkcycpCisgICAgICAgIHNvY2tldC5zbGVlcCglZCkKKyAgICAgICAgcHJpbnQoJ3NlcnZlcjogd29rZSB1cCcpCisgICAgICAgIGRhdGE6c2VuZChzdHIpCisgICAgXV0sIDIqdG0sIGxlbiwgc2wsIHNsKSkKKyAgICBkYXRhOnNldHRpbWVvdXQodG0sICJ0b3RhbCIpCitsb2NhbCB0ID0gc29ja2V0LmdldHRpbWUoKQorICAgIHN0ciwgZXJyLCBwYXJ0aWFsLCBlbGFwc2VkID0gZGF0YTpyZWNlaXZlKDIqbGVuKQorICAgIGNoZWNrX3RpbWVvdXQodG0sIHNsLCBlbGFwc2VkLCBlcnIsICJyZWNlaXZlIiwgInRvdGFsIiwgCisgICAgICAgIHN0cmluZy5sZW4oc3RyIG9yIHBhcnRpYWwpID09IDIqbGVuKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gdGVzdF90b3RhbHRpbWVvdXRzZW5kKGxlbiwgdG0sIHNsKQorICAgIHJlY29ubmVjdCgpCisgICAgbG9jYWwgc3RyLCBlcnIsIHRvdGFsCisgICAgcGFzcygiJWQgYnl0ZXMsICVkcyB0b3RhbCB0aW1lb3V0LCAlZHMgcGF1c2UiLCBsZW4sIHRtLCBzbCkKKyAgICByZW1vdGUgKHN0cmluZy5mb3JtYXQgKFtbCisgICAgICAgIGRhdGE6c2V0dGltZW91dCglZCkKKyAgICAgICAgc3RyID0gZGF0YTpyZWNlaXZlKCVkKQorICAgICAgICBwcmludCgnc2VydmVyOiBzbGVlcGluZyBmb3IgJWRzJykKKyAgICAgICAgc29ja2V0LnNsZWVwKCVkKQorICAgICAgICBwcmludCgnc2VydmVyOiB3b2tlIHVwJykKKyAgICAgICAgc3RyID0gZGF0YTpyZWNlaXZlKCVkKQorICAgIF1dLCAyKnRtLCBsZW4sIHNsLCBzbCwgbGVuKSkKKyAgICBkYXRhOnNldHRpbWVvdXQodG0sICJ0b3RhbCIpCisgICAgc3RyID0gc3RyaW5nLnJlcCgiYSIsIDIqbGVuKQorICAgIHRvdGFsLCBlcnIsIHBhcnRpYWwsIGVsYXBzZWQgPSBkYXRhOnNlbmQoc3RyKQorICAgIGNoZWNrX3RpbWVvdXQodG0sIHNsLCBlbGFwc2VkLCBlcnIsICJzZW5kIiwgInRvdGFsIiwgCisgICAgICAgIHRvdGFsID09IDIqbGVuKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gdGVzdF9ibG9ja2luZ3RpbWVvdXRyZWNlaXZlKGxlbiwgdG0sIHNsKQorICAgIHJlY29ubmVjdCgpCisgICAgbG9jYWwgc3RyLCBlcnIsIHBhcnRpYWwKKyAgICBwYXNzKCIlZCBieXRlcywgJWRzIGJsb2NraW5nIHRpbWVvdXQsICVkcyBwYXVzZSIsIGxlbiwgdG0sIHNsKQorICAgIHJlbW90ZSAoc3RyaW5nLmZvcm1hdCAoW1sKKyAgICAgICAgZGF0YTpzZXR0aW1lb3V0KCVkKQorICAgICAgICBzdHIgPSBzdHJpbmcucmVwKCdhJywgJWQpCisgICAgICAgIGRhdGE6c2VuZChzdHIpCisgICAgICAgIHByaW50KCdzZXJ2ZXI6IHNsZWVwaW5nIGZvciAlZHMnKQorICAgICAgICBzb2NrZXQuc2xlZXAoJWQpCisgICAgICAgIHByaW50KCdzZXJ2ZXI6IHdva2UgdXAnKQorICAgICAgICBkYXRhOnNlbmQoc3RyKQorICAgIF1dLCAyKnRtLCBsZW4sIHNsLCBzbCkpCisgICAgZGF0YTpzZXR0aW1lb3V0KHRtKQorICAgIHN0ciwgZXJyLCBwYXJ0aWFsLCBlbGFwc2VkID0gZGF0YTpyZWNlaXZlKDIqbGVuKQorICAgIGNoZWNrX3RpbWVvdXQodG0sIHNsLCBlbGFwc2VkLCBlcnIsICJyZWNlaXZlIiwgImJsb2NraW5nIiwgCisgICAgICAgIHN0cmluZy5sZW4oc3RyIG9yIHBhcnRpYWwpID09IDIqbGVuKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gdGVzdF9ibG9ja2luZ3RpbWVvdXRzZW5kKGxlbiwgdG0sIHNsKQorICAgIHJlY29ubmVjdCgpCisgICAgbG9jYWwgc3RyLCBlcnIsIHRvdGFsCisgICAgcGFzcygiJWQgYnl0ZXMsICVkcyBibG9ja2luZyB0aW1lb3V0LCAlZHMgcGF1c2UiLCBsZW4sIHRtLCBzbCkKKyAgICByZW1vdGUgKHN0cmluZy5mb3JtYXQgKFtbCisgICAgICAgIGRhdGE6c2V0dGltZW91dCglZCkKKyAgICAgICAgc3RyID0gZGF0YTpyZWNlaXZlKCVkKQorICAgICAgICBwcmludCgnc2VydmVyOiBzbGVlcGluZyBmb3IgJWRzJykKKyAgICAgICAgc29ja2V0LnNsZWVwKCVkKQorICAgICAgICBwcmludCgnc2VydmVyOiB3b2tlIHVwJykKKyAgICAgICAgc3RyID0gZGF0YTpyZWNlaXZlKCVkKQorICAgIF1dLCAyKnRtLCBsZW4sIHNsLCBzbCwgbGVuKSkKKyAgICBkYXRhOnNldHRpbWVvdXQodG0pCisgICAgc3RyID0gc3RyaW5nLnJlcCgiYSIsIDIqbGVuKQorICAgIHRvdGFsLCBlcnIsICBwYXJ0aWFsLCBlbGFwc2VkID0gZGF0YTpzZW5kKHN0cikKKyAgICBjaGVja190aW1lb3V0KHRtLCBzbCwgZWxhcHNlZCwgZXJyLCAic2VuZCIsICJibG9ja2luZyIsCisgICAgICAgIHRvdGFsID09IDIqbGVuKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gZW1wdHlfY29ubmVjdCgpCisgICAgcmVjb25uZWN0KCkKKyAgICBpZiBkYXRhIHRoZW4gZGF0YTpjbG9zZSgpIGRhdGEgPSBuaWwgZW5kCisgICAgcmVtb3RlIFtbCisgICAgICAgIGlmIGRhdGEgdGhlbiBkYXRhOmNsb3NlKCkgZGF0YSA9IG5pbCBlbmQKKyAgICAgICAgZGF0YSA9IHNlcnZlcjphY2NlcHQoKQorICAgIF1dCisgICAgZGF0YSwgZXJyID0gc29ja2V0LmNvbm5lY3QoIiIsIHBvcnQpCisgICAgaWYgbm90IGRhdGEgdGhlbiAKKyAgICAgICAgcGFzcygib2siKQorICAgICAgICBkYXRhID0gc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCkKKyAgICBlbHNlIAorCQlwYXNzKCJnZXRob3N0YnluYW1lIHJldHVybnMgbG9jYWxob3N0IG9uIGVtcHR5IHN0cmluZy4uLiIpCisgICAgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiBpc2Nsb3NlZChjKQorICAgIHJldHVybiBjOmdldGZkKCkgPT0gLTEgb3IgYzpnZXRmZCgpID09ICgyXjMyLTEpCitlbmQKKworZnVuY3Rpb24gYWN0aXZlX2Nsb3NlKCkKKyAgICByZWNvbm5lY3QoKQorICAgIGlmIGlzY2xvc2VkKGRhdGEpIHRoZW4gZmFpbCgic2hvdWxkIG5vdCBiZSBjbG9zZWQiKSBlbmQKKyAgICBkYXRhOmNsb3NlKCkKKyAgICBpZiBub3QgaXNjbG9zZWQoZGF0YSkgdGhlbiBmYWlsKCJzaG91bGQgYmUgY2xvc2VkIikgZW5kCisgICAgZGF0YSA9IG5pbAorICAgIGxvY2FsIHVkcCA9IHNvY2tldC51ZHAoKQorICAgIGlmIGlzY2xvc2VkKHVkcCkgdGhlbiBmYWlsKCJzaG91bGQgbm90IGJlIGNsb3NlZCIpIGVuZAorICAgIHVkcDpjbG9zZSgpCisgICAgaWYgbm90IGlzY2xvc2VkKHVkcCkgdGhlbiBmYWlsKCJzaG91bGQgYmUgY2xvc2VkIikgZW5kCisgICAgcGFzcygib2siKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gdGVzdF9jbG9zZWQoKQorICAgIGxvY2FsIGJhY2ssIHBhcnRpYWwsIGVycgorICAgIGxvY2FsIHN0ciA9ICdsaXR0bGUgc3RyaW5nJworICAgIHJlY29ubmVjdCgpCisgICAgcGFzcygidHJ5aW5nIHJlYWQgZGV0ZWN0aW9uIikKKyAgICByZW1vdGUgKHN0cmluZy5mb3JtYXQgKFtbCisgICAgICAgIGRhdGE6c2VuZCgnJXMnKQorICAgICAgICBkYXRhOmNsb3NlKCkKKyAgICAgICAgZGF0YSA9IG5pbAorICAgIF1dLCBzdHIpKQorICAgIC0tIHRyeSB0byBnZXQgYSBsaW5lIAorICAgIGJhY2ssIGVyciwgcGFydGlhbCA9IGRhdGE6cmVjZWl2ZSgpCisgICAgaWYgbm90IGVyciB0aGVuIGZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiAnY2xvc2VkJy4iKQorICAgIGVsc2VpZiBlcnIgfj0gImNsb3NlZCIgdGhlbiBmYWlsKCJnb3QgJyIuLmVyci4uIicgaW5zdGVhZCBvZiAnY2xvc2VkJy4iKQorICAgIGVsc2VpZiBzdHIgfj0gcGFydGlhbCB0aGVuIGZhaWwoImRpZG4ndCByZWNlaXZlIHBhcnRpYWwgcmVzdWx0LiIpCisgICAgZWxzZSBwYXNzKCJncmFjZWZ1bCAnY2xvc2VkJyByZWNlaXZlZCIpIGVuZAorICAgIHJlY29ubmVjdCgpCisgICAgcGFzcygidHJ5aW5nIHdyaXRlIGRldGVjdGlvbiIpCisgICAgcmVtb3RlIFtbCisgICAgICAgIGRhdGE6Y2xvc2UoKQorICAgICAgICBkYXRhID0gbmlsCisgICAgXV0KKyAgICB0b3RhbCwgZXJyLCBwYXJ0aWFsID0gZGF0YTpzZW5kKHN0cmluZy5yZXAoInVnYXVnYSIsIDEwMDAwMCkpCisgICAgaWYgbm90IGVyciB0aGVuIAorICAgICAgICBwYXNzKCJmYWlsZWQ6IG91dHB1dCBidWZmZXIgaXMgYXQgbGVhc3QgJWQgYnl0ZXMgbG9uZyEiLCB0b3RhbCkKKyAgICBlbHNlaWYgZXJyIH49ICJjbG9zZWQiIHRoZW4gCisgICAgICAgIGZhaWwoImdvdCAnIi4uZXJyLi4iJyBpbnN0ZWFkIG9mICdjbG9zZWQnLiIpCisgICAgZWxzZSAKKyAgICAgICAgcGFzcygiZ3JhY2VmdWwgJ2Nsb3NlZCcgcmVjZWl2ZWQgYWZ0ZXIgJWQgYnl0ZXMgd2VyZSBzZW50IiwgcGFydGlhbCkgCisgICAgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiB0ZXN0X3NlbGVjdGJ1Z3MoKQorICAgIGxvY2FsIHIsIHMsIGUgPSBzb2NrZXQuc2VsZWN0KG5pbCwgbmlsLCAwLjEpCisgICAgYXNzZXJ0KHR5cGUocikgPT0gInRhYmxlIiBhbmQgdHlwZShzKSA9PSAidGFibGUiIGFuZCAKKyAgICAgICAgKGUgPT0gInRpbWVvdXQiIG9yIGUgPT0gImVycm9yIikpCisgICAgcGFzcygiYm90aCBuaWw6IG9rIikKKyAgICBsb2NhbCB1ZHAgPSBzb2NrZXQudWRwKCkKKyAgICB1ZHA6Y2xvc2UoKQorICAgIHIsIHMsIGUgPSBzb2NrZXQuc2VsZWN0KHsgdWRwIH0sIHsgdWRwIH0sIDAuMSkKKyAgICBhc3NlcnQodHlwZShyKSA9PSAidGFibGUiIGFuZCB0eXBlKHMpID09ICJ0YWJsZSIgYW5kIAorICAgICAgICAoZSA9PSAidGltZW91dCIgb3IgZSA9PSAiZXJyb3IiKSkKKyAgICBwYXNzKCJjbG9zZWQgc29ja2V0czogb2siKQorICAgIGUgPSBwY2FsbChzb2NrZXQuc2VsZWN0LCAid3JvbmciLCAxLCAwLjEpCisgICAgYXNzZXJ0KGUgPT0gZmFsc2UpCisgICAgZSA9IHBjYWxsKHNvY2tldC5zZWxlY3QsIHt9LCAxLCAwLjEpCisgICAgYXNzZXJ0KGUgPT0gZmFsc2UpCisgICAgcGFzcygiaW52YWxpZCBpbnB1dDogb2siKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gYWNjZXB0X3RpbWVvdXQoKQorICAgIGlvLnN0ZGVycjp3cml0ZSgiYWNjZXB0IHdpdGggdGltZW91dCAoaWYgaXQgaGFuZ3MsIGl0IGZhaWxlZCk6ICIpCisgICAgbG9jYWwgcywgZSA9IHNvY2tldC5iaW5kKCIqIiwgMCwgMCkKKyAgICBhc3NlcnQocywgZSkKKyAgICBsb2NhbCB0ID0gc29ja2V0LmdldHRpbWUoKQorICAgIHM6c2V0dGltZW91dCgxKQorICAgIGxvY2FsIGMsIGUgPSBzOmFjY2VwdCgpCisgICAgYXNzZXJ0KG5vdCBjLCAic2hvdWxkIG5vdCBhY2NlcHQiKSAKKyAgICBhc3NlcnQoZSA9PSAidGltZW91dCIsIHN0cmluZy5mb3JtYXQoIndyb25nIGVycm9yIG1lc3NhZ2UgKCVzKSIsIGUpKQorICAgIHQgPSBzb2NrZXQuZ2V0dGltZSgpIC0gdAorICAgIGFzc2VydCh0IDwgMiwgc3RyaW5nLmZvcm1hdCgidG9vayB0byBsb25nIHRvIGdpdmUgdXAgKCVncykiLCB0KSkKKyAgICBzOmNsb3NlKCkKKyAgICBwYXNzKCJnb29kIikKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIGNvbm5lY3RfdGltZW91dCgpCisgICAgaW8uc3RkZXJyOndyaXRlKCJjb25uZWN0IHdpdGggdGltZW91dCAoaWYgaXQgaGFuZ3MsIGl0IGZhaWxlZCEpOiAiKQorICAgIGxvY2FsIHQgPSBzb2NrZXQuZ2V0dGltZSgpCisgICAgbG9jYWwgYywgZSA9IHNvY2tldC50Y3AoKQorICAgIGFzc2VydChjLCBlKQorICAgIGM6c2V0dGltZW91dCgwLjEpCisgICAgbG9jYWwgdCA9IHNvY2tldC5nZXR0aW1lKCkKKyAgICBsb2NhbCByLCBlID0gYzpjb25uZWN0KCIxMC4wLjAuMSIsIDgxKQorcHJpbnQociwgZSkKKyAgICBhc3NlcnQobm90IHIsICJzaG91bGQgbm90IGNvbm5lY3QiKQorICAgIGFzc2VydChzb2NrZXQuZ2V0dGltZSgpIC0gdCA8IDIsICJ0b29rIHRvbyBsb25nIHRvIGdpdmUgdXAuIikgCisgICAgYzpjbG9zZSgpCisgICAgcHJpbnQoIm9rIikgCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiBhY2NlcHRfZXJyb3JzKCkKKyAgICBpby5zdGRlcnI6d3JpdGUoIm5vdCBsaXN0ZW5pbmc6ICIpCisgICAgbG9jYWwgZCwgZSA9IHNvY2tldC5iaW5kKCIqIiwgMCkKKyAgICBhc3NlcnQoZCwgZSk7CisgICAgbG9jYWwgYywgZSA9IHNvY2tldC50Y3AoKTsKKyAgICBhc3NlcnQoYywgZSk7CisgICAgZDpzZXRmZChjOmdldGZkKCkpCisgICAgZDpzZXR0aW1lb3V0KDIpCisgICAgbG9jYWwgciwgZSA9IGQ6YWNjZXB0KCkKKyAgICBhc3NlcnQobm90IHIgYW5kIGUpCisgICAgcHJpbnQoIm9rOiAiLCBlKQorICAgIGlvLnN0ZGVycjp3cml0ZSgibm90IHN1cHBvcnRlZDogIikKKyAgICBsb2NhbCBjLCBlID0gc29ja2V0LnVkcCgpCisgICAgYXNzZXJ0KGMsIGUpOworICAgIGQ6c2V0ZmQoYzpnZXRmZCgpKQorICAgIGxvY2FsIHIsIGUgPSBkOmFjY2VwdCgpCisgICAgYXNzZXJ0KG5vdCByIGFuZCBlKQorICAgIHByaW50KCJvazogIiwgZSkKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9uIGNvbm5lY3RfZXJyb3JzKCkKKyAgICBpby5zdGRlcnI6d3JpdGUoImNvbm5lY3Rpb24gcmVmdXNlZDogIikKKyAgICBsb2NhbCBjLCBlID0gc29ja2V0LmNvbm5lY3QoImxvY2FsaG9zdCIsIDEpOworICAgIGFzc2VydChub3QgYyBhbmQgZSkKKyAgICBwcmludCgib2s6ICIsIGUpCisgICAgaW8uc3RkZXJyOndyaXRlKCJob3N0IG5vdCBmb3VuZDogIikKKyAgICBsb2NhbCBjLCBlID0gc29ja2V0LmNvbm5lY3QoImhvc3QuaXMuaW52YWxpZCIsIDEpOworICAgIGFzc2VydChub3QgYyBhbmQgZSwgZSkKKyAgICBwcmludCgib2s6ICIsIGUpCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiByZWJpbmRfdGVzdCgpCisgICAgbG9jYWwgYyA9IHNvY2tldC5iaW5kKCJsb2NhbGhvc3QiLCAwKQorICAgIGxvY2FsIGksIHAgPSBjOmdldHNvY2tuYW1lKCkKKyAgICBsb2NhbCBzLCBlID0gc29ja2V0LnRjcCgpCisgICAgYXNzZXJ0KHMsIGUpCisgICAgczpzZXRvcHRpb24oInJldXNlYWRkciIsIGZhbHNlKQorICAgIHIsIGUgPSBzOmJpbmQoImxvY2FsaG9zdCIsIHApCisgICAgYXNzZXJ0KG5vdCByLCAibWFuYWdlZCB0byByZWJpbmQhIikKKyAgICBhc3NlcnQoZSkKKyAgICBwcmludCgib2s6ICIsIGUpCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiBnZXRzdGF0c190ZXN0KCkKKyAgICByZWNvbm5lY3QoKQorICAgIGxvY2FsIHQgPSAwCisgICAgZm9yIGkgPSAxLCAyNSBkbworICAgICAgICBsb2NhbCBjID0gbWF0aC5yYW5kb20oMSwgMTAwKQorICAgICAgICByZW1vdGUgKHN0cmluZy5mb3JtYXQgKFtbCisgICAgICAgICAgICBzdHIgPSBkYXRhOnJlY2VpdmUoJWQpCisgICAgICAgICAgICBkYXRhOnNlbmQoc3RyKQorICAgICAgICBdXSwgYykpCisgICAgICAgIGRhdGE6c2VuZChzdHJpbmcucmVwKCJhIiwgYykpCisgICAgICAgIGRhdGE6cmVjZWl2ZShjKQorICAgICAgICB0ID0gdCArIGMKKyAgICAgICAgbG9jYWwgciwgcywgYSA9IGRhdGE6Z2V0c3RhdHMoKQorICAgICAgICBhc3NlcnQociA9PSB0LCAicmVjZWl2ZWQgY291bnQgZmFpbGVkIiAuLiB0b3N0cmluZyhyKSAKKyAgICAgICAgICAgIC4uICIvIiAuLiB0b3N0cmluZyh0KSkKKyAgICAgICAgYXNzZXJ0KHMgPT0gdCwgInNlbnQgY291bnQgZmFpbGVkIiAuLiB0b3N0cmluZyhzKSAKKyAgICAgICAgICAgIC4uICIvIiAuLiB0b3N0cmluZyh0KSkKKyAgICBlbmQKKyAgICBwcmludCgib2siKQorZW5kCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbiB0ZXN0X25vbmJsb2NraW5nKHNpemUpIAorICAgIHJlY29ubmVjdCgpCitwcmludCgiVGVzdGluZyAiICAuLiAyKnNpemUgLi4gIiBieXRlcyIpCityZW1vdGUoc3RyaW5nLmZvcm1hdChbWworICAgIGRhdGE6c2VuZChzdHJpbmcucmVwKCJhIiwgJWQpKQorICAgIHNvY2tldC5zbGVlcCgwLjUpCisgICAgZGF0YTpzZW5kKHN0cmluZy5yZXAoImIiLCAlZCkgLi4gIlxuIikKK11dLCBzaXplLCBzaXplKSkKKyAgICBsb2NhbCBlcnIgPSAidGltZW91dCIKKyAgICBsb2NhbCBwYXJ0ID0gIiIKKyAgICBsb2NhbCBzdHIKKyAgICBkYXRhOnNldHRpbWVvdXQoMCkKKyAgICB3aGlsZSAxIGRvCisgICAgICAgIHN0ciwgZXJyLCBwYXJ0ID0gZGF0YTpyZWNlaXZlKCIqbCIsIHBhcnQpCisgICAgICAgIGlmIGVyciB+PSAidGltZW91dCIgdGhlbiBicmVhayBlbmQKKyAgICBlbmQKKyAgICBhc3NlcnQoc3RyID09IChzdHJpbmcucmVwKCJhIiwgc2l6ZSkgLi4gc3RyaW5nLnJlcCgiYiIsIHNpemUpKSkKKyAgICByZWNvbm5lY3QoKQorcmVtb3RlKHN0cmluZy5mb3JtYXQoW1sKKyAgICBzdHIgPSBkYXRhOnJlY2VpdmUoJWQpCisgICAgc29ja2V0LnNsZWVwKDAuNSkKKyAgICBzdHIgPSBkYXRhOnJlY2VpdmUoMiolZCwgc3RyKQorICAgIGRhdGE6c2VuZChzdHIpCitdXSwgc2l6ZSwgc2l6ZSkpCisgICAgZGF0YTpzZXR0aW1lb3V0KDApCisgICAgbG9jYWwgc3RhcnQgPSAwCisgICAgd2hpbGUgMSBkbworICAgICAgICByZXQsIGVyciwgc3RhcnQgPSBkYXRhOnNlbmQoc3RyLCBzdGFydCsxKQorICAgICAgICBpZiBlcnIgfj0gInRpbWVvdXQiIHRoZW4gYnJlYWsgZW5kCisgICAgZW5kCisgICAgZGF0YTpzZW5kKCJcbiIpCisgICAgZGF0YTpzZXR0aW1lb3V0KC0xKQorICAgIGxvY2FsIGJhY2sgPSBkYXRhOnJlY2VpdmUoMipzaXplKQorICAgIGFzc2VydChiYWNrID09IHN0ciwgIiciIC4uIGJhY2sgLi4gIicgdnMgJyIgLi4gc3RyIC4uICInIikKKyAgICBwcmludCgib2siKQorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb24gdGVzdF9yZWFkYWZ0ZXJjbG9zZSgpCisgICAgbG9jYWwgYmFjaywgcGFydGlhbCwgZXJyCisgICAgbG9jYWwgc3RyID0gJ2xpdHRsZSBzdHJpbmcnCisgICAgcmVjb25uZWN0KCkKKyAgICBwYXNzKCJ0cnlpbmcgcmVwZWF0ZWQgJyphJyBwYXR0ZXJuIikKKyAgICByZW1vdGUgKHN0cmluZy5mb3JtYXQgKFtbCisgICAgICAgIGRhdGE6c2VuZCgnJXMnKQorICAgICAgICBkYXRhOmNsb3NlKCkKKyAgICAgICAgZGF0YSA9IG5pbAorICAgIF1dLCBzdHIpKQorICAgIGJhY2ssIGVyciwgcGFydGlhbCA9IGRhdGE6cmVjZWl2ZSgiKmEiKQorICAgIGFzc2VydChiYWNrID09IHN0ciwgInVuZXhwZWN0ZWQgZGF0YSByZWFkIikKKyAgICBiYWNrLCBlcnIsIHBhcnRpYWwgPSBkYXRhOnJlY2VpdmUoIiphIikKKyAgICBhc3NlcnQoYmFjayA9PSBuaWwgYW5kIGVyciA9PSAiY2xvc2VkIiwgInNob3VsZCBoYXZlIHJldHVybmVkICdjbG9zZWQnIikKKyAgICBwcmludCgib2siKQorICAgIHJlY29ubmVjdCgpCisgICAgcGFzcygidHJ5aW5nIGFjdGl2ZSBjbG9zZSBiZWZvcmUgJyphJyIpCisgICAgcmVtb3RlIChzdHJpbmcuZm9ybWF0IChbWworICAgICAgICBkYXRhOmNsb3NlKCkKKyAgICAgICAgZGF0YSA9IG5pbAorICAgIF1dKSkKKyAgICBkYXRhOmNsb3NlKCkgCisgICAgYmFjaywgZXJyLCBwYXJ0aWFsID0gZGF0YTpyZWNlaXZlKCIqYSIpCisgICAgYXNzZXJ0KGJhY2sgPT0gbmlsIGFuZCBlcnIgPT0gImNsb3NlZCIsICJzaG91bGQgaGF2ZSByZXR1cm5lZCAnY2xvc2VkJyIpCisgICAgcHJpbnQoIm9rIikKKyAgICByZWNvbm5lY3QoKQorICAgIHBhc3MoInRyeWluZyBhY3RpdmUgY2xvc2UgYmVmb3JlICcqbCciKQorICAgIHJlbW90ZSAoc3RyaW5nLmZvcm1hdCAoW1sKKyAgICAgICAgZGF0YTpjbG9zZSgpCisgICAgICAgIGRhdGEgPSBuaWwKKyAgICBdXSkpCisgICAgZGF0YTpjbG9zZSgpIAorICAgIGJhY2ssIGVyciwgcGFydGlhbCA9IGRhdGE6cmVjZWl2ZSgpCisgICAgYXNzZXJ0KGJhY2sgPT0gbmlsIGFuZCBlcnIgPT0gImNsb3NlZCIsICJzaG91bGQgaGF2ZSByZXR1cm5lZCAnY2xvc2VkJyIpCisgICAgcHJpbnQoIm9rIikKKyAgICByZWNvbm5lY3QoKQorICAgIHBhc3MoInRyeWluZyBhY3RpdmUgY2xvc2UgYmVmb3JlIHJhdyAxIikKKyAgICByZW1vdGUgKHN0cmluZy5mb3JtYXQgKFtbCisgICAgICAgIGRhdGE6Y2xvc2UoKQorICAgICAgICBkYXRhID0gbmlsCisgICAgXV0pKQorICAgIGRhdGE6Y2xvc2UoKSAKKyAgICBiYWNrLCBlcnIsIHBhcnRpYWwgPSBkYXRhOnJlY2VpdmUoMSkKKyAgICBhc3NlcnQoYmFjayA9PSBuaWwgYW5kIGVyciA9PSAiY2xvc2VkIiwgInNob3VsZCBoYXZlIHJldHVybmVkICdjbG9zZWQnIikKKyAgICBwcmludCgib2siKQorICAgIHJlY29ubmVjdCgpCisgICAgcGFzcygidHJ5aW5nIGFjdGl2ZSBjbG9zZSBiZWZvcmUgcmF3IDAiKQorICAgIHJlbW90ZSAoc3RyaW5nLmZvcm1hdCAoW1sKKyAgICAgICAgZGF0YTpjbG9zZSgpCisgICAgICAgIGRhdGEgPSBuaWwKKyAgICBdXSkpCisgICAgZGF0YTpjbG9zZSgpIAorICAgIGJhY2ssIGVyciwgcGFydGlhbCA9IGRhdGE6cmVjZWl2ZSgwKQorICAgIGFzc2VydChiYWNrID09IG5pbCBhbmQgZXJyID09ICJjbG9zZWQiLCAic2hvdWxkIGhhdmUgcmV0dXJuZWQgJ2Nsb3NlZCciKQorICAgIHByaW50KCJvayIpCitlbmQKKwordGVzdCgibWV0aG9kIHJlZ2lzdHJhdGlvbiIpCit0ZXN0X21ldGhvZHMoc29ja2V0LnRjcCgpLCB7CisgICAgImFjY2VwdCIsCisgICAgImJpbmQiLAorICAgICJjbG9zZSIsCisgICAgImNvbm5lY3QiLAorICAgICJkaXJ0eSIsCisgICAgImdldGZkIiwKKyAgICAiZ2V0cGVlcm5hbWUiLAorICAgICJnZXRzb2NrbmFtZSIsCisgICAgImdldHN0YXRzIiwKKyAgICAic2V0c3RhdHMiLAorICAgICJsaXN0ZW4iLAorICAgICJyZWNlaXZlIiwKKyAgICAic2VuZCIsCisgICAgInNldGZkIiwKKyAgICAic2V0b3B0aW9uIiwKKyAgICAic2V0cGVlcm5hbWUiLAorICAgICJzZXRzb2NrbmFtZSIsCisgICAgInNldHRpbWVvdXQiLAorICAgICJzaHV0ZG93biIsCit9KQorCit0ZXN0X21ldGhvZHMoc29ja2V0LnVkcCgpLCB7CisgICAgImNsb3NlIiwgCisgICAgImdldHBlZXJuYW1lIiwKKyAgICAiZGlydHkiLAorICAgICJnZXRmZCIsCisgICAgImdldHBlZXJuYW1lIiwKKyAgICAiZ2V0c29ja25hbWUiLAorICAgICJyZWNlaXZlIiwgCisgICAgInJlY2VpdmVmcm9tIiwgCisgICAgInNlbmQiLCAKKyAgICAic2VuZHRvIiwgCisgICAgInNldGZkIiwgCisgICAgInNldG9wdGlvbiIsCisgICAgInNldHBlZXJuYW1lIiwKKyAgICAic2V0c29ja25hbWUiLAorICAgICJzZXR0aW1lb3V0IgorfSkKKwordGVzdCgidGVzdGluZyByZWFkIGFmdGVyIGNsb3NlIikKK3Rlc3RfcmVhZGFmdGVyY2xvc2UoKQorCit0ZXN0KCJzZWxlY3QgZnVuY3Rpb24iKQordGVzdF9zZWxlY3RidWdzKCkKKwordGVzdCgiY29ubmVjdCBmdW5jdGlvbiIpCitjb25uZWN0X3RpbWVvdXQoKQorZW1wdHlfY29ubmVjdCgpCitjb25uZWN0X2Vycm9ycygpCisKK3Rlc3QoInJlYmluZGluZzogIikKK3JlYmluZF90ZXN0KCkKKwordGVzdCgiYWN0aXZlIGNsb3NlOiAiKQorYWN0aXZlX2Nsb3NlKCkKKwordGVzdCgiY2xvc2VkIGNvbm5lY3Rpb24gZGV0ZWN0aW9uOiAiKQordGVzdF9jbG9zZWQoKQorCit0ZXN0KCJhY2NlcHQgZnVuY3Rpb246ICIpCithY2NlcHRfdGltZW91dCgpCithY2NlcHRfZXJyb3JzKCkKKwordGVzdCgiZ2V0c3RhdHMgdGVzdCIpCitnZXRzdGF0c190ZXN0KCkKKwordGVzdCgiY2hhcmFjdGVyIGxpbmUiKQordGVzdF9hc2NpaWxpbmUoMSkKK3Rlc3RfYXNjaWlsaW5lKDE3KQordGVzdF9hc2NpaWxpbmUoMjAwKQordGVzdF9hc2NpaWxpbmUoNDA5MSkKK3Rlc3RfYXNjaWlsaW5lKDgwMTk5KQordGVzdF9hc2NpaWxpbmUoODAwMDAwMCkKK3Rlc3RfYXNjaWlsaW5lKDgwMTk5KQordGVzdF9hc2NpaWxpbmUoNDA5MSkKK3Rlc3RfYXNjaWlsaW5lKDIwMCkKK3Rlc3RfYXNjaWlsaW5lKDE3KQordGVzdF9hc2NpaWxpbmUoMSkKKwordGVzdCgibWl4ZWQgcGF0dGVybnMiKQordGVzdF9taXhlZCgxKQordGVzdF9taXhlZCgxNykKK3Rlc3RfbWl4ZWQoMjAwKQordGVzdF9taXhlZCg0MDkxKQordGVzdF9taXhlZCg4MDE5OTApCit0ZXN0X21peGVkKDQwOTEpCit0ZXN0X21peGVkKDIwMCkKK3Rlc3RfbWl4ZWQoMTcpCit0ZXN0X21peGVkKDEpCisKK3Rlc3QoImJpbmFyeSBsaW5lIikKK3Rlc3RfcmF3bGluZSgxKQordGVzdF9yYXdsaW5lKDE3KQordGVzdF9yYXdsaW5lKDIwMCkKK3Rlc3RfcmF3bGluZSg0MDkxKQordGVzdF9yYXdsaW5lKDgwMTk5KQordGVzdF9yYXdsaW5lKDgwMDAwMDApCit0ZXN0X3Jhd2xpbmUoODAxOTkpCit0ZXN0X3Jhd2xpbmUoNDA5MSkKK3Rlc3RfcmF3bGluZSgyMDApCit0ZXN0X3Jhd2xpbmUoMTcpCit0ZXN0X3Jhd2xpbmUoMSkKKwordGVzdCgicmF3IHRyYW5zZmVyIikKK3Rlc3RfcmF3KDEpCit0ZXN0X3JhdygxNykKK3Rlc3RfcmF3KDIwMCkKK3Rlc3RfcmF3KDQwOTEpCit0ZXN0X3Jhdyg4MDE5OSkKK3Rlc3RfcmF3KDgwMDAwMDApCit0ZXN0X3Jhdyg4MDE5OSkKK3Rlc3RfcmF3KDQwOTEpCit0ZXN0X3JhdygyMDApCit0ZXN0X3JhdygxNykKK3Rlc3RfcmF3KDEpCisKK3Rlc3QoIm5vbi1ibG9ja2luZyB0cmFuc2ZlciIpCit0ZXN0X25vbmJsb2NraW5nKDEpCit0ZXN0X25vbmJsb2NraW5nKDE3KQordGVzdF9ub25ibG9ja2luZygyMDApCit0ZXN0X25vbmJsb2NraW5nKDQwOTEpCit0ZXN0X25vbmJsb2NraW5nKDgwMTk5KQordGVzdF9ub25ibG9ja2luZyg4MDAwMDApCit0ZXN0X25vbmJsb2NraW5nKDgwMTk5KQordGVzdF9ub25ibG9ja2luZyg0MDkxKQordGVzdF9ub25ibG9ja2luZygyMDApCit0ZXN0X25vbmJsb2NraW5nKDE3KQordGVzdF9ub25ibG9ja2luZygxKQorCit0ZXN0KCJ0b3RhbCB0aW1lb3V0IG9uIHNlbmQiKQordGVzdF90b3RhbHRpbWVvdXRzZW5kKDgwMDA5MSwgMSwgMykKK3Rlc3RfdG90YWx0aW1lb3V0c2VuZCg4MDAwOTEsIDIsIDMpCit0ZXN0X3RvdGFsdGltZW91dHNlbmQoODAwMDkxLCA1LCAyKQordGVzdF90b3RhbHRpbWVvdXRzZW5kKDgwMDA5MSwgMywgMSkKKwordGVzdCgidG90YWwgdGltZW91dCBvbiByZWNlaXZlIikKK3Rlc3RfdG90YWx0aW1lb3V0cmVjZWl2ZSg4MDAwOTEsIDEsIDMpCit0ZXN0X3RvdGFsdGltZW91dHJlY2VpdmUoODAwMDkxLCAyLCAzKQordGVzdF90b3RhbHRpbWVvdXRyZWNlaXZlKDgwMDA5MSwgMywgMikKK3Rlc3RfdG90YWx0aW1lb3V0cmVjZWl2ZSg4MDAwOTEsIDMsIDEpCisKK3Rlc3QoImJsb2NraW5nIHRpbWVvdXQgb24gc2VuZCIpCit0ZXN0X2Jsb2NraW5ndGltZW91dHNlbmQoODAwMDkxLCAxLCAzKQordGVzdF9ibG9ja2luZ3RpbWVvdXRzZW5kKDgwMDA5MSwgMiwgMykKK3Rlc3RfYmxvY2tpbmd0aW1lb3V0c2VuZCg4MDAwOTEsIDMsIDIpCit0ZXN0X2Jsb2NraW5ndGltZW91dHNlbmQoODAwMDkxLCAzLCAxKQorCit0ZXN0KCJibG9ja2luZyB0aW1lb3V0IG9uIHJlY2VpdmUiKQordGVzdF9ibG9ja2luZ3RpbWVvdXRyZWNlaXZlKDgwMDA5MSwgMSwgMykKK3Rlc3RfYmxvY2tpbmd0aW1lb3V0cmVjZWl2ZSg4MDAwOTEsIDIsIDMpCit0ZXN0X2Jsb2NraW5ndGltZW91dHJlY2VpdmUoODAwMDkxLCAzLCAyKQordGVzdF9ibG9ja2luZ3RpbWVvdXRyZWNlaXZlKDgwMDA5MSwgMywgMSkKKwordGVzdChzdHJpbmcuZm9ybWF0KCJkb25lIGluICUuMmZzIiwgc29ja2V0LmdldHRpbWUoKSAtIHN0YXJ0KSkKZGlmZiAtLWdpdCBhL2x1YXNvY2tldC0yLjAuMi90ZXN0L3Rlc3RzcnZyLmx1YSBiL2x1YXNvY2tldC0yLjAuMi90ZXN0L3Rlc3RzcnZyLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk3MmMyCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LTIuMC4yL3Rlc3QvdGVzdHNydnIubHVhCkBAIC0wLDAgKzEsMTUgQEAKK3NvY2tldCA9IHJlcXVpcmUoInNvY2tldCIpOworaG9zdCA9IGhvc3Qgb3IgImxvY2FsaG9zdCI7Citwb3J0ID0gcG9ydCBvciAiODM4MyI7CitzZXJ2ZXIgPSBhc3NlcnQoc29ja2V0LmJpbmQoaG9zdCwgcG9ydCkpOworYWNrID0gIlxuIjsKK3doaWxlIDEgZG8KKyAgICBwcmludCgic2VydmVyOiB3YWl0aW5nIGZvciBjbGllbnQgY29ubmVjdGlvbi4uLiIpOworICAgIGNvbnRyb2wgPSBhc3NlcnQoc2VydmVyOmFjY2VwdCgpKTsKKyAgICB3aGlsZSAxIGRvIAorICAgICAgICBjb21tYW5kID0gYXNzZXJ0KGNvbnRyb2w6cmVjZWl2ZSgpKTsKKyAgICAgICAgYXNzZXJ0KGNvbnRyb2w6c2VuZChhY2spKTsKKyAgICAgICAgcHJpbnQoY29tbWFuZCk7CisgICAgICAgIChsb2Fkc3RyaW5nKGNvbW1hbmQpKSgpOworICAgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQtMi4wLjIvdGVzdC90ZXN0c3VwcG9ydC5sdWEgYi9sdWFzb2NrZXQtMi4wLjIvdGVzdC90ZXN0c3VwcG9ydC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZDhmNQotLS0gL2Rldi9udWxsCisrKyBiL2x1YXNvY2tldC0yLjAuMi90ZXN0L3Rlc3RzdXBwb3J0Lmx1YQpAQCAtMCwwICsxLDM3IEBACitmdW5jdGlvbiByZWFkZmlsZShuYW1lKQorCWxvY2FsIGYgPSBpby5vcGVuKG5hbWUsICJyYiIpCisJaWYgbm90IGYgdGhlbiByZXR1cm4gbmlsIGVuZAorCWxvY2FsIHMgPSBmOnJlYWQoIiphIikKKwlmOmNsb3NlKCkKKwlyZXR1cm4gcworZW5kCisKK2Z1bmN0aW9uIHNpbWlsYXIoczEsIHMyKQorCXJldHVybiBzdHJpbmcubG93ZXIoc3RyaW5nLmdzdWIoczEgb3IgIiIsICIlcyIsICIiKSkgPT0gCisgICAgICAgIHN0cmluZy5sb3dlcihzdHJpbmcuZ3N1YihzMiBvciAiIiwgIiVzIiwgIiIpKQorZW5kCisKK2Z1bmN0aW9uIGZhaWwobXNnKQorICAgIG1zZyA9IG1zZyBvciAiZmFpbGVkIgorICAgIGVycm9yKG1zZywgMikKK2VuZAorCitmdW5jdGlvbiBjb21wYXJlKGlucHV0LCBvdXRwdXQpCisgICAgbG9jYWwgb3JpZ2luYWwgPSByZWFkZmlsZShpbnB1dCkKKyAgICBsb2NhbCByZWNvdmVyZWQgPSByZWFkZmlsZShvdXRwdXQpCisgICAgaWYgb3JpZ2luYWwgfj0gcmVjb3ZlcmVkIHRoZW4gZmFpbCgiY29tcGFyaXNvbiBmYWlsZWQiKQorICAgIGVsc2UgcHJpbnQoIm9rIikgZW5kCitlbmQKKworbG9jYWwgRyA9IF9HCitsb2NhbCBzZXQgPSByYXdzZXQKK2xvY2FsIHdhcm4gPSBwcmludAorCitsb2NhbCBzZXRnbG9iYWwgPSBmdW5jdGlvbih0YWJsZSwga2V5LCB2YWx1ZSkKKwl3YXJuKCJjaGFuZ2VkICIgLi4ga2V5KQorICAgIHNldCh0YWJsZSwga2V5LCB2YWx1ZSkKK2VuZAorCitzZXRtZXRhdGFibGUoRywgeworICAgIF9fbmV3aW5kZXggPSBzZXRnbG9iYWwKK30pCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQudGFyLmd6IGIvbHVhc29ja2V0LnRhci5negpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY5MWEzCi0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LnRhci5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sdWFzb2NrZXQudXJsIGIvbHVhc29ja2V0LnVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRmNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbHVhc29ja2V0LnVybApAQCAtMCwwICsxIEBACitodHRwOi8vbHVhZm9yZ2UubmV0L2Zycy9kb3dubG9hZC5waHAvMjY2NC9sdWFzb2NrZXQtMi4wLjIudGFyLmd6CmRpZmYgLS1naXQgYS9sdWFzb2NrZXQudmVyc2lvbiBiL2x1YXNvY2tldC52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzA3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9sdWFzb2NrZXQudmVyc2lvbgpAQCAtMCwwICsxIEBACisyLjAuMgo=