ZGlmZiAtLWdpdCBhL21ha2UvQ29tcGlsZURlbW9zLmdtayBiL21ha2UvQ29tcGlsZURlbW9zLmdtawppbmRleCAzYjE4MzkxLi4zNjgyOWIzIDEwMDY0NAotLS0gYS9tYWtlL0NvbXBpbGVEZW1vcy5nbWsKKysrIGIvbWFrZS9Db21waWxlRGVtb3MuZ21rCkBAIC00NTYsNyArNDU2LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGlmbmRlZiBPUEVOSkRLCi0gIERCX0RFTU9fWklQRklMRSA6PSAkKHdpbGRjYXJkICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9kYi8qLnppcCkKKyAgREJfREVNT19aSVBGSUxFIDo9ICQod2lsZGNhcmQgJChKREtfVE9QRElSKS9zcmMvY2xvc2VkL3NoYXJlL2RiL2RiLWRlcmJ5LSotYmluLnppcCkKIAogICAkKEpES19PVVRQVVRESVIpL2RlbW8vX3RoZS5kYi51bnppcHBlZDogJChEQl9ERU1PX1pJUEZJTEUpCiAJJChNS0RJUikgLXAgJChARCkKZGlmZiAtLWdpdCBhL21ha2UvSW1hZ2VzLmdtayBiL21ha2UvSW1hZ2VzLmdtawppbmRleCA4ODRkYzRmLi41MWQwYzE0IDEwMDY0NAotLS0gYS9tYWtlL0ltYWdlcy5nbWsKKysrIGIvbWFrZS9JbWFnZXMuZ21rCkBAIC01NjIsNyArNTYyLDcgQEAKIAkkKENBVCkgJDwgfCAkKFNFRCkgInMvWFhYWC8kKHNoZWxsIGNhdCAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc2hhcmUvZGIvQ09QWVJJR0hUWUVBUikvIiA+ICRACiAKICAgSkRLX0RCX1RBUkdFVFMgOj0gJChwYXRzdWJzdCAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc2hhcmUvZGIvJSwgJChJTUFHRVNfT1VUUFVURElSKS9fdW56aXAvJS51bnppcHBlZCwgXAotICAgICAgJCh3aWxkY2FyZCAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc2hhcmUvZGIvKi56aXApKSBcCisgICAgICAkKHdpbGRjYXJkICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9kYi9kYi1kZXJieS0qLWJpbi56aXApKSBcCiAgICAgICAkKEpES19JTUFHRV9ESVIpL2RiL1JFQURNRS1KREsuaHRtbCAkKEpES19JTUFHRV9ESVIpL2RiLzNSRFBBUlRZCiAKIGVuZGlmCmRpZmYgLS1naXQgYS9tYWtlL2RhdGEvdHpkYXRhL1ZFUlNJT04gYi9tYWtlL2RhdGEvdHpkYXRhL1ZFUlNJT04KaW5kZXggYzczNWJlNS4uNWU5MjVhZCAxMDA2NDQKLS0tIGEvbWFrZS9kYXRhL3R6ZGF0YS9WRVJTSU9OCisrKyBiL21ha2UvZGF0YS90emRhdGEvVkVSU0lPTgpAQCAtMSwyNCArMSwyNCBAQAogIwogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0jICAKKyMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKICMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCiAjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKICMgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0jICAKKyMKICMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKICMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSMgIAorIwogIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotIyAgCisjCiAjIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotdHpkYXRhMjAxNGMKK3R6ZGF0YTIwMTRnCmRpZmYgLS1naXQgYS9tYWtlL2RhdGEvdHpkYXRhL2FmcmljYSBiL21ha2UvZGF0YS90emRhdGEvYWZyaWNhCmluZGV4IDZmMWExNDcuLmFhOTFmMzYgMTAwNjQ0Ci0tLSBhL21ha2UvZGF0YS90emRhdGEvYWZyaWNhCisrKyBiL21ha2UvZGF0YS90emRhdGEvYWZyaWNhCkBAIC0yMSwxMyArMjEsMTMgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAorIyBUaGlzIGZpbGUgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKICMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bwotIyB0ekBpYW5hLm9yZyBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisjIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4gIEZvciBtb3JlLCBwbGVhc2Ugc2VlCisjIHRoZSBmaWxlIENPTlRSSUJVVElORyBpbiB0aGUgdHogZGlzdHJpYnV0aW9uLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTMtMDItMjEpOgogIwpAQCAtNDksOCArNDksOCBAQAogIyBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCiAjCiAjIEZvciBkYXRhIGNpcmNhIDE4OTksIGEgY29tbW9uIHNvdXJjZSBpczoKLSMgTWlsbmUgSi4gQ2l2aWwgdGltZS4gR2VvZ3IgSi4gMTg5OSBGZWI7MTMoMik6MTczLTk0Ci0jIDxodHRwOi8vd3d3LmpzdG9yLm9yZy9zdGFibGUvMTc3NDM1OT4uCisjIE1pbG5lIEouIENpdmlsIHRpbWUuIEdlb2dyIEouIDE4OTkgRmViOzEzKDIpOjE3My05NC4KKyMgaHR0cDovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzE3NzQzNTkKICMKICMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzIGlzCiAjIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgpAQCAtNTgsMTMgKzU4LDEzIEBACiAjIFByZXZpb3VzIGVkaXRpb25zIG9mIHRoaXMgZGF0YWJhc2UgdXNlZCBXQVQsIENBVCwgU0FULCBhbmQgRUFUCiAjIGZvciArMDowMCB0aHJvdWdoICszOjAwLCByZXNwZWN0aXZlbHksCiAjIGJ1dCBNYXJrIFIgViBNdXJyYXkgcmVwb3J0cyB0aGF0Ci0jIGBTQVNUJyBpcyB0aGUgb2ZmaWNpYWwgYWJicmV2aWF0aW9uIGZvciArMjowMCBpbiB0aGUgY291bnRyeSBvZiBTb3V0aCBBZnJpY2EsCi0jIGBDQVQnIGlzIGNvbW1vbmx5IHVzZWQgZm9yICsyOjAwIGluIGNvdW50cmllcyBub3J0aCBvZiBTb3V0aCBBZnJpY2EsIGFuZAotIyBgV0FUJyBpcyBwcm9iYWJseSB0aGUgYmVzdCBuYW1lIGZvciArMTowMCwgYXMgdGhlIGNvbW1vbiBwaHJhc2UgZm9yCi0jIHRoZSBhcmVhIHRoYXQgaW5jbHVkZXMgTmlnZXJpYSBpcyBgYFdlc3QgQWZyaWNhJycuCi0jIEhlIGhhcyBoZWFyZCBvZiBgYFdlc3Rlcm4gU2FoYXJhIFRpbWUnJyBmb3IgKzA6MDAgYnV0IGNhbiBmaW5kIG5vIHJlZmVyZW5jZS4KKyMgJ1NBU1QnIGlzIHRoZSBvZmZpY2lhbCBhYmJyZXZpYXRpb24gZm9yICsyOjAwIGluIHRoZSBjb3VudHJ5IG9mIFNvdXRoIEFmcmljYSwKKyMgJ0NBVCcgaXMgY29tbW9ubHkgdXNlZCBmb3IgKzI6MDAgaW4gY291bnRyaWVzIG5vcnRoIG9mIFNvdXRoIEFmcmljYSwgYW5kCisjICdXQVQnIGlzIHByb2JhYmx5IHRoZSBiZXN0IG5hbWUgZm9yICsxOjAwLCBhcyB0aGUgY29tbW9uIHBocmFzZSBmb3IKKyMgdGhlIGFyZWEgdGhhdCBpbmNsdWRlcyBOaWdlcmlhIGlzICJXZXN0IEFmcmljYSIuCisjIEhlIGhhcyBoZWFyZCBvZiAiV2VzdGVybiBTYWhhcmEgVGltZSIgZm9yICswOjAwIGJ1dCBjYW4gZmluZCBubyByZWZlcmVuY2UuCiAjCi0jIFRvIG1ha2UgdGhpbmdzIGNvbmZ1c2luZywgYFdBVCcgc2VlbXMgdG8gaGF2ZSBiZWVuIHVzZWQgZm9yIC0xOjAwIGxvbmcgYWdvOworIyBUbyBtYWtlIHRoaW5ncyBjb25mdXNpbmcsICdXQVQnIHNlZW1zIHRvIGhhdmUgYmVlbiB1c2VkIGZvciAtMTowMCBsb25nIGFnbzsKICMgSSdkIGd1ZXNzIHRoYXQgdGhpcyB3YXMgYmVjYXVzZSBwZW9wbGUgbmVlZGVkIF9zb21lXyBuYW1lIGZvciAtMTowMCwKICMgYW5kIGF0IHRoZSB0aW1lLCBmYXIgd2VzdCBBZnJpY2Egd2FzIHRoZSBvbmx5IG1ham9yIGxhbmQgYXJlYSBpbiAtMTowMC4KICMgVGhpcyB1c2FnZSBpcyBub3cgb2Jzb2xldGUsIGFzIHRoZSBsYXN0IHVzZSBvZiAtMTowMCBvbiB0aGUgQWZyaWNhbgpAQCAtNzcsNyArNzcsNyBAQAogIwkgMjowMAlTQVNUCVNvdXRoIEFmcmljYSBTdGFuZGFyZCBUaW1lCiAjIGFuZCBNdXJyYXkgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBhYmJyZXZpYXRpb246CiAjCSAxOjAwCVdBVAlXZXN0IEFmcmljYSBUaW1lCi0jIEkgcmVhbGl6ZSB0aGF0IHRoaXMgbGVhZHMgdG8gYFdBVCcgYmVpbmcgdXNlZCBmb3IgYm90aCAtMTowMCBhbmQgMTowMAorIyBJIHJlYWxpemUgdGhhdCB0aGlzIGxlYWRzIHRvICdXQVQnIGJlaW5nIHVzZWQgZm9yIGJvdGggLTE6MDAgYW5kIDE6MDAKICMgZm9yIHRpbWVzIGJlZm9yZSAxOTc2LCBidXQgdGhpcyBpcyB0aGUgYmVzdCBJIGNhbiB0aGluayBvZgogIyB1bnRpbCB3ZSBnZXQgbW9yZSBpbmZvcm1hdGlvbi4KICMKQEAgLTExNyw5ICsxMTcsOSBAQAogIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAwOjA5OjIwIGZvciBQYXJpcyBNZWFuIFRpbWU7IGdvIHdpdGggSG93c2UncwogIyBtb3JlIHByZWNpc2UgMDowOToyMS4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0FsZ2llcnMJMDoxMjoxMiAtCUxNVAkxODkxIE1hciAxNSAwOjAxCi0JCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAgICMgUGFyaXMgTWVhbiBUaW1lCi0JCQkwOjAwCUFsZ2VyaWEJV0Ulc1QJMTk0MCBGZWIgMjUgMjowMAorWm9uZQlBZnJpY2EvQWxnaWVycwkwOjEyOjEyIC0JTE1UCTE4OTEgTWFyIDE1ICAwOjAxCisJCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICMgUGFyaXMgTWVhbiBUaW1lCisJCQkwOjAwCUFsZ2VyaWEJV0Ulc1QJMTk0MCBGZWIgMjUgIDI6MDAKIAkJCTE6MDAJQWxnZXJpYQlDRSVzVAkxOTQ2IE9jdCAgNwogCQkJMDowMAktCVdFVAkxOTU2IEphbiAyOQogCQkJMTowMAktCUNFVAkxOTYzIEFwciAxNApAQCAtMTI5LDE4ICsxMjksOCBAQAogCQkJMTowMAktCUNFVAogCiAjIEFuZ29sYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTHVhbmRhCTA6NTI6NTYJLQlMTVQJMTg5MgotCQkJMDo1MjowNAktCUFPVAkxOTExIE1heSAyNiAjIEFuZ29sYSBUaW1lCi0JCQkxOjAwCS0JV0FUCi0KICMgQmVuaW4KLSMgV2hpdG1hbiBzYXlzIHRoZXkgc3dpdGNoZWQgdG8gMTowMCBpbiAxOTQ2LCBub3QgMTkzNDsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9Qb3J0by1Ob3ZvCTA6MTA6MjgJLQlMTVQJMTkxMgotCQkJMDowMAktCUdNVAkxOTM0IEZlYiAyNgotCQkJMTowMAktCVdBVAorIyBTZWUgQWZyaWNhL0xhZ29zLgogCiAjIEJvdHN3YW5hCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTMtMDItMjEpOgpAQCAtMTQ5LDE0ICsxMzksMTIgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQWZyaWNhL0dhYm9yb25lCTE6NDM6NDAgLQlMTVQJMTg4NQogCQkJMTozMAktCVNBU1QJMTkwMyBNYXIKLQkJCTI6MDAJLQlDQVQJMTk0MyBTZXAgMTkgMjowMAotCQkJMjowMAkxOjAwCUNBU1QJMTk0NCBNYXIgMTkgMjowMAorCQkJMjowMAktCUNBVAkxOTQzIFNlcCAxOSAgMjowMAorCQkJMjowMAkxOjAwCUNBU1QJMTk0NCBNYXIgMTkgIDI6MDAKIAkJCTI6MDAJLQlDQVQKIAogIyBCdXJraW5hIEZhc28KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL091YWdhZG91Z291CS0wOjA2OjA0IC0JTE1UCTE5MTIKLQkJCSAwOjAwCS0JR01UCisjIFNlZSBBZnJpY2EvQWJpZGphbi4KIAogIyBCdXJ1bmRpCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC0xNjQsNTIgKzE1Miw2MCBAQAogCQkJMjowMAktCUNBVAogCiAjIENhbWVyb29uCi0jIFdoaXRtYW4gc2F5cyB0aGV5IHN3aXRjaGVkIHRvIDE6MDAgaW4gMTkyMDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9Eb3VhbGEJMDozODo0OAktCUxNVAkxOTEyCi0JCQkxOjAwCS0JV0FUCisjIFNlZSBBZnJpY2EvTGFnb3MuCiAKICMgQ2FwZSBWZXJkZQorIworIyBTaGFua3MgZ2l2ZXMgMTkwNyBmb3IgdGhlIHRyYW5zaXRpb24gdG8gQ1ZULgorIyBQZXJoYXBzIHRoZSAxOTExLTA1LTI2IFBvcnR1Z3Vlc2UgZGVjcmVlCisjIGh0dHA6Ly9kcmUucHQvcGRmMXNkaXAvMTkxMS8wNS8xMjUwMC8yMzEzMjMxMy5wZGYKKyMgbWVyZWx5IG1hZGUgaXQgb2ZmaWNpYWw/CisjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF0bGFudGljL0NhcGVfVmVyZGUgLTE6MzQ6MDQgLQlMTVQJMTkwNwkJCSMgUHJhaWEKK1pvbmUgQXRsYW50aWMvQ2FwZV9WZXJkZSAtMTozNDowNCAtCUxNVAkxOTA3ICAgICAgICAjIFByYWlhCiAJCQktMjowMAktCUNWVAkxOTQyIFNlcAogCQkJLTI6MDAJMTowMAlDVlNUCTE5NDUgT2N0IDE1Ci0JCQktMjowMAktCUNWVAkxOTc1IE5vdiAyNSAyOjAwCisJCQktMjowMAktCUNWVAkxOTc1IE5vdiAyNSAgMjowMAogCQkJLTE6MDAJLQlDVlQKIAogIyBDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0Jhbmd1aQkxOjE0OjIwCS0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQKKyMgU2VlIEFmcmljYS9MYWdvcy4KIAogIyBDaGFkCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9OZGphbWVuYQkxOjAwOjEyIC0JTE1UCTE5MTIKK1pvbmUJQWZyaWNhL05kamFtZW5hCTE6MDA6MTIgLQlMTVQJMTkxMiAgICAgICAgIyBOJ0RqYW1lbmEKIAkJCTE6MDAJLQlXQVQJMTk3OSBPY3QgMTQKIAkJCTE6MDAJMTowMAlXQVNUCTE5ODAgTWFyICA4CiAJCQkxOjAwCS0JV0FUCiAKICMgQ29tb3JvcwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlJbmRpYW4vQ29tb3JvCTI6NTM6MDQgLQlMTVQJMTkxMSBKdWwgICAjIE1vcm9uaSwgR3JhbiBDb21vcm8KK1pvbmUJSW5kaWFuL0NvbW9ybwkyOjUzOjA0IC0JTE1UCTE5MTEgSnVsICMgTW9yb25pLCBHcmFuIENvbW9ybwogCQkJMzowMAktCUVBVAogCi0jIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YgQ29uZ28KKyMgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL0tpbnNoYXNhCTE6MDE6MTIgLQlMTVQJMTg5NyBOb3YgOQotCQkJMTowMAktCVdBVAogWm9uZSBBZnJpY2EvTHVidW1iYXNoaQkxOjQ5OjUyIC0JTE1UCTE4OTcgTm92IDkKIAkJCTI6MDAJLQlDQVQKKyMgVGhlIGFib3ZlIGlzIGZvciB0aGUgZWFzdGVybiBwYXJ0OyBzZWUgQWZyaWNhL0xhZ29zIGZvciB0aGUgd2VzdGVybiBwYXJ0LgogCiAjIFJlcHVibGljIG9mIHRoZSBDb25nbwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvQnJhenphdmlsbGUJMTowMTowOCAtCUxNVAkxOTEyCi0JCQkxOjAwCS0JV0FUCisjIFNlZSBBZnJpY2EvTGFnb3MuCiAKLSMgQ290ZSBEJ0l2b2lyZQorIyBDw7R0ZSBkJ0l2b2lyZSAvIEl2b3J5IENvYXN0CiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFmcmljYS9BYmlkamFuCS0wOjE2OjA4IC0JTE1UCTE5MTIKIAkJCSAwOjAwCS0JR01UCitMaW5rIEFmcmljYS9BYmlkamFuIEFmcmljYS9CYW1ha28JIyBNYWxpCitMaW5rIEFmcmljYS9BYmlkamFuIEFmcmljYS9CYW5qdWwJIyBHYW1iaWEKK0xpbmsgQWZyaWNhL0FiaWRqYW4gQWZyaWNhL0NvbmFrcnkJIyBHdWluZWEKK0xpbmsgQWZyaWNhL0FiaWRqYW4gQWZyaWNhL0Rha2FyCSMgU2VuZWdhbAorTGluayBBZnJpY2EvQWJpZGphbiBBZnJpY2EvRnJlZXRvd24JIyBTaWVycmEgTGVvbmUKK0xpbmsgQWZyaWNhL0FiaWRqYW4gQWZyaWNhL0xvbWUJCSMgVG9nbworTGluayBBZnJpY2EvQWJpZGphbiBBZnJpY2EvTm91YWtjaG90dAkjIE1hdXJpdGFuaWEKK0xpbmsgQWZyaWNhL0FiaWRqYW4gQWZyaWNhL091YWdhZG91Z291CSMgQnVya2luYSBGYXNvCitMaW5rIEFmcmljYS9BYmlkamFuIEFmcmljYS9TYW9fVG9tZQkjIFPDo28gVG9tw6kgYW5kIFByw61uY2lwZQorTGluayBBZnJpY2EvQWJpZGphbiBBdGxhbnRpYy9TdF9IZWxlbmEJIyBTdCBIZWxlbmEKIAogIyBEamlib3V0aQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQpAQCAtMjU0LDMwICsyNTAsMjYgQEAKICMgRWd5cHRpYW5zIHdvdWxkIGFwcHJvdmUgdGhlIGNhbmNlbGxhdGlvbi4iCiAjCiAjIEVneXB0IHRvIGNhbmNlbCBkYXlsaWdodCBzYXZpbmcgdGltZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFsbWFzcnlhbHlvdW0uY29tL2VuL25vZGUvNDA3MTY4Ij4KICMgaHR0cDovL3d3dy5hbG1hc3J5YWx5b3VtLmNvbS9lbi9ub2RlLzQwNzE2OAotIyA8L2E+CiAjIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZWd5cHQwNC5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19lZ3lwdDA0Lmh0bWwKLSMgPC9hPgogUnVsZQlFZ3lwdAkxOTk1CTIwMTAJLQlBcHIJbGFzdEZyaQkgMDowMHMJMTowMAlTCi1SdWxlCUVneXB0CTE5OTUJMjAwNQktCVNlcAlsYXN0VGh1CTIzOjAwcwkwCS0KK1J1bGUJRWd5cHQJMTk5NQkyMDA1CS0JU2VwCWxhc3RUaHUJMjQ6MDAJMAktCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTA5LTE5KToKICMgVGhlIEVneXB0aWFuIEdhemV0dGUsIGlzc3VlIDQxLDA5MCAoMjAwNi0wOS0xOCksIHBhZ2UgMSwgcmVwb3J0czoKICMgRWd5cHQgd2lsbCB0dXJuIGJhY2sgY2xvY2tzIGJ5IG9uZSBob3VyIGF0IHRoZSBtaWRuaWdodCBvZiBUaHVyc2RheQogIyBhZnRlciBvYnNlcnZpbmcgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHNpbmNlIE1heS4KICMgaHR0cDovL25ld3MuZ29tLmNvbS5lZy9nYXpldHRlL3BkZi8yMDA2LzA5LzE4LzAxLnBkZgotUnVsZQlFZ3lwdAkyMDA2CW9ubHkJLQlTZXAJMjEJMjM6MDBzCTAJLQorUnVsZQlFZ3lwdAkyMDA2CW9ubHkJLQlTZXAJMjEJMjQ6MDAJMAktCiAjIEZyb20gRGlyayBMb3NjaCAoMjAwNy0wOC0xNCk6CiAjIEkgcmVjZWl2ZWQgYSBtYWlsIGZyb20gYW4gYWlybGluZSB3aGljaCBzYXlzIHRoYXQgdGhlIGRheWxpZ2h0CiAjIHNhdmluZyB0aW1lIGluIEVneXB0IHdpbGwgZW5kIGluIHRoZSBuaWdodCBvZiAyMDA3LTA5LTA2IHRvIDIwMDctMDktMDcuCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA3LTA4LTE1KTogW1RoZSBmb2xsb3dpbmcgYWdyZWU6XQorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDctMDgtMTUpOiBbVGhlIGZvbGxvd2luZyBhZ3JlZTpdCiAjIGh0dHA6Ly93d3cubmVudGplcy5pbmZvL0JpbGwvYmlsbDUuaHRtCiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249NTMKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDktMDQpOiBUaGUgb2ZmaWNpYWwgaW5mb3JtYXRpb24uLi46CiAjIGh0dHA6Ly93d3cuc2lzLmdvdi5lZy9Fbi9FZ3lwdE9ubGluZS9NaXNjZWxsYW5lb3VzLzAwMDAwMi8wMjA3MDAwMDAwMDAwMDAwMDAxNTgwLmh0bQotUnVsZQlFZ3lwdAkyMDA3CW9ubHkJLQlTZXAJVGh1Pj0xCTIzOjAwcwkwCS0KK1J1bGUJRWd5cHQJMjAwNwlvbmx5CS0JU2VwCVRodT49MQkyNDowMAkwCS0KICMgRnJvbSBBYmRlbHJhaG1hbiBIYXNzYW4gKDIwMDctMDktMDYpOgogIyBEdWUgdG8gdGhlIEhpanJpIChsdW5hciBJc2xhbWljIGNhbGVuZGFyKSB5ZWFyIGJlaW5nIDExIGRheXMgc2hvcnRlcgogIyB0aGFuIHRoZSB5ZWFyIG9mIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIsIFJhbWFkYW4gc2hpZnRzIGVhcmxpZXIgZWFjaApAQCAtMzExLDE1ICszMDMsOSBAQAogIwogIyB0aW1lYW5kZGF0ZVsyXSBhbmQgYW5vdGhlciBzaXRlIEkndmUgZm91bmRbM10gYWxzbyBzdXBwb3J0IHRoYXQuCiAjCi0jIFsxXSA8YSBocmVmPSJodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ5MjI2MyI+Ci0jIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDkyMjYzCi0jIDwvYT4KLSMgWzJdIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2xvY2tjaGFuZ2UuaHRtbD9uPTUzIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jbG9ja2NoYW5nZS5odG1sP249NTMKLSMgPC9hPgotIyBbM10gPGEgaHJlZj0iaHR0cDovL3d3cC5ncmVlbndpY2htZWFudGltZS5jb20vdGltZS16b25lL2FmcmljYS9lZ3lwdC8iPgotIyBodHRwOi8vd3dwLmdyZWVud2ljaG1lYW50aW1lLmNvbS90aW1lLXpvbmUvYWZyaWNhL2VneXB0LwotIyA8L2E+CisjIFsxXSBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ5MjI2MworIyBbMl0gaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jbG9ja2NoYW5nZS5odG1sP249NTMKKyMgWzNdIGh0dHA6Ly93d3AuZ3JlZW53aWNobWVhbnRpbWUuY29tL3RpbWUtem9uZS9hZnJpY2EvZWd5cHQvCiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDQtMjApOgogIyBJbiAyMDA5IChhbmQgZm9yIHRoZSBuZXh0IHNldmVyYWwgeWVhcnMpLCBSYW1hZGFuIGVuZHMgYmVmb3JlIHRoZSBmb3VydGgKQEAgLTMyOSwxNCArMzE1LDEwIEBACiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA4LTExKToKICMgV2UgaGF2ZSBiZWVuIGFibGUgdG8gY29uZmlybSB0aGUgQXVndXN0IGNoYW5nZSB3aXRoIHRoZSBFZ3lwdGlhbiBDYWJpbmV0CiAjIEluZm9ybWF0aW9uIGFuZCBEZWNpc2lvbiBTdXBwb3J0IENlbnRlcjoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2VneXB0LWRzdC1lbmRzLTIwMDkuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9lZ3lwdC1kc3QtZW5kcy0yMDA5Lmh0bWwKLSMgPC9hPgogIwogIyBUaGUgTWlkZGxlIEVhc3QgTmV3cyBBZ2VuY3kKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tZW5hLm9yZy5lZy9pbmRleC5hc3B4Ij4KICMgaHR0cDovL3d3dy5tZW5hLm9yZy5lZy9pbmRleC5hc3B4Ci0jIDwvYT4KICMgYWxzbyByZXBvcnRzICJFZ3lwdCBzdGFydHMgd2ludGVyIHRpbWUgb24gQXVndXN0IDIxIgogIyB0b2RheSBpbiBhcnRpY2xlIG51bWJlcmVkICI3MSwgMTEvMDgvMjAwOSAxMjoyNSBHTVQuIgogIyBPbmx5IHRoZSB0aXRsZSBhYm92ZSBpcyBhdmFpbGFibGUgd2l0aG91dCBhIHN1YnNjcmlwdGlvbiB0byB0aGVpciBzZXJ2aWNlLApAQCAtMzQ0LDE5ICszMjYsMTQgQEAKICMgKGF0IGxlYXN0IHRvZGF5KS4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMC0wNy0yMCk6Ci0jIEFjY29yZGluZyB0byBOZXdzIGZyb20gRWd5cHQgLSAgQWwtTWFzcnkgQWwtWW91bSBFZ3lwdCdzIGNhYmluZXQgaGFzCisjIEFjY29yZGluZyB0byBOZXdzIGZyb20gRWd5cHQgLSBBbC1NYXNyeSBBbC1Zb3VtIEVneXB0J3MgY2FiaW5ldCBoYXMKICMgZGVjaWRlZCB0aGF0IERheWxpZ2h0IFNhdmluZyBUaW1lIHdpbGwgbm90IGJlIHVzZWQgaW4gRWd5cHQgZHVyaW5nCiAjIFJhbWFkYW4uCiAjCiAjIEFyYWJpYyB0cmFuc2xhdGlvbjoKLSMgIkNsb2NrcyB0byBnbyBiYWNrIGR1cmluZyBSYW1hZGFuLS1hbmQgdGhlbiBmb3J3YXJkIGFnYWluIgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFsbWFzcnlhbHlvdW0uY29tL2VuL25ld3MvY2xvY2tzLWdvLWJhY2stZHVyaW5nLXJhbWFkYW4tYW5kLXRoZW4tZm9yd2FyZC1hZ2FpbiI+CisjICJDbG9ja3MgdG8gZ28gYmFjayBkdXJpbmcgUmFtYWRhbiAtIGFuZCB0aGVuIGZvcndhcmQgYWdhaW4iCiAjIGh0dHA6Ly93d3cuYWxtYXNyeWFseW91bS5jb20vZW4vbmV3cy9jbG9ja3MtZ28tYmFjay1kdXJpbmctcmFtYWRhbi1hbmQtdGhlbi1mb3J3YXJkLWFnYWluCi0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19lZ3lwdDAyLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2VneXB0MDIuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBaG1hZCBFbC1EYXJkaXJ5ICgyMDE0LTA1LTA3KToKICMgRWd5cHQgaXMgdG8gY2hhbmdlIGJhY2sgdG8gRGF5bGlnaHQgc3lzdGVtIG9uIE1heSAxNQpAQCAtMzY1LDQ2ICszNDIsNzcgQEAKICMgRnJvbSBHdW50aGVyIFZlcm1pZXIgKDIwMTUtMDUtMTMpOgogIyBvdXIgRWd5cHQgb2ZmaWNlIGNvbmZpcm1zIHRoYXQgdGhlIGNoYW5nZSB3aWxsIGJlIGF0IDE1IE1heSAibWlkbmlnaHQiICgyNDowMCkKIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA1LTEzKToKKyMgRnJvbSBJbWVkIENoaWhpICgyMDE0LTA2LTA0KToKKyMgV2UgaGF2ZSBmaW5hbGx5ICJsb2NhdGVkIiBhIHByZWNpc2Ugb2ZmaWNpYWwgcmVmZXJlbmNlIGFib3V0IHRoZSBEU1QgY2hhbmdlcworIyBpbiBFZ3lwdC4gIFRoZSBNaW5pc3RlcnMgQ2FiaW5ldCBkZWNpc2lvbiBpcyBleHBsYWluZWQgYXQKKyMgaHR0cDovL3d3dy5jYWJpbmV0Lmdvdi5lZy9NZWRpYS9DYWJpbmV0TWVldGluZ3NEZXRhaWxzLmFzcHg/aWQ9MzQ3IC4uLgorIyBbVF1oaXMgKEFyYWJpYykgc2l0ZSBpcyBub3QgYWNjZXNzaWJsZSBvdXRzaWRlIEVneXB0LCBidXQgdGhlIHBhZ2UgLi4uCisjIHRyYW5zbGF0ZXMgaW50bzogIldpdGggcmVnYXJkIHRvIGRheWxpZ2h0IHNhdmluZyB0aW1lLCBpdCBpcyBzY2hlZHVsZWQgdG8KKyMgdGFrZSBlZmZlY3QgYXQgZXhhY3RseSB0d2VsdmUgbydjbG9jayB0aGlzIGV2ZW5pbmcsIFRodXJzZGF5LCAxNSBNQVkgMjAxNCwKKyMgdG8gYmUgc3VzcGVuZGVkIGJ5IHR3ZWx2ZSBvJ2Nsb2NrIG9uIHRoZSBldmVuaW5nIG9mIFRodXJzZGF5LCAyNiBKVU4gMjAxNCwKKyMgYW5kIHJlLWVzdGFibGlzaGVkIGFnYWluIGF0IHRoZSBlbmQgb2YgdGhlIG1vbnRoIG9mIFJhbWFkYW4sIGF0IHR3ZWx2ZQorIyBvJ2Nsb2NrIG9uIHRoZSBldmVuaW5nIG9mIFRodXJzZGF5LCAzMSBKVUwgMjAxNC4iICBUaGlzIHN0YXRlbWVudCBoYXMgYmVlbgorIyByZXByb2R1Y2VkIGJ5IG90aGVyIChtb3JlIGFjY2Vzc2libGUpIHNpdGVzWywgZS5nLixdLi4uCisjIGh0dHA6Ly9lbGdvcm5hbC5uZXQvbmV3cy9uZXdzLmFzcHg/aWQ9NDY5OTI1OAorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDYtMDQpOgogIyBTYXJhaCBFbCBEZWViIGFuZCBMZWUgS2VhdGggb2YgQVAgcmVwb3J0IHRoYXQgdGhlIEVneXB0aWFuIGdvdmVybm1lbnQgc2F5cwogIyB0aGUgY2hhbmdlIGlzIGJlY2F1c2Ugb2YgYmxhY2tvdXRzIGluIENhaXJvLCBldmVuIHRob3VnaCBBaHJhbSBPbmxpbmUgKGNpdGVkCi0jIGFib3ZlKSBzYXlzIERTVCBoYWQgbm8gYWZmZWN0IG9uIGVsZWN0cmljaXR5IGNvbnN1bXB0aW9uLiAgVGhlIEFQIHN0b3J5IHNheXMKLSMgRFNUIHdpbGwgbm90IGJlIG9ic2VydmVkIGR1cmluZyBSYW1hZGFuLiAgVGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgd2hlbgotIyBEU1Qgd2lsbCBlbmQuICBTZWU6CisjIGFib3ZlKSBzYXlzIERTVCBoYWQgbm8gYWZmZWN0IG9uIGVsZWN0cmljaXR5IGNvbnN1bXB0aW9uLiAgVGhlcmUgaXMKKyMgbm8gaW5mb3JtYXRpb24gYWJvdXQgd2hlbiBEU1Qgd2lsbCBlbmQgdGhpcyBmYWxsLiAgU2VlOgogIyBodHRwOi8vYWJjbmV3cy5nby5jb20vSW50ZXJuYXRpb25hbC93aXJlU3RvcnkvZWwtc2lzc2ktcHVzaGVzLWVneXB0aWFucy1saW5lLTIzNjE0ODMzCiAjCi0jIEZvciBub3csIGd1ZXNzIHRoYXQgbGF0ZXIgdHJhbnNpdGlvbnMgd2lsbCB1c2UgMjAxMCdzIHJ1bGVzLCBhbmQgdGhhdAotIyBFZ3lwdCB3aWxsIGFncmVlIHdpdGggTW9yb2NjbyAoc2VlIGJlbG93KSBhYm91dCB0aGUgZGF0ZSBSYW1hZGFuIHN0YXJ0cyBhbmQKLSMgZW5kcywgdGhvdWdoICh1bmxpa2UgTW9yb2NjbykgaXQgd2lsbCBzd2l0Y2ggYXQgMDA6MDAgc3RhbmRhcmQgdGltZS4gIEluCi0jIEVneXB0IHRoZSBzcHJpbmctZm9yd2FyZCB0cmFuc2l0aW9ucyBhcmUgcmVtb3ZlZCBmb3IgMjAyMC0yMDIyLCB3aGVuIHRoZQotIyBndWVzc2VkIHNwcmluZy1mb3J3YXJkIGRhdGUgZmFsbHMgZHVyaW5nIHRoZSBlc3RpbWF0ZWQgUmFtYWRhbiwgYW5kIGFsbAotIyB0cmFuc2l0aW9ucyByZW1vdmVkIGZvciAyMDIzLTIwMzgsIHdoZXJlIHRoZSBlc3RpbWF0ZWQgUmFtYWRhbiBmYWxscyBlbnRpcmVseQotIyBvdXRzaWRlIHRoZSBndWVzc2VkIGRheWxpZ2h0LXNhdmluZyB0aW1lLiAgUmFtYWRhbiBpbnRydWRlcyBvbiB0aGUgZ3Vlc3NlZAotIyBEU1Qgc3RhcnRpbmcgaW4gMjAzOSwgYnV0IHRoYXQncyBiZXlvbmQgb3VyIHNvbWV3aGF0LWFyYml0cmFyeSBjdXRvZmYuCi0KLVJ1bGUJRWd5cHQJMjAwOAlvbmx5CS0JQXVnCWxhc3RUaHUJMjM6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDA5CW9ubHkJLQlBdWcJMjAJMjM6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDEwCW9ubHkJLQlBdWcJMTEJMDowMAkwCS0KLVJ1bGUJRWd5cHQJMjAxMAlvbmx5CS0JU2VwCTEwCTA6MDAJMTowMAlTCi1SdWxlCUVneXB0CTIwMTAJb25seQktCVNlcAlsYXN0VGh1CTIzOjAwcwkwCS0KKyMgRm9yIG5vdywgZ3Vlc3MgdGhhdCBsYXRlciBzcHJpbmcgYW5kIGZhbGwgdHJhbnNpdGlvbnMgd2lsbCB1c2UKKyMgMjAxMCdzIHJ1bGVzLCBhbmQgZ3Vlc3MgdGhhdCBFZ3lwdCB3aWxsIHN3aXRjaCB0byBzdGFuZGFyZCB0aW1lIGF0CisjIDI0OjAwIHRoZSBsYXN0IFRodXJzZGF5IGJlZm9yZSBSYW1hZGFuLCBhbmQgYmFjayB0byBEU1QgYXQgMDA6MDAgdGhlCisjIGZpcnN0IEZyaWRheSBhZnRlciBSYW1hZGFuLiAgVG8gaW1wbGVtZW50IHRoaXMsCisjIHRyYW5zaXRpb24gZGF0ZXMgZm9yIDIwMTUgdGhyb3VnaCAyMDM3IHdlcmUgZGV0ZXJtaW5lZCBieSBydW5uaW5nCisjIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSB1bmRlciBHTlUgRW1hY3MgMjQuMywgd2l0aCB0aGUgcmVzdWx0cyBpbnRlZ3JhdGVkCisjIGJ5IGhhbmQgaW50byB0aGUgdGFibGUgYmVsb3cuICBSYW1hZGFuIGFnYWluIGludHJ1ZGVzIG9uIHRoZSBndWVzc2VkCisjIERTVCBzdGFydGluZyBpbiAyMDM4LCBidXQgdGhhdCdzIGJleW9uZCBvdXIgc29tZXdoYXQtYXJiaXRyYXJ5IGN1dG9mZi4KKyMgKGxldCAoKGlzbGFtaWMteWVhciAxNDM2KSkKKyMgICAod2hpbGUgKDwgaXNsYW1pYy15ZWFyIDE0NjApCisjICAgICAobGV0ICgoYSAoY2FsZW5kYXItaXNsYW1pYy10by1hYnNvbHV0ZSAobGlzdCA5IDEgaXNsYW1pYy15ZWFyKSkpCisjICAgICAgICAgICAoYiAoY2FsZW5kYXItaXNsYW1pYy10by1hYnNvbHV0ZSAobGlzdCAxMCAxIGlzbGFtaWMteWVhcikpKQorIyAgICAgICAgICAgKGZyaWRheSA1KSkKKyMgICAgICAgKHdoaWxlICgvPSBmcmlkYXkgKG1vZCBhIDcpKQorIyAgICAgICAgIChzZXRxIGEgKDEtIGEpKSkKKyMgICAgICAgKHdoaWxlICgvPSBmcmlkYXkgKG1vZCBiIDcpKQorIyAgICAgICAgIChzZXRxIGIgKDErIGIpKSkKKyMgICAgICAgKHNldHEgYSAoMS0gYSkpCisjICAgICAgIChzZXRxIGIgKDEtIGIpKQorIyAgICAgICAoc2V0cSBhIChjYWxlbmRhci1ncmVnb3JpYW4tZnJvbS1hYnNvbHV0ZSBhKSkKKyMgICAgICAgKHNldHEgYiAoY2FsZW5kYXItZ3JlZ29yaWFuLWZyb20tYWJzb2x1dGUgYikpCisjICAgICAgIChpbnNlcnQKKyMgICAgICAgIChmb3JtYXQKKyMgICAgICAgICAoY29uY2F0ICJSdWxlXHRFZ3lwdFx0JWRcdG9ubHlcdC1cdCVzXHQlMmRcdDI0OjAwXHQwXHQtXG4iCisjICAgICAgICAgICAgICAgICAiUnVsZVx0RWd5cHRcdCVkXHRvbmx5XHQtXHQlc1x0JTJkXHQyNDowMFx0MTowMFx0U1xuIikKKyMgICAgICAgICAoY2FyIChjZHIgKGNkciBhKSkpIChjYWxlbmRhci1tb250aC1uYW1lIChjYXIgYSkgdCkgKGNhciAoY2RyIGEpKQorIyAgICAgICAgIChjYXIgKGNkciAoY2RyIGIpKSkgKGNhbGVuZGFyLW1vbnRoLW5hbWUgKGNhciBiKSB0KSAoY2FyIChjZHIgYikpKSkpCisjICAgICAoc2V0cSBpc2xhbWljLXllYXIgKCsgMSBpc2xhbWljLXllYXIpKSkpCitSdWxlCUVneXB0CTIwMDgJb25seQktCUF1ZwlsYXN0VGh1CTI0OjAwCTAJLQorUnVsZQlFZ3lwdAkyMDA5CW9ubHkJLQlBdWcJMjAJMjQ6MDAJMAktCitSdWxlCUVneXB0CTIwMTAJb25seQktCUF1ZwkxMAkyNDowMAkwCS0KK1J1bGUJRWd5cHQJMjAxMAlvbmx5CS0JU2VwCSA5CTI0OjAwCTE6MDAJUworUnVsZQlFZ3lwdAkyMDEwCW9ubHkJLQlTZXAJbGFzdFRodQkyNDowMAkwCS0KIFJ1bGUJRWd5cHQJMjAxNAlvbmx5CS0JTWF5CTE1CTI0OjAwCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDE0CW9ubHkJLQlKdW4JMjkJIDA6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDE0CW9ubHkJLQlKdWwJMjkJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDE0CW1heAktCVNlcAlsYXN0VGh1CTIzOjAwcwkwCS0KK1J1bGUJRWd5cHQJMjAxNAlvbmx5CS0JSnVuCTI2CTI0OjAwCTAJLQorUnVsZQlFZ3lwdAkyMDE0CW9ubHkJLQlKdWwJMzEJMjQ6MDAJMTowMAlTCitSdWxlCUVneXB0CTIwMTQJbWF4CS0JU2VwCWxhc3RUaHUJMjQ6MDAJMAktCiBSdWxlCUVneXB0CTIwMTUJMjAxOQktCUFwcglsYXN0RnJpCSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAxNQlvbmx5CS0JSnVuCTE4CSAwOjAwcwkwCS0KLVJ1bGUJRWd5cHQJMjAxNQlvbmx5CS0JSnVsCTE4CSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAxNglvbmx5CS0JSnVuCSA3CSAwOjAwcwkwCS0KLVJ1bGUJRWd5cHQJMjAxNglvbmx5CS0JSnVsCSA3CSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAxNwlvbmx5CS0JTWF5CTI3CSAwOjAwcwkwCS0KLVJ1bGUJRWd5cHQJMjAxNwlvbmx5CS0JSnVuCTI2CSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAxOAlvbmx5CS0JTWF5CTE2CSAwOjAwcwkwCS0KLVJ1bGUJRWd5cHQJMjAxOAlvbmx5CS0JSnVuCTE1CSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAxOQlvbmx5CS0JTWF5CSA2CSAwOjAwcwkwCS0KLVJ1bGUJRWd5cHQJMjAxOQlvbmx5CS0JSnVuCSA1CSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAyMAlvbmx5CS0JTWF5CTI0CSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAyMQlvbmx5CS0JTWF5CTEzCSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAyMglvbmx5CS0JTWF5CSAzCSAwOjAwcwkxOjAwCVMKK1J1bGUJRWd5cHQJMjAxNQlvbmx5CS0JSnVuCTExCTI0OjAwCTAJLQorUnVsZQlFZ3lwdAkyMDE1CW9ubHkJLQlKdWwJMjMJMjQ6MDAJMTowMAlTCitSdWxlCUVneXB0CTIwMTYJb25seQktCUp1bgkgMgkyNDowMAkwCS0KK1J1bGUJRWd5cHQJMjAxNglvbmx5CS0JSnVsCSA3CTI0OjAwCTE6MDAJUworUnVsZQlFZ3lwdAkyMDE3CW9ubHkJLQlNYXkJMjUJMjQ6MDAJMAktCitSdWxlCUVneXB0CTIwMTcJb25seQktCUp1bgkyOQkyNDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMjAxOAlvbmx5CS0JTWF5CTEwCTI0OjAwCTAJLQorUnVsZQlFZ3lwdAkyMDE4CW9ubHkJLQlKdW4JMTQJMjQ6MDAJMTowMAlTCitSdWxlCUVneXB0CTIwMTkJb25seQktCU1heQkgMgkyNDowMAkwCS0KK1J1bGUJRWd5cHQJMjAxOQlvbmx5CS0JSnVuCSA2CTI0OjAwCTE6MDAJUworUnVsZQlFZ3lwdAkyMDIwCW9ubHkJLQlNYXkJMjgJMjQ6MDAJMTowMAlTCitSdWxlCUVneXB0CTIwMjEJb25seQktCU1heQkxMwkyNDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMjAyMglvbmx5CS0JTWF5CSA1CTI0OjAwCTE6MDAJUwogUnVsZQlFZ3lwdAkyMDIzCW1heAktCUFwcglsYXN0RnJpCSAwOjAwcwkxOjAwCVMKIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQpAQCAtNDEyLDYwICs0MjAsNjMgQEAKIAkJCTI6MDAJRWd5cHQJRUUlc1QKIAogIyBFcXVhdG9yaWFsIEd1aW5lYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTWFsYWJvCTA6MzU6MDggLQlMTVQJMTkxMgotCQkJMDowMAktCUdNVAkxOTYzIERlYyAxNQotCQkJMTowMAktCVdBVAorIyBTZWUgQWZyaWNhL0xhZ29zLgogCiAjIEVyaXRyZWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQWZyaWNhL0FzbWFyYQkyOjM1OjMyIC0JTE1UCTE4NzAKLQkJCTI6MzU6MzIJLQlBTVQJMTg5MAkgICAgICAjIEFzbWFyYSBNZWFuIFRpbWUKLQkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKKwkJCTI6MzU6MzIJLQlBTVQJMTg5MCAgICAgICAgIyBBc21hcmEgTWVhbiBUaW1lCisJCQkyOjM1OjIwCS0JQURNVAkxOTM2IE1heSAgNSAjIEFkaXMgRGVyYSBNVAogCQkJMzowMAktCUVBVAogCiAjIEV0aGlvcGlhCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBFdGhpb3BpYSBoYWQgc2l4IG5hcnJvd2x5LXNwYWNlZCB0aW1lIHpvbmVzCi0jIGJldHdlZW4gMTg3MCBhbmQgMTg5MCwgYW5kIHRoYXQgdGhleSBtZXJnZWQgdG8gMzhFNTAgKDI6MzU6MjApIGluIDE4OTAuCi0jIFdlJ2xsIGd1ZXNzIHRoYXQgMzhFNTAgaXMgZm9yIEFkaXMgRGVyYS4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0zMSk6CisjIExpa2UgdGhlIFN3YWhpbGkgb2YgS2VueWEgYW5kIFRhbnphbmlhLCBtYW55IEV0aGlvcGlhbnMga2VlcCBhCisjIDEyLWhvdXIgY2xvY2sgc3RhcnRpbmcgYXQgb3VyIDA2OjAwLCBzbyB0aGVpciAiOCBvJ2Nsb2NrIiBpcyBvdXIKKyMgMDI6MDAgb3IgMTQ6MDAuICBLZWVwIHRoaXMgaW4gbWluZCB3aGVuIHlvdSBhc2sgdGhlIHRpbWUgaW4gQW1oYXJpYy4KKyMKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgRXRoaW9waWEgaGFkIHNpeCBuYXJyb3dseS1zcGFjZWQgdGltZQorIyB6b25lcyBiZXR3ZWVuIDE4NzAgYW5kIDE4OTAsIHRoYXQgdGhleSBtZXJnZWQgdG8gMzhFNTAgKDI6MzU6MjApIGluCisjIDE4OTAsIGFuZCB0aGF0IHRoZXkgc3dpdGNoZWQgdG8gMzowMCBvbiAxOTM2LTA1LTA1LiAgUGVyaGFwcyAzOEU1MAorIyB3YXMgZm9yIEFkaXMgRGVyYS4gIFF1aXRlIGxpa2VseSB0aGUgU2hhbmtzIGRhdGEgZW50cmllcyBhcmUgd3JvbmcKKyMgYW55d2F5LgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBZnJpY2EvQWRkaXNfQWJhYmEJMjozNDo0OCAtCUxNVAkxODcwCi0JCQkyOjM1OjIwCS0JQURNVAkxOTM2IE1heSA1ICAgICMgQWRpcyBEZXJhIE1UCisJCQkyOjM1OjIwCS0JQURNVAkxOTM2IE1heSAgNSAjIEFkaXMgRGVyYSBNVAogCQkJMzowMAktCUVBVAogCiAjIEdhYm9uCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9MaWJyZXZpbGxlCTA6Mzc6NDggLQlMTVQJMTkxMgotCQkJMTowMAktCVdBVAorIyBTZWUgQWZyaWNhL0xhZ29zLgogCiAjIEdhbWJpYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQmFuanVsCS0xOjA2OjM2IC0JTE1UCTE5MTIKLQkJCS0xOjA2OjM2IC0JQk1UCTE5MzUJIyBCYW5qdWwgTWVhbiBUaW1lCi0JCQktMTowMAktCVdBVAkxOTY0Ci0JCQkgMDowMAktCUdNVAorIyBTZWUgQWZyaWNhL0FiaWRqYW4uCiAKICMgR2hhbmEKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIFdoaXRtYW4gc2F5cyBEU1Qgd2FzIG9ic2VydmVkIGZyb20gMTkzMSB0byBgYHRoZSBwcmVzZW50Jyc7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlHaGFuYQkxOTM2CTE5NDIJLQlTZXAJIDEJMDowMAkwOjIwCUdIU1QKLVJ1bGUJR2hhbmEJMTkzNgkxOTQyCS0JRGVjCTMxCTA6MDAJMAlHTVQKKyMgV2hpdG1hbiBzYXlzIERTVCB3YXMgb2JzZXJ2ZWQgZnJvbSAxOTMxIHRvICJ0aGUgcHJlc2VudCI7CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgMTkzNiB0byAxOTQyOworIyBhbmQgU2VwdGVtYmVyIDEgdG8gSmFudWFyeSAxIGlzIGdpdmVuIGJ5OgorIyBTY290dCBLZWx0aWUgSiwgRXBzdGVpbiBNIChlZHMpLCBUaGUgU3RhdGVzbWFuJ3MgWWVhci1Cb29rLAorIyA1N3RoIGVkLiBNYWNtaWxsYW4sIExvbmRvbiAoMTkyMCksIE9DTEMgNjA5NDA4MDE1LCBwcCB4eHZpaWkuCisjIEZvciBsYWNrIG9mIGJldHRlciBpbmZvLCBhc3N1bWUgRFNUIHdhcyBvYnNlcnZlZCBmcm9tIDE5MjAgdG8gMTk0Mi4KK1J1bGUJR2hhbmEJMTkyMAkxOTQyCS0JU2VwCSAxCTA6MDAJMDoyMAlHSFNUCitSdWxlCUdoYW5hCTE5MjAJMTk0MgktCURlYwkzMQkwOjAwCTAJR01UCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFmcmljYS9BY2NyYQktMDowMDo1MiAtCUxNVAkxOTE4CiAJCQkgMDowMAlHaGFuYQklcwogCiAjIEd1aW5lYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQ29uYWtyeQktMDo1NDo1MiAtCUxNVAkxOTEyCi0JCQkgMDowMAktCUdNVAkxOTM0IEZlYiAyNgotCQkJLTE6MDAJLQlXQVQJMTk2MAotCQkJIDA6MDAJLQlHTVQKKyMgU2VlIEFmcmljYS9BYmlkamFuLgogCiAjIEd1aW5lYS1CaXNzYXUKKyMKKyMgU2hhbmtzIGdpdmVzIDE5MTEtMDUtMjYgZm9yIHRoZSB0cmFuc2l0aW9uIHRvIFdBVCwKKyMgZXZpZGVudGx5IGNvbmZ1c2luZyB0aGUgZGF0ZSBvZiB0aGUgUG9ydHVndWVzZSBkZWNyZWUKKyMgaHR0cDovL2RyZS5wdC9wZGYxc2RpcC8xOTExLzA1LzEyNTAwLzIzMTMyMzEzLnBkZgorIyB3aXRoIHRoZSBkYXRlIHRoYXQgaXQgdG9vayBlZmZlY3QsIG5hbWVseSAxOTEyLTAxLTAxLgorIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQmlzc2F1CS0xOjAyOjIwIC0JTE1UCTE5MTEgTWF5IDI2Citab25lCUFmcmljYS9CaXNzYXUJLTE6MDI6MjAgLQlMTVQJMTkxMiBKYW4gIDEKIAkJCS0xOjAwCS0JV0FUCTE5NzUKIAkJCSAwOjAwCS0JR01UCiAKQEAgLTQ4MCw4ICs0OTEsOCBAQAogIyBMZXNvdGhvCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFmcmljYS9NYXNlcnUJMTo1MDowMCAtCUxNVAkxOTAzIE1hcgotCQkJMjowMAktCVNBU1QJMTk0MyBTZXAgMTkgMjowMAotCQkJMjowMAkxOjAwCVNBU1QJMTk0NCBNYXIgMTkgMjowMAorCQkJMjowMAktCVNBU1QJMTk0MyBTZXAgMTkgIDI6MDAKKwkJCTI6MDAJMTowMAlTQVNUCTE5NDQgTWFyIDE5ICAyOjAwCiAJCQkyOjAwCS0JU0FTVAogCiAjIExpYmVyaWEKQEAgLTU0OSwxMSArNTYwLDExIEBACiAJCQkyOjAwCS0JRUVUCTE5ODIKIAkJCTE6MDAJTGlieWEJQ0Ulc1QJMTk5MCBNYXkgIDQKICMgVGhlIDE5OTYgYW5kIDE5OTcgZW50cmllcyBhcmUgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI7Ci0jIHRoZSBJQVRBIFNTSU0gZGF0YSBjb250YWluIHNvbWUgb2J2aW91cyBlcnJvcnMuCisjIHRoZSBJQVRBIFNTSU0gZGF0YSBlbnRyaWVzIGNvbnRhaW4gc29tZSBvYnZpb3VzIGVycm9ycy4KIAkJCTI6MDAJLQlFRVQJMTk5NiBTZXAgMzAKIAkJCTE6MDAJTGlieWEJQ0Ulc1QJMTk5NyBPY3QgIDQKLQkJCTI6MDAJLQlFRVQJMjAxMiBOb3YgMTAgMjowMAotCQkJMTowMAlMaWJ5YQlDRSVzVAkyMDEzIE9jdCAyNSAyOjAwCisJCQkyOjAwCS0JRUVUCTIwMTIgTm92IDEwICAyOjAwCisJCQkxOjAwCUxpYnlhCUNFJXNUCTIwMTMgT2N0IDI1ICAyOjAwCiAJCQkyOjAwCS0JRUVUCiAKICMgTWFkYWdhc2NhcgpAQCAtNTY5LDE4ICs1ODAsOCBAQAogCQkJMjowMAktCUNBVAogCiAjIE1hbGkKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0JhbWFrbwktMDozMjowMCAtCUxNVAkxOTEyCi0JCQkgMDowMAktCUdNVAkxOTM0IEZlYiAyNgotCQkJLTE6MDAJLQlXQVQJMTk2MCBKdW4gMjAKLQkJCSAwOjAwCS0JR01UCi0KICMgTWF1cml0YW5pYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvTm91YWtjaG90dAktMTowMzo0OCAtCUxNVAkxOTEyCi0JCQkgMDowMAktCUdNVAkxOTM0IEZlYiAyNgotCQkJLTE6MDAJLQlXQVQJMTk2MCBOb3YgMjgKLQkJCSAwOjAwCS0JR01UCisjIFNlZSBBZnJpY2EvQWJpZGphbi4KIAogIyBNYXVyaXRpdXMKIApAQCAtNjA0LDkgKzYwNSw3IEBACiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDctMTApOgogIyBBY2NvcmRpbmcgdG8KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sZXhwcmVzcy5tdS9kaXNwbGF5X2FydGljbGUucGhwP25ld3NfaWQ9MTExMjE2Ij4KICMgaHR0cDovL3d3dy5sZXhwcmVzcy5tdS9kaXNwbGF5X2FydGljbGUucGhwP25ld3NfaWQ9MTExMjE2Ci0jIDwvYT4KICMgKGluIEZyZW5jaCksIE1hdXJpdGl1cyB3aWxsIHN0YXJ0IGFuZCBlbmQgdGhlaXIgRFNUIGEgZmV3IGRheXMgZWFybGllcgogIyB0aGFuIHByZXZpb3VzbHkgYW5ub3VuY2VkICgyMDA4LTExLTAxIHRvIDIwMDktMDMtMzEpLiAgVGhlIG5ldyBzdGFydAogIyBkYXRlIGlzIDIwMDgtMTAtMjYgYXQgMDI6MDAgYW5kIHRoZSBuZXcgZW5kIGRhdGUgaXMgMjAwOS0wMy0yNyAobm8gdGltZQpAQCAtNjIxLDIyICs2MjAsMTcgQEAKIAogIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDctMTEpOgogIyBTZWVtcyB0aGF0IEVuZ2xpc2ggbGFuZ3VhZ2UgYXJ0aWNsZSAiVGhlIHJldml2YWwgb2YgZGF5bGlnaHQgc2F2aW5nCi0jIHRpbWU6ICBFbmVyZ3kgY29uc2VydmF0aW9uPyItIyBOby4gMTY1NzggKDA3LzExLzIwMDgpIHdhcyBvcmlnaW5hbGx5CisjIHRpbWU6IEVuZXJneSBjb25zZXJ2YXRpb24/Ii0jIE5vLiAxNjU3OCAoMDcvMTEvMjAwOCkgd2FzIG9yaWdpbmFsbHkKICMgcHVibGlzaGVkIG9uIE1vbmRheSwgSnVuZSAzMCwgMjAwOC4uLgogIwogIyBJIGd1ZXNzIHRoYXQgYXJ0aWNsZSBpbiBGcmVuY2ggIkxlIGdvdXZlcm5lbWVudCBhdmFuY2UgbCdpbnRyb2R1Y3Rpb24KLSMgZGUgbCdoZXVyZSBkJ2V0ZSIgc3RhdGluZyB0aGF0IERTVCBpbiBNYXVyaXRpdXMgc3RhcnRpbmcgb24gT2N0b2JlciAyNgotIyBhbmQgZW5kaW5nIG9uIE1hcmNoIDI3LCAyMDA5IGlzIHRoZSBtb3N0IHJlY2VudCBvbmUuCi0jIC4uLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwiPgorIyBkZSBsJ2hldXJlIGQnw6l0w6kiIHN0YXRpbmcgdGhhdCBEU1QgaW4gTWF1cml0aXVzIHN0YXJ0aW5nIG9uIE9jdG9iZXIgMjYKKyMgYW5kIGVuZGluZyBvbiBNYXJjaCAyNywgMjAwOSBpcyB0aGUgbW9zdCByZWNlbnQgb25lLi4uLgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gUmlhZCBNLiBIb3NzZW4gQWxseSAoMjAwOC0wOC0wMyk6CiAjIFRoZSBHb3Zlcm5tZW50IG9mIE1hdXJpdGl1cyB3ZWJsaW5rCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9zaXRlL3Btb3NpdGUvbWVudWl0ZW0uNGNhMGVmZGVlNDc0NjJlNzQ0MGE2MDAyNDhhNTIxY2EvP2NvbnRlbnRfaWQ9NDcyOGNhNjhiMmE1YjExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRCI+CiAjIGh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9zaXRlL3Btb3NpdGUvbWVudWl0ZW0uNGNhMGVmZGVlNDc0NjJlNzQ0MGE2MDAyNDhhNTIxY2EvP2NvbnRlbnRfaWQ9NDcyOGNhNjhiMmE1YjExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRAotIyA8L2E+CiAjIENhYmluZXQgRGVjaXNpb24gb2YgSnVseSAxOHRoLCAyMDA4IHN0YXRlcyBhcyBmb2xsb3dzOgogIwogIyA0LiAuLi5DYWJpbmV0IGhhcyBhZ3JlZWQgdG8gdGhlIGludHJvZHVjdGlvbiBpbnRvIHRoZSBOYXRpb25hbCBBc3NlbWJseQpAQCAtNjQ2LDMzICs2NDAsMjUgQEAKICMgU3RhdGVzIG9mIEFtZXJpY2EuIEl0IHdpbGwgc3RhcnQgYXQgdHdvIG8nY2xvY2sgaW4gdGhlIG1vcm5pbmcgb24gdGhlCiAjIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIgYW5kIHdpbGwgZW5kIGF0IHR3byBvJ2Nsb2NrIGluIHRoZSBtb3JuaW5nIG9uCiAjIHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCB0aGUgZm9sbG93aW5nIHllYXIuIFRoZSBzdW1tZXIgdGltZSBmb3IgdGhlCi0jIHllYXIgMjAwOCAtIDIwMDkgd2lsbCwgdGhlcmVmb3JlLCBiZSBlZmZlY3RpdmUgYXMgZnJvbSAyNiBPY3RvYmVyIDIwMDgKKyMgeWVhciAyMDA4LTIwMDkgd2lsbCwgdGhlcmVmb3JlLCBiZSBlZmZlY3RpdmUgYXMgZnJvbSAyNiBPY3RvYmVyIDIwMDgKICMgYW5kIGVuZCBvbiAyOSBNYXJjaCAyMDA5LgogCiAjIEZyb20gRWQgTWFzdGUgKDIwMDgtMTAtMDcpOgogIyBUSEUgVElNRSBCSUxMIChOby4gWFhWSUkgb2YgMjAwOCkgRXhwbGFuYXRvcnkgTWVtb3JhbmR1bSBzdGF0ZXMgdGhlCiAjIGJlZ2lubmluZyAvIGVuZGluZyBvZiBzdW1tZXIgdGltZSBpcyAyIG8nY2xvY2sgc3RhbmRhcmQgdGltZSBpbiB0aGUKICMgbW9ybmluZyBvZiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciAvIGxhc3QgU3VuZGF5IG9mIE1hcmNoLgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvdi5tdS9wb3J0YWwvZ29jL2Fzc2VtYmx5c2l0ZS9maWxlL2JpbGwyNzA4LnBkZiI+CiAjIGh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9nb2MvYXNzZW1ibHlzaXRlL2ZpbGUvYmlsbDI3MDgucGRmCi0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wNi0wNSk6CiAjIEFjY29yZGluZyB0byBzZXZlcmFsIHNvdXJjZXMsIE1hdXJpdGl1cyB3aWxsIG5vdCBjb250aW51ZSB0byBvYnNlcnZlCiAjIERTVCB0aGUgY29taW5nIHN1bW1lci4uLgogIwogIyBTb21lIHNvdXJjZXMsIGluIEZyZW5jaDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5kZWZpbWVkaWEuaW5mby9uZXdzLzk0Ni9SYXNoaWQtQmVlYmVlamF1bi06LSVDMiVBQi1MJUUyJTgwJTk5aGV1cmUtZCVFMiU4MCU5OSVDMyVBOXQlQzMlQTktbmUtc2VyYS1wYXMtYXBwbGlxdSVDMyVBOWUtY2V0dGUtYW5uJUMzJUE5ZS0lQzIlQkIiPgogIyBodHRwOi8vd3d3LmRlZmltZWRpYS5pbmZvL25ld3MvOTQ2L1Jhc2hpZC1CZWViZWVqYXVuLTotJUMyJUFCLUwlRTIlODAlOTloZXVyZS1kJUUyJTgwJTk5JUMzJUE5dCVDMyVBOS1uZS1zZXJhLXBhcy1hcHBsaXF1JUMzJUE5ZS1jZXR0ZS1hbm4lQzMlQTllLSVDMiVCQgotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly9sZXhwcmVzcy5tdS9TdG9yeS8zMzk4fkJlZWJlZWphdW4tLS1MZXMtb2JqZWN0aWZzLWQtJUMzJUE5Y29ub21pZS1kLSVDMyVBOW5lcmdpZS1kZS1sLWhldXJlLWQtJUMzJUE5dCVDMyVBOS1vbnQtJUMzJUE5dCVDMyVBOS1hdHRlaW50cy0iPgogIyBodHRwOi8vbGV4cHJlc3MubXUvU3RvcnkvMzM5OH5CZWViZWVqYXVuLS0tTGVzLW9iamVjdGlmcy1kLSVDMyVBOWNvbm9taWUtZC0lQzMlQTluZXJnaWUtZGUtbC1oZXVyZS1kLSVDMyVBOXQlQzMlQTktb250LSVDMyVBOXQlQzMlQTktYXR0ZWludHMtCi0jIDwvYT4KICMKICMgT3VyIHdyYXAtdXA6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tYXVyaXRpdXMtZHN0LXdpbGwtbm90LXJlcGVhdC5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21hdXJpdGl1cy1kc3Qtd2lsbC1ub3QtcmVwZWF0Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LTA3LTExKToKICMgVGhlICJtYXVyaXRpdXMtZHN0LXdpbGwtbm90LXJlcGVhdCIgd3JhcHVwIGluY2x1ZGVzIHRoaXM6CkBAIC02ODUsMTggKzY3MSwxOCBAQAogUnVsZSBNYXVyaXRpdXMJMjAwOAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCVMKIFJ1bGUgTWF1cml0aXVzCTIwMDkJb25seQktCU1hcglsYXN0U3VuCTI6MDAJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEluZGlhbi9NYXVyaXRpdXMJMzo1MDowMCAtCUxNVAkxOTA3CQkjIFBvcnQgTG91aXMKK1pvbmUgSW5kaWFuL01hdXJpdGl1cwkzOjUwOjAwIC0JTE1UCTE5MDcgIyBQb3J0IExvdWlzCiAJCQk0OjAwIE1hdXJpdGl1cwlNVSVzVAkjIE1hdXJpdGl1cyBUaW1lCiAjIEFnYWxlZ2EgSXMsIFJvZHJpZ3VlegogIyBubyBpbmZvcm1hdGlvbjsgcHJvYmFibHkgbGlrZSBJbmRpYW4vTWF1cml0aXVzCiAKICMgTWF5b3R0ZQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlJbmRpYW4vTWF5b3R0ZQkzOjAwOjU2IC0JTE1UCTE5MTEgSnVsCSMgTWFtb3V0em91Citab25lCUluZGlhbi9NYXlvdHRlCTM6MDA6NTYgLQlMTVQJMTkxMSBKdWwgIyBNYW1vdXR6b3UKIAkJCTM6MDAJLQlFQVQKIAogIyBNb3JvY2NvCi0jIFNlZSB0aGUgYGV1cm9wZScgZmlsZSBmb3IgU3BhbmlzaCBNb3JvY2NvIChBZnJpY2EvQ2V1dGEpLgorIyBTZWUgdGhlICdldXJvcGUnIGZpbGUgZm9yIFNwYW5pc2ggTW9yb2NjbyAoQWZyaWNhL0NldXRhKS4KIAogIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDUtMDkpOgogIyBIZXJlIGlzIGFuIGFydGljbGUgdGhhdCBNb3JvY2NvIHBsYW4gdG8gaW50cm9kdWNlIERheWxpZ2h0IFNhdmluZyBUaW1lIGJldHdlZW4KQEAgLTcwNCw2MCArNjkwLDQ0IEBACiAjCiAjICIuLi4gTW9yb2NjbyBpcyB0byBzYXZlIGVuZXJneSBieSBhZGp1c3RpbmcgaXRzIGNsb2NrIGR1cmluZyBzdW1tZXIgc28gaXQgd2lsbAogIyBiZSBvbmUgaG91ciBhaGVhZCBvZiBHTVQgYmV0d2VlbiAxIEp1bmUgYW5kIDI3IFNlcHRlbWJlciwgYWNjb3JkaW5nIHRvCi0jIENvbW11bmljYXRpb24gTWluaXN0ZXIgYW5kIEdvdiBlcm5tZW50IFNwb2tlc21hbiwgS2hhbGlkIE5hY2lyaS4uLi4iCisjIENvbW11bmljYXRpb24gTWluaXN0ZXIgYW5kIEdvdmVybm1lbnQgU3Bva2VzbWFuLCBLaGFsaWQgTmFjaXJpLi4uLiIKICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDEuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfbW9yb2NjbzAxLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vZW4uYWZyaWsuY29tL25ld3MxMTg5Mi5odG1sIj4KICMgaHR0cDovL2VuLmFmcmlrLmNvbS9uZXdzMTE4OTIuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA4LTA1LTA5KToKLSMgVGhlIE1vcm9jY28gdGltZSBjaGFuZ2UgY2FuIGJlIGNvbmZpcm1lZCBvbiBNb3JvY2NvIHdlYiBzaXRlIE1hZ2hyZWIgQXJhYmUgUHJlc3NlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcC5tYS9lbmcvc2VjdGlvbnMvYm94My9tb3JvY2NvX3NoaWZ0c190b19kYS92aWV3Ij4KKyMgVGhlIE1vcm9jY28gdGltZSBjaGFuZ2UgY2FuIGJlIGNvbmZpcm1lZCBvbiBNb3JvY2NvIHdlYiBzaXRlIE1hZ2hyZWIgQXJhYmUKKyMgUHJlc3NlOgogIyBodHRwOi8vd3d3Lm1hcC5tYS9lbmcvc2VjdGlvbnMvYm94My9tb3JvY2NvX3NoaWZ0c190b19kYS92aWV3Ci0jIDwvYT4KICMKICMgTW9yb2NjbyBzaGlmdHMgdG8gZGF5bGlnaHQgdGltZSBvbiBKdW5lIDFzdCB0aHJvdWdoIFNlcHRlbWJlciAyNywgR292dC4KICMgc3Bva2VzbWFuLgogCiAjIEZyb20gUGF0cmljZSBTY2F0dG9saW4gKDIwMDgtMDUtMDkpOgogIyBBY2NvcmRpbmcgdG8gdGhpcyBhcnRpY2xlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmF2bWFyb2MuY29tL2FjdHVhbGl0ZS9oZXVyZS1kZXRlLWNvbW1lbnQtYTEyNzg5Ni5odG1sIj4KICMgaHR0cDovL3d3dy5hdm1hcm9jLmNvbS9hY3R1YWxpdGUvaGV1cmUtZGV0ZS1jb21tZW50LWExMjc4OTYuaHRtbAotIyA8L2E+Ci0jIChhbmQgcmVwdWJsaXNoZWQgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hY3R1Lm1hL2hldXJlLWRldGUtY29tbWVudF9pMTI3ODk2XzAuaHRtbCI+Ci0jIGh0dHA6Ly93d3cuYWN0dS5tYS9oZXVyZS1kZXRlLWNvbW1lbnRfaTEyNzg5Nl8wLmh0bWwKLSMgPC9hPgotIyApCi0jIHRoZSBjaGFuZ2VzIG9jY3VycyBhdCBtaWRuaWdodDoKKyMgKGFuZCByZXB1Ymxpc2hlZCBoZXJlOiA8aHR0cDovL3d3dy5hY3R1Lm1hL2hldXJlLWRldGUtY29tbWVudF9pMTI3ODk2XzAuaHRtbD4pCisjIHRoZSBjaGFuZ2VzIG9jY3VyIGF0IG1pZG5pZ2h0OgogIwotIyBzYXR1cmRheSBuaWdodCBtYXkgMzFzdCBhdCBtaWRuaWdodCAod2hpY2ggaW4gZnJlbmNoIGlzIHRvIGJlCi0jIGludHJlcHJldGVkIGFzIHRoZSBuaWdodCBiZXR3ZWVuIHNhdHVyZGF5IGFuZCBzdW5kYXkpCi0jIHN1bmRheSBuaWdodCB0aGUgMjh0aCAgYXQgbWlkbmlnaHQKKyMgU2F0dXJkYXkgbmlnaHQgTWF5IDMxc3QgYXQgbWlkbmlnaHQgKHdoaWNoIGluIEZyZW5jaCBpcyB0byBiZQorIyBpbnRlcnByZXRlZCBhcyB0aGUgbmlnaHQgYmV0d2VlbiBTYXR1cmRheSBhbmQgU3VuZGF5KQorIyBTdW5kYXkgbmlnaHQgdGhlIDI4dGggYXQgbWlkbmlnaHQKICMKLSMgU2VlaW5nIHRoYXQgdGhlIDI4dGggaXMgbW9uZGF5LCBJIGFtIGd1ZXNzaW5nIHRoYXQgc2hlIGludGVuZHMgdG8gc2F5Ci0jIHRoZSBtaWRuaWdodCBvZiB0aGUgMjh0aCB3aGljaCBpcyB0aGUgbWlkbmlnaHQgYmV0d2VlbiBzdW5kYXkgYW5kCi0jIG1vbmRheSwgd2hpY2ggaml2ZXMgd2l0aCBvdGhlciBzb3VyY2VzIHRoYXQgc2F5IHRoYXQgaXQncyBpbmNsdXNpdmUKLSMganVuZTFzdCB0byBzZXB0IDI3dGguCisjIFNlZWluZyB0aGF0IHRoZSAyOHRoIGlzIE1vbmRheSwgSSBhbSBndWVzc2luZyB0aGF0IHNoZSBpbnRlbmRzIHRvIHNheQorIyB0aGUgbWlkbmlnaHQgb2YgdGhlIDI4dGggd2hpY2ggaXMgdGhlIG1pZG5pZ2h0IGJldHdlZW4gU3VuZGF5IGFuZAorIyBNb25kYXksIHdoaWNoIGppdmVzIHdpdGggb3RoZXIgc291cmNlcyB0aGF0IHNheSB0aGF0IGl0J3MgaW5jbHVzaXZlCisjIEp1bmUgMXN0IHRvIFNlcHQgMjd0aC4KICMKICMgVGhlIGRlY2lzaW9uIHdhcyB0YWtlbiBieSBkZWNyZWUgKjItMDgtMjI0ICpidXQgSSBjYW4ndCBmaW5kIHRoZSBkZWNyZWUKICMgcHVibGlzaGVkIG9uIHRoZSB3ZWIuCiAjCiAjIEl0J3MgYWxzbyBjb25maXJtZWQgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tYXJvYy5tYS9OUi9leGVyZXMvRkFDRjE0MUYtRDkxMC00NEIwLUI3RkEtNkUwMzczMzQyNUQxLmh0bSI+CiAjIGh0dHA6Ly93d3cubWFyb2MubWEvTlIvZXhlcmVzL0ZBQ0YxNDFGLUQ5MTAtNDRCMC1CN0ZBLTZFMDM3MzM0MjVEMS5odG0KLSMgPC9hPgotIyBvbiBhIGdvdmVybm1lbnQgcG9ydGFsIGFzIGJlaW5nICBiZXR3ZWVuIGp1bmUgMXN0IGFuZCBzZXB0IDI3dGggKG5vdCB5ZXQKLSMgcG9zdGVkIGluIGVuZ2xpc2gpLgorIyBvbiBhIGdvdmVybm1lbnQgcG9ydGFsIGFzIGJlaW5nIGJldHdlZW4gSnVuZSAxc3QgYW5kIFNlcHQgMjd0aCAobm90IHlldAorIyBwb3N0ZWQgaW4gRW5nbGlzaCkuCiAjCi0jIFRoZSBmb2xsb3dpbmcgZ29vZ2xlIHF1ZXJ5IHdpbGwgZ2VuZXJhdGUgbWFueSByZWxldmFudCBoaXRzOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP2hsPWVuJnE9Q29uc2VpbCtkZStnb3V2ZXJuZW1lbnQrbWFyb2MraGV1cmUrYXZhbmNlJmJ0bkc9U2VhcmNoIj4KKyMgVGhlIGZvbGxvd2luZyBHb29nbGUgcXVlcnkgd2lsbCBnZW5lcmF0ZSBtYW55IHJlbGV2YW50IGhpdHM6CiAjIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/aGw9ZW4mcT1Db25zZWlsK2RlK2dvdXZlcm5lbWVudCttYXJvYytoZXVyZSthdmFuY2UmYnRuRz1TZWFyY2gKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTA4LTI3KToKICMgTW9yb2NjbyB3aWxsIGNoYW5nZSB0aGUgY2xvY2tzIGJhY2sgb24gdGhlIG1pZG5pZ2h0IGJldHdlZW4gQXVndXN0IDMxCkBAIC03NjUsNDcgKzczNSwzMiBAQAogIyBvZiBTZXB0ZW1iZXI6CiAjCiAjIE9uZSBhcnRpY2xlIGFib3V0IGl0IChpbiBGcmVuY2gpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1lbmFyYS5tYS9mci9BY3R1YWxpdGVzL01hcm9jL1NvY2lldGUvY2kucmV0b3VyX2FfbF9oZXVyZV9nbXRfYV9wYXJ0aXJfZHVfZGltYW5jaGVfMzFfYW91dF9hX21pbnVpdF9vZmZpY2llbF8uZGVmYXVsdCI+CiAjIGh0dHA6Ly93d3cubWVuYXJhLm1hL2ZyL0FjdHVhbGl0ZXMvTWFyb2MvU29jaWV0ZS9jaS5yZXRvdXJfYV9sX2hldXJlX2dtdF9hX3BhcnRpcl9kdV9kaW1hbmNoZV8zMV9hb3V0X2FfbWludWl0X29mZmljaWVsXy5kZWZhdWx0Ci0jIDwvYT4KICMKICMgV2UgaGF2ZSBzb21lIGZ1cnRoZXIgZGV0YWlscyBwb3N0ZWQgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21vcm9jY28tZW5kcy1kc3QtZWFybHktMjAwOC5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21vcm9jY28tZW5kcy1kc3QtZWFybHktMjAwOC5odG1sCi0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wMy0xNyk6CiAjIE1vcm9jY28gd2lsbCBvYnNlcnZlIERTVCBmcm9tIDIwMDktMDYtMDEgMDA6MDAgdG8gMjAwOS0wOC0yMSAwMDowMCBhY2NvcmRpbmcKICMgdG8gbWFueSBzb3VyY2VzLCBzdWNoIGFzCi0jIDxhIGhyZWY9Imh0dHA6Ly9uZXdzLm1hcndlYi5jb20vbW9yb2Njby9lbnRlcnRhaW5tZW50L21vcm9jY28tZGF5bGlnaHQtc2F2aW5nLmh0bWwiPgogIyBodHRwOi8vbmV3cy5tYXJ3ZWIuY29tL21vcm9jY28vZW50ZXJ0YWlubWVudC9tb3JvY2NvLWRheWxpZ2h0LXNhdmluZy5odG1sCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tZWRpMXNhdC5tYS9mci9kZXBlY2hlLmFzcHg/aWRwPTIzMTIiPgogIyBodHRwOi8vd3d3Lm1lZGkxc2F0Lm1hL2ZyL2RlcGVjaGUuYXNweD9pZHA9MjMxMgotIyA8L2E+CiAjIChGcmVuY2gpCiAjCiAjIE91ciBzdW1tYXJ5OgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1zdGFydHMtZHN0LTIwMDkuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLXN0YXJ0cy1kc3QtMjAwOS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wMy0xNyk6CiAjIEhlcmUgaXMgYSBsaW5rIHRvIG9mZmljaWFsIGRvY3VtZW50IGZyb20gUm95YXVtZSBkdSBNYXJvYyBQcmVtaWVyIE1pbmlzdHJlLAotIyBNaW5pc3RlcmUgZGUgbGEgTW9kZXJuaXNhdGlvbiBkZXMgU2VjdGV1cnMgUHVibGljcworIyBNaW5pc3TDqHJlIGRlIGxhIE1vZGVybmlzYXRpb24gZGVzIFNlY3RldXJzIFB1YmxpY3MKICMKICMgVW5kZXIgQXJ0aWNsZSAxIG9mIFJveWFsIERlY3JlZSBOby4gNDU1LTY3IG9mIEFjdCAyMyBzYWZhciAxMzg3ICgyIGp1bmUgMTk2NykKICMgY29uY2VybmluZyB0aGUgYW1lbmRtZW50IG9mIHRoZSBsZWdhbCB0aW1lLCB0aGUgTWluaXN0cnkgb2YgTW9kZXJuaXphdGlvbiBvZgogIyBQdWJsaWMgU2VjdG9ycyBhbm5vdW5jZWQgdGhhdCB0aGUgb2ZmaWNpYWwgdGltZSBpbiB0aGUgS2luZ2RvbSB3aWxsIGJlCiAjIGFkdmFuY2VkIDYwIG1pbnV0ZXMgZnJvbSBTdW5kYXkgMzEgTWF5IDIwMDkgYXQgbWlkbmlnaHQuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1zcC5nb3YubWEvZnJhbmNhaXMvQWN0dWFsaXRlc19mci9QREZfQWN0dWFsaXRlc19Gci9IZXVyZUV0ZV9GUi5wZGYiPgogIyBodHRwOi8vd3d3Lm1tc3AuZ292Lm1hL2ZyYW5jYWlzL0FjdHVhbGl0ZXNfZnIvUERGX0FjdHVhbGl0ZXNfRnIvSGV1cmVFdGVfRlIucGRmCi0jIDwvYT4KLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDMuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfbW9yb2NjbzAzLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTA0LTEzKToKICMgU2V2ZXJhbCBuZXdzIG1lZGlhIGluIE1vcm9jY28gcmVwb3J0IHRoYXQgdGhlIE1pbmlzdHJ5IG9mIE1vZGVybml6YXRpb24KQEAgLTgxMyw1MSArNzY4LDMzIEBACiAjIDIwMTAtMDUtMDIgdG8gMjAxMC0wOC0wOC4KICMKICMgRXhhbXBsZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYXZpZWVjby5jb20vYWN0dWFsaXRlcy80MDk5LWxlLW1hcm9jLXBhc3NlcmEtYS1sLWhldXJlLWQtZXRlLWdtdDEtbGUtMi1tYWkuaHRtbCI+CiAjIGh0dHA6Ly93d3cubGF2aWVlY28uY29tL2FjdHVhbGl0ZXMvNDA5OS1sZS1tYXJvYy1wYXNzZXJhLWEtbC1oZXVyZS1kLWV0ZS1nbXQxLWxlLTItbWFpLmh0bWwKLSMgPC9hPgogIyAoRnJlbmNoKQogIyBPdXIgcGFnZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21vcm9jY28tc3RhcnRzLWRzdC0yMDEwLmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1zdGFydHMtZHN0LTIwMTAuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBEYW4gQWJpdG9sICgyMDExLTAzLTMwKToKICMgLi4uUnVsZXMgZm9yIEFmcmljYS9DYXNhYmxhbmNhIGFyZSB0aGUgZm9sbG93aW5nICgyNGggZm9ybWF0KQotIyBUaGUgM3JkIGFwcmlsIDIwMTEgYXQgMDA6MDA6MDAsIFtpdF0gd2lsbCBiZSAzcmQgYXByaWwgMTowMDowMAotIyBUaGUgMzF0aCBqdWx5IDIwMTEgYXQgMDA6NTk6NTksICBbaXRdIHdpbGwgYmUgMzF0aCBKdWx5IDAwOjAwOjAwCisjIFRoZSAzcmQgQXByaWwgMjAxMSBhdCAwMDowMDowMCwgW2l0XSB3aWxsIGJlIDNyZCBBcHJpbCAwMTowMDowMAorIyBUaGUgMzFzdCBKdWx5IDIwMTEgYXQgMDA6NTk6NTksIFtpdF0gd2lsbCBiZSAzMXN0IEp1bHkgMDA6MDA6MDAKICMgLi4uT2ZmaWNpYWwgbGlua3Mgb2YgY2hhbmdlIGluIG1vcm9jY28KICMgVGhlIGNoYW5nZSB3YXMgYnJvYWRjYXN0IG9uIHRoZSBGTSBSYWRpbwogIyBJIHZlIGNhbGxlZCBBTlJUICh0ZWxlY29tIHJlZ3VsYXRpb25zIGluIE1vcm9jY28pIGF0CiAjICsyMTIuNTM3LjcxLjg0LjAwCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5ydC5uZXQubWEvZnIvIj4KICMgaHR0cDovL3d3dy5hbnJ0Lm5ldC5tYS9mci8KLSMgPC9hPgogIyBUaGV5IHNhaWQgdGhhdAotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcC5tYS9mci9zZWN0aW9ucy9hY2N1ZWlsL2xfaGV1cmVfbGVnYWxlX2F1X21hL3ZpZXciPgogIyBodHRwOi8vd3d3Lm1hcC5tYS9mci9zZWN0aW9ucy9hY2N1ZWlsL2xfaGV1cmVfbGVnYWxlX2F1X21hL3ZpZXcKLSMgPC9hPgogIyBpcyB0aGUgb2ZmaWNpYWwgcHVibGljYXRpb24gdG8gbG9vayBhdC4KICMgVGhleSBzYWlkIHRoYXQgdGhlIGRlY2lzaW9uIHdhcyBhbHJlYWR5IHRha2VuLgogIwogIyBNb3JlIGFydGljbGVzIGluIHRoZSBwcmVzcwotIyA8YSBocmVmPSJodHRwOi8vd3d3LnlhYmlsYWRpLmNvbS9hcnRpY2xlcy9kZXRhaWxzLzUwNTgvc2VjcmV0LWwtaGV1cmUtZC1ldGUtbWFyb2MtbGV2Ij4KLSMgaHR0cDovL3d3dy55YWJpbGFkaS5jb20vYXJ0aWNsZXMvZGV0YWlscy81MDU4L3NlY3JldC1sLWhldXJlLWQtZXRlLW1hcm9jLWxldgotIyA8L2E+Ci0jIGUuaHRtbAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxlbWF0aW4ubWEvQWN0dWFsaXRlL0V4cHJlc3MvQXJ0aWNsZS5hc3A/aWQ9MTQ4OTIzIj4KKyMgaHR0cDovL3d3dy55YWJpbGFkaS5jb20vYXJ0aWNsZXMvZGV0YWlscy81MDU4L3NlY3JldC1sLWhldXJlLWQtZXRlLW1hcm9jLWxldmUuaHRtbAogIyBodHRwOi8vd3d3LmxlbWF0aW4ubWEvQWN0dWFsaXRlL0V4cHJlc3MvQXJ0aWNsZS5hc3A/aWQ9MTQ4OTIzCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYXZpZWVjby5jb20vYWN0dWFsaXRlL0xlLU1hcm9jLXBhc3NlLXN1ci1HTVQlMkIxLWEtcGFydGlyLWRlLWRpbSI+CiAjIGh0dHA6Ly93d3cubGF2aWVlY28uY29tL2FjdHVhbGl0ZS9MZS1NYXJvYy1wYXNzZS1zdXItR01UJTJCMS1hLXBhcnRpci1kZS1kaW0KLSMgYW5jaGUtcHJvY2hhaW4tNTUzOC5odG1sCi0jIDwvYT4KIAogIyBGcm9tIFBldHIgTWFjaGF0YSAoMjAxMS0wMy0zMCk6CiAjIFRoZXkgaGF2ZSBpdCB3cml0dGVuIGluIEVuZ2xpc2ggaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tYXAubWEvZW5nL3NlY3Rpb25zL2hvbWUvbW9yb2Njb190b19zcHJpbmdfZm8vdmlldyI+CiAjIGh0dHA6Ly93d3cubWFwLm1hL2VuZy9zZWN0aW9ucy9ob21lL21vcm9jY29fdG9fc3ByaW5nX2ZvL3ZpZXcKLSMgPC9hPgogIwogIyBJdCBzYXlzIHRoZXJlIHRoYXQgIk1vcm9jY28gd2lsbCByZXN1bWUgaXRzIHN0YW5kYXJkIHRpbWUgb24gSnVseSAzMSwKICMgMjAxMSBhdCBtaWRuaWdodC4iIE5vdyB0aGV5IGRvbid0IHNheSB3aGV0aGVyIHRoZXkgbWVhbiBtaWRuaWdodCBvZgpAQCAtODY1LDIwICs4MDIsMTYgQEAKICMgYWxzbyBiZWVuIGxpa2UgdGhhdCBpbiB0aGUgcGFzdC4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMi0wMy0wOSk6Ci0jIEFjY29yZGluZyB0byBJbmZvbSZlYWN1dGU7ZGlhaXJlIHdlYiBzaXRlIGZyb20gTW9yb2NjbyAoaW5mb21lZGlhaXJlLm1hKSwKLSMgb24gTWFyY2ggOSwgMjAxMiwgKGluIEZyZW5jaCkgSGV1cmUgbCZlYWN1dGU7Z2FsZToKLSMgTGUgTWFyb2MgYWRvcHRlIG9mZmljaWVsbGVtZW50IGwnaGV1cmUgZCcmZWFjdXRlO3QmZWFjdXRlOwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9tZWRpYWlyZS5tYS9uZXdzL21hcm9jL2hldXJlLWwlQzMlQTlnYWxlLWxlLW1hcm9jLWFkb3B0ZS1vZmZpY2llbGxlbWVudC1saGV1cmUtZCVDMyVBOXQlQzMlQTkiPgorIyBBY2NvcmRpbmcgdG8gSW5mb23DqWRpYWlyZSB3ZWIgc2l0ZSBmcm9tIE1vcm9jY28gKGluZm9tZWRpYWlyZS5tYSksCisjIG9uIE1hcmNoIDksIDIwMTIsIChpbiBGcmVuY2gpIEhldXJlIGzDqWdhbGU6CisjIExlIE1hcm9jIGFkb3B0ZSBvZmZpY2llbGxlbWVudCBsJ2hldXJlIGQnw6l0w6kKICMgaHR0cDovL3d3dy5pbmZvbWVkaWFpcmUubWEvbmV3cy9tYXJvYy9oZXVyZS1sJUMzJUE5Z2FsZS1sZS1tYXJvYy1hZG9wdGUtb2ZmaWNpZWxsZW1lbnQtbGhldXJlLWQlQzMlQTl0JUMzJUE5Ci0jIDwvYT4KICMgR292ZXJuaW5nIENvdW5jaWwgYWRvcHRlZCBkcmFmdCBkZWNyZWUsIHRoYXQgTW9yb2NjbyBEU1Qgc3RhcnRzIG9uCiAjIHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCAoTWFyY2ggMjUsIDIwMTIpIGFuZCBlbmRzIG9uCiAjIGxhc3QgU3VuZGF5IG9mIFNlcHRlbWJlciAoU2VwdGVtYmVyIDMwLCAyMDEyKQogIyBleGNlcHQgdGhlIG1vbnRoIG9mIFJhbWFkYW4uCiAjIG9yIChicmllZikKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDYuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfbW9yb2NjbzA2Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDEyLTAzLTEwKToKICMgVGhlIGluZm9tZWRpYWlyZS5tYSBzb3VyY2UgaW5kaWNhdGVzIHRoYXQgdGhlIHN5c3RlbSBpcyB0byBiZSBpbgpAQCAtODg5LDE3ICs4MjIsMTMgQEAKIAogIyBGcm9tIENocmlzdG9waGUgVHJvcGFtZXIgKDIwMTItMDMtMTYpOgogIyBTZWVuIE1vcm9jY28gY2hhbmdlIGFnYWluOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxlMnVtaW51dGVzLmNvbS9hY3R1YWxpdGUucGhwIj4KICMgaHR0cDovL3d3dy5sZTJ1bWludXRlcy5jb20vYWN0dWFsaXRlLnBocAotIyA8L2E+Ci0jICIuLi4mYWdyYXZlOyBwYXJ0aXIgZHUgZGVybmllciBkaW1hbmNlIGQnYXZyaWwgZXQgbm9uIGZpbnMgbWFycywKLSMgY29tbWUgYW5ub25jJmVhY3V0ZTsgcHImZWFjdXRlO2MmZWFjdXRlO2RlbW1lbnQuIgorIyAiLi4uw6AgcGFydGlyIGR1IGRlcm5pZXIgZGltYW5jaGUgZCdhdnJpbCBldCBub24gZmlucyBtYXJzLAorIyBjb21tZSBhbm5vbmPDqSBwcsOpY8OpZGVtbWVudC4iCiAKICMgRnJvbSBNaWxhbWJlciBTcGFjZSBOZXR3b3JrICgyMDEyLTA3LTE3KToKICMgVGhlIG9mZmljaWFsIHJldHVybiB0byBHTVQgaXMgYW5ub3VuY2VkIGJ5IHRoZSBNb3JvY2NhbiBnb3Zlcm5tZW50OgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1tc3AuZ292Lm1hL2ZyL2FjdHVhbGl0ZXMuYXNweD9pZD0yODgiPgogIyBodHRwOi8vd3d3Lm1tc3AuZ292Lm1hL2ZyL2FjdHVhbGl0ZXMuYXNweD9pZD0yODggW2luIEZyZW5jaF0KLSMgPC9hPgogIwogIyBHb29nbGUgdHJhbnNsYXRpb24sIGxpZ2h0bHkgZWRpdGVkOgogIyBCYWNrIHRvIHRoZSBzdGFuZGFyZCB0aW1lIG9mIHRoZSBLaW5nZG9tIChHTVQpCkBAIC05MTcsNyArODQ2LDcgQEAKICMgYW5ub3VuY2VkIGEgYml0IGluIGFkdmFuY2UuICBPbiAyMDEyLTA3LTExIHRoZSBNb3JvY2NhbiBnb3Zlcm5tZW50CiAjIGFubm91bmNlZCB0aGF0IHllYXIncyBSYW1hZGFuIGRheWxpZ2h0LXNhdmluZyB0cmFuc2l0aW9ucyB3b3VsZCBiZQogIyAyMDEyLTA3LTIwIGFuZCAyMDEyLTA4LTIwOyBzZWUKLSMgPGh0dHA6Ly93d3cubW1zcC5nb3YubWEvZnIvYWN0dWFsaXRlcy5hc3B4P2lkPTI4OD4uCisjIGh0dHA6Ly93d3cubW1zcC5nb3YubWEvZnIvYWN0dWFsaXRlcy5hc3B4P2lkPTI4OAogCiAjIEZyb20gQW5kcmV3IFBhcHJvY2tpICgyMDEzLTA3LTAyKToKICMgTW9yb2NjbyBhbm5vdW5jZWQgdGhhdCB0aGUgeWVhcidzIFJhbWFkYW4gZGF5bGlnaHQtc2F2aW5ncwpAQCAtOTM3LDM5ICs4NjYsMzYgQEAKICMgRnJvbSBTZWJhc3RpZW4gV2lsbGVtaWpucyAoMjAxNC0wMy0xOCk6CiAjIGh0dHA6Ly93d3cuYWZyaXF1aW5mb3MuY29tL2FydGljbGVzLzIwMTQvMy8xOC9tYXJvYy1oZXVyZS1kZXRlLWF2YW5jZXotdG91cy1ob3Jsb2dlcy0yNDc4OTEuYXNwCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wMy0xOSk6Ci0jIFRvIGVzdGltYXRlIHdoYXQgdGhlIE1vcm9jY2FuIGdvdmVybm1lbnQgd2lsbCBkbyBpbiBmdXR1cmUgeWVhcnMsCi0jIHRyYW5zaXRpb24gZGF0ZXMgZm9yIDIwMTQgdGhyb3VnaCAyMDM4IHdlcmUgZGV0ZXJtaW5lZCBieSBydW5uaW5nCi0jIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSB1bmRlciBHTlUgRW1hY3MgMjQuMzoKLSMKLSMgKGxldCAoKGlzbGFtaWMteWVhciAxNDM1KSkKLSMgICAod2hpbGUgKDwgaXNsYW1pYy15ZWFyIDE0NjEpCi0jICAgICAobGV0ICgoYQotIwkgICAgIChjYWxlbmRhci1ncmVnb3JpYW4tZnJvbS1hYnNvbHV0ZQotIwkgICAgICAoY2FsZW5kYXItaXNsYW1pYy10by1hYnNvbHV0ZSAobGlzdCA5IDEgaXNsYW1pYy15ZWFyKSkpKQotIwkgICAgKGIKLSMJICAgICAoY2FsZW5kYXItZ3JlZ29yaWFuLWZyb20tYWJzb2x1dGUKLSMJICAgICAgKGNhbGVuZGFyLWlzbGFtaWMtdG8tYWJzb2x1dGUgKGxpc3QgMTAgMSBpc2xhbWljLXllYXIpKSkpKQotIwkoaW5zZXJ0Ci0jCSAoZm9ybWF0Ci0jCSAgKGNvbmNhdCAiUnVsZVx0TW9yb2Njb1x0JWRcdG9ubHlcdC1cdCVzXHQgJTJkXHQgMzowMFx0MFx0LVxuIgotIwkJICAiUnVsZVx0TW9yb2Njb1x0JWRcdG9ubHlcdC1cdCVzXHQgJTJkXHQgMjowMFx0MTowMFx0U1xuIikKLSMJICAoY2FyIChjZHIgKGNkciBhKSkpIChjYWxlbmRhci1tb250aC1uYW1lIChjYXIgYSkgdCkgKGNhciAoY2RyIGEpKQotIwkgIChjYXIgKGNkciAoY2RyIGIpKSkgKGNhbGVuZGFyLW1vbnRoLW5hbWUgKGNhciBiKSB0KSAoY2FyIChjZHIgYikpKSkpCisjIEZyb20gTWlsYW1iZXIgU3BhY2UgTmV0d29yayAoMjAxNC0wNi0wNSk6CisjIFRoZSBNb3JvY2NhbiBnb3Zlcm5tZW50IGhhcyByZWNlbnRseSBhbm5vdW5jZWQgdGhhdCB0aGUgY291bnRyeSB3aWxsIHJldHVybgorIyB0byBzdGFuZGFyZCB0aW1lIGF0IDAzOjAwIG9uIFNhdHVyZGF5LCBKdW5lIDI4LCAyMDE0IGxvY2FsIHRpbWUuLi4uICBEU1QKKyMgd2lsbCByZXN1bWUgYWdhaW4gYXQgMDI6MDAgb24gU2F0dXJkYXksIEF1Z3VzdCAyLCAyMDE0Li4uLgorIyBodHRwOi8vd3d3Lm1tc3AuZ292Lm1hL2ZyL2FjdHVhbGl0ZXMuYXNweD9pZD01ODYKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTA1KToKKyMgRm9yIG5vdywgZ3Vlc3MgdGhhdCBsYXRlciBzcHJpbmcgYW5kIGZhbGwgdHJhbnNpdGlvbnMgd2lsbCB1c2UgMjAxNCdzIHJ1bGVzLAorIyBhbmQgZ3Vlc3MgdGhhdCBNb3JvY2NvIHdpbGwgc3dpdGNoIHRvIHN0YW5kYXJkIHRpbWUgYXQgMDM6MDAgdGhlIGxhc3QKKyMgU2F0dXJkYXkgYmVmb3JlIFJhbWFkYW4sIGFuZCBiYWNrIHRvIERTVCBhdCAwMjowMCB0aGUgZmlyc3QgU2F0dXJkYXkgYWZ0ZXIKKyMgUmFtYWRhbi4gIFRvIGltcGxlbWVudCB0aGlzLCB0cmFuc2l0aW9uIGRhdGVzIGZvciAyMDE1IHRocm91Z2ggMjAzNyB3ZXJlCisjIGRldGVybWluZWQgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIHByb2dyYW0gdW5kZXIgR05VIEVtYWNzIDI0LjMsIHdpdGggdGhlCisjIHJlc3VsdHMgaW50ZWdyYXRlZCBieSBoYW5kIGludG8gdGhlIHRhYmxlIGJlbG93LgorIyAobGV0ICgoaXNsYW1pYy15ZWFyIDE0MzYpKQorIyAgICh3aGlsZSAoPCBpc2xhbWljLXllYXIgMTQ2MCkKKyMgICAgIChsZXQgKChhIChjYWxlbmRhci1pc2xhbWljLXRvLWFic29sdXRlIChsaXN0IDkgMSBpc2xhbWljLXllYXIpKSkKKyMgICAgICAgICAgIChiIChjYWxlbmRhci1pc2xhbWljLXRvLWFic29sdXRlIChsaXN0IDEwIDEgaXNsYW1pYy15ZWFyKSkpCisjICAgICAgICAgICAoc2F0dXJkYXkgNikpCisjICAgICAgICh3aGlsZSAoLz0gc2F0dXJkYXkgKG1vZCAoc2V0cSBhICgxLSBhKSkgNykpKQorIyAgICAgICAod2hpbGUgKC89IHNhdHVyZGF5IChtb2QgYiA3KSkKKyMgICAgICAgICAoc2V0cSBiICgxKyBiKSkpCisjICAgICAgIChzZXRxIGEgKGNhbGVuZGFyLWdyZWdvcmlhbi1mcm9tLWFic29sdXRlIGEpKQorIyAgICAgICAoc2V0cSBiIChjYWxlbmRhci1ncmVnb3JpYW4tZnJvbS1hYnNvbHV0ZSBiKSkKKyMgICAgICAgKGluc2VydAorIyAgICAgICAgKGZvcm1hdAorIyAgICAgICAgIChjb25jYXQgIlJ1bGVcdE1vcm9jY29cdCVkXHRvbmx5XHQtXHQlc1x0JTJkXHQgMzowMFx0MFx0LVxuIgorIyAgICAgICAgICAgICAgICAgIlJ1bGVcdE1vcm9jY29cdCVkXHRvbmx5XHQtXHQlc1x0JTJkXHQgMjowMFx0MTowMFx0U1xuIikKKyMgICAgICAgICAoY2FyIChjZHIgKGNkciBhKSkpIChjYWxlbmRhci1tb250aC1uYW1lIChjYXIgYSkgdCkgKGNhciAoY2RyIGEpKQorIyAgICAgICAgIChjYXIgKGNkciAoY2RyIGIpKSkgKGNhbGVuZGFyLW1vbnRoLW5hbWUgKGNhciBiKSB0KSAoY2FyIChjZHIgYikpKSkpCiAjICAgICAoc2V0cSBpc2xhbWljLXllYXIgKCsgMSBpc2xhbWljLXllYXIpKSkpCi0jCi0jIHdpdGggc3ByaW5nLWZvcndhcmQgdHJhbnNpdGlvbnMgcmVtb3ZlZCBmb3IgMjAyMy0yMDI1LCB3aGVuIHRoZQotIyBub3JtYWwgc3ByaW5nLWZvcndhcmQgZGF0ZSBmYWxscyBkdXJpbmcgdGhlIGVzdGltYXRlZCBSYW1hZGFuOyB3aXRoCi0jIGFsbCB0cmFuc2l0aW9ucyByZW1vdmVkIGZvciAyMDI2LTIwMzUsIHdoZXJlIHRoZSBlc3RpbWF0ZWQgUmFtYWRhbgotIyBmYWxscyBlbnRpcmVseSBvdXRzaWRlIGRheWxpZ2h0LXNhdmluZyB0aW1lOyBhbmQgd2l0aCBmYWxsLWJhY2sKLSMgdHJhbnNpdGlvbnMgcmVtb3ZlZCBmb3IgMjAzNi0yMDM3LCB3aGVyZSB0aGUgbm9ybWFsIGZhbGwtYmFjawotIyBkYXRlIGZhbGxzIGR1cmluZyB0aGUgZXN0aW1hdGVkIFJhbWFkYW4uICBOb3JtYWxseSwgdGhlIHRhYmxlIHdvdWxkCi0jIHN0b3AgYWZ0ZXIgMjAzNyBiZWNhdXNlIDMyLWJpdCB0aW1lX3QgdmFsdWVzIHJvbGwgYXJvdW5kIGVhcmx5IGluIDIwMzgsCi0jIGJ1dCB0aGF0IHdvdWxkIGltcGx5IGEgcHJlZGljdGlvbiBvZiBwZXJwZXR1YWwgRFNUIGFmdGVyIE1hcmNoIDIwMzgKLSMgZHVlIHRvIHRoZSB5ZWFyLTIwMzcgZ2xpdGNoZXMuICBTbywgdGhpcyB0YWJsZSBpbnN0ZWFkIHN0b3BzIGFmdGVyCi0jIDIwMzgsIHRoZSBmaXJzdCBub24tZ2xpdGNoeSB5ZWFyIGFmdGVyIHRoZSAzMi1iaXQgcm9sbG92ZXIuCi0jIEFuIGFkdmFudGFnZSBvZiBzdG9wcGluZyBhZnRlciAyMDM4IGlzIHRoYXQgaXQgbGV0cyB6aWMgZ3Vlc3MKLSMgVFo9J1dFVDBXRVNULE0zLjUuMCxNMTAuNS4wLzMnIGZvciB0aW1lIHN0YW1wcyBmYXIgaW4gdGhlIGZ1dHVyZS4KIAogIyBSVUxFCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIApAQCAtOTkxLDQ2ICs5MTcsNDQgQEAKIFJ1bGUJTW9yb2NjbwkyMDA4CW9ubHkJLQlKdW4JIDEJIDA6MDAJMTowMAlTCiBSdWxlCU1vcm9jY28JMjAwOAlvbmx5CS0JU2VwCSAxCSAwOjAwCTAJLQogUnVsZQlNb3JvY2NvCTIwMDkJb25seQktCUp1bgkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDA5CW9ubHkJLQlBdWcJIDIxCSAwOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMDkJb25seQktCUF1ZwkyMQkgMDowMAkwCS0KIFJ1bGUJTW9yb2NjbwkyMDEwCW9ubHkJLQlNYXkJIDIJIDA6MDAJMTowMAlTCiBSdWxlCU1vcm9jY28JMjAxMAlvbmx5CS0JQXVnCSA4CSAwOjAwCTAJLQogUnVsZQlNb3JvY2NvCTIwMTEJb25seQktCUFwcgkgMwkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDExCW9ubHkJLQlKdWwJIDMxCSAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMTIJMjAxMwktCUFwcgkgbGFzdFN1biAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTIJb25seQktCVNlcAkgMzAJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAxMglvbmx5CS0JSnVsCSAyMAkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDEyCW9ubHkJLQlBdWcJIDIwCSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTMJb25seQktCUp1bAkgIDcJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAxMwlvbmx5CS0JQXVnCSAxMAkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDEzCTIwMzUJLQlPY3QJIGxhc3RTdW4gMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDE0CTIwMjIJLQlNYXIJIGxhc3RTdW4gMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDE0CW9ubHkJLQlKdW4JIDI5CSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMTQJb25seQktCUp1bAkgMjkJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAxNQlvbmx5CS0JSnVuCSAxOAkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDE1CW9ubHkJLQlKdWwJIDE4CSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTYJb25seQktCUp1bgkgIDcJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAxNglvbmx5CS0JSnVsCSAgNwkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDE3CW9ubHkJLQlNYXkJIDI3CSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMTcJb25seQktCUp1bgkgMjYJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAxOAlvbmx5CS0JTWF5CSAxNgkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDE4CW9ubHkJLQlKdW4JIDE1CSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTkJb25seQktCU1heQkgIDYJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAxOQlvbmx5CS0JSnVuCSAgNQkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDIwCW9ubHkJLQlBcHIJIDI0CSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMjAJb25seQktCU1heQkgMjQJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAyMQlvbmx5CS0JQXByCSAxMwkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDIxCW9ubHkJLQlNYXkJIDEzCSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMjIJb25seQktCUFwcgkgIDMJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAyMglvbmx5CS0JTWF5CSAgMwkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDIzCW9ubHkJLQlBcHIJIDIyCSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMjQJb25seQktCUFwcgkgMTAJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAyNQlvbmx5CS0JTWFyCSAzMQkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDI2CW1heAktCU1hcgkgbGFzdFN1biAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMzYJb25seQktCU9jdAkgMjEJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAzNwlvbmx5CS0JT2N0CSAxMQkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDM4CW9ubHkJLQlTZXAJIDMwCSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMzgJb25seQktCU9jdAkgMzAJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAzOAltYXgJLQlPY3QJIGxhc3RTdW4gMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDExCW9ubHkJLQlKdWwJMzEJIDAJMAktCitSdWxlCU1vcm9jY28JMjAxMgkyMDEzCS0JQXByCWxhc3RTdW4JIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAxMglvbmx5CS0JU2VwCTMwCSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTIJb25seQktCUp1bAkyMAkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDEyCW9ubHkJLQlBdWcJMjAJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAxMwlvbmx5CS0JSnVsCSA3CSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTMJb25seQktCUF1ZwkxMAkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDEzCW1heAktCU9jdAlsYXN0U3VuCSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTQJMjAyMgktCU1hcglsYXN0U3VuCSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMTQJb25seQktCUp1bgkyOAkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDE0CW9ubHkJLQlBdWcJIDIJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAxNQlvbmx5CS0JSnVuCTEzCSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTUJb25seQktCUp1bAkxOAkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDE2CW9ubHkJLQlKdW4JIDQJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAxNglvbmx5CS0JSnVsCSA5CSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMTcJb25seQktCU1heQkyMAkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDE3CW9ubHkJLQlKdWwJIDEJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAxOAlvbmx5CS0JTWF5CTEyCSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTgJb25seQktCUp1bgkxNgkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDE5CW9ubHkJLQlNYXkJIDQJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAxOQlvbmx5CS0JSnVuCSA4CSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMjAJb25seQktCUFwcgkxOAkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDIwCW9ubHkJLQlNYXkJMzAJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAyMQlvbmx5CS0JQXByCTEwCSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMjEJb25seQktCU1heQkxNQkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDIyCW9ubHkJLQlBcHIJIDIJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAyMglvbmx5CS0JTWF5CSA3CSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMjMJb25seQktCUFwcgkyMgkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDI0CW9ubHkJLQlBcHIJMTMJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAyNQlvbmx5CS0JQXByCSA1CSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMjYJbWF4CS0JTWFyCWxhc3RTdW4JIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAzNQlvbmx5CS0JT2N0CTI3CSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMzYJb25seQktCU9jdAkxOAkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDM3CW9ubHkJLQlPY3QJMTAJIDM6MDAJMAktCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQWZyaWNhL0Nhc2FibGFuY2EJLTA6MzA6MjAgLQlMTVQJMTkxMyBPY3QgMjYKQEAgLTEwNDksMTEgKzk3MywxNyBAQAogIyBBc3N1bWUgdGhhdCB0aGlzIGhhcyBiZWVuIHRydWUgc2luY2UgV2VzdGVybiBTYWhhcmEgc3dpdGNoZWQgdG8gR01ULAogIyBzaW5jZSBtb3N0IG9mIGl0IHdhcyB0aGVuIGNvbnRyb2xsZWQgYnkgTW9yb2Njby4KIAotWm9uZSBBZnJpY2EvRWxfQWFpdW4JLTA6NTI6NDggLQlMTVQJMTkzNCBKYW4KK1pvbmUgQWZyaWNhL0VsX0FhaXVuCS0wOjUyOjQ4IC0JTE1UCTE5MzQgSmFuICMgRWwgQWFpw7puCiAJCQktMTowMAktCVdBVAkxOTc2IEFwciAxNAogCQkJIDA6MDAJTW9yb2NjbwlXRSVzVAogCiAjIE1vemFtYmlxdWUKKyMKKyMgU2hhbmtzIGdpdmVzIDE5MDMtMDMtMDEgZm9yIHRoZSB0cmFuc2l0aW9uIHRvIENBVC4KKyMgUGVyaGFwcyB0aGUgMTkxMS0wNS0yNiBQb3J0dWd1ZXNlIGRlY3JlZQorIyBodHRwOi8vZHJlLnB0L3BkZjFzZGlwLzE5MTEvMDUvMTI1MDAvMjMxMzIzMTMucGRmCisjIG1lcmVseSBtYWRlIGl0IG9mZmljaWFsPworIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBZnJpY2EvTWFwdXRvCTI6MTA6MjAgLQlMTVQJMTkwMyBNYXIKIAkJCTI6MDAJLQlDQVQKQEAgLTEwNjIsOCArOTkyLDggQEAKICMgVGhlIDE5OTQtMDQtMDMgdHJhbnNpdGlvbiBpcyBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KICMgU2hhbmtzICYgUG90dGVuZ2VyIHJlcG9ydCBubyBEU1QgYWZ0ZXIgMTk5OC0wNDsgZ28gd2l0aCBJQVRBLgogCi0jIEZyb20gUGV0cm9uZWxsYSBTaWJlZW5lICgyMDA3LTAzLTMwKSBpbgotIyA8aHR0cDovL2FsbGFmcmljYS5jb20vc3Rvcmllcy8yMDA3MDMzMDAxNzguaHRtbD46CisjIEZyb20gUGV0cm9uZWxsYSBTaWJlZW5lICgyMDA3LTAzLTMwKToKKyMgaHR0cDovL2FsbGFmcmljYS5jb20vc3Rvcmllcy8yMDA3MDMzMDAxNzguaHRtbAogIyBXaGlsZSB0aGUgZW50aXJlIGNvdW50cnkgY2hhbmdlcyBpdHMgdGltZSwgS2F0aW1hIE11bGlsbyBhbmQgb3RoZXIKICMgc2V0dGxlbWVudHMgaW4gQ2Fwcml2aSB1bm9mZmljaWFsbHkgd2lsbCBub3QgYmVjYXVzZSB0aGUgc3VuIHRoZXJlCiAjIHJpc2VzIGFuZCBzZXRzIGVhcmxpZXIgY29tcGFyZWQgdG8gb3RoZXIgcmVnaW9ucy4gIENoaWVmIG9mCkBAIC0xMDgwLDM0ICsxMDEwLDQxIEBACiBSdWxlCU5hbWliaWEJMTk5NQltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFmcmljYS9XaW5kaG9lawkxOjA4OjI0IC0JTE1UCTE4OTIgRmViIDgKLQkJCTE6MzAJLQlTV0FUCTE5MDMgTWFyCSMgU1cgQWZyaWNhIFRpbWUKLQkJCTI6MDAJLQlTQVNUCTE5NDIgU2VwIDIwIDI6MDAKLQkJCTI6MDAJMTowMAlTQVNUCTE5NDMgTWFyIDIxIDI6MDAKKwkJCTE6MzAJLQlTV0FUCTE5MDMgTWFyICAgICMgU1cgQWZyaWNhIFRpbWUKKwkJCTI6MDAJLQlTQVNUCTE5NDIgU2VwIDIwICAyOjAwCisJCQkyOjAwCTE6MDAJU0FTVAkxOTQzIE1hciAyMSAgMjowMAogCQkJMjowMAktCVNBU1QJMTk5MCBNYXIgMjEgIyBpbmRlcGVuZGVuY2UKIAkJCTI6MDAJLQlDQVQJMTk5NCBBcHIgIDMKIAkJCTE6MDAJTmFtaWJpYQlXQSVzVAogCiAjIE5pZ2VyCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9OaWFtZXkJIDA6MDg6MjggLQlMTVQJMTkxMgotCQkJLTE6MDAJLQlXQVQJMTkzNCBGZWIgMjYKLQkJCSAwOjAwCS0JR01UCTE5NjAKLQkJCSAxOjAwCS0JV0FUCisjIFNlZSBBZnJpY2EvTGFnb3MuCiAKICMgTmlnZXJpYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBZnJpY2EvTGFnb3MJMDoxMzozNiAtCUxNVAkxOTE5IFNlcAogCQkJMTowMAktCVdBVAorTGluayBBZnJpY2EvTGFnb3MgQWZyaWNhL0Jhbmd1aQkgICAgICMgQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljCitMaW5rIEFmcmljYS9MYWdvcyBBZnJpY2EvQnJhenphdmlsbGUgIyBSZXAuIG9mIHRoZSBDb25nbworTGluayBBZnJpY2EvTGFnb3MgQWZyaWNhL0RvdWFsYQkgICAgICMgQ2FtZXJvb24KK0xpbmsgQWZyaWNhL0xhZ29zIEFmcmljYS9LaW5zaGFzYSAgICAjIERlbS4gUmVwLiBvZiB0aGUgQ29uZ28gKHdlc3QpCitMaW5rIEFmcmljYS9MYWdvcyBBZnJpY2EvTGlicmV2aWxsZSAgIyBHYWJvbgorTGluayBBZnJpY2EvTGFnb3MgQWZyaWNhL0x1YW5kYQkgICAgICMgQW5nb2xhCitMaW5rIEFmcmljYS9MYWdvcyBBZnJpY2EvTWFsYWJvCSAgICAgIyBFcXVhdG9yaWFsIEd1aW5lYQorTGluayBBZnJpY2EvTGFnb3MgQWZyaWNhL05pYW1leQkgICAgICMgTmlnZXIKK0xpbmsgQWZyaWNhL0xhZ29zIEFmcmljYS9Qb3J0by1Ob3ZvICAjIEJlbmluCiAKLSMgUmV1bmlvbgorIyBSw6l1bmlvbgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlJbmRpYW4vUmV1bmlvbgkzOjQxOjUyIC0JTE1UCTE5MTEgSnVuCSMgU2FpbnQtRGVuaXMKLQkJCTQ6MDAJLQlSRVQJIyBSZXVuaW9uIFRpbWUKK1pvbmUJSW5kaWFuL1JldW5pb24JMzo0MTo1MiAtCUxNVAkxOTExIEp1biAjIFNhaW50LURlbmlzCisJCQk0OjAwCS0JUkVUCSMgUsOpdW5pb24gVGltZQogIwotIyBTY2F0dGVyZWQgSXNsYW5kcyAoSWxlcyBFcGFyc2VzKSBhZG1pbmlzdGVyZWQgZnJvbSBSZXVuaW9uIGFyZSBhcyBmb2xsb3dzLgorIyBDcm96ZXQgSXNsYW5kcyBhbHNvIG9ic2VydmVzIFLDqXVuaW9uIHRpbWU7IHNlZSB0aGUgJ2FudGFyY3RpY2EnIGZpbGUuCisjCisjIFNjYXR0ZXJlZCBJc2xhbmRzICjDjmxlcyDDiXBhcnNlcykgYWRtaW5pc3RlcmVkIGZyb20gUsOpdW5pb24gYXJlIGFzIGZvbGxvd3MuCiAjIFRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlbSBpcyB0YWtlbiBmcm9tCi0jIElsZXMgRXBhcnNlcyAod3d3Lm91dHJlLW1lci5nb3V2LmZyL2RvbXRvbS9pbGUuaHRtLCAxOTk3LTA3LTIyLCBpbiBGcmVuY2g7Ci0jIG5vIGxvbmdlciBhdmFpbGFibGUgYXMgb2YgMTk5OS0wOC0xNykuCisjIMOObGVzIMOJcGFyc2VzICg8aHR0cDovL3d3dy5vdXRyZS1tZXIuZ291di5mci9kb210b20vaWxlLmh0bT4sIDE5OTctMDctMjIsCisjIGluIEZyZW5jaDsgbm8gbG9uZ2VyIGF2YWlsYWJsZSBhcyBvZiAxOTk5LTA4LTE3KS4KICMgV2UgaGF2ZSBubyBpbmZvIGFib3V0IHRoZWlyIHRpbWUgem9uZSBoaXN0b3JpZXMuCiAjCiAjIEJhc3NhcyBkYSBJbmRpYSAtIHVuaW5oYWJpdGVkCkBAIC0xMTIyLDMyICsxMDU5LDIxIEBACiAJCQkyOjAwCS0JQ0FUCiAKICMgU3QgSGVsZW5hCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF0bGFudGljL1N0X0hlbGVuYQktMDoyMjo0OCAtCUxNVAkxODkwCQkjIEphbWVzdG93bgotCQkJLTA6MjI6NDggLQlKTVQJMTk1MQkjIEphbWVzdG93biBNZWFuIFRpbWUKLQkJCSAwOjAwCS0JR01UCisjIFNlZSBBZnJpY2EvQWJpZGphbi4KICMgVGhlIG90aGVyIHBhcnRzIG9mIHRoZSBTdCBIZWxlbmEgdGVycml0b3J5IGFyZSBzaW1pbGFyOgogIwlUcmlzdGFuIGRhIEN1bmhhOiBvbiBHTVQsIHNheSBXaGl0bWFuIGFuZCB0aGUgQ0lBCi0jCUFzY2Vuc2lvbjogb24gR01ULCBzYXlzIHVzbm8xOTk1IGFuZCB0aGUgQ0lBCisjCUFzY2Vuc2lvbjogb24gR01ULCBzYXkgdGhlIFVTTk8gKDE5OTUtMTItMjEpIGFuZCB0aGUgQ0lBCiAjCUdvdWdoIChzY2llbnRpZmljIHN0YXRpb24gc2luY2UgMTk1NTsgc2VhbGVycyB3aW50ZXJlZCBwcmV2aW91c2x5KToKICMJCW9uIEdNVCwgc2F5cyB0aGUgQ0lBCi0jCUluYWNjZXNzaWJsZSwgTmlnaHRpbmdhbGU6IG5vIGluZm9ybWF0aW9uLCBidXQgcHJvYmFibHkgR01UCisjCUluYWNjZXNzaWJsZSwgTmlnaHRpbmdhbGU6IHVuaW5oYWJpdGVkCiAKLSMgU2FvIFRvbWUgYW5kIFByaW5jaXBlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9TYW9fVG9tZQkgMDoyNjo1NiAtCUxNVAkxODg0Ci0JCQktMDozNjozMiAtCUxNVAkxOTEyCSMgTGlzYm9uIE1lYW4gVGltZQotCQkJIDA6MDAJLQlHTVQKLQorIyBTw6NvIFRvbcOpIGFuZCBQcsOtbmNpcGUKICMgU2VuZWdhbAotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvRGFrYXIJLTE6MDk6NDQgLQlMTVQJMTkxMgotCQkJLTE6MDAJLQlXQVQJMTk0MSBKdW4KLQkJCSAwOjAwCS0JR01UCisjIFNlZSBBZnJpY2EvQWJpZGphbi4KIAogIyBTZXljaGVsbGVzCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9NYWhlCTM6NDE6NDggLQlMTVQJMTkwNiBKdW4JIyBWaWN0b3JpYQorWm9uZQlJbmRpYW4vTWFoZQkzOjQxOjQ4IC0JTE1UCTE5MDYgSnVuICMgVmljdG9yaWEKIAkJCTQ6MDAJLQlTQ1QJIyBTZXljaGVsbGVzIFRpbWUKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNS0zMCk6CiAjIEFsZGFicmEsIEZhcnF1aGFyLCBhbmQgRGVzcm9jaGVzLCBvcmlnaW5hbGx5IGRlcGVuZGVuY2llcyBvZiB0aGUKQEAgLTExNTcsMTcgKzEwODMsNyBAQAogIyBQb3NzaWJseSB0aGUgaXNsYW5kcyB3ZXJlIHVuaW5oYWJpdGVkLgogCiAjIFNpZXJyYSBMZW9uZQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgV2hpdG1hbiBnaXZlcyBNYXIgMzEgLSBBdWcgMzEgZm9yIDE5MzEgb247IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTTAkxOTM1CTE5NDIJLQlKdW4JIDEJMDowMAkwOjQwCVNMU1QKLVJ1bGUJU0wJMTkzNQkxOTQyCS0JT2N0CSAxCTA6MDAJMAlXQVQKLVJ1bGUJU0wJMTk1NwkxOTYyCS0JSnVuCSAxCTA6MDAJMTowMAlTTFNUCi1SdWxlCVNMCTE5NTcJMTk2MgktCVNlcAkgMQkwOjAwCTAJR01UCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9GcmVldG93bgktMDo1MzowMCAtCUxNVAkxODgyCi0JCQktMDo1MzowMCAtCUZNVAkxOTEzIEp1biAjIEZyZWV0b3duIE1lYW4gVGltZQotCQkJLTE6MDAJU0wJJXMJMTk1NwotCQkJIDA6MDAJU0wJJXMKKyMgU2VlIEFmcmljYS9BYmlkamFuLgogCiAjIFNvbWFsaWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KQEAgLTExOTAsOSArMTEwNiw5IEBACiAKICMgU3VkYW4KICMKLSMgRnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LnN1bmFuZXdzLm5ldC9zbjEzamFuZS5odG1sIj4KLSMgU3VkYW4gTmV3cyBBZ2VuY3kgKDIwMDAtMDEtMTMpCi0jIDwvYT4sIGFsc28gcmVwb3J0ZWQgYnkgTWljaGFlbCBEZSBCZXVrZWxhZXItRG9zc2NoZSB2aWEgU3RlZmZlbiBUaG9yc2VuOgorIyBGcm9tIDxodHRwOi8vd3d3LnN1bmFuZXdzLm5ldC9zbjEzamFuZS5odG1sPgorIyBTdWRhbiBOZXdzIEFnZW5jeSAoMjAwMC0wMS0xMyksCisjIGFsc28gcmVwb3J0ZWQgYnkgTWljaGHDq2wgRGUgQmV1a2VsYWVyLURvc3NjaGUgdmlhIFN0ZWZmZW4gVGhvcnNlbjoKICMgQ2xvY2tzIHdpbGwgYmUgbW92ZWQgYWhlYWQgZm9yIDYwIG1pbnV0ZXMgYWxsIG92ZXIgdGhlIFN1ZGFuIGFzIG9mIG5vb24KICMgU2F0dXJkYXkuLi4uICBUaGlzIHdhcyBhbm5vdW5jZWQgVGh1cnNkYXkgYnkgQ2FyZXRha2VyIFN0YXRlIE1pbmlzdGVyIGZvcgogIyBNYW5wb3dlciBBYmR1bC1SYWhtYW4gTnVyLUVkZGluLgpAQCAtMTIyMywxNCArMTEzOSwxMiBAQAogCQkJMzowMAktCUVBVAogCiAjIFRvZ28KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0xvbWUJMDowNDo1MiAtCUxNVAkxODkzCi0JCQkwOjAwCS0JR01UCisjIFNlZSBBZnJpY2EvQWJpZGphbi4KIAogIyBUdW5pc2lhCiAKICMgRnJvbSBHd2lsbGltIExhdyAoMjAwNS0wNC0zMCk6Ci0jIE15IGNvcnJlc3BvbmRlbnQsIFJpc3RvIE55a2FuZW4sIGhhcyBhbGVydGVkIG1lIHRvIGFub3RoZXIgYWRvcHRpb24gb2YgRFNULAorIyBNeSBjb3JyZXNwb25kZW50LCBSaXN0byBOeWvDpG5lbiwgaGFzIGFsZXJ0ZWQgbWUgdG8gYW5vdGhlciBhZG9wdGlvbiBvZiBEU1QsCiAjIHRoaXMgdGltZSBpbiBUdW5pc2lhLiAgQWNjb3JkaW5nIHRvIFlhaG9vIEZyYW5jZSBOZXdzCiAjIDxodHRwOi8vZnIubmV3cy55YWhvby5jb20vMDUwNDI2LzUvNGR1bWsuaHRtbD4sIGluIGEgc3RvcnkgYXR0cmlidXRlZCB0byBBUAogIyBhbmQgZGF0ZWQgMjAwNS0wNC0yNiwgIlR1bmlzaWEgaGFzIGRlY2lkZWQgdG8gYWR2YW5jZSBpdHMgb2ZmaWNpYWwgdGltZSBieQpAQCAtMTIzOSw4ICsxMTUzLDggQEAKICMgU2F0dXJkYXkuIiAgKE15IHRyYW5zbGF0aW9uKQogIwogIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA1LTA1LTAyKToKLSMgTGFQcmVzc2UsIHRoZSBmaXJzdCBuYXRpb25hbCBkYWlseSBuZXdzcGFwZXIgLi4uCi0jIDxodHRwOi8vd3d3LmxhcHJlc3NlLnRuL2FyY2hpdmVzL2FyY2hpdmVzMjgwNDA1L2FjdHVhbGl0ZXMvbGhldXJlLmh0bWw+CisjIExhIFByZXNzZSwgdGhlIGZpcnN0IG5hdGlvbmFsIGRhaWx5IG5ld3NwYXBlciAuLi4KKyMgaHR0cDovL3d3dy5sYXByZXNzZS50bi9hcmNoaXZlcy9hcmNoaXZlczI4MDQwNS9hY3R1YWxpdGVzL2xoZXVyZS5odG1sCiAjIC4uLiBEU1QgZm9yIDIwMDU6IG9uOiBTdW4gTWF5IDEgMGggc3RhbmRhcmQgdGltZSwgb2ZmOiBGcmkgU2VwdC4gMzAsCiAjIDFoIHN0YW5kYXJkIHRpbWUuCiAjCkBAIC0xMjUzLDE4ICsxMTY3LDEyIEBACiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTE2KToKICMgQWNjb3JkaW5nIHRvIHNldmVyYWwgbmV3cyBzb3VyY2VzLCBUdW5pc2lhIHdpbGwgbm90IG9ic2VydmUgRFNUIHRoaXMgeWVhci4KICMgKEFyYWJpYykKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5lbGJhc2hheWVyLmNvbS8/cGFnZT12aWV3biZuaWQ9NDI1NDYiPgogIyBodHRwOi8vd3d3LmVsYmFzaGF5ZXIuY29tLz9wYWdlPXZpZXduJm5pZD00MjU0NgotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmFibmV0Lm5ldC9raXdpZGV0YWlsLTE1Mjk1LmFzcCI+CiAjIGh0dHA6Ly93d3cuYmFibmV0Lm5ldC9raXdpZGV0YWlsLTE1Mjk1LmFzcAotIyA8L2E+CiAjCiAjIFdlIGhhdmUgYWxzbyBjb25maXJtZWQgdGhpcyB3aXRoIHRoZSBVUyBlbWJhc3N5IGluIFR1bmlzaWEuCiAjIFdlIGhhdmUgYSB3cmFwLXVwIGFib3V0IHRoaXMgb24gdGhlIGZvbGxvd2luZyBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvdHVuaXNpYS1jYW5jZWxzLWRzdC0yMDA5Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvdHVuaXNpYS1jYW5jZWxzLWRzdC0yMDA5Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTAzLTE3KToKICMgSGVyZSBpcyBhIGxpbmsgdG8gVHVuaXMgQWZyaXF1ZSBQcmVzc2UgTmV3cyBBZ2VuY3kKQEAgLTEyNzIsMjAgKzExODAsMTcgQEAKICMgU3RhbmRhcmQgdGltZSB0byBiZSBrZXB0IHRoZSB3aG9sZSB5ZWFyIGxvbmcgKHRhcC5pbmZvLnRuKToKICMKICMgKGluIEVuZ2xpc2gpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGFwLmluZm8udG4vZW4vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MjY4MTMmSXRlbWlkPTE1NyI+CiAjIGh0dHA6Ly93d3cudGFwLmluZm8udG4vZW4vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MjY4MTMmSXRlbWlkPTE1NwotIyA8L2E+CiAjCiAjIChpbiBBcmFiaWMpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGFwLmluZm8udG4vYXIvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NjEyNDAmSXRlbWlkPTEiPgogIyBodHRwOi8vd3d3LnRhcC5pbmZvLnRuL2FyL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTYxMjQwJkl0ZW1pZD0xCi0jIDwvYT4KIAotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOS0tMy0xOCk6Ci0jIFRoZSBUdW5pcyBBZnJpcXVlIFByZXNzZSBOZXdzIEFnZW5jeSBub3RpY2UgY29udGFpbnMgdGhpczogIlRoaXMgbWVhc3VyZSBpcyBkdWUgdG8gdGhlIGZhY3QKLSMgdGhhdCB0aGUgZmFzdGluZyBtb250aCBvZiByYW1hZGFuIGNvaW5jaWRlcyB3aXRoIHRoZSBwZXJpb2QgY29uY2VybmVkIGJ5IHN1bW1lciB0aW1lLgotIyBUaGVyZWZvcmUsIHRoZSBzdGFuZGFyZCB0aW1lIHdpbGwgYmUga2VwdCB1bmNoYW5nZWQgdGhlIHdob2xlIHllYXIgbG9uZy4iCi0jIFNvIGZvcmVnb2luZyBEU1Qgc2VlbXMgdG8gYmUgYW4gZXhjZXB0aW9uIChhbGJlaXQgb25lIHRoYXQgbWF5IGJlIHJlcGVhdGVkIGluIHRoZSAgZnV0dXJlKS4KKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDMtMTgpOgorIyBUaGUgVHVuaXMgQWZyaXF1ZSBQcmVzc2UgTmV3cyBBZ2VuY3kgbm90aWNlIGNvbnRhaW5zIHRoaXM6ICJUaGlzIG1lYXN1cmUgaXMKKyMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGZhc3RpbmcgbW9udGggb2YgUmFtYWRhbiBjb2luY2lkZXMgd2l0aCB0aGUgcGVyaW9kCisjIGNvbmNlcm5lZCBieSBzdW1tZXIgdGltZS4gIFRoZXJlZm9yZSwgdGhlIHN0YW5kYXJkIHRpbWUgd2lsbCBiZSBrZXB0CisjIHVuY2hhbmdlZCB0aGUgd2hvbGUgeWVhciBsb25nLiIgIFNvIGZvcmVnb2luZyBEU1Qgc2VlbXMgdG8gYmUgYW4gZXhjZXB0aW9uCisjIChhbGJlaXQgb25lIHRoYXQgbWF5IGJlIHJlcGVhdGVkIGluIHRoZSBmdXR1cmUpLgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTAzLTI3KToKICMgQWNjb3JkaW5nIHRvIHNvbWUgbmV3cyByZXBvcnRzIFR1bmlzIGNvbmZpcm1lZCBub3QgdG8gdXNlIERTVCBpbiAyMDEwCkBAIC0xMjk3LDEyICsxMjAyLDggQEAKICMgY29pbmNpZGVkIHdpdGggdGhlIG1vbnRoIG9mIFJhbWFkYW4uLi4iCiAjCiAjIChpbiBBcmFiaWMpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW9oZWV0LmNvbS9zaG93X25ld3MuYXNweD9uaWQ9MzU4ODYxJnBnPTEiPgogIyBodHRwOi8vd3d3Lm1vaGVldC5jb20vc2hvd19uZXdzLmFzcHg/bmlkPTM1ODg2MSZwZz0xCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWxtYWRlbmFobmV3cy5jb20vbmV3c3MvbmV3cy5waHA/Yz0xMTgmaWQ9MzgwMzYiPgogIyBodHRwOi8vd3d3LmFsbWFkZW5haG5ld3MuY29tL25ld3NzL25ld3MucGhwP2M9MTE4JmlkPTM4MDM2Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfdHVuaXMwMi5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c190dW5pczAyLmh0bWwKIAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKQEAgLTEzMzcsNyArMTIzOCw3IEBACiAjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIDE5MTEgc3dpdGNoIHdhcyBvbiBNYXIgOTsgZ28gd2l0aCBIb3dzZSdzIE1hciAxMS4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQWZyaWNhL1R1bmlzCTA6NDA6NDQgLQlMTVQJMTg4MSBNYXkgMTIKLQkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgICAgIyBQYXJpcyBNZWFuIFRpbWUKKwkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgIyBQYXJpcyBNZWFuIFRpbWUKIAkJCTE6MDAJVHVuaXNpYQlDRSVzVAogCiAjIFVnYW5kYQpkaWZmIC0tZ2l0IGEvbWFrZS9kYXRhL3R6ZGF0YS9hbnRhcmN0aWNhIGIvbWFrZS9kYXRhL3R6ZGF0YS9hbnRhcmN0aWNhCmluZGV4IGUzMWJhZGEuLjBjZGFjMjcgMTAwNjQ0Ci0tLSBhL21ha2UvZGF0YS90emRhdGEvYW50YXJjdGljYQorKysgYi9tYWtlL2RhdGEvdHpkYXRhL2FudGFyY3RpY2EKQEAgLTIxLDE5ICsyMSwxNiBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0xMS0xNSk6CiAjIFRvIGtlZXAgdGhpbmdzIG1hbmFnZWFibGUsIHdlIGxpc3Qgb25seSBsb2NhdGlvbnMgb2NjdXBpZWQgeWVhci1yb3VuZDsgc2VlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY29tbmFwLmFxL2NvbW5hcC9jb21uYXAubnNmL1AvU3RhdGlvbnMvIj4KICMgQ09NTkFQIC0gU3RhdGlvbnMgYW5kIEJhc2VzCi0jIDwvYT4KKyMgaHR0cDovL3d3dy5jb21uYXAuYXEvY29tbmFwL2NvbW5hcC5uc2YvUC9TdGF0aW9ucy8KICMgYW5kCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3ByaS5jYW0uYWMudWsvYm9iL3BlcmlhbnQuaHRtIj4KICMgU3VtbWFyeSBvZiB0aGUgUGVyaS1BbnRhcmN0aWMgSXNsYW5kcyAoMTk5OC0wNy0yMykKLSMgPC9hPgorIyBodHRwOi8vd3d3LnNwcmkuY2FtLmFjLnVrL2JvYi9wZXJpYW50Lmh0bQogIyBmb3IgaW5mb3JtYXRpb24uCiAjIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB3ZSBoYXZlIG5vIHRpbWUgem9uZSBpbmZvcm1hdGlvbi4KICMKQEAgLTc4LDE5ICs3NSwxOSBAQAogCiAjIEFyZ2VudGluYSAtIHllYXItcm91bmQgYmFzZXMKICMgQmVsZ3Jhbm8gSUksIENvbmZpbiBDb2FzdCwgLTc3MDIyNy0wMzQzNzM3LCBzaW5jZSAxOTcyLTAyLTA1Ci0jIEVzcGVyYW56YSwgU2FuIE1hcnRpbiBMYW5kLCAtNjMyMy0wNTY1OSwgc2luY2UgMTk1Mi0xMi0xNwotIyBKdWJhbnksIFBvdHRlciBQZW5pbnN1bGEsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTY0MTQtMDYwMjMyMCwgc2luY2UgMTk4Mi0wMQotIyBNYXJhbWJpbywgU2V5bW91ciBJLCAtNjQxNC0wNTYzNywgc2luY2UgMTk2OS0xMC0yOQorIyBDYXJsaW5pLCBQb3R0ZXIgQ292ZSwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjQxNC0wNjAyMzIwLCBzaW5jZSAxOTgyLTAxCisjIEVzcGVyYW56YSwgSG9wZSBCYXksIC02MzIzLTA1NjU5LCBzaW5jZSAxOTUyLTEyLTE3CisjIE1hcmFtYmlvLCAtNjQxNC0wNTYzNywgc2luY2UgMTk2OS0xMC0yOQogIyBPcmNhZGFzLCBMYXVyaWUgSSwgLTYwMTYtMDQ0NDQsIHNpbmNlIDE5MDQtMDItMjIKLSMgU2FuIE1hcnRpbiwgRGViZW5oYW0gSSwgLTY4MDctMDY3MDgsIHNpbmNlIDE5NTEtMDMtMjEKKyMgU2FuIE1hcnTDrW4sIEJhcnJ5IEksIC02ODA4LTA2NzA2LCBzaW5jZSAxOTUxLTAzLTIxCiAjCShleGNlcHQgMTk2MC0wMyAvIDE5NzYtMDMtMjEpCiAKICMgQXVzdHJhbGlhIC0gdGVycml0b3JpZXMKICMgSGVhcmQgSXNsYW5kLCBNY0RvbmFsZCBJc2xhbmRzICh1bmluaGFiaXRlZCkKICMJcHJldmlvdXNseSBzZWFsZXJzIGFuZCBzY2llbnRpZmljIHBlcnNvbm5lbCB3aW50ZXJlZAotIwk8YSBocmVmPSJodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAyMTIwNDIyMjI0NS9odHRwOi8vd3d3LmRzdGMucXV0LmVkdS5hdS9EU1QvbWFyZy9kYXlsaWdodC5odG1sIj4KICMJTWFyZ2FyZXQgVHVybmVyIHJlcG9ydHMKLSMJPC9hPiAoMTk5OS0wOS0zMCkgdGhhdCB0aGV5J3JlIFVUQys1LCB3aXRoIG5vIERTVDsKKyMJaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwMjEyMDQyMjIyNDUvaHR0cDovL3d3dy5kc3RjLnF1dC5lZHUuYXUvRFNUL21hcmcvZGF5bGlnaHQuaHRtbAorIwkoMTk5OS0wOS0zMCkgdGhhdCB0aGV5J3JlIFVUQys1LCB3aXRoIG5vIERTVDsKICMJcHJlc3VtYWJseSB0aGlzIGlzIHdoZW4gdGhleSBoYXZlIHZpc2l0b3JzLgogIwogIyB5ZWFyLXJvdW5kIGJhc2VzCkBAIC0xMDcsMTQgKzEwNCwxMCBAQAogIyBUaGUgY2hhbmdlcyBvY2N1cnJlZCBvbiAyMDA5LTEwLTE4IGF0IDAyOjAwIChsb2NhbCB0aW1lcykuCiAjCiAjIEdvdmVybm1lbnQgc291cmNlOiAoQXVzdHJhbGlhbiBBbnRhcmN0aWMgRGl2aXNpb24pCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWFkLmdvdi5hdS9kZWZhdWx0LmFzcD9jYXNpZD0zNzA3OSI+CiAjIGh0dHA6Ly93d3cuYWFkLmdvdi5hdS9kZWZhdWx0LmFzcD9jYXNpZD0zNzA3OQotIyA8L2E+CiAjCiAjIFdlIGhhdmUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9hbnRhcmN0aWNhLW5ldy10aW1lcy5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2FudGFyY3RpY2EtbmV3LXRpbWVzLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTAzLTEwKToKICMgV2UgZ290IHRoZXNlIGNoYW5nZXMgZnJvbSB0aGUgQXVzdHJhbGlhbiBBbnRhcmN0aWMgRGl2aXNpb246IC4uLgpAQCAtMTI5LDUwICsxMjIsNDkgQEAKICMgLSBNYXdzb24gc3RhdGlvbiBzdGF5cyBvbiBVVEMrNS4KICMKICMgQmFja2dyb3VuZDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2FudGFydGljYS10aW1lLWNoYW5nZXMtMjAxMC5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2FudGFydGljYS10aW1lLWNoYW5nZXMtMjAxMC5odG1sCi0jIDwvYT4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbnRhcmN0aWNhL0Nhc2V5CTAJLQl6enoJMTk2OQotCQkJODowMAktCVdTVAkyMDA5IE9jdCAxOCAyOjAwCi0JCQkJCQkjIFdlc3Rlcm4gKEF1cykgU3RhbmRhcmQgVGltZQotCQkJMTE6MDAJLQlDQVNUCTIwMTAgTWFyIDUgMjowMAotCQkJCQkJIyBDYXNleSBUaW1lCi0JCQk4OjAwCS0JV1NUCTIwMTEgT2N0IDI4IDI6MDAKKwkJCTg6MDAJLQlBV1NUCTIwMDkgT2N0IDE4ICAyOjAwCisJCQkJCQkjIEF1c3RyYWxpYW4gV2VzdGVybiBTdGQgVGltZQorCQkJMTE6MDAJLQlDQVNUCTIwMTAgTWFyICA1ICAyOjAwICAjIENhc2V5IFRpbWUKKwkJCTg6MDAJLQlBV1NUCTIwMTEgT2N0IDI4ICAyOjAwCiAJCQkxMTowMAktCUNBU1QJMjAxMiBGZWIgMjEgMTc6MDB1Ci0JCQk4OjAwCS0JV1NUCisJCQk4OjAwCS0JQVdTVAogWm9uZSBBbnRhcmN0aWNhL0RhdmlzCTAJLQl6enoJMTk1NyBKYW4gMTMKLQkJCTc6MDAJLQlEQVZUCTE5NjQgTm92ICMgRGF2aXMgVGltZQorCQkJNzowMAktCURBVlQJMTk2NCBOb3YgICAgIyBEYXZpcyBUaW1lCiAJCQkwCS0Jenp6CTE5NjkgRmViCi0JCQk3OjAwCS0JREFWVAkyMDA5IE9jdCAxOCAyOjAwCisJCQk3OjAwCS0JREFWVAkyMDA5IE9jdCAxOCAgMjowMAogCQkJNTowMAktCURBVlQJMjAxMCBNYXIgMTAgMjA6MDB1Ci0JCQk3OjAwCS0JREFWVAkyMDExIE9jdCAyOCAyOjAwCisJCQk3OjAwCS0JREFWVAkyMDExIE9jdCAyOCAgMjowMAogCQkJNTowMAktCURBVlQJMjAxMiBGZWIgMjEgMjA6MDB1CiAJCQk3OjAwCS0JREFWVAogWm9uZSBBbnRhcmN0aWNhL01hd3NvbgkwCS0Jenp6CTE5NTQgRmViIDEzCi0JCQk2OjAwCS0JTUFXVAkyMDA5IE9jdCAxOCAyOjAwCi0JCQkJCQkjIE1hd3NvbiBUaW1lCisJCQk2OjAwCS0JTUFXVAkyMDA5IE9jdCAxOCAgMjowMCAjIE1hd3NvbiBUaW1lCiAJCQk1OjAwCS0JTUFXVAogIyBSZWZlcmVuY2VzOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2Nhc2V5L2Nhc2V5X2F3cy5odG1sIj4KICMgQ2FzZXkgV2VhdGhlciAoMTk5OC0wMi0yNikKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2RhdmlzL3ZpZGVvLmh0bWwiPgorIyBodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2Nhc2V5L2Nhc2V5X2F3cy5odG1sCiAjIERhdmlzIFN0YXRpb24sIEFudGFyY3RpY2EgKDE5OTgtMDItMjYpCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRkaXYuZ292LmF1L2FhZC9leG9wL3Nmby9tYXdzb24vdmlkZW8uaHRtbCI+CisjIGh0dHA6Ly93d3cuYW50ZGl2Lmdvdi5hdS9hYWQvZXhvcC9zZm8vZGF2aXMvdmlkZW8uaHRtbAogIyBNYXdzb24gU3RhdGlvbiwgQW50YXJjdGljYSAoMTk5OC0wMi0yNSkKLSMgPC9hPgorIyBodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL21hd3Nvbi92aWRlby5odG1sCisKKyMgQmVsZ2l1bSAtIHllYXItcm91bmQgYmFzZQorIyBQcmluY2VzcyBFbGlzYWJldGgsIFF1ZWVuIE1hdWQgTGFuZCwgLTcxMzQxMiswMjMxMjAwLCBzaW5jZSAyMDA3CiAKICMgQnJhemlsIC0geWVhci1yb3VuZCBiYXNlCi0jIENvbWFuZGFudGUgRmVycmF6LCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjA1KzA1ODI0LCBzaW5jZSAxOTgzLzQKKyMgRmVycmF6LCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjA1KzA1ODI0LCBzaW5jZSAxOTgzLzQKKworIyBCdWxnYXJpYSAtIHllYXItcm91bmQgYmFzZQorIyBTdC4gS2xpbWVudCBPaHJpZHNraSwgTGl2aW5nc3RvbiBJc2xhbmQsIC02MjM4MjktMDYwMjE1Mywgc2luY2UgMTk4OAogCiAjIENoaWxlIC0geWVhci1yb3VuZCBiYXNlcyBhbmQgdG93bnMKICMgRXNjdWRlcm8sIFNvdXRoIFNoZXRsYW5kIElzLCAtNjIxMTU3LTA1ODU3MzUsIHNpbmNlIDE5OTQKLSMgUHJlc2lkZW50ZSBFZHVhZHJvIEZyZWksIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTQtMDU4NDgsIHNpbmNlIDE5NjktMDMtMDcKLSMgR2VuZXJhbCBCZXJuYXJkbyBPJ0hpZ2dpbnMsIEFudGFyY3RpYyBQZW5pbnN1bGEsIC02MzE5LTA1NzA0LCBzaW5jZSAxOTQ4LTAyCi0jIENhcGl0YW4gQXJ0dXJvIFByYXQsIC02MjMwLTA1OTQxCisjIEZyZWkgTW9udGFsdmEsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTQtMDU4NDgsIHNpbmNlIDE5NjktMDMtMDcKKyMgTydIaWdnaW5zLCBBbnRhcmN0aWMgUGVuaW5zdWxhLCAtNjMxOS0wNTcwNCwgc2luY2UgMTk0OC0wMgorIyBQcmF0LCAtNjIzMC0wNTk0MQogIyBWaWxsYSBMYXMgRXN0cmVsbGFzIChhIHRvd24pLCBhcm91bmQgdGhlIEZyZWkgYmFzZSwgc2luY2UgMTk4NC0wNC0wOQogIyBUaGVzZSBsb2NhdGlvbnMgaGF2ZSBhbHdheXMgdXNlZCBTYW50aWFnbyB0aW1lOyB1c2UgVFo9J0FtZXJpY2EvU2FudGlhZ28nLgogCkBAIC0xODAsMzEgKzE3MiwzNSBAQAogIyBHcmVhdCBXYWxsLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjEzLTA1ODU4LCBzaW5jZSAxOTg1LTAyLTIwCiAjIFpob25nc2hhbiwgTGFyc2VtYW5uIEhpbGxzLCBQcnlkeiBCYXksIC02OTIyKzA3NjIzLCBzaW5jZSAxOTg5LTAyLTI2CiAKLSMgRnJhbmNlIC0geWVhci1yb3VuZCBiYXNlcworIyBGcmFuY2UgLSB5ZWFyLXJvdW5kIGJhc2VzIChhbHNvIHNlZSAiRnJhbmNlICYgSXRhbHkiKQogIwogIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5Ny0wMS0yMCk6Ci0jIFRpbWUgZGF0YSBhcmUgZnJvbSBOaWNvbGUgUGFpbGxlYXUgYXQgdGhlIElGUlRQCisjIFRpbWUgZGF0YSBlbnRyaWVzIGFyZSBmcm9tIE5pY29sZSBQYWlsbGVhdSBhdCB0aGUgSUZSVFAKICMgKEZyZW5jaCBJbnN0aXR1dGUgZm9yIFBvbGFyIFJlc2VhcmNoIGFuZCBUZWNobm9sb2d5KS4KLSMgU2hlIGNvbmZpcm1zIHRoYXQgRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIGFuZCBUZXJyZSBBZGVsaWUgYmFzZXMKLSMgZG9uJ3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgdGltZSwgZXZlbiBpZiBUZXJyZSBBZGVsaWUgc3VwcGxpZXMgY2FtZQorIyBTaGUgY29uZmlybXMgdGhhdCBGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMgYW5kIFRlcnJlIEFkw6lsaWUgYmFzZXMKKyMgZG9uJ3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgdGltZSwgZXZlbiBpZiBUZXJyZSBBZMOpbGllIHN1cHBsaWVzIGNhbWUKICMgZnJvbSBUYXNtYW5pYS4KICMKICMgRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIHdpdGggeWVhci1yb3VuZCBpbmhhYml0YW50cwogIwotIyBNYXJ0aW4tZGUtVml2aWVzIEJhc2UsIEFtc3RlcmRhbSBJc2xhbmQsIC0zNzQxMDUrMDc3MzE1NSwgc2luY2UgMTk1MAotIyBBbGZyZWQtRmF1cmUgQmFzZSwgQ3JvemV0IElzbGFuZHMsIC00NjI1NTErMDUxNTE1Miwgc2luY2UgMTk2NAotIyBQb3J0LWF1eC1GcmFuY2FpcywgS2VyZ3VlbGVuIElzbGFuZHMsIC00OTIxMTArMDcwMTMwMywgc2luY2UgMTk1MTsKKyMgQWxmcmVkIEZhdXJlLCBQb3NzZXNzaW9uIElzbGFuZCwgQ3JvemV0IElzbGFuZHMsIC00NjI1NTErMDUxNTE1Miwgc2luY2UgMTk2NDsKKyMJc2VhbGluZyAmIHdoYWxpbmcgc3RhdGlvbnMgb3BlcmF0ZWQgdmFyaW91c2x5IDE4MDIvMTkxMSs7CisjCXNlZSBJbmRpYW4vUmV1bmlvbi4KKyMKKyMgTWFydGluLWRlLVZpdmnDqHMsIEFtc3RlcmRhbSBJc2xhbmQsIC0zNzQxMDUrMDc3MzE1NSwgc2luY2UgMTk1MAorIyBQb3J0LWF1eC1GcmFuw6dhaXMsIEtlcmd1ZWxlbiBJc2xhbmRzLCAtNDkyMTEwKzA3MDEzMDMsIHNpbmNlIDE5NTE7CiAjCXdoYWxpbmcgJiBzZWFsaW5nIHN0YXRpb24gb3BlcmF0ZWQgMTkwOC8xOTE0LCAxOTIwLzE5MjksIGFuZCAxOTUxLzE5NTYKICMKICMgU3QgUGF1bCBJc2xhbmQgLSBuZWFyIEFtc3RlcmRhbSwgdW5pbmhhYml0ZWQKICMJZmlzaGluZyBzdGF0aW9ucyBvcGVyYXRlZCB2YXJpb3VzbHkgMTgxOS8xOTMxCiAjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEluZGlhbi9LZXJndWVsZW4JMAktCXp6egkxOTUwCSMgUG9ydC1hdXgtRnJhbmNhaXMKK1pvbmUgSW5kaWFuL0tlcmd1ZWxlbgkwCS0Jenp6CTE5NTAgIyBQb3J0LWF1eC1GcmFuw6dhaXMKIAkJCTU6MDAJLQlURlQJIyBJU08gY29kZSBURiBUaW1lCiAjCiAjIHllYXItcm91bmQgYmFzZSBpbiB0aGUgbWFpbiBjb250aW5lbnQKLSMgRHVtb250LWQnVXJ2aWxsZSwgSWxlIGRlcyBQZXRyZWxzLCAtNjY0MCsxNDAwMSwgc2luY2UgMTk1Ni0xMQorIyBEdW1vbnQgZCdVcnZpbGxlLCDDjmxlIGRlcyBQw6l0cmVscywgLTY2NDArMTQwMDEsIHNpbmNlIDE5NTYtMTEKKyMgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVtb250X2QnVXJ2aWxsZV9TdGF0aW9uPiAoMjAwNS0xMi0wNSkKICMKICMgQW5vdGhlciBiYXNlIGF0IFBvcnQtTWFydGluLCA1MGttIGVhc3QsIGJlZ2FuIG9wZXJhdGlvbiBpbiAxOTQ3LgogIyBJdCB3YXMgZGVzdHJveWVkIGJ5IGZpcmUgb24gMTk1Mi0wMS0xNC4KQEAgLTIxNCwyMCArMjEwLDIyIEBACiAJCQkxMDowMAktCVBNVAkxOTUyIEphbiAxNCAjIFBvcnQtTWFydGluIFRpbWUKIAkJCTAJLQl6enoJMTk1NiBOb3YKIAkJCTEwOjAwCS0JRERVVAkjIER1bW9udC1kJ1VydmlsbGUgVGltZQotIyBSZWZlcmVuY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVtb250X2QnVXJ2aWxsZV9TdGF0aW9uIj4KLSMgRHVtb250IGQnVXJ2aWxsZSBTdGF0aW9uICgyMDA1LTEyLTA1KQotIyA8L2E+CisKKyMgRnJhbmNlICYgSXRhbHkgLSB5ZWFyLXJvdW5kIGJhc2UKKyMgQ29uY29yZGlhLCAtNzUwNjAwKzEyMzIwMDAsIHNpbmNlIDIwMDUKIAogIyBHZXJtYW55IC0geWVhci1yb3VuZCBiYXNlCi0jIEdlb3JnIHZvbiBOZXVtYXllciwgLTcwMzktMDA4MTUKKyMgTmV1bWF5ZXIgSUlJLCAtNzA0MDgwLTAwODE2MDIsIHNpbmNlIDIwMDkKIAotIyBJbmRpYSAtIHllYXItcm91bmQgYmFzZQotIyBEYWtzaGluIEdhbmdvdHJpLCAtNzAwNSswMTIwMAorIyBJbmRpYSAtIHllYXItcm91bmQgYmFzZXMKKyMgQmhhcmF0aSwgLTY5MjQyOCswNzYxMTE0LCBzaW5jZSAyMDEyCisjIE1haXRyaSwgLTcwNDU1OCswMTE0MzU2LCBzaW5jZSAxOTg5CisKKyMgSXRhbHkgLSB5ZWFyLXJvdW5kIGJhc2UgKGFsc28gc2VlICJGcmFuY2UgJiBJdGFseSIpCisjIFp1Y2hlbGxpLCBUZXJyYSBOb3ZhIEJheSwgLTc0NDE0MCsxNjQwNjQ3LCBzaW5jZSAxOTg2CiAKICMgSmFwYW4gLSB5ZWFyLXJvdW5kIGJhc2VzCi0jIERvbWUgRnVqaSwgLTc3MTkrMDM5NDIKLSMgU3lvd2EsIC02OTAwMjIrMDM5MzUyNAorIyBTeW93YSAoYWxzbyBrbm93biBhcyBTaG93YSksIC02OTAwMjIrMDM5MzUyNCwgc2luY2UgMTk1NwogIwogIyBGcm9tIEhpZGV5dWtpIFN1enVraSAoMTk5OS0wMi0wNik6CiAjIEluIGFsbCBKYXBhbmVzZSBzdGF0aW9ucywgKzAzMDAgaXMgdXNlZCBhcyB0aGUgc3RhbmRhcmQgdGltZS4KQEAgLTIzOSwxMSArMjM3LDExIEBACiBab25lIEFudGFyY3RpY2EvU3lvd2EJMAktCXp6egkxOTU3IEphbiAyOQogCQkJMzowMAktCVNZT1QJIyBTeW93YSBUaW1lCiAjIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5uaXByLmFjLmpwL2VuZ2xpc2gvYXJhMDEuaHRtbCI+CiAjIE5JUFIgQW50YXJjdGljIFJlc2VhcmNoIEFjdGl2aXRpZXMgKDE5OTktMDgtMTcpCi0jIDwvYT4KKyMgaHR0cDovL3d3dy5uaXByLmFjLmpwL2VuZ2xpc2gvYXJhMDEuaHRtbAogCiAjIFMgS29yZWEgLSB5ZWFyLXJvdW5kIGJhc2UKKyMgSmFuZyBCb2dvLCBUZXJyYSBOb3ZhIEJheSwgLTc0MzcwMCsxNjQxMjA1IHNpbmNlIDIwMTQKICMgS2luZyBTZWpvbmcsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTMtMDU4NDcsIHNpbmNlIDE5ODgKIAogIyBOZXcgWmVhbGFuZCAtIGNsYWltcwpAQCAtMjg3LDExICsyODUsMTQgQEAKIFJ1bGUJVHJvbGwJMjAwNAltYXgJLQlPY3QJbGFzdFN1bgkxOjAwdQkwOjAwCVVUQwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbnRhcmN0aWNhL1Ryb2xsCTAJLQl6enoJMjAwNSBGZWIgMTIKLSAgICAgCQkJMDowMAlUcm9sbAklcworCQkJMDowMAlUcm9sbAklcwogCiAjIFBvbGFuZCAtIHllYXItcm91bmQgYmFzZQogIyBBcmN0b3dza2ksIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMDk0NS0wNTgyNzQ1LCBzaW5jZSAxOTc3CiAKKyMgUm9tYW5pYSAtIHllYXItYm91bmQgYmFzZQorIyBMYXctUmFjb3ZpyJvEgywgTGFyc2VtYW5uIEhpbGxzLCAtNjkyMzE5KzA3NjIyNTEsIHNpbmNlIDE5ODYKKwogIyBSdXNzaWEgLSB5ZWFyLXJvdW5kIGJhc2VzCiAjIEJlbGxpbmdzaGF1c2VuLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjExNTktMDU4NTMzNywgc2luY2UgMTk2OC0wMi0yMgogIyBNaXJueSwgRGF2aXMgY29hc3QsIC02NjMzKzA5MzAxLCBzaW5jZSAxOTU2LTAyCkBAIC0zMDEsOCArMzAyLDggQEAKICMJeWVhci1yb3VuZCBmcm9tIDE5NjAvNjEgdG8gMTk5MgogCiAjIFZvc3Rvaywgc2luY2UgMTk1Ny0xMi0xNiwgdGVtcG9yYXJpbHkgY2xvc2VkIDE5OTQtMDIvMTk5NC0xMQotIyA8YSBocmVmPSJodHRwOi8vcXVlc3QuYXJjLm5hc2EuZ292L2FudGFyY3RpY2EvUUEvY29tcHV0ZXJzL0RpcmVjdGlvbnMsVGltZSxaSVAiPgotIyBGcm9tIENyYWlnIE11bmRlbGwgKDE5OTQtMTItMTUpPC9hPjoKKyMgRnJvbSBDcmFpZyBNdW5kZWxsICgxOTk0LTEyLTE1KToKKyMgaHR0cDovL3F1ZXN0LmFyYy5uYXNhLmdvdi9hbnRhcmN0aWNhL1FBL2NvbXB1dGVycy9EaXJlY3Rpb25zLFRpbWUsWklQCiAjIFZvc3Rvaywgd2hpY2ggaXMgb25lIG9mIHRoZSBSdXNzaWFuIHN0YXRpb25zLCBpcyBzZXQgb24gdGhlIHNhbWUKICMgdGltZSBhcyBNb3Njb3csIFJ1c3NpYS4KICMKQEAgLTMxNyw3ICszMTgsNyBAQAogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA1LTA0KToKICMgVGhpcyBzZWVtcyB0byBiZSBob3BlbGVzc2x5IGNvbmZ1c2luZywgc28gSSBhc2tlZCBMZWUgSG90eiBhYm91dCBpdAotIyBpbiBwZXJzb24uICBIZSBzYWlkIHRoYXQgc29tZSBBbnRhcnRpYyBsb2NhdGlvbnMgc2V0IHRoZWlyIGxvY2FsCisjIGluIHBlcnNvbi4gIEhlIHNhaWQgdGhhdCBzb21lIEFudGFyY3RpYyBsb2NhdGlvbnMgc2V0IHRoZWlyIGxvY2FsCiAjIHRpbWUgc28gdGhhdCBub29uIGlzIHRoZSB3YXJtZXN0IHBhcnQgb2YgdGhlIGRheSwgYW5kIHRoYXQgdGhpcwogIyBjaGFuZ2VzIGR1cmluZyB0aGUgeWVhciBhbmQgZG9lcyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBtZWFuCiAjIHNvbGFyIG5vb24uICBTbyB0aGUgVm9zdG9rIHRpbWUgbWlnaHQgaGF2ZSBiZWVuIHdoYXRldmVyIHRoZSBjbG9ja3MKQEAgLTMyOSw5ICszMzAsMTIgQEAKIAogIyBTIEFmcmljYSAtIHllYXItcm91bmQgYmFzZXMKICMgTWFyaW9uIElzbGFuZCwgLTQ2NTMrMDM3NTIKLSMgU2FuYWUsIC03MTQxLTAwMjUwCisjIFNBTkFFIElWLCBWZXNsZXNrYXJ2ZXQsIFF1ZWVuIE1hdWQgTGFuZCwgLTcxNDAyMi0wMDI1MDI2LCBzaW5jZSAxOTk3CiAKLSMgVUsKKyMgVWtyYWluZSAtIHllYXItcm91bmQgYmFzZQorIyBWZXJuYWRza3kgKGZvcm1lcmx5IEZhcmFkYXkpLCBHYWxpbmRleiBJc2xhbmQsIC02NTE0NDUtMDY0MTUyNiwgc2luY2UgMTk1NAorCisjIFVuaXRlZCBLaW5nZG9tCiAjCiAjIEJyaXRpc2ggQW50YXJjdGljIFRlcnJpdG9yaWVzIChCQVQpIGNsYWltcwogIyBTb3V0aCBPcmtuZXkgSXNsYW5kcwpAQCAtMzg3LDcgKzM5MSw3IEBACiAjIGJ1dCB0aGF0IGhlIGZvdW5kIGl0IG1vcmUgY29udmVuaWVudCB0byBrZWVwIEdNVCsxMgogIyBhcyBzdXBwbGllcyBmb3IgdGhlIHN0YXRpb24gd2VyZSBjb21pbmcgZnJvbSBNY011cmRvIFNvdW5kLAogIyB3aGljaCB3YXMgb24gR01UKzEyIGJlY2F1c2UgTmV3IFplYWxhbmQgd2FzIG9uIEdNVCsxMiBhbGwgeWVhcgotIyBhdCB0aGF0IHRpbWUgKDE5NTcpLiAgKFNvdXJjZTogU2lwbGUncyBib29rIDkwIGRlZ3JlZXMgU09VVEguKQorIyBhdCB0aGF0IHRpbWUgKDE5NTcpLiAgKFNvdXJjZTogU2lwbGUncyBib29rIDkwIERlZ3JlZXMgU291dGguKQogIwogIyBGcm9tIFN1c2FuIFNtaXRoCiAjIGh0dHA6Ly93d3cuY3liZXJ0b3Vycy5jb20vd2hzL3BvbGUxMC5odG1sCmRpZmYgLS1naXQgYS9tYWtlL2RhdGEvdHpkYXRhL2FzaWEgYi9tYWtlL2RhdGEvdHpkYXRhL2FzaWEKaW5kZXggNTk1YzhlZC4uOTA2YzBhOSAxMDA2NDQKLS0tIGEvbWFrZS9kYXRhL3R6ZGF0YS9hc2lhCisrKyBiL21ha2UvZGF0YS90emRhdGEvYXNpYQpAQCAtMjEsMTMgKzIxLDEzIEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIAotIyBUaGlzIGRhdGEgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKKyMgVGhpcyBmaWxlIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCiAjIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KLSMgdHpAaWFuYS5vcmcgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgorIyB0ekBpYW5hLm9yZyBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuICBGb3IgbW9yZSwgcGxlYXNlIHNlZQorIyB0aGUgZmlsZSBDT05UUklCVVRJTkcgaW4gdGhlIHR6IGRpc3RyaWJ1dGlvbi4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDEzLTA4LTExKToKICMKQEAgLTQ5LDEzICs0OSwxNyBAQAogIyBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCiAjCiAjIEZvciBkYXRhIGNpcmNhIDE4OTksIGEgY29tbW9uIHNvdXJjZSBpczoKLSMgTWlsbmUgSi4gQ2l2aWwgdGltZS4gR2VvZ3IgSi4gMTg5OSBGZWI7MTMoMik6MTczLTk0Ci0jIDxodHRwOi8vd3d3LmpzdG9yLm9yZy9zdGFibGUvMTc3NDM1OT4uCisjIE1pbG5lIEouIENpdmlsIHRpbWUuIEdlb2dyIEouIDE4OTkgRmViOzEzKDIpOjE3My05NC4KKyMgaHR0cDovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzE3NzQzNTkKKyMKKyMgRm9yIFJ1c3NpYW4gZGF0YSBjaXJjYSAxOTE5LCBhIHNvdXJjZSBpczoKKyMgQnlhbG9rb3ogRUwuIE5ldyBDb3VudGluZyBvZiBUaW1lIGluIFJ1c3NpYSBzaW5jZSBKdWx5IDEsIDE5MTkuCisjIChTZWUgdGhlICdldXJvcGUnIGZpbGUgZm9yIGEgZnVsbGVyIGNpdGF0aW9uLikKICMKICMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzIGlzCiAjIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgogIwotIyBJIGludmVudGVkIHRoZSBhYmJyZXZpYXRpb25zIG1hcmtlZCBgKicgaW4gdGhlIGZvbGxvd2luZyB0YWJsZTsKKyMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgJyonIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7CiAjIHRoZSByZXN0IGFyZSBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBvciBmcm9tIG90aGVyIHNvdXJjZXMuCiAjIENvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQogIwkgICAgIHN0ZCAgZHN0CkBAIC03MCwxMyArNzQsMTQgQEAKICMJNzowMCBXSUIJd2VzdCBJbmRvbmVzaWEgKFdha3R1IEluZG9uZXNpYSBCYXJhdCkKICMJODowMCBXSVRBCWNlbnRyYWwgSW5kb25lc2lhIChXYWt0dSBJbmRvbmVzaWEgVGVuZ2FoKQogIwk4OjAwIENTVAlDaGluYQotIwk5OjAwIENKVAlDZW50cmFsIEphcGFuZXNlIFRpbWUgKDE4OTYvMTkzNykqCisjCTg6MDAgSldTVAlXZXN0ZXJuIFN0YW5kYXJkIFRpbWUgKEphcGFuLCAxODk2LzE5MzcpKgorIwk5OjAwIEpDU1QJQ2VudHJhbCBTdGFuZGFyZCBUaW1lIChKYXBhbiwgMTg5Ni8xOTM3KQogIwk5OjAwIFdJVAllYXN0IEluZG9uZXNpYSAoV2FrdHUgSW5kb25lc2lhIFRpbXVyKQogIwk5OjAwIEpTVCAgSkRUCUphcGFuCiAjCTk6MDAgS1NUICBLRFQJS29yZWEKLSMJOTozMCBDU1QJKEF1c3RyYWxpYW4pIENlbnRyYWwgU3RhbmRhcmQgVGltZQorIwk5OjMwIEFDU1QJQXVzdHJhbGlhbiBDZW50cmFsIFN0YW5kYXJkIFRpbWUKICMKLSMgU2VlIHRoZSBgZXVyb3BlJyBmaWxlIGZvciBSdXNzaWEgYW5kIFR1cmtleSBpbiBBc2lhLgorIyBTZWUgdGhlICdldXJvcGUnIGZpbGUgZm9yIFJ1c3NpYSBhbmQgVHVya2V5IGluIEFzaWEuCiAKICMgRnJvbSBHdXkgSGFycmlzOgogIyBJbmNvcnBvcmF0ZXMgZGF0YSBmb3IgU2luZ2Fwb3JlIGZyb20gUm9iZXJ0IEVseicgYXNpYSAxLjEsIGFzIHdlbGwgYXMKQEAgLTg2LDcgKzkxLDcgQEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0jIFRoZXNlIHJ1bGVzIGFyZSBzdG9sZW4gZnJvbSB0aGUgYGV1cm9wZScgZmlsZS4KKyMgVGhlc2UgcnVsZXMgYXJlIHN0b2xlbiBmcm9tIHRoZSAnZXVyb3BlJyBmaWxlLgogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIFJ1bGUJRVVBc2lhCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDE6MDB1CTE6MDAJUwogUnVsZQlFVUFzaWEJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDE6MDB1CTAJLQpAQCAtMTM4LDExICsxNDMsMTEgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9ZZXJldmFuCTI6NTg6MDAgLQlMTVQJMTkyNCBNYXkgIDIKIAkJCTM6MDAJLQlZRVJUCTE5NTcgTWFyICAgICMgWWVyZXZhbiBUaW1lCi0JCQk0OjAwIFJ1c3NpYUFzaWEgWUVSJXNUCTE5OTEgTWFyIDMxIDI6MDBzCisJCQk0OjAwIFJ1c3NpYUFzaWEgWUVSJXNUCTE5OTEgTWFyIDMxICAyOjAwcwogCQkJMzowMAkxOjAwCVlFUlNUCTE5OTEgU2VwIDIzICMgaW5kZXBlbmRlbmNlCi0JCQkzOjAwIFJ1c3NpYUFzaWEJQU0lc1QJMTk5NSBTZXAgMjQgMjowMHMKKwkJCTM6MDAgUnVzc2lhQXNpYQlBTSVzVAkxOTk1IFNlcCAyNCAgMjowMHMKIAkJCTQ6MDAJLQlBTVQJMTk5NwotCQkJNDowMCBSdXNzaWFBc2lhCUFNJXNUCTIwMTIgTWFyIDI1IDI6MDBzCisJCQk0OjAwIFJ1c3NpYUFzaWEJQU0lc1QJMjAxMiBNYXIgMjUgIDI6MDBzCiAJCQk0OjAwCS0JQU1UCiAKICMgQXplcmJhaWphbgpAQCAtMTU1LDE2ICsxNjAsMTYgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9CYWt1CTM6MTk6MjQgLQlMTVQJMTkyNCBNYXkgIDIKIAkJCTM6MDAJLQlCQUtUCTE5NTcgTWFyICAgICMgQmFrdSBUaW1lCi0JCQk0OjAwIFJ1c3NpYUFzaWEgQkFLJXNUCTE5OTEgTWFyIDMxIDI6MDBzCisJCQk0OjAwIFJ1c3NpYUFzaWEgQkFLJXNUCTE5OTEgTWFyIDMxICAyOjAwcwogCQkJMzowMAkxOjAwCUJBS1NUCTE5OTEgQXVnIDMwICMgaW5kZXBlbmRlbmNlCiAJCQkzOjAwIFJ1c3NpYUFzaWEJQVolc1QJMTk5MiBTZXAgbGFzdFNhdCAyMzowMAotCQkJNDowMAktCUFaVAkxOTk2ICMgQXplcmJhaWphbiB0aW1lCisJCQk0OjAwCS0JQVpUCTE5OTYgICAgICMgQXplcmJhaWphbiBUaW1lCiAJCQk0OjAwCUVVQXNpYQlBWiVzVAkxOTk3CiAJCQk0OjAwCUF6ZXIJQVolc1QKIAogIyBCYWhyYWluCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmFocmFpbgkzOjIyOjIwIC0JTE1UCTE5MjAJCSMgQWwgTWFuYW1haAorWm9uZQlBc2lhL0JhaHJhaW4JMzoyMjoyMCAtCUxNVAkxOTIwICAgICAjIE1hbmFtYWgKIAkJCTQ6MDAJLQlHU1QJMTk3MiBKdW4KIAkJCTM6MDAJLQlBU1QKIApAQCAtMTc0LDEzICsxNzksOCBAQAogIyBEYXlsaWdodCBTYXZpbmcgVGltZSBmcm9tIEp1bmUgMTYgdG8gU2VwdCAzMAogIwogIyBCYW5nbGFkZXNoIHRvIGludHJvZHVjZSBkYXlsaWdodCBzYXZpbmcgdGltZSBsaWtlbHkgZnJvbSBKdW5lIDE2Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXNpYW50cmlidW5lLmNvbS8/cT1ub2RlLzE3Mjg4Ij4KICMgaHR0cDovL3d3dy5hc2lhbnRyaWJ1bmUuY29tLz9xPW5vZGUvMTcyODgKLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2JhbmdsYWRlc2gwMi5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDIuaHRtbAotIyA8L2E+CiAjCiAjICIuLi4gQmFuZ2xhZGVzaCBnb3Zlcm5tZW50IGhhcyBkZWNpZGVkIHRvIHN3aXRjaCBkYXlsaWdodCBzYXZpbmcgdGltZSBmcm9tCiAjIEp1bmUKQEAgLTE5NSwxNyArMTk1LDExIEBACiAjIHRoZSAxOXRoIGFuZCAyMHRoLCBhbmQgdGhleSBoYXZlIG5vdCBzZXQgdGhlIGVuZCBkYXRlIHlldC4KICMKICMgU29tZSBzb3VyY2VzOgotIyA8YSBocmVmPSJodHRwOi8vaW4ucmV1dGVycy5jb20vYXJ0aWNsZS9zb3V0aEFzaWFOZXdzL2lkSU5JbmRpYS00MDAxNzYyMDA5MDYwMSI+CiAjIGh0dHA6Ly9pbi5yZXV0ZXJzLmNvbS9hcnRpY2xlL3NvdXRoQXNpYU5ld3MvaWRJTkluZGlhLTQwMDE3NjIwMDkwNjAxCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL2JkbmV3czI0LmNvbS9kZXRhaWxzLnBocD9pZD04NTg4OSZjaWQ9MiI+CiAjIGh0dHA6Ly9iZG5ld3MyNC5jb20vZGV0YWlscy5waHA/aWQ9ODU4ODkmY2lkPTIKLSMgPC9hPgogIwogIyBPdXIgd3JhcC11cDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2JhbmdsYWRlc2gtZGF5bGlnaHQtc2F2aW5nLTIwMDkuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9iYW5nbGFkZXNoLWRheWxpZ2h0LXNhdmluZy0yMDA5Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQS4gTi4gTS4gS2FtcnVzIFNhYWRhdCAoMjAwOS0wNi0xNSk6CiAjIEZpbmFsbHkgd2UndmUgZ290IHRoZSBvZmZpY2lhbCBtYWlsIHJlZ2FyZGluZyBEU1Qgc3RhcnQgdGltZSB3aGVyZSBEU1Qgc3RhcnQKQEAgLTIyMCwxMyArMjE0LDggQEAKICMKICMgRm9sbG93aW5nIHJlcG9ydCBieSBzYW1lIG5ld3NwYXBlci0iVGhlIERhaWx5IFN0YXIgRnJpZGF5IjoKICMgIkRTVCBjaGFuZ2UgYXdhaXRzIGNhYmluZXQgZGVjaXNpb24tQ2xvY2sgd29uJ3QgZ28gYmFjayBieSAxLWhyIGZyb20gT2N0IDEiCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlZGFpbHlzdGFyLm5ldC9uZXdEZXNpZ24vbmV3cy1kZXRhaWxzLnBocD9uaWQ9MTA3MDIxIj4KICMgaHR0cDovL3d3dy50aGVkYWlseXN0YXIubmV0L25ld0Rlc2lnbi9uZXdzLWRldGFpbHMucGhwP25pZD0xMDcwMjEKLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2JhbmdsYWRlc2gwNC5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDQuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMTAtMTMpOgogIyBJQU5TIChJbmRvLUFzaWFuIE5ld3MgU2VydmljZSkgbm93IHJlcG9ydHM6CkBAIC0yMzUsMjIgKzIyNCwxNSBAQAogIyAiY29udGludWUgZm9yIGFuIGluZGVmaW5pdGUgcGVyaW9kLiIKICMKICMgT25lIG9mIG1hbnkgcGxhY2VzIHdoZXJlIGl0IGlzIHB1Ymxpc2hlZDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGFpbmRpYW4uY29tL25ld3Nwb3J0YWwvYnVzaW5lc3MvYmFuZ2xhZGVzaC10by1jb250aW51ZS1pbmRlZmluaXRlbHktd2l0aC1hZHZhbmNlZC10aW1lXzEwMDI1OTk4Ny5odG1sIj4KICMgaHR0cDovL3d3dy50aGFpbmRpYW4uY29tL25ld3Nwb3J0YWwvYnVzaW5lc3MvYmFuZ2xhZGVzaC10by1jb250aW51ZS1pbmRlZmluaXRlbHktd2l0aC1hZHZhbmNlZC10aW1lXzEwMDI1OTk4Ny5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0xMi0yNCk6CiAjIEFjY29yZGluZyB0byBCYW5nbGFkZXNoIG5ld3NwYXBlciAiVGhlIERhaWx5IFN0YXIsIgogIyBCYW5nbGFkZXNoIHdpbGwgY2hhbmdlIGl0cyBjbG9jayBiYWNrIHRvIFN0YW5kYXJkIFRpbWUgb24gRGVjIDMxLCAyMDA5LgogIwogIyBDbG9jayBnb2VzIGJhY2sgMS1ociBvbiBEZWMgMzEgbmlnaHQuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlZGFpbHlzdGFyLm5ldC9uZXdEZXNpZ24vbmV3cy1kZXRhaWxzLnBocD9uaWQ9MTE5MjI4Ij4KICMgaHR0cDovL3d3dy50aGVkYWlseXN0YXIubmV0L25ld0Rlc2lnbi9uZXdzLWRldGFpbHMucGhwP25pZD0xMTkyMjgKLSMgPC9hPgotIyBhbmQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDUuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDA1Lmh0bWwKLSMgPC9hPgogIwogIyAiLi4uVGhlIGdvdmVybm1lbnQgeWVzdGVyZGF5IGRlY2lkZWQgdG8gcHV0IHRoZSBjbG9jayBiYWNrIGJ5IG9uZSBob3VyCiAjIG9uIERlY2VtYmVyIDMxIG1pZG5pZ2h0IGFuZCB0aGUgbmV3IHRpbWUgd2lsbCBjb250aW51ZSB1bnRpbCBNYXJjaCAzMSwKQEAgLTI2MCwxNyArMjQyLDEyIEBACiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTAzLTIyKToKICMgQWNjb3JkaW5nIHRvIEJhbmdsYWRlc2ggbmV3c3BhcGVyICJUaGUgRGFpbHkgU3RhciwiCiAjIENhYmluZXQgY2FuY2VscyBEYXlsaWdodCBTYXZpbmcgVGltZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL2xhdGVzdF9uZXdzLnBocD9uaWQ9MjI4MTciPgogIyBodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL2xhdGVzdF9uZXdzLnBocD9uaWQ9MjI4MTcKLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2JhbmdsYWRlc2gwNi5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDYuaHRtbAotIyA8L2E+CiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCURoYWthCTIwMDkJb25seQktCUp1bgkxOQkyMzowMAkxOjAwCVMKLVJ1bGUJRGhha2EJMjAwOQlvbmx5CS0JRGVjCTMxCTIzOjU5CTAJLQorUnVsZQlEaGFrYQkyMDA5CW9ubHkJLQlEZWMJMzEJMjQ6MDAJMAktCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9EaGFrYQk2OjAxOjQwIC0JTE1UCTE4OTAKQEAgLTMwMSw3ICsyNzgsNyBAQAogCiAjIEJydW5laQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0JydW5laQk3OjM5OjQwIC0JTE1UCTE5MjYgTWFyICAgIyBCYW5kYXIgU2VyaSBCZWdhd2FuCitab25lCUFzaWEvQnJ1bmVpCTc6Mzk6NDAgLQlMTVQJMTkyNiBNYXIgIyBCYW5kYXIgU2VyaSBCZWdhd2FuCiAJCQk3OjMwCS0JQk5UCTE5MzMKIAkJCTg6MDAJLQlCTlQKIApAQCAtMzEwLDE2ICsyODcsMTYgQEAKICMgTWlsbmUgc2F5cyA2OjI0OjQwIHdhcyB0aGUgbWVyaWRpYW4gb2YgdGhlIHRpbWUgYmFsbCBvYnNlcnZhdG9yeSBhdCBSYW5nb29uLgogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvUmFuZ29vbgk2OjI0OjQwIC0JTE1UCTE4ODAJCSMgb3IgWWFuZ29uCi0JCQk2OjI0OjQwCS0JUk1UCTE5MjAJICAgIyBSYW5nb29uIE1lYW4gVGltZT8KLQkJCTY6MzAJLQlCVVJUCTE5NDIgTWF5ICAgIyBCdXJtYSBUaW1lCi0JCQk5OjAwCS0JSlNUCTE5NDUgTWF5IDMKLQkJCTY6MzAJLQlNTVQJCSAgICMgTXlhbm1hciBUaW1lCitab25lCUFzaWEvUmFuZ29vbgk2OjI0OjQwIC0JTE1UCTE4ODAgICAgICAgICMgb3IgWWFuZ29uCisJCQk2OjI0OjQwCS0JUk1UCTE5MjAgICAgICAgICMgUmFuZ29vbiBNZWFuIFRpbWU/CisJCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAgICAjIEJ1cm1hIFRpbWUKKwkJCTk6MDAJLQlKU1QJMTk0NSBNYXkgIDMKKwkJCTY6MzAJLQlNTVQJIyBNeWFubWFyIFRpbWUKIAogIyBDYW1ib2RpYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL1Bobm9tX1BlbmgJNjo1OTo0MCAtCUxNVAkxOTA2IEp1biAgOQotCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAwOjAxICMgU2FpZ29uIE1UPworCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAgMDowMSAjIFNhaWdvbiBNVD8KIAkJCTc6MDAJLQlJQ1QJMTkxMiBNYXkKIAkJCTg6MDAJLQlJQ1QJMTkzMSBNYXkKIAkJCTc6MDAJLQlJQ1QKQEAgLTMzMiwxMiArMzA5LDEyIEBACiAjIEZyb20gQm9iIERldmluZSAoMTk4OC0wMS0yOCk6CiAjIE5vIHRoZXkgZG9uJ3QuICBTZWUgVElNRSBtYWcsIDE5ODYtMDItMTcgcC41Mi4gIEV2ZW4gdGhvdWdoCiAjIENoaW5hIGlzIGFjcm9zcyA0IHBoeXNpY2FsIHRpbWUgem9uZXMsIGJlZm9yZSBGZWIgMSwgMTk4NiBvbmx5IHRoZQotIyBQZWtpbmcgKEJlamluZykgdGltZSB6b25lIHdhcyByZWNvZ25pemVkLiAgU2luY2UgdGhhdCBkYXRlLCBDaGluYQotIyBoYXMgdHdvIG9mICdlbSAtLSBQZWtpbmcncyBhbmQgVXJ1bXFpIChuYW1lZCBhZnRlciB0aGUgY2FwaXRhbCBvZgorIyBQZWtpbmcgKEJlaWppbmcpIHRpbWUgem9uZSB3YXMgcmVjb2duaXplZC4gIFNpbmNlIHRoYXQgZGF0ZSwgQ2hpbmEKKyMgaGFzIHR3byBvZiAnZW0gLSBQZWtpbmcncyBhbmQgw5xyw7xtcWkgKG5hbWVkIGFmdGVyIHRoZSBjYXBpdGFsIG9mCiAjIHRoZSBYaW5qaWFuZyBVeWdodXIgQXV0b25vbW91cyBSZWdpb24pLiAgSSBkb24ndCBrbm93IGFib3V0IERTVCBmb3IgaXQuCiAjCiAjIC4gLiAuSSBqdXN0IGRlbGV0ZWQgdGhlIERTVCB0YWJsZSBhbmQgdGhpcyBlZGl0b3IgbWFrZXMgaXQgdG9vCi0jIHBhaW5mdWwgdG8gc3VjayBpbiBhbm90aGVyIGNvcHkuLiAgU28sIGhlcmUgaXMgd2hhdCBJIGhhdmUgZm9yCisjIHBhaW5mdWwgdG8gc3VjayBpbiBhbm90aGVyIGNvcHkuICBTbywgaGVyZSBpcyB3aGF0IEkgaGF2ZSBmb3IKICMgRFNUIHN0YXJ0L2VuZCBkYXRlcyBmb3IgUGVraW5nJ3MgdGltZSB6b25lIChpbmZvIGZyb20gQVApOgogIwogIyAgICAgMTk4NiBNYXkgNCAtIFNlcHQgMTQKQEAgLTM0NywxNSArMzI0LDE2IEBACiAjIENISU5BICAgICAgICAgICAgICAgOCBIICBBSEVBRCBPRiBVVEMgIEFMTCBPRiBDSElOQSwgSU5DTCBUQUlXQU4KICMgQ0hJTkEgICAgICAgICAgICAgICA5IEggIEFIRUFEIE9GIFVUQyAgQVBSIDE3IC0gU0VQIDEwCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IENoaW5hIChleGNlcHQgZm9yIEhvbmcgS29uZyBhbmQgTWFjYXUpCi0jIGhhcyBoYWQgYSBzaW5nbGUgdGltZSB6b25lIHNpbmNlIDE5ODAgTWF5IDEsIG9ic2VydmluZyBzdW1tZXIgRFNUCi0jIGZyb20gMTk4NiB0aHJvdWdoIDE5OTE7IHRoaXMgY29udHJhZGljdHMgRGV2aW5lJ3MKLSMgbm90ZSBhYm91dCBUaW1lIG1hZ2F6aW5lLCB0aG91Z2ggYXBwYXJlbnRseSBfc29tZXRoaW5nXyBoYXBwZW5lZCBpbiAxOTg2LgotIyBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciBmb3Igbm93LiAgSSBtYWRlIHVwIG5hbWVzIGZvciB0aGUgb3RoZXIKLSMgcHJlLTE5ODAgdGltZSB6b25lcy4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwOC0wMi0xMSk6CisjIEppbSBNYW5uLCAiQSBjbHVtc3kgZW1icmFjZSBmb3IgYW5vdGhlciB3ZXN0ZXJuIGN1c3RvbTogQ2hpbmEgb24gZGF5bGlnaHQKKyMgdGltZSAtIHNvcnQgb2YiLCBMb3MgQW5nZWxlcyBUaW1lcywgMTk4Ni0wNS0wNSAuLi4gW3NheXNdIHRoYXQgQ2hpbmEgYmVnYW4KKyMgb2JzZXJ2aW5nIGRheWxpZ2h0IHNhdmluZyB0aW1lIGluIDE5ODYuCiAKLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDYtMzApOgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgaGF2ZSBDaGluYSBzd2l0Y2hpbmcgdG8gYSBzaW5nbGUgdGltZSB6b25lIGluIDE5ODAsIGJ1dAorIyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb3JyZWN0LiAgVGhleSBhbHNvIHdyaXRlIHRoYXQgQ2hpbmEgb2JzZXJ2ZWQgc3VtbWVyCisjIERTVCBmcm9tIDE5ODYgdGhyb3VnaCAxOTkxLCB3aGljaCBzZWVtcyB0byBtYXRjaCB0aGUgYWJvdmUgY29tbWVudGFyeSwgc28KKyMgZ28gd2l0aCB0aGVtIGZvciBEU1QgcnVsZXMgYXMgZm9sbG93czoKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCVNoYW5nCTE5NDAJb25seQktCUp1bgkgMwkwOjAwCTE6MDAJRAogUnVsZQlTaGFuZwkxOTQwCTE5NDEJLQlPY3QJIDEJMDowMAkwCVMKQEAgLTM2OSw3ICszNDcsNyBAQAogIyBoaXN0b3JpYyB0aW1lem9uZXMgZnJvbSBzb21lIFRhaXdhbiB3ZWJzaXRlcy4gIEFuZCB5ZXMsIHRoZXJlIGFyZSBvZmZpY2lhbAogIyBDaGluZXNlIG5hbWVzIGZvciB0aGVzZSBsb2NhbGVzIChiZWZvcmUgMTk0OSkuCiAjCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA3LTE0KToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA2LTA3LTE0KToKICMgSSBoYXZlIGludmVzdGlnYXRlZCB0aGUgdGltZXpvbmVzIGFyb3VuZCAxOTcwIG9uIHRoZQogIyBodHRwOi8vd3d3LmFzdHJvLmNvbS9hdGxhcyBzaXRlIFt3aXRoIHByb3ZpbmNlcyBhbmQgY291bnR5CiAjIGJvdW5kYXJpZXMgc3VtbWFyaXplZCBiZWxvd10uLi4uICBBIGZldyBvdGhlciBleGNlcHRpb25zIHdlcmUgdHdvCkBAIC0zODAsNjUgKzM1OCw5NyBAQAogIyAoY291bGQgYmUgdHJ1ZSksIGZvciB0aGUgbW9tZW50IEkgYW0gYXNzdW1pbmcgdGhhdCB0aG9zZSB0d28KICMgY291bnRpZXMgYXJlIG1pc3Rha2VzIGluIHRoZSBhc3Ryby5jb20gZGF0YS4KIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA4LTAyLTExKToKLSMgSSBqdXN0IG5vdyBjaGVja2VkIEdvb2dsZSBOZXdzIGZvciB3ZXN0ZXJuIG5ld3Mgc291cmNlcyB0aGF0IHRhbGsKLSMgYWJvdXQgQ2hpbmEncyBzaW5nbGUgdGltZSB6b25lLCBhbmQgY291bGRuJ3QgZmluZCBhbnl0aGluZyBiZWZvcmUgMTk4NgotIyB0YWxraW5nIGFib3V0IENoaW5hIGJlaW5nIGluIG9uZSB0aW1lIHpvbmUuICAoVGhhdCBhcnRpY2xlIHdhczogSmltCi0jIE1hbm4sICJBIGNsdW1zeSBlbWJyYWNlIGZvciBhbm90aGVyIHdlc3Rlcm4gY3VzdG9tOiBDaGluYSBvbiBkYXlsaWdodAotIyB0aW1lLS1zb3J0IG9mIiwgTG9zIEFuZ2VsZXMgVGltZXMsIDE5ODYtMDUtMDUuICBCeSB0aGUgd2F5LCB0aGlzCi0jIGFydGljbGUgY29uZmlybXMgdGhlIHR6IGRhdGFiYXNlJ3MgZGF0YSBjbGFpbWluZyB0aGF0IENoaW5hIGJlZ2FuCi0jIG9ic2VydmluZyBkYXlsaWdodCBzYXZpbmcgdGltZSBpbiAxOTg2LgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTMwKToKKyMgQWxvaXMgVHJlaW5kbCBraW5kbHkgc2VudCBtZSB0cmFuc2xhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28gc291cmNlczoKICMKLSMgRnJvbSBUaG9tYXMgUy4gTXVsbGFuZXkgKDIwMDgtMDItMTEpOgotIyBJIHRoaW5rIHlvdSdyZSBjb21iaW5pbmcgdHdvIHN1YmplY3RzIHRoYXQgbmVlZCB0byB0cmVhdGVkCi0jIHNlcGFyYXRlbHk6IGRheWxpZ2h0IHNhdmluZ3MgKHdoaWNoLCB5b3UncmUgY29ycmVjdCwgd2Fzbid0Ci0jIGltcGxlbWVudGVkIHVudGlsIHRoZSAxOTgwcykgYW5kIHRoZSB1bmlmaWVkIHRpbWUgem9uZSBjZW50ZXJlZCBuZWFyCi0jIEJlaWppbmcgKHdoaWNoIHdhcyBpbXBsZW1lbnRlZCBpbiAxOTQ5KS4gQnJpZWZseSwgdGhlcmUgd2FzIGFsc28gYQotIyAiTGhhc2EgVGltZSIgaW4gVGliZXQgYW5kICJVcnVtcWkgVGltZSIgaW4gWGluamlhbmcuIFRoZSBmaXJzdCB3YXMKLSMgY2Vhc2VkLCBhbmQgdGhlIHNlY29uZCBldmVudHVhbGx5IHJlY29nbml6ZWQgKGFnYWluLCBpbiB0aGUgMTk4MHMpLgorIyAoMSkKKyMgR3VvIFFpbmdzaGVuZyAoTmF0aW9uYWwgVGltZS1TZXJ2aWNlIENlbnRlciwgQ0FTLCBYaSdhbiA3MTA2MDAsIENoaW5hKQorIyBCZWlqaW5nIFRpbWUgYXQgdGhlIEJlZ2lubmluZyBvZiB0aGUgUFJDCisjIENoaW5hIEhpc3RvcmljYWwgTWF0ZXJpYWxzIG9mIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kKKyMgKFpob25nZ3VvIGtlIGppIHNoaSBsaWFvLCDkuK3lm73np5HmioDlj7LmlpkpLCBWb2wuIDI0LCBOby4gMSAoMjAwMykKKyMgSXQgZ2l2ZXMgZXZpZGVuY2UgdGhhdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBQUkMsIEJlaWppbmcgdGltZSB3YXMKKyMgb2ZmaWNpYWxseSBhcHBhcmVudCBzb2xhciB0aW1lISAgSG93ZXZlciwgR3VvIGFsc28gc2F5cyB0aGF0IHRoZQorIyBldmlkZW5jZSBpcyBkdWJpb3VzLCBhcyB0aGUgcmVsZXZhbnQgaW5zdGl0dXRlIG9mIGFzdHJvbm9teSBoYWQgbm90CisjIGJlZW4gdGFrZW4gb3ZlciBieSB0aGUgUFJDIHlldC4gIEl0J3MgcGxhdXNpYmxlIHRoYXQgYXBwYXJlbnQgc29sYXIKKyMgdGltZSB3YXMgYW5ub3VuY2VkIGJ1dCBuZXZlciBpbXBsZW1lbnRlZCwgYW5kIHRoYXQgcGVvcGxlIGNvbnRpbnVlZAorIyB0byB1c2UgVVQrOC4gIEFzIHRoZSBTaGFuZ2hhaSByYWRpbyBzdGF0aW9uIChhbmQgSSBwcmVzdW1lIHRoZQorIyBvYnNlcnZhdG9yeSkgd2FzIHN0aWxsIHVuZGVyIGNvbnRyb2wgb2YgRnJlbmNoIG1pc3Npb25hcmllcywgaXQKKyMgY291bGQgd2VsbCBoYXZlIGlnbm9yZWQgYW55IHN1Y2ggbWFuZGF0ZS4KICMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwOC0wNi0zMCk6Ci0jIFRoZXJlIHNlZW1zIHRvIGJlIGEgZ29vZCBjaGFuY2UgQ2hpbmEgc3dpdGNoZWQgdG8gYSBzaW5nbGUgdGltZSB6b25lIGluIDE5NDkKLSMgcmF0aGVyIHRoYW4gaW4gMTk4MCBhcyBTaGFua3MgJiBQb3R0ZW5nZXIgaGF2ZSBpdCwgYnV0IHdlIGRvbid0IGhhdmUgYQotIyByZWxpYWJsZSBkb2N1bWVudGFyeSBzb3VyY2Ugc2F5aW5nIHNvIHlldCwgc28gZm9yIG5vdyB3ZSBzdGlsbCBnbyB3aXRoCi0jIFNoYW5rcyAmIFBvdHRlbmdlci4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBDaGFuZ2JhaSBUaW1lICgiTG9uZy13aGl0ZSBUaW1lIiwgTG9uZy13aGl0ZSA9IEhlaWxvbmdqaWFuZyBhcmVhKQorIyAoMikKKyMgR3VvIFFpbmctc2hlbmcgKFNoYWFueGkgQXN0cm9ub21pY2FsIE9ic2VydmF0b3J5LCBDQVMsIFhpJ2FuIDcxMDYwMCwgQ2hpbmEpCisjIEEgU3R1ZHkgb24gdGhlIFN0YW5kYXJkIFRpbWUgQ2hhbmdlcyBmb3IgdGhlIFBhc3QgMTAwIFllYXJzIGluIENoaW5hCisjIFt1bmRhdGVkIGFuZCB1bmtub3duIHB1YmxpY2F0aW9uIGxvY2F0aW9uXQorIyBJdCBzYXlzIHNldmVyYWwgdGhpbmdzOgorIyAgICogVGhlIFFpbmcgZHluYXN0eSB1c2VkIGxvY2FsIGFwcGFyZW50IHNvbGFyIHRpbWUgdGhyb3VnaG91dCBDaGluYS4KKyMgICAqIFRoZSBSZXB1YmxpYyBvZiBDaGluYSBpbnN0aXR1dGVkIEJlaWppbmcgbWVhbiBzb2xhciB0aW1lIGVmZmVjdGl2ZQorIyAgICAgdGhlIG9mZmljaWFsIGNhbGVuZGFyIGJvb2sgb2YgMTkxNC4KKyMgICAqIFRoZSBGcmVuY2ggQ29uY2Vzc2lvbiBpbiBTaGFuZ2hhaSBzZXQgdXAgc2lnbmFsIHN0YXRpb25zIGluCisjICAgICBGcmVuY2ggZG9ja3MgaW4gdGhlIDE4OTBzLCBjb250cm9sbGVkIGJ5IFh1amlhaHVpIChaaWthd2VpKQorIyAgICAgT2JzZXJ2YXRvcnkgYW5kIHNldCB0byBsb2NhbCBtZWFuIHRpbWUuCisjICAgKiAiRnJvbSB0aGUgZW5kIG9mIHRoZSAxOXRoIGNlbnR1cnkiIGl0IGNoYW5nZWQgdG8gVVQrOC4KKyMgICAqIENoaW5lc2UgQ3VzdG9tcyAoYnkgdGhlbiByZWR1Y2VkIHRvIGEgdG9vbCBvZiBmb3JlaWduIHBvd2VycykKKyMgICAgIGV2ZW50dWFsbHkgc3RhbmRhcmRpemVkIG9uIHRoaXMgdGltZSBmb3IgYWxsIHBvcnRzLCBhbmQgaXQKKyMgICAgIGJlY2FtZSB1c2VkIGJ5IHJhaWx3YXlzIGFzIHdlbGwuCisjICAgKiBJbiAxOTE4IHRoZSBDZW50cmFsIE9ic2VydmF0b3J5IHByb3Bvc2VkIGRpdmlkaW5nIENoaW5hIGludG8KKyMgICAgIGZpdmUgdGltZSB6b25lcyAoc2VlIGJlbG93IGZvciBkZXRhaWxzKS4gIFRoaXMgY2F1Z2h0IG9uCisjICAgICBhdCBmaXJzdCBvbmx5IGluIGNvYXN0YWwgYXJlYXMgb2JzZXJ2aW5nIFVUKzguCisjICAgKiBEdXJpbmcgV1dJSSBhbGwgb2YgQ2hpbmEgd2FzIGluIHRoZW9yeSB3YXMgYXQgVVQrNy4gIEluIHByYWN0aWNlCisjICAgICB0aGlzIHdhcyBpZ25vcmVkIGluIHRoZSB3ZXN0LCBhbmQgSSBwcmVzdW1lIHdhcyBpZ25vcmVkIGluCisjICAgICBKYXBhbmVzZS1vY2N1cGllZCB0ZXJyaXRvcnkuCisjICAgKiBKYXBhbmVzZS1vY2N1cGllZCBNYW5jaHVyaWEgd2FzIGF0IFVUKzksIGkuZS4sIEphcGFuIHRpbWUuCisjICAgKiBUaGUgZml2ZS16b25lIHBsYW4gd2FzIHJlc3VycmVjdGVkIGFmdGVyIFdXSUkgYW5kIG9mZmljaWFsbHkgcHV0IGludG8KKyMgICAgIHBsYWNlICh3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucykgaW4gTWFyY2ggMTk0OC4gIEl0J3Mgbm90IGNsZWFyCisjICAgICBob3cgd2VsbCBpdCB3YXMgb2JzZXJ2ZWQgaW4gYXJlYXMgdW5kZXIgTmF0aW9uYWxpc3QgY29udHJvbC4KKyMgICAqIFRoZSBQZW9wbGUncyBMaWJlcmF0aW9uIEFybXkgdXNlZCBVVCs4IGR1cmluZyB0aGUgY2l2aWwgd2FyLgorIworIyBBbiBBUCBhcnRpY2xlICJTaGFuZ2hhaSBJbnRlcm5hdCdsIEFyZWEgTGl0dGxlIENoYW5nZWQiIGluIHRoZQorIyBMZXdpc3RvbiAoTUUpIERhaWx5IFN1biAoMTkzOS0wNS0yOSksIHAgMTcsIHNhaWQgIkV2ZW4gdGhlIHRpbWUgaXMKKyMgZGlmZmVyZW50IC0gdGhlIG9jY3VwaWVkIGRpc3RyaWN0cyBnb2luZyBieSBUb2t5byB0aW1lLCBhbiBob3VyCisjIGFoZWFkIG9mIHRoYXQgcHJldmFpbGluZyBpbiB0aGUgcmVzdCBvZiBTaGFuZ2hhaS4iICBHdWVzcyB0aGF0IHRoZQorIyBYdWppYWh1aSBPYnNlcnZhdG9yeSB3YXMgdW5kZXIgRnJlbmNoIGNvbnRyb2wgYW5kIHN0dWNrIHdpdGggVVQrOC4KKyMKKyMgSW4gZWFybGllciB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUsIENoaW5hIGhhZCBtYW55IHNlcGFyYXRlIFpvbmUgZW50cmllcywgYnV0CisjIHRoaXMgd2FzIGJhc2VkIG9uIHdoYXQgd2VyZSBhcHBhcmVudGx5IGluY29ycmVjdCBkYXRhIGluIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgVGhpcyBoYXMgbm93IGJlZW4gc2ltcGxpZmllZCB0byB0aGUgdHdvIGVudHJpZXMgQXNpYS9TaGFuZ2hhaSBhbmQKKyMgQXNpYS9VcnVtcWksIHdpdGggdGhlIG90aGVycyBiZWluZyBsaW5rcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyMgUHJvcG9zZWQgaW4gMTkxOCBhbmQgdGhlb3JldGljYWxseSBpbiBlZmZlY3QgdW50aWwgMTk0OSAoYWx0aG91Z2ggaW4gcHJhY3RpY2UKKyMgbWFpbmx5IG9ic2VydmVkIGluIGNvYXN0YWwgYXJlYXMpLCB0aGUgZml2ZSB6b25lcyB3ZXJlOgorIworIyBDaGFuZ2JhaSBUaW1lICgiTG9uZy13aGl0ZSBUaW1lIiwgTG9uZy13aGl0ZSA9IEhlaWxvbmdqaWFuZyBhcmVhKSBVVCs4LjUKKyMgQXNpYS9IYXJiaW4gKGN1cnJlbnRseSBhIGxpbmsgdG8gQXNpYS9TaGFuZ2hhaSkKICMgSGVpbG9uZ2ppYW5nIChleGNlcHQgTW9oZSBjb3VudHkpLCBKaWxpbgotWm9uZQlBc2lhL0hhcmJpbgk4OjI2OjQ0CS0JTE1UCTE5MjggIyBvciBIYWVyYmluCi0JCQk4OjMwCS0JQ0hBVAkxOTMyIE1hciAjIENoYW5nYmFpIFRpbWUKLQkJCTg6MDAJLQlDU1QJMTk0MAotCQkJOTowMAktCUNIQVQJMTk2NiBNYXkKLQkJCTg6MzAJLQlDSEFUCTE5ODAgTWF5Ci0JCQk4OjAwCVBSQwlDJXNUCi0jIFpob25neXVhbiBUaW1lICgiQ2VudHJhbCBwbGFpbiBUaW1lIikKKyMKKyMgWmhvbmd5dWFuIFRpbWUgKCJDZW50cmFsIHBsYWluIFRpbWUiKSBVVCs4CisjIEFzaWEvU2hhbmdoYWkKICMgbW9zdCBvZiBDaGluYQotIyBNaWxuZSBnaXZlcyA4OjA1OjU2Ljc7IHJvdW5kIHRvIG5lYXJlc3QuCi1ab25lCUFzaWEvU2hhbmdoYWkJODowNTo1NwktCUxNVAkxOTI4Ci0JCQk4OjAwCVNoYW5nCUMlc1QJMTk0OQotCQkJODowMAlQUkMJQyVzVAotIyBMb25nLXNodSBUaW1lIChwcm9iYWJseSBkdWUgdG8gTG9uZyBhbmQgU2h1IGJlaW5nIHR3byBuYW1lcyBvZiB0aGF0IGFyZWEpCisjIFRoaXMgY3VycmVudGx5IHJlcHJlc2VudHMgbW9zdCBvdGhlciB6b25lcyBhcyB3ZWxsLAorIyBhcyBhcHBhcmVudGx5IHRoZXNlIHJlZ2lvbnMgaGF2ZSBiZWVuIHRoZSBzYW1lIHNpbmNlIDE5NzAuCisjIE1pbG5lIGdpdmVzIDg6MDU6NDMuMiBmb3IgWHVqaWFodWkgT2JzZXJ2YXRvcnkgdGltZTsgcm91bmQgdG8gbmVhcmVzdC4KKyMgR3VvIHNheXMgU2hhbmdoYWkgc3dpdGNoZWQgdG8gVVQrOCAiZnJvbSB0aGUgZW5kIG9mIHRoZSAxOXRoIGNlbnR1cnkiLgorIworIyBMb25nLXNodSBUaW1lIChwcm9iYWJseSBkdWUgdG8gTG9uZyBhbmQgU2h1IGJlaW5nIHR3byBuYW1lcyBvZiB0aGF0IGFyZWEpIFVUKzcKKyMgQXNpYS9DaG9uZ3FpbmcgKGN1cnJlbnRseSBhIGxpbmsgdG8gQXNpYS9TaGFuZ2hhaSkKICMgR3Vhbmd4aSwgR3VpemhvdSwgSGFpbmFuLCBOaW5neGlhLCBTaWNodWFuLCBTaGFhbnhpLCBhbmQgWXVubmFuOwogIyBtb3N0IG9mIEdhbnN1OyB3ZXN0IElubmVyIE1vbmdvbGlhOyB3ZXN0IFFpbmdoYWk7IGFuZCB0aGUgR3Vhbmdkb25nCiAjIGNvdW50aWVzIERlcWluZywgRW5waW5nLCBLYWlwaW5nLCBMdW9kaW5nLCBUYWlzaGFuLCBYaW54aW5nLAogIyBZYW5nY2h1biwgWWFuZ2ppYW5nLCBZdSduYW4sIGFuZCBZdW5mdS4KLVpvbmUJQXNpYS9DaG9uZ3FpbmcJNzowNjoyMAktCUxNVAkxOTI4ICMgb3IgQ2h1bmdraW5nCi0JCQk3OjAwCS0JTE9OVAkxOTgwIE1heSAjIExvbmctc2h1IFRpbWUKLQkJCTg6MDAJUFJDCUMlc1QKLSMgWGluLXphbmcgVGltZSAoIlhpbmppYW5nLVRpYmV0IFRpbWUiKQorIworIyBYaW4temFuZyBUaW1lICgiWGluamlhbmctVGliZXQgVGltZSIpIFVUKzYKKyMgQXNpYS9VcnVtcWkKKyMgVGhpcyBjdXJyZW50bHkgcmVwcmVzZW50cyBLdW5sdW4gVGltZSBhcyB3ZWxsLAorIyBhcyBhcHBhcmVudGx5IHRoZSB0d28gcmVnaW9ucyBoYXZlIGJlZW4gdGhlIHNhbWUgc2luY2UgMTk3MC4KICMgVGhlIEdhbnN1IGNvdW50aWVzIEFrc2F5LCBBbnhpLCBEdW5odWFuZywgU3ViZWk7IHdlc3QgUWluZ2hhaTsKICMgdGhlIEd1YW5nZG9uZyBjb3VudGllcyAgWHV3ZW4sIEhhaWthbmcsIFN1aXhpLCBMaWFuamlhbmcsCiAjIFpoYW5qaWFuZywgV3VjaHVhbiwgSHVhemhvdSwgR2FvemhvdSwgTWFvbWluZywgRGlhbmJhaSwgYW5kIFhpbnlpOwogIyBlYXN0IFRpYmV0LCBpbmNsdWRpbmcgTGhhc2EsIENoYW1kbywgU2hpZ2Fpc2UsIEppbXNhciwgU2hhd2FuIGFuZCBIdXR1Ymk7Ci0jIGVhc3QgWGluamlhbmcsIGluY2x1ZGluZyBVcnVtcWksIFR1cnBhbiwgS2FyYW1heSwgS29ybGEsIE1pbmZlbmcsIEppbmdoZSwKKyMgZWFzdCBYaW5qaWFuZywgaW5jbHVkaW5nIMOccsO8bXFpLCBUdXJwYW4sIEthcmFtYXksIEtvcmxhLCBNaW5mZW5nLCBKaW5naGUsCiAjIFd1c3UsIFFpZW1vLCBYaW55YW4sIFd1bGFud3VzdSwgSmluZ2hlLCBZdW1pbiwgVGFjaGVuZywgVHVvbGksIEVtaW4sCiAjIFNoaWhlemksIENoYW5namksIFlhbnFpLCBIZXNodW8sIFR1b2tleHVuLCBUdWx1ZmFuLCBTaGFuc2hhbiwgSGFtaSwKICMgRnVrYW5nLCBLdWl0dW4sIEt1bXVrdWxpLCBNaXF1YW4sIFFpdGFpLCBhbmQgVHVyZmFuLgotWm9uZQlBc2lhL1VydW1xaQk1OjUwOjIwCS0JTE1UCTE5MjggIyBvciBVcnVtY2hpCi0JCQk2OjAwCS0JVVJVVAkxOTgwIE1heSAjIFVydW1xaSBUaW1lCi0JCQk4OjAwCVBSQwlDJXNUCi0jIEt1bmx1biBUaW1lCisjCisjIEt1bmx1biBUaW1lIFVUKzUuNQorIyBBc2lhL0thc2hnYXIgKGN1cnJlbnRseSBhIGxpbmsgdG8gQXNpYS9VcnVtcWkpCiAjIFdlc3QgVGliZXQsIGluY2x1ZGluZyBQdWxhbiwgQWhlcWksIFNodWZ1LCBTaHVsZTsKICMgV2VzdCBYaW5qaWFuZywgaW5jbHVkaW5nIEFrc3UsIEF0dXNoaSwgWWluaW5nLCBIZXRpYW4sIENlbGUsIEx1b3B1LCBOaWxla2UsCiAjIFpoYW9zdSwgVGVrZXNpLCBHb25nbGl1LCBDaGFidWNoYWVyLCBIdW9jaGVuZywgQm9sZSwgUGlzaGFuLCBTdWlkaW5nLApAQCAtNDU1LDkgKzQ2NSw5IEBACiAjIHBvcHVsYXRpb24gb2YgWGluamlhbmcsIHR5cGljYWxseSB1c2UgIlhpbmppYW5nIHRpbWUiIHdoaWNoIGlzIHR3bwogIyBob3VycyBiZWhpbmQgQmVpamluZyB0aW1lLCBvciBVVEMgKzA2MDAuIFRoZSBnb3Zlcm5tZW50IG9mIHRoZSBYaW5qaWFuZwogIyBVeWdodXIgQXV0b25vbW91cyBSZWdpb24sIChYQVVSLCBvciBqdXN0IFhpbmppYW5nIGZvciBzaG9ydCkgYXMgd2VsbCBhcwotIyBsb2NhbCBnb3Zlcm5tZW50cyBzdWNoIGFzIHRoZSBVcnVtcWkgY2l0eSBnb3Zlcm5tZW50IHVzZSBib3RoIHRpbWVzIGluCisjIGxvY2FsIGdvdmVybm1lbnRzIHN1Y2ggYXMgdGhlIMOccsO8bXFpIGNpdHkgZ292ZXJubWVudCB1c2UgYm90aCB0aW1lcyBpbgogIyBwdWJsaWNhdGlvbnMsIHJlZmVycmluZyB0byB3aGF0IGlzIHBvcHVsYXJseSBjYWxsZWQgWGluamlhbmcgdGltZSBhcwotIyAiVXJ1bXFpIHRpbWUuIiBXaGVuIFV5Z2h1cnMgbWFrZSBhbiBhcHBvaW50bWVudCBpbiB0aGUgVXlnaHVyIGxhbmd1YWdlCisjICLDnHLDvG1xaSB0aW1lLiIgV2hlbiBVeWdodXJzIG1ha2UgYW4gYXBwb2ludG1lbnQgaW4gdGhlIFV5Z2h1ciBsYW5ndWFnZQogIyB0aGV5IGFsbW9zdCBpbnZhcmlhYmx5IHVzZSBYaW5qaWFuZyB0aW1lLgogIwogIyAoVGhlaXIgZXRobmljIEhhbiBjb21wYXRyaW90cyB3b3VsZCB0eXBpY2FsbHkgaGF2ZSBubyBjbHVlIG9mIGl0cwpAQCAtNDY5LDIxICs0NzksNiBAQAogIyB0aGUgcHJvdmluY2Ugbm90IGhhdmluZyBkdWFsIHRpbWVzIGJ1dCBmb3VyIHRpbWVzIGluIHVzZSBhdCB0aGUgc2FtZQogIyB0aW1lLiBTb21lIGFyZWFzIHJlbWFpbmVkIG9uIHN0YW5kYXJkIFhpbmppYW5nIHRpbWUgb3IgQmVpamluZyB0aW1lIGFuZAogIyBvdGhlcnMgbW92aW5nIHRoZWlyIGNsb2NrcyBhaGVhZC4pCi0jCi0jIC4uLmFuIGV4YW1wbGUgb2YgYW4gb2ZmaWNpYWwgd2Vic2l0ZSB1c2luZyBvZiBVcnVtcWkgdGltZS4KLSMKLSMgVGhlIGZpcnN0IGZldyBsaW5lcyBvZiB0aGUgR29vZ2xlIHRyYW5zbGF0aW9uIG9mCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmp5c2dsLmdvdi5jbi9zaG93LmFzcHg/aWQ9MjM3OSZjaWQ9MzkiPgotIyBodHRwOi8vd3d3LmZqeXNnbC5nb3YuY24vc2hvdy5hc3B4P2lkPTIzNzkmY2lkPTM5Ci0jIDwvYT4KLSMgKHJldHJpZXZlZCAyMDA5LTEwLTEzKQotIyA+IFVydW1xaSBmaXJlIHNldmVuIHBlb3BsZSBhcmUgbWlzc2luZyB0aGUgYWxsZWdlZCBsb3NzZXMgb2YgYXQgbGVhc3QKLSMgPiA1MDAgbWlsbGlvbiB5dWFuCi0jID4KLSMgPiAoUmVwb3J0ZXIgRG9uZyBMaXUpIHRoZSBkYXkgYmVmb3JlIDIwOjIwIG9yIHNvIChVcnVtcWkgVGltZSAxODoyMCksCi0jID4gVXJ1bXFpIENpdHkgRGVwYXJ0bWVudCBvZiBJbnRlcm5hdGlvbmFsIFBsYXphIEx1dGhlciBRaWFudGFuZyBSaXZlcgotIyA+IGJ1cnN0IGZpcmUuIEFzIG9mIHllc3RlcmRheSwgMTg6MzAsIFVydW1xaSBDaXR5IEZpcmUgb2ZmaWNlcnMgYW5kIG1lbgotIyA+IGhhdmUgd29ya2VkIGNvbnRpbnVvdXNseSBmb3IgMjIgaG91cnMuLi4KIAogIyBGcm9tIEx1dGhlciBNYSAoMjAwOS0xMS0xOSk6CiAjIFdpdGggdGhlIHJpc2sgb2YgYmVpbmcgcmVkdW5kYW50IHRvIHByZXZpb3VzIGFuc3dlcnMgdGhlc2UgYXJlIHRoZSBtb3N0IGNvbW1vbgpAQCAtNDk0LDcgKzQ4OSw3IEBACiAjIDMuIFVydW1xaS4uLgogIyA0LiBLYXNoZ2FyLi4uCiAjIC4uLgotIyA1LiBJdCBzZWVtcyB0aGF0IFV5Z2h1cnMgaW4gVXJ1bXFpIGhhcyBiZWVuIHVzaW5nIFhpbmppYW5nIHNpbmNlIGF0IGxlYXN0IHRoZQorIyA1LiBJdCBzZWVtcyB0aGF0IFV5Z2h1cnMgaW4gw5xyw7xtcWkgaGFzIGJlZW4gdXNpbmcgWGluamlhbmcgc2luY2UgYXQgbGVhc3QgdGhlCiAjIDE5NjAncy4gSSBrbm93IG9mIG9uZSBIYW4sIG5vdyBvdmVyIDUwLCB3aG8gZ3JldyB1cCBpbiB0aGUgc3Vycm91bmRpbmcKICMgY291bnRyeXNpZGUgYW5kIHVzZWQgWGluamlhbmcgdGltZSBhcyBhIGNoaWxkLgogIwpAQCAtNTA2LDEwICs1MDEsNTUgQEAKICMgQXV0b25vbW91cyBSZWdpb24gdW5kZXIgdGhlIFBSQy4gKEJlZm9yZSB0aGF0IFV5Z2h1cnMsIG9mIGNvdXJzZSwgd291bGQgYWxzbwogIyBub3QgYmUgdXNpbmcgQmVpamluZyB0aW1lLCBidXQgc29tZSBsb2NhbCB0aW1lLikKIAotWm9uZQlBc2lhL0thc2hnYXIJNTowMzo1NgktCUxNVAkxOTI4ICMgb3IgS2FzaGkgb3IgS2F4Z2FyCi0JCQk1OjMwCS0JS0FTVAkxOTQwCSAjIEthc2hnYXIgVGltZQotCQkJNTowMAktCUtBU1QJMTk4MCBNYXkKKyMgRnJvbSBEYXZpZCBDb2NocmFuZSAoMjAxNC0wMy0yNik6CisjIEp1c3QgYSBjb25maXJtYXRpb24gdGhhdCDDnHLDvG1xaSB0aW1lIHdhcyBpbXBsZW1lbnRlZCBpbiDDnHLDvG1xaSBvbiAxIEZlYiAxOTg2OgorIyBodHRwOi8vY29udGVudC50aW1lLmNvbS90aW1lL21hZ2F6aW5lL2FydGljbGUvMCw5MTcxLDk2MDY4NCwwMC5odG1sCisKKyMgRnJvbSBMdXRoZXIgTWEgKDIwMTQtMDQtMjIpOgorIyBJIGhhdmUgaW50ZXJ2aWV3ZWQgbnVtZXJvdXMgcGVvcGxlIG9mIHZhcmlvdXMgbmF0aW9uYWxpdGllcyBhbmQgZnJvbQorIyBkaWZmZXJlbnQgbG9jYWxpdGllcyBpbiBYaW5qaWFuZyBhbmQgY2FuIGNvbmZpcm0gdGhlIGluZm9ybWF0aW9uIGluIEd1bydzCisjIHJlcG9ydCByZWdhcmRpbmcgWGluamlhbmcsIGFzIHdlbGwgYXMgdGhlIFRpbWUgYXJ0aWNsZSByZWZlcmVuY2UgYnkgRGF2aWQKKyMgQ29jaHJhbmUuICBXaGV0aGVyIG9mZmljaWFsbHkgcmVjb2duaXplZCBvciBub3QgKGFuZCBib3RoIGFyZSBvZmZpY2lhbGx5CisjIHJlY29nbml6ZWQpLCB0d28gc2VwYXJhdGUgdGltZXMgaGF2ZSBiZWVuIGluIHVzZSBpbiBYaW5qaWFuZyBzaW5jZSBhdCBsZWFzdAorIyB0aGUgQ3VsdHVyYWwgUmV2b2x1dGlvbjogWGluamlhbmcgVGltZSAoWEpUKSwgYWthIMOccsO8bXFpIFRpbWUgb3IgbG9jYWwgdGltZTsKKyMgYW5kIEJlaWppbmcgVGltZS4gIFRoZXJlIGlzIG5vIGNvbmZ1c2lvbiBpbiBYaW5qaWFuZyBhcyB0byB3aGljaCBuYW1lIHJlZmVycworIyB0byB3aGljaCB0aW1lLiBCb3RoIGFyZSB3aWRlbHkgdXNlZCBpbiB0aGUgcHJvdmluY2UsIGFsdGhvdWdoIGluIHNvbWUKKyMgcG9wdWxhdGlvbiBncm91cHMgbWlnaHQgYmUgdXNlIG9uZSB0byB0aGUgZXhjbHVzaW9uIG9mIHRoZSBvdGhlci4gIFRoZSBvbmx5CisjIHByb2JsZW0gaXMgdGhhdCBjb21wdXRlcnMgYW5kIHNtYXJ0IHBob25lcyBsaXN0IMOccsO8bXFpIChvciBLYXNoZ2FyKSBhcworIyBoYXZpbmcgdGhlIHNhbWUgdGltZSBhcyBCZWlqaW5nLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDYtMzApOgorIyBJbiB0aGUgZWFybHkgZGF5cyBvZiB0aGUgUFJDLCBUaWJldCB3YXMgZ2l2ZW4gaXRzIG93biB0aW1lIHpvbmUgKFVUKzYpIGJ1dAorIyB0aGlzIHdhcyB3aXRoZHJhd24gaW4gMTk1OSBhbmQgbmV2ZXIgcmVpbnN0YXRlZDsgc2VlIFR1YnRlbiBLaMOpdHN1biwKKyMgTWVtb3JpZXMgb2YgbGlmZSBpbiBMaGFzYSB1bmRlciBDaGluZXNlIFJ1bGUsIENvbHVtYmlhIFUgUHJlc3MsIElTQk4KKyMgOTc4LTAyMzExNDI4NjEgKDIwMDgpLCB0cmFuc2xhdG9yJ3MgaW50cm9kdWN0aW9uIGJ5IE1hdHRoZXcgQWtlc3RlciwgcCB4LgorIyBBcyB0aGlzIGlzIGJlZm9yZSBvdXIgMTk3MCBjdXRvZmYsIFRpYmV0IGRvZXNuJ3QgbmVlZCBhIHNlcGFyYXRlIHpvbmUuCisjCisjIFhpbmppYW5nIFRpbWUgaXMgd2VsbC1kb2N1bWVudGVkIGFzIGJlaW5nIG9mZmljaWFsbHkgcmVjb2duaXplZC4gIEUuZy4sIHNlZQorIyAiVGhlIFdvcmtpbmctQ2FsZW5kYXIgZm9yIFRoZSBYaW5qaWFuZyBVeWd1ciBBdXRvbm9tb3VzIFJlZ2lvbiBHb3Zlcm5tZW50IgorIyA8aHR0cDovL3d3dy5zaW5raWFuZy5nb3YuY24vc2VydmljZS9vdXJ3b3JraW5nLz4gKDIwMTQtMDQtMjIpLgorIyBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIG5vIGdvb2QgcmVjb3JkcyBvZiB0aW1lIGluIFhpbmppYW5nIGJlZm9yZSAxOTg2LgorIyBEdXJpbmcgdGhlIDIwdGggY2VudHVyeSBwYXJ0cyBvZiBYaW5qaWFuZyB3ZXJlIHJ1bGVkIGJ5IHRoZSBRaW5nIGR5bmFzdHksCisjIHRoZSBSZXB1YmxpYyBvZiBDaGluYSwgdmFyaW91cyB3YXJsb3JkcywgdGhlIEZpcnN0IGFuZCBTZWNvbmQgRWFzdCBUdXJrZXN0YW4KKyMgUmVwdWJsaWNzLCB0aGUgU292aWV0IFVuaW9uLCB0aGUgS3VvbWludGFuZywgYW5kIHRoZSBQZW9wbGUncyBSZXB1YmxpYyBvZgorIyBDaGluYSwgYW5kIHRyYWNraW5nIGRvd24gYWxsIHRoZXNlIG9yZ2FuaXphdGlvbnMnIHRpbWVrZWVwaW5nIHJ1bGVzIHdvdWxkIGJlCisjIHF1aXRlIGEgdHJpY2suICBBcHByb3hpbWF0ZSB0aGlzIGxvc3QgaGlzdG9yeSBieSBhIHRyYW5zaXRpb24gZnJvbSBMTVQgdG8KKyMgWEpUIGF0IHRoZSBzdGFydCBvZiAxOTI4LCB0aGUgeWVhciBvZiBhY2Nlc3Npb24gb2YgdGhlIHdhcmxvcmQgSmluIFNodXJlbiwKKyMgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGF0ZSBnaXZlbiBieSBTaGFua3MgJiBQb3R0ZW5nZXIgKG5vIGRvdWJ0IGFzIGEKKyMgZ3Vlc3MpIGFzIHRoZSB0cmFuc2l0aW9uIGZyb20gTE1ULiAgSWdub3JlIHRoZSB1c2FnZSBvZiBVVCs4IGJlZm9yZQorIyAxOTg2LTAyLTAxIHVuZGVyIHRoZSB0aGVvcnkgdGhhdCB0aGUgdHJhbnNpdGlvbiBkYXRlIHRvIFVUKzggaXMgdW5rbm93biBhbmQKKyMgdGhhdCB0aGUgc29ydCBvZiB1c2VycyB3aG8gcHJlZmVyIEFzaWEvVXJ1bXFpIG5vdyB0eXBpY2FsbHkgaWdub3JlZCB0aGUKKyMgVVQrOCBtYW5kYXRlIGJhY2sgdGhlbi4KKworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorIyBCZWlqaW5nIHRpbWUsIHVzZWQgdGhyb3VnaG91dCBDaGluYTsgcmVwcmVzZW50ZWQgYnkgU2hhbmdoYWkuCitab25lCUFzaWEvU2hhbmdoYWkJODowNTo0MwktCUxNVAkxOTAxCisJCQk4OjAwCVNoYW5nCUMlc1QJMTk0OQogCQkJODowMAlQUkMJQyVzVAorIyBYaW5qaWFuZyB0aW1lLCB1c2VkIGJ5IG1hbnkgaW4gd2VzdGVybiBDaGluYTsgcmVwcmVzZW50ZWQgYnkgw5xyw7xtcWkgLyDDnHLDvG1jaGkKKyMgLyBXdWx1bXVxaS4gIChQbGVhc2UgdXNlIEFzaWEvU2hhbmdoYWkgaWYgeW91IHByZWZlciBCZWlqaW5nIHRpbWUuKQorWm9uZQlBc2lhL1VydW1xaQk1OjUwOjIwCS0JTE1UCTE5MjgKKwkJCTY6MDAJLQlYSlQKIAogCiAjIEhvbmcgS29uZyAoWGlhbmdnYW5nKQpAQCAtNTI0LDE1ICs1NjQsMTEgQEAKICMgYW5kIGluY29ycmVjdCBydWxlcy4gQWx0aG91Z2ggdGhlIGV4YWN0IHN3aXRjaCBvdmVyIHRpbWUgaXMgbWlzc2luZywgSQogIyB0aGluayAzOjMwIGlzIGNvcnJlY3QuIFRoZSBvZmZpY2lhbCBEU1QgcmVjb3JkIGZvciBIb25nIEtvbmcgY2FuIGJlCiAjIG9idGFpbmVkIGZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtIj4KICMgaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtCi0jIDwvYT4uCiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMTAtMjgpOgogIyBIZXJlIGFyZSB0aGUgZGF0ZXMgZ2l2ZW4gYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtIj4KICMgaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtCi0jIDwvYT4KICMgYXMgb2YgMjAwOS0xMC0yODoKICMgWWVhciAgICAgICAgUGVyaW9kCiAjIDE5NDEgICAgICAgIDEgQXByIHRvIDMwIFNlcApAQCAtNjEyLDM1ICs2NDgsMTEzIEBACiAKICMgVGFpd2FuCiAKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgVGFpd2FuIG9ic2VydmVkIERTVCBkdXJpbmcgMTk0NSwgd2hlbiBpdAotIyB3YXMgc3RpbGwgY29udHJvbGxlZCBieSBKYXBhbi4gIFRoaXMgaXMgaGFyZCB0byBiZWxpZXZlLCBidXQgd2UgZG9uJ3QKLSMgaGF2ZSBhbnkgb3RoZXIgaW5mb3JtYXRpb24uCi0KICMgRnJvbSBzbWFsbHVmbyAoMjAxMC0wNC0wMyk6Ci0jIEFjY29yZGluZyB0byBUYWl3YW4ncyBDV0IsCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3diLmdvdi50dy9WNi9hc3Ryb25vbXkvY2RhdGEvc3VtbWVydC5odG0iPgorIyBBY2NvcmRpbmcgdG8gVGFpd2FuJ3MgQ1dCIFtDZW50cmFsIFdlYXRoZXIgQnVyZWF1XSwKICMgaHR0cDovL3d3dy5jd2IuZ292LnR3L1Y2L2FzdHJvbm9teS9jZGF0YS9zdW1tZXJ0Lmh0bQotIyA8L2E+CiAjIFRhaXBlaSBoYXMgRFNUIGluIDE5NzkgYmV0d2VlbiBKdWx5IDFzdCBhbmQgU2VwIDMwLgogCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDEwLTA0LTA3KToKLSMgSGVyZSdzIEdvb2dsZSdzIHRyYW5zbGF0aW9uIG9mIHRoZSB0YWJsZSBhdCB0aGUgYm90dG9tIG9mIHRoZSAic3VtbWVydC5odG0iIHBhZ2U6Ci0jIERlY2FkZSAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgYW5kIGVuZCBkYXRlCi0jIFJlcHVibGljIG9mIENoaW5hIDM0IHllYXJzIHRvIDQwIHllYXJzIChBRCAxOTQ1LTE5NTEgeWVhcnMpIFN1bW1lciBUaW1lICAgICAgICAgICAgICAgTWF5IDEgdG8gU2VwdGVtYmVyIDMwCi0jIDQxIHllYXJzIG9mIHRoZSBSZXB1YmxpYyBvZiBDaGluYSAoQUQgMTk1MikgICAgICAgICAgICAgICAgIERheWxpZ2h0IFNhdmluZyBUaW1lICAgICAgTWFyY2ggMSB0byBPY3RvYmVyIDMxCi0jIFJlcHVibGljIG9mIENoaW5hIDQyIHllYXJzIHRvIDQzIHllYXJzIChBRCAxOTUzLTE5NTQgeWVhcnMpIERheWxpZ2h0IFNhdmluZyBUaW1lICAgICAgQXByaWwgMSB0byBPY3RvYmVyIDMxCi0jIEluIHRoZSA0NCB5ZWFycyB0byA0NSB5ZWFycyAoQUQgMTk1NS0xOTU2IHllYXJzKSAgICAgICAgICAgIERheWxpZ2h0IFNhdmluZyBUaW1lICAgICAgQXByaWwgMSB0byBTZXB0ZW1iZXIgMzAKLSMgUmVwdWJsaWMgb2YgQ2hpbmEgNDYgeWVhcnMgdG8gNDggeWVhcnMgKEFEIDE5NTctMTk1OSkgICAgICAgU3VtbWVyIFRpbWUgICAgICAgICAgICAgICBBcHJpbCAxIHRvIFNlcHRlbWJlciAzMAotIyBSZXB1YmxpYyBvZiBDaGluYSA0OSB5ZWFycyB0byA1MCB5ZWFycyAoQUQgMTk2MC0xOTYxKSAgICAgICBTdW1tZXIgVGltZSAgICAgICAgICAgICAgIEp1bmUgMSB0byBTZXB0ZW1iZXIgMzAKLSMgUmVwdWJsaWMgb2YgQ2hpbmEgNTEgeWVhcnMgdG8gNjIgeWVhcnMgKEFEIDE5NjItMTk3MyB5ZWFycykgU3RvcCBTdW1tZXIgVGltZQotIyBSZXB1YmxpYyBvZiBDaGluYSA2MyB5ZWFycyB0byA2NCB5ZWFycyAoMTk3NC0xOTc1IEFEKSAgICAgICBEYXlsaWdodCBTYXZpbmcgVGltZSAgICAgIEFwcmlsIDEgdG8gU2VwdGVtYmVyIDMwCi0jIFJlcHVibGljIG9mIENoaW5hIDY1IHllYXJzIHRvIDY3IHllYXJzICgxOTc2LTE5NzggQUQpICAgICAgIFN0b3AgRGF5bGlnaHQgU2F2aW5nIFRpbWUKLSMgUmVwdWJsaWMgb2YgQ2hpbmEgNjggeWVhcnMgKEFEIDE5NzkpICAgICAgICAgICAgICAgICAgICAgICAgRGF5bGlnaHQgU2F2aW5nIFRpbWUgICAgICBKdWx5IDEgdG8gU2VwdGVtYmVyIDMwCi0jIFJlcHVibGljIG9mIENoaW5hIHNpbmNlIDY5IHllYXJzIChBRCAxOTgwKSAgICAgICAgICAgICAgICAgIFN0b3AgRGF5bGlnaHQgU2F2aW5nIFRpbWUKKyMgRnJvbSBZdS1DaGVuZyBDaHVhbmcgKDIwMTMtMDctMTIpOgorIyBPbiBEZWMgMjgsIDE4OTUsIHRoZSBNZWlqaSBFbXBlcm9yIGFubm91bmNlZCBPcmRpbmFuY2UgTm8uIDE2NyBvZgorIyBNZWlqaSBZZWFyIDI4ICJUaGUgY2xhdXNlIGFib3V0IHN0YW5kYXJkIHRpbWUiLCBtZW50aW9uZWQgdGhhdAorIyBUYWl3YW4gYW5kIFBlbmdodSBJc2xhbmRzLCBhcyB3ZWxsIGFzIFlhZXlhbWEgYW5kIE1peWFrbyBJc2xhbmRzCisjIChib3RoIGluIE9raW5hd2EpIGFkb3B0IHRoZSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUgd2hpY2ggaXMgYmFzZWQgb24KKyMgMTIwRS4gVGhlIGFkb3B0aW9uIGJlZ2FuIGZyb20gSmFuIDEsIDE4OTYuIFRoZSBvcmlnaW5hbCB0ZXh0IGNhbiBiZQorIyBmb3VuZCBvbiBXaWtpc291cmNlOgorIyBodHRwOi8vamEud2lraXNvdXJjZS5vcmcvd2lraS/mqJnmupbmmYLjg4vpl5zjgrnjg6vku7ZfKOWFrOW4g+aZgikKKyMgLi4uIFRoaXMgY291bGQgYmUgdGhlIGZpcnN0IGFkb3B0aW9uIG9mIHRpbWUgem9uZSBpbiBUYWl3YW4sIGJlY2F1c2UKKyMgZHVyaW5nIHRoZSBRaW5nIER5bmFzdHksIGl0IHNlZW1zIHRoYXQgdGhlcmUgd2FzIG5vIHRpbWUgem9uZQorIyBkZWNsYXJlZCBvZmZpY2lhbGx5LgorIworIyBMYXRlciwgaW4gdGhlIGJlZ2lubmluZyBvZiBXb3JsZCBXYXIgSUksIG9uIFNlcCAyNSwgMTkzNywgdGhlIFNob3dhCisjIEVtcGVyb3IgYW5ub3VuY2VkIE9yZGluYW5jZSBOby4gNTI5IG9mIFNob3dhIFllYXIgMTIgIlRoZSBjbGF1c2Ugb2YKKyMgcmV2aXNpb24gaW4gdGhlIG9yZGluYW5jZSBOby4gMTY3IG9mIE1laWppIHllYXIgMjggYWJvdXQgc3RhbmRhcmQKKyMgdGltZSIsIGluIHdoaWNoIGFib2xpc2hlZCB0aGUgYWRvcHRpb24gb2YgV2VzdGVybiBTdGFuZGFyZCBUaW1lIGluCisjIHdlc3Rlcm4gaXNsYW5kcyAobGlzdGVkIGFib3ZlKSwgd2hpY2ggbWVhbnMgdGhlIHdob2xlIEphcGFuCisjIHRlcnJpdG9yeSwgaW5jbHVkaW5nIGxhdGVyIG9jY3VwYXRpb25zLCBhZG9wdCBKYXBhbiBDZW50cmFsIFRpbWUKKyMgKFVUQys5KS4gVGhlIGFkb3B0aW9uIGJlZ2FuIG9uIE9jdCAxLCAxOTM3LiBUaGUgb3JpZ2luYWwgdGV4dCBjYW4KKyMgYmUgZm91bmQgb24gV2lraXNvdXJjZToKKyMgaHR0cDovL2phLndpa2lzb3VyY2Uub3JnL3dpa2kv5piO5rK75LqM5Y2B5YWr5bm05YuF5Luk56ys55m+5YWt5Y2B5LiD6Jmf5qiZ5rqW5pmC44OL6Zec44K544Or5Lu25Lit5pS55q2j44OO5Lu2CisjCisjIFRoYXQgaXMsIHRoZSB0aW1lIHpvbmUgb2YgVGFpcGVpIHN3aXRjaGVkIHRvIFVUQys5IG9uIE9jdCAxLCAxOTM3LgorCisjIEZyb20gWXUtQ2hlbmcgQ2h1YW5nICgyMDE0LTA3LTAyKToKKyMgSSd2ZSBmb3VuZCBtb3JlIGV2aWRlbmNlIGFib3V0IHdoZW4gdGhlIHRpbWUgem9uZSB3YXMgc3dpdGNoZWQgZnJvbSBVVEMrOQorIyBiYWNrIHRvIFVUQys4IGFmdGVyIFdXMi4gIEkgYmVsaWV2ZSBpdCB3YXMgb24gU2VwIDIxLCAxOTQ1LiAgSW4gYSBkb2N1bWVudAorIyBkdXJpbmcgSmFwYW5lc2UgZXJhIFsxXSBpbiB3aGljaCB0aGUgb2ZmaWNlciB0b2xkIHRoZSBzdGFmZiB0byBjaGFuZ2UgdGltZQorIyB6b25lIGJhY2sgdG8gV2VzdGVybiBTdGFuZGFyZCBUaW1lIChVVEMrOCkgb24gU2VwIDIxLiAgQW5kIGluIGFub3RoZXIKKyMgaGlzdG9yeSBwYWdlIG9mIE5hdGlvbmFsIENoZW5nIEt1bmcgVW5pdmVyc2l0eSBbMl0sIG9uIFNlcCAyMSB0aGVyZSBpcyBhCisjIG5vdGUgImZyb20gdG9kYXksIHN3aXRjaCBiYWNrIHRvIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSIuICBGcm9tIHRoZXNlIHR3bworIyBtYXRlcmlhbHMsIEkgYmVsaWV2ZSB0aGF0IHRoZSB0aW1lIHpvbmUgY2hhbmdlIGhhcHBlbmVkIG9uIFNlcCAyMS4gIEFuZAorIyB0b2RheSBJIGhhdmUgZm91bmQgYW5vdGhlciBtb250aGx5IGpvdXJuYWwgY2FsbGVkICJUaGUgQXN0cm9ub21pY2FsIEhlcmFsZCIKKyMgZnJvbSBUaGUgQXN0cm9ub21pY2FsIFNvY2lldHkgb2YgSmFwYW4gWzNdIGluIHdoaWNoIGl0IG1lbnRpb25lZCB0aGUgZmFjdAorIyB0aGF0OgorIworIyAxLiBTdGFuZGFyZCBUaW1lIG9mIHRoZSBDb3VudHJ5IChKYXBhbikgd2FzIGFkb3B0ZWQgb24gSmFuIDEsIDE4ODgsIHVzaW5nCisjIHRoZSB0aW1lIGF0IDEzNUUgKEdNVCs5KQorIworIyAyLiBTdGFuZGFyZCBUaW1lIG9mIHRoZSBDb3VudHJ5IHdhcyByZW5hbWVkIHRvIENlbnRyYWwgU3RhbmRhcmQgVGltZSwgb24gSmFuCisjIDEsIDE4OTgsIGFuZCBvbiB0aGUgc2FtZSBkYXksIHRoZSBuZXcgdGVycml0b3JpZXMgVGFpd2FuIGFuZCBQZW5naHUgaXNsYW5kcywKKyMgYXMgd2VsbCBhcyBZYWV5YW1hIGFuZCBNaXlha28gaXNsYW5kcywgYWRvcHRlZCBhIG5ldyB0aW1lIHpvbmUgY2FsbGVkCisjIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSwgd2hpY2ggaXMgaW4gR01UKzguCisjCisjIDMuIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSB3YXMgZGVwcmVjYXRlZCBvbiBTZXAgMzAsIDE5MzcuIEZyb20gdGhlbiBhbGwgdGhlCisjIHRlcnJpdG9yaWVzIG9mIEphcGFuIGFkb3B0ZWQgdGhlIHNhbWUgdGltZSB6b25lLCB3aGljaCBpcyBDZW50cmFsIFN0YW5kYXJkCisjIFRpbWUuCisjCisjIFsxXSBBY2FkZW1pY2EgSGlzdG9yaWNhLCBUYWl3YW46CisjIGh0dHA6Ly8xNjMuMjkuMjA4LjIyOjgwODAvZ292c2FsZVNob3dJbWFnZS9jb25uZWN0X2ltZy5waHA/cz0wMDEwMTczODkwMDA5MDAzNiZlPTAwMTAxNzM4OTAwMDkwMDM3CisjIFsyXSBOYXQnbCBDaGVuZyBLdW5nIFVuaXZlcnNpdHkgNzB0aCBBbm5pdmVyc2FyeSBTcGVjaWFsIFNpdGU6CisjIGh0dHA6Ly93d3cubmNrdS5lZHUudHcvfm5ja3U3MC9tZW51LzAwMS8wMV8wMS5odG0KKyMgWzNdIFl1a2lvIE5paW1pLCBUaGUgU3RhbmRhcmQgVGltZSBpbiBKYXBhbiAoMTk5NyksIHAuNDc1OgorIyBodHRwOi8vd3d3LmFzai5vci5qcC9nZXBwb3UvYXJjaGl2ZV9vcGVuLzE5OTcvcGRmLzE5OTcxMDAxYy5wZGYKKworIyBZdS1DaGVuZyBDaHVhbmcgKDIwMTQtMDctMDMpOgorIyBJIGZpbmFsbHkgaGF2ZSBmb3VuZCB0aGUgcmVhbCBvZmZpY2lhbCBnYXpldHRlIGFib3V0IGNoYW5naW5nIGJhY2sgdG8KKyMgV2VzdGVybiBTdGFuZGFyZCBUaW1lIG9uIFNlcCAyMSBpbiBUYWl3YW4uICBJdCdzIFRhaXdhbiBHb3Zlcm5vci1HZW5lcmFsCisjIEJ1bGxldGluIE5vLiAzODYgaW4gU2hvd2EgMjAgeWVhcnMgKDE5NDUpLCBwdWJsaXNoZWQgb24gU2VwIDE5LCAxOTQ1LiBbMV0gLi4uCisjIFtJdF0gYWJvbGlzaGVzIEJ1bGxldGluIE5vLiAyMDcgaW4gU2hvd2EgMTIgeWVhcnMgKDE5MzcpLCB3aGljaCBpcyBhIGxvY2FsCisjIGJ1bGxldGluIGluIFRhaXdhbiBmb3IgdGhhdCBPcmRpbmFuY2UgTm8uIDUyOS4gSXQgYWxzbyBtZW50aW9uZWQgdGhhdCAxYW0gb24KKyMgU2VwIDIxLCAxOTQ1IHdpbGwgYmUgMTJhbSBvbiBTZXAgMjEuICBJIHRoaW5rIHRoaXMgYnVsbGV0aW4gaXMgbXVjaCBtb3JlCisjIG9mZmljaWFsIHRoYW4gdGhlIG9uZSBJIG1lbnRpb25lZCBpbiBteSBmaXJzdCBtYWlsLCBiZWNhdXNlIGl0J3MgZnJvbSB0aGUKKyMgdG9wLWxldmVsIGdvdmVybm1lbnQgaW4gVGFpd2FuLiBJZiB5b3UncmUgZ29pbmcgdG8gcXVvdGUgYW55IHJlc291cmNlLCB0aGlzCisjIHdvdWxkIGJlIGEgZ29vZCBvbmUuCisjIFsxXSBUYWl3YW4gR292ZXJub3ItR2VuZXJhbCBHYXpldHRlLCBOby4gMTAxOCwgU2VwIDE5LCAxOTQ1OgorIyBodHRwOi8vZGIyLnRoLmdvdi50dy9kYjIvdmlldy92aWV3SW1nLnBocD9pbWdjb2RlPTAwNzIwMzEwMThhJm51bT0xOSZiZ249MDE5JmVuZD0wMTkmb3RoZXJJbWc9JnR5cGU9Z2VuZXIKKworIyBGcm9tIFl1LUNoZW5nIENodWFuZyAoMjAxNC0wNy0wMik6CisjIEluIDE5NDYsIERTVCBpbiBUYWl3YW4gd2FzIGZyb20gTWF5IDE1IGFuZCBlbmRlZCBvbiBTZXAgMzAuIFRoZSBpbmZvIGZyb20KKyMgQ2VudHJhbCBXZWF0aGVyIEJ1cmVhdSB3ZWJzaXRlIHdhcyBub3QgY29ycmVjdC4KKyMKKyMgT3JpZ2luYWwgQnVsbGV0aW46CisjIGh0dHA6Ly9zdWJ0cGcudHBnLmdvdi50dy9vZy9pbWFnZTIuYXNwP2Y9MDM1MDJGMEFLTTFBRgorIyBodHRwOi8vc3VidHBnLnRwZy5nb3YudHcvb2cvaW1hZ2UyLmFzcD9mPTAzNTAzMDBBS00xQjAgKGNvbnQuKQorIworIyBJbiAxOTQ3LCBEU1QgaW4gVGFpd2FuIHdhcyBleHBhbmRlZCB0byBPY3QgMzEuIFRoZXJlIGlzIGEgYmFja3VwIG9mIHRoYXQKKyMgdGVsZWdyYW0gYW5ub3VuY2VtZW50IGZyb20gVGFpd2FuIFByb3ZpbmNlIEdvdmVybm1lbnQ6CisjCisjIGh0dHA6Ly9zdWJ0cGcudHBnLmdvdi50dy9vZy9pbWFnZTIuYXNwP2Y9MDM2MDMxMEFLWjQzMQorIworIyBIZXJlIGlzIGEgYnJpZWYgdHJhbnNsYXRpb246CisjCisjICAgVGhlIFN1bW1lciBUaW1lIHRoaXMgeWVhciBpcyBhZG9wdGVkIGZyb20gbWlkbmlnaHQgQXByIDE1IHVudGlsIFNlcCAyMAorIyAgIG1pZG5pZ2h0LiBUbyBzYXZlIChlbmVyZ3k/KSBjb25zdW1wdGlvbiwgd2UncmUgZXhwYW5kaW5nIFN1bW1lciBUaW1lCisjICAgYWRvcHRpb24gdGlsbCBPY3QgMzEgbWlkbmlnaHQuCisjCisjIFRoZSBDZW50cmFsIFdlYXRoZXIgQnVyZWF1IHdlYnNpdGUgZGlkbid0IG1lbnRpb24gdGhhdCwgaG93ZXZlciBpdCBjYW4KKyMgYmUgZm91bmQgZnJvbSBoaXN0b3JpY2FsIGdvdmVybm1lbnQgYW5ub3VuY2VtZW50IGRhdGFiYXNlLgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMDMpOgorIyBBcyBwZXIgWXUtQ2hlbmcgQ2h1YW5nLCBzYXkgdGhhdCBUYWl3YW4gd2FzIGF0IFVUKzkgZnJvbSAxOTM3LTEwLTAxCisjIHVudGlsIDE5NDUtMDktMjEgYXQgMDE6MDAsIG92ZXJyaWRpbmcgU2hhbmtzICYgUG90dGVuZ2VyLgorIyBMaWtld2lzZSwgdXNlIFl1LUNoZW5nIENodWFuZydzIGRhdGEgZm9yIERTVCBpbiBUYWl3YW4uCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVRhaXdhbgkxOTQ1CTE5NTEJLQlNYXkJMQkwOjAwCTE6MDAJRAotUnVsZQlUYWl3YW4JMTk0NQkxOTUxCS0JT2N0CTEJMDowMAkwCVMKK1J1bGUJVGFpd2FuCTE5NDYJb25seQktCU1heQkxNQkwOjAwCTE6MDAJRAorUnVsZQlUYWl3YW4JMTk0Nglvbmx5CS0JT2N0CTEJMDowMAkwCVMKK1J1bGUJVGFpd2FuCTE5NDcJb25seQktCUFwcgkxNQkwOjAwCTE6MDAJRAorUnVsZQlUYWl3YW4JMTk0Nwlvbmx5CS0JTm92CTEJMDowMAkwCVMKK1J1bGUJVGFpd2FuCTE5NDgJMTk1MQktCU1heQkxCTA6MDAJMTowMAlECitSdWxlCVRhaXdhbgkxOTQ4CTE5NTEJLQlPY3QJMQkwOjAwCTAJUwogUnVsZQlUYWl3YW4JMTk1Mglvbmx5CS0JTWFyCTEJMDowMAkxOjAwCUQKIFJ1bGUJVGFpd2FuCTE5NTIJMTk1NAktCU5vdgkxCTA6MDAJMAlTCiBSdWxlCVRhaXdhbgkxOTUzCTE5NTkJLQlBcHIJMQkwOjAwCTE6MDAJRApAQCAtNjQ4LDExICs3NjIsMTQgQEAKIFJ1bGUJVGFpd2FuCTE5NjAJMTk2MQktCUp1bgkxCTA6MDAJMTowMAlECiBSdWxlCVRhaXdhbgkxOTc0CTE5NzUJLQlBcHIJMQkwOjAwCTE6MDAJRAogUnVsZQlUYWl3YW4JMTk3NAkxOTc1CS0JT2N0CTEJMDowMAkwCVMKLVJ1bGUJVGFpd2FuCTE5NzkJb25seQktCUp1bgkzMAkwOjAwCTE6MDAJRAotUnVsZQlUYWl3YW4JMTk3OQlvbmx5CS0JU2VwCTMwCTA6MDAJMAlTCitSdWxlCVRhaXdhbgkxOTc5CW9ubHkJLQlKdWwJMQkwOjAwCTE6MDAJRAorUnVsZQlUYWl3YW4JMTk3OQlvbmx5CS0JT2N0CTEJMDowMAkwCVMKIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1RhaXBlaQk4OjA2OjAwIC0JTE1UCTE4OTYgIyBvciBUYWliZWkgb3IgVCdhaS1wZWkKKyMgVGFpcGVpIG9yIFRhaWJlaSBvciBUJ2FpLXBlaQorWm9uZQlBc2lhL1RhaXBlaQk4OjA2OjAwIC0JTE1UCTE4OTYgSmFuICAxCisJCQk4OjAwCS0JSldTVAkxOTM3IE9jdCAgMQorCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAyMSAgMTowMAogCQkJODowMAlUYWl3YW4JQyVzVAogCiAjIE1hY2F1IChNYWNhbywgQW9tZW4pCkBAIC02NzIsNyArNzg5LDcgQEAKIFJ1bGUJTWFjYXUJMTk3OAkxOTgwCS0JQXByCVN1bj49MTUJMDowMAkxOjAwCVMKIFJ1bGUJTWFjYXUJMTk3OAkxOTgwCS0JT2N0CVN1bj49MTUJMDowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9NYWNhdQk3OjM0OjIwIC0JTE1UCTE5MTIKK1pvbmUJQXNpYS9NYWNhdQk3OjM0OjIwIC0JTE1UCTE5MTIgSmFuICAxCiAJCQk4OjAwCU1hY2F1CU1PJXNUCTE5OTkgRGVjIDIwICMgcmV0dXJuIHRvIENoaW5hCiAJCQk4OjAwCVBSQwlDJXNUCiAKQEAgLTcyMSw3ICs4MzgsNyBAQAogIyByZXB1YmxpYyBoYXMgY2hhbmdlZCBpdHMgdGltZSB6b25lIGJhY2sgdG8gdGhhdCBvZiBNb3Njb3cuICBBcyBhIHJlc3VsdCBpdAogIyBpcyBub3cganVzdCBmb3VyIGhvdXJzIGFoZWFkIG9mIEdyZWVud2ljaCBNZWFuIFRpbWUsIHJhdGhlciB0aGFuIGZpdmUgaG91cnMKICMgYWhlYWQuICBUaGUgc3dpdGNoIHdhcyBkZWNyZWVkIGJ5IHRoZSBwcm8tV2VzdGVybiBwcmVzaWRlbnQgb2YgR2VvcmdpYSwKLSMgTWlraGFpbCBTYWFrYXNodmlsaSwgd2hvIHNhaWQgdGhlIGNoYW5nZSB3YXMgcGFydGx5IHByb21wdGVkIGJ5IHRoZSBwcm9jZXNzCisjIE1pa2hlaWwgU2Fha2FzaHZpbGksIHdobyBzYWlkIHRoZSBjaGFuZ2Ugd2FzIHBhcnRseSBwcm9tcHRlZCBieSB0aGUgcHJvY2VzcwogIyBvZiBpbnRlZ3JhdGlvbiBpbnRvIEV1cm9wZS4KIAogIyBGcm9tIFRlaW11cmF6IEFiYXNoaWR6ZSAoMjAwNS0xMS0wNyk6CkBAIC03MzQsMjkgKzg1MSwzMSBAQAogIyBJIGRvbid0IGtub3cgd2hhdCBjYW4gYmUgZG9uZSwgZXNwZWNpYWxseSBrbm93aW5nIHRoYXQgc29tZSB5ZWFycyBhZ28gb3VyCiAjIERTVCBydWxlcyB3aGVyZSBjaGFuZ2VkIFRIUkVFIFRJTUVTIGR1cmluZyBvbmUgbW9udGguCiAKKyMgTWlsbmUgMTg5OSBzYXlzIFRiaWxpc2kgKFRpZmxpcykgdGltZSB3YXMgMjo1OTowNS43LgorIyBCeWFsb2tveiAxOTE5IHNheXMgR2VvcmdpYSB3YXMgMjo1OToxMS4KKyMgR28gd2l0aCBCeWFsb2tvei4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1RiaWxpc2kJMjo1OToxNiAtCUxNVAkxODgwCi0JCQkyOjU5OjE2CS0JVEJNVAkxOTI0IE1heSAgMiAjIFRiaWxpc2kgTWVhbiBUaW1lCitab25lCUFzaWEvVGJpbGlzaQkyOjU5OjExIC0JTE1UCTE4ODAKKwkJCTI6NTk6MTEJLQlUQk1UCTE5MjQgTWF5ICAyICMgVGJpbGlzaSBNZWFuIFRpbWUKIAkJCTM6MDAJLQlUQklUCTE5NTcgTWFyICAgICMgVGJpbGlzaSBUaW1lCi0JCQk0OjAwIFJ1c3NpYUFzaWEgVEJJJXNUCTE5OTEgTWFyIDMxIDI6MDBzCisJCQk0OjAwIFJ1c3NpYUFzaWEgVEJJJXNUCTE5OTEgTWFyIDMxICAyOjAwcwogCQkJMzowMAkxOjAwCVRCSVNUCTE5OTEgQXByICA5ICMgaW5kZXBlbmRlbmNlCi0JCQkzOjAwIFJ1c3NpYUFzaWEgR0Ulc1QJMTk5MiAjIEdlb3JnaWEgVGltZQorCQkJMzowMCBSdXNzaWFBc2lhIEdFJXNUCTE5OTIgICAgICAgICMgR2VvcmdpYSBUaW1lCiAJCQkzOjAwIEUtRXVyQXNpYQlHRSVzVAkxOTk0IFNlcCBsYXN0U3VuCiAJCQk0OjAwIEUtRXVyQXNpYQlHRSVzVAkxOTk2IE9jdCBsYXN0U3VuCiAJCQk0OjAwCTE6MDAJR0VTVAkxOTk3IE1hciBsYXN0U3VuCiAJCQk0OjAwIEUtRXVyQXNpYQlHRSVzVAkyMDA0IEp1biAyNwotCQkJMzowMCBSdXNzaWFBc2lhCUdFJXNUCTIwMDUgTWFyIGxhc3RTdW4gMjowMAorCQkJMzowMCBSdXNzaWFBc2lhCUdFJXNUCTIwMDUgTWFyIGxhc3RTdW4gIDI6MDAKIAkJCTQ6MDAJLQlHRVQKIAogIyBFYXN0IFRpbW9yCiAKICMgU2VlIEluZG9uZXNpYSBmb3IgdGhlIDE5NDUgdHJhbnNpdGlvbi4KIAotIyBGcm9tIEpvYW8gQ2FycmFzY2FsYW8sIGJyb3RoZXIgb2YgdGhlIGZvcm1lciBnb3Zlcm5vciBvZiBFYXN0IFRpbW9yLCBpbgotIyA8YSBocmVmPSJodHRwOi8vZXRhbi5vcmcvZXQ5OWMvZGVjZW1iZXIvMjYtMzEvMzBFVE1BWS5odG0iPgorIyBGcm9tIEpvw6NvIENhcnJhc2NhbMOjbywgYnJvdGhlciBvZiB0aGUgZm9ybWVyIGdvdmVybm9yIG9mIEVhc3QgVGltb3IsIGluCiAjIEVhc3QgVGltb3IgbWF5IGJlIGxhdGUgZm9yIGl0cyBtaWxsZW5uaXVtCi0jIDwvYT4gKDE5OTktMTItMjYvMzEpOgorIyA8aHR0cDovL2V0YW4ub3JnL2V0OTljL2RlY2VtYmVyLzI2LTMxLzMwRVRNQVkuaHRtPiAoMTk5OS0xMi0yNi8zMSk6CiAjIFBvcnR1Z2FsIHRyaWVkIHRvIGNoYW5nZSB0aGUgdGltZSBmb3J3YXJkIGluIDE5NzQgYmVjYXVzZSB0aGUgc3VuCiAjIHJpc2VzIHRvbyBlYXJseSBidXQgdGhlIHN1Z2dlc3Rpb24gcmFpc2VkIGEgbG90IG9mIHByb2JsZW1zIHdpdGggdGhlCiAjIFRpbW9yZXNlIGFuZCBJIHN0aWxsIGRvbid0IHRoaW5rIGl0IHdvdWxkIHdvcmsgdG9kYXkgYmVjYXVzZSBpdApAQCAtNzY2LDI1ICs4ODUsMjUgQEAKICMgV2UgZG9uJ3QgaGF2ZSBhbnkgcmVjb3JkIG9mIHRoZSBhYm92ZSBhdHRlbXB0LgogIyBNb3N0IGxpa2VseSBvdXIgcmVjb3JkcyBhcmUgaW5jb21wbGV0ZSwgYnV0IHdlIGhhdmUgbm8gYmV0dGVyIGRhdGEuCiAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ocmkub3JnL25ld3Mvd29ybGQvdW5kaC9sYXN0LzAwLTA4LTE2LnVuZGguaHRtbCI+CiAjIEZyb20gTWFub2VsIGRlIEFsbWVpZGEgZSBTaWx2YSwgRGVwdXR5IFNwb2tlc21hbiBmb3IgdGhlIFVOIFNlY3JldGFyeS1HZW5lcmFsCi0jICgyMDAwLTA4LTE2KTwvYT46CisjIGh0dHA6Ly93d3cuaHJpLm9yZy9uZXdzL3dvcmxkL3VuZGgvMjAwMC8wMC0wOC0xNi51bmRoLmh0bWwKKyMgKDIwMDAtMDgtMTYpOgogIyBUaGUgQ2FiaW5ldCBvZiB0aGUgRWFzdCBUaW1vciBUcmFuc2l0aW9uIEFkbWluaXN0cmF0aW9uIGRlY2lkZWQKICMgdG9kYXkgdG8gYWR2YW5jZSBFYXN0IFRpbW9yJ3MgdGltZSBieSBvbmUgaG91ci4gIFRoZSB0aW1lIGNoYW5nZSwKICMgd2hpY2ggd2lsbCBiZSBwZXJtYW5lbnQsIHdpdGggbm8gc2Vhc29uYWwgYWRqdXN0bWVudCwgd2lsbCBoYXBwZW4gYXQKICMgbWlkbmlnaHQgb24gU2F0dXJkYXksIFNlcHRlbWJlciAxNi4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0RpbGkJODoyMjoyMCAtCUxNVAkxOTEyCitab25lCUFzaWEvRGlsaQk4OjIyOjIwIC0JTE1UCTE5MTIgSmFuICAxCiAJCQk4OjAwCS0JVExUCTE5NDIgRmViIDIxIDIzOjAwICMgRSBUaW1vciBUaW1lCiAJCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDIzCiAJCQk5OjAwCS0JVExUCTE5NzYgTWF5ICAzCi0JCQk4OjAwCS0JV0lUQQkyMDAwIFNlcCAxNyAwMDowMAorCQkJODowMAktCVdJVEEJMjAwMCBTZXAgMTcgIDA6MDAKIAkJCTk6MDAJLQlUTFQKIAogIyBJbmRpYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0tvbGthdGEJNTo1MzoyOCAtCUxNVAkxODgwCSMgS29sa2F0YQorWm9uZQlBc2lhL0tvbGthdGEJNTo1MzoyOCAtCUxNVAkxODgwICAgICAgICAjIEtvbGthdGEKIAkJCTU6NTM6MjAJLQlITVQJMTk0MSBPY3QgICAgIyBIb3dyYWggTWVhbiBUaW1lPwogCQkJNjozMAktCUJVUlQJMTk0MiBNYXkgMTUgIyBCdXJtYSBUaW1lCiAJCQk1OjMwCS0JSVNUCTE5NDIgU2VwCkBAIC03OTgsNyArOTE3LDcgQEAKICMgSW5kb25lc2lhCiAjCiAjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDUtMjgpLCBvdmVycmlkaW5nIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMgPGh0dHA6Ly93d3cuc3VtYXRlcmEtaW5jLmNvbS9nb190b19pbnZlc3QvYWJvdXRfaW5kb25lc2lhLmFzcCNzdGFuZHRpbWU+CisjIGh0dHA6Ly93d3cuc3VtYXRlcmEtaW5jLmNvbS9nb190b19pbnZlc3QvYWJvdXRfaW5kb25lc2lhLmFzcCNzdGFuZHRpbWUKICMgc2F5cyB0aGF0IEluZG9uZXNpYSdzIHRpbWUgem9uZXMgY2hhbmdlZCBvbiAxOTg4LTAxLTAxLiAgTG9va2luZyBhdCBzb21lCiAjIHRpbWUgem9uZSBtYXBzLCBJIHRoaW5rIHRoYXQgbXVzdCByZWZlciB0byBXZXN0ZXJuIEJvcm5lbyAoS2FsaW1hbnRhbiBCYXJhdAogIyBhbmQgS2FsaW1hbnRhbiBUZW5nYWgpIHN3aXRjaGluZyBmcm9tIFVUQys4IHRvIFVUQys3LgpAQCAtODEwLDcgKzkyOSw3IEBACiAjIG90aGVyIGZvcm1hbCBzdXJyZW5kZXIgY2VyZW1vbmllcyB3ZXJlIFNlcHRlbWJlciA5LCAxMSwgYW5kIDEzLCBwbHVzCiAjIFNlcHRlbWJlciAxMiBmb3IgdGhlIHJlZ2lvbmFsIHN1cnJlbmRlciB0byBNb3VudGJhdHRlbiBpbiBTaW5nYXBvcmUuCiAjIFRoZXNlIHdvdWxkIGJlIHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lcyBmb3IgYSBjaGFuZ2UuCi0jIFJlZ2ltZXMgaG9yYWlyZXMgcG91ciBsZSBtb25kZSBlbnRpZXIsIGJ5IEhlbnJpIExlIENvcnJlLCAoRWRpdGlvbnMKKyMgUsOpZ2ltZXMgaG9yYWlyZXMgcG91ciBsZSBtb25kZSBlbnRpZXIsIGJ5IEhlbnJpIExlIENvcnJlLCAow4lkaXRpb25zCiAjIFRyYWRpdGlvbm5lbGxlcywgMTk4NywgUGFyaXMpIHNheXMgdGhhdCBKYXZhIGFuZCBNYWR1cmEgc3dpdGNoZWQKICMgZnJvbSBKU1QgdG8gVVRDKzA3OjMwIG9uIDE5NDUtMDktMjMsIGFuZCBnaXZlcyAxOTQ0LTA5LTAxIGZvciBKYXlhcHVyYQogIyAoSG9sbGFuZGlhKS4gIEZvciBub3csIGFzc3VtZSBhbGwgSW5kb25lc2lhbiBsb2NhdGlvbnMgb3RoZXIgdGhhbiBKYXlhcHVyYQpAQCAtODM1LDcgKzk1NCw3IEBACiAjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIG5leHQgdHJhbnNpdGlvbiB3YXMgYXQgMTkyNCBKYW4gMSAwOjEzLAogIyBidXQgdGhpcyBtdXN0IGJlIGEgdHlwby4KIAkJCTc6MDc6MTIJLQlCTVQJMTkyMyBEZWMgMzEgMjM6NDc6MTIgIyBCYXRhdmlhCi0JCQk3OjIwCS0JSkFWVAkxOTMyIE5vdgkgIyBKYXZhIFRpbWUKKwkJCTc6MjAJLQlKQVZUCTE5MzIgTm92ICAgICMgSmF2YSBUaW1lCiAJCQk3OjMwCS0JV0lCCTE5NDIgTWFyIDIzCiAJCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDIzCiAJCQk3OjMwCS0JV0lCCTE5NDggTWF5CkBAIC04NjEsNyArOTgwLDcgQEAKICMgTWFsdWt1IElzbGFuZHMsIFdlc3QgUGFwdWEsIFBhcHVhCiBab25lIEFzaWEvSmF5YXB1cmEJOToyMjo0OCAtCUxNVAkxOTMyIE5vdgogCQkJOTowMAktCVdJVAkxOTQ0IFNlcCAgMQotCQkJOTozMAktCUNTVAkxOTY0CisJCQk5OjMwCS0JQUNTVAkxOTY0CiAJCQk5OjAwCS0JV0lUCiAKICMgSXJhbgpAQCAtOTI3LDcgKzEwNDYsNyBAQAogIyBTZXZlcmFsIG9mIG15IHVzZXJzIGhhdmUgcmVwb3J0ZWQgdGhhdCBJcmFuIHdpbGwgbm90IG9ic2VydmUgRFNUIGFueW1vcmU6CiAjIGh0dHA6Ly93d3cuaXJuYS5pci9lbi9uZXdzL3ZpZXcvbGluZS0xNy8wNjAzMTkzODEyMTY0OTQ4Lmh0bQogIwotIyBGcm9tIFJldXRlcnMgKDIwMDctMDktMTYpLCB3aXRoIGEgaGVhZHMtdXAgZnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW46CisjIEZyb20gUmV1dGVycyAoMjAwNy0wOS0xNiksIHdpdGggYSBoZWFkcy11cCBmcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW46CiAjIC4uLiB0aGUgR3VhcmRpYW4gQ291bmNpbCAuLi4gYXBwcm92ZWQgYSBsYXcgb24gU3VuZGF5IHRvIHJlLWludHJvZHVjZQogIyBkYXlsaWdodCBzYXZpbmcgdGltZSAuLi4KICMgaHR0cDovL3VrLnJldXRlcnMuY29tL2FydGljbGUvb2lsUnB0L2lkVUtCTEE2NTA0ODQyMDA3MDkxNgpAQCAtOTkzLDcgKzExMTIsNyBAQAogUnVsZQlJcmFuCTIwMzYJMjAzNwktCVNlcAkyMQkwOjAwCTAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL1RlaHJhbgkzOjI1OjQ0CS0JTE1UCTE5MTYKLQkJCTM6MjU6NDQJLQlUTVQJMTk0NgkjIFRlaHJhbiBNZWFuIFRpbWUKKwkJCTM6MjU6NDQJLQlUTVQJMTk0NiAgICAgIyBUZWhyYW4gTWVhbiBUaW1lCiAJCQkzOjMwCS0JSVJTVAkxOTc3IE5vdgogCQkJNDowMAlJcmFuCUlSJXNUCTE5NzkKIAkJCTM6MzAJSXJhbglJUiVzVApAQCAtMTAxOCwxNyArMTEzNywxMSBAQAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wMy0xMCk6CiAjIFRoZSBjYWJpbmV0IGluIElyYXEgYWJvbGlzaGVkIERTVCBsYXN0IHdlZWssIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCiAjIG5ld3Mgc291cmNlcyAoaW4gQXJhYmljKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbGplZXJhbi5uZXQvd2VzaW1hX2FydGljbGVzL25ld3MtMjAwODAzMDUtOTg2MDIuaHRtbCI+CiAjIGh0dHA6Ly93d3cuYWxqZWVyYW4ubmV0L3dlc2ltYV9hcnRpY2xlcy9uZXdzLTIwMDgwMzA1LTk4NjAyLmh0bWwKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzd2F0YWxpcmFxLmluZm8vbG9vay9hcnRpY2xlLnRwbD9pZD0yMDQ3JklkTGFuZ3VhZ2U9MTcmSWRQdWJsaWNhdGlvbj00Jk5yQXJ0aWNsZT03MTc0MyZOcklzc3VlPTEmTnJTZWN0aW9uPTEwIj4KICMgaHR0cDovL3d3dy5hc3dhdGFsaXJhcS5pbmZvL2xvb2svYXJ0aWNsZS50cGw/aWQ9MjA0NyZJZExhbmd1YWdlPTE3JklkUHVibGljYXRpb249NCZOckFydGljbGU9NzE3NDMmTnJJc3N1ZT0xJk5yU2VjdGlvbj0xMAotIyA8L2E+CiAjCiAjIFdlIGhhdmUgcHVibGlzaGVkIGEgc2hvcnQgYXJ0aWNsZSBpbiBFbmdsaXNoIGFib3V0IHRoZSBjaGFuZ2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9pcmFxLWR1bXBzLWRheWxpZ2h0LXNhdmluZy5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2lyYXEtZHVtcHMtZGF5bGlnaHQtc2F2aW5nLmh0bWwKLSMgPC9hPgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlJcmFxCTE5ODIJb25seQktCU1heQkxCTA6MDAJMTowMAlECkBAIC0xMDM3LDE0ICsxMTUwLDE0IEBACiBSdWxlCUlyYXEJMTk4NAkxOTg1CS0JQXByCTEJMDowMAkxOjAwCUQKIFJ1bGUJSXJhcQkxOTg1CTE5OTAJLQlTZXAJbGFzdFN1bgkxOjAwcwkwCVMKIFJ1bGUJSXJhcQkxOTg2CTE5OTAJLQlNYXIJbGFzdFN1bgkxOjAwcwkxOjAwCUQKLSMgSUFUQSBTU0lNICgxOTkxLzE5OTYpIHNheXMgQXByIDEgMTI6MDFhbSBVVEM7IGd1ZXNzIHRoZSBgOjAxJyBpcyBhIHR5cG8uCisjIElBVEEgU1NJTSAoMTk5MS8xOTk2KSBzYXlzIEFwciAxIDEyOjAxYW0gVVRDOyBndWVzcyB0aGUgJzowMScgaXMgYSB0eXBvLgogIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IElyYXEgZGlkIG5vdCBvYnNlcnZlIERTVCAxOTkyLzE5OTc7IGlnbm9yZSB0aGlzLgogIwogUnVsZQlJcmFxCTE5OTEJMjAwNwktCUFwcgkgMQkzOjAwcwkxOjAwCUQKIFJ1bGUJSXJhcQkxOTkxCTIwMDcJLQlPY3QJIDEJMzowMHMJMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvQmFnaGRhZAkyOjU3OjQwCS0JTE1UCTE4OTAKLQkJCTI6NTc6MzYJLQlCTVQJMTkxOAkgICAgIyBCYWdoZGFkIE1lYW4gVGltZT8KKwkJCTI6NTc6MzYJLQlCTVQJMTkxOCAgICAgIyBCYWdoZGFkIE1lYW4gVGltZT8KIAkJCTM6MDAJLQlBU1QJMTk4MiBNYXkKIAkJCTM6MDAJSXJhcQlBJXNUCiAKQEAgLTEyNzIsNyArMTM4NSw3IEBACiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9KZXJ1c2FsZW0JMjoyMDo1NCAtCUxNVAkxODgwCi0JCQkyOjIwOjQwCS0JSk1UCTE5MTgJIyBKZXJ1c2FsZW0gTWVhbiBUaW1lPworCQkJMjoyMDo0MAktCUpNVAkxOTE4ICMgSmVydXNhbGVtIE1lYW4gVGltZT8KIAkJCTI6MDAJWmlvbglJJXNUCiAKIApAQCAtMTI4MSwxNSArMTM5NCwxNSBAQAogCiAjIEphcGFuCiAKLSMgYDk6MDAnIGFuZCBgSlNUJyBpcyBmcm9tIEd1eSBIYXJyaXMuCisjICc5OjAwJyBhbmQgJ0pTVCcgaXMgZnJvbSBHdXkgSGFycmlzLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTUtMDMtMDYpOgogIyBUb2RheSdzIF9Bc2FoaSBFdmVuaW5nIE5ld3NfIChwYWdlIDQpIHJlcG9ydHMgdGhhdCBKYXBhbiBoYWQKLSMgZGF5bGlnaHQgc2F2aW5nIGJldHdlZW4gMTk0OCBhbmQgMTk1MSwgYnV0IGBgdGhlIHN5c3RlbSB3YXMgZGlzY29udGludWVkCi0jIGJlY2F1c2UgdGhlIHB1YmxpYyBiZWxpZXZlZCBpdCB3b3VsZCBsZWFkIHRvIGxvbmdlciB3b3JraW5nIGhvdXJzLicnCisjIGRheWxpZ2h0IHNhdmluZyBiZXR3ZWVuIDE5NDggYW5kIDE5NTEsIGJ1dCAidGhlIHN5c3RlbSB3YXMgZGlzY29udGludWVkCisjIGJlY2F1c2UgdGhlIHB1YmxpYyBiZWxpZXZlZCBpdCB3b3VsZCBsZWFkIHRvIGxvbmdlciB3b3JraW5nIGhvdXJzLiIKIAotIyBGcm9tIE1heXVtaSBOZWdpc2hpIGluIHRoZSAyMDA1LTA4LTEwIEphcGFuIFRpbWVzCi0jIDxodHRwOi8vd3d3LmphcGFudGltZXMuY28uanAvY2dpLWJpbi9nZXRhcnRpY2xlLnBsNT9ubjIwMDUwODEwZjIuaHRtPjoKKyMgRnJvbSBNYXl1bWkgTmVnaXNoaSBpbiB0aGUgMjAwNS0wOC0xMCBKYXBhbiBUaW1lczoKKyMgaHR0cDovL3d3dy5qYXBhbnRpbWVzLmNvLmpwL2NnaS1iaW4vZ2V0YXJ0aWNsZS5wbDU/bm4yMDA1MDgxMGYyLmh0bQogIyBPY2N1cGF0aW9uIGF1dGhvcml0aWVzIGltcG9zZWQgZGF5bGlnaHQtc2F2aW5nIHRpbWUgb24gSmFwYW4gb24KICMgWzE5NDgtMDUtMDFdLi4uLiAgQnV0IGxhY2sgb2YgcHJpb3IgZGViYXRlIGFuZCB0aGUgZXhlY3V0aW9uIG9mCiAjIGRheWxpZ2h0LXNhdmluZyB0aW1lIGp1c3QgdGhyZWUgZGF5cyBhZnRlciB0aGUgYmlsbCB3YXMgcGFzc2VkIGdlbmVyYXRlZApAQCAtMTMxMyw3ICsxNDI2LDggQEAKIAogIyBGcm9tIEhpZGV5dWtpIFN1enVraSAoMTk5OC0xMS0wOSk6CiAjICdUb2t5bycgdXN1YWxseSBzdGFuZHMgZm9yIHRoZSBmb3JtZXIgbG9jYXRpb24gb2YgVG9reW8gQXN0cm9ub21pY2FsCi0jIE9ic2VydmF0b3J5OiBFIDEzOSA0NCcgNDAiLjkwICg5aCAxOG0gNThzLjcyNyksIE4gMzUgMzknIDE2Ii4wLgorIyBPYnNlcnZhdG9yeTogMTM5IGRlZ3JlZXMgNDQnIDQwLjkwIiBFICg5aCAxOG0gNTguNzI3cyksCisjIDM1IGRlZ3JlZXMgMzknIDE2LjAiIE4uCiAjIFRoaXMgZGF0YSBpcyBmcm9tICdSaWthIE5lbnB5b3UgKENocm9ub2xvZ2ljYWwgU2NpZW50aWZpYyBUYWJsZXMpIDE5OTYnCiAjIGVkaXRlZCBieSBOYXRpb25hbCBBc3Ryb25vbWljYWwgT2JzZXJ2YXRvcnkgb2YgSmFwYW4uLi4uCiAjIEpTVCAoSmFwYW4gU3RhbmRhcmQgVGltZSkgaGFzIGJlZW4gdXNlZCBzaW5jZSAxODg4LTAxLTAxIDAwOjAwIChKU1QpLgpAQCAtMTMyMSwxMCArMTQzNSwxMCBAQAogCiAjIEZyb20gSGlkZXl1a2kgU3V6dWtpICgxOTk4LTExLTE2KToKICMgVGhlIG9yZGluYW5jZSBOby4gNTEgKDE4ODYpIGVzdGFibGlzaGVkICJzdGFuZGFyZCB0aW1lIiBpbiBKYXBhbiwKLSMgd2hpY2ggc3RhbmRzIGZvciB0aGUgdGltZSBvbiBFIDEzNSBkZWdyZWUuCisjIHdoaWNoIHN0YW5kcyBmb3IgdGhlIHRpbWUgb24gMTM1IGRlZ3JlZXMgRS4KICMgSW4gdGhlIG9yZGluYW5jZSBOby4gMTY3ICgxODk1KSwgInN0YW5kYXJkIHRpbWUiIHdhcyByZW5hbWVkIHRvICJjZW50cmFsCiAjIHN0YW5kYXJkIHRpbWUiLiAgQW5kIHRoZSBzYW1lIG9yZGluYW5jZSBhbHNvIGVzdGFibGlzaGVkICJ3ZXN0ZXJuIHN0YW5kYXJkCi0jIHRpbWUiLCB3aGljaCBzdGFuZHMgZm9yIHRoZSB0aW1lIG9uIEUgMTIwIGRlZ3JlZS4uLi4gIEJ1dCAid2VzdGVybiBzdGFuZGFyZAorIyB0aW1lIiwgd2hpY2ggc3RhbmRzIGZvciB0aGUgdGltZSBvbiAxMjAgZGVncmVlcyBFLi4uLiAgQnV0ICJ3ZXN0ZXJuIHN0YW5kYXJkCiAjIHRpbWUiIHdhcyBhYm9saXNoZWQgaW4gdGhlIG9yZGluYW5jZSBOby4gNTI5ICgxOTM3KS4gIEluIHRoZSBvcmRpbmFuY2UgTm8uCiAjIDE2NywgdGhlcmUgaXMgbm8gbWVudGlvbiByZWdhcmRpbmcgZm9yIHdoYXQgcGxhY2Ugd2VzdGVybiBzdGFuZGFyZCB0aW1lIGlzCiAjIHN0YW5kYXJkLi4uLgpAQCAtMTMzMiwyNyArMTQ0NiwzMyBAQAogIyBJIHdyb3RlICJvcmRpbmFuY2UiIGFib3ZlLCBidXQgSSBkb24ndCBrbm93IGhvdyB0byB0cmFuc2xhdGUuCiAjIEluIEphcGFuZXNlIGl0J3MgImNob2t1cmVpIiwgd2hpY2ggbWVhbnMgb3JkaW5hbmNlIGZyb20gZW1wZXJvci4KIAotIyBTaGFua3MgJiBQb3R0ZW5nZXIgY2xhaW0gSlNUIGluIHVzZSBzaW5jZSAxODk2LCBhbmQgdGhhdCBhIGZldwotIyBwbGFjZXMgKGUuZy4gSXNoaWdha2kpIHVzZSArMDgwMDsgZ28gd2l0aCBTdXp1a2kuICBHdWVzcyB0aGF0IGFsbAotIyBvcmRpbmFuY2VzIHRvb2sgZWZmZWN0IG9uIEphbiAxLgorIyBGcm9tIFl1LUNoZW5nIENodWFuZyAoMjAxMy0wNy0xMik6CisjIC4uLnRoZSBNZWlqaSBFbXBlcm9yIGFubm91bmNlZCBPcmRpbmFuY2UgTm8uIDE2NyBvZiBNZWlqaSBZZWFyIDI4ICJUaGUgY2xhdXNlCisjIGFib3V0IHN0YW5kYXJkIHRpbWUiIC4uLiBUaGUgYWRvcHRpb24gYmVnYW4gZnJvbSBKYW4gMSwgMTg5Ni4KKyMgaHR0cDovL2phLndpa2lzb3VyY2Uub3JnL3dpa2kv5qiZ5rqW5pmC44OL6Zec44K544Or5Lu2XyjlhazluIPmmYIpCisjCisjIC4uLnRoZSBTaG93YSBFbXBlcm9yIGFubm91bmNlZCBPcmRpbmFuY2UgTm8uIDUyOSBvZiBTaG93YSBZZWFyIDEyIC4uLiB3aGljaAorIyBtZWFucyB0aGUgd2hvbGUgSmFwYW4gdGVycml0b3J5LCBpbmNsdWRpbmcgbGF0ZXIgb2NjdXBhdGlvbnMsIGFkb3B0IEphcGFuCisjIENlbnRyYWwgVGltZSAoVVRDKzkpLiBUaGUgYWRvcHRpb24gYmVnYW4gb24gT2N0IDEsIDE5MzcuCisjIGh0dHA6Ly9qYS53aWtpc291cmNlLm9yZy93aWtpL+aYjuayu+S6jOWNgeWFq+W5tOWLheS7pOesrOeZvuWFreWNgeS4g+iZn+aomea6luaZguODi+mXnOOCueODq+S7tuS4reaUueato+ODjuS7tgogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvVG9reW8JOToxODo1OQktCUxNVAkxODg3IERlYyAzMSAxNTowMHUKLQkJCTk6MDAJLQlKU1QJMTg5NgotCQkJOTowMAktCUNKVAkxOTM4CisJCQk5OjAwCS0JSlNUCTE4OTYgSmFuICAxCisJCQk5OjAwCS0JSkNTVAkxOTM3IE9jdCAgMQogCQkJOTowMAlKYXBhbglKJXNUCiAjIFNpbmNlIDE5MzgsIGFsbCBKYXBhbmVzZSBwb3NzZXNzaW9ucyBoYXZlIGJlZW4gbGlrZSBBc2lhL1Rva3lvLgogCiAjIEpvcmRhbgogIwotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly9zdGFyLmFyYWJpYS5jb20vOTkwNzAxL0pPOS5odG1sIj4KLSMgSm9yZGFuIFdlZWsgKDE5OTktMDctMDEpIDwvYT4gdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0wOS0wOSk6CisjIEZyb20gPGh0dHA6Ly9zdGFyLmFyYWJpYS5jb20vOTkwNzAxL0pPOS5odG1sPgorIyBKb3JkYW4gV2VlayAoMTk5OS0wNy0wMSkgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0wOS0wOSk6CiAjIENsb2NrcyBpbiBKb3JkYW4gd2VyZSBmb3J3YXJkZWQgb25lIGhvdXIgb24gV2VkbmVzZGF5IGF0IG1pZG5pZ2h0LAogIyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGdvdmVybm1lbnQncyBkZWNpc2lvbiB0byBpbXBsZW1lbnQgc3VtbWVyIHRpbWUKICMgYWxsIHllYXIgcm91bmQuCiAjCi0jIEZyb20gPGEgaHJlZj0iaHR0cDovL3N0YXIuYXJhYmlhLmNvbS85OTA5MzAvSk85Lmh0bWwiPgotIyBKb3JkYW4gV2VlayAoMTk5OS0wOS0zMCkgPC9hPiB2aWEgU3RlZmZlbiBUaG9yc2VuICgxOTk5LTExLTA5KToKKyMgRnJvbSA8aHR0cDovL3N0YXIuYXJhYmlhLmNvbS85OTA5MzAvSk85Lmh0bWw+CisjIEpvcmRhbiBXZWVrICgxOTk5LTA5LTMwKSB2aWEgU3RlZmZlbiBUaG9yc2VuICgxOTk5LTExLTA5KToKICMgV2ludGVyIHRpbWUgc3RhcnRzIHRvZGF5IFRodXJzZGF5LCAzMCBTZXB0ZW1iZXIuIENsb2NrcyB3aWxsIGJlIHR1cm5lZCBiYWNrCiAjIGJ5IG9uZSBob3VyLiAgVGhpcyBpcyB0aGUgbGF0ZXN0IGdvdmVybm1lbnQgZGVjaXNpb24gYW5kIGl0J3MgZmluYWwhCiAjIFRoZSBkZWNpc2lvbiB3YXMgdGFrZW4gYmVjYXVzZSBvZiB0aGUgaW5jcmVhc2UgaW4gd29ya2luZyBob3VycyBpbgpAQCAtMTM3Miw5ICsxNDkyLDcgQEAKIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wNC0wMik6CiAjIFRoaXMgc2luZ2xlIG9uZSBtaWdodCBiZSBnb29kIGVub3VnaCwgKDIwMDktMDMtMjQsIEFyYWJpYyk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9wZXRyYS5nb3Yuam8vQXJ0aWNhbC5hc3B4P0xuZz0yJlNlY3Rpb249OCZBcnRpY2FsPTk1Mjc5Ij4KICMgaHR0cDovL3BldHJhLmdvdi5qby9BcnRpY2FsLmFzcHg/TG5nPTImU2VjdGlvbj04JkFydGljYWw9OTUyNzkKLSMgPC9hPgogIwogIyBHb29nbGUncyB0cmFuc2xhdGlvbjoKICMKQEAgLTE0NjUsOSArMTU4Myw4IEBACiAjIC0gUXl6eWxvcmRhIHN3aXRjaGVkIGZyb20gKzU6MDAgdG8gKzY6MDAgb24gMTk5Mi0wMS0xOSAwMjowMC4KICMgLSBPcmFsIHN3aXRjaGVkIGZyb20gKzU6MDAgdG8gKzQ6MDAgaW4gc3ByaW5nIDE5ODkuCiAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5rYXpzb2NpZXR5Lm9yZy51ay9uZXdzLzIwMDUvMDMvMzAuaHRtIj4KLSMgRnJvbSBLYXpha2hzdGFuIEVtYmFzc3kncyBOZXdzIEJ1bGxldGluICMxMSAoMjAwNS0wMy0yMSk6Ci0jIDwvYT4KKyMgRnJvbSBLYXpha2hzdGFuIEVtYmFzc3kncyBOZXdzIEJ1bGxldGluICMxMQorIyA8aHR0cDovL3d3dy5rYXpzb2NpZXR5Lm9yZy51ay9uZXdzLzIwMDUvMDMvMzAuaHRtPiAoMjAwNS0wMy0yMSk6CiAjIFRoZSBHb3Zlcm5tZW50IG9mIEthemFraHN0YW4gcGFzc2VkIGEgcmVzb2x1dGlvbiBNYXJjaCAxNSBhYm9saXNoaW5nCiAjIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNpdGluZyBsYWNrIG9mIGVjb25vbWljIGJlbmVmaXRzIGFuZCBoZWFsdGgKICMgY29tcGxpY2F0aW9ucyBjb3VwbGVkIHdpdGggYSBkZWNyZWFzZSBpbiBwcm9kdWN0aXZpdHkuCkBAIC0xNTAwLDEwICsxNjE3LDEwIEBACiAJCQk2OjAwCS0JS0laVAkxOTgyIEFwciAgMQogCQkJNTowMCBSdXNzaWFBc2lhCUtJWiVzVAkxOTkxCiAJCQk1OjAwCS0JS0laVAkxOTkxIERlYyAxNiAjIGluZGVwZW5kZW5jZQotCQkJNTowMAktCVFZWlQJMTk5MiBKYW4gMTkgMjowMAorCQkJNTowMAktCVFZWlQJMTk5MiBKYW4gMTkgIDI6MDAKIAkJCTY6MDAgUnVzc2lhQXNpYQlRWVolc1QJMjAwNSBNYXIgMTUKIAkJCTY6MDAJLQlRWVpUCi0jIEFxdG9iZSAoYWthIEFrdG9iZSwgZm9ybWVybHkgQWt0J3ViaW5zaykKKyMgQXF0b2JlIChha2EgQWt0b2JlLCBmb3JtZXJseSBBa3R5dWJpbnNrKQogWm9uZQlBc2lhL0FxdG9iZQkzOjQ4OjQwCS0JTE1UCTE5MjQgTWF5ICAyCiAJCQk0OjAwCS0JQUtUVAkxOTMwIEp1biAyMSAjIEFrdHl1Ymluc2sgVGltZQogCQkJNTowMAktCUFLVFQJMTk4MSBBcHIgIDEKQEAgLTE1MjMsNyArMTY0MCw3IEBACiAJCQk2OjAwCS0JU0hFVAkxOTgyIEFwciAgMQogCQkJNTowMCBSdXNzaWFBc2lhCVNIRSVzVAkxOTkxCiAJCQk1OjAwCS0JU0hFVAkxOTkxIERlYyAxNiAjIGluZGVwZW5kZW5jZQotCQkJNTowMCBSdXNzaWFBc2lhCUFRVCVzVAkxOTk1IE1hciBsYXN0U3VuIDI6MDAgIyBBcXRhdSBUaW1lCisJCQk1OjAwIFJ1c3NpYUFzaWEJQVFUJXNUCTE5OTUgTWFyIGxhc3RTdW4gIDI6MDAgIyBBcXRhdSBUaW1lCiAJCQk0OjAwIFJ1c3NpYUFzaWEJQVFUJXNUCTIwMDUgTWFyIDE1CiAJCQk1OjAwCS0JQVFUVAogIyBXZXN0IEthemFraHN0YW4KQEAgLTE1MzIsNyArMTY0OSw3IEBACiAJCQk1OjAwCS0JVVJBVAkxOTgxIEFwciAgMQogCQkJNTowMAkxOjAwCVVSQVNUCTE5ODEgT2N0ICAxCiAJCQk2OjAwCS0JVVJBVAkxOTgyIEFwciAgMQotCQkJNTowMCBSdXNzaWFBc2lhCVVSQSVzVAkxOTg5IE1hciAyNiAyOjAwCisJCQk1OjAwIFJ1c3NpYUFzaWEJVVJBJXNUCTE5ODkgTWFyIDI2ICAyOjAwCiAJCQk0OjAwIFJ1c3NpYUFzaWEJVVJBJXNUCTE5OTEKIAkJCTQ6MDAJLQlVUkFUCTE5OTEgRGVjIDE2ICMgaW5kZXBlbmRlbmNlCiAJCQk0OjAwIFJ1c3NpYUFzaWEJT1JBJXNUCTIwMDUgTWFyIDE1ICMgT3JhbCBUaW1lCkBAIC0xNTQzLDcgKzE2NjAsNyBAQAogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDgtMTUpOgogIyBBY2NvcmRpbmcgdG8gYW4gYXJ0aWNsZSBkYXRlZCB0b2RheSBpbiB0aGUgS3lyZ3l6c3RhbiBEZXZlbG9wbWVudCBHYXRld2F5Ci0jIDxodHRwOi8vZW5nLmdhdGV3YXkua2cvY2dpLWJpbi9wYWdlLnBsP2lkPTEmc3RvcnlfbmFtZT1kb2M5OTc5LnNodG1sPgorIyBodHRwOi8vZW5nLmdhdGV3YXkua2cvY2dpLWJpbi9wYWdlLnBsP2lkPTEmc3RvcnlfbmFtZT1kb2M5OTc5LnNodG1sCiAjIEt5cmd5enN0YW4gaXMgY2FuY2VsaW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBzeXN0ZW0uICBJIHRha2UgdGhlIGFydGljbGUKICMgdG8gbWVhbiB0aGF0IHRoZXkgd2lsbCBsZWF2ZSB0aGVpciBjbG9ja3MgYXQgNiBob3VycyBhaGVhZCBvZiBVVEMuCiAjIEZyb20gTWFsaWsgQWJkdWdhbGlldiAoMjAwNS0wOS0yMSk6CkBAIC0xNTU4LDE3ICsxNjc1LDE3IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvQmlzaGtlawk0OjU4OjI0IC0JTE1UCTE5MjQgTWF5ICAyCiAJCQk1OjAwCS0JRlJVVAkxOTMwIEp1biAyMSAjIEZydW56ZSBUaW1lCi0JCQk2OjAwIFJ1c3NpYUFzaWEgRlJVJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQk1OjAwCTE6MDAJRlJVU1QJMTk5MSBBdWcgMzEgMjowMCAjIGluZGVwZW5kZW5jZQotCQkJNTowMAlLeXJneXoJS0clc1QJMjAwNSBBdWcgMTIgICAgIyBLeXJneXpzdGFuIFRpbWUKKwkJCTY6MDAgUnVzc2lhQXNpYSBGUlUlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQk1OjAwCTE6MDAJRlJVU1QJMTk5MSBBdWcgMzEgIDI6MDAgIyBpbmRlcGVuZGVuY2UKKwkJCTU6MDAJS3lyZ3l6CUtHJXNUCTIwMDUgQXVnIDEyICMgS3lyZ3l6c3RhbiBUaW1lCiAJCQk2OjAwCS0JS0dUCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBLb3JlYSAoTm9ydGggYW5kIFNvdXRoKQogCi0jIEZyb20gQW5uaWUgSS4gQmFuZyAoMjAwNi0wNy0xMCkgaW4KLSMgPGh0dHA6Ly93d3cua29yZWFoZXJhbGQuY28ua3IvU0lURS9kYXRhL2h0bWxfZGlyLzIwMDYvMDcvMTAvMjAwNjA3MTAwMDEyLmFzcD46CisjIEZyb20gQW5uaWUgSS4gQmFuZyAoMjAwNi0wNy0xMCk6CisjIGh0dHA6Ly93d3cua29yZWFoZXJhbGQuY28ua3IvU0lURS9kYXRhL2h0bWxfZGlyLzIwMDYvMDcvMTAvMjAwNjA3MTAwMDEyLmFzcAogIyBUaGUgTWluaXN0cnkgb2YgQ29tbWVyY2UsIEluZHVzdHJ5IGFuZCBFbmVyZ3kgaGFzIGFscmVhZHkKICMgY29tbWlzc2lvbmVkIGEgcmVzZWFyY2ggcHJvamVjdCBbdG8gcmVpbnRyb2R1Y2UgRFNUXSBhbmQgaGFzIHNhaWQKICMgdGhlIHN5c3RlbSBtYXkgYmVnaW4gYXMgZWFybHkgYXMgMjAwOC4uLi4gIEtvcmVhIHJhbiBhIGRheWxpZ2h0CkBAIC0xNTgxLDE5ICsxNjk4LDI5IEBACiBSdWxlCVJPSwkxOTg3CTE5ODgJLQlNYXkJU3VuPj04CTA6MDAJMTowMAlECiBSdWxlCVJPSwkxOTg3CTE5ODgJLQlPY3QJU3VuPj04CTA6MDAJMAlTCiAKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0wMSk6CisjIFRoZSBmb2xsb3dpbmcgZW50cmllcyBhcmUgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIsIGV4Y2VwdCB0aGF0IEkKKyMgZ3Vlc3NlZCB0aGF0IHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIHRocm91Z2ggMTk0NSBmb2xsb3dlZCB0aGUgc2FtZQorIyBydWxlcyBhcyBkaXNjdXNzZWQgdW5kZXIgVGFpd2FuLCB3aXRoIG5vbWluYWwgc3dpdGNoZXMgZnJvbSBKU1QgdG8gS1NUCisjIHdoZW4gdGhlIHJlc3BlY3RpdmUgY2l0aWVzIHdlcmUgdGFrZW4gb3ZlciBieSB0aGUgQWxsaWVzIGFmdGVyIFdXSUkuCisKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9TZW91bAk4OjI3OjUyCS0JTE1UCTE4OTAKIAkJCTg6MzAJLQlLU1QJMTkwNCBEZWMKLQkJCTk6MDAJLQlLU1QJMTkyOAorCQkJOTowMAktCUpDU1QJMTkyOAogCQkJODozMAktCUtTVAkxOTMyCisJCQk5OjAwCS0JSkNTVAkxOTM3IE9jdCAgMQorCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAgOAogCQkJOTowMAktCUtTVAkxOTU0IE1hciAyMQogCQkJODowMAlST0sJSyVzVAkxOTYxIEF1ZyAxMAogCQkJODozMAktCUtTVAkxOTY4IE9jdAogCQkJOTowMAlST0sJSyVzVAogWm9uZQlBc2lhL1B5b25neWFuZwk4OjIzOjAwIC0JTE1UCTE4OTAKIAkJCTg6MzAJLQlLU1QJMTkwNCBEZWMKLQkJCTk6MDAJLQlLU1QJMTkyOAorCQkJOTowMAktCUpDU1QJMTkyOAogCQkJODozMAktCUtTVAkxOTMyCisJCQk5OjAwCS0JSkNTVAkxOTM3IE9jdCAgMQorCQkJOTowMAktCUpTVAkxOTQ1IEF1ZyAyNAogCQkJOTowMAktCUtTVAkxOTU0IE1hciAyMQogCQkJODowMAktCUtTVAkxOTYxIEF1ZyAxMAogCQkJOTowMAktCUtTVApAQCAtMTYwMiwyMSArMTcyOSwxMyBAQAogCiAjIEt1d2FpdAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBGcm9tIHRoZSBBcmFiIFRpbWVzICgyMDA3LTAzLTE0KToKLSMgVGhlIENpdmlsIFNlcnZpY2UgQ29tbWlzc2lvbiAoQ1NDKSBoYXMgYXBwcm92ZWQgYSBwcm9wb3NhbCBmb3J3YXJkZWQKLSMgYnkgTVAgQWhtYWQgQmFxZXIgb24gaW1wbGVtZW50aW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSAoRFNUKSBpbgotIyBLdXdhaXQgc3RhcnRpbmcgZnJvbSBBcHJpbCB1bnRpbCB0aGUgZW5kIG9mIFNlcHQgdGhpcyB5ZWFyLCByZXBvcnRzIEFsLUFuYmEuCi0jIDxodHRwOi8vd3d3LmFyYWJ0aW1lc29ubGluZS5jb20vYXJhYnRpbWVzL2t1d2FpdC9WaWV3ZGV0LmFzcD9JRD05OTUwPi4KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0yOSk6Ci0jIFdlIGRvbid0IGtub3cgdGhlIGRldGFpbHMsIG9yIHdoZXRoZXIgdGhlIGFwcHJvdmFsIG1lYW5zIGl0J2xsIGhhcHBlbiwKLSMgc28gZm9yIG5vdyB3ZSBhc3N1bWUgbm8gRFNULgogWm9uZQlBc2lhL0t1d2FpdAkzOjExOjU2IC0JTE1UCTE5NTAKIAkJCTM6MDAJLQlBU1QKIAogIyBMYW9zCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvVmllbnRpYW5lCTY6NTA6MjQgLQlMTVQJMTkwNiBKdW4gIDkgIyBvciBWaWFuZ2NoYW4KLQkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgMDowMSAjIFNhaWdvbiBNVD8KK1pvbmUJQXNpYS9WaWVudGlhbmUJNjo1MDoyNCAtCUxNVAkxOTA2IEp1biAgOSAgICAgICAjIG9yIFZpYW5nY2hhbgorCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAgMDowMSAjIFNhaWdvbiBNVD8KIAkJCTc6MDAJLQlJQ1QJMTkxMiBNYXkKIAkJCTg6MDAJLQlJQ1QJMTkzMSBNYXkKIAkJCTc6MDAJLQlJQ1QKQEAgLTE2NTcsOCArMTc3Niw4IEBACiBSdWxlCU5Cb3JuZW8JMTkzNQkxOTQxCS0JRGVjCTE0CTA6MDAJMAktCiAjCiAjIHBlbmluc3VsYXIgTWFsYXlzaWEKLSMgVGhlIGRhdGEgaGVyZSBhcmUgdGFrZW4gZnJvbSBNb2sgTHkgWW5nICgyMDAzLTEwLTMwKQotIyA8aHR0cDovL3d3dy5tYXRoLm51cy5lZHUuc2cvYXNsYWtzZW4vdGVhY2hpbmcvdGltZXpvbmUuaHRtbD4uCisjIHRha2VuIGZyb20gTW9rIEx5IFluZyAoMjAwMy0xMC0zMCkKKyMgaHR0cDovL3d3dy5tYXRoLm51cy5lZHUuc2cvYXNsYWtzZW4vdGVhY2hpbmcvdGltZXpvbmUuaHRtbAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBc2lhL0t1YWxhX0x1bXB1cgk2OjQ2OjQ2IC0JTE1UCTE5MDEgSmFuICAxCiAJCQk2OjU1OjI1CS0JU01UCTE5MDUgSnVuICAxICMgU2luZ2Fwb3JlIE0uVC4KQEAgLTE2NzAsMTIgKzE3ODksMTIgQEAKIAkJCTc6MzAJLQlNQUxUCTE5ODIgSmFuICAxCiAJCQk4OjAwCS0JTVlUCSMgTWFsYXlzaWEgVGltZQogIyBTYWJhaCAmIFNhcmF3YWsKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFRoZSBkYXRhIGhlcmUgYXJlIG1vc3RseSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlciwgYnV0IHRoZSAxOTQyLCAxOTQ1IGFuZCAxOTgyCi0jIHRyYW5zaXRpb24gZGF0ZXMgYXJlIGZyb20gTW9rIEx5IFluZy4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wOC0xMik6CisjIFRoZSBkYXRhIGVudHJpZXMgaGVyZSBhcmUgbW9zdGx5IGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLCBidXQgdGhlIDE5NDIsIDE5NDUKKyMgYW5kIDE5ODIgdHJhbnNpdGlvbiBkYXRlcyBhcmUgZnJvbSBNb2sgTHkgWW5nLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBc2lhL0t1Y2hpbmcJNzoyMToyMAktCUxNVAkxOTI2IE1hcgotCQkJNzozMAktCUJPUlQJMTkzMwkjIEJvcm5lbyBUaW1lCisJCQk3OjMwCS0JQk9SVAkxOTMzICAgICAgICAjIEJvcm5lbyBUaW1lCiAJCQk4OjAwCU5Cb3JuZW8JQk9SJXNUCTE5NDIgRmViIDE2CiAJCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDEyCiAJCQk4OjAwCS0JQk9SVAkxOTgyIEphbiAgMQpAQCAtMTY4MywyMiArMTgwMiwyMSBAQAogCiAjIE1hbGRpdmVzCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9NYWxkaXZlcwk0OjU0OjAwIC0JTE1UCTE4ODAJIyBNYWxlCi0JCQk0OjU0OjAwCS0JTU1UCTE5NjAJIyBNYWxlIE1lYW4gVGltZQotCQkJNTowMAktCU1WVAkJIyBNYWxkaXZlcyBUaW1lCitab25lCUluZGlhbi9NYWxkaXZlcwk0OjU0OjAwIC0JTE1UCTE4ODAgIyBNYWxlCisJCQk0OjU0OjAwCS0JTU1UCTE5NjAgIyBNYWxlIE1lYW4gVGltZQorCQkJNTowMAktCU1WVAkjIE1hbGRpdmVzIFRpbWUKIAogIyBNb25nb2xpYQogCiAjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBNb25nb2xpYSBoYXMgdGhyZWUgdGltZSB6b25lcywgYnV0Ci0jIHVzbm8xOTk1IGFuZCB0aGUgQ0lBIG1hcCBTdGFuZGFyZCBUaW1lIFpvbmVzIG9mIHRoZSBXb3JsZCAoMjAwNS0wMykKLSMgYm90aCBzYXkgdGhhdCBpdCBoYXMganVzdCBvbmUuCisjIFRoZSBVU05PICgxOTk1LTEyLTIxKSBhbmQgdGhlIENJQSBtYXAgU3RhbmRhcmQgVGltZSBab25lcyBvZiB0aGUgV29ybGQKKyMgKDIwMDUtMDMpIGJvdGggc2F5IHRoYXQgaXQgaGFzIGp1c3Qgb25lLgogCiAjIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDE5OTktMTItMTEpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1vbmdvbGlhdG91cmlzbS5nb3YubW4vZ2VuZXJhbC5odG0iPgogIyBHZW5lcmFsIEluZm9ybWF0aW9uIE1vbmdvbGlhCi0jIDwvYT4gKDE5OTktMDkpCisjIDxodHRwOi8vd3d3Lm1vbmdvbGlhdG91cmlzbS5nb3YubW4vZ2VuZXJhbC5odG0+ICgxOTk5LTA5KQogIyAiVGltZTogTW9uZ29saWEgaGFzIHR3byB0aW1lIHpvbmVzLiBUaHJlZSB3ZXN0ZXJubW9zdCBwcm92aW5jZXMgb2YKLSMgQmF5YW4tVWxnaWksIFV2cywgYW5kIEhvdmQgYXJlIG9uZSBob3VyIGVhcmxpZXIgdGhhbiB0aGUgY2FwaXRhbCBjaXR5LCBhbmQKKyMgQmF5YW4tw5ZsZ2lpLCBVdnMsIGFuZCBIb3ZkIGFyZSBvbmUgaG91ciBlYXJsaWVyIHRoYW4gdGhlIGNhcGl0YWwgY2l0eSwgYW5kCiAjIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5IGZvbGxvd3MgdGhlIFVsYWFuYmFhdGFyIHRpbWUsIHdoaWNoIGlzIFVUQy9HTVQgcGx1cwogIyBlaWdodCBob3Vycy4iCiAKQEAgLTE3MDksNyArMTgyNyw3IEBACiAjIG9mIGltcGxlbWVudGF0aW9uIG1heSBoYXZlIGJlZW4gZGlmZmVyZW50Li4uLgogIyBTb21lIG1hcHMgaW4gdGhlIHBhc3QgaGF2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSB3YXMgYW4gYWRkaXRpb25hbCB0aW1lCiAjIHpvbmUgaW4gdGhlIGVhc3Rlcm4gcGFydCBvZiBNb25nb2xpYSwgaW5jbHVkaW5nIHRoZSBwcm92aW5jZXMgb2YgRG9ybm9kLAotIyBTdWhiYWF0YXIsIGFuZCBwb3NzaWJseSBLaGVudGlqLgorIyBTw7xraGJhYXRhciwgYW5kIHBvc3NpYmx5IEtoZW50aWkuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0xMi0xNSk6CiAjIE5hbWluZyBhbmQgc3BlbGxpbmcgaXMgdHJpY2t5IGluIE1vbmdvbGlhLgpAQCAtMTcyMywxMCArMTg0MSwxMCBAQAogIyAoYWRvcHRlZCBEU1Qgb24gMjAwMS0wNC0yNyAwMjowMCBsb2NhbCB0aW1lLCBlbmRpbmcgMjAwMS0wOS0yOCksCiAjIHRoZXJlIGFyZSB0aHJlZSB0aW1lIHpvbmVzLgogIwotIyBQcm92aW5jZXMgW2F0IDc6MDBdOiBCYXlhbi11bGdpaSwgVXZzLCBLaG92ZCwgWmF2a2hhbiwgR292aS1BbHRhaQotIyBQcm92aW5jZXMgW2F0IDg6MDBdOiBLaG92c2dvbCwgQnVsZ2FuLCBBcmtoYW5nYWksIEtoZW50aWksIFRvdiwKLSMJQmF5YW5raG9uZ29yLCBPdm9ya2hhbmdhaSwgRHVuZGdvdmksIERvcm5vZ292aSwgT21ub2dvdmkKLSMgUHJvdmluY2VzIFthdCA5OjAwXTogRG9ybm9kLCBTdWtoYmFhdGFyCisjIFByb3ZpbmNlcyBbYXQgNzowMF06IEJheWFuLcOWbGdpaSwgVXZzLCBLaG92ZCwgWmF2a2hhbiwgR292aS1BbHRhaQorIyBQcm92aW5jZXMgW2F0IDg6MDBdOiBLaMO2dnNnw7ZsLCBCdWxnYW4sIEFya2hhbmdhaSwgS2hlbnRpaSwgVMO2diwKKyMJQmF5YW5raG9uZ29yLCDDlnbDtnJraGFuZ2FpLCBEdW5kZ292aSwgRG9ybm9nb3ZpLCDDlm1uw7Znb3ZpCisjIFByb3ZpbmNlcyBbYXQgOTowMF06IERvcm5vZCwgU8O8a2hiYWF0YXIKICMKICMgW1RoZSBwcm92aW5jZSBvZiBTZWxlbmdlIGlzIG9taXR0ZWQgZnJvbSB0aGUgYWJvdmUgbGlzdHMuXQogCkBAIC0xNzQzLDE2ICsxODYxLDE2IEBACiAjIFdlIGhhdmUgd2lsZGx5IGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IE1vbmdvbGlhJ3MgdGltZSB6b25lcy4KICMgQmlsbCBCb25uZXQgKDIwMDUtMDUtMTkpIHJlcG9ydHMgdGhhdCB0aGUgVVMgRW1iYXNzeSBpbiBVbGFhbmJhYXRhciBzYXlzCiAjIHRoZXJlIGlzIG9ubHkgb25lIHRpbWUgem9uZSBhbmQgdGhhdCBEU1QgaXMgb2JzZXJ2ZWQsIGNpdGluZyBNaWNyb3NvZnQKLSMgV2luZG93cyBYUCBhcyB0aGUgc291cmNlLiAgUmlzdG8gTnlrYW5lbiAoMjAwNS0wNS0xNikgcmVwb3J0cyB0aGF0CisjIFdpbmRvd3MgWFAgYXMgdGhlIHNvdXJjZS4gIFJpc3RvIE55a8OkbmVuICgyMDA1LTA1LTE2KSByZXBvcnRzIHRoYXQKICMgdHJhdmVsbW9uZ29saWEub3JnIHNheXMgdGhlcmUgYXJlIHR3byB0aW1lIHpvbmVzIChVVEMrNywgVVRDKzgpIHdpdGggbm8gRFNULgogIyBPc2NhciB2YW4gVmxpam1lbiAoMjAwNS0wNS0yMCkgcmVwb3J0cyB0aGF0IHRoZSBNb25nb2xpYW4gRW1iYXNzeSBpbgogIyBXYXNoaW5ndG9uLCBEQyBzYXlzIHRoZXJlIGFyZSB0d28gdGltZSB6b25lcywgd2l0aCBEU1Qgb2JzZXJ2ZWQuCiAjIEhlIGFsc28gZm91bmQKLSMgPGh0dHA6Ly91YnBvc3QubW9uZ29sbmV3cy5tbi9pbmRleC5waHA/c3ViYWN0aW9uPXNob3djb21tZW50cyZpZD0xMTExNjM0ODk0JmFyY2hpdmU9JnN0YXJ0X2Zyb209JnVjYXQ9MSY+CisjIGh0dHA6Ly91YnBvc3QubW9uZ29sbmV3cy5tbi9pbmRleC5waHA/c3ViYWN0aW9uPXNob3djb21tZW50cyZpZD0xMTExNjM0ODk0JmFyY2hpdmU9JnN0YXJ0X2Zyb209JnVjYXQ9MSYKICMgd2hpY2ggYWxzbyBzYXlzIHRoYXQgdGhlcmUgaXMgRFNULCBhbmQgd2hpY2ggaGFzIGEgY29tbWVudCBieSAiVG9kZGl1cyIKICMgKDIwMDUtMDMtMzEgMDY6MDUgKzA3MDApIHNheWluZyAiTW9uZ29saWEgYWN0dWFsbHkgaGFzIDMuNSB0aW1lIHpvbmVzLgogIyBUaGUgV2VzdCAoT0xHSUkpIGlzICs3IEdNVCwgbW9zdCBvZiB0aGUgY291bnRyeSBpcyBVTEFUIGlzICs4IEdNVAotIyBhbmQgc29tZSBFYXN0ZXJuIHByb3ZpbmNlcyBhcmUgKzkgR01UIGJ1dCBTdWtoYmFhdGFyIEFpbWFnIGlzIFNVSEsgKzguNSBHTVQuCisjIGFuZCBzb21lIEVhc3Rlcm4gcHJvdmluY2VzIGFyZSArOSBHTVQgYnV0IFPDvGtoYmFhdGFyIEFpbWFnIGlzIFNVSEsgKzguNSBHTVQuCiAjIFRoZSBTVUtIIHRpbWV6b25lIGlzIG5ldyB0aGlzIHllYXIsIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHRoaW5ncyB0aGUKICMgcGFybGlhbWVudCBwYXNzZWQgZHVyaW5nIHRoZSB0dW11bHR1b3VzIHdpbnRlciBzZXNzaW9uLiIKICMgRm9yIG5vdywgbGV0J3MgaWdub3JlIHRoaXMgaW5mb3JtYXRpb24sIHVudGlsIHdlIGhhdmUgbW9yZSBjb25maXJtYXRpb24uCkBAIC0xNzY4LDI5ICsxODg2LDIzIEBACiAjICswODowMCBpbnN0ZWFkLiBEaWZmZXJlbnQgc291cmNlcyBhcHBlYXIgdG8gZGlzYWdyZWUgd2l0aCB0aGUgdHoKICMgZGF0YWJhc2Ugb24gdGhpcywgZS5nLjoKICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jaXR5Lmh0bWw/bj0xMDI2Ij4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jaXR5Lmh0bWw/bj0xMDI2Ci0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWVzZXJ2ZXIuY29tL2N1cnJlbnRfdGltZV9pbl9NTi5hc3B4Ij4KICMgaHR0cDovL3d3dy53b3JsZHRpbWVzZXJ2ZXIuY29tL2N1cnJlbnRfdGltZV9pbl9NTi5hc3B4Ci0jIDwvYT4KICMKICMgYm90aCBzYXkgR01UKzA4OjAwLgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTAzLTMxKToKICMgZXpuaXMgYWlyd2F5cywgd2hpY2ggb3BlcmF0ZXMgc2V2ZXJhbCBkb21lc3RpYyBmbGlnaHRzLCBoYXMgYSBmbGlnaHQKICMgc2NoZWR1bGUgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5lem5pcy5jb20vQ29udGFpbmVyLmpzcD9pZD0xMTIiPgogIyBodHRwOi8vd3d3LmV6bmlzLmNvbS9Db250YWluZXIuanNwP2lkPTExMgotIyA8L2E+CiAjIChjbGljayB0aGUgRW5nbGlzaCBmbGFnIGZvciBFbmdsaXNoKQogIwotIyBUaGVyZSBpdCBhcHBlYXJzIHRoYXQgZmxpZ2h0cyBiZXR3ZWVuIENob2liYWxzYW4gYW5kIFVsYWFuYmF0YXIgYXJyaXZlCisjIFRoZXJlIGl0IGFwcGVhcnMgdGhhdCBmbGlnaHRzIGJldHdlZW4gQ2hvaWJhbHNhbiBhbmQgVWxhYW5iYWF0YXIgYXJyaXZlCiAjIGFib3V0IDE6MzUgLSAxOjUwIGhvdXJzIGxhdGVyIGluIGxvY2FsIGNsb2NrIHRpbWUsIG5vIG1hdHRlciB0aGUKLSMgZGlyZWN0aW9uLCB3aGlsZSBVbGFhbmJhYXRhci1LaHZvZCB0YWtlcyAyIGhvdXJzIGluIHRoZSBFYXN0ZXJuCi0jIGRpcmVjdGlvbiBhbmQgMzozNSBiYWNrLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBVbGFhbmJhdGFyIGFuZCBLaHZvZCBhcmUKKyMgZGlyZWN0aW9uLCB3aGlsZSBVbGFhbmJhYXRhci1LaG92ZCB0YWtlcyAyIGhvdXJzIGluIHRoZSBFYXN0ZXJuCisjIGRpcmVjdGlvbiBhbmQgMzozNSBiYWNrLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBVbGFhbmJhYXRhciBhbmQgS2hvdmQgYXJlCiAjIGluIGRpZmZlcmVudCB0aW1lIHpvbmVzIChsaWtlIHdlIGtub3cgYWJvdXQpLCB3aGlsZSBDaG9pYmFsc2FuIGFuZAotIyBVbGFhbmJhdGFyIGFyZSBpbiB0aGUgc2FtZSB0aW1lIHpvbmUgKGNvcnJlY3Rpb24gbmVlZGVkKS4KKyMgVWxhYW5iYWF0YXIgYXJlIGluIHRoZSBzYW1lIHRpbWUgem9uZSAoY29ycmVjdGlvbiBuZWVkZWQpLgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA1LTE5KToKICMgQXNzdW1lIHRoYXQgQ2hvaWJhbHNhbiBpcyBpbmRlZWQgb2Zmc2V0IGJ5IDg6MDAuCkBAIC0xODA2LDcgKzE5MTgsNyBAQAogIyAoMTk5Ni0wOSkgc2F5cyAxOTk2LTEwLTI1LiAgR28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgdGhyb3VnaCAxOTk4LgogIwogIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgdGhlIFNlcHQuIDE5ODQgdGhyb3VnaCBTZXB0LiAxOTkwIHN3aXRjaGVzCi0jIGluIENob2liYWxzYW4gKG1vcmUgcHJlY2lzZWx5LCBpbiBEb3Jub2QgYW5kIFN1a2hiYWF0YXIpIHRvb2sgcGxhY2UKKyMgaW4gQ2hvaWJhbHNhbiAobW9yZSBwcmVjaXNlbHksIGluIERvcm5vZCBhbmQgU8O8a2hiYWF0YXIpIHRvb2sgcGxhY2UKICMgYXQgMDI6MDAgc3RhbmRhcmQgdGltZSwgbm90IGF0IDAwOjAwIGxvY2FsIHRpbWUgYXMgaW4gdGhlIHJlc3Qgb2YKICMgdGhlIGNvdW50cnkuICBUaGF0IHdvdWxkIGJlIG9kZCwgYW5kIHBvc3NpYmx5IGlzIGEgcmVzdWx0IG9mIHRoZWlyCiAjIGNvcnJlY3Rpb24gb2YgMDI6MDAgKGluIHRoZSBwcmV2aW91cyBlZGl0aW9uKSBub3QgYmVpbmcgZG9uZSBjb3JyZWN0bHkKQEAgLTE4MjIsMTMgKzE5MzQsMTMgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KICMgSG92ZCwgYS5rLmEuIENob3ZkLCBEdW5kLVVzLCBEemhhcmdhbGFudCwgS2hvdmQsIEppcmdhbGFudGEKIFpvbmUJQXNpYS9Ib3ZkCTY6MDY6MzYgLQlMTVQJMTkwNSBBdWcKLQkJCTY6MDAJLQlIT1ZUCTE5NzgJIyBIb3ZkIFRpbWUKKwkJCTY6MDAJLQlIT1ZUCTE5NzggICAgICMgSG92ZCBUaW1lCiAJCQk3OjAwCU1vbmdvbAlIT1Ylc1QKICMgVWxhYW5iYWF0YXIsIGEuay5hLiBVbGFuIEJhdGFhciwgVWxhbiBCYXRvciwgVXJnYQogWm9uZQlBc2lhL1VsYWFuYmFhdGFyIDc6MDc6MzIgLQlMTVQJMTkwNSBBdWcKLQkJCTc6MDAJLQlVTEFUCTE5NzgJIyBVbGFhbmJhYXRhciBUaW1lCisJCQk3OjAwCS0JVUxBVAkxOTc4ICAgICAjIFVsYWFuYmFhdGFyIFRpbWUKIAkJCTg6MDAJTW9uZ29sCVVMQSVzVAotIyBDaG9pYmFsc2FuLCBhLmsuYS4gQmFqYW4gVHVlbWVuLCBCYWphbiBUdW1lbiwgQ2hvamJhbHNhbiwKKyMgQ2hvaWJhbHNhbiwgYS5rLmEuIEJhamFuIFTDvG1lbiwgQmFqYW4gVHVtZW4sIENob2piYWxzYW4sCiAjIENob3liYWxzYW4sIFNhbmJlanNlLCBUY2hvaWJhbHNhbgogWm9uZQlBc2lhL0Nob2liYWxzYW4JNzozODowMCAtCUxNVAkxOTA1IEF1ZwogCQkJNzowMAktCVVMQVQJMTk3OApAQCAtMTg2MCw3ICsxOTcyLDcgQEAKICMgMDA6MDEgd2FzIHRvIG1ha2UgaXQgY2xlYXIgd2hpY2ggZGF5IGl0IHdhcyBvbi4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAyLTAzLTE1KToKLSMgSmVzcGVyIE5vcmdhYXJkIGZvdW5kIHRoaXMgVVJMOgorIyBKZXNwZXIgTsO4cmdhYXJkIGZvdW5kIHRoaXMgVVJMOgogIyBodHRwOi8vd3d3LnBhay5nb3YucGsvcHVibGljL25ld3MvYXBwL2FwcDA2X2RlYy5odG0KICMgKGRhdGVkIDIwMDEtMTItMDYpIHdoaWNoIHNheXMgdGhhdCB0aGUgQ2FiaW5ldCBhZG9wdGVkIGEgc2NoZW1lICJ0bwogIyBhZHZhbmNlIHRoZSBjbG9ja3MgYnkgb25lIGhvdXIgb24gdGhlIG5pZ2h0IGJldHdlZW4gdGhlIGZpcnN0CkBAIC0xODkyLDQzICsyMDA0LDMwIEBACiAjIEhlcmUgaXMgYW4gYXJ0aWNsZSB0aGF0IFBha2lzdGFuIHBsYW4gdG8gaW50cm9kdWNlIERheWxpZ2h0IFNhdmluZyBUaW1lCiAjIG9uIEp1bmUgMSwgMjAwOCBmb3IgMyBtb250aHMuCiAjCi0jICIuLi4gVGhlIGZlZGVyYWwgY2FiaW5ldCBvbiBXZWRuZXNkYXkgYW5ub3VuY2VkIGEgbmV3IGNvbnNlcnZhdGlvbiBwbGFuIHRvIGhlbHAKLSMgcmVkdWNlIGxvYWQgc2hlZGRpbmcgYnkgYXBwcm92aW5nIHRoZSBjbG9zdXJlIG9mIGNvbW1lcmNpYWwgY2VudHJlcyBhdCA5cG0gYW5kCi0jIG1vdmluZyBjbG9ja3MgZm9yd2FyZCBieSBvbmUgaG91ciBmb3IgdGhlIG5leHQgdGhyZWUgbW9udGhzLgotIyAuLi4uIgorIyAiLi4uIFRoZSBmZWRlcmFsIGNhYmluZXQgb24gV2VkbmVzZGF5IGFubm91bmNlZCBhIG5ldyBjb25zZXJ2YXRpb24gcGxhbiB0bworIyBoZWxwIHJlZHVjZSBsb2FkIHNoZWRkaW5nIGJ5IGFwcHJvdmluZyB0aGUgY2xvc3VyZSBvZiBjb21tZXJjaWFsIGNlbnRyZXMgYXQKKyMgOXBtIGFuZCBtb3ZpbmcgY2xvY2tzIGZvcndhcmQgYnkgb25lIGhvdXIgZm9yIHRoZSBuZXh0IHRocmVlIG1vbnRocy4gLi4uLiIKICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjAxLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUubmV0L2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDEuaHRtbAotIyA8L2E+Ci0jIE9SCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGFpbHl0aW1lcy5jb20ucGsvZGVmYXVsdC5hc3A/cGFnZT0yMDA4JTVDMDUlNUMxNSU1Q3N0b3J5XzE1LTUtMjAwOF9wZzFfNCI+CiAjIGh0dHA6Ly93d3cuZGFpbHl0aW1lcy5jb20ucGsvZGVmYXVsdC5hc3A/cGFnZT0yMDA4JTVDMDUlNUMxNSU1Q3N0b3J5XzE1LTUtMjAwOF9wZzFfNAotIyA8L2E+CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDUtMTkpOgogIyBYWFgtLW1pZG5pZ2h0IHRyYW5zaXRpb25zIGlzIGEgZ3Vlc3M7IDIwMDggb25seSBpcyBhIGd1ZXNzLgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA4LTA4LTI4KToKICMgUGFraXN0YW4gZ292ZXJubWVudCBoYXMgZGVjaWRlZCB0byBrZWVwIHRoZSB3YXRjaGVzIG9uZS1ob3VyIGFkdmFuY2VkCi0jIGZvciBhbm90aGVyIDIgbW9udGhzLS1wbGFuIHRvIHJldHVybiB0byBTdGFuZGFyZCBUaW1lIG9uIE9jdG9iZXIgMzEKKyMgZm9yIGFub3RoZXIgMiBtb250aHMgLSBwbGFuIHRvIHJldHVybiB0byBTdGFuZGFyZCBUaW1lIG9uIE9jdG9iZXIgMzEKICMgaW5zdGVhZCBvZiBBdWd1c3QgMzEuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wMi5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjAyLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vZGFpbHltYWlsbmV3cy5jb20vMjAwODA4LzI4L25ld3MvZG1icm4wMy5odG1sIj4KICMgaHR0cDovL2RhaWx5bWFpbG5ld3MuY29tLzIwMDgwOC8yOC9uZXdzL2RtYnJuMDMuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDQtMDgpOgogIyBCYXNlZCBvbiBwcmV2aW91cyBtZWRpYSByZXBvcnRzIHRoYXQgIi4uLiBwcm9wb3NlZCBwbGFuIHRvCiAjIGFkdmFuY2UgY2xvY2tzIGJ5IG9uZSBob3VyIGZyb20gTWF5IDEgd2lsbCBjYXVzZSBkaXN0dXJiYW5jZQogIyB0byB0aGUgd29ya2luZyBzY2hlZHVsZXMgcmF0aGVyIHRoYW4gYnJpbmdpbmcgZGlzY2lwbGluZSBpbgogIyBvZmZpY2lhbCB3b3JraW5nLiIKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGVuZXdzLmNvbS5way9kYWlseV9kZXRhaWwuYXNwP2lkPTE3MTI4MCI+CiAjIGh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvZGFpbHlfZGV0YWlsLmFzcD9pZD0xNzEyODAKLSMgPC9hPgogIwogIyByZWNlbnQgbmV3cyB0aGF0IGluc3RlYWQgb2YgTWF5IDIwMDkgLSBQYWtpc3RhbiBwbGFuIHRvCiAjIGludHJvZHVjZSBEU1QgZnJvbSBBcHJpbCAxNSwgMjAwOQpAQCAtMTkzNiwxNSArMjAzNSw4IEBACiAjIEZZSTogQXNzb2NpYXRlZCBQcmVzcyBPZiBQYWtpc3RhbgogIyBBcHJpbCAwOCwgMjAwOQogIyBDYWJpbmV0IG9rYXlzIHByb3Bvc2FsIHRvIGFkdmFuY2UgY2xvY2tzIGJ5IG9uZSBob3VyIGZyb20gQXByaWwgMTUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD03MzA0MyZJdGVtaWQ9MSI+CiAjIGh0dHA6Ly93d3cuYXBwLmNvbS5way9lbl8vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NzMwNDMmSXRlbWlkPTEKLSMgPC9hPgotIwotIyBvcgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDUuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wNS5odG1sCi0jIDwvYT4KICMKICMgLi4uLgogIyBUaGUgRmVkZXJhbCBDYWJpbmV0IG9uIFdlZG5lc2RheSBhcHByb3ZlZCB0aGUgcHJvcG9zYWwgdG8KQEAgLTE5NTcsMzQgKzIwNDksMjAgQEAKICMgY2xvY2tzIGJhY2t3YXJkIGJ5IG9uZSBob3VyIGZyb20gT2N0b2JlciAxLiBBIGZvcm1hbCBhbm5vdW5jZW1lbnQgdG8KICMgdGhpcyBlZmZlY3Qgd2lsbCBiZSBtYWRlIGFmdGVyIHRoZSBQcmltZSBNaW5pc3RlciBncmFudHMgYXBwcm92YWwgaW4KICMgdGhpcyByZWdhcmQuIgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZW5ld3MuY29tLnBrL3VwZGF0ZXMuYXNwP2lkPTg3MTY4Ij4KICMgaHR0cDovL3d3dy50aGVuZXdzLmNvbS5way91cGRhdGVzLmFzcD9pZD04NzE2OAotIyA8L2E+CiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDktMjgpOgogIyBBY2NvcmRpbmcgdG8gQXNzb2NpYXRlZCBQcmVzcyBPZiBQYWtpc3RhbiwgaXQgaXMgY29uZmlybWVkIHRoYXQKLSMgUGFraXN0YW4gY2xvY2tzIGFjcm9zcyB0aGUgY291bnRyeSB3b3VsZCBiZSB0dXJuZWQgYmFjayBieSBhbiBob3VyIGZyb20gT2N0b2JlcgotIyAxLCAyMDA5LgorIyBQYWtpc3RhbiBjbG9ja3MgYWNyb3NzIHRoZSBjb3VudHJ5IHdvdWxkIGJlIHR1cm5lZCBiYWNrIGJ5IGFuIGhvdXIgZnJvbQorIyBPY3RvYmVyIDEsIDIwMDkuCiAjCiAjICJDbG9ja3MgdG8gZ28gYmFjayBvbmUgaG91ciBmcm9tIDEgT2N0IgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFwcC5jb20ucGsvZW5fL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTg2NzE1Jkl0ZW1pZD0yIj4KICMgaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD04NjcxNSZJdGVtaWQ9MgotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wNy5odG0iPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDcuaHRtCi0jIDwvYT4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wOS0yOSk6Ci0jIEFsZXhhbmRlciBLcml2ZW55c2hldiB3cm90ZToKLSMgPiBBY2NvcmRpbmcgdG8gQXNzb2NpYXRlZCBQcmVzcyBPZiBQYWtpc3RhbiwgaXQgaXMgY29uZmlybWVkIHRoYXQKLSMgPiBQYWtpc3RhbiBjbG9ja3MgYWNyb3NzIHRoZSBjb3VudHJ5IHdvdWxkIGJlIHR1cm5lZCBiYWNrIGJ5IGFuIGhvdXIgZnJvbSBPY3RvYmVyCi0jID4gMSwgMjAwOS4KICMKKyMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDktMjkpOgogIyBOb3cgdGhleSBzZWVtIHRvIGhhdmUgY2hhbmdlZCB0aGVpciBtaW5kLCBOb3ZlbWJlciAxIGlzIHRoZSBuZXcgZGF0ZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGVuZXdzLmNvbS5way90b3Bfc3RvcnlfZGV0YWlsLmFzcD9JZD0yNDc0MiI+CiAjIGh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvdG9wX3N0b3J5X2RldGFpbC5hc3A/SWQ9MjQ3NDIKLSMgPC9hPgogIyAiVGhlIGNvdW50cnkncyBjbG9ja3Mgd2lsbCBiZSByZXZlcnNlZCBieSBvbmUgaG91ciBvbiBOb3ZlbWJlciAxLgogIyBPZmZpY2lhbHMgb2YgRmVkZXJhbCBNaW5pc3RyeSBmb3IgSW50ZXJpb3IgdG9sZCB0aGlzIHRvIEdlbyBOZXdzIG9uCiAjIE1vbmRheS4iCkBAIC0xOTk2LDExICsyMDc0LDkgQEAKICMKICMgV2UgaGF2ZSBjb25maXJtZWQgdGhpcyB5ZWFyJ3MgZW5kIGRhdGUgd2l0aCBib3RoIHdpdGggdGhlIE1pbmlzdHJ5IG9mCiAjIFdhdGVyIGFuZCBQb3dlciBhbmQgdGhlIFBha2lzdGFuIEVsZWN0cmljIFBvd2VyIENvbXBhbnk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9wYWtpc3Rhbi1lbmRzLWRzdDA5Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvcGFraXN0YW4tZW5kcy1kc3QwOS5odG1sCi0jIDwvYT4KIAotIyBGcm9tIENocmlzdG9waCBHb2VocmUgKDIwMDktMTAtMDEpOgorIyBGcm9tIENocmlzdG9waCBHw7ZocmUgKDIwMDktMTAtMDEpOgogIyBbVF1oZSBHZXJtYW4gQ29uc3VsYXRlIEdlbmVyYWwgaW4gS2FyYWNoaSByZXBvcnRlZCBtZSB0b2RheSB0aGF0IFBha2lzdGFuCiAjIHdpbGwgZ28gYmFjayB0byBzdGFuZGFyZCB0aW1lIG9uIDFzdCBvZiBOb3ZlbWJlci4KIApAQCAtMjAxNiwyMiArMjA5MiwxNyBAQAogIyBOb3csIGl0IHNlZW1zIHRoYXQgdGhlIGRlY2lzaW9uIHRvIG5vdCBvYnNlcnZlIERTVCBpbiBmaW5hbDoKICMKICMgIkdvdnQgV2l0aGRyYXdzIFBsYW4gVG8gQWR2YW5jZSBDbG9ja3MiCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBha2lzdGFubmV3cy5jb20vZ292dC13aXRoZHJhd3MtcGxhbi10by1hZHZhbmNlLWNsb2Nrcy0xNzIwNDEiPgogIyBodHRwOi8vd3d3LmFwYWtpc3Rhbm5ld3MuY29tL2dvdnQtd2l0aGRyYXdzLXBsYW4tdG8tYWR2YW5jZS1jbG9ja3MtMTcyMDQxCi0jIDwvYT4KICMKICMgIlBlb3BsZSBsYXVkIFBNJ3MgYW5ub3VuY2VtZW50IHRvIGVuZCBEU1QiCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBwLmNvbS5way9lbl8vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9OTkzNzQmSXRlbWlkPTIiPgogIyBodHRwOi8vd3d3LmFwcC5jb20ucGsvZW5fL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTk5Mzc0Jkl0ZW1pZD0yCi0jIDwvYT4KIAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIFJ1bGUgUGFraXN0YW4JMjAwMglvbmx5CS0JQXByCVN1bj49MgkwOjAxCTE6MDAJUwogUnVsZSBQYWtpc3RhbgkyMDAyCW9ubHkJLQlPY3QJU3VuPj0yCTA6MDEJMAktCiBSdWxlIFBha2lzdGFuCTIwMDgJb25seQktCUp1bgkxCTA6MDAJMTowMAlTCi1SdWxlIFBha2lzdGFuCTIwMDgJb25seQktCU5vdgkxCTA6MDAJMAktCitSdWxlIFBha2lzdGFuCTIwMDgJMjAwOQktCU5vdgkxCTA6MDAJMAktCiBSdWxlIFBha2lzdGFuCTIwMDkJb25seQktCUFwcgkxNQkwOjAwCTE6MDAJUwotUnVsZSBQYWtpc3RhbgkyMDA5CW9ubHkJLQlOb3YJMQkwOjAwCTAJLQogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvS2FyYWNoaQk0OjI4OjEyIC0JTE1UCTE5MDcKQEAgLTIxMDUsMTAgKzIxNzYsOSBAQAogIyB0aGUgUEEgaGFzIGRlY2lkZWQgdG8gaW1wbGVtZW50IERTVCBpbiBBcHJpbC4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTA5LTIwKToKLSMgRGFvdWQgS3V0dGFiIHdyaXRlcyBpbgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmpwb3N0LmNvbS9jb20vQXJjaGl2ZS8yMi5BcHIuMTk5OS9PcGluaW9uL0FydGljbGUtMi5odG1sIj4KLSMgSG9saWRheSBoYXZvYwotIyA8L2E+IChKZXJ1c2FsZW0gUG9zdCwgMTk5OS0wNC0yMikgdGhhdAorIyBEYW91ZCBLdXR0YWIgd3JpdGVzIGluIEhvbGlkYXkgaGF2b2MKKyMgaHR0cDovL3d3dy5qcG9zdC5jb20vY29tL0FyY2hpdmUvMjIuQXByLjE5OTkvT3Bpbmlvbi9BcnRpY2xlLTIuaHRtbAorIyAoSmVydXNhbGVtIFBvc3QsIDE5OTktMDQtMjIpIHRoYXQKICMgdGhlIFBhbGVzdGluaWFuIE5hdGlvbmFsIEF1dGhvcml0eSBjaGFuZ2VkIHRvIERTVCBvbiAxOTk5LTA0LTE1LgogIyBJIHZhZ3VlbHkgcmVjYWxsIHRoYXQgdGhleSBzd2l0Y2ggYmFjayBpbiBPY3RvYmVyIChzb3JyeSwgZm9yZ290IHRoZSBzb3VyY2UpLgogIyBGb3Igbm93LCBsZXQncyBhc3N1bWUgdGhhdCB0aGUgc3ByaW5nIHN3aXRjaCB3YXMgYXQgMjQ6MDAsCkBAIC0yMTIxLDcgKzIxOTEsNyBAQAogIyBBIHVzZXIgZnJvbSBHYXphIHJlcG9ydGVkIHRoYXQgR2F6YSBtYWRlIHRoZSBjaGFuZ2UgZWFybHkgYmVjYXVzZSBvZgogIyB0aGUgUmFtYWRhbi4gIE5leHQgeWVhciBSYW1hZGFuIHdpbGwgYmUgZXZlbiBlYXJsaWVyLCBzbyBJIHRoaW5rCiAjIHRoZXJlIGlzIGEgZ29vZCBjaGFuY2UgbmV4dCB5ZWFyJ3MgZW5kIGRhdGUgd2lsbCBiZSBhcm91bmQgdHdvIHdlZWtzCi0jIGVhcmxpZXItLXRoZSBzYW1lIGdvZXMgZm9yIEpvcmRhbi4KKyMgZWFybGllciAtIHRoZSBzYW1lIGdvZXMgZm9yIEpvcmRhbi4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOC0xNyk6CiAjIEkgd2FzIGluZm9ybWVkIGJ5IGEgdXNlciBpbiBCZXRobGVoZW0gdGhhdCBpbiBCZXRobGVoZW0gaXQgc3RhcnRlZCB0aGUKQEAgLTIxNDAsNyArMjIxMCw3IEBACiAjIEkgZ3Vlc3MgaXQgaXMgbGlrZWx5IHRoYXQgbmV4dCB5ZWFyJ3MgZGF0ZSB3aWxsIGJlIG1vdmVkIGFzIHdlbGwsCiAjIGJlY2F1c2Ugb2YgdGhlIFJhbWFkYW4uCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDctMDktMTgpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDctMDktMTgpOgogIyBBY2NvcmRpbmcgdG8gU3RlZmZlbiBUaG9yc2VuJ3Mgd2ViIHNpdGUgdGhlIEdhemEgU3RyaXAgYW5kIHRoZSByZXN0IG9mIHRoZQogIyBQYWxlc3RpbmlhbiB0ZXJyaXRvcmllcyBsZWZ0IERTVCBlYXJseSBvbiAxMy50aC4gb2YgU2VwdGVtYmVyIGF0IDI6MDAuCiAKQEAgLTIxNTcsMTYgKzIyMjcsOSBAQAogIyBHYXphIFN0cmlwIChhcyBFZ3lwdCkgZW5kZWQgRFNUIGF0IG1pZG5pZ2h0IFRodXJzZGF5IChBdWcgMjgsIDIwMDgpLCB3aGlsZQogIyB0aGUgV2VzdCBCYW5rIHdpbGwgZW5kIERheWxpZ2h0IFNhdmluZyBUaW1lIGF0IG1pZG5pZ2h0IFN1bmRheSAoQXVnIDMxLCAyMDA4KS4KICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ndWFyZGlhbi5jby51ay93b3JsZC9mZWVkYXJ0aWNsZS83NzU5MDAxIj4KICMgaHR0cDovL3d3dy5ndWFyZGlhbi5jby51ay93b3JsZC9mZWVkYXJ0aWNsZS83NzU5MDAxCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hYmNuZXdzLmdvLmNvbS9JbnRlcm5hdGlvbmFsL3dpcmVTdG9yeT9pZD01Njc2MDg3Ij4KICMgaHR0cDovL3d3dy5hYmNuZXdzLmdvLmNvbS9JbnRlcm5hdGlvbmFsL3dpcmVTdG9yeT9pZD01Njc2MDg3Ci0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMS5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wMy0yNik6CiAjIEFjY29yZGluZyB0byB0aGUgUGFsZXN0aW5lIE5ld3MgTmV0d29yayAoYXJhYmljLnBubi5wcyksIFBhbGVzdGluaWFuCkBAIC0yMTc0LDI0ICsyMjM3LDE3IEBACiAjIDI2IGFuZCBjb250aW51ZSB1bnRpbCB0aGUgbmlnaHQgb2YgMjcgU2VwdGVtYmVyIDIwMDkuCiAjCiAjIChpbiBBcmFiaWMpCi0jIDxhIGhyZWY9Imh0dHA6Ly9hcmFiaWMucG5uLnBzL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTUwODUwIj4KICMgaHR0cDovL2FyYWJpYy5wbm4ucHMvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NTA4NTAKLSMgPC9hPgogIwotIyBvcgogIyAoRW5nbGlzaCB0cmFuc2xhdGlvbikKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c193ZXN0YmFuazAxLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3dlc3RiYW5rMDEuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDgtMzEpOgogIyBQYWxlc3RpbmUncyBDb3VuY2lsIG9mIE1pbmlzdGVycyBhbm5vdW5jZWQgdGhhdCB0aGV5IHdpbGwgcmV2ZXJ0IGJhY2sgdG8KICMgd2ludGVyIHRpbWUgb24gRnJpZGF5LCAyMDA5LTA5LTA0LgogIwogIyBPbmUgbmV3cyBzb3VyY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FmYS5wcy9hcmEvP2FjdGlvbj1zaG93ZGV0YWlsJnNlaWQ9NDE1OCI+CiAjIGh0dHA6Ly93d3cuc2FmYS5wcy9hcmEvP2FjdGlvbj1zaG93ZGV0YWlsJnNlaWQ9NDE1OAotIyA8L2E+CiAjIChQYWxlc3RpbmlhbiBwcmVzcyBhZ2VuY3ksIEFyYWJpYyksCiAjIEdvb2dsZSB0cmFuc2xhdGU6ICJEZWNpZGVkIHRoYXQgdGhlIFBhbGVzdGluaWFuIGdvdmVybm1lbnQgaW4gUmFtYWxsYWgKICMgaGVhZGVkIGJ5IFNhbGFtIEZheXlhZCwgdGhlIHN0YXJ0IG9mIHdvcmsgaW4gdGltZSBmb3IgdGhlIHdpbnRlciBvZgpAQCAtMjIwMCw5ICsyMjU2LDcgQEAKICMKICMgV2UgYXJlIG5vdCBzdXJlIGlmIEdhemEgd2lsbCBkbyB0aGUgc2FtZSwgbGFzdCB5ZWFyIHRoZXkgaGFkIGEgZGlmZmVyZW50CiAjIGVuZCBkYXRlLCB3ZSB3aWxsIGtlZXAgdGhpcyBwYWdlIHVwZGF0ZWQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS93ZXN0YmFuay1nYXphLWRzdC0yMDA5Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvd2VzdGJhbmstZ2F6YS1kc3QtMjAwOS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wOS0wMik6CiAjIFNlZW1zIHRoYXQgR2F6YSBTdHJpcCB3aWxsIGdvIGJhY2sgdG8gV2ludGVyIFRpbWUgc2FtZSBkYXRlIGFzIFdlc3QgQmFuay4KQEAgLTIyMTIsNTEgKzIyNjYsMzUgQEAKICMKICMgIldpbnRlciB0aW1lIHVuaXRlIHRoZSBXZXN0IEJhbmsgYW5kIEdhemEiCiAjIChmcm9tIFBhbGVzdGluaWFuIE5hdGlvbmFsIEF1dGhvcml0eSk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW9pLmdvdi5wcy9lbi8/cGFnZT02MzMxNjczNDMyNTA1OTQwMjUmbmlkPTExNTA1CiAjIGh0dHA6Ly93d3cubW9pLmdvdi5wcy9lbi8/cGFnZT02MzMxNjczNDMyNTA1OTQwMjUmbmlkPTExNTA1Ci0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMi5odG1sPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2dhemFzdHJpcDAyLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTAzLTE5KToKICMgQWNjb3JkaW5nIHRvIFZvaWNlIG9mIFBhbGVzdGluZSBEU1Qgd2lsbCBsYXN0IGZvciAxOTEgZGF5cywgZnJvbSBNYXJjaAogIyAyNiwgMjAxMCB0aWxsICJ0aGUgbGFzdCBTdW5kYXkgYmVmb3JlIHRoZSB0ZW50aCBkYXkgb2YgVGlzaHJpCiAjIChPY3RvYmVyKSwgZWFjaCB5ZWFyIiAoT2N0b2JlciAwMywgMjAxMD8pCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly9wYWx2b2ljZS5vcmcvZm9ydW1zL3Nob3d0aHJlYWQucGhwP3Q9MjQ1Njk3Ij4KICMgaHR0cDovL3BhbHZvaWNlLm9yZy9mb3J1bXMvc2hvd3RocmVhZC5waHA/dD0yNDU2OTcKLSMgPC9hPgogIyAoaW4gQXJhYmljKQotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3dlc3RiYW5rMDMuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3Nfd2VzdGJhbmswMy5odG1sCi0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMC0wMy0yNCk6CiAjIC4uLk1hJ2FuIE5ld3MgQWdlbmN5IHJlcG9ydHMgdGhhdCBIYW1hcyBjYWJpbmV0IGhhcyBkZWNpZGVkIGl0IHdpbGwKICMgc3RhcnQgb25lIGRheSBsYXRlciwgYXQgMTI6MDFhbS4gTm90IHN1cmUgaWYgdGhleSByZWFsbHkgbWVhbiAxMjowMWFtIG9yCiAjIG5vb24gdGhvdWdoOgogIwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hYW5uZXdzLm5ldC9lbmcvVmlld0RldGFpbHMuYXNweD9JRD0yNzExNzgiPgogIyBodHRwOi8vd3d3Lm1hYW5uZXdzLm5ldC9lbmcvVmlld0RldGFpbHMuYXNweD9JRD0yNzExNzgKLSMgPC9hPgogIyAoTWEnYW4gTmV3cyBBZ2VuY3kpCiAjICJBdCAxMjowMWFtIEZyaWRheSwgY2xvY2tzIGluIElzcmFlbCBhbmQgdGhlIFdlc3QgQmFuayB3aWxsIGNoYW5nZSB0bwogIyAxOjAxYW0sIHdoaWxlIEdhemEgY2xvY2tzIHdpbGwgY2hhbmdlIGF0IDEyOjAxYW0gU2F0dXJkYXkgbW9ybmluZy4iCiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTAtMDgtMTEpOgogIyBBY2NvcmRpbmcgdG8gc2V2ZXJhbCBzb3VyY2VzLCBpbmNsdWRpbmcKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tYWFubmV3cy5uZXQvZW5nL1ZpZXdEZXRhaWxzLmFzcHg/SUQ9MzA2Nzk1Ij4KICMgaHR0cDovL3d3dy5tYWFubmV3cy5uZXQvZW5nL1ZpZXdEZXRhaWxzLmFzcHg/SUQ9MzA2Nzk1Ci0jIDwvYT4KICMgdGhlIGNsb2NrcyB3ZXJlIHNldCBiYWNrIG9uZSBob3VyIGF0IDIwMTAtMDgtMTEgMDA6MDA6MDAgbG9jYWwgdGltZSBpbgogIyBHYXphIGFuZCB0aGUgV2VzdCBCYW5rLgogIyBTb21lIG1vcmUgYmFja2dyb3VuZCBpbmZvOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvd2VzdGJhbmstZ2F6YS1lbmQtZHN0LTIwMTAuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS93ZXN0YmFuay1nYXphLWVuZC1kc3QtMjAxMC5odG1sCi0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMS0wOC0yNik6CiAjIEdhemEgYW5kIHRoZSBXZXN0IEJhbmsgZGlkIGdvIGJhY2sgdG8gc3RhbmRhcmQgdGltZSBpbiB0aGUgYmVnaW5uaW5nIG9mCkBAIC0yMjY0LDEzICsyMzAyLDkgQEAKICMgMDA6MDAgKHNvIHR3byBwZXJpb2RzIG9mIERTVCBpbiAyMDExKS4gVGhlIHBhdXNlIHdhcyBiZWNhdXNlIG9mCiAjIFJhbWFkYW4uCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTQxNjIxNyI+CiAjIGh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTQxNjIxNwotIyA8L2E+CiAjIEFkZGl0aW9uYWwgaW5mbzoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3BhbGVzdGluZS1kc3QtMjAxMS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3BhbGVzdGluZS1kc3QtMjAxMS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMS0wOC0yNyk6CiAjIEFjY29yZGluZyB0byB0aGUgYXJ0aWNsZSBpbiBUaGUgSmVydXNhbGVtIFBvc3Q6CkBAIC0yMjgwLDE0ICsyMzE0LDkgQEAKICMgVGhlIEhhbWFzIGdvdmVybm1lbnQgc2FpZCBvbiBTYXR1cmRheSB0aGF0IGl0IHdvbid0IG9ic2VydmUgc3VtbWVydGltZSBhZnRlcgogIyB0aGUgTXVzbGltIGZlYXN0IG9mIElkIGFsLUZpdHIsIHdoaWNoIGJlZ2lucyBvbiBUdWVzZGF5Li4uIgogIyAuLi4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5qcG9zdC5jb20vTWlkZGxlRWFzdC9BcnRpY2xlLmFzcHg/aWQ9MjM1NjUwIj4KICMgaHR0cDovL3d3dy5qcG9zdC5jb20vTWlkZGxlRWFzdC9BcnRpY2xlLmFzcHg/aWQ9MjM1NjUwCi0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwNS5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwNS5odG1sCi0jIDwvYT4KLSMgVGhlIHJ1bGVzIGZvciBFZ3lwdCBhcmUgc3RvbGVuIGZyb20gdGhlIGBhZnJpY2EnIGZpbGUuCisjIFRoZSBydWxlcyBmb3IgRWd5cHQgYXJlIHN0b2xlbiBmcm9tIHRoZSAnYWZyaWNhJyBmaWxlLgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDExLTA5LTMwKToKICMgV2VzdCBCYW5rIGRpZCBlbmQgRGF5bGlnaHQgU2F2aW5nIFRpbWUgdGhpcyBtb3JuaW5nL21pZG5pZ2h0ICgyMDExLTA5LTMwCkBAIC0yMjk1LDI2ICsyMzI0LDE4IEBACiAjIFNvIFdlc3QgQmFuayBhbmQgR2F6YSBub3cgaGF2ZSB0aGUgc2FtZSB0aW1lIGFnYWluLgogIwogIyBNYW55IHNvdXJjZXMsIGluY2x1ZGluZzoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tYWFubmV3cy5uZXQvZW5nL1ZpZXdEZXRhaWxzLmFzcHg/SUQ9NDI0ODA4Ij4KICMgaHR0cDovL3d3dy5tYWFubmV3cy5uZXQvZW5nL1ZpZXdEZXRhaWxzLmFzcHg/SUQ9NDI0ODA4Ci0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMi0wMy0yNik6CiAjIFBhbGVzdGluaWFuIG5ld3Mgc291cmNlcyB0ZWxsIHRoYXQgYm90aCBHYXphIGFuZCBXZXN0IEJhbmsgd2lsbCBzdGFydCBEU1QKICMgb24gRnJpZGF5IChUaHVyc2RheSBtaWRuaWdodCwgMjAxMi0wMy0yOSAyNDowMCkuCiAjIFNvbWUgb2YgbWFueSBzb3VyY2VzIGluIEFyYWJpYzoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW1hbmV3cy5jb20vaW5kZXgucGhwP2FjdD1TaG93JmlkPTEyMjYzOCI+CiAjIGh0dHA6Ly93d3cuc2FtYW5ld3MuY29tL2luZGV4LnBocD9hY3Q9U2hvdyZpZD0xMjI2MzgKLSMgPC9hPgogIwotIyA8YSBocmVmPSJodHRwOi8vc2FmYS5wcy9kZXRhaWxzL25ld3MvNzQzNTIvJUQ4JUE4JUQ4JUFGJUQ4JUExLSVEOCVBNyVEOSU4NCVEOCVBQSVEOSU4OCVEOSU4MiVEOSU4QSVEOCVBQS0lRDglQTclRDklODQlRDglQjUlRDklOEElRDklODElRDklOEEtJUQ4JUE4JUQ4JUE3JUQ5JTg0JUQ4JUI2JUQ5JTgxJUQ4JUE5LSVEOSU4OCVEOCVCQSVEOCVCMiVEOCVBOS0lRDklODQlRDklOEElRDklODQlRDglQTktJUQ4JUE3JUQ5JTg0JUQ4JUFDJUQ5JTg1JUQ4JUI5JUQ4JUE5Lmh0bWwiPgogIyBodHRwOi8vc2FmYS5wcy9kZXRhaWxzL25ld3MvNzQzNTIvJUQ4JUE4JUQ4JUFGJUQ4JUExLSVEOCVBNyVEOSU4NCVEOCVBQSVEOSU4OCVEOSU4MiVEOSU4QSVEOCVBQS0lRDglQTclRDklODQlRDglQjUlRDklOEElRDklODElRDklOEEtJUQ4JUE4JUQ4JUE3JUQ5JTg0JUQ4JUI2JUQ5JTgxJUQ4JUE5LSVEOSU4OCVEOCVCQSVEOCVCMiVEOCVBOS0lRDklODQlRDklOEElRDklODQlRDglQTktJUQ4JUE3JUQ5JTg0JUQ4JUFDJUQ5JTg1JUQ4JUI5JUQ4JUE5Lmh0bWwKLSMgPC9hPgogIwogIyBPdXIgYnJpZWYgc3VtbWFyeToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2dhemEtd2VzdC1iYW5rLWRzdC0yMDEyLmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvZ2F6YS13ZXN0LWJhbmstZHN0LTIwMTIuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTMtMDMtMjYpOgogIyBUaGUgZm9sbG93aW5nIG5ld3Mgc291cmNlcyB0ZWxscyB0aGF0IFBhbGVzdGluZSB3aWxsICJzdGFydCBkYXlsaWdodCBzYXZpbmcKQEAgLTIzNzQsMTAgKzIzOTUsMTAgQEAKIAkJCTI6MDAgRWd5cHRBc2lhCUVFJXNUCTE5NjcgSnVuICA1CiAJCQkyOjAwCVppb24JSSVzVAkxOTk2CiAJCQkyOjAwCUpvcmRhbglFRSVzVAkxOTk5Ci0JCQkyOjAwIFBhbGVzdGluZQlFRSVzVAkyMDA4IEF1ZyAyOSAwOjAwCisJCQkyOjAwIFBhbGVzdGluZQlFRSVzVAkyMDA4IEF1ZyAyOSAgMDowMAogCQkJMjowMAktCUVFVAkyMDA4IFNlcAogCQkJMjowMCBQYWxlc3RpbmUJRUUlc1QJMjAxMAotCQkJMjowMAktCUVFVAkyMDEwIE1hciAyNyAwOjAxCisJCQkyOjAwCS0JRUVUCTIwMTAgTWFyIDI3ICAwOjAxCiAJCQkyOjAwIFBhbGVzdGluZQlFRSVzVAkyMDExIEF1ZyAgMQogCQkJMjowMAktCUVFVAkyMDEyCiAJCQkyOjAwIFBhbGVzdGluZQlFRSVzVApAQCAtMjM5MywyNSArMjQxNCwyNyBAQAogIyBubyBpbmZvcm1hdGlvbgogCiAjIFBoaWxpcHBpbmVzCi0jIE9uIDE4NDQtMDgtMTYsIE5hcmNpc28gQ2xhdmVyaWEsIGdvdmVybm9yLWdlbmVyYWwgb2YgdGhlCisjIE9uIDE4NDQtMDgtMTYsIE5hcmNpc28gQ2xhdmVyw61hLCBnb3Zlcm5vci1nZW5lcmFsIG9mIHRoZQogIyBQaGlsaXBwaW5lcywgaXNzdWVkIGEgcHJvY2xhbWF0aW9uIGFubm91bmNpbmcgdGhhdCAxODQ0LTEyLTMwIHdhcyB0bwotIyBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSAxODQ1LTAxLTAxLiAgUm9iZXJ0IEguIHZhbiBHZW50IGhhcyBhCi0jIHRyYW5zY3JpcHQgb2YgdGhlIGRlY3JlZSBpbiA8aHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC9pZGwvaWRsLmh0bT4uCi0jIFRoZSByZXN0IG9mIHRoZSBkYXRhIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgMTg0NS0wMS0wMTsgc2VlIFIuSC4gdmFuIEdlbnQncworIyBIaXN0b3J5IG9mIHRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZQorIyBodHRwOi8vd3d3LnN0YWZmLnNjaWVuY2UudXUubmwvfmdlbnQwMTEzL2lkbC9pZGxfcGhpbGlwcGluZXMuaHRtCisjIFRoZSByZXN0IG9mIHRoZSBkYXRhIGVudHJpZXMgYXJlIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLgogCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMjUpOgotIyBUb21vcnJvdydzIE1hbmlsYSBTdGFuZGFyZCByZXBvcnRzIHRoYXQgdGhlIFBoaWxpcHBpbmVzIERlcGFydG1lbnQgb2YKLSMgVHJhZGUgYW5kIEluZHVzdHJ5IGlzIGNvbnNpZGVyaW5nIGFkb3B0aW5nIERTVCB0aGlzIEp1bmUgd2hlbiB0aGUKLSMgcmFpbnkgc2Vhc29uIGJlZ2lucy4gIFNlZQotIyA8aHR0cDovL3d3dy5tYW5pbGFzdGFuZGFyZHRvZGF5LmNvbS8/cGFnZT1wb2xpdGljczAyX2FwcmlsMjZfMjAwNj4uCi0jIEZvciBub3csIHdlJ2xsIGlnbm9yZSB0aGlzLCBzaW5jZSBpdCdzIG5vdCBkZWZpbml0ZSBhbmQgd2UgbGFjayBkZXRhaWxzLgotIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wNC0yNik6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNi0wNC0yNik6CiAjIC4uLiBjbGFpbXMgdGhhdCBQaGlsaXBwaW5lcyBoYWQgRFNUIGxhc3QgdGltZSBpbiAxOTkwOgogIyBodHRwOi8vc3RvcnkucGhpbGlwcGluZXRpbWVzLmNvbS9wLngvY3QvOS9pZC8xNDViZTIwY2M2YjEyMWMwL2NpZC8zZTViYmNjYzczMGQyNThjLwogIyBbYSBzdG9yeSBkYXRlZCAyMDA2LTA0LTI1IGJ5IENyaXMgTGFyYW5vIG9mIERvdyBKb25lcyBOZXdzd2lyZXMsCiAjIGJ1dCBubyBkZXRhaWxzXQogCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDgtMTQpOgorIyBUaGUgZm9sbG93aW5nIHNvdXJjZSBzYXlzIERTVCBtYXkgYmUgaW5zdGl0dXRlZCBOb3ZlbWJlci1KYW51YXJ5IGFuZCBhZ2FpbgorIyBNYXJjaC1KdW5lLCBidXQgdGhpcyBpcyBub3QgZGVmaW5pdGUuICBJdCBhbHNvIHNheXMgRFNUIHdhcyBsYXN0IHByb2NsYWltZWQKKyMgZHVyaW5nIHRoZSBSYW1vcyBhZG1pbmlzdHJhdGlvbiAoMTk5Mi0xOTk4KTsgYnV0IGFnYWluLCBubyBkZXRhaWxzLgorIyBDYXJjYW1vIEQuIFBOb3kgdXJnZWQgdG8gZGVjbGFyZSB1c2Ugb2YgZGF5bGlnaHQgc2F2aW5nIHRpbWUuCisjIFBoaWxpcHBpbmUgU3RhciAyMDE0LTA4LTA1CisjIGh0dHA6Ly93d3cucGhpbHN0YXIuY29tL2hlYWRsaW5lcy8yMDE0LzA4LzA1LzEzNTQxNTIvcG5veS11cmdlZC1kZWNsYXJlLXVzZS1kYXlsaWdodC1zYXZpbmctdGltZQorCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlQaGlsCTE5MzYJb25seQktCU5vdgkxCTA6MDAJMTowMAlTCiBSdWxlCVBoaWwJMTkzNwlvbmx5CS0JRmViCTEJMDowMAkwCS0KQEAgLTI0MjgsMTggKzI0NTEsMzkgQEAKIAogIyBRYXRhcgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1FhdGFyCTM6MjY6MDggLQlMTVQJMTkyMAkjIEFsIERhd2hhaCAvIERvaGEKK1pvbmUJQXNpYS9RYXRhcgkzOjI2OjA4IC0JTE1UCTE5MjAgICAgICMgQWwgRGF3aGFoIC8gRG9oYQogCQkJNDowMAktCUdTVAkxOTcyIEp1bgogCQkJMzowMAktCUFTVAogCiAjIFNhdWRpIEFyYWJpYQorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTE1KToKKyMgVGltZSBpbiBTYXVkaSBBcmFiaWEgYW5kIG90aGVyIGNvdW50cmllcyBpbiB0aGUgQXJhYmlhbiBwZW5pbnN1bGEgd2FzIG5vdAorIyBzdGFuZGFyZGl6ZWQgdW50aWwgcmVsYXRpdmVseSByZWNlbnRseTsgd2UgZG9uJ3Qga25vdyB3aGVuLCBhbmQgcG9zc2libHkgaXQKKyMgaGFzIG5ldmVyIGJlZW4gbWFkZSBvZmZpY2lhbC4gIFJpY2hhcmQgUCBIdW50LCBpbiAiSXNsYW0gY2l0eSB5aWVsZGluZyB0bworIyBtb2Rlcm4gdGltZXMiLCBOZXcgWW9yayBUaW1lcyAoMTk2MS0wNC0wOSksIHAgMjAsIHdyb3RlIHRoYXQgb25seSBhaXJsaW5lcworIyBvYnNlcnZlZCBzdGFuZGFyZCB0aW1lLCBhbmQgdGhhdCBwZW9wbGUgaW4gSmVkZGFoIG1vc3RseSBvYnNlcnZlZCBxdWFzaS1zb2xhcgorIyB0aW1lLCBkb2luZyBzbyBieSBzZXR0aW5nIHRoZWlyIHdhdGNoZXMgYXQgc3VucmlzZSB0byA2IG8nY2xvY2sgKG9yIHRvIDEyCisjIG8nY2xvY2sgZm9yICJBcmFiIiB0aW1lKS4KKyMKKyMgVGhlIFRaIGRhdGFiYXNlIGNhbm5vdCByZXByZXNlbnQgcXVhc2ktc29sYXIgdGltZTsgYWlybGluZSB0aW1lIGlzIHRoZSBiZXN0CisjIHdlIGNhbiBkby4gIFRoZSAxOTQ2IGZvcmVpZ24gYWlyIG5ld3MgZGlnZXN0IG9mIHRoZSBVLlMuIENpdmlsIEFlcm9uYXV0aWNzCisjIEJvYXJkIChPQ0xDIDQyMjk5OTk1KSByZXBvcnRlZCB0aGF0IHRoZSAiLi4uIEFyYWJpYW4gR292ZXJubWVudCwgaW5hdWd1cmF0ZWQKKyMgYSB3ZWVrbHkgRGhhaHJhbi1DYWlybyBzZXJ2aWNlLCB2aWEgdGhlIFNhdWRpIEFyYWJpYW4gY2l0aWVzIG9mIFJpeWFkaCBhbmQKKyMgSmlkZGEsIG9uIE1hcmNoIDE0LCAxOTQ3Ii4gIFNoYW5rcyAmIFBvdHRlbmdlciBndWVzc2VkIDE5NTA7IGdvIHdpdGggdGhlCisjIGVhcmxpZXIgZGF0ZS4KKyMKKyMgU2hhbmtzICYgUG90dGVuZ2VyIGFsc28gc3RhdGUgdGhhdCB1bnRpbCAxOTY4LTA1LTAxIFNhdWRpIEFyYWJpYSBoYWQgdHdvCisjIHRpbWUgem9uZXM7IHRoZSBvdGhlciB6b25lLCBhdCBVVEMrNCwgd2FzIGluIHRoZSBmYXIgZWFzdGVybiBwYXJ0IG9mCisjIHRoZSBjb3VudHJ5LiAgSWdub3JlIHRoaXMsIGFzIGl0J3MgYmVmb3JlIG91ciAxOTcwIGN1dG9mZi4KKyMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9SaXlhZGgJMzowNjo1MiAtCUxNVAkxOTUwCitab25lCUFzaWEvUml5YWRoCTM6MDY6NTIgLQlMTVQJMTk0NyBNYXIgMTQKIAkJCTM6MDAJLQlBU1QKIAogIyBTaW5nYXBvcmUKLSMgVGhlIGRhdGEgaGVyZSBhcmUgdGFrZW4gZnJvbSBNb2sgTHkgWW5nICgyMDAzLTEwLTMwKQotIyA8aHR0cDovL3d3dy5tYXRoLm51cy5lZHUuc2cvYXNsYWtzZW4vdGVhY2hpbmcvdGltZXpvbmUuaHRtbD4uCisjIHRha2VuIGZyb20gTW9rIEx5IFluZyAoMjAwMy0xMC0zMCkKKyMgaHR0cDovL3d3dy5tYXRoLm51cy5lZHUuc2cvYXNsYWtzZW4vdGVhY2hpbmcvdGltZXpvbmUuaHRtbAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL1NpbmdhcG9yZQk2OjU1OjI1IC0JTE1UCTE5MDEgSmFuICAxCiAJCQk2OjU1OjI1CS0JU01UCTE5MDUgSnVuICAxICMgU2luZ2Fwb3JlIE0uVC4KQEAgLTI0NjUsMjYgKzI1MDksMjQgQEAKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA5LTAzKToKICMgIlNyaSBMYW5rYSBhZHZhbmNlcyBjbG9jayBieSBhbiBob3VyIHRvIGF2b2lkIGJsYWNrb3V0IgotIyAod3d3LnZpcnR1YWwtcGMuY29tL2xhbmthd2ViL25ld3MvaXRlbXMvMjQwNTk2LTIuaHRtbCwgMTk5Ni0wNS0yNCwKKyMgKDxodHRwOi8vd3d3LnZpcnR1YWwtcGMuY29tL2xhbmthd2ViL25ld3MvaXRlbXMvMjQwNTk2LTIuaHRtbD4sIDE5OTYtMDUtMjQsCiAjIG5vIGxvbmdlciBhdmFpbGFibGUgYXMgb2YgMTk5OS0wOC0xNykKLSMgcmVwb3J0ZWQgYGB0aGUgY291bnRyeSdzIHN0YW5kYXJkIHRpbWUgd2lsbCBiZSBwdXQgZm9yd2FyZCBieSBvbmUgaG91ciBhdAotIyBtaWRuaWdodCBGcmlkYXkgKDE4MzAgR01UKSBgaW4gdGhlIGxpZ2h0IG9mIHRoZSBwcmVzZW50IHBvd2VyIGNyaXNpcycuJycKKyMgcmVwb3J0ZWQgInRoZSBjb3VudHJ5J3Mgc3RhbmRhcmQgdGltZSB3aWxsIGJlIHB1dCBmb3J3YXJkIGJ5IG9uZSBob3VyIGF0CisjIG1pZG5pZ2h0IEZyaWRheSAoMTgzMCBHTVQpICdpbiB0aGUgbGlnaHQgb2YgdGhlIHByZXNlbnQgcG93ZXIgY3Jpc2lzJy4iCiAjCiAjIEZyb20gRGhhcm1hc2lyaSBTZW5hbmF5YWtlLCBTcmkgTGFua2EgTWVkaWEgTWluaXN0ZXIgKDE5OTYtMTAtMjQpLCBhcyBxdW90ZWQKLSMgYnkgU2hhbWluZHJhIGluCi0jIDxhIGhyZWY9Im5ld3M6NTRya2E1JG01aEBtdGluc2MwMS1tZ3Qub3BzLndvcmxkbmV0LmF0dC5uZXQiPgotIyBEYWlseSBOZXdzIC0gSG90IE5ld3MgU2VjdGlvbiAoMTk5Ni0xMC0yNikKLSMgPC9hPjoKKyMgYnkgU2hhbWluZHJhIGluIERhaWx5IE5ld3MgLSBIb3QgTmV3cyBTZWN0aW9uCisjIDxuZXdzOjU0cmthNSRtNWhAbXRpbnNjMDEtbWd0Lm9wcy53b3JsZG5ldC5hdHQubmV0PiAoMTk5Ni0xMC0yNik6CiAjIFdpdGggZWZmZWN0IGZyb20gMTIuMzAgYS5tLiBvbiAyNnRoIE9jdG9iZXIgMTk5NgogIyBTcmkgTGFua2Egd2lsbCBiZSBzaXggKDA2KSBob3VycyBhaGVhZCBvZiBHTVQuCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDQtMTQpLCBxdW90aW5nIFNyaSBMYW5rYSBOZXdzIE9ubGluZQorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDQtMTQpLCBxdW90aW5nIFNyaSBMYW5rYSBOZXdzIE9ubGluZQogIyA8aHR0cDovL25ld3Muc2luaGFsYXlhLmNvbS93bXZpZXcucGhwP0FydElEPTExMDAyPiAoMjAwNi0wNC0xMyk6CiAjIDAwMzAgaHJzIG9uIEFwcmlsIDE1LCAyMDA2IChtaWRuaWdodCBvZiBBcHJpbCAxNCwgMjAwNiArMzAgbWludXRlcykKICMgYXQgcHJlc2VudCwgYmVjb21lIDI0MDAgaG91cnMgb2YgQXByaWwgMTQsIDIwMDYgKG1pZG5pZ2h0IG9mIEFwcmlsIDE0LCAyMDA2KS4KIAogIyBGcm9tIFBldGVyIEFwcHMgYW5kIFJhbmdhIFNpcmlsYSBvZiBSZXV0ZXJzICgyMDA2LTA0LTEyKSBpbjoKLSMgPGh0dHA6Ly90b2RheS5yZXV0ZXJzLmNvLnVrL25ld3MvbmV3c0FydGljbGUuYXNweD90eXBlPXNjaWVuY2VOZXdzJnN0b3J5SUQ9MjAwNi0wNC0xMlQxNzIyMjhaXzAxX0NPTDI5NTc2Ml9SVFJJRFNUXzBfU0NJRU5DRS1TUklMQU5LQS1USU1FLURDLlhNTD4KKyMgaHR0cDovL3RvZGF5LnJldXRlcnMuY28udWsvbmV3cy9uZXdzQXJ0aWNsZS5hc3B4P3R5cGU9c2NpZW5jZU5ld3Mmc3RvcnlJRD0yMDA2LTA0LTEyVDE3MjIyOFpfMDFfQ09MMjk1NzYyX1JUUklEU1RfMF9TQ0lFTkNFLVNSSUxBTktBLVRJTUUtREMuWE1MCiAjIFtUaGUgVGFtaWwgVGlnZXJzXSBuZXZlciBhY2NlcHRlZCB0aGUgb3JpZ2luYWwgMTk5NiB0aW1lIGNoYW5nZSBhbmQgc2ltcGx5CiAjIGtlcHQgdGhlaXIgY2xvY2tzIHNldCBmaXZlIGFuZCBhIGhhbGYgaG91cnMgYWhlYWQgb2YgR3JlZW53aWNoIE1lYW4KICMgVGltZSAoR01UKSwgaW4gbGluZSB3aXRoIG5laWdoYm9yIEluZGlhLgpAQCAtMjQ5OCw3ICsyNTQwLDcgQEAKICMgdHdpY2UgaW4gMTk5NiBhbmQgcHJvYmFibHkgU0wgR292ZXJubWVudCBvciBpdHMgc3RhbmRhcmRpemF0aW9uCiAjIGFnZW5jaWVzIG5ldmVyIGRlY2xhcmVkIGFuIGFiYnJldmlhdGlvbiBhcyBhIG5hdGlvbmFsIHN0YW5kYXJkLgogIwotIyBJIHJlY29sbGVjdCBiZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2UgdGhlIGdvdmVybm1lbnQgYW5ub3VjZW1tZW50cworIyBJIHJlY29sbGVjdCBiZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2UgdGhlIGdvdmVybm1lbnQgYW5ub3VuY2VtZW50cwogIyBtZW50aW9uaW5nIGl0IGFzIHNpbXBseSBjaGFuZ2luZyBTcmkgTGFua2EgU3RhbmRhcmQgVGltZSBvciBTcmkgTGFua2EKICMgVGltZSBhbmQgbm8gbWVudGlvbiB3YXMgbWFkZSBhYm91dCB0aGUgYWJicmV2aWF0aW9uLgogIwpAQCAtMjUwOCw3ICsyNTUwLDcgQEAKICMgaXRlbS4uLi4KICMKICMgV2l0aGluIFNyaSBMYW5rYSBJIHRoaW5rIExLVCBpcyB3ZWxsIGtub3duIGFtb25nIGNvbXB1dGVyIHVzZXJzIGFuZAotIyBhZG1pbnNpdHJhdG9ycy4gIEluIG15IG9waW5pb24gU0xUIG1heSBub3QgYmUgYSBnb29kIGNob2ljZSBiZWNhdXNlIHRoZQorIyBhZG1pbmlzdHJhdG9ycy4gIEluIG15IG9waW5pb24gU0xUIG1heSBub3QgYmUgYSBnb29kIGNob2ljZSBiZWNhdXNlIHRoZQogIyBuYXRpb24ncyBsYXJnZXN0IHRlbGNvbSAvIGludGVybmV0IG9wZXJhdG9yIFNyaSBMYW5rYSBUZWxjb20gaXMgd2VsbAogIyBrbm93biBieSB0aGF0IGFiYnJldmlhdGlvbiAtIHNpbXBseSBhcyBTTFQgKHRoZXJlIElQIGRvbWFpbnMgYXJlCiAjIHNsdC5sayBhbmQgc2x0bmV0LmxrKS4KQEAgLTI1MjMsMTMgKzI1NjUsMTMgQEAKIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0NvbG9tYm8JNToxOToyNCAtCUxNVAkxODgwCi0JCQk1OjE5OjMyCS0JTU1UCTE5MDYJIyBNb3JhdHV3YSBNZWFuIFRpbWUKKwkJCTU6MTk6MzIJLQlNTVQJMTkwNiAgICAgICAgIyBNb3JhdHV3YSBNZWFuIFRpbWUKIAkJCTU6MzAJLQlJU1QJMTk0MiBKYW4gIDUKIAkJCTU6MzAJMDozMAlJSFNUCTE5NDIgU2VwCi0JCQk1OjMwCTE6MDAJSVNUCTE5NDUgT2N0IDE2IDI6MDAKLQkJCTU6MzAJLQlJU1QJMTk5NiBNYXkgMjUgMDowMAotCQkJNjozMAktCUxLVAkxOTk2IE9jdCAyNiAwOjMwCi0JCQk2OjAwCS0JTEtUCTIwMDYgQXByIDE1IDA6MzAKKwkJCTU6MzAJMTowMAlJU1QJMTk0NSBPY3QgMTYgIDI6MDAKKwkJCTU6MzAJLQlJU1QJMTk5NiBNYXkgMjUgIDA6MDAKKwkJCTY6MzAJLQlMS1QJMTk5NiBPY3QgMjYgIDA6MzAKKwkJCTY6MDAJLQlMS1QJMjAwNiBBcHIgMTUgIDA6MzAKIAkJCTU6MzAJLQlJU1QKIAogIyBTeXJpYQpAQCAtMjU4MCw3ICsyNjIyLDcgQEAKICMgVG9kYXkgdGhlIEFQIHJlcG9ydGVkICJTeXJpYSB3aWxsIHN3aXRjaCB0byBzdW1tZXJ0aW1lIGF0IG1pZG5pZ2h0IFRodXJzZGF5LiIKICMgaHR0cDovL3d3dy5paHQuY29tL2FydGljbGVzL2FwLzIwMDcvMDMvMjkvYWZyaWNhL01FLUdFTi1TeXJpYS1UaW1lLUNoYW5nZS5waHAKIFJ1bGUJU3lyaWEJMjAwNwlvbmx5CS0JTWFyCWxhc3RGcmkJMDowMAkxOjAwCVMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FyZCAoMjAwNy0xMC0yNyk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCAoMjAwNy0xMC0yNyk6CiAjIFRoZSBzaXN0ZXIgY2VudGVyIElDQVJEQSBvZiBteSB3b3JrIENJTU1ZVCBpcyBjb25maXJtaW5nIHRoYXQgU3lyaWEgRFNUIHdpbGwKICMgbm90IHRha2UgcGxhY2UgMXN0IE5vdmVtYmVyIGF0IDA6MDAgbydjbG9jayBidXQgMXN0IE5vdmVtYmVyIGF0IDI0OjAwIG9yCiAjIHJhdGhlciBNaWRuaWdodCBiZXR3ZWVuIFRodXJzZGF5IGFuZCBGcmlkYXkuIFRoaXMgZG9lcyBtYWtlIG1vcmUgc2Vuc2UgdGhhbgpAQCAtMjU4OSw3ICsyNjMxLDcgQEAKICMgaXQgaXMgaW1wbGVtZW50ZWQgYXQgbWlkbmlnaHQgb2YgdGhlIGxhc3Qgd29ya2RheSBiZWZvcmUgd2Vla2VuZC4uLgogIwogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0xMC0yNyk6Ci0jIEplc3BlciBOb3JnYWFyZCBXZWxlbiB3cm90ZToKKyMgSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiB3cm90ZToKICMKICMgPiAiV2ludGVyIGxvY2FsIHRpbWUgaW4gU3lyaWEgd2lsbCBiZSBvYnNlcnZlZCBhdCBtaWRuaWdodCBvZiBUaHVyc2RheSAxCiAjID4gTm92ZW1iZXIgMjAwNywgYW5kIHRoZSBjbG9jayB3aWxsIGJlIHB1dCBiYWNrIDEgaG91ci4iCkBAIC0yNjA1LDggKzI2NDcsNyBAQAogCiAjIEZyb20gU3RlcGhlbiBDb2xlYm91cm5lICgyMDA4LTAzLTE3KToKICMgRm9yIGV2ZXJ5b25lJ3MgaW5mbywgSSBzYXcgYW4gSUFUQSB0aW1lIHpvbmUgY2hhbmdlIGZvciBbU3lyaWFdIGZvcgotIyB0aGlzIG1vbnRoIChNYXJjaCAyMDA4KSBpbiB0aGUgbGFzdCBkYXkgb3Igc28uLi5UaGlzIGlzIHRoZSBkYXRhIElBVEEKLSMgYXJlIG5vdyB1c2luZzoKKyMgdGhpcyBtb250aCAoTWFyY2ggMjAwOCkgaW4gdGhlIGxhc3QgZGF5IG9yIHNvLi4uLgogIyBDb3VudHJ5ICAgICBUaW1lIFN0YW5kYXJkICAgLS0tIERTVCBTdGFydCAtLS0gICAtLS0gRFNUIEVuZCAtLS0gIERTVAogIyBOYW1lICAgICAgICBab25lIFZhcmlhdGlvbiAgIFRpbWUgICAgRGF0ZSAgICAgICAgVGltZSAgICBEYXRlCiAjIFZhcmlhdGlvbgpAQCAtMjYxOCwxNiArMjY1OSwxNSBAQAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0xNyk6CiAjIEhlcmUncyBhIGxpbmsgdG8gRW5nbGlzaC1sYW5ndWFnZSBjb3ZlcmFnZSBieSB0aGUgU3lyaWFuIEFyYWIgTmV3cwogIyBBZ2VuY3kgKFNBTkEpLi4uCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOC8wMy8xMS8xNjUxNzMuaHRtIj4KICMgaHR0cDovL3d3dy5zYW5hLnN5L2VuZy8yMS8yMDA4LzAzLzExLzE2NTE3My5odG0KLSMgPC9hPi4uLndoaWNoIHJlYWRzIChpbiBwYXJ0KSAiVGhlIENhYmluZXQgYXBwcm92ZWQgdGhlIHN1Z2dlc3Rpb24gb2YgdGhlCisjIC4uLndoaWNoIHJlYWRzIChpbiBwYXJ0KSAiVGhlIENhYmluZXQgYXBwcm92ZWQgdGhlIHN1Z2dlc3Rpb24gb2YgdGhlCiAjIE1pbmlzdHJ5IG9mIEVsZWN0cmljaXR5IHRvIGJlZ2luIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBvbiBGcmlkYXkgQXByaWwKICMgNHRoLCBhZHZhbmNpbmcgY2xvY2tzIG9uZSBob3VyIGFoZWFkIG9uIG1pZG5pZ2h0IG9mIFRodXJzZGF5IEFwcmlsIDNyZC4iCiAjIFNpbmNlIFN5cmlhIGlzIHR3byBob3VycyBlYXN0IG9mIFVUQywgdGhlIDIyMDAgYW5kIDIxMDAgdHJhbnNpdGlvbiB0aW1lcwogIyBzaG93biBhYm92ZSBtYXRjaCB1cCB3aXRoIG1pZG5pZ2h0IGluIFN5cmlhLgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTE4KToKLSMgTXkgYnVlc3QgZ3Vlc3MgYXQgYSBTeXJpYW4gcnVsZSBpcyAidGhlIEZyaWRheSBuZWFyZXN0IEFwcmlsIDEiOworIyBNeSBiZXN0IGd1ZXNzIGF0IGEgU3lyaWFuIHJ1bGUgaXMgInRoZSBGcmlkYXkgbmVhcmVzdCBBcHJpbCAxIjsKICMgY29kaW5nIHRoYXQgaW52b2x2ZXMgZWl0aGVyIHVzaW5nIGEgIk1hciBGcmk+PTI5IiBjb25zdHJ1Y3QgdGhhdCBvbGQgdGltZSB6b25lCiAjIGNvbXBpbGVycyBjYW4ndCBoYW5kbGUgIG9yIGhhdmluZyBtdWx0aXBsZSBSdWxlcyAoYSBsYSBJc3JhZWwpLgogIyBGb3Igbm93LCB1c2UgIkFwciBGcmk+PTEiLCBhbmQgZ28gd2l0aCBJQVRBIG9uIGEgdW5pZm9ybSBTZXAgMzAgZW5kLgpAQCAtMjY0MCwzNyArMjY4MCwyNyBAQAogIyB3aW50ZXIgdGltZSBvbiAyMDA4LTExLTAxIGF0IDAwOjAwIGxvY2FsIGRheWxpZ2h0IHRpbWUgKGRlbGF5aW5nL3NldHRpbmcKICMgY2xvY2tzIGJhY2sgNjAgbWludXRlcykuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly9zYW5hLnN5L2FyYS8yLzIwMDgvMTAvMDcvMTk1NDU5Lmh0bSI+CiAjIGh0dHA6Ly9zYW5hLnN5L2FyYS8yLzIwMDgvMTAvMDcvMTk1NDU5Lmh0bQotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDMtMTkpOgogIyBTeXJpYSB3aWxsIHN0YXJ0IERTVCBvbiAyMDA5LTAzLTI3IDAwOjAwIHRoaXMgeWVhciBhY2NvcmRpbmcgdG8gbWFueSBzb3VyY2VzLAogIyB0d28gZXhhbXBsZXM6CiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOS8wMy8xNy8yMTc1NjMuaHRtIj4KICMgaHR0cDovL3d3dy5zYW5hLnN5L2VuZy8yMS8yMDA5LzAzLzE3LzIxNzU2My5odG0KLSMgPC9hPgogIyAoRW5nbGlzaCwgU3lyaWFuIEFyYWIgTmV3cyAjIEFnZW5jeSkKLSMgPGEgaHJlZj0iaHR0cDovL3RoYXdyYS5hbHdlaGRhLmdvdi5zeS9fVmlld19uZXdzMi5hc3A/RmlsZU5hbWU9OTQ0NTkyNTg3MjAwOTAzMTgwMTIyMDkiPgogIyBodHRwOi8vdGhhd3JhLmFsd2VoZGEuZ292LnN5L19WaWV3X25ld3MyLmFzcD9GaWxlTmFtZT05NDQ1OTI1ODcyMDA5MDMxODAxMjIwOQotIyA8L2E+CiAjIChBcmFiaWMsIGdvdi1zaXRlKQogIwogIyBXZSBoYXZlIG5vdCBmb3VuZCBhbnkgc291cmNlcyBzYXlpbmcgYW55dGhpbmcgYWJvdXQgd2hlbiBEU1QgZW5kcyB0aGlzIHllYXIuCiAjCiAjIE91ciBzdW1tYXJ5Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zeXJpYS1kc3Qtc3RhcnRzLW1hcmNoLTI3LTIwMDkuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zeXJpYS1kc3Qtc3RhcnRzLW1hcmNoLTI3LTIwMDkuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMTAtMjcpOgogIyBUaGUgU3lyaWFuIEFyYWIgTmV3cyBOZXR3b3JrIG9uIDIwMDktMDktMjkgcmVwb3J0ZWQgdGhhdCBTeXJpYSB3aWxsCiAjIHJldmVydCBiYWNrIHRvIHdpbnRlciAoc3RhbmRhcmQpIHRpbWUgb24gbWlkbmlnaHQgYmV0d2VlbiBUaHVyc2RheQogIyAyMDA5LTEwLTI5IGFuZCBGcmlkYXkgMjAwOS0xMC0zMDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5hLnN5L2FyYS8yLzIwMDkvMDkvMjkvMjQ3MDEyLmh0bSI+CiAjIGh0dHA6Ly93d3cuc2FuYS5zeS9hcmEvMi8yMDA5LzA5LzI5LzI0NzAxMi5odG0gKEFyYWJpYykKLSMgPC9hPgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LTEwLTI4KToKICMgV2UnbGwgc2VlIGlmIGZ1dHVyZSBEU1Qgc3dpdGNoaW5nIHRpbWVzIHR1cm4gb3V0IHRvIGJlIGVuZCBvZiB0aGUgbGFzdApAQCAtMjY4MSwyMyArMjcxMSwxNyBAQAogIyBUaGUgIlN5cmlhbiBOZXdzIFN0YXRpb24iIHJlcG9ydGVkIG9uIDIwMTAtMDMtMTYgdGhhdCB0aGUgQ291bmNpbCBvZgogIyBNaW5pc3RlcnMgaGFzIGRlY2lkZWQgdGhhdCBTeXJpYSB3aWxsIHN0YXJ0IERTVCBvbiBtaWRuaWdodCBUaHVyc2RheQogIyAyMDEwLTA0LTAxOiAobWlkbmlnaHQgYmV0d2VlbiBUaHVyc2RheSBhbmQgRnJpZGF5KToKLSMgPGEgaHJlZj0iaHR0cDovL3Nucy5zeS9zbnMvP3BhdGg9bmV3cy9yZWFkLzExNDIxIj4KICMgaHR0cDovL3Nucy5zeS9zbnMvP3BhdGg9bmV3cy9yZWFkLzExNDIxIChBcmFiaWMpCi0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMi0wMy0yNik6CiAjIFRvZGF5LCBTeXJpYSdzIGdvdmVybm1lbnQgYW5ub3VuY2VkIHRoYXQgdGhleSB3aWxsIHN0YXJ0IERTVCBlYXJseSBvbiBGcmlkYXkKICMgKDAwOjAwKS4gVGhpcyBpcyBhIGJpdCBlYXJsaWVyIHRoYW4gdGhlIHBhc3QgdHdvIHllYXJzLgogIwogIyBGcm9tIFN5cmlhbiBBcmFiIE5ld3MgQWdlbmN5LCBpbiBBcmFiaWM6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FuYS5zeS9hcmEvMi8yMDEyLzAzLzI2LzQwODIxNS5odG0iPgogIyBodHRwOi8vd3d3LnNhbmEuc3kvYXJhLzIvMjAxMi8wMy8yNi80MDgyMTUuaHRtCi0jIDwvYT4KICMKICMgT3VyIGJyaWVmIHN1bW1hcnk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zeXJpYS1kc3QtMjAxMi5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3N5cmlhLWRzdC0yMDEyLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDEyLTAzLTI3KToKICMgQXNzdW1lIGxhc3QgRnJpZGF5IGluIE1hcmNoIGdvaW5nIGZvcndhcmQgWFhYLgpAQCAtMjcxMCw3ICsyNzM0LDcgQEAKIFJ1bGUJU3lyaWEJMjAwOQltYXgJLQlPY3QJbGFzdEZyaQkwOjAwCTAJLQogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRGFtYXNjdXMJMjoyNToxMiAtCUxNVAkxOTIwCSMgRGltYXNocQorWm9uZQlBc2lhL0RhbWFzY3VzCTI6MjU6MTIgLQlMTVQJMTkyMCAjIERpbWFzaHEKIAkJCTI6MDAJU3lyaWEJRUUlc1QKIAogIyBUYWppa2lzdGFuCkBAIC0yNzE4LDkgKzI3NDIsOSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0R1c2hhbmJlCTQ6MzU6MTIgLQlMTVQJMTkyNCBNYXkgIDIKIAkJCTU6MDAJLQlEVVNUCTE5MzAgSnVuIDIxICMgRHVzaGFuYmUgVGltZQotCQkJNjowMCBSdXNzaWFBc2lhIERVUyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJNTowMAkxOjAwCURVU1NUCTE5OTEgU2VwICA5IDI6MDBzCi0JCQk1OjAwCS0JVEpUCQkgICAgIyBUYWppa2lzdGFuIFRpbWUKKwkJCTY6MDAgUnVzc2lhQXNpYSBEVVMlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQk1OjAwCTE6MDAJRFVTU1QJMTk5MSBTZXAgIDkgIDI6MDBzCisJCQk1OjAwCS0JVEpUCSMgVGFqaWtpc3RhbiBUaW1lCiAKICMgVGhhaWxhbmQKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KQEAgLTI3MzMsOSArMjc1Nyw5IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvQXNoZ2FiYXQJMzo1MzozMiAtCUxNVAkxOTI0IE1heSAgMiAjIG9yIEFzaGtoYWJhZAogCQkJNDowMAktCUFTSFQJMTkzMCBKdW4gMjEgIyBBc2hraGFiYWQgVGltZQotCQkJNTowMCBSdXNzaWFBc2lhCUFTSCVzVAkxOTkxIE1hciAzMSAyOjAwCisJCQk1OjAwIFJ1c3NpYUFzaWEJQVNIJXNUCTE5OTEgTWFyIDMxICAyOjAwCiAJCQk0OjAwIFJ1c3NpYUFzaWEJQVNIJXNUCTE5OTEgT2N0IDI3ICMgaW5kZXBlbmRlbmNlCi0JCQk0OjAwIFJ1c3NpYUFzaWEJVE0lc1QJMTk5MiBKYW4gMTkgMjowMAorCQkJNDowMCBSdXNzaWFBc2lhCVRNJXNUCTE5OTIgSmFuIDE5ICAyOjAwCiAJCQk1OjAwCS0JVE1UCiAKICMgVW5pdGVkIEFyYWIgRW1pcmF0ZXMKQEAgLTI3NDQsOCArMjc2OCw5IEBACiAJCQk0OjAwCS0JR1NUCiAKICMgVXpiZWtpc3RhbgorIyBCeWFsb2tveiAxOTE5IHNheXMgVXpiZWtpc3RhbiB3YXMgNDoyNzo1My4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9TYW1hcmthbmQJNDoyNzoxMiAtCUxNVAkxOTI0IE1heSAgMgorWm9uZQlBc2lhL1NhbWFya2FuZAk0OjI3OjUzIC0JTE1UCTE5MjQgTWF5ICAyCiAJCQk0OjAwCS0JU0FNVAkxOTMwIEp1biAyMSAjIFNhbWFya2FuZCBUaW1lCiAJCQk1OjAwCS0JU0FNVAkxOTgxIEFwciAgMQogCQkJNTowMAkxOjAwCVNBTVNUCTE5ODEgT2N0ICAxCkBAIC0yNzUzLDkgKzI3NzgsMTAgQEAKIAkJCTU6MDAgUnVzc2lhQXNpYQlTQU0lc1QJMTk5MSBTZXAgIDEgIyBpbmRlcGVuZGVuY2UKIAkJCTU6MDAgUnVzc2lhQXNpYQlVWiVzVAkxOTkyCiAJCQk1OjAwCS0JVVpUCi1ab25lCUFzaWEvVGFzaGtlbnQJNDozNzoxMiAtCUxNVAkxOTI0IE1heSAgMgorIyBNaWxuZSBzYXlzIFRhc2hrZW50IHdhcyA0OjM3OjEwLjg7IHJvdW5kIHRvIG5lYXJlc3QuCitab25lCUFzaWEvVGFzaGtlbnQJNDozNzoxMSAtCUxNVAkxOTI0IE1heSAgMgogCQkJNTowMAktCVRBU1QJMTkzMCBKdW4gMjEgIyBUYXNoa2VudCBUaW1lCi0JCQk2OjAwIFJ1c3NpYUFzaWEJVEFTJXNUCTE5OTEgTWFyIDMxIDI6MDAKKwkJCTY6MDAgUnVzc2lhQXNpYQlUQVMlc1QJMTk5MSBNYXIgMzEgIDI6MDAKIAkJCTU6MDAgUnVzc2lhQXNpYQlUQVMlc1QJMTk5MSBTZXAgIDEgIyBpbmRlcGVuZGVuY2UKIAkJCTU6MDAgUnVzc2lhQXNpYQlVWiVzVAkxOTkyCiAJCQk1OjAwCS0JVVpUCkBAIC0yNzY5LDEzICsyNzk1LDEzIEBACiAjIGFuZCBQb3R0ZW5nZXIuCiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDMtMTgpOgotIyBUaGUgRW5nbGlzaC1sYW5ndWFnZSBuYW1lIG9mIFZpZXRuYW0ncyBtb3N0IHBvcHVsb3VzIGNpdHkgaXMgIkhvIENoaSBNaW4gQ2l0eSI7Ci0jIHdlIHVzZSBIb19DaGlfTWluaCBiZWxvdyB0byBhdm9pZCBhIG5hbWUgb2YgbW9yZSB0aGFuIDE0IGNoYXJhY3RlcnMuCisjIFRoZSBFbmdsaXNoLWxhbmd1YWdlIG5hbWUgb2YgVmlldG5hbSdzIG1vc3QgcG9wdWxvdXMgY2l0eSBpcyAiSG8gQ2hpIE1pbmgKKyMgQ2l0eSI7IHVzZSBIb19DaGlfTWluaCBiZWxvdyB0byBhdm9pZCBhIG5hbWUgb2YgbW9yZSB0aGFuIDE0IGNoYXJhY3RlcnMuCiAKICMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6CiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvSG9fQ2hpX01pbmgJNzowNjo0MCAtCUxNVAkxOTA2IEp1biAgOQotCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAwOjAxICMgU2FpZ29uIE1UPworCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAgMDowMSAjIFNhaWdvbiBNVD8KIAkJCTc6MDAJLQlJQ1QJMTkxMiBNYXkKIAkJCTg6MDAJLQlJQ1QJMTkzMSBNYXkKIAkJCTc6MDAJLQlJQ1QKZGlmZiAtLWdpdCBhL21ha2UvZGF0YS90emRhdGEvYXVzdHJhbGFzaWEgYi9tYWtlL2RhdGEvdHpkYXRhL2F1c3RyYWxhc2lhCmluZGV4IDk0YzlhZGIuLjUyZDMyOTAgMTAwNjQ0Ci0tLSBhL21ha2UvZGF0YS90emRhdGEvYXVzdHJhbGFzaWEKKysrIGIvbWFrZS9kYXRhL3R6ZGF0YS9hdXN0cmFsYXNpYQpAQCAtMjEsNyArMjEsNiBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKQEAgLTM2LDEzICszNSwxMyBAQAogIyBQbGVhc2Ugc2VlIHRoZSBub3RlcyBiZWxvdyBmb3IgdGhlIGNvbnRyb3ZlcnN5IGFib3V0ICJFU1QiIHZlcnN1cyAiQUVTVCIgZXRjLgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBdXMJMTkxNwlvbmx5CS0JSmFuCSAxCTA6MDEJMTowMAktCi1SdWxlCUF1cwkxOTE3CW9ubHkJLQlNYXIJMjUJMjowMAkwCS0KLVJ1bGUJQXVzCTE5NDIJb25seQktCUphbgkgMQkyOjAwCTE6MDAJLQotUnVsZQlBdXMJMTk0Mglvbmx5CS0JTWFyCTI5CTI6MDAJMAktCi1SdWxlCUF1cwkxOTQyCW9ubHkJLQlTZXAJMjcJMjowMAkxOjAwCS0KLVJ1bGUJQXVzCTE5NDMJMTk0NAktCU1hcglsYXN0U3VuCTI6MDAJMAktCi1SdWxlCUF1cwkxOTQzCW9ubHkJLQlPY3QJIDMJMjowMAkxOjAwCS0KK1J1bGUJQXVzCTE5MTcJb25seQktCUphbgkgMQkwOjAxCTE6MDAJRAorUnVsZQlBdXMJMTkxNwlvbmx5CS0JTWFyCTI1CTI6MDAJMAlTCitSdWxlCUF1cwkxOTQyCW9ubHkJLQlKYW4JIDEJMjowMAkxOjAwCUQKK1J1bGUJQXVzCTE5NDIJb25seQktCU1hcgkyOQkyOjAwCTAJUworUnVsZQlBdXMJMTk0Mglvbmx5CS0JU2VwCTI3CTI6MDAJMTowMAlECitSdWxlCUF1cwkxOTQzCTE5NDQJLQlNYXIJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlBdXMJMTk0Mwlvbmx5CS0JT2N0CSAzCTI6MDAJMTowMAlECiAjIEdvIHdpdGggV2hpdG1hbiBhbmQgdGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgU3RhbmRhcmRzIENvbW1pc3Npb24sIHdoaWNoCiAjIHNheXMgVyBBdXN0cmFsaWEgZGlkbid0IHVzZSBEU1QgaW4gMTk0My8xOTQ0LiAgSWdub3JlIFdoaXRtYW4ncyBjbGFpbSB0aGF0CiAjIDE5NDQvMTk0NSB3YXMganVzdCBsaWtlIDE5NDMvMTk0NC4KQEAgLTUwLDI2ICs0OSwyNiBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogIyBOb3J0aGVybiBUZXJyaXRvcnkKIFpvbmUgQXVzdHJhbGlhL0RhcndpbgkgODo0MzoyMCAtCUxNVAkxODk1IEZlYgotCQkJIDk6MDAJLQlDU1QJMTg5OSBNYXkKLQkJCSA5OjMwCUF1cwlDU1QKKwkJCSA5OjAwCS0JQUNTVAkxODk5IE1heQorCQkJIDk6MzAJQXVzCUFDJXNUCiAjIFdlc3Rlcm4gQXVzdHJhbGlhCiAjCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBVwkxOTc0CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVcJMTk3NQlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVcJMTk4Mwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFXCTE5ODQJb25seQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFXCTE5OTEJb25seQktCU5vdgkxNwkyOjAwcwkxOjAwCS0KLVJ1bGUJQVcJMTk5Mglvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVcJMjAwNglvbmx5CS0JRGVjCSAzCTI6MDBzCTE6MDAJLQotUnVsZQlBVwkyMDA3CTIwMDkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVcJMjAwNwkyMDA4CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCitSdWxlCUFXCTE5NzQJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBVwkxOTc1CW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVwkxOTgzCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVcJMTk4NAlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQVcJMTk5MQlvbmx5CS0JTm92CTE3CTI6MDBzCTE6MDAJRAorUnVsZQlBVwkxOTkyCW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVwkyMDA2CW9ubHkJLQlEZWMJIDMJMjowMHMJMTowMAlECitSdWxlCUFXCTIwMDcJMjAwOQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVwkyMDA3CTIwMDgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKIFpvbmUgQXVzdHJhbGlhL1BlcnRoCSA3OjQzOjI0IC0JTE1UCTE4OTUgRGVjCi0JCQkgODowMAlBdXMJV1NUCTE5NDMgSnVsCi0JCQkgODowMAlBVwlXU1QKKwkJCSA4OjAwCUF1cwlBVyVzVAkxOTQzIEp1bAorCQkJIDg6MDAJQVcJQVclc1QKIFpvbmUgQXVzdHJhbGlhL0V1Y2xhCSA4OjM1OjI4IC0JTE1UCTE4OTUgRGVjCi0JCQkgODo0NQlBdXMJQ1dTVAkxOTQzIEp1bAotCQkJIDg6NDUJQVcJQ1dTVAorCQkJIDg6NDUJQXVzCUFDVyVzVAkxOTQzIEp1bAorCQkJIDg6NDUJQVcJQUNXJXNUCiAKICMgUXVlZW5zbGFuZAogIwpAQCAtODUsMTUwICs4NCwxNTAgQEAKICMgc28gdXNlIExpbmRlbWFuLgogIwogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQVEJMTk3MQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFRCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBUQkxOTg5CTE5OTEJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVEJMTk5MAkxOTkyCS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJSG9saWRheQkxOTkyCTE5OTMJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJSG9saWRheQkxOTkzCTE5OTQJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQorUnVsZQlBUQkxOTcxCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVEJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFRCTE5ODkJMTk5MQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBUQkxOTkwCTE5OTIJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlIb2xpZGF5CTE5OTIJMTk5MwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlIb2xpZGF5CTE5OTMJMTk5NAktCU1hcglTdW4+PTEJMjowMHMJMAlTCiBab25lIEF1c3RyYWxpYS9CcmlzYmFuZQkxMDoxMjowOCAtCUxNVAkxODk1Ci0JCQkxMDowMAlBdXMJRVNUCTE5NzEKLQkJCTEwOjAwCUFRCUVTVAorCQkJMTA6MDAJQXVzCUFFJXNUCTE5NzEKKwkJCTEwOjAwCUFRCUFFJXNUCiBab25lIEF1c3RyYWxpYS9MaW5kZW1hbiAgOTo1NTo1NiAtCUxNVAkxODk1Ci0JCQkxMDowMAlBdXMJRVNUCTE5NzEKLQkJCTEwOjAwCUFRCUVTVAkxOTkyIEp1bAotCQkJMTA6MDAJSG9saWRheQlFU1QKKwkJCTEwOjAwCUF1cwlBRSVzVAkxOTcxCisJCQkxMDowMAlBUQlBRSVzVAkxOTkyIEp1bAorCQkJMTA6MDAJSG9saWRheQlBRSVzVAogCiAjIFNvdXRoIEF1c3RyYWxpYQogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQVMJMTk3MQkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFTCTE5ODYJb25seQktCU9jdAkxOQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVMJMTk4NwkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFTCTE5NzIJb25seQktCUZlYgkyNwkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk3MwkxOTg1CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk4NgkxOTkwCS0JTWFyCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCUFTCTE5OTEJb25seQktCU1hcgkzCTI6MDBzCTAJLQotUnVsZQlBUwkxOTkyCW9ubHkJLQlNYXIJMjIJMjowMHMJMAktCi1SdWxlCUFTCTE5OTMJb25seQktCU1hcgk3CTI6MDBzCTAJLQotUnVsZQlBUwkxOTk0CW9ubHkJLQlNYXIJMjAJMjowMHMJMAktCi1SdWxlCUFTCTE5OTUJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBUwkyMDA2CW9ubHkJLQlBcHIJMgkyOjAwcwkwCS0KLVJ1bGUJQVMJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFTCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVMJMjAwOAltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQorUnVsZQlBUwkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVMJMTk4Nglvbmx5CS0JT2N0CTE5CTI6MDBzCTE6MDAJRAorUnVsZQlBUwkxOTg3CTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVMJMTk3Mglvbmx5CS0JRmViCTI3CTI6MDBzCTAJUworUnVsZQlBUwkxOTczCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBUwkxOTg2CTE5OTAJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCVMKK1J1bGUJQVMJMTk5MQlvbmx5CS0JTWFyCTMJMjowMHMJMAlTCitSdWxlCUFTCTE5OTIJb25seQktCU1hcgkyMgkyOjAwcwkwCVMKK1J1bGUJQVMJMTk5Mwlvbmx5CS0JTWFyCTcJMjowMHMJMAlTCitSdWxlCUFTCTE5OTQJb25seQktCU1hcgkyMAkyOjAwcwkwCVMKK1J1bGUJQVMJMTk5NQkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFTCTIwMDYJb25seQktCUFwcgkyCTI6MDBzCTAJUworUnVsZQlBUwkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVMJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBUwkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEF1c3RyYWxpYS9BZGVsYWlkZQk5OjE0OjIwIC0JTE1UCTE4OTUgRmViCi0JCQk5OjAwCS0JQ1NUCTE4OTkgTWF5Ci0JCQk5OjMwCUF1cwlDU1QJMTk3MQotCQkJOTozMAlBUwlDU1QKKwkJCTk6MDAJLQlBQ1NUCTE4OTkgTWF5CisJCQk5OjMwCUF1cwlBQyVzVAkxOTcxCisJCQk5OjMwCUFTCUFDJXNUCiAKICMgVGFzbWFuaWEKICMKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0xNik6Ci0jIDxodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sPgorIyBodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sCiAjIHNheXMgS2luZyBJc2xhbmQgZGlkbid0IG9ic2VydmUgRFNUIGZyb20gV1dJSSB1bnRpbCBsYXRlIDE5NzEuCiAjCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBVAkxOTY3CW9ubHkJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkxOTY4CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk2OAkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFUCTE5NjkJMTk3MQktCU1hcglTdW4+PTgJMjowMHMJMAktCi1SdWxlCUFUCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkxOTczCTE5ODEJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVAkxOTgyCTE5ODMJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk4NAkxOTg2CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk4Nglvbmx5CS0JT2N0CVN1bj49MTUJMjowMHMJMTowMAktCi1SdWxlCUFUCTE5ODcJMTk5MAktCU1hcglTdW4+PTE1CTI6MDBzCTAJLQotUnVsZQlBVAkxOTg3CW9ubHkJLQlPY3QJU3VuPj0yMgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk4OAkxOTkwCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFUCTE5OTEJMTk5OQktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi1SdWxlCUFUCTE5OTEJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMjAwMQltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVAkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVQJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQorUnVsZQlBVAkxOTY3CW9ubHkJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJRAorUnVsZQlBVAkxOTY4CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVQJMTk2OAkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFUCTE5NjkJMTk3MQktCU1hcglTdW4+PTgJMjowMHMJMAlTCitSdWxlCUFUCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVAkxOTczCTE5ODEJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVAkxOTgyCTE5ODMJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVQJMTk4NAkxOTg2CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQVQJMTk4Nglvbmx5CS0JT2N0CVN1bj49MTUJMjowMHMJMTowMAlECitSdWxlCUFUCTE5ODcJMTk5MAktCU1hcglTdW4+PTE1CTI6MDBzCTAJUworUnVsZQlBVAkxOTg3CW9ubHkJLQlPY3QJU3VuPj0yMgkyOjAwcwkxOjAwCUQKK1J1bGUJQVQJMTk4OAkxOTkwCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFUCTE5OTEJMTk5OQktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECitSdWxlCUFUCTE5OTEJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVAkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVQJMjAwMQltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJRAorUnVsZQlBVAkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVAkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVQJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBdXN0cmFsaWEvSG9iYXJ0CTk6NDk6MTYJLQlMTVQJMTg5NSBTZXAKLQkJCTEwOjAwCS0JRVNUCTE5MTYgT2N0IDEgMjowMAotCQkJMTA6MDAJMTowMAlFU1QJMTkxNyBGZWIKLQkJCTEwOjAwCUF1cwlFU1QJMTk2NwotCQkJMTA6MDAJQVQJRVNUCisJCQkxMDowMAktCUFFU1QJMTkxNiBPY3QgIDEgIDI6MDAKKwkJCTEwOjAwCTE6MDAJQUVEVAkxOTE3IEZlYgorCQkJMTA6MDAJQXVzCUFFJXNUCTE5NjcKKwkJCTEwOjAwCUFUCUFFJXNUCiBab25lIEF1c3RyYWxpYS9DdXJyaWUJOTozNToyOAktCUxNVAkxODk1IFNlcAotCQkJMTA6MDAJLQlFU1QJMTkxNiBPY3QgMSAyOjAwCi0JCQkxMDowMAkxOjAwCUVTVAkxOTE3IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTcxIEp1bAotCQkJMTA6MDAJQVQJRVNUCisJCQkxMDowMAktCUFFU1QJMTkxNiBPY3QgIDEgIDI6MDAKKwkJCTEwOjAwCTE6MDAJQUVEVAkxOTE3IEZlYgorCQkJMTA6MDAJQXVzCUFFJXNUCTE5NzEgSnVsCisJCQkxMDowMAlBVAlBRSVzVAogCiAjIFZpY3RvcmlhCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBVgkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFWCTE5NzMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTE5ODYJMTk5MAktCU1hcglTdW4+PTE1CTI6MDBzCTAJLQotUnVsZQlBVgkxOTg2CTE5ODcJLQlPY3QJU3VuPj0xNQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMTk4OAkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFWCTE5OTEJMTk5NAktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTE5OTUJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFWCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KK1J1bGUJQVYJMTk3MQkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFWCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVgkxOTczCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVgkxOTg2CTE5OTAJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCVMKK1J1bGUJQVYJMTk4NgkxOTg3CS0JT2N0CVN1bj49MTUJMjowMHMJMTowMAlECitSdWxlCUFWCTE5ODgJMTk5OQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBVgkxOTkxCTE5OTQJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVgkxOTk1CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVYJMjAwMAlvbmx5CS0JQXVnCWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFWCTIwMDEJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBVgkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVgkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVYJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVgkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEF1c3RyYWxpYS9NZWxib3VybmUgOTozOTo1MiAtCUxNVAkxODk1IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTcxCi0JCQkxMDowMAlBVglFU1QKKwkJCTEwOjAwCUF1cwlBRSVzVAkxOTcxCisJCQkxMDowMAlBVglBRSVzVAogCiAjIE5ldyBTb3V0aCBXYWxlcwogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQU4JMTk3MQkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFOCTE5NzIJb25seQktCUZlYgkyNwkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk3MwkxOTgxCS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk4Mglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk4MwkxOTg1CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk4NgkxOTg5CS0JTWFyCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCUFOCTE5ODYJb25seQktCU9jdAkxOQkyOjAwcwkxOjAwCS0KLVJ1bGUJQU4JMTk4NwkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFOCTE5OTAJMTk5NQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBTgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQU4JMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFOCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBTgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KK1J1bGUJQU4JMTk3MQkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFOCTE5NzIJb25seQktCUZlYgkyNwkyOjAwcwkwCVMKK1J1bGUJQU4JMTk3MwkxOTgxCS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQU4JMTk4Mglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQU4JMTk4MwkxOTg1CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQU4JMTk4NgkxOTg5CS0JTWFyCVN1bj49MTUJMjowMHMJMAlTCitSdWxlCUFOCTE5ODYJb25seQktCU9jdAkxOQkyOjAwcwkxOjAwCUQKK1J1bGUJQU4JMTk4NwkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFOCTE5OTAJMTk5NQktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFOCTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBTgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQU4JMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFOCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFOCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBTgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFOCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCUQKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQXVzdHJhbGlhL1N5ZG5leQkxMDowNDo1MiAtCUxNVAkxODk1IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTcxCi0JCQkxMDowMAlBTglFU1QKKwkJCTEwOjAwCUF1cwlBRSVzVAkxOTcxCisJCQkxMDowMAlBTglBRSVzVAogWm9uZSBBdXN0cmFsaWEvQnJva2VuX0hpbGwgOToyNTo0OCAtCUxNVAkxODk1IEZlYgotCQkJMTA6MDAJLQlFU1QJMTg5NiBBdWcgMjMKLQkJCTk6MDAJLQlDU1QJMTg5OSBNYXkKLQkJCTk6MzAJQXVzCUNTVAkxOTcxCi0JCQk5OjMwCUFOCUNTVAkyMDAwCi0JCQk5OjMwCUFTCUNTVAorCQkJMTA6MDAJLQlBRVNUCTE4OTYgQXVnIDIzCisJCQk5OjAwCS0JQUNTVAkxODk5IE1heQorCQkJOTozMAlBdXMJQUMlc1QJMTk3MQorCQkJOTozMAlBTglBQyVzVAkyMDAwCisJCQk5OjMwCUFTCUFDJXNUCiAKICMgTG9yZCBIb3dlIElzbGFuZAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTEgJMTk4MQkxOTg0CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCS0KLVJ1bGUJTEgJMTk4MgkxOTg1CS0JTWFyCVN1bj49MQkyOjAwCTAJLQotUnVsZQlMSAkxOTg1CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNQkyOjAwCTAJLQotUnVsZQlMSAkxOTg2CW9ubHkJLQlPY3QJMTkJMjowMAkwOjMwCS0KLVJ1bGUJTEgJMTk4NwkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMAkwOjMwCS0KLVJ1bGUJTEgJMTk5MAkxOTk1CS0JTWFyCVN1bj49MQkyOjAwCTAJLQotUnVsZQlMSAkxOTk2CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwCTAJLQotUnVsZQlMSAkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkyMDAxCTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDAJMAktCi1SdWxlCUxICTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwCTAJLQotUnVsZQlMSAkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMAkwOjMwCS0KK1J1bGUJTEgJMTk4MQkxOTg0CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKK1J1bGUJTEgJMTk4MgkxOTg1CS0JTWFyCVN1bj49MQkyOjAwCTAJUworUnVsZQlMSAkxOTg1CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJRAorUnVsZQlMSAkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNQkyOjAwCTAJUworUnVsZQlMSAkxOTg2CW9ubHkJLQlPY3QJMTkJMjowMAkwOjMwCUQKK1J1bGUJTEgJMTk4NwkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMAkwOjMwCUQKK1J1bGUJTEgJMTk5MAkxOTk1CS0JTWFyCVN1bj49MQkyOjAwCTAJUworUnVsZQlMSAkxOTk2CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwCTAJUworUnVsZQlMSAkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwCTA6MzAJRAorUnVsZQlMSAkyMDAxCTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJRAorUnVsZQlMSAkyMDA2CW9ubHkJLQlBcHIJU3VuPj0xCTI6MDAJMAlTCitSdWxlCUxICTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUxICTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwCTAJUworUnVsZQlMSAkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMAkwOjMwCUQKIFpvbmUgQXVzdHJhbGlhL0xvcmRfSG93ZSAxMDozNjoyMCAtCUxNVAkxODk1IEZlYgotCQkJMTA6MDAJLQlFU1QJMTk4MSBNYXIKLQkJCTEwOjMwCUxICUxIU1QKKwkJCTEwOjAwCS0JQUVTVAkxOTgxIE1hcgorCQkJMTA6MzAJTEgJTEglc1QKIAogIyBBdXN0cmFsaWFuIG1pc2NlbGxhbnkKICMKQEAgLTI0NCw4ICsyNDMsOCBAQAogIyBQZXJtYW5lbnQgb2NjdXBhdGlvbiAoc2NpZW50aWZpYyBzdGF0aW9uKSAxOTExLTE5MTUgYW5kIHNpbmNlIDI1IE1hcmNoIDE5NDg7CiAjIHNlYWxpbmcgYW5kIHBlbmd1aW4gb2lsIHN0YXRpb24gb3BlcmF0ZWQgTm92IDE4OTkgdG8gQXByIDE5MTkuICBTZWUgdGhlCiAjIFRhc21hbmlhIFBhcmtzICYgV2lsZGxpZmUgU2VydmljZSBoaXN0b3J5IG9mIHNlYWxpbmcgYXQgTWFjcXVhcmllIElzbGFuZAotIyA8aHR0cDovL3d3dy5wYXJrcy50YXMuZ292LmF1L2luZGV4LmFzcHg/YmFzZT0xODI4PgotIyA8aHR0cDovL3d3dy5wYXJrcy50YXMuZ292LmF1L2luZGV4LmFzcHg/YmFzZT0xODMxPi4KKyMgaHR0cDovL3d3dy5wYXJrcy50YXMuZ292LmF1L2luZGV4LmFzcHg/YmFzZT0xODI4CisjIGh0dHA6Ly93d3cucGFya3MudGFzLmdvdi5hdS9pbmRleC5hc3B4P2Jhc2U9MTgzMQogIyBHdWVzcyB0aGF0IGl0IHdhcyBsaWtlIEF1c3RyYWxpYS9Ib2JhcnQgd2hpbGUgaW5oYWJpdGVkIGJlZm9yZSAyMDEwLgogIwogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMC0wMy0xMCk6CkBAIC0yNTYsMTYgKzI1NSwxNiBAQAogIwogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMy0wNS0yMyk6CiAjIFRoZSAxOTE5IHRyYW5zaXRpb24gaXMgb3ZlcnNwZWNpZmllZCBiZWxvdyBzbyBwcmUtMjAxMyB6aWNzCi0jIHdpbGwgcHJvZHVjZSBhIGJpbmFyeSBmaWxlIHdpdGggYW4gRVNULXR5cGUgYXMgdGhlIGZpcnN0IDMyLWJpdCB0eXBlOworIyB3aWxsIHByb2R1Y2UgYSBiaW5hcnkgZmlsZSB3aXRoIGFuIFtBXUVTVC10eXBlIGFzIHRoZSBmaXJzdCAzMi1iaXQgdHlwZTsKICMgdGhpcyBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiB0aW1lcyBiZWZvcmUgMTkxNiBieQogIyBwcmUtMjAxMyB2ZXJzaW9ucyBvZiBsb2NhbHRpbWUuCiBab25lIEFudGFyY3RpY2EvTWFjcXVhcmllIDAJLQl6enoJMTg5OSBOb3YKLQkJCTEwOjAwCS0JRVNUCTE5MTYgT2N0IDEgMjowMAotCQkJMTA6MDAJMTowMAlFU1QJMTkxNyBGZWIKLQkJCTEwOjAwCUF1cwlFU1QJMTkxOSBBcHIgMSAwOjAwcworCQkJMTA6MDAJLQlBRVNUCTE5MTYgT2N0ICAxICAyOjAwCisJCQkxMDowMAkxOjAwCUFFRFQJMTkxNyBGZWIKKwkJCTEwOjAwCUF1cwlBRSVzVAkxOTE5IEFwciAgMSAgMDowMHMKIAkJCTAJLQl6enoJMTk0OCBNYXIgMjUKLQkJCTEwOjAwCUF1cwlFU1QJMTk2NwotCQkJMTA6MDAJQVQJRVNUCTIwMTAgQXByIDQgMzowMAorCQkJMTA6MDAJQXVzCUFFJXNUCTE5NjcKKwkJCTEwOjAwCUFUCUFFJXNUCTIwMTAgQXByICA0ICAzOjAwCiAJCQkxMTowMAktCU1JU1QJIyBNYWNxdWFyaWUgSSBTdGFuZGFyZCBUaW1lCiAKICMgQ2hyaXN0bWFzCkBAIC0yNzMsMjQgKzI3MiwxNCBAQAogWm9uZSBJbmRpYW4vQ2hyaXN0bWFzCTc6MDI6NTIgLQlMTVQJMTg5NSBGZWIKIAkJCTc6MDAJLQlDWFQJIyBDaHJpc3RtYXMgSXNsYW5kIFRpbWUKIAotIyBDb29rIElzCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ29vawkxOTc4CW9ubHkJLQlOb3YJMTIJMDowMAkwOjMwCUhTCi1SdWxlCUNvb2sJMTk3OQkxOTkxCS0JTWFyCVN1bj49MQkwOjAwCTAJLQotUnVsZQlDb29rCTE5NzkJMTk5MAktCU9jdAlsYXN0U3VuCTA6MDAJMDozMAlIUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1Jhcm90b25nYQktMTA6Mzk6MDQgLQlMTVQJMTkwMQkJIyBBdmFydWEKLQkJCS0xMDozMAktCUNLVAkxOTc4IE5vdiAxMgkjIENvb2sgSXMgVGltZQotCQkJLTEwOjAwCUNvb2sJQ0slc1QKLQotIyBDb2NvcworIyBDb2NvcyAoS2VlbGluZykgSXMKICMgVGhlc2UgaXNsYW5kcyB3ZXJlIHJ1bGVkIGJ5IHRoZSBSb3NzIGZhbWlseSBmcm9tIGFib3V0IDE4MzAgdG8gMTk3OC4KICMgV2UgZG9uJ3Qga25vdyB3aGVuIHN0YW5kYXJkIHRpbWUgd2FzIGludHJvZHVjZWQ7IGZvciBub3csIHdlIGd1ZXNzIDE5MDAuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUluZGlhbi9Db2Nvcwk2OjI3OjQwCS0JTE1UCTE5MDAKIAkJCTY6MzAJLQlDQ1QJIyBDb2NvcyBJc2xhbmRzIFRpbWUKIAorCiAjIEZpamkKIAogIyBNaWxuZSBnaXZlcyAxMTo1NTo0NCBmb3IgU3V2YS4KQEAgLTMwMCwyMCArMjg5LDEzIEBACiAjIGZyb20gTm92ZW1iZXIgMjl0aCAyMDA5ICB0byBBcHJpbCAyNXRoIDIwMTAuCiAjCiAjICJEYXlsaWdodCBzYXZpbmdzIHRvIGNvbW1lbmNlIHRoaXMgbW9udGgiCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFkaW9maWppLmNvbS5mai9mdWxsc3RvcnkucGhwP2lkPTIzNzE5Ij4KICMgaHR0cDovL3d3dy5yYWRpb2ZpamkuY29tLmZqL2Z1bGxzdG9yeS5waHA/aWQ9MjM3MTkKLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2ZpamkwMS5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19maWppMDEuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMTEtMTApOgogIyBUaGUgRmlqaSBHb3Zlcm5tZW50IGhhcyBwb3N0ZWQgc29tZSBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGFwcHJvdmVkCiAjIGFtZW5kbWVudHM6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmlqaS5nb3YuZmovcHVibGlzaC9wYWdlXzE2MTk4LnNodG1sIj4KICMgaHR0cDovL3d3dy5maWppLmdvdi5mai9wdWJsaXNoL3BhZ2VfMTYxOTguc2h0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTAzLTAzKToKICMgVGhlIENhYmluZXQgaW4gRmlqaSBoYXMgZGVjaWRlZCB0byBlbmQgRFNUIGFib3V0IGEgbW9udGggZWFybHksIG9uCkBAIC0zMjIsMzUgKzMwNCwyNCBAQAogIyAyMDExIChsYXN0IFN1bmRheSBhIGdvb2QgZ3Vlc3M/KS4KICMKICMgT2ZmaWNpYWwgc291cmNlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmZpamkuZ292LmZqL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTEwOTY6MzMxMC1jYWJpbmV0LWFwcHJvdmVzLWNoYW5nZS1pbi1kYXlsaWdodC1zYXZpbmdzLWRhdGVzJmNhdGlkPTQ5OmNhYmluZXQtcmVsZWFzZXMmSXRlbWlkPTE2NiI+CiAjIGh0dHA6Ly93d3cuZmlqaS5nb3YuZmovaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9MTA5NjozMzEwLWNhYmluZXQtYXBwcm92ZXMtY2hhbmdlLWluLWRheWxpZ2h0LXNhdmluZ3MtZGF0ZXMmY2F0aWQ9NDk6Y2FiaW5ldC1yZWxlYXNlcyZJdGVtaWQ9MTY2Ci0jIDwvYT4KICMKICMgQSBiaXQgbW9yZSBiYWNrZ3JvdW5kIGluZm8gaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2ZpamktZHN0LWVuZHMtbWFyY2gtMjAxMC5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2ZpamktZHN0LWVuZHMtbWFyY2gtMjAxMC5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMC0xMC0yNCk6CiAjIEFjY29yZGluZyB0byBSYWRpbyBGaWppIGFuZCBGaWppIFRpbWVzIG9ubGluZSwgRmlqaSB3aWxsIGVuZCBEU1QgMwogIyB3ZWVrcyBlYXJsaWVyIHRoYW4gZXhwZWN0ZWQgLSBvbiBNYXJjaCA2LCAyMDExLCBub3QgTWFyY2ggMjcsIDIwMTEuLi4KICMgSGVyZSBpcyBjb25maXJtYXRpb24gZnJvbSBHb3Zlcm5tZW50IG9mIHRoZSBSZXB1YmxpYyBvZiB0aGUgRmlqaSBJc2xhbmRzLAogIyBNaW5pc3RyeSBvZiBJbmZvcm1hdGlvbiAoZmlqaS5nb3YuZmopIHdlYiBzaXRlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmZpamkuZ292LmZqL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTI2MDg6ZGF5bGlnaHQtc2F2aW5ncyZjYXRpZD03MTpwcmVzcy1yZWxlYXNlcyZJdGVtaWQ9MTU1Ij4KICMgaHR0cDovL3d3dy5maWppLmdvdi5mai9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD0yNjA4OmRheWxpZ2h0LXNhdmluZ3MmY2F0aWQ9NzE6cHJlc3MtcmVsZWFzZXMmSXRlbWlkPTE1NQotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZmlqaTA0Lmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2ZpamkwNC5odG1sCi0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMS0xMC0wMyk6CiAjIE5vdyB0aGUgZGF0ZXMgaGF2ZSBiZWVuIGNvbmZpcm1lZCwgYW5kIGF0IGxlYXN0IG91ciBzdGFydCBkYXRlCiAjIGFzc3VtcHRpb24gd2FzIGNvcnJlY3QgKGVuZCBkYXRlIHdhcyBvbmUgd2VlayB3cm9uZykuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmlqaS5nb3YuZmovaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9NDk2NjpkYXlsaWdodC1zYXZpbmctc3RhcnRzLWluLWZpamkmY2F0aWQ9NzE6cHJlc3MtcmVsZWFzZXMmSXRlbWlkPTE1NSI+Ci0jIHd3dy5maWppLmdvdi5mai9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD00OTY2OmRheWxpZ2h0LXNhdmluZy1zdGFydHMtaW4tZmlqaSZjYXRpZD03MTpwcmVzcy1yZWxlYXNlcyZJdGVtaWQ9MTU1Ci0jIDwvYT4KKyMgaHR0cDovL3d3dy5maWppLmdvdi5mai9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD00OTY2OmRheWxpZ2h0LXNhdmluZy1zdGFydHMtaW4tZmlqaSZjYXRpZD03MTpwcmVzcy1yZWxlYXNlcyZJdGVtaWQ9MTU1CiAjIHdoaWNoIHNheXMKICMgTWVtYmVycyBvZiB0aGUgcHVibGljIGFyZSByZW1pbmRlZCB0byBjaGFuZ2UgdGhlaXIgdGltZSB0byBvbmUgaG91ciBpbgogIyBhZHZhbmNlIGF0IDJhbSB0byAzYW0gb24gT2N0b2JlciAyMywgMjAxMSBhbmQgb25lIGhvdXIgYmFjayBhdCAzYW0gdG8KQEAgLTM2MCw5ICszMzEsNyBAQAogIyBBbm90aGVyIGNoYW5nZSB0byB0aGUgRmlqaSBEU1QgZW5kIGRhdGUuIEluIHRoZSBUWiBkYXRhYmFzZSB0aGUgZW5kIGRhdGUgZm9yCiAjIEZpamkgRFNUIDIwMTIsIGlzIGN1cnJlbnRseSBGZWIgMjYuIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCB0byBKYW4gMjIuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmlqaS5nb3YuZmovaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9NTAxNzphbWVuZG1lbnRzLXRvLWRheWxpZ2h0LXNhdmluZ3MmY2F0aWQ9NzE6cHJlc3MtcmVsZWFzZXMmSXRlbWlkPTE1NSI+CiAjIGh0dHA6Ly93d3cuZmlqaS5nb3YuZmovaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9NTAxNzphbWVuZG1lbnRzLXRvLWRheWxpZ2h0LXNhdmluZ3MmY2F0aWQ9NzE6cHJlc3MtcmVsZWFzZXMmSXRlbWlkPTE1NQotIyA8L2E+CiAjIHN0YXRlczoKICMKICMgVGhlIGVuZCBvZiBkYXlsaWdodCBzYXZpbmcgc2NoZWR1bGVkIGluaXRpYWxseSBmb3IgdGhlIDI2dGggb2YgRmVicnVhcnkgMjAxMgpAQCAtNDAwLDE2ICszNjksMTYgQEAKIFJ1bGUJRmlqaQkyMDEyCTIwMTMJLQlKYW4JU3VuPj0xOAkzOjAwCTAJLQogUnVsZQlGaWppCTIwMTQJbWF4CS0JSmFuCVN1bj49MTgJMjowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9GaWppCTExOjU1OjQ0IC0JTE1UCTE5MTUgT2N0IDI2CSMgU3V2YQorWm9uZQlQYWNpZmljL0ZpamkJMTE6NTU6NDQgLQlMTVQJMTkxNSBPY3QgMjYgIyBTdXZhCiAJCQkxMjowMAlGaWppCUZKJXNUCSMgRmlqaSBUaW1lCiAKICMgRnJlbmNoIFBvbHluZXNpYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL0dhbWJpZXIJIC04OjU5OjQ4IC0JTE1UCTE5MTIgT2N0CSMgUmlraXRlYQorWm9uZQlQYWNpZmljL0dhbWJpZXIJIC04OjU5OjQ4IC0JTE1UCTE5MTIgT2N0ICMgUmlraXRlYQogCQkJIC05OjAwCS0JR0FNVAkjIEdhbWJpZXIgVGltZQogWm9uZQlQYWNpZmljL01hcnF1ZXNhcyAtOToxODowMCAtCUxNVAkxOTEyIE9jdAogCQkJIC05OjMwCS0JTUFSVAkjIE1hcnF1ZXNhcyBUaW1lCi1ab25lCVBhY2lmaWMvVGFoaXRpCSAtOTo1ODoxNiAtCUxNVAkxOTEyIE9jdAkjIFBhcGVldGUKK1pvbmUJUGFjaWZpYy9UYWhpdGkJIC05OjU4OjE2IC0JTE1UCTE5MTIgT2N0ICMgUGFwZWV0ZQogCQkJLTEwOjAwCS0JVEFIVAkjIFRhaGl0aSBUaW1lCiAjIENsaXBwZXJ0b24gKG5lYXIgTm9ydGggQW1lcmljYSkgaXMgYWRtaW5pc3RlcmVkIGZyb20gRnJlbmNoIFBvbHluZXNpYTsKICMgaXQgaXMgdW5pbmhhYml0ZWQuCkBAIC00MTcsMTQgKzM4NiwxNCBAQAogIyBHdWFtCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCVBhY2lmaWMvR3VhbQktMTQ6MjE6MDAgLQlMTVQJMTg0NCBEZWMgMzEKLQkJCSA5OjM5OjAwIC0JTE1UCTE5MDEJCSMgQWdhbmEKLQkJCTEwOjAwCS0JR1NUCTIwMDAgRGVjIDIzCSMgR3VhbQorCQkJIDk6Mzk6MDAgLQlMTVQJMTkwMSAgICAgICAgIyBBZ2FuYQorCQkJMTA6MDAJLQlHU1QJMjAwMCBEZWMgMjMgIyBHdWFtCiAJCQkxMDowMAktCUNoU1QJIyBDaGFtb3JybyBTdGFuZGFyZCBUaW1lCiAKICMgS2lyaWJhdGkKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9UYXJhd2EJIDExOjMyOjA0IC0JTE1UCTE5MDEJCSMgQmFpcmlraQotCQkJIDEyOjAwCS0JR0lMVAkJICMgR2lsYmVydCBJcyBUaW1lCitab25lIFBhY2lmaWMvVGFyYXdhCSAxMTozMjowNCAtCUxNVAkxOTAxICMgQmFpcmlraQorCQkJIDEyOjAwCS0JR0lMVAkjIEdpbGJlcnQgSXMgVGltZQogWm9uZSBQYWNpZmljL0VuZGVyYnVyeQktMTE6MjQ6MjAgLQlMTVQJMTkwMQogCQkJLTEyOjAwCS0JUEhPVAkxOTc5IE9jdCAjIFBob2VuaXggSXMgVGltZQogCQkJLTExOjAwCS0JUEhPVAkxOTk1CkBAIC00MzgsNyArNDA3LDcgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgUGFjaWZpYy9TYWlwYW4JLTE0OjE3OjAwIC0JTE1UCTE4NDQgRGVjIDMxCiAJCQkgOTo0MzowMCAtCUxNVAkxOTAxCi0JCQkgOTowMAktCU1QVAkxOTY5IE9jdCAjIE4gTWFyaWFuYSBJcyBUaW1lCisJCQkgOTowMAktCU1QVAkxOTY5IE9jdCAgICAjIE4gTWFyaWFuYSBJcyBUaW1lCiAJCQkxMDowMAktCU1QVAkyMDAwIERlYyAyMwogCQkJMTA6MDAJLQlDaFNUCSMgQ2hhbW9ycm8gU3RhbmRhcmQgVGltZQogCkBAIC00NDksMjQgKzQxOCwyNCBAQAogCQkJMTI6MDAJLQlNSFQKIFpvbmUgUGFjaWZpYy9Ld2FqYWxlaW4JMTE6MDk6MjAgLQlMTVQJMTkwMQogCQkJMTE6MDAJLQlNSFQJMTk2OSBPY3QKLQkJCS0xMjowMAktCUtXQVQJMTk5MyBBdWcgMjAJIyBLd2FqYWxlaW4gVGltZQorCQkJLTEyOjAwCS0JS1dBVAkxOTkzIEF1ZyAyMCAjIEt3YWphbGVpbiBUaW1lCiAJCQkxMjowMAktCU1IVAogCiAjIE1pY3JvbmVzaWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgUGFjaWZpYy9DaHV1awkxMDowNzowOCAtCUxNVAkxOTAxCi0JCQkxMDowMAktCUNIVVQJCQkjIENodXVrIFRpbWUKLVpvbmUgUGFjaWZpYy9Qb2hucGVpCTEwOjMyOjUyIC0JTE1UCTE5MDEJCSMgS29sb25pYQotCQkJMTE6MDAJLQlQT05UCQkJIyBQb2hucGVpIFRpbWUKKwkJCTEwOjAwCS0JQ0hVVAkjIENodXVrIFRpbWUKK1pvbmUgUGFjaWZpYy9Qb2hucGVpCTEwOjMyOjUyIC0JTE1UCTE5MDEgIyBLb2xvbmlhCisJCQkxMTowMAktCVBPTlQJIyBQb2hucGVpIFRpbWUKIFpvbmUgUGFjaWZpYy9Lb3NyYWUJMTA6NTE6NTYgLQlMTVQJMTkwMQotCQkJMTE6MDAJLQlLT1NUCTE5NjkgT2N0CSMgS29zcmFlIFRpbWUKKwkJCTExOjAwCS0JS09TVAkxOTY5IE9jdCAjIEtvc3JhZSBUaW1lCiAJCQkxMjowMAktCUtPU1QJMTk5OQogCQkJMTE6MDAJLQlLT1NUCiAKICMgTmF1cnUKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9OYXVydQkxMTowNzo0MCAtCUxNVAkxOTIxIEphbiAxNQkjIFVhb2JlCi0JCQkxMTozMAktCU5SVAkxOTQyIE1hciAxNQkjIE5hdXJ1IFRpbWUKK1pvbmUJUGFjaWZpYy9OYXVydQkxMTowNzo0MCAtCUxNVAkxOTIxIEphbiAxNSAjIFVhb2JlCisJCQkxMTozMAktCU5SVAkxOTQyIE1hciAxNSAjIE5hdXJ1IFRpbWUKIAkJCTk6MDAJLQlKU1QJMTk0NCBBdWcgMTUKIAkJCTExOjMwCS0JTlJUCTE5NzkgTWF5CiAJCQkxMjowMAktCU5SVApAQCAtNDc5LDcgKzQ0OCw3IEBACiAjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIGZvbGxvd2luZyB3YXMgYXQgMjowMDsgZ28gd2l0aCBJQVRBLgogUnVsZQlOQwkxOTk3CW9ubHkJLQlNYXIJIDIJMjowMHMJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTm91bWVhCTExOjA1OjQ4IC0JTE1UCTE5MTIgSmFuIDEzCitab25lCVBhY2lmaWMvTm91bWVhCTExOjA1OjQ4IC0JTE1UCTE5MTIgSmFuIDEzICMgTm91bcOpYQogCQkJMTE6MDAJTkMJTkMlc1QKIAogCkBAIC00OTYsNyArNDY1LDggQEAKIFJ1bGUJTloJMTkzNAkxOTQwCS0JU2VwCWxhc3RTdW4JMjowMAkwOjMwCVMKIFJ1bGUJTloJMTk0Nglvbmx5CS0JSmFuCSAxCTA6MDAJMAlTCiAjIFNpbmNlIDE5NTcgQ2hhdGhhbSBoYXMgYmVlbiA0NSBtaW51dGVzIGFoZWFkIG9mIE5aLCBidXQgdGhlcmUncyBubwotIyBjb252ZW5pZW50IG5vdGF0aW9uIGZvciB0aGlzIHNvIHdlIG11c3QgZHVwbGljYXRlIHRoZSBSdWxlIGxpbmVzLgorIyBjb252ZW5pZW50IHNpbmdsZSBub3RhdGlvbiBmb3IgdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhpcyB0cmFuc2l0aW9uCisjIHNvIHdlIG11c3QgZHVwbGljYXRlIHRoZSBSdWxlIGxpbmVzLgogUnVsZQlOWgkxOTc0CW9ubHkJLQlOb3YJU3VuPj0xCTI6MDBzCTE6MDAJRAogUnVsZQlDaGF0aGFtCTE5NzQJb25seQktCU5vdglTdW4+PTEJMjo0NXMJMTowMAlECiBSdWxlCU5aCTE5NzUJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJUwpAQCAtNTE5LDEzICs0ODksMTQgQEAKIFpvbmUgUGFjaWZpYy9BdWNrbGFuZAkxMTozOTowNCAtCUxNVAkxODY4IE5vdiAgMgogCQkJMTE6MzAJTloJTlolc1QJMTk0NiBKYW4gIDEKIAkJCTEyOjAwCU5aCU5aJXNUCi1ab25lIFBhY2lmaWMvQ2hhdGhhbQkxMjoxMzo0OCAtCUxNVAkxOTU3IEphbiAgMQorWm9uZSBQYWNpZmljL0NoYXRoYW0JMTI6MTM6NDggLQlMTVQJMTg2OCBOb3YgIDIKKwkJCTEyOjE1CS0JQ0hBU1QJMTk0NiBKYW4gIDEKIAkJCTEyOjQ1CUNoYXRoYW0JQ0hBJXNUCiAKIExpbmsgUGFjaWZpYy9BdWNrbGFuZCBBbnRhcmN0aWNhL01jTXVyZG8KIAogIyBBdWNrbGFuZCBJcwotIyB1bmluaGFiaXRlZDsgTWFvcmkgYW5kIE1vcmlvcmksIGNvbG9uaWFsIHNldHRsZXJzLCBwYXN0b3JhbGlzdHMsIHNlYWxlcnMsCisjIHVuaW5oYWJpdGVkOyBNxIFvcmkgYW5kIE1vcmlvcmksIGNvbG9uaWFsIHNldHRsZXJzLCBwYXN0b3JhbGlzdHMsIHNlYWxlcnMsCiAjIGFuZCBzY2llbnRpZmljIHBlcnNvbm5lbCBoYXZlIHdpbnRlcmVkCiAKICMgQ2FtcGJlbGwgSQpAQCAtNTM0LDQ4ICs1MDUsNTggQEAKICMgcHJldmlvdXNseSB3aGFsZXJzLCBzZWFsZXJzLCBwYXN0b3JhbGlzdHMsIGFuZCBzY2llbnRpZmljIHBlcnNvbm5lbCB3aW50ZXJlZAogIyB3YXMgcHJvYmFibHkgbGlrZSBQYWNpZmljL0F1Y2tsYW5kCiAKKyMgQ29vayBJcworIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKKyMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCUNvb2sJMTk3OAlvbmx5CS0JTm92CTEyCTA6MDAJMDozMAlIUworUnVsZQlDb29rCTE5NzkJMTk5MQktCU1hcglTdW4+PTEJMDowMAkwCS0KK1J1bGUJQ29vawkxOTc5CTE5OTAJLQlPY3QJbGFzdFN1bgkwOjAwCTA6MzAJSFMKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KK1pvbmUgUGFjaWZpYy9SYXJvdG9uZ2EJLTEwOjM5OjA0IC0JTE1UCTE5MDEgICAgICAgICMgQXZhcnVhCisJCQktMTA6MzAJLQlDS1QJMTk3OCBOb3YgMTIgIyBDb29rIElzIFRpbWUKKwkJCS0xMDowMAlDb29rCUNLJXNUCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogCiAjIE5pdWUKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9OaXVlCS0xMToxOTo0MCAtCUxNVAkxOTAxCQkjIEFsb2ZpCi0JCQktMTE6MjAJLQlOVVQJMTk1MQkjIE5pdWUgVGltZQotCQkJLTExOjMwCS0JTlVUCTE5NzggT2N0IDEKK1pvbmUJUGFjaWZpYy9OaXVlCS0xMToxOTo0MCAtCUxNVAkxOTAxICAgICAgICAjIEFsb2ZpCisJCQktMTE6MjAJLQlOVVQJMTk1MSAgICAgICAgIyBOaXVlIFRpbWUKKwkJCS0xMTozMAktCU5VVAkxOTc4IE9jdCAgMQogCQkJLTExOjAwCS0JTlVUCiAKICMgTm9yZm9sawogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL05vcmZvbGsJMTE6MTE6NTIgLQlMTVQJMTkwMQkJIyBLaW5nc3RvbgotCQkJMTE6MTIJLQlOTVQJMTk1MQkjIE5vcmZvbGsgTWVhbiBUaW1lCi0JCQkxMTozMAktCU5GVAkJIyBOb3Jmb2xrIFRpbWUKK1pvbmUJUGFjaWZpYy9Ob3Jmb2xrCTExOjExOjUyIC0JTE1UCTE5MDEgIyBLaW5nc3RvbgorCQkJMTE6MTIJLQlOTVQJMTk1MSAjIE5vcmZvbGsgTWVhbiBUaW1lCisJCQkxMTozMAktCU5GVAkjIE5vcmZvbGsgVGltZQogCiAjIFBhbGF1IChCZWxhdSkKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9QYWxhdQk4OjU3OjU2IC0JTE1UCTE5MDEJCSMgS29yb3IKK1pvbmUgUGFjaWZpYy9QYWxhdQk4OjU3OjU2IC0JTE1UCTE5MDEgIyBLb3JvcgogCQkJOTowMAktCVBXVAkjIFBhbGF1IFRpbWUKIAogIyBQYXB1YSBOZXcgR3VpbmVhCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIFBhY2lmaWMvUG9ydF9Nb3Jlc2J5IDk6NDg6NDAgLQlMTVQJMTg4MAotCQkJOTo0ODozMgktCVBNTVQJMTg5NQkjIFBvcnQgTW9yZXNieSBNZWFuIFRpbWUKLQkJCTEwOjAwCS0JUEdUCQkjIFBhcHVhIE5ldyBHdWluZWEgVGltZQorCQkJOTo0ODozMgktCVBNTVQJMTg5NSAjIFBvcnQgTW9yZXNieSBNZWFuIFRpbWUKKwkJCTEwOjAwCS0JUEdUCSMgUGFwdWEgTmV3IEd1aW5lYSBUaW1lCiAKICMgUGl0Y2Fpcm4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9QaXRjYWlybgktODo0MDoyMCAtCUxNVAkxOTAxCQkjIEFkYW1zdG93bgotCQkJLTg6MzAJLQlQTlQJMTk5OCBBcHIgMjcgMDA6MDAKK1pvbmUgUGFjaWZpYy9QaXRjYWlybgktODo0MDoyMCAtCUxNVAkxOTAxICAgICAgICAjIEFkYW1zdG93bgorCQkJLTg6MzAJLQlQTlQJMTk5OCBBcHIgMjcgIDA6MDAKIAkJCS04OjAwCS0JUFNUCSMgUGl0Y2Fpcm4gU3RhbmRhcmQgVGltZQogCiAjIEFtZXJpY2FuIFNhbW9hCiBab25lIFBhY2lmaWMvUGFnb19QYWdvCSAxMjozNzoxMiAtCUxNVAkxODc5IEp1bCAgNQogCQkJLTExOjIyOjQ4IC0JTE1UCTE5MTEKLQkJCS0xMTozMAktCVNBTVQJMTk1MAkJIyBTYW1vYSBUaW1lCi0JCQktMTE6MDAJLQlOU1QJMTk2NyBBcHIJIyBOPU5vbWUKLQkJCS0xMTowMAktCUJTVAkxOTgzIE5vdiAzMAkjIEI9QmVyaW5nCi0JCQktMTE6MDAJLQlTU1QJCQkjIFM9U2Ftb2EKKwkJCS0xMTowMAktCU5TVAkxOTY3IEFwciAgICAjIE49Tm9tZQorCQkJLTExOjAwCS0JQlNUCTE5ODMgTm92IDMwICMgQj1CZXJpbmcKKwkJCS0xMTowMAktCVNTVAkgICAgICAgICAgICAjIFM9U2Ftb2EKIAotIyBTYW1vYQorIyBTYW1vYSAoZm9ybWVybHkgYW5kIGFsc28ga25vd24gYXMgV2VzdGVybiBTYW1vYSkKIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0xMC0xNik6CiAjIFdlIGhhdmUgYmVlbiBpbiBjb250YWN0IHdpdGggdGhlIGdvdmVybm1lbnQgb2YgU2Ftb2EgYWdhaW4sIGFuZCByZWNlaXZlZApAQCAtNTg2LDE0MSArNTY3LDgwIEBACiAjIFN1bmRheSBvZiBBcHJpbCAyMDExLiIKICMKICMgQmFja2dyb3VuZCBpbmZvOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc2Ftb2EtZHN0LXBsYW4tMjAwOS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3NhbW9hLWRzdC1wbGFuLTIwMDkuaHRtbAotIyA8L2E+CiAjCiAjIFNhbW9hJ3MgRGF5bGlnaHQgU2F2aW5nIFRpbWUgQWN0IDIwMDkgaXMgYXZhaWxhYmxlIGhlcmUsIGJ1dCBkb2VzIG5vdAogIyBjb250YWluIGFueSBkYXRlczoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wYXJsaWFtZW50Lmdvdi53cy9kb2N1bWVudHMvYWN0cy9EYXlsaWdodCUyMFNhdmluZyUyMEFjdCUyMCUyMDIwMDklMjAlMjhFbmdsaXNoJTI5JTIwLSUyMEZpbmFsJTIwNy03LTA5MS5wZGYiPgogIyBodHRwOi8vd3d3LnBhcmxpYW1lbnQuZ292LndzL2RvY3VtZW50cy9hY3RzL0RheWxpZ2h0JTIwU2F2aW5nJTIwQWN0JTIwJTIwMjAwOSUyMCUyOEVuZ2xpc2glMjklMjAtJTIwRmluYWwlMjA3LTctMDkxLnBkZgotIyA8L2E+CiAKICMgRnJvbSBMYXVwdWUgUmF5bW9uZCBIdWdoZXMgKDIwMTAtMTAtMDcpOgogIyBQbGVhc2Ugc2VlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWNpbC5nb3Yud3MiPgogIyBodHRwOi8vd3d3Lm1jaWwuZ292LndzCi0jIDwvYT4sCiAjIHRoZSBNaW5pc3RyeSBvZiBDb21tZXJjZSwgSW5kdXN0cnkgYW5kIExhYm91ciAoc2lkZWZyYW1lKSAiTGFzdCBTdW5kYXkKICMgU2VwdGVtYmVyIDIwMTAgKDI2LzA5LzEwKSAtIGFkanVzdCBjbG9ja3MgZm9yd2FyZCBmcm9tIDEyOjAwIG1pZG5pZ2h0CiAjIHRvIDAxOjAwYW0gYW5kIEZpcnN0IFN1bmRheSBBcHJpbCAyMDExICgwMy8wNC8xMSkgLSBhZGp1c3QgY2xvY2tzCiAjIGJhY2t3YXJkcyBmcm9tIDE6MDBhbSB0byAxMjowMGFtIgogCiAjIEZyb20gTGF1cHVlIFJheW1vbmQgSHVnaGVzICgyMDExLTAzLTA3KToKLSMgSSBiZWxpZXZlIHRoaXMgd2lsbCBiZSBwb3N0ZWQgc2hvcnRseSBvbiB0aGUgd2Vic2l0ZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1jaWwuZ292LndzIj4KLSMgd3d3Lm1jaWwuZ292LndzCi0jIDwvYT4KKyMgW2h0dHA6Ly93d3cubWNpbC5nb3Yud3MvZnRjZC9kYXlsaWdodF9zYXZpbmdfMjAxMS5wZGZdCiAjCi0jIFBVQkxJQyBOT1RJQ0UgT04gREFZTElHSFQgU0FWSU5HIFRJTUUKLSMKLSMgUHVyc3VhbnQgdG8gdGhlIERheWxpZ2h0IFNhdmluZyBBY3QgMjAwOSBhbmQgQ2FiaW5ldHMgZGVjaXNpb24sCi0jIGJ1c2luZXNzZXMgYW5kIHRoZSBnZW5lcmFsIHB1YmxpYyBhcmUgaGVyZWJ5IGFkdmlzZWQgdGhhdCBkYXlsaWdodAotIyBzYXZpbmcgdGltZSBpcyBvbiB0aGUgZmlyc3QgU2F0dXJkYXkgb2YgQXByaWwgMjAxMSAoMDIvMDQvMTEpLgotIwotIyBUaGUgcHVibGljIGlzIHRoZXJlZm9yZSBhZHZpc2VkIHRoYXQgd2hlbiB0aGUgc3RhbmRhcmQgdGltZSBzdHJpa2VzCi0jIHRoZSBob3VyIG9mIGZvdXIgb2Nsb2NrICg0LjAwYW0gb3IgMDQwMCBIb3Vycykgb24gdGhlIDJuZCBBcHJpbCAyMDExLAotIyB0aGVuIGFsbCBpbnN0cnVtZW50cyB1c2VkIHRvIG1lYXN1cmUgc3RhbmRhcmQgdGltZSBhcmUgdG8gYmUKLSMgYWRqdXN0ZWQvY2hhbmdlZCB0byB0aHJlZSBvY2xvY2sgKDM6MDBhbSBvciAwMzAwSHJzKS4KLSMKLSMgTWFyZ2FyZXQgRnJ1ZWFuIEFDVElORyBDSElFRiBFWEVDVVRJVkUgT0ZGSUNFUiBNSU5JU1RSWSBPRiBDT01NRVJDRSwKLSMgSU5EVVNUUlkgQU5EIExBQk9VUiAyOHRoIEZlYnJ1YXJ5IDIwMTEKKyMgLi4uIHdoZW4gdGhlIHN0YW5kYXJkIHRpbWUgc3RyaWtlcyB0aGUgaG91ciBvZiBmb3VyIG8nY2xvY2sgKDQuMDBhbQorIyBvciAwNDAwIEhvdXJzKSBvbiB0aGUgMm5kIEFwcmlsIDIwMTEsIHRoZW4gYWxsIGluc3RydW1lbnRzIHVzZWQgdG8KKyMgbWVhc3VyZSBzdGFuZGFyZCB0aW1lIGFyZSB0byBiZSBhZGp1c3RlZC9jaGFuZ2VkIHRvIHRocmVlIG8nY2xvY2sKKyMgKDM6MDBhbSBvciAwMzAwSHJzKS4KIAotIyBGcm9tIERhdmlkIFp1ZWxrZSAoMjAxMS0wNS0wOSk6CisjIEZyb20gRGF2aWQgWsO8bGtlICgyMDExLTA1LTA5KToKICMgU3ViamVjdDogU2Ftb2EgdG8gbW92ZSB0aW1lem9uZSBmcm9tIGVhc3QgdG8gd2VzdCBvZiBpbnRlcm5hdGlvbmFsIGRhdGUgbGluZQogIwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1vcm5pbmdzdGFyLmNvLnVrL3VrL21hcmtldHMvbmV3c2ZlZWRpdGVtLmFzcHg/aWQ9MTM4NTAxOTU4MzQ3OTYzIj4KICMgaHR0cDovL3d3dy5tb3JuaW5nc3Rhci5jby51ay91ay9tYXJrZXRzL25ld3NmZWVkaXRlbS5hc3B4P2lkPTEzODUwMTk1ODM0Nzk2MwotIyA8L2E+CiAKLSMgRnJvbSBNYXJrIFNpbS1TbWl0aCAoMjAxMS0wOC0xNyk6Ci0jIEkgaGF2ZSBiZWVuIGluIGNvbnRhY3Qgd2l0aCBMZWlsYW5pIFR1YWxhIFdhcnJlbiBmcm9tIHRoZSBTYW1vYSBMYXcKLSMgUmVmb3JtIENvbW1pc3Npb24sIGFuZCBzaGUgaGFzIHNlbnQgbWUgYSBjb3B5IG9mIHRoZSBCaWxsIHRoYXQgc2hlCi0jIGNvbmZpcm1lZCBoYXMgYmVlbiBwYXNzZWQuLi5Nb3N0IG9mIHRoZSBzZWN0aW9ucyBhcmUgYWJvdXQgbWFwcyByYXRoZXIKLSMgdGhhbiB0aGUgdGltZSB6b25lIGNoYW5nZSwgYnV0IEknbGwgcGFzdGUgdGhlIHJlbGV2YW50IGJpdHMgYmVsb3cuIEJ1dAotIyB0aGUgZXNzZW5jZSBpcyB0aGF0IGF0IG1pZG5pZ2h0IDI5IERlYyAoVVRDLTExIEkgc3VwcG9zZSksIFNhbW9hCi0jIGNoYW5nZXMgZnJvbSBVVEMtMTEgdG8gVVRDKzEzOgotIwotIyBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBCaWxsIDIwMTEKLSMKLSMgQU4gQUNUIHRvIHByb3ZpZGUgZm9yIHRoZSBjaGFuZ2UgdG8gc3RhbmRhcmQgdGltZSBpbiBTYW1vYSBhbmQgdG8gbWFrZQotIyBjb25zZXF1ZW50aWFsIGFtZW5kbWVudHMgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBJbnRlcm5hdGlvbmFsIERhdGUKLSMgTGluZSwgYW5kIGZvciByZWxhdGVkIHB1cnBvc2VzLgotIwotIyBCRSBJVCBFTkFDVEVEIGJ5IHRoZSBMZWdpc2xhdGl2ZSBBc3NlbWJseSBvZiBTYW1vYSBpbiBQYXJsaWFtZW50Ci0jIGFzc2VtYmxlZCBhcyBmb2xsb3dzOgotIwotIyAxLiBTaG9ydCB0aXRsZSBhbmQgY29tbWVuY2VtZW50LSgxKSBUaGlzIEFjdCBtYXkgYmUgY2l0ZWQgYXMgdGhlCi0jIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIEFjdCAyMDExLiAoMikgRXhjZXB0IGZvciBzZWN0aW9uIDUoMykgdGhpcyBBY3QKLSMgY29tbWVuY2VzIGF0IDEyIG8nY2xvY2sgbWlkbmlnaHQsIG9uIFRodXJzZGF5IDI5dGggRGVjZW1iZXIgMjAxMS4gKDMpCi0jIFNlY3Rpb24gNSgzKSBjb21tZW5jZXMgb24gdGhlIGRhdGUgb2YgYXNzZW50IGJ5IHRoZSBIZWFkIG9mIFN0YXRlLgotIwotIyBbc25pcF0KLSMKLSMgMy4gSW50ZXJwcmV0YXRpb24gLSBbc25pcF0gIlNhbW9hIHN0YW5kYXJkIHRpbWUiIGluIHRoaXMgQWN0IGFuZCBhbnkKLSMgb3RoZXIgc3RhdHV0ZSBvZiBTYW1vYSB3aGljaCByZWZlcnMgdG8gJ1NhbW9hIHN0YW5kYXJkIHRpbWUnIG1lYW5zIHRoZQotIyB0aW1lIDEzIGhvdXJzIGluIGFkdmFuY2Ugb2YgQ28tb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lLgotIwotIyA0LiBTYW1vYSBzdGFuZGFyZCB0aW1lIC0gKDEpIFVwb24gdGhlIGNvbW1lbmNlbWVudCBvZiB0aGlzIEFjdCwgU2Ftb2EKLSMgc3RhbmRhcmQgdGltZSBzaGFsbCBiZSBzZXQgYXQgMTMgaG91cnMgaW4gYWR2YW5jZSBvZiBDby1vcmRpbmF0ZWQKLSMgVW5pdmVyc2FsIFRpbWUgZm9yIHRoZSB3aG9sZSBvZiBTYW1vYS4gKDIpIEFsbCByZWZlcmVuY2VzIHRvIFNhbW9hJ3MKLSMgdGltZSB6b25lIGFuZCB0byBTYW1vYSBzdGFuZGFyZCB0aW1lIGluIFNhbW9hIGluIGFsbCBsZWdpc2xhdGlvbiBhbmQKLSMgaW5zdHJ1bWVudHMgYWZ0ZXIgdGhlIGNvbW1lbmNlbWVudCBvZiB0aGlzIEFjdCBzaGFsbCBiZSByZWZlcmVuY2VzIHRvCi0jIFNhbW9hIHN0YW5kYXJkIHRpbWUgYXMgcHJvdmlkZWQgZm9yIGluIHRoaXMgQWN0LiAoMykgTm90aGluZyBpbiB0aGlzCi0jIEFjdCBhZmZlY3RzIHRoZSBwcm92aXNpb25zIG9mIHRoZSBEYXlsaWdodCBTYXZpbmcgQWN0IDIwMDksIGV4Y2VwdCB0aGF0Ci0jIGl0IGRlZmluZXMgU2Ftb2Egc3RhbmRhcmQgdGltZS4uLi4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0yNyk6CisjIFRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBBY3QgMjAxMQorIyBodHRwOi8vd3d3LnBhcmxpYW1lbnQuZ292LndzL2ltYWdlcy9BQ1RTL0ludGVybmF0aW9uYWxfRGF0ZV9MaW5lX0FjdF9fMjAxMV8tX0VuZy5wZGYKKyMgY2hhbmdlZCBTYW1vYSBmcm9tIFVUQy0xMSB0byBVVEMrMTMsIGVmZmVjdGl2ZSAiMTIgbydjbG9jayBtaWRuaWdodCwgb24KKyMgVGh1cnNkYXkgMjl0aCBEZWNlbWJlciAyMDExIi4gIFRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSB3YXMgYWRqdXN0ZWQKKyMgYWNjb3JkaW5nbHkuCiAKICMgRnJvbSBMYXVwdWUgUmF5bW9uZCBIdWdoZXMgKDIwMTEtMDktMDIpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1jaWwuZ292LndzL21jaWxfcHVibGljYXRpb25zLmh0bWwiPgogIyBodHRwOi8vd3d3Lm1jaWwuZ292LndzL21jaWxfcHVibGljYXRpb25zLmh0bWwKLSMgPC9hPgogIwogIyBoZXJlIGlzIHRoZSBvZmZpY2lhbCB3ZWJzaXRlIHB1YmxpY2F0aW9uIGZvciBTYW1vYSBEU1QgYW5kIGRhdGVsaW5lIGNoYW5nZQogIwogIyBEU1QKLSMgWWVhcglFbmQJVGltZQlTdGFydAlUaW1lCi0jIDIwMTEJLSAtIC0JLSAtIC0JMjQgU2VwdGVtYmVyCTM6MDBhbSB0byA0OjAwYW0KLSMgMjAxMgkwMSBBcHJpbAk0OjAwYW0gdG8gMzowMGFtCS0gLSAtCS0gLSAtCisjIFllYXIgIEVuZCAgICAgIFRpbWUgICAgICAgICAgICAgIFN0YXJ0ICAgICAgICBUaW1lCisjIDIwMTEgIC0gLSAtICAgIC0gLSAtICAgICAgICAgICAgIDI0IFNlcHRlbWJlciAzOjAwYW0gdG8gNDowMGFtCisjIDIwMTIgIDAxIEFwcmlsIDQ6MDBhbSB0byAzOjAwYW0gIC0gLSAtICAgICAgICAtIC0gLQogIwogIyBEYXRlbGluZSBDaGFuZ2Ugc2tpcCBGcmlkYXkgMzB0aCBEZWMgMjAxMQogIyBUaHVyc2RheSAyOXRoIERlY2VtYmVyIDIwMTEJMjM6NTk6NTkgSG91cnMKICMgU2F0dXJkYXkgMzFzdCBEZWNlbWJlciAyMDExCTAwOjAwOjAwIEhvdXJzCiAjCi0jIENsYXJpZmljYXRpb24gYnkgVGltIFBhcmVudGkgKDIwMTItMDEtMDMpOgotIyBBbHRob3VnaCBTYW1vYSBoYXMgdXNlZCBEYXlsaWdodCBTYXZpbmcgVGltZSBpbiB0aGUgMjAxMC0yMDExIGFuZCAyMDExLTIwMTIKLSMgc2Vhc29ucywgdGhlcmUgaXMgbm90IHlldCBhbnkgaW5kaWNhdGlvbiB0aGF0IHRoaXMgdHJlbmQgd2lsbCBjb250aW51ZSBvbgotIyBhIHJlZ3VsYXIgYmFzaXMuIEZvciBub3csIHdlIGhhdmUgZXhwbGljaXRseSBsaXN0ZWQgdGhlIHRyYW5zaXRpb25zIGJlbG93LgotIwotIyBGcm9tIE5pY2t5ICgyMDEyLTA5LTEwKToKKyMgRnJvbSBOaWNob2xhcyBQZXJlaXJhICgyMDEyLTA5LTEwKToKICMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgY29tbWVuY2VzIG9uIFN1bmRheSAzMHRoIFNlcHRlbWJlciAyMDEyIGFuZAotIyBlbmRzIG9uIFN1bmRheSA3dGggb2YgQXByaWwgMjAxMy4KLSMKLSMgUGxlYXNlIGZpbmQgbGluayBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgZW5kcyBvbiBTdW5kYXkgN3RoIG9mIEFwcmlsIDIwMTMuLi4uCiAjIGh0dHA6Ly93d3cubWNpbC5nb3Yud3MvbWNpbF9wdWJsaWNhdGlvbnMuaHRtbAogIwotIyBUaGF0IHB1YmxpY2F0aW9uIGFsc28gaW5jbHVkZXMgZGF0ZXMgZm9yIFN1bW1lciBvZiAyMDEzLzQgYXMgd2VsbAotIyB3aGljaCBnaXZlIHRoZSBpbXByZXNzaW9uIG9mIGEgcGF0dGVybiBpbiBzZWxlY3RpbmcgZGF0ZXMgZm9yIHRoZQotIyBmdXR1cmUsIHNvIGZvciBub3csIHdlIHdpbGwgZ3Vlc3MgdGhpcyB3aWxsIGNvbnRpbnVlLgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTA4KToKKyMgVGhhdCB3ZWIgcGFnZSBjdXJyZW50bHkgbGlzdHMgdHJhbnNpdGlvbnMgZm9yIDIwMTIvMyBhbmQgMjAxMy80LgorIyBBc3N1bWUgdGhlIHBhdHRlcm4gaW5zdGl0dXRlZCBpbiAyMDEyIHdpbGwgY29udGludWUgaW5kZWZpbml0ZWx5LgogCi0jIFdlc3Rlcm4gU2Ftb2EKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCitSdWxlCVdTCTIwMTAJb25seQktCVNlcAlsYXN0U3VuCTA6MDAJMQlECitSdWxlCVdTCTIwMTEJb25seQktCUFwcglTYXQ+PTEJNDowMAkwCVMKK1J1bGUJV1MJMjAxMQlvbmx5CS0JU2VwCWxhc3RTYXQJMzowMAkxCUQKK1J1bGUJV1MJMjAxMgltYXgJLQlBcHIJU3VuPj0xCTQ6MDAJMAlTCiBSdWxlCVdTCTIwMTIJbWF4CS0JU2VwCWxhc3RTdW4JMzowMAkxCUQKLVJ1bGUJV1MJMjAxMgltYXgJLQlBcHIJU3VuPj0xCTQ6MDAJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIFBhY2lmaWMvQXBpYQkgMTI6MzM6MDQgLQlMTVQJMTg3OSBKdWwgIDUKIAkJCS0xMToyNjo1NiAtCUxNVAkxOTExCi0JCQktMTE6MzAJLQlTQU1UCTE5NTAJCSMgU2Ftb2EgVGltZQotCQkJLTExOjAwCS0JV1NUCTIwMTAgU2VwIDI2Ci0JCQktMTE6MDAJMTowMAlXU0RUCTIwMTEgQXByIDIgNDowMAotCQkJLTExOjAwCS0JV1NUCTIwMTEgU2VwIDI0IDM6MDAKLQkJCS0xMTowMAkxOjAwCVdTRFQJMjAxMSBEZWMgMzAKLQkJCSAxMzowMAkxOjAwCVdTRFQJMjAxMiBBcHIgU3VuPj0xIDQ6MDAKKwkJCS0xMTozMAktCVdTU1QJMTk1MAorCQkJLTExOjAwCVdTCVMlc1QJMjAxMSBEZWMgMjkgMjQ6MDAgIyBTPVNhbW9hCiAJCQkgMTM6MDAJV1MJV1Mlc1QKIAogIyBTb2xvbW9uIElzCiAjIGV4Y2x1ZGVzIEJvdWdhaW52aWxsZSwgZm9yIHdoaWNoIHNlZSBQYXB1YSBOZXcgR3VpbmVhCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIFBhY2lmaWMvR3VhZGFsY2FuYWwgMTA6Mzk6NDggLQlMTVQJMTkxMiBPY3QJIyBIb25pYXJhCitab25lIFBhY2lmaWMvR3VhZGFsY2FuYWwgMTA6Mzk6NDggLQlMTVQJMTkxMiBPY3QgIyBIb25pYXJhCiAJCQkxMTowMAktCVNCVAkjIFNvbG9tb24gSXMgVGltZQogCiAjIFRva2VsYXUgSXMKQEAgLTc0NCw3ICs2NjQsNyBAQAogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCVBhY2lmaWMvRmFrYW9mbwktMTE6MjQ6NTYgLQlMTVQJMTkwMQotCQkJLTExOjAwCS0JVEtUIDIwMTEgRGVjIDMwCSMgVG9rZWxhdSBUaW1lCisJCQktMTE6MDAJLQlUS1QJMjAxMSBEZWMgMzAgIyBUb2tlbGF1IFRpbWUKIAkJCTEzOjAwCS0JVEtUCiAKICMgVG9uZ2EKQEAgLTgwNCw4ICs3MjQsOCBAQAogIyB0aW1lIGZyb20gT3BlcmF0aW9uIE5ld3NyZWVsIChIYXJkdGFjayBJL1RlYWsgc2hvdCwgMTk1OC0wOC0wMSkgdG8gdGhlIGxhc3QKICMgT3BlcmF0aW9uIEZpc2hib3dsIHNob3QgKFRpZ2h0cm9wZSwgMTk2Mi0xMS0wNCkuLi4uIFtTZWVdIEhlcm1hbiBIb2VybGluLAogIyAiVGhlIFVuaXRlZCBTdGF0ZXMgSGlnaC1BbHRpdHVkZSBUZXN0IEV4cGVyaWVuY2U6IEEgUmV2aWV3IEVtcGhhc2l6aW5nIHRoZQotIyBJbXBhY3Qgb24gdGhlIEVudmlyb25tZW50IiwgTG9zIEFsYW1vcyBMQS02NDA1LCBPY3QgMTk3NgotIyA8aHR0cDovL3d3dy5mYXMub3JnL3NncC9vdGhlcmdvdi9kb2UvbGFubC9kb2NzMS8wMDMyMjk5NC5wZGY+LgorIyBJbXBhY3Qgb24gdGhlIEVudmlyb25tZW50IiwgTG9zIEFsYW1vcyBMQS02NDA1LCBPY3QgMTk3Ni4KKyMgaHR0cDovL3d3dy5mYXMub3JnL3NncC9vdGhlcmdvdi9kb2UvbGFubC9kb2NzMS8wMDMyMjk5NC5wZGYKICMgU2VlIHRoZSB0YWJsZSBvbiBwYWdlIDQgd2hlcmUgaGUgbGlzdHMgR01UIGFuZCBsb2NhbCB0aW1lcyBmb3IgdGhlIHRlc3RzOyBhCiAjIGZvb3Rub3RlIGZvciB0aGUgSkkgdGVzdHMgcmVhZHMgdGhhdCBsb2NhbCB0aW1lIGlzICJKSSB0aW1lID0gSGF3YWlpIFRpbWUKICMgTWludXMgT25lIEhvdXIiLgpAQCAtODIwLDcgKzc0MCw3IEBACiAjIEZyb20gTWFyayBCcmFkZXIgKDIwMDUtMDEtMjMpOgogIyBbRmFsbGFjaWVzIGFuZCBGYW50YXNpZXMgb2YgQWlyIFRyYW5zcG9ydCBIaXN0b3J5LCBieSBSLkUuRy4gRGF2aWVzLAogIyBwdWJsaXNoZWQgMTk5NCBieSBQYWxhZHdyIFByZXNzLCBNY0xlYW4sIFZBLCBVU0E7IElTQk4gMC05NjI2NDgzLTUtM10KLSMgcmVwcm9kdWNlZCBhIFBhbiBBbWVyaWNhbiBBaXJ3YXlzIHRpbWVhYmxlcyBmcm9tIDE5MzYsIGZvciB0aGVpciB3ZWVrbHkKKyMgcmVwcm9kdWNlZCBhIFBhbiBBbWVyaWNhbiBBaXJ3YXlzIHRpbWV0YWJsZSBmcm9tIDE5MzYsIGZvciB0aGVpciB3ZWVrbHkKICMgIk9yaWVudCBFeHByZXNzIiBmbGlnaHRzIGJldHdlZW4gU2FuIEZyYW5jaXNjbyBhbmQgTWFuaWxhLCBhbmQgY29ubmVjdGluZwogIyBmbGlnaHRzIHRvIENoaWNhZ28gYW5kIHRoZSBVUyBFYXN0IENvYXN0LiAgQXMgaXQgdXNlcyBzb21lIHRpbWUgem9uZQogIyBkZXNpZ25hdGlvbnMgdGhhdCBJJ3ZlIG5ldmVyIHNlZW4gYmVmb3JlOi4uLi4KQEAgLTgzMCw5ICs3NTAsOSBAQAogWm9uZSBQYWNpZmljL01pZHdheQktMTE6NDk6MjggLQlMTVQJMTkwMQogCQkJLTExOjAwCS0JTlNUCTE5NTYgSnVuICAzCiAJCQktMTE6MDAJMTowMAlORFQJMTk1NiBTZXAgIDIKLQkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgkjIE49Tm9tZQotCQkJLTExOjAwCS0JQlNUCTE5ODMgTm92IDMwCSMgQj1CZXJpbmcKLQkJCS0xMTowMAktCVNTVAkJCSMgUz1TYW1vYQorCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByICAgICMgTj1Ob21lCisJCQktMTE6MDAJLQlCU1QJMTk4MyBOb3YgMzAgIyBCPUJlcmluZworCQkJLTExOjAwCS0JU1NUCSAgICAgICAgICAgICMgUz1TYW1vYQogCiAjIFBhbG15cmEKICMgdW5pbmhhYml0ZWQgc2luY2UgV29ybGQgV2FyIElJOyB3YXMgcHJvYmFibHkgbGlrZSBQYWNpZmljL0tpcml0aW1hdGkKQEAgLTg1Miw3ICs3NzIsNyBAQAogUnVsZQlWYW51YXR1CTE5OTIJMTk5MwktCUphbglTdW4+PTIzCTA6MDAJMAktCiBSdWxlCVZhbnVhdHUJMTk5Mglvbmx5CS0JT2N0CVN1bj49MjMJMDowMAkxOjAwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9FZmF0ZQkxMToxMzoxNiAtCUxNVAkxOTEyIEphbiAxMwkJIyBWaWxhCitab25lCVBhY2lmaWMvRWZhdGUJMTE6MTM6MTYgLQlMTVQJMTkxMiBKYW4gMTMgIyBWaWxhCiAJCQkxMTowMAlWYW51YXR1CVZVJXNUCSMgVmFudWF0dSBUaW1lCiAKICMgV2FsbGlzIGFuZCBGdXR1bmEKQEAgLTg2NCw5ICs3ODQsMTAgQEAKIAogIyBOT1RFUwogCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAorIyBUaGlzIGZpbGUgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKICMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bwotIyB0ekBpYW5hLm9yZyBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisjIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4gIEZvciBtb3JlLCBwbGVhc2Ugc2VlCisjIHRoZSBmaWxlIENPTlRSSUJVVElORyBpbiB0aGUgdHogZGlzdHJpYnV0aW9uLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTMtMDItMjEpOgogIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKQEAgLTg4NywxNjUgKzgwOCwxODggQEAKICMgSSBmb3VuZCBpbiB0aGUgVUNMQSBsaWJyYXJ5LgogIwogIyBGb3IgZGF0YSBjaXJjYSAxODk5LCBhIGNvbW1vbiBzb3VyY2UgaXM6Ci0jIE1pbG5lIEouIENpdmlsIHRpbWUuIEdlb2dyIEouIDE4OTkgRmViOzEzKDIpOjE3My05NAotIyA8aHR0cDovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzE3NzQzNTk+LgorIyBNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQuCisjIGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5CiAjCiAjIEEgcmVsaWFibGUgYW5kIGVudGVydGFpbmluZyBzb3VyY2UgYWJvdXQgdGltZSB6b25lcyBpcwogIyBEZXJlayBIb3dzZSwgR3JlZW53aWNoIHRpbWUgYW5kIGxvbmdpdHVkZSwgUGhpbGlwIFdpbHNvbiBQdWJsaXNoZXJzICgxOTk3KS4KICMKLSMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgYConIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7CisjIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkICcqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOwogIyB0aGUgcmVzdCBhcmUgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgZmlsZSwgb3IgZnJvbSBvdGhlciBzb3VyY2VzLgogIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKLSMJCXN0ZCBkc3QKLSMJCUxNVAlMb2NhbCBNZWFuIFRpbWUKLSMJICA4OjAwCVdTVCBXU1QJV2VzdGVybiBBdXN0cmFsaWEKLSMJICA4OjQ1CUNXU1QgQ1dTVCBDZW50cmFsIFdlc3Rlcm4gQXVzdHJhbGlhKgotIwkgIDk6MDAJSlNUCUphcGFuCi0jCSAgOTozMAlDU1QgQ1NUCUNlbnRyYWwgQXVzdHJhbGlhCi0jCSAxMDowMAlFU1QgRVNUCUVhc3Rlcm4gQXVzdHJhbGlhCi0jCSAxMDowMAlDaFNUCUNoYW1vcnJvCi0jCSAxMDozMAlMSFNUIExIU1QgTG9yZCBIb3dlKgotIwkgMTE6MzAJTlpNVCBOWlNUIE5ldyBaZWFsYW5kIHRocm91Z2ggMTk0NQotIwkgMTI6MDAJTlpTVCBOWkRUIE5ldyBaZWFsYW5kIDE5NDYtcHJlc2VudAotIwkgMTI6NDUJQ0hBU1QgQ0hBRFQgQ2hhdGhhbSoKLSMJLTExOjAwCVNTVAlTYW1vYQotIwktMTA6MDAJSFNUCUhhd2FpaQotIwktIDg6MDAJUFNUCVBpdGNhaXJuKgorIwkJc3RkCWRzdAorIwkJTE1UCQlMb2NhbCBNZWFuIFRpbWUKKyMJICA4OjAwCUFXU1QJQVdEVAlXZXN0ZXJuIEF1c3RyYWxpYQorIwkgIDg6NDUJQUNXU1QJQUNXRFQJQ2VudHJhbCBXZXN0ZXJuIEF1c3RyYWxpYSoKKyMJICA5OjAwCUpTVAkJSmFwYW4KKyMJICA5OjMwCUFDU1QJQUNEVAlDZW50cmFsIEF1c3RyYWxpYQorIwkgMTA6MDAJQUVTVAlBRURUCUVhc3Rlcm4gQXVzdHJhbGlhCisjCSAxMDowMAlDaFNUCQlDaGFtb3JybworIwkgMTA6MzAJTEhTVAlMSERUCUxvcmQgSG93ZSoKKyMJIDExOjMwCU5aTVQJTlpTVAlOZXcgWmVhbGFuZCB0aHJvdWdoIDE5NDUKKyMJIDEyOjAwCU5aU1QJTlpEVAlOZXcgWmVhbGFuZCAxOTQ2LXByZXNlbnQKKyMJIDEyOjE1CUNIQVNUCQlDaGF0aGFtIHRocm91Z2ggMTk0NSoKKyMJIDEyOjQ1CUNIQVNUCUNIQURUCUNoYXRoYW0gMTk0Ni1wcmVzZW50KgorIwkgMTM6MDAJV1NTVAlXU0RUCSh3ZXN0ZXJuKSBTYW1vYSAyMDExLXByZXNlbnQqCisjCS0xMTozMAlXU1NUCQlXZXN0ZXJuIFNhbW9hIHRocm91Z2ggMTk1MCoKKyMJLTExOjAwCVNTVAkJU2Ftb2EKKyMJLTEwOjAwCUhTVAkJSGF3YWlpCisjCS0gODowMAlQU1QJCVBpdGNhaXJuKgogIwotIyBTZWUgdGhlIGBub3J0aGFtZXJpY2EnIGZpbGUgZm9yIEhhd2FpaS4KLSMgU2VlIHRoZSBgc291dGhhbWVyaWNhJyBmaWxlIGZvciBFYXN0ZXIgSSBhbmQgdGhlIEdhbGFwYWdvcyBJcy4KKyMgU2VlIHRoZSAnbm9ydGhhbWVyaWNhJyBmaWxlIGZvciBIYXdhaWkuCisjIFNlZSB0aGUgJ3NvdXRoYW1lcmljYScgZmlsZSBmb3IgRWFzdGVyIEkgYW5kIHRoZSBHYWzDoXBhZ29zIElzLgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgQXVzdHJhbGlhCiAKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0zMCk6CisjIERheWxpZ2h0IHNhdmluZyB0aW1lIGhhcyBsb25nIGJlZW4gY29udHJvdmVyc2lhbCBpbiBBdXN0cmFsaWEsIHBpdHRpbmcKKyMgcmVnaW9uIGFnYWluc3QgcmVnaW9uLCBydXJhbCBhZ2FpbnN0IHVyYmFuLCBhbmQgbG9jYWwgYWdhaW5zdCBnbG9iYWwuCisjIEZvciBleGFtcGxlLCBpbiBoZXIgcmV2aWV3IG9mIEdyYWVtZSBEYXZpc29uJ3MgX1RoZSBVbmZvcmdpdmluZworIyBNaW51dGU6IGhvdyBBdXN0cmFsaWFucyBsZWFybmVkIHRvIHRlbGwgdGhlIHRpbWVfICgxOTkzKSwgUGVydGggbmF0aXZlCisjIFBoaWxsaXBhIEogTWFydHlyIHdyb3RlLCAiVGhlIHNlY3Rpb24gZW50aXRsZWQgJ1NhdmluZyBEYXlsaWdodCcgd2FzCisjIHZlcnkgaW5mb3JtYXRpdmUsIGJ1dCB3YXMgKGFzIGNhbiwgc2FkbHksIG9ubHkgYmUgZXhwZWN0ZWQgZnJvbSBhCisjIE1lbGJvdXJuZS1iYXNlZCBzdHVkeSkgcmVwbGV0ZSB3aXRoIHRoZSB1c3VhbCBjaHVja2xlaGVhZGVkCisjIFF1ZWVuc2xhbmRlcnMgYW5kIHN0cmF3LWNoZXdpbmcgeW9rZWxzIGZyb20gdGhlIFdlc3QgcHJhdHRsaW5nIGZhYmxlcworIyBhYm91dCBmYWRpbmcgY3VydGFpbnMgYW5kIGNyYXplZCBmYXJtIGFuaW1hbHMuIgorIyBFbGVjdHJvbmljIEpvdXJuYWwgb2YgQXVzdHJhbGlhbiBhbmQgTmV3IFplYWxhbmQgSGlzdG9yeSAoMTk5Ny0wMy0wMykKKyMgaHR0cDovL3d3dy5qY3UuZWR1LmF1L2FmZi9oaXN0b3J5L3Jldmlld3MvZGF2aXNvbi5odG0KKwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTEyLTA4KToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib20uZ292LmF1L2NsaW1hdGUvYXZlcmFnZXMvdGFibGVzL2RzdF90aW1lcy5zaHRtbCI+CiAjIEltcGxlbWVudGF0aW9uIERhdGVzIG9mIERheWxpZ2h0IFNhdmluZyBUaW1lIHdpdGhpbiBBdXN0cmFsaWEKLSMgPC9hPiBzdW1tYXJpemVzIGRheWxpZ2h0IHNhdmluZyBpc3N1ZXMgaW4gQXVzdHJhbGlhLgorIyBodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sCisjIHN1bW1hcml6ZXMgZGF5bGlnaHQgc2F2aW5nIGlzc3VlcyBpbiBBdXN0cmFsaWEuCiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDUtMTItMTIpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmxhd2xpbmsubnN3Lmdvdi5hdS9sYXdsaW5rL0NvcnBvcmF0ZS9sbF9hZ2RpbmZvLm5zZi9wYWdlcy9jb21tdW5pdHlfcmVsYXRpb25zX2RheWxpZ2h0X3NhdmluZyI+CiAjIExhd2xpbmsgTlNXOkRheWxpZ2h0IFNhdmluZyBpbiBOZXcgU291dGggV2FsZXMKLSMgPC9hPiBjb3ZlcnMgTmV3IFNvdXRoIFdhbGVzIGluIHBhcnRpY3VsYXIuCisjIGh0dHA6Ly93d3cubGF3bGluay5uc3cuZ292LmF1L2xhd2xpbmsvQ29ycG9yYXRlL2xsX2FnZGluZm8ubnNmL3BhZ2VzL2NvbW11bml0eV9yZWxhdGlvbnNfZGF5bGlnaHRfc2F2aW5nCisjIGNvdmVycyBOZXcgU291dGggV2FsZXMgaW4gcGFydGljdWxhci4KIAogIyBGcm9tIEpvaG4gTWFja2luICgxOTkxLTAzLTA2KToKLSMgV2UgaW4gQXVzdHJhbGlhIGhhdmUgX25ldmVyXyByZWZlcnJlZCB0byBEU1QgYXMgYGRheWxpZ2h0JyB0aW1lLgotIyBJdCBpcyBjYWxsZWQgYHN1bW1lcicgdGltZS4gIE5vdyBieSBhIGhhcHB5IGNvaW5jaWRlbmNlLCBgc3VtbWVyJwotIyBhbmQgYHN0YW5kYXJkJyBoYXBwZW4gdG8gc3RhcnQgd2l0aCB0aGUgc2FtZSBsZXR0ZXI7IGhlbmNlLCB0aGUKKyMgV2UgaW4gQXVzdHJhbGlhIGhhdmUgX25ldmVyXyByZWZlcnJlZCB0byBEU1QgYXMgJ2RheWxpZ2h0JyB0aW1lLgorIyBJdCBpcyBjYWxsZWQgJ3N1bW1lcicgdGltZS4gIE5vdyBieSBhIGhhcHB5IGNvaW5jaWRlbmNlLCAnc3VtbWVyJworIyBhbmQgJ3N0YW5kYXJkJyBoYXBwZW4gdG8gc3RhcnQgd2l0aCB0aGUgc2FtZSBsZXR0ZXI7IGhlbmNlLCB0aGUKICMgYWJicmV2aWF0aW9uIGRvZXMgX25vdF8gY2hhbmdlLi4uCiAjIFRoZSBsZWdpc2xhdGlvbiBkb2VzIG5vdCBhY3R1YWxseSBkZWZpbmUgYWJicmV2aWF0aW9ucywgYXQgbGVhc3QKICMgaW4gdGhpcyBTdGF0ZSwgYnV0IHRoZSBhYmJyZXZpYXRpb24gaXMganVzdCBjb21tb25seSB0YWtlbiB0byBiZSB0aGUKICMgaW5pdGlhbHMgb2YgdGhlIHBocmFzZSwgYW5kIHRoZSBsZWdpc2xhdGlvbiBoZXJlIHVuaWZvcm1seSB1c2VzCi0jIHRoZSBwaHJhc2UgYHN1bW1lciB0aW1lJyBhbmQgZG9lcyBub3QgdXNlIHRoZSBwaHJhc2UgYGRheWxpZ2h0CisjIHRoZSBwaHJhc2UgJ3N1bW1lciB0aW1lJyBhbmQgZG9lcyBub3QgdXNlIHRoZSBwaHJhc2UgJ2RheWxpZ2h0CiAjIHRpbWUnLgogIyBBbm5vdW5jZXJzIG9uIHRoZSBDb21tb253ZWFsdGggcmFkaW8gbmV0d29yaywgdGhlIEFCQyAoZm9yIEF1c3RyYWxpYW4KLSMgQnJvYWRjYXN0aW5nIENvbW1pc3Npb24pLCB1c2UgdGhlIHBocmFzZXMgYEVhc3Rlcm4gU3RhbmRhcmQgVGltZScKLSMgb3IgYEVhc3Rlcm4gU3VtbWVyIFRpbWUnLiAgKE5vdGUsIHRob3VnaCwgdGhhdCBhcyBJIHNheSBpbiB0aGUKKyMgQnJvYWRjYXN0aW5nIENvbW1pc3Npb24pLCB1c2UgdGhlIHBocmFzZXMgJ0Vhc3Rlcm4gU3RhbmRhcmQgVGltZScKKyMgb3IgJ0Vhc3Rlcm4gU3VtbWVyIFRpbWUnLiAgKE5vdGUsIHRob3VnaCwgdGhhdCBhcyBJIHNheSBpbiB0aGUKICMgY3VycmVudCBhdXN0cmFsYXNpYSBmaWxlLCB0aGVyZSBpcyByZWFsbHkgbm8gc3VjaCB0aGluZy4pICBBbm5vdW5jZXJzCiAjIG9uIGl0cyBvdmVyc2VhcyBzZXJ2aWNlLCBSYWRpbyBBdXN0cmFsaWEsIHVzZSB0aGUgc2FtZSBwaHJhc2VzCi0jIHByZWZpeGVkIGJ5IHRoZSB3b3JkIGBBdXN0cmFsaWFuJyB3aGVuIHJlZmVycmluZyB0byBsb2NhbCB0aW1lczsKKyMgcHJlZml4ZWQgYnkgdGhlIHdvcmQgJ0F1c3RyYWxpYW4nIHdoZW4gcmVmZXJyaW5nIHRvIGxvY2FsIHRpbWVzOwogIyB0aW1lIGFubm91bmNlbWVudHMgb24gdGhhdCBzZXJ2aWNlLCBuYXR1cmFsbHkgZW5vdWdoLCBhcmUgbWFkZSBpbiBVVEMuCiAKLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTItMDMtMDgpOgotIyBHaXZlbiB0aGUgYWJvdmUsIHdoYXQncyBjaG9zZW4gZm9yIHllYXItcm91bmQgdXNlIGlzOgotIwlDU1QJZm9yIGFueSBwbGFjZSBvcGVyYXRpbmcgYXQgYSBHTVRPRkYgb2YgOTozMAotIwlXU1QJZm9yIGFueSBwbGFjZSBvcGVyYXRpbmcgYXQgYSBHTVRPRkYgb2YgODowMAotIwlFU1QJZm9yIGFueSBwbGFjZSBvcGVyYXRpbmcgYXQgYSBHTVRPRkYgb2YgMTA6MDAKLQotIyBGcm9tIENodWNrIFNvcGVyICgyMDA2LTA2LTAxKToKLSMgSSByZWNlbnRseSBmb3VuZCB0aGlzIEF1c3RyYWxpYW4gZ292ZXJubWVudCB3ZWIgcGFnZSBvbiB0aW1lIHpvbmVzOgotIyA8aHR0cDovL3d3dy5hdXN0cmFsaWEuZ292LmF1L2Fib3V0LWF1c3RyYWxpYS0xM3RpbWU+Ci0jIEFuZCB0aGlzIGdvdmVybm1lbnQgd2ViIHBhZ2UgbGlzdHMgdGltZSB6b25lIG5hbWVzIGFuZCBhYmJyZXZpYXRpb25zOgotIyA8aHR0cDovL3d3dy5ib20uZ292LmF1L2NsaW1hdGUvYXZlcmFnZXMvdGFibGVzL2RheXNhdnRtLnNodG1sPgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDQtMDUpLCBzdW1tYXJpemluZyBhIGxvbmcgZGlzY3Vzc2lvbiBhYm91dCAiRVNUIgotIyB2ZXJzdXMgIkFFU1QiIGV0Yy46CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDYtMzApOgogIwotIyBJIHNlZSB0aGUgZm9sbG93aW5nIHBvaW50cyBvZiBkaXNwdXRlOgorIyBJbnNwaXJlZCBieSBNYWNraW4ncyByZW1hcmtzIHF1b3RlZCBhYm92ZSwgZWFybGllciB2ZXJzaW9ucyBvZiB0aGlzCisjIGZpbGUgdXNlZCAiRVNUIiBmb3IgYm90aCBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgYW5kIEVhc3Rlcm4gU3VtbWVyCisjIFRpbWUgaW4gQXVzdHJhbGlhLCBhbmQgc2ltaWxhcmx5IGZvciAiQ1NUIiwgIkNXU1QiLCBhbmQgIldTVCIuCisjIEhvd2V2ZXIsIHRoZXNlIGFiYnJldmlhdGlvbnMgd2VyZSBjb25mdXNpbmcgYW5kIHdlcmUgbm90IGNvbW1vbgorIyBwcmFjdGljZSBhbW9uZyBBdXN0cmFsaWFucywgYW5kIHRoZXJlIHdlcmUganVzdGlmaWFibGUgY29tcGxhaW50cworIyBhYm91dCB0aGVtLCBzbyBJIGF0dGVtcHRlZCB0byBzdXJ2ZXkgY3VycmVudCBBdXN0cmFsaWFuIHVzYWdlLgorIyBGb3IgdGhlIHR6IGRhdGFiYXNlLCB0aGUgZnVsbCBFbmdsaXNoIHBocmFzZSBpcyBub3QgdGhhdCBpbXBvcnRhbnQ7CisjIHdoYXQgbWF0dGVycyBpcyB0aGUgYWJicmV2aWF0aW9uLiAgSXQncyBkaWZmaWN1bHQgdG8gc3VydmV5IHRoZSB3ZWIKKyMgZGlyZWN0bHkgZm9yIGFiYnJldmlhdGlvbiB1c2FnZSwgYXMgdGhlcmUgYXJlIHNvIG1hbnkgZmFsc2UgaGl0cyBmb3IKKyMgc3RyaW5ncyBsaWtlICJFU1QiIGFuZCAiRURUIiwgc28gSSBsb29rZWQgZm9yIHBhZ2VzIHRoYXQgZGVmaW5lZCBhbgorIyBhYmJyZXZpYXRpb24gZm9yIGVhc3Rlcm4gb3IgY2VudHJhbCBEU1QgaW4gQXVzdHJhbGlhLCBhbmQgZ290IHRoZQorIyBmb2xsb3dpbmcgbnVtYmVycyBvZiB1bmlxdWUgaGl0cyBmb3IgdGhlIGxpc3RlZCBHb29nbGUgcXVlcmllczoKICMKLSMgKiBIb3cgaW1wb3J0YW50IGFyZSB1bmlxdWUgdGltZSB6b25lIGFiYnJldmlhdGlvbnM/CisjICAgMTAgIkVhc3Rlcm4gRGF5bGlnaHQgVGltZSBBRVNUIiBzaXRlOmF1IFtzb21lIGFyZSBmYWxzZSBoaXRzXQorIyAgIDEwICJFYXN0ZXJuIFN1bW1lciBUaW1lIEFFU1QiIHNpdGU6YXUKKyMgICAxMCAiU3VtbWVyIFRpbWUgQUVEVCIgc2l0ZTphdQorIyAgIDEzICJFRFNUIEVhc3Rlcm4gRGF5bGlnaHQgU2F2aW5nIFRpbWUiIHNpdGU6YXUKKyMgICAxOCAiU3VtbWVyIFRpbWUgRVNTVCIgc2l0ZTphdQorIyAgIDI4ICJFYXN0ZXJuIERheWxpZ2h0IFNhdmluZyBUaW1lIEVEU1QiIHNpdGU6YXUKKyMgICAzOSAiRURUIEVhc3Rlcm4gRGF5bGlnaHQgVGltZSIgc2l0ZTphdSBbc29tZSBhcmUgZmFsc2UgaGl0c10KKyMgICA1MyAiRWFzdGVybiBEYXlsaWdodCBUaW1lIEVEVCIgc2l0ZTphdSBbc29tZSBhcmUgZmFsc2UgaGl0c10KKyMgICA1NCAiQUVEVCBBdXN0cmFsaWFuIEVhc3Rlcm4gRGF5bGlnaHQgVGltZSIgc2l0ZTphdQorIyAgMTgyICJFYXN0ZXJuIERheWxpZ2h0IFRpbWUgQUVEVCIgc2l0ZTphdQogIwotIyAgIEhlcmUgSSB0ZW5kIHRvIGFncmVlIHdpdGggdGhlIHBvaW50IChtb3N0IHJlY2VudGx5IG1hZGUgYnkgQ2hyaXMKLSMgICBOZXdtYW4pIHRoYXQgdW5pcXVlIGFiYnJldmlhdGlvbnMgc2hvdWxkIG5vdCBiZSBlc3NlbnRpYWwgZm9yIHByb3BlcgotIyAgIG9wZXJhdGlvbiBvZiBzb2Z0d2FyZS4gIFdlIGhhdmUgb3RoZXIgaW5zdGFuY2VzIG9mIGFtYmlndWl0eQotIyAgIChlLmcuICJJU1QiIGRlbm90aW5nIGJvdGggIklzcmFlbCBTdGFuZGFyZCBUaW1lIiBhbmQgIkluZGlhbgotIyAgIFN0YW5kYXJkIFRpbWUiKSwgYW5kIHRoZXkgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBhbnkgdGltZSBzb29uLgotIyAgIEluIHRoZSBvbGQgZGF5cywgc29tZSBzb2Z0d2FyZSBtaXN0YWtlbmx5IHJlbGllZCBvbiB1bmlxdWUKLSMgICBhYmJyZXZpYXRpb25zLCBidXQgdGhpcyBpcyBiZWNvbWluZyBsZXNzIHRydWUgd2l0aCB0aW1lLCBhbmQgSSBkb24ndAotIyAgIHRoaW5rIGl0J3MgdGhhdCBpbXBvcnRhbnQgdG8gY2F0ZXIgdG8gc3VjaCBzb2Z0d2FyZSB0aGVzZSBkYXlzLgorIyAgIDE3ICJDZW50cmFsIERheWxpZ2h0IFRpbWUgQ0RUIiBzaXRlOmF1IFtzb21lIGFyZSBmYWxzZSBoaXRzXQorIyAgIDQ2ICJDZW50cmFsIERheWxpZ2h0IFRpbWUgQUNEVCIgc2l0ZTphdQogIwotIyAgIE9uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSBpcyBhbm90aGVyIG1vdGl2YXRpb24gZm9yIHVuYW1iaWd1b3VzCi0jICAgYWJicmV2aWF0aW9uczogaXQgY3V0cyBkb3duIG9uIGh1bWFuIGNvbmZ1c2lvbi4gIFRoaXMgaXMKLSMgICBwYXJ0aWN1bGFybHkgdHJ1ZSBmb3IgQXVzdHJhbGlhLCB3aGVyZSAiRVNUIiBjYW4gbWVhbiBvbmUgdGhpbmcgZm9yCi0jICAgdGltZSBUIGFuZCBhIGRpZmZlcmVudCB0aGluZyBmb3IgdGltZSBUIHBsdXMgMSBzZWNvbmQuCisjIEkgdHJpZWQgc2V2ZXJhbCBvdGhlciB2YXJpYW50cyAoZS5nLiwgIkVhc3Rlcm4gU3VtbWVyIFRpbWUgRVNUIikgYnV0CisjIHRoZXkgYWxsIHJldHVybmVkIGZld2VyIHRoYW4gMTAgdW5pcXVlIGhpdHMuICBJIGFsc28gbG9va2VkIGZvciBwYWdlcworIyBtZW50aW9uaW5nIGJvdGggIndlc3Rlcm4gc3RhbmRhcmQgdGltZSIgYW5kIGFuIGFiYnJldmlhdGlvbiwgc2luY2UKKyMgdGhlcmUgaXMgbm8gV1NUIGluIHRoZSBVUyB0byBnZW5lcmF0ZSBmYWxzZSBoaXRzLCBhbmQgZm91bmQ6CiAjCi0jICogRG9lcyB0aGUgcmVsZXZhbnQgbGVnaXNsYXRpb24gaW5kaWNhdGUgd2hpY2ggYWJicmV2aWF0aW9ucyBzaG91bGQgYmUgdXNlZD8KKyMgIDE1NiAid2VzdGVybiBzdGFuZGFyZCB0aW1lIiBBV1NUIHNpdGU6YXUKKyMgIDIyNiAid2VzdGVybiBzdGFuZGFyZCB0aW1lIiBXU1Qgc2l0ZTphdQogIwotIyAgIEhlcmUgSSB0ZW5kIHRvIHRoaW5rIHRoYXQgdGhpbmdzIGFyZSBhIG1lc3MsIGp1c3QgYXMgdGhleSBhcmUgaW4KLSMgICBtYW55IG90aGVyIGNvdW50cmllcy4gIFdlIEFtZXJpY2FucyBhcmUgY3VycmVudGx5IGRpc2FncmVlaW5nIGFib3V0Ci0jICAgd2hpY2ggYWJicmV2aWF0aW9uIHRvIHVzZSBmb3IgdGhlIG5ld2x5IGxlZ2lzbGF0ZWQgQ2hhbW9ycm8gU3RhbmRhcmQKLSMgICBUaW1lLCBmb3IgZXhhbXBsZS4KKyMgSSB0aGVuIHN1cnZleWVkIHRoZSB0b3AgdGVuIG5ld3NwYXBlcnMgaW4gQXVzdHJhbGlhIGJ5IGNpcmN1bGF0aW9uIGFzCisjIGxpc3RlZCBpbiBXaWtpcGVkaWEsIHVzaW5nIEdvb2dsZSBxdWVyaWVzIGxpa2UgIkFFRFQgc2l0ZTpoZXJhbGRzdW4uY29tLmF1IgorIyBhbmQgb2J0YWluaW5nIGVzdGltYXRlZCBjb3VudHMgZnJvbSB0aGUgaW5pdGlhbCBwYWdlIG9mIHNlYXJjaCByZXN1bHRzLgorIyBBbGwgdGVuIHBhcGVycyBncmVhdGx5IHByZWZlcnJlZCAiQUVEVCIgdG8gIkVEVCIuICBUaGUgcGFwZXJzCisjIHN1cnZleWVkIHdlcmUgdGhlIEhlcmFsZCBTdW4sIFRoZSBEYWlseSBUZWxlZ3JhcGgsIFRoZSBDb3VyaWVyLU1haWwsCisjIFRoZSBTeWRuZXkgTW9ybmluZyBIZXJhbGQsIFRoZSBXZXN0IEF1c3RyYWxpYW4sIFRoZSBBZ2UsIFRoZSBBZHZlcnRpc2VyLAorIyBUaGUgQXVzdHJhbGlhbiwgVGhlIEZpbmFuY2lhbCBSZXZpZXcsIGFuZCBUaGUgSGVyYWxkIChOZXdjYXN0bGUpLgogIwotIyAgIFBlcnNvbmFsbHksIEkgd291bGQgcHJlZmVyIHRvIHVzZSBjb21tb24gcHJhY3RpY2U7IEkgd291bGQgbGlrZSB0bwotIyAgIHJlZmVyIHRvIGxlZ2lzbGF0aW9uIG9ubHkgZm9yIGV4YW1wbGVzIG9mIGNvbW1vbiBwcmFjdGljZSwgb3IgYXMgYQotIyAgIHRpZWJyZWFrZXIuCisjIEkgYWxzbyBzZWFyY2hlZCBmb3IgaGlzdG9yaWNhbCB1c2FnZSwgdG8gc2VlIHdoZXRoZXIgYWJicmV2aWF0aW9ucworIyBsaWtlICJBRURUIiBhcmUgbmV3LiAgQSBUcm92ZSBzZWFyY2ggPGh0dHA6Ly90cm92ZS5ubGEuZ292LmF1Lz4KKyMgZm91bmQgb25seSBvbmUgbmV3c3BhcGVyIChUaGUgQ2FuYmVycmEgVGltZXMpIHdpdGggYSBob3VzZSBzdHlsZQorIyBkYXRpbmcgYmFjayB0byB0aGUgMTk3MHMsIEkgZXhwZWN0IGJlY2F1c2Ugb3RoZXIgbmV3c3BhcGVycyB3ZXJlbid0CisjIGZ1bGx5IGluZGV4ZWQuICBUaGUgQ2FuYmVycmEgVGltZXMgc3Ryb25nbHkgcHJlZmVycmVkIGFiYnJldmlhdGlvbnMKKyMgbGlrZSAiQUVEVCIuICBUaGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAiQUVEVCIgd2FzIGEgV29ybGQgV2VhdGhlcgorIyBjb2x1bW4gKDE5NzEtMTEtMTcsIHBhZ2UgMjQpLCBhbmQgb2YgIkFDRFQiIHdhcyBhIFNjb3JlYm9hcmQgY29sdW1uCisjICgxOTkzLTAxLTI0LCBwIDE2KS4gIFRoZSBzdHlsZSB3YXMgdGhlIHR5cGljYWwgdXNhZ2UgYnV0IHdhcyBub3QKKyMgc3RyaWN0bHkgZW5mb3JjZWQ7IGZvciBleGFtcGxlLCAiV2VsY29tZSB0byB0aGUgdHdpbGlnaHQgem9uZXMgLi4uIgorIyAoMTk5NC0xMC0yOSwgcCAxKSB1c2VzIHRoZSBhYmJyZXZpYXRpb25zIEFFU1QvQUVEVCwgQ1NUL0NEVCwgYW5kCisjIFdTVCwgYW5kIGdvZXMgb24gdG8gc2F5LCAiVGhlIGNvbmZ1c2lvbiBhbmQgZnJ1c3RyYXRpb24gc29tZSBmZWVsCisjIGFib3V0IHRoZSBsYWNrIG9mIHVuaWZvcm1pdHkgYW1vbmcgQXVzdHJhbGlhJ3Mgc2l4IHN0YXRlcyBhbmQgdHdvCisjIHRlcnJpdG9yaWVzIGhhcyBwcm9tcHRlZCBvbmUgZ3JvdXAgdG8gZm9ybSBpdHMgdmVyeSBvd24gcG9saXRpY2FsCisjIHBhcnR5IC0tIHRoZSBTeWRuZXktYmFzZWQgRGF5bGlnaHQgU2F2aW5nIEV4dGVuc2lvbiBQYXJ0eS4iCiAjCi0jICogRG8gQXVzdHJhbGlhbnMgbW9yZSBvZnRlbiB1c2UgIkVhc3Rlcm4gRGF5bGlnaHQgVGltZSIgb3IgIkVhc3Rlcm4KLSMgICBTdW1tZXIgVGltZSI/ICBEbyB0aGV5IHR5cGljYWxseSBwcmVmaXggdGhlIHRpbWUgem9uZSBuYW1lcyB3aXRoCi0jICAgdGhlIHdvcmQgIkF1c3RyYWxpYW4iPworIyBJIGFsc28gc3VydmV5ZWQgZmVkZXJhbCBnb3Zlcm5tZW50IHNvdXJjZXMuICBUaGV5IGRpZCBub3QgYWdyZWU6CiAjCi0jICAgTXkgb3duIGltcHJlc3Npb24gaXMgdGhhdCBib3RoICJEYXlsaWdodCBUaW1lIiBhbmQgIlN1bW1lciBUaW1lIiBhcmUKLSMgICBjb21tb24gYW5kIGFyZSB3aWRlbHkgdW5kZXJzdG9vZCwgYnV0IHRoYXQgIlN1bW1lciBUaW1lIiBpcyBtb3JlCi0jICAgcG9wdWxhcjsgYW5kIHRoYXQgdGhlIGxlYWRpbmcgIkEiIGlzIGFsc28gY29tbW9uIGJ1dCBpcyBvbWl0dGVkIG1vcmUKLSMgICBvZnRlbiB0aGFuIG5vdC4gIEkganVzdCB1c2VkIEFsdGFWaXN0YSBhZHZhbmNlZCBzZWFyY2ggYW5kIGdvdCB0aGUKLSMgICBmb2xsb3dpbmcgY291bnQgb2YgcGFnZSBoaXRzOgorIyAgIFRoZSBBdXN0cmFsaWFuIEdvdmVybm1lbnQgKDIwMTQtMDMtMjYpCisjICAgaHR0cDovL2F1c3RyYWxpYS5nb3YuYXUvYWJvdXQtYXVzdHJhbGlhL291ci1jb3VudHJ5L3RpbWUKKyMgICAoVGhpcyBkb2N1bWVudCB3YXMgcHJvZHVjZWQgYnkgdGhlIERlcGFydG1lbnQgb2YgRmluYW5jZS4pCisjICAgQUVTVCBBQ1NUIEFXU1QgQUVEVCBBQ0RUCiAjCi0jICAgICAxLDEwMyAiRWFzdGVybiBTdW1tZXIgVGltZSIgQU5EIGRvbWFpbjphdQotIyAgICAgICA5NzEgIkF1c3RyYWxpYW4gRWFzdGVybiBTdW1tZXIgVGltZSIgQU5EIGRvbWFpbjphdQotIyAgICAgICA2MTMgIkVhc3Rlcm4gRGF5bGlnaHQgVGltZSIgQU5EIGRvbWFpbjphdQotIyAgICAgICAxMjcgIkF1c3RyYWxpYW4gRWFzdGVybiBEYXlsaWdodCBUaW1lIiBBTkQgZG9tYWluOmF1CisjICAgQnVyZWF1IG9mIE1ldGVvcm9sb2d5ICgyMDEyLTExLTA4KQorIyAgIGh0dHA6Ly93d3cuYm9tLmdvdi5hdS9jbGltYXRlL2F2ZXJhZ2VzL3RhYmxlcy9kYXlzYXZ0bS5zaHRtbAorIyAgIEVTVCBDU1QgV1NUIEVEVCBDRFQKICMKLSMgICBIZXJlICJTdW1tZXIiIHNlZW1zIHF1aXRlIGEgYml0IG1vcmUgcG9wdWxhciB0aGFuICJEYXlsaWdodCIsCi0jICAgcGFydGljdWxhcmx5IHdoZW4gd2Uga25vdyB0aGUgdGltZSB6b25lIGlzIEF1c3RyYWxpYW4gYW5kIG5vdCBVUywKLSMgICBzYXkuICBUaGUgIkF1c3RyYWxpYW4iIHByZWZpeCBzZWVtcyB0byBiZSBwb3B1bGFyIGZvciBFYXN0ZXJuIFN1bW1lcgotIyAgIFRpbWUsIGJ1dCB1bnBvcHVsYXIgZm9yIEVhc3Rlcm4gRGF5bGlnaHQgVGltZS4KKyMgICBDaXZpbCBBdmlhdGlvbiBTYWZldHkgQXV0aG9yaXR5ICh1bmRhdGVkKQorIyAgIGh0dHA6Ly9zZXJ2aWNlcy5jYXNhLmdvdi5hdS9vdXRuYmFjay9pbmMvcGFnZXMvZXBpc29kZTMvZXBpc29kZS0zX3RpbWVfem9uZXMuc2h0bWwKKyMgICBFU1QgQ1NUIFdTVCAobm8gYWJicmV2aWF0aW9ucyBnaXZlbiBmb3IgRFNUKQogIwotIyAgIEZvciBhYmJyZXZpYXRpb25zLCB0b29scyBsaWtlIEFsdGFWaXN0YSBhcmUgbGVzcyB1c2VmdWwgYmVjYXVzZSBvZgotIyAgIGFtYmlndWl0eS4gIE1hbnkgaGl0cyBhcmUgbm90IHJlYWxseSB0aW1lIHpvbmVzLCB1bmZvcnR1bmF0ZWx5LCBhbmQKLSMgICBtYW55IGhpdHMgZGVub3RlIFVTIHRpbWUgem9uZXMgYW5kIG5vdCBBdXN0cmFsaWFuIG9uZXMuICBCdXQgaGVyZQotIyAgIGFyZSB0aGUgaGl0IGNvdW50cyBhbnl3YXk6CisjICAgR2Vvc2NpZW5jZSBBdXN0cmFsaWEgKDIwMTEtMTEtMjQpCisjICAgaHR0cDovL3d3dy5nYS5nb3YuYXUvZ2VvZGVzeS9hc3Ryby9zdW5yaXNlLmpzcAorIyAgIEFFU1QgQUNTVCBBV1NUIEFFRFQgQUNEVAogIwotIyAgICAgMTYxLDMwNCAiRVNUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgMjUsMTU2ICJFRFQiIGFuZCBkb21haW46YXUKLSMgICAgICAxOCwyNjMgIkFFU1QiIGFuZCBkb21haW46YXUKLSMgICAgICAxMCw0MTYgIkFFRFQiIGFuZCBkb21haW46YXUKKyMgICBQYXJsaWFtZW50YXJ5IExpYnJhcnkgKDIwMDgtMTEtMTApCisjICAgaHR0cDovL3d3dy5hcGguZ292LmF1L2JpbmFyaWVzL2xpYnJhcnkvcHVicy9ycC8yMDA4LTA5LzA5cnAxNC5wZGYKKyMgICBFU1QgQ1NUIFdTVCBwcmVmZXJyZWQgZm9yIHN0YW5kYXJkIHRpbWU7IEFFU1QgQUVEVCBBQ1NUIEFDRFQgYWxzbyB1c2VkCiAjCi0jICAgICAgMTQsNTM4ICJDU1QiIGFuZCBkb21haW46YXUKLSMgICAgICAgNSw3MjggIkNEVCIgYW5kIGRvbWFpbjphdQotIyAgICAgICAgIDE3NiAiQUNTVCIgYW5kIGRvbWFpbjphdQotIyAgICAgICAgICAyOSAiQUNEVCIgYW5kIGRvbWFpbjphdQorIyAgIFRoZSBUcmFuc3BvcnQgU2FmZXR5IEJ1cmVhdSBoYXMgYW4gZXh0ZW5zaXZlIHNlcmllcyBvZiBhY2NpZGVudCByZXBvcnRzLAorIyAgIGFuZCBpbnZlc3RpZ2F0b3JzIHNlZW0gdG8gdXNlIHdoYXRldmVyIGFiYnJldmlhdGlvbiB0aGV5IGxpa2UuCisjICAgR29vZ2xpbmcgc2l0ZTphdHNiLmdvdi5hdSBmb3VuZCB0aGUgZm9sbG93aW5nIG51bWJlciBvZiB1bmlxdWUgaGl0czoKKyMgICAzMTEgIkVTdVQiLCAxOTUgIkVEVCIsIDI2ICJBRURUIiwgODMgIkNTdVQiLCA0NiAiQ0RUIi4KKyMgICAiX1N1VCIgdGVuZGVkIHRvIGFwcGVhciBpbiBvbGRlciByZXBvcnRzLCBhbmQgIkFfRFQiIHRlbmRlZCB0bworIyAgIGFwcGVhciBpbiByZXBvcnRzIG9mIGV2ZW50cyB3aXRoIGludGVybmF0aW9uYWwgaW1wbGljYXRpb25zLgogIwotIyAgICAgICA3LDUzOSAiV1NUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgICAgIDY4ICJBV1NUIiBhbmQgZG9tYWluOmF1Ci0jCi0jICAgVGhpcyBkYXRhIHN1Z2dlc3QgdGhhdCBBdXN0cmFsaWFucyB0ZW5kIHRvIG9taXQgdGhlICJBIiBwcmVmaXggaW4KLSMgICBwcmFjdGljZS4gIFRoZSBzaXR1YXRpb24gZm9yICJTVCIgdmVyc3VzICJEVCIgaXMgbGVzcyBjbGVhciwgZ2l2ZW4KLSMgICB0aGUgYW1iaWd1aXRpZXMgaW52b2x2ZWQuCi0jCi0jICogSG93IGRvIEF1c3RyYWxpYW5zIGZlZWwgYWJvdXQgdGhlIGFiYnJldmlhdGlvbnMgaW4gdGhlIHR6IGRhdGFiYXNlPwotIwotIyAgIElmIHlvdSBqdXN0IGNvdW50IEF1c3RyYWxpYW5zIG9uIHRoaXMgbGlzdCwgSSBjb3VudCAyIGluIGZhdm9yIGFuZCAzCi0jICAgYWdhaW5zdC4gIE9uZSBvZiB0aGUgImFnYWluc3QiIHZvdGVzIChEYXZpZCBLZWVnZWwpIGNvdW5zZWxlZCBkZWxheSwKLSMgICBzYXlpbmcgdGhhdCBib3RoIEFFU1QvQUVEVCBhbmQgRVNUL0VTVCBhcmUgd2lkZWx5IHVzZWQgYW5kCi0jICAgdW5kZXJzdG9vZCBpbiBBdXN0cmFsaWEuCisjIEZyb20gdGhlIGFib3ZlIGl0IGFwcGVhcnMgdGhhdCB0aGVyZSBpcyBhIHdvcmtpbmcgY29uc2Vuc3VzIGluCisjIEF1c3RyYWxpYSB0byB1c2UgdHJhaWxpbmcgIkRUIiBmb3IgZGF5bGlnaHQgc2F2aW5nIHRpbWU7IGFsdGhvdWdoCisjIHNvbWUgc291cmNlcyB1c2UgdHJhaWxpbmcgIlNTVCIgb3IgIlNUIiBvciAiU3VUIiB0aGV5IGFyZSBieSBmYXIgaW4KKyMgdGhlIG1pbm9yaXR5LiAgVGhlIGNhc2UgZm9yIGxlYWRpbmcgIkEiIGlzIHdlYWtlciwgYnV0IHNpbmNlIGl0CisjIHNlZW1zIHRvIGJlIHByZWZlcnJlZCBpbiB0aGUgb3ZlcmFsbCB3ZWIgYW5kIGlzIHByZWZlcnJlZCBpbiBhbGwKKyMgdGhlIGxlYWRpbmcgbmV3c3BhcGVyIHdlYnNpdGVzIGFuZCBpbiBtYW55IGdvdmVybm1lbnQgZGVwYXJ0bWVudHMsCisjIGl0IGhhcyBhIHN0cm9uZ2VyIGNhc2UgdGhhbiBvbWl0dGluZyB0aGUgbGVhZGluZyAiQSIuICBUaGUgY3VycmVudAorIyB2ZXJzaW9uIG9mIHRoZSBkYXRhYmFzZSB0aGVyZWZvcmUgdXNlcyBhYmJyZXZpYXRpb25zIGxpa2UgIkFFU1QiIGFuZAorIyAiQUVEVCIgZm9yIEF1c3RyYWxpYW4gdGltZSB6b25lcy4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk1LTEyLTE5KToKICMgU2hhbmtzICYgUG90dGVuZ2VyIHJlcG9ydCAyOjAwIGZvciBhbGwgYXV0dW1uIGNoYW5nZXMgaW4gQXVzdHJhbGlhIGFuZCBOWi4KICMgTWFyayBQcmlvciB3cml0ZXMgdGhhdCBoaXMgbmV3c3BhcGVyCiAjIHJlcG9ydHMgdGhhdCBOU1cncyBmYWxsIDE5OTUgY2hhbmdlIHdpbGwgb2NjdXIgYXQgMjowMCwKICMgYnV0IFJvYmVydCBFbHogc2F5cyBpdCdzIGJlZW4gMzowMCBpbiBWaWN0b3JpYSBzaW5jZSAxOTcwCi0jIGFuZCBwZXJoYXBzIHRoZSBuZXdzcGFwZXIncyBgMjowMCcgaXMgcmVmZXJyaW5nIHRvIHN0YW5kYXJkIHRpbWUuCisjIGFuZCBwZXJoYXBzIHRoZSBuZXdzcGFwZXIncyAnMjowMCcgaXMgcmVmZXJyaW5nIHRvIHN0YW5kYXJkIHRpbWUuCiAjIEZvciBub3cgd2UnbGwgY29udGludWUgdG8gYXNzdW1lIDI6MDBzIGZvciBjaGFuZ2VzIHNpbmNlIDE5NjAuCiAKICMgRnJvbSBFcmljIFVsZXZpayAoMTk5OC0wMS0wNSk6CkBAIC0xMDU1LDE3ICs5OTksMTQgQEAKICMgcmVsZXZhbnQgZW50cmllcyBpbiB0aGlzIGRhdGFiYXNlLgogIwogIyBOU1cgKGluY2x1ZGluZyBMSEkgYW5kIEJyb2tlbiBIaWxsKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hdXN0bGlpLmVkdS5hdS9hdS9sZWdpcy9uc3cvY29uc29sX2FjdC9zdGExOTg3MTM3L2luZGV4Lmh0bWwiPgogIyBTdGFuZGFyZCBUaW1lIEFjdCAxOTg3ICh1cGRhdGVkIDE5OTUtMDQtMDQpCi0jIDwvYT4KKyMgaHR0cDovL3d3dy5hdXN0bGlpLmVkdS5hdS9hdS9sZWdpcy9uc3cvY29uc29sX2FjdC9zdGExOTg3MTM3L2luZGV4Lmh0bWwKICMgQUNUCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvYXUvbGVnaXMvYWN0L2NvbnNvbF9hY3Qvc3Rhc3RhMTk3MjI3OS9pbmRleC5odG1sIj4KICMgU3RhbmRhcmQgVGltZSBhbmQgU3VtbWVyIFRpbWUgQWN0IDE5NzIKLSMgPC9hPgorIyBodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL2FjdC9jb25zb2xfYWN0L3N0YXN0YTE5NzIyNzkvaW5kZXguaHRtbAogIyBTQQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL3NhL2NvbnNvbF9hY3Qvc3RhMTg5ODEzNy9pbmRleC5odG1sIj4KICMgU3RhbmRhcmQgVGltZSBBY3QsIDE4OTgKLSMgPC9hPgorIyBodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL3NhL2NvbnNvbF9hY3Qvc3RhMTg5ODEzNy9pbmRleC5odG1sCiAKICMgRnJvbSBEYXZpZCBHcm9zeiAoMjAwNS0wNi0xMyk6CiAjIEl0IHdhcyBhbm5vdW5jZWQgbGFzdCB3ZWVrIHRoYXQgRGF5bGlnaHQgU2F2aW5nIHdvdWxkIGJlIGV4dGVuZGVkIGJ5CkBAIC0xMDgzLDcgKzEwMjQsNyBAQAogIyBWaWN0b3JpYTogSSB3YXNuJ3QgYWJsZSB0byBmaW5kIGFueXRoaW5nIHNlcGFyYXRlLCBidXQgdGhlIG90aGVyIGFydGljbGVzCiAjIGFsbHVkZSB0byBpdC4KICMgQnV0IG5vdCBRdWVlbnNsYW5kCi0jIGh0dHA6Ly93d3cubmV3cy5jb20uYXUvc3RvcnkvMCwxMDExNywxNTU2NDAzMC0xMjQ4LDAwLmh0bWwuCisjIGh0dHA6Ly93d3cubmV3cy5jb20uYXUvc3RvcnkvMCwxMDExNywxNTU2NDAzMC0xMjQ4LDAwLmh0bWwKIAogIyBOb3J0aGVybiBUZXJyaXRvcnkKIApAQCAtMTEzMCw5ICsxMDcxLDkgQEAKICMgVGhlIDE5OTIgZW5kaW5nIGRhdGUgdXNlZCBpbiB0aGUgcnVsZXMgaXMgYSBiZXN0IGd1ZXNzOwogIyBpdCBtYXRjaGVzIHdoYXQgd2FzIHVzZWQgaW4gdGhlIHBhc3QuCiAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib20uZ292LmF1L2ZhcS9mYXFnZW4uaHRtIj4KICMgVGhlIEF1c3RyYWxpYW4gQnVyZWF1IG9mIE1ldGVvcm9sb2d5IEZBUQotIyA8L2E+ICgxOTk5LTA5LTI3KSB3cml0ZXMgdGhhdCBHaWxlcyBNZXRlb3JvbG9naWNhbCBTdGF0aW9uIHVzZXMKKyMgaHR0cDovL3d3dy5ib20uZ292LmF1L2ZhcS9mYXFnZW4uaHRtCisjICgxOTk5LTA5LTI3KSB3cml0ZXMgdGhhdCBHaWxlcyBNZXRlb3JvbG9naWNhbCBTdGF0aW9uIHVzZXMKICMgU291dGggQXVzdHJhbGlhbiB0aW1lIGV2ZW4gdGhvdWdoIGl0J3MgbG9jYXRlZCBpbiBXZXN0ZXJuIEF1c3RyYWxpYS4KIAogIyBRdWVlbnNsYW5kCkBAIC0xMTczLDkgKzExMTQsOSBAQAogIyBUaGUgY2hvc2VuIHJ1bGVzIHRoZSB1bmlvbiBvZiB0aGUgMTk3MS8xOTcyIGNoYW5nZSBhbmQgdGhlIDE5ODktMTk5MiBjaGFuZ2VzLgogCiAjIEZyb20gQ2hyaXN0b3BoZXIgSHVudCAoMjAwNi0xMS0yMSksIGFmdGVyIGFuIGFkdmFuY2Ugd2FybmluZwotIyBmcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0xMS0wMSk6CisjIGZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNi0xMS0wMSk6CiAjIFdBIGFyZSB0cmlhbGluZyBEU1QgZm9yIHRocmVlIHllYXJzLgotIyA8aHR0cDovL3d3dy5wYXJsaWFtZW50LndhLmdvdi5hdS9wYXJsaWFtZW50L2JpbGxzLm5zZi85QTFCMTgzMTQ0NDAzREE1NDgyNTcyMTIwMDA4OERGMS8kRmlsZS9CaWxsMTc1LTFCLnBkZj4KKyMgaHR0cDovL3d3dy5wYXJsaWFtZW50LndhLmdvdi5hdS9wYXJsaWFtZW50L2JpbGxzLm5zZi85QTFCMTgzMTQ0NDAzREE1NDgyNTcyMTIwMDA4OERGMS8kRmlsZS9CaWxsMTc1LTFCLnBkZgogCiAjIEZyb20gUml2ZXMgTWNEb3cgKDIwMDItMDQtMDkpOgogIyBUaGUgbW9zdCBpbnRlcmVzdGluZyByZWdpb24gSSBoYXZlIGZvdW5kIGNvbnNpc3RzIG9mIHRocmVlIHRvd25zIG9uIHRoZQpAQCAtMTE4OSw3ICsxMTMwLDcgQEAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMi0wNC0wOSk6CiAjIFRoaXMgaXMgY29uZmlybWVkIGJ5IHRoZSBzZWN0aW9uIGVudGl0bGVkCiAjICJXaGF0J3MgdGhlIGRlYWwgd2l0aCB0aW1lIHpvbmVzPz8/IiBpbgotIyA8aHR0cDovL3d3dy5lYXJ0aHNjaS51bmltZWxiLmVkdS5hdS9+YXdhdGtpbnMvbnVsbC5odG1sPi4KKyMgaHR0cDovL3d3dy5lYXJ0aHNjaS51bmltZWxiLmVkdS5hdS9+YXdhdGtpbnMvbnVsbC5odG1sCiAjCiAjIEZyb20gQWxleCBMaXZpbmdzdG9uICgyMDA2LTEyLTA3KToKICMgLi4uIGl0IHdhcyBqdXN0IG9uIGZvdXIgeWVhcnMgYWdvIHRoYXQgSSBkcm92ZSBhbG9uZyB0aGUgRXlyZSBIaWdod2F5LApAQCAtMTMzNyw3ICsxMjc4LDcgQEAKICMgQmFzZWQgb24gbGF3IGxpYnJhcnkgcmVzZWFyY2ggYnkgSm9obiBNYWNraW4sCiAjIHdobyBub3RlczoKICMJSW4gQXVzdHJhbGlhLCB0aW1lIGlzIG5vdCBsZWdpc2xhdGVkIGZlZGVyYWxseSwgYnV0IHJhdGhlciBieSB0aGUKLSMJaW5kaXZpZHVhbCBzdGF0ZXMuICBUaHVzLCB3aGlsZSBzdWNoIHRlcm1zIGFzIGBgRWFzdGVybiBTdGFuZGFyZCBUaW1lJycKKyMJaW5kaXZpZHVhbCBzdGF0ZXMuICBUaHVzLCB3aGlsZSBzdWNoIHRlcm1zIGFzICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiCiAjCVtJIG1lYW4sIG9mIGNvdXJzZSwgQXVzdHJhbGlhbiBFU1QsIG5vdCBhbnkgb3RoZXIga2luZF0gYXJlIGluIGNvbW1vbgogIwl1c2UsIF90aGV5IGhhdmUgTk8gUkVBTCBNRUFOSU5HXywgYXMgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gdGhlCiAjCWxlZ2lzbGF0aW9uLiAgVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCB0byB1bmRlcnN0YW5kLgpAQCAtMTM0NSw0OCArMTI4Niw0MiBAQAogCiAjIEZyb20gRXJpYyBVbGV2aWsgKDE5OTktMDUtMjYpOgogIyBEU1Qgd2lsbCBzdGFydCBpbiBOU1cgb24gdGhlIGxhc3QgU3VuZGF5IG9mIEF1Z3VzdCwgcmF0aGVyIHRoYW4gdGhlIHVzdWFsCi0jIE9jdG9iZXIgaW4gMjAwMC4gIFtTZWU6IE1hdHRoZXcgTW9vcmUsCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc21oLmNvbS5hdS9uZXdzLzk5MDUvMjYvcGFnZW9uZS9wYWdlb25lNC5odG1sIj4KLSMgVHdvIG1vbnRocyBtb3JlIGRheWxpZ2h0IHNhdmluZwotIyA8L2E+Ci0jIFN5ZG5leSBNb3JuaW5nIEhlcmFsZCAoMTk5OS0wNS0yNikuXQorIyBPY3RvYmVyIGluIDIwMDAuICBTZWU6IE1hdHRoZXcgTW9vcmUsCisjIFR3byBtb250aHMgbW9yZSBkYXlsaWdodCBzYXZpbmcsIFN5ZG5leSBNb3JuaW5nIEhlcmFsZCAoMTk5OS0wNS0yNikuCisjIGh0dHA6Ly93d3cuc21oLmNvbS5hdS9uZXdzLzk5MDUvMjYvcGFnZW9uZS9wYWdlb25lNC5odG1sCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yNyk6CiAjIFNlZSB0aGUgZm9sbG93aW5nIG9mZmljaWFsIE5TVyBzb3VyY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9kaXIuZ2lzLm5zdy5nb3YuYXUvY2dpLWJpbi9nZW5vYmplY3QvZG9jdW1lbnQvb3RoZXIvZGF5bGlnaHRzYXZpbmcvdGlnR21aIj4KICMgRGF5bGlnaHQgU2F2aW5nIGluIE5ldyBTb3V0aCBXYWxlcy4KLSMgPC9hPgorIyBodHRwOi8vZGlyLmdpcy5uc3cuZ292LmF1L2NnaS1iaW4vZ2Vub2JqZWN0L2RvY3VtZW50L290aGVyL2RheWxpZ2h0c2F2aW5nL3RpZ0dtWgogIwogIyBOYXJyYWJyaSBTaGlyZSAoTlNXKSBjb3VuY2lsIGhhcyBhbm5vdW5jZWQgaXQgd2lsbCBpZ25vcmUgdGhlIGV4dGVuc2lvbiBvZgogIyBkYXlsaWdodCBzYXZpbmcgbmV4dCB5ZWFyLiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL3JlZ2lvbmFscy9uZXdlbmcvbW9udGhseS9yZWdlbmctMjJqdWwxOTk5LTEuaHRtIj4KICMgTmFycmFicmkgQ291bmNpbCB0byBpZ25vcmUgZGF5bGlnaHQgc2F2aW5nCi0jIDwvYT4gKDE5OTktMDctMjIpLiAgRm9yIG5vdywgd2UnbGwgd2FpdCB0byBzZWUgaWYgdGhpcyByZWFsbHkgaGFwcGVucy4KKyMgaHR0cDovL2FiYy5uZXQuYXUvbmV3cy9yZWdpb25hbHMvbmV3ZW5nL21vbnRobHkvcmVnZW5nLTIyanVsMTk5OS0xLmh0bQorIyAoMTk5OS0wNy0yMikuICBGb3Igbm93LCB3ZSdsbCB3YWl0IHRvIHNlZSBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLgogIwogIyBWaWN0b3JpYSB3aWxsIGZvbGxvd2luZyBOU1cuICBTZWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hYmMubmV0LmF1L2xvY2FsL25ld3Mvb2x5bXBpY3MvMTk5OS8wNy9pdGVtMTk5OTA3MjgxMTIzMTRfMS5odG0iPgotIyBWaWMgdG8gZXh0ZW5kIGRheWxpZ2h0IHNhdmluZwotIyA8L2E+ICgxOTk5LTA3LTI4KS4KKyMgVmljIHRvIGV4dGVuZCBkYXlsaWdodCBzYXZpbmcgKDE5OTktMDctMjgpCisjIGh0dHA6Ly9hYmMubmV0LmF1L2xvY2FsL25ld3Mvb2x5bXBpY3MvMTk5OS8wNy9pdGVtMTk5OTA3MjgxMTIzMTRfMS5odG0KICMKICMgSG93ZXZlciwgU291dGggQXVzdHJhbGlhIHJlamVjdGVkIHRoZSBEU1QgcmVxdWVzdC4gIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL2FiYy5uZXQuYXUvbmV3cy9vbHltcGljcy8xOTk5LzA3L2l0ZW0xOTk5MDcxOTE1MTc1NF8xLmh0bSI+Ci0jIFNvdXRoIEF1c3RyYWxpYSByZWplY3RzIE9seW1waWNzIGRheWxpZ2h0IHNhdmluZ3MgcmVxdWVzdAotIyA8L2E+ICgxOTk5LTA3LTE5KS4KKyMgU291dGggQXVzdHJhbGlhIHJlamVjdHMgT2x5bXBpY3MgZGF5bGlnaHQgc2F2aW5ncyByZXF1ZXN0ICgxOTk5LTA3LTE5KQorIyBodHRwOi8vYWJjLm5ldC5hdS9uZXdzL29seW1waWNzLzE5OTkvMDcvaXRlbTE5OTkwNzE5MTUxNzU0XzEuaHRtCiAjCiAjIFF1ZWVuc2xhbmQgYWxzbyB3aWxsIG5vdCBvYnNlcnZlIERTVCBmb3IgdGhlIE9seW1waWNzLiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL29seW1waWNzLzE5OTkvMDYvaXRlbTE5OTkwNjAxMTE0NjA4XzEuaHRtIj4KICMgUWxkIHNheXMgbm8gdG8gZGF5bGlnaHQgc2F2aW5ncyBmb3IgT2x5bXBpY3MKLSMgPC9hPiAoMTk5OS0wNi0wMSksIHdoaWNoIHF1b3RlcyBRdWVlbnNsYW5kIFByZW1pZXIgUGV0ZXIgQmVhdHRpZSBhcyBzYXlpbmcKLSMgYGBMb29rIHlvdSd2ZSBnb3QgdG8gcmVtZW1iZXIgaW4gbXkgZmFtaWx5IHdoZW4gdGhpcyBjYW1lIHVwIGxhc3QgdGltZQorIyBodHRwOi8vYWJjLm5ldC5hdS9uZXdzL29seW1waWNzLzE5OTkvMDYvaXRlbTE5OTkwNjAxMTE0NjA4XzEuaHRtCisjICgxOTk5LTA2LTAxKSwgd2hpY2ggcXVvdGVzIFF1ZWVuc2xhbmQgUHJlbWllciBQZXRlciBCZWF0dGllIGFzIHNheWluZworIyAiTG9vayB5b3UndmUgZ290IHRvIHJlbWVtYmVyIGluIG15IGZhbWlseSB3aGVuIHRoaXMgY2FtZSB1cCBsYXN0IHRpbWUKICMgSSB2b3RlZCBmb3IgaXQsIG15IHdpZmUgdm90ZWQgYWdhaW5zdCBpdCBhbmQgc2hlIHNhaWQgdG8gbWUgaXQncyBhbGwgdmVyeQogIyB3ZWxsIGZvciB5b3UsIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGdldHRpbmcgdGhlIGNoaWxkcmVuIG91dCBvZgogIyBiZWQsIGdldHRpbmcgdGhlbSB0byBzY2hvb2wsIGdldHRpbmcgdGhlbSB0byBzbGVlcCBhdCBuaWdodC4KLSMgSSd2ZSBiZWVuIHRocm91Z2ggYWxsIHRoaXMgYXJndW1lbnQgZG9tZXN0aWNhbGx5Li4ubXkgd2lmZSBydWxlcy4nJworIyBJJ3ZlIGJlZW4gdGhyb3VnaCBhbGwgdGhpcyBhcmd1bWVudCBkb21lc3RpY2FsbHkuLi5teSB3aWZlIHJ1bGVzLiIKICMKICMgQnJva2VuIEhpbGwgd2lsbCBzdGljayB3aXRoIFNvdXRoIEF1c3RyYWxpYW4gdGltZSBpbiAyMDAwLiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL3JlZ2lvbmFscy9icm9rZW5oL21vbnRobHkvcmVnYnJvay0yMWp1bDE5OTktNi5odG0iPgotIyBCcm9rZW4gSGlsbCB0byBiZSBiZWhpbmQgdGhlIHRpbWVzCi0jIDwvYT4gKDE5OTktMDctMjEpLgorIyBCcm9rZW4gSGlsbCB0byBiZSBiZWhpbmQgdGhlIHRpbWVzICgxOTk5LTA3LTIxKQorIyBodHRwOi8vYWJjLm5ldC5hdS9uZXdzL3JlZ2lvbmFscy9icm9rZW5oL21vbnRobHkvcmVnYnJvay0yMWp1bDE5OTktNi5odG0KIAogIyBJQVRBIFNTSU0gKDE5OTgtMDkpIHNheXMgdGhhdCB0aGUgc3ByaW5nIDIwMDAgY2hhbmdlIGZvciBBdXN0cmFsaWFuCiAjIENhcGl0YWwgVGVycml0b3J5LCBOZXcgU291dGggV2FsZXMgZXhjZXB0IExvcmQgSG93ZSBJc2xhbmQgYW5kIEJyb2tlbgpAQCAtMTQwMiw3ICsxMzM3LDcgQEAKICMgWWFuY293aW5uYQogCiAjIEZyb20gSm9obiBNYWNraW4gKDE5ODktMDEtMDQpOgotIyBgQnJva2VuIEhpbGwnIG1lYW5zIHRoZSBDb3VudHkgb2YgWWFuY293aW5uYS4KKyMgJ0Jyb2tlbiBIaWxsJyBtZWFucyB0aGUgQ291bnR5IG9mIFlhbmNvd2lubmEuCiAKICMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKICMgIyBZQU5DT1dJTk5BLi4gIFsgQ29uZmlybWF0aW9uIGNvdXJ0ZXN5IG9mIEJyb2tlbiBIaWxsIFBvc3RtYXN0ZXIgXQpAQCAtMTQ1OSw5ICsxMzk0LDcgQEAKICMgc3VtbWVyIChzb3V0aGVybiBoZW1pc3BoZXJlKS4KICMKICMgRnJvbQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhZmV3b3JrLnNhLmdvdi5hdS91cGxvYWRlZF9maWxlcy9EYXlsaWdodERhdGVzU2V0LnBkZiI+CiAjIGh0dHA6Ly93d3cuc2FmZXdvcmsuc2EuZ292LmF1L3VwbG9hZGVkX2ZpbGVzL0RheWxpZ2h0RGF0ZXNTZXQucGRmCi0jIDwvYT4KICMgVGhlIGV4dGVuZGVkIGRheWxpZ2h0IHNhdmluZyBwZXJpb2QgdGhhdCBTb3V0aCBBdXN0cmFsaWEgaGFzIGJlZW4gdHJpYWxsaW5nCiAjIGZvciBvdmVyIHRoZSBsYXN0IHllYXIgaXMgbm93IHNldCB0byBiZSBvbmdvaW5nLgogIyBEYXlsaWdodCBzYXZpbmcgd2lsbCBjb250aW51ZSB0byBzdGFydCBvbiB0aGUgZmlyc3QgU3VuZGF5IGluIE9jdG9iZXIgZWFjaApAQCAtMTQ3MSw5ICsxNDA0LDcgQEAKICMgdGhlIEFDVCBmb3IgYWxsIDUyIHdlZWtzIG9mIHRoZSB5ZWFyLi4uCiAjCiAjIFdlIGhhdmUgYSB3cmFwLXVwIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zb3V0aC1hdXN0cmFsaWEtZXh0ZW5kcy1kc3QuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zb3V0aC1hdXN0cmFsaWEtZXh0ZW5kcy1kc3QuaHRtbAotIyA8L2E+CiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgTmV3IFplYWxhbmQKQEAgLTE0ODIsNyArMTQxMyw3IEBACiAjIHRoZSAxOTg5LzkwIHllYXIgd2FzIGEgdHJpYWwgb2YgYW4gZXh0ZW5kZWQgImRheWxpZ2h0IHNhdmluZyIgcGVyaW9kLgogIyBUaGlzIHRyaWFsIHdhcyBkZWVtZWQgc3VjY2Vzc2Z1bCBhbmQgdGhlIGV4dGVuZGVkIHBlcmlvZCBhZG9wdGVkIGZvcgogIyBzdWJzZXF1ZW50IHllYXJzICh3aXRoIHRoZSBhZGRpdGlvbiBvZiBhIGZ1cnRoZXIgd2VlayBhdCB0aGUgc3RhcnQpLgotIyBzb3VyY2UgLS0gcGhvbmUgY2FsbCB0byBNaW5pc3RyeSBvZiBJbnRlcm5hbCBBZmZhaXJzIEhlYWQgT2ZmaWNlLgorIyBzb3VyY2UgLSBwaG9uZSBjYWxsIHRvIE1pbmlzdHJ5IG9mIEludGVybmFsIEFmZmFpcnMgSGVhZCBPZmZpY2UuCiAKICMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKICMgIyBUaGUgQ291bnRyeSBvZiBOZXcgWmVhbGFuZCAgIChBdXN0cmFsaWEncyBlYXN0IGlzbGFuZCAtKSBHZWUgdGhleSBoYXRlIHRoYXQhCkBAIC0xNTI0LDYgKzE0NTUsMTkgQEAKICMgdGhhdCBEU1Qgd2lsbCBiZWdpbiBvbiAyMDA3LTA5LTMwIDIwMDgtMDQtMDYuCiAjIGh0dHA6Ly93d3cuZGlhLmdvdnQubnovZGlhd2Vic2l0ZS5uc2Yvd3BnX1VSTC9TZXJ2aWNlcy1EYXlsaWdodC1TYXZpbmctRGF5bGlnaHQtc2F2aW5nLXRvLWJlLWV4dGVuZGVkCiAKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0xNCk6CisjIENoYXRoYW0gSXNsYW5kIHRpbWUgd2FzIGZvcm1hbGx5IHN0YW5kYXJkaXplZCBvbiAxOTU3LTAxLTAxIGJ5CisjIE5ldyBaZWFsYW5kJ3MgU3RhbmRhcmQgVGltZSBBbWVuZG1lbnQgQWN0IDE5NTYgKDE5NTYtMTAtMjYpLgorIyBodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L256L2xlZ2lzL2hpc3RfYWN0L3N0YWExOTU2MTk1Nm4xMDAyNDQucGRmCisjIEFjY29yZGluZyB0byBHb29nbGUgQm9va3Mgc25pcHBldCB2aWV3LCBhIHNwZWFrZXIgaW4gdGhlIE5ldyBaZWFsYW5kCisjIHBhcmxpYW1lbnRhcnkgZGViYXRlcyBpbiAxOTU2IHNhaWQgIkNsYXVzZSA3OCBtYWtlcyBwcm92aXNpb24gZm9yIHN0YW5kYXJkCisjIHRpbWUgaW4gdGhlIENoYXRoYW0gSXNsYW5kcy4gIFRoZSB0aW1lIHRoZXJlIGlzIDQ1IG1pbnV0ZXMgaW4gYWR2YW5jZSBvZiBOZXcKKyMgWmVhbGFuZCB0aW1lLiAgSSB1bmRlcnN0YW5kIHRoYXQgaXMgdGhlIHRpbWUgdGhleSBrZWVwIGxvY2FsbHksIGFueWhvdy4iCisjIEZvciBub3csIGFzc3VtZSB0aGlzIHByYWN0aWNlIGdvZXMgYmFjayB0byB0aGUgaW50cm9kdWN0aW9uIG9mIHN0YW5kYXJkIHRpbWUKKyMgaW4gTmV3IFplYWxhbmQsIGFzIHRoaXMgd291bGQgbWFrZSBDaGF0aGFtIElzbGFuZHMgdGltZSBhbG1vc3QgZXhhY3RseSBtYXRjaAorIyBMTVQgYmFjayB3aGVuIE5ldyBaZWFsYW5kIHdhcyBhdCBVVEMrMTE6MzA7IGFsc28sIGFzc3VtZSBDaGF0aGFtIElzbGFuZHMgZGlkCisjIG5vdCBvYnNlcnZlIE5ldyBaZWFsYW5kJ3MgcHJld2FyIERTVC4KKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAKQEAgLTE1NDMsNyArMTQ4Nyw3IEBACiAKICMgRnJvbSB0aGUgQkJDIFdvcmxkIFNlcnZpY2UgaW4KICMgaHR0cDovL25ld3MuYmJjLmNvLnVrLzIvaGkvYXNpYS1wYWNpZmljLzIwNTIyNi5zdG0gKDE5OTgtMTAtMzEgMTY6MDMgVVRDKToKLSMgVGhlIEZpamlpYW4gZ292ZXJubWVudCBzYXlzIHRoZSBtYWluIHJlYXNvbnMgZm9yIHRoZSB0aW1lIGNoYW5nZSBpcyB0bworIyBUaGUgRmlqaWFuIGdvdmVybm1lbnQgc2F5cyB0aGUgbWFpbiByZWFzb25zIGZvciB0aGUgdGltZSBjaGFuZ2UgaXMgdG8KICMgaW1wcm92ZSBwcm9kdWN0aXZpdHkgYW5kIHJlZHVjZSByb2FkIGFjY2lkZW50cy4uLi4gW1RdaGUgbW92ZSBpcyBhbHNvCiAjIGludGVuZGVkIHRvIGJvb3N0IEZpamkncyBhYmlsaXR5IHRvIGF0dHJhY3QgdG91cmlzdHMgdG8gd2l0bmVzcyB0aGUgZGF3bmluZwogIyBvZiB0aGUgbmV3IG1pbGxlbm5pdW0uCkBAIC0xNTUxLDE2ICsxNDk1LDEyIEBACiAjIGh0dHA6Ly93d3cuZmlqaS5nb3YuZmovcHJlc3MvMjAwMF8wOS8yMDAwXzA5XzEzLTA1LnNodG1sICgyMDAwLTA5LTEzKQogIyByZXBvcnRzIHRoYXQgRmlqaSBoYXMgZGlzY29udGludWVkIERTVC4KIAotIyBKb2huc3RvbgotCi0jIEpvaG5zdG9uIGRhdGEgaXMgZnJvbSB1c25vMTk5NS4KLQogCiAjIEtpcmliYXRpCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wMS0yMik6CiAjIFRvZGF5J3MgX1dhbGwgU3RyZWV0IEpvdXJuYWxfIChwYWdlIDEpIHJlcG9ydHMgdGhhdCBLaXJpYmF0aQotIyBgYGRlY2xhcmVkIGl0IHRoZSBzYW1lIGRheSBbdGhyb3VnaG91dF0gdGhlIGNvdW50cnkgYXMgb2YgSmFuLiAxLCAxOTk1JycKKyMgImRlY2xhcmVkIGl0IHRoZSBzYW1lIGRheSBbdGhyb3VnaG91dF0gdGhlIGNvdW50cnkgYXMgb2YgSmFuLiAxLCAxOTk1IgogIyBhcyBwYXJ0IG9mIHRoZSBjb21wZXRpdGlvbiB0byBiZSBmaXJzdCBpbnRvIHRoZSAyMXN0IGNlbnR1cnkuCiAKIApAQCAtMTU3NSw4ICsxNTE1LDggQEAKIAogIyBOIE1hcmlhbmEgSXMsIEd1YW0KIAotIyBIb3dzZSB3cml0ZXMgKHAgMTUzKSBgYFRoZSBTcGFuaWFyZHMsIG9uIHRoZSBvdGhlciBoYW5kLCByZWFjaGVkIHRoZQotIyBQaGlsaXBwaW5lcyBhbmQgdGhlIExhZHJvbmVzIGZyb20gQW1lcmljYSwnJyBhbmQgaW1wbGllcyB0aGF0IHRoZSBMYWRyb25lcworIyBIb3dzZSB3cml0ZXMgKHAgMTUzKSAiVGhlIFNwYW5pYXJkcywgb24gdGhlIG90aGVyIGhhbmQsIHJlYWNoZWQgdGhlCisjIFBoaWxpcHBpbmVzIGFuZCB0aGUgTGFkcm9uZXMgZnJvbSBBbWVyaWNhLCIgYW5kIGltcGxpZXMgdGhhdCB0aGUgTGFkcm9uZXMKICMgKG5vdyBjYWxsZWQgdGhlIE1hcmlhbmFzKSBrZXB0IEFtZXJpY2FuIGRhdGUgZm9yIHF1aXRlIHNvbWUgdGltZS4KICMgRm9yIG5vdywgd2UgYXNzdW1lIHRoZSBMYWRyb25lcyBzd2l0Y2hlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBQaGlsaXBwaW5lczsKICMgc2VlIEFzaWEvTWFuaWxhLgpAQCAtMTU5MCwxNyArMTUzMCwxNiBAQAogIyBNaWNyb25lc2lhCiAKICMgQWxhbiBFdWdlbmUgRGF2aXMgd3JpdGVzICgxOTk2LTAzLTE2KSwKLSMgYGBJIGFtIGNlcnRhaW4sIGhhdmluZyBsaXZlZCB0aGVyZSBmb3IgdGhlIHBhc3QgZGVjYWRlLCB0aGF0ICJUcnVrIgotIyAobm93IHByb3Blcmx5IGtub3duIGFzIENodXVrKSAuLi4gaXMgaW4gdGhlIHRpbWUgem9uZSBHTVQrMTAuJycKKyMgIkkgYW0gY2VydGFpbiwgaGF2aW5nIGxpdmVkIHRoZXJlIGZvciB0aGUgcGFzdCBkZWNhZGUsIHRoYXQgJ1RydWsnCisjIChub3cgcHJvcGVybHkga25vd24gYXMgQ2h1dWspIC4uLiBpcyBpbiB0aGUgdGltZSB6b25lIEdNVCsxMC4iCiAjCiAjIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IFRydWsgc3dpdGNoZWQgZnJvbSBVVEMrMTAgdG8gVVRDKzExCiAjIG9uIDE5NzgtMTAtMDE7IGlnbm9yZSB0aGlzIGZvciBub3cuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0xMC0yOSk6CiAjIFRoZSBGZWRlcmF0ZWQgU3RhdGVzIG9mIE1pY3JvbmVzaWEgVmlzaXRvcnMgQm9hcmQgd3JpdGVzIGluCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZnNtZ292Lm9yZy9pbmZvL2Nsb2Nrcy5odG1sIj4KLSMgVGhlIEZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYSAtIFZpc2l0b3IgSW5mb3JtYXRpb24KLSMgPC9hPiAoMTk5OS0wMS0yNikKKyMgVGhlIEZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYSAtIFZpc2l0b3IgSW5mb3JtYXRpb24gKDE5OTktMDEtMjYpCisjIGh0dHA6Ly93d3cuZnNtZ292Lm9yZy9pbmZvL2Nsb2Nrcy5odG1sCiAjIHRoYXQgVHJ1ayBhbmQgWWFwIGFyZSBVVEMrMTAsIGFuZCBQb25hcGUgYW5kIEtvc3JhZSBhcmUgVVRDKzExLgogIyBXZSBkb24ndCBrbm93IHdoZW4gS29zcmFlIHN3aXRjaGVkIGZyb20gVVRDKzEyOyBhc3N1bWUgSmFudWFyeSAxIGZvciBub3cuCiAKQEAgLTE2NDYsMjcgKzE1ODUsMzQgQEAKICMgU2FjcmFtZW50byBidXQgaXQgd2FzIGNoYW5nZWQgYSBjb3VwbGUgb2YgeWVhcnMgYWdvLgogCiAKLSMgU2Ftb2EKKyMgKFdlc3Rlcm4pIFNhbW9hIGFuZCBBbWVyaWNhbiBTYW1vYQogCiAjIEhvd3NlIHdyaXRlcyAocCAxNTMsIGNpdGluZyBwIDEwIG9mIHRoZSAxODgzLTExLTE4IE5ldyBZb3JrIEhlcmFsZCkKICMgdGhhdCBpbiAxODc5IHRoZSBLaW5nIG9mIFNhbW9hIGRlY2lkZWQgdG8gY2hhbmdlCi0jIGBgdGhlIGRhdGUgaW4gaGlzIGtpbmdkb20gZnJvbSB0aGUgQW50aXBvZGVhbiB0byB0aGUgQW1lcmljYW4gc3lzdGVtLAotIyBvcmRhaW5pbmcgLS0gYnkgYSBtYXN0ZXJwaWVjZSBvZiBkaXBsb21hdGljIGZsYXR0ZXJ5IC0tIHRoYXQKLSMgdGhlIEZvdXJ0aCBvZiBKdWx5IHNob3VsZCBiZSBjZWxlYnJhdGVkIHR3aWNlIGluIHRoYXQgeWVhci4nJworIyAidGhlIGRhdGUgaW4gaGlzIGtpbmdkb20gZnJvbSB0aGUgQW50aXBvZGVhbiB0byB0aGUgQW1lcmljYW4gc3lzdGVtLAorIyBvcmRhaW5pbmcgLSBieSBhIG1hc3RlcnBpZWNlIG9mIGRpcGxvbWF0aWMgZmxhdHRlcnkgLSB0aGF0CisjIHRoZSBGb3VydGggb2YgSnVseSBzaG91bGQgYmUgY2VsZWJyYXRlZCB0d2ljZSBpbiB0aGF0IHllYXIuIgogCisjIEFsdGhvdWdoIFNoYW5rcyAmIFBvdHRlbmdlciBzYXlzIHRoZXkgYm90aCBzd2l0Y2hlZCB0byBVVEMtMTE6MzAKKyMgaW4gMTkxMSwgYW5kIHRvIFVUQy0xMSBpbiAxOTUwLiBtYW55IGVhcmxpZXIgc291cmNlcyBnaXZlIFVUQy0xMQorIyBmb3IgQW1lcmljYW4gU2Ftb2EsIGUuZy4sIHRoZSBVUyBOYXRpb25hbCBCdXJlYXUgb2YgU3RhbmRhcmRzCisjIGNpcmN1bGFyICJTdGFuZGFyZCBUaW1lIFRocm91Z2hvdXQgdGhlIFdvcmxkIiwgMTkzMi4KKyMgQXNzdW1lIEFtZXJpY2FuIFNhbW9hIHN3aXRjaGVkIHRvIFVUQy0xMSBpbiAxOTExLCBub3QgMTk1MCwKKyMgYW5kIHRoYXQgYWZ0ZXIgMTk1MCB0aGV5IGFncmVlZCB1bnRpbCAod2VzdGVybikgU2Ftb2Egc2tpcHBlZCBhCisjIGRheSBpbiAyMDExLiAgQXNzdW1lIGFsc28gdGhhdCB0aGUgU2Ftb2FzIGZvbGxvdyB0aGUgVVMgYW5kIE5ldworIyBaZWFsYW5kJ3MgIlNUIi8iRFQiIHN0eWxlIG9mIGRheWxpZ2h0LXNhdmluZyBhYmJyZXZpYXRpb25zLgogCiAjIFRvbmdhCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wMS0yMik6Ci0jIFRvZGF5J3MgX1dhbGwgU3RyZWV0IEpvdXJuYWxfIChwIDEpIHJlcG9ydHMgdGhhdCBgYFRvbmdhIGhhcyBiZWVuIHBsb3R0aW5nCi0jIHRvIHNuZWFrIGFoZWFkIG9mIFtOZXcgWmVhbGFuZGVyc10gYnkgaW50cm9kdWNpbmcgZGF5bGlnaHQtc2F2aW5nIHRpbWUuJycKKyMgVG9kYXkncyBfV2FsbCBTdHJlZXQgSm91cm5hbF8gKHAgMSkgcmVwb3J0cyB0aGF0ICJUb25nYSBoYXMgYmVlbiBwbG90dGluZworIyB0byBzbmVhayBhaGVhZCBvZiBbTmV3IFplYWxhbmRlcnNdIGJ5IGludHJvZHVjaW5nIGRheWxpZ2h0LXNhdmluZyB0aW1lLiIKICMgU2luY2UgS2lyaWJhdGkgaGFzIG1vdmVkIHRoZSBEYXRlIExpbmUgaXQncyBub3QgY2xlYXIgd2hhdCBUb25nYSB3aWxsIGRvLgogCiAjIERvbiBNdW5kZWxsIHdyaXRlcyBpbiB0aGUgMTk5Ny0wMi0yMCBUb25nYSBDaHJvbmljbGUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50b25nYXRhcHUubmV0LnRvL3RvbmdhL2hvbWVsYW5kL3RpbWViZWdpbnMuaHRtIj4KLSMgSG93IFRvbmdhIGJlY2FtZSBgVGhlIExhbmQgd2hlcmUgVGltZSBCZWdpbnMnCi0jIDwvYT46Ci0KKyMgSG93IFRvbmdhIGJlY2FtZSAnVGhlIExhbmQgd2hlcmUgVGltZSBCZWdpbnMnOgorIyBodHRwOi8vd3d3LnRvbmdhdGFwdS5uZXQudG8vdG9uZ2EvaG9tZWxhbmQvdGltZWJlZ2lucy5odG0KKyMKICMgVW50aWwgMTk0MSBUb25nYSBtYWludGFpbmVkIGEgc3RhbmRhcmQgdGltZSA1MCBtaW51dGVzIGFoZWFkIG9mIE5aU1QKICMgMTIgaG91cnMgYW5kIDIwIG1pbnV0ZXMgYWhlYWQgb2YgR01ULiAgV2hlbiBOZXcgWmVhbGFuZCBhZGp1c3RlZCBpdHMKICMgc3RhbmRhcmQgdGltZSBpbiAxOTQwcywgVG9uZ2EgaGFkIHRoZSBjaG9pY2Ugb2Ygc3VidHJhY3RpbmcgZnJvbSBpdHMKQEAgLTE2NzQsOCArMTYyMCw4IEBACiAjIGFkdmFuY2luZyBpdHMgdGltZSB0byBtYWludGFpbiB0aGUgZGlmZmVyZW50aWFsIG9mIDEzIGRlZ3JlZXMKICMgKGFwcHJveGltYXRlbHkgNTAgbWludXRlcyBhaGVhZCBvZiBOZXcgWmVhbGFuZCB0aW1lKS4KICMKLSMgQmVjYXVzZSBIaXMgTWFqZXN0eSBLaW5nIFRhdWZhJ2FoYXUgVHVwb3UgSVYsIHRoZW4gQ3Jvd24gUHJpbmNlCi0jIFR1bmdpLCBwcmVmZXJyZWQgdG8gZW5zdXJlIFRvbmdhJ3MgdGl0bGUgYXMgdGhlIGxhbmQgd2hlcmUgdGltZQorIyBCZWNhdXNlIEhpcyBNYWplc3R5IEtpbmcgVMSBdWZhyrvEgWhhdSBUdXBvdSBJViwgdGhlbiBDcm93biBQcmluY2UKKyMgVHVuZ8SrLCBwcmVmZXJyZWQgdG8gZW5zdXJlIFRvbmdhJ3MgdGl0bGUgYXMgdGhlIGxhbmQgd2hlcmUgdGltZQogIyBiZWdpbnMsIHRoZSBMZWdpc2xhdGl2ZSBBc3NlbWJseSBhcHByb3ZlZCB0aGUgbGF0dGVyIGNoYW5nZS4KICMKICMgQnV0IHNvbWUgb2YgdGhlIG9sZGVyLCBtb3JlIGNvbnNlcnZhdGl2ZSBtZW1iZXJzIGZyb20gdGhlIG91dGVyCkBAIC0xNzAxLDkgKzE2NDcsNyBAQAogIyAqIFRvbmdhIHdpbGwgaW50cm9kdWNlIERTVCBpbiBOb3ZlbWJlcgogIwogIyBJIHdhcyBnaXZlbiB0aGlzIGxpbmsgYnkgSm9obiBMZXR0czoKLSMgPGEgaHJlZj0iaHR0cDovL25ld3MuYmJjLmNvLnVrL2hpL2VuZ2xpc2gvd29ybGQvYXNpYS1wYWNpZmljL25ld3NpZF80MjQwMDAvNDI0NzY0LnN0bSI+CiAjIGh0dHA6Ly9uZXdzLmJiYy5jby51ay9oaS9lbmdsaXNoL3dvcmxkL2FzaWEtcGFjaWZpYy9uZXdzaWRfNDI0MDAwLzQyNDc2NC5zdG0KLSMgPC9hPgogIwogIyBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byBmaW5kIGV4YWN0IGRhdGVzIGZvciB0aGUgdHJhbnNpdGlvbiBpbiBOb3ZlbWJlcgogIyB5ZXQuIEJ5IHJlYWRpbmcgdGhpcyBhcnRpY2xlIGl0IHNlZW1zIGxpa2UgRmlqaSB3aWxsIGJlIDE0IGhvdXJzIGFoZWFkCkBAIC0xNzExLDkgKzE2NTUsNyBAQAogIyAoMTIgKyAxIGhvdXIgRFNUKS4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5OS0wOS0yMCk6Ci0jIEFjY29yZGluZyB0byA8YSBocmVmPSJodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL3NlcHQxNzk5Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL3NlcHQxNzk5Lmh0bWwKLSMgPC9hPjoKKyMgQWNjb3JkaW5nIHRvIDxodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL3NlcHQxNzk5Lmh0bWw+OgogIyAiRGF5bGlnaHQgU2F2aW5ncyBUaW1lIHdpbGwgdGFrZSBlZmZlY3Qgb24gT2N0LiAyIHRocm91Z2ggQXByaWwgMTUsIDIwMDAKICMgYW5kIGFubnVhbGx5IHRoZXJlYWZ0ZXIgZnJvbSB0aGUgZmlyc3QgU2F0dXJkYXkgaW4gT2N0b2JlciB0aHJvdWdoIHRoZQogIyB0aGlyZCBTYXR1cmRheSBvZiBBcHJpbC4gIFVuZGVyIHRoZSBzeXN0ZW0gYXBwcm92ZWQgYnkgUHJpdnkgQ291bmNpbCBvbgpAQCAtMTczMSw3ICsxNjczLDcgQEAKICMgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0ZWQgZGF0ZSBBcHJpbCAxNi4gVW5mb3J0dW5hdGVseSwgdGhlIGFydGljbGUKICMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBvbiB0aGUgc2l0ZSwgYW5kIEkgZGlkIG5vdCBtYWtlIGEgY29weSBvZiB0aGUKICMgdGV4dCwgYW5kIEkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcmVwb3J0IGl0IGhlcmUuCi0jIChPcmlnaW5hbCBVUkwgd2FzOiBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL21hcmNoMTYyMDAwLmh0bSApCisjIChPcmlnaW5hbCBVUkwgd2FzIDxodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL21hcmNoMTYyMDAwLmh0bT4pCiAKICMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMC0xMi0wMSk6CiAjIFRvbmdhIGlzIG9ic2VydmluZyBEU1QgYXMgb2YgMjAwMC0xMS0wNCBhbmQgd2lsbCBzdG9wIG9uIDIwMDEtMDEtMjcuCkBAIC0xNzUxLDcgKzE2OTMsNyBAQAogIyBGcm9tIFZlcm5pY2UgQW5kZXJzb24sIFBlcnNvbmFsIFNlY3JldGFyeSB0byBQaGlsaXAgSmVzc3VwLAogIyBVUyBBbWJhc3NhZG9yIEF0IExhcmdlIChvcmFsIGhpc3RvcnkgaW50ZXJ2aWV3LCAxOTcxLTAyLTAyKToKICMKLSMgU2F0dXJkYXksIHRoZSAxNHRoIFtvZiBPY3RvYmVyLCAxOTUwXSAtLSAuLi4gIFRoZSB0aW1lIHdhcyBhbGwgdGhlCisjIFNhdHVyZGF5LCB0aGUgMTR0aCBbb2YgT2N0b2JlciwgMTk1MF0gLSAuLi4gIFRoZSB0aW1lIHdhcyBhbGwgdGhlCiAjIG1vcmUgY29uZnVzaW5nIGF0IHRoYXQgcG9pbnQsIGJlY2F1c2Ugd2UgaGFkIGNyb3NzZWQgdGhlCiAjIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lLCB0aHVzIGdldHRpbmcgdHdvIFN1bmRheXMuICBGdXJ0aGVybW9yZSwgd2UKICMgZGlzY292ZXJlZCB0aGF0IFdha2UgSXNsYW5kIGhhZCB0d28gaG91cnMgb2YgZGF5bGlnaHQgc2F2aW5nIHRpbWUKQEAgLTE3OTYsNyArMTczOCw3IEBACiAjIG9uIHRoZSBoaWdoIHNlYXMuICBXaGVuZXZlciBhIHNoaXAgd2FzIHdpdGhpbiB0aGUgdGVycml0b3JpYWwgd2F0ZXJzIG9mIGFueQogIyBuYXRpb24gaXQgd291bGQgdXNlIHRoYXQgbmF0aW9uJ3Mgc3RhbmRhcmQgdGltZS4gIFRoZSBjYXB0YWluIHdhcyBwZXJtaXR0ZWQKICMgdG8gY2hhbmdlIGhpcyBzaGlwJ3MgY2xvY2tzIGF0IGEgdGltZSBvZiBoaXMgY2hvaWNlIGZvbGxvd2luZyBoaXMgc2hpcCdzCi0jIGVudHJ5IGludG8gYW5vdGhlciB6b25lIHRpbWUtLWhlIG9mdGVuIGNob3NlIG1pZG5pZ2h0LiAgVGhlc2Ugem9uZXMgd2VyZQorIyBlbnRyeSBpbnRvIGFub3RoZXIgem9uZSB0aW1lIC0gaGUgb2Z0ZW4gY2hvc2UgbWlkbmlnaHQuICBUaGVzZSB6b25lcyB3ZXJlCiAjIGFkb3B0ZWQgYnkgYWxsIG1ham9yIGZsZWV0cyBiZXR3ZWVuIDE5MjAgYW5kIDE5MjUgYnV0IG5vdCBieSBtYW55CiAjIGluZGVwZW5kZW50IG1lcmNoYW50IHNoaXBzIHVudGlsIFdvcmxkIFdhciBJSS4KIApAQCAtMTgwNCw2ICsxNzQ2LDYgQEAKICMgKDIwMDUtMDMtMjApOgogIwogIyBUaGUgQW1lcmljYW4gUHJhY3RpY2FsIE5hdmlnYXRvciAoMjAwMikKLSMgPGh0dHA6Ly9wb2xsdXgubnNzLm5pbWEubWlsL3B1YnMvcHVic19qX2Fwbl9zZWN0aW9ucy5odG1sP3JpZD0xODc+CisjIGh0dHA6Ly9wb2xsdXgubnNzLm5pbWEubWlsL3B1YnMvcHVic19qX2Fwbl9zZWN0aW9ucy5odG1sP3JpZD0xODcKICMgdGFsa3Mgb25seSBhYm91dCB0aGUgMTgwLWRlZ3JlZSBtZXJpZGlhbiB3aXRoIHJlc3BlY3QgdG8gc2hpcHMgaW4KICMgaW50ZXJuYXRpb25hbCB3YXRlcnM7IGl0IGlnbm9yZXMgdGhlIGludGVybmF0aW9uYWwgZGF0ZSBsaW5lLgpkaWZmIC0tZ2l0IGEvbWFrZS9kYXRhL3R6ZGF0YS9iYWNrd2FyZCBiL21ha2UvZGF0YS90emRhdGEvYmFja3dhcmQKaW5kZXggNWFmZTlhMy4uYmEwMTJmNCAxMDA2NDQKLS0tIGEvbWFrZS9kYXRhL3R6ZGF0YS9iYWNrd2FyZAorKysgYi9tYWtlL2RhdGEvdHpkYXRhL2JhY2t3YXJkCkBAIC0yMSwxNSArMjEsMTUgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCiAjIFRoaXMgZmlsZSBwcm92aWRlcyBsaW5rcyBiZXR3ZWVuIGN1cnJlbnQgbmFtZXMgZm9yIHRpbWUgem9uZXMKICMgYW5kIHRoZWlyIG9sZCBuYW1lcy4gIE1hbnkgbmFtZXMgY2hhbmdlZCBpbiBsYXRlIDE5OTMuCiAKKyMgTGluawlUQVJHRVQJCQlMSU5LLU5BTUUKIExpbmsJQWZyaWNhL0FzbWFyYQkJQWZyaWNhL0FzbWVyYQotTGluawlBZnJpY2EvQmFtYWtvCQlBZnJpY2EvVGltYnVrdHUKK0xpbmsJQWZyaWNhL0FiaWRqYW4JCUFmcmljYS9UaW1idWt0dQogTGluawlBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EJQW1lcmljYS9BcmdlbnRpbmEvQ29tb2RSaXZhZGF2aWEKIExpbmsJQW1lcmljYS9BZGFrCQlBbWVyaWNhL0F0a2EKIExpbmsJQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzCUFtZXJpY2EvQnVlbm9zX0FpcmVzCkBAIC01MCw4ICs1MCwxMSBAQAogTGluawlQYWNpZmljL0F1Y2tsYW5kCUFudGFyY3RpY2EvU291dGhfUG9sZQogTGluawlBc2lhL0FzaGdhYmF0CQlBc2lhL0FzaGtoYWJhZAogTGluawlBc2lhL0tvbGthdGEJCUFzaWEvQ2FsY3V0dGEKLUxpbmsJQXNpYS9DaG9uZ3FpbmcJCUFzaWEvQ2h1bmdraW5nCitMaW5rCUFzaWEvU2hhbmdoYWkJCUFzaWEvQ2hvbmdxaW5nCitMaW5rCUFzaWEvU2hhbmdoYWkJCUFzaWEvQ2h1bmdraW5nCiBMaW5rCUFzaWEvRGhha2EJCUFzaWEvRGFjY2EKK0xpbmsJQXNpYS9TaGFuZ2hhaQkJQXNpYS9IYXJiaW4KK0xpbmsJQXNpYS9VcnVtcWkJCUFzaWEvS2FzaGdhcgogTGluawlBc2lhL0thdGhtYW5kdQkJQXNpYS9LYXRtYW5kdQogTGluawlBc2lhL01hY2F1CQlBc2lhL01hY2FvCiBMaW5rCUFzaWEvSG9fQ2hpX01pbmgJQXNpYS9TYWlnb24KZGlmZiAtLWdpdCBhL21ha2UvZGF0YS90emRhdGEvZXRjZXRlcmEgYi9tYWtlL2RhdGEvdHpkYXRhL2V0Y2V0ZXJhCmluZGV4IGViYWE1ZmQuLmQyZmI5MWMgMTAwNjQ0Ci0tLSBhL21ha2UvZGF0YS90emRhdGEvZXRjZXRlcmEKKysrIGIvbWFrZS9kYXRhL3R6ZGF0YS9ldGNldGVyYQpAQCAtMjEsNyArMjEsNiBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKQEAgLTM3LDcgKzM2LDcgQEAKIFpvbmUJRXRjL1VDVAkJMAktCVVDVAogCiAjIFRoZSBmb2xsb3dpbmcgbGluayB1c2VzIG9sZGVyIG5hbWluZyBjb252ZW50aW9ucywKLSMgYnV0IGl0IGJlbG9uZ3MgaGVyZSwgbm90IGluIHRoZSBmaWxlIGBiYWNrd2FyZCcsCisjIGJ1dCBpdCBiZWxvbmdzIGhlcmUsIG5vdCBpbiB0aGUgZmlsZSAnYmFja3dhcmQnLAogIyBhcyBmdW5jdGlvbnMgbGlrZSBnbXRpbWUgbG9hZCB0aGUgIkdNVCIgZmlsZSB0byBoYW5kbGUgbGVhcCBzZWNvbmRzIHByb3Blcmx5LgogIyBXZSB3YW50IHRoaXMgdG8gd29yayBldmVuIG9uIGluc3RhbGxhdGlvbnMgdGhhdCBvbWl0IHRoZSBvdGhlciBvbGRlciBuYW1lcy4KIExpbmsJRXRjL0dNVAkJCQlHTVQKZGlmZiAtLWdpdCBhL21ha2UvZGF0YS90emRhdGEvZXVyb3BlIGIvbWFrZS9kYXRhL3R6ZGF0YS9ldXJvcGUKaW5kZXggMjI2YzM5My4uMGM1ZjU2NiAxMDA2NDQKLS0tIGEvbWFrZS9kYXRhL3R6ZGF0YS9ldXJvcGUKKysrIGIvbWFrZS9kYXRhL3R6ZGF0YS9ldXJvcGUKQEAgLTIxLDE1ICsyMSwxNSBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIFRoaXMgZmlsZSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAogIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KKyMgdHpAaWFuYS5vcmcgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLiAgRm9yIG1vcmUsIHBsZWFzZSBzZWUKKyMgdGhlIGZpbGUgQ09OVFJJQlVUSU5HIGluIHRoZSB0eiBkaXN0cmlidXRpb24uCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDUtMzEpOgogIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKICMgVGhvbWFzIEcuIFNoYW5rcyBhbmQgUmlxdWUgUG90dGVuZ2VyLCBUaGUgSW50ZXJuYXRpb25hbCBBdGxhcyAoNnRoIGVkaXRpb24pLAogIyBTYW4gRGllZ286IEFDUyBQdWJsaWNhdGlvbnMsIEluYy4gKDIwMDMpLgpAQCAtNDAsNiArNDAsOSBAQAogIyBwdWJsaXNoZWQgc2VtaWFubnVhbGx5LiAgTGF3IHNlbnQgaW4gc2V2ZXJhbCBoZWxwZnVsIHN1bW1hcmllcwogIyBvZiB0aGUgSUFUQSdzIGRhdGEgYWZ0ZXIgMTk5MC4KICMKKyMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzIGlzCisjIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgorIwogIyBFeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkLCBTaGFua3MgJiBQb3R0ZW5nZXIgaXMgdGhlIHNvdXJjZSBmb3IKICMgZW50cmllcyB0aHJvdWdoIDE5OTEsIGFuZCBJQVRBIFNTSU0gaXMgdGhlIHNvdXJjZSBmb3IgZW50cmllcyBhZnRlcndhcmRzLgogIwpAQCAtNDksOSArNTIsOSBAQAogIwlXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLAogIwl3aGljaCBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCiAjCi0jCTxhIGhyZWY9Imh0dHA6Ly93d3cucGV0dHN3b29kdmlsbGFnZS5jby51ay9EYXlsaWdodF9TYXZpbmdzX1dpbGxpYW1fV2lsbGV0dC5wZGYiPgogIwlXaWxsaWFtIFdpbGxldHQsIFRoZSBXYXN0ZSBvZiBEYXlsaWdodCwgMTl0aCBlZGl0aW9uCi0jCTwvYT4gKDE5MTQtMDMpCisjCTxodHRwOi8vY3MudWNsYS5lZHUvfmVnZ2VydC9UaGUtV2FzdGUtb2YtRGF5bGlnaHQtMTl0aC5wZGY+CisjCVtQREZdICgxOTE0LTAzKQogIwogIwlNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQKICMJPGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5Pi4gIEhlIHdyaXRlczoKQEAgLTU5LDEwICs2MiwyMCBAQAogIwltYXkgYmUgc2VudCB0byBNci4gSm9obiBNaWxuZSwgUm95YWwgR2VvZ3JhcGhpY2FsIFNvY2lldHksCiAjCVNhdmlsZSBSb3csIExvbmRvbi4iICBOb3dhZGF5cyBwbGVhc2UgZW1haWwgdGhlbSB0byB0ekBpYW5hLm9yZy4KICMKLSMJQnJhemlsJ3MgRGVwYXJ0YW1lbnRvIFNlcnZpY28gZGEgSG9yYSAoRFNIKSwKLSMJPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSElTVEhWLmh0bSI+CisjCUJ5YWxva296IEVMLiBOZXcgQ291bnRpbmcgb2YgVGltZSBpbiBSdXNzaWEgc2luY2UgSnVseSAxLCAxOTE5LgorIwlUaGlzIFJ1c3NpYW4tbGFuZ3VhZ2Ugc291cmNlIHdhcyBjb25zdWx0ZWQgYnkgVmxhZGltaXIgS2FycGluc2t5OyBzZWUKKyMJaHR0cDovL21tLmljYW5uLm9yZy9waXBlcm1haWwvdHovMjAxNC1BdWd1c3QvMDIxMzIwLmh0bWwKKyMJVGhlIGZ1bGwgUnVzc2lhbiBjaXRhdGlvbiBpczoKKyMJ0JHRj9C70L7QutC+0LcsINCV0LLQs9C10L3QuNC5INCb0Y7QtNCy0LjQs9C+0LLQuNGHLiDQndC+0LLRi9C5INGB0YfQtdGCINCy0YDQtdC80LXQvdC4INCyINGC0LXRh9C10L3QuNC4INGB0YPRgtC+0LoKKyMJ0LLQstC10LTQtdC90L3Ri9C5INC00LXQutGA0LXRgtC+0Lwg0KHQvtCy0LXRgtCwINC90LDRgNC+0LTQvdGL0YUg0LrQvtC80LjRgdGB0LDRgNC+0LIg0LTQu9GPINCy0YHQtdC5INCg0L7RgdGB0LjQuCDRgSAxLdCz0L4KKyMJ0LjRjtC70Y8gMTkxOSDQsy4gLyDQmNC30LQuIDIt0LUg0JzQtdC20LTRg9Cy0LXQtNC+0LzRgdGC0LLQtdC90L3QvtC5INC60L7QvNC40YHRgdC40LguIC0g0J/QtdGC0YDQvtCz0YDQsNC0OgorIwnQlNC10YHRj9GC0LDRjyDQs9C+0YEuINGC0LjQvy4sIDE5MTkuCisjCWh0dHA6Ly9yZXNvbHZlci5ncG50Yi5ydS9wdXJsP2RvY3VzaGFyZS9kc3dlYi9HZXQvUmVzb3VyY2UtMjAxMS9CeWFsb2tvel9fRS5MLl9fTm92eXlfX3NjaGV0X192cmVtZW5pX192X190ZWNoZW5pZV9fc3V0b2tfX2l6ZF9fMigxKS5wZGYKKyMKKyMJQnJhemlsJ3MgRGl2aXPDo28gU2VydmnDp28gZGEgSG9yYSAoRFNITyksCiAjCUhpc3Rvcnkgb2YgU3VtbWVyIFRpbWUKLSMJPC9hPiAoMTk5OC0wOS0yMSwgaW4gUG9ydHVndWVzZSkKKyMJPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hJU1RIVi5odG0+CisjCSgxOTk4LTA5LTIxLCBpbiBQb3J0dWd1ZXNlKQogCiAjCiAjIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkICcqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOwpAQCAtODEsMTAgKzk0LDggQEAKICMgICAgICAgIDE6MDAgICAgICAgQ0VUIENFU1QgQ0VNVCBDZW50cmFsIEV1cm9wZQogIyAgICAgICAgMTowMDoxNCAgICBTRVQgICAgICAgICAgIFN3ZWRpc2ggKDE4NzktMTg5OSkqCiAjICAgICAgICAyOjAwICAgICAgIEVFVCBFRVNUICAgICAgRWFzdGVybiBFdXJvcGUKLSMgICAgICAgIDM6MDAgICAgICAgTVNLIE1TRCAgICAgICBNb3Njb3cKLSMKLSMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzLCBlc3BlY2lhbGx5IGluIEJyaXRhaW4sCi0jIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgorIyAgICAgICAgMzowMCAgICAgICBGRVQgICAgICAgICAgIEZ1cnRoZXItZWFzdGVybiBFdXJvcGUqCisjICAgICAgICAzOjAwICAgICAgIE1TSyBNU0QgIE1TTSogTW9zY293CiAKICMgRnJvbSBQZXRlciBJbGlldmUgKDE5OTQtMTItMDQpLAogIyBUaGUgb3JpZ2luYWwgc2l4IFtFVSBtZW1iZXJzXTogQmVsZ2l1bSwgRnJhbmNlLCAoV2VzdCkgR2VybWFueSwgSXRhbHksCkBAIC0xMjgsNyArMTM5LDcgQEAKICMgYWxvbmcgdGhlIHRvd3BhdGggd2l0aGluIGEgZmV3IHlhcmRzIG9mIGl0LicKICMKICMgSSBoYXZlIGEgb25lIGluY2ggdG8gb25lIG1pbGUgbWFwIG9mIExvbmRvbiBhbmQgbXkgZXN0aW1hdGUgb2YgdGhlIHN0b25lJ3MKLSMgcG9zaXRpb24gaXMgNTEgZGVnLiAyOCcgMzAiIE4sIDAgZGVnLiAxOCcgNDUiIFcuIFRoZSBsb25naXR1ZGUgc2hvdWxkCisjIHBvc2l0aW9uIGlzIDUxIGRlZ3JlZXMgMjgnIDMwIiBOLCAwIGRlZ3JlZXMgMTgnIDQ1IiBXLiBUaGUgbG9uZ2l0dWRlIHNob3VsZAogIyBiZSB3aXRoaW4gYWJvdXQgKy0yIi4gVGhlIE9yZG5hbmNlIFN1cnZleSBncmlkIHJlZmVyZW5jZSBpcyBUUTE3Mjc2MS4KICMKICMgW1RoaXMgeWllbGRzIEdNVE9GRiA9IC0wOjAxOjE1IGZvciBMb25kb24gTE1UIGluIHRoZSAxOHRoIGNlbnR1cnkuXQpAQCAtMTYwLDggKzE3MSwyMiBAQAogIyB0cmFuc2l0aW9uIGRhdGUgZm9yIExvbmRvbiwgbmFtZWx5IDE4NDctMTItMDEuICBXZSBkb24ndCBrbm93IGFzIG11Y2gKICMgYWJvdXQgRHVibGluLCBzbyB3ZSB1c2UgMTg4MC0wOC0wMiwgdGhlIGxlZ2FsIHRyYW5zaXRpb24gdGltZS4KIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTA5LTI3KToKLSMgU3VtbWVyIFRpbWUgd2FzIGZpcnN0IHNlcmlvdXNseSBwcm9wb3NlZCBieSBXaWxsaWFtIFdpbGxldHQgKDE4NTctMTkxNSksCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMTkpOgorIyBUaGUgYW5jaWVudHMgaGFkIG5vIG5lZWQgZm9yIGRheWxpZ2h0IHNhdmluZywgYXMgdGhleSBrZXB0IHRpbWUKKyMgaW5mb3JtYWxseSBvciB2aWEgaG91cnMgd2hvc2UgbGVuZ3RoIGRlcGVuZGVkIG9uIHRoZSB0aW1lIG9mIHllYXIuCisjIERheWxpZ2h0IHNhdmluZyB0aW1lIGluIGl0cyBtb2Rlcm4gc2Vuc2Ugd2FzIGludmVudGVkIGJ5IHRoZQorIyBOZXcgWmVhbGFuZCBlbnRvbW9sb2dpc3QgR2VvcmdlIFZlcm5vbiBIdWRzb24gKDE4NjctMTk0NiksCisjIHdob3NlIGRheSBqb2IgYXMgYSBwb3N0YWwgY2xlcmsgbGVkIGhpbSB0byB2YWx1ZQorIyBhZnRlci1ob3VycyBkYXlsaWdodCBpbiB3aGljaCB0byBwdXJzdWUgaGlzIHJlc2VhcmNoLgorIyBJbiAxODk1IGhlIHByZXNlbnRlZCBhIHBhcGVyIHRvIHRoZSBXZWxsaW5ndG9uIFBoaWxvc29waGljYWwgU29jaWV0eQorIyB0aGF0IHByb3Bvc2VkIGEgdHdvLWhvdXIgZGF5bGlnaHQtc2F2aW5nIHNoaWZ0LiAgU2VlOgorIyBIdWRzb24gR1YuIE9uIHNlYXNvbmFsIHRpbWUtYWRqdXN0bWVudCBpbiBjb3VudHJpZXMgc291dGggb2YgbGF0LiAzMCBkZWcuCisjIFRyYW5zYWN0aW9ucyBhbmQgUHJvY2VlZGluZ3Mgb2YgdGhlIE5ldyBaZWFsYW5kIEluc3RpdHV0ZS4gMTg5NTsyODo3MzQKKyMgaHR0cDovL3JzbnoubmF0bGliLmdvdnQubnovdm9sdW1lL3JzbnpfMjgvcnNuel8yOF8wMF8wMDYxMTAuaHRtbAorIyBBbHRob3VnaCBzb21lIGludGVyZXN0IHdhcyBleHByZXNzZWQgaW4gTmV3IFplYWxhbmQsIGhpcyBwcm9wb3NhbAorIyBkaWQgbm90IGZpbmQgaXRzIHdheSBpbnRvIGxhdyBhbmQgZXZlbnR1YWxseSBpdCB3YXMgYWxtb3N0IGZvcmdvdHRlbi4KKyMKKyMgSW4gRW5nbGFuZCwgRFNUIHdhcyBpbmRlcGVuZGVudGx5IHJlaW52ZW50ZWQgYnkgV2lsbGlhbSBXaWxsZXR0ICgxODU3LTE5MTUpLAogIyBhIExvbmRvbiBidWlsZGVyIGFuZCBtZW1iZXIgb2YgdGhlIFJveWFsIEFzdHJvbm9taWNhbCBTb2NpZXR5CiAjIHdobyBjaXJjdWxhdGVkIGEgcGFtcGhsZXQgIlRoZSBXYXN0ZSBvZiBEYXlsaWdodCIgKDE5MDcpCiAjIHRoYXQgcHJvcG9zZWQgYWR2YW5jaW5nIGNsb2NrcyAyMCBtaW51dGVzIG9uIGVhY2ggb2YgZm91ciBTdW5kYXlzIGluIEFwcmlsLApAQCAtMTc0LDcgKzE5OSw3IEBACiAjIEEgbW9udW1lbnQgdG8gV2lsbGV0dCB3YXMgdW52ZWlsZWQgb24gMTkyNy0wNS0yMSwgaW4gYW4gb3BlbiBzcGFjZSBpbgogIyBhIDQ1LWFjcmUgd29vZCBuZWFyIENoaXNsZWh1cnN0LCBLZW50IHRoYXQgd2FzIHB1cmNoYXNlZCBieSBwb3B1bGFyCiAjIHN1YnNjcmlwdGlvbiBhbmQgb3BlbiB0byB0aGUgcHVibGljLiAgT24gdGhlIHNvdXRoIGZhY2Ugb2YgdGhlIG1vbm9saXRoLAotIyBkZXNpZ25lZCBieSBHLiBXLiBNaWxsZXIsIGlzIHRoZS4uLldpbGxpYW0gV2lsbGV0dCBNZW1vcmlhbCBTdW5kaWFsLAorIyBkZXNpZ25lZCBieSBHLiBXLiBNaWxsZXIsIGlzIHRoZSBXaWxsaWFtIFdpbGxldHQgTWVtb3JpYWwgU3VuZGlhbCwKICMgd2hpY2ggaXMgcGVybWFuZW50bHkgc2V0IHRvIFN1bW1lciBUaW1lLgogCiAjIEZyb20gV2luc3RvbiBDaHVyY2hpbGwgKDE5MzQtMDQtMjgpOgpAQCAtMTgzLDkgKzIwOCw5IEBACiAjIGJldHdlZW4gMTYwIGFuZCAxNzAgaG91cnMgbW9yZSBkYXlsaWdodCBsZWlzdXJlLCB0byBhIHdhciB3aGljaAogIyBwbHVuZ2VkIEV1cm9wZSBpbnRvIGRhcmtuZXNzIGZvciBmb3VyIHllYXJzLCBhbmQgc2hvb2sgdGhlCiAjIGZvdW5kYXRpb25zIG9mIGNpdmlsaXphdGlvbiB0aHJvdWdob3V0IHRoZSB3b3JsZC4KLSMJLS0gPGEgaHJlZj0iaHR0cDovL3d3dy53aW5zdG9uY2h1cmNoaWxsLm9yZy9maDExNHdpbGxldHQuaHRtIj4KLSMJIkEgU2lsZW50IFRvYXN0IHRvIFdpbGxpYW0gV2lsbGV0dCIsIFBpY3RvcmlhbCBXZWVrbHkKLSMJPC9hPgorIwktLSAiQSBTaWxlbnQgVG9hc3QgdG8gV2lsbGlhbSBXaWxsZXR0IiwgUGljdG9yaWFsIFdlZWtseTsKKyMJcmVwdWJsaXNoZWQgaW4gRmluZXN0IEhvdXIgKFNwcmluZyAyMDAyKSAxKDExNCk6MjYKKyMJaHR0cDovL3d3dy53aW5zdG9uY2h1cmNoaWxsLm9yZy9pbWFnZXMvZmluZXN0aG91ci9Wb2wuMDElMjBOby4xMTQucGRmCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wOS0wMyk6CiAjIFRoZSBPRUQgU3VwcGxlbWVudCBzYXlzIHRoYXQgdGhlIEVuZ2xpc2ggb3JpZ2luYWxseSBzYWlkICJEYXlsaWdodCBTYXZpbmciCkBAIC0xOTQsNyArMjE5LDYgQEAKICMgcHJvcG9uZW50cyAod2hvIGV2ZW50dWFsbHkgd29uIHRoZSBhcmd1bWVudCkgYXJlIHF1b3RlZCBhcyB1c2luZyAiU3VtbWVyIi4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk4OS0wMS0xOSk6Ci0jCiAjIEEgc291cmNlIGF0IHRoZSBCcml0aXNoIEluZm9ybWF0aW9uIE9mZmljZSBpbiBOZXcgWW9yayBhdmVycyB0aGF0IGl0J3MKICMga25vd24gYXMgIkJyaXRpc2giIFN1bW1lciBUaW1lIGluIGFsbCBwYXJ0cyBvZiB0aGUgVW5pdGVkIEtpbmdkb20uCiAKQEAgLTIyMSw4ICsyNDUsOCBAQAogIyBvZmZpY2lhbCBkZXNpZ25hdGlvbjsgdGhlIHJlcGx5IG9mIHRoZSAyMXN0IHdhcyB0aGF0IHRoZXJlIHdhc24ndAogIyBidXQgaGUgY291bGRuJ3QgdGhpbmsgb2YgYW55dGhpbmcgYmV0dGVyIHRoYW4gdGhlICJEb3VibGUgQnJpdGlzaAogIyBTdW1tZXIgVGltZSIgdGhhdCB0aGUgQkJDIGhhZCBiZWVuIHVzaW5nIGluZm9ybWFsbHkuCi0jIGh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvYmJjLTE5NDEwNDE4LnBuZwotIyBodHRwOi8vc3R1ZGVudC5jdXN1LmNhbS5hYy51ay9+anNtMjgvYnJpdGlzaC10aW1lL2hvLTE5NDEwNDIxLnBuZworIyBodHRwOi8vd3d3LnBvbHlvbWluby5vcmcudWsvYnJpdGlzaC10aW1lL2JiYy0xOTQxMDQxOC5wbmcKKyMgaHR0cDovL3d3dy5wb2x5b21pbm8ub3JnLnVrL2JyaXRpc2gtdGltZS9oby0xOTQxMDQyMS5wbmcKIAogIyBGcm9tIFNpciBBbGV4YW5kZXIgTWF4d2VsbCBpbiB0aGUgYWJvdmUtbWVudGlvbmVkIGxldHRlciAoMTk0MS0wNC0yMSk6CiAjIFtOXW8gb2ZmaWNpYWwgZGVzaWduYXRpb24gaGFzIGFzIGZhciBhcyBJIGtub3cgYmVlbiBhZG9wdGVkIGZvciB0aGUgdGltZQpAQCAtMjM5LDIzICsyNjMsMTQgQEAKICMgdGhlIGhpc3Rvcnkgb2Ygc3VtbWVyIHRpbWUgbGVnaXNsYXRpb24gaW4gdGhlIFVuaXRlZCBLaW5nZG9tLgogIyBTaW5jZSAxOTk4IEpvc2VwaCBTLiBNeWVycyBoYXMgYmVlbiB1cGRhdGluZwogIyBhbmQgZXh0ZW5kaW5nIHRoaXMgbGlzdCwgd2hpY2ggY2FuIGJlIGZvdW5kIGluCi0jIGh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucG9seW9taW5vLm9yZy51ay9icml0aXNoLXRpbWUvIj4KLSMgSGlzdG9yeSBvZiBsZWdhbCB0aW1lIGluIEJyaXRhaW4KLSMgPC9hPgotIyBSb2IgQ3Jvd3RoZXIgKDIwMTItMDEtMDQpIHJlcG9ydHMgdGhhdCB0aGF0IFVSTCBubyBsb25nZXIKLSMgZXhpc3RzLCBhbmQgdGhlIGFydGljbGUgY2FuIG5vdyBiZSBmb3VuZCBhdDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wb2x5b21pbm8ub3JnLnVrL2JyaXRpc2gtdGltZS8iPgogIyBodHRwOi8vd3d3LnBvbHlvbWluby5vcmcudWsvYnJpdGlzaC10aW1lLwotIyA8L2E+CiAKICMgRnJvbSBKb3NlcGggUy4gTXllcnMgKDE5OTgtMDEtMDYpOgogIwogIyBUaGUgbGVnYWwgdGltZSBpbiB0aGUgVUsgb3V0c2lkZSBvZiBzdW1tZXIgdGltZSBpcyBkZWZpbml0ZWx5IEdNVCwgbm90IFVUQzsKICMgc2VlIExvcmQgVGFubGF3J3Mgc3BlZWNoCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucGFybGlhbWVudC50aGUtc3RhdGlvbmVyeS1vZmZpY2UuY28udWsvcGEvbGQxOTk2OTcvbGRoYW5zcmQvcGR2bi9sZHM5Ny90ZXh0LzcwNjExLTIwLmh0bSM3MDYxMS0yMF9oZWFkMCI+Ci0jIChMb3JkcyBIYW5zYXJkIDExIEp1bmUgMTk5NyBjb2x1bW5zIDk2NCB0byA5NzYpCi0jIDwvYT4uCisjIGh0dHA6Ly93d3cucHVibGljYXRpb25zLnBhcmxpYW1lbnQudWsvcGEvbGQxOTk3OTgvbGRoYW5zcmQvdm85NzA2MTEvdGV4dC83MDYxMS0xMC5odG0jNzA2MTEtMTBfaGVhZDAKKyMgKExvcmRzIEhhbnNhcmQgMTEgSnVuZSAxOTk3IGNvbHVtbnMgOTY0IHRvIDk3NikuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CiAjCkBAIC0yOTUsOCArMzEwLDggQEAKICMgICAtLSBKYW1lcyBKb3ljZSwgVWx5c3NlcwogCiAjIEZyb20gSm9zZXBoIFMuIE15ZXJzICgyMDA1LTAxLTI2KToKLSMgSXJpc2ggbGF3cyBhcmUgYXZhaWxhYmxlIG9ubGluZSBhdCB3d3cuaXJpc2hzdGF0dXRlYm9vay5pZS4gIFRoZXNlIGluY2x1ZGUKLSMgdmFyaW91cyByZWxhdGluZyB0byBsZWdhbCB0aW1lLCBmb3IgZXhhbXBsZToKKyMgSXJpc2ggbGF3cyBhcmUgYXZhaWxhYmxlIG9ubGluZSBhdCA8aHR0cDovL3d3dy5pcmlzaHN0YXR1dGVib29rLmllPi4KKyMgVGhlc2UgaW5jbHVkZSB2YXJpb3VzIHJlbGF0aW5nIHRvIGxlZ2FsIHRpbWUsIGZvciBleGFtcGxlOgogIwogIyBaWkExM1kxOTIzLmh0bWwgWlpBMTJZMTkyNC5odG1sIFpaQThZMTkyNS5odG1sIFpaU0lWMjBQRzEyNjcuaHRtbAogIwpAQCAtNDU4LDI1ICs0NzMsMjcgQEAKICMgVXNlIEV1cm9wZS9Mb25kb24gZm9yIEplcnNleSwgR3Vlcm5zZXksIGFuZCB0aGUgSXNsZSBvZiBNYW4uCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0xvbmRvbgktMDowMToxNSAtCUxNVAkxODQ3IERlYyAgMSAwOjAwcworWm9uZQlFdXJvcGUvTG9uZG9uCS0wOjAxOjE1IC0JTE1UCTE4NDcgRGVjICAxICAwOjAwcwogCQkJIDA6MDAJR0ItRWlyZQklcwkxOTY4IE9jdCAyNwotCQkJIDE6MDAJLQlCU1QJMTk3MSBPY3QgMzEgMjowMHUKKwkJCSAxOjAwCS0JQlNUCTE5NzEgT2N0IDMxICAyOjAwdQogCQkJIDA6MDAJR0ItRWlyZQklcwkxOTk2CiAJCQkgMDowMAlFVQlHTVQvQlNUCiBMaW5rCUV1cm9wZS9Mb25kb24JRXVyb3BlL0plcnNleQogTGluawlFdXJvcGUvTG9uZG9uCUV1cm9wZS9HdWVybnNleQogTGluawlFdXJvcGUvTG9uZG9uCUV1cm9wZS9Jc2xlX29mX01hbgorCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9EdWJsaW4JLTA6MjU6MDAgLQlMTVQJMTg4MCBBdWcgIDIKLQkJCS0wOjI1OjIxIC0JRE1UCTE5MTYgTWF5IDIxIDI6MDAKLQkJCS0wOjI1OjIxIDE6MDAJSVNUCTE5MTYgT2N0ICAxIDI6MDBzCisJCQktMDoyNToyMSAtCURNVAkxOTE2IE1heSAyMSAgMjowMAorCQkJLTA6MjU6MjEgMTowMAlJU1QJMTkxNiBPY3QgIDEgIDI6MDBzCiAJCQkgMDowMAlHQi1FaXJlCSVzCTE5MjEgRGVjICA2ICMgaW5kZXBlbmRlbmNlCi0JCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk0MCBGZWIgMjUgMjowMAotCQkJIDA6MDAJMTowMAlJU1QJMTk0NiBPY3QgIDYgMjowMAotCQkJIDA6MDAJLQlHTVQJMTk0NyBNYXIgMTYgMjowMAotCQkJIDA6MDAJMTowMAlJU1QJMTk0NyBOb3YgIDIgMjowMAotCQkJIDA6MDAJLQlHTVQJMTk0OCBBcHIgMTggMjowMAorCQkJIDA6MDAJR0ItRWlyZQlHTVQvSVNUCTE5NDAgRmViIDI1ICAyOjAwCisJCQkgMDowMAkxOjAwCUlTVAkxOTQ2IE9jdCAgNiAgMjowMAorCQkJIDA6MDAJLQlHTVQJMTk0NyBNYXIgMTYgIDI6MDAKKwkJCSAwOjAwCTE6MDAJSVNUCTE5NDcgTm92ICAyICAyOjAwCisJCQkgMDowMAktCUdNVAkxOTQ4IEFwciAxOCAgMjowMAogCQkJIDA6MDAJR0ItRWlyZQlHTVQvSVNUCTE5NjggT2N0IDI3Ci0JCQkgMTowMAktCUlTVAkxOTcxIE9jdCAzMSAyOjAwdQorCQkJIDE6MDAJLQlJU1QJMTk3MSBPY3QgMzEgIDI6MDB1CiAJCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk5NgogCQkJIDA6MDAJRVUJR01UL0lTVAogCkBAIC00OTUsMTAgKzUxMiw5IEBACiBSdWxlCUVVCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDE6MDB1CTE6MDAJUwogUnVsZQlFVQkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAxOjAwdQkwCS0KICMgVGhlIG1vc3QgcmVjZW50IGRpcmVjdGl2ZSBjb3ZlcnMgdGhlIHllYXJzIHN0YXJ0aW5nIGluIDIwMDIuICBTZWU6Ci0jIDxhPSJodHRwOi8vZXVyLWxleC5ldXJvcGEuZXUvTGV4VXJpU2Vydi9MZXhVcmlTZXJ2LmRvP3VyaT1DRUxFWDozMjAwMEwwMDg0OkVOOk5PVCI+CiAjIERpcmVjdGl2ZSAyMDAwLzg0L0VDIG9mIHRoZSBFdXJvcGVhbiBQYXJsaWFtZW50IGFuZCBvZiB0aGUgQ291bmNpbAogIyBvZiAxOSBKYW51YXJ5IDIwMDEgb24gc3VtbWVyLXRpbWUgYXJyYW5nZW1lbnRzLgotIyA8L2E+CisjIGh0dHA6Ly9ldXItbGV4LmV1cm9wYS5ldS9MZXhVcmlTZXJ2L0xleFVyaVNlcnYuZG8/dXJpPUNFTEVYOjMyMDAwTDAwODQ6RU46Tk9UCiAKICMgVy1FdXIgZGlmZmVycyBmcm9tIEVVIG9ubHkgaW4gdGhhdCBXLUV1ciB1c2VzIHN0YW5kYXJkIHRpbWUuCiBSdWxlCVctRXVyCTE5NzcJMTk4MAktCUFwcglTdW4+PTEJIDE6MDBzCTE6MDAJUwpAQCAtNTIxLDE4ICs1MzcsMTggQEAKIFJ1bGUJQy1FdXIJMTk0NAkxOTQ1CS0JQXByCU1vbj49MQkgMjowMHMJMTowMAlTCiAjIFdoaXRtYW4gZ2l2ZXMgMTk0NCBPY3QgNzsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCiBSdWxlCUMtRXVyCTE5NDQJb25seQktCU9jdAkgMgkgMjowMHMJMAktCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA4LTA3LTEzKToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA4LTA3LTEzKToKICMKICMgSSBmb3VuZCB3aGF0IGlzIHByb2JhYmx5IGEgdHlwbyBvZiAyOjAwIHdoaWNoIHNob3VsZCBwZXJoYXBzIGJlIDI6MDBzCiAjIGluIHRoZSBDLUV1ciBydWxlIGZyb20gdHogZGF0YWJhc2UgdmVyc2lvbiAyMDA4ZCAodGhpcyBwYXJ0IHdhcwotIyBjb3JyZWN0ZWQgaW4gdmVyc2lvbiAyMDA4ZCkuIFRoZSBjaXJjdW1zdGFuY2lhbCBldmlkZW5jZSBpcyBzaW1wbHkgdGhlCisjIGNvcnJlY3RlZCBpbiB2ZXJzaW9uIDIwMDhkKS4gVGhlIGNpcmN1bXN0YW50aWFsIGV2aWRlbmNlIGlzIHNpbXBseSB0aGUKICMgdHogZGF0YWJhc2UgaXRzZWxmLCBhcyBzZWVuIGJlbG93OgogIwogIyBab25lIEV1cm9wZS9QYXJpcyAwOjA5OjIxIC0gTE1UIDE4OTEgTWFyIDE1ICAwOjAxCiAjICAgIDA6MDAgRnJhbmNlIFdFJXNUIDE5NDUgU2VwIDE2ICAzOjAwCiAjCiAjIFpvbmUgRXVyb3BlL01vbmFjbyAwOjI5OjMyIC0gTE1UIDE4OTEgTWFyIDE1Ci0jICAgIDA6MDAgRnJhbmNlIFdFJXNUIDE5NDUgU2VwIDE2IDM6MDAKKyMgICAgMDowMCBGcmFuY2UgV0Ulc1QgMTk0NSBTZXAgMTYgIDM6MDAKICMKICMgWm9uZSBFdXJvcGUvQmVsZ3JhZGUgMToyMjowMCAtIExNVCAxODg0CiAjICAgIDE6MDAgMTowMCBDRVNUIDE5NDUgU2VwIDE2ICAyOjAwcwpAQCAtNTc2LDE2ICs1OTIsMTYgQEAKIFJ1bGUJRS1FdXIJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMDowMAkwCS0KIAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUnVzc2lhCTE5MTcJb25seQktCUp1bAkgMQkyMzowMAkxOjAwCU1TVAkjIE1vc2NvdyBTdW1tZXIgVGltZQotUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JRGVjCTI4CSAwOjAwCTAJTU1UCSMgTW9zY293IE1lYW4gVGltZQotUnVsZQlSdXNzaWEJMTkxOAlvbmx5CS0JTWF5CTMxCTIyOjAwCTI6MDAJTURTVAkjIE1vc2NvdyBEb3VibGUgU3VtbWVyIFRpbWUKK1J1bGUJUnVzc2lhCTE5MTcJb25seQktCUp1bAkgMQkyMzowMAkxOjAwCU1TVCAgIyBNb3Njb3cgU3VtbWVyIFRpbWUKK1J1bGUJUnVzc2lhCTE5MTcJb25seQktCURlYwkyOAkgMDowMAkwCU1NVCAgIyBNb3Njb3cgTWVhbiBUaW1lCitSdWxlCVJ1c3NpYQkxOTE4CW9ubHkJLQlNYXkJMzEJMjI6MDAJMjowMAlNRFNUICMgTW9zY293IERvdWJsZSBTdW1tZXIgVGltZQogUnVsZQlSdXNzaWEJMTkxOAlvbmx5CS0JU2VwCTE2CSAxOjAwCTE6MDAJTVNUCiBSdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlNYXkJMzEJMjM6MDAJMjowMAlNRFNUCi1SdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlKdWwJIDEJIDI6MDAJMTowMAlTCi1SdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlBdWcJMTYJIDA6MDAJMAktCi1SdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlGZWIJMTQJMjM6MDAJMTowMAlTCi1SdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlNYXIJMjAJMjM6MDAJMjowMAlNICMgTWlkc3VtbWVyCi1SdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlTZXAJIDEJIDA6MDAJMTowMAlTCitSdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlKdWwJIDEJIDI6MDAJMTowMAlNU0QKK1J1bGUJUnVzc2lhCTE5MTkJb25seQktCUF1ZwkxNgkgMDowMAkwCU1TSworUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JRmViCTE0CTIzOjAwCTE6MDAJTVNECitSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlNYXIJMjAJMjM6MDAJMjowMAlNU00gICMgTWlkc3VtbWVyCitSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlTZXAJIDEJIDA6MDAJMTowMAlNU0QKIFJ1bGUJUnVzc2lhCTE5MjEJb25seQktCU9jdAkgMQkgMDowMAkwCS0KICMgQWN0IE5vLjkyNSBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgdGhlIFVTU1IgKDE5ODAtMTAtMjQpOgogUnVsZQlSdXNzaWEJMTk4MQkxOTg0CS0JQXByCSAxCSAwOjAwCTE6MDAJUwpAQCAtNjA3LDE0ICs2MjMsMTAgQEAKICMgQWNjb3JkaW5nIHRvIHRoZSBsYXcgUnVzc2lhIGlzIGFib2xpc2hpbmcgZGF5bGlnaHQgc2F2aW5nIHRpbWUuCiAjCiAjIE1lZHZlZGV2IHNpZ25lZCBhIGxhdyAiT24gdGhlIENhbGN1bGF0aW9uIG9mIFRpbWUiIChpbiBydXNzaWFuKToKLSMgPGEgaHJlZj0iaHR0cDovL2Jtb2NrYmUucnUvZXZlbnRzLz9JRD03NTgzIj4KICMgaHR0cDovL2Jtb2NrYmUucnUvZXZlbnRzLz9JRD03NTgzCi0jIDwvYT4KICMKICMgTWVkdmVkZXYgc2lnbmVkIGEgbGF3IG9uIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgdGltZSAoaW4gcnVzc2lhbik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucmVnbnVtLnJ1L25ld3MvcG9saXQvMTQxMzkwNi5odG1sIj4KICMgaHR0cDovL3d3dy5yZWdudW0ucnUvbmV3cy9wb2xpdC8xNDEzOTA2Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDExLTA2LTE1KToKICMgVGFrZSAiYWJvbGlzaGluZyBkYXlsaWdodCBzYXZpbmcgdGltZSIgdG8gbWVhbiB0aGF0IHRpbWUgaXMgbm93IGNvbnNpZGVyZWQKQEAgLTYzNCwxMCArNjQ2LDEwIEBACiAjIEZyb20gTWFya3VzIEt1aG4gKDE5OTYtMDctMTIpOgogIyBUaGUgb2ZmaWNpYWwgR2VybWFuIG5hbWVzIC4uLiBhcmUKICMKLSMJTWl0dGVsZXVyb3BhZWlzY2hlIFplaXQgKE1FWikgICAgICAgICA9IFVUQyswMTowMAotIwlNaXR0ZWxldXJvcGFlaXNjaGUgU29tbWVyemVpdCAoTUVTWikgID0gVVRDKzAyOjAwCisjCU1pdHRlbGV1cm9ww6Rpc2NoZSBaZWl0IChNRVopICAgICAgICAgPSBVVEMrMDE6MDAKKyMJTWl0dGVsZXVyb3DDpGlzY2hlIFNvbW1lcnplaXQgKE1FU1opICA9IFVUQyswMjowMAogIwotIyBhcyBkZWZpbmVkIGluIHRoZSBHZXJtYW4gVGltZSBBY3QgKEdlc2V0eiB1ZWJlciBkaWUgWmVpdGJlc3RpbW11bmcgKFplaXRHKSwKKyMgYXMgZGVmaW5lZCBpbiB0aGUgR2VybWFuIFRpbWUgQWN0IChHZXNldHogw7xiZXIgZGllIFplaXRiZXN0aW1tdW5nIChaZWl0RyksCiAjIDE5NzgtMDctMjUsIEJ1bmRlc2dlc2V0emJsYXR0LCBKYWhyZ2FuZyAxOTc4LCBUZWlsIEksIFMuIDExMTAtMTExMSkuLi4uCiAjIEkgd3JvdGUgLi4uIHRvIHRoZSBHZXJtYW4gRmVkZXJhbCBQaHlzaWNhbC1UZWNobmljYWwgSW5zdGl0dXRpb24KICMKQEAgLTY5Miw3ICs3MDQsNyBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvQW5kb3JyYQkwOjA2OjA0IC0JTE1UCTE5MDEKIAkJCTA6MDAJLQlXRVQJMTk0NiBTZXAgMzAKLQkJCTE6MDAJLQlDRVQJMTk4NSBNYXIgMzEgMjowMAorCQkJMTowMAktCUNFVAkxOTg1IE1hciAzMSAgMjowMAogCQkJMTowMAlFVQlDRSVzVAogCiAjIEF1c3RyaWEKQEAgLTcxOCw5ICs3MzAsOSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvVmllbm5hCTE6MDU6MjEgLQlMTVQJMTg5MyBBcHIKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkyMAotCQkJMTowMAlBdXN0cmlhCUNFJXNUCTE5NDAgQXByICAxIDI6MDBzCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyIDI6MDBzCi0JCQkxOjAwCTE6MDAJQ0VTVAkxOTQ1IEFwciAxMiAyOjAwcworCQkJMTowMAlBdXN0cmlhCUNFJXNUCTE5NDAgQXByICAxICAyOjAwcworCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAgMjowMHMKKwkJCTE6MDAJMTowMAlDRVNUCTE5NDUgQXByIDEyICAyOjAwcwogCQkJMTowMAktCUNFVAkxOTQ2CiAJCQkxOjAwCUF1c3RyaWEJQ0Ulc1QJMTk4MQogCQkJMTowMAlFVQlDRSVzVApAQCAtNzMxLDM4ICs3NDMsMjkgQEAKICMgR01UKzMgd2l0aG91dCBEU1QgKHdhcyBHTVQrMiB3aXRoIERTVCkuCiAjCiAjIFNvdXJjZXMgKFJ1c3NpYW4gbGFuZ3VhZ2UpOgotIyAxLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJlbHRhLmJ5L3J1L2FsbF9uZXdzL3NvY2lldHkvVi1CZWxhcnVzaS1vdG1lbmphZXRzamEtcGVyZXhvZC1uYS1zZXpvbm5vZS12cmVtamFfaV81NzI5NTIuaHRtbCI+CiAjIGh0dHA6Ly93d3cuYmVsdGEuYnkvcnUvYWxsX25ld3Mvc29jaWV0eS9WLUJlbGFydXNpLW90bWVuamFldHNqYS1wZXJleG9kLW5hLXNlem9ubm9lLXZyZW1qYV9pXzU3Mjk1Mi5odG1sCi0jIDwvYT4KLSMgMi4KLSMgPGEgaHJlZj0iaHR0cDovL25hdmlueS5ieS9ydWJyaWNzL3NvY2lldHkvMjAxMS8wOS8xNi9pY19hcnRpY2xlc18xMTZfMTc1MTQ0LyI+CiAjIGh0dHA6Ly9uYXZpbnkuYnkvcnVicmljcy9zb2NpZXR5LzIwMTEvMDkvMTYvaWNfYXJ0aWNsZXNfMTE2XzE3NTE0NC8KLSMgPC9hPgotIyAzLgotIyA8YSBocmVmPSJodHRwOi8vbmV3cy50dXQuYnkvc29jaWV0eS8yNTA1NzguaHRtbCI+CiAjIGh0dHA6Ly9uZXdzLnR1dC5ieS9zb2NpZXR5LzI1MDU3OC5odG1sCi0jIDwvYT4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL01pbnNrCTE6NTA6MTYgLQlMTVQJMTg4MAotCQkJMTo1MAktCU1NVAkxOTI0IE1heSAyICMgTWluc2sgTWVhbiBUaW1lCisJCQkxOjUwCS0JTU1UCTE5MjQgTWF5ICAyICMgTWluc2sgTWVhbiBUaW1lCiAJCQkyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCiAJCQkzOjAwCS0JTVNLCTE5NDEgSnVuIDI4CiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgSnVsICAzCiAJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAKLQkJCTM6MDAJLQlNU0sJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTI6MDAJMTowMAlFRVNUCTE5OTEgU2VwIDI5IDI6MDBzCi0JCQkyOjAwCS0JRUVUCTE5OTIgTWFyIDI5IDA6MDBzCi0JCQkyOjAwCTE6MDAJRUVTVAkxOTkyIFNlcCAyNyAwOjAwcwotCQkJMjowMAlSdXNzaWEJRUUlc1QJMjAxMSBNYXIgMjcgMjowMHMKLQkJCTM6MDAJLQlGRVQgIyBGdXJ0aGVyLWVhc3Rlcm4gRXVyb3BlYW4gVGltZQorCQkJMzowMAktCU1TSwkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTI6MDAJMTowMAlFRVNUCTE5OTEgU2VwIDI5ICAyOjAwcworCQkJMjowMAktCUVFVAkxOTkyIE1hciAyOSAgMDowMHMKKwkJCTI6MDAJMTowMAlFRVNUCTE5OTIgU2VwIDI3ICAwOjAwcworCQkJMjowMAlSdXNzaWEJRUUlc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkzOjAwCS0JRkVUCiAKICMgQmVsZ2l1bQogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk3LTA3LTAyKToKICMgRW50cmllcyBmcm9tIDE5MTggdGhyb3VnaCAxOTkxIGFyZSB0YWtlbiBmcm9tOgogIwlBbm51YWlyZSBkZSBMJ09ic2VydmF0b2lyZSBSb3lhbCBkZSBCZWxnaXF1ZSwKLSMJQXZlbnVlIENpcmN1bGFpcmUsIDMsIEItMTE4MCBCUlVYRUxMRVMsIENMVklJZSBhbm5lZSwgMTk5MQorIwlBdmVudWUgQ2lyY3VsYWlyZSwgMywgQi0xMTgwIEJSVVhFTExFUywgQ0xWSUllIGFubsOpZSwgMTk5MQogIwkoSW1wcmltZXJpZSBIQVlFWiwgcy5wLnIubC4sIFJ1ZSBGaW4sIDQsIDEwODAgQlJVWEVMTEVTLCBNQ01YQyksCiAjCXBwIDgtOS4KICMgTE1UIGJlZm9yZSAxODkyIHdhcyAwOjE3OjMwLCBhY2NvcmRpbmcgdG8gdGhlIG9mZmljaWFsIGpvdXJuYWwgb2YgQmVsZ2l1bToKQEAgLTgxMiw3ICs4MTUsNyBAQAogUnVsZQlCZWxnaXVtCTE5NDYJb25seQktCU9jdAkgNwkgMjowMHMJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9CcnVzc2VscwkwOjE3OjMwIC0JTE1UCTE4ODAKLQkJCTA6MTc6MzAJLQlCTVQJMTg5MiBNYXkgIDEgMTI6MDAgIyBCcnVzc2VscyBNVAorCQkJMDoxNzozMAktCUJNVAkxODkyIE1heSAgMSAxMjowMCAgIyBCcnVzc2VscyBNVAogCQkJMDowMAktCVdFVAkxOTE0IE5vdiAgOAogCQkJMTowMAktCUNFVAkxOTE2IE1heSAgMSAgMDowMAogCQkJMTowMAlDLUV1cglDRSVzVAkxOTE4IE5vdiAxMSAxMTowMHUKQEAgLTgyOCw4ICs4MzEsOCBAQAogIwogIyBGcm9tIFBsYW1lbiBTaW1lbm92IHZpYSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgogIyBBIGRvY3VtZW50IG9mIEdvdmVybm1lbnQgb2YgQnVsZ2FyaWEgKE5vLjk0LzE5OTcpIHNheXM6Ci0jIEVFVCAtLT4gRUVURFNUIGlzIGluIDAzOjAwIExvY2FsIHRpbWUgaW4gbGFzdCBTdW5kYXkgb2YgTWFyY2ggLi4uCi0jIEVFVERTVCAtLT4gRUVUIGlzIGluIDA0OjAwIExvY2FsIHRpbWUgaW4gbGFzdCBTdW5kYXkgb2YgT2N0b2JlcgorIyBFRVQgLT4gRUVURFNUIGlzIGluIDAzOjAwIExvY2FsIHRpbWUgaW4gbGFzdCBTdW5kYXkgb2YgTWFyY2ggLi4uCisjIEVFVERTVCAtPiBFRVQgaXMgaW4gMDQ6MDAgTG9jYWwgdGltZSBpbiBsYXN0IFN1bmRheSBvZiBPY3RvYmVyCiAjCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlCdWxnCTE5NzkJb25seQktCU1hcgkzMQkyMzowMAkxOjAwCVMKQEAgLTg0Miw3ICs4NDUsNyBAQAogCQkJMTo1Njo1NgktCUlNVAkxODk0IE5vdiAzMCAjIElzdGFuYnVsIE1UPwogCQkJMjowMAktCUVFVAkxOTQyIE5vdiAgMiAgMzowMAogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1Ci0JCQkxOjAwCS0JQ0VUCTE5NDUgQXByIDIgMzowMAorCQkJMTowMAktCUNFVAkxOTQ1IEFwciAgMiAgMzowMAogCQkJMjowMAktCUVFVAkxOTc5IE1hciAzMSAyMzowMAogCQkJMjowMAlCdWxnCUVFJXNUCTE5ODIgU2VwIDI2ICAyOjAwCiAJCQkyOjAwCUMtRXVyCUVFJXNUCTE5OTEKQEAgLTg2NiwxNSArODY5LDE1IEBACiBSdWxlCUN6ZWNoCTE5NDkJb25seQktCUFwcgkgOQkyOjAwcwkxOjAwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL1ByYWd1ZQkwOjU3OjQ0IC0JTE1UCTE4NTAKLQkJCTA6NTc6NDQJLQlQTVQJMTg5MSBPY3QgICAgICMgUHJhZ3VlIE1lYW4gVGltZQotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IFNlcCAxNyAyOjAwcworCQkJMDo1Nzo0NAktCVBNVAkxODkxIE9jdCAgICAjIFByYWd1ZSBNZWFuIFRpbWUKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBTZXAgMTcgIDI6MDBzCiAJCQkxOjAwCUN6ZWNoCUNFJXNUCTE5NzkKIAkJCTE6MDAJRVUJQ0Ulc1QKICMgVXNlIEV1cm9wZS9QcmFndWUgYWxzbyBmb3IgU2xvdmFraWEuCiAKICMgRGVubWFyaywgRmFyb2UgSXNsYW5kcywgYW5kIEdyZWVubGFuZAogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTA0LTI2KToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA1LTA0LTI2KToKICMgaHR0cDovL3d3dy5odW0uYWF1LmRrL35wb2UvdGlkL3RpbmUvRGFuc2tUaWQuaHRtIHNheXMgdGhhdCB0aGUgbGF3CiAjIFtpbnRyb2R1Y2luZyBzdGFuZGFyZCB0aW1lXSB3YXMgaW4gZWZmZWN0IGZyb20gMTg5NC0wMS0wMS4uLi4KICMgVGhlIHBhZ2UgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9BMTg5MzAwMDgzMzAtUkVHTApAQCAtODg0LDcgKzg4Nyw3IEBACiAjIGh0dHA6Ly93d3cucmV0c2luZm8uZGsvX0dFVERPQ0lfL0FDQ04vQTE5NzIyMTEwMDMwLVJFR0wKICMKICMgVGhpcyBwcm92b2tlZCBhIG5ldyBsYXcgZnJvbSAxOTc0IHRvIG1ha2UgcG9zc2libGUgc3VtbWVyIHRpbWUgY2hhbmdlcwotIyBpbiBzdWJzZXF1ZW5ldCBkZWNyZWVzIHdpdGggdGhlIGxhdworIyBpbiBzdWJzZXF1ZW50IGRlY3JlZXMgd2l0aCB0aGUgbGF3CiAjIGh0dHA6Ly93d3cucmV0c2luZm8uZGsvX0dFVERPQ0lfL0FDQ04vQTE5NzQwMDIyMzMwLVJFR0wKICMKICMgSXQgc2VlbXMgaG93ZXZlciB0aGF0IG5vIGRlY3JlZSB3YXMgc2V0IGZvcndhcmQgdW50aWwgMTk4MC4gIEkgaGF2ZQpAQCAtODk5LDcgKzkwMiw3IEBACiAjIHdhcyBzdXNwZW5kZWQgb24gdGhhdCBuaWdodCk6CiAjIGh0dHA6Ly93d3cucmV0c2luZm8uZGsvX0dFVERPQ0lfL0FDQ04vQzE5ODAxMTIwNTU0LVJFR0wKIAotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNS0wNi0xMSk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNS0wNi0xMSk6CiAjIFRoZSBIZXJuaW5nIEZvbGtlYmxhZCAoMTk4MC0wOS0yNikgcmVwb3J0ZWQgdGhhdCB0aGUgbmlnaHQgYmV0d2VlbgogIyBTYXR1cmRheSBhbmQgU3VuZGF5IHRoZSBjbG9jayBpcyBzZXQgYmFjayBmcm9tIHRocmVlIHRvIHR3by4KIApAQCAtOTIzLDExICs5MjYsMTEgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgRXVyb3BlL0NvcGVuaGFnZW4JIDA6NTA6MjAgLQlMTVQJMTg5MAogCQkJIDA6NTA6MjAgLQlDTVQJMTg5NCBKYW4gIDEgIyBDb3BlbmhhZ2VuIE1UCi0JCQkgMTowMAlEZW5tYXJrCUNFJXNUCTE5NDIgTm92ICAyIDI6MDBzCi0JCQkgMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAyOjAwCisJCQkgMTowMAlEZW5tYXJrCUNFJXNUCTE5NDIgTm92ICAyICAyOjAwcworCQkJIDE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgIDI6MDAKIAkJCSAxOjAwCURlbm1hcmsJQ0Ulc1QJMTk4MAogCQkJIDE6MDAJRVUJQ0Ulc1QKLVpvbmUgQXRsYW50aWMvRmFyb2UJLTA6Mjc6MDQgLQlMTVQJMTkwOCBKYW4gMTEJIyBUb3JzaGF2bgorWm9uZSBBdGxhbnRpYy9GYXJvZQktMDoyNzowNCAtCUxNVAkxOTA4IEphbiAxMSAjIFTDs3JzaGF2bgogCQkJIDA6MDAJLQlXRVQJMTk4MQogCQkJIDA6MDAJRVUJV0Ulc1QKICMKQEAgLTkzOSwxMSArOTQyLDExIEBACiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgogIyBHcmVlbmxhbmQgam9pbmVkIHRoZSBFVSBhcyBwYXJ0IG9mIERlbm1hcmssIG9idGFpbmVkIGhvbWUgcnVsZSBvbiAxOTc5LTA1LTAxLAogIyBhbmQgbGVmdCB0aGUgRVUgb24gMTk4NS0wMi0wMS4gIEl0IHRoZXJlZm9yZSBzaG91bGQgaGF2ZSBiZWVuIHVzaW5nIEVVCi0jIHJ1bGVzIGF0IGxlYXN0IHRocm91Z2ggMTk4NC4gIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgU2NvcmVzYnlzdW5kIGFuZCBHb2R0aGFiCisjIHJ1bGVzIGF0IGxlYXN0IHRocm91Z2ggMTk4NC4gIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgU2NvcmVzYnlzdW5kIGFuZCBHb2R0aMOlYgogIyB1c2VkIEMtRXVyIHJ1bGVzIGFmdGVyIDE5ODAsIGJ1dCBJQVRBIFNTSU0gKDE5OTEvMTk5Nikgc2F5cyB0aGV5IHVzZSBFVQogIyBydWxlcyBzaW5jZSBhdCBsZWFzdCAxOTkxLiAgQXNzdW1lIEVVIHJ1bGVzIHNpbmNlIDE5ODAuCiAKLSMgRnJvbSBHd2lsbGluIExhdyAoMjAwMS0wNi0wNiksIGNpdGluZworIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDAxLTA2LTA2KSwgY2l0aW5nCiAjIDxodHRwOi8vd3d3LnN0YXRrYXJ0Lm5vL2Vmcy9lZnNoZWZ0ZXIvMjAwMS9lZnM1LTIwMDEucGRmPiAoMjAwMS0wMy0xNSksCiAjIGFuZCB3aXRoIHRyYW5zbGF0aW9ucyBjb3JyZWN0ZWQgYnkgU3RlZmZlbiBUaG9yc2VuOgogIwpAQCAtOTc4LDE2ICs5ODEsMTYgQEAKICMgRFBDIHJlc2VhcmNoIHN0YXRpb24gYXQgWmFja2VuYmVyZy4KICMKICMgU2NvcmVzYnlzdW5kIGFuZCB0d28gc21hbGwgdmlsbGFnZXMgbmVhcmJ5IGtlZXAgdGltZSBVVEMtMSBhbmQgdXNlCi0jIHRoZSBzYW1lIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QgYXMgaW4gV2VzdCBHcmVlbmxhbmQgKEdvZHRoYWIpLgorIyB0aGUgc2FtZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcGVyaW9kIGFzIGluIFdlc3QgR3JlZW5sYW5kIChHb2R0aMOlYikuCiAjCi0jIFRoZSByZXN0IG9mIEdyZWVubGFuZCwgaW5jbHVkaW5nIEdvZHRoYWIgKHRoaXMgYXJlYSwgYWx0aG91Z2ggaXQKKyMgVGhlIHJlc3Qgb2YgR3JlZW5sYW5kLCBpbmNsdWRpbmcgR29kdGjDpWIgKHRoaXMgYXJlYSwgYWx0aG91Z2ggaXQKICMgaW5jbHVkZXMgY2VudHJhbCBHcmVlbmxhbmQsIGlzIGtub3duIGFzIHdlc3QgR3JlZW5sYW5kKSwga2VlcHMgdGltZQogIyBVVEMtMywgd2l0aCBkYXlsaWdodCBzYXZpbmdzIG1ldGhvZHMgYWNjb3JkaW5nIHRvIEV1cm9wZWFuIHJ1bGVzLgogIwogIyBJdCBpcyBjb21tb24gcHJvY2VkdXJlIHRvIHVzZSBVVEMgMCBpbiB0aGUgd2lsZGVybmVzcyBvZiBFYXN0IGFuZAogIyBOb3J0aCBHcmVlbmxhbmQsIGJlY2F1c2UgaXQgaXMgbWFpbmx5IEljZWxhbmRpYyBhaXJjcmFmdCBvcGVyYXRvcnMKICMgbWFpbnRhaW5pbmcgdHJhZmZpYyBpbiB0aGVzZSBhcmVhcy4gIEhvd2V2ZXIsIHRoZSBvZmZpY2lhbCBzdGF0dXMgb2YKLSMgdGhpcyBhcmVhIGlzIHRoYXQgaXQgc3RpY2tzIHdpdGggR29kdGhhYiB0aW1lLiAgVGhpcyBhcmVhIG1pZ2h0IGJlCisjIHRoaXMgYXJlYSBpcyB0aGF0IGl0IHN0aWNrcyB3aXRoIEdvZHRow6ViIHRpbWUuICBUaGlzIGFyZWEgbWlnaHQgYmUKICMgY29uc2lkZXJlZCBhIGR1YWwgdGltZSB6b25lIGluIHNvbWUgcmVzcGVjdHMgYmVjYXVzZSBvZiB0aGlzLgogCiAjIEZyb20gUml2ZXMgTWNEb3cgKDIwMDEtMTEtMTkpOgpAQCAtOTk2LDggKzk5OSw4IEBACiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CiAjIEZyb20gMTk5NyBvbiB0aGUgQ0lBIG1hcCBzaG93cyBEYW5tYXJrc2hhdm4gb24gR01UOwotIyB0aGUgMTk5NSBtYXAgYXMgbGlrZSBHb2R0aGFiLgotIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgYXNzdW1lIHRoZXkgd2VyZSBsaWtlIEdvZHRoYWIgYmVmb3JlIDE5OTYuCisjIHRoZSAxOTk1IG1hcCBhcyBsaWtlIEdvZHRow6ViLgorIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgYXNzdW1lIHRoZXkgd2VyZSBsaWtlIEdvZHRow6ViIGJlZm9yZSAxOTk2LgogIyBzdGFydGthcnQubm8gc2F5cyBUaHVsZSBkb2VzIG5vdCBvYnNlcnZlIERTVCwgYnV0IHRoaXMgaXMgY2xlYXJseSBhbiBlcnJvciwKICMgc28gZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgZm9yIFRodWxlIHRyYW5zaXRpb25zIHVudGlsIHRoaXMgeWVhci4KICMgRm9yIDIwMDcgb24gYXNzdW1lIFRodWxlIHdpbGwgc3RheSBpbiBzeW5jIHdpdGggVVMgRFNUIHJ1bGVzLgpAQCAtMTAxMiwxNSArMTAxNSwxNSBAQAogIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0Rhbm1hcmtzaGF2biAtMToxNDo0MCAtCUxNVAkxOTE2IEp1bCAyOAotCQkJLTM6MDAJLQlXR1QJMTk4MCBBcHIgIDYgMjowMAorCQkJLTM6MDAJLQlXR1QJMTk4MCBBcHIgIDYgIDI6MDAKIAkJCS0zOjAwCUVVCVdHJXNUCTE5OTYKIAkJCTA6MDAJLQlHTVQKIFpvbmUgQW1lcmljYS9TY29yZXNieXN1bmQgLTE6Mjc6NTIgLQlMTVQJMTkxNiBKdWwgMjggIyBJdHRvcXFvcnRvb3JtaWl0Ci0JCQktMjowMAktCUNHVAkxOTgwIEFwciAgNiAyOjAwCisJCQktMjowMAktCUNHVAkxOTgwIEFwciAgNiAgMjowMAogCQkJLTI6MDAJQy1FdXIJQ0clc1QJMTk4MSBNYXIgMjkKIAkJCS0xOjAwCUVVCUVHJXNUCiBab25lIEFtZXJpY2EvR29kdGhhYgktMzoyNjo1NiAtCUxNVAkxOTE2IEp1bCAyOCAjIE51dWsKLQkJCS0zOjAwCS0JV0dUCTE5ODAgQXByICA2IDI6MDAKKwkJCS0zOjAwCS0JV0dUCTE5ODAgQXByICA2ICAyOjAwCiAJCQktMzowMAlFVQlXRyVzVAogWm9uZSBBbWVyaWNhL1RodWxlCS00OjM1OjA4IC0JTE1UCTE5MTYgSnVsIDI4ICMgUGl0dWZmaWsgYWlyIGJhc2UKIAkJCS00OjAwCVRodWxlCUElc1QKQEAgLTEwNDIsMTcgKzEwNDUsMTYgQEAKICMgc3VtbWVyIHRpbWUgbmV4dCBzcHJpbmcuIgogCiAjIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk4LTExLTA0KSwgaGVhdmlseSBlZGl0ZWQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly90cmlwLnJrLmVlL2NnaS1iaW4vdGh3PyR7QkFTRX09YWt0JiR7T09IVE1MfT1ydGQmVEE9MTk5OCZUTz0xJkFOPTEzOTAiPgogIyBUaGUgMTk5OC0wOS0yMiBFc3RvbmlhbiB0aW1lIGxhdwotIyA8L2E+CisjIGh0dHA6Ly90cmlwLnJrLmVlL2NnaS1iaW4vdGh3PyR7QkFTRX09YWt0JiR7T09IVE1MfT1ydGQmVEE9MTk5OCZUTz0xJkFOPTEzOTAKICMgcmVmZXJzIHRvIHRoZSBFaWdodGggRGlyZWN0aXZlIGFuZCBjaXRlcyB0aGUgYXNzb2NpYXRpb24gYWdyZWVtZW50IGJldHdlZW4KLSMgdGhlIEVVIGFuZCBFc3RvbmlhLCByYXRpZmllZCBieSB0aGUgRXN0b25pYW4gbGF3IChSVCBJSSAxOTk1LCAyMi0tMjcsIDEyMCkuCisjIHRoZSBFVSBhbmQgRXN0b25pYSwgcmF0aWZpZWQgYnkgdGhlIEVzdG9uaWFuIGxhdyAoUlQgSUkgMTk5NSwgMjItMjcsIDEyMCkuCiAjCiAjIEkgYWxzbyBhc2tlZCBbbXkgcmVsYXRpdmVdIHdoZXRoZXIgdGhleSB1c2UgYW55IHN0YW5kYXJkIGFiYnJldmlhdGlvbgogIyBmb3IgdGhlaXIgc3RhbmRhcmQgYW5kIHN1bW1lciB0aW1lcy4gSGUgc2F5cyBubywgdGhleSB1c2UgInN1dmVhZWciCiAjIChzdW1tZXIgdGltZSkgYW5kICJ0YWx2ZWFlZyIgKHdpbnRlciB0aW1lKS4KIAotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmFsdGljdGltZXMuY29tLyI+VGhlIEJhbHRpYyBUaW1lczwvYT4gKDE5OTktMDktMDkpCisjIEZyb20gVGhlIEJhbHRpYyBUaW1lcyA8aHR0cDovL3d3dy5iYWx0aWN0aW1lcy5jb20vPiAoMTk5OS0wOS0wOSkKICMgdmlhIFN0ZWZmZW4gVGhvcnNlbjoKICMgVGhpcyB5ZWFyIHdpbGwgbWFyayB0aGUgbGFzdCB0aW1lIEVzdG9uaWEgc2hpZnRzIHRvIHN1bW1lciB0aW1lLAogIyBhIGNvdW5jaWwgb2YgdGhlIHJ1bGluZyBjb2FsaXRpb24gYW5ub3VuY2VkIFNlcHQuIDYuLi4uCkBAIC0xMDcwLDE5ICsxMDcyLDE5IEBACiAjIFRoZSBFc3RvbmlhbiBnb3Zlcm5tZW50IGhhcyBjaGFuZ2VkIG9uY2UgYWdhaW4gdGltZXpvbmUgcG9saXRpY3MuCiAjIE5vdyB3ZSBhcmUgdXNpbmcgYWdhaW4gRVUgcnVsZXMuCiAjCi0jIEZyb20gVXJtZXQgSmFhbmVzICgyMDAyLTAzLTI4KToKKyMgRnJvbSBVcm1ldCBKw6RuZXMgKDIwMDItMDMtMjgpOgogIyBUaGUgbGVnaXNsYXRpdmUgcmVmZXJlbmNlIGlzIEdvdmVybm1lbnQgZGVjcmVlIE5vLiA4NCBvbiAyMDAyLTAyLTIxLgogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9UYWxsaW5uCTE6Mzk6MDAJLQlMTVQJMTg4MAotCQkJMTozOTowMAktCVRNVAkxOTE4IEZlYiAjIFRhbGxpbm4gTWVhbiBUaW1lCisJCQkxOjM5OjAwCS0JVE1UCTE5MTggRmViICAgICMgVGFsbGlubiBNZWFuIFRpbWUKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkxOSBKdWwKIAkJCTE6Mzk6MDAJLQlUTVQJMTkyMSBNYXkKIAkJCTI6MDAJLQlFRVQJMTk0MCBBdWcgIDYKIAkJCTM6MDAJLQlNU0sJMTk0MSBTZXAgMTUKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBTZXAgMjIKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk4OSBNYXIgMjYgMjowMHMKLQkJCTI6MDAJMTowMAlFRVNUCTE5ODkgU2VwIDI0IDI6MDBzCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5ODkgTWFyIDI2ICAyOjAwcworCQkJMjowMAkxOjAwCUVFU1QJMTk4OSBTZXAgMjQgIDI6MDBzCiAJCQkyOjAwCUMtRXVyCUVFJXNUCTE5OTggU2VwIDIyCiAJCQkyOjAwCUVVCUVFJXNUCTE5OTkgTm92ICAxCiAJCQkyOjAwCS0JRUVUCTIwMDIgRmViIDIxCkBAIC0xMTA0LDM1ICsxMTA2LDQ1IEBACiAjIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiBIZWlra2kgT2phOiBBaWtha2lyamEgMjAwNywgcHVibGlzaGVkIGJ5IFRoZSBBbG1hbmFjCiAjIE9mZmljZSBvZiBVbml2ZXJzaXR5IG9mIEhlbHNpbmtpLCBJU0JOIDk1Mi0xMC0zMjIxLTksIGF2YWlsYWJsZSBvbmxpbmUgKGluCiAjIEZpbm5pc2gpIGF0Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly9hbG1hbmFra2EuaGVsc2lua2kuZmkvYWlrYWtpcmphL0Fpa2FraXJqYTIwMDdrb2tvbmFhbi5wZGYiPgogIyBodHRwOi8vYWxtYW5ha2thLmhlbHNpbmtpLmZpL2Fpa2FraXJqYS9BaWtha2lyamEyMDA3a29rb25hYW4ucGRmCi0jIDwvYT4KICMKICMgUGFnZSAxMDUgKDU2IGluIFBERiB2ZXJzaW9uKSBoYXMgYSBoYW5keSB0YWJsZSBvZiBhbGwgcGFzdCBkYXlsaWdodCBzYXZpbmdzCiAjIHRyYW5zaXRpb25zLiBJdCBpcyBlYXN5IGVub3VnaCB0byBpbnRlcnByZXQgd2l0aG91dCBGaW5uaXNoIHNraWxscy4KICMKICMgVGhpcyBpcyBhbHNvIGNvbmZpcm1lZCBieSBGaW5uaXNoIEJyb2FkY2FzdGluZyBDb21wYW55J3MgYXJjaGl2ZSBhdDoKLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy55bGUuZmkvZWxhdmFhcmtpc3RvLz9zPXMmZz0xJmFnPTUmdD0mYT0zNDAxIj4KICMgaHR0cDovL3d3dy55bGUuZmkvZWxhdmFhcmtpc3RvLz9zPXMmZz0xJmFnPTUmdD0mYT0zNDAxCi0jIDwvYT4KICMKICMgVGhlIG5ld3MgY2xpcCBmcm9tIDE5ODEgc2F5cyB0aGF0ICJ0aGUgdGltZSBiZXR3ZWVuIDIgYW5kIDMgbydjbG9jayBkb2VzIG5vdAogIyBleGlzdCB0b25pZ2h0LiIKIAorIyBGcm9tIEtvbnN0YW50aW4gSHlwcMO2bmVuICgyMDE0LTA2LTEzKToKKyMgW0hlaWtraSBPamEncyBib29rIEFpa2FraXJqYSAyMDEzXQorIyBodHRwOi8vYWxtYW5ha2thLmhlbHNpbmtpLmZpL2ltYWdlcy9haWtha2lyamEvQWlrYWtpcmphMjAxM2tva29uYWFuLnBkZgorIyBwYWdlcyAxMDQtMTA1LCBpbmNsdWRpbmcgYSBzY2FuIGZyb20gYSBuZXdzcGFwZXIgcHVibGlzaGVkIG9uIEFwciAyIDE5NDIKKyMgc2F5IHRoYXQgLi4uIFtvXW4gQXByIDIgMTk0MiwgMjQgbydjbG9jayAod2hpY2ggbWVhbnMgQXByIDMgMTk0MiwKKyMgMDA6MDApLCBjbG9ja3Mgd2VyZSBtb3ZlZCBvbmUgaG91ciBmb3J3YXJkLiBUaGUgbmV3c3BhcGVyCisjIG1lbnRpb25zICJvbiB0aGUgbmlnaHQgZnJvbSBUaHVyc2RheSB0byBGcmlkYXkiLi4uLgorIyBPbiBPY3QgNCAxOTQyLCBjbG9ja3Mgd2VyZSBtb3ZlZCBhdCAxOjAwIG9uZSBob3VyIGJhY2t3YXJkcy4KKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0xNCk6CisjIEdvIHdpdGggT2phIG92ZXIgU2hhbmtzLgorCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlGaW5sYW5kCTE5NDIJb25seQktCUFwcgkzCTA6MDAJMTowMAlTCi1SdWxlCUZpbmxhbmQJMTk0Mglvbmx5CS0JT2N0CTMJMDowMAkwCS0KK1J1bGUJRmlubGFuZAkxOTQyCW9ubHkJLQlBcHIJMgkyNDowMAkxOjAwCVMKK1J1bGUJRmlubGFuZAkxOTQyCW9ubHkJLQlPY3QJNAkxOjAwCTAJLQogUnVsZQlGaW5sYW5kCTE5ODEJMTk4MgktCU1hcglsYXN0U3VuCTI6MDAJMTowMAlTCiBSdWxlCUZpbmxhbmQJMTk4MQkxOTgyCS0JU2VwCWxhc3RTdW4JMzowMAkwCS0KKworIyBNaWxuZSBzYXlzIEhlbHNpbmtpIChIZWxzaW5nZm9ycykgdGltZSB3YXMgMTozOTo0OS4yIChvZmZpY2lhbCBkb2N1bWVudCk7CisjIHJvdW5kIHRvIG5lYXJlc3QuCisKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0hlbHNpbmtpCTE6Mzk6NTIgLQlMTVQJMTg3OCBNYXkgMzEKLQkJCTE6Mzk6NTIJLQlITVQJMTkyMSBNYXkgICAgIyBIZWxzaW5raSBNZWFuIFRpbWUKK1pvbmUJRXVyb3BlL0hlbHNpbmtpCTE6Mzk6NDkgLQlMTVQJMTg3OCBNYXkgMzEKKwkJCTE6Mzk6NDkJLQlITVQJMTkyMSBNYXkgICAgIyBIZWxzaW5raSBNZWFuIFRpbWUKIAkJCTI6MDAJRmlubGFuZAlFRSVzVAkxOTgzCiAJCQkyOjAwCUVVCUVFJXNUCiAKLSMgQWFsYW5kIElzCisjIMOFbGFuZCBJcwogTGluawlFdXJvcGUvSGVsc2lua2kJRXVyb3BlL01hcmllaGFtbgogCiAKQEAgLTExNDAsMTQgKzExNTIsMTQgQEAKIAogIyBGcm9tIENpcm8gRGlzY2Vwb2xvICgyMDAwLTEyLTIwKToKICMKLSMgSGVucmkgTGUgQ29ycmUsIFJlZ2ltZXMgSG9yYWlyZXMgcG91ciBsZSBtb25kZSBlbnRpZXIsIEVkaXRpb25zCisjIEhlbnJpIExlIENvcnJlLCBSw6lnaW1lcyBob3JhaXJlcyBwb3VyIGxlIG1vbmRlIGVudGllciwgw4lkaXRpb25zCiAjIFRyYWRpdGlvbm5lbGxlcyAtIFBhcmlzIDIgYm9va3MsIDE5OTMKICMKLSMgR2FicmllbCwgVHJhaXRlIGRlIGwnaGV1cmUgZGFucyBsZSBtb25kZSwgR3V5IFRyZWRhbmllbCBlZGl0ZXVyLAorIyBHYWJyaWVsLCBUcmFpdMOpIGRlIGwnaGV1cmUgZGFucyBsZSBtb25kZSwgR3V5IFRyw6lkYW5pZWwsCiAjIFBhcmlzLCAxOTkxCiAjCi0jIEZyYW5jb2lzZSBHYXVxdWVsaW4sIFByb2JsZW1lcyBkZSBsJ2hldXJlIHJlc29sdXMgZW4gYXN0cm9sb2dpZSwKLSMgR3V5IHRyZWRhbmllbCwgUGFyaXMgMTk4NworIyBGcmFuw6dvaXNlIEdhdXF1ZWxpbiwgUHJvYmzDqG1lcyBkZSBsJ2hldXJlIHLDqXNvbHVzIGVuIGFzdHJvbG9naWUsCisjIEd1eSBUcsOpZGFuaWVsLCBQYXJpcyAxOTg3CiAKIAogIwpAQCAtMTE4OCwxNiArMTIwMCwxNiBAQAogUnVsZQlGcmFuY2UJMTk0MAlvbmx5CS0JRmViCTI1CSAyOjAwCTE6MDAJUwogIyBUaGUgRnJlbmNoIHJ1bGVzIGZvciAxOTQxLTE5NDQgd2VyZSBub3QgdXNlZCBpbiBQYXJpcywgYnV0IFNoYW5rcyAmIFBvdHRlbmdlcgogIyB3cml0ZSB0aGF0IHRoZXkgd2VyZSB1c2VkIGluIE1vbmFjbyBhbmQgaW4gbWFueSBGcmVuY2ggbG9jYXRpb25zLgotIyBMZSBDb3JyZSB3cml0ZXMgdGhhdCB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIGZyZWUgem9uZSB3YXMgQXJuZWd1eSwgT3J0aGV6LAotIyBNb250LWRlLU1hcnNhbiwgQmF6YXMsIExhbmdvbiwgTGFtb3R0ZS1Nb250cmF2ZWwsIE1hcm91aWwsIExhCi0jIFJvY2hlZm91Y2F1bHQsIENoYW1wYWduZS1Nb3V0b24sIExhIFJvY2hlLVBvc2F5LCBMYSBIYXllLURlc2NhcnRlcywKKyMgTGUgQ29ycmUgd3JpdGVzIHRoYXQgdGhlIHVwcGVyIGxpbWl0IG9mIHRoZSBmcmVlIHpvbmUgd2FzIEFybsOpZ3V5LCBPcnRoZXosCisjIE1vbnQtZGUtTWFyc2FuLCBCYXphcywgTGFuZ29uLCBMYW1vdGhlLU1vbnRyYXZlbCwgTWFyxZN1aWwsIExhCisjIFJvY2hlZm91Y2F1bGQsIENoYW1wYWduZS1Nb3V0b24sIExhIFJvY2hlLVBvc2F5LCBMYSBIYXllLURlc2NhcnRlcywKICMgTG9jaGVzLCBNb250cmljaGFyZCwgVmllcnpvbiwgQm91cmdlcywgTW91bGlucywgRGlnb2luLAotIyBQYXJheS1sZS1Nb25pYWwsIE1vbnRjZWF1LWxlcy1NaW5lcywgQ2hhbG9ucy1zdXItU2FvbmUsIEFyYm9pcywKKyMgUGFyYXktbGUtTW9uaWFsLCBNb250Y2VhdS1sZXMtTWluZXMsIENoYWxvbi1zdXItU2HDtG5lLCBBcmJvaXMsCiAjIERvbGUsIE1vcmV6LCBTdC1DbGF1ZGUsIGFuZCBDb2xsb25nZXMgKEhhdXRlLVNhdm9pZSkuCiBSdWxlCUZyYW5jZQkxOTQxCW9ubHkJLQlNYXkJIDUJIDA6MDAJMjowMAlNICMgTWlkc3VtbWVyCiAjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhpcyB0cmFuc2l0aW9uIG9jY3VycmVkIGF0IE9jdCA2IDE6MDAsCiAjIGJ1dCBnbyB3aXRoIERlbmlzIEV4Y29mZmllciAoMTk5Ny0xMi0xMiksCi0jIHdobyBxdW90ZXMgdGhlIEVwaGVtZXJpZGVzIEFzdHJvbm9taXF1ZXMgZm9yIDE5OTggZnJvbSBCdXJlYXUgZGVzIExvbmdpdHVkZXMKKyMgd2hvIHF1b3RlcyB0aGUgRXBow6ltw6lyaWRlcyBhc3Ryb25vbWlxdWVzIGZvciAxOTk4IGZyb20gQnVyZWF1IGRlcyBMb25naXR1ZGVzCiAjIGFzIHNheWluZyA1LzEwLzQxIDIyaFVULgogUnVsZQlGcmFuY2UJMTk0MQlvbmx5CS0JT2N0CSA2CSAwOjAwCTE6MDAJUwogUnVsZQlGcmFuY2UJMTk0Mglvbmx5CS0JTWFyCSA5CSAwOjAwCTI6MDAJTQpAQCAtMTIxOCw3ICsxMjMwLDcgQEAKICMgb24gUE1ULTA6MDk6MjEgdW50aWwgMTk3OC0wOC0wOSwgd2hlbiB0aGUgdGltZSBiYXNlIGZpbmFsbHkgc3dpdGNoZWQgdG8gVVRDLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvUGFyaXMJMDowOToyMSAtCUxNVAkxODkxIE1hciAxNSAgMDowMQotCQkJMDowOToyMQktCVBNVAkxOTExIE1hciAxMSAgMDowMSAgIyBQYXJpcyBNVAorCQkJMDowOToyMQktCVBNVAkxOTExIE1hciAxMSAgMDowMSAjIFBhcmlzIE1UCiAjIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDE5NDAgSnVuIDE0IDA6MDA7IGdvIHdpdGggRXhjb2ZmaWVyIGFuZCBMZSBDb3JyZS4KIAkJCTA6MDAJRnJhbmNlCVdFJXNUCTE5NDAgSnVuIDE0IDIzOjAwCiAjIExlIENvcnJlIHNheXMgUGFyaXMgc3R1Y2sgd2l0aCBvY2N1cGllZC1GcmFuY2UgdGltZSBhZnRlciB0aGUgbGliZXJhdGlvbjsKQEAgLTEyMzUsMTUgKzEyNDcsMTMgQEAKICMgQnVuZGVzYW5zdGFsdCBjb250YWlucyBEU1QgaW5mb3JtYXRpb24gYmFjayB0byAxOTE2LgogIyBbU2VlIHR6LWxpbmsuaHRtIGZvciB0aGUgVVJMLl0KIAotIyBGcm9tIEpvZXJnIFNjaGlsbGluZyAoMjAwMi0xMC0yMyk6CisjIEZyb20gSsO2cmcgU2NoaWxsaW5nICgyMDAyLTEwLTIzKToKICMgSW4gMTk0NSwgQmVybGluIHdhcyBzd2l0Y2hlZCB0byBNb3Njb3cgU3VtbWVyIHRpbWUgKEdNVCs0KSBieQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRobS5kZS9sZW1vL2h0bWwvYmlvZ3JhZmllbi9CZXJzYXJpbk5pa29sYWkvIj4KLSMgR2VuZXJhbCBbTmlrb2xhaV0gQmVyc2FyaW48L2E+LgorIyBodHRwOi8vd3d3LmRobS5kZS9sZW1vL2h0bWwvYmlvZ3JhZmllbi9CZXJzYXJpbk5pa29sYWkvCisjIEdlbmVyYWwgW05pa29sYWldIEJlcnNhcmluLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDMtMDMtMDgpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBhcmxhbWVudC1iZXJsaW4uZGUvcGRzLWZyYWt0aW9uLm5zZi83Mjc0NTkxMjdjOGI2NmVlODUyNTY2MjMwMDQ1OTA5OS9kZWZjNzdjYjc4NGYxODBhYzEyNTZjMmIwMDMwMjc0Yi8kRklMRS9iZXJzYXJpbnQucGRmIj4KICMgaHR0cDovL3d3dy5wYXJsYW1lbnQtYmVybGluLmRlL3Bkcy1mcmFrdGlvbi5uc2YvNzI3NDU5MTI3YzhiNjZlZTg1MjU2NjIzMDA0NTkwOTkvZGVmYzc3Y2I3ODRmMTgwYWMxMjU2YzJiMDAzMDI3NGIvJEZJTEUvYmVyc2FyaW50LnBkZgotIyA8L2E+CiAjIHNheXMgdGhhdCBCZXJzYXJpbiBpc3N1ZWQgYW4gb3JkZXIgdG8gdXNlIE1vc2NvdyB0aW1lIG9uIE1heSAyMC4KICMgSG93ZXZlciwgTW9zY293IGRpZCBub3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgaW4gMTk0NSwgc28KICMgdGhpcyB3YXMgZXF1aXZhbGVudCB0byBDRU1UIChHTVQrMyksIG5vdCBHTVQrNC4KQEAgLTEyNjgsMjMgKzEyNzgsMjMgQEAKIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvQmVybGluCTA6NTM6MjggLQlMTVQJMTg5MyBBcHIKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBNYXkgMjQgMjowMAorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IE1heSAyNCAgMjowMAogCQkJMTowMCBTb3ZpZXRab25lCUNFJXNUCTE5NDYKIAkJCTE6MDAJR2VybWFueQlDRSVzVAkxOTgwCiAJCQkxOjAwCUVVCUNFJXNUCiAKICMgRnJvbSBUb2JpYXMgQ29ucmFkaSAoMjAxMS0wOS0xMik6Ci0jIEJ1c2luZ2VuIDxodHRwOi8vd3d3LmJ1ZXNpbmdlbi5kZT4sIHN1cnJvdW5kZWQgYnkgdGhlIFN3aXNzIGNhbnRvbgorIyBCw7xzaW5nZW4gPGh0dHA6Ly93d3cuYnVlc2luZ2VuLmRlPiwgc3Vycm91bmRlZCBieSB0aGUgU3dpc3MgY2FudG9uCiAjIFNjaGFmZmhhdXNlbiwgZGlkIG5vdCBzdGFydCBvYnNlcnZpbmcgRFNUIGluIDE5ODAgYXMgdGhlIHJlc3Qgb2YgREUKICMgKFdlc3QgR2VybWFueSBhdCB0aGF0IHRpbWUpIGFuZCBERCAoRWFzdCBHZXJtYW55IGF0IHRoYXQgdGltZSkgZGlkLgogIyBERCBtZXJnZWQgaW50byBERSwgdGhlIGFyZWEgaXMgY3VycmVudGx5IGNvdmVyZWQgYnkgY29kZSBERSBpbiBJU08gMzE2Ni0xLAogIyB3aGljaCBpbiB0dXJuIGlzIGNvdmVyZWQgYnkgdGhlIHpvbmUgRXVyb3BlL0Jlcmxpbi4KICMKLSMgU291cmNlIGZvciB0aGUgdGltZSBpbiBCdXNpbmdlbiAxOTgwOgorIyBTb3VyY2UgZm9yIHRoZSB0aW1lIGluIELDvHNpbmdlbiAxOTgwOgogIyBodHRwOi8vd3d3LnNyZi5jaC9wbGF5ZXIvdmlkZW8/aWQ9YzAxMmMwMjktMDNiNy00YzJiLTkxNjQtYWE1OTAyY2Q1OGQzCiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTItMDMtMDMpOgotIyBCdXNpbmdlbiBhbmQgWnVyaWNoIGhhdmUgc2hhcmVkIGNsb2NrcyBzaW5jZSAxOTcwLgorIyBCw7xzaW5nZW4gYW5kIFp1cmljaCBoYXZlIHNoYXJlZCBjbG9ja3Mgc2luY2UgMTk3MC4KIAogTGluawlFdXJvcGUvWnVyaWNoCUV1cm9wZS9CdXNpbmdlbgogCkBAIC0xMjk1LDggKzEzMDUsOCBAQAogCiAjIEdpYnJhbHRhcgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBFdXJvcGUvR2licmFsdGFyCS0wOjIxOjI0IC0JTE1UCTE4ODAgQXVnICAyIDA6MDBzCi0JCQkwOjAwCUdCLUVpcmUJJXMJMTk1NyBBcHIgMTQgMjowMAorWm9uZSBFdXJvcGUvR2licmFsdGFyCS0wOjIxOjI0IC0JTE1UCTE4ODAgQXVnICAyICAwOjAwcworCQkJMDowMAlHQi1FaXJlCSVzCTE5NTcgQXByIDE0ICAyOjAwCiAJCQkxOjAwCS0JQ0VUCTE5ODIKIAkJCTE6MDAJRVUJQ0Ulc1QKIApAQCAtMTMyNyw3ICsxMzM3LDcgQEAKIFJ1bGUJR3JlZWNlCTE5ODAJb25seQktCVNlcAkyOAkwOjAwCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvQXRoZW5zCTE6MzQ6NTIgLQlMTVQJMTg5NSBTZXAgMTQKLQkJCTE6MzQ6NTIJLQlBTVQJMTkxNiBKdWwgMjggMDowMSAgICAgIyBBdGhlbnMgTVQKKwkJCTE6MzQ6NTIJLQlBTVQJMTkxNiBKdWwgMjggIDA6MDEgIyBBdGhlbnMgTVQKIAkJCTI6MDAJR3JlZWNlCUVFJXNUCTE5NDEgQXByIDMwCiAJCQkxOjAwCUdyZWVjZQlDRSVzVAkxOTQ0IEFwciAgNAogCQkJMjowMAlHcmVlY2UJRUUlc1QJMTk4MQpAQCAtMTMzNiwxNSArMTM0NiwyMCBAQAogCQkJMjowMAlFVQlFRSVzVAogCiAjIEh1bmdhcnkKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0xNSk6CisjIERhdGVzIGZvciAxOTE2LTE5NDUgYXJlIHRha2VuIGZyb206CisjIE9yb3NzIEEuIEplbGVuIGEgbcO6bHQgasO2dsWRamU6IGEgbnnDoXJpIGlkxZFzesOhbcOtdMOhcyBNYWd5YXJvcnN6w6Fnb24gMTkxNi0xOTQ1LgorIyBOYXRpb25hbCBBcmNoaXZlcyBvZiBIdW5nYXJ5ICgyMDEyLTEwLTI5KS4KKyMgaHR0cDovL21ubC5nb3YuaHUvYV9oZXRfZG9rdW1lbnR1bWEvYV9ueWFyaV9pZG9zemFtaXRhc19tYWd5YXJvcnN6YWdvbl8xOTE2MTk0NS5odG1sCisjIFRoaXMgc291cmNlIGRvZXMgbm90IGFsd2F5cyBnaXZlIHRpbWVzLCB3aGljaCBhcmUgdGFrZW4gZnJvbSBTaGFua3MKKyMgJiBQb3R0ZW5nZXIgKHdoaWNoIGRpc2FncmVlIGFib3V0IHRoZSBkYXRlcykuCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlIdW5nYXJ5CTE5MTgJb25seQktCUFwcgkgMQkgMzowMAkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTE4CW9ubHkJLQlTZXAJMjkJIDM6MDAJMAktCitSdWxlCUh1bmdhcnkJMTkxOAlvbmx5CS0JU2VwCTE2CSAzOjAwCTAJLQogUnVsZQlIdW5nYXJ5CTE5MTkJb25seQktCUFwcgkxNQkgMzowMAkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTE5CW9ubHkJLQlTZXAJMTUJIDM6MDAJMAktCi1SdWxlCUh1bmdhcnkJMTkyMAlvbmx5CS0JQXByCSA1CSAzOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5MjAJb25seQktCVNlcAkzMAkgMzowMAkwCS0KK1J1bGUJSHVuZ2FyeQkxOTE5CW9ubHkJLQlOb3YJMjQJIDM6MDAJMAktCiBSdWxlCUh1bmdhcnkJMTk0NQlvbmx5CS0JTWF5CSAxCTIzOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5NDUJb25seQktCU5vdgkgMwkgMDowMAkwCS0KK1J1bGUJSHVuZ2FyeQkxOTQ1CW9ubHkJLQlOb3YJIDEJIDA6MDAJMAktCiBSdWxlCUh1bmdhcnkJMTk0Nglvbmx5CS0JTWFyCTMxCSAyOjAwcwkxOjAwCVMKIFJ1bGUJSHVuZ2FyeQkxOTQ2CTE5NDkJLQlPY3QJU3VuPj0xCSAyOjAwcwkwCS0KIFJ1bGUJSHVuZ2FyeQkxOTQ3CTE5NDkJLQlBcHIJU3VuPj00CSAyOjAwcwkxOjAwCVMKQEAgLTEzNjAsNyArMTM3NSw3IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9CdWRhcGVzdAkxOjE2OjIwIC0JTE1UCTE4OTAgT2N0CiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5MTgKLQkJCTE6MDAJSHVuZ2FyeQlDRSVzVAkxOTQxIEFwciAgNiAgMjowMAorCQkJMTowMAlIdW5nYXJ5CUNFJXNUCTE5NDEgQXByICA4CiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUKIAkJCTE6MDAJSHVuZ2FyeQlDRSVzVAkxOTgwIFNlcCAyOCAgMjowMHMKIAkJCTE6MDAJRVUJQ0Ulc1QKQEAgLTE0MjMsNyArMTQzOCw3IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEF0bGFudGljL1JleWtqYXZpawktMToyNzoyNCAtCUxNVAkxODM3CiAJCQktMToyNzo0OCAtCVJNVAkxOTA4ICMgUmV5a2phdmlrIE1lYW4gVGltZT8KLQkJCS0xOjAwCUljZWxhbmQJSVMlc1QJMTk2OCBBcHIgNyAxOjAwcworCQkJLTE6MDAJSWNlbGFuZAlJUyVzVAkxOTY4IEFwciAgNyAgMTowMHMKIAkJCSAwOjAwCS0JR01UCiAKICMgSXRhbHkKQEAgLTE0MzgsOSArMTQ1Myw4IEBACiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgogIyBGb3IgSXRhbGlhbiBEU1Qgd2UgaGF2ZSB0aHJlZSBzb3VyY2VzOiBTaGFua3MgJiBQb3R0ZW5nZXIsIFdoaXRtYW4sIGFuZAogIyBGLiBQb2xsYXN0cmkKLSMgPGEgaHJlZj0iaHR0cDovL3RvaS5pcml0aS5jbnIuaXQvdWsvaWVuaXRsdC5odG1sIj4KICMgRGF5LWxpZ2h0IFNhdmluZyBUaW1lIGluIEl0YWx5ICgyMDA2LTAyLTAzKQotIyA8L2E+CisjIGh0dHA6Ly90b2kuaXJpdGkuY25yLml0L3VrL2llbml0bHQuaHRtbAogIyAoJ0ZQJyBiZWxvdyksIHRha2VuIGZyb20gYW4gSXRhbGlhbiBOYXRpb25hbCBFbGVjdHJvdGVjaG5pY2FsIEluc3RpdHV0ZQogIyBwdWJsaWNhdGlvbi4gV2hlbiB0aGUgdGhyZWUgc291cmNlcyBkaXNhZ3JlZSwgZ3Vlc3Mgd2hvJ3MgcmlnaHQsIGFzIGZvbGxvd3M6CiAjCkBAIC0xNTAwLDggKzE1MTQsOCBAQAogUnVsZQlJdGFseQkxOTc5CW9ubHkJLQlTZXAJMzAJMDowMHMJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9Sb21lCTA6NDk6NTYgLQlMTVQJMTg2NiBTZXAgMjIKLQkJCTA6NDk6NTYJLQlSTVQJMTg5MyBOb3YgIDEgMDowMHMgIyBSb21lIE1lYW4KLQkJCTE6MDAJSXRhbHkJQ0Ulc1QJMTk0MiBOb3YgIDIgMjowMHMKKwkJCTA6NDk6NTYJLQlSTVQJMTg5MyBOb3YgIDEgIDA6MDBzICMgUm9tZSBNZWFuCisJCQkxOjAwCUl0YWx5CUNFJXNUCTE5NDIgTm92ICAyICAyOjAwcwogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEp1bAogCQkJMTowMAlJdGFseQlDRSVzVAkxOTgwCiAJCQkxOjAwCUVVCUNFJXNUCkBAIC0xNTQ4LDE4ICsxNTYyLDE4IEBACiAKICMgRnJvbSBBbmRyZWkgSXZhbm92ICgyMDAwLTAzLTA2KToKICMgVGhpcyB5ZWFyIExhdHZpYSB3aWxsIG5vdCBzd2l0Y2ggdG8gRGF5bGlnaHQgU2F2aW5ncyBUaW1lIChhcyBzcGVjaWZpZWQgaW4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sdi1sYWlrcy5sdi93d3dyYWtzdGkvMjAwMC8wNzEwNzIvdmQ0Lmh0bSI+CiAjIFRoZSBSZWd1bGF0aW9ucyBvZiB0aGUgQ2FiaW5ldCBvZiBNaW5pc3RlcnMgb2YgdGhlIFJlcC4gb2YgTGF0dmlhIG9mCi0jIDI5LUZlYi0yMDAwICgjNzkpPC9hPiwgaW4gTGF0dmlhbiBmb3Igc3Vic2NyaWJlcnMgb25seSkuCisjIDI5LUZlYi0yMDAwICgjNzkpIDxodHRwOi8vd3d3Lmx2LWxhaWtzLmx2L3d3d3Jha3N0aS8yMDAwLzA3MTA3Mi92ZDQuaHRtPiwKKyMgaW4gTGF0dmlhbiBmb3Igc3Vic2NyaWJlcnMgb25seSkuCiAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5yZmVybC5vcmcvbmV3c2xpbmUvMjAwMS8wMS8zLUNFRS9jZWUtMDMwMTAxLmh0bWwiPgotIyBGcm9tIFJGRS9STCBOZXdzbGluZSAoMjAwMS0wMS0wMyksIG5vdGVkIGFmdGVyIGEgaGVhZHMtdXAgYnkgUml2ZXMgTWNEb3c6Ci0jIDwvYT4KKyMgRnJvbSBSRkUvUkwgTmV3c2xpbmUKKyMgaHR0cDovL3d3dy5yZmVybC5vcmcvbmV3c2xpbmUvMjAwMS8wMS8zLUNFRS9jZWUtMDMwMTAxLmh0bWwKKyMgKDIwMDEtMDEtMDMpLCBub3RlZCBhZnRlciBhIGhlYWRzLXVwIGJ5IFJpdmVzIE1jRG93OgogIyBUaGUgTGF0dmlhbiBnb3Zlcm5tZW50IG9uIDIgSmFudWFyeSBkZWNpZGVkIHRoYXQgdGhlIGNvdW50cnkgd2lsbAogIyBpbnN0aXR1dGUgZGF5bGlnaHQtc2F2aW5nIHRpbWUgdGhpcyBzcHJpbmcsIExFVEEgcmVwb3J0ZWQuCiAjIExhc3QgRmVicnVhcnkgdGhlIHRocmVlIEJhbHRpYyBzdGF0ZXMgZGVjaWRlZCBub3QgdG8gdHVybiBiYWNrIHRoZWlyCiAjIGNsb2NrcyBvbmUgaG91ciBpbiB0aGUgc3ByaW5nLi4uLgotIyBNaW5pc3RlciBvZiBFY29ub215IEFpZ2FycyBLYWx2aXRpcyBub3RlZCB0aGF0IExhdHZpYSBoYWQgdG9vIGZldworIyBNaW5pc3RlciBvZiBFY29ub215IEFpZ2FycyBLYWx2xKt0aXMgbm90ZWQgdGhhdCBMYXR2aWEgaGFkIHRvbyBmZXcKICMgZGF5bGlnaHQgaG91cnMgYW5kIHRodXMgZGVjaWRlZCB0byBjb21wbHkgd2l0aCBhIGRyYWZ0IEV1cm9wZWFuCiAjIENvbW1pc3Npb24gZGlyZWN0aXZlIHRoYXQgcHJvdmlkZXMgZm9yIGluc3RpdHV0aW5nIGRheWxpZ2h0LXNhdmluZwogIyB0aW1lIGluIEVVIGNvdW50cmllcyBiZXR3ZWVuIDIwMDIgYW5kIDIwMDYuIFRoZSBMYXR2aWFuIGdvdmVybm1lbnQKQEAgLTE1NjksMTggKzE1ODMsMjMgQEAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCUxhdHZpYQkxOTg5CTE5OTYJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCiBSdWxlCUxhdHZpYQkxOTg5CTE5OTYJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCisKKyMgTWlsbmUgMTg5OSBzYXlzIFJpZ2Egd2FzIDE6MzY6MjggKFBvbHl0ZWNobmlxdWUgSG91c2UgdGltZSkuCisjIEJ5YWxva296IDE5MTkgc2F5cyBMYXR2aWEgd2FzIDE6MzY6MzQuCisjIEdvIHdpdGggQnlhbG9rb3ouCisKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1JpZ2EJMTozNjoyNAktCUxNVAkxODgwCi0JCQkxOjM2OjI0CS0JUk1UCTE5MTggQXByIDE1IDI6MDAgI1JpZ2EgTWVhbiBUaW1lCi0JCQkxOjM2OjI0CTE6MDAJTFNUCTE5MTggU2VwIDE2IDM6MDAgI0xhdHZpYW4gU3VtbWVyCi0JCQkxOjM2OjI0CS0JUk1UCTE5MTkgQXByICAxIDI6MDAKLQkJCTE6MzY6MjQJMTowMAlMU1QJMTkxOSBNYXkgMjIgMzowMAotCQkJMTozNjoyNAktCVJNVAkxOTI2IE1heSAxMQorWm9uZQlFdXJvcGUvUmlnYQkxOjM2OjM0CS0JTE1UCTE4ODAKKwkJCTE6MzY6MzQJLQlSTVQJMTkxOCBBcHIgMTUgIDI6MDAgIyBSaWdhIE1UCisJCQkxOjM2OjM0CTE6MDAJTFNUCTE5MTggU2VwIDE2ICAzOjAwICMgTGF0dmlhbiBTVAorCQkJMTozNjozNAktCVJNVAkxOTE5IEFwciAgMSAgMjowMAorCQkJMTozNjozNAkxOjAwCUxTVAkxOTE5IE1heSAyMiAgMzowMAorCQkJMTozNjozNAktCVJNVAkxOTI2IE1heSAxMQogCQkJMjowMAktCUVFVAkxOTQwIEF1ZyAgNQogCQkJMzowMAktCU1TSwkxOTQxIEp1bAogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IE9jdCAxMwotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTg5IE1hciBsYXN0U3VuIDI6MDBzCi0JCQkyOjAwCTE6MDAJRUVTVAkxOTg5IFNlcCBsYXN0U3VuIDI6MDBzCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5ODkgTWFyIGxhc3RTdW4gIDI6MDBzCisJCQkyOjAwCTE6MDAJRUVTVAkxOTg5IFNlcCBsYXN0U3VuICAyOjAwcwogCQkJMjowMAlMYXR2aWEJRUUlc1QJMTk5NyBKYW4gMjEKIAkJCTI6MDAJRVUJRUUlc1QJMjAwMCBGZWIgMjkKIAkJCTI6MDAJLQlFRVQJMjAwMSBKYW4gIDIKQEAgLTE2MTQsNyArMTYzMyw3IEBACiAjIEkgd291bGQgbGlrZSB0byBpbmZvcm0gdGhhdCBpbiB0aGlzIHllYXIgTGl0aHVhbmlhbiB0aW1lIHpvbmUKICMgKEV1cm9wZS9WaWxuaXVzKSB3YXMgY2hhbmdlZC4KIAotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWx0YS5sdC8iPkVMVEE8L2E+IE5vLiA5NzIgKDI1ODIpICgxOTk5LTA5LTI5KSwKKyMgRnJvbSBFTFRBIE5vLiA5NzIgKDI1ODIpICgxOTk5LTA5LTI5KSA8aHR0cDovL3d3dy5lbHRhLmx0Lz4sCiAjIHZpYSBTdGVmZmVuIFRob3JzZW46CiAjIExpdGh1YW5pYSBoYXMgc2hpZnRlZCBiYWNrIHRvIHRoZSBzZWNvbmQgdGltZSB6b25lIChHTVQgcGx1cyB0d28gaG91cnMpCiAjIHRvIGJlIHZhbGlkIGhlcmUgc3RhcnRpbmcgZnJvbSBPY3RvYmVyIDMxLApAQCAtMTYyMyw5ICsxNjQyLDkgQEAKICMgbW90aW9uIHRvIGdpdmUgdXAgc2hpZnRpbmcgdG8gc3VtbWVyIHRpbWUgaW4gc3ByaW5nLCBhcyBpdCB3YXMKICMgYWxyZWFkeSBkb25lIGJ5IEVzdG9uaWEuCiAKLSMgRnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy50b3VyaXNtLmx0L2luZm9ybWEvZmYuaHRtIj4KLSMgRmFjdCBGaWxlLCBMaXRodWFuaWFuIFN0YXRlIERlcGFydG1lbnQgb2YgVG91cmlzbQotIyA8L2E+ICgyMDAwLTAzLTI3KTogTG9jYWwgdGltZSBpcyBHTVQrMiBob3VycyAuLi4sIG5vIGRheWxpZ2h0IHNhdmluZy4KKyMgRnJvbSB0aGUgRmFjdCBGaWxlLCBMaXRodWFuaWFuIFN0YXRlIERlcGFydG1lbnQgb2YgVG91cmlzbQorIyA8aHR0cDovL3d3dy50b3VyaXNtLmx0L2luZm9ybWEvZmYuaHRtPiAoMjAwMC0wMy0yNyk6CisjIExvY2FsIHRpbWUgaXMgR01UKzIgaG91cnMgLi4uLCBubyBkYXlsaWdodCBzYXZpbmcuCiAKICMgRnJvbSBhIHVzZXIgdmlhIEtsYXVzIE1hcnRlbiAoMjAwMy0wMi0wNyk6CiAjIEFzIGEgY2FuZGlkYXRlIGZvciBtZW1iZXJzaGlwIG9mIHRoZSBFdXJvcGVhbiBVbmlvbiwgTGl0aHVhbmlhIHdpbGwKQEAgLTE2MzgsMTggKzE2NTcsMTggQEAKIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvVmlsbml1cwkxOjQxOjE2CS0JTE1UCTE4ODAKLQkJCTE6MjQ6MDAJLQlXTVQJMTkxNwkgICAgIyBXYXJzYXcgTWVhbiBUaW1lCisJCQkxOjI0OjAwCS0JV01UCTE5MTcgICAgICAgICMgV2Fyc2F3IE1lYW4gVGltZQogCQkJMTozNTozNgktCUtNVAkxOTE5IE9jdCAxMCAjIEthdW5hcyBNZWFuIFRpbWUKIAkJCTE6MDAJLQlDRVQJMTkyMCBKdWwgMTIKIAkJCTI6MDAJLQlFRVQJMTkyMCBPY3QgIDkKIAkJCTE6MDAJLQlDRVQJMTk0MCBBdWcgIDMKIAkJCTM6MDAJLQlNU0sJMTk0MSBKdW4gMjQKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBBdWcKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTI6MDAJMTowMAlFRVNUCTE5OTEgU2VwIDI5IDI6MDBzCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTEgTWFyIDMxICAyOjAwcworCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgIDI6MDBzCiAJCQkyOjAwCUMtRXVyCUVFJXNUCTE5OTgKLQkJCTI6MDAJLQlFRVQJMTk5OCBNYXIgMjkgMTowMHUKLQkJCTE6MDAJRVUJQ0Ulc1QJMTk5OSBPY3QgMzEgMTowMHUKKwkJCTI6MDAJLQlFRVQJMTk5OCBNYXIgMjkgIDE6MDB1CisJCQkxOjAwCUVVCUNFJXNUCTE5OTkgT2N0IDMxICAxOjAwdQogCQkJMjowMAktCUVFVAkyMDAzIEphbiAgMQogCQkJMjowMAlFVQlFRSVzVAogCkBAIC0xNjgzLDkgKzE3MDIsOSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBFdXJvcGUvTHV4ZW1ib3VyZwkwOjI0OjM2IC0JTE1UCTE5MDQgSnVuCiAJCQkxOjAwCUx1eAlDRSVzVAkxOTE4IE5vdiAyNQotCQkJMDowMAlMdXgJV0Ulc1QJMTkyOSBPY3QgIDYgMjowMHMKLQkJCTA6MDAJQmVsZ2l1bQlXRSVzVAkxOTQwIE1heSAxNCAzOjAwCi0JCQkxOjAwCUMtRXVyCVdFJXNUCTE5NDQgU2VwIDE4IDM6MDAKKwkJCTA6MDAJTHV4CVdFJXNUCTE5MjkgT2N0ICA2ICAyOjAwcworCQkJMDowMAlCZWxnaXVtCVdFJXNUCTE5NDAgTWF5IDE0ICAzOjAwCisJCQkxOjAwCUMtRXVyCVdFJXNUCTE5NDQgU2VwIDE4ICAzOjAwCiAJCQkxOjAwCUJlbGdpdW0JQ0Ulc1QJMTk3NwogCQkJMTowMAlFVQlDRSVzVAogCkBAIC0xNzAyLDkgKzE3MjEsOSBAQAogUnVsZQlNYWx0YQkxOTc1CTE5ODAJLQlTZXAJU3VuPj0xNQkyOjAwCTAJLQogUnVsZQlNYWx0YQkxOTgwCW9ubHkJLQlNYXIJMzEJMjowMAkxOjAwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL01hbHRhCTA6NTg6MDQgLQlMTVQJMTg5MyBOb3YgIDIgMDowMHMgIyBWYWxsZXR0YQotCQkJMTowMAlJdGFseQlDRSVzVAkxOTQyIE5vdiAgMiAyOjAwcwotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAyOjAwcworWm9uZQlFdXJvcGUvTWFsdGEJMDo1ODowNCAtCUxNVAkxODkzIE5vdiAgMiAgMDowMHMgIyBWYWxsZXR0YQorCQkJMTowMAlJdGFseQlDRSVzVAkxOTQyIE5vdiAgMiAgMjowMHMKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgIDI6MDBzCiAJCQkxOjAwCUl0YWx5CUNFJXNUCTE5NzMgTWFyIDMxCiAJCQkxOjAwCU1hbHRhCUNFJXNUCTE5ODEKIAkJCTE6MDAJRVUJQ0Ulc1QKQEAgLTE3MTksNyArMTczOCw3IEBACiAjIEluIGVhcmx5IDE5OTIgdGhlcmUgd2FzIGxhcmdlLXNjYWxlIGludGVyZXRobmljIHZpb2xlbmNlIGluIHRoZSBhcmVhCiAjIGFuZCBpdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBSdXNzb3Bob25lcyBjb250aW51ZWQgdG8gb2JzZXJ2ZSBNb3Njb3cgdGltZS4KICMgQnV0IFt0d28gcGVvcGxlXSBzZXBhcmF0ZWx5IHJlcG9ydGVkIHZpYQotIyBKZXNwZXIgTm9yZ2FhcmQgdGhhdCBhcyBvZiAyMDAxLTAxLTI0IFRpcmFzcG9sIHdhcyBsaWtlIENoaXNpbmF1LgorIyBKZXNwZXIgTsO4cmdhYXJkIHRoYXQgYXMgb2YgMjAwMS0wMS0yNCBUaXJhc3BvbCB3YXMgbGlrZSBDaGlzaW5hdS4KICMgVGhlIFRpcmFzcG9sIGVudHJ5IGhhcyB0aGVyZWZvcmUgYmVlbiByZW1vdmVkIGZvciBub3cuCiAjCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDExLTEwLTE3KToKQEAgLTE3MjgsMTMgKzE3NDcsOCBAQAogIyB0byB0aGUgV2ludGVyIFRpbWUpLgogIwogIyBOZXdzIChpbiBSdXNzaWFuKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5reWl2cG9zdC51YS9ydXNzaWEvbmV3cy9wcmlkbmVzdHJvdmUtb3RrYXphbG9zLW90LXBlcmVob2RhLW5hLXppbW5lZS12cmVteWEtMzA5NTQuaHRtbCI+CiAjIGh0dHA6Ly93d3cua3lpdnBvc3QudWEvcnVzc2lhL25ld3MvcHJpZG5lc3Ryb3ZlLW90a2F6YWxvcy1vdC1wZXJlaG9kYS1uYS16aW1uZWUtdnJlbXlhLTMwOTU0Lmh0bWwKLSMgPC9hPgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFsbG1vbGRvdmEuY29tL21vbGRvdmEtbmV3cy8xMjQ5MDY0MTE2Lmh0bWwiPgogIyBodHRwOi8vd3d3LmFsbG1vbGRvdmEuY29tL21vbGRvdmEtbmV3cy8xMjQ5MDY0MTE2Lmh0bWwKLSMgPC9hPgogIwogIyBUaGUgc3Vic3RhbmNlIG9mIHRoaXMgY2hhbmdlIChyZWluc3RhdGVtZW50IG9mIHRoZSBUaXJhc3BvbCBlbnRyeSkKICMgaXMgZnJvbSBhIHBhdGNoIGZyb20gUGV0ciBNYWNoYXRhICgyMDExLTEwLTE3KQpAQCAtMTc1Miw5ICsxNzY2LDcgQEAKICMgRm9sbG93aW5nIE1vbGRvdmEgYW5kIG5laWdoYm9yaW5nIFVrcmFpbmUtIFRyYW5zbmlzdHJpYSAoUHJpZG5lc3Ryb3ZpZSktCiAjIFRpcmFzcG9sIHdpbGwgZ28gYmFjayB0byB3aW50ZXIgdGltZSBvbiBPY3RvYmVyIDMwLCAyMDExLgogIyBOZXdzIGZyb20gTW9sZG92YSAoaW4gcnVzc2lhbik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9ydS5wdWJsaWthLm1kL2xpbmtfMzE3MDYxLmh0bWwiPgogIyBodHRwOi8vcnUucHVibGlrYS5tZC9saW5rXzMxNzA2MS5odG1sCi0jIDwvYT4KIAogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC0xNzc3LDggKzE3ODksOCBAQAogIyBtb3JlIHByZWNpc2UgMDowOToyMS4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL01vbmFjbwkwOjI5OjMyIC0JTE1UCTE4OTEgTWFyIDE1Ci0JCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAgICMgUGFyaXMgTWVhbiBUaW1lCi0JCQkwOjAwCUZyYW5jZQlXRSVzVAkxOTQ1IFNlcCAxNiAzOjAwCisJCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICMgUGFyaXMgTWVhbiBUaW1lCisJCQkwOjAwCUZyYW5jZQlXRSVzVAkxOTQ1IFNlcCAxNiAgMzowMAogCQkJMTowMAlGcmFuY2UJQ0Ulc1QJMTk3NwogCQkJMTowMAlFVQlDRSVzVAogCkBAIC0xODIyLDggKzE4MzQsOCBAQAogIyB3YXMgbm90IHVudGlsIDE4NjYgd2hlbiB0aGV5IHdlcmUgYWxsIHJlcXVpcmVkIGJ5IGxhdyB0byBvYnNlcnZlCiAjIEFtc3RlcmRhbSBtZWFuIHRpbWUuCiAKLSMgVGhlIGRhdGEgYmVmb3JlIDE5NDUgYXJlIHRha2VuIGZyb20KLSMgPGh0dHA6Ly93d3cucGh5cy51dS5ubC9+dmdlbnQvd2V0dGlqZC93ZXR0aWpkLmh0bT4uCisjIFRoZSBkYXRhIGVudHJpZXMgYmVmb3JlIDE5NDUgYXJlIHRha2VuIGZyb20KKyMgaHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC93ZXR0aWpkL3dldHRpamQuaHRtCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCU5ldGgJMTkxNglvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlOU1QJIyBOZXRoZXJsYW5kcyBTdW1tZXIgVGltZQpAQCAtMTg1NCw4ICsxODY2LDggQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgRXVyb3BlL0Ftc3RlcmRhbQkwOjE5OjMyIC0JTE1UCTE4MzUKIAkJCTA6MTk6MzIJTmV0aAklcwkxOTM3IEp1bCAgMQotCQkJMDoyMAlOZXRoCU5FJXNUCTE5NDAgTWF5IDE2IDA6MDAgIyBEdXRjaCBUaW1lCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyIDI6MDAKKwkJCTA6MjAJTmV0aAlORSVzVAkxOTQwIE1heSAxNiAgMDowMCAjIER1dGNoIFRpbWUKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgIDI6MDAKIAkJCTE6MDAJTmV0aAlDRSVzVAkxOTc3CiAJCQkxOjAwCUVVCUNFJXNUCiAKQEAgLTE4ODUsMTQgKzE4OTcsMTQgQEAKICMgdGltZSB0aGV5IHdlcmUgZGVjbGFyZWQgYXMgcGFydHMgb2YgTm9yd2F5LiAgU3ZhbGJhcmQgd2FzIGRlY2xhcmVkCiAjIGFzIGEgcGFydCBvZiBOb3J3YXkgYnkgbGF3IG9mIDE5MjUtMDctMTcgbm8gMTEsIHNlY3Rpb24gNCBhbmQgSmFuCiAjIE1heWVuIGJ5IGxhdyBvZiAxOTMwLTAyLTI3IG5vIDIsIHNlY3Rpb24gMi4gKEZyb20KLSMgaHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xOTI1MDcxNy0wMTEuaHRtbCBhbmQKLSMgaHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xOTMwMDIyNy0wMDIuaHRtbCkuICBUaGUgbGF3L3JlZ3VsYXRpb24KKyMgPGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTkyNTA3MTctMDExLmh0bWw+IGFuZAorIyA8aHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xOTMwMDIyNy0wMDIuaHRtbD4pLiAgVGhlIGxhdy9yZWd1bGF0aW9uCiAjIGZvciBub3JtYWwvc3RhbmRhcmQgdGltZSBpbiBOb3J3YXkgaXMgZnJvbSAxODk0LTA2LTI5IG5vIDEgKGNhbWUKICMgaW50byBvcGVyYXRpb24gb24gMTg5NS0wMS0wMSkgYW5kIFN2YWxiYXJkL0phbiBNYXllbiBzZWVtIHRvIGJlIGEKICMgcGFydCBvZiB0aGlzIGxhdyBzaW5jZSAxOTI1LzE5MzAuIChGcm9tCi0jIGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTg5NDA2MjktMDAxLmh0bWwgKSBJIGhhdmUgbm90IGJlZW4KKyMgPGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTg5NDA2MjktMDAxLmh0bWw+KSBJIGhhdmUgbm90IGJlZW4KICMgYWJsZSB0byBmaW5kIGlmIEphbiBNYXllbiB1c2VkIGEgZGlmZmVyZW50IHRpbWUgem9uZSAoZS5nLiAtMDEwMCkKLSMgYmVmb3JlIDE5MzAuIEphbiBNYXllbiBoYXMgb25seSBiZWVuICJpbmhhYml0YXRlZCIgc2luY2UgMTkyMSBieQorIyBiZWZvcmUgMTkzMC4gSmFuIE1heWVuIGhhcyBvbmx5IGJlZW4gImluaGFiaXRlZCIgc2luY2UgMTkyMSBieQogIyBOb3J3ZWdpYW4gbWV0ZW9yb2xvZ2lzdHMgYW5kIG1heWJlIHVzZWQgdGhlIHNhbWUgdGltZSBhcyBOb3J3YXkgZXZlcgogIyBzaW5jZSAxOTIxLiAgU3ZhbGJhcmQgKEFyY3RpYy9Mb25neWVhcmJ5ZW4pIGhhcyBiZWVuIGluaGFiaXRlZCBzaW5jZQogIyBiZWZvcmUgMTg5NSwgYW5kIHRoZXJlZm9yZSBwcm9iYWJseSBjaGFuZ2VkIHRoZSBsb2NhbCB0aW1lIHNvbWV3aGVyZQpAQCAtMTkwNyw3ICsxOTE5LDcgQEAKICMgPGh0dHA6Ly9ob21lLm5vLm5ldC9qYW5tYXllbi9oaXN0b3J5Lmh0bT4gc2F5cyB0aGF0IHRoZSBtZXRlb3JvbG9naXN0cwogIyBidXJuZWQgZG93biB0aGVpciBzdGF0aW9uIGluIDE5NDAgYW5kIGxlZnQgdGhlIGlzbGFuZCwgYnV0IHJldHVybmVkIGluCiAjIDE5NDEgd2l0aCBhIHNtYWxsIE5vcndlZ2lhbiBnYXJyaXNvbiBhbmQgY29udGludWVkIG9wZXJhdGlvbnMgZGVzcGl0ZQotIyBmcmVxdWVudCBhaXIgdHRhY2tzIGZyb20gR2VybWFucy4gIEluIDE5NDMgdGhlIEFtZXJpY2FucyBlc3RhYmxpc2hlZCBhCisjIGZyZXF1ZW50IGFpciBhdHRhY2tzIGZyb20gR2VybWFucy4gIEluIDE5NDMgdGhlIEFtZXJpY2FucyBlc3RhYmxpc2hlZCBhCiAjIHJhZGlvbG9jYXRpbmcgc3RhdGlvbiBvbiB0aGUgaXNsYW5kLCBjYWxsZWQgIkF0bGFudGljIENpdHkiLiAgUG9zc2libHkKICMgdGhlIFVUIG9mZnNldCBjaGFuZ2VkIGR1cmluZyB0aGUgd2FyLCBidXQgSSB0aGluayBpdCB1bmxpa2VseSB0aGF0CiAjIEphbiBNYXllbiB1c2VkIEdlcm1hbiBkYXlsaWdodC1zYXZpbmcgcnVsZXMuCkBAIC0xOTE4LDcgKzE5MzAsNyBAQAogIyA8aHR0cDovL3d3dy5zdmFsYmFyZC5jb20vU3ZhbGJhcmRGQVEuaHRtbD4gc2F5cyB0aGF0IHRoZSBHZXJtYW5zIHdlcmUKICMgZXhwZWxsZWQgb24gMTk0Mi0wNS0xNC4gIEhvd2V2ZXIsIHNtYWxsIHBhcnRpZXMgb2YgR2VybWFucyBkaWQgcmV0dXJuLAogIyBhbmQgYWNjb3JkaW5nIHRvIFdpbGhlbG0gRGVnZSdzIGJvb2sgIldhciBOb3J0aCBvZiA4MCIgKDE5NTQpCi0jIDxodHRwOi8vd3d3LnVjYWxnYXJ5LmNhL1VvZkMvZGVwYXJ0bWVudHMvVVAvMS01NTIzOC8xLTU1MjM4LTExMC0yLmh0bWw+CisjIGh0dHA6Ly93d3cudWNhbGdhcnkuY2EvVW9mQy9kZXBhcnRtZW50cy9VUC8xLTU1MjM4LzEtNTUyMzgtMTEwLTIuaHRtbAogIyB0aGUgR2VybWFuIGFybWVkIGZvcmNlcyBhdCB0aGUgU3ZhbGJhcmQgd2VhdGhlciBzdGF0aW9uIGNvZGUtbmFtZWQKICMgSGF1ZGVnZW4gZGlkIG5vdCBzdXJyZW5kZXIgdG8gdGhlIEFsbGllcyB1bnRpbCBTZXB0ZW1iZXIgMTk0NS4KICMKQEAgLTE5MjcsNiArMTkzOSwxMCBAQAogTGluawlFdXJvcGUvT3NsbwlBcmN0aWMvTG9uZ3llYXJieWVuCiAKICMgUG9sYW5kCisKKyMgVGhlIDE5MTkgZGF0ZXMgYW5kIHRpbWVzIGNhbiBiZSBmb3VuZCBpbiBUeWdvZG5payBVcnrEmWRvd3kgbnIgMSAoMTkxOS0wMy0yMCksCisjIDxodHRwOi8vd3d3LndiYy5wb3puYW4ucGwvcHVibGljYXRpb24vMzIxNTY+IHBwIDEtMi4KKwogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIFJ1bGUJUG9sYW5kCTE5MTgJMTkxOQktCVNlcAkxNgkyOjAwcwkwCS0KIFJ1bGUJUG9sYW5kCTE5MTkJb25seQktCUFwcgkxNQkyOjAwcwkxOjAwCVMKQEAgLTE5MzcsOSArMTk1Myw5IEBACiBSdWxlCVBvbGFuZAkxOTQ1CW9ubHkJLQlBcHIJMjkJMDowMAkxOjAwCVMKIFJ1bGUJUG9sYW5kCTE5NDUJb25seQktCU5vdgkgMQkwOjAwCTAJLQogIyBGb3IgMTk0NiBvbiB0aGUgc291cmNlIGlzIEthemltaWVyeiBCb3Jrb3dza2ksCi0jIFRvcnVuIENlbnRlciBmb3IgQXN0cm9ub215LCBEZXB0LiBvZiBSYWRpbyBBc3Ryb25vbXksIE5pY29sYXVzIENvcGVybmljdXMgVS4sCi0jIDxodHRwOi8vd3d3LmFzdHJvLnVuaS50b3J1bi5wbC9+a2IvQXJ0eWt1bHkvVS1QQS9DemFzMi5odG0jdHRoX3RBYjE+Ci0jIFRoYW5rcyB0byBQcnplbXlzbGF3IEF1Z3VzdHluaWFrICgyMDA1LTA1LTI4KSBmb3IgdGhpcyByZWZlcmVuY2UuCisjIFRvcnXFhCBDZW50ZXIgZm9yIEFzdHJvbm9teSwgRGVwdC4gb2YgUmFkaW8gQXN0cm9ub215LCBOaWNvbGF1cyBDb3Blcm5pY3VzIFUuLAorIyBodHRwOi8vd3d3LmFzdHJvLnVuaS50b3J1bi5wbC9+a2IvQXJ0eWt1bHkvVS1QQS9DemFzMi5odG0jdHRoX3RBYjEKKyMgVGhhbmtzIHRvIFByemVteXPFgmF3IEF1Z3VzdHluaWFrICgyMDA1LTA1LTI4KSBmb3IgdGhpcyByZWZlcmVuY2UuCiAjIEhlIGFsc28gZ2l2ZXMgdGhlc2UgZnVydGhlciByZWZlcmVuY2VzOgogIyBNb24gUG9sIG5yIDEzLCBwb3ogMTYyICgxOTk1KSA8aHR0cDovL3d3dy5hYmMuY29tLnBsL3Nlcndpcy9tcC8xOTk1LzAxNjIuaHRtPgogIyBEcnVrIG5yIDIxODAgKDIwMDMpIDxodHRwOi8vd3d3LnNlbmF0Lmdvdi5wbC9rNS9kb2svc2VqbS8wNTMvMjE4MC5wZGY+CkBAIC0xOTU5LDEwICsxOTc1LDEwIEBACiBSdWxlCVBvbGFuZAkxOTYyCTE5NjQJLQlTZXAJbGFzdFN1bgkxOjAwcwkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL1dhcnNhdwkxOjI0OjAwIC0JTE1UCTE4ODAKLQkJCTE6MjQ6MDAJLQlXTVQJMTkxNSBBdWcgIDUgICAjIFdhcnNhdyBNZWFuIFRpbWUKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkxOCBTZXAgMTYgMzowMAorCQkJMToyNDowMAktCVdNVAkxOTE1IEF1ZyAgNSAjIFdhcnNhdyBNZWFuIFRpbWUKKwkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkxOCBTZXAgMTYgIDM6MDAKIAkJCTI6MDAJUG9sYW5kCUVFJXNUCTE5MjIgSnVuCi0JCQkxOjAwCVBvbGFuZAlDRSVzVAkxOTQwIEp1biAyMyAyOjAwCisJCQkxOjAwCVBvbGFuZAlDRSVzVAkxOTQwIEp1biAyMyAgMjowMAogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IE9jdAogCQkJMTowMAlQb2xhbmQJQ0Ulc1QJMTk3NwogCQkJMTowMAlXLUV1cglDRSVzVAkxOTg4CkBAIC0xOTcwLDYgKzE5ODYsMTQgQEAKIAogIyBQb3J0dWdhbAogIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA4LTExKSwgYWZ0ZXIgYSBoZWFkcy11cCBmcm9tIFN0ZXBoZW4gQ29sZWJvdXJuZToKKyMgQWNjb3JkaW5nIHRvIGEgUG9ydHVndWVzZSBkZWNyZWUgKDE5MTEtMDUtMjYpCisjIGh0dHA6Ly9kcmUucHQvcGRmMXNkaXAvMTkxMS8wNS8xMjUwMC8yMzEzMjMxMy5wZGYKKyMgTGlzYm9uIHdhcyBhdCAtMDozNjo0NC42OCwgYnV0IHN3aXRjaGVkIHRvIEdNVCBvbiAxOTEyLTAxLTAxIGF0IDAwOjAwLgorIyBSb3VuZCB0aGUgb2xkIG9mZnNldCB0byAtMDozNjo0NS4gIFRoaXMgYWdyZWVzIHdpdGggV2lsbGV0dCBidXQgZGlzYWdyZWVzCisjIHdpdGggU2hhbmtzLCB3aG8gc2F5cyB0aGUgdHJhbnNpdGlvbiBvY2N1cnJlZCBvbiAxOTExLTA1LTI0IGF0IDAwOjAwIGZvcgorIyBFdXJvcGUvTGlzYm9uLCBBdGxhbnRpYy9Bem9yZXMsIGFuZCBBdGxhbnRpYy9NYWRlaXJhLgorIwogIyBGcm9tIFJ1aSBQZWRybyBTYWxndWVpcm8gKDE5OTItMTEtMTIpOgogIyBQb3J0dWdhbCBoYXMgcmVjZW50bHkgKFNlcHRlbWJlciwgMjcpIGNoYW5nZWQgdGltZXpvbmUKICMgKGZyb20gV0VUIHRvIE1FVCBvciBDRVQpIHRvIGhhcm1vbml6ZSB3aXRoIEVFQy4KQEAgLTIwNDksMzUgKzIwNzMsMzQgQEAKIFJ1bGUJUG9ydAkxOTgwCW9ubHkJLQlNYXIJbGFzdFN1bgkgMDowMHMJMTowMAlTCiBSdWxlCVBvcnQJMTk4MQkxOTgyCS0JTWFyCWxhc3RTdW4JIDE6MDBzCTE6MDAJUwogUnVsZQlQb3J0CTE5ODMJb25seQktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKKyMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGUgdHJhbnNpdGlvbiBmcm9tIExNVCB0byBXRVQgb2NjdXJyZWQgMTkxMS0wNS0yNDsKLSMgV2lsbGV0dCBzYXlzIDE5MTItMDEtMDEuICBHbyB3aXRoIFdpbGxldHQuCi1ab25lCUV1cm9wZS9MaXNib24JLTA6MzY6MzIgLQlMTVQJMTg4NAotCQkJLTA6MzY6MzIgLQlMTVQJMTkxMiBKYW4gIDEgICMgTGlzYm9uIE1lYW4gVGltZQotCQkJIDA6MDAJUG9ydAlXRSVzVAkxOTY2IEFwciAgMyAyOjAwCi0JCQkgMTowMAktCUNFVAkxOTc2IFNlcCAyNiAxOjAwCi0JCQkgMDowMAlQb3J0CVdFJXNUCTE5ODMgU2VwIDI1IDE6MDBzCi0JCQkgMDowMAlXLUV1cglXRSVzVAkxOTkyIFNlcCAyNyAxOjAwcwotCQkJIDE6MDAJRVUJQ0Ulc1QJMTk5NiBNYXIgMzEgMTowMHUKK1pvbmUJRXVyb3BlL0xpc2JvbgktMDozNjo0NSAtCUxNVAkxODg0CisJCQktMDozNjo0NSAtCUxNVAkxOTEyIEphbiAgMSAjIExpc2JvbiBNZWFuIFRpbWUKKwkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk2NiBBcHIgIDMgIDI6MDAKKwkJCSAxOjAwCS0JQ0VUCTE5NzYgU2VwIDI2ICAxOjAwCisJCQkgMDowMAlQb3J0CVdFJXNUCTE5ODMgU2VwIDI1ICAxOjAwcworCQkJIDA6MDAJVy1FdXIJV0Ulc1QJMTk5MiBTZXAgMjcgIDE6MDBzCisJCQkgMTowMAlFVQlDRSVzVAkxOTk2IE1hciAzMSAgMTowMHUKIAkJCSAwOjAwCUVVCVdFJXNUCi1ab25lIEF0bGFudGljL0F6b3JlcwktMTo0Mjo0MCAtCUxNVAkxODg0CQkjIFBvbnRhIERlbGdhZGEKLQkJCS0xOjU0OjMyIC0JSE1UCTE5MTEgTWF5IDI0ICAjIEhvcnRhIE1lYW4gVGltZQotCQkJLTI6MDAJUG9ydAlBWk8lc1QJMTk2NiBBcHIgIDMgMjowMCAjIEF6b3JlcyBUaW1lCi0JCQktMTowMAlQb3J0CUFaTyVzVAkxOTgzIFNlcCAyNSAxOjAwcwotCQkJLTE6MDAJVy1FdXIJQVpPJXNUCTE5OTIgU2VwIDI3IDE6MDBzCi0JCQkgMDowMAlFVQlXRSVzVAkxOTkzIE1hciAyOCAxOjAwdQorWm9uZSBBdGxhbnRpYy9Bem9yZXMJLTE6NDI6NDAgLQlMTVQJMTg4NCAgICAgICAgIyBQb250YSBEZWxnYWRhCisJCQktMTo1NDozMiAtCUhNVAkxOTEyIEphbiAgMSAjIEhvcnRhIE1lYW4gVGltZQorCQkJLTI6MDAJUG9ydAlBWk8lc1QJMTk2NiBBcHIgIDMgIDI6MDAgICMgQXpvcmVzIFRpbWUKKwkJCS0xOjAwCVBvcnQJQVpPJXNUCTE5ODMgU2VwIDI1ICAxOjAwcworCQkJLTE6MDAJVy1FdXIJQVpPJXNUCTE5OTIgU2VwIDI3ICAxOjAwcworCQkJIDA6MDAJRVUJV0Ulc1QJMTk5MyBNYXIgMjggIDE6MDB1CiAJCQktMTowMAlFVQlBWk8lc1QKLVpvbmUgQXRsYW50aWMvTWFkZWlyYQktMTowNzozNiAtCUxNVAkxODg0CQkjIEZ1bmNoYWwKLQkJCS0xOjA3OjM2IC0JRk1UCTE5MTEgTWF5IDI0ICAjIEZ1bmNoYWwgTWVhbiBUaW1lCi0JCQktMTowMAlQb3J0CU1BRCVzVAkxOTY2IEFwciAgMyAyOjAwICMgTWFkZWlyYSBUaW1lCi0JCQkgMDowMAlQb3J0CVdFJXNUCTE5ODMgU2VwIDI1IDE6MDBzCitab25lIEF0bGFudGljL01hZGVpcmEJLTE6MDc6MzYgLQlMTVQJMTg4NCAgICAgICAgIyBGdW5jaGFsCisJCQktMTowNzozNiAtCUZNVAkxOTEyIEphbiAgMSAjIEZ1bmNoYWwgTWVhbiBUaW1lCisJCQktMTowMAlQb3J0CU1BRCVzVAkxOTY2IEFwciAgMyAgMjowMCAjIE1hZGVpcmEgVGltZQorCQkJIDA6MDAJUG9ydAlXRSVzVAkxOTgzIFNlcCAyNSAgMTowMHMKIAkJCSAwOjAwCUVVCVdFJXNUCiAKICMgUm9tYW5pYQogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTEwLTA3KToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5uaW5lb2Nsb2NrLnJvL1BPTC8xNzc4cG9sLmh0bWwiPgotIyBOaW5lIE8nY2xvY2s8L2E+ICgxOTk4LTEwLTIzKSByZXBvcnRzIHRoYXQgdGhlIHN3aXRjaCBvY2N1cnJlZCBhdAorIyBOaW5lIE8nY2xvY2sgPGh0dHA6Ly93d3cubmluZW9jbG9jay5yby9QT0wvMTc3OHBvbC5odG1sPgorIyAoMTk5OC0xMC0yMykgcmVwb3J0cyB0aGF0IHRoZSBzd2l0Y2ggb2NjdXJyZWQgYXQKICMgMDQ6MDAgbG9jYWwgdGltZSBpbiBmYWxsIDE5OTguICBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywKICMgYXNzdW1lIHRoYXQgUm9tYW5pYSBhbmQgTW9sZG92YSBzd2l0Y2hlZCB0byBFVSBydWxlcyBpbiAxOTk3LAogIyB0aGUgc2FtZSB5ZWFyIGFzIEJ1bGdhcmlhLgpAQCAtMjA5NCwzMiArMjExNywyOCBAQAogUnVsZQlSb21hbmlhCTE5OTEJMTk5MwktCVNlcAlsYXN0U3VuCSAwOjAwcwkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgRXVyb3BlL0J1Y2hhcmVzdAkxOjQ0OjI0IC0JTE1UCTE4OTEgT2N0Ci0JCQkxOjQ0OjI0CS0JQk1UCTE5MzEgSnVsIDI0CSMgQnVjaGFyZXN0IE1UCi0JCQkyOjAwCVJvbWFuaWEJRUUlc1QJMTk4MSBNYXIgMjkgMjowMHMKKwkJCTE6NDQ6MjQJLQlCTVQJMTkzMSBKdWwgMjQgIyBCdWNoYXJlc3QgTVQKKwkJCTI6MDAJUm9tYW5pYQlFRSVzVAkxOTgxIE1hciAyOSAgMjowMHMKIAkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5MQogCQkJMjowMAlSb21hbmlhCUVFJXNUCTE5OTQKIAkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NwogCQkJMjowMAlFVQlFRSVzVAogCisKICMgUnVzc2lhCiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTEtMDktMTUpOgogIyBCYXNlZCBvbiBsYXN0IFJ1c3NpYW4gR292ZXJubWVudCBEZWNyZWUgIyA3MjUgb24gQXVndXN0IDMxLCAyMDExCiAjIChHb3Zlcm5tZW50IGRvY3VtZW50Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292ZXJubWVudC5ydS9nb3YvcmVzdWx0cy8xNjM1NS9wcmludC8iPgogIyBodHRwOi8vd3d3LmdvdmVybm1lbnQucnUvZ292L3Jlc3VsdHMvMTYzNTUvcHJpbnQvCi0jIDwvYT4KICMgaW4gUnVzc2lhbikKICMgdGhlcmUgYXJlIGZldyBjb3JyZWN0aW9ucyBoYXZlIHRvIGJlIG1hZGUgZm9yIHNvbWUgUnVzc2lhbiB0aW1lIHpvbmVzLi4uCiAjIEFsbCB1cGRhdGVkIFJ1c3NpYW4gVGltZSBab25lcyB3ZXJlIHBsYWNlZCBpbiB0YWJsZSBhbmQgdHJhbnNsYXRlZCB0byBFbmdsaXNoCiAjIGJ5IFdvcmxkVGltZVpvbmUuY29tIGF0IHRoZSBsaW5rIGJlbG93OgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3J1c3NpYTM2Lmh0bSI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcnVzc2lhMzYuaHRtCi0jIDwvYT4KIAogIyBGcm9tIFNhbmplZXYgR3VwdGEgKDIwMTEtMDktMjcpOgogIyBTY2FucyBvZiBbRGVjcmVlICMyMyBvZiBKYW51YXJ5IDgsIDE5OTJdIGFyZSBhdmFpbGFibGUgYXQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9nb3Zlcm5tZW50LmNvbnN1bHRhbnQucnUvcGFnZS5hc3B4PzEyMjM5NjYiPgogIyBodHRwOi8vZ292ZXJubWVudC5jb25zdWx0YW50LnJ1L3BhZ2UuYXNweD8xMjIzOTY2CiAjIFRoZXkgYXJlIGluIEN5cmlsbGljIGxldHRlcnMgKHByZXN1bWFibHkgUnVzc2lhbikuCiAKQEAgLTIxMjgsMTYgKzIxNDcsMTIgQEAKICMgY2hhbmdlZCBpbiBTZXB0ZW1iZXIgMjAxMToKICMKICMgT25lIHNvdXJjZSBpcwotIyA8IGEgaHJlZj0iaHR0cDovL2dvdmVybm1lbnQucnUvZ292L3Jlc3VsdHMvMTYzNTUvPgogIyBodHRwOi8vZ292ZXJubWVudC5ydS9nb3YvcmVzdWx0cy8xNjM1NS8KLSMgPC9hPgogIyB3aGljaCwgYWNjb3JkaW5nIHRvIHRyYW5zbGF0ZS5nb29nbGUuY29tLCBiZWdpbnMgIkRlY3JlZSBvZiBBdWd1c3QgMzEsCiAjIDIwMTEgTm8gNzI1IiBhbmQgY29udGFpbnMgbm8gb3RoZXIgZGF0ZXMgb3IgImVmZmVjdGl2ZSBkYXRlIiBpbmZvcm1hdGlvbi4KICMKICMgQW5vdGhlciBzb3VyY2UgaXMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5yZy5ydS8yMDExLzA5LzA2L2NoYXMtem9uYS1kb2suaHRtbCI+CiAjIGh0dHA6Ly93d3cucmcucnUvMjAxMS8wOS8wNi9jaGFzLXpvbmEtZG9rLmh0bWwKLSMgPC9hPgogIyB3aGljaCwgYWNjb3JkaW5nIHRvIHRyYW5zbGF0ZS5nb29nbGUuY29tLCBiZWdpbnMgIlJlc29sdXRpb24gb2YgdGhlCiAjIEdvdmVybm1lbnQgb2YgdGhlIFJ1c3NpYW4gRmVkZXJhdGlvbiBvbiBBdWd1c3QgMzEsIDIwMTEgTiA3MjUiIGFuZCBhbHNvCiAjIGNvbnRhaW5zICJEYXRlIGZpcnN0IG9mZmljaWFsIHB1YmxpY2F0aW9uOiBTZXB0ZW1iZXIgNiwgMjAxMSBQb3N0ZWQgb246CkBAIC0yMTQ1LDI4ICsyMTYwLDQ1IEBACiAjIGRvZXMgbm90IGNvbnRhaW4gYW55ICJlZmZlY3RpdmUgZGF0ZSIgaW5mb3JtYXRpb24uCiAjCiAjIEFub3RoZXIgc291cmNlIGlzCi0jIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3lteWFrb25za3lfRGlzdHJpY3QjY2l0ZV9ub3RlLVJ1VGltZS03Ij4KICMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PeW15YWtvbnNreV9EaXN0cmljdCNjaXRlX25vdGUtUnVUaW1lLTcKLSMgPC9hPgogIyB3aGljaCwgaW4gbm90ZSA4LCBjb250YWlucyAiUmVzb2x1dGlvbiAjNzI1IG9mIEF1Z3VzdCAzMSwgMjAxMS4uLgogIyBFZmZlY3RpdmUgYXMgb2YgYWZ0ZXIgNyBkYXlzIGZvbGxvd2luZyB0aGUgZGF5IG9mIHRoZSBvZmZpY2lhbCBwdWJsaWNhdGlvbiIKICMgYnV0IHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYW55IHJlZmVyZW5jZSB0byBTZXB0ZW1iZXIgNiwgMjAxMS4KICMKICMgVGhlIFdpa2lwZWRpYSBhcnRpY2xlIHJlZmVycyB0bwotIyA8YSBocmVmPSJodHRwOi8vYmFzZS5jb25zdWx0YW50LnJ1L2NvbnMvY2dpL29ubGluZS5jZ2k/cmVxPWRvYztiYXNlPUxBVztuPTExODg5NiI+CiAjIGh0dHA6Ly9iYXNlLmNvbnN1bHRhbnQucnUvY29ucy9jZ2kvb25saW5lLmNnaT9yZXE9ZG9jO2Jhc2U9TEFXO249MTE4ODk2Ci0jIDwvYT4KICMgd2hpY2ggc2VlbXMgdG8gY29weSB0aGUgdGV4dCBvZiB0aGUgZ292ZXJubWVudC5ydSBwYWdlLgogIwogIyBUb2JpYXMgQ29ucmFkaSBjb21iaW5lcyBXaWtpcGVkaWEncwogIyAiYXMgb2YgYWZ0ZXIgNyBkYXlzIGZvbGxvd2luZyB0aGUgZGF5IG9mIHRoZSBvZmZpY2lhbCBwdWJsaWNhdGlvbiIKLSMgd2l0aCB3d3cucmcucnUncyAiRGF0ZSBvZiBmaXJzdCBvZmZpY2lhbCBwdWJsaWNhdGlvbjogU2VwdGVtYmVyIDYsIDIwMTEiIHRvIGdldAotIyBTZXB0ZW1iZXIgMTMsIDIwMTEgYXMgdGhlIGN1dG92ZXIgZGF0ZSAodW51c3VhbGx5LCBhIFR1ZXNkYXksIGFzIFRvYmlhcyBDb25yYWRpIG5vdGVzKS4KKyMgd2l0aCB3d3cucmcucnUncyAiRGF0ZSBvZiBmaXJzdCBvZmZpY2lhbCBwdWJsaWNhdGlvbjogU2VwdGVtYmVyIDYsIDIwMTEiIHRvCisjIGdldCBTZXB0ZW1iZXIgMTMsIDIwMTEgYXMgdGhlIGN1dG92ZXIgZGF0ZSAodW51c3VhbGx5LCBhIFR1ZXNkYXksIGFzIFRvYmlhcworIyBDb25yYWRpIG5vdGVzKS4KICMKICMgTm9uZSBvZiB0aGUgc291cmNlcyBpbmRpY2F0ZXMgYSB0aW1lIG9mIGRheSBmb3IgY2hhbmdpbmcgY2xvY2tzLgogIwogIyBHbyB3aXRoIDIwMTEtMDktMTMgMDowMHMuCiAKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTQtMDctMDEpOgorIyBBY2NvcmRpbmcgdG8gdGhlIFJ1c3NpYW4gbmV3cyAoSVRBUi1UQVNTIE5ld3MgQWdlbmN5KQorIyBodHRwOi8vZW4uaXRhci10YXNzLmNvbS9ydXNzaWEvNzM4NTYyCisjIHRoZSBTdGF0ZSBEdW1hIGhhcyBhcHByb3ZlZCAuLi4gdGhlIGRyYWZ0IGJpbGwgb24gcmV0dXJuaW5nIHRvCisjIHdpbnRlciB0aW1lIHN0YW5kYXJkIGFuZCByZXR1cm4gUnVzc2lhIDExIHRpbWUgem9uZXMuICBUaGUgbmV3CisjIHJlZ3VsYXRpb25zIHdpbGwgY29tZSBpbnRvIGVmZmVjdCBvbiBPY3RvYmVyIDI2LCAyMDE0IGF0IDAyOjAwIC4uLgorIyBodHRwOi8vYXNvemQyLmR1bWEuZ292LnJ1L21haW4ubnNmLyUyOFNwcmF2a2ElMjk/T3BlbkFnZW50JlJOPTQzMTk4NS02JjAyCisjIEhlcmUgaXMgYSBsaW5rIHdoZXJlIHdlIHB1dCB0b2dldGhlciB0YWJsZSAoYmFzZWQgb24gYXBwcm92ZWQgQmlsbCBOCisjIDQzMTk4NS02KSB3aXRoIHByb3Bvc2VkIDExIFJ1c3NpYW4gdGltZSB6b25lcyBhbmQgY29ycmVzcG9uZGluZworIyBhcmVhcy9jaXRpZXMvYWRtaW5pc3RyYXRpdmUgY2VudGVycyBpbiB0aGUgUnVzc2lhbiBGZWRlcmF0aW9uIChpbiBFbmdsaXNoKToKKyMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19ydXNzaWE2NS5odG1sCisjCisjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDE0LTA3LTIyKToKKyMgUHV0aW4gc2lnbmVkIHRoZSBGZWRlcmFsIExhdyA0MzE5ODUtNiAuLi4gKGluIFJ1c3NpYW4pCisjIGh0dHA6Ly9pdGFyLXRhc3MuY29tL29ic2NoZXN0dm8vMTMzMzcxMQorIyBodHRwOi8vd3d3LnByYXZvLmdvdi5ydTo4MDgwL3BhZ2UuYXNweD8xMTE2NjAKKyMgaHR0cDovL3d3dy5rcmVtbGluLnJ1L2FjdHMvNDYyNzkKKyMgRnJvbSBPY3RvYmVyIDI2LCAyMDE0IHRoZSBuZXcgUnVzc2lhbiB0aW1lIHpvbmUgbWFwIHdpbGwgbG9va3MgbGlrZSB0aGlzOgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3J1c3NpYS1tYXAtMjAxNC0wNy5odG1sCisKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CiAjIEV4Y2VwdCBmb3IgTW9zY293IGFmdGVyIDE5MTktMDctMDEsIEkgaW52ZW50ZWQgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zLgogIyBNb3Njb3cgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgYWZ0ZXIgMTkxOS0wNy0wMSwgYW5kIE1vc2NvdyBydWxlcyBhZnRlciAxOTkxLApAQCAtMjE5Myw5ICsyMjI1LDkgQEAKICMKICMgRm9yIEdyb3pueSwgQ2hlY2hueWEsIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBzdG9yeSBmcm9tCiAjIEpvaG4gRGFuaXN6ZXdza2ksICJTY2F2ZW5nZXJzIGluIHRoZSBSdWJibGUiLCBMb3MgQW5nZWxlcyBUaW1lcyAoMjAwMS0wMi0wNyk6Ci0jIE5ld3MtLW9mdGVuIGZhbHNlLS1pcyBzcHJlYWQgYnkgd29yZCBvZiBtb3V0aC4gIEEgcnVtb3IgdGhhdCBpdCB3YXMKKyMgTmV3cyAtIG9mdGVuIGZhbHNlIC0gaXMgc3ByZWFkIGJ5IHdvcmQgb2YgbW91dGguICBBIHJ1bW9yIHRoYXQgaXQgd2FzCiAjIHRpbWUgdG8gbW92ZSB0aGUgY2xvY2tzIGJhY2sgcHV0IHRoaXMgd2hvbGUgY2l0eSBvdXQgb2Ygc3luYyB3aXRoCi0jIHRoZSByZXN0IG9mIFJ1c3NpYSBmb3IgdHdvIHdlZWtzLS1ldmVuIHNvbGRpZXJzIHN0YXRpb25lZCBoZXJlIGJlZ2FuCisjIHRoZSByZXN0IG9mIFJ1c3NpYSBmb3IgdHdvIHdlZWtzIC0gZXZlbiBzb2xkaWVycyBzdGF0aW9uZWQgaGVyZSBiZWdhbgogIyBlbmZvcmNpbmcgY3VyZmV3IGF0IHRoZSB3cm9uZyB0aW1lLgogIwogIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDAxLTA2LTA1KToKQEAgLTIyMDYsMTA3ICsyMjM4LDI2NSBAQAogIyBzaW5jZSBTZXB0ZW1iZXIgMTk5Ny4uLi4gIEFsdGhvdWdoIHRoZSBLdXJpbCBJc2xhbmRzIGFyZQogIyBhZG1pbmlzdHJhdGl2ZWx5IHBhcnQgb2YgU2FraGFsaW4gb2JsYXN0JywgdGhleSBhcHBlYXIgdG8gaGF2ZQogIyByZW1haW5lZCBvbiBVVEMrMTEgYWxvbmcgd2l0aCBNYWdhZGFuLgotIworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDYpOgorIyBUaGUgY29tbWVudHMgZGV0YWlsaW5nIHRoZSBjb3ZlcmFnZSBvZiBlYWNoIFJ1c3NpYW4gem9uZSBhcmUgbWVhbnQgdG8gYXNzaXN0CisjIHdpdGggbWFpbnRlbmFuY2Ugb25seSBhbmQgcmVwcmVzZW50IG91ciBiZXN0IGd1ZXNzZXMgYXMgdG8gd2hpY2ggcmVnaW9ucworIyBhcmUgY292ZXJlZCBieSBlYWNoIHpvbmUuICBUaGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgdGFrZW4gYXMgYW4gYXV0aG9yaXRhdGl2ZQorIyBsaXN0aW5nLiAgVGhlIHJlZ2lvbiBjb2RlcyBsaXN0ZWQgY29tZSBmcm9tCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3cvP3RpdGxlPUZlZGVyYWxfc3ViamVjdHNfb2ZfUnVzc2lhJm9sZGlkPTYxMTgxMDQ5OAorIyBhbmQgYXJlIHVzZWQgZm9yIGNvbnZlbmllbmNlIG9ubHk7IG5vIGd1YXJhbnRlZXMgYXJlIG1hZGUgcmVnYXJkaW5nIHRoZWlyCisjIGZ1dHVyZSBzdGFiaWxpdHkuICBJU08gMzE2Ni0yOlJVIGNvZGVzIGFyZSBhbHNvIGxpc3RlZCBmb3IgZmlyc3QtbGV2ZWwKKyMgZGl2aXNpb25zIHdoZXJlIGF2YWlsYWJsZS4KKwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIwotIyBLYWxpbmluZ3JhZHNrYXlhIG9ibGFzdCcuCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKKyMgRXVyb3BlL0thbGluaW5ncmFkIGNvdmVycy4uLgorIyAzOQlSVS1LR0QJS2FsaW5pbmdyYWQgT2JsYXN0CisKIFpvbmUgRXVyb3BlL0thbGluaW5ncmFkCSAxOjIyOjAwIC0JTE1UCTE4OTMgQXByCiAJCQkgMTowMAlDLUV1cglDRSVzVAkxOTQ1CiAJCQkgMjowMAlQb2xhbmQJQ0Ulc1QJMTk0NgotCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSAyOjAwCVJ1c3NpYQlFRSVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDM6MDAJLQlGRVQgIyBGdXJ0aGVyLWVhc3Rlcm4gRXVyb3BlYW4gVGltZQorCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgMjowMAlSdXNzaWEJRUUlc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgMzowMAktCUZFVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSAyOjAwCS0JRUVUCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KToKKyMgRXVyb3BlL01vc2NvdyBjb3ZlcnMuLi4KKyMgMDEJUlUtQUQJQWR5Z2VhLCBSZXB1YmxpYyBvZgorIyAwNQlSVS1EQQlEYWdlc3RhbiwgUmVwdWJsaWMgb2YKKyMgMDYJUlUtSU4JSW5ndXNoZXRpYSwgUmVwdWJsaWMgb2YKKyMgMDcJUlUtS0IJS2FiYXJkaW5vLUJhbGthciBSZXB1YmxpYworIyAwOAlSVS1LTAlLYWxteWtpYSwgUmVwdWJsaWMgb2YKKyMgMDkJUlUtS0MJS2FyYWNoYXktQ2hlcmtlc3MgUmVwdWJsaWMKKyMgMTAJUlUtS1IJS2FyZWxpYSwgUmVwdWJsaWMgb2YKKyMgMTEJUlUtS08JS29taSBSZXB1YmxpYworIyAxMglSVS1NRQlNYXJpIEVsIFJlcHVibGljCisjIDEzCVJVLU1PCU1vcmRvdmlhLCBSZXB1YmxpYyBvZgorIyAxNQlSVS1TRQlOb3J0aCBPc3NldGlhLUFsYW5pYSwgUmVwdWJsaWMgb2YKKyMgMTYJUlUtVEEJVGF0YXJzdGFuLCBSZXB1YmxpYyBvZgorIyAyMAlSVS1DRQlDaGVjaGVuIFJlcHVibGljCisjIDIxCVJVLUNVCUNodXZhc2ggUmVwdWJsaWMKKyMgMjMJUlUtS0RBCUtyYXNub2RhciBLcmFpCisjIDI2CVJVLVNUQQlTdGF2cm9wb2wgS3JhaQorIyAyOQlSVS1BUksJQXJraGFuZ2Vsc2sgT2JsYXN0CisjIDMxCVJVLUJFTAlCZWxnb3JvZCBPYmxhc3QKKyMgMzIJUlUtQlJZCUJyeWFuc2sgT2JsYXN0CisjIDMzCVJVLVZMQQlWbGFkaW1pciBPYmxhc3QKKyMgMzUJUlUtVkxHCVZvbG9nZGEgT2JsYXN0CisjIDM2CVJVLVZPUglWb3JvbmV6aCBPYmxhc3QKKyMgMzcJUlUtSVZBCUl2YW5vdm8gT2JsYXN0CisjIDQwCVJVLUtMVQlLYWx1Z2EgT2JsYXN0CisjIDQ0CVJVLUtPUwlLb3N0cm9tYSBPYmxhc3QKKyMgNDYJUlUtS1JTCUt1cnNrIE9ibGFzdAorIyA0NwlSVS1MRU4JTGVuaW5ncmFkIE9ibGFzdAorIyA0OAlSVS1MSVAJTGlwZXRzayBPYmxhc3QKKyMgNTAJUlUtTU9TCU1vc2NvdyBPYmxhc3QKKyMgNTEJUlUtTVVSCU11cm1hbnNrIE9ibGFzdAorIyA1MglSVS1OSVoJTml6aG55IE5vdmdvcm9kIE9ibGFzdAorIyA1MwlSVS1OR1IJTm92Z29yb2QgT2JsYXN0CisjIDU3CVJVLU9STAlPcnlvbCBPYmxhc3QKKyMgNTgJUlUtUE5aCVBlbnphIE9ibGFzdAorIyA2MAlSVS1QU0sJUHNrb3YgT2JsYXN0CisjIDYxCVJVLVJPUwlSb3N0b3YgT2JsYXN0CisjIDYyCVJVLVJZQQlSeWF6YW4gT2JsYXN0CisjIDY3CVJVLVNNTwlTbW9sZW5zayBPYmxhc3QKKyMgNjgJUlUtVEFNCVRhbWJvdiBPYmxhc3QKKyMgNjkJUlUtVFZFCVR2ZXIgT2JsYXN0CisjIDcxCVJVLVRVTAlUdWxhIE9ibGFzdAorIyA3MwlSVS1VTFkJVWx5YW5vdnNrIE9ibGFzdAorIyA3NglSVS1ZQVIJWWFyb3NsYXZsIE9ibGFzdAorIyA3NwlSVS1NT1cJTW9zY293CisjIDc4CVJVLVNQRQlTYWludCBQZXRlcnNidXJnCisjIDgzCVJVLU5FTglOZW5ldHMgQXV0b25vbW91cyBPa3J1ZworCisjIEZyb20gVmxhZGltaXIgS2FycGluc2t5ICgyMDE0LTA3LTA4KToKKyMgTE1UIGluIE1vc2NvdyAoYmVmb3JlIEp1bCAzLCAxOTE2KSBpcyAyOjMwOjE3LCB0aGF0IHdhcyBkZWZpbmVkIGJ5IE1vc2NvdworIyBPYnNlcnZhdG9yeSAoY29vcmRpbmF0ZXM6IDU1IGRlZy4gNDUnMjkuNzAiLCAzNyBkZWcuIDM0JzA1LjMwIikuLi4uCisjIExNVCBpbiBNb3Njb3cgc2luY2UgSnVsIDMsIDE5MTYgaXMgMjozMTowMSBhcyBhIHJlc3VsdCBvZiBuZXcgc3RhbmRhcmQuCisjIChUaGUgaW5mbyBpcyBmcm9tIHRoZSBib29rIGJ5IEJ5YWxva296IC4uLiBwLiAxOC4pCisjIFRoZSB0aW1lIGluIFN0LiBQZXRlcnNidXJnIGFzIGNhcGl0YWwgb2YgUnVzc2lhIHdhcyBkZWZpbmVkIGJ5CisjIFB1bGtvdiBvYnNlcnZhdG9yeSwgbmVhciBTdC4gUGV0ZXJzYnVyZy4gIEluIDE5MTYgTE1UIE1vc2NvdworIyB3YXMgc3luY2hyb25pemVkIHdpdGggTE1UIFN0LiBQZXRlcnNidXJnICgrMzAgbWludXRlcyksIChQdWxrb3Ygb2JzZXJ2YXRvcnkKKyMgY29vcmRpbmF0ZXM6IDU5IGRlZy4gNDYnMTguNzAiLCAzMCBkZWcuIDE5JzQwLjcwIikgc28gMzAgZGVnLiAxOSc0MC43MCIgPgorIyAyaDAxbTE4LjdzID0gMjowMToxOS4gIExNVCBNb3Njb3cgPSBMTVQgU3QuUGV0ZXJzYnVyZyArIDMwbSAyOjAxOjE5ICsgMDozMCA9CisjIDI6MzE6MTkgLi4uCiAjCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFJlc3B1Ymxpa2EgQWR5Z2V5YSwgQXJraGFuZ2VsJ3NrYXlhIG9ibGFzdCcsCi0jIEJlbGdvcm9kc2theWEgb2JsYXN0JywgQnJ5YW5za2F5YSBvYmxhc3QnLCBWbGFkaW1pcnNrYXlhIG9ibGFzdCcsCi0jIFZvbG9nb2Rza2F5YSBvYmxhc3QnLCBWb3JvbmV6aHNrYXlhIG9ibGFzdCcsCi0jIFJlc3B1Ymxpa2EgRGFnZXN0YW4sIEl2YW5vdnNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgSW5ndXNoZXRpeWEsCi0jIEthYmFyYmluby1CYWxrYXJza2F5YSBSZXNwdWJsaWthLCBSZXNwdWJsaWthIEthbG15a2l5YSwKLSMgS2FseXpoc2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBLYXJhY2hhZXZvLUNoZXJrZXNzaXlhLAotIyBSZXNwdWJsaWthIEthcmVsaXlhLCBSZXNwdWJsaWthIEtvbWksCi0jIEtvc3Ryb21za2F5YSBvYmxhc3QnLCBLcmFzbm9kYXJza2lqIGtyYWosIEt1cnNrYXlhIG9ibGFzdCcsCi0jIExlbmluZ3JhZHNrYXlhIG9ibGFzdCcsIExpcGV0c2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBNYXJpaiBFbCwKLSMgUmVzcHVibGlrYSBNb3Jkb3ZpeWEsIE1vc2t2YSwgTW9za292c2theWEgb2JsYXN0JywKLSMgTXVybWFuc2theWEgb2JsYXN0JywgTmVuZXRza2lqIGF2dG9ub21ueWogb2tydWcsCi0jIE5pemhlZ29yb2Rza2F5YSBvYmxhc3QnLCBOb3Znb3JvZHNrYXlhIG9ibGFzdCcsIE9ybG92c2theWEgb2JsYXN0JywKLSMgUGVuemVuc2theWEgb2JsYXN0JywgUHNrb3Zza2F5YSBvYmxhc3QnLCBSb3N0b3Zza2F5YSBvYmxhc3QnLAotIyBSeWF6YW5za2F5YSBvYmxhc3QnLCBTYW5rdC1QZXRlcmJ1cmcsCi0jIFJlc3B1Ymxpa2EgU2V2ZXJuYXlhIE9zZXRpeWEsIFNtb2xlbnNrYXlhIG9ibGFzdCcsCi0jIFN0YXZyb3BvbCdza2lqIGtyYWosIFRhbWJvdnNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgVGF0YXJzdGFuLAotIyBUdmVyc2theWEgb2JsYXN0JywgVHlsJ3NrYXlhIG9ibGFzdCcsIFVsJ3lhbm92c2theWEgb2JsYXN0JywKLSMgQ2hlY2hlbnNrYXlhIFJlc3B1Ymxpa2EsIENodXZhc2hza2F5YSBvYmxhc3QnLAotIyBZYXJvc2xhdnNrYXlhIG9ibGFzdCcKLVpvbmUgRXVyb3BlL01vc2NvdwkgMjozMDoyMCAtCUxNVAkxODgwCi0JCQkgMjozMAktCU1NVAkxOTE2IEp1bCAgMyAjIE1vc2NvdyBNZWFuIFRpbWUKLQkJCSAyOjMwOjQ4IFJ1c3NpYQklcwkxOTE5IEp1bCAgMSAyOjAwCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMDgpOgorIyBNaWxuZSBkb2VzIG5vdCBsaXN0IE1vc2NvdywgYnV0IHN1Z2dlc3RzIHRoYXQgaXRzIHRpbWUgbWlnaHQgYmUgbGlzdGVkIGluCisjIFLDqXN1bcOpcyBtZW5zdWVscyBldCBhbm51ZWxzIGRlcyBvYnNlcnZhdGlvbnMgbcOpdMOpb3JvbG9naXF1ZXMgKDE4OTUpLgorIyBQcmVzdW1hYmx5IHRoaXMgaXMgT0NMQyA4NTgyNTcwNCwgYSBqb3VybmFsIHB1Ymxpc2hlZCB3aXRoIHBhcmFsbGVsIHRleHQgaW4KKyMgUnVzc2lhbiBhbmQgRnJlbmNoLiAgVGhpcyBzb3VyY2UgaGFzIG5vdCBiZWVuIGxvY2F0ZWQ7IGdvIHdpdGggS2FycGluc2t5LgorCitab25lIEV1cm9wZS9Nb3Njb3cJIDI6MzA6MTcgLQlMTVQJMTg4MAorCQkJIDI6MzA6MTcgLQlNTVQJMTkxNiBKdWwgIDMgIyBNb3Njb3cgTWVhbiBUaW1lCisJCQkgMjozMToxOSBSdXNzaWEJJXMJMTkxOSBKdWwgIDEgIDI6MDAKKwkJCSAzOjAwCVJ1c3NpYQklcwkxOTIxIE9jdAogCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTkyMiBPY3QKIAkJCSAyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCi0JCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDI6MDAJUnVzc2lhCUVFJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgMzowMAlSdXNzaWEJTVNLL01TRAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDQ6MDAJLQlNU0sKKwkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDI6MDAJUnVzc2lhCUVFJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgNDowMAktCU1TSwkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSAzOjAwCS0JTVNLCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKKyMgRXVyb3BlL1NpbWZlcm9wb2wgY292ZXJzLi4uCisjICoqCSoqKioJQ3JpbWVhLCBSZXB1YmxpYyBvZgorIyAqKgkqKioqCVNldmFzdG9wb2wKKworWm9uZSBFdXJvcGUvU2ltZmVyb3BvbAkgMjoxNjoyNCAtCUxNVAkxODgwCisJCQkgMjoxNgktCVNNVAkxOTI0IE1heSAgMiAjIFNpbWZlcm9wb2wgTWVhbiBUCisJCQkgMjowMAktCUVFVAkxOTMwIEp1biAyMQorCQkJIDM6MDAJLQlNU0sJMTk0MSBOb3YKKwkJCSAxOjAwCUMtRXVyCUNFJXNUCTE5NDQgQXByIDEzCisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCisJCQkgMzowMAktCU1TSwkxOTkwIEp1bCAgMSAgMjowMAorCQkJIDI6MDAJLQlFRVQJMTk5MgorIyBDZW50cmFsIENyaW1lYSB1c2VkIE1vc2NvdyB0aW1lIDE5OTQvMTk5Ny4KICMKLSMgQXN0cmFraGFuc2theWEgb2JsYXN0JywgS2lyb3Zza2F5YSBvYmxhc3QnLCBTYXJhdG92c2theWEgb2JsYXN0JywKLSMgVm9sZ29ncmFkc2theWEgb2JsYXN0Jy4gIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgS2lyb3YgaXMgc3RpbGwgYXQgKzA0MDAKLSMgYnV0IFdpa2lwZWRpYSAoMjAwNi0wNS0wOSkgc2F5cyArMDMwMC4gIFBlcmhhcHMgaXQgc3dpdGNoZWQgYWZ0ZXIgdGhlCi0jIG90aGVycz8gIEJ1dCB3ZSBoYXZlIG5vIGRhdGEuCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBUaGUgX0Vjb25vbWlzdF8gKDE5OTQtMDUtMjgsIHAgNDUpIHJlcG9ydHMgdGhhdCBjZW50cmFsIENyaW1lYSBzd2l0Y2hlZAorIyBmcm9tIEtpZXYgdG8gTW9zY293IHRpbWUgc29tZXRpbWUgYWZ0ZXIgdGhlIEphbnVhcnkgMTk5NCBlbGVjdGlvbnMuCisjIFNoYW5rcyAoMTk5OSkgc2F5cyAiZGF0ZSBvZiBjaGFuZ2UgdW5jZXJ0YWluIiwgYnV0IGltcGxpZXMgdGhhdCBpdCBoYXBwZW5lZAorIyBzb21ldGltZSBiZXR3ZWVuIHRoZSAxOTk0IERTVCBzd2l0Y2hlcy4gIFNoYW5rcyAmIFBvdHRlbmdlciBzaW1wbHkgc2F5CisjIDE5OTQtMDktMjUgMDM6MDAsIGJ1dCB0aGF0IGNhbid0IGJlIHJpZ2h0LiAgRm9yIG5vdywgZ3Vlc3MgaXQKKyMgY2hhbmdlZCBpbiBNYXkuCisJCQkgMjowMAlFLUV1cglFRSVzVAkxOTk0IE1heQorIyBGcm9tIElBVEEgU1NJTSAoMTk5NC8xOTk3KSwgd2hpY2ggYWxzbyBzYXlzIHRoYXQgS2VyY2ggaXMgc3RpbGwgbGlrZSBLaWV2LgorCQkJIDM6MDAJRS1FdXIJTVNLL01TRAkxOTk2IE1hciAzMSAgMzowMHMKKwkJCSAzOjAwCTE6MDAJTVNECTE5OTYgT2N0IDI3ICAzOjAwcworIyBJQVRBIFNTSU0gKDE5OTctMDkpIHNheXMgQ3JpbWVhIHN3aXRjaGVkIHRvIEVFVC9FRVNULgorIyBBc3N1bWUgaXQgaGFwcGVuZWQgaW4gTWFyY2ggYnkgbm90IGNoYW5naW5nIHRoZSBjbG9ja3MuCisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTk3CisJCQkgMzowMAktCU1TSwkxOTk3IE1hciBsYXN0U3VuICAxOjAwdQorIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxNC0wMy0xNyk6CisjIHRpbWUgY2hhbmdlIGF0IDI6MDAgKDJhbSkgb24gTWFyY2ggMzAsIDIwMTQKKyMgaHR0cDovL3Z6LnJ1L25ld3MvMjAxNC8zLzE3LzY3NzQ2NC5odG1sCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDMtMzApOgorIyBTaW1mZXJvcG9sIGFuZCBTZXZhc3RvcG9sIHJlcG9ydGVkbHkgY2hhbmdlZCB0aGVpciBjZW50cmFsIHRvd24gY2xvY2tzCisjIGxhdGUgdGhlIHByZXZpb3VzIGRheSwgYnV0IHRoaXMgYXBwZWFycyB0byBoYXZlIGJlZW4gY2VyZW1vbmlhbAorIyBhbmQgdGhlIGRpc2NyZXBhbmNpZXMgYXJlIHNtYWxsIGVub3VnaCB0byBub3Qgd29ycnkgYWJvdXQuCisJCQkgMjowMAlFVQlFRSVzVAkyMDE0IE1hciAzMCAgMjowMAorCQkJIDQ6MDAJLQlNU0sJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgMzowMAktCU1TSworCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CisjIEV1cm9wZS9Wb2xnb2dyYWQgY292ZXJzLi4uCisjIDMwCVJVLUFTVAlBc3RyYWtoYW4gT2JsYXN0CisjIDM0CVJVLVZHRwlWb2xnb2dyYWQgT2JsYXN0CisjIDQzCVJVLUtJUglLaXJvdiBPYmxhc3QKKyMgNjQJUlUtU0FSCVNhcmF0b3YgT2JsYXN0CisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNS0wOSk6CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgS2lyb3YgaXMgc3RpbGwgYXQgKzA0MDAgYnV0IFdpa2lwZWRpYSBzYXlzICswMzAwLgorIyBQZXJoYXBzIGl0IHN3aXRjaGVkIGFmdGVyIHRoZSBvdGhlcnM/ICBCdXQgd2UgaGF2ZSBubyBkYXRhLgorCiBab25lIEV1cm9wZS9Wb2xnb2dyYWQJIDI6NTc6NDAgLQlMTVQJMTkyMCBKYW4gIDMKIAkJCSAzOjAwCS0JVFNBVAkxOTI1IEFwciAgNiAjIFRzYXJpdHN5biBUaW1lCiAJCQkgMzowMAktCVNUQVQJMTkzMCBKdW4gMjEgIyBTdGFsaW5ncmFkIFRpbWUKIAkJCSA0OjAwCS0JU1RBVAkxOTYxIE5vdiAxMQotCQkJIDQ6MDAJUnVzc2lhCVZPTCVzVAkxOTg5IE1hciAyNiAyOjAwcyAjIFZvbGdvZ3JhZCBUCi0JCQkgMzowMAlSdXNzaWEJVk9MJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNDowMAktCVZPTFQJMTk5MiBNYXIgMjkgMjowMHMKLQkJCSAzOjAwCVJ1c3NpYQlWT0wlc1QJMjAxMSBNYXIgMjcgMjowMHMKLQkJCSA0OjAwCS0JVk9MVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBTYW1hcnNrYXlhIG9ibGFzdCcsIFVkbXlydHNrYXlhIHJlc3B1Ymxpa2EKLVpvbmUgRXVyb3BlL1NhbWFyYQkgMzoyMDozNiAtCUxNVAkxOTE5IEp1bCAgMSAyOjAwCisJCQkgNDowMAlSdXNzaWEJVk9MJXNUCTE5ODkgTWFyIDI2ICAyOjAwcyAjIFZvbGdvZ3JhZCBUCisJCQkgMzowMAlSdXNzaWEJVk9MJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDQ6MDAJLQlWT0xUCTE5OTIgTWFyIDI5ICAyOjAwcworCQkJIDM6MDAJUnVzc2lhCU1TSwkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA0OjAwCS0JTVNLCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDM6MDAJLQlNU0sKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOgorIyBFdXJvcGUvU2FtYXJhIGNvdmVycy4uLgorIyAxOAlSVS1VRAlVZG11cnQgUmVwdWJsaWMKKyMgNjMJUlUtU0FNCVNhbWFyYSBPYmxhc3QKKworIyBCeWFsb2tveiAxOTE5IHNheXMgU2FtYXJhIHdhcyAzOjIwOjIwLgorCitab25lIEV1cm9wZS9TYW1hcmEJIDM6MjA6MjAgLQlMTVQJMTkxOSBKdWwgIDEgIDI6MDAKIAkJCSAzOjAwCS0JU0FNVAkxOTMwIEp1biAyMQogCQkJIDQ6MDAJLQlTQU1UCTE5MzUgSmFuIDI3Ci0JCQkgNDowMAlSdXNzaWEJS1VZJXNUCTE5ODkgTWFyIDI2IDI6MDBzICMgS3V5YnlzaGV2Ci0JCQkgMzowMAlSdXNzaWEJS1VZJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgMjowMAlSdXNzaWEJS1VZJXNUCTE5OTEgU2VwIDI5IDI6MDBzCi0JCQkgMzowMAktCUtVWVQJMTk5MSBPY3QgMjAgMzowMAotCQkJIDQ6MDAJUnVzc2lhCVNBTSVzVAkyMDEwIE1hciAyOCAyOjAwcyAjIFNhbWFyYSBUaW1lCi0JCQkgMzowMAlSdXNzaWEJU0FNJXNUCTIwMTEgTWFyIDI3IDI6MDBzCisJCQkgNDowMAlSdXNzaWEJS1VZJXNUCTE5ODkgTWFyIDI2ICAyOjAwcyAjIEt1eWJ5c2hldgorCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgMjowMAlSdXNzaWEJRUUlc1QJMTk5MSBTZXAgMjkgIDI6MDBzCisJCQkgMzowMAktCUtVWVQJMTk5MSBPY3QgMjAgIDM6MDAKKwkJCSA0OjAwCVJ1c3NpYQlTQU0lc1QJMjAxMCBNYXIgMjggIDI6MDBzICMgU2FtYXJhIFRpbWUKKwkJCSAzOjAwCVJ1c3NpYQlTQU0lc1QJMjAxMSBNYXIgMjcgIDI6MDBzCiAJCQkgNDowMAktCVNBTVQKIAorCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOgorIyBBc2lhL1lla2F0ZXJpbmJ1cmcgY292ZXJzLi4uCisjIDAyCVJVLUJBCUJhc2hrb3J0b3N0YW4sIFJlcHVibGljIG9mCisjIDkwCVJVLVBFUglQZXJtIEtyYWkKKyMgNDUJUlUtS0dOCUt1cmdhbiBPYmxhc3QKKyMgNTYJUlUtT1JFCU9yZW5idXJnIE9ibGFzdAorIyA2NglSVS1TVkUJU3ZlcmRsb3ZzayBPYmxhc3QKKyMgNzIJUlUtVFlVCVR5dW1lbiBPYmxhc3QKKyMgNzQJUlUtQ0hFCUNoZWx5YWJpbnNrIE9ibGFzdAorIyA4NglSVS1LSE0JS2hhbnR5LU1hbnNpIEF1dG9ub21vdXMgT2tydWcgLSBZdWdyYQorIyA4OQlSVS1ZQU4JWWFtYWxvLU5lbmV0cyBBdXRvbm9tb3VzIE9rcnVnCiAjCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFJlc3B1Ymxpa2EgQmFzaGtvcnRvc3RhbiwgS29taS1QZXJteWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLAotIyBLdXJnYW5za2F5YSBvYmxhc3QnLCBPcmVuYnVyZ3NrYXlhIG9ibGFzdCcsIFBlcm1za2F5YSBvYmxhc3QnLAotIyBTdmVyZGxvdnNrYXlhIG9ibGFzdCcsIFR5dW1lbnNrYXlhIG9ibGFzdCcsCi0jIEtoYW50eS1NYW5za2lqc2tpaiBhdnRvbm9tbnlqIG9rcnVnLCBDaGVseWFiaW5za2F5YSBvYmxhc3QnLAotIyBZYW1hbG8tTmVuZXRza2lqIGF2dG9ub21ueWogb2tydWcuCi1ab25lIEFzaWEvWWVrYXRlcmluYnVyZwkgNDowMjoyNCAtCUxNVAkxOTE5IEp1bCAxNSA0OjAwCisjIE5vdGU6IEVmZmVjdGl2ZSAyMDA1LTEyLTAxLCAoNTkpIFBlcm0gT2JsYXN0IGFuZCAoODEpIEtvbWktUGVybXlhaworIyBBdXRvbm9tb3VzIE9rcnVnIG1lcmdlZCB0byBmb3JtICg5MCwgUlUtUEVSKSBQZXJtIEtyYWkuCisKKyMgTWlsbmUgc2F5cyBZZWthdGVyaW5idXJnIHdhcyA0OjAyOjMyLjk7IHJvdW5kIHRvIG5lYXJlc3QuCisjIEJ5YWxva296IDE5MTkgc2F5cyBpdHMgcHJvdmluY2lhbCB0aW1lIHdhcyBiYXNlZCBvbiBQZXJtLCBhdCAzOjQ1OjA1LgorIyBBc3N1bWUgaXQgc3dpdGNoZWQgb24gMTkxNi0wNy0wMywgdGhlIHRpbWUgb2YgdGhlIG5ldyBzdGFuZGFyZC4KKyMgVGhlIDE5MTkgYW5kIDE5MzAgdHJhbnNpdGlvbnMgYXJlIGZyb20gU2hhbmtzLgorCitab25lIEFzaWEvWWVrYXRlcmluYnVyZwkgNDowMjozMyAtCUxNVAkxOTE2IEp1bCAgMworCQkJIDM6NDU6MDUgLQlQTVQJMTkxOSBKdWwgMTUgIDQ6MDAKIAkJCSA0OjAwCS0JU1ZFVAkxOTMwIEp1biAyMSAjIFN2ZXJkbG92c2sgVGltZQotCQkJIDU6MDAJUnVzc2lhCVNWRSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDQ6MDAJUnVzc2lhCVNWRSVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDU6MDAJUnVzc2lhCVlFSyVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDY6MDAJLQlZRUtUCSMgWWVrYXRlcmluYnVyZyBUaW1lCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFJlc3B1Ymxpa2EgQWx0YWosIEFsdGFqc2tpaiBrcmFqLCBPbXNrYXlhIG9ibGFzdCcuCi1ab25lIEFzaWEvT21zawkJIDQ6NTM6MzYgLQlMTVQJMTkxOSBOb3YgMTQKLQkJCSA1OjAwCS0JT01TVAkxOTMwIEp1biAyMSAjIE9tc2sgVEltZQotCQkJIDY6MDAJUnVzc2lhCU9NUyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDU6MDAJUnVzc2lhCU9NUyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCU9NUyVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDc6MDAJLQlPTVNUCi0jCisJCQkgNTowMAlSdXNzaWEJU1ZFJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDQ6MDAJUnVzc2lhCVNWRSVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCSA1OjAwCVJ1c3NpYQlZRUslc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgNjowMAktCVlFS1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgNTowMAktCVlFS1QKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOgorIyBBc2lhL09tc2sgY292ZXJzLi4uCisjIDA0CVJVLUFMCUFsdGFpIFJlcHVibGljCisjIDIyCVJVLUFMVAlBbHRhaSBLcmFpCisjIDU1CVJVLU9NUwlPbXNrIE9ibGFzdAorCisjIEJ5YWxva296IDE5MTkgc2F5cyBPbXNrIHdhcyA0OjUzOjMwLgorCitab25lIEFzaWEvT21zawkJIDQ6NTM6MzAgLQlMTVQJMTkxOSBOb3YgMTQKKwkJCSA1OjAwCS0JT01TVAkxOTMwIEp1biAyMSAjIE9tc2sgVGltZQorCQkJIDY6MDAJUnVzc2lhCU9NUyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA1OjAwCVJ1c3NpYQlPTVMlc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgNjowMAlSdXNzaWEJT01TJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDc6MDAJLQlPTVNUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDY6MDAJLQlPTVNUCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKKyMgQXNpYS9Ob3Zvc2liaXJzayBjb3ZlcnMuLi4KKyMgNTQJUlUtTlZTCU5vdm9zaWJpcnNrIE9ibGFzdAorIyA3MAlSVS1UT00JVG9tc2sgT2JsYXN0CisKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wOC0xOSk6IEknbSBndWVzc2luZyBhYm91dCBUb21zayBoZXJlOyBpdCdzCiAjIG5vdCBjbGVhciB3aGVuIGl0IHN3aXRjaGVkIGZyb20gKzcgdG8gKzYuCi0jIE5vdm9zaWJpcnNrYXlhIG9ibGFzdCcsIFRvbXNrYXlhIG9ibGFzdCcuCi1ab25lIEFzaWEvTm92b3NpYmlyc2sJIDU6MzE6NDAgLQlMTVQJMTkxOSBEZWMgMTQgNjowMAorCitab25lIEFzaWEvTm92b3NpYmlyc2sJIDU6MzE6NDAgLQlMTVQJMTkxOSBEZWMgMTQgIDY6MDAKIAkJCSA2OjAwCS0JTk9WVAkxOTMwIEp1biAyMSAjIE5vdm9zaWJpcnNrIFRpbWUKLQkJCSA3OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MiBKYW4gMTkgMjowMHMKKwkJCSA3OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNjowMAlSdXNzaWEJTk9WJXNUCTE5OTIgSmFuIDE5ICAyOjAwcwogCQkJIDc6MDAJUnVzc2lhCU5PViVzVAkxOTkzIE1heSAyMyAjIHNheSBTaGFua3MgJiBQLgotCQkJIDY6MDAJUnVzc2lhCU5PViVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDc6MDAJLQlOT1ZUCisJCQkgNjowMAlSdXNzaWEJTk9WJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDc6MDAJLQlOT1ZUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDY6MDAJLQlOT1ZUCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKKyMgQXNpYS9Ob3Zva3V6bmV0c2sgY292ZXJzLi4uCisjIDQyCVJVLUtFTQlLZW1lcm92byBPYmxhc3QKIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0xMC0xMyk6CiAjIEtlbWVyb3ZvIG9ibGFzdCcgKEtlbWVyb3ZvIHJlZ2lvbikgaW4gUnVzc2lhIHdpbGwgY2hhbmdlIGN1cnJlbnQgdGltZSB6b25lIG9uCkBAIC0yMzE5LDE0ICsyNTA5LDEwIEBACiAjIHRpbWUgem9uZS4iICgiUnVzc2lhIFpvbmUgNSIgb3Igb2xkICJVU1NSIFpvbmUgNSIgaXMgR01UICswNjAwKQogIwogIyBSdXNzaWFuIEdvdmVybm1lbnQgd2ViIHNpdGUgKFJ1c3NpYW4gbGFuZ3VhZ2UpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292ZXJubWVudC5ydS9jb250ZW50L2dvdmVybm1lbnRhY3Rpdml0eS9yZmdvdmVybm1lbnRkZWNpc2lvbnMvYXJjaGl2Ij4KICMgaHR0cDovL3d3dy5nb3Zlcm5tZW50LnJ1L2NvbnRlbnQvZ292ZXJubWVudGFjdGl2aXR5L3JmZ292ZXJubWVudGRlY2lzaW9ucy9hcmNoaXZlLzIwMDkvMDkvMTQvOTkxNjMzLmh0bQotIyA8L2E+CiAjIG9yIFJ1c3NpYW4tRW5nbGlzaCB0cmFuc2xhdGlvbiBieSBXb3JsZFRpbWVab25lLmNvbSB3aXRoIHJlZmVyZW5jZQogIyBtYXAgdG8gbG9jYWwgcmVnaW9uIGFuZCBuZXcgUnVzc2lhIFRpbWUgWm9uZSBtYXAgYWZ0ZXIgTWFyY2ggMjgsIDIwMTAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19ydXNzaWEwMy5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19ydXNzaWEwMy5odG1sCi0jIDwvYT4KICMKICMgVGh1cywgd2hlbiBSdXNzaWEgd2lsbCBzd2l0Y2ggdG8gRFNUIG9uIHRoZSBuaWdodCBvZiBNYXJjaCAyOCwgMjAxMAogIyBLZW1lcm92byByZWdpb24gKEtlbWVyb3ZvIG9ibGFzdCcpIHdpbGwgbm90IGNoYW5nZSB0aGUgY2xvY2suCkBAIC0yMzM0LDE1MiArMjUyMCwzMTkgQEAKICMgQXMgYSByZXN1bHQsIEtlbWVyb3ZvIG9ibGFzdCcgd2lsbCBiZSBpbiB0aGUgc2FtZSB0aW1lIHpvbmUgYXMKICMgTm92b3NpYmlyc2ssIE9tc2ssIFRvbXNrLCBCYXJuYXVsIGFuZCBBbHRhaSBSZXB1YmxpYy4KIAorIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAyKSwgcGVyIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxNC0wNy0wMik6CisjIFRoZSBLZW1lcm92byByZWdpb24gd2lsbCByZW1haW4gYXQgVVRDKzcgdGhyb3VnaCB0aGUgMjAxNC0xMC0yNiBjaGFuZ2UsIHRodXMKKyMgcmVhbGlnbmluZyBpdHNlbGYgd2l0aCBLUkFULgorCiBab25lIEFzaWEvTm92b2t1em5ldHNrCSA1OjQ4OjQ4IC0JTk1UCTE5MjAgSmFuICA2CiAJCQkgNjowMAktCUtSQVQJMTkzMCBKdW4gMjEgIyBLcmFzbm95YXJzayBUaW1lCi0JCQkgNzowMAlSdXNzaWEJS1JBJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJS1JBJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgNzowMAlSdXNzaWEJS1JBJXNUCTIwMTAgTWFyIDI4IDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJTk9WJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgNzowMAktCU5PVlQgIyBOb3Zvc2liaXJzay9Ob3Zva3V6bmV0c2sgVGltZQorCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA2OjAwCVJ1c3NpYQlLUkElc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgNzowMAlSdXNzaWEJS1JBJXNUCTIwMTAgTWFyIDI4ICAyOjAwcworCQkJIDY6MDAJUnVzc2lhCU5PViVzVAkyMDExIE1hciAyNyAgMjowMHMgIyBOb3Zvc2liaXJzaworCQkJIDc6MDAJLQlOT1ZUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDc6MDAJLQlLUkFUCSMgS3Jhc25veWFyc2sgVGltZQogCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CisjIEFzaWEvS3Jhc25veWFyc2sgY292ZXJzLi4uCisjIDE3CVJVLVRZCVR1dmEgUmVwdWJsaWMKKyMgMTkJUlUtS0sJS2hha2Fzc2lhLCBSZXB1YmxpYyBvZgorIyAyNAlSVS1LWUEJS3Jhc25veWFyc2sgS3JhaQogIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBLcmFzbm95YXJza2lqIGtyYWosCi0jIFRham15cnNraWogKERvbGdhbm8tTmVuZXRza2lqKSBhdnRvbm9tbnlqIG9rcnVnLAotIyBSZXNwdWJsaWthIFR1dmEsIFJlc3B1Ymxpa2EgS2hha2FzaXlhLCBFdmVua2lqc2tpaiBhdnRvbm9tbnlqIG9rcnVnLgotWm9uZSBBc2lhL0tyYXNub3lhcnNrCSA2OjExOjIwIC0JTE1UCTE5MjAgSmFuICA2CisjIE5vdGU6IEVmZmVjdGl2ZSAyMDA3LTAxLTAxLCAoODgpIEV2ZW5rIEF1dG9ub21vdXMgT2tydWcgYW5kICg4NCkgVGF5bXlyCisjIEF1dG9ub21vdXMgT2tydWcgd2VyZSBtZXJnZWQgaW50byAoMjQsIFJVLUtZQSkgS3Jhc25veWFyc2sgS3JhaS4KKworIyBCeWFsb2tveiAxOTE5IHNheXMgS3Jhc25veWFyc2sgd2FzIDY6MTE6MjYuCisKK1pvbmUgQXNpYS9LcmFzbm95YXJzawkgNjoxMToyNiAtCUxNVAkxOTIwIEphbiAgNgogCQkJIDY6MDAJLQlLUkFUCTE5MzAgSnVuIDIxICMgS3Jhc25veWFyc2sgVGltZQotCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCUtSQSVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDg6MDAJLQlLUkFUCisJCQkgNzowMAlSdXNzaWEJS1JBJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDY6MDAJUnVzc2lhCUtSQSVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgODowMAktCUtSQVQJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgNzowMAktCUtSQVQKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOgorIyBBc2lhL0lya3V0c2sgY292ZXJzLi4uCisjIDAzCVJVLUJVCUJ1cnlhdGlhLCBSZXB1YmxpYyBvZgorIyAzOAlSVS1JUksJSXJrdXRzayBPYmxhc3QKICMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgUmVzcHVibGlrYSBCdXJ5YXRpeWEsIElya3V0c2theWEgb2JsYXN0JywKLSMgVXN0Jy1PcmR5bnNraWogQnVyeWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLgotWm9uZSBBc2lhL0lya3V0c2sJIDY6NTc6MjAgLQlMTVQJMTg4MAotCQkJIDY6NTc6MjAgLQlJTVQJMTkyMCBKYW4gMjUgIyBJcmt1dHNrIE1lYW4gVGltZQorIyBOb3RlOiBFZmZlY3RpdmUgMjAwOC0wMS0wMSwgKDg1KSBVc3QtT3JkYSBCdXJ5YXQgQXV0b25vbW91cyBPa3J1ZyB3YXMKKyMgbWVyZ2VkIGludG8gKDM4LCBSVS1JUkspIElya3V0c2sgT2JsYXN0LgorCisjIE1pbG5lIDE4OTkgc2F5cyBJcmt1dHNrIHdhcyA2OjU3OjE1LgorIyBCeWFsb2tveiAxOTE5IHNheXMgSXJrdXRzayB3YXMgNjo1NzowNS4KKyMgR28gd2l0aCBCeWFsb2tvei4KKworWm9uZSBBc2lhL0lya3V0c2sJIDY6NTc6MDUgLQlMTVQJMTg4MAorCQkJIDY6NTc6MDUgLQlJTVQJMTkyMCBKYW4gMjUgIyBJcmt1dHNrIE1lYW4gVGltZQogCQkJIDc6MDAJLQlJUktUCTE5MzAgSnVuIDIxICMgSXJrdXRzayBUaW1lCi0JCQkgODowMAlSdXNzaWEJSVJLJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNzowMAlSdXNzaWEJSVJLJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgODowMAlSdXNzaWEJSVJLJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgOTowMAktCUlSS1QKKwkJCSA4OjAwCVJ1c3NpYQlJUkslc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNzowMAlSdXNzaWEJSVJLJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDg6MDAJUnVzc2lhCUlSSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA5OjAwCS0JSVJLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA4OjAwCS0JSVJLVAorCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNik6CisjIEFzaWEvQ2hpdGEgY292ZXJzLi4uCisjIDkyCVJVLVpBQglaYWJheWthbHNreSBLcmFpCiAjCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDMtMTAtMTgpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIEFnaW5za2lqIEJ1cnlhdHNraWogYXZ0b25vbW55aiBva3J1ZywgQW11cnNrYXlhIG9ibGFzdCcsCi0jIFtwYXJ0cyBvZl0gUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLCBDaGl0aW5za2F5YSBvYmxhc3QnLgorIyBOb3RlOiBFZmZlY3RpdmUgMjAwOC0wMy0wMSwgKDc1KSBDaGl0YSBPYmxhc3QgYW5kICg4MCkgQWdpbi1CdXJ5YXQKKyMgQXV0b25vbW91cyBPa3J1ZyBtZXJnZWQgdG8gZm9ybSAoOTIsIFJVLVpBQikgWmFiYXlrYWxza3kgS3JhaS4KIAotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKLSMgLi4uc29tZSByZWdpb25zIG9mIFtSdXNzaWFdIHdlcmUgbWVyZ2VkIHdpdGggb3RoZXJzIHNpbmNlIDIwMDUuLi4KLSMgU29tZSBuYW1lcyB3ZXJlIGNoYW5nZWQsIG5vIGJpZyBkZWFsLCBleGNlcHQgZm9yIG9uZSBpbnN0YW5jZTogYSBuZXcgbmFtZS4KLSMgWUFLL1lBS1NUOiBVVEMrOSBaYWJhamthbCdza2lqIGtyYWouCi0KLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6Ci0jIFRoZSBTYWtoYSBkaXN0cmljdHMgYXJlOiBBbGRhbnNraWosIEFtZ2luc2tpaiwgQW5hYmFyc2tpaiwKLSMgVmVya2huZXZpbHl1anNraWosIFZpbHl1anNraWosIEdvcm55aiwKLSMgWmhpZ2Fuc2tpaiwgS29ieWFqc2tpaiwgTGVuc2tpaiwgTWVnaW5vLUthbmdhbGFzc2tpaiwgTWlybmluc2tpaiwKLSMgTmFtc2tpaiwgTnl1cmJpbnNraWosIE9sZW55b2tza2lqLCBPbHlva21pbnNraWosCi0jIFN1bnRhcnNraWosIFRhdHRpbnNraWosIFVzdCctQWxkYW5za2lqLCBLaGFuZ2FsYXNza2lqLAotIyBDaHVyYXBjaGluc2tpaiwgRXZlbm8tQnl0YW50YWpza2lqIE5hdHNpb25hbCduaWouCi0KLVpvbmUgQXNpYS9ZYWt1dHNrCSA4OjM4OjQwIC0JTE1UCTE5MTkgRGVjIDE1Citab25lIEFzaWEvQ2hpdGEJIDc6MzM6NTIgLQlMTVQJMTkxOSBEZWMgMTUKIAkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQotCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDEwOjAwCS0JWUFLVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAzLTEwLTE4KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBFdnJlanNrYXlhIGF2dG9ub21uYXlhIG9ibGFzdCcsIEtoYWJhcm92c2tpaiBrcmFqLCBQcmltb3Jza2lqIGtyYWosCi0jIFtwYXJ0cyBvZl0gUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLgorCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA4OjAwCVJ1c3NpYQlZQUslc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTA6MDAJLQlZQUtUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDg6MDAJLQlJUktUCiAKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6Ci0jIFRoZSBTYWtoYSBkaXN0cmljdHMgYXJlOiBCdWx1bnNraWosIFZlcmtob3lhbnNraWosIC4uLiBVc3QnLVlhbnNraWouCi1ab25lIEFzaWEvVmxhZGl2b3N0b2sJIDg6NDc6NDQgLQlMTVQJMTkyMiBOb3YgMTUKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKKyMgQXNpYS9ZYWt1dHNrIGNvdmVycy4uLgorIyAyOAlSVS1BTVUJQW11ciBPYmxhc3QKKyMKKyMgLi4uYW5kIHBhcnRzIG9mICgxNCwgUlUtU0EpIFNha2hhIChZYWt1dGlhKSBSZXB1YmxpYzoKKyMgMTQtMDIJKioqKglBbGRhbnNreSBEaXN0cmljdAorIyAxNC0wNAkqKioqCUFtZ2luc2t5IERpc3RyaWN0CisjIDE0LTA1CSoqKioJQW5hYmFyc2t5IERpc3RyaWN0CisjIDE0LTA2CSoqKioJQnVsdW5za3kgRGlzdHJpY3QKKyMgMTQtMDcJKioqKglWZXJraG5ldmlseXV5c2t5IERpc3RyaWN0CisjIDE0LTEwCSoqKioJVmlseXV5c2t5IERpc3RyaWN0CisjIDE0LTExCSoqKioJR29ybnkgRGlzdHJpY3QKKyMgMTQtMTIJKioqKglaaGlnYW5za3kgRGlzdHJpY3QKKyMgMTQtMTMJKioqKglLb2J5YXlza3kgRGlzdHJpY3QKKyMgMTQtMTQJKioqKglMZW5za3kgRGlzdHJpY3QKKyMgMTQtMTUJKioqKglNZWdpbm8tS2FuZ2FsYXNza3kgRGlzdHJpY3QKKyMgMTQtMTYJKioqKglNaXJuaW5za3kgRGlzdHJpY3QKKyMgMTQtMTgJKioqKglOYW1za3kgRGlzdHJpY3QKKyMgMTQtMTkJKioqKglOZXJ5dW5ncmluc2t5IERpc3RyaWN0CisjIDE0LTIxCSoqKioJTnl1cmJpbnNreSBEaXN0cmljdAorIyAxNC0yMwkqKioqCU9sZW55b2tza3kgRGlzdHJpY3QKKyMgMTQtMjQJKioqKglPbHlva21pbnNreSBEaXN0cmljdAorIyAxNC0yNgkqKioqCVN1bnRhcnNreSBEaXN0cmljdAorIyAxNC0yNwkqKioqCVRhdHRpbnNreSBEaXN0cmljdAorIyAxNC0yOQkqKioqCVVzdC1BbGRhbnNreSBEaXN0cmljdAorIyAxNC0zMgkqKioqCUtoYW5nYWxhc3NreSBEaXN0cmljdAorIyAxNC0zMwkqKioqCUNodXJhcGNoaW5za3kgRGlzdHJpY3QKKyMgMTQtMzQJKioqKglFdmVuby1CeXRhbnRheXNreSBOYXRpb25hbCBEaXN0cmljdAorCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgorIyBPdXIgY29tbWVudGFyeSBzZWVtcyB0byBoYXZlIGxvc3QgbWVudGlvbiBvZiAoMTQtMTkpIE5lcnl1bmdyaW5za3kgRGlzdHJpY3QuCisjIFNpbmNlIHRoZSBzdXJyb3VuZGluZyBkaXN0cmljdHMgb2YgU2FraGEgYXJlIGFsbCBZQUtULCBhc3N1bWUgdGhpcyBpcywgdG9vLgorIyBBbHNvIGFzc3VtZSBpdHMgaGlzdG9yeSBoYXMgYmVlbiB0aGUgc2FtZSBhcyB0aGUgcmVzdCBvZiBBc2lhL1lha3V0c2suCisKKyMgQnlhbG9rb3ogMTkxOSBzYXlzIFlha3V0c2sgd2FzIDg6Mzg6NTguCisKK1pvbmUgQXNpYS9ZYWt1dHNrCSA4OjM4OjU4IC0JTE1UCTE5MTkgRGVjIDE1CisJCQkgODowMAktCVlBS1QJMTkzMCBKdW4gMjEgIyBZYWt1dHNrIFRpbWUKKwkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgODowMAlSdXNzaWEJWUFLJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEwOjAwCS0JWUFLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA5OjAwCS0JWUFLVAorCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6CisjIEFzaWEvVmxhZGl2b3N0b2sgY292ZXJzLi4uCisjIDI1CVJVLVBSSQlQcmltb3Jza3kgS3JhaQorIyAyNwlSVS1LSEEJS2hhYmFyb3ZzayBLcmFpCisjIDc5CVJVLVlFVglKZXdpc2ggQXV0b25vbW91cyBPYmxhc3QKKyMKKyMgLi4uYW5kIHBhcnRzIG9mICgxNCwgUlUtU0EpIFNha2hhIChZYWt1dGlhKSBSZXB1YmxpYzoKKyMgMTQtMDkJKioqKglWZXJraG95YW5za3kgRGlzdHJpY3QKKyMgMTQtMzEJKioqKglVc3QtWWFuc2t5IERpc3RyaWN0CisKKyMgTWlsbmUgMTg5OSBzYXlzIFZsYWRpdm9zdG9rIHdhcyA4OjQ3OjMzLjUuCisjIEJ5YWxva296IDE5MTkgc2F5cyBWbGFkaXZvc3RvayB3YXMgODo0NzozMS4KKyMgR28gd2l0aCBCeWFsb2tvei4KKworWm9uZSBBc2lhL1ZsYWRpdm9zdG9rCSA4OjQ3OjMxIC0JTE1UCTE5MjIgTm92IDE1CiAJCQkgOTowMAktCVZMQVQJMTkzMCBKdW4gMjEgIyBWbGFkaXZvc3RvayBUaW1lCi0JCQkxMDowMAlSdXNzaWEJVkxBJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgOTowMAlSdXNzaWEJVkxBJXNTVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCVZMQSVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJMTE6MDAJLQlWTEFUCisJCQkxMDowMAlSdXNzaWEJVkxBJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVZMQSVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMTowMAktCVZMQVQJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkxMDowMAktCVZMQVQKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgorIyBBc2lhL0toYW5keWdhIGNvdmVycyBwYXJ0cyBvZiAoMTQsIFJVLVNBKSBTYWtoYSAoWWFrdXRpYSkgUmVwdWJsaWM6CisjIDE0LTI4CSoqKioJVG9tcG9uc2t5IERpc3RyaWN0CisjIDE0LTMwCSoqKioJVXN0LU1heXNreSBEaXN0cmljdAogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDEyLTA1LTA5KToKICMgVG9tcG9uc2tpaiBhbmQgVXN0Jy1NYWpza2lqIHN3aXRjaGVkIGZyb20gVmxhZGl2b3N0b2sgdGltZSB0byBZYWt1dHNrIHRpbWUKICMgaW4gMjAxMS4KLSMKKwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDEyLTExLTI1KToKICMgU2hhbmtzIGFuZCBQb3R0ZW5nZXIgKDIwMDMpIGhhcyBLaGFuZHlnYSBvbiBZYWt1dHNrIHRpbWUuCiAjIE1ha2UgYSB3aWxkIGd1ZXNzIHRoYXQgaXQgc3dpdGNoZWQgdG8gVmxhZGl2b3N0b2sgdGltZSBpbiAyMDA0LgogIyBUaGlzIHRyYW5zaXRpb24gaXMgbm8gZG91YnQgd3JvbmcsIGJ1dCB3ZSBoYXZlIG5vIGJldHRlciBpbmZvLgotIworCiBab25lIEFzaWEvS2hhbmR5Z2EJIDk6MDI6MTMgLQlMTVQJMTkxOSBEZWMgMTUKIAkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQotCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA4OjAwCVJ1c3NpYQlZQUslc1QJMTk5MiBKYW4gMTkgIDI6MDBzCiAJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTIwMDQKLQkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMjAxMSBNYXIgMjcgMjowMHMKLQkJCTExOjAwCS0JVkxBVAkyMDExIFNlcCAxMyAwOjAwcyAjIERlY3JlZSA3MjU/Ci0JCQkxMDowMAktCVlBS1QKKwkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMTowMAktCVZMQVQJMjAxMSBTZXAgMTMgIDA6MDBzICMgRGVjcmVlIDcyNT8KKwkJCTEwOjAwCS0JWUFLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA5OjAwCS0JWUFLVAogCi0jCi0jIFNha2hhbGluc2theWEgb2JsYXN0Jy4KLSMgVGhlIFpvbmUgbmFtZSBzaG91bGQgYmUgWXV6aG5vLVNha2hhbGluc2ssIGJ1dCB0aGF0J3MgdG9vIGxvbmcuCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CisjIEFzaWEvU2FraGFsaW4gY292ZXJzLi4uCisjIDY1CVJVLVNBSwlTYWtoYWxpbiBPYmxhc3QKKyMgLi4ud2l0aCB0aGUgZXhjZXB0aW9uIG9mOgorIyA2NS0xMQkqKioqCVNldmVyby1LdXJpbHNreSBEaXN0cmljdCAoTm9ydGggS3VyaWwgSXNsYW5kcykKKworIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBBc2lhL1l1emhuby1TYWtoYWxpbnNrLCBidXQgdGhhdCdzIHRvbyBsb25nLgogWm9uZSBBc2lhL1Nha2hhbGluCSA5OjMwOjQ4IC0JTE1UCTE5MDUgQXVnIDIzCi0JCQkgOTowMAktCUNKVAkxOTM4CisJCQkgOTowMAktCUpDU1QJMTkzNyBPY3QgIDEKIAkJCSA5OjAwCS0JSlNUCTE5NDUgQXVnIDI1Ci0JCQkxMTowMAlSdXNzaWEJU0FLJXNUCTE5OTEgTWFyIDMxIDI6MDBzICMgU2FraGFsaW4gVC4KLQkJCTEwOjAwCVJ1c3NpYQlTQUslc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5NyBNYXIgbGFzdFN1biAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJMTE6MDAJLQlTQUtUCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDMtMTAtMTgpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIE1hZ2FkYW5za2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIFNha2hhIChZYWt1dGl5YSkuCi0jIFByb2JhYmx5IGFsc286IEt1cmlsIElzbGFuZHMuCisJCQkxMTowMAlSdXNzaWEJU0FLJXNUCTE5OTEgTWFyIDMxICAyOjAwcyAjIFNha2hhbGluIFQKKwkJCTEwOjAwCVJ1c3NpYQlTQUslc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJU0FLJXNUCTE5OTcgTWFyIGxhc3RTdW4gIDI6MDBzCisJCQkxMDowMAlSdXNzaWEJU0FLJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTE6MDAJLQlTQUtUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJMTA6MDAJLQlTQUtUCiAKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6Ci0jIFRoZSBTYWtoYSBkaXN0cmljdHMgYXJlOiBBYnlqc2tpaiwgQWxsYWlraG92c2tpaiwgVmVya2hoaG5la29seW1za2lqLCBNb21za2lqLAotIyBOaXpobmVrb2x5bXNraWosIC4uLiBTcmVkbmVrb2x5bXNraWouCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6CisjIEFzaWEvTWFnYWRhbiBjb3ZlcnMuLi4KKyMgNDkJUlUtTUFHCU1hZ2FkYW4gT2JsYXN0CisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNiksIHBlciBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTQtMDctMDIpOgorIyBNYWdhZGFuIE9ibGFzdCBpcyBtb3ZpbmcgZnJvbSBVVEMrMTIgdG8gVVRDKzEwIG9uIDIwMTQtMTAtMjY7IGhvd2V2ZXIsCisjIHNldmVyYWwgZGlzdHJpY3RzIG9mIFNha2hhIFJlcHVibGljIGFzIHdlbGwgYXMgU2V2ZXJvLUt1cmlsc2t5IERpc3RyaWN0IG9mCisjIHRoZSBTYWtoYWxpbiBPYmxhc3QgKGFsc28ga25vd24gYXMgdGhlIE5vcnRoIEt1cmlsIElzbGFuZHMpLCByZXByZXNlbnRlZAorIyB1bnRpbCBub3cgYnkgQXNpYS9NYWdhZGFuLCB3aWxsIGluc3RlYWQgbW92ZSB0byBVVEMrMTEuICBUaGVzZSByZWdpb25zIHdpbGwKKyMgbmVlZCB0aGVpciBvd24gem9uZS4KKwogWm9uZSBBc2lhL01hZ2FkYW4JMTA6MDM6MTIgLQlMTVQJMTkyNCBNYXkgIDIKIAkJCTEwOjAwCS0JTUFHVAkxOTMwIEp1biAyMSAjIE1hZ2FkYW4gVGltZQotCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJMTI6MDAJLQlNQUdUCisJCQkxMTowMAlSdXNzaWEJTUFHJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMjowMAktCU1BR1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkxMDowMAktCU1BR1QKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDYpOgorIyBBc2lhL1NyZWRuZWtvbHltc2sgY292ZXJzIHBhcnRzIG9mICgxNCwgUlUtU0EpIFNha2hhIChZYWt1dGlhKSBSZXB1YmxpYzoKKyMgMTQtMDEJKioqKglBYnl5c2t5IERpc3RyaWN0CisjIDE0LTAzCSoqKioJQWxsYWlraG92c2t5IERpc3RyaWN0CisjIDE0LTA4CSoqKioJVmVya2huZWtvbHltc2t5IERpc3RyaWN0CisjIDE0LTE3CSoqKioJTW9tc2t5IERpc3RyaWN0CisjIDE0LTIwCSoqKioJTml6aG5la29seW1za3kgRGlzdHJpY3QKKyMgMTQtMjUJKioqKglTcmVkbmVrb2x5bXNreSBEaXN0cmljdAorIworIyAuLi5hbmQgcGFydHMgb2YgKDY1LCBSVS1TQUspIFNha2hhbGluIE9ibGFzdDoKKyMgNjUtMTEJKioqKglTZXZlcm8tS3VyaWxza3kgRGlzdHJpY3QgKE5vcnRoIEt1cmlsIElzbGFuZHMpCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMik6CisjIE95bXlha29uc2t5IERpc3RyaWN0IG9mIFNha2hhIFJlcHVibGljIChyZXByZXNlbnRlZCBieSBVc3QtTmVyYSksIGFsb25nIHdpdGgKKyMgbW9zdCBvZiBTYWtoYWxpbiBPYmxhc3QgKHJlcHJlc2VudGVkIGJ5IFNha2hhbGluKSB3aWxsIGJlIG1vdmluZyB0byBVVEMrMTAgb24KKyMgMjAxNC0xMC0yNiB0byBzdGF5IGFsaWduZWQgd2l0aCBWTEFUL1NBS1Q7IGhvd2V2ZXIsIFNldmVyby1LdXJpbHNreSBEaXN0cmljdAorIyBvZiB0aGUgU2FraGFsaW4gT2JsYXN0IChhbHNvIGtub3duIGFzIHRoZSBOb3J0aCBLdXJpbCBJc2xhbmRzLCByZXByZXNlbnRlZCBieQorIyBTZXZlcm8tS3VyaWxzaykgd2lsbCByZW1haW4gb24gVVRDKzExLgorCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDYpOgorIyBBc3N1bWUgTm9ydGggS3VyaWwgSXNsYW5kcyBoYXZlIGhpc3RvcnkgbGlrZSBNYWdhZGFuIGJlZm9yZSAyMDExLTAzLTI3LgorIyBUaGVyZSBpcyBhIGRlY2VudCBjaGFuY2UgdGhpcyBpcyB3cm9uZywgaW4gd2hpY2ggY2FzZSBhIG5ldyB6b25lCisjIEFzaWEvU2V2ZXJvLUt1cmlsc2sgd291bGQgYmVjb21lIG5lY2Vzc2FyeS4KKyMKKyMgU3JlZG5la29seW1zayBhbmQgWnlyeWFua2EgYXJlIHRoZSBtb3N0IHBvcHVsb3VzIHBsYWNlcyBhbW9uZ3N0IHRoZXNlCisjIGRpc3RyaWN0cywgYnV0IGhhdmUgdmVyeSBzaW1pbGFyIHBvcHVsYXRpb25zLiAgSW4gZmFjdCwgV2lraXBlZGlhIGN1cnJlbnRseQorIyBsaXN0cyB0aGVtIGJvdGggYXMgaGF2aW5nIDM1MjggcGVvcGxlLCBleGFjdGx5IDE2NjggbWFsZXMgYW5kIDE4NjAgZmVtYWxlcworIyBlYWNoISAgKFlpa2VzISkKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvdy8/dGl0bGU9U3JlZG5la29seW1za3lfRGlzdHJpY3Qmb2xkaWQ9NjAzNDM1Mjc2CisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3cvP3RpdGxlPVZlcmtobmVrb2x5bXNreV9EaXN0cmljdCZvbGRpZD01OTQzNzg0OTMKKyMgQXNzdW1lIHRoaXMgaXMgYSBtaXN0YWtlLCBhbGJlaXQgYW4gYW11c2luZyBvbmUuCisjCisjIExvb2tpbmcgYXQgY2Vuc3VzZXMsIHRoZSBwb3B1bGF0aW9ucyBvZiB0aGUgdHdvIG11bmljaXBhbGl0aWVzIHNlZW0gdG8gaGF2ZQorIyBmbHVjdHVhdGVkIHJlY2VudGx5LiAgWnlyeWFua2Egd2FzIG1vcmUgcG9wdWxvdXMgdGhhbiBTcmVkbmVrb2x5bXNrIGluIHRoZQorIyAxOTg5IGFuZCAyMDAyIGNlbnN1c2VzLCBidXQgU3JlZG5la29seW1zayB3YXMgbW9yZSBwb3B1bG91cyBpbiB0aGUgbW9zdAorIyByZWNlbnQgKDIwMTApIGNlbnN1cywgMzUyNSB0byAzMTcwLiAgKFNlZSBwYWdlcyAxOTUgYW5kIDE5NyBvZgorIyBodHRwOi8vd3d3Lmdrcy5ydS9mcmVlX2RvYy9uZXdfc2l0ZS9wZXJlcGlzMjAxMC9jcm9jL0RvY3VtZW50cy9Wb2wxL3B1Yi0wMS0wNS5wZGYKKyMgaW4gUnVzc2lhbi4pICBJbiBhZGRpdGlvbiwgU3JlZG5la29seW1zayBhcHBlYXJzIHRvIGJlIGEgbXVjaCBvbGRlcgorIyBzZXR0bGVtZW50IGFuZCB0aGUgcG9wdWxhdGlvbiBvZiBaeXJ5YW5rYSBzZWVtcyB0byBiZSBkZWNsaW5pbmcuCisjIEdvIHdpdGggU3JlZG5la29seW1zay4KKyMKKyMgU2luY2UgTWFnYWRhbiBPYmxhc3QgbW92ZXMgdG8gVVRDKzEwIG9uIDIwMTQtMTAtMjYsIHdlIGNhbm5vdCBrZWVwIHVzaW5nIE1BR1QKKyMgYXMgdGhlIGFiYnJldmlhdGlvbi4gIFVzZSBTUkVUIGluc3RlYWQuCisKK1pvbmUgQXNpYS9TcmVkbmVrb2x5bXNrCTEwOjE0OjUyIC0JTE1UCTE5MjQgTWF5ICAyCisJCQkxMDowMAktCU1BR1QJMTkzMCBKdW4gMjEgIyBNYWdhZGFuIFRpbWUKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMDowMAlSdXNzaWEJTUFHJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEyOjAwCS0JTUFHVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTExOjAwCS0JU1JFVAkjIFNyZWRuZWtvbHltc2sgVGltZQorCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CisjIEFzaWEvVXN0LU5lcmEgY292ZXJzIHBhcnRzIG9mICgxNCwgUlUtU0EpIFNha2hhIChZYWt1dGlhKSBSZXB1YmxpYzoKKyMgMTQtMjIJKioqKglPeW15YWtvbnNreSBEaXN0cmljdAogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDEyLTA1LTA5KToKLSMgT2pteWFrb25za2lqIGFuZCB0aGUgS3VyaWwgSXNsYW5kcyBzd2l0Y2hlZCBmcm9tCisjIE9qbXlha29uc2tpaiBbYW5kIHRoZSBLdXJpbCBJc2xhbmRzXSBzd2l0Y2hlZCBmcm9tCiAjIE1hZ2FkYW4gdGltZSB0byBWbGFkaXZvc3RvayB0aW1lIGluIDIwMTEuCisjCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDYpLCBwZXIgQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDE0LTA3LTAyKToKKyMgSXQncyB1bmxpa2VseSB0aGF0IGFueSBvZiB0aGUgS3VyaWwgSXNsYW5kcyB3ZXJlIGludm9sdmVkIGluIHN1Y2ggYSBzd2l0Y2gsCisjIGFzIHRoZSBTb3V0aCBhbmQgTWlkZGxlIEt1cmlscyBoYXZlIGJlZW4gb24gVVRDKzExIChTQUtUKSB3aXRoIHRoZSByZXN0IG9mCisjIFNha2hhbGluIE9ibGFzdCBzaW5jZSBhdCBsZWFzdCAyMDExLTA5LCBhbmQgdGhlIE5vcnRoIEt1cmlscyBoYXZlIGJlZW4gb24KKyMgVVRDKzEyIHNpbmNlIGF0IGxlYXN0IHRoZW4sIHRvby4KKwogWm9uZSBBc2lhL1VzdC1OZXJhCSA5OjMyOjU0IC0JTE1UCTE5MTkgRGVjIDE1CiAJCQkgODowMAktCVlBS1QJMTkzMCBKdW4gMjEgIyBZYWt1dHNrIFRpbWUKIAkJCSA5OjAwCVJ1c3NpYQlZQUtUCTE5ODEgQXByICAxCi0JCQkxMTowMAlSdXNzaWEJTUFHJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJTUFHJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJTUFHJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkxMjowMAktCU1BR1QJMjAxMSBTZXAgMTMgMDowMHMgIyBEZWNyZWUgNzI1PwotCQkJMTE6MDAJLQlWTEFUCisJCQkxMTowMAlSdXNzaWEJTUFHJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMjowMAktCU1BR1QJMjAxMSBTZXAgMTMgIDA6MDBzICMgRGVjcmVlIDcyNT8KKwkJCTExOjAwCS0JVkxBVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTEwOjAwCS0JVkxBVAogCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIEthbWNoYXRza2F5YSBvYmxhc3QnLCBLb3J5YWtza2lqIGF2dG9ub21ueWogb2tydWcuCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CisjIEFzaWEvS2FtY2hhdGthIGNvdmVycy4uLgorIyA5MQlSVS1LQU0JS2FtY2hhdGthIEtyYWkKICMKLSMgVGhlIFpvbmUgbmFtZSBzaG91bGQgYmUgQXNpYS9QZXRyb3BhdmxvdnNrLUthbWNoYXRza2ksIGJ1dCB0aGF0J3MgdG9vIGxvbmcuCisjIE5vdGU6IEVmZmVjdGl2ZSAyMDA3LTA3LTAxLCAoNDEpIEthbWNoYXRrYSBPYmxhc3QgYW5kICg4MikgS29yeWFrCisjIEF1dG9ub21vdXMgT2tydWcgbWVyZ2VkIHRvIGZvcm0gKDkxLCBSVS1LQU0pIEthbWNoYXRrYSBLcmFpLgorCisjIFRoZSBab25lIG5hbWUgc2hvdWxkIGJlIEFzaWEvUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIG9yIHBlcmhhcHMKKyMgQXNpYS9QZXRyb3BhdmxvdnNrLUthbWNoYXRza3ksIGJ1dCB0aGVzZSBhcmUgdG9vIGxvbmcuCiBab25lIEFzaWEvS2FtY2hhdGthCTEwOjM0OjM2IC0JTE1UCTE5MjIgTm92IDEwCiAJCQkxMTowMAktCVBFVFQJMTkzMCBKdW4gMjEgIyBQLUsgVGltZQotCQkJMTI6MDAJUnVzc2lhCVBFVCVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCVBFVCVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTI6MDAJUnVzc2lhCVBFVCVzVAkyMDEwIE1hciAyOCAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCVBFVCVzVAkyMDExIE1hciAyNyAyOjAwcworCQkJMTI6MDAJUnVzc2lhCVBFVCVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlQRVQlc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkxMjowMAlSdXNzaWEJUEVUJXNUCTIwMTAgTWFyIDI4ICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCVBFVCVzVAkyMDExIE1hciAyNyAgMjowMHMKIAkJCTEyOjAwCS0JUEVUVAotIwotIyBDaHVrb3Rza2lqIGF2dG9ub21ueWogb2tydWcKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgorIyBBc2lhL0FuYWR5ciBjb3ZlcnMuLi4KKyMgODcJUlUtQ0hVCUNodWtvdGthIEF1dG9ub21vdXMgT2tydWcKKwogWm9uZSBBc2lhL0FuYWR5cgkxMTo0OTo1NiAtCUxNVAkxOTI0IE1heSAgMgogCQkJMTI6MDAJLQlBTkFUCTE5MzAgSnVuIDIxICMgQW5hZHlyIFRpbWUKLQkJCTEzOjAwCVJ1c3NpYQlBTkElc1QJMTk4MiBBcHIgIDEgMDowMHMKLQkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlBTkElc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMjAxMCBNYXIgMjggMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlBTkElc1QJMjAxMSBNYXIgMjcgMjowMHMKKwkJCTEzOjAwCVJ1c3NpYQlBTkElc1QJMTk4MiBBcHIgIDEgIDA6MDBzCisJCQkxMjowMAlSdXNzaWEJQU5BJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCUFOQSVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMjAxMCBNYXIgMjggIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJQU5BJXNUCTIwMTEgTWFyIDI3ICAyOjAwcwogCQkJMTI6MDAJLQlBTkFUCiAKKwogIyBTYW4gTWFyaW5vCiAjIFNlZSBFdXJvcGUvUm9tZS4KIApAQCAtMjQ4OCwxMSArMjg0MSwxMSBAQAogWm9uZQlFdXJvcGUvQmVsZ3JhZGUJMToyMjowMAktCUxNVAkxODg0CiAJCQkxOjAwCS0JQ0VUCTE5NDEgQXByIDE4IDIzOjAwCiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUKLQkJCTE6MDAJLQlDRVQJMTk0NSBNYXkgOCAyOjAwcworCQkJMTowMAktCUNFVAkxOTQ1IE1heSAgOCAgMjowMHMKIAkJCTE6MDAJMTowMAlDRVNUCTE5NDUgU2VwIDE2ICAyOjAwcwotIyBNZXRvZCBLb3plbGogcmVwb3J0cyB0aGF0IHRoZSBsZWdhbCBkYXRlIG9mCisjIE1ldG9kIEtvxb5lbGogcmVwb3J0cyB0aGF0IHRoZSBsZWdhbCBkYXRlIG9mCiAjIHRyYW5zaXRpb24gdG8gRVUgcnVsZXMgd2FzIDE5ODItMTEtMjcsIGZvciBhbGwgb2YgWXVnb3NsYXZpYSBhdCB0aGUgdGltZS4KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGRvbid0IGdpdmUgYXMgbXVjaCBkZXRhaWwsIHNvIGdvIHdpdGggS296ZWxqLgorIyBTaGFua3MgJiBQb3R0ZW5nZXIgZG9uJ3QgZ2l2ZSBhcyBtdWNoIGRldGFpbCwgc28gZ28gd2l0aCBLb8W+ZWxqLgogCQkJMTowMAktCUNFVAkxOTgyIE5vdiAyNwogCQkJMTowMAlFVQlDRSVzVAogTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL0xqdWJsamFuYQkjIFNsb3ZlbmlhCkBAIC0yNTY4LDEzICsyOTIxLDEzIEBACiAJCQkgMDowMAkxOjAwCVdFU1QJMTkxOCBPY3QgIDcgMjM6MDAKIAkJCSAwOjAwCS0JV0VUCTE5MjQKIAkJCSAwOjAwCVNwYWluCVdFJXNUCTE5MjkKLQkJCSAwOjAwIFNwYWluQWZyaWNhIFdFJXNUIDE5ODQgTWFyIDE2CisJCQkgMDowMCBTcGFpbkFmcmljYSBXRSVzVAkxOTg0IE1hciAxNgogCQkJIDE6MDAJLQlDRVQJMTk4NgogCQkJIDE6MDAJRVUJQ0Ulc1QKIFpvbmUJQXRsYW50aWMvQ2FuYXJ5CS0xOjAxOjM2IC0JTE1UCTE5MjIgTWFyICMgTGFzIFBhbG1hcyBkZSBHcmFuIEMuCi0JCQktMTowMAktCUNBTlQJMTk0NiBTZXAgMzAgMTowMCAjIENhbmFyaWVzIFRpbWUKLQkJCSAwOjAwCS0JV0VUCTE5ODAgQXByICA2IDA6MDBzCi0JCQkgMDowMAkxOjAwCVdFU1QJMTk4MCBTZXAgMjggMDowMHMKKwkJCS0xOjAwCS0JQ0FOVAkxOTQ2IFNlcCAzMCAgMTowMCAjIENhbmFyaWVzIFQKKwkJCSAwOjAwCS0JV0VUCTE5ODAgQXByICA2ICAwOjAwcworCQkJIDA6MDAJMTowMAlXRVNUCTE5ODAgU2VwIDI4ICAwOjAwcwogCQkJIDA6MDAJRVUJV0Ulc1QKICMgSUFUQSBTU0lNICgxOTk2LTA5KSBzYXlzIHRoZSBDYW5hcmllcyBzd2l0Y2ggYXQgMjowMHUsIG5vdCAxOjAwdS4KICMgSWdub3JlIHRoaXMgZm9yIG5vdywgYXMgdGhlIENhbmFyaWVzIGFyZSBwYXJ0IG9mIHRoZSBFVS4KQEAgLTI1ODMsNyArMjkzNiw3IEBACiAKICMgRnJvbSBJdmFuIE5pbHNzb24gKDIwMDEtMDQtMTMpLCBzdXBlcnNlZGluZyBTaGFua3MgJiBQb3R0ZW5nZXI6CiAjCi0jIFRoZSBsYXcgIlN2ZW5zayBmb3JmYXR0bmluZ3NzYW1saW5nIDE4NzgsIG5vIDE0IiBhYm91dCBzdGFuZGFyZCB0aW1lIGluIDE4Nzk6CisjIFRoZSBsYXcgIlN2ZW5zayBmw7ZyZmF0dG5pbmdzc2FtbGluZyAxODc4LCBubyAxNCIgYWJvdXQgc3RhbmRhcmQgdGltZSBpbiAxODc5OgogIyBGcm9tIHRoZSBiZWdpbm5pbmcgb2YgMTg3OSAodGhhdCBpcyAwMS0wMSAwMDowMCkgdGhlIHRpbWUgZm9yIGFsbAogIyBwbGFjZXMgaW4gdGhlIGNvdW50cnkgaXMgInRoZSBtZWFuIHNvbGFyIHRpbWUgZm9yIHRoZSBtZXJpZGlhbiBhdAogIyB0aHJlZSBkZWdyZWVzLCBvciB0d2VsdmUgbWludXRlcyBvZiB0aW1lLCB0byB0aGUgd2VzdCBvZiB0aGUKQEAgLTI1OTQsNyArMjk0Nyw3IEBACiAjIG5hdGlvbmFsIHN0YW5kYXJkIHRpbWUgYXMgMDE6MDA6MTQgYWhlYWQgb2YgR01ULi4uLgogIwogIyBBYm91dCB0aGUgYmVnaW5uaW5nIG9mIENFVCBpbiBTd2VkZW4uIFRoZSBsYXd0ZXh0ICgiU3ZlbnNrCi0jIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTg5OSwgbm8gNDQiKSBzdGF0ZXMsIHRoYXQgImZyb20gdGhlIGJlZ2lubmluZworIyBmw7ZyZmF0dG5pbmdzc2FtbGluZyAxODk5LCBubyA0NCIpIHN0YXRlcywgdGhhdCAiZnJvbSB0aGUgYmVnaW5uaW5nCiAjIG9mIDE5MDAuLi4gLi4uIHRoZSBzYW1lIGFzIHRoZSBtZWFuIHNvbGFyIHRpbWUgZm9yIHRoZSBtZXJpZGlhbiBhdAogIyB0aGUgZGlzdGFuY2Ugb2Ygb25lIGhvdXIgb2YgdGltZSBmcm9tIHRoZSBtZXJpZGlhbiBvZiB0aGUgRW5nbGlzaAogIyBvYnNlcnZhdG9yeSBhdCBHcmVlbndpY2gsIG9yIGF0IDEyIG1pbnV0ZXMgMTQgc2Vjb25kcyB0byB0aGUgd2VzdApAQCAtMjYwMiw3ICsyOTU1LDcgQEAKICMgMTg5OS0wNi0xNi4gIEluIHNob3J0OiBBdCAxOTAwLTAxLTAxIDAwOjAwOjAwIHRoZSBuZXcgc3RhbmRhcmQgdGltZQogIyBpbiBTd2VkZW4gaXMgMDE6MDA6MDAgYWhlYWQgb2YgR01ULgogIwotIyAxOTE2OiBUaGUgbGF3dGV4dCAoIlN2ZW5zayBmb3JmYXR0bmluZ3NzYW1saW5nIDE5MTYsIG5vIDEyNCIpIHN0YXRlcworIyAxOTE2OiBUaGUgbGF3dGV4dCAoIlN2ZW5zayBmw7ZyZmF0dG5pbmdzc2FtbGluZyAxOTE2LCBubyAxMjQiKSBzdGF0ZXMKICMgdGhhdCAiMTkxNi0wNS0xNSBpcyBjb25zaWRlcmVkIHRvIGJlZ2luIG9uZSBob3VyIGVhcmxpZXIiLiBJdCBpcwogIyBwcmV0dHkgb2J2aW91cyB0aGF0IGF0IDA1LTE0IDIzOjAwIHRoZSBjbG9ja3MgYXJlIHNldCB0byAwNS0xNSAwMDowMC4uLi4KICMgRnVydGhlciB0aGUgbGF3IHNheXMsIHRoYXQgIjE5MTYtMDktMzAgaXMgY29uc2lkZXJlZCB0byBlbmQgb25lIGhvdXIgbGF0ZXIiLgpAQCAtMjYxMiw3ICsyOTY1LDcgQEAKICMgbm90IGF2YWlsYWJsZSBvbiB0aGUgc2l0ZSAodG8gbXkga25vd2xlZGdlIHRoZXkgYXJlIG9ubHkgYXZhaWxhYmxlCiAjIGluIFN3ZWRpc2gpOiA8aHR0cDovL3d3dy5yaWtzZGFnZW4uc2UvZW5nbGlzaC93b3JrL3Nmc3QuYXNwPiAodHlwZQogIyAic29tbWFydGlkIiB3aXRob3V0IHRoZSBxdW90ZXMgaW4gdGhlIGZpZWxkICJGcml0ZXh0IiBhbmQgdGhlbiBjbGljawotIyB0aGUgU29rLWJ1dHRvbikuCisjIHRoZSBTw7ZrLWJ1dHRvbikuCiAjCiAjICgyMDAxLTA1LTEzKToKICMKQEAgLTI2MjcsOSArMjk4MCw5IEBACiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgRXVyb3BlL1N0b2NraG9sbQkxOjEyOjEyIC0JTE1UCTE4NzkgSmFuICAxCi0JCQkxOjAwOjE0CS0JU0VUCTE5MDAgSmFuICAxCSMgU3dlZGlzaCBUaW1lCisJCQkxOjAwOjE0CS0JU0VUCTE5MDAgSmFuICAxICMgU3dlZGlzaCBUaW1lCiAJCQkxOjAwCS0JQ0VUCTE5MTYgTWF5IDE0IDIzOjAwCi0JCQkxOjAwCTE6MDAJQ0VTVAkxOTE2IE9jdCAgMSAwMTowMAorCQkJMTowMAkxOjAwCUNFU1QJMTkxNiBPY3QgIDEgIDE6MDAKIAkJCTE6MDAJLQlDRVQJMTk4MAogCQkJMTowMAlFVQlDRSVzVAogCkBAIC0yNjM3LDcgKzI5OTAsNyBAQAogIyBGcm9tIEhvd3NlOgogIyBCeSB0aGUgZW5kIG9mIHRoZSAxOHRoIGNlbnR1cnkgY2xvY2tzIGFuZCB3YXRjaGVzIGJlY2FtZSBjb21tb25wbGFjZQogIyBhbmQgdGhlaXIgcGVyZm9ybWFuY2UgaW1wcm92ZWQgZW5vcm1vdXNseS4gIENvbW11bml0aWVzIGJlZ2FuIHRvIGtlZXAKLSMgbWVhbiB0aW1lIGluIHByZWZlcmVuY2UgdG8gYXBwYXJlbnQgdGltZSAtLSBHZW5ldmEgZnJvbSAxNzgwIC4uLi4KKyMgbWVhbiB0aW1lIGluIHByZWZlcmVuY2UgdG8gYXBwYXJlbnQgdGltZSAtIEdlbmV2YSBmcm9tIDE3ODAgLi4uLgogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKICMgRnJvbSBXaGl0bWFuICh3aG8gd3JpdGVzICJNaWRuaWdodD8iKToKICMgUnVsZQlTd2lzcwkxOTQwCW9ubHkJLQlOb3YJIDIJMDowMAkxOjAwCVMKQEAgLTI2NTMsNyArMzAwNiw3IEBACiAjIHRvIGJlIHdyb25nLiBUaGlzIGlzIG5vdyB2ZXJpZmllZC4KICMKICMgSSBoYXZlIGZvdW5kIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgcnVsaW5nIGJ5IHRoZSBTd2lzcyBGZWRlcmFsCi0jIGdvdmVybm1lbnQsIGluICdFaWRnZW5bb11zc2lzY2hlIEdlc2V0emVzc2FtbWx1bmcgMTk0MSBhbmQgMTk0MicgKFN3aXNzCisjIGdvdmVybm1lbnQsIGluICdFaWRnZW7DtnNzaXNjaGUgR2VzZXR6ZXNzYW1tbHVuZyAxOTQxIGFuZCAxOTQyJyAoU3dpc3MKICMgZmVkZXJhbCBsYXcgY29sbGVjdGlvbikuLi4KICMKICMgRFNUIGJlZ2FuIG9uIE1vbmRheSA1IE1heSAxOTQxLCAxOjAwIGFtIGJ5IHNoaWZ0aW5nIHRoZSBjbG9ja3MgdG8gMjowMCBhbQpAQCAtMjY3Miw3ICszMDI1LDcgQEAKICMgbmlnaHQgYXMgYW4gYWJzb2x1dGUgbm92ZWx0eSwgYmVjYXVzZSB0aGlzIHdhcyB0aGUgZmlyc3QgdGltZSB0aGF0IHN1Y2gKICMgYSB0aGluZyBoYWQgaGFwcGVuZWQgaW4gU3dpdHplcmxhbmQuCiAjCi0jIEkgaGF2ZSBhbHNvIGNoZWNrZWQgMTkxNiwgYmVjYXVzZSBvbmUgYm9vayBzb3VyY2UgKEdhYnJpZWwsIFRyYWl0ZSBkZQorIyBJIGhhdmUgYWxzbyBjaGVja2VkIDE5MTYsIGJlY2F1c2Ugb25lIGJvb2sgc291cmNlIChHYWJyaWVsLCBUcmFpdMOpIGRlCiAjIGwnaGV1cmUgZGFucyBsZSBtb25kZSkgY2xhaW1zIHRoYXQgU3dpdHplcmxhbmQgaGFkIERTVCBpbiAxOTE2LiBUaGlzIGlzCiAjIGZhbHNlLCBubyBvZmZpY2lhbCBkb2N1bWVudCBjb3VsZCBiZSBmb3VuZC4gUHJvYmFibHkgR2FicmllbCBnb3QgbWlzbGVkCiAjIGJ5IHJlZmVyZW5jZXMgdG8gR2VybWFueSwgd2hpY2ggaW50cm9kdWNlZCBEU1QgaW4gMTkxNiBmb3IgdGhlIGZpcnN0IHRpbWUuCkBAIC0yNjg2LDE5ICszMDM5LDE5IEBACiAjIE9uZSBmdXJ0aGVyIGRldGFpbCBmb3IgU3dpdHplcmxhbmQsIHdoaWNoIGlzIHByb2JhYmx5IG91dCBvZiBzY29wZSBmb3IKICMgbW9zdCB1c2VycyBvZiB0emRhdGE6IFRoZSBbRXVyb3BlL1p1cmljaCB6b25lXSAuLi4KICMgZGVzY3JpYmVzIGFsbCBvZiBTd2l0emVybGFuZCBjb3JyZWN0bHksIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotIyB0aGUgQ2FudG9uZSBHZW5ldmUgKEdlbmV2YSwgR2VuZikuIEJldHdlZW4gMTg0OCBhbmQgMTg5NCBHZW5ldmUgZGlkIG5vdAorIyB0aGUgQ2FudG9uIGRlIEdlbsOodmUgKEdlbmV2YSwgR2VuZikuIEJldHdlZW4gMTg0OCBhbmQgMTg5NCBHZW5ldmEgZGlkIG5vdAogIyBmb2xsb3cgQmVybiBNZWFuIFRpbWUgYnV0IGtlcHQgaXRzIG93biBsb2NhbCBtZWFuIHRpbWUuCiAjIFRvIHJlcHJlc2VudCB0aGlzLCBhbiBleHRyYSB6b25lIHdvdWxkIGJlIG5lZWRlZC4KICMKICMgRnJvbSBBbG9pcyBUcmVpbmRsICgyMDEzLTA5LTExKToKICMgVGhlIEZlZGVyYWwgcmVndWxhdGlvbnMgc2F5CiAjIGh0dHA6Ly93d3cuYWRtaW4uY2gvb3BjL2RlL2NsYXNzaWZpZWQtY29tcGlsYXRpb24vMjAwNzEwOTYvaW5kZXguaHRtbAotIyAuLi4gdGhlIG1lcmlkaWFuIGZvciBCZXJuIG1lYW4gdGltZSAuLi4gaXMgNyBkZWdyZWVzIDI2JzIyLjUwIi4KKyMgLi4uIHRoZSBtZXJpZGlhbiBmb3IgQmVybiBtZWFuIHRpbWUgLi4uIGlzIDcgZGVncmVlcyAyNicgMjIuNTAiLgogIyBFeHByZXNzZWQgaW4gdGltZSwgaXQgaXMgMGgyOW00NS41cy4KIAogIyBGcm9tIFBpZXJyZS1ZdmVzIEJlcmdlciAoMjAxMy0wOS0xMSk6Ci0jIHRoZSAiQ2lyY3VsYWlyZSBkdSBjb25zZWlsIGZlZGVyYWwiIChEZWNlbWJlciAxMSAxODkzKQotIyA8aHR0cDovL3d3dy5hbXRzZHJ1Y2tzY2hyaWZ0ZW4uYmFyLmFkbWluLmNoL3ZpZXdPcmlnRG9jLmRvP2lkPTEwMDcxMzUzPiAuLi4KKyMgdGhlICJDaXJjdWxhaXJlIGR1IGNvbnNlaWwgZsOpZMOpcmFsIiAoRGVjZW1iZXIgMTEgMTg5MykKKyMgaHR0cDovL3d3dy5hbXRzZHJ1Y2tzY2hyaWZ0ZW4uYmFyLmFkbWluLmNoL3ZpZXdPcmlnRG9jLmRvP2lkPTEwMDcxMzUzCiAjIGNsZWFybHkgc3RhdGVzIHRoYXQgdGhlIFsxODk0LTA2LTAxXSBjaGFuZ2Ugc2hvdWxkIGJlIGRvbmUgYXQgbWlkbmlnaHQKICMgYnV0IGlmIG5vIG9uZSBpcyBwcmVzZW50IGFmdGVyIDExIGF0IG5pZ2h0LCBjb3VsZCBiZSBwb3N0cG9uZWQgdW50aWwgb25lCiAjIGhvdXIgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2Ygc2VydmljZS4KQEAgLTI3MDksMTQgKzMwNjIsMTQgQEAKICMgV2UgY2FuIGZpbmQgbm8gcmVsaWFibGUgc291cmNlIGZvciBTaGFua3MncyBhc3NlcnRpb24gdGhhdCBhbGwgb2YgU3dpdHplcmxhbmQKICMgZXhjZXB0IEdlbmV2YSBzd2l0Y2hlZCB0byBCZXJuIE1lYW4gVGltZSBhdCAwMDowMCBvbiAxODQ4LTA5LTEyLiAgVGhpcyBib29rOgogIwotIwlKYWtvYiBNZXNzZXJsaS4gR2xlaWNobWFzc2lnLCBwdW5rdGxpY2gsIHNjaG5lbGw6IFplaXRlaW50ZWlsdW5nIHVuZAorIwlKYWtvYiBNZXNzZXJsaS4gR2xlaWNobcOkc3NpZywgcMO8bmt0bGljaCwgc2NobmVsbC4gWmVpdGVpbnRlaWx1bmcgdW5kCiAjCVplaXRnZWJyYXVjaCBpbiBkZXIgU2Nod2VpeiBpbSAxOS4gSmFocmh1bmRlcnQuIENocm9ub3MsIFp1cmljaCAxOTk1LAogIwlJU0JOIDMtOTA1MzExLTY4LTIsIE9DTEMgNzE3NTcwNzk3LgogIwogIyBzdWdnZXN0cyB0aGF0IHRoZSB0cmFuc2l0aW9uIHdhcyBtb3JlIGdyYWR1YWwsIGFuZCB0aGF0IHRoZSBTd2lzcyBkaWQgbm90CiAjIGFncmVlIGFib3V0IGNpdmlsIHRpbWUgZHVyaW5nIHRoZSB0cmFuc2l0aW9uLiAgVGhlIHRpbWVrZWVwaW5nIGl0IGdpdmVzIHRoZQogIyBtb3N0IGRldGFpbCBmb3IgaXMgcG9zdGFsIGFuZCB0ZWxlZ3JhcGggdGltZTogaGVyZSwgZmVkZXJhbCBsZWdpc2xhdGlvbiAodGhlCi0jICJCdW5kZXNnZXNldHogdWJlciBkaWUgRXJzdGVsbHVuZyB2b24gZWxla3RyaXNjaGVuIFRlbGVncmFwaGVuIikgcGFzc2VkIG9uCisjICJCdW5kZXNnZXNldHogw7xiZXIgZGllIEVyc3RlbGx1bmcgdm9uIGVsZWt0cmlzY2hlbiBUZWxlZ3JhcGhlbiIpIHBhc3NlZCBvbgogIyAxODUxLTExLTIzLCBhbmQgYW4gb2ZmaWNpYWwgaW1wbGVtZW50YXRpb24gbm90aWNlIHdhcyBwdWJsaXNoZWQgMTg1My0wNy0xNgogIyAoQnVuZGVzYmxhdHQgMTg1MywgQmQuIElJLCBTLiA4NTkpLiAgT24gcCA3MiBNZXNzZXJsaSB3cml0ZXMgdGhhdCBpbgogIyBwcmFjdGljZSBzaW5jZSBKdWx5IDE4NTMgQmVybmVzZSB0aW1lIHdhcyB1c2VkIGluICJhbGwgcG9zdGFsIGFuZCB0ZWxlZ3JhcGgKQEAgLTI3MzAsNyArMzA4Myw3IEBACiBSdWxlCVN3aXNzCTE5NDEJMTk0MgktCU9jdAlNb24+PTEJMjowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL1p1cmljaAkwOjM0OjA4IC0JTE1UCTE4NTMgSnVsIDE2ICMgU2VlIGFib3ZlIGNvbW1lbnQuCi0JCQkwOjI5OjQ2CS0JQk1UCTE4OTQgSnVuICMgQmVybiBNZWFuIFRpbWUKKwkJCTA6Mjk6NDYJLQlCTVQJMTg5NCBKdW4gICAgIyBCZXJuIE1lYW4gVGltZQogCQkJMTowMAlTd2lzcwlDRSVzVAkxOTgxCiAJCQkxOjAwCUVVCUNFJXNUCiAKQEAgLTI3MzgsNyArMzA5MSw3IEBACiAKICMgRnJvbSBBbWFyIERldmVnb3dkYSAoMjAwNy0wMS0wMyk6CiAjIFRoZSB0aW1lIHpvbmUgcnVsZXMgZm9yIElzdGFuYnVsLCBUdXJrZXkgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkIGZvciB5ZWFycyBub3cuCi0jIC4uLiBUaGUgbGF0ZXN0IHJ1bGVzIGFyZSBhdmFpbGFibGUgYXQgLQorIyAuLi4gVGhlIGxhdGVzdCBydWxlcyBhcmUgYXZhaWxhYmxlIGF0OgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL3RpbWV6b25lLmh0bWw/bj0xMDcKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDEtMDMpOgogIyBJIGhhdmUgYmVlbiBhYmxlIHRvIGZpbmQgcHJlc3MgcmVjb3JkcyBiYWNrIHRvIDE5OTYgd2hpY2ggYWxsIHNheSB0aGF0CkBAIC0yNzYzLDggKzMxMTYsNyBAQAogIyAob24gYSBub24tZ292ZXJubWVudCBzZXJ2ZXIgdGhvdWdoKSBkZXNjcmliaW5nIGRhdGVzIGJldHdlZW4gMjAwMiBhbmQgMjAwNjoKICMgaHR0cDovL3d3dy5hbG9tYWxpeWUuY29tL2Jra18yMDAyXzM3NjkuaHRtCiAKLSMgRnJvbSBHJm91bWw7a2Rlbml6IEthcmFkYSYjeDAxMWY7ICgyMDExLTAzLTEwKToKLSMKKyMgRnJvbSBHw7ZrZGVuaXogS2FyYWRhxJ8gKDIwMTEtMDMtMTApOgogIyBBY2NvcmRpbmcgdG8gdGhlIGFydGljbGVzIGxpbmtlZCBiZWxvdywgVHVya2V5IHdpbGwgY2hhbmdlIGludG8gc3VtbWVyCiAjIHRpbWUgem9uZSAoR01UKzMpIG9uIE1hcmNoIDI4LCAyMDExIGF0IDM6MDAgYS5tLiBpbnN0ZWFkIG9mIE1hcmNoIDI3LgogIyBUaGlzIGNoYW5nZSBpcyBkdWUgdG8gYSBuYXRpb253aWRlIGV4YW0gb24gMjd0aC4KQEAgLTI3NzcsOSArMzEyOSwxNiBAQAogIyBUdXJraXNoIExvY2FsIGVsZWN0aW9uLi4uLgogIyBodHRwOi8vd3d3LnNhYmFoLmNvbS50ci9Fa29ub21pLzIwMTQvMDIvMTIveWF6LXNhYXRpbmRlLW9uZW1saS1kZWdpc2lrbGlrCiAjIC4uLiBzbyBUdXJrZXkgd2lsbCBtb3ZlIGNsb2NrcyBmb3J3YXJkIG9uZSBob3VyIG9uIE1hcmNoIDMxIGF0IDM6MDAgYS5tLgotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTAyLTE3KToKLSMgSGVyZSBpcyBhbiBFbmdsaXNoLWxhbmd1YWdlIHNvdXJjZToKLSMgaHR0cDovL3d3dy53b3JsZGJ1bGxldGluLm5ldC90dXJrZXkvMTI5MDE2L3R1cmtleS1zd2l0Y2hlcy10by1kYXlsaWdodC1zYXZpbmctdGltZS1tYXJjaC0zMQorIyBGcm9tIFJhbmRhbCBMLiBTY2h3YXJ0eiAoMjAxNC0wNC0xNSk6CisjIEhhdmluZyBsYW5kZWQgb24gYSBmbGlnaHQgZnJvbSB0aGUgc3RhdGVzIHRvIElzdGFuYnVsICh2aWEgQU1TKSBvbiBNYXJjaCAzMSwKKyMgSSBjYW4gdGVsbCB5b3UgdGhhdCBOT0JPRFkgKGV2ZW4gdGhlIGFpcmxpbmVzKSByZXNwZWN0ZWQgdGhpcyB0aW1lem9uZSBEU1QKKyMgY2hhbmdlIGRlbGF5LiAgTWF5YmUgdGhlIHdvcmQganVzdCBkaWRuJ3QgZ2V0IG91dCBpbiB0aW1lLgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTE1KToKKyMgVGhlIHByZXNzIHJlcG9ydGVkIG1hc3NpdmUgY29uZnVzaW9uLCBhcyBlbGVjdGlvbiBvZmZpY2lhbHMgb2JleWVkIHRoZSBydWxlCisjIGNoYW5nZSBidXQgY2VsbCBwaG9uZXMgKGFuZCBhaXJsaW5lIGJhZ2dhZ2Ugc3lzdGVtcykgZGlkIG5vdC4gIFNlZToKKyMgS29zdGlkaXMgTS4gRXZlbnRmdWwgZWxlY3Rpb25zIGluIFR1cmtleS4gQmFsa2FuIE5ld3MgQWdlbmN5CisjIGh0dHA6Ly93d3cuYmFsa2FuZXUuY29tL2V2ZW50ZnVsLWVsZWN0aW9ucy10dXJrZXkvIDIwMTQtMDMtMzAuCisjIEkgZ3Vlc3MgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIGRvY3VtZW50IHRoZSBvZmZpY2lhbCB0aW1lLgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlUdXJrZXkJMTkxNglvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCkBAIC0yODQ2LDEwICszMjA1LDEwIEBACiAJCQkyOjAwCVR1cmtleQlFRSVzVAkxOTc4IE9jdCAxNQogCQkJMzowMAlUdXJrZXkJVFIlc1QJMTk4NSBBcHIgMjAgIyBUdXJrZXkgVGltZQogCQkJMjowMAlUdXJrZXkJRUUlc1QJMjAwNwotCQkJMjowMAlFVQlFRSVzVAkyMDExIE1hciAyNyAxOjAwdQotCQkJMjowMAktCUVFVAkyMDExIE1hciAyOCAxOjAwdQotCQkJMjowMAlFVQlFRSVzVAkyMDE0IE1hciAzMCAxOjAwdQotCQkJMjowMAktCUVFVAkyMDE0IE1hciAzMSAxOjAwdQorCQkJMjowMAlFVQlFRSVzVAkyMDExIE1hciAyNyAgMTowMHUKKwkJCTI6MDAJLQlFRVQJMjAxMSBNYXIgMjggIDE6MDB1CisJCQkyOjAwCUVVCUVFJXNUCTIwMTQgTWFyIDMwICAxOjAwdQorCQkJMjowMAktCUVFVAkyMDE0IE1hciAzMSAgMTowMHUKIAkJCTI6MDAJRVUJRUUlc1QKIExpbmsJRXVyb3BlL0lzdGFuYnVsCUFzaWEvSXN0YW5idWwJIyBJc3RhbmJ1bCBpcyBpbiBib3RoIGNvbnRpbmVudHMuCiAKQEAgLTI4NzAsNyArMzIyOSw3IEBACiAjIEJpbGwgbnVtYmVyIDgzMzAgb2YgTVAgZnJvbSB0aGUgUGFydHkgb2YgUmVnaW9ucyBPbGVnIE5hZG9zaGkgZ290CiAjIGFwcHJvdmFsIGZyb20gMjY2IGRlcHV0aWVzLgogIwotIyBVa3JhaW5lIGFib2xpc2hlcyB0cmFuc3RlciBiYWNrIHRvIHRoZSB3aW50ZXIgdGltZSAoaW4gUnVzc2lhbikKKyMgVWtyYWluZSBhYm9saXNoZXMgdHJhbnNmZXIgYmFjayB0byB0aGUgd2ludGVyIHRpbWUgKGluIFJ1c3NpYW4pCiAjIGh0dHA6Ly9uZXdzLm1haWwucnUvcG9saXRpY3MvNjg2MTU2MC8KICMKICMgVGhlIFVrcmFpbmlhbnMgd2lsbCBubyBsb25nZXIgY2hhbmdlIHRoZSBjbG9jayAoaW4gUnVzc2lhbikKQEAgLTI5MzEsMTIgKzMyOTAsMTIgQEAKIAkJCTI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKIAkJCTM6MDAJLQlNU0sJMTk0MSBTZXAgMjAKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0MyBOb3YgIDYKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MCBKdWwgIDEgMjowMAotCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgMzowMAorCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwIEp1bCAgMSAgMjowMAorCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgIDM6MDAKIAkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NQogCQkJMjowMAlFVQlFRSVzVAogIyBSdXRoZW5pYSB1c2VkIENFVCAxOTkwLzE5OTEuCi0jICJVemhob3JvZCIgaXMgdGhlIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGUgVWtyYWluaWFuIG5hbWUsIGJ1dAorIyAiVXpoaG9yb2QiIGlzIHRoZSB0cmFuc2xpdGVyYXRpb24gb2YgdGhlIFJ1c3luL1VrcmFpbmlhbiBwcm9udW5jaWF0aW9uLCBidXQKICMgIlV6aGdvcm9kIiBpcyBtb3JlIGNvbW1vbiBpbiBFbmdsaXNoLgogWm9uZSBFdXJvcGUvVXpoZ29yb2QJMToyOToxMiAtCUxNVAkxODkwIE9jdAogCQkJMTowMAktCUNFVAkxOTQwCkBAIC0yOTQ0LDggKzMzMDMsOCBAQAogCQkJMTowMAkxOjAwCUNFU1QJMTk0NCBPY3QgMjYKIAkJCTE6MDAJLQlDRVQJMTk0NSBKdW4gMjkKIAkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAotCQkJMzowMAktCU1TSwkxOTkwIEp1bCAgMSAyOjAwCi0JCQkxOjAwCS0JQ0VUCTE5OTEgTWFyIDMxIDM6MDAKKwkJCTM6MDAJLQlNU0sJMTk5MCBKdWwgIDEgIDI6MDAKKwkJCTE6MDAJLQlDRVQJMTk5MSBNYXIgMzEgIDM6MDAKIAkJCTI6MDAJLQlFRVQJMTk5MgogCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1CiAJCQkyOjAwCUVVCUVFJXNUCkBAIC0yOTU5LDQyICszMzE4LDkgQEAKIAkJCTI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKIAkJCTM6MDAJLQlNU0sJMTk0MSBBdWcgMjUKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0MyBPY3QgMjUKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgMjowMAorCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAgMjowMAogCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1CiAJCQkyOjAwCUVVCUVFJXNUCi0jIENlbnRyYWwgQ3JpbWVhIHVzZWQgTW9zY293IHRpbWUgMTk5NC8xOTk3LgotWm9uZSBFdXJvcGUvU2ltZmVyb3BvbAkyOjE2OjI0IC0JTE1UCTE4ODAKLQkJCTI6MTYJLQlTTVQJMTkyNCBNYXkgIDIgIyBTaW1mZXJvcG9sIE1lYW4gVAotCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQotCQkJMzowMAktCU1TSwkxOTQxIE5vdgotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEFwciAxMwotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCi0JCQkzOjAwCS0JTVNLCTE5OTAgSnVsICAxIDI6MDAKLQkJCTI6MDAJLQlFRVQJMTk5MgotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgVGhlIF9FY29ub21pc3RfICgxOTk0LTA1LTI4LCBwIDQ1KSByZXBvcnRzIHRoYXQgY2VudHJhbCBDcmltZWEgc3dpdGNoZWQKLSMgZnJvbSBLaWV2IHRvIE1vc2NvdyB0aW1lIHNvbWV0aW1lIGFmdGVyIHRoZSBKYW51YXJ5IDE5OTQgZWxlY3Rpb25zLgotIyBTaGFua3MgKDE5OTkpIHNheXMgImRhdGUgb2YgY2hhbmdlIHVuY2VydGFpbiIsIGJ1dCBpbXBsaWVzIHRoYXQgaXQgaGFwcGVuZWQKLSMgc29tZXRpbWUgYmV0d2VlbiB0aGUgMTk5NCBEU1Qgc3dpdGNoZXMuICBTaGFua3MgJiBQb3R0ZW5nZXIgc2ltcGx5IHNheQotIyAxOTk0LTA5LTI1IDAzOjAwLCBidXQgdGhhdCBjYW4ndCBiZSByaWdodC4gIEZvciBub3csIGd1ZXNzIGl0Ci0jIGNoYW5nZWQgaW4gTWF5LgotCQkJMjowMAlFLUV1cglFRSVzVAkxOTk0IE1heQotIyBGcm9tIElBVEEgU1NJTSAoMTk5NC8xOTk3KSwgd2hpY2ggYWxzbyBzYXlzIHRoYXQgS2VyY2ggaXMgc3RpbGwgbGlrZSBLaWV2LgotCQkJMzowMAlFLUV1cglNU0svTVNECTE5OTYgTWFyIDMxIDM6MDBzCi0JCQkzOjAwCTE6MDAJTVNECTE5OTYgT2N0IDI3IDM6MDBzCi0jIElBVEEgU1NJTSAoMTk5Ny0wOSkgc2F5cyBDcmltZWEgc3dpdGNoZWQgdG8gRUVUL0VFU1QuCi0jIEFzc3VtZSBpdCBoYXBwZW5lZCBpbiBNYXJjaCBieSBub3QgY2hhbmdpbmcgdGhlIGNsb2Nrcy4KLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5NwotCQkJMzowMAktCU1TSwkxOTk3IE1hciBsYXN0U3VuIDE6MDB1Ci0jIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDE0LTAzLTE3KToKLSMgdGltZSBjaGFuZ2UgYXQgMjowMCAoMmFtKSBvbiBNYXJjaCAzMCwgMjAxNAotIyBodHRwOi8vdnoucnUvbmV3cy8yMDE0LzMvMTcvNjc3NDY0Lmh0bWwKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wMy0zMCk6Ci0jIFNpbWZlcm9wb2wgYW5kIFNldmFzdG9wb2wgcmVwb3J0ZWRseSBjaGFuZ2VkIHRoZWlyIGNlbnRyYWwgdG93biBjbG9ja3MKLSMgbGF0ZSB0aGUgcHJldmlvdXMgZGF5LCBidXQgdGhpcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiBjZXJlbW9uaWFsCi0jIGFuZCB0aGUgZGlzY3JlcGFuY2llcyBhcmUgc21hbGwgZW5vdWdoIHRvIG5vdCB3b3JyeSBhYm91dC4KLQkJCTI6MDAJRVUJRUUlc1QJMjAxNCBNYXIgMzAgMjowMAotCQkJNDowMAktCU1TSwogCiAjIFZhdGljYW4gQ2l0eQogIyBTZWUgRXVyb3BlL1JvbWUuCkBAIC0zMDE4LDcgKzMzNDQsNyBAQAogIyAuLi4KICMKICMgLi4udGhlIEV1cm9wZWFuIHRpbWUgcnVsZXMgYXJlLi4uc3RhbmRhcmRpemVkIHNpbmNlIDE5ODEsIHdoZW4KLSMgbW9zdCBFdXJvcGVhbiBjb3VuW3RyXWllcyBzdGFydGVkIERTVC4gIEJlZm9yZSB0aGF0IHllYXIsIG9ubHkKKyMgbW9zdCBFdXJvcGVhbiBjb3VudHJpZXMgc3RhcnRlZCBEU1QuICBCZWZvcmUgdGhhdCB5ZWFyLCBvbmx5CiAjIGEgZmV3IGNvdW50cmllcyAoVUssIEZyYW5jZSwgSXRhbHkpIGhhZCBEU1QsIGVhY2ggYWNjb3JkaW5nCiAjIHRvIG93biBuYXRpb25hbCBydWxlcy4gIEluIDE5ODEsIGhvd2V2ZXIsIERTVCBzdGFydGVkIG9uCiAjICdBcHIgZmlyc3RTdW4nLCBhbmQgbm90IG9uICdNYXIgbGFzdFN1bicgYXMgaW4gdGhlIGZvbGxvd2luZwpAQCAtMzAyNiw3ICszMzUyLDcgQEAKICMgQnV0IGFsc28gc2luY2UgMTk4MSB0aGVyZSBhcmUgc29tZSBtb3JlIG5hdGlvbmFsIGV4Y2VwdGlvbnMKICMgdGhhbiBsaXN0ZWQgaW4gJ2V1cm9wZSc6IFN3aXR6ZXJsYW5kLCBmb3IgZXhhbXBsZSwgam9pbmVkIERTVAogIyBvbmUgeWVhciBsYXRlciwgRGVubWFyayBlbmRlZCBEU1Qgb24gJ09jdCAxJyBpbnN0ZWFkIG9mICdTZXAKLSMgbGFzdFN1bicgaW4gMTk4MS0tLUkgZG9uJ3Qga25vdyBob3cgdGhleSBoYW5kbGUgbm93LgorIyBsYXN0U3VuJyBpbiAxOTgxIC0gSSBkb24ndCBrbm93IGhvdyB0aGV5IGhhbmRsZSBub3cuCiAjCiAjIEZpbmFsbHksIERTVCBpc3QgYWx3YXlzIGZyb20gJ0FwciAxJyB0byAnT2N0IDEnIGluIHRoZQogIyBTb3ZpZXQgVW5pb24gKGFzIGZhciBhcyBJIGtub3cpLgpkaWZmIC0tZ2l0IGEvbWFrZS9kYXRhL3R6ZGF0YS9mYWN0b3J5IGIvbWFrZS9kYXRhL3R6ZGF0YS9mYWN0b3J5CmluZGV4IDgxM2Q5OWEuLjBhNjA0MWQgMTAwNjQ0Ci0tLSBhL21ha2UvZGF0YS90emRhdGEvZmFjdG9yeQorKysgYi9tYWtlL2RhdGEvdHpkYXRhL2ZhY3RvcnkKQEAgLTIxLDcgKzIxLDYgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCmRpZmYgLS1naXQgYS9tYWtlL2RhdGEvdHpkYXRhL2lzbzMxNjYudGFiIGIvbWFrZS9kYXRhL3R6ZGF0YS9pc28zMTY2LnRhYgppbmRleCAyOGZiNjRiLi42M2VhZGNiIDEwMDY0NAotLS0gYS9tYWtlL2RhdGEvdHpkYXRhL2lzbzMxNjYudGFiCisrKyBiL21ha2UvZGF0YS90emRhdGEvaXNvMzE2Ni50YWIKQEAgLTI2LDIxICsyNiwyMSBAQAogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KICMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0wNS0yNyk6CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMTgpOgorIyBUaGlzIGZpbGUgY29udGFpbnMgYSB0YWJsZSBvZiB0d28tbGV0dGVyIGNvdW50cnkgY29kZXMuICBDb2x1bW5zIGFyZQorIyBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgdGFiLiAgTGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIGFyZSBjb21tZW50cy4KKyMgQWx0aG91Z2ggYWxsIHRleHQgY3VycmVudGx5IHVzZXMgQVNDSUkgZW5jb2RpbmcsIHRoaXMgaXMgcGxhbm5lZCB0bworIyBjaGFuZ2UgdG8gVVRGLTggc29vbi4gIFRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZSBhcmUgYXMgZm9sbG93czoKICMKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbHVtbnM6CiAjIDEuICBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLCBjdXJyZW50IGFzIG9mCi0jICAgICBJU08gMzE2Ni0xIE5ld3NsZXR0ZXIgVkktMTUgKDIwMTMtMDUtMTApLiAgU2VlOiBVcGRhdGVzIG9uIElTTyAzMTY2CisjICAgICBJU08gMzE2Ni0xIE5ld3NsZXR0ZXIgVkktMTYgKDIwMTMtMDctMTEpLiAgU2VlOiBVcGRhdGVzIG9uIElTTyAzMTY2CiAjICAgaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lL3N0YW5kYXJkcy9jb3VudHJ5X2NvZGVzL3VwZGF0ZXNfb25faXNvXzMxNjYuaHRtCiAjIDIuICBUaGUgdXN1YWwgRW5nbGlzaCBuYW1lIGZvciB0aGUgY29kZWQgcmVnaW9uLAogIyAgICAgY2hvc2VuIHNvIHRoYXQgYWxwaGFiZXRpYyBzb3J0aW5nIG9mIHN1YnNldHMgcHJvZHVjZXMgaGVscGZ1bCBsaXN0cy4KICMgICAgIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBFbmdsaXNoIG5hbWUgaW4gdGhlIElTTyAzMTY2IHRhYmxlcy4KICMKLSMgQ29sdW1ucyBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHRhYi4KICMgVGhlIHRhYmxlIGlzIHNvcnRlZCBieSBjb3VudHJ5IGNvZGUuCiAjCi0jIExpbmVzIGJlZ2lubmluZyB3aXRoIGAjJyBhcmUgY29tbWVudHMuCi0jCiAjIFRoaXMgdGFibGUgaXMgaW50ZW5kZWQgYXMgYW4gYWlkIGZvciB1c2VycywgdG8gaGVscCB0aGVtIHNlbGVjdCB0aW1lCiAjIHpvbmUgZGF0YSBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgcHJhY3RpY2FsIG5lZWRzLiAgSXQgaXMgbm90IGludGVuZGVkCiAjIHRvIHRha2Ugb3IgZW5kb3JzZSBhbnkgcG9zaXRpb24gb24gbGVnYWwgb3IgdGVycml0b3JpYWwgY2xhaW1zLgpkaWZmIC0tZ2l0IGEvbWFrZS9kYXRhL3R6ZGF0YS9sZWFwc2Vjb25kcyBiL21ha2UvZGF0YS90emRhdGEvbGVhcHNlY29uZHMKaW5kZXggYjQyMzEzNS4uZDM4YWJkNiAxMDA2NDQKLS0tIGEvbWFrZS9kYXRhL3R6ZGF0YS9sZWFwc2Vjb25kcworKysgYi9tYWtlL2RhdGEvdHpkYXRhL2xlYXBzZWNvbmRzCkBAIC0yMSw3ICsyMSw3IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyBBbGxvd2FuY2UgZm9yIGxlYXBzZWNvbmRzIGFkZGVkIHRvIGVhY2ggdGltZXpvbmUgZmlsZS4KKyMgQWxsb3dhbmNlIGZvciBsZWFwIHNlY29uZHMgYWRkZWQgdG8gZWFjaCB0aW1lIHpvbmUgZmlsZS4KIAogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCiAKQEAgLTMxLDcgKzMxLDcgQEAKICMgeW91IHNob3VsZCBiZSBhYmxlIHRvIHBpY2sgdXAgbGVhcC1zZWNvbmRzLmxpc3QgZnJvbSBhIHNlY29uZGFyeSBOSVNUIHNlcnZlci4KICMgRm9yIG1vcmUgYWJvdXQgbGVhcC1zZWNvbmRzLmxpc3QsIHBsZWFzZSBzZWUKICMgVGhlIE5UUCBUaW1lc2NhbGUgYW5kIExlYXAgU2Vjb25kcwotIyA8aHR0cDovL3d3dy5lZWNpcy51ZGVsLmVkdS9+bWlsbHMvbGVhcC5odG1sPi4KKyMgaHR0cDovL3d3dy5lZWNpcy51ZGVsLmVkdS9+bWlsbHMvbGVhcC5odG1sCiAKICMgVGhlIEludGVybmF0aW9uYWwgRWFydGggUm90YXRpb24gU2VydmljZSBwZXJpb2RpY2FsbHkgdXNlcyBsZWFwIHNlY29uZHMKICMgdG8ga2VlcCBVVEMgdG8gd2l0aGluIDAuOSBzIG9mIFVUMQpkaWZmIC0tZ2l0IGEvbWFrZS9kYXRhL3R6ZGF0YS9ub3J0aGFtZXJpY2EgYi9tYWtlL2RhdGEvdHpkYXRhL25vcnRoYW1lcmljYQppbmRleCBkYzBjMmU5Li4wZGM3MTRhIDEwMDY0NAotLS0gYS9tYWtlL2RhdGEvdHpkYXRhL25vcnRoYW1lcmljYQorKysgYi9tYWtlL2RhdGEvdHpkYXRhL25vcnRoYW1lcmljYQpAQCAtMjEsMTUgKzIxLDE1IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIAogIyBhbHNvIGluY2x1ZGVzIENlbnRyYWwgQW1lcmljYSBhbmQgdGhlIENhcmliYmVhbgogCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAorIyBUaGlzIGZpbGUgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKICMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bwotIyB0ekBpYW5hLm9yZyBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisjIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4gIEZvciBtb3JlLCBwbGVhc2Ugc2VlCisjIHRoZSBmaWxlIENPTlRSSUJVVElORyBpbiB0aGUgdHogZGlzdHJpYnV0aW9uLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMjIpOgogIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKQEAgLTc4LDEzICs3OCwxMyBAQAogIwl0byBwdXNoIHBlb3BsZSBpbnRvIGJlZCBlYXJsaWVyLCBhbmQgZ2V0IHRoZW0gdXAgZWFybGllciwgdG8gbWFrZQogIwl0aGVtIGhlYWx0aHksIHdlYWx0aHkgYW5kIHdpc2UgaW4gc3BpdGUgb2YgdGhlbXNlbHZlcy4KICMKLSMJLS0gUm9iZXJ0c29uIERhdmllcywgVGhlIGRpYXJ5IG9mIFNhbXVlbCBNYXJjaGJhbmtzLAorIwkgLS0gUm9iZXJ0c29uIERhdmllcywgVGhlIGRpYXJ5IG9mIFNhbXVlbCBNYXJjaGJhbmtzLAogIwkgICBDbGFya2UsIElyd2luICgxOTQ3KSwgWElYLCBTdW5kYXkKICMKICMgRm9yIG1vcmUgYWJvdXQgdGhlIGZpcnN0IHRlbiB5ZWFycyBvZiBEU1QgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIHNlZQotIyBSb2JlcnQgR2FybGFuZCdzIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xwZ2gub3JnL2V4aGliaXQvZHN0Lmh0bWwiPgotIyBUZW4geWVhcnMgb2YgZGF5bGlnaHQgc2F2aW5nIGZyb20gdGhlIFBpdHRzYnVyZ2ggc3RhbmRwb2ludAotIyAoQ2FybmVnaWUgTGlicmFyeSBvZiBQaXR0c2J1cmdoLCAxOTI3KTwvYT4uCisjIFJvYmVydCBHYXJsYW5kLCBUZW4geWVhcnMgb2YgZGF5bGlnaHQgc2F2aW5nIGZyb20gdGhlIFBpdHRzYnVyZ2ggc3RhbmRwb2ludAorIyAoQ2FybmVnaWUgTGlicmFyeSBvZiBQaXR0c2J1cmdoLCAxOTI3KS4KKyMgaHR0cDovL3d3dy5jbHBnaC5vcmcvZXhoaWJpdC9kc3QuaHRtbAogIwogIyBTaGFua3Mgc2F5cyB0aGF0IERTVCB3YXMgY2FsbGVkICJXYXIgVGltZSIgaW4gdGhlIFVTIGluIDE5MTggYW5kIDE5MTkuCiAjIEhvd2V2ZXIsIERTVCB3YXMgaW1wb3NlZCBieSB0aGUgU3RhbmRhcmQgVGltZSBBY3Qgb2YgMTkxOCwgd2hpY2gKQEAgLTEwMywxMSArMTAzLDExIEBACiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDAwLTA5LTI1KToKICMgTGFzdCBuaWdodCBJIGhlYXJkIHBhcnQgb2YgYSByZWJyb2FkY2FzdCBvZiBhIDE5NDUgQXJjaCBPYm9sZXIgcmFkaW8gZHJhbWEuCiAjIEluIHRoZSBpbnRyb2R1Y3Rpb24sIE9ib2xlciBzcG9rZSBvZiAiRWFzdGVybiBQZWFjZSBUaW1lLiIKLSMgQW4gQWx0YVZpc3RhIHNlYXJjaCB0dXJuZWQgdXAKLSMgPGEgaHJlZj0iaHR0cDovL3Jvd2F5dG9uLm9yZy9yaHMvaHN0YXVnNDUuaHRtbCI+OgorIyBBbiBBbHRhVmlzdGEgc2VhcmNoIHR1cm5lZCB1cDoKKyMgaHR0cDovL3Jvd2F5dG9uLm9yZy9yaHMvaHN0YXVnNDUuaHRtbAogIyAiV2hlbiB0aGUgdGltZSBpcyBhbm5vdW5jZWQgb3ZlciB0aGUgcmFkaW8gbm93LCBpdCBpcyAnRWFzdGVybiBQZWFjZQogIyBUaW1lJyBpbnN0ZWFkIG9mIHRoZSBvbGQgZmFtaWxpYXIgJ0Vhc3Rlcm4gV2FyIFRpbWUuJyAgUGVhY2UgaXMgd29uZGVyZnVsLiIKLSMgPC9hPiAoQXVndXN0IDE5NDUpIGJ5IHdheSBvZiBjb25maXJtYXRpb24uCisjIChBdWd1c3QgMTk0NSkgYnkgd2F5IG9mIGNvbmZpcm1hdGlvbi4KIAogIyBGcm9tIEpvc2VwaCBHYWxsYW50IGNpdGluZwogIyBHZW9yZ2UgSC4gRG91Z2xhcywgX1RoZSBFYXJseSBEYXlzIG9mIFJhZGlvIEJyb2FkY2FzdGluZ18gKDE5ODcpOgpAQCAtMjA1LDcgKzIwNSw3IEBACiAjIFVTQSAgQUxBU0tBIFNURCAgICA5IEggIEJFSElORCBVVEMgICAgTU9TVCBPRiBBTEFTS0EgICAgIChBS1NUKQogIyBVU0EgIEFMQVNLQSBTVEQgICAgOCBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwIChBS0RUKQogIyBVU0EgIEFMRVVUSUFOICAgICAxMCBIICBCRUhJTkQgVVRDICAgIElTTEFORFMgV0VTVCBPRiAxNzBXCi0jIFVTQSAgLSAiIC0gICAgICAgICA5IEggIEJFSElORCBVVEMgICAgQVBSIDMgLSBPQ1QgMzAKKyMgVVNBICAgICIgICAgICAgICAgIDkgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAogIyBVU0EgIEhBV0FJSSAgICAgICAxMCBIICBCRUhJTkQgVVRDCiAjIFVTQSAgQkVSSU5HICAgICAgIDExIEggIEJFSElORCBVVEMgICAgU0FNT0EsIE1JRFdBWQogCkBAIC0yNTgsMTkgKzI1OCwxOSBAQAogIyBUaGUgZm9sbG93aW5nIHdhcyBzaWduZWQgaW50byBsYXcgb24gMjAwNS0wOC0wOC4KICMKICMgSC5SLiA2LCBFbmVyZ3kgUG9saWN5IEFjdCBvZiAyMDA1LCBTRUMuIDExMC4gREFZTElHSFQgU0FWSU5HUy4KLSMgICAoYSkgQW1lbmRtZW50LSBTZWN0aW9uIDMoYSkgb2YgdGhlIFVuaWZvcm0gVGltZSBBY3Qgb2YgMTk2NiAoMTUKKyMgICAoYSkgQW1lbmRtZW50Li0tU2VjdGlvbiAzKGEpIG9mIHRoZSBVbmlmb3JtIFRpbWUgQWN0IG9mIDE5NjYgKDE1CiAjICAgVS5TLkMuIDI2MGEoYSkpIGlzIGFtZW5kZWQtLQotIyAgICAgKDEpIGJ5IHN0cmlraW5nICdmaXJzdCBTdW5kYXkgb2YgQXByaWwnIGFuZCBpbnNlcnRpbmcgJ3NlY29uZAotIyAgICAgU3VuZGF5IG9mIE1hcmNoJzsgYW5kCi0jICAgICAoMikgYnkgc3RyaWtpbmcgJ2xhc3QgU3VuZGF5IG9mIE9jdG9iZXInIGFuZCBpbnNlcnRpbmcgJ2ZpcnN0CisjICAgICAoMSkgYnkgc3RyaWtpbmcgImZpcnN0IFN1bmRheSBvZiBBcHJpbCIgYW5kIGluc2VydGluZyAic2Vjb25kCisjICAgICBTdW5kYXkgb2YgTWFyY2giOyBhbmQKKyMgICAgICgyKSBieSBzdHJpa2luZyAibGFzdCBTdW5kYXkgb2YgT2N0b2JlciIgYW5kIGluc2VydGluZyAiZmlyc3QKICMgICAgIFN1bmRheSBvZiBOb3ZlbWJlcicuCi0jICAgKGIpIEVmZmVjdGl2ZSBEYXRlLSBTdWJzZWN0aW9uIChhKSBzaGFsbCB0YWtlIGVmZmVjdCAxIHllYXIgYWZ0ZXIgdGhlCisjICAgKGIpIEVmZmVjdGl2ZSBEYXRlLi0tU3Vic2VjdGlvbiAoYSkgc2hhbGwgdGFrZSBlZmZlY3QgMSB5ZWFyIGFmdGVyIHRoZQogIyAgIGRhdGUgb2YgZW5hY3RtZW50IG9mIHRoaXMgQWN0IG9yIE1hcmNoIDEsIDIwMDcsIHdoaWNoZXZlciBpcyBsYXRlci4KLSMgICAoYykgUmVwb3J0IHRvIENvbmdyZXNzLSBOb3QgbGF0ZXIgdGhhbiA5IG1vbnRocyBhZnRlciB0aGUgZWZmZWN0aXZlCisjICAgKGMpIFJlcG9ydCB0byBDb25ncmVzcy4tLU5vdCBsYXRlciB0aGFuIDkgbW9udGhzIGFmdGVyIHRoZSBlZmZlY3RpdmUKICMgICBkYXRlIHN0YXRlZCBpbiBzdWJzZWN0aW9uIChiKSwgdGhlIFNlY3JldGFyeSBzaGFsbCByZXBvcnQgdG8gQ29uZ3Jlc3MKICMgICBvbiB0aGUgaW1wYWN0IG9mIHRoaXMgc2VjdGlvbiBvbiBlbmVyZ3kgY29uc3VtcHRpb24gaW4gdGhlIFVuaXRlZAogIyAgIFN0YXRlcy4KLSMgICAoZCkgUmlnaHQgdG8gUmV2ZXJ0LSBDb25ncmVzcyByZXRhaW5zIHRoZSByaWdodCB0byByZXZlcnQgdGhlCisjICAgKGQpIFJpZ2h0IHRvIFJldmVydC4tLUNvbmdyZXNzIHJldGFpbnMgdGhlIHJpZ2h0IHRvIHJldmVydCB0aGUKICMgICBEYXlsaWdodCBTYXZpbmcgVGltZSBiYWNrIHRvIHRoZSAyMDA1IHRpbWUgc2NoZWR1bGVzIG9uY2UgdGhlCiAjICAgRGVwYXJ0bWVudCBzdHVkeSBpcyBjb21wbGV0ZS4KIApAQCAtMjkyLDcgKzI5Miw3IEBACiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0yNik6CiAjIEFjY29yZGluZyB0byB0b2RheSdzIEh1bnRzdmlsbGUgVGltZXMKLSMgPGh0dHA6Ly93d3cuYWwuY29tL25ld3MvaHVudHN2aWxsZXRpbWVzL2luZGV4LnNzZj8vYmFzZS9uZXdzLzExMjUwNDc3ODMyMjgzMjAueG1sJmNvbGw9MT4KKyMgaHR0cDovL3d3dy5hbC5jb20vbmV3cy9odW50c3ZpbGxldGltZXMvaW5kZXguc3NmPy9iYXNlL25ld3MvMTEyNTA0Nzc4MzIyODMyMC54bWwmY29sbD0xCiAjIGEgZmV3IHRvd25zIG9uIEFsYWJhbWEncyAiZWFzdGVybiBib3JkZXIgd2l0aCBHZW9yZ2lhLCBzdWNoIGFzIFBoZW5peCBDaXR5CiAjIGluIFJ1c3NlbGwgQ291bnR5LCBMYW5ldHQgaW4gQ2hhbWJlcnMgQ291bnR5IGFuZCBzb21lIHRvd25zIGluIExlZSBDb3VudHksCiAjIHNldCB0aGVpciB3YXRjaGVzIGFuZCBjbG9ja3Mgb24gRWFzdGVybiB0aW1lLiIgIEl0IHF1b3RlcyBILkguICJCdWJiYSIKQEAgLTM0NywxNSArMzQ3LDE1IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvQ2hpY2FnbwktNTo1MDozNiAtCUxNVAkxODgzIE5vdiAxOCAxMjowOToyNAogCQkJLTY6MDAJVVMJQyVzVAkxOTIwCi0JCQktNjowMAlDaGljYWdvCUMlc1QJMTkzNiBNYXIgIDEgMjowMAotCQkJLTU6MDAJLQlFU1QJMTkzNiBOb3YgMTUgMjowMAorCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5MzYgTWFyICAxICAyOjAwCisJCQktNTowMAktCUVTVAkxOTM2IE5vdiAxNSAgMjowMAogCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5NDIKIAkJCS02OjAwCVVTCUMlc1QJMTk0NgogCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5NjcKIAkJCS02OjAwCVVTCUMlc1QKICMgT2xpdmVyIENvdW50eSwgTkQgc3dpdGNoZWQgZnJvbSBtb3VudGFpbiB0byBjZW50cmFsIHRpbWUgb24gMTk5Mi0xMC0yNS4KIFpvbmUgQW1lcmljYS9Ob3J0aF9EYWtvdGEvQ2VudGVyIC02OjQ1OjEyIC0gTE1UCTE4ODMgTm92IDE4IDEyOjE0OjQ4Ci0JCQktNzowMAlVUwlNJXNUCTE5OTIgT2N0IDI1IDAyOjAwCisJCQktNzowMAlVUwlNJXNUCTE5OTIgT2N0IDI1ICAyOjAwCiAJCQktNjowMAlVUwlDJXNUCiAjIE1vcnRvbiBDb3VudHksIE5ELCBzd2l0Y2hlZCBmcm9tIG1vdW50YWluIHRvIGNlbnRyYWwgdGltZSBvbgogIyAyMDAzLTEwLTI2LCBleGNlcHQgZm9yIHRoZSBhcmVhIGFyb3VuZCBNYW5kYW4gd2hpY2ggd2FzIGFscmVhZHkgY2VudHJhbCB0aW1lLgpAQCAtMzY0LDI5ICszNjQsMjYgQEAKICMgSm9uZXMsIE1lbGxldHRlLCBhbmQgVG9kZCBDb3VudGllcyBpbiBTb3V0aCBEYWtvdGE7CiAjIGJ1dCBpbiBwcmFjdGljZSB0aGVzZSBvdGhlciBjb3VudGllcyB3ZXJlIGFscmVhZHkgb2JzZXJ2aW5nIGNlbnRyYWwgdGltZS4KICMgU2VlIDxodHRwOi8vd3d3LmVwYS5nb3YvZmVkcmdzdHIvRVBBLUlNUEFDVC8yMDAzL09jdG9iZXIvRGF5LTI4L2kyNzA1Ni5odG0+LgotWm9uZSBBbWVyaWNhL05vcnRoX0Rha290YS9OZXdfU2FsZW0gLTY6NDU6MzkgLSBMTVQgMTg4MyBOb3YgMTggMTI6MTQ6MjEKLQkJCS03OjAwCVVTCU0lc1QJMjAwMyBPY3QgMjYgMDI6MDAKK1pvbmUgQW1lcmljYS9Ob3J0aF9EYWtvdGEvTmV3X1NhbGVtIC02OjQ1OjM5IC0gTE1UCTE4ODMgTm92IDE4IDEyOjE0OjIxCisJCQktNzowMAlVUwlNJXNUCTIwMDMgT2N0IDI2ICAyOjAwCiAJCQktNjowMAlVUwlDJXNUCiAKICMgRnJvbSBKb3NoIEZpbmRsZXkgKDIwMTEtMDEtMjEpOgogIyAuLi5pdCBhcHBlYXJzIHRoYXQgTWVyY2VyIENvdW50eSwgTm9ydGggRGFrb3RhLCBjaGFuZ2VkIGZyb20gdGhlCiAjIG1vdW50YWluIHRpbWUgem9uZSB0byB0aGUgY2VudHJhbCB0aW1lIHpvbmUgYXQgdGhlIGxhc3QgdHJhbnNpdGlvbiBmcm9tCiAjIGRheWxpZ2h0LXNhdmluZyB0byBzdGFuZGFyZCB0aW1lIChvbiBOb3YuIDcsIDIwMTApOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdwby5nb3YvZmRzeXMvcGtnL0ZSLTIwMTAtMDktMjkvaHRtbC8yMDEwLTI0Mzc2Lmh0bSI+CiAjIGh0dHA6Ly93d3cuZ3BvLmdvdi9mZHN5cy9wa2cvRlItMjAxMC0wOS0yOS9odG1sLzIwMTAtMjQzNzYuaHRtCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5iaXNtYXJja3RyaWJ1bmUuY29tL25ld3MvbG9jYWwvYXJ0aWNsZV8xZWIxYjU4OC1jNzU4LTExZGYtYjQ3Mi0wMDFjYzRjMDMyODYuaHRtbCI+CiAjIGh0dHA6Ly93d3cuYmlzbWFyY2t0cmlidW5lLmNvbS9uZXdzL2xvY2FsL2FydGljbGVfMWViMWI1ODgtYzc1OC0xMWRmLWI0NzItMDAxY2M0YzAzMjg2Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQW5keSBMaXBzY29tYiAoMjAxMS0wMS0yNCk6CiAjIC4uLmFjY29yZGluZyB0byB0aGUgQ2Vuc3VzIEJ1cmVhdSwgdGhlIGxhcmdlc3QgY2l0eSBpcyBCZXVsYWggKGFsdGhvdWdoCiAjIGl0J3MgY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMgQmV1bGFoLUhhemVuLCB3aXRoIEhhemVuIGJlaW5nIHRoZSBuZXh0CiAjIGxhcmdlc3QgY2l0eSBpbiBNZXJjZXIgQ291bnR5KS4gIEdvb2dsZSBNYXBzIHBsYWNlcyBCZXVsYWgncyBjaXR5IGhhbGwKLSMgYXQgNDcxNSc1MSIgbm9ydGgsIDEwMTQ2JzQwIiB3ZXN0LCB3aGljaCB5aWVsZHMgYW4gb2Zmc2V0IG9mIDZoNDcnMDciLgorIyBhdCA0NyBkZWdyZWVzIDE1JyA1MSIgTiwgMTAxIGRlZ3JlZXMgNDYnIDQwIiBXLCB3aGljaCB5aWVsZHMgYW4gb2Zmc2V0CisjIG9mIDZoNDcnMDciLgogCi1ab25lIEFtZXJpY2EvTm9ydGhfRGFrb3RhL0JldWxhaCAtNjo0NzowNyAtIExNVCAxODgzIE5vdiAxOCAxMjoxMjo1MwotCQkJLTc6MDAJVVMJTSVzVAkyMDEwIE5vdiAgNyAyOjAwCitab25lIEFtZXJpY2EvTm9ydGhfRGFrb3RhL0JldWxhaCAtNjo0NzowNyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMjo1MworCQkJLTc6MDAJVVMJTSVzVAkyMDEwIE5vdiAgNyAgMjowMAogCQkJLTY6MDAJVVMJQyVzVAogCiAjIFVTIG1vdW50YWluIHRpbWUsIHJlcHJlc2VudGVkIGJ5IERlbnZlcgpAQCAtNDQ4LDE1ICs0NDUsMTggQEAKICMgd2FzIGRlc3Ryb3llZCBpbiAxODA1IGJ5IGEgWWFrdXRhdC1rb24gd2FyIHBhcnR5LikgIEhvd2V2ZXIsIHRoZXJlCiAjIHdlcmUgbmVhcmJ5IGluaGFiaXRhbnRzIGluIHNvbWUgY2FzZXMgYW5kIGZvciBvdXIgcHVycG9zZXMgcGVyaGFwcwogIyBpdCdzIGJlc3QgdG8gc2ltcGx5IHVzZSB0aGUgb2ZmaWNpYWwgdHJhbnNpdGlvbi4KLSMKIAotIyBGcm9tIFN0ZXZlIEZlcmd1c29uICgyMDExLTAxLTMxKToKLSMgVGhlIGF1dGhvciBsaXZlcyBpbiBBbGFza2EgYW5kIG1hbnkgb2YgdGhlIHJlZmVyZW5jZXMgbGlzdGVkIGFyZSBvbmx5Ci0jIGF2YWlsYWJsZSB0byBBbGFza2FuIHJlc2lkZW50cy4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0xOCk6CisjIE9uZSBvcGluaW9uIG9mIHRoZSBlYXJseS0xOTgwcyB0dXJtb2lsIGluIEFsYXNrYSBvdmVyIHRpbWUgem9uZXMgYW5kCisjIGRheWxpZ2h0IHNhdmluZyB0aW1lIGFwcGVhcmVkIGFzIGdyYWZmaXRpIG9uIGEgSnVuZWF1IGFpcnBvcnQgd2FsbDoKKyMgIldlbGNvbWUgdG8gSnVuZWF1LiAgUGxlYXNlIHR1cm4geW91ciB3YXRjaCBiYWNrIHRvIHRoZSAxOXRoIGNlbnR1cnkuIgorIyBTZWU6IFR1cm5lciBXLiBBbGFza2EncyBmb3VyIHRpbWUgem9uZXMgbm93IHR3by4gTlkgVGltZXMgMTk4My0xMS0wMS4KKyMgaHR0cDovL3d3dy5ueXRpbWVzLmNvbS8xOTgzLzExLzAxL3VzL2FsYXNrYS1zLWZvdXItdGltZS16b25lcy1ub3ctdHdvLmh0bWwKICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbGFza2FoaXN0b3JpY2Fsc29jaWV0eS5vcmcvaW5kZXguY2ZtP3NlY3Rpb249ZGlzY292ZXIlMjBhbGFza2EmcGFnZT1HbGltcHNlcyUyMG9mJTIwdGhlJTIwUGFzdCZ2aWV3cG9zdD0yJkNvbnRlbnRJZD05OCI+Ci0jIGh0dHA6Ly93d3cuYWxhc2thaGlzdG9yaWNhbHNvY2lldHkub3JnL2luZGV4LmNmbT9zZWN0aW9uPWRpc2NvdmVyJTIwYWxhc2thJnBhZ2U9R2xpbXBzZXMlMjBvZiUyMHRoZSUyMFBhc3Qmdmlld3Bvc3Q9MiZDb250ZW50SWQ9OTgKLSMgPC9hPgorIyBTdGV2ZSBGZXJndXNvbiAoMjAxMS0wMS0zMSkgcmVmZXJyZWQgdG8gdGhlIGZvbGxvd2luZyBzb3VyY2U6CisjIE5vcnJpcyBGLiBLZWVwaW5nIHRpbWUgaW4gQWxhc2thOiBuYXRpb25hbCBkaXJlY3RpdmVzLCBsb2NhbCByZXNwb25zZS4KKyMgQWxhc2thIEhpc3RvcnkgMjAwMTsxNigxLTIpLgorIyBodHRwOi8vYWxhc2thaGlzdG9yaWNhbHNvY2lldHkub3JnL2Rpc2NvdmVyLWFsYXNrYS9nbGltcHNlcy1vZi10aGUtcGFzdC9rZWVwaW5nLXRpbWUtaW4tYWxhc2thLwogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDExLTAyLTAxKToKICMgSGVyZSdzIGRhdGFiYXNlLXJlbGV2YW50IG1hdGVyaWFsIGZyb20gdGhlIDIwMDEgIkFsYXNrYSBIaXN0b3J5IiBhcnRpY2xlOgpAQCAtNDgyLDEyICs0ODIsMTAgQEAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTEtMDItMDkpOgogIyBJIGp1c3Qgc3Bva2UgYnkgcGhvbmUgd2l0aCBhIHN0YWZmIG1lbWJlciBhdCB0aGUgTWV0bGFrYXRsYSBJbmRpYW4KICMgQ29tbXVuaXR5IG9mZmljZSAodXNpbmcgY29udGFjdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jb21tZXJjZS5zdGF0ZS5hay51cy9kY2EvY29tbWRiL0NJUy5jZm0/Q29tbV9Cb3JvX25hbWU9TWV0bGFrYXRsYSI+CiAjIGh0dHA6Ly93d3cuY29tbWVyY2Uuc3RhdGUuYWsudXMvZGNhL2NvbW1kYi9DSVMuY2ZtP0NvbW1fQm9yb19uYW1lPU1ldGxha2F0bGEKLSMgPC9hPikuCiAjIEl0J3Mgc2hvcnRseSBhZnRlciAxOjAwIGhlcmUgb24gdGhlIGVhc3QgY29hc3Qgb2YgdGhlIFVuaXRlZCBTdGF0ZXM7CiAjIHRoZSBzdGFmZmVyIHNhaWQgaXQgd2FzIHNob3J0bHkgYWZ0ZXIgMTA6MDAgdGhlcmUuIFdoZW4gSSBhc2tlZCB3aGV0aGVyCi0jIHRoYXQgbWVhbnQgdGhleSB3ZXJlIG9uIFBhY2lmaWMgdGltZSwgdGhleSBzYWlkIG5vLS10aGV5IHdlcmUgb24gdGhlaXIKKyMgdGhhdCBtZWFudCB0aGV5IHdlcmUgb24gUGFjaWZpYyB0aW1lLCB0aGV5IHNhaWQgbm8gLSB0aGV5IHdlcmUgb24gdGhlaXIKICMgb3duIHRpbWUuIEkgYXNrZWQgYWJvdXQgZGF5bGlnaHQgc2F2aW5nOyB0aGV5IHNhaWQgaXQgd2Fzbid0IHVzZWQuIEkKICMgZGlkIG5vdCBpbnF1aXJlIGFib3V0IHByYWN0aWNlcyBpbiB0aGUgcGFzdC4KIApAQCAtNTAxLDkgKzQ5OSw5IEBACiAJCQkgLTg6MDAJLQlQU1QJMTk0MgogCQkJIC04OjAwCVVTCVAlc1QJMTk0NgogCQkJIC04OjAwCS0JUFNUCTE5NjkKLQkJCSAtODowMAlVUwlQJXNUCTE5ODAgQXByIDI3IDI6MDAKLQkJCSAtOTowMAlVUwlZJXNUCTE5ODAgT2N0IDI2IDI6MDAKLQkJCSAtODowMAlVUwlQJXNUCTE5ODMgT2N0IDMwIDI6MDAKKwkJCSAtODowMAlVUwlQJXNUCTE5ODAgQXByIDI3ICAyOjAwCisJCQkgLTk6MDAJVVMJWSVzVAkxOTgwIE9jdCAyNiAgMjowMAorCQkJIC04OjAwCVVTCVAlc1QJMTk4MyBPY3QgMzAgIDI6MDAKIAkJCSAtOTowMAlVUwlZJXNUCTE5ODMgTm92IDMwCiAJCQkgLTk6MDAJVVMJQUslc1QKIFpvbmUgQW1lcmljYS9TaXRrYQkgMTQ6NTg6NDcgLQlMTVQJMTg2NyBPY3QgMTgKQEAgLTUxMSw3ICs1MDksNyBAQAogCQkJIC04OjAwCS0JUFNUCTE5NDIKIAkJCSAtODowMAlVUwlQJXNUCTE5NDYKIAkJCSAtODowMAktCVBTVAkxOTY5Ci0JCQkgLTg6MDAJVVMJUCVzVAkxOTgzIE9jdCAzMCAyOjAwCisJCQkgLTg6MDAJVVMJUCVzVAkxOTgzIE9jdCAzMCAgMjowMAogCQkJIC05OjAwCVVTCVklc1QJMTk4MyBOb3YgMzAKIAkJCSAtOTowMAlVUwlBSyVzVAogWm9uZSBBbWVyaWNhL01ldGxha2F0bGEJIDE1OjEzOjQyIC0JTE1UCTE4NjcgT2N0IDE4CkBAIC01MTksOCArNTE3LDggQEAKIAkJCSAtODowMAktCVBTVAkxOTQyCiAJCQkgLTg6MDAJVVMJUCVzVAkxOTQ2CiAJCQkgLTg6MDAJLQlQU1QJMTk2OQotCQkJIC04OjAwCVVTCVAlc1QJMTk4MyBPY3QgMzAgMjowMAotCQkJIC04OjAwCS0JTWVTVAorCQkJIC04OjAwCVVTCVAlc1QJMTk4MyBPY3QgMzAgIDI6MDAKKwkJCSAtODowMAktCVBTVAogWm9uZSBBbWVyaWNhL1lha3V0YXQJIDE0OjQxOjA1IC0JTE1UCTE4NjcgT2N0IDE4CiAJCQkgLTk6MTg6NTUgLQlMTVQJMTkwMCBBdWcgMjAgMTI6MDAKIAkJCSAtOTowMAktCVlTVAkxOTQyCkBAIC01MzUsNyArNTMzLDcgQEAKIAkJCS0xMDowMAlVUwlDQVQvQ0FQVCAxOTQ2ICMgUGVhY2UKIAkJCS0xMDowMAktCUNBVAkxOTY3IEFwcgogCQkJLTEwOjAwCS0JQUhTVAkxOTY5Ci0JCQktMTA6MDAJVVMJQUglc1QJMTk4MyBPY3QgMzAgMjowMAorCQkJLTEwOjAwCVVTCUFIJXNUCTE5ODMgT2N0IDMwICAyOjAwCiAJCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAogCQkJIC05OjAwCVVTCUFLJXNUCiBab25lIEFtZXJpY2EvTm9tZQkgMTI6NTg6MjEgLQlMTVQJMTg2NyBPY3QgMTgKQEAgLTU0NCw3ICs1NDIsNyBAQAogCQkJLTExOjAwCVVTCU4lc1QJMTk0NgogCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByCiAJCQktMTE6MDAJLQlCU1QJMTk2OQotCQkJLTExOjAwCVVTCUIlc1QJMTk4MyBPY3QgMzAgMjowMAorCQkJLTExOjAwCVVTCUIlc1QJMTk4MyBPY3QgMzAgIDI6MDAKIAkJCSAtOTowMAlVUwlZJXNUCTE5ODMgTm92IDMwCiAJCQkgLTk6MDAJVVMJQUslc1QKIFpvbmUgQW1lcmljYS9BZGFrCSAxMjoxMzoyMSAtCUxNVAkxODY3IE9jdCAxOApAQCAtNTUzLDcgKzU1MSw3IEBACiAJCQktMTE6MDAJVVMJTiVzVAkxOTQ2CiAJCQktMTE6MDAJLQlOU1QJMTk2NyBBcHIKIAkJCS0xMTowMAktCUJTVAkxOTY5Ci0JCQktMTE6MDAJVVMJQiVzVAkxOTgzIE9jdCAzMCAyOjAwCisJCQktMTE6MDAJVVMJQiVzVAkxOTgzIE9jdCAzMCAgMjowMAogCQkJLTEwOjAwCVVTCUFIJXNUCTE5ODMgTm92IDMwCiAJCQktMTA6MDAJVVMJSEElc1QKICMgVGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBkb24ndCBxdWl0ZSBtYWtlIG91ciAxOTcwIGN1dG9mZi4KQEAgLTU3MSw3ICs1NjksNyBAQAogIyAgTWludXRlcyBvZiB0aGUgVW5hbGFza2EgQ2l0eSBDb3VuY2lsIE1lZXRpbmcsIEphbnVhcnkgMTAsIDE5Njc6CiAjICAiRXhjZXB0IGZvciBTdC4gUGF1bCBhbmQgQWt1dGFuLCBVbmFsYXNrYSBpcyB0aGUgb25seSBpbXBvcnRhbnQKICMgIGxvY2F0aW9uIG5vdCBvbiBBbGFza2EgU3RhbmRhcmQgVGltZS4gIFRoZSBmb2xsb3dpbmcgcmVzb2x1dGlvbiB3YXMKLSMgIG1hZGUgYnkgV2lsbGlhbSBSb2JpbnNvbiBhbmQgc2Vjb25kZWQgYnkgSGVucnkgU3dhbnNvbjogIEJlIGl0CisjICBtYWRlIGJ5IFdpbGxpYW0gUm9iaW5zb24gYW5kIHNlY29uZGVkIGJ5IEhlbnJ5IFN3YW5zb246IEJlIGl0CiAjICByZXNvbHZlZCB0aGF0IHRoZSBDaXR5IG9mIFVuYWxhc2thIGhlcmVieSBnb2VzIHRvIEFsYXNrYSBTdGFuZGFyZAogIyAgVGltZSBhcyBvZiBtaWRuaWdodCBGcmlkYXksIEphbnVhcnkgMTMsIDE5NjcgKDEgQS5NLiBTYXR1cmRheSwKICMgIEphbnVhcnkgMTQsIEFsYXNrYSBTdGFuZGFyZCBUaW1lLikgIFRoaXMgcmVzb2x1dGlvbiB3YXMgcGFzc2VkIHdpdGgKQEAgLTU4Myw5ICs1ODEsNyBAQAogIyAiSGF3YWlpYW4gVGltZSIgYnkgUm9iZXJ0IEMuIFNjaG1pdHQgYW5kIERvYWsgQy4gQ294IGFwcGVhcnMgb24gcGFnZXMgMjA3LTIyNQogIyBvZiB2b2x1bWUgMjYgb2YgVGhlIEhhd2FpaWFuIEpvdXJuYWwgb2YgSGlzdG9yeSAoMTk5MikuIEFzIG9mIDIwMTAtMTItMDksCiAjIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBhdAotIyA8YSBocmVmPSJodHRwOi8vZXZvbHMubGlicmFyeS5tYW5vYS5oYXdhaWkuZWR1L2JpdHN0cmVhbS8xMDUyNC8yMzkvMi9KTDI2MjE1LnBkZiI+CiAjIGh0dHA6Ly9ldm9scy5saWJyYXJ5Lm1hbm9hLmhhd2FpaS5lZHUvYml0c3RyZWFtLzEwNTI0LzIzOS8yL0pMMjYyMTUucGRmCi0jIDwvYT4KICMgYW5kIGluZGljYXRlcyB0aGF0IHN0YW5kYXJkIHRpbWUgd2FzIGFkb3B0ZWQgZWZmZWN0aXZlIG5vb24sIEphbnVhcnkKICMgMTMsIDE4OTYgKHBhZ2UgMjE4KSwgdGhhdCBpbiAiMTkzMywgdGhlIExlZ2lzbGF0dXJlIGRlY3JlZWQgZGF5bGlnaHQKICMgc2F2aW5nIGZvciB0aGUgcGVyaW9kIGJldHdlZW4gdGhlIGxhc3QgU3VuZGF5IG9mIGVhY2ggQXByaWwgYW5kIHRoZQpAQCAtNjA2LDcgKzYwMiw3IEBACiAjIHllYXIsIHRoZSBzdGFuZGFyZCB0aW1lIG9mIHRoaXMgVGVycml0b3J5IHNoYWxsIGJlIGFkdmFuY2VkIG9uZQogIyBob3VyLi4uVGhpcyBBY3Qgc2hhbGwgdGFrZSBlZmZlY3QgdXBvbiBpdHMgYXBwcm92YWwuIEFwcHJvdmVkIHRoaXMgMjZ0aAogIyBkYXkgb2YgQXByaWwsIEEuIEQuIDE5MzMuIExBV1JFTkNFIE0gSlVERCwgR292ZXJub3Igb2YgdGhlIFRlcnJpdG9yeSBvZgotIyBIYXdhaWkuIiBQYWdlIDE3MjogICJBY3QgMTYzLi4uQWN0IDkwIG9mIHRoZSBTZXNzaW9uIExhd3Mgb2YgMTkzMyBpcworIyBIYXdhaWkuIiBQYWdlIDE3MjogIkFjdCAxNjMuLi5BY3QgOTAgb2YgdGhlIFNlc3Npb24gTGF3cyBvZiAxOTMzIGlzCiAjIGhlcmVieSByZXBlYWxlZC4uLlRoaXMgQWN0IHNoYWxsIHRha2UgZWZmZWN0IHVwb24gaXRzIGFwcHJvdmFsLCB1cG9uCiAjIHdoaWNoIGRhdGUgdGhlIHN0YW5kYXJkIHRpbWUgb2YgdGhpcyBUZXJyaXRvcnkgc2hhbGwgYmUgcmVzdG9yZWQgdG8KICMgdGhhdCBleGlzdGluZyBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgdGFraW5nIGVmZmVjdCBvZiBzYWlkIEFjdCA5MC4KQEAgLTYxNiwxNCArNjEyLDE0IEBACiAjIE5vdGUgdGhhdCAxOTMzLTA1LTIxIHdhcyBhIFN1bmRheS4KICMgV2UncmUgbGVmdCB0byBndWVzcyB0aGUgdGltZSBvZiBkYXkgd2hlbiBBY3QgMTYzIHdhcyBhcHByb3ZlZDsgZ3Vlc3Mgbm9vbi4KIAotWm9uZSBQYWNpZmljL0hvbm9sdWx1CS0xMDozMToyNiAtCUxNVAkxODk2IEphbiAxMyAxMjowMCAjU2NobWl0dCZDb3gKLQkJCS0xMDozMAktCUhTVAkxOTMzIEFwciAzMCAyOjAwICNMYXdzIDE5MzMKLQkJCS0xMDozMAkxOjAwCUhEVAkxOTMzIE1heSAyMSAxMjowMCAjTGF3cyAxOTMzKzEyCi0JCQktMTA6MzAJLQlIU1QJMTk0MiBGZWIgMDkgMjowMCAjU2NobWl0dCZDb3grMgotCQkJLTEwOjMwCTE6MDAJSERUCTE5NDUgU2VwIDMwIDI6MDAgI1NjaG1pdHQmQ294KzIKLQkJCS0xMDozMAktCUhTVAkxOTQ3IEp1biAgOCAyOjAwICNTY2htaXR0JkNveCsyCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIFBhY2lmaWMvSG9ub2x1bHUJLTEwOjMxOjI2IC0JTE1UCTE4OTYgSmFuIDEzIDEyOjAwCisJCQktMTA6MzAJLQlIU1QJMTkzMyBBcHIgMzAgIDI6MDAKKwkJCS0xMDozMAkxOjAwCUhEVAkxOTMzIE1heSAyMSAxMjowMAorCQkJLTEwOjMwCS0JSFNUCTE5NDIgRmViICA5ICAyOjAwCisJCQktMTA6MzAJMTowMAlIRFQJMTk0NSBTZXAgMzAgIDI6MDAKKwkJCS0xMDozMAktCUhTVAkxOTQ3IEp1biAgOCAgMjowMAogCQkJLTEwOjAwCS0JSFNUCi0KIExpbmsgUGFjaWZpYy9Ib25vbHVsdSBQYWNpZmljL0pvaG5zdG9uCiAKICMgTm93IHdlIHR1cm4gdG8gVVMgYXJlYXMgdGhhdCBoYXZlIGRpdmVyZ2VkIGZyb20gdGhlIGNvbnNlbnN1cyBzaW5jZSAxOTcwLgpAQCAtNjMzLDkgKzYyOSw5IEBACiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMTAtMjApOgogIwogIyBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3Qgb2YgdGhpcyBwYXJhZ3JhcGggaXMgZGVyaXZlZCBmcm9tIHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRsYXByLmxpYi5hei51cy9saW5rcy9kYXlsaWdodC5odG0iPgotIyBEYXlsaWdodCBTYXZpbmcgVGltZSB3ZWIgcGFnZSAoMjAwMi0wMS0yMyk8L2E+IG1haW50YWluZWQgYnkgdGhlCi0jIEFyaXpvbmEgU3RhdGUgTGlicmFyeSwgQXJjaGl2ZXMgYW5kIFB1YmxpYyBSZWNvcmRzLgorIyBEYXlsaWdodCBTYXZpbmcgVGltZSB3ZWIgcGFnZQorIyA8aHR0cDovL3d3dy5kbGFwci5saWIuYXoudXMvbGlua3MvZGF5bGlnaHQuaHRtPiAoMjAwMi0wMS0yMykKKyMgbWFpbnRhaW5lZCBieSB0aGUgQXJpem9uYSBTdGF0ZSBMaWJyYXJ5LCBBcmNoaXZlcyBhbmQgUHVibGljIFJlY29yZHMuCiAjIEJldHdlZW4gMTk0NC0wMS0wMSBhbmQgMTk0NC0wNC0wMSB0aGUgU3RhdGUgb2YgQXJpem9uYSB1c2VkIHN0YW5kYXJkCiAjIHRpbWUsIGJ1dCBieSBmZWRlcmFsIGxhdyByYWlscm9hZHMsIGFpcmxpbmVzLCBidXMgbGluZXMsIG1pbGl0YXJ5CiAjIHBlcnNvbm5lbCwgYW5kIHNvbWUgZW5nYWdlZCBpbiBpbnRlcnN0YXRlIGNvbW1lcmNlIGNvbnRpbnVlZCB0bwpAQCAtNjQ5LDEwICs2NDUsMTEgQEAKICMgU2hhbmtzIHNheXMgdGhlIDE5NDQgZXhwZXJpbWVudCBjYW1lIHRvIGFuIGVuZCBvbiAxOTQ0LTAzLTE3LgogIyBHbyB3aXRoIHRoZSBBcml6b25hIFN0YXRlIExpYnJhcnkgaW5zdGVhZC4KIAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL1Bob2VuaXgJLTc6Mjg6MTggLQlMTVQJMTg4MyBOb3YgMTggMTE6MzE6NDIKLQkJCS03OjAwCVVTCU0lc1QJMTk0NCBKYW4gIDEgMDA6MDEKLQkJCS03OjAwCS0JTVNUCTE5NDQgQXByICAxIDAwOjAxCi0JCQktNzowMAlVUwlNJXNUCTE5NDQgT2N0ICAxIDAwOjAxCisJCQktNzowMAlVUwlNJXNUCTE5NDQgSmFuICAxICAwOjAxCisJCQktNzowMAktCU1TVAkxOTQ0IEFwciAgMSAgMDowMQorCQkJLTc6MDAJVVMJTSVzVAkxOTQ0IE9jdCAgMSAgMDowMQogCQkJLTc6MDAJLQlNU1QJMTk2NwogCQkJLTc6MDAJVVMJTSVzVAkxOTY4IE1hciAyMQogCQkJLTc6MDAJLQlNU1QKQEAgLTY3NiwyNCArNjczLDIyIEBACiAjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvQm9pc2UJLTc6NDQ6NDkgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTU6MTEKLQkJCS04OjAwCVVTCVAlc1QJMTkyMyBNYXkgMTMgMjowMAorCQkJLTg6MDAJVVMJUCVzVAkxOTIzIE1heSAxMyAgMjowMAogCQkJLTc6MDAJVVMJTSVzVAkxOTc0Ci0JCQktNzowMAktCU1TVAkxOTc0IEZlYiAgMyAyOjAwCisJCQktNzowMAktCU1TVAkxOTc0IEZlYiAgMyAgMjowMAogCQkJLTc6MDAJVVMJTSVzVAogCiAjIEluZGlhbmEKICMKICMgRm9yIGEgbWFwIG9mIEluZGlhbmEncyB0aW1lIHpvbmUgcmVnaW9ucywgc2VlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1jY3NjLmVkdS90aW1lLmh0bWwiPgotIyBXaGF0IHRpbWUgaXMgaXQgaW4gSW5kaWFuYT8KLSMgPC9hPiAoMjAwNi0wMy0wMSkKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UaW1lX2luX0luZGlhbmEKICMKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wOC0xNyk6CiAjIFNpbmNlIDE5NzAsIG1vc3Qgb2YgSW5kaWFuYSBoYXMgYmVlbiBsaWtlIEFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMsCiAjIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgogIwogIyAtIEdpYnNvbiwgSmFzcGVyLCBMYWtlLCBMYVBvcnRlLCBOZXd0b24sIFBvcnRlciwgUG9zZXksIFNwZW5jZXIsCi0jICAgVmFuZGVuYnVyZ2gsIGFuZCBXYXJyaWNrIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlIEFtZXJpY2EvQ2hpY2Fnby4KKyMgICBWYW5kZXJidXJnaCwgYW5kIFdhcnJpY2sgY291bnRpZXMgaGF2ZSBiZWVuIGxpa2UgQW1lcmljYS9DaGljYWdvLgogIwogIyAtIERlYXJib3JuIGFuZCBPaGlvIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlIEFtZXJpY2EvTmV3X1lvcmsuCiAjCkBAIC03MTIsMjIgKzcwNywxNiBAQAogIyB0aGF0IHRoZXkgd291bGQgYmUgYW1iaWd1b3VzIGlmIHdlIGxlZnQgdGhlbSBhdCB0aGUgJ0FtZXJpY2EnIGxldmVsLgogIyBTbyB3ZSByZWx1Y3RhbnRseSBwdXQgdGhlbSBhbGwgaW4gYSBzdWJkaXJlY3RvcnkgJ0FtZXJpY2EvSW5kaWFuYScuCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0xNik6Ci0jIGh0dHA6Ly93d3cubWNjc2MuZWR1L3RpbWUuaHRtbCBzYXlzIHRoYXQgSW5kaWFuYSB3aWxsIHVzZSBEU1Qgc3RhcnRpbmcgMjAwNi4KLQotIyBGcm9tIE5hdGhhbiBTdHJhdHRvbiBUcmVhZHdheSAoMjAwNi0wMy0zMCk6Ci0jIGh0dHA6Ly93d3cuZG90Lmdvdi9hZmZhaXJzL2RvdDA0MDYuaHRtIFszNzA1IEJdCi0jIEZyb20gRGVib3JhaCBHb2xkc21pdGggKDIwMDYtMDEtMTgpOgotIyBodHRwOi8vZG1zZXMuZG90Lmdvdi9kb2NpbWFnZXMvcGRmOTUvMzgyMzI5X3dlYi5wZGYgWzIuOSBNQl0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMS0yMCk6Ci0jIEl0IHNheXMgIkRPVCBpcyByZWxvY2F0aW5nIHRoZSB0aW1lIHpvbmUgYm91bmRhcnkgaW4gSW5kaWFuYSB0byBtb3ZlIFN0YXJrZSwKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0yNik6CisjIGh0dHBzOi8vd3d3LmZlZGVyYWxyZWdpc3Rlci5nb3YvYXJ0aWNsZXMvMjAwNi8wMS8yMC8wNi01NjMvc3RhbmRhcmQtdGltZS16b25lLWJvdW5kYXJ5LWluLXRoZS1zdGF0ZS1vZi1pbmRpYW5hCisjIHNheXMgIkRPVCBpcyByZWxvY2F0aW5nIHRoZSB0aW1lIHpvbmUgYm91bmRhcnkgaW4gSW5kaWFuYSB0byBtb3ZlIFN0YXJrZSwKICMgUHVsYXNraSwgS25veCwgRGF2aWVzcywgTWFydGluLCBQaWtlLCBEdWJvaXMsIGFuZCBQZXJyeSBDb3VudGllcyBmcm9tIHRoZQogIyBFYXN0ZXJuIFRpbWUgWm9uZSB0byB0aGUgQ2VudHJhbCBUaW1lIFpvbmUuLi4uIFRoZSBlZmZlY3RpdmUgZGF0ZSBvZgotIyB0aGlzIHJ1bGUgaXMgMjpPTyBhLm0uIEVTVCBTdW5kYXksIEFwcmlsIDIsIDIwMDYsIHdoaWNoIGlzIHRoZQorIyB0aGlzIHJ1bGUgaXMgMiBhLm0uIEVTVCBTdW5kYXksIEFwcmlsIDIsIDIwMDYsIHdoaWNoIGlzIHRoZQogIyBjaGFuZ2VvdmVyIGRhdGUgZnJvbSBzdGFuZGFyZCB0aW1lIHRvIERheWxpZ2h0IFNhdmluZyBUaW1lLiIKLSMgU3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgbWVhbnMgdGhlIGFmZmVjdGVkIGNvdW50aWVzIHdpbGwgY2hhbmdlIHRoZWlyCi0jIGNsb2NrcyB0d2ljZSB0aGF0IG5pZ2h0LCBidXQgdGhpcyBvYnZpb3VzbHkgaXMgaW4gZXJyb3IuICBUaGUgaW50ZW50Ci0jIGlzIHRoYXQgMDE6NTk6NTkgRVNUIGJlIGZvbGxvd2VkIGJ5IDAyOjAwOjAwIENEVC4KKyMgU3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgbWVhbnQgdGhlIGFmZmVjdGVkIGNvdW50aWVzIGNoYW5nZWQgdGhlaXIKKyMgY2xvY2tzIHR3aWNlIHRoYXQgbmlnaHQsIGJ1dCB0aGlzIG9idmlvdXNseSB3YXMgaW4gZXJyb3IuICBUaGUgaW50ZW50CisjIHdhcyB0aGF0IDAxOjU5OjU5IEVTVCBiZSBmb2xsb3dlZCBieSAwMjowMDowMCBDRFQuCiAKICMgRnJvbSBHd2lsbGltIExhdyAoMjAwNy0wMi0xMCk6CiAjIFRoZSBBc3NvY2lhdGVkIFByZXNzIGhhcyBiZWVuIHJlcG9ydGluZyB0aGF0IFB1bGFza2kgQ291bnR5LCBJbmRpYW5hIGlzCkBAIC03MzksMTMgKzcyOCwxMyBAQAogUnVsZSBJbmRpYW5hcG9saXMgMTk0MQkxOTU0CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKIFJ1bGUgSW5kaWFuYXBvbGlzIDE5NDYJMTk1NAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMgLTU6NDQ6MzggLSBMTVQgMTg4MyBOb3YgMTggMTI6MTU6MjIKK1pvbmUgQW1lcmljYS9JbmRpYW5hL0luZGlhbmFwb2xpcyAtNTo0NDozOCAtIExNVAkxODgzIE5vdiAxOCAxMjoxNToyMgogCQkJLTY6MDAJVVMJQyVzVAkxOTIwCiAJCQktNjowMCBJbmRpYW5hcG9saXMgQyVzVAkxOTQyCiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIEluZGlhbmFwb2xpcyBDJXNUCTE5NTUgQXByIDI0IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NTcgU2VwIDI5IDI6MDAKLQkJCS02OjAwCS0JQ1NUCTE5NTggQXByIDI3IDI6MDAKKwkJCS02OjAwIEluZGlhbmFwb2xpcyBDJXNUCTE5NTUgQXByIDI0ICAyOjAwCisJCQktNTowMAktCUVTVAkxOTU3IFNlcCAyOSAgMjowMAorCQkJLTY6MDAJLQlDU1QJMTk1OCBBcHIgMjcgIDI6MDAKIAkJCS01OjAwCS0JRVNUCTE5NjkKIAkJCS01OjAwCVVTCUUlc1QJMTk3MQogCQkJLTU6MDAJLQlFU1QJMjAwNgpAQCAtNzYxLDEwICs3NTAsMTAgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW1lcmljYS9JbmRpYW5hL01hcmVuZ28gLTU6NDU6MjMgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTQ6MzcKIAkJCS02OjAwCVVTCUMlc1QJMTk1MQotCQkJLTY6MDAJTWFyZW5nbwlDJXNUCTE5NjEgQXByIDMwIDI6MDAKKwkJCS02OjAwCU1hcmVuZ28JQyVzVAkxOTYxIEFwciAzMCAgMjowMAogCQkJLTU6MDAJLQlFU1QJMTk2OQotCQkJLTU6MDAJVVMJRSVzVAkxOTc0IEphbiAgNiAyOjAwCi0JCQktNjowMAkxOjAwCUNEVAkxOTc0IE9jdCAyNyAyOjAwCisJCQktNTowMAlVUwlFJXNUCTE5NzQgSmFuICA2ICAyOjAwCisJCQktNjowMAkxOjAwCUNEVAkxOTc0IE9jdCAyNyAgMjowMAogCQkJLTU6MDAJVVMJRSVzVAkxOTc2CiAJCQktNTowMAktCUVTVAkyMDA2CiAJCQktNTowMAlVUwlFJXNUCkBAIC03ODUsMTEgKzc3NCwxMSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvVmluY2VubmVzIC01OjUwOjA3IC0gTE1UCTE4ODMgTm92IDE4IDEyOjA5OjUzCiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIFZpbmNlbm5lcwlDJXNUCTE5NjQgQXByIDI2IDI6MDAKKwkJCS02OjAwIFZpbmNlbm5lcwlDJXNUCTE5NjQgQXByIDI2ICAyOjAwCiAJCQktNTowMAktCUVTVAkxOTY5CiAJCQktNTowMAlVUwlFJXNUCTE5NzEKLQkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QJMjAwNyBOb3YgIDQgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMjAwNyBOb3YgIDQgIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QKICMKICMgUGVycnkgQ291bnR5LCBJbmRpYW5hLCBzd2l0Y2hlZCBmcm9tIGVhc3Rlcm4gdG8gY2VudHJhbCB0aW1lIGluIEFwcmlsIDIwMDYuCkBAIC04MDYsMTAgKzc5NSwxMCBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvVGVsbF9DaXR5IC01OjQ3OjAzIC0gTE1UCTE4ODMgTm92IDE4IDEyOjEyOjU3CiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIFBlcnJ5CUMlc1QJMTk2NCBBcHIgMjYgMjowMAorCQkJLTY6MDAgUGVycnkJQyVzVAkxOTY0IEFwciAyNiAgMjowMAogCQkJLTU6MDAJLQlFU1QJMTk2OQogCQkJLTU6MDAJVVMJRSVzVAkxOTcxCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCisJCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAgMjowMAogCQkJLTY6MDAJVVMJQyVzVAogIwogIyBQaWtlIENvdW50eSwgSW5kaWFuYSBtb3ZlZCBmcm9tIGNlbnRyYWwgdG8gZWFzdGVybiB0aW1lIGluIDE5NzcsCkBAIC04MjIsMTEgKzgxMSwxMSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvUGV0ZXJzYnVyZyAtNTo0OTowNyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMDo1MwogCQkJLTY6MDAJVVMJQyVzVAkxOTU1Ci0JCQktNjowMAlQaWtlCUMlc1QJMTk2NSBBcHIgMjUgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2NiBPY3QgMzAgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkxOTc3IE9jdCAzMCAyOjAwCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCi0JCQktNjowMAlVUwlDJXNUCTIwMDcgTm92ICA0IDI6MDAKKwkJCS02OjAwCVBpa2UJQyVzVAkxOTY1IEFwciAyNSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2NiBPY3QgMzAgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMTk3NyBPY3QgMzAgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyICAyOjAwCisJCQktNjowMAlVUwlDJXNUCTIwMDcgTm92ICA0ICAyOjAwCiAJCQktNTowMAlVUwlFJXNUCiAjCiAjIFN0YXJrZSBDb3VudHksIEluZGlhbmEgbW92ZWQgZnJvbSBjZW50cmFsIHRvIGVhc3Rlcm4gdGltZSBpbiAxOTkxLApAQCAtODQ0LDEwICs4MzMsMTAgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW1lcmljYS9JbmRpYW5hL0tub3ggLTU6NDY6MzAgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTM6MzAKIAkJCS02OjAwCVVTCUMlc1QJMTk0NwotCQkJLTY6MDAJU3RhcmtlCUMlc1QJMTk2MiBBcHIgMjkgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2MyBPY3QgMjcgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkxOTkxIE9jdCAyNyAyOjAwCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCisJCQktNjowMAlTdGFya2UJQyVzVAkxOTYyIEFwciAyOSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2MyBPY3QgMjcgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMTk5MSBPY3QgMjcgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyICAyOjAwCiAJCQktNjowMAlVUwlDJXNUCiAjCiAjIFB1bGFza2kgQ291bnR5LCBJbmRpYW5hLCBzd2l0Y2hlZCBmcm9tIGVhc3Rlcm4gdG8gY2VudHJhbCB0aW1lIGluCkBAIC04NjAsMTcgKzg0OSwxNyBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvV2luYW1hYyAtNTo0NjoyNSAtIExNVAkxODgzIE5vdiAxOCAxMjoxMzozNQogCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMAlQdWxhc2tpCUMlc1QJMTk2MSBBcHIgMzAgMjowMAorCQkJLTY6MDAJUHVsYXNraQlDJXNUCTE5NjEgQXByIDMwICAyOjAwCiAJCQktNTowMAktCUVTVAkxOTY5CiAJCQktNTowMAlVUwlFJXNUCTE5NzEKLQkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QJMjAwNyBNYXIgMTEgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMjAwNyBNYXIgMTEgIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QKICMKICMgU3dpdHplcmxhbmQgQ291bnR5LCBJbmRpYW5hLCBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk3MyB0aHJvdWdoIDIwMDUuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvSW5kaWFuYS9WZXZheSAtNTo0MDoxNiAtCUxNVAkxODgzIE5vdiAxOCAxMjoxOTo0NAotCQkJLTY6MDAJVVMJQyVzVAkxOTU0IEFwciAyNSAyOjAwCisJCQktNjowMAlVUwlDJXNUCTE5NTQgQXByIDI1ICAyOjAwCiAJCQktNTowMAktCUVTVAkxOTY5CiAJCQktNTowMAlVUwlFJXNUCTE5NzMKIAkJCS01OjAwCS0JRVNUCTIwMDYKQEAgLTg5MSwxOCArODgwLDE3IEBACiAJCQktNjowMAlVUwlDJXNUCTE5MjEKIAkJCS02OjAwIExvdWlzdmlsbGUgQyVzVAkxOTQyCiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIExvdWlzdmlsbGUgQyVzVAkxOTYxIEp1bCAyMyAyOjAwCisJCQktNjowMCBMb3Vpc3ZpbGxlIEMlc1QJMTk2MSBKdWwgMjMgIDI6MDAKIAkJCS01OjAwCS0JRVNUCTE5NjgKLQkJCS01OjAwCVVTCUUlc1QJMTk3NCBKYW4gIDYgMjowMAotCQkJLTY6MDAJMTowMAlDRFQJMTk3NCBPY3QgMjcgMjowMAorCQkJLTU6MDAJVVMJRSVzVAkxOTc0IEphbiAgNiAgMjowMAorCQkJLTY6MDAJMTowMAlDRFQJMTk3NCBPY3QgMjcgIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QKICMKICMgV2F5bmUgQ291bnR5LCBLZW50dWNreQogIwotIyBGcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFrZS1jdW1iZXJsYW5kLmNvbS9saWZlL2FyY2hpdmUvbmV3czk5MDEyOXRpbWUuc2h0bWwiPgotIyBMYWtlIEN1bWJlcmxhbmQgTElGRQotIyA8L2E+ICgxOTk5LTAxLTI5KSB2aWEgV0tZTS0xMDEuNzoKKyMgRnJvbSBMYWtlIEN1bWJlcmxhbmQgTElGRQorIyBodHRwOi8vd3d3Lmxha2UtY3VtYmVybGFuZC5jb20vbGlmZS9hcmNoaXZlL25ld3M5OTAxMjl0aW1lLnNodG1sCisjICgxOTk5LTAxLTI5KSB2aWEgV0tZTS0xMDEuNzoKICMgQ2xpbnRvbiBDb3VudHkgaGFzIGpvaW5lZCBXYXluZSBDb3VudHkgaW4gYXNraW5nIHRoZSBEb1QgdG8gY2hhbmdlIGZyb20KICMgdGhlIENlbnRyYWwgdG8gdGhlIEVhc3Rlcm4gdGltZSB6b25lLi4uLiAgVGhlIFdheW5lIENvdW50eSBnb3Zlcm5tZW50IG1hZGUKICMgdGhlIHNhbWUgcmVxdWVzdCBpbiBEZWNlbWJlci4gIEFuZCB3aGlsZSBSdXNzZWxsIENvdW50eSBvZmZpY2lhbHMgaGF2ZSBub3QKQEAgLTkxOSw5ICs5MDcsOCBAQAogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA3LTE2KToKICMgVGhlIGZpbmFsIHJ1bGUgd2FzIHB1Ymxpc2hlZCBpbiB0aGUKLSMgPGEgaHJlZj0iaHR0cDovL2Zyd2ViZ2F0ZS5hY2Nlc3MuZ3BvLmdvdi9jZ2ktYmluL2dldGRvYy5jZ2k/ZGJuYW1lPTIwMDBfcmVnaXN0ZXImZG9jaWQ9ZnIxN2F1MDAtMjIiPgotIyBGZWRlcmFsIFJlZ2lzdGVyIDY1LCAxNjAgKDIwMDAtMDgtMTcpLCBwYWdlIDUwMTU0LTUwMTU4LgotIyA8L2E+CisjIEZlZGVyYWwgUmVnaXN0ZXIgNjUsIDE2MCAoMjAwMC0wOC0xNyksIHBwIDUwMTU0LTUwMTU4LgorIyBodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MjAwMF9yZWdpc3RlciZkb2NpZD1mcjE3YXUwMC0yMgogIwogWm9uZSBBbWVyaWNhL0tlbnR1Y2t5L01vbnRpY2VsbG8gLTU6Mzk6MjQgLSBMTVQJMTg4MyBOb3YgMTggMTI6MjA6MzYKIAkJCS02OjAwCVVTCUMlc1QJMTk0NgpAQCAtOTQ2LDkgKzkzMyw4IEBACiAjIFNlZSBBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXIgZm9yIHRoZSBPbGl2ZXIgQ291bnR5LCBORCBjaGFuZ2UuCiAjIFdlc3QgV2VuZG92ZXIsIE5WIG9mZmljaWFsbHkgc3dpdGNoZWQgZnJvbSBQYWNpZmljIHRvIG1vdW50YWluIHRpbWUgb24KICMgMTk5OS0xMC0zMS4gIFNlZSB0aGUKLSMgPGEgaHJlZj0iaHR0cDovL2Zyd2ViZ2F0ZS5hY2Nlc3MuZ3BvLmdvdi9jZ2ktYmluL2dldGRvYy5jZ2k/ZGJuYW1lPTE5OTlfcmVnaXN0ZXImZG9jaWQ9ZnIyMW9jOTktMTUiPgotIyBGZWRlcmFsIFJlZ2lzdGVyIDY0LCAyMDMgKDE5OTktMTAtMjEpLCBwYWdlIDU2NzA1LTU2NzA3LgotIyA8L2E+CisjIEZlZGVyYWwgUmVnaXN0ZXIgNjQsIDIwMyAoMTk5OS0xMC0yMSksIHBwIDU2NzA1LTU2NzA3LgorIyBodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MTk5OV9yZWdpc3RlciZkb2NpZD1mcjIxb2M5OS0xNQogIyBIb3dldmVyLCB0aGUgRmVkZXJhbCBSZWdpc3RlciBzYXlzIHRoYXQgV2VzdCBXZW5kb3ZlciBhbHJlYWR5IG9wZXJhdGVkCiAjIG9uIG1vdW50YWluIHRpbWUsIGFuZCB0aGUgcnVsZSBtZXJlbHkgbWFkZSB0aGlzIG9mZmljaWFsOwogIyBoZW5jZSBhIHNlcGFyYXRlIHR6IGVudHJ5IGlzIG5vdCBuZWVkZWQuCkBAIC05ODYsMTIgKzk3MiwxMiBAQAogUnVsZQlEZXRyb2l0CTE5NjcJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvRGV0cm9pdAktNTozMjoxMSAtCUxNVAkxOTA1Ci0JCQktNjowMAktCUNTVAkxOTE1IE1heSAxNSAyOjAwCisJCQktNjowMAktCUNTVAkxOTE1IE1heSAxNSAgMjowMAogCQkJLTU6MDAJLQlFU1QJMTk0MgogCQkJLTU6MDAJVVMJRSVzVAkxOTQ2CiAJCQktNTowMAlEZXRyb2l0CUUlc1QJMTk3MwogCQkJLTU6MDAJVVMJRSVzVAkxOTc1Ci0JCQktNTowMAktCUVTVAkxOTc1IEFwciAyNyAyOjAwCisJCQktNTowMAktCUVTVAkxOTc1IEFwciAyNyAgMjowMAogCQkJLTU6MDAJVVMJRSVzVAogIwogIyBEaWNraW5zb24sIEdvZ2ViaWMsIElyb24sIGFuZCBNZW5vbWluZWUgQ291bnRpZXMsIE1pY2hpZ2FuLApAQCAtMTAwNCw4ICs5OTAsOCBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL01lbm9taW5lZQktNTo1MDoyNyAtCUxNVAkxODg1IFNlcCAxOCAxMjowMAogCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMCBNZW5vbWluZWUJQyVzVAkxOTY5IEFwciAyNyAyOjAwCi0JCQktNTowMAktCUVTVAkxOTczIEFwciAyOSAyOjAwCisJCQktNjowMCBNZW5vbWluZWUJQyVzVAkxOTY5IEFwciAyNyAgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk3MyBBcHIgMjkgIDI6MDAKIAkJCS02OjAwCVVTCUMlc1QKIAogIyBOYXZhc3NhCkBAIC0xMDQyLDkgKzEwMjgsOSBAQAogIwlXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLAogIwl3aGljaCBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCiAjCi0jCTxhIGhyZWY9Imh0dHA6Ly93d3cucGV0dHN3b29kdmlsbGFnZS5jby51ay9EYXlsaWdodF9TYXZpbmdzX1dpbGxpYW1fV2lsbGV0dC5wZGYiPgogIwlXaWxsaWFtIFdpbGxldHQsIFRoZSBXYXN0ZSBvZiBEYXlsaWdodCwgMTl0aCBlZGl0aW9uCi0jCTwvYT4gKDE5MTQtMDMpCisjCTxodHRwOi8vY3MudWNsYS5lZHUvfmVnZ2VydC9UaGUtV2FzdGUtb2YtRGF5bGlnaHQtMTl0aC5wZGY+CisjCVtQREZdICgxOTE0LTAzKQogIwogIwlNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQKICMJPGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5Pi4KQEAgLTEwNTMsMTEgKzEwMzksMTEgQEAKIAogIyBDYW5hZGEKIAotIyBGcm9tIEFsYWluIExhQm9udDxlJz4gKDE5OTQtMTEtMTQpOgorIyBGcm9tIEFsYWluIExhQm9udMOpICgxOTk0LTExLTE0KToKICMgSSBwb3N0IGhlcmUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIHN0YW5kYXJkaXplZCBpbiBDYW5hZGEKICMgZm9yIGJvdGggRW5nbGlzaCBhbmQgRnJlbmNoIGluIHRoZSBDQU4vQ1NBLVoyMzQuNC04OSBzdGFuZGFyZC4uLi4KICMKLSMJVVRDCVN0YW5kYXJkIHRpbWUJRGF5bGlnaHQgc2F2aW5ncyB0aW1lCisjCVVUQwlTdGFuZGFyZCB0aW1lCURheWxpZ2h0IHNhdmluZyB0aW1lCiAjCW9mZnNldAlGcmVuY2gJRW5nbGlzaAlGcmVuY2gJRW5nbGlzaAogIwktMjozMAktCS0JSEFUCU5EVAogIwktMwktCS0JSEFBCUFEVApAQCAtMTA3MCw3ICsxMDU2LDcgQEAKICMJLTkJSE5ZCVlTVAktCS0KICMKICMJSE46IEhldXJlIE5vcm1hbGUJU1Q6IFN0YW5kYXJkIFRpbWUKLSMJSEE6IEhldXJlIEF2YW5jPGUnPmUJRFQ6IERheWxpZ2h0IHNhdmluZyBUaW1lCisjCUhBOiBIZXVyZSBBdmFuY8OpZQlEVDogRGF5bGlnaHQgc2F2aW5nIFRpbWUKICMKICMJQTogZGUgbCdBdGxhbnRpcXVlCUF0bGFudGljCiAjCUM6IGR1IENlbnRyZQkJQ2VudHJhbApAQCAtMTA4NSw3ICsxMDcxLDcgQEAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5NC0xMS0yMik6CiAjIEFsYXMsIHRoaXMgc29ydCBvZiB0aGluZyBtdXN0IGJlIGhhbmRsZWQgYnkgbG9jYWxpemF0aW9uIHNvZnR3YXJlLgogCi0jIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgZGF0YSBmb3IgQ2FuYWRhIGFyZSBhbGwgZnJvbSBTaGFua3MKKyMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZSBkYXRhIGVudHJpZXMgZm9yIENhbmFkYSBhcmUgYWxsIGZyb20gU2hhbmtzCiAjICYgUG90dGVuZ2VyLgogCiAjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA2LTA0LTAxLCAyMDA2LTA0LTI1LCAyMDA2LTA2LTI2LCAyMDA3LTAxLTMxLApAQCAtMTEzNCwxNSArMTEyMCwxNSBAQAogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMjUpOgogIyBILiBEYXZpZCBNYXR0aGV3cyBhbmQgTWFyeSBWaW5jZW50J3MgbWFwCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2FuYWRpYW5nZW9ncmFwaGljLmNhL01hZ2F6aW5lL1NPOTgvZ2VvbWFwLmFzcCI+CiAjICJJdCdzIGFib3V0IFRJTUUiLCBfQ2FuYWRpYW4gR2VvZ3JhcGhpY18gKFNlcHRlbWJlci1PY3RvYmVyIDE5OTgpCi0jIDwvYT4gY29udGFpbnMgZGV0YWlsZWQgYm91bmRhcmllcyBmb3IgcmVnaW9ucyBvYnNlcnZpbmcgbm9uc3RhbmRhcmQKKyMgaHR0cDovL3d3dy5jYW5hZGlhbmdlb2dyYXBoaWMuY2EvTWFnYXppbmUvU085OC9nZW9tYXAuYXNwCisjIGNvbnRhaW5zIGRldGFpbGVkIGJvdW5kYXJpZXMgZm9yIHJlZ2lvbnMgb2JzZXJ2aW5nIG5vbnN0YW5kYXJkCiAjIHRpbWUgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lIGFycmFuZ2VtZW50cyBpbiBDYW5hZGEgY2lyY2EgMTk5OC4KICMKLSMgSU5NUywgdGhlIEluc3RpdHV0ZSBmb3IgTmF0aW9uYWwgTWVhc3VyZW1lbnQgU3RhbmRhcmRzIGluIE90dGF3YSwgaGFzIDxhCi0jIGhyZWY9Imh0dHA6Ly9pbm1zLWllbm0ubnJjLWNucmMuZ2MuY2EvZW4vdGltZV9zZXJ2aWNlcy9kYXlsaWdodF9zYXZpbmdfZS5waHAiPgorIyBJTk1TLCB0aGUgSW5zdGl0dXRlIGZvciBOYXRpb25hbCBNZWFzdXJlbWVudCBTdGFuZGFyZHMgaW4gT3R0YXdhLCBoYXMKICMgaW5mb3JtYXRpb24gYWJvdXQgc3RhbmRhcmQgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lIHpvbmVzIGluIENhbmFkYS4KLSMgPC9hPiAodXBkYXRlZCBwZXJpb2RpY2FsbHkpLgorIyBodHRwOi8vaW5tcy1pZW5tLm5yYy1jbnJjLmdjLmNhL2VuL3RpbWVfc2VydmljZXMvZGF5bGlnaHRfc2F2aW5nX2UucGhwCisjICh1cGRhdGVkIHBlcmlvZGljYWxseSkuCiAjIEl0cyB1bm9mZmljaWFsIGluZm9ybWF0aW9uIGlzIG9mdGVuIHRha2VuIGZyb20gTWF0dGhld3MgYW5kIFZpbmNlbnQuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNi0yNyk6CkBAIC0xMTUxLDkgKzExMzcsNyBAQAogCiAjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDExLTEyLTAxKQogIyBJbiB0aGUgZmlyc3Qgb2YgVGFtbXkgSGFyZHdpY2sncyBhcnRpY2xlcwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmlsb3ZlY3Jlc3Rvbi5jb20vP3A9YXJ0aWNsZXMmdD1zcGVjJmFyPTI2MCI+CiAjIGh0dHA6Ly93d3cuaWxvdmVjcmVzdG9uLmNvbS8/cD1hcnRpY2xlcyZ0PXNwZWMmYXI9MjYwCi0jIDwvYT4KICMgc2hlIHF1b3RlcyB0aGUgRnJpZGF5IE5vdmVtYmVyIDEvMTkxOCBlZGl0aW9uIG9mIHRoZSBDcmVzdG9uIFJldmlldy4KICMgVGhlIHF1b3RlIGluY2x1ZGVzIHRoZXNlIHR3byBzdGF0ZW1lbnRzOgogIyAnU3VuZGF5IHRoZSBDUFIgd2VudCBiYWNrIHRvIHRoZSBvbGQgc3lzdGVtIG9mIHRpbWUuLi4nCkBAIC0xMjIxLDkgKzEyMDUsNyBAQAogIyBUaW1lIHRvIFN0YW5kYXJkIFRpbWUgYW5kIGZyb20gU3RhbmRhcmQgVGltZSB0byBEYXlsaWdodCBTYXZpbmdzIFRpbWUKICMgbm93IG9jY3VycyBhdCAyOjAwQU0uCiAjIC4uLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzc2VtYmx5Lm5sLmNhL2xlZ2lzbGF0aW9uL3NyL2FubnVhbHN0YXR1dGVzLzIwMTEvMTEwNi5jaHAuaHRtIj4KICMgaHR0cDovL3d3dy5hc3NlbWJseS5ubC5jYS9sZWdpc2xhdGlvbi9zci9hbm51YWxzdGF0dXRlcy8yMDExLzExMDYuY2hwLmh0bQotIyA8L2E+CiAjIC4uLgogIyBNSUNIQUVMIFBFTExFWSAgfCAgTWFuYWdlciBvZiBFbnRlcnByaXNlIEFyY2hpdGVjdHVyZSAtIFNvbHV0aW9uIERlbGl2ZXJ5CiAjIE9mZmljZSBvZiB0aGUgQ2hpZWYgSW5mb3JtYXRpb24gT2ZmaWNlcgpAQCAtMTI1OSw3ICsxMjQxLDcgQEAKIAkJCS0zOjMwCS0JTlNUCTE5MzYKIAkJCS0zOjMwCVN0Sm9obnMJTiVzVAkxOTQyIE1heSAxMQogCQkJLTM6MzAJQ2FuYWRhCU4lc1QJMTk0NgotCQkJLTM6MzAJU3RKb2hucwlOJXNUCTE5NjYgTWFyIDE1IDI6MDAKKwkJCS0zOjMwCVN0Sm9obnMJTiVzVAkxOTY2IE1hciAxNSAgMjowMAogCQkJLTQ6MDAJU3RKb2hucwlBJXNUCTIwMTEgTm92CiAJCQktNDowMAlDYW5hZGEJQSVzVAogCkBAIC0xMzIwLDcgKzEzMDIsNyBAQAogWm9uZSBBbWVyaWNhL0hhbGlmYXgJLTQ6MTQ6MjQgLQlMTVQJMTkwMiBKdW4gMTUKIAkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTE4CiAJCQktNDowMAlDYW5hZGEJQSVzVAkxOTE5Ci0JCQktNDowMAlIYWxpZmF4CUElc1QJMTk0MiBGZWIgIDkgMjowMHMKKwkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTQyIEZlYiAgOSAgMjowMHMKIAkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NDYKIAkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTc0CiAJCQktNDowMAlDYW5hZGEJQSVzVApAQCAtMTM3OSw3ICsxMzYxLDcgQEAKICMgbWVyaWRpYW4gaXMgc3VwcG9zZWQgdG8gb2JzZXJ2ZSBBU1QsIGJ1dCByZXNpZGVudHMgYXMgZmFyIGVhc3QgYXMKICMgTmF0YXNocXVhbiB1c2UgRVNUL0VEVCwgYW5kIHJlc2lkZW50cyBlYXN0IG9mIE5hdGFzaHF1YW4gdXNlIEFTVC4KICMgVGhlIFF1ZWJlYyBkZXBhcnRtZW50IG9mIGp1c3RpY2Ugd3JpdGVzIGluCi0jICJUaGUgc2l0dWF0aW9uIGluIE1pbmdhbmllIGFuZCBCYXNzZS1Db3RlLU5vcmQiCisjICJUaGUgc2l0dWF0aW9uIGluIE1pbmdhbmllIGFuZCBCYXNzZS1Dw7R0ZS1Ob3JkIgogIyBodHRwOi8vd3d3Lmp1c3RpY2UuZ291di5xYy5jYS9lbmdsaXNoL3B1YmxpY2F0aW9ucy9nZW5lcmFsZS90ZW1wcy1taW5nYW5pZS1hLmh0bQogIyB0aGF0IHRoZSBjb2FzdGFsIHN0cmlwIGZyb20ganVzdCBlYXN0IG9mIE5hdGFzaHF1YW4gdG8gQmxhbmMtU2FibG9uCiAjIG9ic2VydmVzIEF0bGFudGljIHN0YW5kYXJkIHRpbWUgYWxsIHllYXIgcm91bmQuCkBAIC0xMzg3LDcgKzEzNjksNiBAQAogIyBzYXlzIHRoaXMgY29tbW9uIHByYWN0aWNlIHdhcyBjb2RpZmllZCBpbnRvIGxhdyBhcyBvZiAyMDA3LgogIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgZ3Vlc3MgdGhpcyBwcmFjdGljZSBiZWdhbiBhcm91bmQgMTk3MCwgY29udHJhIHRvCiAjIFNoYW5rcyAmIFBvdHRlbmdlciB3aG8gaGF2ZSB0aGlzIHJlZ2lvbiBvYnNlcnZpbmcgQVNUL0FEVC4KLSMgZm9yIHBvc3QtMTk3MCBkYXRhIEFtZXJpY2EvUHVlcnRvX1JpY28uCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCU1vbnQJMTkxNwlvbmx5CS0JTWFyCTI1CTI6MDAJMTowMAlECkBAIC0xNDAxLDE4ICsxMzgyLDEwIEBACiBSdWxlCU1vbnQJMTkyNAlvbmx5CS0JTWF5CTE3CTI6MDAJMTowMAlECiBSdWxlCU1vbnQJMTkyNAkxOTI2CS0JU2VwCWxhc3RTdW4JMjozMAkwCVMKIFJ1bGUJTW9udAkxOTI1CTE5MjYJLQlNYXkJU3VuPj0xCTI6MDAJMTowMAlECi0jIFRoZSAxOTI3LXRvLTE5MzcgcnVsZXMgY2FuIGJlIGV4cHJlc3NlZCBtb3JlIHNpbXBseSBhcwotIyBSdWxlCU1vbnQJMTkyNwkxOTM3CS0JQXByCWxhc3RTYXQJMjQ6MDAJMTowMAlECi0jIFJ1bGUJTW9udAkxOTI3CTE5MzcJLQlTZXAJbGFzdFNhdAkyNDowMAkwCVMKLSMgVGhlIHJ1bGVzIGJlbG93IGF2b2lkIHVzZSBvZiAyNDowMAotIyAod2hpY2ggcHJlLTE5OTggdmVyc2lvbnMgb2YgemljIGNhbm5vdCBoYW5kbGUpLgotUnVsZQlNb250CTE5MjcJb25seQktCU1heQkxCTA6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkyNwkxOTMyCS0JU2VwCWxhc3RTdW4JMDowMAkwCVMKLVJ1bGUJTW9udAkxOTI4CTE5MzEJLQlBcHIJbGFzdFN1bgkwOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MzIJb25seQktCU1heQkxCTA6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkzMwkxOTQwCS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTMzCW9ubHkJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlNb250CTE5MzQJMTkzOQktCVNlcAlsYXN0U3VuCTA6MDAJMAlTCitSdWxlCU1vbnQJMTkyNwkxOTM3CS0JQXByCWxhc3RTYXQJMjQ6MDAJMTowMAlECitSdWxlCU1vbnQJMTkyNwkxOTM3CS0JU2VwCWxhc3RTYXQJMjQ6MDAJMAlTCitSdWxlCU1vbnQJMTkzOAkxOTQwCS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKK1J1bGUJTW9udAkxOTM4CTE5MzkJLQlTZXAJbGFzdFN1bgkwOjAwCTAJUwogUnVsZQlNb250CTE5NDYJMTk3MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECiBSdWxlCU1vbnQJMTk0NQkxOTQ4CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKIFJ1bGUJTW9udAkxOTQ5CTE5NTAJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwpAQCAtMTQyNiw3ICsxMzk5LDcgQEAKIFpvbmUgQW1lcmljYS9Nb250cmVhbAktNDo1NDoxNiAtCUxNVAkxODg0CiAJCQktNTowMAlNb250CUUlc1QJMTkxOAogCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTkxOQotCQkJLTU6MDAJTW9udAlFJXNUCTE5NDIgRmViICA5IDI6MDBzCisJCQktNTowMAlNb250CUUlc1QJMTk0MiBGZWIgIDkgIDI6MDBzCiAJCQktNTowMAlDYW5hZGEJRSVzVAkxOTQ2CiAJCQktNTowMAlNb250CUUlc1QJMTk3NAogCQkJLTU6MDAJQ2FuYWRhCUUlc1QKQEAgLTE0NDgsNyArMTQyMSw3IEBACiAjIGhhdmUgYWxyZWFkeSBkb25lIHNvLiAgSW4gT3JpbGxpYSBEU1Qgd2FzIHRvIHJ1biB1bnRpbCBTYXR1cmRheSwKICMgMTkxMi0wOC0zMSAobm8gdGltZSBtZW50aW9uZWQpLCBidXQgaXQgd2FzIG1ldCB3aXRoIGNvbnNpZGVyYWJsZQogIyBob3N0aWxpdHkgZnJvbSBjZXJ0YWluIHNlZ21lbnRzIG9mIHRoZSBwdWJsaWMsIGFuZCB3YXMgcmV2b2tlZCBhZnRlcgotIyBvbmx5IHR3byB3ZWVrcyAtLSBJIGNvcGllZCBpdCBhcyBTYXR1cmRheSwgMTkxMi0wNy0wNywgMjI6MDAsIGJ1dAorIyBvbmx5IHR3byB3ZWVrcyAtIEkgY29waWVkIGl0IGFzIFNhdHVyZGF5LCAxOTEyLTA3LTA3LCAyMjowMCwgYnV0CiAjIHByZXN1bWFibHkgdGhhdCBzaG91bGQgYmUgLTA3LTA2LiAgKDE5MTItMDYtMTksIC0wNy0xMjsgYWxzbyBsZXR0ZXJzCiAjIGVhcmxpZXIgaW4gSnVuZSkuCiAjCkBAIC0xNDU4LDEwICsxNDMxLDggQEAKICMgTWFyayBCcmFkZXIgd3JpdGVzIHRoYXQgYW4gYXJ0aWNsZSBpbiB0aGUgMTk5Ny0xMC0xNCBUb3JvbnRvIFN0YXIKICMgc2F5cyB0aGF0IEF0aWtva2FuLCBPbnRhcmlvIGN1cnJlbnRseSBkb2VzIG5vdCBvYnNlcnZlIERTVCwKICMgYnV0IHdpbGwgdm90ZSBvbiAxMS0xMCB3aGV0aGVyIHRvIHVzZSBFU1QvRURULgotIyBIZSBhbHNvIHdyaXRlcyB0aGF0IHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvdi5vbi5jYS9NQlMvZW5nbGlzaC9wdWJsaWNhdGlvbnMvc3RhdHJlZ3MvY29udHRleHQuaHRtbCI+Ci0jIE9udGFyaW8gVGltZSBBY3QgKDE5OTAsIENoYXB0ZXIgVC45KQotIyA8L2E+CisjIEhlIGFsc28gd3JpdGVzIHRoYXQgdGhlIE9udGFyaW8gVGltZSBBY3QgKDE5OTAsIENoYXB0ZXIgVC45KQorIyBodHRwOi8vd3d3Lmdvdi5vbi5jYS9NQlMvZW5nbGlzaC9wdWJsaWNhdGlvbnMvc3RhdHJlZ3MvY29udHRleHQuaHRtbAogIyBzYXlzIHRoYXQgT250YXJpbyBlYXN0IG9mIDkwVyB1c2VzIEVTVC9FRFQsIGFuZCB3ZXN0IG9mIDkwVyB1c2VzIENTVC9DRFQuCiAjIE9mZmljaWFsbHkgQXRpa29rYW4gaXMgdGhlcmVmb3JlIG9uIENTVC9DRFQsIGFuZCBtb3N0IGxpa2VseSB0aGlzIHJlcG9ydAogIyBjb25jZXJucyBhIG5vbi1vZmZpY2lhbCB0aW1lIG9ic2VydmVkIGFzIGEgbWF0dGVyIG9mIGxvY2FsIHByYWN0aWNlLgpAQCAtMTU0MCw5ICsxNTExLDcgQEAKICMgVGhlIEpvdXJuYWwgb2YgVGhlIFJveWFsIEFzdHJvbm9taWNhbCBTb2NpZXR5IG9mIENhbmFkYSwKICMgdm9sdW1lIDI2LCBudW1iZXIgMiAoRmVicnVhcnkgMTkzMikgYW5kLCBhcyBvZiAyMDEwLTA3LTE3LAogIyB3YXMgYXZhaWxhYmxlIGF0Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hZHNhYnMuaGFydmFyZC5lZHUvZnVsbC8xOTMySlJBU0MuLjI2Li4uNDlTIj4KICMgaHR0cDovL2Fkc2Ficy5oYXJ2YXJkLmVkdS9mdWxsLzE5MzJKUkFTQy4uMjYuLi40OVMKLSMgPC9hPgogIwogIyBJdCBpbmNsdWRlcyB0aGUgdGV4dCBiZWxvdyAoc3RhcnRpbmcgb24gcGFnZSA1Nyk6CiAjCkBAIC0xNTUzLDI2ICsxNTIyLDI2IEBACiAjIGluZyBpbiAxOTMwLiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm92aW5jZSBvZiBRdWViZWMgaXMgZGVmaW5pdGUsCiAjIGZvciB0aGUgb3RoZXIgcHJvdmluY2VzIG9ubHkgYXBwcm94aW1hdGU6CiAjCi0jIAlQcm92aW5jZQlEYXlsaWdodCBzYXZpbmcgdGltZSB1c2VkCisjCVByb3ZpbmNlCURheWxpZ2h0IHNhdmluZyB0aW1lIHVzZWQKICMgUHJpbmNlIEVkd2FyZCBJc2xhbmQJTm90IHVzZWQuCiAjIE5vdmEgU2NvdGlhCQlJbiBIYWxpZmF4IG9ubHkuCiAjIE5ldyBCcnVuc3dpY2sJCUluIFN0LiBKb2huIG9ubHkuCiAjIFF1ZWJlYwkJSW4gdGhlIGZvbGxvd2luZyBwbGFjZXM6Ci0jIAkJCU1vbnRyZWFsCUxhY2hpbmUKLSMgCQkJUXVlYmVjCQlNb250LVJveWFsCi0jIAkJCUxldmlzCQlJYmVydmlsbGUKLSMgCQkJU3QuIExhbWJlcnQJQ2FwIGRlIGxhIE1hZGVsZWluZQotIyAJCQlWZXJkdW4JCUxvcmV0dGV2aWxsZQotIyAJCQlXZXN0bW91bnQJUmljaG1vbmQKLSMgCQkJT3V0cmVtb250CVN0LiBKZXJvbWUKLSMgCQkJTG9uZ3VldWlsCUdyZWVuZmllbGQgUGFyawotIyAJCQlBcnZpZGEJCVdhdGVybG9vCi0jIAkJCUNoYW1ibHktQ2FudG9uCUJlYXVsaWV1Ci0jIAkJCU1lbGJvdXJuZQlMYSBUdXF1ZQotIyAJCQlTdC4gVGhlb3BoaWxlCUJ1Y2tpbmdoYW0KKyMJCQlNb250cmVhbAlMYWNoaW5lCisjCQkJUXVlYmVjCQlNb250LVJveWFsCisjCQkJTMOpdmlzCQlJYmVydmlsbGUKKyMJCQlTdC4gTGFtYmVydAlDYXAgZGUgbGEgTWFkZWzDqGluZQorIwkJCVZlcmR1bgkJTG9yZXR0ZXZpbGxlCisjCQkJV2VzdG1vdW50CVJpY2htb25kCisjCQkJT3V0cmVtb250CVN0LiBKw6lyw7RtZQorIwkJCUxvbmd1ZXVpbAlHcmVlbmZpZWxkIFBhcmsKKyMJCQlBcnZpZGEJCVdhdGVybG9vCisjCQkJQ2hhbWJseS1DYW50b24JQmVhdWxpZXUKKyMJCQlNZWxib3VybmUJTGEgVHVxdWUKKyMJCQlTdC4gVGjDqW9waGlsZQlCdWNraW5naGFtCiAjIE9udGFyaW8JCVVzZWQgZ2VuZXJhbGx5IGluIHRoZSBjaXRpZXMgYW5kIHRvd25zIGFsb25nCi0jIAkJCXRoZSBzb3V0aGVybHkgcGFydCBvZiB0aGUgcHJvdmluY2UuIE5vdAotIyAJCQl1c2VkIGluIHRoZSBub3J0aHdlc3RlcmxoeSBwYXJ0LgorIwkJCXRoZSBzb3V0aGVybHkgcGFydCBvZiB0aGUgcHJvdmluY2UuIE5vdAorIwkJCXVzZWQgaW4gdGhlIG5vcnRod2VzdGVybHkgcGFydC4KICMgTWFuaXRvYmEJCU5vdCB1c2VkLgogIyBTYXNrYXRjaGV3YW4JCUluIFJlZ2luYSBvbmx5LgogIyBBbGJlcnRhCQlOb3QgdXNlZC4KQEAgLTE2NDEsNyArMTYxMCw3IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvVG9yb250bwktNToxNzozMiAtCUxNVAkxODk1CiAJCQktNTowMAlDYW5hZGEJRSVzVAkxOTE5Ci0JCQktNTowMAlUb3JvbnRvCUUlc1QJMTk0MiBGZWIgIDkgMjowMHMKKwkJCS01OjAwCVRvcm9udG8JRSVzVAkxOTQyIEZlYiAgOSAgMjowMHMKIAkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDYKIAkJCS01OjAwCVRvcm9udG8JRSVzVAkxOTc0CiAJCQktNTowMAlDYW5hZGEJRSVzVApAQCAtMTY1NCwxNiArMTYyMywxNiBAQAogCQkJLTU6MDAJQ2FuYWRhCUUlc1QKIFpvbmUgQW1lcmljYS9OaXBpZ29uCS01OjUzOjA0IC0JTE1UCTE4OTUKIAkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDAgU2VwIDI5Ci0JCQktNTowMAkxOjAwCUVEVAkxOTQyIEZlYiAgOSAyOjAwcworCQkJLTU6MDAJMTowMAlFRFQJMTk0MiBGZWIgIDkgIDI6MDBzCiAJCQktNTowMAlDYW5hZGEJRSVzVAogWm9uZSBBbWVyaWNhL1JhaW55X1JpdmVyIC02OjE4OjE2IC0JTE1UCTE4OTUKIAkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDAgU2VwIDI5Ci0JCQktNjowMAkxOjAwCUNEVAkxOTQyIEZlYiAgOSAyOjAwcworCQkJLTY6MDAJMTowMAlDRFQJMTk0MiBGZWIgIDkgIDI6MDBzCiAJCQktNjowMAlDYW5hZGEJQyVzVAogWm9uZSBBbWVyaWNhL0F0aWtva2FuCS02OjA2OjI4IC0JTE1UCTE4OTUKIAkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDAgU2VwIDI5Ci0JCQktNjowMAkxOjAwCUNEVAkxOTQyIEZlYiAgOSAyOjAwcwotCQkJLTY6MDAJQ2FuYWRhCUMlc1QJMTk0NSBTZXAgMzAgMjowMAorCQkJLTY6MDAJMTowMAlDRFQJMTk0MiBGZWIgIDkgIDI6MDBzCisJCQktNjowMAlDYW5hZGEJQyVzVAkxOTQ1IFNlcCAzMCAgMjowMAogCQkJLTU6MDAJLQlFU1QKIAogCkBAIC0xNjc2LDcgKzE2NDUsNyBAQAogIyB0aGUgZmlyc3QgU3VuZGF5IG9mIEFwcmlsIG9mIGVhY2ggeWVhciBhbmQgdHdvIG8nY2xvY2sgQ2VudHJhbAogIyBTdGFuZGFyZCBUaW1lIGluIHRoZSBtb3JuaW5nIG9mIHRoZSBsYXN0IFN1bmRheSBvZiBPY3RvYmVyIG5leHQKICMgZm9sbG93aW5nLCBvbmUgaG91ciBpbiBhZHZhbmNlIG9mIENlbnRyYWwgU3RhbmRhcmQgVGltZS4iLi4uCi0jIEkgYmVsaWV2ZSB0aGF0IHRoZSBFbmdsaXNoIGxlZ2lzbGF0aW9uIFtvZiB0aGUgb2xkIHRpbWUgYWN0XSBoYWQgPQorIyBJIGJlbGlldmUgdGhhdCB0aGUgRW5nbGlzaCBsZWdpc2xhdGlvbiBbb2YgdGhlIG9sZCB0aW1lIGFjdF0gaGFkCiAjIGJlZW4gYXNzZW50ZWQgdG8gKE1hcmNoIDIyLCAxOTY3KS4uLi4KICMgQWxzbywgYXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZXJlIHdhcyBubyBvcmRlci1pbi1jb3VuY2lsIHZhcnlpbmcKICMgdGhlIHRpbWUgb2YgRGF5bGlnaHQgU2F2aW5nIFRpbWUgZm9yIDIwMDUgYW5kIHNvIHRoZSBwcm92aXNpb25zIG9mCkBAIC0xNzk5LDEyICsxNzY4LDEyIEBACiBSdWxlCVN3aWZ0CTE5NjAJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvUmVnaW5hCS02OjU4OjM2IC0JTE1UCTE5MDUgU2VwCi0JCQktNzowMAlSZWdpbmEJTSVzVAkxOTYwIEFwciBsYXN0U3VuIDI6MDAKKwkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NjAgQXByIGxhc3RTdW4gIDI6MDAKIAkJCS02OjAwCS0JQ1NUCiBab25lIEFtZXJpY2EvU3dpZnRfQ3VycmVudCAtNzoxMToyMCAtCUxNVAkxOTA1IFNlcAotCQkJLTc6MDAJQ2FuYWRhCU0lc1QJMTk0NiBBcHIgbGFzdFN1biAyOjAwCisJCQktNzowMAlDYW5hZGEJTSVzVAkxOTQ2IEFwciBsYXN0U3VuICAyOjAwCiAJCQktNzowMAlSZWdpbmEJTSVzVAkxOTUwCi0JCQktNzowMAlTd2lmdAlNJXNUCTE5NzIgQXByIGxhc3RTdW4gMjowMAorCQkJLTc6MDAJU3dpZnQJTSVzVAkxOTcyIEFwciBsYXN0U3VuICAyOjAwCiAJCQktNjowMAktCUNTVAogCiAKQEAgLTE4NTQsOSArMTgyMyw3IEBACiAjIEVhcmxpZXIgdGhpcyB5ZWFyIEkgc3R1bWJsZWQgYWNyb3NzIGEgZGV0YWlsZWQgYXJ0aWNsZSBhYm91dCB0aGUgdGltZQogIyBrZWVwaW5nIGhpc3Rvcnkgb2YgQ3Jlc3RvbjsgaXQgd2FzIHdyaXR0ZW4gYnkgVGFtbXkgSGFyZHdpY2sgd2hvIGlzIHRoZQogIyBtYW5hZ2VyIG9mIHRoZSBDcmVzdG9uICYgRGlzdHJpY3QgTXVzZXVtLiBUaGUgYXJ0aWNsZSB3YXMgd3JpdHRlbiBpbiBNYXkgMjAwOS4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5pbG92ZWNyZXN0b24uY29tLz9wPWFydGljbGVzJnQ9c3BlYyZhcj0yNjAiPgogIyBodHRwOi8vd3d3Lmlsb3ZlY3Jlc3Rvbi5jb20vP3A9YXJ0aWNsZXMmdD1zcGVjJmFyPTI2MAotIyA8L2E+CiAjIEFjY29yZGluZyB0byB0aGUgYXJ0aWNsZSwgQ3Jlc3RvbiBoYXMgbm90IGNoYW5nZWQgaXRzIGNsb2NrcyBzaW5jZSBKdW5lIDE5MTguCiAjIGkuZS4gQ3Jlc3RvbiBoYXMgYmVlbiBzdHVjayBvbiBVVEMtNyBmb3IgOTMgeWVhcnMuCiAjIERhd3NvbiBDcmVlaywgb24gdGhlIG90aGVyIGhhbmQsIGNoYW5nZWQgaXRzIGNsb2NrcyBhcyByZWNlbnRseSBhcyBBcHJpbCAxOTcyLgpAQCAtMTg2NCwxOCArMTgzMSwxNiBAQAogIyBVbmZvcnR1bmF0ZWx5IHRoZSBleGFjdCBkYXRlIGZvciB0aGUgdGltZSBjaGFuZ2UgaW4gSnVuZSAxOTE4IHJlbWFpbnMKICMgdW5rbm93biBhbmQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gYXNjZXJ0YWluLiAgSSBlLW1haWxlZCBUYW1teSBhIGZldyBtb250aHMKICMgYWdvIHRvIGFzayBpZiBTdW5kYXkgSnVuZSAyIHdhcyBhIHJlYXNvbmFibGUgZ3Vlc3MuICBTaGUgc2FpZCBpdCB3YXMganVzdAotIyBhcyBwbGF1c2libGUgYXMgYW55IG90aGVyIGRhdGUgKGluIEp1bmUpLiAgU2hlIGFsc28gc2FpZCB0aGF0IGFmdGVyIHdyaXRpbmcgdGhlCi0jIGFydGljbGUgc2hlIGhhZCBkaXNjb3ZlcmVkIGFub3RoZXIgdGltZSBjaGFuZ2UgaW4gMTkxNjsgdGhpcyBpcyB0aGUgc3ViamVjdAotIyBvZiBhbm90aGVyIGFydGljbGUgd2hpY2ggc2hlIHdyb3RlIGluIE9jdG9iZXIgMjAxMC4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jcmVzdG9uLm11c2V1bS5iYy5jYS9pbmRleC5waHA/bW9kdWxlPWNvbW1lbnRzJnVvcD12aWV3X2NvbW1lbnQmY20raWQ9NTYiPgorIyBhcyBwbGF1c2libGUgYXMgYW55IG90aGVyIGRhdGUgKGluIEp1bmUpLiAgU2hlIGFsc28gc2FpZCB0aGF0IGFmdGVyIHdyaXRpbmcKKyMgdGhlIGFydGljbGUgc2hlIGhhZCBkaXNjb3ZlcmVkIGFub3RoZXIgdGltZSBjaGFuZ2UgaW4gMTkxNjsgdGhpcyBpcyB0aGUKKyMgc3ViamVjdCBvZiBhbm90aGVyIGFydGljbGUgd2hpY2ggc2hlIHdyb3RlIGluIE9jdG9iZXIgMjAxMC4KICMgaHR0cDovL3d3dy5jcmVzdG9uLm11c2V1bS5iYy5jYS9pbmRleC5waHA/bW9kdWxlPWNvbW1lbnRzJnVvcD12aWV3X2NvbW1lbnQmY20raWQ9NTYKLSMgPC9hPgogCiAjIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSB0aHJlZSBjbG9jayBjaGFuZ2UgZXZlbnRzIGluIENyZXN0b24ncyBoaXN0b3J5OgogIyAxLiAxODg0IG9yIDE4ODU6IGFkb3B0aW9uIG9mIE1vdW50YWluIFN0YW5kYXJkIFRpbWUgKEdNVC03KQogIyBFeGFjdCBkYXRlIHVua25vd24KICMgMi4gT2N0IDE5MTY6IHN3aXRjaCB0byBQYWNpZmljIFN0YW5kYXJkIFRpbWUgKEdNVC04KQotIyBFeGFjdCBkYXRlIGluIE9jdG9iZXIgdW5rbm93bjsgIFN1bmRheSBPY3RvYmVyIDEgaXMgYSByZWFzb25hYmxlIGd1ZXNzLgorIyBFeGFjdCBkYXRlIGluIE9jdG9iZXIgdW5rbm93bjsgU3VuZGF5IE9jdG9iZXIgMSBpcyBhIHJlYXNvbmFibGUgZ3Vlc3MuCiAjIDMuIEp1bmUgMTkxODogc3dpdGNoIHRvIFBhY2lmaWMgRGF5bGlnaHQgVGltZSAoR01ULTcpCiAjIEV4YWN0IGRhdGUgaW4gSnVuZSB1bmtub3duOyBTdW5kYXkgSnVuZSAyIGlzIGEgcmVhc29uYWJsZSBndWVzcy4KICMgbm90ZSMxOgpAQCAtMTg4OCw5ICsxODUzLDcgQEAKICMgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgQ3Jlc3RvbiB3aWxsIHJlbWFpbiBvbiBNb3VudGFpbiBTdGFuZGFyZCBUaW1lCiAjIChVVEMtNykgZm9yZXZlci4KICMgVGhlIHN1YmplY3Qgd2FzIGRlYmF0ZWQgYXQgbGVhc3Qgb25jZSB0aGlzIHllYXIgYnkgdGhlIHRvd24gQ291bmNpbC4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5iY2xvY2FsbmV3cy5jb20va29vdGVuYXlfcm9ja2llcy9jcmVzdG9udmFsbGV5YWR2YW5jZS9uZXdzLzExNjc2MDgwOS5odG1sIj4KICMgaHR0cDovL3d3dy5iY2xvY2FsbmV3cy5jb20va29vdGVuYXlfcm9ja2llcy9jcmVzdG9udmFsbGV5YWR2YW5jZS9uZXdzLzExNjc2MDgwOS5odG1sCi0jIDwvYT4KIAogIyBEdXJpbmcgYSBwZXJpb2QgV1dJSSwgc3VtbWVyIHRpbWUgKERheWxpZ2h0IHNheWluZykgd2FzIG1hbmRhdG9yeSBpbiBDYW5hZGEuCiAjIEluIENyZXN0b24sIHRoYXQgd2FzIGhhbmRsZWQgYnkgc2hpZnRpbmcgdGhlIGFyZWEgdG8gUFNUICgtODowMCkgdGhlbiBhcHBseWluZwpAQCAtMTkxNyw3ICsxODgwLDcgQEAKIAkJCS04OjAwCUNhbmFkYQlQJXNUCiBab25lIEFtZXJpY2EvRGF3c29uX0NyZWVrIC04OjAwOjU2IC0JTE1UCTE4ODQKIAkJCS04OjAwCUNhbmFkYQlQJXNUCTE5NDcKLQkJCS04OjAwCVZhbmMJUCVzVAkxOTcyIEF1ZyAzMCAyOjAwCisJCQktODowMAlWYW5jCVAlc1QJMTk3MiBBdWcgMzAgIDI6MDAKIAkJCS03OjAwCS0JTVNUCiBab25lIEFtZXJpY2EvQ3Jlc3RvbgktNzo0NjowNCAtCUxNVAkxODg0CiAJCQktNzowMAktCU1TVAkxOTE2IE9jdCAxCkBAIC0xOTQ0LDE4ICsxOTA3LDE3IEBACiAKICMgRnJvbSBSaXZlcyBNY0RvdyAoMTk5OS0wOS0wNCk6CiAjIE51bmF2dXQgLi4uIG1vdmVkIC4uLiB0byBpbmNvcnBvcmF0ZSB0aGUgd2hvbGUgdGVycml0b3J5IGludG8gb25lIHRpbWUgem9uZS4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5udW5hdHNpYXEuY29tL251bmF2dXQvbnZ0OTA5MDNfMTMuaHRtbCI+CiAjIE51bmF2dXQgbW92ZXMgdG8gc2luZ2xlIHRpbWUgem9uZSBPY3QuIDMxCi0jIDwvYT4KKyMgaHR0cDovL3d3dy5udW5hdHNpYXEuY29tL251bmF2dXQvbnZ0OTA5MDNfMTMuaHRtbAogIwogIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5OS0wOS0wNik6CiAjIFdlIHRoZW4gbmVlZCB0byBjcmVhdGUgYSBuZXcgdGltZXpvbmUgZm9yIHRoZSBLaXRpa21lb3QgcmVnaW9uIG9mIE51bmF2dXQKICMgdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIHRoZSBZZWxsb3drbmlmZSByZWdpb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuYXZ1dC5jb20vYmFzaWNmYWN0cy9lbmdsaXNoL2Jhc2ljZmFjdHNfMXRlcnJpdG9yeS5odG1sIj4KICMgQmFzaWMgRmFjdHM6IFRoZSBOZXcgVGVycml0b3J5Ci0jIDwvYT4gKDE5OTkpIHJlcG9ydHMgdGhhdCBQYW5nbmlydHVuZyBvcGVyYXRlcyBvbiBlYXN0ZXJuIHRpbWUsCisjIGh0dHA6Ly93d3cubnVuYXZ1dC5jb20vYmFzaWNmYWN0cy9lbmdsaXNoL2Jhc2ljZmFjdHNfMXRlcnJpdG9yeS5odG1sCisjICgxOTk5KSByZXBvcnRzIHRoYXQgUGFuZ25pcnR1bmcgb3BlcmF0ZXMgb24gZWFzdGVybiB0aW1lLAogIyBhbmQgdGhhdCBDb3JhbCBIYXJib3VyIGRvZXMgbm90IG9ic2VydmUgRFNULiAgV2UgZG9uJ3Qga25vdyB3aGVuCiAjIFBhbmduaXJ0dW5nIHN3aXRjaGVkIHRvIGVhc3Rlcm4gdGltZTsgd2UnbGwgZ3Vlc3MgMTk5NS4KIApAQCAtMTk4Myw4ICsxOTQ1LDggQEAKICMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWZmYWlycy4KIAogIyBGcm9tIE1pY2hhZWxhIFJvZHJpZ3VlLCB3cml0aW5nIGluIHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vYXJjaGl2ZXMvbnVuYXZ1dDk5MTEzMC9udnQ5MTExOV8xNy5odG1sIj4KLSMgTnVuYXRzaWFxIE5ld3MgKDE5OTktMTEtMTkpPC9hPjoKKyMgTnVuYXRzaWFxIE5ld3MgKDE5OTktMTEtMTkpOgorIyBodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vYXJjaGl2ZXMvbnVuYXZ1dDk5MTEzMC9udnQ5MTExOV8xNy5odG1sCiAjIENseWRlIFJpdmVyLCBQYW5nbmlydHVuZyBhbmQgU2FuaWtpbHVhcSBub3cgb3BlcmF0ZSB3aXRoIHR3byB0aW1lIHpvbmVzLAogIyBjZW50cmFsIC0gb3IgTnVuYXZ1dCB0aW1lIC0gZm9yIGdvdmVybm1lbnQgb2ZmaWNlcywgYW5kIGVhc3Rlcm4gdGltZQogIyBmb3IgbXVuaWNpcGFsIG9mZmljZXMgYW5kIHNjaG9vbHMuLi4uICBJZ2xvb2xpayBbd2FzIHNpbWlsYXIgYnV0IHRoZW5dCkBAIC0yMDAyLDEwICsxOTY0LDggQEAKICMgQ2VudHJhbCBUaW1lIGFuZCBTb3V0aGFtcHRvbiBJc2xhbmQgW2luIHRoZSBDZW50cmFsIHpvbmVdIGlzIG5vdAogIyByZXF1aXJlZCB0byB1c2UgZGF5bGlnaHQgc2F2aW5ncy4KIAotIyBGcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuYXRzaWFxLmNvbS9hcmNoaXZlcy9udW5hdnV0MDAxMTMwL252dDIxMTEwXzAyLmh0bWwiPgotIyBOdW5hdnV0IG5vdyBoYXMgdHdvIHRpbWUgem9uZXMKLSMgPC9hPiAoMjAwMC0xMS0xMCk6CisjIEZyb20gPGh0dHA6Ly93d3cubnVuYXRzaWFxLmNvbS9hcmNoaXZlcy9udW5hdnV0MDAxMTMwL252dDIxMTEwXzAyLmh0bWw+CisjIE51bmF2dXQgbm93IGhhcyB0d28gdGltZSB6b25lcyAoMjAwMC0xMS0xMCk6CiAjIFRoZSBOdW5hdnV0IGdvdmVybm1lbnQgd291bGQgYWxsb3cgaXRzIGVtcGxveWVlcyBpbiBLdWdsdWt0dWsgYW5kCiAjIENhbWJyaWRnZSBCYXkgdG8gb3BlcmF0ZSBvbiBjZW50cmFsIHRpbWUgeWVhci1yb3VuZCwgcHV0dGluZyB0aGVtCiAjIG9uZSBob3VyIGJlaGluZCB0aGUgcmVzdCBvZiBOdW5hdnV0IGZvciBzaXggbW9udGhzIGR1cmluZyB0aGUgd2ludGVyLgpAQCAtMjA5Niw5ICsyMDU2LDcgQEAKICMgdXNlZCB0byBiZSB0aGUgbWF5b3Igb2YgUmVzb2x1dGUgQmF5IGFuZCBoZSBhcHBhcmVudGx5IG93bnMgaGFsZiB0aGUKICMgYnVzaW5lc3NlcyBpbmNsdWRpbmcgIlNvdXRoIENhbXAgSW5uLiIgVGhpcyB3ZWJzaXRlIGhhcyBzb21lIGluZm8gb24KICMgQXppejoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy51cGhlcmUuY2Evbm9kZS80OTMiPgogIyBodHRwOi8vd3d3LnVwaGVyZS5jYS9ub2RlLzQ5MwotIyA8L2E+CiAjCiAjIEkgc2VudCBBeml6IGFuIGUtbWFpbCBhc2tpbmcgd2hlbiBSZXNvbHV0ZSBCYXkgaGFkIHN0b3BwZWQgdXNpbmcKICMgRWFzdGVybiBTdGFuZGFyZCBUaW1lLgpAQCAtMjEzNiw0NyArMjA5NCw0NyBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogIyBha2EgUGFubmlxdHV1cQogWm9uZSBBbWVyaWNhL1BhbmduaXJ0dW5nIDAJLQl6enoJMTkyMSAjIHRyYWRpbmcgcG9zdCBlc3QuCi0JCQktNDowMAlOVF9ZSwlBJXNUCTE5OTUgQXByIFN1bj49MSAyOjAwCi0JCQktNTowMAlDYW5hZGEJRSVzVAkxOTk5IE9jdCAzMSAyOjAwCi0JCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAyOjAwCisJCQktNDowMAlOVF9ZSwlBJXNUCTE5OTUgQXByIFN1bj49MSAgMjowMAorCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk5OSBPY3QgMzEgIDI6MDAKKwkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5ICAyOjAwCiAJCQktNTowMAlDYW5hZGEJRSVzVAogIyBmb3JtZXJseSBGcm9iaXNoZXIgQmF5CiBab25lIEFtZXJpY2EvSXFhbHVpdAkwCS0Jenp6CTE5NDIgQXVnICMgRnJvYmlzaGVyIEJheSBlc3QuCi0JCQktNTowMAlOVF9ZSwlFJXNUCTE5OTkgT2N0IDMxIDI6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKKwkJCS01OjAwCU5UX1lLCUUlc1QJMTk5OSBPY3QgMzEgIDI6MDAKKwkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5ICAyOjAwCiAJCQktNTowMAlDYW5hZGEJRSVzVAogIyBha2EgUWF1c3VpdHR1cQogWm9uZSBBbWVyaWNhL1Jlc29sdXRlCTAJLQl6enoJMTk0NyBBdWcgMzEgIyBSZXNvbHV0ZSBmb3VuZGVkCi0JCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDYgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDcgTWFyIDExIDM6MDAKKwkJCS02OjAwCU5UX1lLCUMlc1QJMjAwMCBPY3QgMjkgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxICAzOjAwCisJCQktNjowMAlDYW5hZGEJQyVzVAkyMDA2IE9jdCAyOSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwNyBNYXIgMTEgIDM6MDAKIAkJCS02OjAwCUNhbmFkYQlDJXNUCiAjIGFrYSBLYW5naXFpbmlxCiBab25lIEFtZXJpY2EvUmFua2luX0lubGV0IDAJLQl6enoJMTk1NyAjIFJhbmtpbiBJbmxldCBmb3VuZGVkCi0JCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKKwkJCS02OjAwCU5UX1lLCUMlc1QJMjAwMCBPY3QgMjkgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxICAzOjAwCiAJCQktNjowMAlDYW5hZGEJQyVzVAogIyBha2EgSXFhbHVrdHV1dHRpYXEKIFpvbmUgQW1lcmljYS9DYW1icmlkZ2VfQmF5IDAJLQl6enoJMTkyMCAjIHRyYWRpbmcgcG9zdCBlc3QuPwotCQkJLTc6MDAJTlRfWUsJTSVzVAkxOTk5IE9jdCAzMSAyOjAwCi0JCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAyOjAwCi0JCQktNTowMAktCUVTVAkyMDAwIE5vdiAgNSAwOjAwCi0JCQktNjowMAktCUNTVAkyMDAxIEFwciAgMSAzOjAwCisJCQktNzowMAlOVF9ZSwlNJXNUCTE5OTkgT2N0IDMxICAyOjAwCisJCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwMCBOb3YgIDUgIDA6MDAKKwkJCS02OjAwCS0JQ1NUCTIwMDEgQXByICAxICAzOjAwCiAJCQktNzowMAlDYW5hZGEJTSVzVAogWm9uZSBBbWVyaWNhL1llbGxvd2tuaWZlIDAJLQl6enoJMTkzNSAjIFllbGxvd2tuaWZlIGZvdW5kZWQ/CiAJCQktNzowMAlOVF9ZSwlNJXNUCTE5ODAKIAkJCS03OjAwCUNhbmFkYQlNJXNUCiBab25lIEFtZXJpY2EvSW51dmlrCTAJLQl6enoJMTk1MyAjIEludXZpayBmb3VuZGVkCi0JCQktODowMAlOVF9ZSwlQJXNUCTE5NzkgQXByIGxhc3RTdW4gMjowMAorCQkJLTg6MDAJTlRfWUsJUCVzVAkxOTc5IEFwciBsYXN0U3VuICAyOjAwCiAJCQktNzowMAlOVF9ZSwlNJXNUCTE5ODAKIAkJCS03OjAwCUNhbmFkYQlNJXNUCiBab25lIEFtZXJpY2EvV2hpdGVob3JzZQktOTowMDoxMiAtCUxNVAkxOTAwIEF1ZyAyMAotCQkJLTk6MDAJTlRfWUsJWSVzVAkxOTY2IEp1bCAxIDI6MDAKKwkJCS05OjAwCU5UX1lLCVklc1QJMTk2NiBKdWwgIDEgIDI6MDAKIAkJCS04OjAwCU5UX1lLCVAlc1QJMTk4MAogCQkJLTg6MDAJQ2FuYWRhCVAlc1QKIFpvbmUgQW1lcmljYS9EYXdzb24JLTk6MTc6NDAgLQlMTVQJMTkwMCBBdWcgMjAKLQkJCS05OjAwCU5UX1lLCVklc1QJMTk3MyBPY3QgMjggMDowMAorCQkJLTk6MDAJTlRfWUsJWSVzVAkxOTczIE9jdCAyOCAgMDowMAogCQkJLTg6MDAJTlRfWUsJUCVzVAkxOTgwCiAJCQktODowMAlDYW5hZGEJUCVzVAogCkBAIC0yMTg4LDkgKzIxNDYsOCBAQAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA1KToKICMgVGhlIEludmVzdGlnYXRpb24gYW5kIEFuYWx5c2lzIFNlcnZpY2Ugb2YgdGhlCiAjIE1leGljYW4gTGlicmFyeSBvZiBDb25ncmVzcyAoTUxvQykgaGFzIHB1Ymxpc2hlZCBhCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2RkaGN1LmdvYi5teC9iaWJsaW90L3B1YmxpY2EvaW52ZXlhbmEvcG9saXNvYy9ob3J2ZXIvIj4KICMgaGlzdG9yeSBvZiBNZXhpY2FuIGxvY2FsIHRpbWUgKGluIFNwYW5pc2gpCi0jIDwvYT4uCisjIGh0dHA6Ly93d3cuY2RkaGN1LmdvYi5teC9iaWJsaW90L3B1YmxpY2EvaW52ZXlhbmEvcG9saXNvYy9ob3J2ZXIvCiAjCiAjIEhlcmUgYXJlIHRoZSBkaXNjcmVwYW5jaWVzIGJldHdlZW4gU2hhbmtzICYgUG90dGVuZ2VyIChTJlApIGFuZCB0aGUgTUxvQy4KICMgKEluIGFsbCBjYXNlcyB3ZSBnbyB3aXRoIHRoZSBNTG9DLikKQEAgLTIyMzUsOSArMjE5Miw4IEBACiAjIC0tLS0tLS0tLS0tLS0tIEVuZCBGb3J3YXJkZWQgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLQogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA2LTEyKToKICMgRm9yIGFuIEVuZ2xpc2ggdHJhbnNsYXRpb24gb2YgdGhlIGRlY3JlZSwgc2VlCi0jIDxhIGhyZWY9Imh0dHA6Ly9tZXhpY28tdHJhdmVsLmNvbS9leHRyYS90aW1lem9uZV9lbmcuaHRtbCI+CiAjICJEaWFyaW8gT2ZpY2lhbDogVGltZSBab25lIENoYW5nZW92ZXIiICgxOTk2LTAxLTA0KS4KLSMgPC9hPgorIyBodHRwOi8vbWV4aWNvLXRyYXZlbC5jb20vZXh0cmEvdGltZXpvbmVfZW5nLmh0bWwKIAogIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk4LTEwLTA4KToKICMgVGhlIFN0YXRlIG9mIFF1aW50YW5hIFJvbyBoYXMgcmV2ZXJ0ZWQgYmFjayB0byBjZW50cmFsIFNURCBhbmQgRFNUIHRpbWVzCkBAIC0yMjQ5LDcgKzIyMDUsNyBAQAogIyBzYXZpbmdzIHRpbWUgc28gYXMgdG8gc3RheSBvbiB0aGUgc2FtZSB0aW1lIHpvbmUgYXMgdGhlIHNvdXRoZXJuIHBhcnQgb2YKICMgQXJpem9uYSB5ZWFyIHJvdW5kLgogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkLCB0cmFuc2xhdGluZworIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQsIHRyYW5zbGF0aW5nCiAjIDxodHRwOi8vd3d3LnJlZm9ybWEuY29tL25hY2lvbmFsL2FydGljdWxvLzA2NDMyNy8+ICgyMDAxLTAxLTE3KToKICMgSW4gT2F4YWNhLCB0aGUgNTUuMDAwIHRlYWNoZXJzIGZyb20gdGhlIFNlY3Rpb24gMjIgb2YgdGhlIE5hdGlvbmFsCiAjIFN5bmRpY2F0ZSBvZiBFZHVjYXRpb24gV29ya2VycywgcmVmdXNlIHRvIGFwcGx5IGRheWxpZ2h0IHNhdmluZyBlYWNoCkBAIC0yMjYyLDcgKzIyMTgsNyBAQAogIyBKYW51YXJ5IDE3LCAyMDAwIC0gVGhlIEVuZXJneSBTZWNyZXRhcnksIEVybmVzdG8gTWFydGVucywgYW5ub3VuY2VkCiAjIHRoYXQgU3VtbWVyIFRpbWUgd2lsbCBiZSByZWR1Y2VkIGZyb20gc2V2ZW4gdG8gZml2ZSBtb250aHMsIHN0YXJ0aW5nCiAjIHRoaXMgeWVhci4uLi4KLSMgPGh0dHA6Ly93d3cucHVibGljby5jb20ubXgvc2NyaXB0cy90ZXh0bzMuYXNwP2FjdGlvbj1wYWdpbmEmcGFnPTIxJnBvcz1wJnNlY2M9bmFjaSZkYXRlPTAxLzE3LzIwMDE+CisjIGh0dHA6Ly93d3cucHVibGljby5jb20ubXgvc2NyaXB0cy90ZXh0bzMuYXNwP2FjdGlvbj1wYWdpbmEmcGFnPTIxJnBvcz1wJnNlY2M9bmFjaSZkYXRlPTAxLzE3LzIwMDEKICMgW3RyYW5zbGF0ZWRdLCBzYXlzICJzdW1tZXIgdGltZSB3aWxsIC4uLiB0YWtlIGVmZmVjdCBvbiB0aGUgZmlyc3QgU3VuZGF5CiAjIGluIE1heSwgYW5kIGVuZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyLgogCkBAIC0yMjcwLDIzICsyMjI2LDIyIEBACiAjIFRoZSAyMDAxLTAxLTI0IHRyYWRpdGlvbmFsIFdhc2hpbmd0b24gUG9zdCBjb250YWluZWQgdGhlIHBhZ2Ugb25lCiAjIHN0b3J5ICJUaW1lbHkgSXNzdWUgRGl2aWRlcyBNZXhpY2Fucy4iLi4uCiAjIGh0dHA6Ly93d3cud2FzaGluZ3RvbnBvc3QuY29tL3dwLWR5bi9hcnRpY2xlcy9BMzczODMtMjAwMUphbjIzLmh0bWwKLSMgLi4uIE1leGljbyBDaXR5IE1heW9yIExvcGV6IE9icmFkb3IgIi4uLmlzIHRocmVhdGVuaW5nIHRvIGtlZXAKKyMgLi4uIE1leGljbyBDaXR5IE1heW9yIEzDs3BleiBPYnJhZG9yICIuLi5pcyB0aHJlYXRlbmluZyB0byBrZWVwCiAjIE1leGljbyBDaXR5IGFuZCBpdHMgMjAgbWlsbGlvbiByZXNpZGVudHMgb24gYSBkaWZmZXJlbnQgdGltZSB0aGFuCi0jIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5Li4uIiBJbiBwYXJ0aWN1bGFyLCBMb3BleiBPYnJhZG9yIHdvdWxkIGFib2xpc2gKKyMgdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnkuLi4iIEluIHBhcnRpY3VsYXIsIEzDs3BleiBPYnJhZG9yIHdvdWxkIGFib2xpc2gKICMgb2JzZXJ2YXRpb24gb2YgRGF5bGlnaHQgU2F2aW5nIFRpbWUuCiAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jb25hZS5nb2IubXgvYWhvcnJvL2RlY3JldG9ob3J2ZXIyMDAxLmh0bWwjZGVjcmUiPgogIyBPZmZpY2lhbCBzdGF0dXRlIHB1Ymxpc2hlZCBieSB0aGUgRW5lcmd5IERlcGFydG1lbnQKLSMgPC9hPiAoMjAwMS0wMi0wMSkgc2hvd3MgQmFqYSBhbmQgQ2hpaGF1aHVhIGFzIHN0aWxsIHVzaW5nIFVTIERTVCBydWxlcywKLSMgYW5kIFNvbm9yYSB3aXRoIG5vIERTVC4gIFRoaXMgd2FzIHJlcG9ydGVkIGJ5IEplc3BlciBOb3JnYWFyZCAoMjAwMS0wMi0wMykuCisjIGh0dHA6Ly93d3cuY29uYWUuZ29iLm14L2Fob3Jyby9kZWNyZXRvaG9ydmVyMjAwMS5odG1sI2RlY3JlCisjICgyMDAxLTAyLTAxKSBzaG93cyBCYWphIGFuZCBDaGloYXVodWEgYXMgc3RpbGwgdXNpbmcgVVMgRFNUIHJ1bGVzLAorIyBhbmQgU29ub3JhIHdpdGggbm8gRFNULiAgVGhpcyB3YXMgcmVwb3J0ZWQgYnkgSmVzcGVyIE7DuHJnYWFyZCAoMjAwMS0wMi0wMykuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wMy0wMyk6CiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGF0aW1lcy5jb20vbmV3cy9uYXRpb24vMjAwMTAzMDMvdDAwMDAxODc2Ni5odG1sIj4KKyMgaHR0cDovL3d3dy5sYXRpbWVzLmNvbS9uZXdzL25hdGlvbi8yMDAxMDMwMy90MDAwMDE4NzY2Lmh0bWwKICMgSmFtZXMgRi4gU21pdGggd3JpdGVzIGluIHRvZGF5J3MgTEEgVGltZXMKLSMgPC9hPgogIyAqIFNvbm9yYSB3aWxsIGNvbnRpbnVlIHRvIG9ic2VydmUgc3RhbmRhcmQgdGltZS4KLSMgKiBMYXN0IHdlZWsgTWV4aWNvIENpdHkncyBtYXlvciBBbmRyZXMgTWFudWVsIExvcGV6IE9icmFkb3IgZGVjcmVlZCB0aGF0CisjICogTGFzdCB3ZWVrIE1leGljbyBDaXR5J3MgbWF5b3IgQW5kcsOpcyBNYW51ZWwgTMOzcGV6IE9icmFkb3IgZGVjcmVlZCB0aGF0CiAjICAgdGhlIEZlZGVyYWwgRGlzdHJpY3Qgd2lsbCBub3QgYWRvcHQgRFNULgogIyAqIDQgb2YgMTYgZGlzdHJpY3QgbGVhZGVycyBhbm5vdW5jZWQgdGhleSdsbCBpZ25vcmUgdGhlIGRlY3JlZS4KICMgKiBUaGUgZGVjcmVlIGRvZXMgbm90IGFmZmVjdCBmZWRlcmFsLWNvbnRyb2xsZWQgZmFjaWxpdGllcyBpbmNsdWRpbmcKQEAgLTIyOTQsNyArMjI0OSw3IEBACiAjCiAjIEZvciBub3cgd2UnbGwgYXNzdW1lIHRoYXQgdGhlIEZlZGVyYWwgRGlzdHJpY3Qgd2lsbCBib3cgdG8gZmVkZXJhbCBydWxlcy4KIAotIyBGcm9tIEplc3BlciBOb3JnYWFyZCAoMjAwMS0wNC0wMSk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCAoMjAwMS0wNC0wMSk6CiAjIEkgZm91bmQgc29tZSByZWZlcmVuY2VzIHRvIHRoZSBNZXhpY2FuIGFwcGxpY2F0aW9uIG9mIGRheWxpZ2h0CiAjIHNhdmluZywgd2hpY2ggbW9kaWZpZXMgd2hhdCBJIGhhZCBhbHJlYWR5IHNlbnQgeW91LCBzdGF0aW5nIGVhcmxpZXIKICMgdGhhdCBhIG51bWJlciBvZiBub3J0aGVybiBNZXhpY2FuIHN0YXRlcyB3b3VsZCBnbyBvbiBkYXlsaWdodApAQCAtMjMwMyw3ICsyMjU4LDcgQEAKICMgc2F2aW5nIGFsbCB5ZWFyKSB3aWxsIGZvbGxvdyB0aGUgb3JpZ2luYWwgZGVjcmVlIG9mIHByZXNpZGVudAogIyBWaWNlbnRlIEZveCwgc3RhcnRpbmcgZGF5bGlnaHQgc2F2aW5nIE1heSA2LCAyMDAxIGFuZCBlbmRpbmcKICMgU2VwdGVtYmVyIDMwLCAyMDAxLgotIyBSZWZlcmVuY2VzOiAiRGlhcmlvIGRlIE1vbnRlcnJleSIgPHd3dy5kaWFyaW9kZW1vbnRlcnJleS5jb20vaW5kZXguYXNwPgorIyBSZWZlcmVuY2VzOiAiRGlhcmlvIGRlIE1vbnRlcnJleSIgPGh0dHA6Ly93d3cuZGlhcmlvZGVtb250ZXJyZXkuY29tL2luZGV4LmFzcD4KICMgUGFsYWJyYSA8aHR0cDovL3BhbGFicmEuaW5mb3NlbC5jb20vMDEwMzMxL3ByaW1lcmEvcHByaTMxMDEucGRmPiAoMjAwMS0wMy0zMSkKIAogIyBGcm9tIFJldXRlcnMgKDIwMDEtMDktMDQpOgpAQCAtMjMxNSw3ICsyMjcwLDcgQEAKICMgc3RhbmRhcmQgdGltZS4gIlRoaXMgaXMgc28gcmVzaWRlbnRzIG9mIHRoZSBGZWRlcmFsIERpc3RyaWN0IGFyZSBub3QKICMgc3ViamVjdCB0byB1bmV4cGVjdGVkIHRpbWUgY2hhbmdlcywiIGEgc3RhdGVtZW50IGZyb20gdGhlIGNvdXJ0IHNhaWQuCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDItMDMtMTIpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDItMDMtMTIpOgogIyAuLi4gY29uc3VsdGluZyBteSBsb2NhbCBncm9jZXJ5IHN0b3JlKCEpIGFuZCBteSBjb3dvcmtlcnMsIHRoZXkgYWxsIGluc2lzdGVkCiAjIHRoYXQgYSBuZXcgZGVjaXNpb24gaGFkIGJlZW4gbWFkZSB0byByZWluc3RhdGUgVVMgc3R5bGUgRFNUIGluIE1leGljby4uLi4KICMgaHR0cDovL3d3dy5jb25hZS5nb2IubXgvYWhvcnJvL2hvcmF2ZXIyMDAxX20xXzIwMDIuaHRtbCAoMjAwMi0wMi0yMCkKQEAgLTIzMjksNDggKzIyODQsMzYgQEAKICMgPiB0aGUgVW5pdGVkIFN0YXRlcy4KICMgTm93IHRoaXMgaGFzIHBhc3NlZCBib3RoIHRoZSBDb25ncmVzcyBhbmQgdGhlIFNlbmF0ZSwgc28gc3RhcnRpbmcgZnJvbQogIyAyMDEwLCBzb21lIGJvcmRlciByZWdpb25zIHdpbGwgYmUgdGhlIHNhbWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2lnbm9uc2FuZGllZ28uY29tL25ld3MvMjAwOS9kZWMvMjgvY2xvY2tzLXdpbGwtbWF0Y2gtYm90aC1zaWRlcy1ib3JkZXIvIj4KICMgaHR0cDovL3d3dy5zaWdub25zYW5kaWVnby5jb20vbmV3cy8yMDA5L2RlYy8yOC9jbG9ja3Mtd2lsbC1tYXRjaC1ib3RoLXNpZGVzLWJvcmRlci8KLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmVsbWFuYW5hcmV5LmNvbS9kaWFyaW8vbm90aWNpYS9uYWNpb25hbC9ub3RpY2lhcy9lbXBhdGFuX2hvcmFyaW9fZGVfZnJvbnRlcmFfY29uX2V1LzYyMTkzOSI+CiAjIGh0dHA6Ly93d3cuZWxtYW5hbmFyZXkuY29tL2RpYXJpby9ub3RpY2lhL25hY2lvbmFsL25vdGljaWFzL2VtcGF0YW5faG9yYXJpb19kZV9mcm9udGVyYV9jb25fZXUvNjIxOTM5Ci0jIDwvYT4KICMgKFNwYW5pc2gpCiAjCiAjIENvdWxkIG5vdCBmaW5kIHRoZSBuZXcgbGF3IHRleHQsIGJ1dCB0aGUgcHJvcG9zZWQgbGF3IHRleHQgY2hhbmdlcyBhcmUgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL2dhY2V0YS5kaXB1dGFkb3MuZ29iLm14L0dhY2V0YS82MS8yMDA5L2RpYy8yMDA5MTIxMC1WLnBkZiI+CiAjIGh0dHA6Ly9nYWNldGEuZGlwdXRhZG9zLmdvYi5teC9HYWNldGEvNjEvMjAwOS9kaWMvMjAwOTEyMTAtVi5wZGYKLSMgPC9hPgogIyAoR2FjZXRhIFBhcmxhbWVudGFyaWEpCiAjCiAjIFRoZXJlIGlzIGFsc28gYSBsaXN0IG9mIHRoZSB2b3RlcyBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vZ2FjZXRhLmRpcHV0YWRvcy5nb2IubXgvR2FjZXRhLzYxLzIwMDkvZGljL1YyLTEwMTIwOS5odG1sIj4KICMgaHR0cDovL2dhY2V0YS5kaXB1dGFkb3MuZ29iLm14L0dhY2V0YS82MS8yMDA5L2RpYy9WMi0xMDEyMDkuaHRtbAotIyA8L2E+CiAjCiAjIE91ciBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbm9ydGgtbWV4aWNvLWRzdC1jaGFuZ2UuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9ub3J0aC1tZXhpY28tZHN0LWNoYW5nZS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMC0wMS0yMCk6CiAjIFRoZSBwYWdlCi0jIDxhIGhyZWY9Imh0dHA6Ly9kb2YuZ29iLm14L25vdGFfZGV0YWxsZS5waHA/Y29kaWdvPTUxMjc0ODAmZmVjaGE9MDYvMDEvMjAxMCI+CiAjIGh0dHA6Ly9kb2YuZ29iLm14L25vdGFfZGV0YWxsZS5waHA/Y29kaWdvPTUxMjc0ODAmZmVjaGE9MDYvMDEvMjAxMAotIyA8L2E+CiAjIGluY2x1ZGVzIHRoaXMgdGV4dDoKICMgRW4gbG9zIG11bmljaXBpb3MgZnJvbnRlcml6b3MgZGUgVGlqdWFuYSB5IE1leGljYWxpIGVuIEJhamEgQ2FsaWZvcm5pYTsKLSMgSnUmYWFjdXRlO3JleiB5IE9qaW5hZ2EgZW4gQ2hpaHVhaHVhOyBBY3UmbnRpbGRlO2EgeSBQaWVkcmFzIE5lZ3JhcyBlbiBDb2FodWlsYTsKLSMgQW4mYWFjdXRlO2h1YWMgZW4gTnVldm8gTGUmb2FjdXRlO247IHkgTnVldm8gTGFyZWRvLCBSZXlub3NhIHkgTWF0YW1vcm9zIGVuCi0jIFRhbWF1bGlwYXMsIGxhIGFwbGljYWNpJm9hY3V0ZTtuIGRlIGVzdGUgaG9yYXJpbyBlc3RhY2lvbmFsIHN1cnRpciZhYWN1dGU7IGVmZWN0bwotIyBkZXNkZSBsYXMgZG9zIGhvcmFzIGRlbCBzZWd1bmRvIGRvbWluZ28gZGUgbWFyem8geSBjb25jbHVpciZhYWN1dGU7IGEgbGFzIGRvcworIyBKdcOhcmV6IHkgT2ppbmFnYSBlbiBDaGlodWFodWE7IEFjdcOxYSB5IFBpZWRyYXMgTmVncmFzIGVuIENvYWh1aWxhOworIyBBbsOhaHVhYyBlbiBOdWV2byBMZcOzbjsgeSBOdWV2byBMYXJlZG8sIFJleW5vc2EgeSBNYXRhbW9yb3MgZW4KKyMgVGFtYXVsaXBhcywgbGEgYXBsaWNhY2nDs24gZGUgZXN0ZSBob3JhcmlvIGVzdGFjaW9uYWwgc3VydGlyw6EgZWZlY3RvCisjIGRlc2RlIGxhcyBkb3MgaG9yYXMgZGVsIHNlZ3VuZG8gZG9taW5nbyBkZSBtYXJ6byB5IGNvbmNsdWlyw6EgYSBsYXMgZG9zCiAjIGhvcmFzIGRlbCBwcmltZXIgZG9taW5nbyBkZSBub3ZpZW1icmUuCiAjIEVuIGxvcyBtdW5pY2lwaW9zIGZyb250ZXJpem9zIHF1ZSBzZSBlbmN1ZW50cmVuIHViaWNhZG9zIGVuIGxhIGZyYW5qYQotIyBmcm9udGVyaXphIG5vcnRlIGVuIGVsIHRlcnJpdG9yaW8gY29tcHJlbmRpZG8gZW50cmUgbGEgbCZpYWN1dGU7bmVhCi0jIGludGVybmFjaW9uYWwgeSBsYSBsJmlhY3V0ZTtuZWEgcGFyYWxlbGEgdWJpY2FkYSBhIHVuYSBkaXN0YW5jaWEgZGUgdmVpbnRlCi0jIGtpbCZvYWN1dGU7bWV0cm9zLCBhcyZpYWN1dGU7IGNvbW8gbGEgQ2l1ZGFkIGRlIEVuc2VuYWRhLCBCYWphIENhbGlmb3JuaWEsIGhhY2lhIGVsCi0jIGludGVyaW9yIGRlbCBwYSZpYWN1dGU7cywgbGEgYXBsaWNhY2kmb2FjdXRlO24gZGUgZXN0ZSBob3JhcmlvIGVzdGFjaW9uYWwgc3VydGlyJmFhY3V0ZTsKLSMgZWZlY3RvIGRlc2RlIGxhcyBkb3MgaG9yYXMgZGVsIHNlZ3VuZG8gZG9taW5nbyBkZSBtYXJ6byB5IGNvbmNsdWlyJmFhY3V0ZTsgYQorIyBmcm9udGVyaXphIG5vcnRlIGVuIGVsIHRlcnJpdG9yaW8gY29tcHJlbmRpZG8gZW50cmUgbGEgbMOtbmVhCisjIGludGVybmFjaW9uYWwgeSBsYSBsw61uZWEgcGFyYWxlbGEgdWJpY2FkYSBhIHVuYSBkaXN0YW5jaWEgZGUgdmVpbnRlCisjIGtpbMOzbWV0cm9zLCBhc8OtIGNvbW8gbGEgQ2l1ZGFkIGRlIEVuc2VuYWRhLCBCYWphIENhbGlmb3JuaWEsIGhhY2lhIGVsCisjIGludGVyaW9yIGRlbCBwYcOtcywgbGEgYXBsaWNhY2nDs24gZGUgZXN0ZSBob3JhcmlvIGVzdGFjaW9uYWwgc3VydGlyw6EKKyMgZWZlY3RvIGRlc2RlIGxhcyBkb3MgaG9yYXMgZGVsIHNlZ3VuZG8gZG9taW5nbyBkZSBtYXJ6byB5IGNvbmNsdWlyw6EgYQogIyBsYXMgZG9zIGhvcmFzIGRlbCBwcmltZXIgZG9taW5nbyBkZSBub3ZpZW1icmUuCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCkBAIC0yMzg5LDM5ICsyMzMyLDM5IEBACiBSdWxlCU1leGljbwkyMDAyCW1heAktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKIFJ1bGUJTWV4aWNvCTIwMDIJbWF4CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgUXVpbnRhbmEgUm9vCisjIFF1aW50YW5hIFJvbzsgcmVwcmVzZW50ZWQgYnkgQ2FuY8O6bgogWm9uZSBBbWVyaWNhL0NhbmN1bgktNTo0NzowNCAtCUxNVAkxOTIyIEphbiAgMSAgMDoxMjo1NgogCQkJLTY6MDAJLQlDU1QJMTk4MSBEZWMgMjMKIAkJCS01OjAwCU1leGljbwlFJXNUCTE5OTggQXVnICAyICAyOjAwCiAJCQktNjowMAlNZXhpY28JQyVzVAotIyBDYW1wZWNoZSwgWXVjYXRhbgorIyBDYW1wZWNoZSwgWXVjYXTDoW47IHJlcHJlc2VudGVkIGJ5IE3DqXJpZGEKIFpvbmUgQW1lcmljYS9NZXJpZGEJLTU6NTg6MjggLQlMTVQJMTkyMiBKYW4gIDEgIDA6MDE6MzIKIAkJCS02OjAwCS0JQ1NUCTE5ODEgRGVjIDIzCiAJCQktNTowMAktCUVTVAkxOTgyIERlYyAgMgogCQkJLTY6MDAJTWV4aWNvCUMlc1QKLSMgQ29haHVpbGEsIER1cmFuZ28sIE51ZXZvIExlb24sIFRhbWF1bGlwYXMgKG5lYXIgVVMgYm9yZGVyKQorIyBDb2FodWlsYSwgRHVyYW5nbywgTnVldm8gTGXDs24sIFRhbWF1bGlwYXMgKG5lYXIgVVMgYm9yZGVyKQogWm9uZSBBbWVyaWNhL01hdGFtb3JvcwktNjo0MDowMCAtCUxNVAkxOTIxIERlYyAzMSAyMzoyMDowMAogCQkJLTY6MDAJLQlDU1QJMTk4OAogCQkJLTY6MDAJVVMJQyVzVAkxOTg5CiAJCQktNjowMAlNZXhpY28JQyVzVAkyMDEwCiAJCQktNjowMAlVUwlDJXNUCi0jIENvYWh1aWxhLCBEdXJhbmdvLCBOdWV2byBMZW9uLCBUYW1hdWxpcGFzIChhd2F5IGZyb20gVVMgYm9yZGVyKQorIyBDb2FodWlsYSwgRHVyYW5nbywgTnVldm8gTGXDs24sIFRhbWF1bGlwYXMgKGF3YXkgZnJvbSBVUyBib3JkZXIpCiBab25lIEFtZXJpY2EvTW9udGVycmV5CS02OjQxOjE2IC0JTE1UCTE5MjEgRGVjIDMxIDIzOjE4OjQ0CiAJCQktNjowMAktCUNTVAkxOTg4CiAJCQktNjowMAlVUwlDJXNUCTE5ODkKIAkJCS02OjAwCU1leGljbwlDJXNUCiAjIENlbnRyYWwgTWV4aWNvCi1ab25lIEFtZXJpY2EvTWV4aWNvX0NpdHkgLTY6MzY6MzYgLQlMTVQJMTkyMiBKYW4gIDEgMDoyMzoyNAorWm9uZSBBbWVyaWNhL01leGljb19DaXR5IC02OjM2OjM2IC0JTE1UCTE5MjIgSmFuICAxICAwOjIzOjI0CiAJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAogCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKIAkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCiAJCQktNjowMAktCUNTVAkxOTMxIE9jdAogCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCU1leGljbwlDJXNUCTIwMDEgU2VwIDMwIDAyOjAwCisJCQktNjowMAlNZXhpY28JQyVzVAkyMDAxIFNlcCAzMCAgMjowMAogCQkJLTY6MDAJLQlDU1QJMjAwMiBGZWIgMjAKIAkJCS02OjAwCU1leGljbwlDJXNUCiAjIENoaWh1YWh1YSAobmVhciBVUyBib3JkZXIpCi1ab25lIEFtZXJpY2EvT2ppbmFnYQktNjo1Nzo0MCAtCUxNVAkxOTIyIEphbiAxIDA6MDI6MjAKK1pvbmUgQW1lcmljYS9PamluYWdhCS02OjU3OjQwIC0JTE1UCTE5MjIgSmFuICAxICAwOjAyOjIwCiAJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAogCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKIAkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCkBAIC0yNDI5LDcgKzIzNzIsNyBAQAogCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKIAkJCS02OjAwCS0JQ1NUCTE5OTYKIAkJCS02OjAwCU1leGljbwlDJXNUCTE5OTgKLQkJCS02OjAwCS0JQ1NUCTE5OTggQXByIFN1bj49MSAzOjAwCisJCQktNjowMAktCUNTVAkxOTk4IEFwciBTdW4+PTEgIDM6MDAKIAkJCS03OjAwCU1leGljbwlNJXNUCTIwMTAKIAkJCS03OjAwCVVTCU0lc1QKICMgQ2hpaHVhaHVhIChhd2F5IGZyb20gVVMgYm9yZGVyKQpAQCAtMjQ0MSw3ICsyMzg0LDcgQEAKIAkJCS03OjAwCS0JTVNUCTE5MzIgQXByICAxCiAJCQktNjowMAktCUNTVAkxOTk2CiAJCQktNjowMAlNZXhpY28JQyVzVAkxOTk4Ci0JCQktNjowMAktCUNTVAkxOTk4IEFwciBTdW4+PTEgMzowMAorCQkJLTY6MDAJLQlDU1QJMTk5OCBBcHIgU3VuPj0xICAzOjAwCiAJCQktNzowMAlNZXhpY28JTSVzVAogIyBTb25vcmEKIFpvbmUgQW1lcmljYS9IZXJtb3NpbGxvCS03OjIzOjUyIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjM2OjA4CkBAIC0yNDU3LDQyICsyNDAwLDMzIEBACiAJCQktNzowMAktCU1TVAogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTA0LTIxKToKLSMgQWNjb3JkaW5nIHRvIG5ld3MsIEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyAoTWV4aWNhbiBzdGF0ZSBvZiBOYXlhcml0KQorIyBBY2NvcmRpbmcgdG8gbmV3cywgQmFow61hIGRlIEJhbmRlcmFzIChNZXhpY2FuIHN0YXRlIG9mIE5heWFyaXQpCiAjIGNoYW5nZWQgdGltZSB6b25lIFVUQy03IHRvIG5ldyB0aW1lIHpvbmUgVVRDLTYgb24gQXByaWwgNCwgMjAxMCAodG8KICMgc2hhcmUgdGhlIHNhbWUgdGltZSB6b25lIGFzIG5lYXJieSBjaXR5IFB1ZXJ0byBWYWxsYXJ0YSwgSmFsaXNjbykuCiAjCiAjIChTcGFuaXNoKQotIyBCYWgmaWFjdXRlO2EgZGUgQmFuZGVyYXMgaG9tb2xvZ2Egc3UgaG9yYXJpbyBhbCBkZWwgY2VudHJvIGRlbAotIyBwYSZpYWN1dGU7cywgYSBwYXJ0aXIgZGUgZXN0ZSBkb21pbmdvCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubmF5YXJpdC5nb2IubXgvbm90ZXMuYXNwP2lkPTIwNzQ4Ij4KKyMgQmFow61hIGRlIEJhbmRlcmFzIGhvbW9sb2dhIHN1IGhvcmFyaW8gYWwgZGVsIGNlbnRybyBkZWwKKyMgcGHDrXMsIGEgcGFydGlyIGRlIGVzdGUgZG9taW5nbwogIyBodHRwOi8vd3d3Lm5heWFyaXQuZ29iLm14L25vdGVzLmFzcD9pZD0yMDc0OAotIyA8L2E+CiAjCi0jIEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyBob21vbG9nYSBzdSBob3JhcmlvIGNvbiBlbCBkZWwgQ2VudHJvIGRlbAotIyBQYSZpYWN1dGU7cwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJhaGlhZGViYW5kZXJhcy5nb2IubXgvcHJpbmNpcGFsL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTI2MTpiYWhpYS1kZS1iYW5kZXJhcy1ob21vbG9nYS1zdS1ob3JhcmlvLWNvbi1lbC1kZWwtY2VudHJvLWRlbC1wYWlzJmNhdGlkPTQyOmNvbXVuaWNhY2lvbi1zb2NpYWwmSXRlbWlkPTUwIj4KLSMgaHR0cDovL3d3dy5iYWhpYWRlYmFuZGVyYXMuZ29iLm14L3ByaW5jaXBhbC9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD0yNjE6YmFoaWEtZGUtYmFuZGVyYXMtaG9tb2xvZ2Etc3UtaG9yYXJpby1jb24tZWwtZGVsLWNlbnRyby1kZWwtcGFpcyZjYXRpZD00Mjpjb211bmljYWNpb24tc29jaWFsJkl0ZW1pZD01MCIKLSMgPC9hPgorIyBCYWjDrWEgZGUgQmFuZGVyYXMgaG9tb2xvZ2Egc3UgaG9yYXJpbyBjb24gZWwgZGVsIENlbnRybyBkZWwKKyMgUGHDrXMKKyMgaHR0cDovL3d3dy5iYWhpYWRlYmFuZGVyYXMuZ29iLm14L3ByaW5jaXBhbC9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD0yNjE6YmFoaWEtZGUtYmFuZGVyYXMtaG9tb2xvZ2Etc3UtaG9yYXJpby1jb24tZWwtZGVsLWNlbnRyby1kZWwtcGFpcyZjYXRpZD00Mjpjb211bmljYWNpb24tc29jaWFsJkl0ZW1pZD01MAogIwogIyAoRW5nbGlzaCkKLSMgUHVlcnRvIFZhbGxhcnRhIGFuZCBCYWgmaWFjdXRlO2EgZGUgQmFuZGVyYXM6IE9uZSBUaW1lIFpvbmUKLSMgPGEgaHJlZj0iaHR0cDovL3ZpcnR1YWx2YWxsYXJ0YS5jb20vcHVlcnRvdmFsbGFydGEvcHVlcnRvdmFsbGFydGEvbG9jYWxuZXdzLzIwMDktMTItMDMtUHVlcnRvLVZhbGxhcnRhLWFuZC1CYWhpYS1kZS1CYW5kZXJhcy1PbmUtVGltZS1ab25lLnNodG1sIj4KKyMgUHVlcnRvIFZhbGxhcnRhIGFuZCBCYWjDrWEgZGUgQmFuZGVyYXM6IE9uZSBUaW1lIFpvbmUKICMgaHR0cDovL3ZpcnR1YWx2YWxsYXJ0YS5jb20vcHVlcnRvdmFsbGFydGEvcHVlcnRvdmFsbGFydGEvbG9jYWxuZXdzLzIwMDktMTItMDMtUHVlcnRvLVZhbGxhcnRhLWFuZC1CYWhpYS1kZS1CYW5kZXJhcy1PbmUtVGltZS1ab25lLnNodG1sCi0jIDwvYT4KLSMKLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tZXhpY28wOC5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tZXhpY28wOC5odG1sCi0jIDwvYT4KICMKICMgIk1leGljbydzIFNlbmF0ZSBhcHByb3ZlZCB0aGUgYW1lbmRtZW50cyB0byB0aGUgTWV4aWNhbiBTY2hlZHVsZSBTeXN0ZW0gdGhhdAotIyB3aWxsIGFsbG93IEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyBhbmQgUHVlcnRvIFZhbGxhcnRhIHRvIHNoYXJlIHRoZSBzYW1lIHRpbWUKKyMgd2lsbCBhbGxvdyBCYWjDrWEgZGUgQmFuZGVyYXMgYW5kIFB1ZXJ0byBWYWxsYXJ0YSB0byBzaGFyZSB0aGUgc2FtZSB0aW1lCiAjIHpvbmUgLi4uIgogIyBCYWphIENhbGlmb3JuaWEgU3VyLCBOYXlhcml0LCBTaW5hbG9hCiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTAtMDUtMDEpOgogIyBVc2UgIkJhaGlhX0JhbmRlcmFzIiB0byBrZWVwIHRoZSBuYW1lIHRvIGZvdXJ0ZWVuIGNoYXJhY3RlcnMuCiAKKyMgTWF6YXRsw6FuCiBab25lIEFtZXJpY2EvTWF6YXRsYW4JLTc6MDU6NDAgLQlMTVQJMTkyMSBEZWMgMzEgMjM6NTQ6MjAKIAkJCS03OjAwCS0JTVNUCTE5MjcgSnVuIDEwIDIzOjAwCiAJCQktNjowMAktCUNTVAkxOTMwIE5vdiAxNQpAQCAtMjUwNCw2ICsyNDM4LDcgQEAKIAkJCS04OjAwCS0JUFNUCTE5NzAKIAkJCS03OjAwCU1leGljbwlNJXNUCiAKKyMgQmFow61hIGRlIEJhbmRlcmFzCiBab25lIEFtZXJpY2EvQmFoaWFfQmFuZGVyYXMJLTc6MDE6MDAgLQlMTVQJMTkyMSBEZWMgMzEgMjM6NTk6MDAKIAkJCS03OjAwCS0JTVNUCTE5MjcgSnVuIDEwIDIzOjAwCiAJCQktNjowMAktCUNTVAkxOTMwIE5vdiAxNQpAQCAtMjUxMyw3ICsyNDQ4LDcgQEAKIAkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0CiAJCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAogCQkJLTg6MDAJLQlQU1QJMTk3MAotCQkJLTc6MDAJTWV4aWNvCU0lc1QJMjAxMCBBcHIgNCAyOjAwCisJCQktNzowMAlNZXhpY28JTSVzVAkyMDEwIEFwciAgNCAgMjowMAogCQkJLTY6MDAJTWV4aWNvCUMlc1QKIAogIyBCYWphIENhbGlmb3JuaWEgKG5lYXIgVVMgYm9yZGVyKQpAQCAtMjU2MCw3ICsyNDk1LDcgQEAKICMgQW1lcmljYS9UaWp1YW5hIG9ubHkgaW4gdGhhdCBpdCBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk3NgogIyB0aHJvdWdoIDE5OTUuICBUaGlzIHdhcyBhcyBwZXIgU2hhbmtzICgxOTk5KS4gIEJ1dCBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5CiAjIEVuc2VuYWRhIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgZnJvbSAxOTQ4IHRocm91Z2ggMTk3NS4gIEd1eSBIYXJyaXMgcmVwb3J0cwotIyB0aGF0IHRoZSAxOTg3IE9BRyBzYXlzICJPbmx5IEVuc2VuYWRhLCBNZXhpY2FsZSwgU2FuIEZlbGlwZSBhbmQKKyMgdGhhdCB0aGUgMTk4NyBPQUcgc2F5cyAiT25seSBFbnNlbmFkYSwgTWV4aWNhbGksIFNhbiBGZWxpcGUgYW5kCiAjIFRpanVhbmEgb2JzZXJ2ZSBEU1QsIiB3aGljaCBhZ3JlZXMgd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgYnV0IGltcGxpZXMgdGhhdAogIyBEU1Qtb2JzZXJ2YW5jZSB3YXMgYSB0b3duLWJ5LXRvd24gbWF0dGVyIGJhY2sgdGhlbi4gIFRoaXMgY29uY2VybnMKICMgZGF0YSBhZnRlciAxOTcwIHNvIG1vc3QgbGlrZWx5IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgWm9uZQpAQCAtMjU3Myw3ICsyNTA4LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBBbmd1aWxsYQotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCiAKICMgQW50aWd1YSBhbmQgQmFyYnVkYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQpAQCAtMjYwOSw4ICsyNTQ0LDggQEAKIFJ1bGUJQmFyYgkxOTc5CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKIFJ1bGUJQmFyYgkxOTgwCW9ubHkJLQlTZXAJMjUJMjowMAkwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9CYXJiYWRvcwktMzo1ODoyOSAtCUxNVAkxOTI0CQkjIEJyaWRnZXRvd24KLQkJCS0zOjU4OjI5IC0JQk1UCTE5MzIJICAjIEJyaWRnZXRvd24gTWVhbiBUaW1lCitab25lIEFtZXJpY2EvQmFyYmFkb3MJLTM6NTg6MjkgLQlMTVQJMTkyNCAjIEJyaWRnZXRvd24KKwkJCS0zOjU4OjI5IC0JQk1UCTE5MzIgIyBCcmlkZ2V0b3duIE1lYW4gVGltZQogCQkJLTQ6MDAJQmFyYglBJXNUCiAKICMgQmVsaXplCkBAIC0yNjQwLDIwICsyNTc1LDIwIEBACiAjIGh0dHA6Ly93d3cudGhlcm95YWxnYXpldHRlLmNvbS9hcHBzL3BiY3MuZGxsL2FydGljbGU/QUlEPS8yMDA2MDUyOS9ORVdTLzEwNTI5MDEzNQogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF0bGFudGljL0Jlcm11ZGEJLTQ6MTk6MTggLQlMTVQJMTkzMCBKYW4gIDEgMjowMCAgICAjIEhhbWlsdG9uCi0JCQktNDowMAktCUFTVAkxOTc0IEFwciAyOCAyOjAwCitab25lIEF0bGFudGljL0Jlcm11ZGEJLTQ6MTk6MTggLQlMTVQJMTkzMCBKYW4gIDEgIDI6MDAgIyBIYW1pbHRvbgorCQkJLTQ6MDAJLQlBU1QJMTk3NCBBcHIgMjggIDI6MDAKIAkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NzYKIAkJCS00OjAwCVVTCUElc1QKIAogIyBDYXltYW4gSXMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9DYXltYW4JLTU6MjU6MzIgLQlMTVQJMTg5MAkJIyBHZW9yZ2V0b3duCi0JCQktNTowNzoxMSAtCUtNVAkxOTEyIEZlYiAgICAjIEtpbmdzdG9uIE1lYW4gVGltZQorWm9uZQlBbWVyaWNhL0NheW1hbgktNToyNTozMiAtCUxNVAkxODkwICAgICAjIEdlb3JnZXRvd24KKwkJCS01OjA3OjExIC0JS01UCTE5MTIgRmViICMgS2luZ3N0b24gTWVhbiBUaW1lCiAJCQktNTowMAktCUVTVAogCiAjIENvc3RhIFJpY2EKIAotIyBNaWxuZSBnaXZlcyAtNTozNjoxMy4zIGFzIFNhbiBKb3NlIG1lYW4gdGltZTsgcm91bmQgdG8gbmVhcmVzdC4KKyMgTWlsbmUgZ2l2ZXMgLTU6MzY6MTMuMyBhcyBTYW4gSm9zw6kgbWVhbiB0aW1lOyByb3VuZCB0byBuZWFyZXN0LgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlDUgkxOTc5CTE5ODAJLQlGZWIJbGFzdFN1bgkwOjAwCTE6MDAJRApAQCAtMjY2MywxMCArMjU5OCwxMCBAQAogIyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KIFJ1bGUJQ1IJMTk5MQlvbmx5CS0JSnVsCSAxCTA6MDAJMAlTCiBSdWxlCUNSCTE5OTIJb25seQktCU1hcgkxNQkwOjAwCTAJUwotIyBUaGVyZSBhcmUgdG9vIG1hbnkgU2FuIEpvc2VzIGVsc2V3aGVyZSwgc28gd2UnbGwgdXNlICdDb3N0YSBSaWNhJy4KKyMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBKb3PDqXMgZWxzZXdoZXJlLCBzbyB3ZSdsbCB1c2UgJ0Nvc3RhIFJpY2EnLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0Nvc3RhX1JpY2EJLTU6MzY6MTMgLQlMTVQJMTg5MAkJIyBTYW4gSm9zZQotCQkJLTU6MzY6MTMgLQlTSk1UCTE5MjEgSmFuIDE1ICMgU2FuIEpvc2UgTWVhbiBUaW1lCitab25lIEFtZXJpY2EvQ29zdGFfUmljYQktNTozNjoxMyAtCUxNVAkxODkwICAgICAgICAjIFNhbiBKb3PDqQorCQkJLTU6MzY6MTMgLQlTSk1UCTE5MjEgSmFuIDE1ICMgU2FuIEpvc8OpIE1lYW4gVGltZQogCQkJLTY6MDAJQ1IJQyVzVAogIyBDb2NvCiAjIG5vIGluZm9ybWF0aW9uOyBwcm9iYWJseSBsaWtlIEFtZXJpY2EvQ29zdGFfUmljYQpAQCAtMjY4NSw4ICsyNjIwLDggQEAKICMgRHVyaW5nIHRoZSBnYW1lLCBwbGF5LWJ5LXBsYXkgYW5ub3VuY2VyIEppbSBIdW50ZXIgbm90ZWQgdGhhdAogIyAiV2UnbGwgYmUgbG9zaW5nIHR3byBob3VycyBvZiBzbGVlcC4uLkN1YmEgc3dpdGNoZWQgdG8gRGF5bGlnaHQgU2F2aW5nCiAjIFRpbWUgdG9kYXkuIiAgKFRoZSAidHdvIGhvdXIiIHJlbWFyayByZWZlcnJlZCB0byBsb3Npbmcgb25lIGhvdXIgb2YKLSMgc2xlZXAgb24gMTk5OS0wMy0yOC0td2hlbiB0aGUgYW5ub3VuY2VycyB3ZXJlIGluIEN1YmEgYXMgaXQgc3dpdGNoZWQKLSMgdG8gRFNULS1hbmQgb25lIG1vcmUgaG91ciBvbiAxOTk5LTA0LTA0LS13aGVuIHRoZSBhbm5vdW5jZXJzIHdpbGwgaGF2ZQorIyBzbGVlcCBvbiAxOTk5LTAzLTI4IC0gd2hlbiB0aGUgYW5ub3VuY2VycyB3ZXJlIGluIEN1YmEgYXMgaXQgc3dpdGNoZWQKKyMgdG8gRFNUIC0gYW5kIG9uZSBtb3JlIGhvdXIgb24gMTk5OS0wNC0wNCAtIHdoZW4gdGhlIGFubm91bmNlcnMgd2lsbCBoYXZlCiAjIHJldHVybmVkIHRvIEJhbHRpbW9yZSwgd2hpY2ggc3dpdGNoZXMgb24gdGhhdCBkYXRlLikKIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMy0xMS0xMSk6CkBAIC0yNzA4LDE2ICsyNjQzLDE2IEBACiAjIGFkanVzdG1lbnQgaW4gQ3ViYS4gIFdlIHdpbGwgc3RheSBpbiBkYXlsaWdodCBzYXZpbmcgdGltZToKICMgaHR0cDovL3d3dy5ncmFubWEuY3UvZXNwYW5vbC8yMDA1L25vdmllbWJyZS9taWVyOS9ob3JhcmlvLmh0bWwKIAotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0xMC0yMSk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNi0xMC0yMSk6CiAjIEFuIGFydGljbGUgaW4gR1JBTk1BIElOVEVSTkFDSU9OQUwgY2xhaW1zIHRoYXQgQ3ViYSB3aWxsIGVuZAogIyB0aGUgMyB5ZWFycyBvZiBwZXJtYW5lbnQgRFNUIG5leHQgd2Vla2VuZCwgc2VlCiAjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1L2luZ2xlcy8yMDA2L29jdHVicmUvbHVuMTYvNDNob3JhcmlvLmh0bWwKICMgIk9uIFNhdHVyZGF5IG5pZ2h0LCBPY3RvYmVyIDI4IGdvaW5nIGludG8gU3VuZGF5LCBPY3RvYmVyIDI5LCBhdCAwMTowMCwKLSMgd2F0Y2hlcyBzaG91bGQgYmUgc2V0IGJhY2sgb25lIGhvdXIgLS0gZ29pbmcgYmFjayB0byAwMDowMCBob3VycyAtLSByZXR1cm5pbmcKKyMgd2F0Y2hlcyBzaG91bGQgYmUgc2V0IGJhY2sgb25lIGhvdXIgLSBnb2luZyBiYWNrIHRvIDAwOjAwIGhvdXJzIC0gcmV0dXJuaW5nCiAjIHRvIHRoZSBub3JtYWwgc2NoZWR1bGUuLi4uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0wMik6Ci0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvZW5nbGlzaC9uZXdzL2FydDg5Lmh0bWwsIGRhdGVkIHllc3RlcmRheSwKKyMgPGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvZW5nbGlzaC9uZXdzL2FydDg5Lmh0bWw+LCBkYXRlZCB5ZXN0ZXJkYXksCiAjIHNheXMgQ3ViYW4gY2xvY2tzIHdpbGwgYWR2YW5jZSBhdCBtaWRuaWdodCBvbiBNYXJjaCAxMC4KICMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm9ybWF0aW9uLCBhc3N1bWUgQ3ViYSB3aWxsIHVzZSBVUyBydWxlcywKICMgZXhjZXB0IHRoYXQgaXQgc3dpdGNoZXMgYXQgbWlkbmlnaHQgc3RhbmRhcmQgdGltZSBhcyB1c3VhbC4KQEAgLTI3MzEsMTAgKzI2NjYsMTAgQEAKICMgaHR0cDovL3d3dy5wcmVuc2FsYXRpbmEuY29tLm14L2FydGljbGUuYXNwP0lEPSU3QjRDQzMyQzFCLUE5RjctNDJGQi04QTA3LTg2MzFBRkM5MjNBRiU3RCZsYW5ndWFnZT1FUwogIyBodHRwOi8vYWN0dWFsaWRhZC50ZXJyYS5lcy9zb2NpZWRhZC9hcnRpY3Vsby9jdWJhX2xsYW1hX2Fob3JyYXJfZW5lcmdpYV9jYW1iaW9fMTk1NzA0NC5odG0KICMKLSMgRnJvbSBBbGV4IEtyeXZlbmlzaGV2ICgyMDA3LTEwLTI1KToKKyMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA3LTEwLTI1KToKICMgSGVyZSBpcyBhbHNvIGFydGljbGUgZnJvbSBHcmFubWEgKEN1YmEpOgogIwotIyBbUmVnaXJhXSBlbCBIb3JhcmlvIE5vcm1hbCBkZXNkZSBlbCBbcHJveGltb10gZG9taW5nbyAyOCBkZSBvY3R1YnJlCisjIFJlZ2lyw6EgZWwgSG9yYXJpbyBOb3JtYWwgZGVzZGUgZWwgcHLDs3hpbW8gZG9taW5nbyAyOCBkZSBvY3R1YnJlCiAjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwNy8xMC8yNC9uYWNpb25hbC9hcnRpYzA3Lmh0bWwKICMKICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19jdWJhMDMuaHRtbApAQCAtMjc0MiwyMyArMjY3NywxOCBAQAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0wOSk6CiAjIEknbSBpbiBNYXJ5bGFuZCB3aGljaCBpcyBub3cgb2JzZXJ2aW5nIFVuaXRlZCBTdGF0ZXMgRWFzdGVybiBEYXlsaWdodAogIyBUaW1lLiBBdCA5OjQ0IGxvY2FsIHRpbWUgSSB1c2VkIFJlYWxQbGF5ZXIgdG8gbGlzdGVuIHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly9tZWRpYS5lbmV0LmN1L3JhZGlvcmVsb2oiPgogIyBodHRwOi8vbWVkaWEuZW5ldC5jdS9yYWRpb3JlbG9qCi0jIDwvYT4sIGEgQ3ViYW4gaW5mb3JtYXRpb24gc3RhdGlvbiwgYW5kIGhlYXJkCisjIGEgQ3ViYW4gaW5mb3JtYXRpb24gc3RhdGlvbiwgYW5kIGhlYXJkCiAjIHRoZSB0aW1lIGFubm91bmNlZCBhcyAib2NobyBjdWFyZW50YSB5IGN1YXRybyIgKCJlaWdodCBmb3J0eS1mb3VyIiksCiAjIGluZGljYXRpbmcgdGhhdCBDdWJhIGlzIHN0aWxsIG9uIHN0YW5kYXJkIHRpbWUuCiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDMtMTIpOgogIyBJdCBzZWVtcyB0aGF0IEN1YmEgd2lsbCBzdGFydCBEU1Qgb24gU3VuZGF5LCAyMDA3LTAzLTE2Li4uCiAjIEl0IHdhcyBhbm5vdW5jZWQgeWVzdGVyZGF5LCBhY2NvcmRpbmcgdG8gdGhpcyBzb3VyY2UgKGluIFNwYW5pc2gpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5uYy5jdWJhd2ViLmN1L21hcnpvLTIwMDgvY2llbi0xLTExLTMtMDguaHRtIj4KICMgaHR0cDovL3d3dy5ubmMuY3ViYXdlYi5jdS9tYXJ6by0yMDA4L2NpZW4tMS0xMS0zLTA4Lmh0bQotIyA8L2E+CiAjCiAjIFNvbWUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGlzIHBvc3RlZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwKLSMgPC9hPgogIwogIyBUaGUgYXJ0aWNsZSBhbHNvIHNheXMgdGhhdCBDdWJhIGhhcyBiZWVuIG9ic2VydmluZyBEU1Qgc2luY2UgMTk2MywKICMgd2hpbGUgU2hhbmtzIChhbmQgdHpkYXRhKSBoYXMgMTk2NSBhcyB0aGUgZmlyc3QgZGF0ZSAoZXhjZXB0IGluIHRoZQpAQCAtMjc2OCwxOCArMjY5OCwxNCBAQAogIyBjaGFuZ2Ugc29tZSBoaXN0b3JpYyByZWNvcmRzIGFzIHdlbGwuCiAjCiAjIE9uZSBleGFtcGxlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJhZGlvaGMuY3UvZXNwYW5vbC9ub3RpY2lhcy9tYXIwNy8xMW1hci9ob3IuaHRtIj4KICMgaHR0cDovL3d3dy5yYWRpb2hjLmN1L2VzcGFub2wvbm90aWNpYXMvbWFyMDcvMTFtYXIvaG9yLmh0bQotIyA8L2E+CiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDMtMTMpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDgtMDMtMTMpOgogIyBUaGUgQ3ViYW4gdGltZSBjaGFuZ2UgaGFzIGp1c3QgYmVlbiBjb25maXJtZWQgb24gdGhlIG1vc3QgYXV0aG9yaXRhdGl2ZQogIyB3ZWIgc2l0ZSwgdGhlIEdyYW5tYS4gIFBsZWFzZSBjaGVjayBvdXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS8yMDA4LzAzLzEzL25hY2lvbmFsL2FydGljMTAuaHRtbCI+CiAjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwOC8wMy8xMy9uYWNpb25hbC9hcnRpYzEwLmh0bWwKLSMgPC9hPgogIwotIyBCYXNpY2FsbHkgYXMgZXhwZWN0ZWQgYWZ0ZXIgU3RlZmZlbiBUaG9yc2VucyBpbmZvcm1hdGlvbiwgdGhlIGNoYW5nZQorIyBCYXNpY2FsbHkgYXMgZXhwZWN0ZWQgYWZ0ZXIgU3RlZmZlbiBUaG9yc2VuJ3MgaW5mb3JtYXRpb24sIHRoZSBjaGFuZ2UKICMgd2lsbCB0YWtlIHBsYWNlIG1pZG5pZ2h0IGJldHdlZW4gU2F0dXJkYXkgYW5kIFN1bmRheS4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0xMik6CkBAIC0yNzkwLDE4ICsyNzE2LDE0IEBACiAjIG1pZG5pZ2h0IGJldHdlZW4gU2F0dXJkYXksIE1hcmNoIDA3LCAyMDA5IGFuZCBTdW5kYXksIE1hcmNoIDA4LCAyMDA5LQogIyBub3Qgb24gbWlkbmlnaHQgTWFyY2ggMTQgLyBNYXJjaCAxNSBhcyBwcmV2aW91c2x5IHRob3VnaHQuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfY3ViYTA1Lmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2N1YmEwNS5odG1sCiAjIChpbiBTcGFuaXNoKQotIyA8L2E+CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDMtMDkpCiAjIEkgbGlzdGVuZWQgb3ZlciB0aGUgSW50ZXJuZXQgdG8KLSMgPGEgaHJlZj0iaHR0cDovL21lZGlhLmVuZXQuY3UvcmVhZGlvcmVsb2oiPgogIyBodHRwOi8vbWVkaWEuZW5ldC5jdS9yZWFkaW9yZWxvagotIyA8L2E+CiAjIHRoaXMgbW9ybmluZzsgd2hlbiBpdCB3YXMgMTA6MDUgYS4gbS4gaGVyZSBpbiBCZXRoZXNkYSwgTWFyeWxhbmQgdGhlCi0jIHRoZSB0aW1lIHdhcyBhbm5vdW5jZWQgYXMgImRpZXogY2luY28iLS10aGUgc2FtZSB0aW1lIGFzIGhlcmUsIGluZGljYXRpbmcKKyMgdGhlIHRpbWUgd2FzIGFubm91bmNlZCBhcyAiZGlleiBjaW5jbyIgLSB0aGUgc2FtZSB0aW1lIGFzIGhlcmUsIGluZGljYXRpbmcKICMgdGhhdCBoYXMgaW5kZWVkIHN3aXRjaGVkIHRvIERTVC4gQXNzdW1lIHNlY29uZCBTdW5kYXkgZnJvbSAyMDA5IGZvcndhcmQuCiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTEtMDMtMDgpOgpAQCAtMjgxMCw0MiArMjczMiwzMCBAQAogIyBjaGFuZ2VkIGF0IGFsbCkuCiAjCiAjIFNvdXJjZToKLSMgPGEgaHJlZj0iaHR0cDovL2dyYW5tYS5jby5jdS8yMDExLzAzLzA4L25hY2lvbmFsL2FydGljMDEuaHRtbCI+CiAjIGh0dHA6Ly9ncmFubWEuY28uY3UvMjAxMS8wMy8wOC9uYWNpb25hbC9hcnRpYzAxLmh0bWwKLSMgPC9hPgogIwogIyBPdXIgaW5mbzoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2N1YmEtc3RhcnRzLWRzdC0yMDExLmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LTIwMTEuaHRtbAotIyA8L2E+CiAjCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDExLTEwLTMwKQogIyBDdWJhIHdpbGwgZW5kIERTVCB0d28gd2Vla3MgbGF0ZXIgdGhpcyB5ZWFyLiBJbnN0ZWFkIG9mIGdvaW5nIGJhY2sKICMgdG9uaWdodCwgaXQgaGFzIGJlZW4gZGVsYXllZCB0byAyMDExLTExLTEzIGF0IDAxOjAwLgogIwogIyBPbmUgc291cmNlIChTcGFuaXNoKQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJhZGlvYW5ndWxvLmN1L25vdGljaWFzL2N1YmEvMTcxMDUtY3ViYS1yZXN0YWJsZWNlcmEtZWwtaG9yYXJpby1kZWwtbWVyaWRpYW5vLWRlLWdyZWVud2ljaC5odG1sIj4KICMgaHR0cDovL3d3dy5yYWRpb2FuZ3Vsby5jdS9ub3RpY2lhcy9jdWJhLzE3MTA1LWN1YmEtcmVzdGFibGVjZXJhLWVsLWhvcmFyaW8tZGVsLW1lcmlkaWFuby1kZS1ncmVlbndpY2guaHRtbAotIyA8L2E+CiAjCiAjIE91ciBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS10aW1lLWNoYW5nZXMtMjAxMS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2N1YmEtdGltZS1jaGFuZ2VzLTIwMTEuaHRtbAotIyA8L2E+CiAjCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEyLTAzLTAxKQogIyBBY2NvcmRpbmcgdG8gUmFkaW8gUmVsb2osIEN1YmEgd2lsbCBzdGFydCBEU1Qgb24gTWlkbmlnaHQgYmV0d2VlbiBNYXJjaAogIyAzMSBhbmQgQXByaWwgMS4KICMKICMgUmFkaW8gUmVsb2ogaGFzIHRoZSBmb2xsb3dpbmcgaW5mbyAoU3BhbmlzaCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFkaW9yZWxvai5jdS9pbmRleC5waHAvbm90aWNpYXMtcmFkaW8tcmVsb2ovNzEtbWlzY2VsYW5lYXMvNzUyOS1jdWJhLWFwbGljYXJhLWVsLWhvcmFyaW8tZGUtdmVyYW5vLWRlc2RlLWVsLTEtZGUtYWJyaWwiPgogIyBodHRwOi8vd3d3LnJhZGlvcmVsb2ouY3UvaW5kZXgucGhwL25vdGljaWFzLXJhZGlvLXJlbG9qLzcxLW1pc2NlbGFuZWFzLzc1MjktY3ViYS1hcGxpY2FyYS1lbC1ob3JhcmlvLWRlLXZlcmFuby1kZXNkZS1lbC0xLWRlLWFicmlsCi0jIDwvYT4KICMKICMgT3VyIGluZm8gb24gaXQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9jdWJhLXN0YXJ0cy1kc3QtMjAxMi5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2N1YmEtc3RhcnRzLWRzdC0yMDEyLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEyLTExLTAzKToKICMgUmFkaW8gUmVsb2ogYW5kIG1hbnkgb3RoZXIgc291cmNlcyByZXBvcnQgdGhhdCBDdWJhIGlzIGNoYW5naW5nIGJhY2sKQEAgLTI5MDEsNyArMjgxMSw3IEBACiAJCQktNTowMAlDdWJhCUMlc1QKIAogIyBEb21pbmljYQotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCiAKICMgRG9taW5pY2FuIFJlcHVibGljCiAKQEAgLTI5MzQsOCArMjg0NCw4IEBACiBab25lIEFtZXJpY2EvU2FudG9fRG9taW5nbyAtNDozOTozNiAtCUxNVAkxODkwCiAJCQktNDo0MAktCVNETVQJMTkzMyBBcHIgIDEgMTI6MDAgIyBTLiBEb20uIE1UCiAJCQktNTowMAlEUglFJXNUCTE5NzQgT2N0IDI3Ci0JCQktNDowMAktCUFTVAkyMDAwIE9jdCAyOSAwMjowMAotCQkJLTU6MDAJVVMJRSVzVAkyMDAwIERlYyAgMyAwMTowMAorCQkJLTQ6MDAJLQlBU1QJMjAwMCBPY3QgMjkgIDI6MDAKKwkJCS01OjAwCVVTCUUlc1QJMjAwMCBEZWMgIDMgIDE6MDAKIAkJCS00OjAwCS0JQVNUCiAKICMgRWwgU2FsdmFkb3IKQEAgLTI5NDYsMjAgKzI4NTYsMjAgQEAKICMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBTYWx2YWRvcnMgZWxzZXdoZXJlLCBzbyB1c2UgQW1lcmljYS9FbF9TYWx2YWRvcgogIyBpbnN0ZWFkIG9mIEFtZXJpY2EvU2FuX1NhbHZhZG9yLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0VsX1NhbHZhZG9yIC01OjU2OjQ4IC0JTE1UCTE5MjEJCSMgU2FuIFNhbHZhZG9yCitab25lIEFtZXJpY2EvRWxfU2FsdmFkb3IgLTU6NTY6NDggLQlMTVQJMTkyMSAjIFNhbiBTYWx2YWRvcgogCQkJLTY6MDAJU2FsdglDJXNUCiAKICMgR3JlbmFkYQogIyBHdWFkZWxvdXBlCi0jIFN0IEJhcnRoZWxlbXkKKyMgU3QgQmFydGjDqWxlbXkKICMgU3QgTWFydGluIChGcmVuY2ggcGFydCkKLSMgU2VlICdzb3V0aGFtZXJpY2EnLgorIyBTZWUgQW1lcmljYS9Qb3J0X29mX1NwYWluLgogCiAjIEd1YXRlbWFsYQogIwogIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA2LTA0LTIyKSwgYWZ0ZXIgYSBoZWFkcy11cCBmcm9tIE9zY2FyIHZhbiBWbGlqbWVuOgogIyBEaWFyaW8gQ28gTGF0aW5vLCBhdAotIyBodHRwOi8vd3d3LmRpYXJpb2NvbGF0aW5vLmNvbS9pbnRlcm5hY2lvbmFsZXMvZGV0YWxsZXMuYXNwP05ld3NJRD04MDc5LAorIyA8aHR0cDovL3d3dy5kaWFyaW9jb2xhdGluby5jb20vaW50ZXJuYWNpb25hbGVzL2RldGFsbGVzLmFzcD9OZXdzSUQ9ODA3OT4sCiAjIHNheXMgaW4gYW4gYXJ0aWNsZSBkYXRlZCAyMDA2LTA0LTE5IHRoYXQgdGhlIEd1YXRlbWFsYW4gZ292ZXJubWVudCBoYWQKICMgZGVjaWRlZCBvbiB0aGF0IGRhdGUgdG8gYWR2YW5jZSBvZmZpY2lhbCB0aW1lIGJ5IDYwIG1pbnV0ZXMsIHRvIGxlc3NlbiB0aGUKICMgaW1wYWN0IG9mIHRoZSBlbGV2YXRlZCBjb3N0IG9mIG9pbC4uLi4gIERheWxpZ2h0IHNhdmluZyB0aW1lIHdpbGwgbGFzdCBmcm9tCkBAIC0yOTY3LDcgKzI4NzcsNyBAQAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA2LTIyKToKICMgVGhlIE1pbmlzdHJ5IG9mIEVuZXJneSBhbmQgTWluZXMsIHByZXNzIHJlbGVhc2UgQ1AtMTUvMjAwNgogIyAoMjAwNi0wNC0xOSksIHNheXMgRFNUIGVuZHMgYXQgMjQ6MDAuICBTZWUKLSMgPGh0dHA6Ly93d3cuc2llY2Eub3JnLmd0L1NpdGlvX3B1YmxpY28vRW5lcmdldGljb3MvRG9jL01lZGlkYXMvQ2FtYmlvX0hvcmFyaW9fTmFjXzE5MDQwNi5wZGY+LgorIyBodHRwOi8vd3d3LnNpZWNhLm9yZy5ndC9TaXRpb19wdWJsaWNvL0VuZXJnZXRpY29zL0RvYy9NZWRpZGFzL0NhbWJpb19Ib3JhcmlvX05hY18xOTA0MDYucGRmCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCUd1YXQJMTk3Mwlvbmx5CS0JTm92CTI1CTA6MDAJMTowMAlECkBAIC0yOTg0LDExICsyODk0LDEwIEBACiAKICMgSGFpdGkKICMgRnJvbSBHd2lsbGltIExhdyAoMjAwNS0wNC0xNSk6Ci0jIFJpc3RvIE8uIE55a2FuZW4gd3JvdGUgbWUgdGhhdCBIYWl0aSBpcyBub3cgb24gRFNULgotIyBJIHNlYXJjaGVkIGZvciBjb25maXJtYXRpb24sIGFuZCBJIGZvdW5kIGEKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5oYWl0aWFuY29uc3VsYXRlLm9yZy90aW1lLmRvYyI+IHByZXNzIHJlbGVhc2UKKyMgUmlzdG8gTy4gTnlrw6RuZW4gd3JvdGUgbWUgdGhhdCBIYWl0aSBpcyBub3cgb24gRFNULgorIyBJIHNlYXJjaGVkIGZvciBjb25maXJtYXRpb24sIGFuZCBJIGZvdW5kIGEgcHJlc3MgcmVsZWFzZQogIyBvbiB0aGUgV2ViIHBhZ2Ugb2YgdGhlIEhhaXRpYW4gQ29uc3VsYXRlIGluIENoaWNhZ28gKDIwMDUtMDMtMzEpLAotIyA8L2E+LiAgVHJhbnNsYXRlZCBmcm9tIEZyZW5jaCwgaXQgc2F5czoKKyMgPGh0dHA6Ly93d3cuaGFpdGlhbmNvbnN1bGF0ZS5vcmcvdGltZS5kb2M+LiAgVHJhbnNsYXRlZCBmcm9tIEZyZW5jaCwgaXQgc2F5czoKICMKICMgICJUaGUgUHJpbWUgTWluaXN0ZXIncyBDb21tdW5pY2F0aW9uIE9mZmljZSBub3RpZmllcyB0aGUgcHVibGljIGluIGdlbmVyYWwKICMgICBhbmQgdGhlIHByZXNzIGluIHBhcnRpY3VsYXIgdGhhdCwgZm9sbG93aW5nIGEgZGVjaXNpb24gb2YgdGhlIEludGVyaW9yCkBAIC0zMDY1LDE0ICsyOTc0LDE0IEBACiAjIDxodHRwOi8vd3d3LmxhdHJpYnVuYS5obi85OTI5OS5odG1sPiB0aGF0IE1hbnVlbCBaZWxheWEsIHRoZSBwcmVzaWRlbnQKICMgb2YgSG9uZHVyYXMsIHJlZnVzZWQgdG8gYmFjayBkb3duIG9uIHRoaXMuCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDgtMDgpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDgtMDgpOgogIyBJdCBzZWVtcyB0aGF0IEhvbmR1cmFzIGhhcyByZXR1cm5lZCBmcm9tIERTVCB0byBzdGFuZGFyZCB0aW1lIHRoaXMgTW9uZGF5IGF0CiAjIDAwOjAwIGhvdXJzIChwcm9sb25naW5nIFN1bmRheSB0byAyNSBob3VycyBkdXJhdGlvbikuCiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfaG9uZHVyYXMwNC5odG1sCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wOC0wOCk6Ci0jIEFsc28gc2VlIERpYXJpbyBFbCBIZXJhbGRvLCBUaGUgY291bnRyeSByZXR1cm5zIHRvIHN0YW5kYXJkIHRpbWUgKDIwMDYtMDgtMDgpCi0jIDxodHRwOi8vd3d3LmVsaGVyYWxkby5obi9ub3RhLnBocD9uaWQ9NTQ5NDEmc2VjPTEyPi4KKyMgQWxzbyBzZWUgRGlhcmlvIEVsIEhlcmFsZG8sIFRoZSBjb3VudHJ5IHJldHVybnMgdG8gc3RhbmRhcmQgdGltZSAoMjAwNi0wOC0wOCkuCisjIGh0dHA6Ly93d3cuZWxoZXJhbGRvLmhuL25vdGEucGhwP25pZD01NDk0MSZzZWM9MTIKICMgSXQgbWVudGlvbnMgZXhlY3V0aXZlIGRlY3JlZSAxOC0yMDA2LgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTA4LTE3KToKQEAgLTMxMDAsMjIgKzMwMDksMjIgQEAKICMgdW5zcGVjaWZpZWQgb2ZmaWNpYWwgZG9jdW1lbnQsIGFuZCBzYXlzICJUaGlzIHRpbWUgaXMgdXNlZCB0aHJvdWdob3V0IHRoZQogIyBpc2xhbmQiLiAgR28gd2l0aCBNaWxuZS4gIFJvdW5kIHRvIHRoZSBuZWFyZXN0IHNlY29uZCBhcyByZXF1aXJlZCBieSB6aWMuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvSmFtYWljYQktNTowNzoxMSAtCUxNVAkxODkwCQkjIEtpbmdzdG9uCitab25lCUFtZXJpY2EvSmFtYWljYQktNTowNzoxMSAtCUxNVAkxODkwICAgICAgICAjIEtpbmdzdG9uCiAJCQktNTowNzoxMSAtCUtNVAkxOTEyIEZlYiAgICAjIEtpbmdzdG9uIE1lYW4gVGltZQotCQkJLTU6MDAJLQlFU1QJMTk3NCBBcHIgMjggMjowMAorCQkJLTU6MDAJLQlFU1QJMTk3NCBBcHIgMjggIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QJMTk4NAogCQkJLTU6MDAJLQlFU1QKIAogIyBNYXJ0aW5pcXVlCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTWFydGluaXF1ZQktNDowNDoyMCAtICAgICAgTE1UCTE4OTAJCSMgRm9ydC1kZS1GcmFuY2UKLQkJCS00OjA0OjIwIC0JRkZNVAkxOTExIE1heSAgICAgIyBGb3J0LWRlLUZyYW5jZSBNVAorWm9uZSBBbWVyaWNhL01hcnRpbmlxdWUJLTQ6MDQ6MjAgLSAgICAgIExNVAkxODkwICAgICAgICAjIEZvcnQtZGUtRnJhbmNlCisJCQktNDowNDoyMCAtCUZGTVQJMTkxMSBNYXkgICAgIyBGb3J0LWRlLUZyYW5jZSBNVAogCQkJLTQ6MDAJLQlBU1QJMTk4MCBBcHIgIDYKIAkJCS00OjAwCTE6MDAJQURUCTE5ODAgU2VwIDI4CiAJCQktNDowMAktCUFTVAogCiAjIE1vbnRzZXJyYXQKLSMgU2VlICdzb3V0aGFtZXJpY2EnLgorIyBTZWUgQW1lcmljYS9Qb3J0X29mX1NwYWluLgogCiAjIE5pY2FyYWd1YQogIwpAQCAtMzEzOCwyNyArMzA0NywyNyBAQAogIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA0LTIxKToKICMgVGhlIEFzc29jaWF0ZWQgUHJlc3Mgc3Rvcnkgb24gdGhlIHRpbWUgY2hhbmdlLCB3aGljaCBjYW4gYmUgZm91bmQgYXQKICMgaHR0cDovL3d3dy5sYXBhbG1haW50ZXJhY3Rpdm8uY29tL2d1aWFzL2NvbnRlbnQvZ2VuL2FwL0FtZXJpY2FfTGF0aW5hL0FNQ19HRU5fTklDQVJBR1VBX0hPUkEuaHRtbAotIyBhbmQgZWxzZXdoZXJlLCBzYXlzIChmaWZ0aCBwYXJhZ3JhcGgsIHRyYW5zbGF0ZWQgZnJvbSBTcGFuaXNoKTogICJUaGUgbGFzdAorIyBhbmQgZWxzZXdoZXJlLCBzYXlzIChmaWZ0aCBwYXJhZ3JhcGgsIHRyYW5zbGF0ZWQgZnJvbSBTcGFuaXNoKTogIlRoZSBsYXN0CiAjIHRpbWUgdGhhdCBhIGNoYW5nZSBvZiBjbG9ja3Mgd2FzIGFwcGxpZWQgdG8gc2F2ZSBlbmVyZ3kgd2FzIGluIHRoZSB5ZWFyIDIwMDAKLSMgZHVyaW5nIHRoZSBBcm5vbGRvIEFsZW1hbiBhZG1pbmlzdHJhdGlvbi4iLi4uCisjIGR1cmluZyB0aGUgQXJub2xkbyBBbGVtw6FuIGFkbWluaXN0cmF0aW9uLiIuLi4KICMgVGhlIG5vcnRoYW1lcmljYSBmaWxlIHNheXMgdGhhdCBOaWNhcmFndWEgaGFzIGJlZW4gb24gVVRDLTYgY29udGludW91c2x5CiAjIHNpbmNlIERlY2VtYmVyIDE5OTguICBJIHdhc24ndCBhYmxlIHRvIGZpbmQgYW55IGRldGFpbHMgb2YgTmljYXJhZ3VhbiB0aW1lCiAjIGNoYW5nZXMgaW4gMjAwMC4gIFBlcmhhcHMgYSBub3RlIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBub3J0aGFtZXJpY2EgZmlsZSwgdG8KICMgdGhlIGVmZmVjdCB0aGF0IHdlIGhhdmUgaW5kaXJlY3QgZXZpZGVuY2UgdGhhdCBEU1Qgd2FzIG9ic2VydmVkIGluIDIwMDAuCiAjCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTExLTAyKToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA1LTExLTAyKToKICMgTmljYXJhZ3VhIGxlZnQgRFNUIHRoZSAyMDA1LTEwLTAyIGF0IDAwOjAwIChsb2NhbCB0aW1lKS4KICMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvcHJlc2lkZW5jaWEvZmlsZXNfaW5kZXgvc2VjcmV0YXJpYS9jb211bmljYWRvcy8yMDA1L3NlcHRpZW1icmUvMjZzZXB0aWVtYnJlLWNhbWJpby1ob3JhLmh0bQogIyAoMjAwNS0wOS0yNikKICMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDUtMDUpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDUtMDUpOgogIyBodHRwOi8vd3d3LmVsbnVldm9kaWFyaW8uY29tLm5pLzIwMDYvMDUvMDEvbmFjaW9uYWxlcy8xODQxMAogIyAobXkgaW5mb3JtYWwgdHJhbnNsYXRpb24pCi0jIEJ5IG9yZGVyIG9mIHRoZSBwcmVzaWRlbnQgb2YgdGhlIHJlcHVibGljLCBFbnJpcXVlIEJvbGFub3MsIE5pY2FyYWd1YQorIyBCeSBvcmRlciBvZiB0aGUgcHJlc2lkZW50IG9mIHRoZSByZXB1YmxpYywgRW5yaXF1ZSBCb2xhw7FvcywgTmljYXJhZ3VhCiAjIGFkdmFuY2VkIGJ5IHNpeHR5IG1pbnV0ZXMgdGhlaXIgb2ZmaWNpYWwgdGltZSwgeWVzdGVyZGF5IGF0IDIgaW4gdGhlCi0jIG1vcm5pbmcsIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkgdW50aWwgMzAudGguIG9mIHNlcHRlbWJlci4KKyMgbW9ybmluZywgYW5kIHdpbGwgc3RheSB0aGF0IHdheSB1bnRpbCAzMHRoIG9mIFNlcHRlbWJlci4KICMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDktMzApOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDktMzApOgogIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5uaS9idXNjYWRvcl9nYWNldGEvQkQvREVDUkVUT1MvMjAwNi9ELTA2My0yMDA2UC1QUk4tQ2FtYmlvLUhvcmEucGRmCiAjIE15IGluZm9ybWFsIHRyYW5zbGF0aW9uIHJ1bnM6CiAjIFRoZSBuYXR1cmFsIHN1biB0aW1lIGlzIHJlc3RvcmVkIGluIGFsbCB0aGUgbmF0aW9uYWwgdGVycml0b3J5LCBpbiB0aGF0IHRoZQpAQCAtMzE3Niw3ICszMDg1LDcgQEAKIAkJCS01OjQ1OjEyIC0JTU1UCTE5MzQgSnVuIDIzICMgTWFuYWd1YSBNZWFuIFRpbWU/CiAJCQktNjowMAktCUNTVAkxOTczIE1heQogCQkJLTU6MDAJLQlFU1QJMTk3NSBGZWIgMTYKLQkJCS02OjAwCU5pYwlDJXNUCTE5OTIgSmFuICAxIDQ6MDAKKwkJCS02OjAwCU5pYwlDJXNUCTE5OTIgSmFuICAxICA0OjAwCiAJCQktNTowMAktCUVTVAkxOTkyIFNlcCAyNAogCQkJLTY6MDAJLQlDU1QJMTk5MwogCQkJLTU6MDAJLQlFU1QJMTk5NwpAQCAtMzE4NSwzNiArMzA5NCwzNiBAQAogIyBQYW5hbWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQW1lcmljYS9QYW5hbWEJLTU6MTg6MDggLQlMTVQJMTg5MAotCQkJLTU6MTk6MzYgLQlDTVQJMTkwOCBBcHIgMjIgICAjIENvbG9uIE1lYW4gVGltZQorCQkJLTU6MTk6MzYgLQlDTVQJMTkwOCBBcHIgMjIgIyBDb2zDs24gTWVhbiBUaW1lCiAJCQktNTowMAktCUVTVAogCiAjIFB1ZXJ0byBSaWNvCiAjIFRoZXJlIGFyZSB0b28gbWFueSBTYW4gSnVhbnMgZWxzZXdoZXJlLCBzbyB3ZSdsbCB1c2UgJ1B1ZXJ0b19SaWNvJy4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9QdWVydG9fUmljbyAtNDoyNDoyNSAtCUxNVAkxODk5IE1hciAyOCAxMjowMCAgICAjIFNhbiBKdWFuCitab25lIEFtZXJpY2EvUHVlcnRvX1JpY28gLTQ6MjQ6MjUgLQlMTVQJMTg5OSBNYXIgMjggMTI6MDAgIyBTYW4gSnVhbgogCQkJLTQ6MDAJLQlBU1QJMTk0MiBNYXkgIDMKIAkJCS00OjAwCVVTCUElc1QJMTk0NgogCQkJLTQ6MDAJLQlBU1QKIAogIyBTdCBLaXR0cy1OZXZpcwogIyBTdCBMdWNpYQotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCiAKICMgU3QgUGllcnJlIGFuZCBNaXF1ZWxvbgogIyBUaGVyZSBhcmUgdG9vIG1hbnkgU3QgUGllcnJlcyBlbHNld2hlcmUsIHNvIHdlJ2xsIHVzZSAnTWlxdWVsb24nLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL01pcXVlbG9uCS0zOjQ0OjQwIC0JTE1UCTE5MTEgTWF5IDE1CSMgU3QgUGllcnJlCitab25lIEFtZXJpY2EvTWlxdWVsb24JLTM6NDQ6NDAgLQlMTVQJMTkxMSBNYXkgMTUgIyBTdCBQaWVycmUKIAkJCS00OjAwCS0JQVNUCTE5ODAgTWF5CiAJCQktMzowMAktCVBNU1QJMTk4NyAjIFBpZXJyZSAmIE1pcXVlbG9uIFRpbWUKIAkJCS0zOjAwCUNhbmFkYQlQTSVzVAogCiAjIFN0IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzCi0jIFNlZSAnc291dGhhbWVyaWNhJy4KKyMgU2VlIEFtZXJpY2EvUG9ydF9vZl9TcGFpbi4KIAogIyBUdXJrcyBhbmQgQ2FpY29zCiAjCiAjIEZyb20gQ2hyaXMgRHVubiBpbgotIyA8aHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQxNTAwNz4KKyMgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQxNTAwNwogIyAoMjAwNy0wMy0xNSk6IEluIHRoZSBUdXJrcyAmIENhaWNvcyBJc2xhbmRzIChBbWVyaWNhL0dyYW5kX1R1cmspIHRoZQogIyBkYXlsaWdodCBzYXZpbmcgZGF0ZXMgZm9yIHRpbWUgY2hhbmdlcyBoYXZlIGJlZW4gYWRqdXN0ZWQgdG8gbWF0Y2gKICMgdGhlIHJlY2VudCBVLlMuIGNoYW5nZSBvZiBkYXRlcy4KQEAgLTMyMjcsMjEgKzMxMzYsMjMgQEAKICMgQ2xvY2tzIGFyZSBzZXQgYmFjayBvbmUgaG91ciBhdCAyOjAwIGEubS4gbG9jYWwgRGF5bGlnaHQgU2F2aW5nIFRpbWUiCiAjIGluZGljYXRpbmcgdGhhdCB0aGUgbm9ybWFsIEVUIHJ1bGVzIGFyZSBmb2xsb3dlZC4KICMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNS0wMSk6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhleSB1c2UgVVMgRFNUIHJ1bGVzLCBidXQgSUFUQSBTU0lNICgxOTkxLzE5OTgpCi0jIHNheXMgdGhleSBzd2l0Y2ggYXQgbWlkbmlnaHQuICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wOC0xOSk6CisjIFRoZSAyMDE0LTA4LTEzIENhYmluZXQgbWVldGluZyBkZWNpZGVkIHRvIHN0YXkgb24gVVRDLTQgeWVhci1yb3VuZC4gIFNlZToKKyMgaHR0cDovL3Rjd2Vla2x5bmV3cy5jb20vZGF5bGlnaHQtc2F2aW5ncy10aW1lLXRvLWJlLW1haW50YWluZWQtcDUzNTMtMTI3Lmh0bQorIyBNb2RlbCB0aGlzIGFzIGEgc3dpdGNoIGZyb20gRVNUL0VEVCB0byBBU1Qgb24gMjAxNC0xMS0wMiBhdCAwMjowMC4KICMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVRDCTE5NzkJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVRDCTE5NzkJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVRDCTE5ODcJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJVEMJMjAwNwltYXgJLQlNYXIJU3VuPj04CTI6MDAJMTowMAlECi1SdWxlCVRDCTIwMDcJbWF4CS0JTm92CVN1bj49MQkyOjAwCTAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0dyYW5kX1R1cmsJLTQ6NDQ6MzIgLQlMTVQJMTg5MAotCQkJLTU6MDc6MTEgLQlLTVQJMTkxMiBGZWIgICAgIyBLaW5nc3RvbiBNZWFuIFRpbWUKLQkJCS01OjAwCVRDCUUlc1QKKwkJCS01OjA3OjExIC0JS01UCTE5MTIgRmViICMgS2luZ3N0b24gTWVhbiBUaW1lCisJCQktNTowMAktCUVTVAkxOTc5CisJCQktNTowMAlVUwlFJXNUCTIwMTQgTm92ICAyICAyOjAwCisJCQktNDowMAktCUFTVAogCiAjIEJyaXRpc2ggVmlyZ2luIElzCiAjIFZpcmdpbiBJcwotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCisKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIGNvZGluZzogdXRmLTgKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbWFrZS9kYXRhL3R6ZGF0YS9wYWNpZmljbmV3IGIvbWFrZS9kYXRhL3R6ZGF0YS9wYWNpZmljbmV3CmluZGV4IDA5MDAwYzMuLjliOTI1N2EgMTAwNjQ0Ci0tLSBhL21ha2UvZGF0YS90emRhdGEvcGFjaWZpY25ldworKysgYi9tYWtlL2RhdGEvdHpkYXRhL3BhY2lmaWNuZXcKQEAgLTIxLDcgKzIxLDYgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCmRpZmYgLS1naXQgYS9tYWtlL2RhdGEvdHpkYXRhL3NvdXRoYW1lcmljYSBiL21ha2UvZGF0YS90emRhdGEvc291dGhhbWVyaWNhCmluZGV4IDAyYmYzYmIuLjM5OGVjMGUgMTAwNjQ0Ci0tLSBhL21ha2UvZGF0YS90emRhdGEvc291dGhhbWVyaWNhCisrKyBiL21ha2UvZGF0YS90emRhdGEvc291dGhhbWVyaWNhCkBAIC0yMSwxMyArMjEsMTMgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAorIyBUaGlzIGZpbGUgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKICMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bwotIyB0ekBpYW5hLm9yZyBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisjIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4gIEZvciBtb3JlLCBwbGVhc2Ugc2VlCisjIHRoZSBmaWxlIENPTlRSSUJVVElORyBpbiB0aGUgdHogZGlzdHJpYnV0aW9uLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgogIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKQEAgLTM1LDggKzM1LDggQEAKICMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgyMDAzKS4KICMKICMgRm9yIGRhdGEgY2lyY2EgMTg5OSwgYSBjb21tb24gc291cmNlIGlzOgotIyBNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQKLSMgPGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5Pi4KKyMgTWlsbmUgSi4gQ2l2aWwgdGltZS4gR2VvZ3IgSi4gMTg5OSBGZWI7MTMoMik6MTczLTk0LgorIyBodHRwOi8vd3d3LmpzdG9yLm9yZy9zdGFibGUvMTc3NDM1OQogIwogIyBHd2lsbGltIExhdyB3cml0ZXMgdGhhdCBhIGdvb2Qgc291cmNlCiAjIGZvciByZWNlbnQgdGltZSB6b25lIGRhdGEgaXMgdGhlIEludGVybmF0aW9uYWwgQWlyIFRyYW5zcG9ydApAQCAtNTMsMjQgKzUzLDI0IEBACiAjCUkgc3VnZ2VzdCB0aGUgdXNlIG9mIF9TdW1tZXIgdGltZV8gaW5zdGVhZCBvZiB0aGUgbW9yZSBjdW1iZXJzb21lCiAjCV9kYXlsaWdodC1zYXZpbmcgdGltZV8uICBfU3VtbWVyIHRpbWVfIHNlZW1zIHRvIGJlIGluIGdlbmVyYWwgdXNlCiAjCWluIEV1cm9wZSBhbmQgU291dGggQW1lcmljYS4KLSMJLS0gRSBPIEN1dGxlciwgX05ldyBZb3JrIFRpbWVzXyAoMTkzNy0wMi0xNCksIHF1b3RlZCBpbgorIwktLeKAikUgTyBDdXRsZXIsIF9OZXcgWW9yayBUaW1lc18gKDE5MzctMDItMTQpLCBxdW90ZWQgaW4KICMJSCBMIE1lbmNrZW4sIF9UaGUgQW1lcmljYW4gTGFuZ3VhZ2U6IFN1cHBsZW1lbnQgSV8gKDE5NjApLCBwIDQ2NgogIwogIyBFYXJsaWVyIGVkaXRpb25zIG9mIHRoZXNlIHRhYmxlcyBhbHNvIHVzZWQgdGhlIE5vcnRoIEFtZXJpY2FuIHN0eWxlCiAjIGZvciB0aW1lIHpvbmVzIGluIEJyYXppbCwgYnV0IHRoaXMgd2FzIGluY29ycmVjdCwgYXMgQnJhemlsaWFucyBzYXkKLSMgInN1bW1lciB0aW1lIi4gIFJlaW5hbGRvIEdvdWxhcnQsIGEgU2FvIFBhdWxvIGJ1c2luZXNzbWFuIGFjdGl2ZSBpbgorIyAic3VtbWVyIHRpbWUiLiAgUmVpbmFsZG8gR291bGFydCwgYSBTw6NvIFBhdWxvIGJ1c2luZXNzbWFuIGFjdGl2ZSBpbgogIyB0aGUgcmFpbHJvYWQgc2VjdG9yLCB3cml0ZXMgKDE5OTktMDctMDYpOgogIwlUaGUgc3ViamVjdCBvZiB0aW1lIHpvbmVzIGlzIGN1cnJlbnRseSBhIG1hdHRlciBvZiBkaXNjdXNzaW9uL2RlYmF0ZSBpbgotIwlCcmF6aWwuICBMZXQncyBzYXkgdGhhdCAidGhlIEJyYXNpbGlhIHRpbWUiIGlzIGNvbnNpZGVyZWQgdGhlCi0jCSJvZmZpY2lhbCB0aW1lIiBiZWNhdXNlIEJyYXNpbGlhIGlzIHRoZSBjYXBpdGFsIGNpdHkuCi0jCVRoZSBvdGhlciB0aHJlZSB0aW1lIHpvbmVzIGFyZSBjYWxsZWQgIkJyYXNpbGlhIHRpbWUgIm1pbnVzIG9uZSIgb3IKKyMJQnJhemlsLiAgTGV0J3Mgc2F5IHRoYXQgInRoZSBCcmFzw61saWEgdGltZSIgaXMgY29uc2lkZXJlZCB0aGUKKyMJIm9mZmljaWFsIHRpbWUiIGJlY2F1c2UgQnJhc8OtbGlhIGlzIHRoZSBjYXBpdGFsIGNpdHkuCisjCVRoZSBvdGhlciB0aHJlZSB0aW1lIHpvbmVzIGFyZSBjYWxsZWQgIkJyYXPDrWxpYSB0aW1lICJtaW51cyBvbmUiIG9yCiAjCSJwbHVzIG9uZSIgb3IgInBsdXMgdHdvIi4gIEFzIGZhciBhcyBJIGtub3cgdGhlcmUgaXMgbm8gc3VjaAogIwluYW1lL2Rlc2lnbmF0aW9uIGFzICJFYXN0ZXJuIFRpbWUiIG9yICJDZW50cmFsIFRpbWUiLgogIyBTbyBJIGludmVudGVkIHRoZSBmb2xsb3dpbmcgKEVuZ2xpc2gtbGFuZ3VhZ2UpIGFiYnJldmlhdGlvbnMgZm9yIG5vdy4KICMgQ29ycmVjdGlvbnMgYXJlIHdlbGNvbWUhCiAjCQlzdGQJZHN0CiAjCS0yOjAwCUZOVAlGTlNUCUZlcm5hbmRvIGRlIE5vcm9uaGEKLSMJLTM6MDAJQlJUCUJSU1QJQnJhc2lsaWEKKyMJLTM6MDAJQlJUCUJSU1QJQnJhc8OtbGlhCiAjCS00OjAwCUFNVAlBTVNUCUFtYXpvbgogIwktNTowMAlBQ1QJQUNTVAlBY3JlCiAKQEAgLTg0LDcgKzg0LDcgQEAKICMgQXJnZW50aW5hOiBmaXJzdCBTdW5kYXkgaW4gT2N0b2JlciB0byBmaXJzdCBTdW5kYXkgaW4gQXByaWwgc2luY2UgMTk3Ni4KICMgRG91YmxlIFN1bW1lciB0aW1lIGZyb20gMTk2OSB0byAxOTc0LiAgU3dpdGNoZXMgYXQgbWlkbmlnaHQuCiAKLSMgRnJvbSBVLiBTLiBOYXZhbCBPYnNlcnZhdG9yeSAoMTk4OC0wMS0xOTkpOgorIyBGcm9tIFUuIFMuIE5hdmFsIE9ic2VydmF0b3J5ICgxOTg4LTAxLTE5KToKICMgQVJHRU5USU5BICAgICAgICAgICAzIEggQkVISU5EICAgVVRDCiAKICMgRnJvbSBIZXJuYW4gRy4gT3Rlcm8gKDE5OTUtMDYtMjYpOgpAQCAtMTE4LDcgKzExOCw3IEBACiAjIEZyb20gSGVybmFuIEcuIE90ZXJvICgxOTk1LTA2LTI2KToKICMgVGhlc2UgY29ycmVjdGlvbnMgd2VyZSBjb250cmlidXRlZCBieSBJbnRlclNvZnQgQXJnZW50aW5hIFMuQS4sCiAjIG9idGFpbmluZyB0aGUgZGF0YSBmcm9tIHRoZToKLSMgVGFsbGVyZXMgZGUgSGlkcm9ncmFmaWEgTmF2YWwgQXJnZW50aW5hCisjIFRhbGxlcmVzIGRlIEhpZHJvZ3JhZsOtYSBOYXZhbCBBcmdlbnRpbmEKICMgKEFyZ2VudGluZSBOYXZhbCBIeWRyb2dyYXBoeSBJbnN0aXR1dGUpCiBSdWxlCUFyZwkxOTg5CTE5OTMJLQlNYXIJU3VuPj0xCTA6MDAJMAktCiBSdWxlCUFyZwkxOTg5CTE5OTIJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwpAQCAtMTQwLDEzICsxNDAsMTMgQEAKIFJ1bGUJQXJnCTIwMDAJb25seQktCU1hcgkzCTA6MDAJMAktCiAjCiAjIEZyb20gUGV0ZXIgR3JhZGVsc2tpIHZpYSBTdGVmZmVuIFRob3JzZW4gKDIwMDAtMDMtMDEpOgotIyBXZSBqdXN0IGNoZWNrZWQgd2l0aCBvdXIgU2FvIFBhdWxvIG9mZmljZSBhbmQgdGhleSBzYXkgdGhlIGdvdmVybm1lbnQgb2YKKyMgV2UganVzdCBjaGVja2VkIHdpdGggb3VyIFPDo28gUGF1bG8gb2ZmaWNlIGFuZCB0aGV5IHNheSB0aGUgZ292ZXJubWVudCBvZgogIyBBcmdlbnRpbmEgZGVjaWRlZCBub3QgdG8gYmVjb21lIG9uZSBvZiB0aGUgY291bnRyaWVzIHRoYXQgZ28gb24gb3Igb2ZmIERTVC4KICMgU28gQnVlbm9zIEFpcmVzIHNob3VsZCBiZSAtMyBob3VycyBmcm9tIEdNVCBhdCBhbGwgdGltZXMuCiAjCi0jIEZyb20gRmFiaWFuIEwuIEFyY2UgSm9mcmUgKDIwMDAtMDQtMDQpOgorIyBGcm9tIEZhYmnDoW4gTC4gQXJjZSBKb2Zyw6kgKDIwMDAtMDQtMDQpOgogIyBUaGUgbGF3IHRoYXQgY2xhaW1lZCBEU1QgZm9yIEFyZ2VudGluYSB3YXMgZGVyb2dhdGVkIGJ5IFByZXNpZGVudCBGZXJuYW5kbwotIyBkZSBsYSBSdWEgb24gTWFyY2ggMiwgMjAwMCwgYmVjYXVzZSBpdCB3b3VsZCBtYWtlIHBlb3BsZSBzcGVuZCBtb3JlIGVuZXJneQorIyBkZSBsYSBSw7phIG9uIE1hcmNoIDIsIDIwMDAsIGJlY2F1c2UgaXQgd291bGQgbWFrZSBwZW9wbGUgc3BlbmQgbW9yZSBlbmVyZ3kKICMgaW4gdGhlIHdpbnRlciB0aW1lLCByYXRoZXIgdGhhbiBsZXNzLiAgVGhlIGNoYW5nZSB0b29rIGVmZmVjdCBvbiBNYXJjaCAzLgogIwogIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDAxLTA2LTA2KToKQEAgLTE3OSwxNSArMTc5LDEzIEBACiAjIHRoYXQgQXJnZW50aW5hIHdpbGwgdXNlIERTVCBuZXh0IHllYXIgYXMgd2VsbCwgZnJvbSBPY3RvYmVyIHRvCiAjIE1hcmNoLCBhbHRob3VnaCBleGFjdCBydWxlcyBhcmUgbm90IGdpdmVuLgogIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNy0xMi0yNikKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA3LTEyLTI2KQogIyBUaGUgbGFzdCBodXJkbGUgb2YgQXJnZW50aW5hIERTVCBpcyBvdmVyLCB0aGUgcHJvcG9zYWwgd2FzIGFwcHJvdmVkIGluCi0jIHRoZSBsb3dlciBjaGFtYmVyIHRvbyAoRGVwdXRhZG9zKSB3aXRoIGEgdm90ZSAxOTIgZm9yIGFuZCAyIGFnYWluc3QuCisjIHRoZSBsb3dlciBjaGFtYmVyIHRvbyAoRGlwdXRhZG9zKSB3aXRoIGEgdm90ZSAxOTIgZm9yIGFuZCAyIGFnYWluc3QuCiAjIEJ5IHRoZSB3YXkgdGhhbmtzIHRvIE1hcmlhbm8gQWJzYXR6IGFuZCBEYW5pZWwgTWFyaW8gVmVnYSBmb3IgdGhlIGxpbmsgdG8KICMgdGhlIG9yaWdpbmFsIHNjYW5uZWQgcHJvcG9zYWwsIHdoZXJlIHRoZSBkYXRlcyBhbmQgdGhlIHplcm8gaG91cnMgYXJlCiAjIGNsZWFyIGFuZCB1bmFtYmlndW91cy4uLlRoaXMgaXMgdGhlIGFydGljbGUgYWJvdXQgZmluYWwgYXBwcm92YWw6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyL3BvbGl0aWNhL25vdGEuYXNwP25vdGFfaWQ9OTczOTk2Ij4KICMgaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvcG9saXRpY2Evbm90YS5hc3A/bm90YV9pZD05NzM5OTYKLSMgPC9hPgogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTEyLTIyKToKICMgRm9yIGRhdGVzIGFmdGVyIG1pZC0yMDA4LCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBteSBndWVzc2VzIGFuZApAQCAtMTk3LDEzICsxOTUsOCBAQAogIyBBcyBwZXIgbWVzc2FnZSBmcm9tIENhcmxvcyBBbGJlcnRvIEZvbnNlY2EgQXJhdXogKE5pY2FyYWd1YSksCiAjIEFyZ2VudGluYSB3aWxsIHN0YXJ0IERTVCBvbiBTdW5kYXkgT2N0b2JlciAxOSwgMjAwOC4KICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMy5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMy5odG1sCi0jIDwvYT4KLSMgT1IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5pbXB1bHNvYmFpcmVzLmNvbS5hci9ub3RhLnBocD9pZD01NzgzMiAoaW4gc3BhbmlzaCkiPgogIyBodHRwOi8vd3d3LmltcHVsc29iYWlyZXMuY29tLmFyL25vdGEucGhwP2lkPTU3ODMyIChpbiBzcGFuaXNoKQotIyA8L2E+CiAKICMgRnJvbSBSb2RyaWdvIFNldmVybyAoMjAwOC0xMC0wNik6CiAjIEhlcmUgaXMgc29tZSBpbmZvIGF2YWlsYWJsZSBhdCBhIEdlbnRvbyBidWcgcmVsYXRlZCB0byBUWiBvbiBBcmdlbnRpbmEncyBEU1Q6CkBAIC0yMTIsNDggKzIwNSwzOSBAQAogIyBIaSwgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGltZXpvbmUtZGF0YS0yMDA4ZSBhbmQgbWF5YmUgd2l0aAogIyB0aW1lem9uZS1kYXRhLTIwMDhmCiAjIEFyZ2VudGluaWFuIGxhdyBbTnVtYmVyXSAyNS4xNTUgaXMgbm8gbG9uZ2VyIHZhbGlkLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvNjAwMDAtNjQ5OTkvNjAwMzYvbm9ybWEuaHRtIj4KICMgaHR0cDovL3d3dy5pbmZvbGVnLmdvdi5hci9pbmZvbGVnSW50ZXJuZXQvYW5leG9zLzYwMDAwLTY0OTk5LzYwMDM2L25vcm1hLmh0bQotIyA8L2E+CiAjIFRoZSBuZXcgb25lIGlzIGxhdyBbTnVtYmVyXSAyNi4zNTAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvbGVnLmdvdi5hci9pbmZvbGVnSW50ZXJuZXQvYW5leG9zLzEzNTAwMC0xMzk5OTkvMTM2MTkxL25vcm1hLmh0bSI+CiAjIGh0dHA6Ly93d3cuaW5mb2xlZy5nb3YuYXIvaW5mb2xlZ0ludGVybmV0L2FuZXhvcy8xMzUwMDAtMTM5OTk5LzEzNjE5MS9ub3JtYS5odG0KLSMgPC9hPgogIyBTbyB0aGVyZSBpcyBubyBzdW1tZXIgdGltZSBpbiBBcmdlbnRpbmEgZm9yIG5vdy4KIAogIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA4LTEwLTIwKToKLSMgRGVjcmVlIDE2OTMvMjAwOCBhcHBsaWVzIExhdyAyNi4zNTAgZm9yIHRoZSBzdW1tZXIgMjAwOC8yMDA5IGVzdGFibGlzaGluZyBEU1QgaW4gQXJnZW50aW5hCi0jIEZyb20gMjAwOC0xMC0xOSB1bnRpbCAyMDA5LTAzLTE1Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9sZXRpbm9maWNpYWwuZ292LmFyL0JvcmEuUG9ydGFsL0N1c3RvbUNvbnRyb2xzL1BkZkNvbnRlbnQuYXNweD9mcD0xNjEwMjAwOCZwaT0zJnBmPTQmcz0wJnNlYz0wMSI+CisjIERlY3JlZSAxNjkzLzIwMDggYXBwbGllcyBMYXcgMjYuMzUwIGZvciB0aGUgc3VtbWVyIDIwMDgvMjAwOSBlc3RhYmxpc2hpbmcgRFNUCisjIGluIEFyZ2VudGluYSBmcm9tIDIwMDgtMTAtMTkgdW50aWwgMjAwOS0wMy0xNS4KICMgaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE2MTAyMDA4JnBpPTMmcGY9NCZzPTAmc2VjPTAxCi0jIDwvYT4KICMKLSMgRGVjcmVlIDE3MDUvMjAwOCBleGNlcHRpbmcgMTIgUHJvdmluY2VzIGZyb20gYXBwbHlpbmcgRFNUIGluIHRoZSBzdW1tZXIgMjAwOC8yMDA5OgotIyBDYXRhbWFyY2EsIExhIFJpb2phLCBNZW5kb3phLCBTYWx0YSwgU2FuIEp1YW4sIFNhbiBMdWlzLCBMYSBQYW1wYSwgTmV1cXVlbiwgUmlvIE5lZ3JvLCBDaHVidXQsIFNhbnRhIENydXoKLSMgYW5kIFRpZXJyYSBkZWwgRnVlZ28KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE3MTAyMDA4JnBpPTEmcGY9MSZzPTAmc2VjPTAxIj4KKworIyBEZWNyZWUgMTcwNS8yMDA4IGV4Y2VwdGluZyAxMiBQcm92aW5jZXMgZnJvbSBhcHBseWluZyBEU1QgaW4gdGhlIHN1bW1lcgorIyAyMDA4LzIwMDk6IENhdGFtYXJjYSwgTGEgUmlvamEsIE1lbmRvemEsIFNhbHRhLCBTYW4gSnVhbiwgU2FuIEx1aXMsIExhCisjIFBhbXBhLCBOZXVxdcOpbiwgUmlvIE5lZ3JvLCBDaHVidXQsIFNhbnRhIENydXogYW5kIFRpZXJyYSBkZWwgRnVlZ28KICMgaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE3MTAyMDA4JnBpPTEmcGY9MSZzPTAmc2VjPTAxCi0jIDwvYT4KICMKLSMgUHJlc3MgcmVsZWFzZSAyMzUgZGF0ZWQgU2F0dXJkYXkgT2N0b2JlciAxOHRoLCBmcm9tIHRoZSBHb3Zlcm5tZW50IG9mIHRoZSBQcm92aW5jZSBvZiBKdWp1eSBzYXlpbmcKLSMgaXQgd2lsbCBub3QgYXBwbHkgRFNUIGVpdGhlciAoZXZlbiB3aGVuIGl0IHdhcyBub3QgaW5jbHVkZWQgaW4gRGVjcmVlIDE3MDUvMjAwOCkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5qdWp1eS5nb3YuYXIvaW5kZXgyL3BhcnRlc19wcmVuc2EvMThfMTBfMDgvMjM1LTE4MTAwOC5kb2MiPgorIyBQcmVzcyByZWxlYXNlIDIzNSBkYXRlZCBTYXR1cmRheSBPY3RvYmVyIDE4dGgsIGZyb20gdGhlIEdvdmVybm1lbnQgb2YgdGhlCisjIFByb3ZpbmNlIG9mIEp1anV5IHNheWluZyBpdCB3aWxsIG5vdCBhcHBseSBEU1QgZWl0aGVyIChldmVuIHdoZW4gaXQgd2FzIG5vdAorIyBpbmNsdWRlZCBpbiBEZWNyZWUgMTcwNS8yMDA4KS4KICMgaHR0cDovL3d3dy5qdWp1eS5nb3YuYXIvaW5kZXgyL3BhcnRlc19wcmVuc2EvMThfMTBfMDgvMjM1LTE4MTAwOC5kb2MKLSMgPC9hPgogCiAjIEZyb20gZnVsbGluZXQgKDIwMDktMTAtMTgpOgogIyBBcyBhbm5vdW5jZWQgaW4KLSMgPGEgaGVmPSJodHRwOi8vd3d3LmFyZ2VudGluYS5nb2IuYXIvYXJnZW50aW5hL3BvcnRhbC9wYWdpbmFzLmRodG1sP3BhZ2luYT0zNTYiPgogIyBodHRwOi8vd3d3LmFyZ2VudGluYS5nb2IuYXIvYXJnZW50aW5hL3BvcnRhbC9wYWdpbmFzLmRodG1sP3BhZ2luYT0zNTYKLSMgPC9hPgotIyAoYW4gb2ZmaWNpYWwgLmdvYi5hcikgdW5kZXIgdGl0bGU6ICJTaW4gQ2FtYmlvIGRlIEhvcmEiIChlbmdsaXNoOiAiTm8gaG91ciBjaGFuZ2UiKQorIyAoYW4gb2ZmaWNpYWwgLmdvYi5hcikgdW5kZXIgdGl0bGU6ICJTaW4gQ2FtYmlvIGRlIEhvcmEiCisjIChFbmdsaXNoOiAiTm8gaG91ciBjaGFuZ2UiKS4KICMKLSMgIlBvciBlbCBtb21lbnRvLCBlbCBHb2JpZXJubyBOYWNpb25hbCByZXNvbHZpbyBubyBtb2RpZmljYXIgbGEgaG9yYQotIyBvZmljaWFsLCBkZWNpc2lvbiBxdWUgZXN0YWJhIGVuIGVzdHVkaW8gcGFyYSBzdSBpbXBsZW1lbnRhY2lvbiBlbAotIyBkb21pbmdvIDE4IGRlIG9jdHVicmUuIERlc2RlIGVsIE1pbmlzdGVyaW8gZGUgUGxhbmlmaWNhY2lvbiBzZSBhbnVuY2lvCi0jIHF1ZSBsYSBBcmdlbnRpbmEgaG95LCBlbiBlc3RhcyBjb25kaWNpb25lcyBtZXRlb3JvbG9naWNhcywgbm8gbmVjZXNpdGEKLSMgbGEgbW9kaWZpY2FjaW9uIGRlbCBodXNvIGhvcmFyaW8sIHlhIHF1ZSAyMDA5IG5vcyBlbmN1ZW50cmEgY29uCi0jIGNyZWNpbWllbnRvIGVuIGxhIHByb2R1Y2Npb24geSBkaXN0cmlidWNpb24gZW5lcmdldGljYS4iCisjICJQb3IgZWwgbW9tZW50bywgZWwgR29iaWVybm8gTmFjaW9uYWwgcmVzb2x2acOzIG5vIG1vZGlmaWNhciBsYSBob3JhCisjIG9maWNpYWwsIGRlY2lzacOzbiBxdWUgZXN0YWJhIGVuIGVzdHVkaW8gcGFyYSBzdSBpbXBsZW1lbnRhY2nDs24gZWwKKyMgZG9taW5nbyAxOCBkZSBvY3R1YnJlLiBEZXNkZSBlbCBNaW5pc3RlcmlvIGRlIFBsYW5pZmljYWNpw7NuIHNlIGFudW5jacOzCisjIHF1ZSBsYSBBcmdlbnRpbmEgaG95LCBlbiBlc3RhcyBjb25kaWNpb25lcyBtZXRlb3JvbMOzZ2ljYXMsIG5vIG5lY2VzaXRhCisjIGxhIG1vZGlmaWNhY2nDs24gZGVsIGh1c28gaG9yYXJpbywgeWEgcXVlIDIwMDkgbm9zIGVuY3VlbnRyYSBjb24KKyMgY3JlY2ltaWVudG8gZW4gbGEgcHJvZHVjY2nDs24geSBkaXN0cmlidWNpw7NuIGVuZXJnw6l0aWNhLiIKIAogUnVsZQlBcmcJMjAwNwlvbmx5CS0JRGVjCTMwCTA6MDAJMTowMAlTCiBSdWxlCUFyZwkyMDA4CTIwMDkJLQlNYXIJU3VuPj0xNQkwOjAwCTAJLQpAQCAtMjY3LDEwICsyNTEsMTAgQEAKICMgSXQncyBMYXcgTm8uIDcsMjEwLiAgVGhpcyBjaGFuZ2UgaXMgZHVlIHRvIGEgcHVibGljIHBvd2VyIGVtZXJnZW5jeSwgc28gZm9yCiAjIG5vdyB3ZSdsbCBhc3N1bWUgaXQncyBmb3IgdGhpcyB5ZWFyIG9ubHkuCiAjCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNwaWNhc2MubmV0L2hvcnZlcmEuaHRtbCI+Ci0jIEhvcmEgZGUgdmVyYW5vIHBhcmEgbGEgUmVwdWJsaWNhIEFyZ2VudGluYSAoMjAwMy0wNi0wOCkKLSMgPC9hPiBzYXlzIHRoYXQgc3RhbmRhcmQgdGltZSBpbiBBcmdlbnRpbmEgZnJvbSAxODk0LTEwLTMxCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDgtMDkpOgorIyBIb3JhIGRlIHZlcmFubyBwYXJhIGxhIFJlcMO6YmxpY2EgQXJnZW50aW5hCisjIGh0dHA6Ly9idWVuYXNpZW1icmEuY29tLmFyL2Vzb3RlcmlzbW8vYXN0cm9sb2dpYS9ob3JhLWRlLXZlcmFuby1kZS1sYS1yZXB1YmxpY2EtYXJnZW50aW5hLTI3Lmh0bWwKKyMgc2F5cyB0aGF0IHN0YW5kYXJkIHRpbWUgaW4gQXJnZW50aW5hIGZyb20gMTg5NC0xMC0zMQogIyB0byAxOTIwLTA1LTAxIHdhcyAtNDoxNjo0OC4yNS4gIEdvIHdpdGggdGhpcyBtb3JlLXByZWNpc2UgdmFsdWUKICMgb3ZlciBTaGFua3MgJiBQb3R0ZW5nZXIuCiAjCkBAIC0yODUsMTAgKzI2OSwxMCBAQAogIyB0aW1lIGluIE9jdG9iZXIgMTd0aC4KICMKICMgQ2F0YW1hcmNhLCBDaHVidXQsIExhIFJpb2phLCBTYW4gSnVhbiwgU2FuIEx1aXMsIFNhbnRhIENydXosCi0jIFRpZXJyYSBkZWwgRnVlZ28sIFR1Y3VtYW4uCisjIFRpZXJyYSBkZWwgRnVlZ28sIFR1Y3Vtw6FuLgogIwogIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA0LTA2LTE0KToKLSMgLi4uIHRoaXMgd2Vla2VuZCwgdGhlIFByb3ZpbmNlIG9mIFR1Y3VtYW4gZGVjaWRlZCBpdCdkIGdvIGJhY2sgdG8gVVRDLTAzOjAwCisjIC4uLiB0aGlzIHdlZWtlbmQsIHRoZSBQcm92aW5jZSBvZiBUdWN1bcOhbiBkZWNpZGVkIGl0J2QgZ28gYmFjayB0byBVVEMtMDM6MDAKICMgeWVzdGVyZGF5IG1pZG5pZ2h0ICh0aGF0IGlzLCBhdCAyNDowMCBTYXR1cmRheSAxMnRoKSwgc2luY2UgdGhlIHBlb3BsZSdzCiAjIGFubm95YW5jZSB3aXRoIHRoZSBjaGFuZ2UgaXMgbXVjaCBoaWdoZXIgdGhhbiB0aGUgcG93ZXIgc2F2aW5ncyBvYnRhaW5lZC4uLi4KICMKQEAgLTMyMyw0OSArMzA3LDM4IEBACiAjIEhlcmUgYXJlIGFydGljbGVzIHRoYXQgQXJnZW50aW5hIFByb3ZpbmNlIFNhbiBMdWlzIGlzIHBsYW5uaW5nIHRvIGVuZCBEU1QKICMgYXMgZWFybGllciBhcyB1cGNvbWluZyBNb25kYXkgSmFudWFyeSAyMSwgMjAwOCBvciBGZWJydWFyeSAyMDA4OgogIwotIyBQcm92aW5jaWEgYXJnZW50aW5hIHJldHJhc2EgcmVsb2ogeSBtYXJjYSBkaWZlcmVuY2lhIGNvbiByZXN0byBkZWwgcGFpcworIyBQcm92aW5jaWEgYXJnZW50aW5hIHJldHJhc2EgcmVsb2ogeSBtYXJjYSBkaWZlcmVuY2lhIGNvbiByZXN0byBkZWwgcGHDrXMKICMgKEFyZ2VudGluZSBQcm92aW5jZSBkZWxheWVkIGNsb2NrIGFuZCBtYXJrIGRpZmZlcmVuY2Ugd2l0aCB0aGUgcmVzdCBvZiB0aGUKICMgY291bnRyeSkKLSMgPGEgaHJlZj0iaHR0cDovL2NsLmludmVydGlhLmNvbS9ub3RpY2lhcy9ub3RpY2lhLmFzcHg/aWROb3RpY2lhPTIwMDgwMTE3MTg0OV9FRkVfRVQ0MzczJmlkdGVsIj4KICMgaHR0cDovL2NsLmludmVydGlhLmNvbS9ub3RpY2lhcy9ub3RpY2lhLmFzcHg/aWROb3RpY2lhPTIwMDgwMTE3MTg0OV9FRkVfRVQ0MzczJmlkdGVsCi0jIDwvYT4KICMKICMgRXMgaW5taW5lbnRlIHF1ZSBlbiBTYW4gTHVpcyBhdHJhc2VuIHVuYSBob3JhIGxvcyByZWxvamVzCiAjIChJdCBpcyBpbW1pbmVudCBpbiBTYW4gTHVpcyBjbG9ja3Mgb25lIGhvdXIgZGVsYXkpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFnYWNldGEuY29tLmFyL3Zlcm5vdGFlLmFzcD9pZF9ub3RhPTI1MzQxNCI+Ci0jIGh0dHA6Ly93d3cubGFnYWNldGEuY29tLmFyL3Zlcm5vdGFlLmFzcD9pZF9ub3RhPTI1MzQxNAotIyA8L2E+Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDIuaHRtbCI+CisjIGh0dHA6Ly93d3cubGFnYWNldGEuY29tLmFyL25vdGEvMjUzNDE0L0Vjb25vbWlhL0VzLWlubWluZW50ZS1xdWUtZW4tU2FuLUx1aXMtYXRyYXNlbi11bmEtaG9yYS1sb3MtcmVsb2plcy5odG1sCiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDIuaHRtbAotIyA8L2E+CiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMTgpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMTgpOgogIyBUaGUgcGFnZSBvZiB0aGUgU2FuIEx1aXMgcHJvdmluY2lhbCBnb3Zlcm5tZW50Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9MCZpZD0yMjgxMiI+CiAjIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9MCZpZD0yMjgxMgotIyA8L2E+CiAjIGNvbmZpcm1zIHdoYXQgQWxleCBLcml2ZW55c2hldiBoYXMgZWFybGllciBzZW50IHRvIHRoZSB0egogIyBlbWFpbGluZyBsaXN0IGFib3V0IHRoYXQgU2FuIEx1aXMgcGxhbnMgdG8gcmV0dXJuIHRvIHN0YW5kYXJkCiAjIHRpbWUgbXVjaCBlYXJsaWVyIHRoYW4gdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnkuIEl0IGFsc28KICMgY29uZmlybXMgdGhhdCB1cG9uIHJlcXVlc3QgdGhlIHByb3ZpbmNlcyBTYW4gSnVhbiBhbmQgTWVuZG96YQogIyByZWZ1c2VkIHRvIGZvbGxvdyBTYW4gTHVpcyBpbiB0aGlzIGNoYW5nZS4KICMKLSMgVGhlIGNoYW5nZSBpcyBzdXBwb3NlZCB0byB0YWtlIHBsYWNlIE1vbmRheSB0aGUgMjEuc3QgYXQgMDowMAorIyBUaGUgY2hhbmdlIGlzIHN1cHBvc2VkIHRvIHRha2UgcGxhY2UgTW9uZGF5IHRoZSAyMXN0IGF0IDA6MDAKICMgaG91cnMuIEFzIGZhciBhcyBJIHVuZGVyc3RhbmQgaXQgaWYgdGhpcyBnb2VzIGFoZWFkLCB3ZSBuZWVkCiAjIGEgbmV3IHRpbWV6b25lIGZvciBTYW4gTHVpcyAoYWx0aG91Z2ggdGhlcmUgYXJlIGFsc28gZG9jdW1lbnRlZAogIyBpbmRlcGVuZGVudCBjaGFuZ2VzIGluIHRoZSBzb3V0aGFtZXJpY2EgZmlsZSBvZiBTYW4gTHVpcyBpbgogIyAxOTkwIGFuZCAxOTkxIHdoaWNoIGhhcyBub3QgYmVlbiBjb25maXJtZWQpLgogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA4LTAxLTI1KToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA4LTAxLTI1KToKICMgVW5mb3J0dW5hdGVseSB0aGUgYmVsb3cgcGFnZSBoYXMgYmVjb21lIGRlZnVuY3QsIGFib3V0IHRoZSBTYW4gTHVpcwogIyB0aW1lIGNoYW5nZS4gUGVyaGFwcyBiZWNhdXNlIGl0IG5vdyBpcyBwYXJ0IG9mIGEgZ3JvdXAgb2YgcGFnZXMgIk1vc3QKICMgaW1wb3J0YW50IHBhZ2VzIG9mIDIwMDguIgogIwogIyBZb3UgY2FuIHVzZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmx1aXMuZ292LmFyL25vdGFzLmFzcD9pZENhbmFsPTgxNDEmaWQ9MjI4MzQiPgogIyBodHRwOi8vd3d3LnNhbmx1aXMuZ292LmFyL25vdGFzLmFzcD9pZENhbmFsPTgxNDEmaWQ9MjI4MzQKLSMgPC9hPgogIyBpbnN0ZWFkIGl0IHNlZW1zLiBPciB1c2UgIkJ1c2NhZG9yIiBmcm9tIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIFNhbiBMdWlzCiAjIGdvdmVybm1lbnQsIGFuZCBmaWxsIGluICJodXNvIiBhbmQgY2xpY2sgT0ssIGFuZCB5b3Ugd2lsbCBnZXQgMyBwYWdlcwogIyBmcm9tIHdoaWNoIHRoZSBmaXJzdCBvbmUgaXMgaWRlbnRpY2FsIHRvIHRoZSBhYm92ZS4KQEAgLTM4NSw5ICszNTgsOSBAQAogIyBiYWNrIGluIDIwMDQsIHdoZW4gdGhlc2UgcHJvdmluY2VzIGNoYW5nZWQgdG8gVVRDLTQgZm9yIGEgZmV3IGRheXMsIEkKICMgbWFpbGVkIHRoZW0gcGVyc29uYWxseSBhbmQgbmV2ZXIgZ290IGFuIGFuc3dlcikuCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwOC0wNi0zMCk6Ci0jIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCBkYXRhIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlciB0aHJvdWdoIDE5OTIsCi0jIGZyb20gdGhlIElBVEEgb3RoZXJ3aXNlLiAgQXMgbm90ZWQgYmVsb3csIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdAorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA4LTEyKToKKyMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGRhdGEgZW50cmllcyBhcmUgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIgdGhyb3VnaAorIyAxOTkyLCBmcm9tIHRoZSBJQVRBIG90aGVyd2lzZS4gIEFzIG5vdGVkIGJlbG93LCBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQKICMgQW1lcmljYS9Db3Jkb2JhIHNwbGl0IGludG8gNiBzdWJyZWdpb25zIGR1cmluZyAxOTkxLzE5OTIsIG9uZSBvZiB3aGljaAogIyB3YXMgQW1lcmljYS9TYW5fTHVpcywgYnV0IHdlIGhhdmVuJ3QgdmVyaWZpZWQgdGhpcyB5ZXQgc28gZm9yIG5vdyB3ZSdsbAogIyBrZWVwIEFtZXJpY2EvQ29yZG9iYSBhIHNpbmdsZSByZWdpb24gcmF0aGVyIHRoYW4gc3BsaXR0aW5nIGl0IGludG8gdGhlCkBAIC0zOTksMTQgKzM3Miw5IEBACiAjIHRvIHV0Yy0wNDowMCB1bnRpbCB0aGUgc2Vjb25kIFNhdHVyZGF5IGluIE9jdG9iZXIuLi4KICMKICMgVGhlIHByZXNzIHJlbGVhc2UgaXMgYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9TTC9QYWdpbmFzL05vdGljaWFEZXRhbGxlLmFzcD9UZW1hSWQ9MSZJbmZvUHJlbnNhSWQ9MzEwMiI+CiAjIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvU0wvUGFnaW5hcy9Ob3RpY2lhRGV0YWxsZS5hc3A/VGVtYUlkPTEmSW5mb1ByZW5zYUlkPTMxMDIKLSMgPC9hPgotIyAoSSBjb3VsZG4ndCBmaW5kIHRoZSBkZWNyZWUsIGJ1dAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmx1aXMuZ292LmFyIj4KLSMgd3d3LnNhbmx1aXMuZ292LmFyCi0jIDxhLz4KLSMgaXMgdGhlIG9mZmljaWFsIHBhZ2UgZm9yIHRoZSBQcm92aW5jZSBHb3Zlcm5tZW50KS4KKyMgKEkgY291bGRuJ3QgZmluZCB0aGUgZGVjcmVlLCBidXQgd3d3LnNhbmx1aXMuZ292LmFyCisjIGlzIHRoZSBvZmZpY2lhbCBwYWdlIGZvciB0aGUgUHJvdmluY2UgR292ZXJubWVudC4pCiAjCiAjIFRoZXJlJ3MgYWxzbyBhIG5vdGUgaW4gb25seSBvbmUgb2YgdGhlIG1ham9yIG5hdGlvbmFsIHBhcGVycyAuLi4KICMgaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvbm90YS5hc3A/bm90YV9pZD0xMTA3OTEyCkBAIC00MjMsOSArMzkxLDcgQEAKICMgLi4udGhlIFByb3ZpbmNlIG9mIFNhbiBMdWlzIGlzIGEgY2FzZSBpbiBpdHNlbGYuCiAjCiAjIFRoZSBMYXcgYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5kaXB1dGFkb3NzYW5sdWlzLmdvdi5hci9kaXB1dGFkb3Nhc3AvcGFnaW5hcy92ZXJOb3JtYS5hc3A/Tm9ybWFJRD0yNzY+IgogIyBodHRwOi8vd3d3LmRpcHV0YWRvc3Nhbmx1aXMuZ292LmFyL2RpcHV0YWRvc2FzcC9wYWdpbmFzL3Zlck5vcm1hLmFzcD9Ob3JtYUlEPTI3NgotIyA8L2E+CiAjIGlzIGFtYmlndW91cyBiZWNhdXNlIGVzdGFibGlzaGVzIGEgY2FsZW5kYXIgZnJvbSB0aGUgMm5kIFN1bmRheSBpbgogIyBPY3RvYmVyIGF0IDA6MDAgdGhydSB0aGUgMm5kIFNhdHVyZGF5IGluIE1hcmNoIGF0IDI0OjAwIGFuZCB0aGUKICMgY29tcGxlbWVudCBvZiB0aGF0IHN0YXJ0aW5nIG9uIHRoZSAybmQgU3VuZGF5IG9mIE1hcmNoIGF0IDA6MDAgYW5kCkBAIC00NTQsMTkgKzQyMCwxNSBAQAogIyAuLi4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMC0wNC0wOSk6Ci0jIEFjY29yZGluZyB0byBuZXdzIHJlcG9ydHMgZnJvbSBFbCBEaWFyaW8gZGUgbGEgUmVwdWJsaWNhIFByb3ZpbmNlIFNhbgorIyBBY2NvcmRpbmcgdG8gbmV3cyByZXBvcnRzIGZyb20gRWwgRGlhcmlvIGRlIGxhIFJlcMO6YmxpY2EgUHJvdmluY2UgU2FuCiAjIEx1aXMsIEFyZ2VudGluYSAoc3RhbmRhcmQgdGltZSBVVEMtMDQpIHdpbGwga2VlcCBEYXlsaWdodCBTYXZpbmcgVGltZQotIyBhZnRlciBBcHJpbCAxMSwgMjAxMC0td2lsbCBjb250aW51ZSB0byBoYXZlIHNhbWUgdGltZSBhcyByZXN0IG9mCisjIGFmdGVyIEFwcmlsIDExLCAyMDEwIC0gd2lsbCBjb250aW51ZSB0byBoYXZlIHNhbWUgdGltZSBhcyByZXN0IG9mCiAjIEFyZ2VudGluYSAoVVRDLTMpIChubyBEU1QpLgogIwotIyBDb25maXJtYXJvbiBsYSBwciZvYWN1dGU7cnJvZ2EgZGVsIGh1c28gaG9yYXJpbyBkZSB2ZXJhbm8gKFNwYW5pc2gpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWxkaWFyaW9kZWxhcmVwdWJsaWNhLmNvbS9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0yOTM4MyZJdGVtaWQ9OSI+CisjIENvbmZpcm1hcm9uIGxhIHByw7Nycm9nYSBkZWwgaHVzbyBob3JhcmlvIGRlIHZlcmFubyAoU3BhbmlzaCkKICMgaHR0cDovL3d3dy5lbGRpYXJpb2RlbGFyZXB1YmxpY2EuY29tL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTI5MzgzJkl0ZW1pZD05Ci0jIDwvYT4KICMgb3IgKHNvbWUgRW5nbGlzaCB0cmFuc2xhdGlvbik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDguaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDguaHRtbAotIyA8L2E+CiAKICMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAxMC0wNC0xMik6CiAjIHllcy4uLkkgY2FuIGNvbmZpcm0gdGhpcy4uLmFuZCBnaXZlbiB0aGF0IFNhbiBMdWlzIGtlZXBzIGNhbGxpbmcKQEAgLTQ3OCw3ICs0NDAsNyBAQAogIyBQZXJoYXBzIFNhbiBMdWlzIG9wZXJhdGVzIG9uIHRoZSBsZWdhbCBmaWN0aW9uIHRoYXQgaXQgaXMgYXQgVVRDLTQKICMgd2l0aCBwZXJwZXR1YWwgc3VtbWVyIHRpbWUsIGJ1dCBvcmRpbmFyeSB1c2FnZSB0eXBpY2FsbHkgc2VlbXMgdG8KICMganVzdCBzYXkgaXQncyBhdCBVVEMtMzsgc2VlLCBmb3IgZXhhbXBsZSwKLSMgPGh0dHA6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvSG9yYV9vZmljaWFsX2FyZ2VudGluYT4uCisjIGh0dHA6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvSG9yYV9vZmljaWFsX2FyZ2VudGluYQogIyBXZSd2ZSBkb2N1bWVudGVkIHNpbWlsYXIgc2l0dWF0aW9ucyBhcyBiZWluZyBwbGFpbiBjaGFuZ2VzIHRvCiAjIHN0YW5kYXJkIHRpbWUsIHNvIGxldCdzIGRvIHRoYXQgaGVyZSB0b28uICBUaGlzIGRvZXMgbm90IGNoYW5nZSBVVEMKICMgb2Zmc2V0cywgb25seSB0bV9pc2RzdCBhbmQgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zLiAgT25lIG1pbm9yCkBAIC00ODYsMjAgKzQ0OCwyMCBAQAogIyBzZXR0aW5nIGZvciB0aW1lIHN0YW1wcyBwYXN0IDIwMzguCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0wMi0yMSk6Ci0jIE1pbG5lIHNheXMgQ29yZG9iYSB0aW1lIHdhcyAtNDoxNjo0OC4yLiAgUm91bmQgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kLgorIyBNaWxuZSBzYXlzIEPDs3Jkb2JhIHRpbWUgd2FzIC00OjE2OjQ4LjIuICBSb3VuZCB0byB0aGUgbmVhcmVzdCBzZWNvbmQuCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KICMKICMgQnVlbm9zIEFpcmVzIChCQSksIENhcGl0YWwgRmVkZXJhbCAoQ0YpLAotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXMgLTM6NTM6NDggLSBMTVQgMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5ICMgQ29yZG9iYSBNZWFuIFRpbWUKK1pvbmUgQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzIC0zOjUzOjQ4IC0gTE1UCTE4OTQgT2N0IDMxCisJCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heSAgICAjIEPDs3Jkb2JhIE1lYW4gVGltZQogCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKIAkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQogCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCiAJCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKIAkJCS0zOjAwCUFyZwlBUiVzVAogIwotIyBDb3Jkb2JhIChDQiksIFNhbnRhIEZlIChTRiksIEVudHJlIFJpb3MgKEVSKSwgQ29ycmllbnRlcyAoQ04pLCBNaXNpb25lcyAoTU4pLAorIyBDw7NyZG9iYSAoQ0IpLCBTYW50YSBGZSAoU0YpLCBFbnRyZSBSw61vcyAoRVIpLCBDb3JyaWVudGVzIChDTiksIE1pc2lvbmVzIChNTiksCiAjIENoYWNvIChDQyksIEZvcm1vc2EgKEZNKSwgU2FudGlhZ28gZGVsIEVzdGVybyAoU0UpCiAjCiAjIFNoYW5rcyAmIFBvdHRlbmdlciBhbHNvIG1ha2UgdGhlIGZvbGxvd2luZyBjbGFpbXMsIHdoaWNoIHdlIGhhdmVuJ3QgdmVyaWZpZWQ6CkBAIC01MTksNyArNDgxLDcgQEAKIAkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwogCQkJLTM6MDAJQXJnCUFSJXNUCiAjCi0jIFNhbHRhIChTQSksIExhIFBhbXBhIChMUCksIE5ldXF1ZW4gKE5RKSwgUmlvIE5lZ3JvIChSTikKKyMgU2FsdGEgKFNBKSwgTGEgUGFtcGEgKExQKSwgTmV1cXXDqW4gKE5RKSwgUmlvIE5lZ3JvIChSTikKIFpvbmUgQW1lcmljYS9BcmdlbnRpbmEvU2FsdGEgLTQ6MjE6NDAgLSBMTVQJMTg5NCBPY3QgMzEKIAkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5CiAJCQktNDowMAktCUFSVAkxOTMwIERlYwpAQCAtNTMxLDcgKzQ5Myw3IEBACiAJCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKIAkJCS0zOjAwCS0JQVJUCiAjCi0jIFR1Y3VtYW4gKFRNKQorIyBUdWN1bcOhbiAoVE0pCiBab25lIEFtZXJpY2EvQXJnZW50aW5hL1R1Y3VtYW4gLTQ6MjA6NTIgLSBMTVQJMTg5NCBPY3QgMzEKIAkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5CiAJCQktNDowMAktCUFSVAkxOTMwIERlYwpAQCAtNjQyLDggKzYwNCw4IEBACiAJCQktMzowMAktCUFSVAogIwogIyBTYW50YSBDcnV6IChTQykKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvUmlvX0dhbGxlZ29zIC00OjM2OjUyIC0gTE1UIDE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heSAjIENvcmRvYmEgTWVhbiBUaW1lCitab25lIEFtZXJpY2EvQXJnZW50aW5hL1Jpb19HYWxsZWdvcyAtNDozNjo1MiAtIExNVAkxODk0IE9jdCAzMQorCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkgICAgIyBDw7NyZG9iYSBNZWFuIFRpbWUKIAkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCiAJCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKIAkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwpAQCAtNjUzLDkgKzYxNSw5IEBACiAJCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKIAkJCS0zOjAwCS0JQVJUCiAjCi0jIFRpZXJyYSBkZWwgRnVlZ28sIEFudGFydGlkYSBlIElzbGFzIGRlbCBBdGxhbnRpY28gU3VyIChURikKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvVXNodWFpYSAtNDozMzoxMiAtIExNVCAxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkgIyBDb3Jkb2JhIE1lYW4gVGltZQorIyBUaWVycmEgZGVsIEZ1ZWdvLCBBbnTDoXJ0aWRhIGUgSXNsYXMgZGVsIEF0bMOhbnRpY28gU3VyIChURikKK1pvbmUgQW1lcmljYS9BcmdlbnRpbmEvVXNodWFpYSAtNDozMzoxMiAtIExNVAkxODk0IE9jdCAzMQorCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkgICAgIyBDw7NyZG9iYSBNZWFuIFRpbWUKIAkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCiAJCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKIAkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwpAQCAtNjg2LDEzICs2NDgsMTMgQEAKIAogIyBGcm9tIElBVEEgU1NJTSAoMTk5Ni0wMik6CiAjIF9Pbmx5XyB0aGUgZm9sbG93aW5nIHN0YXRlcyBpbiBCUjEgb2JzZXJ2ZSBEU1Q6IFJpbyBHcmFuZGUgZG8gU3VsIChSUyksCi0jIFNhbnRhIENhdGFyaW5hIChTQyksIFBhcmFuYSAoUFIpLCBTYW8gUGF1bG8gKFNQKSwgUmlvIGRlIEphbmVpcm8gKFJKKSwKLSMgRXNwaXJpdG8gU2FudG8gKEVTKSwgTWluYXMgR2VyYWlzIChNRyksIEJhaGlhIChCQSksIEdvaWFzIChHTyksCisjIFNhbnRhIENhdGFyaW5hIChTQyksIFBhcmFuw6EgKFBSKSwgU8OjbyBQYXVsbyAoU1ApLCBSaW8gZGUgSmFuZWlybyAoUkopLAorIyBFc3DDrXJpdG8gU2FudG8gKEVTKSwgTWluYXMgR2VyYWlzIChNRyksIEJhaGlhIChCQSksIEdvacOhcyAoR08pLAogIyBEaXN0cml0byBGZWRlcmFsIChERiksIFRvY2FudGlucyAoVE8pLCBTZXJnaXBlIFtTRV0gYW5kIEFsYWdvYXMgW0FMXS4KICMgW1RoZSBsYXN0IHRocmVlIHN0YXRlcyBhcmUgbmV3IHRvIHRoaXMgaXNzdWUgb2YgdGhlIElBVEEgU1NJTS5dCiAKICMgRnJvbSBHd2lsbGltIExhdyAoMTk5Ni0xMC0wNyk6Ci0jIEdlb2dyYXBoeSwgaGlzdG9yeSAoVG9jYW50aW5zIHdhcyBwYXJ0IG9mIEdvaWFzIHVudGlsIDE5ODkpLCBhbmQgb3RoZXIKKyMgR2VvZ3JhcGh5LCBoaXN0b3J5IChUb2NhbnRpbnMgd2FzIHBhcnQgb2YgR29pw6FzIHVudGlsIDE5ODkpLCBhbmQgb3RoZXIKICMgc291cmNlcyBvZiB0aW1lIHpvbmUgaW5mb3JtYXRpb24gbGVhZCBtZSB0byBiZWxpZXZlIHRoYXQgQUwsIFNFLCBhbmQgVE8gd2VyZQogIyBhbHdheXMgaW4gQlIxLCBhbmQgc28gdGhlIG9ubHkgY2hhbmdlIHdhcyB3aGV0aGVyIG9yIG5vdCB0aGV5IG9ic2VydmVkIERTVC4uLi4KICMgVGhlIGVhcmxpZXN0IGlzc3VlIG9mIHRoZSBTU0lNIEkgaGF2ZSBpcyAyLzkxLiAgRWFjaCBpc3N1ZSBmcm9tIHRoZW4gdW50aWwKQEAgLTcwNiwxNiArNjY4LDE0IEBACiAjIEhvd2V2ZXIsIHNvbWUgY29uY2x1c2lvbnMgY2FuIGJlIGRyYXduIGZyb20gYW5vdGhlciBJQVRBIG1hbnVhbDogdGhlIEFpcmxpbmUKICMgQ29kaW5nIERpcmVjdG9yeSwgd2hpY2ggbGlzdHMgY2xvc2UgdG8gNDAwIGFpcnBvcnRzIGluIEJyYXppbC4gIEZvciBlYWNoCiAjIGFpcnBvcnQgaXQgZ2l2ZXMgYSB0aW1lIHpvbmUgd2hpY2ggaXMgY29kZWQgdG8gdGhlIFNTSU0uICBGcm9tIHRoYXQKLSMgaW5mb3JtYXRpb24sIEknbSBsZWQgdG8gY29uY2x1ZGUgdGhhdCB0aGUgc3RhdGVzIG9mIEFtYXBhIChBUCksIENlYXJhIChDRSksCi0jIE1hcmFuaGFvIChNQSksIFBhcmFpYmEgKFBSKSwgUGVybmFtYnVjbyAoUEUpLCBQaWF1aSAoUEkpLCBhbmQgUmlvIEdyYW5kZSBkbwotIyBOb3J0ZSAoUk4pLCBhbmQgdGhlIGVhc3Rlcm4gcGFydCBvZiBQYXJhIChQQSkgYXJlIGFsbCBpbiBCUjEgd2l0aG91dCBEU1QuCisjIGluZm9ybWF0aW9uLCBJJ20gbGVkIHRvIGNvbmNsdWRlIHRoYXQgdGhlIHN0YXRlcyBvZiBBbWFww6EgKEFQKSwgQ2VhcsOhIChDRSksCisjIE1hcmFuaMOjbyAoTUEpLCBQYXJhw61iYSAoUFIpLCBQZXJuYW1idWNvIChQRSksIFBpYXXDrSAoUEkpLCBhbmQgUmlvIEdyYW5kZSBkbworIyBOb3J0ZSAoUk4pLCBhbmQgdGhlIGVhc3Rlcm4gcGFydCBvZiBQYXLDoSAoUEEpIGFyZSBhbGwgaW4gQlIxIHdpdGhvdXQgRFNULgogCiAjIEZyb20gTWFyY29zIFRhZGV1ICgxOTk4LTA5LTI3KToKLSMgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvdmVyYW8xLmh0bWwiPgotIyBCcmF6aWxpYW4gb2ZmaWNpYWwgcGFnZQotIyA8L2E+CisjIEJyYXppbGlhbiBvZmZpY2lhbCBwYWdlIDxodHRwOi8vcGNkc2gwMS5vbi5ici92ZXJhbzEuaHRtbD4KIAotIyBGcm9tIEplc3BlciBOb3JnYWFyZCAoMjAwMC0xMS0wMyk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCAoMjAwMC0xMS0wMyk6CiAjIFtGb3IgYW4gb2ZmaWNpYWwgbGlzdCBvZiB3aGljaCByZWdpb25zIGluIEJyYXppbCB1c2Ugd2hpY2ggdGltZSB6b25lcywgc2VlOl0KICMgaHR0cDovL3BjZHNoMDEub24uYnIvRnVzYnIuaHRtCiAjIGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0Z1c2JyaHYuaHRtCkBAIC03NDgsMTMgKzcwOCwxMyBAQAogCiAjIEZyb20gUGF1bCBTY2h1bHplICgyMDA4LTA2LTI0KToKICMgLi4uYnkgbGF3IG51bWJlciAxMS42NjIgb2YgQXByaWwgMjQsIDIwMDggKHB1Ymxpc2hlZCBpbiB0aGUgIkRpYXJpbwotIyBPZmljaWFsIGRhIFVuaWFvIi4uLikgaW4gQnJhemlsIHRoZXJlIGFyZSBjaGFuZ2VzIGluIHRoZSB0aW1lem9uZXMsCisjIE9maWNpYWwgZGEgVW5pw6NvIi4uLikgaW4gQnJhemlsIHRoZXJlIGFyZSBjaGFuZ2VzIGluIHRoZSB0aW1lem9uZXMsCiAjIGVmZmVjdGl2ZSB0b2RheSAoMDA6MDBhbSBhdCBKdW5lIDI0LCAyMDA4KSBhcyBmb2xsb3dzOgogIwotIyBhKSBUaGUgdGltZXpvbmUgVVRDKzUgaXMgZVt4XXRpbmd1aXNoZWQsIHdpdGggYWxsIHRoZSBBY3JlIHN0YXRlIGFuZCB0aGUKKyMgYSkgVGhlIHRpbWV6b25lIFVUQys1IGlzIGV4dGluZ3Vpc2hlZCwgd2l0aCBhbGwgdGhlIEFjcmUgc3RhdGUgYW5kIHRoZQogIyBwYXJ0IG9mIHRoZSBBbWF6b25hcyBzdGF0ZSB0aGF0IGhhZCB0aGlzIHRpbWV6b25lIG5vdyBiZWluZyBwdXQgdG8gdGhlCiAjIHRpbWV6b25lIFVUQys0Ci0jIGIpIFRoZSB3aG9sZSBQYXJhIHN0YXRlIG5vdyBpcyBwdXQgYXQgdGltZXpvbmUgVVRDKzMsIGluc3RlYWQgb2YganVzdAorIyBiKSBUaGUgd2hvbGUgUGFyw6Egc3RhdGUgbm93IGlzIHB1dCBhdCB0aW1lem9uZSBVVEMrMywgaW5zdGVhZCBvZiBqdXN0CiAjIHBhcnQgb2YgaXQsIGFzIHdhcyBiZWZvcmUuCiAjCiAjIFRoaXMgY2hhbmdlIGZvbGxvd3MgYSBwcm9wb3NhbCBvZiBzZW5hdG9yIFRpYW8gVmlhbmEgb2YgQWNyZSBzdGF0ZSwgdGhhdApAQCAtNzY3LDEzICs3MjcsMTEgQEAKIAogIyBGcm9tIFJvZHJpZ28gU2V2ZXJvICgyMDA4LTA2LTI0KToKICMgSnVzdCBjb3JyZWN0aW5nIHRoZSBVUkw6Ci0jIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmluLmdvdi5ici9pbXByZW5zYS92aXN1YWxpemEvaW5kZXguanNwP2pvcm5hbD1kbyZzZWNhbz0xJnBhZ2luYT0xJmRhdGE9MjUvMDQvMjAwOCI+CiAjIGh0dHBzOi8vd3d3LmluLmdvdi5ici9pbXByZW5zYS92aXN1YWxpemEvaW5kZXguanNwP2pvcm5hbD1kbyZzZWNhbz0xJnBhZ2luYT0xJmRhdGE9MjUvMDQvMjAwOAotIyA8L2E+CiAjCiAjIEFzIGEgcmVzdWx0IG9mIHRoZSBhYm92ZSBEZWNyZWUgSSBiZWxpZXZlIHRoZSBBbWVyaWNhL1Jpb19CcmFuY28KICMgdGltZXpvbmUgc2hhbGwgYmUgbW9kaWZpZWQgZnJvbSBVVEMtNSB0byBVVEMtNCBhbmQgYSBuZXcgdGltZXpvbmUgc2hhbGwKLSMgYmUgY3JlYXRlZCB0byByZXByZXNlbnQgdGhlLi4ud2VzdCBzaWRlIG9mIHRoZSBQYXJhIFN0YXRlLiBJCisjIGJlIGNyZWF0ZWQgdG8gcmVwcmVzZW50IHRoZS4uLndlc3Qgc2lkZSBvZiB0aGUgUGFyw6EgU3RhdGUuIEkKICMgc3VnZ2VzdCB0aGlzIG5ldyB0aW1lem9uZSBiZSBjYWxsZWQgU2FudGFyZW0gYXMgdGhlIG1vc3QKICMgaW1wb3J0YW50L3BvcHVsYXRlZCBjaXR5IGluIHRoZSBhZmZlY3RlZCBhcmVhLgogIwpAQCAtNzgyLDE5ICs3NDAsMTYgQEAKIAogIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDYtMjQpOgogIyBUaGlzIGlzIGEgcXVpY2sgcmVmZXJlbmNlIHBhZ2UgZm9yIE5ldyBhbmQgT2xkIEJyYXppbCBUaW1lIFpvbmVzIG1hcC4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9icmF6aWwtdGltZS1uZXctb2xkLnBocCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vYnJhemlsLXRpbWUtbmV3LW9sZC5waHAKLSMgPC9hPgogIwotIyAtIDQgdGltZSB6b25lcyByZXBsYWNlZCBieSAzIHRpbWUgem9uZXMtZWxpbWluYXRpbmcgdGltZSB6b25lIFVUQy0gMDUKLSMgKHN0YXRlIEFjcmUgYW5kIHRoZSBwYXJ0IG9mIHRoZSBBbWF6b25hcyB3aWxsIGJlIFVUQy9HTVQtIDA0KSAtIHdlc3Rlcm4KLSMgcGFydCBvZiBQYXIgc3RhdGUgaXMgbW92aW5nIHRvIG9uZSB0aW1lem9uZSBVVEMtIDAzIChmcm9tIFVUQyAtMDQpLgorIyAtIDQgdGltZSB6b25lcyByZXBsYWNlZCBieSAzIHRpbWUgem9uZXMgLSBlbGltaW5hdGluZyB0aW1lIHpvbmUgVVRDLTA1CisjIChzdGF0ZSBBY3JlIGFuZCB0aGUgcGFydCBvZiB0aGUgQW1hem9uYXMgd2lsbCBiZSBVVEMvR01ULTA0KSAtIHdlc3Rlcm4KKyMgcGFydCBvZiBQYXIgc3RhdGUgaXMgbW92aW5nIHRvIG9uZSB0aW1lem9uZSBVVEMtMDMgKGZyb20gVVRDLTA0KS4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAyLTEwLTEwKToKICMgVGhlIG9mZmljaWFsIGRlY3JlZXMgcmVmZXJlbmNlZCBiZWxvdyBhcmUgbW9zdGx5IHRha2VuIGZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFYuaHRtbCI+Ci0jIERlY3JldG9zIHNvYnJlIG8gSG9yYXJpbyBkZSBWZXJhbyBubyBCcmFzaWwKLSMgPC9hPi4KKyMgRGVjcmV0b3Mgc29icmUgbyBIb3LDoXJpbyBkZSBWZXLDo28gbm8gQnJhc2lsLgorIyBodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVi5odG1sCiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDgtMjkpOgogIyBBcyBhbm5vdW5jZWQgYnkgdGhlIGdvdmVybm1lbnQgYW5kIG1hbnkgbmV3c3BhcGVycyBpbiBCcmF6aWwgbGF0ZQpAQCAtODA2LDI1ICs3NjEsMTcgQEAKICMgSXQgaGFzIG5vdCB5ZXQgYmVlbiBwb3N0ZWQgdG8gaHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFYuaHRtbAogIwogIyBBbiBvZmZpY2lhbCBwYWdlIGFib3V0IGl0OgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1tZS5nb3YuYnIvc2l0ZS9uZXdzL2RldGFpbC5kbz9uZXdzSWQ9MTY3MjIiPgogIyBodHRwOi8vd3d3Lm1tZS5nb3YuYnIvc2l0ZS9uZXdzL2RldGFpbC5kbz9uZXdzSWQ9MTY3MjIKLSMgPC9hPgogIyBOb3RlIHRoYXQgdGhpcyBsaW5rIGRvZXMgbm90IGFsd2F5cyB3b3JrIGRpcmVjdGx5LCBidXQgbXVzdCBiZSBhY2Nlc3NlZAogIyBieSBnb2luZyB0bwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1tZS5nb3YuYnIvZmlyc3QiPgogIyBodHRwOi8vd3d3Lm1tZS5nb3YuYnIvZmlyc3QKLSMgPC9hPgogIwogIyBPbmUgZXhhbXBsZSBsaW5rIHRoYXQgd29ya3MgZGlyZWN0bHk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9qb3JuYWxlLmNvbS5ici9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0xMzUzMCZJdGVtaWQ9NTQiPgogIyBodHRwOi8vam9ybmFsZS5jb20uYnIvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MTM1MzAmSXRlbWlkPTU0CiAjIChQb3J0dWd1ZXNlKQotIyA8L2E+CiAjCiAjIFdlIGhhdmUgYSB3cml0dGVuIGEgc2hvcnQgYXJ0aWNsZSBhYm91dCBpdCBhcyB3ZWxsOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvYnJhemlsLWRzdC0yMDA4LTIwMDkuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9icmF6aWwtZHN0LTIwMDgtMjAwOS5odG1sCi0jIDwvYT4KICMKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTEtMTAtMDQpOgogIyBTdGF0ZSBCYWhpYSB3aWxsIHJldHVybiB0byBEYXlsaWdodCBzYXZpbmdzIHRpbWUgdGhpcyB5ZWFyIGFmdGVyIDggeWVhcnMgb2ZmLgpAQCAtODMyLDE3ICs3NzksMTIgQEAKICMgdGVsZXZpc2lvbiBzdGF0aW9uIGluIFNhbHZhZG9yLgogCiAjIEluIFBvcnR1Z3Vlc2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9nMS5nbG9iby5jb20vYmFoaWEvbm90aWNpYS8yMDExLzEwL2dvdmVybmFkb3ItamFxdWVzLXdhZ25lci1jb25maXJtYS1ob3JhcmlvLWRlLXZlcmFvLW5hLWJhaGlhLmh0bWwiPgogIyBodHRwOi8vZzEuZ2xvYm8uY29tL2JhaGlhL25vdGljaWEvMjAxMS8xMC9nb3Zlcm5hZG9yLWphcXVlcy13YWduZXItY29uZmlybWEtaG9yYXJpby1kZS12ZXJhby1uYS1iYWhpYS5odG1sCi0jIDwvYT4gYW5kCi0jIDxhIGhyZWY9Imh0dHA6Ly9ub3RpY2lhcy50ZXJyYS5jb20uYnIvYnJhc2lsL25vdGljaWFzLzAsLE9JNTM5MDg4Ny1FSTgxMzksMDAtQmFoaWErdm9sdGErYSt0ZXIraG9yYXJpbytkZSt2ZXJhbythcG9zK29pdG8rYW5vcy5odG1sIj4KICMgaHR0cDovL25vdGljaWFzLnRlcnJhLmNvbS5ici9icmFzaWwvbm90aWNpYXMvMCwsT0k1MzkwODg3LUVJODEzOSwwMC1CYWhpYSt2b2x0YSthK3Rlcitob3JhcmlvK2RlK3ZlcmFvK2Fwb3Mrb2l0bythbm9zLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gR3VpbGhlcm1lIEJlcm5hcmRlcyBSb2RyaWd1ZXMgKDIwMTEtMTAtMDcpOgogIyBUaGVyZSBpcyBuZXdzIGluIHRoZSBtZWRpYSwgaG93ZXZlciB0aGVyZSBpcyBzdGlsbCBubyBkZWNyZWUgYWJvdXQgaXQuCi0jIEkganVzdCBzZW5kIGEgZS1tYWlsIHRvIFp1bG1pcmEgQnJhbmRhbyBhdAotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici8iPmh0dHA6Ly9wY2RzaDAxLm9uLmJyLzwvYT4gdGhlCisjIEkganVzdCBzZW5kIGEgZS1tYWlsIHRvIFp1bG1pcmEgQnJhbmRhbyBhdCBodHRwOi8vcGNkc2gwMS5vbi5ici8gdGhlCiAjIG9mZmljaWFsIGFnZW5jeSBhYm91dCB0aW1lIGluIEJyYXppbCwgYW5kIHNoZSBjb25maXJtZWQgdGhhdCB0aGUgb2xkIHJ1bGUgaXMKICMgc3RpbGwgaW4gZm9yY2UuCiAKQEAgLTg1NCw5ICs3OTYsNyBAQAogIwogIyBERUNSRVRPIE5vLSA3LjU4NCwgREUgMTMgREUgT1VUVUJSTyBERSAyMDExCiAjIExpbmsgOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmluLmdvdi5ici92aXN1YWxpemEvaW5kZXguanNwP2RhdGE9MTMvMTAvMjAxMSZqb3JuYWw9MTAwMCZwYWdpbmE9NiZ0b3RhbEFycXVpdm9zPTYiPgogIyBodHRwOi8vd3d3LmluLmdvdi5ici92aXN1YWxpemEvaW5kZXguanNwP2RhdGE9MTMvMTAvMjAxMSZqb3JuYWw9MTAwMCZwYWdpbmE9NiZ0b3RhbEFycXVpdm9zPTYKLSMgPC9hPgogCiAjIEZyb20gS2VsbGV5IENvb2sgKDIwMTItMTAtMTYpOgogIyBUaGUgZ292ZXJub3Igb2Ygc3RhdGUgb2YgQmFoaWEgaW4gQnJhemlsIGFubm91bmNlZCBvbiBUaHVyc2RheSB0aGF0CkBAIC04ODQsNDIgKzgyNCw0MiBAQAogIyBGb3Igbm93LCBhc3N1bWUgd2VzdGVybiBBbWF6b25hcyB3aWxsIGNoYW5nZSBhcyB3ZWxsLgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyMDQ2Ni5odG0iPjIwLDQ2NjwvYT4gKDE5MzEtMTAtMDEpCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIxODk2Lmh0bSI+MjEsODk2PC9hPiAoMTkzMi0wMS0xMCkKKyMgRGVjcmVlIDIwLDQ2NiA8aHR0cDovL3BjZHNoMDEub24uYnIvSFYyMDQ2Ni5odG0+ICgxOTMxLTEwLTAxKQorIyBEZWNyZWUgMjEsODk2IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIxODk2Lmh0bT4gKDE5MzItMDEtMTApCiBSdWxlCUJyYXppbAkxOTMxCW9ubHkJLQlPY3QJIDMJMTE6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTMyCTE5MzMJLQlBcHIJIDEJIDA6MDAJMAktCiBSdWxlCUJyYXppbAkxOTMyCW9ubHkJLQlPY3QJIDMJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIzMTk1Lmh0bSI+MjMsMTk1PC9hPiAoMTkzMy0xMC0xMCkKKyMgRGVjcmVlIDIzLDE5NSA8aHR0cDovL3BjZHNoMDEub24uYnIvSFYyMzE5NS5odG0+ICgxOTMzLTEwLTEwKQogIyByZXZva2VkIERTVC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjc0OTYuaHRtIj4yNyw0OTY8L2E+ICgxOTQ5LTExLTI0KQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyNzk5OC5odG0iPjI3LDk5ODwvYT4gKDE5NTAtMDQtMTMpCisjIERlY3JlZSAyNyw0OTYgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjc0OTYuaHRtPiAoMTk0OS0xMS0yNCkKKyMgRGVjcmVlIDI3LDk5OCA8aHR0cDovL3BjZHNoMDEub24uYnIvSFYyNzk5OC5odG0+ICgxOTUwLTA0LTEzKQogUnVsZQlCcmF6aWwJMTk0OQkxOTUyCS0JRGVjCSAxCSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk1MAlvbmx5CS0JQXByCTE2CSAxOjAwCTAJLQogUnVsZQlCcmF6aWwJMTk1MQkxOTUyCS0JQXByCSAxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYzMjMwOC5odG0iPjMyLDMwODwvYT4gKDE5NTMtMDItMjQpCisjIERlY3JlZSAzMiwzMDggPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMzIzMDguaHRtPiAoMTk1My0wMi0yNCkKIFJ1bGUJQnJhemlsCTE5NTMJb25seQktCU1hcgkgMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMzQ3MjQuaHRtIj4zNCw3MjQ8L2E+ICgxOTUzLTExLTMwKQorIyBEZWNyZWUgMzQsNzI0IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjM0NzI0Lmh0bT4gKDE5NTMtMTEtMzApCiAjIHJldm9rZWQgRFNULgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1MjcwMC5odG0iPjUyLDcwMDwvYT4gKDE5NjMtMTAtMTgpCisjIERlY3JlZSA1Miw3MDAgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTI3MDAuaHRtPiAoMTk2My0xMC0xOCkKICMgZXN0YWJsaXNoZWQgRFNUIGZyb20gMTk2My0xMC0yMyAwMDowMCB0byAxOTY0LTAyLTI5IDAwOjAwCiAjIGluIFNQLCBSSiwgR0IsIE1HLCBFUywgZHVlIHRvIHRoZSBwcm9sb25nYXRpb24gb2YgdGhlIGRyb3VnaHQuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjUzMDcxLmh0bSI+NTMsMDcxPC9hPiAoMTk2My0xMi0wMykKKyMgRGVjcmVlIDUzLDA3MSA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY1MzA3MS5odG0+ICgxOTYzLTEyLTAzKQogIyBleHRlbmRlZCB0aGUgYWJvdmUgZGVjcmVlIHRvIGFsbCBvZiB0aGUgbmF0aW9uYWwgdGVycml0b3J5IG9uIDEyLTA5LgogUnVsZQlCcmF6aWwJMTk2Mwlvbmx5CS0JRGVjCSA5CSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1MzYwNC5odG0iPjUzLDYwNDwvYT4gKDE5NjQtMDItMjUpCisjIERlY3JlZSA1Myw2MDQgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTM2MDQuaHRtPiAoMTk2NC0wMi0yNSkKICMgZXh0ZW5kZWQgc3VtbWVyIHRpbWUgYnkgb25lIGRheSB0byAxOTY0LTAzLTAxIDAwOjAwIChzdGFydCBvZiBzY2hvb2wpLgogUnVsZQlCcmF6aWwJMTk2NAlvbmx5CS0JTWFyCSAxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1NTYzOS5odG0iPjU1LDYzOTwvYT4gKDE5NjUtMDEtMjcpCisjIERlY3JlZSA1NSw2MzkgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTU2MzkuaHRtPiAoMTk2NS0wMS0yNykKIFJ1bGUJQnJhemlsCTE5NjUJb25seQktCUphbgkzMQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5NjUJb25seQktCU1hcgkzMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTczMDMuaHRtIj41NywzMDM8L2E+ICgxOTY1LTExLTIyKQorIyBEZWNyZWUgNTcsMzAzIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjU3MzAzLmh0bT4gKDE5NjUtMTEtMjIpCiBSdWxlCUJyYXppbAkxOTY1CW9ubHkJLQlEZWMJIDEJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjU3ODQzLmh0bSI+NTcsODQzPC9hPiAoMTk2Ni0wMi0xOCkKKyMgRGVjcmVlIDU3LDg0MyA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY1Nzg0My5odG0+ICgxOTY2LTAyLTE4KQogUnVsZQlCcmF6aWwJMTk2NgkxOTY4CS0JTWFyCSAxCSAwOjAwCTAJLQogUnVsZQlCcmF6aWwJMTk2NgkxOTY3CS0JTm92CSAxCSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY2MzQyOS5odG0iPjYzLDQyOTwvYT4gKDE5NjgtMTAtMTUpCisjIERlY3JlZSA2Myw0MjkgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNjM0MjkuaHRtPiAoMTk2OC0xMC0xNSkKICMgcmV2b2tlZCBEU1QuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjkxNjk4Lmh0bSI+OTEsNjk4PC9hPiAoMTk4NS0wOS0yNykKKyMgRGVjcmVlIDkxLDY5OCA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY5MTY5OC5odG0+ICgxOTg1LTA5LTI3KQogUnVsZQlCcmF6aWwJMTk4NQlvbmx5CS0JTm92CSAyCSAwOjAwCTE6MDAJUwogIyBEZWNyZWUgOTIsMzEwICgxOTg2LTAxLTIxKQogIyBEZWNyZWUgOTIsNDYzICgxOTg2LTAzLTEzKQpAQCAtOTI3LDQyICs4NjcsNDIgQEAKICMgRGVjcmVlIDkzLDMxNiAoMTk4Ni0xMC0wMSkKIFJ1bGUJQnJhemlsCTE5ODYJb25seQktCU9jdAkyNQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5ODcJb25seQktCUZlYgkxNAkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTQ5MjIuaHRtIj45NCw5MjI8L2E+ICgxOTg3LTA5LTIyKQorIyBEZWNyZWUgOTQsOTIyIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk0OTIyLmh0bT4gKDE5ODctMDktMjIpCiBSdWxlCUJyYXppbAkxOTg3CW9ubHkJLQlPY3QJMjUJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTg4CW9ubHkJLQlGZWIJIDcJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk2Njc2Lmh0bSI+OTYsNjc2PC9hPiAoMTk4OC0wOS0xMikKKyMgRGVjcmVlIDk2LDY3NiA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY5NjY3Ni5odG0+ICgxOTg4LTA5LTEyKQogIyBleGNlcHQgZm9yIHRoZSBzdGF0ZXMgb2YgQUMsIEFNLCBQQSwgUlIsIFJPLCBhbmQgQVAgKHRoZW4gYSB0ZXJyaXRvcnkpCiBSdWxlCUJyYXppbAkxOTg4CW9ubHkJLQlPY3QJMTYJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTg5CW9ubHkJLQlKYW4JMjkJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk4MDc3Lmh0bSI+OTgsMDc3PC9hPiAoMTk4OS0wOC0yMSkKKyMgRGVjcmVlIDk4LDA3NyA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY5ODA3Ny5odG0+ICgxOTg5LTA4LTIxKQogIyB3aXRoIHRoZSBzYW1lIGV4Y2VwdGlvbnMKIFJ1bGUJQnJhemlsCTE5ODkJb25seQktCU9jdAkxNQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5OTAJb25seQktCUZlYgkxMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTk1MzAuaHRtIj45OSw1MzA8L2E+ICgxOTkwLTA5LTE3KQorIyBEZWNyZWUgOTksNTMwIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk5NTMwLmh0bT4gKDE5OTAtMDktMTcpCiAjIGFkb3B0ZWQgYnkgUlMsIFNDLCBQUiwgU1AsIFJKLCBFUywgTUcsIEdPLCBNUywgREYuCiAjIERlY3JlZSA5OSw2MjkgKDE5OTAtMTAtMTkpIGFkZHMgQkEsIE1ULgogUnVsZQlCcmF6aWwJMTk5MAlvbmx5CS0JT2N0CTIxCSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk5MQlvbmx5CS0JRmViCTE3CSAwOjAwCTAJLQotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE5OTEuaHRtIj5Vbm51bWJlcmVkIGRlY3JlZTwvYT4gKDE5OTEtMDktMjUpCisjIFVubnVtYmVyZWQgZGVjcmVlIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE5OTEuaHRtPiAoMTk5MS0wOS0yNSkKICMgYWRvcHRlZCBieSBSUywgU0MsIFBSLCBTUCwgUkosIEVTLCBNRywgQkEsIEdPLCBNVCwgTVMsIERGLgogUnVsZQlCcmF6aWwJMTk5MQlvbmx5CS0JT2N0CTIwCSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk5Mglvbmx5CS0JRmViCSA5CSAwOjAwCTAJLQotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE5OTIuaHRtIj5Vbm51bWJlcmVkIGRlY3JlZTwvYT4gKDE5OTItMTAtMTYpCisjIFVubnVtYmVyZWQgZGVjcmVlIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE5OTIuaHRtPiAoMTk5Mi0xMC0xNikKICMgYWRvcHRlZCBieSBzYW1lIHN0YXRlcy4KIFJ1bGUJQnJhemlsCTE5OTIJb25seQktCU9jdAkyNQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5OTMJb25seQktCUphbgkzMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTQyLmh0bSI+OTQyPC9hPiAoMTk5My0wOS0yOCkKKyMgRGVjcmVlIDk0MiA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY5NDIuaHRtPiAoMTk5My0wOS0yOCkKICMgYWRvcHRlZCBieSBzYW1lIHN0YXRlcywgcGx1cyBBTS4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTI1Mi5odG0iPjEsMjUyPC9hPiAoMTk5NC0wOS0yMjsKKyMgRGVjcmVlIDEsMjUyIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjEyNTIuaHRtPiAoMTk5NC0wOS0yMjsKICMgd2ViIHBhZ2UgY29ycmVjdGVkIDIwMDQtMDEtMDcpIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIG1pbnVzIEFNLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxNjM2Lmh0bSI+MSw2MzY8L2E+ICgxOTk1LTA5LTE0KQorIyBEZWNyZWUgMSw2MzYgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTYzNi5odG0+ICgxOTk1LTA5LTE0KQogIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLCBwbHVzIE1UIGFuZCBUTy4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTY3NC5odG0iPjEsNjc0PC9hPiAoMTk5NS0xMC0xMykKKyMgRGVjcmVlIDEsNjc0IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE2NzQuaHRtPiAoMTk5NS0xMC0xMykKICMgYWRkcyBBTCwgU0UuCiBSdWxlCUJyYXppbAkxOTkzCTE5OTUJLQlPY3QJU3VuPj0xMQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5OTQJMTk5NQktCUZlYglTdW4+PTE1CSAwOjAwCTAJLQogUnVsZQlCcmF6aWwJMTk5Nglvbmx5CS0JRmViCTExCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyMDAwLmh0bSI+MiwwMDA8L2E+ICgxOTk2LTA5LTA0KQorIyBEZWNyZWUgMiwwMDAgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjAwMC5odG0+ICgxOTk2LTA5LTA0KQogIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLCBtaW51cyBBTCwgU0UuCiBSdWxlCUJyYXppbAkxOTk2CW9ubHkJLQlPY3QJIDYJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTk3CW9ubHkJLQlGZWIJMTYJIDA6MDAJMAktCkBAIC05NzUsNTMgKzkxNSw1MSBAQAogIwogIyBEZWNyZWUgMiwzMTcgKDE5OTctMDktMDQpLCBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLgogUnVsZQlCcmF6aWwJMTk5Nwlvbmx5CS0JT2N0CSA2CSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjI0OTUuSlBHIj4yLDQ5NTwvYT4KKyMgRGVjcmVlIDIsNDk1IDxodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMjQ5NS5KUEc+CiAjICgxOTk4LTAyLTEwKQogUnVsZQlCcmF6aWwJMTk5OAlvbmx5CS0JTWFyCSAxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9Idjk4LmpwZyI+Miw3ODA8L2E+ICgxOTk4LTA5LTExKQorIyBEZWNyZWUgMiw3ODAgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSHY5OC5qcGc+ICgxOTk4LTA5LTExKQogIyBhZG9wdGVkIGJ5IHRoZSBzYW1lIHN0YXRlcyBhcyBiZWZvcmUuCiBSdWxlCUJyYXppbAkxOTk4CW9ubHkJLQlPY3QJMTEJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTk5CW9ubHkJLQlGZWIJMjEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMzE1MC5naWYiPjMsMTUwPC9hPgorIyBEZWNyZWUgMywxNTAgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSFYzMTUwLmdpZj4KICMgKDE5OTktMDgtMjMpIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVjk5LmdpZiI+MywxODg8L2E+ICgxOTk5LTA5LTMwKQorIyBEZWNyZWUgMywxODggPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWOTkuZ2lmPiAoMTk5OS0wOS0zMCkKICMgYWRkcyBTRSwgQUwsIFBCLCBQRSwgUk4sIENFLCBQSSwgTUEgYW5kIFJSLgogUnVsZQlCcmF6aWwJMTk5OQlvbmx5CS0JT2N0CSAzCSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMjAwMAlvbmx5CS0JRmViCTI3CSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvREVDMzU5Mi5odG0iPjMsNTkyPC9hPiAoMjAwMC0wOS0wNikKKyMgRGVjcmVlIDMsNTkyIDxodHRwOi8vcGNkc2gwMS5vbi5ici9ERUMzNTkyLmh0bT4gKDIwMDAtMDktMDYpCiAjIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlYzM2MzAuanBnIj4zLDYzMDwvYT4gKDIwMDAtMTAtMTMpCisjIERlY3JlZSAzLDYzMCA8aHR0cDovL3BjZHNoMDEub24uYnIvRGVjMzYzMC5qcGc+ICgyMDAwLTEwLTEzKQogIyByZXBlYWxzIERTVCBpbiBQRSBhbmQgUlIsIGVmZmVjdGl2ZSAyMDAwLTEwLTE1IDAwOjAwLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjMzYzMi5qcGciPjMsNjMyPC9hPiAoMjAwMC0xMC0xNykKKyMgRGVjcmVlIDMsNjMyIDxodHRwOi8vcGNkc2gwMS5vbi5ici9EZWMzNjMyLmpwZz4gKDIwMDAtMTAtMTcpCiAjIHJlcGVhbHMgRFNUIGluIFNFLCBBTCwgUEIsIFJOLCBDRSwgUEkgYW5kIE1BLCBlZmZlY3RpdmUgMjAwMC0xMC0yMiAwMDowMC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSFYzOTE2LmdpZiI+Myw5MTY8L2E+CisjIERlY3JlZSAzLDkxNiA8aHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjM5MTYuZ2lmPgogIyAoMjAwMS0wOS0xMykgcmVlc3RhYmxpc2hlcyBEU1QgaW4gQUwsIENFLCBNQSwgUEIsIFBFLCBQSSwgUk4sIFNFLgogUnVsZQlCcmF6aWwJMjAwMAkyMDAxCS0JT2N0CVN1bj49OAkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTIwMDEJMjAwNgktCUZlYglTdW4+PTE1CSAwOjAwCTAJLQogIyBEZWNyZWUgNCwzOTkgKDIwMDItMTAtMDEpIHJlcGVhbHMgRFNUIGluIEFMLCBDRSwgTUEsIFBCLCBQRSwgUEksIFJOLCBTRS4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YuYnIvQ0NJVklML2RlY3JldG8vMjAwMi9ENDM5OS5odG0iPjQsMzk5PC9hPgorIyA0LDM5OSA8aHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YuYnIvQ0NJVklML2RlY3JldG8vMjAwMi9ENDM5OS5odG0+CiBSdWxlCUJyYXppbAkyMDAyCW9ubHkJLQlOb3YJIDMJIDA6MDAJMTowMAlTCiAjIERlY3JlZSA0LDg0NCAoMjAwMy0wOS0yNDsgY29ycmVjdGVkIDIwMDMtMDktMjYpIHJlcGVhbHMgRFNUIGluIEJBLCBNVCwgVE8uCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LmJyL0NDSVZJTC9kZWNyZXRvLzIwMDMvRDQ4NDQuaHRtIj40LDg0NDwvYT4KKyMgNCw4NDQgPGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LmJyL0NDSVZJTC9kZWNyZXRvLzIwMDMvRDQ4NDQuaHRtPgogUnVsZQlCcmF6aWwJMjAwMwlvbmx5CS0JT2N0CTE5CSAwOjAwCTE6MDAJUwogIyBEZWNyZWUgNSwyMjMgKDIwMDQtMTAtMDEpIHJlZXN0YWJsaXNoZXMgRFNUIGluIE1ULgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBsYW5hbHRvLmdvdi5ici9jY2l2aWxfMDMvX0F0bzIwMDQtMjAwNi8yMDA0L0RlY3JldG8vRDUyMjMuaHRtIj41LDIyMzwvYT4KKyMgNSwyMjMgPGh0dHA6Ly93d3cucGxhbmFsdG8uZ292LmJyL2NjaXZpbF8wMy9fQXRvMjAwNC0yMDA2LzIwMDQvRGVjcmV0by9ENTIyMy5odG0+CiBSdWxlCUJyYXppbAkyMDA0CW9ubHkJLQlOb3YJIDIJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVjU1MzkuZ2lmIj41LDUzOTwvYT4gKDIwMDUtMDktMTkpLAorIyBEZWNyZWUgNSw1MzkgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNTUzOS5naWY+ICgyMDA1LTA5LTE5KSwKICMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgogUnVsZQlCcmF6aWwJMjAwNQlvbmx5CS0JT2N0CTE2CSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY1OTIwLmdpZiI+NSw5MjA8L2E+ICgyMDA2LTEwLTAzKSwKKyMgRGVjcmVlIDUsOTIwIDxodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVjU5MjAuZ2lmPiAoMjAwNi0xMC0wMyksCiAjIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KIFJ1bGUJQnJhemlsCTIwMDYJb25seQktCU5vdgkgNQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTIwMDcJb25seQktCUZlYgkyNQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNjIxMi5naWYiPjYsMjEyPC9hPiAoMjAwNy0wOS0yNiksCisjIERlY3JlZSA2LDIxMiA8aHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY2MjEyLmdpZj4gKDIwMDctMDktMjYpLAogIyBhZG9wdGVkIGJ5IHRoZSBzYW1lIHN0YXRlcyBhcyBiZWZvcmUuCiBSdWxlCUJyYXppbAkyMDA3CW9ubHkJLQlPY3QJU3VuPj04CSAwOjAwCTE6MDAJUwogIyBGcm9tIEZyZWRlcmljbyBBLiBDLiBOZXZlcyAoMjAwOC0wOS0xMCk6CiAjIEFjY29yZGluZyB0byB0aGlzIGRlY3JlZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBsYW5hbHRvLmdvdi5ici9jY2l2aWxfMDMvX0F0bzIwMDctMjAxMC8yMDA4L0RlY3JldG8vRDY1NTguaHRtIj4KICMgaHR0cDovL3d3dy5wbGFuYWx0by5nb3YuYnIvY2NpdmlsXzAzL19BdG8yMDA3LTIwMTAvMjAwOC9EZWNyZXRvL0Q2NTU4Lmh0bQotIyA8L2E+CiAjIFt0XWhlIERTVCBwZXJpb2QgaW4gQnJhemlsIG5vdyBvbiB3aWxsIGJlIGZyb20gdGhlIDNyZCBPY3QgU3VuZGF5IHRvIHRoZQogIyAzcmQgRmViIFN1bmRheS4gVGhlcmUgaXMgYW4gZXhjZXB0aW9uIG9uIHRoZSByZXR1cm4gZGF0ZSB3aGVuIHRoaXMgaXMKICMgdGhlIENhcm5pdmFsIFN1bmRheSB0aGVuIHRoZSByZXR1cm4gZGF0ZSB3aWxsIGJlIHRoZSBuZXh0IFN1bmRheS4uLgpAQCAtMTA1NiwyOSArOTk0LDI5IEBACiAJCQktMjowMAlCcmF6aWwJRk4lc1QJMjAwMiBPY3QgIDEKIAkJCS0yOjAwCS0JRk5UCiAjIE90aGVyIEF0bGFudGljIGlzbGFuZHMgaGF2ZSBubyBwZXJtYW5lbnQgc2V0dGxlbWVudC4KLSMgVGhlc2UgaW5jbHVkZSBUcmluZGFkZSBhbmQgTWFydGluIFZheiAoYWRtaW5pc3RyYXRpdmVseSBwYXJ0IG9mIEVTKSwKLSMgQXRvbCBkYXMgUm9jYXMgKFJOKSwgYW5kIFBlbmVkb3MgZGUgU2FvIFBlZHJvIGUgU2FvIFBhdWxvIChQRSkuCisjIFRoZXNlIGluY2x1ZGUgVHJpbmRhZGUgYW5kIE1hcnRpbSBWYXogKGFkbWluaXN0cmF0aXZlbHkgcGFydCBvZiBFUyksCisjIFJvY2FzIEF0b2xsIChSTiksIGFuZCB0aGUgU3QgUGV0ZXIgYW5kIFN0IFBhdWwgQXJjaGlwZWxhZ28gKFBFKS4KICMgRmVybmFuZG8gZGUgTm9yb25oYSB3YXMgYSBzZXBhcmF0ZSB0ZXJyaXRvcnkgZnJvbSAxOTQyLTA5LTAyIHRvIDE5ODktMDEtMDE7CiAjIGl0IGFsc28gaW5jbHVkZWQgdGhlIFBlbmVkb3MuCiAjCi0jIEFtYXBhIChBUCksIGVhc3QgUGFyYSAoUEEpCi0jIEVhc3QgUGFyYSBpbmNsdWRlcyBCZWxlbSwgTWFyYWJhLCBTZXJyYSBOb3J0ZSwgYW5kIFNhbyBGZWxpeCBkbyBYaW5ndS4KLSMgVGhlIGRpdmlzaW9uIGJldHdlZW4gZWFzdCBhbmQgd2VzdCBQYXJhIGlzIHRoZSByaXZlciBYaW5ndS4KKyMgQW1hcMOhIChBUCksIGVhc3QgUGFyw6EgKFBBKQorIyBFYXN0IFBhcsOhIGluY2x1ZGVzIEJlbMOpbSwgTWFyYWLDoSwgU2VycmEgTm9ydGUsIGFuZCBTw6NvIEbDqWxpeCBkbyBYaW5ndS4KKyMgVGhlIGRpdmlzaW9uIGJldHdlZW4gZWFzdCBhbmQgd2VzdCBQYXLDoSBpcyB0aGUgcml2ZXIgWGluZ3UuCiAjIEluIHRoZSBub3J0aCBhIHZlcnkgc21hbGwgcGFydCBmcm9tIHRoZSByaXZlciBKYXZhcnkgKG5vdyBKYXJpIEkgZ3Vlc3MsCi0jIHRoZSBib3JkZXIgd2l0aCBBbWFwYSkgdG8gdGhlIEFtYXpvbiwgdGhlbiB0byB0aGUgWGluZ3UuCisjIHRoZSBib3JkZXIgd2l0aCBBbWFww6EpIHRvIHRoZSBBbWF6b24sIHRoZW4gdG8gdGhlIFhpbmd1LgogWm9uZSBBbWVyaWNhL0JlbGVtCS0zOjEzOjU2IC0JTE1UCTE5MTQKIAkJCS0zOjAwCUJyYXppbAlCUiVzVAkxOTg4IFNlcCAxMgogCQkJLTM6MDAJLQlCUlQKICMKLSMgd2VzdCBQYXJhIChQQSkKLSMgV2VzdCBQYXJhIGluY2x1ZGVzIEFsdGFtaXJhLCBPcmliaWRvcywgUHJhaW5oYSwgT3JpeGltaW5hLCBhbmQgU2FudGFyZW0uCisjIHdlc3QgUGFyw6EgKFBBKQorIyBXZXN0IFBhcsOhIGluY2x1ZGVzIEFsdGFtaXJhLCDDk2JpZG9zLCBQcmFpbmhhLCBPcml4aW1pbsOhLCBhbmQgU2FudGFyw6ltLgogWm9uZSBBbWVyaWNhL1NhbnRhcmVtCS0zOjM4OjQ4IC0JTE1UCTE5MTQKIAkJCS00OjAwCUJyYXppbAlBTSVzVAkxOTg4IFNlcCAxMgotCQkJLTQ6MDAJLQlBTVQJMjAwOCBKdW4gMjQgMDA6MDAKKwkJCS00OjAwCS0JQU1UCTIwMDggSnVuIDI0ICAwOjAwCiAJCQktMzowMAktCUJSVAogIwotIyBNYXJhbmhhbyAoTUEpLCBQaWF1aSAoUEkpLCBDZWFyYSAoQ0UpLCBSaW8gR3JhbmRlIGRvIE5vcnRlIChSTiksCi0jIFBhcmFpYmEgKFBCKQorIyBNYXJhbmjDo28gKE1BKSwgUGlhdcOtIChQSSksIENlYXLDoSAoQ0UpLCBSaW8gR3JhbmRlIGRvIE5vcnRlIChSTiksCisjIFBhcmHDrWJhIChQQikKIFpvbmUgQW1lcmljYS9Gb3J0YWxlemEJLTI6MzQ6MDAgLQlMTVQJMTkxNAogCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTAgU2VwIDE3CiAJCQktMzowMAktCUJSVAkxOTk5IFNlcCAzMApAQCAtMTEyNSwxMSArMTA2MywxMSBAQAogCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMTIgT2N0IDIxCiAJCQktMzowMAktCUJSVAogIwotIyBHb2lhcyAoR08pLCBEaXN0cml0byBGZWRlcmFsIChERiksIE1pbmFzIEdlcmFpcyAoTUcpLAotIyBFc3Bpcml0byBTYW50byAoRVMpLCBSaW8gZGUgSmFuZWlybyAoUkopLCBTYW8gUGF1bG8gKFNQKSwgUGFyYW5hIChQUiksCisjIEdvacOhcyAoR08pLCBEaXN0cml0byBGZWRlcmFsIChERiksIE1pbmFzIEdlcmFpcyAoTUcpLAorIyBFc3DDrXJpdG8gU2FudG8gKEVTKSwgUmlvIGRlIEphbmVpcm8gKFJKKSwgU8OjbyBQYXVsbyAoU1ApLCBQYXJhbsOhIChQUiksCiAjIFNhbnRhIENhdGFyaW5hIChTQyksIFJpbyBHcmFuZGUgZG8gU3VsIChSUykKIFpvbmUgQW1lcmljYS9TYW9fUGF1bG8JLTM6MDY6MjggLQlMTVQJMTkxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5NjMgT2N0IDIzIDAwOjAwCisJCQktMzowMAlCcmF6aWwJQlIlc1QJMTk2MyBPY3QgMjMgIDA6MDAKIAkJCS0zOjAwCTE6MDAJQlJTVAkxOTY0CiAJCQktMzowMAlCcmF6aWwJQlIlc1QKICMKQEAgLTExNDMsNyArMTA4MSw3IEBACiAJCQktNDowMAktCUFNVAkyMDA0IE9jdCAgMQogCQkJLTQ6MDAJQnJhemlsCUFNJXNUCiAjCi0jIFJvbmRvbmlhIChSTykKKyMgUm9uZMO0bmlhIChSTykKIFpvbmUgQW1lcmljYS9Qb3J0b19WZWxobyAtNDoxNTozNiAtCUxNVAkxOTE0CiAJCQktNDowMAlCcmF6aWwJQU0lc1QJMTk4OCBTZXAgMTIKIAkJCS00OjAwCS0JQU1UCkBAIC0xMTU1LDcgKzEwOTMsNyBAQAogCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTIwMDAgT2N0IDE1CiAJCQktNDowMAktCUFNVAogIwotIyBlYXN0IEFtYXpvbmFzIChBTSk6IEJvY2EgZG8gQWNyZSwgSnV0YWksIE1hbmF1cywgRmxvcmlhbm8gUGVpeG90bworIyBlYXN0IEFtYXpvbmFzIChBTSk6IEJvY2EgZG8gQWNyZSwgSnV0YcOtLCBNYW5hdXMsIEZsb3JpYW5vIFBlaXhvdG8KICMgVGhlIGdyZWF0IGNpcmNsZSBsaW5lIGZyb20gVGFiYXRpbmdhIHRvIFBvcnRvIEFjcmUgZGl2aWRlcwogIyBlYXN0IGZyb20gd2VzdCBBbWF6b25hcy4KIFpvbmUgQW1lcmljYS9NYW5hdXMJLTQ6MDA6MDQgLQlMTVQJMTkxNApAQCAtMTE2NSwxOSArMTEwMywxOSBAQAogCQkJLTQ6MDAJLQlBTVQKICMKICMgd2VzdCBBbWF6b25hcyAoQU0pOiBBdGFsYWlhIGRvIE5vcnRlLCBCb2NhIGRvIE1hb2NvLCBCZW5qYW1pbiBDb25zdGFudCwKLSMJRWlydW5lcGUsIEVudmlyYSwgSXBpeHVuYQorIwlFaXJ1bmVww6ksIEVudmlyYSwgSXBpeHVuYQogWm9uZSBBbWVyaWNhL0VpcnVuZXBlCS00OjM5OjI4IC0JTE1UCTE5MTQKIAkJCS01OjAwCUJyYXppbAlBQyVzVAkxOTg4IFNlcCAxMgogCQkJLTU6MDAJLQlBQ1QJMTk5MyBTZXAgMjgKIAkJCS01OjAwCUJyYXppbAlBQyVzVAkxOTk0IFNlcCAyMgotCQkJLTU6MDAJLQlBQ1QJMjAwOCBKdW4gMjQgMDA6MDAKKwkJCS01OjAwCS0JQUNUCTIwMDggSnVuIDI0ICAwOjAwCiAJCQktNDowMAktCUFNVAkyMDEzIE5vdiAxMAogCQkJLTU6MDAJLQlBQ1QKICMKICMgQWNyZSAoQUMpCiBab25lIEFtZXJpY2EvUmlvX0JyYW5jbwktNDozMToxMiAtCUxNVAkxOTE0CiAJCQktNTowMAlCcmF6aWwJQUMlc1QJMTk4OCBTZXAgMTIKLQkJCS01OjAwCS0JQUNUCTIwMDggSnVuIDI0IDAwOjAwCisJCQktNTowMAktCUFDVAkyMDA4IEp1biAyNCAgMDowMAogCQkJLTQ6MDAJLQlBTVQJMjAxMyBOb3YgMTAKIAkJCS01OjAwCS0JQUNUCiAKQEAgLTExOTgsNjYgKzExMzYsNTQgQEAKICMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwNi0xMC0wOCk6CiAjIGh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvY2FtYmlvLmh0bQogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTEwLTA4KToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA2LTEwLTA4KToKICMgSSB0aGluayB0aGF0IHRoZXJlIGFyZSBzb21lIG9idmlvdXMgbWlzdGFrZXMgaW4gdGhlIHN1Z2dlc3RlZCBsaW5rCiAjIGZyb20gT3NjYXIgdmFuIFZsaWptZW4sLi4uIGZvciBpbnN0YW5jZSBlbnRyeSA2NiBzYXlzIHRoYXQgR01ULTQKICMgZW5kZWQgMTk5MC0wOS0xMiB3aGlsZSBlbnRyeSA2NyBvbmx5IGJlZ2lucyBHTVQtMyBhdCAxOTkwLTA5LTE1CiAjICh0aGV5IHNob3VsZCBoYXZlIGJlZW4gMTk5MC0wOS0xNSBhbmQgMTk5MC0wOS0xNiByZXNwZWN0aXZlbHkpLCBidXQKICMgYW55aG93IGl0IGNsZWFycyB1cCBzb21lIGRvdWJ0cyB0b28uCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0xMi0yNyk6Ci0jIFRoZSBmb2xsb3dpbmcgZGF0YSBmb3IgQ2hpbGUgYW5kIEFtZXJpY2EvU2FudGlhZ28gYXJlIGZyb20KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wOC0xMik6CisjIFRoZSBmb2xsb3dpbmcgZGF0YSBlbnRyaWVzIGZvciBDaGlsZSBhbmQgQW1lcmljYS9TYW50aWFnbyBhcmUgZnJvbQogIyA8aHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9ob3Jhb2YuaHRtPiAoMjAwNi0wOS0yMCksIHRyYW5zY3JpYmVkIGJ5Ci0jIEplc3BlciBOb3JnYWFyZCBXZWxlbi4gIFRoZSBkYXRhIGZvciBQYWNpZmljL0Vhc3RlciBhcmUgZnJvbSBTaGFua3MKKyMgSmVzcGVyIE7DuHJnYWFyZCBXZWxlbi4gIFRoZSBkYXRhIGVudHJpZXMgZm9yIFBhY2lmaWMvRWFzdGVyIGFyZSBmcm9tIFNoYW5rcwogIyAmIFBvdHRlbmdlciwgZXhjZXB0IHdpdGggRFNUIHRyYW5zaXRpb25zIGFmdGVyIDE5MzIgY2xvbmVkIGZyb20KLSMgQW1lcmljYS9TYW50aWFnby4gIFRoZSBwcmUtMTk4MCBQYWNpZmljL0Vhc3RlciBkYXRhIGFyZSBkdWJpb3VzLAorIyBBbWVyaWNhL1NhbnRpYWdvLiAgVGhlIHByZS0xOTgwIFBhY2lmaWMvRWFzdGVyIGRhdGEgZW50cmllcyBhcmUgZHViaW91cywKICMgYnV0IHdlIGhhdmUgbm8gb3RoZXIgc291cmNlLgogCi0jIEZyb20gR2VybWFuIFBvby1DYWFtYW5+byAoMjAwOC0wMy0wMyk6CisjIEZyb20gR2VybcOhbiBQb28tQ2FhbWHDsW8gKDIwMDgtMDMtMDMpOgogIyBEdWUgdG8gZHJvdWdodCwgQ2hpbGUgZXh0ZW5kcyBEYXlsaWdodCBUaW1lIGluIHRocmVlIHdlZWtzLiAgVGhpcwogIyBpcyBvbmUtdGltZSBjaGFuZ2UgKFNhdHVyZGF5IDMvMjkgYXQgMjQ6MDAgZm9yIEFtZXJpY2EvU2FudGlhZ28KICMgYW5kIFNhdHVyZGF5IDMvMjkgYXQgMjI6MDAgZm9yIFBhY2lmaWMvRWFzdGVyKQogIyBUaGUgU3VwcmVtZSBEZWNyZWUgaXMgbG9jYXRlZCBhdAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNob2EuY2wvc2VydmljaW9zL3N1cHJlbW8zMTYucGRmIj4KICMgaHR0cDovL3d3dy5zaG9hLmNsL3NlcnZpY2lvcy9zdXByZW1vMzE2LnBkZgotIyA8L2E+CiAjIGFuZCB0aGUgaW5zdHJ1Y3Rpb25zIGZvciAyMDA4IGFyZSBsb2NhdGVkIGluOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmhvcmFvZmljaWFsLmNsL2NhbWJpby5odG0iPgogIyBodHRwOi8vd3d3LmhvcmFvZmljaWFsLmNsL2NhbWJpby5odG0KLSMgPC9hPi4KIAotIyBGcm9tIEpvc2UgTWlndWVsIEdhcnJpZG8gKDIwMDgtMDMtMDUpOgorIyBGcm9tIEpvc8OpIE1pZ3VlbCBHYXJyaWRvICgyMDA4LTAzLTA1KToKICMgLi4uCiAjIFlvdSBjb3VsZCBzZWUgdGhlIGFubm91bmNlcyBvZiB0aGUgY2hhbmdlIG9uCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2hvYS5jbC9ub3RpY2lhcy8yMDA4LzA0aG9yYS9ob3JhLmh0bSI+CiAjIGh0dHA6Ly93d3cuc2hvYS5jbC9ub3RpY2lhcy8yMDA4LzA0aG9yYS9ob3JhLmh0bQotIyA8L2E+LgogCiAjIEZyb20gQW5nZWwgQ2hpYW5nICgyMDEwLTAzLTA0KToKICMgU3ViamVjdDogRFNUIGluIENoaWxlIGV4Y2VwdGlvbmFsbHkgZXh0ZW5kZWQgdG8gMyBBcHJpbCBkdWUgdG8gZWFydGhxdWFrZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmdvYmllcm5vZGVjaGlsZS5jbC92aWV3Tm90aWNpYS5hc3B4P2lkQXJ0aWN1bG89MzAwOTgiPgogIyBodHRwOi8vd3d3LmdvYmllcm5vZGVjaGlsZS5jbC92aWV3Tm90aWNpYS5hc3B4P2lkQXJ0aWN1bG89MzAwOTgKLSMgPC9hPgogIyAoaW4gU3BhbmlzaCwgbGFzdCBwYXJhZ3JhcGgpLgogIwogIyBUaGlzIGlzIGJyZWFraW5nIG5ld3MuIFRoZXJlIHNob3VsZCBiZSBtb3JlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBsYXRlci4KIAotIyBGcm9tIEFydGh1ciBEYWl2ZCBPbHNvbiAoMjAxMC0wMy0wNik6CisjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDEwLTAzLTA2KToKICMgQW5nZWwgQ2hpYW5nJ3MgbWVzc2FnZSBjb25maXJtZWQgYnkgSnVsaW8gUGFjaGVjbzsgSnVsaW8gcHJvdmlkZWQgYSBwYXRjaC4KIAotIyBGcm9tIEdsZW5uIEV5Y2hhbmVyICgyMDExLTAzLTAyKTogW2dleWNoYW5lckBtYWMuY29tXQorIyBGcm9tIEdsZW5uIEV5Y2hhbmVyICgyMDExLTAzLTAyKToKICMgSXQgYXBwZWFycyB0aGF0IHRoZSBDaGlsZWFuIGdvdmVybm1lbnQgaGFzIGRlY2lkZWQgdG8gcG9zdHBvbmUgdGhlCiAjIGNoYW5nZSBmcm9tIHN1bW1lciB0aW1lIHRvIHdpbnRlciB0aW1lIGFnYWluLCBieSB0aHJlZSB3ZWVrcyB0byBBcHJpbAogIyAybmQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZW1vbC5jb20vbm90aWNpYXMvbmFjaW9uYWwvZGV0YWxsZS9kZXRhbGxlbm90aWNpYXMuYXNwP2lkbm90aWNpYT00Njc2NTEiPgogIyBodHRwOi8vd3d3LmVtb2wuY29tL25vdGljaWFzL25hY2lvbmFsL2RldGFsbGUvZGV0YWxsZW5vdGljaWFzLmFzcD9pZG5vdGljaWE9NDY3NjUxCi0jIDwvYT4KICMKICMgVGhpcyBpcyBub3QgeWV0IHJlZmxlY3RlZCBpbiB0aGUgb2ZmaWNpYWwgImNhbWJpbyBkZSBob3JhIiBzaXRlLCBidXQKICMgcHJvYmFibHkgd2lsbCBiZSBzb29uOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmhvcmFvZmljaWFsLmNsL2NhbWJpby5odG0iPgogIyBodHRwOi8vd3d3LmhvcmFvZmljaWFsLmNsL2NhbWJpby5odG0KLSMgPC9hPgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDExLTAzLTAyKToKICMgVGhlIGVtb2wuY29tIGFydGljbGUgbWVudGlvbnMgYSB3YXRlciBzaG9ydGFnZSBhcyB0aGUgY2F1c2Ugb2YgdGhlCkBAIC0xMjY1LDkgKzExOTEsNyBAQAogCiAjIEZyb20gR2xlbm4gRXljaGFuZXIgKDIwMTEtMDMtMjgpOgogIyBUaGUgYXJ0aWNsZToKLSMgPGEgaHJlZj0iaHR0cDovL2RpYXJpby5lbG1lcmN1cmlvLmNvbS8yMDExLzAzLzI4L19wb3J0YWRhL19wb3J0YWRhL25vdGljaWFzLzc1NjU4OTdBLUNBODYtNDlFNi05RTAzLTY2MEIyMUE0ODgzRS5odG0/aWQ9M0R7NzU2NTg5N0EtQ0E4Ni00OUU2LTlFMDMtNjYwQjIxQTQ4ODNFfSI+CiAjIGh0dHA6Ly9kaWFyaW8uZWxtZXJjdXJpby5jb20vMjAxMS8wMy8yOC9fcG9ydGFkYS9fcG9ydGFkYS9ub3RpY2lhcy83NTY1ODk3QS1DQTg2LTQ5RTYtOUUwMy02NjBCMjFBNDg4M0UuaHRtP2lkPTNEezc1NjU4OTdBLUNBODYtNDlFNi05RTAzLTY2MEIyMUE0ODgzRX0KLSMgPC9hPgogIwogIyBJbiBFbmdsaXNoOgogIyBDaGlsZSdzIGNsb2NrcyB3aWxsIGdvIGJhY2sgYW4gaG91ciB0aGlzIHllYXIgb24gdGhlIDd0aCBvZiBNYXkgaW5zdGVhZApAQCAtMTI5OCw3ICsxMjIyLDcgQEAKICMgc3RhcnQgZGF0ZSBpcyAyMDEzLTA5LTA4IDAwOjAwLi4uLgogIyBodHRwOi8vd3d3LmdvYi5jbC9pbmZvcm1hLzIwMTMvMDIvMTUvZ29iaWVybm8tYW51bmNpYS1mZWNoYXMtZGUtY2FtYmlvLWRlLWhvcmEtcGFyYS1lbC1hbm8tMjAxMy5odG0KIAotIyBGcm9tIEpvc2UgTWlndWVsIEdhcnJpZG8gKDIwMTQtMDItMTkpOgorIyBGcm9tIEpvc8OpIE1pZ3VlbCBHYXJyaWRvICgyMDE0LTAyLTE5KToKICMgVG9kYXkgYXBwZWFyZWQgaW4gdGhlIERpYXJpbyBPZmljaWFsIGEgZGVjcmVlIGFtZW5kaW5nIHRoZSB0aW1lIGNoYW5nZQogIyBkYXRlcyB0byAyMDE0LgogIyBEU1QgRW5kOiBsYXN0IFNhdHVyZGF5IG9mIEFwcmlsIDIwMTQgKFN1biAyNyBBcHIgMjAxNCAwMzowMCBVVEMpCkBAIC0xMzUyLDcgKzEyNzYsNyBAQAogIyAoMTk5Ni0wOSkgc2F5cyAxOTk4LTAzLTA4LiAgSWdub3JlIHRoZXNlLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL1NhbnRpYWdvCS00OjQyOjQ2IC0JTE1UCTE4OTAKLQkJCS00OjQyOjQ2IC0JU01UCTE5MTAgCSAgICAjIFNhbnRpYWdvIE1lYW4gVGltZQorCQkJLTQ6NDI6NDYgLQlTTVQJMTkxMCAgICAgICAgIyBTYW50aWFnbyBNZWFuIFRpbWUKIAkJCS01OjAwCS0JQ0xUCTE5MTYgSnVsICAxICMgQ2hpbGUgVGltZQogCQkJLTQ6NDI6NDYgLQlTTVQJMTkxOCBTZXAgIDEgIyBTYW50aWFnbyBNZWFuIFRpbWUKIAkJCS00OjAwCS0JQ0xUCTE5MTkgSnVsICAxICMgQ2hpbGUgVGltZQpAQCAtMTM2MSwxNiArMTI4NSwxNiBAQAogCQkJLTQ6MDAJQ2hpbGUJQ0wlc1QKIFpvbmUgUGFjaWZpYy9FYXN0ZXIJLTc6MTc6NDQgLQlMTVQJMTg5MAogCQkJLTc6MTc6MjggLQlFTVQJMTkzMiBTZXAgICAgIyBFYXN0ZXIgTWVhbiBUaW1lCi0JCQktNzowMAlDaGlsZQlFQVMlc1QJMTk4MiBNYXIgMTMgMjE6MDAgIyBFYXN0ZXIgSSBUaW1lCisJCQktNzowMAlDaGlsZQlFQVMlc1QJMTk4MiBNYXIgMTMgMjE6MDAgIyBFYXN0ZXIgVGltZQogCQkJLTY6MDAJQ2hpbGUJRUFTJXNUCiAjCi0jIFNhbGEgeSBHb21leiBJc2xhbmQgaXMgbGlrZSBQYWNpZmljL0Vhc3Rlci4KLSMgT3RoZXIgQ2hpbGVhbiBsb2NhdGlvbnMsIGluY2x1ZGluZyBKdWFuIEZlcm5hbmRleiBJcywgU2FuIEFtYnJvc2lvLAotIyBTYW4gRmVsaXgsIGFuZCBBbnRhcmN0aWMgYmFzZXMsIGFyZSBsaWtlIEFtZXJpY2EvU2FudGlhZ28uCisjIFNhbGFzIHkgR8OzbWV6IElzbGFuZCBpcyB1bmluaGFiaXRlZC4KKyMgT3RoZXIgQ2hpbGVhbiBsb2NhdGlvbnMsIGluY2x1ZGluZyBKdWFuIEZlcm7DoW5kZXogSXMsIERlc3ZlbnR1cmFkYXMgSXMsCisjIGFuZCBBbnRhcmN0aWMgYmFzZXMsIGFyZSBsaWtlIEFtZXJpY2EvU2FudGlhZ28uCiAKICMgQ29sb21iaWEKIAotIyBNaWxuZSBnaXZlcyA0OjU2OjE2LjQgZm9yIEJvZ290YSB0aW1lIGluIDE4OTk7IHJvdW5kIHRvIG5lYXJlc3QuICBIZSB3cml0ZXMsCisjIE1pbG5lIGdpdmVzIDQ6NTY6MTYuNCBmb3IgQm9nb3TDoSB0aW1lIGluIDE4OTk7IHJvdW5kIHRvIG5lYXJlc3QuICBIZSB3cml0ZXMsCiAjICJBIHZhcmlhdGlvbiBvZiBmaWZ0ZWVuIG1pbnV0ZXMgaW4gdGhlIHB1YmxpYyBjbG9ja3Mgb2YgQm9nb3RhIGlzIG5vdCByYXJlLiIKIAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKQEAgLTEzNzgsMzcgKzEzMDIsMzcgQEAKIFJ1bGUJQ08JMTk5Mwlvbmx5CS0JQXByCSA0CTA6MDAJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFtZXJpY2EvQm9nb3RhCS00OjU2OjE2IC0JTE1UCTE4ODQgTWFyIDEzCi0JCQktNDo1NjoxNiAtCUJNVAkxOTE0IE5vdiAyMyAjIEJvZ290YSBNZWFuIFRpbWUKKwkJCS00OjU2OjE2IC0JQk1UCTE5MTQgTm92IDIzICMgQm9nb3TDoSBNZWFuIFRpbWUKIAkJCS01OjAwCUNPCUNPJXNUCSMgQ29sb21iaWEgVGltZQogIyBNYWxwZWxvLCBQcm92aWRlbmNpYSwgU2FuIEFuZHJlcwogIyBubyBpbmZvcm1hdGlvbjsgcHJvYmFibHkgbGlrZSBBbWVyaWNhL0JvZ290YQogCi0jIEN1cmFjYW8KKyMgQ3VyYcOnYW8KIAotIyBNaWxuZSBnaXZlcyA0OjM1OjQ2LjkgZm9yIEN1cmFjYW8gbWVhbiB0aW1lOyByb3VuZCB0byBuZWFyZXN0LgorIyBNaWxuZSBnaXZlcyA0OjM1OjQ2LjkgZm9yIEN1cmHDp2FvIG1lYW4gdGltZTsgcm91bmQgdG8gbmVhcmVzdC4KICMKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CiAjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBUaGUgQm90dG9tIGFuZCBQaGlsaXBzYnVyZyBoYXZlIGJlZW4gYXQKICMgLTQ6MDAgc2luY2Ugc3RhbmRhcmQgdGltZSB3YXMgaW50cm9kdWNlZCBvbiAxOTEyLTAzLTAyOyBhbmQgdGhhdAogIyBLcmFsZW5kaWprIGFuZCBSaW5jb24gdXNlZCBLcmFsZW5kaWprIE1lYW4gVGltZSAoLTQ6MzM6MDgpIGZyb20KICMgMTkxMi0wMi0wMiB0byAxOTY1LTAxLTAxLiAgVGhlIGZvcm1lciBpcyBkdWJpb3VzLCBzaW5jZSBTJlAgYWxzbyBzYXkKLSMgU2FiYSBJc2xhbmQgaGFzIGJlZW4gbGlrZSBDdXJhY2FvLgorIyBTYWJhIElzbGFuZCBoYXMgYmVlbiBsaWtlIEN1cmHDp2FvLgogIyBUaGlzIGFsbCBwcmVkYXRlcyBvdXIgMTk3MCBjdXRvZmYsIHRob3VnaC4KICMKLSMgQnkgSnVseSAyMDA3IEN1cmFjYW8gYW5kIFN0IE1hYXJ0ZW4gYXJlIHBsYW5uZWQgdG8gYmVjb21lCisjIEJ5IEp1bHkgMjAwNyBDdXJhw6dhbyBhbmQgU3QgTWFhcnRlbiBhcmUgcGxhbm5lZCB0byBiZWNvbWUKICMgYXNzb2NpYXRlZCBzdGF0ZXMgd2l0aGluIHRoZSBOZXRoZXJsYW5kcywgbXVjaCBsaWtlIEFydWJhOwogIyBCb25haXJlLCBTYWJhIGFuZCBTdCBFdXN0YXRpdXMgd291bGQgYmVjb21lIGRpcmVjdGx5IHBhcnQgb2YgdGhlCiAjIE5ldGhlcmxhbmRzIGFzIEtpbmdkb20gSXNsYW5kcy4gIFRoaXMgd29uJ3QgYWZmZWN0IHRoZWlyIHRpbWUgem9uZXMKICMgdGhvdWdoLCBhcyBmYXIgYXMgd2Uga25vdy4KICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9DdXJhY2FvCS00OjM1OjQ3IC0JTE1UCTE5MTIgRmViIDEyCSMgV2lsbGVtc3RhZAorWm9uZQlBbWVyaWNhL0N1cmFjYW8JLTQ6MzU6NDcgLQlMTVQJMTkxMiBGZWIgMTIgIyBXaWxsZW1zdGFkCiAJCQktNDozMAktCUFOVAkxOTY1ICMgTmV0aGVybGFuZHMgQW50aWxsZXMgVGltZQogCQkJLTQ6MDAJLQlBU1QKIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMS0wNi0xNSk6CiAjIHVzZSBsaW5rcyBmb3IgcGxhY2VzIHdpdGggbmV3IGlzbzMxNjYgY29kZXMuCi0jIFRoZSBuYW1lICJMb3dlciBQcmluY2UncyBRdWFydGVyIiBpcyBib3RoIGxvbmdlciB0aGFuIGZvdXJ0ZWVuIGNoYXJhdGVycworIyBUaGUgbmFtZSAiTG93ZXIgUHJpbmNlJ3MgUXVhcnRlciIgaXMgYm90aCBsb25nZXIgdGhhbiBmb3VydGVlbiBjaGFyYWN0ZXJzCiAjIGFuZCBjb250YWlucyBhbiBhcG9zdHJvcGhlOyB1c2UgIkxvd2VyX1ByaW5jZXMiIGJlbG93LgogCiBMaW5rCUFtZXJpY2EvQ3VyYWNhbwlBbWVyaWNhL0xvd2VyX1ByaW5jZXMJIyBTaW50IE1hYXJ0ZW4KQEAgLTE0MTYsNyArMTM0MCw3IEBACiAKICMgRWN1YWRvcgogIwotIyBNaWxuZSBzYXlzIHRoZSBTZW50cmFsIGFuZCBTb3V0aCBBbWVyaWNhbiBUZWxlZ3JhcGggQ29tcGFueSB1c2VkIC01OjI0OjE1LgorIyBNaWxuZSBzYXlzIHRoZSBDZW50cmFsIGFuZCBTb3V0aCBBbWVyaWNhbiBUZWxlZ3JhcGggQ29tcGFueSB1c2VkIC01OjI0OjE1LgogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTA0KToKICMgQXBwYXJlbnRseSBFY3VhZG9yIGhhZCBhIGZhaWxlZCBleHBlcmltZW50IHdpdGggRFNUIGluIDE5OTIuCkBAIC0xNDI3LDEwICsxMzUxLDEwIEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvR3VheWFxdWlsCS01OjE5OjIwIC0JTE1UCTE4OTAKIAkJCS01OjE0OjAwIC0JUU1UCTE5MzEgIyBRdWl0byBNZWFuIFRpbWUKLQkJCS01OjAwCS0JRUNUCSAgICAgIyBFY3VhZG9yIFRpbWUKKwkJCS01OjAwCS0JRUNUCSMgRWN1YWRvciBUaW1lCiBab25lIFBhY2lmaWMvR2FsYXBhZ29zCS01OjU4OjI0IC0JTE1UCTE5MzEgIyBQdWVydG8gQmFxdWVyaXpvIE1vcmVubwogCQkJLTU6MDAJLQlFQ1QJMTk4NgotCQkJLTY6MDAJLQlHQUxUCSAgICAgIyBHYWxhcGFnb3MgVGltZQorCQkJLTY6MDAJLQlHQUxUCSMgR2Fsw6FwYWdvcyBUaW1lCiAKICMgRmFsa2xhbmRzCiAKQEAgLTE0MzksNyArMTM2Myw3IEBACiAjIHRoZSBJQVRBIGdpdmVzIDE5OTYtMDktMDguICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KIAogIyBGcm9tIEZhbGtsYW5kIElzbGFuZHMgR292ZXJubWVudCBPZmZpY2UsIExvbmRvbiAoMjAwMS0wMS0yMikKLSMgdmlhIEplc3BlciBOb3JnYWFyZDoKKyMgdmlhIEplc3BlciBOw7hyZ2FhcmQ6CiAjIC4uLiB0aGUgY2xvY2tzIHJldmVydCBiYWNrIHRvIExvY2FsIE1lYW4gVGltZSBhdCAyIGFtIG9uIFN1bmRheSAxNQogIyBBcHJpbCAyMDAxIGFuZCBhZHZhbmNlIG9uZSBob3VyIHRvIHN1bW1lciB0aW1lIGF0IDIgYW0gb24gU3VuZGF5IDIKICMgU2VwdGVtYmVyLiAgSXQgaXMgYW50aWNpcGF0ZWQgdGhhdCB0aGUgY2xvY2tzIHdpbGwgcmV2ZXJ0IGJhY2sgYXQgMgpAQCAtMTQ4OCw5ICsxNDEyLDcgQEAKICMgZGF5bGlnaHQgc2F2aW5nIHRpbWUuCiAjCiAjIE9uZSBzb3VyY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmFsa2xhbmRuZXdzLmNvbS9wdWJsaWMvc3RvcnkuY2ZtP2dldD01OTE0JnNvdXJjZT0zIj4KICMgaHR0cDovL3d3dy5mYWxrbGFuZG5ld3MuY29tL3B1YmxpYy9zdG9yeS5jZm0/Z2V0PTU5MTQmc291cmNlPTMKLSMgPC9hPgogIwogIyBXZSBoYXZlIGdvdHRlbiB0aGlzIGNvbmZpcm1lZCBieSBhIGNsZXJrIG9mIHRoZSBsZWdpc2xhdGl2ZSBhc3NlbWJseToKICMgTm9ybWFsbHkgdGhlIGNsb2NrcyByZXZlcnQgdG8gTG9jYWwgTWVhbiBUaW1lIChVVEMvR01UIC00IGhvdXJzKSBvbiB0aGUKQEAgLTE1MzEsMTAgKzE0NTMsMTAgQEAKIFJ1bGUJRmFsawkyMDAxCTIwMTAJLQlTZXAJU3VuPj0xCTI6MDAJMTowMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEF0bGFudGljL1N0YW5sZXkJLTM6NTE6MjQgLQlMTVQJMTg5MAotCQkJLTM6NTE6MjQgLQlTTVQJMTkxMiBNYXIgMTIgICMgU3RhbmxleSBNZWFuIFRpbWUKLQkJCS00OjAwCUZhbGsJRkslc1QJMTk4MyBNYXkgICAgICMgRmFsa2xhbmQgSXMgVGltZQorCQkJLTM6NTE6MjQgLQlTTVQJMTkxMiBNYXIgMTIgIyBTdGFubGV5IE1lYW4gVGltZQorCQkJLTQ6MDAJRmFsawlGSyVzVAkxOTgzIE1heSAgICAjIEZhbGtsYW5kIElzIFRpbWUKIAkJCS0zOjAwCUZhbGsJRkslc1QJMTk4NSBTZXAgMTUKLQkJCS00OjAwCUZhbGsJRkslc1QJMjAxMCBTZXAgNSAwMjowMAorCQkJLTQ6MDAJRmFsawlGSyVzVAkyMDEwIFNlcCAgNSAgMjowMAogCQkJLTM6MDAJLQlGS1NUCiAKICMgRnJlbmNoIEd1aWFuYQpAQCAtMTU0NSw3ICsxNDY3LDcgQEAKIAogIyBHdXlhbmEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9HdXlhbmEJLTM6NTI6NDAgLQlMTVQJMTkxNSBNYXIJIyBHZW9yZ2V0b3duCitab25lCUFtZXJpY2EvR3V5YW5hCS0zOjUyOjQwIC0JTE1UCTE5MTUgTWFyICAgICMgR2VvcmdldG93bgogCQkJLTM6NDUJLQlHQkdUCTE5NjYgTWF5IDI2ICMgQnIgR3VpYW5hIFRpbWUKIAkJCS0zOjQ1CS0JR1lUCTE5NzUgSnVsIDMxICMgR3V5YW5hIFRpbWUKIAkJCS0zOjAwCS0JR1lUCTE5OTEKQEAgLTE1NTUsOCArMTQ3Nyw4IEBACiAjIFBhcmFndWF5CiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgc3ByaW5nIHRyYW5zaXRpb25zIGFyZSBmcm9tIDAxOjAwIC0+IDAyOjAwLAotIyBhbmQgYXV0dW1uIHRyYW5zaXRpb25zIGFyZSBmcm9tIDAwOjAwIC0+IDIzOjAwLiAgR28gd2l0aCBwcmUtMTk5OQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgc3ByaW5nIHRyYW5zaXRpb25zIGFyZSAwMTowMCAtPiAwMjowMCwKKyMgYW5kIGF1dHVtbiB0cmFuc2l0aW9ucyBhcmUgMDA6MDAgLT4gMjM6MDAuICBHbyB3aXRoIHByZS0xOTk5CiAjIGVkaXRpb25zIG9mIFNoYW5rcywgYW5kIHdpdGggdGhlIElBVEEsIHdobyBzYXkgdHJhbnNpdGlvbnMgb2NjdXIgYXQgMDA6MDAuCiAjCiAjIEZyb20gV2FsZGVtYXIgVmlsbGFtYXlvci1WZW5pYWxibyAoMjAxMy0wOS0yMCk6CkBAIC0xNTgyLDkgKzE1MDQsOCBAQAogIyAoMTAtMDEpLgogIwogIyBUcmFuc2xhdGVkIGJ5IEd3aWxsaW0gTGF3ICgyMDAxLTAyLTI3KSBmcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGlhcmlvbm90aWNpYXMuY29tLnB5LzAxMTAwMC9uYWNpb25hbC9uYWNpb25hMS5odG0iPgotIyBOb3RpY2lhcywgYSBkYWlseSBwYXBlciBpbiBBc3VuY2lvbiwgUGFyYWd1YXkgKDIwMDAtMTAtMDEpCi0jIDwvYT46CisjIE5vdGljaWFzLCBhIGRhaWx5IHBhcGVyIGluIEFzdW5jacOzbiwgUGFyYWd1YXkgKDIwMDAtMTAtMDEpOgorIyBodHRwOi8vd3d3LmRpYXJpb25vdGljaWFzLmNvbS5weS8wMTEwMDAvbmFjaW9uYWwvbmFjaW9uYTEuaHRtCiAjIFN0YXJ0aW5nIGF0IDA6MDAgdG9kYXksIHRoZSBjbG9jayB3aWxsIGJlIHNldCBmb3J3YXJkIDYwIG1pbnV0ZXMsIGluCiAjIGZ1bGZpbGxtZW50IG9mIERlY3JlZSBOby4gNywyNzMgb2YgdGhlIEV4ZWN1dGl2ZSBQb3dlci4uLi4gIFRoZSB0aW1lIGNoYW5nZQogIyBzeXN0ZW0gaGFzIGJlZW4gb3BlcmF0aW5nIGZvciBzZXZlcmFsIHllYXJzLiAgRm9ybWVybHkgdGhlcmUgd2FzIGEgc2VwYXJhdGUKQEAgLTE2MDUsMjEgKzE1MjYsMTggQEAKIFJ1bGUJUGFyYQkyMDAyCTIwMDQJLQlBcHIJU3VuPj0xCTA6MDAJMAktCiBSdWxlCVBhcmEJMjAwMgkyMDAzCS0JU2VwCVN1bj49MQkwOjAwCTE6MDAJUwogIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNS0wMS0wMik6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNS0wMS0wMik6CiAjIFRoZXJlIGFyZSBzZXZlcmFsIHNvdXJjZXMgdGhhdCBjbGFpbSB0aGF0IFBhcmFndWF5IG1hZGUKICMgYSB0aW1lem9uZSBydWxlIGNoYW5nZSBpbiBhdXR1bW4gMjAwNC4KICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDUtMDEtMDUpOgogIyBEZWNyZWUgMSw4NjcgKDIwMDQtMDMtMDUpCi0jIEZyb20gQ2FybG9zIFJhdWwgUGVyYXNzbyB2aWEgSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTEwLTEzKQotIyA8aHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YucHkvZGVjcmV0b3MvRDE4NjcucGRmPgorIyBGcm9tIENhcmxvcyBSYcO6bCBQZXJhc3NvIHZpYSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA2LTEwLTEzKQorIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5weS9kZWNyZXRvcy9EMTg2Ny5wZGYKIFJ1bGUJUGFyYQkyMDA0CTIwMDkJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwogUnVsZQlQYXJhCTIwMDUJMjAwOQktCU1hcglTdW4+PTgJMDowMAkwCS0KLSMgRnJvbSBDYXJsb3MgUmF1bCBQZXJhc3NvICgyMDEwLTAyLTE4KToKLSMgQnkgZGVjcmVlIG51bWJlciAzOTU4IGlzc3VlZCB5ZXN0ZXJkYXkgKAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5weS92MS93cC1jb250ZW50L3VwbG9hZHMvMjAxMC8wMi9kZWNyZXRvMzk1OC5wZGYiPgorIyBGcm9tIENhcmxvcyBSYcO6bCBQZXJhc3NvICgyMDEwLTAyLTE4KToKKyMgQnkgZGVjcmVlIG51bWJlciAzOTU4IGlzc3VlZCB5ZXN0ZXJkYXkKICMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YucHkvdjEvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDIvZGVjcmV0bzM5NTgucGRmCi0jIDwvYT4KLSMgKQogIyBQYXJhZ3VheSBjaGFuZ2VzIGl0cyBEU1Qgc2NoZWR1bGUsIHBvc3Rwb25pbmcgdGhlIE1hcmNoIHJ1bGUgdG8gQXByaWwgYW5kCiAjIG1vZGlmeWluZyB0aGUgT2N0b2JlciBkYXRlLiBUaGUgZGVjcmVlIHJlYWRzOgogIyAuLi4KQEAgLTE2MzUsMjUgKzE1NTMsMjUgQEAKICMgUGFyYWd1YXkgd2lsbCBlbmQgRFNUIG9uIDIwMTMtMDMtMjQgMDA6MDAuLi4uCiAjIGh0dHA6Ly93d3cuYW5kZS5nb3YucHkvaW50ZXJuYS5waHA/aWQ9MTA3NQogIwotIyBGcm9tIENhcmxvcyBSYXVsIFBlcmFzc28gKDIwMTMtMDMtMTUpOgorIyBGcm9tIENhcmxvcyBSYcO6bCBQZXJhc3NvICgyMDEzLTAzLTE1KToKICMgVGhlIGNoYW5nZSBpbiBQYXJhZ3VheSBpcyBub3cgZmluYWwuICBEZWNyZWUgbnVtYmVyIDEwNzgwCiAjIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LnB5L3VwbG9hZHMvcGRmL3ByZXNpZGVuY2lhLTNiODZmZjRiNjkxYzc5ZDRmNTkyN2NhOTY0OTIyZWM3NDc3MmNlODU3YzAyY2EwNTRhNTJhMzdiNDlhZmM3ZmIucGRmCi0jIEZyb20gQ2FybG9zIFJhdWwgUGVyYXNzbyAoMjAxNC0wMi0yOCk6CisjIEZyb20gQ2FybG9zIFJhw7psIFBlcmFzc28gKDIwMTQtMDItMjgpOgogIyBEZWNyZWUgMTI2NCBjYW4gYmUgZm91bmQgYXQ6CiAjIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LnB5L2FyY2hpdm9zL2RvY3VtZW50b3MvREVDUkVUTzEyNjRfZXk5cjh6YWkucGRmCiBSdWxlCVBhcmEJMjAxMwltYXgJLQlNYXIJU3VuPj0yMgkwOjAwCTAJLQogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvQXN1bmNpb24JLTM6NTA6NDAgLQlMTVQJMTg5MAotCQkJLTM6NTA6NDAgLQlBTVQJMTkzMSBPY3QgMTAgIyBBc3VuY2lvbiBNZWFuIFRpbWUKLQkJCS00OjAwCS0JUFlUCTE5NzIgT2N0ICMgUGFyYWd1YXkgVGltZQorCQkJLTM6NTA6NDAgLQlBTVQJMTkzMSBPY3QgMTAgIyBBc3VuY2nDs24gTWVhbiBUaW1lCisJCQktNDowMAktCVBZVAkxOTcyIE9jdCAgICAjIFBhcmFndWF5IFRpbWUKIAkJCS0zOjAwCS0JUFlUCTE5NzQgQXByCiAJCQktNDowMAlQYXJhCVBZJXNUCiAKICMgUGVydQogIwotIyA8YSBocmVmPSJuZXdzOnhyR21iLjM5OTM1JGdBMS4xMzg5NjExM0BuZXdzNC5zcnYuaGN2bG55LmN2Lm5ldCI+Ci0jIEZyb20gRXZlbHluIEMuIExlZXBlciB2aWEgTWFyayBCcmFkZXIgKDIwMDMtMTAtMjYpOjwvYT4KKyMgRnJvbSBFdmVseW4gQy4gTGVlcGVyIHZpYSBNYXJrIEJyYWRlciAoMjAwMy0xMC0yNikKKyMgPG5ld3M6eHJHbWIuMzk5MzUkZ0ExLjEzODk2MTEzQG5ld3M0LnNydi5oY3ZsbnkuY3YubmV0PjoKICMgV2hlbiB3ZSB3ZXJlIGluIFBlcnUgaW4gMTk4NS0xOTg2LCB0aGV5IGFwcGFyZW50bHkgc3dpdGNoZWQgb3ZlcgogIyBzb21ldGltZSBiZXR3ZWVuIERlY2VtYmVyIDI5IGFuZCBKYW51YXJ5IDMgd2hpbGUgd2Ugd2VyZSBvbiB0aGUgQW1hem9uLgogIwpAQCAtMTY3OSw3ICsxNTk3LDcgQEAKIAogIyBTb3V0aCBHZW9yZ2lhCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF0bGFudGljL1NvdXRoX0dlb3JnaWEgLTI6MjY6MDggLQlMTVQJMTg5MAkJIyBHcnl0dmlrZW4KK1pvbmUgQXRsYW50aWMvU291dGhfR2VvcmdpYSAtMjoyNjowOCAtCUxNVAkxODkwICMgR3J5dHZpa2VuCiAJCQktMjowMAktCUdTVAkjIFNvdXRoIEdlb3JnaWEgVGltZQogCiAjIFNvdXRoIFNhbmR3aWNoIElzCkBAIC0xNjg5LDkgKzE2MDcsOSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL1BhcmFtYXJpYm8JLTM6NDA6NDAgLQlMTVQJMTkxMQogCQkJLTM6NDA6NTIgLQlQTVQJMTkzNSAgICAgIyBQYXJhbWFyaWJvIE1lYW4gVGltZQotCQkJLTM6NDA6MzYgLQlQTVQJMTk0NSBPY3QgIyBUaGUgY2FwaXRhbCBtb3ZlZD8KKwkJCS0zOjQwOjM2IC0JUE1UCTE5NDUgT2N0ICAgICMgVGhlIGNhcGl0YWwgbW92ZWQ/CiAJCQktMzozMAktCU5FR1QJMTk3NSBOb3YgMjAgIyBEdXRjaCBHdWlhbmEgVGltZQotCQkJLTM6MzAJLQlTUlQJMTk4NCBPY3QgIyBTdXJpbmFtZSBUaW1lCisJCQktMzozMAktCVNSVAkxOTg0IE9jdCAgICAjIFN1cmluYW1lIFRpbWUKIAkJCS0zOjAwCS0JU1JUCiAKICMgVHJpbmlkYWQgYW5kIFRvYmFnbwpAQCAtMTcwNiw3ICsxNjI0LDcgQEAKIExpbmsgQW1lcmljYS9Qb3J0X29mX1NwYWluIEFtZXJpY2EvR3VhZGVsb3VwZQogTGluayBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gQW1lcmljYS9NYXJpZ290CSMgU3QgTWFydGluIChGcmVuY2ggcGFydCkKIExpbmsgQW1lcmljYS9Qb3J0X29mX1NwYWluIEFtZXJpY2EvTW9udHNlcnJhdAotTGluayBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gQW1lcmljYS9TdF9CYXJ0aGVsZW15CitMaW5rIEFtZXJpY2EvUG9ydF9vZl9TcGFpbiBBbWVyaWNhL1N0X0JhcnRoZWxlbXkgIyBTdCBCYXJ0aMOpbGVteQogTGluayBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gQW1lcmljYS9TdF9LaXR0cwkjIFN0IEtpdHRzICYgTmV2aXMKIExpbmsgQW1lcmljYS9Qb3J0X29mX1NwYWluIEFtZXJpY2EvU3RfTHVjaWEKIExpbmsgQW1lcmljYS9Qb3J0X29mX1NwYWluIEFtZXJpY2EvU3RfVGhvbWFzCSMgVmlyZ2luIElzbGFuZHMgKFVTKQpAQCAtMTc2NSw3ICsxNjgzLDcgQEAKIFJ1bGUJVXJ1Z3VheQkxOTkyCW9ubHkJLQlPY3QJMTgJIDA6MDAJMTowMAlTCiBSdWxlCVVydWd1YXkJMTk5Mwlvbmx5CS0JRmViCTI4CSAwOjAwCTAJLQogIyBGcm9tIEVkdWFyZG8gQ290YSAoMjAwNC0wOS0yMCk6Ci0jIFRoZSB1cnVndWF5YW4gZ292ZXJubWVudCBoYXMgZGVjcmVlZCBhIGNoYW5nZSBpbiB0aGUgbG9jYWwgdGltZS4uLi4KKyMgVGhlIFVydWd1YXlhbiBnb3Zlcm5tZW50IGhhcyBkZWNyZWVkIGEgY2hhbmdlIGluIHRoZSBsb2NhbCB0aW1lLi4uLgogIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmd1Yi51eS9kZWNyZXRvcy8yMDA0MDkxNTAyLmh0bQogUnVsZQlVcnVndWF5CTIwMDQJb25seQktCVNlcAkxOQkgMDowMAkxOjAwCVMKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDUtMDMtMTEpOgpAQCAtMTc3OSwxNCArMTY5NywxNCBAQAogIyAwMjowMCBsb2NhbCB0aW1lLCBvZmZpY2lhbCB0aW1lIGluIFVydWd1YXkgd2lsbCBiZSBhdCBHTVQgLTIuCiBSdWxlCVVydWd1YXkJMjAwNQlvbmx5CS0JT2N0CSA5CSAyOjAwCTE6MDAJUwogUnVsZQlVcnVndWF5CTIwMDYJb25seQktCU1hcgkxMgkgMjowMAkwCS0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDktMDYpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDktMDYpOgogIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmd1Yi51eS9fd2ViL2RlY3JldG9zLzIwMDYvMDkvQ00lMjAyMTBfMDglMjAwNiUyMDIwMDZfMDAwMDEuUERGCiBSdWxlCVVydWd1YXkJMjAwNgltYXgJLQlPY3QJU3VuPj0xCSAyOjAwCTE6MDAJUwogUnVsZQlVcnVndWF5CTIwMDcJbWF4CS0JTWFyCVN1bj49OAkgMjowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW1lcmljYS9Nb250ZXZpZGVvCS0zOjQ0OjQ0IC0JTE1UCTE4OTggSnVuIDI4Ci0JCQktMzo0NDo0NCAtCU1NVAkxOTIwIE1heSAgMQkjIE1vbnRldmlkZW8gTVQKLQkJCS0zOjMwCVVydWd1YXkJVVklc1QJMTk0MiBEZWMgMTQJIyBVcnVndWF5IFRpbWUKKwkJCS0zOjQ0OjQ0IC0JTU1UCTE5MjAgTWF5ICAxICMgTW9udGV2aWRlbyBNVAorCQkJLTM6MzAJVXJ1Z3VheQlVWSVzVAkxOTQyIERlYyAxNCAjIFVydWd1YXkgVGltZQogCQkJLTM6MDAJVXJ1Z3VheQlVWSVzVAogCiAjIFZlbmV6dWVsYQpAQCAtMTc5NCwxNCArMTcxMiwxNCBAQAogIyBGcm9tIEpvaG4gU3RhaW5mb3J0aCAoMjAwNy0xMS0yOCk6CiAjIC4uLiB0aGUgY2hhbmdlIGZvciBWZW5lenVlbGEgb3JpZ2luYWxseSBleHBlY3RlZCBmb3IgMjAwNy0xMi0zMSBoYXMKICMgYmVlbiBicm91Z2h0IGZvcndhcmQgdG8gMjAwNy0xMi0wOS4gIFRoZSBvZmZpY2lhbCBhbm5vdW5jZW1lbnQgd2FzCi0jIHB1Ymxpc2hlZCB0b2RheSBpbiB0aGUgIkdhY2V0YSBPZmljaWFsIGRlIGxhIFJlcHVibGljYSBCb2xpdmFyaWFuYQotIyBkZSBWZW5lenVlbGEsIG51bWVybyAzOC44MTkiIChvZmZpY2lhbCBkb2N1bWVudCBmb3IgYWxsIGxhd3Mgb3IKKyMgcHVibGlzaGVkIHRvZGF5IGluIHRoZSAiR2FjZXRhIE9maWNpYWwgZGUgbGEgUmVww7pibGljYSBCb2xpdmFyaWFuYQorIyBkZSBWZW5lenVlbGEsIG7Dum1lcm8gMzguODE5IiAob2ZmaWNpYWwgZG9jdW1lbnQgZm9yIGFsbCBsYXdzIG9yCiAjIHJlc29sdXRpb24gcHVibGljYXRpb24pCiAjIGh0dHA6Ly93d3cuZ2xvYm92aXNpb24uY29tL25ld3MucGhwP25pZD03MjIwOAogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFtZXJpY2EvQ2FyYWNhcwktNDoyNzo0NCAtCUxNVAkxODkwCiAJCQktNDoyNzo0MCAtCUNNVAkxOTEyIEZlYiAxMiAjIENhcmFjYXMgTWVhbiBUaW1lPwotCQkJLTQ6MzAJLQlWRVQJMTk2NQkgICAgICMgVmVuZXp1ZWxhIFRpbWUKLQkJCS00OjAwCS0JVkVUCTIwMDcgRGVjICA5IDAzOjAwCisJCQktNDozMAktCVZFVAkxOTY1ICAgICAgICAjIFZlbmV6dWVsYSBUaW1lCisJCQktNDowMAktCVZFVAkyMDA3IERlYyAgOSAgMzowMAogCQkJLTQ6MzAJLQlWRVQKZGlmZiAtLWdpdCBhL21ha2UvZGF0YS90emRhdGEvc3lzdGVtdiBiL21ha2UvZGF0YS90emRhdGEvc3lzdGVtdgppbmRleCBmOTA5ZjljLi5jN2I5YTg4IDEwMDY0NAotLS0gYS9tYWtlL2RhdGEvdHpkYXRhL3N5c3RlbXYKKysrIGIvbWFrZS9kYXRhL3R6ZGF0YS9zeXN0ZW12CkBAIC0yMSw3ICsyMSw2IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIApkaWZmIC0tZ2l0IGEvbWFrZS9kYXRhL3R6ZGF0YS96b25lLnRhYiBiL21ha2UvZGF0YS90emRhdGEvem9uZS50YWIKaW5kZXggN2NlYzYyNy4uNDUzNTFjYSAxMDA2NDQKLS0tIGEvbWFrZS9kYXRhL3R6ZGF0YS96b25lLnRhYgorKysgYi9tYWtlL2RhdGEvdHpkYXRhL3pvbmUudGFiCkBAIC0yMSwzOSArMjEsMjcgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIFRaIHpvbmUgZGVzY3JpcHRpb25zCisjIHR6IHpvbmUgZGVzY3JpcHRpb25zIChkZXByZWNhdGVkIHZlcnNpb24pCiAjCiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDEzLTA4LTE0KToKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0zMSk6CisjIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCBhcyBhIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgYWlkIGZvciBvbGRlciBwcm9ncmFtcy4KKyMgTmV3IHByb2dyYW1zIHNob3VsZCB1c2Ugem9uZTE5NzAudGFiLiAgVGhpcyBmaWxlIGlzIGxpa2Ugem9uZTE5NzAudGFiIChzZWUKKyMgem9uZTE5NzAudGFiJ3MgY29tbWVudHMpLCBidXQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zOgogIwotIyBUaGlzIGZpbGUgY29udGFpbnMgYSB0YWJsZSB3aGVyZSBlYWNoIHJvdyBzdGFuZHMgZm9yIGFuIGFyZWEgdGhhdCBpcwotIyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgcmVnaW9uIGlkZW50aWZpZWQgYnkgYSBjb3VudHJ5IGNvZGUgYW5kIG9mIGEKLSMgem9uZSB3aGVyZSBjaXZpbCBjbG9ja3MgaGF2ZSBhZ3JlZWQgc2luY2UgMTk3MC4gIFRoZSBjb2x1bW5zIG9mIHRoZQotIyB0YWJsZSBhcmUgYXMgZm9sbG93czoKKyMgMS4gIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMuCisjIDIuICBUaGUgZmlyc3QgZGF0YSBjb2x1bW4gY29udGFpbnMgZXhhY3RseSBvbmUgY291bnRyeSBjb2RlLgogIwotIyAxLiAgSVNPIDMxNjYgMi1jaGFyYWN0ZXIgY291bnRyeSBjb2RlLiAgU2VlIHRoZSBmaWxlICdpc28zMTY2LnRhYicuCi0jIDIuICBMYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIG9mIHRoZSBhcmVhJ3MgcHJpbmNpcGFsIGxvY2F0aW9uCi0jICAgICBpbiBJU08gNjcwOSBzaWduLWRlZ3JlZXMtbWludXRlcy1zZWNvbmRzIGZvcm1hdCwKLSMgICAgIGVpdGhlciArLURETU0rLURERE1NIG9yICstRERNTVNTKy1ERERNTVNTLAotIyAgICAgZmlyc3QgbGF0aXR1ZGUgKCsgaXMgbm9ydGgpLCB0aGVuIGxvbmdpdHVkZSAoKyBpcyBlYXN0KS4KLSMgMy4gIFpvbmUgbmFtZSB1c2VkIGluIHZhbHVlIG9mIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLgotIyAgICAgUGxlYXNlIHNlZSB0aGUgJ1RoZW9yeScgZmlsZSBmb3IgaG93IHpvbmUgbmFtZXMgYXJlIGNob3Nlbi4KLSMgICAgIElmIG11bHRpcGxlIHpvbmVzIG92ZXJsYXAgYSBjb3VudHJ5LCBlYWNoIGhhcyBhIHJvdyBpbiB0aGUKLSMgICAgIHRhYmxlLCB3aXRoIGNvbHVtbiAxIGJlaW5nIGR1cGxpY2F0ZWQuCi0jIDQuICBDb21tZW50czsgcHJlc2VudCBpZiBhbmQgb25seSBpZiB0aGUgY291bnRyeSBoYXMgbXVsdGlwbGUgcm93cy4KLSMKLSMgQ29sdW1ucyBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHRhYi4KLSMgVGhlIHRhYmxlIGlzIHNvcnRlZCBmaXJzdCBieSBjb3VudHJ5LCB0aGVuIGFuIG9yZGVyIHdpdGhpbiB0aGUgY291bnRyeSB0aGF0Ci0jICgxKSBtYWtlcyBzb21lIGdlb2dyYXBoaWNhbCBzZW5zZSwgYW5kCi0jICgyKSBwdXRzIHRoZSBtb3N0IHBvcHVsb3VzIGFyZWFzIGZpcnN0LCB3aGVyZSB0aGF0IGRvZXMgbm90IGNvbnRyYWRpY3QgKDEpLgotIwotIyBMaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGNvbW1lbnRzLgorIyBCZWNhdXNlIG9mICgyKSwgZWFjaCByb3cgc3RhbmRzIGZvciBhbiBhcmVhIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbgorIyBvZiBhIHJlZ2lvbiBpZGVudGlmaWVkIGJ5IGEgY291bnRyeSBjb2RlIGFuZCBvZiBhIHpvbmUgd2hlcmUgY2l2aWwKKyMgY2xvY2tzIGhhdmUgYWdyZWVkIHNpbmNlIDE5NzA7IHRoaXMgaXMgYSBuYXJyb3dlciBkZWZpbml0aW9uIHRoYW4KKyMgdGhhdCBvZiB6b25lMTk3MC50YWIuCiAjCiAjIFRoaXMgdGFibGUgaXMgaW50ZW5kZWQgYXMgYW4gYWlkIGZvciB1c2VycywgdG8gaGVscCB0aGVtIHNlbGVjdCB0aW1lCi0jIHpvbmUgZGF0YSBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgcHJhY3RpY2FsIG5lZWRzLiAgSXQgaXMgbm90IGludGVuZGVkCi0jIHRvIHRha2Ugb3IgZW5kb3JzZSBhbnkgcG9zaXRpb24gb24gbGVnYWwgb3IgdGVycml0b3JpYWwgY2xhaW1zLgorIyB6b25lIGRhdGEgZW50cmllcyBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgcHJhY3RpY2FsIG5lZWRzLiAgSXQgaXMgbm90CisjIGludGVuZGVkIHRvIHRha2Ugb3IgZW5kb3JzZSBhbnkgcG9zaXRpb24gb24gbGVnYWwgb3IgdGVycml0b3JpYWwgY2xhaW1zLgogIwogI2NvdW50cnktCiAjY29kZQljb29yZGluYXRlcwlUWgkJCWNvbW1lbnRzCkBAIC03Miw3ICs2MCw3IEBACiBBUQktNjgzNSswNzc1OAlBbnRhcmN0aWNhL0RhdmlzCURhdmlzIFN0YXRpb24sIFZlc3Rmb2xkIEhpbGxzCiBBUQktNjYxNysxMTAzMQlBbnRhcmN0aWNhL0Nhc2V5CUNhc2V5IFN0YXRpb24sIEJhaWxleSBQZW5pbnN1bGEKIEFRCS03ODI0KzEwNjU0CUFudGFyY3RpY2EvVm9zdG9rCVZvc3RvayBTdGF0aW9uLCBMYWtlIFZvc3RvawotQVEJLTY2NDArMTQwMDEJQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZQlEdW1vbnQtZCdVcnZpbGxlIFN0YXRpb24sIFRlcnJlIEFkZWxpZQorQVEJLTY2NDArMTQwMDEJQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZQlEdW1vbnQtZCdVcnZpbGxlIFN0YXRpb24sIEFkZWxpZSBMYW5kCiBBUQktNjkwMDIyKzAzOTM1MjQJQW50YXJjdGljYS9TeW93YQlTeW93YSBTdGF0aW9uLCBFIE9uZ3VsIEkKIEFRCS03MjAwNDErMDAyMzIwNglBbnRhcmN0aWNhL1Ryb2xsCVRyb2xsIFN0YXRpb24sIFF1ZWVuIE1hdWQgTGFuZAogQVIJLTM0MzYtMDU4MjcJQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzCUJ1ZW5vcyBBaXJlcyAoQkEsIENGKQpAQCAtMTUxLDcgKzEzOSw3IEBACiBDQQkrNDgyMy0wODkxNQlBbWVyaWNhL1RodW5kZXJfQmF5CUVhc3Rlcm4gVGltZSAtIFRodW5kZXIgQmF5LCBPbnRhcmlvCiBDQQkrNjM0NC0wNjgyOAlBbWVyaWNhL0lxYWx1aXQJRWFzdGVybiBUaW1lIC0gZWFzdCBOdW5hdnV0IC0gbW9zdCBsb2NhdGlvbnMKIENBCSs2NjA4LTA2NTQ0CUFtZXJpY2EvUGFuZ25pcnR1bmcJRWFzdGVybiBUaW1lIC0gUGFuZ25pcnR1bmcsIE51bmF2dXQKLUNBCSs3NDQxNDQtMDk0NDk0NQlBbWVyaWNhL1Jlc29sdXRlCUNlbnRyYWwgU3RhbmRhcmQgVGltZSAtIFJlc29sdXRlLCBOdW5hdnV0CitDQQkrNzQ0MTQ0LTA5NDQ5NDUJQW1lcmljYS9SZXNvbHV0ZQlDZW50cmFsIFRpbWUgLSBSZXNvbHV0ZSwgTnVuYXZ1dAogQ0EJKzQ4NDUzMS0wOTEzNzE4CUFtZXJpY2EvQXRpa29rYW4JRWFzdGVybiBTdGFuZGFyZCBUaW1lIC0gQXRpa29rYW4sIE9udGFyaW8gYW5kIFNvdXRoYW1wdG9uIEksIE51bmF2dXQKIENBCSs2MjQ5MDAtMDkyMDQ1OQlBbWVyaWNhL1Jhbmtpbl9JbmxldAlDZW50cmFsIFRpbWUgLSBjZW50cmFsIE51bmF2dXQKIENBCSs0OTUzLTA5NzA5CUFtZXJpY2EvV2lubmlwZWcJQ2VudHJhbCBUaW1lIC0gTWFuaXRvYmEgJiB3ZXN0IE9udGFyaW8KQEAgLTE3NiwxMyArMTY0LDEwIEBACiBDSQkrMDUxOS0wMDQwMglBZnJpY2EvQWJpZGphbgogQ0sJLTIxMTQtMTU5NDYJUGFjaWZpYy9SYXJvdG9uZ2EKIENMCS0zMzI3LTA3MDQwCUFtZXJpY2EvU2FudGlhZ28JbW9zdCBsb2NhdGlvbnMKLUNMCS0yNzA5LTEwOTI2CVBhY2lmaWMvRWFzdGVyCUVhc3RlciBJc2xhbmQgJiBTYWxhIHkgR29tZXoKK0NMCS0yNzA5LTEwOTI2CVBhY2lmaWMvRWFzdGVyCUVhc3RlciBJc2xhbmQKIENNCSswNDAzKzAwOTQyCUFmcmljYS9Eb3VhbGEKLUNOCSszMTE0KzEyMTI4CUFzaWEvU2hhbmdoYWkJZWFzdCBDaGluYSAtIEJlaWppbmcsIEd1YW5nZG9uZywgU2hhbmdoYWksIGV0Yy4KLUNOCSs0NTQ1KzEyNjQxCUFzaWEvSGFyYmluCUhlaWxvbmdqaWFuZyAoZXhjZXB0IE1vaGUpLCBKaWxpbgotQ04JKzI5MzQrMTA2MzUJQXNpYS9DaG9uZ3FpbmcJY2VudHJhbCBDaGluYSAtIFNpY2h1YW4sIFl1bm5hbiwgR3Vhbmd4aSwgU2hhYW54aSwgR3VpemhvdSwgZXRjLgotQ04JKzQzNDgrMDg3MzUJQXNpYS9VcnVtcWkJbW9zdCBvZiBUaWJldCAmIFhpbmppYW5nCi1DTgkrMzkyOSswNzU1OQlBc2lhL0thc2hnYXIJd2VzdCBUaWJldCAmIFhpbmppYW5nCitDTgkrMzExNCsxMjEyOAlBc2lhL1NoYW5naGFpCUJlaWppbmcgVGltZQorQ04JKzQzNDgrMDg3MzUJQXNpYS9VcnVtcWkJWGluamlhbmcgVGltZQogQ08JKzA0MzYtMDc0MDUJQW1lcmljYS9Cb2dvdGEKIENSCSswOTU2LTA4NDA1CUFtZXJpY2EvQ29zdGFfUmljYQogQ1UJKzIzMDgtMDgyMjIJQW1lcmljYS9IYXZhbmEKQEAgLTM2NCwyNCArMzQ5LDI2IEBACiBSTwkrNDQyNiswMjYwNglFdXJvcGUvQnVjaGFyZXN0CiBSUwkrNDQ1MCswMjAzMAlFdXJvcGUvQmVsZ3JhZGUKIFJVCSs1NDQzKzAyMDMwCUV1cm9wZS9LYWxpbmluZ3JhZAlNb3Njb3ctMDEgLSBLYWxpbmluZ3JhZAotUlUJKzU1NDUrMDM3MzUJRXVyb3BlL01vc2NvdwlNb3Njb3crMDAgLSB3ZXN0IFJ1c3NpYQotUlUJKzQ4NDQrMDQ0MjUJRXVyb3BlL1ZvbGdvZ3JhZAlNb3Njb3crMDAgLSBDYXNwaWFuIFNlYQotUlUJKzUzMTIrMDUwMDkJRXVyb3BlL1NhbWFyYQlNb3Njb3crMDAgLSBTYW1hcmEsIFVkbXVydGlhCitSVQkrNTU0NTIxKzAzNzM3MDQJRXVyb3BlL01vc2NvdwlNb3Njb3crMDAgLSB3ZXN0IFJ1c3NpYQogUlUJKzQ0NTcrMDM0MDYJRXVyb3BlL1NpbWZlcm9wb2wJTW9zY293KzAwIC0gQ3JpbWVhCitSVQkrNDg0NCswNDQyNQlFdXJvcGUvVm9sZ29ncmFkCU1vc2NvdyswMCAtIENhc3BpYW4gU2VhCitSVQkrNTMxMiswNTAwOQlFdXJvcGUvU2FtYXJhCU1vc2NvdyswMCAoTW9zY293KzAxIGFmdGVyIDIwMTQtMTAtMjYpIC0gU2FtYXJhLCBVZG11cnRpYQogUlUJKzU2NTErMDYwMzYJQXNpYS9ZZWthdGVyaW5idXJnCU1vc2NvdyswMiAtIFVyYWxzCiBSVQkrNTUwMCswNzMyNAlBc2lhL09tc2sJTW9zY293KzAzIC0gd2VzdCBTaWJlcmlhCiBSVQkrNTUwMiswODI1NQlBc2lhL05vdm9zaWJpcnNrCU1vc2NvdyswMyAtIE5vdm9zaWJpcnNrCi1SVQkrNTM0NSswODcwNwlBc2lhL05vdm9rdXpuZXRzawlNb3Njb3crMDMgLSBOb3Zva3V6bmV0c2sKK1JVCSs1MzQ1KzA4NzA3CUFzaWEvTm92b2t1em5ldHNrCU1vc2NvdyswMyAoTW9zY293KzA0IGFmdGVyIDIwMTQtMTAtMjYpIC0gS2VtZXJvdm8KIFJVCSs1NjAxKzA5MjUwCUFzaWEvS3Jhc25veWFyc2sJTW9zY293KzA0IC0gWWVuaXNlaSBSaXZlcgogUlUJKzUyMTYrMTA0MjAJQXNpYS9Jcmt1dHNrCU1vc2NvdyswNSAtIExha2UgQmFpa2FsCitSVQkrNTIwMysxMTMyOAlBc2lhL0NoaXRhCU1vc2NvdyswNiAoTW9zY293KzA1IGFmdGVyIDIwMTQtMTAtMjYpIC0gWmFiYXlrYWxza3kKIFJVCSs2MjAwKzEyOTQwCUFzaWEvWWFrdXRzawlNb3Njb3crMDYgLSBMZW5hIFJpdmVyCiBSVQkrNjIzOTIzKzEzNTMzMTQJQXNpYS9LaGFuZHlnYQlNb3Njb3crMDYgLSBUb21wb25za3ksIFVzdC1NYXlza3kKIFJVCSs0MzEwKzEzMTU2CUFzaWEvVmxhZGl2b3N0b2sJTW9zY293KzA3IC0gQW11ciBSaXZlcgogUlUJKzQ2NTgrMTQyNDIJQXNpYS9TYWtoYWxpbglNb3Njb3crMDcgLSBTYWtoYWxpbiBJc2xhbmQKIFJVCSs2NDMzMzcrMTQzMTMzNglBc2lhL1VzdC1OZXJhCU1vc2NvdyswNyAtIE95bXlha29uc2t5Ci1SVQkrNTkzNCsxNTA0OAlBc2lhL01hZ2FkYW4JTW9zY293KzA4IC0gTWFnYWRhbgotUlUJKzUzMDErMTU4MzkJQXNpYS9LYW1jaGF0a2EJTW9zY293KzA4IC0gS2FtY2hhdGthCi1SVQkrNjQ0NSsxNzcyOQlBc2lhL0FuYWR5cglNb3Njb3crMDggLSBCZXJpbmcgU2VhCitSVQkrNTkzNCsxNTA0OAlBc2lhL01hZ2FkYW4JTW9zY293KzA4IChNb3Njb3crMDcgYWZ0ZXIgMjAxNC0xMC0yNikgLSBNYWdhZGFuCitSVQkrNjcyOCsxNTM0MwlBc2lhL1NyZWRuZWtvbHltc2sJTW9zY293KzA4IC0gRSBTYWtoYSwgTiBLdXJpbCBJcworUlUJKzUzMDErMTU4MzkJQXNpYS9LYW1jaGF0a2EJTW9zY293KzA4IChNb3Njb3crMDkgYWZ0ZXIgMjAxNC0xMC0yNikgLSBLYW1jaGF0a2EKK1JVCSs2NDQ1KzE3NzI5CUFzaWEvQW5hZHlyCU1vc2NvdyswOCAoTW9zY293KzA5IGFmdGVyIDIwMTQtMTAtMjYpIC0gQmVyaW5nIFNlYQogUlcJLTAxNTcrMDMwMDQJQWZyaWNhL0tpZ2FsaQogU0EJKzI0MzgrMDQ2NDMJQXNpYS9SaXlhZGgKIFNCCS0wOTMyKzE2MDEyCVBhY2lmaWMvR3VhZGFsY2FuYWwKQEAgLTQ0OCwxMyArNDM1LDEzIEBACiBVUwkrNDMzNjQ5LTExNjEyMDkJQW1lcmljYS9Cb2lzZQlNb3VudGFpbiBUaW1lIC0gc291dGggSWRhaG8gJiBlYXN0IE9yZWdvbgogVVMJKzMzMjY1NC0xMTIwNDI0CUFtZXJpY2EvUGhvZW5peAlNb3VudGFpbiBTdGFuZGFyZCBUaW1lIC0gQXJpem9uYSAoZXhjZXB0IE5hdmFqbykKIFVTCSszNDAzMDgtMTE4MTQzNAlBbWVyaWNhL0xvc19BbmdlbGVzCVBhY2lmaWMgVGltZQorVVMJKzU1MDczNy0xMzEzNDM1CUFtZXJpY2EvTWV0bGFrYXRsYQlQYWNpZmljIFN0YW5kYXJkIFRpbWUgLSBBbm5ldHRlIElzbGFuZCwgQWxhc2thCiBVUwkrNjExMzA1LTE0OTU0MDEJQW1lcmljYS9BbmNob3JhZ2UJQWxhc2thIFRpbWUKIFVTCSs1ODE4MDctMTM0MjUxMQlBbWVyaWNhL0p1bmVhdQlBbGFza2EgVGltZSAtIEFsYXNrYSBwYW5oYW5kbGUKIFVTCSs1NzEwMzUtMTM1MTgwNwlBbWVyaWNhL1NpdGthCUFsYXNrYSBUaW1lIC0gc291dGhlYXN0IEFsYXNrYSBwYW5oYW5kbGUKIFVTCSs1OTMyNDktMTM5NDMzOAlBbWVyaWNhL1lha3V0YXQJQWxhc2thIFRpbWUgLSBBbGFza2EgcGFuaGFuZGxlIG5lY2sKIFVTCSs2NDMwMDQtMTY1MjQyMwlBbWVyaWNhL05vbWUJQWxhc2thIFRpbWUgLSB3ZXN0IEFsYXNrYQogVVMJKzUxNTI0OC0xNzYzOTI5CUFtZXJpY2EvQWRhawlBbGV1dGlhbiBJc2xhbmRzCi1VUwkrNTUwNzM3LTEzMTM0MzUJQW1lcmljYS9NZXRsYWthdGxhCU1ldGxha2F0bGEgVGltZSAtIEFubmV0dGUgSXNsYW5kCiBVUwkrMjExODI1LTE1NzUxMzAJUGFjaWZpYy9Ib25vbHVsdQlIYXdhaWkKIFVZCS0zNDUzLTA1NjExCUFtZXJpY2EvTW9udGV2aWRlbwogVVoJKzM5NDArMDY2NDgJQXNpYS9TYW1hcmthbmQJd2VzdCBVemJla2lzdGFuCmRpZmYgLS1naXQgYS9zcmMvYWl4L2NsYXNzZXMvc3VuL2F3dC9mb250Y29uZmlncy9haXguZm9udGNvbmZpZy5wcm9wZXJ0aWVzIGIvc3JjL2FpeC9jbGFzc2VzL3N1bi9hd3QvZm9udGNvbmZpZ3MvYWl4LmZvbnRjb25maWcucHJvcGVydGllcwppbmRleCAyOWU3YzdkLi5mMjAzZjc1IDEwMDY0NAotLS0gYS9zcmMvYWl4L2NsYXNzZXMvc3VuL2F3dC9mb250Y29uZmlncy9haXguZm9udGNvbmZpZy5wcm9wZXJ0aWVzCisrKyBiL3NyYy9haXgvY2xhc3Nlcy9zdW4vYXd0L2ZvbnRjb25maWdzL2FpeC5mb250Y29uZmlnLnByb3BlcnRpZXMKQEAgLTI0LDkgKzI0LDE0IEBACiAjIHF1ZXN0aW9ucy4KICMKIAotIyBNaW5pbWFsIHZlcnNpb24gZm9yIEFJWCB1c2luZyB0aGUgc3RhbmRhcmQgTGF0aW4gVHlwZTEgRm9udHMgZnJvbSB0aGUKLSMgcGFja2FnZSBYMTEuZm50Lmlzb19UMS4gVGhlc2UgZm9udHMgYXJlIGluc3RhbGxlZCBieSBkZWZhdWx0IGludG8KLSMgIi91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxIiBhbmQgc3ltLWxpbmtlZCB0byAiL3Vzci9saWIvWDExL2ZvbnRzL1R5cGUxIgorIworIyBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMTQgSUJNIENvcnBvcmF0aW9uCisjCisKKyMgVGhpcyBmaWxlIHJlZmVyZW5jZXMgdGhlIHN0YW5kYXJkIExhdGluIFR5cGUxIGZvbnRzIGZyb20gdGhlIEFJWCBwYWNrYWdlCisjIFgxMS5mbnQuaXNvX1QxIGFuZCB0aGUgVW5pY29kZSBUcnVlVHlwZSBmb250cyBmcm9tIFgxMS5mbnQudWNzLnR0Zi4gVGhleQorIyBhcmUgbG9jYXRlZCBieSBkZWZhdWx0IHVuZGVyICIvdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy97VHlwZTEsVHJ1ZVR5cGV9IgorIyBhbmQgc3ltLWxpbmtlZCB0byAiL3Vzci9saWIvWDExL2ZvbnRzLyIuCiAKICMgVmVyc2lvbgogCkBAIC0zNCw0NCArMzksMzgxIEBACiAKICMgQ29tcG9uZW50IEZvbnQgTWFwcGluZ3MKIAotZGlhbG9nLnBsYWluLmxhdGluLTE9LSotaGVsdmV0aWNhLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc28xMDY0Ni0xCi1kaWFsb2cuYm9sZC5sYXRpbi0xPS0qLWhlbHZldGljYS1ib2xkLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzEwNjQ2LTEKLWRpYWxvZy5pdGFsaWMubGF0aW4tMT0tKi1oZWx2ZXRpY2EtbWVkaXVtLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzEwNjQ2LTEKLWRpYWxvZy5ib2xkaXRhbGljLmxhdGluLTE9LSotaGVsdmV0aWNhLWJvbGQtby1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMQorYWxsZm9udHMuaXNvMTA2NDYtZXh0Qj0tbW9ub3R5cGUtc2Fuc21vbm93dGV4dGItbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11bmljb2RlLTIKIAotZGlhbG9naW5wdXQucGxhaW4ubGF0aW4tMT0tKi1jb3VyaWVyLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLW0tKi1pc28xMDY0Ni0xCi1kaWFsb2dpbnB1dC5ib2xkLmxhdGluLTE9LSotY291cmllci1ib2xkLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtbS0qLWlzbzEwNjQ2LTEKLWRpYWxvZ2lucHV0Lml0YWxpYy5sYXRpbi0xPS0qLWNvdXJpZXItbWVkaXVtLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtbS0qLWlzbzEwNjQ2LTEKLWRpYWxvZ2lucHV0LmJvbGRpdGFsaWMubGF0aW4tMT0tKi1jb3VyaWVyLWJvbGQtby1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvMTA2NDYtMQogCi1zYW5zc2VyaWYucGxhaW4ubGF0aW4tMT0tKi1oZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzEwNjQ2LTEKLXNhbnNzZXJpZi5ib2xkLmxhdGluLTE9LSotaGVsdmV0aWNhLWJvbGQtci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMQotc2Fuc3NlcmlmLml0YWxpYy5sYXRpbi0xPS0qLWhlbHZldGljYS1tZWRpdW0tby1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMQotc2Fuc3NlcmlmLmJvbGRpdGFsaWMubGF0aW4tMT0tKi1oZWx2ZXRpY2EtYm9sZC1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc28xMDY0Ni0xCitkaWFsb2cucGxhaW4ubGF0aW4tMT0tKi1oZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMQorZGlhbG9nLnBsYWluLnRoYWk9LWlibS10aGFpaGVsdmV0aWNhLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi50aGFpLTAKK2RpYWxvZy5wbGFpbi51a3Jhbmlhbi1pYm0xMTI0PS0qLSotbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLmkxOG4tMAorZGlhbG9nLnBsYWluLmphcGFuZXNlLXgwMjA4PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTAKK2RpYWxvZy5wbGFpbi5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitkaWFsb2cucGxhaW4uamFwYW5lc2UtdWRjPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanAKK2RpYWxvZy5wbGFpbi5qYXBhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMAorZGlhbG9nLnBsYWluLmtvcmVhbj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK2RpYWxvZy5wbGFpbi5rb3JlYW4taXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTAKK2RpYWxvZy5wbGFpbi5jaGluZXNlPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wCitkaWFsb2cucGxhaW4uY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorZGlhbG9nLnBsYWluLnRhaXdhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTAKIAotc2VyaWYucGxhaW4ubGF0aW4tMT0tKi10aW1lcyBuZXcgcm9tYW4tbWVkaXVtLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzEwNjQ2LTEKLXNlcmlmLmJvbGQubGF0aW4tMT0tKi10aW1lcyBuZXcgcm9tYW4tYm9sZC1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc28xMDY0Ni0xCi1zZXJpZi5pdGFsaWMubGF0aW4tMT0tKi10aW1lcyBuZXcgcm9tYW4tbWVkaXVtLWktbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzEwNjQ2LTEKLXNlcmlmLmJvbGRpdGFsaWMubGF0aW4tMT0tKi10aW1lcyBuZXcgcm9tYW4tYm9sZC1pLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc28xMDY0Ni0xCitkaWFsb2cuYm9sZC5sYXRpbi0xPS0qLWhlbHZldGljYS1ib2xkLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMQorZGlhbG9nLmJvbGQudGhhaT0taWJtLXRoYWloZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLnRoYWktMAorZGlhbG9nLmJvbGQudWtyYW5pYW4taWJtMTEyND0tKi0qLWJvbGQtci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wCitkaWFsb2cuYm9sZC5qYXBhbmVzZS14MDIwOD0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCitkaWFsb2cuYm9sZC5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitkaWFsb2cuYm9sZC5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlibS11ZGNqcAorZGlhbG9nLmJvbGQuamFwYW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK2RpYWxvZy5ib2xkLmtvcmVhbj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK2RpYWxvZy5ib2xkLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfa29yZWEtMAorZGlhbG9nLmJvbGQuY2hpbmVzZT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorZGlhbG9nLmJvbGQuY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorZGlhbG9nLmJvbGQudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa190YWl3YW4tMAogCi1tb25vc3BhY2VkLnBsYWluLmxhdGluLTE9LSotY291cmllci1tZWRpdW0tci1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvMTA2NDYtMQotbW9ub3NwYWNlZC5ib2xkLmxhdGluLTE9LSotY291cmllci1ib2xkLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtbS0qLWlzbzEwNjQ2LTEKLW1vbm9zcGFjZWQuaXRhbGljLmxhdGluLTE9LSotY291cmllci1tZWRpdW0tby1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvMTA2NDYtMQotbW9ub3NwYWNlZC5ib2xkaXRhbGljLmxhdGluLTE9LSotY291cmllci1ib2xkLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtbS0qLWlzbzEwNjQ2LTEKK2RpYWxvZy5pdGFsaWMubGF0aW4tMT0tKi1oZWx2ZXRpY2EtbWVkaXVtLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMQorZGlhbG9nLml0YWxpYy50aGFpPS1pYm0tdGhhaWhlbHZldGljYS1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIudGhhaS0wCitkaWFsb2cuaXRhbGljLnVrcmFuaWFuLWlibTExMjQ9LSotKi1tZWRpdW0taS1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wCitkaWFsb2cuaXRhbGljLmphcGFuZXNlLXgwMjA4PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTAKK2RpYWxvZy5pdGFsaWMuamFwYW5lc2UteDAyMDE9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjAxLjE5NzYtMAorZGlhbG9nLml0YWxpYy5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlibS11ZGNqcAorZGlhbG9nLml0YWxpYy5qYXBhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMAorZGlhbG9nLml0YWxpYy5rb3JlYW49LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWtzYzU2MDEuMTk4Ny0wCitkaWFsb2cuaXRhbGljLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfa29yZWEtMAorZGlhbG9nLml0YWxpYy5jaGluZXNlPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wCitkaWFsb2cuaXRhbGljLmNoaW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2NoaW5hLTAKK2RpYWxvZy5pdGFsaWMudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa190YWl3YW4tMAorCitkaWFsb2cuYm9sZGl0YWxpYy5sYXRpbi0xPS0qLWhlbHZldGljYS1ib2xkLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMQorZGlhbG9nLmJvbGRpdGFsaWMudGhhaT0taWJtLXRoYWloZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLnRoYWktMAorZGlhbG9nLmJvbGRpdGFsaWMudWtyYW5pYW4taWJtMTEyND0tKi0qLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi5pMThuLTAKK2RpYWxvZy5ib2xkaXRhbGljLmphcGFuZXNlLXgwMjA4PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTAKK2RpYWxvZy5ib2xkaXRhbGljLmphcGFuZXNlLXgwMjAxPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwMS4xOTc2LTAKK2RpYWxvZy5ib2xkaXRhbGljLmphcGFuZXNlLXVkYz0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwCitkaWFsb2cuYm9sZGl0YWxpYy5qYXBhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMAorZGlhbG9nLmJvbGRpdGFsaWMua29yZWFuPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMAorZGlhbG9nLmJvbGRpdGFsaWMua29yZWFuLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wCitkaWFsb2cuYm9sZGl0YWxpYy5jaGluZXNlPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wCitkaWFsb2cuYm9sZGl0YWxpYy5jaGluZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wCitkaWFsb2cuYm9sZGl0YWxpYy50YWl3YW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX3RhaXdhbi0wCisKK2RpYWxvZ2lucHV0LnBsYWluLmxhdGluLTE9LSotY291cmllci1tZWRpdW0tci1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvODg1OS0xCitkaWFsb2dpbnB1dC5wbGFpbi50aGFpPS1pYm0tdGhhaWNvdXJpZXItbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11Y3MyLnRoYWktMAorZGlhbG9naW5wdXQucGxhaW4udWtyYW5pYW4taWJtMTEyND0tKi0qLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi5pMThuLTAKK2RpYWxvZ2lucHV0LnBsYWluLmphcGFuZXNlLXgwMjA4PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCitkaWFsb2dpbnB1dC5wbGFpbi5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjAxLjE5NzYtMAorZGlhbG9naW5wdXQucGxhaW4uamFwYW5lc2UtdWRjPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwCitkaWFsb2dpbnB1dC5wbGFpbi5qYXBhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK2RpYWxvZ2lucHV0LnBsYWluLmtvcmVhbj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWtzYzU2MDEuMTk4Ny0wCitkaWFsb2dpbnB1dC5wbGFpbi5rb3JlYW4taXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wCitkaWFsb2dpbnB1dC5wbGFpbi5jaGluZXNlPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorZGlhbG9naW5wdXQucGxhaW4uY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2NoaW5hLTAKK2RpYWxvZ2lucHV0LnBsYWluLnRhaXdhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX3RhaXdhbi0wCisKK2RpYWxvZ2lucHV0LmJvbGQubGF0aW4tMT0tKi1jb3VyaWVyLWJvbGQtci1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvODg1OS0xCitkaWFsb2dpbnB1dC5ib2xkLnRoYWk9LWlibS10aGFpY291cmllci1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtbS0qLXVjczIudGhhaS0wCitkaWFsb2dpbnB1dC5ib2xkLnVrcmFuaWFuLWlibTExMjQ9LSotKi1ib2xkLXItbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11Y3MyLmkxOG4tMAorZGlhbG9naW5wdXQuYm9sZC5qYXBhbmVzZS14MDIwOD0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjA4LjE5ODMtMAorZGlhbG9naW5wdXQuYm9sZC5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjAxLjE5NzYtMAorZGlhbG9naW5wdXQuYm9sZC5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanAKK2RpYWxvZ2lucHV0LmJvbGQuamFwYW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19qYXBhbi0wCitkaWFsb2dpbnB1dC5ib2xkLmtvcmVhbj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWtzYzU2MDEuMTk4Ny0wCitkaWFsb2dpbnB1dC5ib2xkLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTAKK2RpYWxvZ2lucHV0LmJvbGQuY2hpbmVzZT0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWdiMjMxMi4xOTgwLTAKK2RpYWxvZ2lucHV0LmJvbGQuY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2NoaW5hLTAKK2RpYWxvZ2lucHV0LmJvbGQudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTAKKworZGlhbG9naW5wdXQuaXRhbGljLmxhdGluLTE9LSotY291cmllci1tZWRpdW0tby1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvODg1OS0xCitkaWFsb2dpbnB1dC5pdGFsaWMudGhhaT0taWJtLXRoYWljb3VyaWVyLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi50aGFpLTAKK2RpYWxvZ2lucHV0Lml0YWxpYy51a3Jhbmlhbi1pYm0xMTI0PS0qLSotbWVkaXVtLWktbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11Y3MyLmkxOG4tMAorZGlhbG9naW5wdXQuaXRhbGljLmphcGFuZXNlLXgwMjA4PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCitkaWFsb2dpbnB1dC5pdGFsaWMuamFwYW5lc2UteDAyMDE9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwMS4xOTc2LTAKK2RpYWxvZ2lucHV0Lml0YWxpYy5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanAKK2RpYWxvZ2lucHV0Lml0YWxpYy5qYXBhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK2RpYWxvZ2lucHV0Lml0YWxpYy5rb3JlYW49LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMAorZGlhbG9naW5wdXQuaXRhbGljLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTAKK2RpYWxvZ2lucHV0Lml0YWxpYy5jaGluZXNlPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorZGlhbG9naW5wdXQuaXRhbGljLmNoaW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wCitkaWFsb2dpbnB1dC5pdGFsaWMudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTAKKworZGlhbG9naW5wdXQuYm9sZGl0YWxpYy5sYXRpbi0xPS0qLWNvdXJpZXItYm9sZC1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLW0tKi1pc284ODU5LTEKK2RpYWxvZ2lucHV0LmJvbGRpdGFsaWMudGhhaT0taWJtLXRoYWljb3VyaWVyLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi50aGFpLTAKK2RpYWxvZ2lucHV0LmJvbGRpdGFsaWMudWtyYW5pYW4taWJtMTEyND0tKi0qLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi5pMThuLTAKK2RpYWxvZ2lucHV0LmJvbGRpdGFsaWMuamFwYW5lc2UteDAyMDg9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTAKK2RpYWxvZ2lucHV0LmJvbGRpdGFsaWMuamFwYW5lc2UteDAyMDE9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwMS4xOTc2LTAKK2RpYWxvZ2lucHV0LmJvbGRpdGFsaWMuamFwYW5lc2UtdWRjPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwCitkaWFsb2dpbnB1dC5ib2xkaXRhbGljLmphcGFuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMAorZGlhbG9naW5wdXQuYm9sZGl0YWxpYy5rb3JlYW49LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMAorZGlhbG9naW5wdXQuYm9sZGl0YWxpYy5rb3JlYW4taXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wCitkaWFsb2dpbnB1dC5ib2xkaXRhbGljLmNoaW5lc2U9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wCitkaWFsb2dpbnB1dC5ib2xkaXRhbGljLmNoaW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wCitkaWFsb2dpbnB1dC5ib2xkaXRhbGljLnRhaXdhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX3RhaXdhbi0wCisKK3NhbnNzZXJpZi5wbGFpbi5sYXRpbi0xPS0qLWhlbHZldGljYS1tZWRpdW0tci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvODg1OS0xCitzYW5zc2VyaWYucGxhaW4udGhhaT0taWJtLXRoYWloZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLnRoYWktMAorc2Fuc3NlcmlmLnBsYWluLnVrcmFuaWFuLWlibTExMjQ9LSotKi1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wCitzYW5zc2VyaWYucGxhaW4uamFwYW5lc2UteDAyMDg9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjA4LjE5ODMtMAorc2Fuc3NlcmlmLnBsYWluLmphcGFuZXNlLXgwMjAxPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwMS4xOTc2LTAKK3NhbnNzZXJpZi5wbGFpbi5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlibS11ZGNqcAorc2Fuc3NlcmlmLnBsYWluLmphcGFuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19qYXBhbi0wCitzYW5zc2VyaWYucGxhaW4ua29yZWFuPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMAorc2Fuc3NlcmlmLnBsYWluLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfa29yZWEtMAorc2Fuc3NlcmlmLnBsYWluLmNoaW5lc2U9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWdiMjMxMi4xOTgwLTAKK3NhbnNzZXJpZi5wbGFpbi5jaGluZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wCitzYW5zc2VyaWYucGxhaW4udGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa190YWl3YW4tMAorCitzYW5zc2VyaWYuYm9sZC5sYXRpbi0xPS0qLWhlbHZldGljYS1ib2xkLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMQorc2Fuc3NlcmlmLmJvbGQudGhhaT0taWJtLXRoYWloZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLnRoYWktMAorc2Fuc3NlcmlmLmJvbGQudWtyYW5pYW4taWJtMTEyND0tKi0qLWJvbGQtci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wCitzYW5zc2VyaWYuYm9sZC5qYXBhbmVzZS14MDIwOD0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCitzYW5zc2VyaWYuYm9sZC5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitzYW5zc2VyaWYuYm9sZC5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlibS11ZGNqcAorc2Fuc3NlcmlmLmJvbGQuamFwYW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK3NhbnNzZXJpZi5ib2xkLmtvcmVhbj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK3NhbnNzZXJpZi5ib2xkLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfa29yZWEtMAorc2Fuc3NlcmlmLmJvbGQuY2hpbmVzZT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorc2Fuc3NlcmlmLmJvbGQuY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorc2Fuc3NlcmlmLmJvbGQudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa190YWl3YW4tMAorCitzYW5zc2VyaWYuaXRhbGljLmxhdGluLTE9LSotaGVsdmV0aWNhLW1lZGl1bS1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc284ODU5LTEKK3NhbnNzZXJpZi5pdGFsaWMudGhhaT0taWJtLXRoYWloZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLnRoYWktMAorc2Fuc3NlcmlmLml0YWxpYy51a3Jhbmlhbi1pYm0xMTI0PS0qLSotbWVkaXVtLWktbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLmkxOG4tMAorc2Fuc3NlcmlmLml0YWxpYy5qYXBhbmVzZS14MDIwOD0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCitzYW5zc2VyaWYuaXRhbGljLmphcGFuZXNlLXgwMjAxPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwMS4xOTc2LTAKK3NhbnNzZXJpZi5pdGFsaWMuamFwYW5lc2UtdWRjPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanAKK3NhbnNzZXJpZi5pdGFsaWMuamFwYW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK3NhbnNzZXJpZi5pdGFsaWMua29yZWFuPS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMAorc2Fuc3NlcmlmLml0YWxpYy5rb3JlYW4taXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTAKK3NhbnNzZXJpZi5pdGFsaWMuY2hpbmVzZT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorc2Fuc3NlcmlmLml0YWxpYy5jaGluZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wCitzYW5zc2VyaWYuaXRhbGljLnRhaXdhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTAKKworc2Fuc3NlcmlmLmJvbGRpdGFsaWMubGF0aW4tMT0tKi1oZWx2ZXRpY2EtYm9sZC1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc284ODU5LTEKK3NhbnNzZXJpZi5ib2xkaXRhbGljLnRoYWk9LWlibS10aGFpaGVsdmV0aWNhLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi50aGFpLTAKK3NhbnNzZXJpZi5ib2xkaXRhbGljLnVrcmFuaWFuLWlibTExMjQ9LSotKi1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wCitzYW5zc2VyaWYuYm9sZGl0YWxpYy5qYXBhbmVzZS14MDIwOD0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCitzYW5zc2VyaWYuYm9sZGl0YWxpYy5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitzYW5zc2VyaWYuYm9sZGl0YWxpYy5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlibS11ZGNqcAorc2Fuc3NlcmlmLmJvbGRpdGFsaWMuamFwYW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK3NhbnNzZXJpZi5ib2xkaXRhbGljLmtvcmVhbj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK3NhbnNzZXJpZi5ib2xkaXRhbGljLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfa29yZWEtMAorc2Fuc3NlcmlmLmJvbGRpdGFsaWMuY2hpbmVzZT0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorc2Fuc3NlcmlmLmJvbGRpdGFsaWMuY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorc2Fuc3NlcmlmLmJvbGRpdGFsaWMudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa190YWl3YW4tMAorCitzZXJpZi5wbGFpbi5sYXRpbi0xPS0qLXRpbWVzIG5ldyByb21hbi1tZWRpdW0tci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvODg1OS0xCitzZXJpZi5wbGFpbi50aGFpPS1pYm0tdGhhaXRpbWVzLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi50aGFpLTAKK3NlcmlmLnBsYWluLnVrcmFuaWFuLWlibTExMjQ9LSotKi1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wCitzZXJpZi5wbGFpbi5qYXBhbmVzZS14MDIwOD0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCitzZXJpZi5wbGFpbi5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitzZXJpZi5wbGFpbi5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlibS11ZGNqcAorc2VyaWYucGxhaW4uamFwYW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK3NlcmlmLnBsYWluLmtvcmVhbj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK3NlcmlmLnBsYWluLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfa29yZWEtMAorc2VyaWYucGxhaW4uY2hpbmVzZT0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorc2VyaWYucGxhaW4uY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorc2VyaWYucGxhaW4udGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa190YWl3YW4tMAorCitzZXJpZi5ib2xkLmxhdGluLTE9LSotdGltZXMgbmV3IHJvbWFuLWJvbGQtci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvODg1OS0xCitzZXJpZi5ib2xkLnRoYWk9LWlibS10aGFpdGltZXMtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLnRoYWktMAorc2VyaWYuYm9sZC51a3Jhbmlhbi1pYm0xMTI0PS0qLSotYm9sZC1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi5pMThuLTAKK3NlcmlmLmJvbGQuamFwYW5lc2UteDAyMDg9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjA4LjE5ODMtMAorc2VyaWYuYm9sZC5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitzZXJpZi5ib2xkLmphcGFuZXNlLXVkYz0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwCitzZXJpZi5ib2xkLmphcGFuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19qYXBhbi0wCitzZXJpZi5ib2xkLmtvcmVhbj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK3NlcmlmLmJvbGQua29yZWFuLWlzbzEwNjQ2PS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wCitzZXJpZi5ib2xkLmNoaW5lc2U9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWdiMjMxMi4xOTgwLTAKK3NlcmlmLmJvbGQuY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorc2VyaWYuYm9sZC50YWl3YW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX3RhaXdhbi0wCisKKworc2VyaWYuaXRhbGljLmxhdGluLTE9LSotdGltZXMgbmV3IHJvbWFuLW1lZGl1bS1pLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc284ODU5LTEKK3NlcmlmLml0YWxpYy50aGFpPS1pYm0tdGhhaXRpbWVzLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi50aGFpLTAKK3NlcmlmLml0YWxpYy51a3Jhbmlhbi1pYm0xMTI0PS0qLSotbWVkaXVtLWktbm9ybWFsLS0qLSVkLTc1LTc1LXAtKi11Y3MyLmkxOG4tMAorc2VyaWYuaXRhbGljLmphcGFuZXNlLXgwMjA4PS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTAKK3NlcmlmLml0YWxpYy5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitzZXJpZi5pdGFsaWMuamFwYW5lc2UtdWRjPS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanAKK3NlcmlmLml0YWxpYy5qYXBhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMAorc2VyaWYuaXRhbGljLmtvcmVhbj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK3NlcmlmLml0YWxpYy5rb3JlYW4taXNvMTA2NDY9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTAKK3NlcmlmLml0YWxpYy5jaGluZXNlPS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wCitzZXJpZi5pdGFsaWMuY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorc2VyaWYuaXRhbGljLnRhaXdhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTAKKworc2VyaWYuYm9sZGl0YWxpYy5sYXRpbi0xPS0qLXRpbWVzIG5ldyByb21hbi1ib2xkLWktbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMQorc2VyaWYuYm9sZGl0YWxpYy50aGFpPS1pYm0tdGhhaXRpbWVzLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi50aGFpLTAKK3NlcmlmLmJvbGRpdGFsaWMudWtyYW5pYW4taWJtMTEyND0tKi0qLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi5pMThuLTAKK3NlcmlmLmJvbGRpdGFsaWMuamFwYW5lc2UteDAyMDg9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjA4LjE5ODMtMAorc2VyaWYuYm9sZGl0YWxpYy5qYXBhbmVzZS14MDIwMT0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCitzZXJpZi5ib2xkaXRhbGljLmphcGFuZXNlLXVkYz0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwCitzZXJpZi5ib2xkaXRhbGljLmphcGFuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19qYXBhbi0wCitzZXJpZi5ib2xkaXRhbGljLmtvcmVhbj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK3NlcmlmLmJvbGRpdGFsaWMua29yZWFuLWlzbzEwNjQ2PS1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wCitzZXJpZi5ib2xkaXRhbGljLmNoaW5lc2U9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWdiMjMxMi4xOTgwLTAKK3NlcmlmLmJvbGRpdGFsaWMuY2hpbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorc2VyaWYuYm9sZGl0YWxpYy50YWl3YW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX3RhaXdhbi0wCisKK21vbm9zcGFjZWQucGxhaW4ubGF0aW4tMT0tKi1jb3VyaWVyLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLW0tKi1pc284ODU5LTEKK21vbm9zcGFjZWQucGxhaW4udGhhaT0taWJtLXRoYWljb3VyaWVyLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi50aGFpLTAKK21vbm9zcGFjZWQucGxhaW4udWtyYW5pYW4taWJtMTEyND0tKi0qLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi5pMThuLTAKK21vbm9zcGFjZWQucGxhaW4uamFwYW5lc2UteDAyMDg9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTAKK21vbm9zcGFjZWQucGxhaW4uamFwYW5lc2UteDAyMDE9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwMS4xOTc2LTAKK21vbm9zcGFjZWQucGxhaW4uamFwYW5lc2UtdWRjPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwCittb25vc3BhY2VkLnBsYWluLmphcGFuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMAorbW9ub3NwYWNlZC5wbGFpbi5rb3JlYW49LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMAorbW9ub3NwYWNlZC5wbGFpbi5rb3JlYW4taXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wCittb25vc3BhY2VkLnBsYWluLmNoaW5lc2U9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wCittb25vc3BhY2VkLnBsYWluLmNoaW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wCittb25vc3BhY2VkLnBsYWluLnRhaXdhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX3RhaXdhbi0wCisKK21vbm9zcGFjZWQuYm9sZC5sYXRpbi0xPS0qLWNvdXJpZXItYm9sZC1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLW0tKi1pc284ODU5LTEKK21vbm9zcGFjZWQuYm9sZC50aGFpPS1pYm0tdGhhaWNvdXJpZXItbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11Y3MyLnRoYWktMAorbW9ub3NwYWNlZC5ib2xkLnVrcmFuaWFuLWlibTExMjQ9LSotKi1ib2xkLXItbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11Y3MyLmkxOG4tMAorbW9ub3NwYWNlZC5ib2xkLmphcGFuZXNlLXgwMjA4PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wCittb25vc3BhY2VkLmJvbGQuamFwYW5lc2UteDAyMDE9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwMS4xOTc2LTAKK21vbm9zcGFjZWQuYm9sZC5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanAKK21vbm9zcGFjZWQuYm9sZC5qYXBhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTAKK21vbm9zcGFjZWQuYm9sZC5rb3JlYW49LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMAorbW9ub3NwYWNlZC5ib2xkLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTAKK21vbm9zcGFjZWQuYm9sZC5jaGluZXNlPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMAorbW9ub3NwYWNlZC5ib2xkLmNoaW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wCittb25vc3BhY2VkLmJvbGQudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTAKKworbW9ub3NwYWNlZC5pdGFsaWMubGF0aW4tMT0tKi1jb3VyaWVyLW1lZGl1bS1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLW0tKi1pc284ODU5LTEKK21vbm9zcGFjZWQuaXRhbGljLnRoYWk9LWlibS10aGFpY291cmllci1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtbS0qLXVjczIudGhhaS0wCittb25vc3BhY2VkLml0YWxpYy51a3Jhbmlhbi1pYm0xMTI0PS0qLSotbWVkaXVtLWktbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11Y3MyLmkxOG4tMAorbW9ub3NwYWNlZC5pdGFsaWMuamFwYW5lc2UteDAyMDg9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTAKK21vbm9zcGFjZWQuaXRhbGljLmphcGFuZXNlLXgwMjAxPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCittb25vc3BhY2VkLml0YWxpYy5qYXBhbmVzZS11ZGM9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanAKK21vbm9zcGFjZWQuaXRhbGljLmphcGFuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMAorbW9ub3NwYWNlZC5pdGFsaWMua29yZWFuPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK21vbm9zcGFjZWQuaXRhbGljLmtvcmVhbi1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTAKK21vbm9zcGFjZWQuaXRhbGljLmNoaW5lc2U9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wCittb25vc3BhY2VkLml0YWxpYy5jaGluZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorbW9ub3NwYWNlZC5pdGFsaWMudGFpd2FuZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTAKKworbW9ub3NwYWNlZC5ib2xkaXRhbGljLmxhdGluLTE9LSotY291cmllci1ib2xkLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtbS0qLWlzbzg4NTktMQorbW9ub3NwYWNlZC5ib2xkaXRhbGljLnRoYWk9LWlibS10aGFpY291cmllci1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtbS0qLXVjczIudGhhaS0wCittb25vc3BhY2VkLmJvbGRpdGFsaWMudWtyYW5pYW4taWJtMTEyND0tKi0qLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi5pMThuLTAKK21vbm9zcGFjZWQuYm9sZGl0YWxpYy5qYXBhbmVzZS14MDIwOD0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjA4LjE5ODMtMAorbW9ub3NwYWNlZC5ib2xkaXRhbGljLmphcGFuZXNlLXgwMjAxPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDEuMTk3Ni0wCittb25vc3BhY2VkLmJvbGRpdGFsaWMuamFwYW5lc2UtdWRjPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwCittb25vc3BhY2VkLmJvbGRpdGFsaWMuamFwYW5lc2UtaXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19qYXBhbi0wCittb25vc3BhY2VkLmJvbGRpdGFsaWMua29yZWFuPS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSota3NjNTYwMS4xOTg3LTAKK21vbm9zcGFjZWQuYm9sZGl0YWxpYy5rb3JlYW4taXNvMTA2NDY9LW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wCittb25vc3BhY2VkLmJvbGRpdGFsaWMuY2hpbmVzZT0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWdiMjMxMi4xOTgwLTAKK21vbm9zcGFjZWQuYm9sZGl0YWxpYy5jaGluZXNlLWlzbzEwNjQ2PS1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMAorbW9ub3NwYWNlZC5ib2xkaXRhbGljLnRhaXdhbmVzZS1pc28xMDY0Nj0tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX3RhaXdhbi0wCiAKICMgU2VhcmNoIFNlcXVlbmNlcwogCiBzZXF1ZW5jZS5hbGxmb250cz1sYXRpbi0xCitzZXF1ZW5jZS5hbGxmb250cy5VVEYtOD1sYXRpbi0xLGphcGFuZXNlLWlzbzEwNjQ2CisjIFVrX1VBCitzZXF1ZW5jZS5hbGxmb250cy54LUlCTTExMjQ9bGF0aW4tMSx1a3Jhbmlhbi1pYm0xMTI0CisjIEphcGFuZXNlCitzZXF1ZW5jZS5hbGxmb250cy54LUlCTTk0M0M9bGF0aW4tMSxqYXBhbmVzZS14MDIwMSxqYXBhbmVzZS14MDIwOCxqYXBhbmVzZS11ZGMKK3NlcXVlbmNlLmFsbGZvbnRzLngtSUJNMjk2MjZDPWxhdGluLTEsamFwYW5lc2UteDAyMDEsamFwYW5lc2UteDAyMDgsamFwYW5lc2UtdWRjCitzZXF1ZW5jZS5hbGxmb250cy5VVEYtOC5qYT1qYXBhbmVzZS1pc28xMDY0NixsYXRpbi0xLGlzbzEwNjQ2LWV4dEIKKyMgQ2hpbmVzZQorc2VxdWVuY2UuYWxsZm9udHMueC1FVUNfQ049bGF0aW4tMSxjaGluZXNlCitzZXF1ZW5jZS5hbGxmb250cy5HQjE4MDMwPWxhdGluLTEsY2hpbmVzZS1pc28xMDY0Nixpc28xMDY0Ni1leHRCCitzZXF1ZW5jZS5hbGxmb250cy5VVEYtOC56aC5DTj1sYXRpbi0xLGNoaW5lc2UtaXNvMTA2NDYsaXNvMTA2NDYtZXh0QgorIyBUYWl3YW5lc2UKK3NlcXVlbmNlLmFsbGZvbnRzLngtSUJNOTY0PWxhdGluLTEsdGFpd2FuZXNlLWlzbzEwNjQ2CitzZXF1ZW5jZS5hbGxmb250cy5CaWc1PWxhdGluLTEsdGFpd2FuZXNlLWlzbzEwNjQ2CitzZXF1ZW5jZS5hbGxmb250cy5VVEYtOC56aC5UVz1sYXRpbi0xLHRhaXdhbmVzZS1pc28xMDY0NgorIyBLb3JlYW4KK3NlcXVlbmNlLmFsbGZvbnRzLngtSUJNOTcwPWxhdGluLTEsa29yZWFuCitzZXF1ZW5jZS5hbGxmb250cy5VVEYtOC5rbz1sYXRpbi0xLGtvcmVhbi1pc28xMDY0NgorIyBUaGFpCitzZXF1ZW5jZS5hbGxmb250cy5USVMtNjIwPWxhdGluLTEsdGhhaQorc2VxdWVuY2UuYWxsZm9udHMuVVRGLTgudGg9bGF0aW4tMSx0aGFpCisjIGZhbGxiYWNrCitzZXF1ZW5jZS5mYWxsYmFjaz10aGFpLGNoaW5lc2UtaXNvMTA2NDYsdGFpd2FuZXNlLWlzbzEwNjQ2LGphcGFuZXNlLWlzbzEwNjQ2LGtvcmVhbi1pc28xMDY0Nixpc28xMDY0Ni1leHRCCiAKLWZpbGVuYW1lLi0qLWNvdXJpZXItbWVkaXVtLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtbS0qLWlzbzEwNjQ2LTE9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHlwZTEvY291ci5wZmEKLWZpbGVuYW1lLi0qLWNvdXJpZXItYm9sZC1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLW0tKi1pc28xMDY0Ni0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL2NvdXJiLnBmYQotZmlsZW5hbWUuLSotY291cmllci1tZWRpdW0tby1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvMTA2NDYtMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS9jb3VyaS5wZmEKLWZpbGVuYW1lLi0qLWNvdXJpZXItYm9sZC1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLW0tKi1pc28xMDY0Ni0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL2NvdXJiaS5wZmEKLWZpbGVuYW1lLi0qLWhlbHZldGljYS1tZWRpdW0tci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS9oZWx2LnBmYQotZmlsZW5hbWUuLSotaGVsdmV0aWNhLWJvbGQtci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS9oZWx2Yi5wZmEKLWZpbGVuYW1lLi0qLWhlbHZldGljYS1tZWRpdW0tby1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS9oZWx2aS5wZmEKLWZpbGVuYW1lLi0qLWhlbHZldGljYS1ib2xkLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzEwNjQ2LTE9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHlwZTEvaGVsdmJpLnBmYQotZmlsZW5hbWUuLSotdGltZXNfbmV3X3JvbWFuLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc28xMDY0Ni0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL3Ruci5wZmEKLWZpbGVuYW1lLi0qLXRpbWVzX25ld19yb21hbi1ib2xkLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzEwNjQ2LTE9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHlwZTEvdG5yYi5wZmEKLWZpbGVuYW1lLi0qLXRpbWVzX25ld19yb21hbi1tZWRpdW0taS1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS90bnJpLnBmYQotZmlsZW5hbWUuLSotdGltZXNfbmV3X3JvbWFuLWJvbGQtaS1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvMTA2NDYtMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS90bnJiaS5wZmEKKyMgRXhjbHVzaW9uIFJhbmdlcworZXhjbHVzaW9uLmphcGFuZXNlLWlzbzEwNjQ2PTAwMDAtMDBmZgorCisjIEZvbnQgRmlsZSBOYW1lcworZmlsZW5hbWUuLSotY291cmllci1tZWRpdW0tci1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvODg1OS0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL2NvdXIucGZhCitmaWxlbmFtZS4tKi1jb3VyaWVyLWJvbGQtci1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvODg1OS0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL2NvdXJiLnBmYQorZmlsZW5hbWUuLSotY291cmllci1tZWRpdW0tby1ub3JtYWwtLSotJWQtMTAwLTEwMC1tLSotaXNvODg1OS0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL2NvdXJpLnBmYQorZmlsZW5hbWUuLSotY291cmllci1ib2xkLW8tbm9ybWFsLS0qLSVkLTEwMC0xMDAtbS0qLWlzbzg4NTktMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS9jb3VyYmkucGZhCitmaWxlbmFtZS4tKi1oZWx2ZXRpY2EtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS9oZWx2LnBmYQorZmlsZW5hbWUuLSotaGVsdmV0aWNhLWJvbGQtci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvODg1OS0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL2hlbHZiLnBmYQorZmlsZW5hbWUuLSotaGVsdmV0aWNhLW1lZGl1bS1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc284ODU5LTE9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHlwZTEvaGVsdmkucGZhCitmaWxlbmFtZS4tKi1oZWx2ZXRpY2EtYm9sZC1vLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc284ODU5LTE9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHlwZTEvaGVsdmJpLnBmYQorZmlsZW5hbWUuLSotdGltZXNfbmV3X3JvbWFuLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC0xMDAtMTAwLXAtKi1pc284ODU5LTE9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHlwZTEvdG5yLnBmYQorZmlsZW5hbWUuLSotdGltZXNfbmV3X3JvbWFuLWJvbGQtci1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvODg1OS0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL3RucmIucGZhCitmaWxlbmFtZS4tKi10aW1lc19uZXdfcm9tYW4tbWVkaXVtLWktbm9ybWFsLS0qLSVkLTEwMC0xMDAtcC0qLWlzbzg4NTktMT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UeXBlMS90bnJpLnBmYQorZmlsZW5hbWUuLSotdGltZXNfbmV3X3JvbWFuLWJvbGQtaS1ub3JtYWwtLSotJWQtMTAwLTEwMC1wLSotaXNvODg1OS0xPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1R5cGUxL3RucmJpLnBmYQorCisKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zbW9ub3d0ZXh0Yi1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtbS0qLXVuaWNvZGUtMj0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9NVFNhblhCQS50dGYKKworZmlsZW5hbWUuLW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjA4LjE5ODMtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS90bnJ3dF9qLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjAxLjE5NzYtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS90bnJ3dF9qLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlibS11ZGNqcD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS90bnJ3dF9qLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2phcGFuLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdG5yd3Rfai50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS90bnJ3dF9rLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLXVjczIuY2prX2tvcmVhLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdG5yd3Rfay50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1nYjIzMTIuMTk4MC0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL3Rucnd0X3MudHRmCitmaWxlbmFtZS4tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS90bnJ3dF9zLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWdiMjMxMi4xOTgwLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdG5yd3Rfcy50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS10aW1lc25ld3JvbWFud3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19jaGluYS0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL3Rucnd0X3MudHRmCitmaWxlbmFtZS4tbW9ub3R5cGUtdGltZXNuZXdyb21hbnd0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdG5yd3RfdC50dGYKKworZmlsZW5hbWUuLW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1qaXN4MDIwOC4xOTgzLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zZGoudHRmCitmaWxlbmFtZS4tbW9ub3R5cGUtc2Fuc21vbm93dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjAxLjE5NzYtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkai50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaWJtLXVkY2pwPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL210c2Fuc2RqLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19qYXBhbi0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL210c2Fuc2RqLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXNhbnNtb25vd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkay50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfa29yZWEtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkay50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotZ2IyMzEyLjE5ODAtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkcy50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkcy50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfdGFpd2FuLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zZHQudHRmCitmaWxlbmFtZS4tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotamlzeDAyMDguMTk4My0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL210c2Fuc19qLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWppc3gwMjAxLjE5NzYtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNfai50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1pYm0tdWRjanA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zX2oudHRmCitmaWxlbmFtZS4tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfamFwYW4tMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNfai50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi1rc2M1NjAxLjE5ODctMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNfay50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa19rb3JlYS0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL210c2Fuc19rLnR0ZgorZmlsZW5hbWUuLW1vbm90eXBlLXNhbnN3dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWdiMjMxMi4xOTgwLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zX3MudHRmCitmaWxlbmFtZS4tbW9ub3R5cGUtc2Fuc3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotdWNzMi5jamtfY2hpbmEtMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNfcy50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zd3QtbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LSotKi11Y3MyLmNqa190YWl3YW4tMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNfdC50dGYKKworZmlsZW5hbWUuLW1vbm90eXBlLXRpbWVzbmV3cm9tYW53dC1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtKi0qLWlzbzg4NTktMTU9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdG5yd3Rfai50dGYKK2ZpbGVuYW1lLi1tb25vdHlwZS1zYW5zbW9ub3d0LW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS0qLSotaXNvODg1OS0xNT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkai50dGYKKworZmlsZW5hbWUuLWlibS10aGFpY291cmllci1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtbS0qLXVjczIudGhhaS0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL2NvdXJ0aC50dGYKK2ZpbGVuYW1lLi1pYm0tdGhhaWhlbHZldGljYS1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIudGhhaS0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL2hlbHZ0aC50dGYKK2ZpbGVuYW1lLi1pYm0tdGhhaXRpbWVzLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi50aGFpLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdGltZXRoLnR0ZgorCitmaWxlbmFtZS4tKi0qLW1lZGl1bS1yLW5vcm1hbC0tKi0lZC0qLSotcC0qLWlibS0xMDQ2PS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL3Rucnd0X2oudHRmCitmaWxlbmFtZS4tKi0qLWJvbGQtci1ub3JtYWwtLSotJWQtKi0qLXAtKi1pYm0tMTA0Nj0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS90bnJ3dF9qLnR0ZgorZmlsZW5hbWUuLSotKi1tZWRpdW0taS1ub3JtYWwtLSotJWQtKi0qLXAtKi1pYm0tMTA0Nj0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS90bnJ3dF9qLnR0ZgorZmlsZW5hbWUuLSotKi1ib2xkLWktbm9ybWFsLS0qLSVkLSotKi1wLSotaWJtLTEwNDY9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdG5yd3Rfai50dGYKK2ZpbGVuYW1lLi0qLSotbWVkaXVtLXItbm9ybWFsLS0qLSVkLSotKi1tLSotaWJtLTEwNDY9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zZGoudHRmCitmaWxlbmFtZS4tKi0qLWJvbGQtci1ub3JtYWwtLSotJWQtKi0qLW0tKi1pYm0tMTA0Nj0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkai50dGYKK2ZpbGVuYW1lLi0qLSotbWVkaXVtLWktbm9ybWFsLS0qLSVkLSotKi1tLSotaWJtLTEwNDY9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zZGoudHRmCitmaWxlbmFtZS4tKi0qLWJvbGQtaS1ub3JtYWwtLSotJWQtKi0qLW0tKi1pYm0tMTA0Nj0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkai50dGYKKworZmlsZW5hbWUuLSotKi1tZWRpdW0tci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL3Rucnd0X2oudHRmCitmaWxlbmFtZS4tKi0qLWJvbGQtci1ub3JtYWwtLSotJWQtNzUtNzUtcC0qLXVjczIuaTE4bi0wPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlL3Rucnd0X2oudHRmCitmaWxlbmFtZS4tKi0qLW1lZGl1bS1pLW5vcm1hbC0tKi0lZC03NS03NS1wLSotdWNzMi5pMThuLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvdG5yd3Rfai50dGYKK2ZpbGVuYW1lLi0qLSotbWVkaXVtLXItbm9ybWFsLS0qLSVkLTc1LTc1LW0tKi11Y3MyLmkxOG4tMD0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZS9tdHNhbnNkai50dGYKK2ZpbGVuYW1lLi0qLSotYm9sZC1yLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi5pMThuLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zZGoudHRmCitmaWxlbmFtZS4tKi0qLW1lZGl1bS1pLW5vcm1hbC0tKi0lZC03NS03NS1tLSotdWNzMi5pMThuLTA9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUvbXRzYW5zZGoudHRmCisKKyMgQVdUIGZvbnQgcGF0aAorYXd0Zm9udHBhdGguamFwYW5lc2UteDAyMDE9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUKK2F3dGZvbnRwYXRoLmphcGFuZXNlLXgwMjA4PS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlCithd3Rmb250cGF0aC5qYXBhbmVzZS11ZGM9L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUKK2F3dGZvbnRwYXRoLmphcGFuZXNlLWlzbzEwNjQ2PS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlCithd3Rmb250cGF0aC5rb3JlYW49L3Vzci9scHAvWDExL2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGUKK2F3dGZvbnRwYXRoLmtvcmVhbi1pc28xMDY0Nj0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZQorYXd0Zm9udHBhdGguY2hpbmVzZT0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZQorYXd0Zm9udHBhdGguY2hpbmVzZS1pc28xMDY0Nj0vdXNyL2xwcC9YMTEvbGliL1gxMS9mb250cy9UcnVlVHlwZQorYXd0Zm9udHBhdGgudGFpd2FuZXNlLWlzbzEwNjQ2PS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlCithd3Rmb250cGF0aC50aGFpPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlCithd3Rmb250cGF0aC5pc28xMDY0Ni1leHRCPS91c3IvbHBwL1gxMS9saWIvWDExL2ZvbnRzL1RydWVUeXBlCisKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9iaW4vamF2YS5jIGIvc3JjL3NoYXJlL2Jpbi9qYXZhLmMKaW5kZXggZWI1YzMzMS4uY2MzNTRlYiAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2Jpbi9qYXZhLmMKKysrIGIvc3JjL3NoYXJlL2Jpbi9qYXZhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk1LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk1LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMjQ4LDExICsxMjQ4LDEzIEBACiAgICAgICAgICgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgYXJ5LCAwLCBsZW4sIChqYnl0ZSAqKXMpOwogICAgICAgICBpZiAoISgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewogICAgICAgICAgICAgaWYgKG1ha2VQbGF0Zm9ybVN0cmluZ01JRCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTlVMTF9DSEVDSzAobWFrZVBsYXRmb3JtU3RyaW5nTUlEID0gKCplbnYpLT5HZXRTdGF0aWNNZXRob2RJRChlbnYsCisgICAgICAgICAgICAgICAgQ0hFQ0tfSk5JX1JFVFVSTl8wKAorICAgICAgICAgICAgICAgICAgICBtYWtlUGxhdGZvcm1TdHJpbmdNSUQgPSAoKmVudiktPkdldFN0YXRpY01ldGhvZElEKGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNscywgIm1ha2VQbGF0Zm9ybVN0cmluZyIsICIoWltCKUxqYXZhL2xhbmcvU3RyaW5nOyIpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ciA9ICgqZW52KS0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGNscywKLSAgICAgICAgICAgICAgICAgICAgbWFrZVBsYXRmb3JtU3RyaW5nTUlELCBVU0VfU1RERVJSLCBhcnkpOworICAgICAgICAgICAgQ0hFQ0tfSk5JX1JFVFVSTl8wKAorICAgICAgICAgICAgICAgIHN0ciA9ICgqZW52KS0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGNscywKKyAgICAgICAgICAgICAgICAgICAgbWFrZVBsYXRmb3JtU3RyaW5nTUlELCBVU0VfU1RERVJSLCBhcnkpKTsKICAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBhcnkpOwogICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICAgfQpAQCAtMTMwMyw3ICsxMzA1LDkgQEAKICAgICAgICAgICAgICAgICAiKFpJTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7IikpOwogCiAgICAgc3RyID0gTmV3UGxhdGZvcm1TdHJpbmcoZW52LCBuYW1lKTsKLSAgICByZXN1bHQgPSAoKmVudiktPkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBjbHMsIG1pZCwgVVNFX1NUREVSUiwgbW9kZSwgc3RyKTsKKyAgICBDSEVDS19KTklfUkVUVVJOXzAoCisgICAgICAgIHJlc3VsdCA9ICgqZW52KS0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGVudiwgY2xzLCBtaWQsIFVTRV9TVERFUlIsIG1vZGUsIHN0cikpOwogCiAgICAgaWYgKEpMSV9Jc1RyYWNlTGF1bmNoZXIoKSkgewogICAgICAgICBlbmQgICA9IENvdW50ZXJHZXQoKTsKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9iaW4vamF2YS5oIGIvc3JjL3NoYXJlL2Jpbi9qYXZhLmgKaW5kZXggODNlOTdlNi4uNDM0NTBkOCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2Jpbi9qYXZhLmgKKysrIGIvc3JjL3NoYXJlL2Jpbi9qYXZhLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNTYsNCArMjU2LDQ3IEBACiAjZGVmaW5lIE5VTExfQ0hFQ0soTkNfY2hlY2tfcG9pbnRlcikgXAogICAgIE5VTExfQ0hFQ0tfUkVUVVJOX1ZBTFVFKE5DX2NoZWNrX3BvaW50ZXIsICkKIAorLyoKKyAqIEZvciBKTkkgY2FsbHMgOgorICogIC0gY2hlY2sgZm9yIHRocm93biBleGNlcHRpb25zCisgKiAgLSBjaGVjayBmb3IgbnVsbCByZXR1cm4KKyAqCisgKiAgSk5JIGNhbGxzIGNhbiByZXR1cm4gbnVsbCBhbmQvb3IgdGhyb3cgYW4gZXhjZXB0aW9uLiAgQ2hlY2sgZm9yIHRoZXNlLgorICoKKyAqICA6IENIRUNLX0pOSV9SRVRVUk5fRVhDRVBUSU9OKCkKKyAqICAgIHJldHVybiB0aGUgc3BlY2lmaWVkIFJFVFVSTlZBTFVFIGlmIGV4Y2VwdGlvbiB3YXMgZ2VuZXJhdGVkCisgKiAgOiBDSEVDS19KTklfUkVUVVJOXzAoSk5JU1RBVEVNRU5UKSAgICAgICAgOiBjaGVjayBpZiBKTklTVEFURU1FTlQgd2FzIHN1Y2Nlc3NmdWwsIHJldHVybiAwIGlmIG5vdAorICogIDogQ0hFQ0tfSk5JX1JFVFVSTl9WT0lEKEpOSVNUQVRFTUVOVCkgICAgIDogY2hlY2sgaWYgSk5JU1RBVEVNRU5UIHdhcyBzdWNjZXNzZnVsLCByZXR1cm4gdm9pZCBpZiBub3QKKyAqICA6IENIRUNLX0pOSV9SRVRVUk5fVkFMVUUoSk5JU1RBVEVNRU5ULG4pICA6IGNoZWNrIGlmIEpOSVNUQVRFTUVOVCB3YXMgc3VjY2Vzc2Z1bCwgcmV0dXJuIG4gaWYgbm90CisgKgorICogIFRoZXNlIG1hY3JvcyBuZWVkIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIsIHRoZSBKTkkgc3RhdGVtZW50IFsgSk5JU1RBVEVNRU5UIF0uCisgKgorICogIEUuRy46IGNoZWNrIHRoZSBKTkkgc3RhdGVtZW50LCBhbmQgc3BlY2lmeSBhIHZhbHVlIHRvIHJldHVybiBpZiBhIGZhaWx1cmUgd2FzIGRldGVjdGVkLgorICoKKyAqICAgICAgQ0hFQ0tfSk5JX1JFVFVSTl9WQUxVRShzdHIgPSAoKmVudiktPkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBjbHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVBsYXRmb3JtU3RyaW5nTUlELCBVU0VfU1RERVJSLCBhcnkpLCAtMSk7CisgKi8KKworI2RlZmluZSBSRVRVUk5WT0lEIHJldHVybgorI2RlZmluZSBSRVRVUk4wIHJldHVybiAwCisjZGVmaW5lIFJFVFVSTihOKSByZXR1cm4gKE4pCisKKyNkZWZpbmUgQ0hFQ0tfSk5JX1JFVFVSTl9FWENFUFRJT04oUkVUVVJOVkFMVUUpIFwKKyAgICAgICAgaWYgKCgoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSE9TlVMTCkpIHsgXAorICAgICAgICAgICAgUkVUVVJOVkFMVUU7IFwKKyAgICAgICAgfQorCisjZGVmaW5lIENIRUNLX0pOSV9SRVRVUk5fMChKTklTVEFURU1FTlQpIFwKKyAgICBDSEVDS19KTklfUkVUVVJOX0VYQ0VQVElPTihSRVRVUk4wKTsgXAorICAgIE5VTExfQ0hFQ0swKEpOSVNUQVRFTUVOVCk7CisKKyNkZWZpbmUgQ0hFQ0tfSk5JX1JFVFVSTl9WT0lEKEpOSVNUQVRFTUVOVCkgXAorICAgIENIRUNLX0pOSV9SRVRVUk5fRVhDRVBUSU9OKFJFVFVSTlZPSUQpOyBcCisgICAgTlVMTF9DSEVDSyhKTklTVEFURU1FTlQpOworCisjZGVmaW5lIENIRUNLX0pOSV9SRVRVUk5fVkFMVUUoSk5JU1RBVEVNRU5ULCBOQ1JWX3JldHVybl92YWx1ZSkgXAorICAgIENIRUNLX0pOSV9SRVRVUk5fRVhDRVBUSU9OKFJFVFVSTihOQ1JWX3JldHVybl92YWx1ZSkpOyBcCisgICAgTlVMTF9DSEVDS19SRVRVUk5fVkFMVUUoSk5JU1RBVEVNRU5ULCBOQ1JWX3JldHVybl92YWx1ZSk7CisKKwogI2VuZGlmIC8qIF9KQVZBX0hfICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9tb3RpZi9Nb3RpZlNjcm9sbFBhbmVVSS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvbW90aWYvTW90aWZTY3JvbGxQYW5lVUkuamF2YQppbmRleCAyYTEyZWQ4Li41MmJjNzM4IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9tb3RpZi9Nb3RpZlNjcm9sbFBhbmVVSS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vamF2YS9zd2luZy9wbGFmL21vdGlmL01vdGlmU2Nyb2xsUGFuZVVJLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDA0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01NiwxOSArNTYsMjIgQEAKIAogICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUhhbmRsZXI7CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsTGlzdGVuZXJzKEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUpIHsKICAgICAgICAgc3VwZXIuaW5zdGFsbExpc3RlbmVycyhzY3JvbGxQYW5lKTsKICAgICAgICAgcHJvcGVydHlDaGFuZ2VIYW5kbGVyID0gY3JlYXRlUHJvcGVydHlDaGFuZ2VIYW5kbGVyKCk7CiAgICAgICAgIHNjcm9sbFBhbmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHVuaW5zdGFsbExpc3RlbmVycyhKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsTGlzdGVuZXJzKEpDb21wb25lbnQgc2Nyb2xsUGFuZSkgewogICAgICAgICBzdXBlci51bmluc3RhbGxMaXN0ZW5lcnMoc2Nyb2xsUGFuZSk7CiAgICAgICAgIHNjcm9sbFBhbmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpOwogICAgIH0KIAogICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjcmVhdGVQcm9wZXJ0eUNoYW5nZUhhbmRsZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7CiAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZS5nZXRQcm9wZXJ0eU5hbWUoKTsKIApAQCAtOTIsNiArOTUsNyBAQAogICAgICAgICB9fTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsRGVmYXVsdHMoSlNjcm9sbFBhbmUgc2Nyb2xscGFuZSkgewogICAgICAgICBzdXBlci5pbnN0YWxsRGVmYXVsdHMoc2Nyb2xscGFuZSk7CiAKQEAgLTExNSw3ICsxMTksNyBAQAogICAgICAgICB9CiAgICAgfQogCi0KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxEZWZhdWx0cyhKU2Nyb2xsUGFuZSBjKSB7CiAgICAgICAgIHN1cGVyLnVuaW5zdGFsbERlZmF1bHRzKGMpOwogCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZEV2ZW50LmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZEV2ZW50LmphdmEKaW5kZXggY2Q3MTIyZC4uZDkwZTVlYyAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvZXZlbnQvSW5wdXRNZXRob2RFdmVudC5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L2V2ZW50L0lucHV0TWV0aG9kRXZlbnQuamF2YQpAQCAtNDE3LDcgKzQxNyw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOwogICAgICAgICBpZiAod2hlbiA9PSAwKSB7Ci0gICAgICAgICAgICB3aGVuID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZUZvclNvdXJjZSh0aGlzLnNvdXJjZSk7CisgICAgICAgICAgICAvLyBDYW4ndCB1c2UgZ2V0TW9zdFJlY2VudEV2ZW50VGltZUZvclNvdXJjZSBiZWNhdXNlIHNvdXJjZSBpcyBhbHdheXMgbnVsbCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uCisgICAgICAgICAgICB3aGVuID0gRXZlbnRRdWV1ZS5nZXRNb3N0UmVjZW50RXZlbnRUaW1lKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvQm91bmRNZXRob2RIYW5kbGUuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvQm91bmRNZXRob2RIYW5kbGUuamF2YQppbmRleCBmZGE2YmUyLi43NGY1M2U0IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0JvdW5kTWV0aG9kSGFuZGxlLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9Cb3VuZE1ldGhvZEhhbmRsZS5qYXZhCkBAIC0yNiwxMSArMjYsMTAgQEAKIHBhY2thZ2UgamF2YS5sYW5nLmludm9rZTsKIAogaW1wb3J0IHN0YXRpYyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2Rlcy4qOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uYmFzaWNUeXBlczsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVOYXRpdmVzLkNvbnN0YW50cy5SRUZfaW52b2tlU3RhdGljOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uKjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5MYW1iZGFGb3JtLkJhc2ljVHlwZS4qOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZVN0YXRpY3MuKjsKIAotaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS5OYW1lOwogaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS5OYW1lZEZ1bmN0aW9uOwogaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlcy5Mb29rdXA7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CkBAIC01MSw4OSArNTAsOTMgQEAKICAqCiAgKiBBbGwgYm91bmQgYXJndW1lbnRzIGFyZSBlbmNhcHN1bGF0ZWQgaW4gZGVkaWNhdGVkIHNwZWNpZXMuCiAgKi8KLS8qIG5vbi1wdWJsaWMgKi8gYWJzdHJhY3QgY2xhc3MgQm91bmRNZXRob2RIYW5kbGUgZXh0ZW5kcyBNZXRob2RIYW5kbGUgeworLypub24tcHVibGljKi8gYWJzdHJhY3QgY2xhc3MgQm91bmRNZXRob2RIYW5kbGUgZXh0ZW5kcyBNZXRob2RIYW5kbGUgewogCi0gICAgLyogbm9uLXB1YmxpYyAqLyBCb3VuZE1ldGhvZEhhbmRsZShNZXRob2RUeXBlIHR5cGUsIExhbWJkYUZvcm0gZm9ybSkgeworICAgIC8qbm9uLXB1YmxpYyovIEJvdW5kTWV0aG9kSGFuZGxlKE1ldGhvZFR5cGUgdHlwZSwgTGFtYmRhRm9ybSBmb3JtKSB7CiAgICAgICAgIHN1cGVyKHR5cGUsIGZvcm0pOworICAgICAgICBhc3NlcnQoc3BlY2llc0RhdGEoKSA9PSBzcGVjaWVzRGF0YShmb3JtKSk7CiAgICAgfQogCiAgICAgLy8KICAgICAvLyBCTUggQVBJIGFuZCBpbnRlcm5hbHMKICAgICAvLwogCi0gICAgc3RhdGljIE1ldGhvZEhhbmRsZSBiaW5kU2luZ2xlKE1ldGhvZFR5cGUgdHlwZSwgTGFtYmRhRm9ybSBmb3JtLCBjaGFyIHh0eXBlLCBPYmplY3QgeCkgeworICAgIHN0YXRpYyBCb3VuZE1ldGhvZEhhbmRsZSBiaW5kU2luZ2xlKE1ldGhvZFR5cGUgdHlwZSwgTGFtYmRhRm9ybSBmb3JtLCBCYXNpY1R5cGUgeHR5cGUsIE9iamVjdCB4KSB7CiAgICAgICAgIC8vIGZvciBzb21lIHR5cGUgc2lnbmF0dXJlcywgdGhlcmUgZXhpc3QgcHJlLWRlZmluZWQgY29uY3JldGUgQk1IIGNsYXNzZXMKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHN3aXRjaCAoeHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICAgICAgIGlmICh0cnVlKSAgcmV0dXJuIGJpbmRTaW5nbGUodHlwZSwgZm9ybSwgeCk7ICAvLyBVc2Uga25vd24gZmFzdCBwYXRoLgotICAgICAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNwZWNpZXNEYXRhLkVNUFRZLmV4dGVuZFdpdGhUeXBlKCdMJykuY29uc3RydWN0b3JbMF0uaW52b2tlQmFzaWModHlwZSwgZm9ybSwgeCk7Ci0gICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTcGVjaWVzRGF0YS5FTVBUWS5leHRlbmRXaXRoVHlwZSgnSScpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKHR5cGUsIGZvcm0sIFZhbHVlQ29udmVyc2lvbnMud2lkZW5TdWJ3b3JkKHgpKTsKLSAgICAgICAgICAgIGNhc2UgJ0onOgotICAgICAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNwZWNpZXNEYXRhLkVNUFRZLmV4dGVuZFdpdGhUeXBlKCdKJykuY29uc3RydWN0b3JbMF0uaW52b2tlQmFzaWModHlwZSwgZm9ybSwgKGxvbmcpIHgpOwotICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU3BlY2llc0RhdGEuRU1QVFkuZXh0ZW5kV2l0aFR5cGUoJ0YnKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyh0eXBlLCBmb3JtLCAoZmxvYXQpIHgpOwotICAgICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU3BlY2llc0RhdGEuRU1QVFkuZXh0ZW5kV2l0aFR5cGUoJ0QnKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyh0eXBlLCBmb3JtLCAoZG91YmxlKSB4KTsKLSAgICAgICAgICAgIGRlZmF1bHQgOiB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigidW5leHBlY3RlZCB4dHlwZTogIiArIHh0eXBlKTsKKyAgICAgICAgICAgIGNhc2UgTF9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5kU2luZ2xlKHR5cGUsIGZvcm0sIHgpOyAgLy8gVXNlIGtub3duIGZhc3QgcGF0aC4KKyAgICAgICAgICAgIGNhc2UgSV9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNwZWNpZXNEYXRhLkVNUFRZLmV4dGVuZFdpdGgoSV9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKHR5cGUsIGZvcm0sIFZhbHVlQ29udmVyc2lvbnMud2lkZW5TdWJ3b3JkKHgpKTsKKyAgICAgICAgICAgIGNhc2UgSl9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNwZWNpZXNEYXRhLkVNUFRZLmV4dGVuZFdpdGgoSl9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKHR5cGUsIGZvcm0sIChsb25nKSB4KTsKKyAgICAgICAgICAgIGNhc2UgRl9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNwZWNpZXNEYXRhLkVNUFRZLmV4dGVuZFdpdGgoRl9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKHR5cGUsIGZvcm0sIChmbG9hdCkgeCk7CisgICAgICAgICAgICBjYXNlIERfVFlQRToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTcGVjaWVzRGF0YS5FTVBUWS5leHRlbmRXaXRoKERfVFlQRSkuY29uc3RydWN0b3IoKS5pbnZva2VCYXNpYyh0eXBlLCBmb3JtLCAoZG91YmxlKSB4KTsKKyAgICAgICAgICAgIGRlZmF1bHQgOiB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKCJ1bmV4cGVjdGVkIHh0eXBlOiAiICsgeHR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewogICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcih0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXRpYyBNZXRob2RIYW5kbGUgYmluZFNpbmdsZShNZXRob2RUeXBlIHR5cGUsIExhbWJkYUZvcm0gZm9ybSwgT2JqZWN0IHgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3BlY2llc19MKHR5cGUsIGZvcm0sIHgpOworICAgIC8qbm9uLXB1YmxpYyovCisgICAgTGFtYmRhRm9ybUVkaXRvciBlZGl0b3IoKSB7CisgICAgICAgIHJldHVybiBmb3JtLmVkaXRvcigpOwogICAgIH0KIAotICAgIE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZChNZXRob2RUeXBlIHR5cGUsIExhbWJkYUZvcm0gZm9ybSwgY2hhciB4dHlwZSwgT2JqZWN0IHgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN3aXRjaCAoeHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgJ0wnOiByZXR1cm4gY2xvbmVFeHRlbmRMKHR5cGUsIGZvcm0sIHgpOwotICAgICAgICAgICAgY2FzZSAnSSc6IHJldHVybiBjbG9uZUV4dGVuZEkodHlwZSwgZm9ybSwgVmFsdWVDb252ZXJzaW9ucy53aWRlblN1YndvcmQoeCkpOwotICAgICAgICAgICAgY2FzZSAnSic6IHJldHVybiBjbG9uZUV4dGVuZEoodHlwZSwgZm9ybSwgKGxvbmcpIHgpOwotICAgICAgICAgICAgY2FzZSAnRic6IHJldHVybiBjbG9uZUV4dGVuZEYodHlwZSwgZm9ybSwgKGZsb2F0KSB4KTsKLSAgICAgICAgICAgIGNhc2UgJ0QnOiByZXR1cm4gY2xvbmVFeHRlbmREKHR5cGUsIGZvcm0sIChkb3VibGUpIHgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcih0KTsKKyAgICBzdGF0aWMgQm91bmRNZXRob2RIYW5kbGUgYmluZFNpbmdsZShNZXRob2RUeXBlIHR5cGUsIExhbWJkYUZvcm0gZm9ybSwgT2JqZWN0IHgpIHsKKyAgICAgICAgcmV0dXJuIFNwZWNpZXNfTC5tYWtlKHR5cGUsIGZvcm0sIHgpOworICAgIH0KKworICAgIEBPdmVycmlkZSAvLyB0aGVyZSBpcyBhIGRlZmF1bHQgYmluZGVyIGluIHRoZSBzdXBlciBjbGFzcywgZm9yICdMJyB0eXBlcyBvbmx5CisgICAgLypub24tcHVibGljKi8KKyAgICBCb3VuZE1ldGhvZEhhbmRsZSBiaW5kQXJndW1lbnRMKGludCBwb3MsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gZWRpdG9yKCkuYmluZEFyZ3VtZW50TCh0aGlzLCBwb3MsIHZhbHVlKTsKKyAgICB9CisgICAgLypub24tcHVibGljKi8KKyAgICBCb3VuZE1ldGhvZEhhbmRsZSBiaW5kQXJndW1lbnRJKGludCBwb3MsIGludCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gZWRpdG9yKCkuYmluZEFyZ3VtZW50SSh0aGlzLCBwb3MsIHZhbHVlKTsKKyAgICB9CisgICAgLypub24tcHVibGljKi8KKyAgICBCb3VuZE1ldGhvZEhhbmRsZSBiaW5kQXJndW1lbnRKKGludCBwb3MsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGVkaXRvcigpLmJpbmRBcmd1bWVudEoodGhpcywgcG9zLCB2YWx1ZSk7CisgICAgfQorICAgIC8qbm9uLXB1YmxpYyovCisgICAgQm91bmRNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50RihpbnQgcG9zLCBmbG9hdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gZWRpdG9yKCkuYmluZEFyZ3VtZW50Rih0aGlzLCBwb3MsIHZhbHVlKTsKKyAgICB9CisgICAgLypub24tcHVibGljKi8KKyAgICBCb3VuZE1ldGhvZEhhbmRsZSBiaW5kQXJndW1lbnREKGludCBwb3MsIGRvdWJsZSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gZWRpdG9yKCkuYmluZEFyZ3VtZW50RCh0aGlzLCBwb3MsIHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBCb3VuZE1ldGhvZEhhbmRsZSByZWJpbmQoKSB7CisgICAgICAgIGlmICghdG9vQ29tcGxleCgpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigidW5leHBlY3RlZCB0eXBlOiAiICsgeHR5cGUpOworICAgICAgICByZXR1cm4gbWFrZVJlaW52b2tlcih0aGlzKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50KGludCBwb3MsIGNoYXIgYmFzaWNUeXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgTWV0aG9kVHlwZSB0eXBlID0gdHlwZSgpLmRyb3BQYXJhbWV0ZXJUeXBlcyhwb3MsIHBvcysxKTsKLSAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gaW50ZXJuYWxGb3JtKCkuYmluZCgxK3Bvcywgc3BlY2llc0RhdGEoKSk7Ci0gICAgICAgIHJldHVybiBjbG9uZUV4dGVuZCh0eXBlLCBmb3JtLCBiYXNpY1R5cGUsIHZhbHVlKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdG9vQ29tcGxleCgpIHsKKyAgICAgICAgcmV0dXJuIChmaWVsZENvdW50KCkgPiBGSUVMRF9DT1VOVF9USFJFU0hPTEQgfHwKKyAgICAgICAgICAgICAgICBmb3JtLmV4cHJlc3Npb25Db3VudCgpID4gRk9STV9FWFBSRVNTSU9OX1RIUkVTSE9MRCk7CiAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUVMRF9DT1VOVF9USFJFU0hPTEQgPSAxMjsgICAgICAvLyBsYXJnZXN0IGNvbnZlbmllbnQgQk1IIGZpZWxkIGNvdW50CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUk1fRVhQUkVTU0lPTl9USFJFU0hPTEQgPSAyNDsgIC8vIGxhcmdlc3QgY29udmVuaWVudCBCTUggZXhwcmVzc2lvbiBjb3VudAogCi0gICAgQE92ZXJyaWRlCi0gICAgTWV0aG9kSGFuZGxlIGRyb3BBcmd1bWVudHMoTWV0aG9kVHlwZSBzcmNUeXBlLCBpbnQgcG9zLCBpbnQgZHJvcHMpIHsKLSAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gaW50ZXJuYWxGb3JtKCkuYWRkQXJndW1lbnRzKHBvcywgc3JjVHlwZS5wYXJhbWV0ZXJMaXN0KCkuc3ViTGlzdChwb3MsIHBvcytkcm9wcykpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgIHJldHVybiBjbG9uZShzcmNUeXBlLCBmb3JtKTsKLSAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcih0KTsKLSAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBNZXRob2RIYW5kbGUgcGVybXV0ZUFyZ3VtZW50cyhNZXRob2RUeXBlIG5ld1R5cGUsIGludFtdIHJlb3JkZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICByZXR1cm4gY2xvbmUobmV3VHlwZSwgZm9ybS5wZXJtdXRlQXJndW1lbnRzKDEsIHJlb3JkZXIsIGJhc2ljVHlwZXMobmV3VHlwZS5wYXJhbWV0ZXJMaXN0KCkpKSk7Ci0gICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IodCk7Ci0gICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fVFlQRVMgPSAiTElKRkQiOwotICAgIHN0YXRpYyBmaW5hbCBieXRlIElOREVYX0wgPSAwLCBJTkRFWF9JID0gMSwgSU5ERVhfSiA9IDIsIElOREVYX0YgPSAzLCBJTkRFWF9EID0gNDsKLSAgICBzdGF0aWMgYnl0ZSBleHRlbnNpb25JbmRleChjaGFyIHR5cGUpIHsKLSAgICAgICAgaW50IGkgPSBFWFRFTlNJT05fVFlQRVMuaW5kZXhPZih0eXBlKTsKLSAgICAgICAgaWYgKGkgPCAwKSAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLSAgICAgICAgcmV0dXJuIChieXRlKSBpOworICAgIC8qKgorICAgICAqIEEgcmVpbnZva2VyIE1IIGhhcyB0aGlzIGZvcm06CisgICAgICoge0Bjb2RlIGxhbWJkYSAoYm1oLCBhcmcqKSB7IHRoaXNtaCA9IGJtaFswXTsgaW52b2tlQmFzaWModGhpc21oLCBhcmcqKSB9fQorICAgICAqLworICAgIHN0YXRpYyBCb3VuZE1ldGhvZEhhbmRsZSBtYWtlUmVpbnZva2VyKE1ldGhvZEhhbmRsZSB0YXJnZXQpIHsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gRGVsZWdhdGluZ01ldGhvZEhhbmRsZS5tYWtlUmVpbnZva2VyRm9ybSgKKyAgICAgICAgICAgICAgICB0YXJnZXQsIE1ldGhvZFR5cGVGb3JtLkxGX1JFQklORCwKKyAgICAgICAgICAgICAgICBTcGVjaWVzX0wuU1BFQ0lFU19EQVRBLCBTcGVjaWVzX0wuU1BFQ0lFU19EQVRBLmdldHRlckZ1bmN0aW9uKDApKTsKKyAgICAgICAgcmV0dXJuIFNwZWNpZXNfTC5tYWtlKHRhcmdldC50eXBlKCksIGZvcm0sIHRhcmdldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDIsOSArMTQ1LDIyIEBACiAgICAgICovCiAgICAgLypub24tcHVibGljKi8gYWJzdHJhY3QgU3BlY2llc0RhdGEgc3BlY2llc0RhdGEoKTsKIAorICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYyBTcGVjaWVzRGF0YSBzcGVjaWVzRGF0YShMYW1iZGFGb3JtIGZvcm0pIHsKKyAgICAgICAgT2JqZWN0IGMgPSBmb3JtLm5hbWVzWzBdLmNvbnN0cmFpbnQ7CisgICAgICAgIGlmIChjIGluc3RhbmNlb2YgU3BlY2llc0RhdGEpCisgICAgICAgICAgICByZXR1cm4gKFNwZWNpZXNEYXRhKSBjOworICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBCTUggY29uc3RyYWludCwgdGhlbiB1c2UgdGhlIG51bGwgY29uc3RyYWludAorICAgICAgICByZXR1cm4gU3BlY2llc0RhdGEuRU1QVFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoaXMgQk1ILiAgRXF1aXZhbGVudCB0byBzcGVjaWVzRGF0YSgpLmZpZWxkQ291bnQoKS4KKyAgICAgKi8KKyAgICAvKm5vbi1wdWJsaWMqLyBhYnN0cmFjdCBpbnQgZmllbGRDb3VudCgpOworCiAgICAgQE92ZXJyaWRlCi0gICAgZmluYWwgT2JqZWN0IGludGVybmFsUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuICIvQk1IPSIraW50ZXJuYWxWYWx1ZXMoKTsKKyAgICBPYmplY3QgaW50ZXJuYWxQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gIlxuJiBCTUg9IitpbnRlcm5hbFZhbHVlcygpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU5LDQyICsxNzUsMjggQEAKICAgICAvKm5vbi1wdWJsaWMqLyBmaW5hbCBPYmplY3QgYXJnKGludCBpKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHNwZWNpZXNEYXRhKCkuZmllbGRUeXBlKGkpKSB7Ci0gICAgICAgICAgICBjYXNlICdMJzogcmV0dXJuIGFyZ0woaSk7Ci0gICAgICAgICAgICBjYXNlICdJJzogcmV0dXJuIGFyZ0koaSk7Ci0gICAgICAgICAgICBjYXNlICdGJzogcmV0dXJuIGFyZ0YoaSk7Ci0gICAgICAgICAgICBjYXNlICdEJzogcmV0dXJuIGFyZ0QoaSk7Ci0gICAgICAgICAgICBjYXNlICdKJzogcmV0dXJuIGFyZ0ooaSk7CisgICAgICAgICAgICBjYXNlIExfVFlQRTogcmV0dXJuICAgICAgICAgIHNwZWNpZXNEYXRhKCkuZ2V0dGVyc1tpXS5pbnZva2VCYXNpYyh0aGlzKTsKKyAgICAgICAgICAgIGNhc2UgSV9UWVBFOiByZXR1cm4gKGludCkgICAgc3BlY2llc0RhdGEoKS5nZXR0ZXJzW2ldLmludm9rZUJhc2ljKHRoaXMpOworICAgICAgICAgICAgY2FzZSBKX1RZUEU6IHJldHVybiAobG9uZykgICBzcGVjaWVzRGF0YSgpLmdldHRlcnNbaV0uaW52b2tlQmFzaWModGhpcyk7CisgICAgICAgICAgICBjYXNlIEZfVFlQRTogcmV0dXJuIChmbG9hdCkgIHNwZWNpZXNEYXRhKCkuZ2V0dGVyc1tpXS5pbnZva2VCYXNpYyh0aGlzKTsKKyAgICAgICAgICAgIGNhc2UgRF9UWVBFOiByZXR1cm4gKGRvdWJsZSkgc3BlY2llc0RhdGEoKS5nZXR0ZXJzW2ldLmludm9rZUJhc2ljKHRoaXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoZXgpOwogICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJ1bmV4cGVjdGVkIHR5cGU6ICIgKyBzcGVjaWVzRGF0YSgpLnR5cGVzKyIuIitpKTsKKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoInVuZXhwZWN0ZWQgdHlwZTogIiArIHNwZWNpZXNEYXRhKCkudHlwZUNoYXJzKyIuIitpKTsKICAgICB9Ci0gICAgLypub24tcHVibGljKi8gZmluYWwgT2JqZWN0IGFyZ0woaW50IGkpIHRocm93cyBUaHJvd2FibGUgeyByZXR1cm4gICAgICAgICAgc3BlY2llc0RhdGEoKS5nZXR0ZXJzW2ldLmludm9rZUJhc2ljKHRoaXMpOyB9Ci0gICAgLypub24tcHVibGljKi8gZmluYWwgaW50ICAgIGFyZ0koaW50IGkpIHRocm93cyBUaHJvd2FibGUgeyByZXR1cm4gKGludCkgICAgc3BlY2llc0RhdGEoKS5nZXR0ZXJzW2ldLmludm9rZUJhc2ljKHRoaXMpOyB9Ci0gICAgLypub24tcHVibGljKi8gZmluYWwgZmxvYXQgIGFyZ0YoaW50IGkpIHRocm93cyBUaHJvd2FibGUgeyByZXR1cm4gKGZsb2F0KSAgc3BlY2llc0RhdGEoKS5nZXR0ZXJzW2ldLmludm9rZUJhc2ljKHRoaXMpOyB9Ci0gICAgLypub24tcHVibGljKi8gZmluYWwgZG91YmxlIGFyZ0QoaW50IGkpIHRocm93cyBUaHJvd2FibGUgeyByZXR1cm4gKGRvdWJsZSkgc3BlY2llc0RhdGEoKS5nZXR0ZXJzW2ldLmludm9rZUJhc2ljKHRoaXMpOyB9Ci0gICAgLypub24tcHVibGljKi8gZmluYWwgbG9uZyAgIGFyZ0ooaW50IGkpIHRocm93cyBUaHJvd2FibGUgeyByZXR1cm4gKGxvbmcpICAgc3BlY2llc0RhdGEoKS5nZXR0ZXJzW2ldLmludm9rZUJhc2ljKHRoaXMpOyB9CiAKICAgICAvLwogICAgIC8vIGNsb25pbmcgQVBJCiAgICAgLy8KIAotICAgIC8qbm9uLXB1YmxpYyovIGFic3RyYWN0IEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHRocm93cyBUaHJvd2FibGU7Ci0gICAgLypub24tcHVibGljKi8gYWJzdHJhY3QgQm91bmRNZXRob2RIYW5kbGUgY2xvbmVFeHRlbmRMKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIE9iamVjdCBuYXJnKSB0aHJvd3MgVGhyb3dhYmxlOwotICAgIC8qbm9uLXB1YmxpYyovIGFic3RyYWN0IEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kSShNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBpbnQgICAgbmFyZykgdGhyb3dzIFRocm93YWJsZTsKLSAgICAvKm5vbi1wdWJsaWMqLyBhYnN0cmFjdCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEooTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgbG9uZyAgIG5hcmcpIHRocm93cyBUaHJvd2FibGU7Ci0gICAgLypub24tcHVibGljKi8gYWJzdHJhY3QgQm91bmRNZXRob2RIYW5kbGUgY2xvbmVFeHRlbmRGKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGZsb2F0ICBuYXJnKSB0aHJvd3MgVGhyb3dhYmxlOwotICAgIC8qbm9uLXB1YmxpYyovIGFic3RyYWN0IEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kRChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBkb3VibGUgbmFyZykgdGhyb3dzIFRocm93YWJsZTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYSBncm9zc2x5IGlycmVndWxhciBoYWNrOgotICAgIEBPdmVycmlkZSBNZXRob2RIYW5kbGUgcmVpbnZva2VyVGFyZ2V0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChNZXRob2RIYW5kbGUpIGFyZ0woMCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcihleCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgLypub24tcHVibGljKi8gYWJzdHJhY3QgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGgoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZik7CisgICAgLypub24tcHVibGljKi8gYWJzdHJhY3QgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGhFeHRlbmRMKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIE9iamVjdCBuYXJnKTsKKyAgICAvKm5vbi1wdWJsaWMqLyBhYnN0cmFjdCBCb3VuZE1ldGhvZEhhbmRsZSBjb3B5V2l0aEV4dGVuZEkoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgaW50ICAgIG5hcmcpOworICAgIC8qbm9uLXB1YmxpYyovIGFic3RyYWN0IEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kSihNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBsb25nICAgbmFyZyk7CisgICAgLypub24tcHVibGljKi8gYWJzdHJhY3QgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGhFeHRlbmRGKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGZsb2F0ICBuYXJnKTsKKyAgICAvKm5vbi1wdWJsaWMqLyBhYnN0cmFjdCBCb3VuZE1ldGhvZEhhbmRsZSBjb3B5V2l0aEV4dGVuZEQoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgZG91YmxlIG5hcmcpOwogCiAgICAgLy8KICAgICAvLyBjb25jcmV0ZSBCTUggY2xhc3NlcyByZXF1aXJlZCB0byBjbG9zZSBib290c3RyYXAgbG9vcHMKQEAgLTIwMywxNTAgKzIwNSwxMTAgQEAKICAgICBwcml2YXRlICAvLyBtYWtlIGl0IHByaXZhdGUgdG8gZm9yY2UgdXNlcnMgdG8gYWNjZXNzIHRoZSBlbmNsb3NpbmcgY2xhc3MgZmlyc3QKICAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3BlY2llc19MIGV4dGVuZHMgQm91bmRNZXRob2RIYW5kbGUgewogICAgICAgICBmaW5hbCBPYmplY3QgYXJnTDA7Ci0gICAgICAgIC8qbm9uLXB1YmxpYyovIFNwZWNpZXNfTChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBPYmplY3QgYXJnTDApIHsKKyAgICAgICAgcHJpdmF0ZSBTcGVjaWVzX0woTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgT2JqZWN0IGFyZ0wwKSB7CiAgICAgICAgICAgICBzdXBlcihtdCwgbGYpOwogICAgICAgICAgICAgdGhpcy5hcmdMMCA9IGFyZ0wwOwogICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYSBncm9zc2x5IGlycmVndWxhciBoYWNrOgotICAgICAgICBAT3ZlcnJpZGUgTWV0aG9kSGFuZGxlIHJlaW52b2tlclRhcmdldCgpIHsgcmV0dXJuIChNZXRob2RIYW5kbGUpIGFyZ0wwOyB9CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAvKm5vbi1wdWJsaWMqLyBTcGVjaWVzRGF0YSBzcGVjaWVzRGF0YSgpIHsKICAgICAgICAgICAgIHJldHVybiBTUEVDSUVTX0RBVEE7CiAgICAgICAgIH0KLSAgICAgICAgLypub24tcHVibGljKi8gc3RhdGljIGZpbmFsIFNwZWNpZXNEYXRhIFNQRUNJRVNfREFUQSA9IFNwZWNpZXNEYXRhLmdldEZvckNsYXNzKCJMIiwgU3BlY2llc19MLmNsYXNzKTsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvKm5vbi1wdWJsaWMqLyBpbnQgZmllbGRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYyBmaW5hbCBTcGVjaWVzRGF0YSBTUEVDSUVTX0RBVEEgPSBTcGVjaWVzRGF0YS5nZXRGb3JDbGFzcygiTCIsIFNwZWNpZXNfTC5jbGFzcyk7CisgICAgICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYyBCb3VuZE1ldGhvZEhhbmRsZSBtYWtlKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIE9iamVjdCBhcmdMMCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTcGVjaWVzX0wobXQsIGxmLCBhcmdMMCk7CiAgICAgICAgIH0KICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kTChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBPYmplY3QgbmFyZykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KElOREVYX0wpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIG5hcmcpOworICAgICAgICAvKm5vbi1wdWJsaWMqLyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjb3B5V2l0aChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNwZWNpZXNfTChtdCwgbGYsIGFyZ0wwKTsKICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgLypub24tcHVibGljKi8gZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY2xvbmVFeHRlbmRJKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGludCBuYXJnKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoSW5kZXgoSU5ERVhfSSkuY29uc3RydWN0b3JbMF0uaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgbmFyZyk7CisgICAgICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kTChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBPYmplY3QgbmFyZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aChMX1RZUEUpLmNvbnN0cnVjdG9yKCkuaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgbmFyZyk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kSihNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBsb25nIG5hcmcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9KKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCBuYXJnKTsKKyAgICAgICAgLypub24tcHVibGljKi8gZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGhFeHRlbmRJKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGludCBuYXJnKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoKElfVFlQRSkuY29uc3RydWN0b3IoKS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCBuYXJnKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgLypub24tcHVibGljKi8gZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY2xvbmVFeHRlbmRGKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGZsb2F0IG5hcmcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9GKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCBuYXJnKTsKKyAgICAgICAgLypub24tcHVibGljKi8gZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGhFeHRlbmRKKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGxvbmcgbmFyZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aChKX1RZUEUpLmNvbnN0cnVjdG9yKCkuaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgbmFyZyk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kRChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBkb3VibGUgbmFyZykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KElOREVYX0QpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIG5hcmcpOworICAgICAgICAvKm5vbi1wdWJsaWMqLyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjb3B5V2l0aEV4dGVuZEYoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgZmxvYXQgbmFyZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aChGX1RZUEUpLmNvbnN0cnVjdG9yKCkuaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgbmFyZyk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kRChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBkb3VibGUgbmFyZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aChEX1RZUEUpLmNvbnN0cnVjdG9yKCkuaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgbmFyZyk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLS8qCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFNwZWNpZXNfTEwgZXh0ZW5kcyBCb3VuZE1ldGhvZEhhbmRsZSB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBhcmdMMDsKLSAgICAgICAgZmluYWwgT2JqZWN0IGFyZ0wxOwotICAgICAgICBwdWJsaWMgU3BlY2llc19MTChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBPYmplY3QgYXJnTDAsIE9iamVjdCBhcmdMMSkgewotICAgICAgICAgICAgc3VwZXIobXQsIGxmKTsKLSAgICAgICAgICAgIHRoaXMuYXJnTDAgPSBhcmdMMDsKLSAgICAgICAgICAgIHRoaXMuYXJnTDEgPSBhcmdMMTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNwZWNpZXNEYXRhIHNwZWNpZXNEYXRhKCkgewotICAgICAgICAgICAgcmV0dXJuIFNQRUNJRVNfREFUQTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNwZWNpZXNEYXRhIFNQRUNJRVNfREFUQSA9IFNwZWNpZXNEYXRhLmdldEZvckNsYXNzKCJMTCIsIFNwZWNpZXNfTEwuY2xhc3MpOwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTcGVjaWVzX0xMKG10LCBsZiwgYXJnTDAsIGFyZ0wxKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kTChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBPYmplY3QgbmFyZykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KElOREVYX0wpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBuYXJnKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kSShNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBpbnQgbmFyZykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KElOREVYX0kpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBuYXJnKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kSihNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBsb25nIG5hcmcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9KKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCBhcmdMMSwgbmFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEYoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgZmxvYXQgbmFyZykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KElOREVYX0YpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBuYXJnKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kRChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBkb3VibGUgbmFyZykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvdW5kTWV0aG9kSGFuZGxlKSBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KElOREVYX0QpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBuYXJnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTcGVjaWVzX0pMIGV4dGVuZHMgQm91bmRNZXRob2RIYW5kbGUgewotICAgICAgICBmaW5hbCBsb25nIGFyZ0owOwotICAgICAgICBmaW5hbCBPYmplY3QgYXJnTDE7Ci0gICAgICAgIHB1YmxpYyBTcGVjaWVzX0pMKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGxvbmcgYXJnSjAsIE9iamVjdCBhcmdMMSkgewotICAgICAgICAgICAgc3VwZXIobXQsIGxmKTsKLSAgICAgICAgICAgIHRoaXMuYXJnSjAgPSBhcmdKMDsKLSAgICAgICAgICAgIHRoaXMuYXJnTDEgPSBhcmdMMTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNwZWNpZXNEYXRhIHNwZWNpZXNEYXRhKCkgewotICAgICAgICAgICAgcmV0dXJuIFNQRUNJRVNfREFUQTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNwZWNpZXNEYXRhIFNQRUNJRVNfREFUQSA9IFNwZWNpZXNEYXRhLmdldEZvckNsYXNzKCJKTCIsIFNwZWNpZXNfSkwuY2xhc3MpOwotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIGxvbmcgICBhcmdKMCgpIHsgcmV0dXJuIGFyZ0owOyB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgT2JqZWN0IGFyZ0wxKCkgeyByZXR1cm4gYXJnTDE7IH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZShNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3BlY2llc19KTChtdCwgbGYsIGFyZ0owLCBhcmdMMSk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEwoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgT2JqZWN0IG5hcmcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9MKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0owLCBhcmdMMSwgbmFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEkoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgaW50IG5hcmcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9JKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0owLCBhcmdMMSwgbmFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEooTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgbG9uZyBuYXJnKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoSW5kZXgoSU5ERVhfSikuY29uc3RydWN0b3JbMF0uaW52b2tlQmFzaWMobXQsIGxmLCBhcmdKMCwgYXJnTDEsIG5hcmcpOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY2xvbmVFeHRlbmRGKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGZsb2F0IG5hcmcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9GKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0owLCBhcmdMMSwgbmFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEQoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgZG91YmxlIG5hcmcpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9EKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0owLCBhcmdMMSwgbmFyZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0qLwotCiAgICAgLy8KICAgICAvLyBCTUggc3BlY2llcyBtZXRhLWRhdGEKICAgICAvLwogCiAgICAgLyoqCi0gICAgICogTWV0YS1kYXRhIHdyYXBwZXIgZm9yIGNvbmNyZXRlIEJNSCBjbGFzc2VzLgorICAgICAqIE1ldGEtZGF0YSB3cmFwcGVyIGZvciBjb25jcmV0ZSBCTUggdHlwZXMuCisgICAgICogRWFjaCBCTUggdHlwZSBjb3JyZXNwb25kcyB0byBhIGdpdmVuIHNlcXVlbmNlIG9mIGJhc2ljIGZpZWxkIHR5cGVzIChMSUpGRCkuCisgICAgICogVGhlIGZpZWxkcyBhcmUgaW1tdXRhYmxlOyB0aGVpciB2YWx1ZXMgYXJlIGZ1bGx5IHNwZWNpZmllZCBhdCBvYmplY3QgY29uc3RydWN0aW9uLgorICAgICAqIEVhY2ggQk1IIHR5cGUgc3VwcGxpZXMgYW4gYXJyYXkgb2YgZ2V0dGVyIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgdXNlZCBpbiBsYW1iZGEgZm9ybXMuCisgICAgICogQSBCTUggaXMgY29uc3RydWN0ZWQgYnkgY2xvbmluZyBhIHNob3J0ZXIgQk1IIGFuZCBhZGRpbmcgb25lIG9yIG1vcmUgbmV3IGZpZWxkIHZhbHVlcy4KKyAgICAgKiBUaGUgc2hvcnRlc3QgcG9zc2libGUgQk1IIGhhcyB6ZXJvIGZpZWxkczsgaXRzIGNsYXNzIGlzIFNpbXBsZU1ldGhvZEhhbmRsZS4KKyAgICAgKiBCTUggc3BlY2llcyBhcmUgbm90IGludGVycmVsYXRlZCBieSBzdWJ0eXBpbmcsIGV2ZW4gdGhvdWdoIGl0IHdvdWxkIGFwcGVhciB0aGF0CisgICAgICogYSBzaG9ydGVyIEJNSCBjb3VsZCBzZXJ2ZSBhcyBhIHN1cGVydHlwZSBvZiBhIGxvbmdlciBvbmUgd2hpY2ggZXh0ZW5kcyBpdC4KICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgU3BlY2llc0RhdGEgewotICAgICAgICBmaW5hbCBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOwotICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQm91bmRNZXRob2RIYW5kbGU+IGNsYXp6OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNoYXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIEJhc2ljVHlwZVtdICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGVzOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCb3VuZE1ldGhvZEhhbmRsZT4gY2xheno7CiAgICAgICAgIC8vIEJvb3RzdHJhcHBpbmcgcmVxdWlyZXMgY2lyY3VsYXIgcmVsYXRpb25zIE1IIC0+IEJNSCAtPiBTcGVjaWVzRGF0YSAtPiBNSAogICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIG5lZWQgYSBub24tZmluYWwgbGluayBpbiB0aGUgY2hhaW4uICBVc2UgYXJyYXkgZWxlbWVudHMuCi0gICAgICAgIGZpbmFsIE1ldGhvZEhhbmRsZVtdICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I7Ci0gICAgICAgIGZpbmFsIE1ldGhvZEhhbmRsZVtdICAgICAgICAgICAgICAgICAgICAgZ2V0dGVyczsKLSAgICAgICAgZmluYWwgU3BlY2llc0RhdGFbXSAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zOworICAgICAgICBAU3RhYmxlIHByaXZhdGUgZmluYWwgTWV0aG9kSGFuZGxlW10gICAgICAgICAgICAgY29uc3RydWN0b3I7CisgICAgICAgIEBTdGFibGUgcHJpdmF0ZSBmaW5hbCBNZXRob2RIYW5kbGVbXSAgICAgICAgICAgICBnZXR0ZXJzOworICAgICAgICBAU3RhYmxlIHByaXZhdGUgZmluYWwgTmFtZWRGdW5jdGlvbltdICAgICAgICAgICAgbm9taW5hbEdldHRlcnM7CisgICAgICAgIEBTdGFibGUgcHJpdmF0ZSBmaW5hbCBTcGVjaWVzRGF0YVtdICAgICAgICAgICAgICBleHRlbnNpb25zOwogCiAgICAgICAgIC8qbm9uLXB1YmxpYyovIGludCBmaWVsZENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGVzLmxlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIHR5cGVDb2Rlcy5sZW5ndGg7CiAgICAgICAgIH0KLSAgICAgICAgLypub24tcHVibGljKi8gY2hhciBmaWVsZFR5cGUoaW50IGkpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlcy5jaGFyQXQoaSk7CisgICAgICAgIC8qbm9uLXB1YmxpYyovIEJhc2ljVHlwZSBmaWVsZFR5cGUoaW50IGkpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlQ29kZXNbaV07CiAgICAgICAgIH0KLQorICAgICAgICAvKm5vbi1wdWJsaWMqLyBjaGFyIGZpZWxkVHlwZUNoYXIoaW50IGkpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlQ2hhcnMuY2hhckF0KGkpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBmaWVsZFNpZ25hdHVyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlQ2hhcnM7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBCb3VuZE1ldGhvZEhhbmRsZT4gZmllbGRIb2xkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gY2xheno7CisgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiU3BlY2llc0RhdGFbIisoaXNQbGFjZWhvbGRlcigpID8gIjxwbGFjZWhvbGRlcj4iIDogY2xhenouZ2V0U2ltcGxlTmFtZSgpKSsiOiIrdHlwZXMrIl0iOworICAgICAgICAgICAgcmV0dXJuICJTcGVjaWVzRGF0YTwiK2ZpZWxkU2lnbmF0dXJlKCkrIj4iOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0zNTQsNDUgKzMxNiw1OSBAQAogICAgICAgICAgKiByZXByZXNlbnRzIGEgTUggYm91bmQgdG8gYSBnZW5lcmljIGludm9rZXIsIHdoaWNoIGluIHR1cm4gZm9yd2FyZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgICogZ2V0dGVyLgogICAgICAgICAgKi8KLSAgICAgICAgTmFtZSBnZXR0ZXJOYW1lKE5hbWUgbWhOYW1lLCBpbnQgaSkgewotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gZ2V0dGVyc1tpXTsKLSAgICAgICAgICAgIGFzc2VydChtaCAhPSBudWxsKSA6IHRoaXMrIi4iK2k7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5hbWUobWgsIG1oTmFtZSk7CisgICAgICAgIE5hbWVkRnVuY3Rpb24gZ2V0dGVyRnVuY3Rpb24oaW50IGkpIHsKKyAgICAgICAgICAgIE5hbWVkRnVuY3Rpb24gbmYgPSBub21pbmFsR2V0dGVyc1tpXTsKKyAgICAgICAgICAgIGFzc2VydChuZi5tZW1iZXJEZWNsYXJpbmdDbGFzc09yTnVsbCgpID09IGZpZWxkSG9sZGVyKCkpOworICAgICAgICAgICAgYXNzZXJ0KG5mLnJldHVyblR5cGUoKSA9PSBmaWVsZFR5cGUoaSkpOworICAgICAgICAgICAgcmV0dXJuIG5mOwogICAgICAgICB9CiAKLSAgICAgICAgTmFtZWRGdW5jdGlvbiBnZXR0ZXJGdW5jdGlvbihpbnQgaSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1lZEZ1bmN0aW9uKGdldHRlcnNbaV0pOworICAgICAgICBOYW1lZEZ1bmN0aW9uW10gZ2V0dGVyRnVuY3Rpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIG5vbWluYWxHZXR0ZXJzOworICAgICAgICB9CisKKyAgICAgICAgTWV0aG9kSGFuZGxlW10gZ2V0dGVySGFuZGxlcygpIHsgcmV0dXJuIGdldHRlcnM7IH0KKworICAgICAgICBNZXRob2RIYW5kbGUgY29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3JbMF07CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0aWMgZmluYWwgU3BlY2llc0RhdGEgRU1QVFkgPSBuZXcgU3BlY2llc0RhdGEoIiIsIEJvdW5kTWV0aG9kSGFuZGxlLmNsYXNzKTsKIAogICAgICAgICBwcml2YXRlIFNwZWNpZXNEYXRhKFN0cmluZyB0eXBlcywgQ2xhc3M8PyBleHRlbmRzIEJvdW5kTWV0aG9kSGFuZGxlPiBjbGF6eikgewotICAgICAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzOworICAgICAgICAgICAgdGhpcy50eXBlQ2hhcnMgPSB0eXBlczsKKyAgICAgICAgICAgIHRoaXMudHlwZUNvZGVzID0gYmFzaWNUeXBlcyh0eXBlcyk7CiAgICAgICAgICAgICB0aGlzLmNsYXp6ID0gY2xheno7CiAgICAgICAgICAgICBpZiAoIUlOSVRfRE9ORSkgewotICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBuZXcgTWV0aG9kSGFuZGxlWzFdOworICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBuZXcgTWV0aG9kSGFuZGxlWzFdOyAgLy8gb25seSBvbmUgY3RvcgogICAgICAgICAgICAgICAgIHRoaXMuZ2V0dGVycyA9IG5ldyBNZXRob2RIYW5kbGVbdHlwZXMubGVuZ3RoKCldOworICAgICAgICAgICAgICAgIHRoaXMubm9taW5hbEdldHRlcnMgPSBuZXcgTmFtZWRGdW5jdGlvblt0eXBlcy5sZW5ndGgoKV07CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBGYWN0b3J5Lm1ha2VDdG9ycyhjbGF6eiwgdHlwZXMsIG51bGwpOwogICAgICAgICAgICAgICAgIHRoaXMuZ2V0dGVycyA9IEZhY3RvcnkubWFrZUdldHRlcnMoY2xhenosIHR5cGVzLCBudWxsKTsKKyAgICAgICAgICAgICAgICB0aGlzLm5vbWluYWxHZXR0ZXJzID0gRmFjdG9yeS5tYWtlTm9taW5hbEdldHRlcnModHlwZXMsIG51bGwsIHRoaXMuZ2V0dGVycyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBuZXcgU3BlY2llc0RhdGFbRVhURU5TSU9OX1RZUEVTLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG5ldyBTcGVjaWVzRGF0YVtBUkdfVFlQRV9MSU1JVF07CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgaW5pdEZvckJvb3RzdHJhcCgpIHsKICAgICAgICAgICAgIGFzc2VydCghSU5JVF9ET05FKTsKLSAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvclswXSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29uc3RydWN0b3IoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVzID0gdHlwZUNoYXJzOwogICAgICAgICAgICAgICAgIEZhY3RvcnkubWFrZUN0b3JzKGNsYXp6LCB0eXBlcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgICAgICAgICAgICAgICAgRmFjdG9yeS5tYWtlR2V0dGVycyhjbGF6eiwgdHlwZXMsIHRoaXMuZ2V0dGVycyk7CisgICAgICAgICAgICAgICAgRmFjdG9yeS5tYWtlTm9taW5hbEdldHRlcnModHlwZXMsIHRoaXMubm9taW5hbEdldHRlcnMsIHRoaXMuZ2V0dGVycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIFNwZWNpZXNEYXRhKFN0cmluZyB0eXBlcykgeworICAgICAgICBwcml2YXRlIFNwZWNpZXNEYXRhKFN0cmluZyB0eXBlQ2hhcnMpIHsKICAgICAgICAgICAgIC8vIFBsYWNlaG9sZGVyIG9ubHkuCi0gICAgICAgICAgICB0aGlzLnR5cGVzID0gdHlwZXM7CisgICAgICAgICAgICB0aGlzLnR5cGVDaGFycyA9IHR5cGVDaGFyczsKKyAgICAgICAgICAgIHRoaXMudHlwZUNvZGVzID0gYmFzaWNUeXBlcyh0eXBlQ2hhcnMpOwogICAgICAgICAgICAgdGhpcy5jbGF6eiA9IG51bGw7CiAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gbnVsbDsKICAgICAgICAgICAgIHRoaXMuZ2V0dGVycyA9IG51bGw7CisgICAgICAgICAgICB0aGlzLm5vbWluYWxHZXR0ZXJzID0gbnVsbDsKICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUGxhY2Vob2xkZXIoKSB7IHJldHVybiBjbGF6eiA9PSBudWxsOyB9CkBAIC00MDEsMTggKzM3NywxNSBAQAogICAgICAgICBzdGF0aWMgeyBDQUNIRS5wdXQoIiIsIEVNUFRZKTsgfSAgLy8gbWFrZSBib290c3RyYXAgcHJlZGljdGFibGUKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTklUX0RPTkU7ICAvLyBzZXQgYWZ0ZXIgPGNsaW5pdD4gZmluaXNoZXMuLi4KIAotICAgICAgICBTcGVjaWVzRGF0YSBleHRlbmRXaXRoVHlwZShjaGFyIHR5cGUpIHsKLSAgICAgICAgICAgIGludCBpID0gZXh0ZW5zaW9uSW5kZXgodHlwZSk7Ci0gICAgICAgICAgICBTcGVjaWVzRGF0YSBkID0gZXh0ZW5zaW9uc1tpXTsKLSAgICAgICAgICAgIGlmIChkICE9IG51bGwpICByZXR1cm4gZDsKLSAgICAgICAgICAgIGV4dGVuc2lvbnNbaV0gPSBkID0gZ2V0KHR5cGVzK3R5cGUpOwotICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIFNwZWNpZXNEYXRhIGV4dGVuZFdpdGgoYnl0ZSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0ZW5kV2l0aChCYXNpY1R5cGUuYmFzaWNUeXBlKHR5cGUpKTsKICAgICAgICAgfQogCi0gICAgICAgIFNwZWNpZXNEYXRhIGV4dGVuZFdpdGhJbmRleChieXRlIGluZGV4KSB7Ci0gICAgICAgICAgICBTcGVjaWVzRGF0YSBkID0gZXh0ZW5zaW9uc1tpbmRleF07CisgICAgICAgIFNwZWNpZXNEYXRhIGV4dGVuZFdpdGgoQmFzaWNUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgIGludCBvcmQgPSB0eXBlLm9yZGluYWwoKTsKKyAgICAgICAgICAgIFNwZWNpZXNEYXRhIGQgPSBleHRlbnNpb25zW29yZF07CiAgICAgICAgICAgICBpZiAoZCAhPSBudWxsKSAgcmV0dXJuIGQ7Ci0gICAgICAgICAgICBleHRlbnNpb25zW2luZGV4XSA9IGQgPSBnZXQodHlwZXMrRVhURU5TSU9OX1RZUEVTLmNoYXJBdChpbmRleCkpOworICAgICAgICAgICAgZXh0ZW5zaW9uc1tvcmRdID0gZCA9IGdldCh0eXBlQ2hhcnMrdHlwZS5iYXNpY1R5cGVDaGFyKCkpOwogICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgIH0KIApAQCAtNDU2LDggKzQyOSw2IEBACiAgICAgICAgIHN0YXRpYyB7CiAgICAgICAgICAgICAvLyBwcmUtZmlsbCB0aGUgQk1IIHNwZWNpZXNkYXRhIGNhY2hlIHdpdGggQk1IJ3MgaW5uZXIgY2xhc3NlcwogICAgICAgICAgICAgZmluYWwgQ2xhc3M8Qm91bmRNZXRob2RIYW5kbGU+IHJvb3RDbHMgPSBCb3VuZE1ldGhvZEhhbmRsZS5jbGFzczsKLSAgICAgICAgICAgIFNwZWNpZXNEYXRhIGQwID0gQm91bmRNZXRob2RIYW5kbGUuU1BFQ0lFU19EQVRBOyAgLy8gdHJpZ2dlciBjbGFzcyBpbml0Ci0gICAgICAgICAgICBhc3NlcnQoZDAgPT0gbnVsbCB8fCBkMCA9PSBsb29rdXBDYWNoZSgiIikpIDogZDA7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGZvciAoQ2xhc3M8Pz4gYyA6IHJvb3RDbHMuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3RDbHMuaXNBc3NpZ25hYmxlRnJvbShjKSkgewpAQCAtNDY1LDcgKzQzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzRGF0YSBkID0gRmFjdG9yeS5zcGVjaWVzRGF0YUZyb21Db25jcmV0ZUJNSENsYXNzKGNibWgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGQgIT0gbnVsbCkgOiBjYm1oLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChkLmNsYXp6ID09IGNibWgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGQgPT0gbG9va3VwQ2FjaGUoZC50eXBlcykpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGQgPT0gbG9va3VwQ2FjaGUoZC50eXBlQ2hhcnMpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CkBAIC01MTYsMTEgKzQ4NywxMCBAQAogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJNSFNQRUNJRVNfREFUQV9HRkNfU0lHID0gIigiICsgSkxTX1NJRyArIEpMQ19TSUcgKyAiKSIgKyBTUEVDSUVTX0RBVEFfU0lHOwogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZU1BFQ0lFU19EQVRBX1NJRyA9ICIoKSIgKyBTUEVDSUVTX0RBVEFfU0lHOwogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSURfU0lHICAgPSAiKClWIjsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfU0lHICAgID0gIigpSSI7CiAKICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfSU5DSVBJVCA9ICIoTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZTtMamF2YS9sYW5nL2ludm9rZS9MYW1iZGFGb3JtOyI7CiAKLSAgICAgICAgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gVFlQRVMgPSBuZXcgQ2xhc3M8Pz5bXSB7IE9iamVjdC5jbGFzcywgaW50LmNsYXNzLCBsb25nLmNsYXNzLCBmbG9hdC5jbGFzcywgZG91YmxlLmNsYXNzIH07Ci0KICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVfVEhST1dBQkxFID0gbmV3IFN0cmluZ1tdIHsgImphdmEvbGFuZy9UaHJvd2FibGUiIH07CiAKICAgICAgICAgLyoqCkBAIC01NTEsMzEgKzUyMSwzNSBAQAogICAgICAgICAgKiAgICAgZmluYWwgT2JqZWN0IGFyZ0wwOwogICAgICAgICAgKiAgICAgZmluYWwgT2JqZWN0IGFyZ0wxOwogICAgICAgICAgKiAgICAgZmluYWwgaW50IGFyZ0kyOwotICAgICAgICAgKiAgICAgU3BlY2llc19MTEkoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgT2JqZWN0IGFyZ0wwLCBPYmplY3QgYXJnTDEsIGludCBhcmdJMikgeworICAgICAgICAgKiAgICAgcHJpdmF0ZSBTcGVjaWVzX0xMSShNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBPYmplY3QgYXJnTDAsIE9iamVjdCBhcmdMMSwgaW50IGFyZ0kyKSB7CiAgICAgICAgICAqICAgICAgICAgc3VwZXIobXQsIGxmKTsKICAgICAgICAgICogICAgICAgICB0aGlzLmFyZ0wwID0gYXJnTDA7CiAgICAgICAgICAqICAgICAgICAgdGhpcy5hcmdMMSA9IGFyZ0wxOwogICAgICAgICAgKiAgICAgICAgIHRoaXMuYXJnSTIgPSBhcmdJMjsKICAgICAgICAgICogICAgIH0KICAgICAgICAgICogICAgIGZpbmFsIFNwZWNpZXNEYXRhIHNwZWNpZXNEYXRhKCkgeyByZXR1cm4gU1BFQ0lFU19EQVRBOyB9CisgICAgICAgICAqICAgICBmaW5hbCBpbnQgZmllbGRDb3VudCgpIHsgcmV0dXJuIDM7IH0KICAgICAgICAgICogICAgIHN0YXRpYyBmaW5hbCBTcGVjaWVzRGF0YSBTUEVDSUVTX0RBVEEgPSBTcGVjaWVzRGF0YS5nZXRGb3JDbGFzcygiTExJIiwgU3BlY2llc19MTEkuY2xhc3MpOwotICAgICAgICAgKiAgICAgZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY2xvbmUoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZikgewotICAgICAgICAgKiAgICAgICAgIHJldHVybiBTUEVDSUVTX0RBVEEuY29uc3RydWN0b3JbMF0uaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgYXJnTDEsIGFyZ0kyKTsKKyAgICAgICAgICogICAgIHN0YXRpYyBCb3VuZE1ldGhvZEhhbmRsZSBtYWtlKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIE9iamVjdCBhcmdMMCwgT2JqZWN0IGFyZ0wxLCBpbnQgYXJnSTIpIHsKKyAgICAgICAgICogICAgICAgICByZXR1cm4gbmV3IFNwZWNpZXNfTExJKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBhcmdJMik7CiAgICAgICAgICAqICAgICB9Ci0gICAgICAgICAqICAgICBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEwoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgT2JqZWN0IG5hcmcpIHsKLSAgICAgICAgICogICAgICAgICByZXR1cm4gU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9MKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCBhcmdMMSwgYXJnSTIsIG5hcmcpOworICAgICAgICAgKiAgICAgZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGgoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZikgeworICAgICAgICAgKiAgICAgICAgIHJldHVybiBuZXcgU3BlY2llc19MTEkobXQsIGxmLCBhcmdMMCwgYXJnTDEsIGFyZ0kyKTsKICAgICAgICAgICogICAgIH0KLSAgICAgICAgICogICAgIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kSShNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBpbnQgbmFyZykgewotICAgICAgICAgKiAgICAgICAgIHJldHVybiBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KElOREVYX0kpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBhcmdJMiwgbmFyZyk7CisgICAgICAgICAqICAgICBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjb3B5V2l0aEV4dGVuZEwoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgT2JqZWN0IG5hcmcpIHsKKyAgICAgICAgICogICAgICAgICByZXR1cm4gU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGgoTF9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBhcmdJMiwgbmFyZyk7CiAgICAgICAgICAqICAgICB9Ci0gICAgICAgICAqICAgICBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEooTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgbG9uZyBuYXJnKSB7Ci0gICAgICAgICAqICAgICAgICAgcmV0dXJuIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoSW5kZXgoSU5ERVhfSikuY29uc3RydWN0b3JbMF0uaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgYXJnTDEsIGFyZ0kyLCBuYXJnKTsKKyAgICAgICAgICogICAgIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kSShNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBpbnQgbmFyZykgeworICAgICAgICAgKiAgICAgICAgIHJldHVybiBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aChJX1RZUEUpLmNvbnN0cnVjdG9yKCkuaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgYXJnTDEsIGFyZ0kyLCBuYXJnKTsKICAgICAgICAgICogICAgIH0KLSAgICAgICAgICogICAgIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNsb25lRXh0ZW5kRihNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBmbG9hdCBuYXJnKSB7Ci0gICAgICAgICAqICAgICAgICAgcmV0dXJuIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoSW5kZXgoSU5ERVhfRikuY29uc3RydWN0b3JbMF0uaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgYXJnTDEsIGFyZ0kyLCBuYXJnKTsKKyAgICAgICAgICogICAgIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kSihNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBsb25nIG5hcmcpIHsKKyAgICAgICAgICogICAgICAgICByZXR1cm4gU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGgoSl9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBhcmdJMiwgbmFyZyk7CiAgICAgICAgICAqICAgICB9Ci0gICAgICAgICAqICAgICBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjbG9uZUV4dGVuZEQoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgZG91YmxlIG5hcmcpIHsKLSAgICAgICAgICogICAgICAgICByZXR1cm4gU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGhJbmRleChJTkRFWF9EKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCBhcmdMMSwgYXJnSTIsIG5hcmcpOworICAgICAgICAgKiAgICAgZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGhFeHRlbmRGKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGZsb2F0IG5hcmcpIHsKKyAgICAgICAgICogICAgICAgICByZXR1cm4gU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGgoRl9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIGFyZ0wxLCBhcmdJMiwgbmFyZyk7CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgICBwdWJsaWMgZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGhFeHRlbmREKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIGRvdWJsZSBuYXJnKSB7CisgICAgICAgICAqICAgICAgICAgcmV0dXJuIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoKERfVFlQRSkuY29uc3RydWN0b3IoKS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCBhcmdMMSwgYXJnSTIsIG5hcmcpOwogICAgICAgICAgKiAgICAgfQogICAgICAgICAgKiB9CiAgICAgICAgICAqIDwvcHJlPgpAQCAtNTg2LDggKzU2MCw5IEBACiAgICAgICAgIHN0YXRpYyBDbGFzczw/IGV4dGVuZHMgQm91bmRNZXRob2RIYW5kbGU+IGdlbmVyYXRlQ29uY3JldGVCTUhDbGFzcyhTdHJpbmcgdHlwZXMpIHsKICAgICAgICAgICAgIGZpbmFsIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKENsYXNzV3JpdGVyLkNPTVBVVEVfTUFYUyArIENsYXNzV3JpdGVyLkNPTVBVVEVfRlJBTUVTKTsKIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSAgPSBTUEVDSUVTX1BSRUZJWF9QQVRIICsgdHlwZXM7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlRmlsZSA9IFNQRUNJRVNfUFJFRklYX05BTUUgKyB0eXBlczsKKyAgICAgICAgICAgIFN0cmluZyBzaG9ydFR5cGVzID0gTGFtYmRhRm9ybS5zaG9ydGVuU2lnbmF0dXJlKHR5cGVzKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgID0gU1BFQ0lFU19QUkVGSVhfUEFUSCArIHNob3J0VHlwZXM7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlRmlsZSA9IFNQRUNJRVNfUFJFRklYX05BTUUgKyBzaG9ydFR5cGVzOwogICAgICAgICAgICAgZmluYWwgaW50IE5PVF9BQ0NfUFVCTElDID0gMDsgIC8vIG5vdCBBQ0NfUFVCTElDCiAgICAgICAgICAgICBjdy52aXNpdChWMV82LCBOT1RfQUNDX1BVQkxJQyArIEFDQ19GSU5BTCArIEFDQ19TVVBFUiwgY2xhc3NOYW1lLCBudWxsLCBCTUgsIG51bGwpOwogICAgICAgICAgICAgY3cudmlzaXRTb3VyY2Uoc291cmNlRmlsZSwgbnVsbCk7CkBAIC02MDYsMTMgKzU4MSwxMyBAQAogICAgICAgICAgICAgTWV0aG9kVmlzaXRvciBtdjsKIAogICAgICAgICAgICAgLy8gZW1pdCBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgbXYgPSBjdy52aXNpdE1ldGhvZChOT1RfQUNDX1BVQkxJQywgIjxpbml0PiIsIG1ha2VTaWduYXR1cmUodHlwZXMsIHRydWUpLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG12ID0gY3cudmlzaXRNZXRob2QoQUNDX1BSSVZBVEUsICI8aW5pdD4iLCBtYWtlU2lnbmF0dXJlKHR5cGVzLCB0cnVlKSwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICBtdi52aXNpdENvZGUoKTsKLSAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMCk7Ci0gICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDEpOwotICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAyKTsKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMCk7IC8vIHRoaXMKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMSk7IC8vIHR5cGUKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMik7IC8vIGZvcm0KIAotICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsIEJNSCwgIjxpbml0PiIsIG1ha2VTaWduYXR1cmUoIiIsIHRydWUpKTsKKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCBCTUgsICI8aW5pdD4iLCBtYWtlU2lnbmF0dXJlKCIiLCB0cnVlKSwgZmFsc2UpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCB0eXBlcy5sZW5ndGgoKTsgKytpLCArK2opIHsKICAgICAgICAgICAgICAgICAvLyBpIGNvdW50cyB0aGUgYXJndW1lbnRzLCBqIGNvdW50cyBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IHNsb3RzCkBAIC02MjksMTYgKzYwNCw2IEBACiAgICAgICAgICAgICBtdi52aXNpdE1heHMoMCwgMCk7CiAgICAgICAgICAgICBtdi52aXNpdEVuZCgpOwogCi0gICAgICAgICAgICAvLyBlbWl0IGltcGxlbWVudGF0aW9uIG9mIHJlaW52b2tlclRhcmdldCgpCi0gICAgICAgICAgICBtdiA9IGN3LnZpc2l0TWV0aG9kKE5PVF9BQ0NfUFVCTElDICsgQUNDX0ZJTkFMLCAicmVpbnZva2VyVGFyZ2V0IiwgIigpIiArIE1IX1NJRywgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtdi52aXNpdENvZGUoKTsKLSAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMCk7Ci0gICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRGSUVMRCwgY2xhc3NOYW1lLCAiYXJnTDAiLCBKTE9fU0lHKTsKLSAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oQ0hFQ0tDQVNULCBNSCk7Ci0gICAgICAgICAgICBtdi52aXNpdEluc24oQVJFVFVSTik7Ci0gICAgICAgICAgICBtdi52aXNpdE1heHMoMCwgMCk7Ci0gICAgICAgICAgICBtdi52aXNpdEVuZCgpOwotCiAgICAgICAgICAgICAvLyBlbWl0IGltcGxlbWVudGF0aW9uIG9mIHNwZWNpZXNEYXRhKCkKICAgICAgICAgICAgIG12ID0gY3cudmlzaXRNZXRob2QoTk9UX0FDQ19QVUJMSUMgKyBBQ0NfRklOQUwsICJzcGVjaWVzRGF0YSIsIE1ZU1BFQ0lFU19EQVRBX1NJRywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICBtdi52aXNpdENvZGUoKTsKQEAgLTY0Nyw1MSArNjEyLDgzIEBACiAgICAgICAgICAgICBtdi52aXNpdE1heHMoMCwgMCk7CiAgICAgICAgICAgICBtdi52aXNpdEVuZCgpOwogCi0gICAgICAgICAgICAvLyBlbWl0IGNsb25lKCkKLSAgICAgICAgICAgIG12ID0gY3cudmlzaXRNZXRob2QoTk9UX0FDQ19QVUJMSUMgKyBBQ0NfRklOQUwsICJjbG9uZSIsIG1ha2VTaWduYXR1cmUoIiIsIGZhbHNlKSwgbnVsbCwgRV9USFJPV0FCTEUpOworICAgICAgICAgICAgLy8gZW1pdCBpbXBsZW1lbnRhdGlvbiBvZiBmaWVsZENvdW50KCkKKyAgICAgICAgICAgIG12ID0gY3cudmlzaXRNZXRob2QoTk9UX0FDQ19QVUJMSUMgKyBBQ0NfRklOQUwsICJmaWVsZENvdW50IiwgSU5UX1NJRywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICBtdi52aXNpdENvZGUoKTsKLSAgICAgICAgICAgIC8vIHJldHVybiBzcGVjaWVzRGF0YSgpLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKG10LCBsZiwgYXJnTDAsIC4uLikKLSAgICAgICAgICAgIC8vIG9idGFpbiBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAwKTsKLSAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgY2xhc3NOYW1lLCAiU1BFQ0lFU19EQVRBIiwgU1BFQ0lFU19EQVRBX1NJRyk7Ci0gICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRGSUVMRCwgU1BFQ0lFU19EQVRBLCAiY29uc3RydWN0b3IiLCAiWyIgKyBNSF9TSUcpOwotICAgICAgICAgICAgbXYudmlzaXRJbnNuKElDT05TVF8wKTsKLSAgICAgICAgICAgIG12LnZpc2l0SW5zbihBQUxPQUQpOworICAgICAgICAgICAgaW50IGZjID0gdHlwZXMubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoZmMgPD0gKElDT05TVF81IC0gSUNPTlNUXzApKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKElDT05TVF8wICsgZmMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEludEluc24oU0lQVVNILCBmYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdi52aXNpdEluc24oSVJFVFVSTik7CisgICAgICAgICAgICBtdi52aXNpdE1heHMoMCwgMCk7CisgICAgICAgICAgICBtdi52aXNpdEVuZCgpOworICAgICAgICAgICAgLy8gZW1pdCBtYWtlKCkgIC4uLmZhY3RvcnkgbWV0aG9kIHdyYXBwaW5nIGNvbnN0cnVjdG9yCisgICAgICAgICAgICBtdiA9IGN3LnZpc2l0TWV0aG9kKE5PVF9BQ0NfUFVCTElDICsgQUNDX1NUQVRJQywgIm1ha2UiLCBtYWtlU2lnbmF0dXJlKHR5cGVzLCBmYWxzZSksIG51bGwsIG51bGwpOworICAgICAgICAgICAgbXYudmlzaXRDb2RlKCk7CisgICAgICAgICAgICAvLyBtYWtlIGluc3RhbmNlCisgICAgICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE5FVywgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICAgICAgLy8gbG9hZCBtdCwgbGYKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMCk7ICAvLyB0eXBlCisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDEpOyAgLy8gZm9ybQorICAgICAgICAgICAgLy8gbG9hZCBmYWN0b3J5IG1ldGhvZCBhcmd1bWVudHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gMDsgaSA8IHR5cGVzLmxlbmd0aCgpOyArK2ksICsraikgeworICAgICAgICAgICAgICAgIC8vIGkgY291bnRzIHRoZSBhcmd1bWVudHMsIGogY291bnRzIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgc2xvdHMKKyAgICAgICAgICAgICAgICBjaGFyIHQgPSB0eXBlcy5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKHR5cGVMb2FkT3AodCksIGogKyAyKTsgLy8gcGFyYW1ldGVycyBzdGFydCBhdCAzCisgICAgICAgICAgICAgICAgaWYgKHQgPT0gJ0onIHx8IHQgPT0gJ0QnKSB7CisgICAgICAgICAgICAgICAgICAgICsrajsgLy8gYWRqdXN0IGFyZ3VtZW50IHJlZ2lzdGVyIGFjY2VzcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZmluYWxseSwgaW52b2tlIHRoZSBjb25zdHJ1Y3RvciBhbmQgcmV0dXJuCisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFU1BFQ0lBTCwgY2xhc3NOYW1lLCAiPGluaXQ+IiwgbWFrZVNpZ25hdHVyZSh0eXBlcywgdHJ1ZSksIGZhbHNlKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihBUkVUVVJOKTsKKyAgICAgICAgICAgIG12LnZpc2l0TWF4cygwLCAwKTsKKyAgICAgICAgICAgIG12LnZpc2l0RW5kKCk7CisKKyAgICAgICAgICAgIC8vIGVtaXQgY29weVdpdGgoKQorICAgICAgICAgICAgbXYgPSBjdy52aXNpdE1ldGhvZChOT1RfQUNDX1BVQkxJQyArIEFDQ19GSU5BTCwgImNvcHlXaXRoIiwgbWFrZVNpZ25hdHVyZSgiIiwgZmFsc2UpLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG12LnZpc2l0Q29kZSgpOworICAgICAgICAgICAgLy8gbWFrZSBpbnN0YW5jZQorICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsIGNsYXNzTmFtZSk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQKTsKICAgICAgICAgICAgIC8vIGxvYWQgbXQsIGxmCiAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDEpOwogICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAyKTsKICAgICAgICAgICAgIC8vIHB1dCBmaWVsZHMgb24gdGhlIHN0YWNrCiAgICAgICAgICAgICBlbWl0UHVzaEZpZWxkcyh0eXBlcywgY2xhc3NOYW1lLCBtdik7CiAgICAgICAgICAgICAvLyBmaW5hbGx5LCBpbnZva2UgdGhlIGNvbnN0cnVjdG9yIGFuZCByZXR1cm4KLSAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VWSVJUVUFMLCBNSCwgImludm9rZUJhc2ljIiwgbWFrZVNpZ25hdHVyZSh0eXBlcywgZmFsc2UpKTsKKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCBjbGFzc05hbWUsICI8aW5pdD4iLCBtYWtlU2lnbmF0dXJlKHR5cGVzLCB0cnVlKSwgZmFsc2UpOwogICAgICAgICAgICAgbXYudmlzaXRJbnNuKEFSRVRVUk4pOwogICAgICAgICAgICAgbXYudmlzaXRNYXhzKDAsIDApOwogICAgICAgICAgICAgbXYudmlzaXRFbmQoKTsKIAotICAgICAgICAgICAgLy8gZm9yIGVhY2ggdHlwZSwgZW1pdCBjbG9uZUV4dGVuZFQoKQotICAgICAgICAgICAgZm9yIChDbGFzczw/PiBjIDogVFlQRVMpIHsKLSAgICAgICAgICAgICAgICBjaGFyIHQgPSBXcmFwcGVyLmJhc2ljVHlwZUNoYXIoYyk7Ci0gICAgICAgICAgICAgICAgbXYgPSBjdy52aXNpdE1ldGhvZChOT1RfQUNDX1BVQkxJQyArIEFDQ19GSU5BTCwgImNsb25lRXh0ZW5kIiArIHQsIG1ha2VTaWduYXR1cmUoU3RyaW5nLnZhbHVlT2YodCksIGZhbHNlKSwgbnVsbCwgRV9USFJPV0FCTEUpOworICAgICAgICAgICAgLy8gZm9yIGVhY2ggdHlwZSwgZW1pdCBjb3B5V2l0aEV4dGVuZFQoKQorICAgICAgICAgICAgZm9yIChCYXNpY1R5cGUgdHlwZSA6IEJhc2ljVHlwZS5BUkdfVFlQRVMpIHsKKyAgICAgICAgICAgICAgICBpbnQgb3JkID0gdHlwZS5vcmRpbmFsKCk7CisgICAgICAgICAgICAgICAgY2hhciBidENoYXIgPSB0eXBlLmJhc2ljVHlwZUNoYXIoKTsKKyAgICAgICAgICAgICAgICBtdiA9IGN3LnZpc2l0TWV0aG9kKE5PVF9BQ0NfUFVCTElDICsgQUNDX0ZJTkFMLCAiY29weVdpdGhFeHRlbmQiICsgYnRDaGFyLCBtYWtlU2lnbmF0dXJlKFN0cmluZy52YWx1ZU9mKGJ0Q2hhciksIGZhbHNlKSwgbnVsbCwgRV9USFJPV0FCTEUpOwogICAgICAgICAgICAgICAgIG12LnZpc2l0Q29kZSgpOwotICAgICAgICAgICAgICAgIC8vIHJldHVybiBTUEVDSUVTX0RBVEEuZXh0ZW5kV2l0aEluZGV4KGV4dGVuc2lvbkluZGV4KHQpKS5jb25zdHJ1Y3RvclswXS5pbnZva2VCYXNpYyhtdCwgbGYsIGFyZ0wwLCAuLi4sIG5hcmcpCisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoKHQpLmNvbnN0cnVjdG9yKCkuaW52b2tlQmFzaWMobXQsIGxmLCBhcmdMMCwgLi4uLCBuYXJnKQogICAgICAgICAgICAgICAgIC8vIG9idGFpbiBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgY2xhc3NOYW1lLCAiU1BFQ0lFU19EQVRBIiwgU1BFQ0lFU19EQVRBX1NJRyk7Ci0gICAgICAgICAgICAgICAgaW50IGljb25zdEluc24gPSBJQ09OU1RfMCArIGV4dGVuc2lvbkluZGV4KHQpOworICAgICAgICAgICAgICAgIGludCBpY29uc3RJbnNuID0gSUNPTlNUXzAgKyBvcmQ7CiAgICAgICAgICAgICAgICAgYXNzZXJ0KGljb25zdEluc24gPD0gSUNPTlNUXzUpOwogICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihpY29uc3RJbnNuKTsKLSAgICAgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgU1BFQ0lFU19EQVRBLCAiZXh0ZW5kV2l0aEluZGV4IiwgQk1IU1BFQ0lFU19EQVRBX0VXSV9TSUcpOwotICAgICAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVEZJRUxELCBTUEVDSUVTX0RBVEEsICJjb25zdHJ1Y3RvciIsICJbIiArIE1IX1NJRyk7Ci0gICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKElDT05TVF8wKTsKLSAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oQUFMT0FEKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgU1BFQ0lFU19EQVRBLCAiZXh0ZW5kV2l0aCIsIEJNSFNQRUNJRVNfREFUQV9FV0lfU0lHLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsIFNQRUNJRVNfREFUQSwgImNvbnN0cnVjdG9yIiwgIigpIiArIE1IX1NJRywgZmFsc2UpOwogICAgICAgICAgICAgICAgIC8vIGxvYWQgbXQsIGxmCiAgICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAxKTsKICAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDIpOwogICAgICAgICAgICAgICAgIC8vIHB1dCBmaWVsZHMgb24gdGhlIHN0YWNrCiAgICAgICAgICAgICAgICAgZW1pdFB1c2hGaWVsZHModHlwZXMsIGNsYXNzTmFtZSwgbXYpOwogICAgICAgICAgICAgICAgIC8vIHB1dCBuYXJnIG9uIHN0YWNrCi0gICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKHR5cGVMb2FkT3AodCksIDMpOworICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbih0eXBlTG9hZE9wKGJ0Q2hhciksIDMpOwogICAgICAgICAgICAgICAgIC8vIGZpbmFsbHksIGludm9rZSB0aGUgY29uc3RydWN0b3IgYW5kIHJldHVybgotICAgICAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VWSVJUVUFMLCBNSCwgImludm9rZUJhc2ljIiwgbWFrZVNpZ25hdHVyZSh0eXBlcyArIHQsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsIE1ILCAiaW52b2tlQmFzaWMiLCBtYWtlU2lnbmF0dXJlKHR5cGVzICsgYnRDaGFyLCBmYWxzZSksIGZhbHNlKTsKICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oQVJFVFVSTik7CiAgICAgICAgICAgICAgICAgbXYudmlzaXRNYXhzKDAsIDApOwogICAgICAgICAgICAgICAgIG12LnZpc2l0RW5kKCk7CkBAIC03MDIsNyArNjk5LDcgQEAKICAgICAgICAgICAgIG12LnZpc2l0Q29kZSgpOwogICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKHR5cGVzKTsKICAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihUeXBlLmdldE9iamVjdFR5cGUoY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFU1RBVElDLCBTUEVDSUVTX0RBVEEsICJnZXRGb3JDbGFzcyIsIEJNSFNQRUNJRVNfREFUQV9HRkNfU0lHKTsKKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTVEFUSUMsIFNQRUNJRVNfREFUQSwgImdldEZvckNsYXNzIiwgQk1IU1BFQ0lFU19EQVRBX0dGQ19TSUcsIGZhbHNlKTsKICAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKFBVVFNUQVRJQywgY2xhc3NOYW1lLCAiU1BFQ0lFU19EQVRBIiwgU1BFQ0lFU19EQVRBX1NJRyk7CiAgICAgICAgICAgICBtdi52aXNpdEluc24oUkVUVVJOKTsKICAgICAgICAgICAgIG12LnZpc2l0TWF4cygwLCAwKTsKQEAgLTczMCw3ICs3MjcsNyBAQAogICAgICAgICAgICAgY2FzZSAnSic6IHJldHVybiBMTE9BRDsKICAgICAgICAgICAgIGNhc2UgJ0YnOiByZXR1cm4gRkxPQUQ7CiAgICAgICAgICAgICBjYXNlICdEJzogcmV0dXJuIERMT0FEOwotICAgICAgICAgICAgZGVmYXVsdCA6IHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJ1bnJlY29nbml6ZWQgdHlwZSAiICsgdCk7CisgICAgICAgICAgICBkZWZhdWx0IDogdGhyb3cgbmV3SW50ZXJuYWxFcnJvcigidW5yZWNvZ25pemVkIHR5cGUgIiArIHQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc3MSwxMCArNzY4LDE5IEBACiAKICAgICAgICAgc3RhdGljIE1ldGhvZEhhbmRsZVtdIG1ha2VDdG9ycyhDbGFzczw/IGV4dGVuZHMgQm91bmRNZXRob2RIYW5kbGU+IGNibWgsIFN0cmluZyB0eXBlcywgTWV0aG9kSGFuZGxlIG1oc1tdKSB7CiAgICAgICAgICAgICBpZiAobWhzID09IG51bGwpICBtaHMgPSBuZXcgTWV0aG9kSGFuZGxlWzFdOworICAgICAgICAgICAgaWYgKHR5cGVzLmVxdWFscygiIikpICByZXR1cm4gbWhzOyAgLy8gaGFjayBmb3IgZW1wdHkgQk1IIHNwZWNpZXMKICAgICAgICAgICAgIG1oc1swXSA9IG1ha2VDYm1oQ3RvcihjYm1oLCB0eXBlcyk7CiAgICAgICAgICAgICByZXR1cm4gbWhzOwogICAgICAgICB9CiAKKyAgICAgICAgc3RhdGljIE5hbWVkRnVuY3Rpb25bXSBtYWtlTm9taW5hbEdldHRlcnMoU3RyaW5nIHR5cGVzLCBOYW1lZEZ1bmN0aW9uW10gbmZzLCBNZXRob2RIYW5kbGVbXSBnZXR0ZXJzKSB7CisgICAgICAgICAgICBpZiAobmZzID09IG51bGwpICBuZnMgPSBuZXcgTmFtZWRGdW5jdGlvblt0eXBlcy5sZW5ndGgoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5mcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIG5mc1tpXSA9IG5ldyBOYW1lZEZ1bmN0aW9uKGdldHRlcnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5mczsKKyAgICAgICAgfQorCiAgICAgICAgIC8vCiAgICAgICAgIC8vIEF1eGlsaWFyeSBtZXRob2RzLgogICAgICAgICAvLwpAQCAtODA4LDUyICs4MTQsMTEgQEAKIAogICAgICAgICBzdGF0aWMgTWV0aG9kSGFuZGxlIG1ha2VDYm1oQ3RvcihDbGFzczw/IGV4dGVuZHMgQm91bmRNZXRob2RIYW5kbGU+IGNibWgsIFN0cmluZyB0eXBlcykgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGlua0NvbnN0cnVjdG9yKExPT0tVUC5maW5kQ29uc3RydWN0b3IoY2JtaCwgTWV0aG9kVHlwZS5mcm9tTWV0aG9kRGVzY3JpcHRvclN0cmluZyhtYWtlU2lnbmF0dXJlKHR5cGVzLCB0cnVlKSwgbnVsbCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9PS1VQLmZpbmRTdGF0aWMoY2JtaCwgIm1ha2UiLCBNZXRob2RUeXBlLmZyb21NZXRob2REZXNjcmlwdG9yU3RyaW5nKG1ha2VTaWduYXR1cmUodHlwZXMsIGZhbHNlKSwgbnVsbCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB8IFR5cGVOb3RQcmVzZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyYXAgYSBjb25zdHJ1Y3RvciBjYWxsIGluIGEge0BsaW5rIExhbWJkYUZvcm19LgotICAgICAgICAgKgotICAgICAgICAgKiBJZiBjb25zdHJ1Y3RvcnMgKHtAY29kZSA8aW5pdD59IG1ldGhvZHMpIGFyZSBjYWxsZWQgaW4gTEZzLCBwcm9ibGVtcyBtaWdodCBhcmlzZSBpZiB0aGUgTEZzCi0gICAgICAgICAqIGFyZSB0dXJuZWQgaW50byBieXRlY29kZSwgYmVjYXVzZSB0aGUgY2FsbCB0byB0aGUgYWxsb2NhdG9yIGlzIHJvdXRlZCB0aHJvdWdoIGFuIE1ILCBhbmQgdGhlCi0gICAgICAgICAqIHZlcmlmaWVyIGNhbm5vdCBmaW5kIGEge0Bjb2RlIE5FV30gaW5zdHJ1Y3Rpb24gcHJlY2VkaW5nIHRoZSB7QGNvZGUgSU5WT0tFU1BFQ0lBTH0gdG8KLSAgICAgICAgICoge0Bjb2RlIDxpbml0Pn0uIFRvIGF2b2lkIHRoaXMsIHdlIGFkZCBhbiBpbmRpcmVjdGlvbiBieSBpbnZva2luZyB7QGNvZGUgPGluaXQ+fSB0aHJvdWdoCi0gICAgICAgICAqIHtAbGluayBNZXRob2RIYW5kbGUjbGlua1RvU3BlY2lhbH0uCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBsYXN0IHtAbGluayBMYW1iZGFGb3JtLk5hbWUgTmFtZX0gaW4gdGhlIGFyZ3VtZW50J3MgZm9ybSBpcyBleHBlY3RlZCB0byBiZSB0aGUge0Bjb2RlIHZvaWR9Ci0gICAgICAgICAqIHJlc3VsdCBvZiB0aGUge0Bjb2RlIDxpbml0Pn0gaW52b2NhdGlvbi4gVGhpcyBlbnRyeSBpcyByZXBsYWNlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBsaW5rQ29uc3RydWN0b3IoTWV0aG9kSGFuZGxlIGNtaCkgewotICAgICAgICAgICAgZmluYWwgTGFtYmRhRm9ybSBsZiA9IGNtaC5mb3JtOwotICAgICAgICAgICAgZmluYWwgaW50IGluaXROYW1lSW5kZXggPSBsZi5uYW1lcy5sZW5ndGggLSAxOwotICAgICAgICAgICAgZmluYWwgTmFtZSBpbml0TmFtZSA9IGxmLm5hbWVzW2luaXROYW1lSW5kZXhdOwotICAgICAgICAgICAgZmluYWwgTWVtYmVyTmFtZSBjdG9yTU4gPSBpbml0TmFtZS5mdW5jdGlvbi5tZW1iZXI7Ci0gICAgICAgICAgICBmaW5hbCBNZXRob2RUeXBlIGN0b3JNVCA9IGN0b3JNTi5nZXRJbnZvY2F0aW9uVHlwZSgpOwotCi0gICAgICAgICAgICAvLyBvYnRhaW4gZnVuY3Rpb24gbWVtYmVyIChjYWxsIHRhcmdldCkKLSAgICAgICAgICAgIC8vIGxpbmtlciBtZXRob2QgdHlwZSByZXBsYWNlcyBpbml0aWFsIHBhcmFtZXRlciAoQk1IIHNwZWNpZXMpIHdpdGggQk1IIHRvIGF2b2lkIG5hbWluZyBhIHNwZWNpZXMgKGFub255bW91cyBjbGFzcyEpCi0gICAgICAgICAgICBmaW5hbCBNZXRob2RUeXBlIGxpbmtlck1UID0gY3Rvck1ULmNoYW5nZVBhcmFtZXRlclR5cGUoMCwgQm91bmRNZXRob2RIYW5kbGUuY2xhc3MpLmFwcGVuZFBhcmFtZXRlclR5cGVzKE1lbWJlck5hbWUuY2xhc3MpOwotICAgICAgICAgICAgTWVtYmVyTmFtZSBsaW5rZXJNTiA9IG5ldyBNZW1iZXJOYW1lKE1ldGhvZEhhbmRsZS5jbGFzcywgImxpbmtUb1NwZWNpYWwiLCBsaW5rZXJNVCwgUkVGX2ludm9rZVN0YXRpYyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxpbmtlck1OID0gTWVtYmVyTmFtZS5nZXRGYWN0b3J5KCkucmVzb2x2ZU9yRmFpbChSRUZfaW52b2tlU3RhdGljLCBsaW5rZXJNTiwgbnVsbCwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQobGlua2VyTU4uaXNTdGF0aWMoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcihleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBleHRlbmQgYXJndW1lbnRzIGFycmF5Ci0gICAgICAgICAgICBPYmplY3RbXSBuZXdBcmdzID0gQXJyYXlzLmNvcHlPZihpbml0TmFtZS5hcmd1bWVudHMsIGluaXROYW1lLmFyZ3VtZW50cy5sZW5ndGggKyAxKTsKLSAgICAgICAgICAgIG5ld0FyZ3NbbmV3QXJncy5sZW5ndGggLSAxXSA9IGN0b3JNTjsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgZnVuY3Rpb24KLSAgICAgICAgICAgIGZpbmFsIE5hbWVkRnVuY3Rpb24gbmYgPSBuZXcgTmFtZWRGdW5jdGlvbihsaW5rZXJNTik7Ci0gICAgICAgICAgICBmaW5hbCBOYW1lIGxpbmtlZEN0b3IgPSBuZXcgTmFtZShuZiwgbmV3QXJncyk7Ci0gICAgICAgICAgICBsaW5rZWRDdG9yLmluaXRJbmRleChpbml0TmFtZUluZGV4KTsKLSAgICAgICAgICAgIGxmLm5hbWVzW2luaXROYW1lSW5kZXhdID0gbGlua2VkQ3RvcjsKLSAgICAgICAgICAgIHJldHVybiBjbWg7Ci0gICAgICAgIH0KLQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvb2t1cCBMT09LVVAgPSBMb29rdXAuSU1QTF9MT09LVVA7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0NhbGxTaXRlLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0NhbGxTaXRlLmphdmEKaW5kZXggOTQ5MzY0Yi4uMTBhYzFjMCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9DYWxsU2l0ZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvQ2FsbFNpdGUuamF2YQpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICovCiAgICAgLypwYWNrYWdlLXByaXZhdGUqLwogICAgIENhbGxTaXRlKE1ldGhvZFR5cGUgdHlwZSkgewotICAgICAgICB0YXJnZXQgPSB0eXBlLmludm9rZXJzKCkudW5pbml0aWFsaXplZENhbGxTaXRlKCk7CisgICAgICAgIHRhcmdldCA9IG1ha2VVbmluaXRpYWxpemVkQ2FsbFNpdGUodHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTEsMjcgKzIxMSw0MCBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBNZXRob2RIYW5kbGUgZHluYW1pY0ludm9rZXIoKTsKIAogICAgIC8qbm9uLXB1YmxpYyovIE1ldGhvZEhhbmRsZSBtYWtlRHluYW1pY0ludm9rZXIoKSB7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSBnZXRUYXJnZXQgPSBHRVRfVEFSR0VULmJpbmRSZWNlaXZlcih0aGlzKTsKKyAgICAgICAgTWV0aG9kSGFuZGxlIGdldFRhcmdldCA9IEdFVF9UQVJHRVQuYmluZEFyZ3VtZW50TCgwLCB0aGlzKTsKICAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSBNZXRob2RIYW5kbGVzLmV4YWN0SW52b2tlcih0aGlzLnR5cGUoKSk7CiAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVzLmZvbGRBcmd1bWVudHMoaW52b2tlciwgZ2V0VGFyZ2V0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgR0VUX1RBUkdFVDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgVEhST1dfVUNTOwogICAgIHN0YXRpYyB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBHRVRfVEFSR0VUID0gSU1QTF9MT09LVVAuCiAgICAgICAgICAgICAgICAgZmluZFZpcnR1YWwoQ2FsbFNpdGUuY2xhc3MsICJnZXRUYXJnZXQiLCBNZXRob2RUeXBlLm1ldGhvZFR5cGUoTWV0aG9kSGFuZGxlLmNsYXNzKSk7CisgICAgICAgICAgICBUSFJPV19VQ1MgPSBJTVBMX0xPT0tVUC4KKyAgICAgICAgICAgICAgICBmaW5kU3RhdGljKENhbGxTaXRlLmNsYXNzLCAidW5pbml0aWFsaXplZENhbGxTaXRlIiwgTWV0aG9kVHlwZS5tZXRob2RUeXBlKE9iamVjdC5jbGFzcywgT2JqZWN0W10uY2xhc3MpKTsKICAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIFRoaXMgZ3V5IGlzIHJvbGxlZCBpbnRvIHRoZSBkZWZhdWx0IHRhcmdldCBpZiBhIE1ldGhvZFR5cGUgaXMgc3VwcGxpZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiAqLwotICAgIC8qcGFja2FnZS1wcml2YXRlKi8KLSAgICBzdGF0aWMgRW1wdHkgdW5pbml0aWFsaXplZENhbGxTaXRlKCkgeworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCB1bmluaXRpYWxpemVkQ2FsbFNpdGUoT2JqZWN0Li4uIGlnbm9yZSkgewogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmluaXRpYWxpemVkIGNhbGwgc2l0ZSIpOwogICAgIH0KIAorICAgIHByaXZhdGUgTWV0aG9kSGFuZGxlIG1ha2VVbmluaXRpYWxpemVkQ2FsbFNpdGUoTWV0aG9kVHlwZSB0YXJnZXRUeXBlKSB7CisgICAgICAgIE1ldGhvZFR5cGUgYmFzaWNUeXBlID0gdGFyZ2V0VHlwZS5iYXNpY1R5cGUoKTsKKyAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSBiYXNpY1R5cGUuZm9ybSgpLmNhY2hlZE1ldGhvZEhhbmRsZShNZXRob2RUeXBlRm9ybS5NSF9VTklOSVRfQ1MpOworICAgICAgICBpZiAoaW52b2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnZva2VyID0gVEhST1dfVUNTLmFzVHlwZShiYXNpY1R5cGUpOworICAgICAgICAgICAgaW52b2tlciA9IGJhc2ljVHlwZS5mb3JtKCkuc2V0Q2FjaGVkTWV0aG9kSGFuZGxlKE1ldGhvZFR5cGVGb3JtLk1IX1VOSU5JVF9DUywgaW52b2tlcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdW5jaGVja2VkIHZpZXcgaXMgT0sgc2luY2Ugbm8gdmFsdWVzIHdpbGwgYmUgcmVjZWl2ZWQgb3IgcmV0dXJuZWQKKyAgICAgICAgcmV0dXJuIGludm9rZXIudmlld0FzVHlwZSh0YXJnZXRUeXBlLCBmYWxzZSk7CisgICAgfQorCiAgICAgLy8gdW5zYWZlIHN0dWZmOgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEFSR0VUX09GRlNFVDsKICAgICBzdGF0aWMgewpAQCAtMzE5LDcgKzMzMiw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiYm9vdHN0cmFwIG1ldGhvZCBmYWlsZWQgdG8gcHJvZHVjZSBhIENhbGxTaXRlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXNpdGUuZ2V0VGFyZ2V0KCkudHlwZSgpLmVxdWFscyh0eXBlKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV3JvbmdNZXRob2RUeXBlRXhjZXB0aW9uKCJ3cm9uZyB0eXBlOiAiK3NpdGUuZ2V0VGFyZ2V0KCkpOworICAgICAgICAgICAgICAgIHRocm93IHdyb25nVGFyZ2V0VHlwZShzaXRlLmdldFRhcmdldCgpLCB0eXBlKTsKICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CiAgICAgICAgICAgICBCb290c3RyYXBNZXRob2RFcnJvciBiZXg7CiAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBCb290c3RyYXBNZXRob2RFcnJvcikKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvRGVsZWdhdGluZ01ldGhvZEhhbmRsZS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9EZWxlZ2F0aW5nTWV0aG9kSGFuZGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiYThmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvRGVsZWdhdGluZ01ldGhvZEhhbmRsZS5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGphdmEubGFuZy5pbnZva2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uKjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVTdGF0aWNzLio7CisKKy8qKgorICogQSBtZXRob2QgaGFuZGxlIHdob3NlIGludm9jYXRpb24gYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSBhIHRhcmdldC4KKyAqIFRoZSBkZWxlZ2F0aW5nIE1IIGl0c2VsZiBjYW4gaG9sZCBleHRyYSAiaW50ZW50aW9ucyIgYmV5b25kIHRoZSBzaW1wbGUgYmVoYXZpb3IuCisgKiBAYXV0aG9yIGpyb3NlCisgKi8KKy8qbm9uLXB1YmxpYyovCithYnN0cmFjdCBjbGFzcyBEZWxlZ2F0aW5nTWV0aG9kSGFuZGxlIGV4dGVuZHMgTWV0aG9kSGFuZGxlIHsKKyAgICBwcm90ZWN0ZWQgRGVsZWdhdGluZ01ldGhvZEhhbmRsZShNZXRob2RIYW5kbGUgdGFyZ2V0KSB7CisgICAgICAgIHRoaXModGFyZ2V0LnR5cGUoKSwgdGFyZ2V0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRGVsZWdhdGluZ01ldGhvZEhhbmRsZShNZXRob2RUeXBlIHR5cGUsIE1ldGhvZEhhbmRsZSB0YXJnZXQpIHsKKyAgICAgICAgc3VwZXIodHlwZSwgY2hvb3NlRGVsZWdhdGluZ0Zvcm0odGFyZ2V0KSk7CisgICAgfQorCisgICAgLyoqIERlZmluZSB0aGlzIHRvIGV4dHJhY3QgdGhlIGRlbGVnYXRlZCB0YXJnZXQgd2hpY2ggc3VwcGxpZXMgdGhlIGludm9jYXRpb24gYmVoYXZpb3IuICovCisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIE1ldGhvZEhhbmRsZSBnZXRUYXJnZXQoKTsKKworICAgIEBPdmVycmlkZQorICAgIGFic3RyYWN0IE1ldGhvZEhhbmRsZSBhc1R5cGVVbmNhY2hlZChNZXRob2RUeXBlIG5ld1R5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgTWVtYmVyTmFtZSBpbnRlcm5hbE1lbWJlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRUYXJnZXQoKS5pbnRlcm5hbE1lbWJlck5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBib29sZWFuIGlzSW52b2tlU3BlY2lhbCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFRhcmdldCgpLmlzSW52b2tlU3BlY2lhbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIENsYXNzPD8+IGludGVybmFsQ2FsbGVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBnZXRUYXJnZXQoKS5pbnRlcm5hbENhbGxlckNsYXNzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgTWV0aG9kSGFuZGxlIGNvcHlXaXRoKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHsKKyAgICAgICAgLy8gRklYTUU6IHJldGhpbmsgJ2NvcHlXaXRoJyBwcm90b2NvbDsgaXQgaXMgdG9vIGxvdy1sZXZlbCBmb3IgdXNlIG9uIGFsbCBNSHMKKyAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkbyBub3QgdXNlIHRoaXMiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBTdHJpbmcgaW50ZXJuYWxQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gIlxuJiBDbGFzcz0iK2dldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKworICAgICAgICAgICAgICAgIlxuJiBUYXJnZXQ9IitnZXRUYXJnZXQoKS5kZWJ1Z1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEJvdW5kTWV0aG9kSGFuZGxlIHJlYmluZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFRhcmdldCgpLnJlYmluZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExhbWJkYUZvcm0gY2hvb3NlRGVsZWdhdGluZ0Zvcm0oTWV0aG9kSGFuZGxlIHRhcmdldCkgeworICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU2ltcGxlTWV0aG9kSGFuZGxlKQorICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5pbnRlcm5hbEZvcm0oKTsgIC8vIG5vIG5lZWQgZm9yIGFuIGluZGlyZWN0aW9uCisgICAgICAgIHJldHVybiBtYWtlUmVpbnZva2VyRm9ybSh0YXJnZXQsIE1ldGhvZFR5cGVGb3JtLkxGX0RFTEVHQVRFLCBEZWxlZ2F0aW5nTWV0aG9kSGFuZGxlLmNsYXNzLCBORl9nZXRUYXJnZXQpOworICAgIH0KKworICAgIC8qKiBDcmVhdGUgYSBMRiB3aGljaCBzaW1wbHkgcmVpbnZva2VzIGEgdGFyZ2V0IG9mIHRoZSBnaXZlbiBiYXNpYyB0eXBlLiAqLworICAgIHN0YXRpYyBMYW1iZGFGb3JtIG1ha2VSZWludm9rZXJGb3JtKE1ldGhvZEhhbmRsZSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRGdW5jdGlvbiBnZXRUYXJnZXRGbikgeworICAgICAgICBNZXRob2RUeXBlIG10eXBlID0gdGFyZ2V0LnR5cGUoKS5iYXNpY1R5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBjdXN0b21pemVkID0gKHdoaWNoQ2FjaGUgPCAwIHx8CisgICAgICAgICAgICAgICAgbXR5cGUucGFyYW1ldGVyU2xvdENvdW50KCkgPiBNZXRob2RUeXBlLk1BWF9NSF9JTlZPS0VSX0FSSVRZKTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtOworICAgICAgICBpZiAoIWN1c3RvbWl6ZWQpIHsKKyAgICAgICAgICAgIGZvcm0gPSBtdHlwZS5mb3JtKCkuY2FjaGVkTGFtYmRhRm9ybSh3aGljaENhY2hlKTsKKyAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpICByZXR1cm4gZm9ybTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgVEhJU19ETUggICAgPSAwOworICAgICAgICBmaW5hbCBpbnQgQVJHX0JBU0UgICAgPSAxOworICAgICAgICBmaW5hbCBpbnQgQVJHX0xJTUlUICAgPSBBUkdfQkFTRSArIG10eXBlLnBhcmFtZXRlckNvdW50KCk7CisgICAgICAgIGludCBuYW1lQ3Vyc29yID0gQVJHX0xJTUlUOworICAgICAgICBmaW5hbCBpbnQgTkVYVF9NSCAgICAgPSBjdXN0b21pemVkID8gLTEgOiBuYW1lQ3Vyc29yKys7CisgICAgICAgIGZpbmFsIGludCBSRUlOVk9LRSAgICA9IG5hbWVDdXJzb3IrKzsKKyAgICAgICAgTGFtYmRhRm9ybS5OYW1lW10gbmFtZXMgPSBMYW1iZGFGb3JtLmFyZ3VtZW50cyhuYW1lQ3Vyc29yIC0gQVJHX0xJTUlULCBtdHlwZS5pbnZva2VyVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0KG5hbWVzLmxlbmd0aCA9PSBuYW1lQ3Vyc29yKTsKKyAgICAgICAgbmFtZXNbVEhJU19ETUhdID0gbmFtZXNbVEhJU19ETUhdLndpdGhDb25zdHJhaW50KGNvbnN0cmFpbnQpOworICAgICAgICBPYmplY3RbXSB0YXJnZXRBcmdzOworICAgICAgICBpZiAoY3VzdG9taXplZCkgeworICAgICAgICAgICAgdGFyZ2V0QXJncyA9IEFycmF5cy5jb3B5T2ZSYW5nZShuYW1lcywgQVJHX0JBU0UsIEFSR19MSU1JVCwgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgbmFtZXNbUkVJTlZPS0VdID0gbmV3IExhbWJkYUZvcm0uTmFtZSh0YXJnZXQsIHRhcmdldEFyZ3MpOyAgLy8gdGhlIGludm9rZXIgaXMgdGhlIHRhcmdldCBpdHNlbGYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hbWVzW05FWFRfTUhdID0gbmV3IExhbWJkYUZvcm0uTmFtZShnZXRUYXJnZXRGbiwgbmFtZXNbVEhJU19ETUhdKTsKKyAgICAgICAgICAgIHRhcmdldEFyZ3MgPSBBcnJheXMuY29weU9mUmFuZ2UobmFtZXMsIFRISVNfRE1ILCBBUkdfTElNSVQsIE9iamVjdFtdLmNsYXNzKTsKKyAgICAgICAgICAgIHRhcmdldEFyZ3NbMF0gPSBuYW1lc1tORVhUX01IXTsgIC8vIG92ZXJ3cml0ZSB0aGlzIE1IIHdpdGggbmV4dCBNSAorICAgICAgICAgICAgbmFtZXNbUkVJTlZPS0VdID0gbmV3IExhbWJkYUZvcm0uTmFtZShtdHlwZSwgdGFyZ2V0QXJncyk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRlYnVnU3RyaW5nOworICAgICAgICBzd2l0Y2god2hpY2hDYWNoZSkgeworICAgICAgICAgICAgY2FzZSBNZXRob2RUeXBlRm9ybS5MRl9SRUJJTkQ6ICAgZGVidWdTdHJpbmcgPSAiQk1ILnJlaW52b2tlIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1ldGhvZFR5cGVGb3JtLkxGX0RFTEVHQVRFOiBkZWJ1Z1N0cmluZyA9ICJNSC5kZWxlZ2F0ZSI7ICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnU3RyaW5nID0gIk1ILnJlaW52b2tlIjsgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvcm0gPSBuZXcgTGFtYmRhRm9ybShkZWJ1Z1N0cmluZywgQVJHX0xJTUlULCBuYW1lcyk7CisgICAgICAgIGlmICghY3VzdG9taXplZCkgeworICAgICAgICAgICAgZm9ybSA9IG10eXBlLmZvcm0oKS5zZXRDYWNoZWRMYW1iZGFGb3JtKHdoaWNoQ2FjaGUsIGZvcm0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3JtOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5hbWVkRnVuY3Rpb24gTkZfZ2V0VGFyZ2V0OworICAgIHN0YXRpYyB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBORl9nZXRUYXJnZXQgPSBuZXcgTmFtZWRGdW5jdGlvbihEZWxlZ2F0aW5nTWV0aG9kSGFuZGxlLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2QoImdldFRhcmdldCIpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcihleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0RpcmVjdE1ldGhvZEhhbmRsZS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9EaXJlY3RNZXRob2RIYW5kbGUuamF2YQppbmRleCA5YzA1NDUxLi5lOWQyNTI2IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0RpcmVjdE1ldGhvZEhhbmRsZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvRGlyZWN0TWV0aG9kSGFuZGxlLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBzdW4uaW52b2tlLnV0aWwuVmVyaWZ5QWNjZXNzOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZU5hdGl2ZXMuQ29uc3RhbnRzLio7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS4qOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uQmFzaWNUeXBlLio7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kVHlwZUZvcm0uKjsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVTdGF0aWNzLio7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwpAQCAtNTgsNiArNTksNyBAQAogICAgICAgICAgICAgTWVtYmVyTmFtZSBtID0gbmV3IE1lbWJlck5hbWUoT2JqZWN0LmNsYXNzLCBtZW1iZXIuZ2V0TmFtZSgpLCBtZW1iZXIuZ2V0TWV0aG9kVHlwZSgpLCBtZW1iZXIuZ2V0UmVmZXJlbmNlS2luZCgpKTsKICAgICAgICAgICAgIG0gPSBNZW1iZXJOYW1lLmdldEZhY3RvcnkoKS5yZXNvbHZlT3JOdWxsKG0uZ2V0UmVmZXJlbmNlS2luZCgpLCBtLCBudWxsKTsKICAgICAgICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5pc1B1YmxpYygpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG1lbWJlci5nZXRSZWZlcmVuY2VLaW5kKCkgPT0gbS5nZXRSZWZlcmVuY2VLaW5kKCkpOyAgLy8gZWxzZSB0aGlzLmZvcm0gaXMgd3JvbmcKICAgICAgICAgICAgICAgICBtZW1iZXIgPSBtOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjUsNjUgKzEyNywzMCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIEJvdW5kTWV0aG9kSGFuZGxlIHJlYmluZCgpIHsKKyAgICAgICAgcmV0dXJuIEJvdW5kTWV0aG9kSGFuZGxlLm1ha2VSZWludm9rZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgTWV0aG9kSGFuZGxlIGNvcHlXaXRoKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHsKKyAgICAgICAgYXNzZXJ0KHRoaXMuZ2V0Q2xhc3MoKSA9PSBEaXJlY3RNZXRob2RIYW5kbGUuY2xhc3MpOyAgLy8gbXVzdCBvdmVycmlkZSBpbiBzdWJjbGFzc2VzCiAgICAgICAgIHJldHVybiBuZXcgRGlyZWN0TWV0aG9kSGFuZGxlKG10LCBsZiwgbWVtYmVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBTdHJpbmcgaW50ZXJuYWxQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gIi9ETUg9IittZW1iZXIudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuICJcbiYgRE1ILk1OPSIraW50ZXJuYWxNZW1iZXJOYW1lKCk7CiAgICAgfQogCiAgICAgLy8vLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzLgogICAgIEBPdmVycmlkZQotICAgIE1ldGhvZEhhbmRsZSB2aWV3QXNUeXBlKE1ldGhvZFR5cGUgbmV3VHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IERpcmVjdE1ldGhvZEhhbmRsZShuZXdUeXBlLCBmb3JtLCBtZW1iZXIpOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKICAgICBARm9yY2VJbmxpbmUKICAgICBNZW1iZXJOYW1lIGludGVybmFsTWVtYmVyTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1lbWJlcjsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50KGludCBwb3MsIGNoYXIgYmFzaWNUeXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gSWYgdGhlIG1lbWJlciBuZWVkcyBkaXNwYXRjaGluZywgZG8gc28uCi0gICAgICAgIGlmIChwb3MgPT0gMCAmJiBiYXNpY1R5cGUgPT0gJ0wnKSB7Ci0gICAgICAgICAgICBEaXJlY3RNZXRob2RIYW5kbGUgY29uY3JldGUgPSBtYXliZVJlYmluZCh2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoY29uY3JldGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29uY3JldGUuYmluZFJlY2VpdmVyKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuYmluZEFyZ3VtZW50KHBvcywgYmFzaWNUeXBlLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgTWV0aG9kSGFuZGxlIGJpbmRSZWNlaXZlcihPYmplY3QgcmVjZWl2ZXIpIHsKLSAgICAgICAgLy8gSWYgdGhlIG1lbWJlciBuZWVkcyBkaXNwYXRjaGluZywgZG8gc28uCi0gICAgICAgIERpcmVjdE1ldGhvZEhhbmRsZSBjb25jcmV0ZSA9IG1heWJlUmViaW5kKHJlY2VpdmVyKTsKLSAgICAgICAgaWYgKGNvbmNyZXRlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gY29uY3JldGUuYmluZFJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmJpbmRSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVtYmVyTmFtZS5GYWN0b3J5IElNUExfTkFNRVMgPSBNZW1iZXJOYW1lLmdldEZhY3RvcnkoKTsKIAotICAgIHByaXZhdGUgRGlyZWN0TWV0aG9kSGFuZGxlIG1heWJlUmViaW5kKE9iamVjdCByZWNlaXZlcikgewotICAgICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3dpdGNoIChtZW1iZXIuZ2V0UmVmZXJlbmNlS2luZCgpKSB7Ci0gICAgICAgICAgICBjYXNlIFJFRl9pbnZva2VJbnRlcmZhY2U6Ci0gICAgICAgICAgICBjYXNlIFJFRl9pbnZva2VWaXJ0dWFsOgotICAgICAgICAgICAgICAgIC8vIFByZS1kaXNwYXRjaCB0aGUgbWVtYmVyLgotICAgICAgICAgICAgICAgIENsYXNzPD8+IGNvbmNyZXRlQ2xhc3MgPSByZWNlaXZlci5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgIE1lbWJlck5hbWUgY29uY3JldGUgPSBuZXcgTWVtYmVyTmFtZShjb25jcmV0ZUNsYXNzLCBtZW1iZXIuZ2V0TmFtZSgpLCBtZW1iZXIuZ2V0TWV0aG9kVHlwZSgpLCBSRUZfaW52b2tlU3BlY2lhbCk7Ci0gICAgICAgICAgICAgICAgY29uY3JldGUgPSBJTVBMX05BTUVTLnJlc29sdmVPck51bGwoUkVGX2ludm9rZVNwZWNpYWwsIGNvbmNyZXRlLCBjb25jcmV0ZUNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uY3JldGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RIYW5kbGUodHlwZSgpLCBwcmVwYXJlZExhbWJkYUZvcm0oY29uY3JldGUpLCBjb25jcmV0ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgTEYgd2hpY2ggY2FuIGludm9rZSB0aGUgZ2l2ZW4gbWV0aG9kLgogICAgICAqIENhY2hlIGFuZCBzaGFyZSB0aGlzIHN0cnVjdHVyZSBhbW9uZyBhbGwgbWV0aG9kcyB3aXRoCkBAIC0yNjQsOSArMjMxLDEwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuYW1lc1tHRVRfTUVNQkVSXSA9IG5ldyBOYW1lKExhenkuTkZfaW50ZXJuYWxNZW1iZXJOYW1lLCBuYW1lc1tETUhfVEhJU10pOwogICAgICAgICB9CisgICAgICAgIGFzc2VydChmaW5kRGlyZWN0TWV0aG9kSGFuZGxlKG5hbWVzW0dFVF9NRU1CRVJdKSA9PSBuYW1lc1tETUhfVEhJU10pOwogICAgICAgICBPYmplY3RbXSBvdXRBcmdzID0gQXJyYXlzLmNvcHlPZlJhbmdlKG5hbWVzLCBBUkdfQkFTRSwgR0VUX01FTUJFUisxLCBPYmplY3RbXS5jbGFzcyk7CiAgICAgICAgIGFzc2VydChvdXRBcmdzW291dEFyZ3MubGVuZ3RoLTFdID09IG5hbWVzW0dFVF9NRU1CRVJdKTsgIC8vIGxvb2ssIHNoaWZ0ZWQgYXJncyEKLSAgICAgICAgaW50IHJlc3VsdCA9IExhbWJkYUZvcm0uTEFTVF9SRVNVTFQ7CisgICAgICAgIGludCByZXN1bHQgPSBMQVNUX1JFU1VMVDsKICAgICAgICAgaWYgKGRvZXNBbGxvYykgewogICAgICAgICAgICAgYXNzZXJ0KG91dEFyZ3Nbb3V0QXJncy5sZW5ndGgtMl0gPT0gbmFtZXNbTkVXX09CSl0pOyAgLy8gZ290IHRvIG1vdmUgdGhpcyBvbmUKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3V0QXJncywgMCwgb3V0QXJncywgMSwgb3V0QXJncy5sZW5ndGgtMik7CkBAIC0yNzQsMTMgKzI0MiwyMyBAQAogICAgICAgICAgICAgcmVzdWx0ID0gTkVXX09CSjsKICAgICAgICAgfQogICAgICAgICBuYW1lc1tMSU5LRVJfQ0FMTF0gPSBuZXcgTmFtZShsaW5rZXIsIG91dEFyZ3MpOwotICAgICAgICBsYW1iZGFOYW1lICs9ICJfIiArIExhbWJkYUZvcm0uYmFzaWNUeXBlU2lnbmF0dXJlKG10eXBlKTsKKyAgICAgICAgbGFtYmRhTmFtZSArPSAiXyIgKyBzaG9ydGVuU2lnbmF0dXJlKGJhc2ljVHlwZVNpZ25hdHVyZShtdHlwZSkpOwogICAgICAgICBMYW1iZGFGb3JtIGxmb3JtID0gbmV3IExhbWJkYUZvcm0obGFtYmRhTmFtZSwgQVJHX0xJTUlULCBuYW1lcywgcmVzdWx0KTsKICAgICAgICAgLy8gVGhpcyBpcyBhIHRyaWNreSBiaXQgb2YgY29kZS4gIERvbid0IHNlbmQgaXQgdGhyb3VnaCB0aGUgTEYgaW50ZXJwcmV0ZXIuCiAgICAgICAgIGxmb3JtLmNvbXBpbGVUb0J5dGVjb2RlKCk7CiAgICAgICAgIHJldHVybiBsZm9ybTsKICAgICB9CiAKKyAgICBzdGF0aWMgT2JqZWN0IGZpbmREaXJlY3RNZXRob2RIYW5kbGUoTmFtZSBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lLmZ1bmN0aW9uID09IExhenkuTkZfaW50ZXJuYWxNZW1iZXJOYW1lIHx8CisgICAgICAgICAgICBuYW1lLmZ1bmN0aW9uID09IExhenkuTkZfaW50ZXJuYWxNZW1iZXJOYW1lRW5zdXJlSW5pdCB8fAorICAgICAgICAgICAgbmFtZS5mdW5jdGlvbiA9PSBMYXp5Lk5GX2NvbnN0cnVjdG9yTWV0aG9kKSB7CisgICAgICAgICAgICBhc3NlcnQobmFtZS5hcmd1bWVudHMubGVuZ3RoID09IDEpOworICAgICAgICAgICAgcmV0dXJuIG5hbWUuYXJndW1lbnRzWzBdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWF5YmVDb21waWxlKExhbWJkYUZvcm0gbGZvcm0sIE1lbWJlck5hbWUgbSkgewogICAgICAgICBpZiAoVmVyaWZ5QWNjZXNzLmlzU2FtZVBhY2thZ2UobS5nZXREZWNsYXJpbmdDbGFzcygpLCBNZXRob2RIYW5kbGUuY2xhc3MpKQogICAgICAgICAgICAgLy8gSGVscCBhbG9uZyBib290c3RyYXBwaW5nLi4uCkBAIC0zOTMsOCArMzcxLDggQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZXRob2RIYW5kbGUgdmlld0FzVHlwZShNZXRob2RUeXBlIG5ld1R5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3BlY2lhbChuZXdUeXBlLCBmb3JtLCBtZW1iZXIpOworICAgICAgICBNZXRob2RIYW5kbGUgY29weVdpdGgoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTcGVjaWFsKG10LCBsZiwgbWVtYmVyKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDExLDggKzM4OSw4IEBACiAgICAgICAgICAgICBhc3NlcnQoaW5pdE1ldGhvZC5pc1Jlc29sdmVkKCkpOwogICAgICAgICB9CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZXRob2RIYW5kbGUgdmlld0FzVHlwZShNZXRob2RUeXBlIG5ld1R5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IobmV3VHlwZSwgZm9ybSwgbWVtYmVyLCBpbml0TWV0aG9kLCBpbnN0YW5jZUNsYXNzKTsKKyAgICAgICAgTWV0aG9kSGFuZGxlIGNvcHlXaXRoKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IobXQsIGxmLCBtZW1iZXIsIGluaXRNZXRob2QsIGluc3RhbmNlQ2xhc3MpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NDEsOCArNDE5LDggQEAKICAgICAgICAgICAgIHJldHVybiBmaWVsZFR5cGUuY2FzdChvYmopOwogICAgICAgICB9CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZXRob2RIYW5kbGUgdmlld0FzVHlwZShNZXRob2RUeXBlIG5ld1R5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQWNjZXNzb3IobmV3VHlwZSwgZm9ybSwgbWVtYmVyLCBmaWVsZE9mZnNldCk7CisgICAgICAgIE1ldGhvZEhhbmRsZSBjb3B5V2l0aChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFjY2Vzc29yKG10LCBsZiwgbWVtYmVyLCBmaWVsZE9mZnNldCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ4NCw4ICs0NjIsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGZpZWxkVHlwZS5jYXN0KG9iaik7CiAgICAgICAgIH0KICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1ldGhvZEhhbmRsZSB2aWV3QXNUeXBlKE1ldGhvZFR5cGUgbmV3VHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNBY2Nlc3NvcihuZXdUeXBlLCBmb3JtLCBtZW1iZXIsIHN0YXRpY0Jhc2UsIHN0YXRpY09mZnNldCk7CisgICAgICAgIE1ldGhvZEhhbmRsZSBjb3B5V2l0aChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0FjY2Vzc29yKG10LCBsZiwgbWVtYmVyLCBzdGF0aWNCYXNlLCBzdGF0aWNPZmZzZXQpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0lubmVyQ2xhc3NMYW1iZGFNZXRhZmFjdG9yeS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9Jbm5lckNsYXNzTGFtYmRhTWV0YWZhY3RvcnkuamF2YQppbmRleCAyZmM4NjE4Li43NTJjMDk3IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0lubmVyQ2xhc3NMYW1iZGFNZXRhZmFjdG9yeS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvSW5uZXJDbGFzc0xhbWJkYU1ldGFmYWN0b3J5LmphdmEKQEAgLTE5MywxMCArMTkzLDEwIEBACiAgICAgQ2FsbFNpdGUgYnVpbGRDYWxsU2l0ZSgpIHRocm93cyBMYW1iZGFDb252ZXJzaW9uRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gaW5uZXJDbGFzcyA9IHNwaW5Jbm5lckNsYXNzKCk7CiAgICAgICAgIGlmIChpbnZva2VkVHlwZS5wYXJhbWV0ZXJDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yW10gY3RycyA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDb25zdHJ1Y3RvcltdPigpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+W10gY3RycyA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDb25zdHJ1Y3Rvcjw/PltdPigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgQ29uc3RydWN0b3JbXSBydW4oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIENvbnN0cnVjdG9yPD8+W10gcnVuKCkgewogICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/PltdIGN0cnMgPSBpbm5lckNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjdHJzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbGFtYmRhIGltcGxlbWVudGluZyBpbm5lciBjbGFzcyBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLCBzZXQKQEAgLTMzOCw3ICszMzgsNyBAQAogICAgICAgICAgICAgbS52aXNpdFZhckluc24oZ2V0TG9hZE9wY29kZShhcmdUeXBlKSwgdmFySW5kZXgpOwogICAgICAgICAgICAgdmFySW5kZXggKz0gZ2V0UGFyYW1ldGVyU2l6ZShhcmdUeXBlKTsKICAgICAgICAgfQotICAgICAgICBtLnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCBsYW1iZGFDbGFzc05hbWUsIE5BTUVfQ1RPUiwgY29uc3RydWN0b3JUeXBlLnRvTWV0aG9kRGVzY3JpcHRvclN0cmluZygpKTsKKyAgICAgICAgbS52aXNpdE1ldGhvZEluc24oSU5WT0tFU1BFQ0lBTCwgbGFtYmRhQ2xhc3NOYW1lLCBOQU1FX0NUT1IsIGNvbnN0cnVjdG9yVHlwZS50b01ldGhvZERlc2NyaXB0b3JTdHJpbmcoKSwgZmFsc2UpOwogICAgICAgICBtLnZpc2l0SW5zbihBUkVUVVJOKTsKICAgICAgICAgbS52aXNpdE1heHMoLTEsIC0xKTsKICAgICAgICAgbS52aXNpdEVuZCgpOwpAQCAtMzU0LDcgKzM1NCw3IEBACiAgICAgICAgIGN0b3IudmlzaXRDb2RlKCk7CiAgICAgICAgIGN0b3IudmlzaXRWYXJJbnNuKEFMT0FELCAwKTsKICAgICAgICAgY3Rvci52aXNpdE1ldGhvZEluc24oSU5WT0tFU1BFQ0lBTCwgSkFWQV9MQU5HX09CSkVDVCwgTkFNRV9DVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIT0RfREVTQ1JJUFRPUl9WT0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSE9EX0RFU0NSSVBUT1JfVk9JRCwgZmFsc2UpOwogICAgICAgICBpbnQgcGFyYW1ldGVyQ291bnQgPSBpbnZva2VkVHlwZS5wYXJhbWV0ZXJDb3VudCgpOwogICAgICAgICBmb3IgKGludCBpID0gMCwgbHZJbmRleCA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBjdG9yLnZpc2l0VmFySW5zbihBTE9BRCwgMCk7CkBAIC00MDIsNyArNDAyLDcgQEAKICAgICAgICAgICAgIG12LnZpc2l0SW5zbihBQVNUT1JFKTsKICAgICAgICAgfQogICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFU1BFQ0lBTCwgTkFNRV9TRVJJQUxJWkVEX0xBTUJEQSwgTkFNRV9DVE9SLAotICAgICAgICAgICAgICAgIERFU0NSX0NUT1JfU0VSSUFMSVpFRF9MQU1CREEpOworICAgICAgICAgICAgICAgIERFU0NSX0NUT1JfU0VSSUFMSVpFRF9MQU1CREEsIGZhbHNlKTsKICAgICAgICAgbXYudmlzaXRJbnNuKEFSRVRVUk4pOwogICAgICAgICAvLyBNYXhzIGNvbXB1dGVkIGJ5IENsYXNzV3JpdGVyLkNPTVBVVEVfTUFYUywgdGhlc2UgYXJndW1lbnRzIGlnbm9yZWQKICAgICAgICAgbXYudmlzaXRNYXhzKC0xLCAtMSk7CkBAIC00MjEsNyArNDIxLDcgQEAKICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CiAgICAgICAgIG12LnZpc2l0TGRjSW5zbigiTm9uLXNlcmlhbGl6YWJsZSBsYW1iZGEiKTsKICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsIE5BTUVfTk9UX1NFUklBTElaQUJMRV9FWENFUFRJT04sIE5BTUVfQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NSX0NUT1JfTk9UX1NFUklBTElaQUJMRV9FWENFUFRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ1JfQ1RPUl9OT1RfU0VSSUFMSVpBQkxFX0VYQ0VQVElPTiwgZmFsc2UpOwogICAgICAgICBtdi52aXNpdEluc24oQVRIUk9XKTsKICAgICAgICAgbXYudmlzaXRNYXhzKC0xLCAtMSk7CiAgICAgICAgIG12LnZpc2l0RW5kKCk7CkBAIC00MzQsNyArNDM0LDcgQEAKICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CiAgICAgICAgIG12LnZpc2l0TGRjSW5zbigiTm9uLXNlcmlhbGl6YWJsZSBsYW1iZGEiKTsKICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsIE5BTUVfTk9UX1NFUklBTElaQUJMRV9FWENFUFRJT04sIE5BTUVfQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NSX0NUT1JfTk9UX1NFUklBTElaQUJMRV9FWENFUFRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ1JfQ1RPUl9OT1RfU0VSSUFMSVpBQkxFX0VYQ0VQVElPTiwgZmFsc2UpOwogICAgICAgICBtdi52aXNpdEluc24oQVRIUk9XKTsKICAgICAgICAgbXYudmlzaXRNYXhzKC0xLCAtMSk7CiAgICAgICAgIG12LnZpc2l0RW5kKCk7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0ludm9rZXJCeXRlY29kZUdlbmVyYXRvci5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9JbnZva2VyQnl0ZWNvZGVHZW5lcmF0b3IuamF2YQppbmRleCA1NTI2MGVlLi5kYTc4ZTQ0IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0ludm9rZXJCeXRlY29kZUdlbmVyYXRvci5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvSW52b2tlckJ5dGVjb2RlR2VuZXJhdG9yLmphdmEKQEAgLTI1LDIwICsyNSwyMCBAQAogCiBwYWNrYWdlIGphdmEubGFuZy5pbnZva2U7CiAKLWltcG9ydCBzdW4uaW52b2tlLnV0aWwuVmVyaWZ5QWNjZXNzOwotaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS5OYW1lOwotCi1pbXBvcnQgc3VuLmludm9rZS51dGlsLldyYXBwZXI7Ci0KIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiAKIGltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uKjsKIAotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS4qOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uQmFzaWNUeXBlLio7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlU3RhdGljcy4qOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZU5hdGl2ZXMuQ29uc3RhbnRzLio7CisKK2ltcG9ydCBzdW4uaW52b2tlLnV0aWwuVmVyaWZ5QWNjZXNzOwogaW1wb3J0IHN1bi5pbnZva2UudXRpbC5WZXJpZnlUeXBlOworaW1wb3J0IHN1bi5pbnZva2UudXRpbC5XcmFwcGVyOwogaW1wb3J0IHN1bi5yZWZsZWN0Lm1pc2MuUmVmbGVjdFV0aWw7CiAKIC8qKgpAQCAtNzMsNyArNzMsMTEgQEAKICAgICBwcml2YXRlIGZpbmFsIExhbWJkYUZvcm0gbGFtYmRhRm9ybTsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyAgICAgaW52b2tlck5hbWU7CiAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2RUeXBlIGludm9rZXJUeXBlOwotICAgIHByaXZhdGUgZmluYWwgaW50W10gbG9jYWxzTWFwOworCisgICAgLyoqIEluZm8gYWJvdXQgbG9jYWwgdmFyaWFibGVzIGluIGNvbXBpbGVkIGxhbWJkYSBmb3JtICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSAgICAgICBsb2NhbHNNYXA7ICAgIC8vIGluZGV4CisgICAgcHJpdmF0ZSBmaW5hbCBCYXNpY1R5cGVbXSBsb2NhbFR5cGVzOyAgIC8vIGJhc2ljIHR5cGUKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+W10gIGxvY2FsQ2xhc3NlczsgLy8gdHlwZQogCiAgICAgLyoqIEFTTSBieXRlY29kZSBnZW5lcmF0aW9uLiAqLwogICAgIHByaXZhdGUgQ2xhc3NXcml0ZXIgY3c7CkBAIC04Miw2ICs4Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVtYmVyTmFtZS5GYWN0b3J5IE1FTUJFUk5BTUVfRkFDVE9SWSA9IE1lbWJlck5hbWUuZ2V0RmFjdG9yeSgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEhPU1RfQ0xBU1MgPSBMYW1iZGFGb3JtLmNsYXNzOwogCisgICAgLyoqIE1haW4gY29uc3RydWN0b3I7IG90aGVyIGNvbnN0cnVjdG9ycyBkZWxlZ2F0ZSB0byB0aGlzIG9uZS4gKi8KICAgICBwcml2YXRlIEludm9rZXJCeXRlY29kZUdlbmVyYXRvcihMYW1iZGFGb3JtIGxhbWJkYUZvcm0sIGludCBsb2NhbHNNYXBTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBpbnZva2VyTmFtZSwgTWV0aG9kVHlwZSBpbnZva2VyVHlwZSkgewogICAgICAgICBpZiAoaW52b2tlck5hbWUuY29udGFpbnMoIi4iKSkgewpAQCAtOTcsMTggKzEwMiwyNiBAQAogICAgICAgICB0aGlzLmxhbWJkYUZvcm0gPSBsYW1iZGFGb3JtOwogICAgICAgICB0aGlzLmludm9rZXJOYW1lID0gaW52b2tlck5hbWU7CiAgICAgICAgIHRoaXMuaW52b2tlclR5cGUgPSBpbnZva2VyVHlwZTsKLSAgICAgICAgdGhpcy5sb2NhbHNNYXAgPSBuZXcgaW50W2xvY2Fsc01hcFNpemVdOworICAgICAgICB0aGlzLmxvY2Fsc01hcCA9IG5ldyBpbnRbbG9jYWxzTWFwU2l6ZSsxXTsKKyAgICAgICAgLy8gbGFzdCBlbnRyeSBvZiBsb2NhbHNNYXAgaXMgY291bnQgb2YgYWxsb2NhdGVkIGxvY2FsIHNsb3RzCisgICAgICAgIHRoaXMubG9jYWxUeXBlcyA9IG5ldyBCYXNpY1R5cGVbbG9jYWxzTWFwU2l6ZSsxXTsKKyAgICAgICAgdGhpcy5sb2NhbENsYXNzZXMgPSBuZXcgQ2xhc3M8Pz5bbG9jYWxzTWFwU2l6ZSsxXTsKICAgICB9CiAKKyAgICAvKiogRm9yIGdlbmVyYXRpbmcgTGFtYmRhRm9ybSBpbnRlcnByZXRlciBlbnRyeSBwb2ludHMuICovCiAgICAgcHJpdmF0ZSBJbnZva2VyQnl0ZWNvZGVHZW5lcmF0b3IoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGludm9rZXJOYW1lLCBNZXRob2RUeXBlIGludm9rZXJUeXBlKSB7CiAgICAgICAgIHRoaXMobnVsbCwgaW52b2tlclR5cGUucGFyYW1ldGVyQ291bnQoKSwKICAgICAgICAgICAgICBjbGFzc05hbWUsIGludm9rZXJOYW1lLCBpbnZva2VyVHlwZSk7CiAgICAgICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byBtYXAgbmFtZSBpbmRleGVzIHRvIGxvY2FscyBpbmRleGVzLgorICAgICAgICBsb2NhbFR5cGVzW2xvY2FsVHlwZXMubGVuZ3RoIC0gMV0gPSBWX1RZUEU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxzTWFwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBsb2NhbHNNYXBbaV0gPSBpbnZva2VyVHlwZS5wYXJhbWV0ZXJTbG90Q291bnQoKSAtIGludm9rZXJUeXBlLnBhcmFtZXRlclNsb3REZXB0aChpKTsKKyAgICAgICAgICAgIGlmIChpIDwgaW52b2tlclR5cGUucGFyYW1ldGVyQ291bnQoKSkKKyAgICAgICAgICAgICAgICBsb2NhbFR5cGVzW2ldID0gYmFzaWNUeXBlKGludm9rZXJUeXBlLnBhcmFtZXRlclR5cGUoaSkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqIEZvciBnZW5lcmF0aW5nIGN1c3RvbWl6ZWQgY29kZSBmb3IgYSBzaW5nbGUgTGFtYmRhRm9ybS4gKi8KICAgICBwcml2YXRlIEludm9rZXJCeXRlY29kZUdlbmVyYXRvcihTdHJpbmcgY2xhc3NOYW1lLCBMYW1iZGFGb3JtIGZvcm0sIE1ldGhvZFR5cGUgaW52b2tlclR5cGUpIHsKICAgICAgICAgdGhpcyhmb3JtLCBmb3JtLm5hbWVzLmxlbmd0aCwKICAgICAgICAgICAgICBjbGFzc05hbWUsIGZvcm0uZGVidWdOYW1lLCBpbnZva2VyVHlwZSk7CkBAIC0xMTYsNyArMTI5LDExIEBACiAgICAgICAgIE5hbWVbXSBuYW1lcyA9IGZvcm0ubmFtZXM7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBsb2NhbHNNYXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGxvY2Fsc01hcFtpXSA9IGluZGV4OwotICAgICAgICAgICAgaW5kZXggKz0gV3JhcHBlci5mb3JCYXNpY1R5cGUobmFtZXNbaV0udHlwZSkuc3RhY2tTbG90cygpOworICAgICAgICAgICAgaWYgKGkgPCBuYW1lcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBCYXNpY1R5cGUgdHlwZSA9IG5hbWVzW2ldLnR5cGUoKTsKKyAgICAgICAgICAgICAgICBpbmRleCArPSB0eXBlLmJhc2ljVHlwZVNsb3RzKCk7CisgICAgICAgICAgICAgICAgbG9jYWxUeXBlc1tpXSA9IHR5cGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0Nyw3ICsxNjQsNiBAQAogCiAgICAgc3RhdGljIHZvaWQgbWF5YmVEdW1wKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJ5dGVbXSBjbGFzc0ZpbGUpIHsKICAgICAgICAgaWYgKERVTVBfQ0xBU1NfRklMRVMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZHVtcDogIiArIGNsYXNzTmFtZSk7CiAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAogICAgICAgICAgICAgbmV3IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjxWb2lkPigpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBydW4oKSB7CkBAIC0xNTUsNiArMTcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkdW1wTmFtZSA9IGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcE5hbWUgPSBkdW1wTmFtZS5yZXBsYWNlKCcvJywgJy0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZHVtcEZpbGUgPSBuZXcgRmlsZShEVU1QX0NMQVNTX0ZJTEVTX0RJUiwgZHVtcE5hbWUrIi5jbGFzcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkdW1wOiAiICsgZHVtcEZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgZHVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHVtcEZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS53cml0ZShjbGFzc0ZpbGUpOwpAQCAtMjAzLDcgKzIyMCw3IEBACiAKICAgICBTdHJpbmcgY29uc3RhbnRQbGFjZWhvbGRlcihPYmplY3QgYXJnKSB7CiAgICAgICAgIFN0cmluZyBjcFBsYWNlaG9sZGVyID0gIkNPTlNUQU5UX1BMQUNFSE9MREVSXyIgKyBjcGgrKzsKLSAgICAgICAgaWYgKERVTVBfQ0xBU1NfRklMRVMpIGNwUGxhY2Vob2xkZXIgKz0gIiA8PCIgKyBhcmcudG9TdHJpbmcoKSArICI+PiI7ICAvLyBkZWJ1Z2dpbmcgYWlkCisgICAgICAgIGlmIChEVU1QX0NMQVNTX0ZJTEVTKSBjcFBsYWNlaG9sZGVyICs9ICIgPDwiICsgZGVidWdTdHJpbmcoYXJnKSArICI+PiI7ICAvLyBkZWJ1Z2dpbmcgYWlkCiAgICAgICAgIGlmIChjcFBhdGNoZXMuY29udGFpbnNLZXkoY3BQbGFjZWhvbGRlcikpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJvYnNlcnZlZCBDUCBwbGFjZWhvbGRlciB0d2ljZTogIiArIGNwUGxhY2Vob2xkZXIpOwogICAgICAgICB9CkBAIC0yMjQsNiArMjQxLDE3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYnVnU3RyaW5nKE9iamVjdCBhcmcpIHsKKyAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE1ldGhvZEhhbmRsZSkgeworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gKE1ldGhvZEhhbmRsZSkgYXJnOworICAgICAgICAgICAgTWVtYmVyTmFtZSBtZW1iZXIgPSBtaC5pbnRlcm5hbE1lbWJlck5hbWUoKTsKKyAgICAgICAgICAgIGlmIChtZW1iZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gbWguZGVidWdTdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJnLnRvU3RyaW5nKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGNvbnN0YW50IHBvb2wgZW50cmllcyBmcm9tIGEgZ2l2ZW4gY2xhc3MgZmlsZS4KICAgICAgKgpAQCAtMzU5LDExOCArMzg3LDIxMiBAQAogICAgIC8qCiAgICAgICogTk9URTogVGhlc2UgbG9hZC9zdG9yZSBtZXRob2RzIHVzZSB0aGUgbG9jYWxzTWFwIHRvIGZpbmQgdGhlIGNvcnJlY3QgaW5kZXghCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRMb2FkSW5zbihjaGFyIHR5cGUsIGludCBpbmRleCkgewotICAgICAgICBpbnQgb3Bjb2RlOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSAnSSc6ICBvcGNvZGUgPSBPcGNvZGVzLklMT0FEOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0onOiAgb3Bjb2RlID0gT3Bjb2Rlcy5MTE9BRDsgIGJyZWFrOwotICAgICAgICBjYXNlICdGJzogIG9wY29kZSA9IE9wY29kZXMuRkxPQUQ7ICBicmVhazsKLSAgICAgICAgY2FzZSAnRCc6ICBvcGNvZGUgPSBPcGNvZGVzLkRMT0FEOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0wnOiAgb3Bjb2RlID0gT3Bjb2Rlcy5BTE9BRDsgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwotICAgICAgICB9CisgICAgcHJpdmF0ZSB2b2lkIGVtaXRMb2FkSW5zbihCYXNpY1R5cGUgdHlwZSwgaW50IGluZGV4KSB7CisgICAgICAgIGludCBvcGNvZGUgPSBsb2FkSW5zbk9wY29kZSh0eXBlKTsKICAgICAgICAgbXYudmlzaXRWYXJJbnNuKG9wY29kZSwgbG9jYWxzTWFwW2luZGV4XSk7CiAgICAgfQotICAgIHByaXZhdGUgdm9pZCBlbWl0QWxvYWRJbnNuKGludCBpbmRleCkgewotICAgICAgICBlbWl0TG9hZEluc24oJ0wnLCBpbmRleCk7Ci0gICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRTdG9yZUluc24oY2hhciB0eXBlLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaW50IG9wY29kZTsKKyAgICBwcml2YXRlIGludCBsb2FkSW5zbk9wY29kZShCYXNpY1R5cGUgdHlwZSkgdGhyb3dzIEludGVybmFsRXJyb3IgewogICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSAnSSc6ICBvcGNvZGUgPSBPcGNvZGVzLklTVE9SRTsgIGJyZWFrOwotICAgICAgICBjYXNlICdKJzogIG9wY29kZSA9IE9wY29kZXMuTFNUT1JFOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0YnOiAgb3Bjb2RlID0gT3Bjb2Rlcy5GU1RPUkU7ICBicmVhazsKLSAgICAgICAgY2FzZSAnRCc6ICBvcGNvZGUgPSBPcGNvZGVzLkRTVE9SRTsgIGJyZWFrOwotICAgICAgICBjYXNlICdMJzogIG9wY29kZSA9IE9wY29kZXMuQVNUT1JFOyAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CisgICAgICAgICAgICBjYXNlIElfVFlQRTogcmV0dXJuIE9wY29kZXMuSUxPQUQ7CisgICAgICAgICAgICBjYXNlIEpfVFlQRTogcmV0dXJuIE9wY29kZXMuTExPQUQ7CisgICAgICAgICAgICBjYXNlIEZfVFlQRTogcmV0dXJuIE9wY29kZXMuRkxPQUQ7CisgICAgICAgICAgICBjYXNlIERfVFlQRTogcmV0dXJuIE9wY29kZXMuRExPQUQ7CisgICAgICAgICAgICBjYXNlIExfVFlQRTogcmV0dXJuIE9wY29kZXMuQUxPQUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHZvaWQgZW1pdEFsb2FkSW5zbihpbnQgaW5kZXgpIHsKKyAgICAgICAgZW1pdExvYWRJbnNuKExfVFlQRSwgaW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbWl0U3RvcmVJbnNuKEJhc2ljVHlwZSB0eXBlLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaW50IG9wY29kZSA9IHN0b3JlSW5zbk9wY29kZSh0eXBlKTsKICAgICAgICAgbXYudmlzaXRWYXJJbnNuKG9wY29kZSwgbG9jYWxzTWFwW2luZGV4XSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgc3RvcmVJbnNuT3Bjb2RlKEJhc2ljVHlwZSB0eXBlKSB0aHJvd3MgSW50ZXJuYWxFcnJvciB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBJX1RZUEU6IHJldHVybiBPcGNvZGVzLklTVE9SRTsKKyAgICAgICAgICAgIGNhc2UgSl9UWVBFOiByZXR1cm4gT3Bjb2Rlcy5MU1RPUkU7CisgICAgICAgICAgICBjYXNlIEZfVFlQRTogcmV0dXJuIE9wY29kZXMuRlNUT1JFOworICAgICAgICAgICAgY2FzZSBEX1RZUEU6IHJldHVybiBPcGNvZGVzLkRTVE9SRTsKKyAgICAgICAgICAgIGNhc2UgTF9UWVBFOiByZXR1cm4gT3Bjb2Rlcy5BU1RPUkU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KICAgICBwcml2YXRlIHZvaWQgZW1pdEFzdG9yZUluc24oaW50IGluZGV4KSB7Ci0gICAgICAgIGVtaXRTdG9yZUluc24oJ0wnLCBpbmRleCk7CisgICAgICAgIGVtaXRTdG9yZUluc24oTF9UWVBFLCBpbmRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlIGFycmF5VHlwZUNvZGUoV3JhcHBlciBlbGVtZW50VHlwZSkgeworICAgICAgICBzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEJPT0xFQU46IHJldHVybiBPcGNvZGVzLlRfQk9PTEVBTjsKKyAgICAgICAgICAgIGNhc2UgQllURTogICAgcmV0dXJuIE9wY29kZXMuVF9CWVRFOworICAgICAgICAgICAgY2FzZSBDSEFSOiAgICByZXR1cm4gT3Bjb2Rlcy5UX0NIQVI7CisgICAgICAgICAgICBjYXNlIFNIT1JUOiAgIHJldHVybiBPcGNvZGVzLlRfU0hPUlQ7CisgICAgICAgICAgICBjYXNlIElOVDogICAgIHJldHVybiBPcGNvZGVzLlRfSU5UOworICAgICAgICAgICAgY2FzZSBMT05HOiAgICByZXR1cm4gT3Bjb2Rlcy5UX0xPTkc7CisgICAgICAgICAgICBjYXNlIEZMT0FUOiAgIHJldHVybiBPcGNvZGVzLlRfRkxPQVQ7CisgICAgICAgICAgICBjYXNlIERPVUJMRTogIHJldHVybiBPcGNvZGVzLlRfRE9VQkxFOworICAgICAgICAgICAgY2FzZSBPQkpFQ1Q6ICByZXR1cm4gMDsgLy8gaW4gcGxhY2Ugb2YgT3Bjb2Rlcy5UX09CSkVDVAorICAgICAgICAgICAgZGVmYXVsdDogICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYXJyYXlJbnNuT3Bjb2RlKGJ5dGUgdGNvZGUsIGludCBhYW9wKSB0aHJvd3MgSW50ZXJuYWxFcnJvciB7CisgICAgICAgIGFzc2VydChhYW9wID09IE9wY29kZXMuQUFTVE9SRSB8fCBhYW9wID09IE9wY29kZXMuQUFMT0FEKTsKKyAgICAgICAgaW50IHhhczsKKyAgICAgICAgc3dpdGNoICh0Y29kZSkgeworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfQk9PTEVBTjogeGFzID0gT3Bjb2Rlcy5CQVNUT1JFOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0JZVEU6ICAgIHhhcyA9IE9wY29kZXMuQkFTVE9SRTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9DSEFSOiAgICB4YXMgPSBPcGNvZGVzLkNBU1RPUkU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfU0hPUlQ6ICAgeGFzID0gT3Bjb2Rlcy5TQVNUT1JFOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0lOVDogICAgIHhhcyA9IE9wY29kZXMuSUFTVE9SRTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9MT05HOiAgICB4YXMgPSBPcGNvZGVzLkxBU1RPUkU7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfRkxPQVQ6ICAgeGFzID0gT3Bjb2Rlcy5GQVNUT1JFOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0RPVUJMRTogIHhhcyA9IE9wY29kZXMuREFTVE9SRTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICB4YXMgPSBPcGNvZGVzLkFBU1RPUkU7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB4YXMgLSBPcGNvZGVzLkFBU1RPUkUgKyBhYW9wOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGZyZWVGcmFtZUxvY2FsKGludCBvbGRGcmFtZUxvY2FsKSB7CisgICAgICAgIGludCBpID0gaW5kZXhGb3JGcmFtZUxvY2FsKG9sZEZyYW1lTG9jYWwpOworICAgICAgICBpZiAoaSA8IDApICByZXR1cm47CisgICAgICAgIEJhc2ljVHlwZSB0eXBlID0gbG9jYWxUeXBlc1tpXTsKKyAgICAgICAgaW50IG5ld0ZyYW1lTG9jYWwgPSBtYWtlTG9jYWxUZW1wKHR5cGUpOworICAgICAgICBtdi52aXNpdFZhckluc24obG9hZEluc25PcGNvZGUodHlwZSksIG9sZEZyYW1lTG9jYWwpOworICAgICAgICBtdi52aXNpdFZhckluc24oc3RvcmVJbnNuT3Bjb2RlKHR5cGUpLCBuZXdGcmFtZUxvY2FsKTsKKyAgICAgICAgYXNzZXJ0KGxvY2Fsc01hcFtpXSA9PSBvbGRGcmFtZUxvY2FsKTsKKyAgICAgICAgbG9jYWxzTWFwW2ldID0gbmV3RnJhbWVMb2NhbDsKKyAgICAgICAgYXNzZXJ0KGluZGV4Rm9yRnJhbWVMb2NhbChvbGRGcmFtZUxvY2FsKSA8IDApOworICAgIH0KKyAgICBwcml2YXRlIGludCBpbmRleEZvckZyYW1lTG9jYWwoaW50IGZyYW1lTG9jYWwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbHNNYXAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChsb2NhbHNNYXBbaV0gPT0gZnJhbWVMb2NhbCAmJiBsb2NhbFR5cGVzW2ldICE9IFZfVFlQRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHByaXZhdGUgaW50IG1ha2VMb2NhbFRlbXAoQmFzaWNUeXBlIHR5cGUpIHsKKyAgICAgICAgaW50IGZyYW1lTG9jYWwgPSBsb2NhbHNNYXBbbG9jYWxzTWFwLmxlbmd0aCAtIDFdOworICAgICAgICBsb2NhbHNNYXBbbG9jYWxzTWFwLmxlbmd0aCAtIDFdID0gZnJhbWVMb2NhbCArIHR5cGUuYmFzaWNUeXBlU2xvdHMoKTsKKyAgICAgICAgcmV0dXJuIGZyYW1lTG9jYWw7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRW1pdCBhIGJveGluZyBjYWxsLgogICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgcHJpbWl0aXZlIHR5cGUgY2xhc3MgdG8gYm94LgorICAgICAqIEBwYXJhbSB3cmFwcGVyIHByaW1pdGl2ZSB0eXBlIGNsYXNzIHRvIGJveC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW1pdEJveGluZyhDbGFzczw/PiB0eXBlKSB7Ci0gICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZSh0eXBlKTsKKyAgICBwcml2YXRlIHZvaWQgZW1pdEJveGluZyhXcmFwcGVyIHdyYXBwZXIpIHsKICAgICAgICAgU3RyaW5nIG93bmVyID0gImphdmEvbGFuZy8iICsgd3JhcHBlci53cmFwcGVyVHlwZSgpLmdldFNpbXBsZU5hbWUoKTsKICAgICAgICAgU3RyaW5nIG5hbWUgID0gInZhbHVlT2YiOwogICAgICAgICBTdHJpbmcgZGVzYyAgPSAiKCIgKyB3cmFwcGVyLmJhc2ljVHlwZUNoYXIoKSArICIpTCIgKyBvd25lciArICI7IjsKLSAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKE9wY29kZXMuSU5WT0tFU1RBVElDLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRVNUQVRJQywgb3duZXIsIG5hbWUsIGRlc2MsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBFbWl0IGFuIHVuYm94aW5nIGNhbGwgKHBsdXMgcHJlY2VkaW5nIGNoZWNrY2FzdCkuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSB3cmFwcGVyIHR5cGUgY2xhc3MgdG8gdW5ib3guCisgICAgICogQHBhcmFtIHdyYXBwZXIgd3JhcHBlciB0eXBlIGNsYXNzIHRvIHVuYm94LgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbWl0VW5ib3hpbmcoQ2xhc3M8Pz4gdHlwZSkgewotICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSBXcmFwcGVyLmZvcldyYXBwZXJUeXBlKHR5cGUpOworICAgIHByaXZhdGUgdm9pZCBlbWl0VW5ib3hpbmcoV3JhcHBlciB3cmFwcGVyKSB7CiAgICAgICAgIFN0cmluZyBvd25lciA9ICJqYXZhL2xhbmcvIiArIHdyYXBwZXIud3JhcHBlclR5cGUoKS5nZXRTaW1wbGVOYW1lKCk7CiAgICAgICAgIFN0cmluZyBuYW1lICA9IHdyYXBwZXIucHJpbWl0aXZlU2ltcGxlTmFtZSgpICsgIlZhbHVlIjsKICAgICAgICAgU3RyaW5nIGRlc2MgID0gIigpIiArIHdyYXBwZXIuYmFzaWNUeXBlQ2hhcigpOwotICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE9wY29kZXMuQ0hFQ0tDQVNULCBvd25lcik7Ci0gICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRVZJUlRVQUwsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgZW1pdFJlZmVyZW5jZUNhc3Qod3JhcHBlci53cmFwcGVyVHlwZSgpLCBudWxsKTsKKyAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKE9wY29kZXMuSU5WT0tFVklSVFVBTCwgb3duZXIsIG5hbWUsIGRlc2MsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbWl0IGFuIGltcGxpY2l0IGNvbnZlcnNpb24uCisgICAgICogRW1pdCBhbiBpbXBsaWNpdCBjb252ZXJzaW9uIGZvciBhbiBhcmd1bWVudCB3aGljaCBtdXN0IGJlIG9mIHRoZSBnaXZlbiBwY2xhc3MuCisgICAgICogVGhpcyBpcyB1c3VhbGx5IGEgbm8tb3AsIGV4Y2VwdCB3aGVuIHBjbGFzcyBpcyBhIHN1YndvcmQgdHlwZSBvciBhIHJlZmVyZW5jZSBvdGhlciB0aGFuIE9iamVjdCBvciBhbiBpbnRlcmZhY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcHR5cGUgdHlwZSBvZiB2YWx1ZSBwcmVzZW50IG9uIHN0YWNrCiAgICAgICogQHBhcmFtIHBjbGFzcyB0eXBlIG9mIHZhbHVlIHJlcXVpcmVkIG9uIHN0YWNrCisgICAgICogQHBhcmFtIGFyZyBjb21waWxlLXRpbWUgcmVwcmVzZW50YXRpb24gb2YgdmFsdWUgb24gc3RhY2sgKE5vZGUsIGNvbnN0YW50KSBvciBudWxsIGlmIG5vbmUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW1pdEltcGxpY2l0Q29udmVyc2lvbihjaGFyIHB0eXBlLCBDbGFzczw/PiBwY2xhc3MpIHsKKyAgICBwcml2YXRlIHZvaWQgZW1pdEltcGxpY2l0Q29udmVyc2lvbihCYXNpY1R5cGUgcHR5cGUsIENsYXNzPD8+IHBjbGFzcywgT2JqZWN0IGFyZykgeworICAgICAgICBhc3NlcnQoYmFzaWNUeXBlKHBjbGFzcykgPT0gcHR5cGUpOyAgLy8gYm94aW5nL3VuYm94aW5nIGhhbmRsZWQgYnkgY2FsbGVyCisgICAgICAgIGlmIChwY2xhc3MgPT0gcHR5cGUuYmFzaWNUeXBlQ2xhc3MoKSAmJiBwdHlwZSAhPSBMX1RZUEUpCisgICAgICAgICAgICByZXR1cm47ICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICBzd2l0Y2ggKHB0eXBlKSB7Ci0gICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICAgaWYgKFZlcmlmeVR5cGUuaXNOdWxsQ29udmVyc2lvbihPYmplY3QuY2xhc3MsIHBjbGFzcykpCisgICAgICAgICAgICBjYXNlIExfVFlQRToKKyAgICAgICAgICAgICAgICBpZiAoVmVyaWZ5VHlwZS5pc051bGxDb252ZXJzaW9uKE9iamVjdC5jbGFzcywgcGNsYXNzLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFBST0ZJTEVfTEVWRUwgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdFJlZmVyZW5jZUNhc3QoT2JqZWN0LmNsYXNzLCBhcmcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVtaXRSZWZlcmVuY2VDYXN0KHBjbGFzcywgYXJnKTsKICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoaXNTdGF0aWNhbGx5TmFtZWFibGUocGNsYXNzKSkgewotICAgICAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oT3Bjb2Rlcy5DSEVDS0NBU1QsIGdldEludGVybmFsTmFtZShwY2xhc3MpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKGNvbnN0YW50UGxhY2Vob2xkZXIocGNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihPcGNvZGVzLkNIRUNLQ0FTVCwgQ0xTKTsKLSAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5TV0FQKTsKLSAgICAgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oT3Bjb2Rlcy5JTlZPS0VTVEFUSUMsIE1ISSwgImNhc3RSZWZlcmVuY2UiLCBDTExfU0lHKTsKLSAgICAgICAgICAgICAgICBpZiAocGNsYXNzLmlzQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihPcGNvZGVzLkNIRUNLQ0FTVCwgT0JKQVJZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgICAgICBpZiAoIVZlcmlmeVR5cGUuaXNOdWxsQ29udmVyc2lvbihpbnQuY2xhc3MsIHBjbGFzcykpCi0gICAgICAgICAgICAgICAgZW1pdFByaW1DYXN0KHB0eXBlLCBXcmFwcGVyLmJhc2ljVHlwZUNoYXIocGNsYXNzKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgJ0onOgotICAgICAgICAgICAgYXNzZXJ0KHBjbGFzcyA9PSBsb25nLmNsYXNzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICBhc3NlcnQocGNsYXNzID09IGZsb2F0LmNsYXNzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICBhc3NlcnQocGNsYXNzID09IGRvdWJsZS5jbGFzcyk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIElfVFlQRToKKyAgICAgICAgICAgICAgICBpZiAoIVZlcmlmeVR5cGUuaXNOdWxsQ29udmVyc2lvbihpbnQuY2xhc3MsIHBjbGFzcywgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICBlbWl0UHJpbUNhc3QocHR5cGUuYmFzaWNUeXBlV3JhcHBlcigpLCBXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUocGNsYXNzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJiYWQgaW1wbGljaXQgY29udmVyc2lvbjogdGM9IitwdHlwZSsiOiAiK3BjbGFzcyk7CisgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoImJhZCBpbXBsaWNpdCBjb252ZXJzaW9uOiB0Yz0iK3B0eXBlKyI6ICIrcGNsYXNzKTsKKyAgICB9CisKKyAgICAvKiogVXBkYXRlIGxvY2FsQ2xhc3NlcyB0eXBlIG1hcC4gIFJldHVybiB0cnVlIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBhbHJlYWR5IHByZXNlbnQuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFzc2VydFN0YXRpY1R5cGUoQ2xhc3M8Pz4gY2xzLCBOYW1lIG4pIHsKKyAgICAgICAgaW50IGxvY2FsID0gbi5pbmRleCgpOworICAgICAgICBDbGFzczw/PiBhY2xhc3MgPSBsb2NhbENsYXNzZXNbbG9jYWxdOworICAgICAgICBpZiAoYWNsYXNzICE9IG51bGwgJiYgKGFjbGFzcyA9PSBjbHMgfHwgY2xzLmlzQXNzaWduYWJsZUZyb20oYWNsYXNzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gdHlwZSBpbmZvIGlzIGFscmVhZHkgcHJlc2VudAorICAgICAgICB9IGVsc2UgaWYgKGFjbGFzcyA9PSBudWxsIHx8IGFjbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpIHsKKyAgICAgICAgICAgIGxvY2FsQ2xhc3Nlc1tsb2NhbF0gPSBjbHM7ICAvLyB0eXBlIGluZm8gY2FuIGJlIGltcHJvdmVkCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbWl0UmVmZXJlbmNlQ2FzdChDbGFzczw/PiBjbHMsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTmFtZSB3cml0ZUJhY2sgPSBudWxsOyAgLy8gbG9jYWwgdG8gd3JpdGUgYmFjayByZXN1bHQKKyAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE5hbWUpIHsKKyAgICAgICAgICAgIE5hbWUgbiA9IChOYW1lKSBhcmc7CisgICAgICAgICAgICBpZiAoYXNzZXJ0U3RhdGljVHlwZShjbHMsIG4pKQorICAgICAgICAgICAgICAgIHJldHVybjsgIC8vIHRoaXMgY2FzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQKKyAgICAgICAgICAgIGlmIChsYW1iZGFGb3JtLnVzZUNvdW50KG4pID4gMSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgZ3V5IGdldHMgdXNlZCBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgICAgICAgICB3cml0ZUJhY2sgPSBuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc1N0YXRpY2FsbHlOYW1lYWJsZShjbHMpKSB7CisgICAgICAgICAgICBTdHJpbmcgc2lnID0gZ2V0SW50ZXJuYWxOYW1lKGNscyk7CisgICAgICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE9wY29kZXMuQ0hFQ0tDQVNULCBzaWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKGNvbnN0YW50UGxhY2Vob2xkZXIoY2xzKSk7CisgICAgICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE9wY29kZXMuQ0hFQ0tDQVNULCBDTFMpOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuU1dBUCk7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oT3Bjb2Rlcy5JTlZPS0VTVEFUSUMsIE1ISSwgImNhc3RSZWZlcmVuY2UiLCBDTExfU0lHLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoT2JqZWN0W10uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKQorICAgICAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oT3Bjb2Rlcy5DSEVDS0NBU1QsIE9CSkFSWSk7CisgICAgICAgICAgICBlbHNlIGlmIChQUk9GSUxFX0xFVkVMID4gMCkKKyAgICAgICAgICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE9wY29kZXMuQ0hFQ0tDQVNULCBPQkopOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0ZUJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRFVQKTsKKyAgICAgICAgICAgIGVtaXRBc3RvcmVJbnNuKHdyaXRlQmFjay5pbmRleCgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEVtaXRzIGFuIGFjdHVhbCByZXR1cm4gaW5zdHJ1Y3Rpb24gY29uZm9ybWluZyB0byB0aGUgZ2l2ZW4gcmV0dXJuIHR5cGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRSZXR1cm5JbnNuKENsYXNzPD8+IHR5cGUpIHsKKyAgICBwcml2YXRlIHZvaWQgZW1pdFJldHVybkluc24oQmFzaWNUeXBlIHR5cGUpIHsKICAgICAgICAgaW50IG9wY29kZTsKLSAgICAgICAgc3dpdGNoIChXcmFwcGVyLmJhc2ljVHlwZUNoYXIodHlwZSkpIHsKLSAgICAgICAgY2FzZSAnSSc6ICBvcGNvZGUgPSBPcGNvZGVzLklSRVRVUk47ICBicmVhazsKLSAgICAgICAgY2FzZSAnSic6ICBvcGNvZGUgPSBPcGNvZGVzLkxSRVRVUk47ICBicmVhazsKLSAgICAgICAgY2FzZSAnRic6ICBvcGNvZGUgPSBPcGNvZGVzLkZSRVRVUk47ICBicmVhazsKLSAgICAgICAgY2FzZSAnRCc6ICBvcGNvZGUgPSBPcGNvZGVzLkRSRVRVUk47ICBicmVhazsKLSAgICAgICAgY2FzZSAnTCc6ICBvcGNvZGUgPSBPcGNvZGVzLkFSRVRVUk47ICBicmVhazsKLSAgICAgICAgY2FzZSAnVic6ICBvcGNvZGUgPSBPcGNvZGVzLlJFVFVSTjsgICBicmVhazsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgSV9UWVBFOiAgb3Bjb2RlID0gT3Bjb2Rlcy5JUkVUVVJOOyAgYnJlYWs7CisgICAgICAgIGNhc2UgSl9UWVBFOiAgb3Bjb2RlID0gT3Bjb2Rlcy5MUkVUVVJOOyAgYnJlYWs7CisgICAgICAgIGNhc2UgRl9UWVBFOiAgb3Bjb2RlID0gT3Bjb2Rlcy5GUkVUVVJOOyAgYnJlYWs7CisgICAgICAgIGNhc2UgRF9UWVBFOiAgb3Bjb2RlID0gT3Bjb2Rlcy5EUkVUVVJOOyAgYnJlYWs7CisgICAgICAgIGNhc2UgTF9UWVBFOiAgb3Bjb2RlID0gT3Bjb2Rlcy5BUkVUVVJOOyAgYnJlYWs7CisgICAgICAgIGNhc2UgVl9UWVBFOiAgb3Bjb2RlID0gT3Bjb2Rlcy5SRVRVUk47ICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigidW5rbm93biByZXR1cm4gdHlwZTogIiArIHR5cGUpOwogICAgICAgICB9CkBAIC00NzgsNyArNjAwLDExIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEludGVybmFsTmFtZShDbGFzczw/PiBjKSB7Ci0gICAgICAgIGFzc2VydChWZXJpZnlBY2Nlc3MuaXNUeXBlVmlzaWJsZShjLCBPYmplY3QuY2xhc3MpKTsKKyAgICAgICAgaWYgKGMgPT0gT2JqZWN0LmNsYXNzKSAgICAgICAgICAgICByZXR1cm4gT0JKOworICAgICAgICBlbHNlIGlmIChjID09IE9iamVjdFtdLmNsYXNzKSAgICAgIHJldHVybiBPQkpBUlk7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gQ2xhc3MuY2xhc3MpICAgICAgICAgcmV0dXJuIENMUzsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSBNZXRob2RIYW5kbGUuY2xhc3MpICByZXR1cm4gTUg7CisgICAgICAgIGFzc2VydChWZXJpZnlBY2Nlc3MuaXNUeXBlVmlzaWJsZShjLCBPYmplY3QuY2xhc3MpKSA6IGMuZ2V0TmFtZSgpOwogICAgICAgICByZXR1cm4gYy5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJyk7CiAgICAgfQogCkBAIC01MDcsMzkgKzYzMyw2MiBAQAogCiAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgZm9ybSdzIG5hbWVzLCBnZW5lcmF0aW5nIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBmb3IgZWFjaAogICAgICAgICAvLyBzdGFydCBpdGVyYXRpbmcgYXQgdGhlIGZpcnN0IG5hbWUgZm9sbG93aW5nIHRoZSBhcmd1bWVudHMKKyAgICAgICAgTmFtZSBvblN0YWNrID0gbnVsbDsKICAgICAgICAgZm9yIChpbnQgaSA9IGxhbWJkYUZvcm0uYXJpdHk7IGkgPCBsYW1iZGFGb3JtLm5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBOYW1lIG5hbWUgPSBsYW1iZGFGb3JtLm5hbWVzW2ldOwotICAgICAgICAgICAgTWVtYmVyTmFtZSBtZW1iZXIgPSBuYW1lLmZ1bmN0aW9uLm1lbWJlcigpOwogCi0gICAgICAgICAgICBpZiAoaXNTZWxlY3RBbHRlcm5hdGl2ZShpKSkgewotICAgICAgICAgICAgICAgIGVtaXRTZWxlY3RBbHRlcm5hdGl2ZShuYW1lLCBsYW1iZGFGb3JtLm5hbWVzW2kgKyAxXSk7Ci0gICAgICAgICAgICAgICAgaSsrOyAgLy8gc2tpcCBNSC5pbnZva2VCYXNpYyBvZiB0aGUgc2VsZWN0QWx0ZXJuYXRpdmUgcmVzdWx0Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzR3VhcmRXaXRoQ2F0Y2goaSkpIHsKLSAgICAgICAgICAgICAgICBlbWl0R3VhcmRXaXRoQ2F0Y2goaSk7Ci0gICAgICAgICAgICAgICAgaSA9IGkrMjsgLy8gSnVtcCB0byB0aGUgZW5kIG9mIEdXQyBpZGlvbQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0YXRpY2FsbHlJbnZvY2FibGUobWVtYmVyKSkgeworICAgICAgICAgICAgZW1pdFN0b3JlUmVzdWx0KG9uU3RhY2spOworICAgICAgICAgICAgb25TdGFjayA9IG5hbWU7ICAvLyB1bmxlc3Mgb3RoZXJ3aXNlIG1vZGlmaWVkIGJlbG93CisgICAgICAgICAgICBNZXRob2RIYW5kbGVJbXBsLkludHJpbnNpYyBpbnRyID0gbmFtZS5mdW5jdGlvbi5pbnRyaW5zaWNOYW1lKCk7CisgICAgICAgICAgICBzd2l0Y2ggKGludHIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTEVDVF9BTFRFUk5BVElWRToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzU2VsZWN0QWx0ZXJuYXRpdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIG9uU3RhY2sgPSBlbWl0U2VsZWN0QWx0ZXJuYXRpdmUobmFtZSwgbGFtYmRhRm9ybS5uYW1lc1tpKzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOyAgLy8gc2tpcCBNSC5pbnZva2VCYXNpYyBvZiB0aGUgc2VsZWN0QWx0ZXJuYXRpdmUgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgR1VBUkRfV0lUSF9DQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzR3VhcmRXaXRoQ2F0Y2goaSk7CisgICAgICAgICAgICAgICAgICAgIG9uU3RhY2sgPSBlbWl0R3VhcmRXaXRoQ2F0Y2goaSk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBpKzI7IC8vIEp1bXAgdG8gdGhlIGVuZCBvZiBHV0MgaWRpb20KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSBORVdfQVJSQVk6CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHJ0eXBlID0gbmFtZS5mdW5jdGlvbi5tZXRob2RUeXBlKCkucmV0dXJuVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGF0aWNhbGx5TmFtZWFibGUocnR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0TmV3QXJyYXkobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFSUkFZX0xPQUQ6CisgICAgICAgICAgICAgICAgICAgIGVtaXRBcnJheUxvYWQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgQVJSQVlfU1RPUkU6CisgICAgICAgICAgICAgICAgICAgIGVtaXRBcnJheVN0b3JlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlIElERU5USVRZOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQobmFtZS5hcmd1bWVudHMubGVuZ3RoID09IDEpOworICAgICAgICAgICAgICAgICAgICBlbWl0UHVzaEFyZ3VtZW50cyhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSBaRVJPOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQobmFtZS5hcmd1bWVudHMubGVuZ3RoID09IDApOworICAgICAgICAgICAgICAgICAgICBlbWl0Q29uc3QobmFtZS50eXBlLmJhc2ljVHlwZVdyYXBwZXIoKS56ZXJvKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGludHJpbnNpYyBhc3NvY2lhdGVkCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoIlVua25vd24gaW50cmluc2ljOiAiK2ludHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZW1iZXJOYW1lIG1lbWJlciA9IG5hbWUuZnVuY3Rpb24ubWVtYmVyKCk7CisgICAgICAgICAgICBpZiAoaXNTdGF0aWNhbGx5SW52b2NhYmxlKG1lbWJlcikpIHsKICAgICAgICAgICAgICAgICBlbWl0U3RhdGljSW52b2tlKG1lbWJlciwgbmFtZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVtaXRJbnZva2UobmFtZSk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSBjYWNoZWQgZm9ybSBuYW1lJ3MgaW5mbyBpbiBjYXNlIGFuIGludHJpbnNpYyBzcGFubmluZyBtdWx0aXBsZSBuYW1lcyB3YXMgZW5jb3VudGVyZWQuCi0gICAgICAgICAgICBuYW1lID0gbGFtYmRhRm9ybS5uYW1lc1tpXTsKLSAgICAgICAgICAgIG1lbWJlciA9IG5hbWUuZnVuY3Rpb24ubWVtYmVyKCk7Ci0KLSAgICAgICAgICAgIC8vIHN0b3JlIHRoZSByZXN1bHQgZnJvbSBldmFsdWF0aW5nIHRvIHRoZSB0YXJnZXQgbmFtZSBpbiBhIGxvY2FsIGlmIHJlcXVpcmVkCi0gICAgICAgICAgICAvLyAoaWYgdGhpcyBpcyB0aGUgbGFzdCB2YWx1ZSwgaS5lLiwgdGhlIG9uZSB0aGF0IGlzIGdvaW5nIHRvIGJlIHJldHVybmVkLAotICAgICAgICAgICAgLy8gYXZvaWQgc3RvcmUvbG9hZC9yZXR1cm4gYW5kIGp1c3QgcmV0dXJuKQotICAgICAgICAgICAgaWYgKGkgPT0gbGFtYmRhRm9ybS5uYW1lcy5sZW5ndGggLSAxICYmIGkgPT0gbGFtYmRhRm9ybS5yZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgLSBkbyBub3RoaW5nCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUudHlwZSAhPSAnVicpIHsKLSAgICAgICAgICAgICAgICAvLyBub24tdm9pZDogYWN0dWFsbHkgYXNzaWduCi0gICAgICAgICAgICAgICAgZW1pdFN0b3JlSW5zbihuYW1lLnR5cGUsIG5hbWUuaW5kZXgoKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyByZXR1cm4gc3RhdGVtZW50Ci0gICAgICAgIGVtaXRSZXR1cm4oKTsKKyAgICAgICAgZW1pdFJldHVybihvblN0YWNrKTsKIAogICAgICAgICBjbGFzc0ZpbGVFcGlsb2d1ZSgpOwogICAgICAgICBib2d1c01ldGhvZChsYW1iZGFGb3JtKTsKQEAgLTU0OSwzMyArNjk4LDQ3IEBACiAgICAgICAgIHJldHVybiBjbGFzc0ZpbGU7CiAgICAgfQogCisgICAgdm9pZCBlbWl0QXJyYXlMb2FkKE5hbWUgbmFtZSkgIHsgZW1pdEFycmF5T3AobmFtZSwgT3Bjb2Rlcy5BQUxPQUQpOyAgfQorICAgIHZvaWQgZW1pdEFycmF5U3RvcmUoTmFtZSBuYW1lKSB7IGVtaXRBcnJheU9wKG5hbWUsIE9wY29kZXMuQUFTVE9SRSk7IH0KKworICAgIHZvaWQgZW1pdEFycmF5T3AoTmFtZSBuYW1lLCBpbnQgYXJyYXlPcGNvZGUpIHsKKyAgICAgICAgYXNzZXJ0IGFycmF5T3Bjb2RlID09IE9wY29kZXMuQUFMT0FEIHx8IGFycmF5T3Bjb2RlID09IE9wY29kZXMuQUFTVE9SRTsKKyAgICAgICAgQ2xhc3M8Pz4gZWxlbWVudFR5cGUgPSBuYW1lLmZ1bmN0aW9uLm1ldGhvZFR5cGUoKS5wYXJhbWV0ZXJUeXBlKDApLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgYXNzZXJ0IGVsZW1lbnRUeXBlICE9IG51bGw7CisgICAgICAgIGVtaXRQdXNoQXJndW1lbnRzKG5hbWUpOworICAgICAgICBpZiAoZWxlbWVudFR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgV3JhcHBlciB3ID0gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgIGFycmF5T3Bjb2RlID0gYXJyYXlJbnNuT3Bjb2RlKGFycmF5VHlwZUNvZGUodyksIGFycmF5T3Bjb2RlKTsKKyAgICAgICAgfQorICAgICAgICBtdi52aXNpdEluc24oYXJyYXlPcGNvZGUpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEVtaXQgYW4gaW52b2tlIGZvciB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgKi8KICAgICB2b2lkIGVtaXRJbnZva2UoTmFtZSBuYW1lKSB7CisgICAgICAgIGFzc2VydCghaXNMaW5rZXJNZXRob2RJbnZva2UobmFtZSkpOyAgLy8gc2hvdWxkIHVzZSB0aGUgc3RhdGljIHBhdGggZm9yIHRoZXNlCiAgICAgICAgIGlmICh0cnVlKSB7CiAgICAgICAgICAgICAvLyBwdXNoIHJlY2VpdmVyCiAgICAgICAgICAgICBNZXRob2RIYW5kbGUgdGFyZ2V0ID0gbmFtZS5mdW5jdGlvbi5yZXNvbHZlZEhhbmRsZTsKICAgICAgICAgICAgIGFzc2VydCh0YXJnZXQgIT0gbnVsbCkgOiBuYW1lLmV4cHJTdHJpbmcoKTsKICAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihjb25zdGFudFBsYWNlaG9sZGVyKHRhcmdldCkpOwotICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihPcGNvZGVzLkNIRUNLQ0FTVCwgTUgpOworICAgICAgICAgICAgZW1pdFJlZmVyZW5jZUNhc3QoTWV0aG9kSGFuZGxlLmNsYXNzLCB0YXJnZXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gbG9hZCByZWNlaXZlcgogICAgICAgICAgICAgZW1pdEFsb2FkSW5zbigwKTsKLSAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oT3Bjb2Rlcy5DSEVDS0NBU1QsIE1IKTsKKyAgICAgICAgICAgIGVtaXRSZWZlcmVuY2VDYXN0KE1ldGhvZEhhbmRsZS5jbGFzcywgbnVsbCk7CiAgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihPcGNvZGVzLkdFVEZJRUxELCBNSCwgImZvcm0iLCBMRl9TSUcpOwogICAgICAgICAgICAgbXYudmlzaXRGaWVsZEluc24oT3Bjb2Rlcy5HRVRGSUVMRCwgTEYsICJuYW1lcyIsIExGTl9TSUcpOwogICAgICAgICAgICAgLy8gVE9ETyBtb3JlIHRvIGNvbWUKICAgICAgICAgfQogCiAgICAgICAgIC8vIHB1c2ggYXJndW1lbnRzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGVtaXRQdXNoQXJndW1lbnQobmFtZSwgaSk7Ci0gICAgICAgIH0KKyAgICAgICAgZW1pdFB1c2hBcmd1bWVudHMobmFtZSk7CiAKICAgICAgICAgLy8gaW52b2NhdGlvbgogICAgICAgICBNZXRob2RUeXBlIHR5cGUgPSBuYW1lLmZ1bmN0aW9uLm1ldGhvZFR5cGUoKTsKLSAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKE9wY29kZXMuSU5WT0tFVklSVFVBTCwgTUgsICJpbnZva2VCYXNpYyIsIHR5cGUuYmFzaWNUeXBlKCkudG9NZXRob2REZXNjcmlwdG9yU3RyaW5nKCkpOworICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oT3Bjb2Rlcy5JTlZPS0VWSVJUVUFMLCBNSCwgImludm9rZUJhc2ljIiwgdHlwZS5iYXNpY1R5cGUoKS50b01ldGhvZERlc2NyaXB0b3JTdHJpbmcoKSwgZmFsc2UpOwogICAgIH0KIAogICAgIHN0YXRpYyBwcml2YXRlIENsYXNzPD8+W10gU1RBVElDQUxMWV9JTlZPQ0FCTEVfUEFDS0FHRVMgPSB7CkBAIC01ODYsNiArNzQ5LDEwIEBACiAgICAgICAgIC8vTWV0aG9kSGFuZGxlLmNsYXNzIGFscmVhZHkgY292ZXJlZAogICAgIH07CiAKKyAgICBzdGF0aWMgYm9vbGVhbiBpc1N0YXRpY2FsbHlJbnZvY2FibGUoTmFtZSBuYW1lKSB7CisgICAgICAgIHJldHVybiBpc1N0YXRpY2FsbHlJbnZvY2FibGUobmFtZS5mdW5jdGlvbi5tZW1iZXIoKSk7CisgICAgfQorCiAgICAgc3RhdGljIGJvb2xlYW4gaXNTdGF0aWNhbGx5SW52b2NhYmxlKE1lbWJlck5hbWUgbWVtYmVyKSB7CiAgICAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKG1lbWJlci5pc0NvbnN0cnVjdG9yKCkpICByZXR1cm4gZmFsc2U7CkBAIC02MTIsNiArNzc5LDggQEAKICAgICB9CiAKICAgICBzdGF0aWMgYm9vbGVhbiBpc1N0YXRpY2FsbHlOYW1lYWJsZShDbGFzczw/PiBjbHMpIHsKKyAgICAgICAgaWYgKGNscyA9PSBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgd2hpbGUgKGNscy5pc0FycmF5KCkpCiAgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0Q29tcG9uZW50VHlwZSgpOwogICAgICAgICBpZiAoY2xzLmlzUHJpbWl0aXZlKCkpCkBAIC02MzIsMTIgKzgwMSwxNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgdm9pZCBlbWl0U3RhdGljSW52b2tlKE5hbWUgbmFtZSkgeworICAgICAgICBlbWl0U3RhdGljSW52b2tlKG5hbWUuZnVuY3Rpb24ubWVtYmVyKCksIG5hbWUpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEVtaXQgYW4gaW52b2tlIGZvciB0aGUgZ2l2ZW4gbmFtZSwgdXNpbmcgdGhlIE1lbWJlck5hbWUgZGlyZWN0bHkuCiAgICAgICovCiAgICAgdm9pZCBlbWl0U3RhdGljSW52b2tlKE1lbWJlck5hbWUgbWVtYmVyLCBOYW1lIG5hbWUpIHsKICAgICAgICAgYXNzZXJ0KG1lbWJlci5lcXVhbHMobmFtZS5mdW5jdGlvbi5tZW1iZXIoKSkpOwotICAgICAgICBTdHJpbmcgY25hbWUgPSBnZXRJbnRlcm5hbE5hbWUobWVtYmVyLmdldERlY2xhcmluZ0NsYXNzKCkpOworICAgICAgICBDbGFzczw/PiBkZWZjID0gbWVtYmVyLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgIFN0cmluZyBjbmFtZSA9IGdldEludGVybmFsTmFtZShkZWZjKTsKICAgICAgICAgU3RyaW5nIG1uYW1lID0gbWVtYmVyLmdldE5hbWUoKTsKICAgICAgICAgU3RyaW5nIG10eXBlOwogICAgICAgICBieXRlIHJlZktpbmQgPSBtZW1iZXIuZ2V0UmVmZXJlbmNlS2luZCgpOwpAQCAtNjU0LDkgKzgyOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBwdXNoIGFyZ3VtZW50cwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBlbWl0UHVzaEFyZ3VtZW50KG5hbWUsIGkpOwotICAgICAgICB9CisgICAgICAgIGVtaXRQdXNoQXJndW1lbnRzKG5hbWUpOwogCiAgICAgICAgIC8vIGludm9jYXRpb24KICAgICAgICAgaWYgKG1lbWJlci5pc01ldGhvZCgpKSB7CkBAIC02NjcsNiArODM5LDUyIEBACiAgICAgICAgICAgICBtdHlwZSA9IE1ldGhvZFR5cGUudG9GaWVsZERlc2NyaXB0b3JTdHJpbmcobWVtYmVyLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKHJlZktpbmRPcGNvZGUocmVmS2luZCksIGNuYW1lLCBtbmFtZSwgbXR5cGUpOwogICAgICAgICB9CisgICAgICAgIC8vIElzc3VlIGEgdHlwZSBhc3NlcnRpb24gZm9yIHRoZSByZXN1bHQsIHNvIHdlIGNhbiBhdm9pZCBjYXN0cyBsYXRlci4KKyAgICAgICAgaWYgKG5hbWUudHlwZSA9PSBMX1RZUEUpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHJ0eXBlID0gbWVtYmVyLmdldEludm9jYXRpb25UeXBlKCkucmV0dXJuVHlwZSgpOworICAgICAgICAgICAgYXNzZXJ0KCFydHlwZS5pc1ByaW1pdGl2ZSgpKTsKKyAgICAgICAgICAgIGlmIChydHlwZSAhPSBPYmplY3QuY2xhc3MgJiYgIXJ0eXBlLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRTdGF0aWNUeXBlKHJ0eXBlLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZW1pdE5ld0FycmF5KE5hbWUgbmFtZSkgdGhyb3dzIEludGVybmFsRXJyb3IgeworICAgICAgICBDbGFzczw/PiBydHlwZSA9IG5hbWUuZnVuY3Rpb24ubWV0aG9kVHlwZSgpLnJldHVyblR5cGUoKTsKKyAgICAgICAgaWYgKG5hbWUuYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyBUaGUgYXJyYXkgd2lsbCBiZSBhIGNvbnN0YW50LgorICAgICAgICAgICAgT2JqZWN0IGVtcHR5QXJyYXk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVtcHR5QXJyYXkgPSBuYW1lLmZ1bmN0aW9uLnJlc29sdmVkSGFuZGxlLmludm9rZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcihleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0TGVuZ3RoKGVtcHR5QXJyYXkpID09IDApOworICAgICAgICAgICAgYXNzZXJ0KGVtcHR5QXJyYXkuZ2V0Q2xhc3MoKSA9PSBydHlwZSk7ICAvLyBleGFjdCB0eXBpbmcKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihjb25zdGFudFBsYWNlaG9sZGVyKGVtcHR5QXJyYXkpKTsKKyAgICAgICAgICAgIGVtaXRSZWZlcmVuY2VDYXN0KHJ0eXBlLCBlbXB0eUFycmF5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDbGFzczw/PiBhcnJheUVsZW1lbnRUeXBlID0gcnR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICBhc3NlcnQoYXJyYXlFbGVtZW50VHlwZSAhPSBudWxsKTsKKyAgICAgICAgZW1pdEljb25zdEluc24obmFtZS5hcmd1bWVudHMubGVuZ3RoKTsKKyAgICAgICAgaW50IHhhcyA9IE9wY29kZXMuQUFTVE9SRTsKKyAgICAgICAgaWYgKCFhcnJheUVsZW1lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oT3Bjb2Rlcy5BTkVXQVJSQVksIGdldEludGVybmFsTmFtZShhcnJheUVsZW1lbnRUeXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBieXRlIHRjID0gYXJyYXlUeXBlQ29kZShXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUoYXJyYXlFbGVtZW50VHlwZSkpOworICAgICAgICAgICAgeGFzID0gYXJyYXlJbnNuT3Bjb2RlKHRjLCB4YXMpOworICAgICAgICAgICAgbXYudmlzaXRJbnRJbnNuKE9wY29kZXMuTkVXQVJSQVksIHRjKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzdG9yZSBhcmd1bWVudHMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRFVQKTsKKyAgICAgICAgICAgIGVtaXRJY29uc3RJbnNuKGkpOworICAgICAgICAgICAgZW1pdFB1c2hBcmd1bWVudChuYW1lLCBpKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbih4YXMpOworICAgICAgICB9CisgICAgICAgIC8vIHRoZSBhcnJheSBpcyBsZWZ0IG9uIHRoZSBzdGFjaworICAgICAgICBhc3NlcnRTdGF0aWNUeXBlKHJ0eXBlLCBuYW1lKTsKICAgICB9CiAgICAgaW50IHJlZktpbmRPcGNvZGUoYnl0ZSByZWZLaW5kKSB7CiAgICAgICAgIHN3aXRjaCAocmVmS2luZCkgewpAQCAtNzA5LDYgKzkyNywyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIGlmIE1lbWJlck5hbWUgaXMgYSBjYWxsIHRvIE1ldGhvZEhhbmRsZS5saW5rVG9TdGF0aWMsIGV0Yy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMaW5rZXJNZXRob2RJbnZva2UoTmFtZSBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lLmZ1bmN0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChuYW1lLmFyZ3VtZW50cy5sZW5ndGggPCAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbXVzdCBoYXZlIE1IIGFyZ3VtZW50CisgICAgICAgIE1lbWJlck5hbWUgbWVtYmVyID0gbmFtZS5mdW5jdGlvbi5tZW1iZXIoKTsKKyAgICAgICAgcmV0dXJuIG1lbWJlciAhPSBudWxsICYmCisgICAgICAgICAgICAgICBtZW1iZXIuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PSBNZXRob2RIYW5kbGUuY2xhc3MgJiYKKyAgICAgICAgICAgICAgICFtZW1iZXIuaXNQdWJsaWMoKSAmJiBtZW1iZXIuaXNTdGF0aWMoKSAmJgorICAgICAgICAgICAgICAgbWVtYmVyLmdldE5hbWUoKS5zdGFydHNXaXRoKCJsaW5rVG8iKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVjayBpZiBpLXRoIG5hbWUgaXMgYSBjYWxsIHRvIE1ldGhvZEhhbmRsZUltcGwuc2VsZWN0QWx0ZXJuYXRpdmUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0QWx0ZXJuYXRpdmUoaW50IHBvcykgewpAQCAtNzU2LDcgKzk4OSw5IEBACiAgICAgICogICAgIHQ0Okk9TWV0aG9kSGFuZGxlLmludm9rZUJhc2ljKHQzOkwsYTE6SSk7dDQ6SX0KICAgICAgKiB9PC9wcmU+PC9ibG9ja3F1b3RlPgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbWl0U2VsZWN0QWx0ZXJuYXRpdmUoTmFtZSBzZWxlY3RBbHRlcm5hdGl2ZU5hbWUsIE5hbWUgaW52b2tlQmFzaWNOYW1lKSB7CisgICAgcHJpdmF0ZSBOYW1lIGVtaXRTZWxlY3RBbHRlcm5hdGl2ZShOYW1lIHNlbGVjdEFsdGVybmF0aXZlTmFtZSwgTmFtZSBpbnZva2VCYXNpY05hbWUpIHsKKyAgICAgICAgYXNzZXJ0IGlzU3RhdGljYWxseUludm9jYWJsZShpbnZva2VCYXNpY05hbWUpOworCiAgICAgICAgIE5hbWUgcmVjZWl2ZXIgPSAoTmFtZSkgaW52b2tlQmFzaWNOYW1lLmFyZ3VtZW50c1swXTsKIAogICAgICAgICBMYWJlbCBMX2ZhbGxiYWNrID0gbmV3IExhYmVsKCk7CkBAIC03NjQsMTUgKzk5OSwxNSBAQAogCiAgICAgICAgIC8vIGxvYWQgdGVzdCByZXN1bHQKICAgICAgICAgZW1pdFB1c2hBcmd1bWVudChzZWxlY3RBbHRlcm5hdGl2ZU5hbWUsIDApOwotICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JQ09OU1RfMSk7CiAKICAgICAgICAgLy8gaWZfaWNtcG5lIExfZmFsbGJhY2sKLSAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGX0lDTVBORSwgTF9mYWxsYmFjayk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRkVRLCBMX2ZhbGxiYWNrKTsKIAogICAgICAgICAvLyBpbnZva2Ugc2VsZWN0QWx0ZXJuYXRpdmVOYW1lLmFyZ3VtZW50c1sxXQorICAgICAgICBDbGFzczw/PltdIHByZUZvcmtDbGFzc2VzID0gbG9jYWxDbGFzc2VzLmNsb25lKCk7CiAgICAgICAgIGVtaXRQdXNoQXJndW1lbnQoc2VsZWN0QWx0ZXJuYXRpdmVOYW1lLCAxKTsgIC8vIGdldCAybmQgYXJndW1lbnQgb2Ygc2VsZWN0QWx0ZXJuYXRpdmUKICAgICAgICAgZW1pdEFzdG9yZUluc24ocmVjZWl2ZXIuaW5kZXgoKSk7ICAvLyBzdG9yZSB0aGUgTUggaW4gdGhlIHJlY2VpdmVyIHNsb3QKLSAgICAgICAgZW1pdEludm9rZShpbnZva2VCYXNpY05hbWUpOworICAgICAgICBlbWl0U3RhdGljSW52b2tlKGludm9rZUJhc2ljTmFtZSk7CiAKICAgICAgICAgLy8gZ290byBMX2RvbmUKICAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLkdPVE8sIExfZG9uZSk7CkBAIC03ODEsMTIgKzEwMTYsMTcgQEAKICAgICAgICAgbXYudmlzaXRMYWJlbChMX2ZhbGxiYWNrKTsKIAogICAgICAgICAvLyBpbnZva2Ugc2VsZWN0QWx0ZXJuYXRpdmVOYW1lLmFyZ3VtZW50c1syXQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZUZvcmtDbGFzc2VzLCAwLCBsb2NhbENsYXNzZXMsIDAsIHByZUZvcmtDbGFzc2VzLmxlbmd0aCk7CiAgICAgICAgIGVtaXRQdXNoQXJndW1lbnQoc2VsZWN0QWx0ZXJuYXRpdmVOYW1lLCAyKTsgIC8vIGdldCAzcmQgYXJndW1lbnQgb2Ygc2VsZWN0QWx0ZXJuYXRpdmUKICAgICAgICAgZW1pdEFzdG9yZUluc24ocmVjZWl2ZXIuaW5kZXgoKSk7ICAvLyBzdG9yZSB0aGUgTUggaW4gdGhlIHJlY2VpdmVyIHNsb3QKLSAgICAgICAgZW1pdEludm9rZShpbnZva2VCYXNpY05hbWUpOworICAgICAgICBlbWl0U3RhdGljSW52b2tlKGludm9rZUJhc2ljTmFtZSk7CiAKICAgICAgICAgLy8gTF9kb25lOgogICAgICAgICBtdi52aXNpdExhYmVsKExfZG9uZSk7CisgICAgICAgIC8vIGZvciBub3cgZG8gbm90IGJvdGhlciB0byBtZXJnZSB0eXBlc3RhdGU7IGp1c3QgcmVzZXQgdG8gdGhlIGRvbWluYXRvciBzdGF0ZQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZUZvcmtDbGFzc2VzLCAwLCBsb2NhbENsYXNzZXMsIDAsIHByZUZvcmtDbGFzc2VzLmxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIGludm9rZUJhc2ljTmFtZTsgIC8vIHJldHVybiB3aGF0J3Mgb24gc3RhY2sKICAgICB9CiAKICAgICAvKioKQEAgLTgwOSw3ICsxMDQ5LDcgQEAKICAgICAgICogICAgICByZXR1cm4gYTMuaW52b2tlQmFzaWMoZXgsIGE2LCBhNyk7CiAgICAgICAqICB9fQogICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW1pdEd1YXJkV2l0aENhdGNoKGludCBwb3MpIHsKKyAgICBwcml2YXRlIE5hbWUgZW1pdEd1YXJkV2l0aENhdGNoKGludCBwb3MpIHsKICAgICAgICAgTmFtZSBhcmdzICAgID0gbGFtYmRhRm9ybS5uYW1lc1twb3NdOwogICAgICAgICBOYW1lIGludm9rZXIgPSBsYW1iZGFGb3JtLm5hbWVzW3BvcysxXTsKICAgICAgICAgTmFtZSByZXN1bHQgID0gbGFtYmRhRm9ybS5uYW1lc1twb3MrMl07CkBAIC04NjAsNiArMTEwMCwxMiBAQAogICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5BVEhST1cpOwogCiAgICAgICAgIG12LnZpc2l0TGFiZWwoTF9kb25lKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbWl0UHVzaEFyZ3VtZW50cyhOYW1lIGFyZ3MpIHsKKyAgICAgICAgZW1pdFB1c2hBcmd1bWVudHMoYXJncywgMCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGVtaXRQdXNoQXJndW1lbnRzKE5hbWUgYXJncywgaW50IHN0YXJ0KSB7CkBAIC04NzAsNzUgKzExMTYsNjkgQEAKIAogICAgIHByaXZhdGUgdm9pZCBlbWl0UHVzaEFyZ3VtZW50KE5hbWUgbmFtZSwgaW50IHBhcmFtSW5kZXgpIHsKICAgICAgICAgT2JqZWN0IGFyZyA9IG5hbWUuYXJndW1lbnRzW3BhcmFtSW5kZXhdOwotICAgICAgICBjaGFyIHB0eXBlID0gbmFtZS5mdW5jdGlvbi5wYXJhbWV0ZXJUeXBlKHBhcmFtSW5kZXgpOwotICAgICAgICBNZXRob2RUeXBlIG10eXBlID0gbmFtZS5mdW5jdGlvbi5tZXRob2RUeXBlKCk7CisgICAgICAgIENsYXNzPD8+IHB0eXBlID0gbmFtZS5mdW5jdGlvbi5tZXRob2RUeXBlKCkucGFyYW1ldGVyVHlwZShwYXJhbUluZGV4KTsKKyAgICAgICAgZW1pdFB1c2hBcmd1bWVudChwdHlwZSwgYXJnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW1pdFB1c2hBcmd1bWVudChDbGFzczw/PiBwdHlwZSwgT2JqZWN0IGFyZykgeworICAgICAgICBCYXNpY1R5cGUgYnB0eXBlID0gYmFzaWNUeXBlKHB0eXBlKTsKICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgIE5hbWUgbiA9IChOYW1lKSBhcmc7CiAgICAgICAgICAgICBlbWl0TG9hZEluc24obi50eXBlLCBuLmluZGV4KCkpOwotICAgICAgICAgICAgZW1pdEltcGxpY2l0Q29udmVyc2lvbihuLnR5cGUsIG10eXBlLnBhcmFtZXRlclR5cGUocGFyYW1JbmRleCkpOwotICAgICAgICB9IGVsc2UgaWYgKChhcmcgPT0gbnVsbCB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcpICYmIHB0eXBlID09ICdMJykgeworICAgICAgICAgICAgZW1pdEltcGxpY2l0Q29udmVyc2lvbihuLnR5cGUsIHB0eXBlLCBuKTsKKyAgICAgICAgfSBlbHNlIGlmICgoYXJnID09IG51bGwgfHwgYXJnIGluc3RhbmNlb2YgU3RyaW5nKSAmJiBicHR5cGUgPT0gTF9UWVBFKSB7CiAgICAgICAgICAgICBlbWl0Q29uc3QoYXJnKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChXcmFwcGVyLmlzV3JhcHBlclR5cGUoYXJnLmdldENsYXNzKCkpICYmIHB0eXBlICE9ICdMJykgeworICAgICAgICAgICAgaWYgKFdyYXBwZXIuaXNXcmFwcGVyVHlwZShhcmcuZ2V0Q2xhc3MoKSkgJiYgYnB0eXBlICE9IExfVFlQRSkgewogICAgICAgICAgICAgICAgIGVtaXRDb25zdChhcmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtdi52aXNpdExkY0luc24oY29uc3RhbnRQbGFjZWhvbGRlcihhcmcpKTsKLSAgICAgICAgICAgICAgICBlbWl0SW1wbGljaXRDb252ZXJzaW9uKCdMJywgbXR5cGUucGFyYW1ldGVyVHlwZShwYXJhbUluZGV4KSk7CisgICAgICAgICAgICAgICAgZW1pdEltcGxpY2l0Q29udmVyc2lvbihMX1RZUEUsIHB0eXBlLCBhcmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU3RvcmUgdGhlIG5hbWUgdG8gaXRzIGxvY2FsLCBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVtaXRTdG9yZVJlc3VsdChOYW1lIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnR5cGUgIT0gVl9UWVBFKSB7CisgICAgICAgICAgICAvLyBub24tdm9pZDogYWN0dWFsbHkgYXNzaWduCisgICAgICAgICAgICBlbWl0U3RvcmVJbnNuKG5hbWUudHlwZSwgbmFtZS5pbmRleCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEVtaXRzIGEgcmV0dXJuIHN0YXRlbWVudCBmcm9tIGEgTEYgaW52b2tlci4gSWYgcmVxdWlyZWQsIHRoZSByZXN1bHQgdHlwZSBpcyBjYXN0IHRvIHRoZSBjb3JyZWN0IHJldHVybiB0eXBlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbWl0UmV0dXJuKCkgeworICAgIHByaXZhdGUgdm9pZCBlbWl0UmV0dXJuKE5hbWUgb25TdGFjaykgewogICAgICAgICAvLyByZXR1cm4gc3RhdGVtZW50Ci0gICAgICAgIGlmIChsYW1iZGFGb3JtLnJlc3VsdCA9PSAtMSkgeworICAgICAgICBDbGFzczw/PiByY2xhc3MgPSBpbnZva2VyVHlwZS5yZXR1cm5UeXBlKCk7CisgICAgICAgIEJhc2ljVHlwZSBydHlwZSA9IGxhbWJkYUZvcm0ucmV0dXJuVHlwZSgpOworICAgICAgICBhc3NlcnQocnR5cGUgPT0gYmFzaWNUeXBlKHJjbGFzcykpOyAgLy8gbXVzdCBhZ3JlZQorICAgICAgICBpZiAocnR5cGUgPT0gVl9UWVBFKSB7CiAgICAgICAgICAgICAvLyB2b2lkCiAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5SRVRVUk4pOworICAgICAgICAgICAgLy8gaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCByY2xhc3MgaXM7IHRoZSBKVk0gd2lsbCBkaXNjYXJkIGFueSB2YWx1ZQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTGFtYmRhRm9ybS5OYW1lIHJuID0gbGFtYmRhRm9ybS5uYW1lc1tsYW1iZGFGb3JtLnJlc3VsdF07Ci0gICAgICAgICAgICBjaGFyIHJ0eXBlID0gV3JhcHBlci5iYXNpY1R5cGVDaGFyKGludm9rZXJUeXBlLnJldHVyblR5cGUoKSk7CiAKICAgICAgICAgICAgIC8vIHB1dCByZXR1cm4gdmFsdWUgb24gdGhlIHN0YWNrIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlCi0gICAgICAgICAgICBpZiAobGFtYmRhRm9ybS5yZXN1bHQgIT0gbGFtYmRhRm9ybS5uYW1lcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgZW1pdExvYWRJbnNuKHJuLnR5cGUsIGxhbWJkYUZvcm0ucmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChybiAhPSBvblN0YWNrKSB7CisgICAgICAgICAgICAgICAgZW1pdExvYWRJbnNuKHJ0eXBlLCBsYW1iZGFGb3JtLnJlc3VsdCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIHBvdGVudGlhbGx5IGdlbmVyYXRlIGNhc3QKLSAgICAgICAgICAgIC8vIHJ0eXBlIGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW52b2tlciAtIGdlbmVyYXRlZCBjb2RlIG11c3QgY29uZm9ybSB0byB0aGlzCi0gICAgICAgICAgICAvLyBybi50eXBlIGlzIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgTmFtZSBpbiB0aGUgTEYKLSAgICAgICAgICAgIGlmIChydHlwZSAhPSBybi50eXBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbmVlZCBjYXN0Ci0gICAgICAgICAgICAgICAgaWYgKHJ0eXBlID09ICdMJykgewotICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJseSBjYXN0IHRoZSBwcmltaXRpdmUgdG8gdGhlIGNvcnJlY3QgdHlwZSBmb3IgYm94aW5nCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgYm94ZWRUeXBlID0gV3JhcHBlci5mb3JXcmFwcGVyVHlwZShpbnZva2VyVHlwZS5yZXR1cm5UeXBlKCkpLmJhc2ljVHlwZUNoYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJveGVkVHlwZSAhPSBybi50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0UHJpbUNhc3Qocm4udHlwZSwgYm94ZWRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBjYXN0IHByaW1pdGl2ZSB0byByZWZlcmVuY2UgKCJib3hpbmciKQotICAgICAgICAgICAgICAgICAgICBlbWl0Qm94aW5nKGludm9rZXJUeXBlLnJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8tcHJpbWl0aXZlIGNhc3QKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJuLnR5cGUgIT0gJ0wnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmltLXRvLXByaW0gY2FzdAotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdFByaW1DYXN0KHJuLnR5cGUsIHJ0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZi10by1wcmltIGNhc3QgKCJ1bmJveGluZyIpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigibm8gcmVmLXRvLXByaW0gKHVuYm94aW5nKSBjYXN0cyBzdXBwb3J0ZWQgcmlnaHQgbm93Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBlbWl0SW1wbGljaXRDb252ZXJzaW9uKHJ0eXBlLCByY2xhc3MsIHJuKTsKIAogICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYWN0dWFsIHJldHVybiBzdGF0ZW1lbnQKLSAgICAgICAgICAgIGVtaXRSZXR1cm5JbnNuKGludm9rZXJUeXBlLnJldHVyblR5cGUoKSk7CisgICAgICAgICAgICBlbWl0UmV0dXJuSW5zbihydHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBFbWl0IGEgdHlwZSBjb252ZXJzaW9uIGJ5dGVjb2RlIGNhc3RpbmcgZnJvbSAiZnJvbSIgdG8gInRvIi4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW1pdFByaW1DYXN0KGNoYXIgZnJvbSwgY2hhciB0bykgeworICAgIHByaXZhdGUgdm9pZCBlbWl0UHJpbUNhc3QoV3JhcHBlciBmcm9tLCBXcmFwcGVyIHRvKSB7CiAgICAgICAgIC8vIEhlcmUncyBob3cuCiAgICAgICAgIC8vIC0gICBpbmRpY2F0ZXMgZm9yYmlkZGVuCiAgICAgICAgIC8vIDwtPiBpbmRpY2F0ZXMgaW1wbGljaXQKQEAgLTk1NSwxNyArMTE5NSwxNSBAQAogICAgICAgICAgICAgLy8gbm8gY2FzdCByZXF1aXJlZCwgc2hvdWxkIGJlIGRlYWQgY29kZSBhbnl3YXkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBXcmFwcGVyIHdmcm9tID0gV3JhcHBlci5mb3JCYXNpY1R5cGUoZnJvbSk7Ci0gICAgICAgIFdyYXBwZXIgd3RvICAgPSBXcmFwcGVyLmZvckJhc2ljVHlwZSh0byk7Ci0gICAgICAgIGlmICh3ZnJvbS5pc1N1YndvcmRPckludCgpKSB7CisgICAgICAgIGlmIChmcm9tLmlzU3Vid29yZE9ySW50KCkpIHsKICAgICAgICAgICAgIC8vIGNhc3QgZnJvbSB7Ynl0ZSxzaG9ydCxjaGFyLGludH0gdG8gYW55dGhpbmcKICAgICAgICAgICAgIGVtaXRJMlgodG8pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gY2FzdCBmcm9tIHtsb25nLGZsb2F0LGRvdWJsZX0gdG8gYW55dGhpbmcKLSAgICAgICAgICAgIGlmICh3dG8uaXNTdWJ3b3JkT3JJbnQoKSkgeworICAgICAgICAgICAgaWYgKHRvLmlzU3Vid29yZE9ySW50KCkpIHsKICAgICAgICAgICAgICAgICAvLyBjYXN0IHRvIHtieXRlLHNob3J0LGNoYXIsaW50fQogICAgICAgICAgICAgICAgIGVtaXRYMkkoZnJvbSk7Ci0gICAgICAgICAgICAgICAgaWYgKHd0by5iaXRXaWR0aCgpIDwgMzIpIHsKKyAgICAgICAgICAgICAgICBpZiAodG8uYml0V2lkdGgoKSA8IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldHMgb3RoZXIgdGhhbiBpbnQgcmVxdWlyZSBhbm90aGVyIGNvbnZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgZW1pdEkyWCh0byk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTczLDIwICsxMjExLDI2IEBACiAgICAgICAgICAgICAgICAgLy8gY2FzdCB0byB7bG9uZyxmbG9hdCxkb3VibGV9IC0gdGhpcyBpcyB2ZXJib3NlCiAgICAgICAgICAgICAgICAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoZnJvbSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ0onOgotICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0byA9PSAnRicpIHsgbXYudmlzaXRJbnNuKE9wY29kZXMuTDJGKTsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0byA9PSAnRCcpIHsgbXYudmlzaXRJbnNuKE9wY29kZXMuTDJEKTsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYXNlIExPTkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodG8pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTE9BVDogICBtdi52aXNpdEluc24oT3Bjb2Rlcy5MMkYpOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOiAgbXYudmlzaXRJbnNuKE9wY29kZXMuTDJEKTsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgIGVycm9yID0gdHJ1ZTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdGJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG8gPT0gJ0onKSB7IG12LnZpc2l0SW5zbihPcGNvZGVzLkYyTCk7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG8gPT0gJ0QnKSB7IG12LnZpc2l0SW5zbihPcGNvZGVzLkYyRCk7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0bykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExPTkcgOiAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkYyTCk7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBET1VCTEU6ICBtdi52aXNpdEluc24oT3Bjb2Rlcy5GMkQpOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgZXJyb3IgPSB0cnVlOyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0byA9PSAnSicpIHsgbXYudmlzaXRJbnNuKE9wY29kZXMuRDJMKTsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0byA9PSAnRicpIHsgbXYudmlzaXRJbnNuKE9wY29kZXMuRDJGKTsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0bykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExPTkcgOiAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkQyTCk7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTE9BVDogICBtdi52aXNpdEluc24oT3Bjb2Rlcy5EMkYpOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgZXJyb3IgPSB0cnVlOyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKQEAgLTk5OSwxNiArMTI0MywxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRJMlgoY2hhciB0eXBlKSB7CisgICAgcHJpdmF0ZSB2b2lkIGVtaXRJMlgoV3JhcHBlciB0eXBlKSB7CiAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlICdCJzogIG12LnZpc2l0SW5zbihPcGNvZGVzLkkyQik7ICBicmVhazsKLSAgICAgICAgY2FzZSAnUyc6ICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMlMpOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0MnOiAgbXYudmlzaXRJbnNuKE9wY29kZXMuSTJDKTsgIGJyZWFrOwotICAgICAgICBjYXNlICdJJzogIC8qIG5hdWdodCAqLyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnSic6ICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkwpOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0YnOiAgbXYudmlzaXRJbnNuKE9wY29kZXMuSTJGKTsgIGJyZWFrOwotICAgICAgICBjYXNlICdEJzogIG12LnZpc2l0SW5zbihPcGNvZGVzLkkyRCk7ICBicmVhazsKLSAgICAgICAgY2FzZSAnWic6CisgICAgICAgIGNhc2UgQllURTogICAgbXYudmlzaXRJbnNuKE9wY29kZXMuSTJCKTsgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1JUOiAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkkyUyk7ICBicmVhazsKKyAgICAgICAgY2FzZSBDSEFSOiAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkMpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5UOiAgICAgLyogbmF1Z2h0ICovICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExPTkc6ICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkkyTCk7ICBicmVhazsKKyAgICAgICAgY2FzZSBGTE9BVDogICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkYpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgRE9VQkxFOiAgbXYudmlzaXRJbnNuKE9wY29kZXMuSTJEKTsgIGJyZWFrOworICAgICAgICBjYXNlIEJPT0xFQU46CiAgICAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFZhbHVlQ29udmVyc2lvbnMgYW5kIGV4cGxpY2l0Q2FzdEFyZ3VtZW50czoKICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLklDT05TVF8xKTsKICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLklBTkQpOwpAQCAtMTAxNywzOSArMTI2MSwyNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGVtaXRYMkkoY2hhciB0eXBlKSB7CisgICAgcHJpdmF0ZSB2b2lkIGVtaXRYMkkoV3JhcHBlciB0eXBlKSB7CiAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlICdKJzogIG12LnZpc2l0SW5zbihPcGNvZGVzLkwySSk7ICBicmVhazsKLSAgICAgICAgY2FzZSAnRic6ICBtdi52aXNpdEluc24oT3Bjb2Rlcy5GMkkpOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0QnOiAgbXYudmlzaXRJbnNuKE9wY29kZXMuRDJJKTsgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKKyAgICAgICAgY2FzZSBMT05HOiAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5MMkkpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgRkxPQVQ6ICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRjJJKTsgIGJyZWFrOworICAgICAgICBjYXNlIERPVUJMRTogIG12LnZpc2l0SW5zbihPcGNvZGVzLkQySSk7ICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzaWNUeXBlQ2hhclNpZ25hdHVyZShTdHJpbmcgcHJlZml4LCBNZXRob2RUeXBlIHR5cGUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcihwcmVmaXgpOwotICAgICAgICBmb3IgKENsYXNzPD8+IHB0eXBlIDogdHlwZS5wYXJhbWV0ZXJMaXN0KCkpCi0gICAgICAgICAgICBidWYuYXBwZW5kKFdyYXBwZXIuZm9yQmFzaWNUeXBlKHB0eXBlKS5iYXNpY1R5cGVDaGFyKCkpOwotICAgICAgICBidWYuYXBwZW5kKCdfJykuYXBwZW5kKFdyYXBwZXIuZm9yQmFzaWNUeXBlKHR5cGUucmV0dXJuVHlwZSgpKS5iYXNpY1R5cGVDaGFyKCkpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogR2VuZXJhdGUgYnl0ZWNvZGUgZm9yIGEgTGFtYmRhRm9ybS52bWVudHJ5IHdoaWNoIGNhbGxzIGludGVycHJldFdpdGhBcmd1bWVudHMuCiAgICAgICovCiAgICAgc3RhdGljIE1lbWJlck5hbWUgZ2VuZXJhdGVMYW1iZGFGb3JtSW50ZXJwcmV0ZXJFbnRyeVBvaW50KFN0cmluZyBzaWcpIHsKLSAgICAgICAgYXNzZXJ0KExhbWJkYUZvcm0uaXNWYWxpZFNpZ25hdHVyZShzaWcpKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImdlbmVyYXRlRXhhY3RJbnZva2VyICIrc2lnKTsKLSAgICAgICAgLy8gY29tcHV0ZSBtZXRob2QgdHlwZQotICAgICAgICAvLyBmaXJzdCBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlCi0gICAgICAgIGNoYXIgdHJldCA9IExhbWJkYUZvcm0uc2lnbmF0dXJlUmV0dXJuKHNpZyk7Ci0gICAgICAgIE1ldGhvZFR5cGUgdHlwZSA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShMYW1iZGFGb3JtLnR5cGVDbGFzcyh0cmV0KSwgTWV0aG9kSGFuZGxlLmNsYXNzKTsKLSAgICAgICAgLy8gb3RoZXIgcGFyYW1ldGVyIHR5cGVzCi0gICAgICAgIGludCBhcml0eSA9IExhbWJkYUZvcm0uc2lnbmF0dXJlQXJpdHkoc2lnKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcml0eTsgaSsrKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZS5hcHBlbmRQYXJhbWV0ZXJUeXBlcyhMYW1iZGFGb3JtLnR5cGVDbGFzcyhzaWcuY2hhckF0KGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgSW52b2tlckJ5dGVjb2RlR2VuZXJhdG9yIGcgPSBuZXcgSW52b2tlckJ5dGVjb2RlR2VuZXJhdG9yKCJMRkkiLCAiaW50ZXJwcmV0XyIrdHJldCwgdHlwZSk7CisgICAgICAgIGFzc2VydChpc1ZhbGlkU2lnbmF0dXJlKHNpZykpOworICAgICAgICBTdHJpbmcgbmFtZSA9ICJpbnRlcnByZXRfIitzaWduYXR1cmVSZXR1cm4oc2lnKS5iYXNpY1R5cGVDaGFyKCk7CisgICAgICAgIE1ldGhvZFR5cGUgdHlwZSA9IHNpZ25hdHVyZVR5cGUoc2lnKTsgIC8vIHNpZyBpbmNsdWRlcyBsZWFkaW5nIGFyZ3VtZW50CisgICAgICAgIHR5cGUgPSB0eXBlLmNoYW5nZVBhcmFtZXRlclR5cGUoMCwgTWV0aG9kSGFuZGxlLmNsYXNzKTsKKyAgICAgICAgSW52b2tlckJ5dGVjb2RlR2VuZXJhdG9yIGcgPSBuZXcgSW52b2tlckJ5dGVjb2RlR2VuZXJhdG9yKCJMRkkiLCBuYW1lLCB0eXBlKTsKICAgICAgICAgcmV0dXJuIGcubG9hZE1ldGhvZChnLmdlbmVyYXRlTGFtYmRhRm9ybUludGVycHJldGVyRW50cnlQb2ludEJ5dGVzKCkpOwogICAgIH0KIApAQCAtMTA3MSwxMCArMTMwMCwxMCBAQAogICAgICAgICAgICAgQ2xhc3M8Pz4gcHR5cGUgPSBpbnZva2VyVHlwZS5wYXJhbWV0ZXJUeXBlKGkpOwogICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRFVQKTsKICAgICAgICAgICAgIGVtaXRJY29uc3RJbnNuKGkpOwotICAgICAgICAgICAgZW1pdExvYWRJbnNuKFdyYXBwZXIuYmFzaWNUeXBlQ2hhcihwdHlwZSksIGkpOworICAgICAgICAgICAgZW1pdExvYWRJbnNuKGJhc2ljVHlwZShwdHlwZSksIGkpOwogICAgICAgICAgICAgLy8gYm94IGlmIHByaW1pdGl2ZSB0eXBlCiAgICAgICAgICAgICBpZiAocHR5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgIGVtaXRCb3hpbmcocHR5cGUpOworICAgICAgICAgICAgICAgIGVtaXRCb3hpbmcoV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKHB0eXBlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5BQVNUT1JFKTsKICAgICAgICAgfQpAQCAtMTA4MiwxNiArMTMxMSwxNiBAQAogICAgICAgICBlbWl0QWxvYWRJbnNuKDApOwogICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihPcGNvZGVzLkdFVEZJRUxELCBNSCwgImZvcm0iLCAiTGphdmEvbGFuZy9pbnZva2UvTGFtYmRhRm9ybTsiKTsKICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuU1dBUCk7ICAvLyBzd2FwIGZvcm0gYW5kIGFycmF5OyBhdm9pZCBsb2NhbCB2YXJpYWJsZQotICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oT3Bjb2Rlcy5JTlZPS0VWSVJUVUFMLCBMRiwgImludGVycHJldFdpdGhBcmd1bWVudHMiLCAiKFtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRVZJUlRVQUwsIExGLCAiaW50ZXJwcmV0V2l0aEFyZ3VtZW50cyIsICIoW0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsiLCBmYWxzZSk7CiAKICAgICAgICAgLy8gbWF5YmUgdW5ib3gKICAgICAgICAgQ2xhc3M8Pz4gcnR5cGUgPSBpbnZva2VyVHlwZS5yZXR1cm5UeXBlKCk7CiAgICAgICAgIGlmIChydHlwZS5pc1ByaW1pdGl2ZSgpICYmIHJ0eXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgIGVtaXRVbmJveGluZyhXcmFwcGVyLmFzV3JhcHBlclR5cGUocnR5cGUpKTsKKyAgICAgICAgICAgIGVtaXRVbmJveGluZyhXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUocnR5cGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHVybiBzdGF0ZW1lbnQKLSAgICAgICAgZW1pdFJldHVybkluc24ocnR5cGUpOworICAgICAgICBlbWl0UmV0dXJuSW5zbihiYXNpY1R5cGUocnR5cGUpKTsKIAogICAgICAgICBjbGFzc0ZpbGVFcGlsb2d1ZSgpOwogICAgICAgICBib2d1c01ldGhvZChpbnZva2VyVHlwZSk7CkBAIC0xMTA1LDE0ICsxMzM0LDEyIEBACiAgICAgICogR2VuZXJhdGUgYnl0ZWNvZGUgZm9yIGEgTmFtZWRGdW5jdGlvbiBpbnZva2VyLgogICAgICAqLwogICAgIHN0YXRpYyBNZW1iZXJOYW1lIGdlbmVyYXRlTmFtZWRGdW5jdGlvbkludm9rZXIoTWV0aG9kVHlwZUZvcm0gdHlwZUZvcm0pIHsKLSAgICAgICAgTWV0aG9kVHlwZSBpbnZva2VyVHlwZSA9IExhbWJkYUZvcm0uTmFtZWRGdW5jdGlvbi5JTlZPS0VSX01FVEhPRF9UWVBFOwotICAgICAgICBTdHJpbmcgaW52b2tlck5hbWUgPSBiYXNpY1R5cGVDaGFyU2lnbmF0dXJlKCJpbnZva2VfIiwgdHlwZUZvcm0uZXJhc2VkVHlwZSgpKTsKKyAgICAgICAgTWV0aG9kVHlwZSBpbnZva2VyVHlwZSA9IE5hbWVkRnVuY3Rpb24uSU5WT0tFUl9NRVRIT0RfVFlQRTsKKyAgICAgICAgU3RyaW5nIGludm9rZXJOYW1lID0gImludm9rZV8iICsgc2hvcnRlblNpZ25hdHVyZShiYXNpY1R5cGVTaWduYXR1cmUodHlwZUZvcm0uZXJhc2VkVHlwZSgpKSk7CiAgICAgICAgIEludm9rZXJCeXRlY29kZUdlbmVyYXRvciBnID0gbmV3IEludm9rZXJCeXRlY29kZUdlbmVyYXRvcigiTkZJIiwgaW52b2tlck5hbWUsIGludm9rZXJUeXBlKTsKICAgICAgICAgcmV0dXJuIGcubG9hZE1ldGhvZChnLmdlbmVyYXRlTmFtZWRGdW5jdGlvbkludm9rZXJJbXBsKHR5cGVGb3JtKSk7CiAgICAgfQogCi0gICAgc3RhdGljIGludCBuZmkgPSAwOwotCiAgICAgcHJpdmF0ZSBieXRlW10gZ2VuZXJhdGVOYW1lZEZ1bmN0aW9uSW52b2tlckltcGwoTWV0aG9kVHlwZUZvcm0gdHlwZUZvcm0pIHsKICAgICAgICAgTWV0aG9kVHlwZSBkc3RUeXBlID0gdHlwZUZvcm0uZXJhc2VkVHlwZSgpOwogICAgICAgICBjbGFzc0ZpbGVQcm9sb2d1ZSgpOwpAQCAtMTEzOCwxNCArMTM2NSwxNCBAQAogICAgICAgICAgICAgICAgIENsYXNzPD8+IHNwdHlwZSA9IGRzdFR5cGUuYmFzaWNUeXBlKCkud3JhcCgpLnBhcmFtZXRlclR5cGUoaSk7CiAgICAgICAgICAgICAgICAgV3JhcHBlciBkc3RXcmFwcGVyID0gV3JhcHBlci5mb3JCYXNpY1R5cGUoZHB0eXBlKTsKICAgICAgICAgICAgICAgICBXcmFwcGVyIHNyY1dyYXBwZXIgPSBkc3RXcmFwcGVyLmlzU3Vid29yZE9ySW50KCkgPyBXcmFwcGVyLklOVCA6IGRzdFdyYXBwZXI7ICAvLyBuYXJyb3cgc3Vid29yZCBmcm9tIGludAotICAgICAgICAgICAgICAgIGVtaXRVbmJveGluZyhzcmNXcmFwcGVyLndyYXBwZXJUeXBlKCkpOwotICAgICAgICAgICAgICAgIGVtaXRQcmltQ2FzdChzcmNXcmFwcGVyLmJhc2ljVHlwZUNoYXIoKSwgZHN0V3JhcHBlci5iYXNpY1R5cGVDaGFyKCkpOworICAgICAgICAgICAgICAgIGVtaXRVbmJveGluZyhzcmNXcmFwcGVyKTsKKyAgICAgICAgICAgICAgICBlbWl0UHJpbUNhc3Qoc3JjV3JhcHBlciwgZHN0V3JhcHBlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJbnZva2UKICAgICAgICAgU3RyaW5nIHRhcmdldERlc2MgPSBkc3RUeXBlLmJhc2ljVHlwZSgpLnRvTWV0aG9kRGVzY3JpcHRvclN0cmluZygpOwotICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oT3Bjb2Rlcy5JTlZPS0VWSVJUVUFMLCBNSCwgImludm9rZUJhc2ljIiwgdGFyZ2V0RGVzYyk7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRVZJUlRVQUwsIE1ILCAiaW52b2tlQmFzaWMiLCB0YXJnZXREZXNjLCBmYWxzZSk7CiAKICAgICAgICAgLy8gQm94IHByaW1pdGl2ZSB0eXBlcwogICAgICAgICBDbGFzczw/PiBydHlwZSA9IGRzdFR5cGUucmV0dXJuVHlwZSgpOwpAQCAtMTE1MywxNSArMTM4MCwxNSBAQAogICAgICAgICAgICAgV3JhcHBlciBzcmNXcmFwcGVyID0gV3JhcHBlci5mb3JCYXNpY1R5cGUocnR5cGUpOwogICAgICAgICAgICAgV3JhcHBlciBkc3RXcmFwcGVyID0gc3JjV3JhcHBlci5pc1N1YndvcmRPckludCgpID8gV3JhcHBlci5JTlQgOiBzcmNXcmFwcGVyOyAgLy8gd2lkZW4gc3Vid29yZCB0byBpbnQKICAgICAgICAgICAgIC8vIGJvb2xlYW4gY2FzdHMgbm90IGFsbG93ZWQKLSAgICAgICAgICAgIGVtaXRQcmltQ2FzdChzcmNXcmFwcGVyLmJhc2ljVHlwZUNoYXIoKSwgZHN0V3JhcHBlci5iYXNpY1R5cGVDaGFyKCkpOwotICAgICAgICAgICAgZW1pdEJveGluZyhkc3RXcmFwcGVyLnByaW1pdGl2ZVR5cGUoKSk7CisgICAgICAgICAgICBlbWl0UHJpbUNhc3Qoc3JjV3JhcHBlciwgZHN0V3JhcHBlcik7CisgICAgICAgICAgICBlbWl0Qm94aW5nKGRzdFdyYXBwZXIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgdGhlIHJldHVybiB0eXBlIGlzIHZvaWQgd2UgcmV0dXJuIGEgbnVsbCByZWZlcmVuY2UuCiAgICAgICAgIGlmIChydHlwZSA9PSB2b2lkLmNsYXNzKSB7CiAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5BQ09OU1RfTlVMTCk7CiAgICAgICAgIH0KLSAgICAgICAgZW1pdFJldHVybkluc24oT2JqZWN0LmNsYXNzKTsgIC8vIE5PVEU6IE5hbWVkRnVuY3Rpb24gaW52b2tlcnMgYWx3YXlzIHJldHVybiBhIHJlZmVyZW5jZSB2YWx1ZS4KKyAgICAgICAgZW1pdFJldHVybkluc24oTF9UWVBFKTsgIC8vIE5PVEU6IE5hbWVkRnVuY3Rpb24gaW52b2tlcnMgYWx3YXlzIHJldHVybiBhIHJlZmVyZW5jZSB2YWx1ZS4KIAogICAgICAgICBjbGFzc0ZpbGVFcGlsb2d1ZSgpOwogICAgICAgICBib2d1c01ldGhvZChkc3RUeXBlKTsKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvSW52b2tlcnMuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvSW52b2tlcnMuamF2YQppbmRleCBiOWMxOGI1Li4xNGFlZjFiIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0ludm9rZXJzLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9JbnZva2Vycy5qYXZhCkBAIC0yNSw4ICsyNSw5IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nLmludm9rZTsKIAoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgc3VuLmludm9rZS5lbXB0eS5FbXB0eTsKKwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZVN0YXRpY3MuKjsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVOYXRpdmVzLkNvbnN0YW50cy4qOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZXMuTG9va3VwLklNUExfTE9PS1VQOwpAQCAtNDAsNTIgKzQxLDYzIEBACiAgICAgLy8gZXhhY3QgdHlwZSAoc2FucyBsZWFkaW5nIHRhZ2V0IE1IKSBmb3IgdGhlIG91dGdvaW5nIGNhbGwKICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZFR5cGUgdGFyZ2V0VHlwZTsKIAotICAgIC8vIEZJWE1FOiBHZXQgcmlkIG9mIHRoZSBpbnZva2VycyB0aGF0IGFyZSBub3QgdXNlZnVsLgotCi0gICAgLy8gZXhhY3QgaW52b2tlciBmb3IgdGhlIG91dGdvaW5nIGNhbGwKLSAgICBwcml2YXRlIC8qbGF6eSovIE1ldGhvZEhhbmRsZSBleGFjdEludm9rZXI7Ci0gICAgcHJpdmF0ZSAvKmxhenkqLyBNZXRob2RIYW5kbGUgYmFzaWNJbnZva2VyOyAgLy8gaW52b2tlQmFzaWMgKHVuY2hlY2tlZCBleGFjdCkKLQotICAgIC8vIGVyYXNlZCAocGFydGlhbGx5IHVudHlwZWQgYnV0IHdpdGggcHJpbWl0aXZlcykgaW52b2tlciBmb3IgdGhlIG91dGdvaW5nIGNhbGwKLSAgICAvLyBGSVhNRTogZ2V0IHJpZCBvZgotICAgIHByaXZhdGUgLypsYXp5Ki8gTWV0aG9kSGFuZGxlIGVyYXNlZEludm9rZXI7Ci0gICAgLy8gRklYTUU6IGdldCByaWQgb2YKLSAgICAvKmxhenkqLyBNZXRob2RIYW5kbGUgZXJhc2VkSW52b2tlcldpdGhEcm9wczsgIC8vIGZvciBJbnZva2VHZW5lcmljCi0KLSAgICAvLyBnZW5lcmFsIGludm9rZXIgZm9yIHRoZSBvdXRnb2luZyBjYWxsCi0gICAgcHJpdmF0ZSAvKmxhenkqLyBNZXRob2RIYW5kbGUgZ2VuZXJhbEludm9rZXI7Ci0KLSAgICAvLyBnZW5lcmFsIGludm9rZXIgZm9yIHRoZSBvdXRnb2luZyBjYWxsLCB1c2VzIHZhcmFyZ3MKLSAgICBwcml2YXRlIC8qbGF6eSovIE1ldGhvZEhhbmRsZSB2YXJhcmdzSW52b2tlcjsKLQotICAgIC8vIGdlbmVyYWwgaW52b2tlciBmb3IgdGhlIG91dGdvaW5nIGNhbGw7IGFjY2VwdHMgYSB0cmFpbGluZyBPYmplY3RbXQotICAgIHByaXZhdGUgZmluYWwgLypsYXp5Ki8gTWV0aG9kSGFuZGxlW10gc3ByZWFkSW52b2tlcnM7Ci0KLSAgICAvLyBpbnZva2VyIGZvciBhbiB1bmJvdW5kIGNhbGxzaXRlCi0gICAgcHJpdmF0ZSAvKmxhenkqLyBNZXRob2RIYW5kbGUgdW5pbml0aWFsaXplZENhbGxTaXRlOworICAgIC8vIENhY2hlZCBhZGFwdGVyIGluZm9ybWF0aW9uOgorICAgIHByaXZhdGUgZmluYWwgQFN0YWJsZSBNZXRob2RIYW5kbGVbXSBpbnZva2VycyA9IG5ldyBNZXRob2RIYW5kbGVbSU5WX0xJTUlUXTsKKyAgICAvLyBJbmRleGVzIGludG8gaW52b2tlcnM6CisgICAgc3RhdGljIGZpbmFsIGludAorICAgICAgICAgICAgSU5WX0VYQUNUICAgICAgICAgID0gIDAsICAvLyBNZXRob2RIYW5kbGVzLmV4YWN0SW52b2tlcgorICAgICAgICAgICAgSU5WX0dFTkVSSUMgICAgICAgID0gIDEsICAvLyBNZXRob2RIYW5kbGVzLmludm9rZXIgKGdlbmVyaWMgaW52b2NhdGlvbikKKyAgICAgICAgICAgIElOVl9CQVNJQyAgICAgICAgICA9ICAyLCAgLy8gTWV0aG9kSGFuZGxlcy5iYXNpY0ludm9rZXIKKyAgICAgICAgICAgIElOVl9MSU1JVCAgICAgICAgICA9ICAzOwogCiAgICAgLyoqIENvbXB1dGUgYW5kIGNhY2hlIGluZm9ybWF0aW9uIGNvbW1vbiB0byBhbGwgY29sbGVjdGluZyBhZGFwdGVycwogICAgICAqICB0aGF0IGltcGxlbWVudCBtZW1iZXJzIG9mIHRoZSBlcmFzdXJlLWZhbWlseSBvZiB0aGUgZ2l2ZW4gZXJhc2VkIHR5cGUuCiAgICAgICovCiAgICAgLypub24tcHVibGljKi8gSW52b2tlcnMoTWV0aG9kVHlwZSB0YXJnZXRUeXBlKSB7CiAgICAgICAgIHRoaXMudGFyZ2V0VHlwZSA9IHRhcmdldFR5cGU7Ci0gICAgICAgIHRoaXMuc3ByZWFkSW52b2tlcnMgPSBuZXcgTWV0aG9kSGFuZGxlW3RhcmdldFR5cGUucGFyYW1ldGVyQ291bnQoKSsxXTsKICAgICB9CiAKICAgICAvKm5vbi1wdWJsaWMqLyBNZXRob2RIYW5kbGUgZXhhY3RJbnZva2VyKCkgewotICAgICAgICBNZXRob2RIYW5kbGUgaW52b2tlciA9IGV4YWN0SW52b2tlcjsKKyAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSBjYWNoZWRJbnZva2VyKElOVl9FWEFDVCk7CiAgICAgICAgIGlmIChpbnZva2VyICE9IG51bGwpICByZXR1cm4gaW52b2tlcjsKICAgICAgICAgaW52b2tlciA9IG1ha2VFeGFjdE9yR2VuZXJhbEludm9rZXIodHJ1ZSk7Ci0gICAgICAgIGV4YWN0SW52b2tlciA9IGludm9rZXI7Ci0gICAgICAgIHJldHVybiBpbnZva2VyOworICAgICAgICByZXR1cm4gc2V0Q2FjaGVkSW52b2tlcihJTlZfRVhBQ1QsIGludm9rZXIpOwogICAgIH0KIAotICAgIC8qbm9uLXB1YmxpYyovIE1ldGhvZEhhbmRsZSBnZW5lcmFsSW52b2tlcigpIHsKLSAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSBnZW5lcmFsSW52b2tlcjsKKyAgICAvKm5vbi1wdWJsaWMqLyBNZXRob2RIYW5kbGUgZ2VuZXJpY0ludm9rZXIoKSB7CisgICAgICAgIE1ldGhvZEhhbmRsZSBpbnZva2VyID0gY2FjaGVkSW52b2tlcihJTlZfR0VORVJJQyk7CiAgICAgICAgIGlmIChpbnZva2VyICE9IG51bGwpICByZXR1cm4gaW52b2tlcjsKICAgICAgICAgaW52b2tlciA9IG1ha2VFeGFjdE9yR2VuZXJhbEludm9rZXIoZmFsc2UpOwotICAgICAgICBnZW5lcmFsSW52b2tlciA9IGludm9rZXI7Ci0gICAgICAgIHJldHVybiBpbnZva2VyOworICAgICAgICByZXR1cm4gc2V0Q2FjaGVkSW52b2tlcihJTlZfR0VORVJJQywgaW52b2tlcik7CisgICAgfQorCisgICAgLypub24tcHVibGljKi8gTWV0aG9kSGFuZGxlIGJhc2ljSW52b2tlcigpIHsKKyAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSBjYWNoZWRJbnZva2VyKElOVl9CQVNJQyk7CisgICAgICAgIGlmIChpbnZva2VyICE9IG51bGwpICByZXR1cm4gaW52b2tlcjsKKyAgICAgICAgTWV0aG9kVHlwZSBiYXNpY1R5cGUgPSB0YXJnZXRUeXBlLmJhc2ljVHlwZSgpOworICAgICAgICBpZiAoYmFzaWNUeXBlICE9IHRhcmdldFR5cGUpIHsKKyAgICAgICAgICAgIC8vIGRvdWJsZSBjYWNoZTsgbm90IHVzZWQgc2lnbmlmaWNhbnRseQorICAgICAgICAgICAgcmV0dXJuIHNldENhY2hlZEludm9rZXIoSU5WX0JBU0lDLCBiYXNpY1R5cGUuaW52b2tlcnMoKS5iYXNpY0ludm9rZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaW52b2tlciA9IGJhc2ljVHlwZS5mb3JtKCkuY2FjaGVkTWV0aG9kSGFuZGxlKE1ldGhvZFR5cGVGb3JtLk1IX0JBU0lDX0lOVik7CisgICAgICAgIGlmIChpbnZva2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIE1lbWJlck5hbWUgbWV0aG9kID0gaW52b2tlQmFzaWNNZXRob2QoYmFzaWNUeXBlKTsKKyAgICAgICAgICAgIGludm9rZXIgPSBEaXJlY3RNZXRob2RIYW5kbGUubWFrZShtZXRob2QpOworICAgICAgICAgICAgYXNzZXJ0KGNoZWNrSW52b2tlcihpbnZva2VyKSk7CisgICAgICAgICAgICBpbnZva2VyID0gYmFzaWNUeXBlLmZvcm0oKS5zZXRDYWNoZWRNZXRob2RIYW5kbGUoTWV0aG9kVHlwZUZvcm0uTUhfQkFTSUNfSU5WLCBpbnZva2VyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0Q2FjaGVkSW52b2tlcihJTlZfQkFTSUMsIGludm9rZXIpOworICAgIH0KKworICAgIHByaXZhdGUgTWV0aG9kSGFuZGxlIGNhY2hlZEludm9rZXIoaW50IGlkeCkgeworICAgICAgICByZXR1cm4gaW52b2tlcnNbaWR4XTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBNZXRob2RIYW5kbGUgc2V0Q2FjaGVkSW52b2tlcihpbnQgaWR4LCBmaW5hbCBNZXRob2RIYW5kbGUgaW52b2tlcikgeworICAgICAgICAvLyBTaW11bGF0ZSBhIENBUywgdG8gYXZvaWQgcmFjeSBkdXBsaWNhdGlvbiBvZiByZXN1bHRzLgorICAgICAgICBNZXRob2RIYW5kbGUgcHJldiA9IGludm9rZXJzW2lkeF07CisgICAgICAgIGlmIChwcmV2ICE9IG51bGwpICByZXR1cm4gcHJldjsKKyAgICAgICAgcmV0dXJuIGludm9rZXJzW2lkeF0gPSBpbnZva2VyOwogICAgIH0KIAogICAgIHByaXZhdGUgTWV0aG9kSGFuZGxlIG1ha2VFeGFjdE9yR2VuZXJhbEludm9rZXIoYm9vbGVhbiBpc0V4YWN0KSB7CkBAIC05NSw3ICsxMDcsNyBAQAogICAgICAgICBMYW1iZGFGb3JtIGxmb3JtID0gaW52b2tlSGFuZGxlRm9ybShtdHlwZSwgZmFsc2UsIHdoaWNoKTsKICAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSBCb3VuZE1ldGhvZEhhbmRsZS5iaW5kU2luZ2xlKGludm9rZXJUeXBlLCBsZm9ybSwgbXR5cGUpOwogICAgICAgICBTdHJpbmcgd2hpY2hOYW1lID0gKGlzRXhhY3QgPyAiaW52b2tlRXhhY3QiIDogImludm9rZSIpOwotICAgICAgICBpbnZva2VyID0gaW52b2tlci53aXRoSW50ZXJuYWxNZW1iZXJOYW1lKE1lbWJlck5hbWUubWFrZU1ldGhvZEhhbmRsZUludm9rZSh3aGljaE5hbWUsIG10eXBlKSk7CisgICAgICAgIGludm9rZXIgPSBpbnZva2VyLndpdGhJbnRlcm5hbE1lbWJlck5hbWUoTWVtYmVyTmFtZS5tYWtlTWV0aG9kSGFuZGxlSW52b2tlKHdoaWNoTmFtZSwgbXR5cGUpLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydChjaGVja0ludm9rZXIoaW52b2tlcikpOwogICAgICAgICBtYXliZUNvbXBpbGVUb0J5dGVjb2RlKGludm9rZXIpOwogICAgICAgICByZXR1cm4gaW52b2tlcjsKQEAgLTExMCwyMSArMTIyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qbm9uLXB1YmxpYyovIE1ldGhvZEhhbmRsZSBiYXNpY0ludm9rZXIoKSB7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSBpbnZva2VyID0gYmFzaWNJbnZva2VyOwotICAgICAgICBpZiAoaW52b2tlciAhPSBudWxsKSAgcmV0dXJuIGludm9rZXI7Ci0gICAgICAgIE1ldGhvZFR5cGUgYmFzaWNUeXBlID0gdGFyZ2V0VHlwZS5iYXNpY1R5cGUoKTsKLSAgICAgICAgaWYgKGJhc2ljVHlwZSAhPSB0YXJnZXRUeXBlKSB7Ci0gICAgICAgICAgICAvLyBkb3VibGUgY2FjaGU7IG5vdCB1c2VkIHNpZ25pZmljYW50bHkKLSAgICAgICAgICAgIHJldHVybiBiYXNpY0ludm9rZXIgPSBiYXNpY1R5cGUuaW52b2tlcnMoKS5iYXNpY0ludm9rZXIoKTsKLSAgICAgICAgfQotICAgICAgICBNZW1iZXJOYW1lIG1ldGhvZCA9IGludm9rZUJhc2ljTWV0aG9kKGJhc2ljVHlwZSk7Ci0gICAgICAgIGludm9rZXIgPSBEaXJlY3RNZXRob2RIYW5kbGUubWFrZShtZXRob2QpOwotICAgICAgICBhc3NlcnQoY2hlY2tJbnZva2VyKGludm9rZXIpKTsKLSAgICAgICAgYmFzaWNJbnZva2VyID0gaW52b2tlcjsKLSAgICAgICAgcmV0dXJuIGludm9rZXI7Ci0gICAgfQotCiAgICAgLy8gVGhpcyBuZXh0IG9uZSBpcyBjYWxsZWQgZnJvbSBMYW1iZGFGb3JtLk5hbWVkRnVuY3Rpb24uPGluaXQ+LgogICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYyBNZW1iZXJOYW1lIGludm9rZUJhc2ljTWV0aG9kKE1ldGhvZFR5cGUgYmFzaWNUeXBlKSB7CiAgICAgICAgIGFzc2VydChiYXNpY1R5cGUgPT0gYmFzaWNUeXBlLmJhc2ljVHlwZSgpKTsKQEAgLTE0NSw4NyArMTQyLDQyIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8vIEZJWE1FOiBnZXQgcmlkIG9mCi0gICAgLypub24tcHVibGljKi8gTWV0aG9kSGFuZGxlIGVyYXNlZEludm9rZXIoKSB7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSB4aW52b2tlciA9IGV4YWN0SW52b2tlcigpOwotICAgICAgICBNZXRob2RIYW5kbGUgaW52b2tlciA9IGVyYXNlZEludm9rZXI7Ci0gICAgICAgIGlmIChpbnZva2VyICE9IG51bGwpICByZXR1cm4gaW52b2tlcjsKLSAgICAgICAgTWV0aG9kVHlwZSBlcmFzZWRUeXBlID0gdGFyZ2V0VHlwZS5lcmFzZSgpOwotICAgICAgICBpbnZva2VyID0geGludm9rZXIuYXNUeXBlKGVyYXNlZFR5cGUuaW52b2tlclR5cGUoKSk7Ci0gICAgICAgIGVyYXNlZEludm9rZXIgPSBpbnZva2VyOwotICAgICAgICByZXR1cm4gaW52b2tlcjsKLSAgICB9Ci0KKyAgICAvKioKKyAgICAgKiBGaW5kIG9yIGNyZWF0ZSBhbiBpbnZva2VyIHdoaWNoIHBhc3NlcyB1bmNoYW5nZWQgYSBnaXZlbiBudW1iZXIgb2YgYXJndW1lbnRzCisgICAgICogYW5kIHNwcmVhZHMgdGhlIHJlc3QgZnJvbSBhIHRyYWlsaW5nIGFycmF5IGFyZ3VtZW50LgorICAgICAqIFRoZSBpbnZva2VyIHRhcmdldCB0eXBlIGlzIHRoZSBwb3N0LXNwcmVhZCB0eXBlIHtAY29kZSAoVFlQRU9GKHVhcmcqKSwgVFlQRU9GKHNhcmcqKSk9PlJUfS4KKyAgICAgKiBBbGwgdGhlIHtAY29kZSBzYXJnfXMgbXVzdCBoYXZlIGEgY29tbW9uIHR5cGUge0Bjb2RlIEN9LiAgKElmIHRoZXJlIGFyZSBub25lLCB7QGNvZGUgT2JqZWN0fSBpcyBhc3N1bWVkLn0KKyAgICAgKiBAcGFyYW0gbGVhZGluZ0FyZ0NvdW50IHRoZSBudW1iZXIgb2YgdW5jaGFuZ2VkIChub24tc3ByZWFkKSBhcmd1bWVudHMKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBpbnZva2VyLmludm9rZUV4YWN0KG1oLCB1YXJnKiwgQ1tde3NhcmcqfSkgOj0gKFJUKW1oLmludm9rZSh1YXJnKiwgc2FyZyopfQorICAgICAqLwogICAgIC8qbm9uLXB1YmxpYyovIE1ldGhvZEhhbmRsZSBzcHJlYWRJbnZva2VyKGludCBsZWFkaW5nQXJnQ291bnQpIHsKLSAgICAgICAgTWV0aG9kSGFuZGxlIHZhSW52b2tlciA9IHNwcmVhZEludm9rZXJzW2xlYWRpbmdBcmdDb3VudF07Ci0gICAgICAgIGlmICh2YUludm9rZXIgIT0gbnVsbCkgIHJldHVybiB2YUludm9rZXI7CiAgICAgICAgIGludCBzcHJlYWRBcmdDb3VudCA9IHRhcmdldFR5cGUucGFyYW1ldGVyQ291bnQoKSAtIGxlYWRpbmdBcmdDb3VudDsKLSAgICAgICAgTWV0aG9kVHlwZSBzcHJlYWRJbnZva2VyVHlwZSA9IHRhcmdldFR5cGUKLSAgICAgICAgICAgIC5yZXBsYWNlUGFyYW1ldGVyVHlwZXMobGVhZGluZ0FyZ0NvdW50LCB0YXJnZXRUeXBlLnBhcmFtZXRlckNvdW50KCksIE9iamVjdFtdLmNsYXNzKTsKLSAgICAgICAgaWYgKHRhcmdldFR5cGUucGFyYW1ldGVyU2xvdENvdW50KCkgPD0gTWV0aG9kVHlwZS5NQVhfTUhfSU5WT0tFUl9BUklUWSkgewotICAgICAgICAgICAgLy8gRmFjdG9yIHNpbnZva2VyLmludm9rZShtaCwgYSkgaW50byBnaW52b2tlci5hc1NwcmVhZGVyKCkuaW52b2tlKG1oLCBhKQotICAgICAgICAgICAgLy8gd2hlcmUgZ2ludm9rZXIuaW52b2tlKG1oLCBhKikgPT4gbWguaW52b2tlKGEqKS4KLSAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBnZW5JbnZva2VyID0gZ2VuZXJhbEludm9rZXIoKTsKLSAgICAgICAgICAgIHZhSW52b2tlciA9IGdlbkludm9rZXIuYXNTcHJlYWRlcihPYmplY3RbXS5jbGFzcywgc3ByZWFkQXJnQ291bnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQ2Fubm90IGJ1aWxkIGEgZ2VuZXJhbCBpbnZva2VyIGhlcmUgb2YgdHlwZSBnaW52b2tlci5pbnZva2UobWgsIGEqWzI1NF0pLgotICAgICAgICAgICAgLy8gSW5zdGVhZCwgZmFjdG9yIHNpbnZva2VyLmludm9rZShtaCwgYSkgaW50byBhaW52b2tlci5pbnZva2UoZmlsdGVyKG1oKSwgYSkKLSAgICAgICAgICAgIC8vIHdoZXJlIGZpbHRlcihtaCkgPT0gbWguYXNTcHJlYWRlcihPYmplY3RbXSwgc3ByZWFkQXJnQ291bnQpCi0gICAgICAgICAgICBNZXRob2RIYW5kbGUgYXJyYXlJbnZva2VyID0gTWV0aG9kSGFuZGxlcy5leGFjdEludm9rZXIoc3ByZWFkSW52b2tlclR5cGUpOwotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1ha2VTcHJlYWRlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwcmVhZGVyID0gSU1QTF9MT09LVVAKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRWaXJ0dWFsKE1ldGhvZEhhbmRsZS5jbGFzcywgImFzU3ByZWFkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZS5tZXRob2RUeXBlKE1ldGhvZEhhbmRsZS5jbGFzcywgQ2xhc3MuY2xhc3MsIGludC5jbGFzcykpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFrZVNwcmVhZGVyID0gTWV0aG9kSGFuZGxlcy5pbnNlcnRBcmd1bWVudHMobWFrZVNwcmVhZGVyLCAxLCBPYmplY3RbXS5jbGFzcywgc3ByZWFkQXJnQ291bnQpOwotICAgICAgICAgICAgdmFJbnZva2VyID0gTWV0aG9kSGFuZGxlcy5maWx0ZXJBcmd1bWVudChhcnJheUludm9rZXIsIDAsIG1ha2VTcHJlYWRlcik7CisgICAgICAgIE1ldGhvZFR5cGUgcG9zdFNwcmVhZFR5cGUgPSB0YXJnZXRUeXBlOworICAgICAgICBDbGFzczw/PiBhcmdBcnJheVR5cGUgPSBpbXBsaWVkUmVzdGFyZ1R5cGUocG9zdFNwcmVhZFR5cGUsIGxlYWRpbmdBcmdDb3VudCk7CisgICAgICAgIGlmIChwb3N0U3ByZWFkVHlwZS5wYXJhbWV0ZXJTbG90Q291bnQoKSA8PSBNZXRob2RUeXBlLk1BWF9NSF9JTlZPS0VSX0FSSVRZKSB7CisgICAgICAgICAgICByZXR1cm4gZ2VuZXJpY0ludm9rZXIoKS5hc1NwcmVhZGVyKGFyZ0FycmF5VHlwZSwgc3ByZWFkQXJnQ291bnQpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydCh2YUludm9rZXIudHlwZSgpLmVxdWFscyhzcHJlYWRJbnZva2VyVHlwZS5pbnZva2VyVHlwZSgpKSk7Ci0gICAgICAgIG1heWJlQ29tcGlsZVRvQnl0ZWNvZGUodmFJbnZva2VyKTsKLSAgICAgICAgc3ByZWFkSW52b2tlcnNbbGVhZGluZ0FyZ0NvdW50XSA9IHZhSW52b2tlcjsKLSAgICAgICAgcmV0dXJuIHZhSW52b2tlcjsKKyAgICAgICAgLy8gQ2Fubm90IGJ1aWxkIGEgZ2VuZXJpYyBpbnZva2VyIGhlcmUgb2YgdHlwZSBnaW52b2tlci5pbnZva2UobWgsIGEqWzI1NF0pLgorICAgICAgICAvLyBJbnN0ZWFkLCBmYWN0b3Igc2ludm9rZXIuaW52b2tlKG1oLCBhKSBpbnRvIGFpbnZva2VyLmludm9rZShmaWx0ZXIobWgpLCBhKQorICAgICAgICAvLyB3aGVyZSBmaWx0ZXIobWgpID09IG1oLmFzU3ByZWFkZXIoT2JqZWN0W10sIHNwcmVhZEFyZ0NvdW50KQorICAgICAgICBNZXRob2RUeXBlIHByZVNwcmVhZFR5cGUgPSBwb3N0U3ByZWFkVHlwZQorICAgICAgICAgICAgLnJlcGxhY2VQYXJhbWV0ZXJUeXBlcyhsZWFkaW5nQXJnQ291bnQsIHBvc3RTcHJlYWRUeXBlLnBhcmFtZXRlckNvdW50KCksIGFyZ0FycmF5VHlwZSk7CisgICAgICAgIE1ldGhvZEhhbmRsZSBhcnJheUludm9rZXIgPSBNZXRob2RIYW5kbGVzLmludm9rZXIocHJlU3ByZWFkVHlwZSk7CisgICAgICAgIE1ldGhvZEhhbmRsZSBtYWtlU3ByZWFkZXIgPSBNZXRob2RIYW5kbGVzLmluc2VydEFyZ3VtZW50cyhMYXp5Lk1IX2FzU3ByZWFkZXIsIDEsIGFyZ0FycmF5VHlwZSwgc3ByZWFkQXJnQ291bnQpOworICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlcy5maWx0ZXJBcmd1bWVudChhcnJheUludm9rZXIsIDAsIG1ha2VTcHJlYWRlcik7CiAgICAgfQogCi0gICAgLypub24tcHVibGljKi8gTWV0aG9kSGFuZGxlIHZhcmFyZ3NJbnZva2VyKCkgewotICAgICAgICBNZXRob2RIYW5kbGUgdmFJbnZva2VyID0gdmFyYXJnc0ludm9rZXI7Ci0gICAgICAgIGlmICh2YUludm9rZXIgIT0gbnVsbCkgIHJldHVybiB2YUludm9rZXI7Ci0gICAgICAgIHZhSW52b2tlciA9IHNwcmVhZEludm9rZXIoMCkuYXNUeXBlKE1ldGhvZFR5cGUuZ2VuZXJpY01ldGhvZFR5cGUoMCwgdHJ1ZSkuaW52b2tlclR5cGUoKSk7Ci0gICAgICAgIHZhcmFyZ3NJbnZva2VyID0gdmFJbnZva2VyOwotICAgICAgICByZXR1cm4gdmFJbnZva2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBUSFJPV19VQ1MgPSBudWxsOwotCi0gICAgLypub24tcHVibGljKi8gTWV0aG9kSGFuZGxlIHVuaW5pdGlhbGl6ZWRDYWxsU2l0ZSgpIHsKLSAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSB1bmluaXRpYWxpemVkQ2FsbFNpdGU7Ci0gICAgICAgIGlmIChpbnZva2VyICE9IG51bGwpICByZXR1cm4gaW52b2tlcjsKLSAgICAgICAgaWYgKHRhcmdldFR5cGUucGFyYW1ldGVyQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIE1ldGhvZFR5cGUgdHlwZTAgPSB0YXJnZXRUeXBlLmRyb3BQYXJhbWV0ZXJUeXBlcygwLCB0YXJnZXRUeXBlLnBhcmFtZXRlckNvdW50KCkpOwotICAgICAgICAgICAgSW52b2tlcnMgaW52b2tlcnMwID0gdHlwZTAuaW52b2tlcnMoKTsKLSAgICAgICAgICAgIGludm9rZXIgPSBNZXRob2RIYW5kbGVzLmRyb3BBcmd1bWVudHMoaW52b2tlcnMwLnVuaW5pdGlhbGl6ZWRDYWxsU2l0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB0YXJnZXRUeXBlLnBhcmFtZXRlckxpc3QoKSk7Ci0gICAgICAgICAgICBhc3NlcnQoaW52b2tlci50eXBlKCkuZXF1YWxzKHRhcmdldFR5cGUpKTsKLSAgICAgICAgICAgIHVuaW5pdGlhbGl6ZWRDYWxsU2l0ZSA9IGludm9rZXI7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBpbXBsaWVkUmVzdGFyZ1R5cGUoTWV0aG9kVHlwZSByZXN0YXJnVHlwZSwgaW50IGZyb21Qb3MpIHsKKyAgICAgICAgaWYgKHJlc3RhcmdUeXBlLmlzR2VuZXJpYygpKSAgcmV0dXJuIE9iamVjdFtdLmNsYXNzOyAgLy8gY2FuIGJlIG5vdGhpbmcgZWxzZQorICAgICAgICBpbnQgbWF4UG9zID0gcmVzdGFyZ1R5cGUucGFyYW1ldGVyQ291bnQoKTsKKyAgICAgICAgaWYgKGZyb21Qb3MgPj0gbWF4UG9zKSAgcmV0dXJuIE9iamVjdFtdLmNsYXNzOyAgLy8gcmVhc29uYWJsZSBkZWZhdWx0CisgICAgICAgIENsYXNzPD8+IGFyZ1R5cGUgPSByZXN0YXJnVHlwZS5wYXJhbWV0ZXJUeXBlKGZyb21Qb3MpOworICAgICAgICBmb3IgKGludCBpID0gZnJvbVBvcysxOyBpIDwgbWF4UG9zOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHJlc3RhcmdUeXBlLnBhcmFtZXRlclR5cGUoaSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZWVkIGhvbW9nZW5lb3VzIHJlc3QgYXJndW1lbnRzIiwgcmVzdGFyZ1R5cGUpOwogICAgICAgICB9Ci0gICAgICAgIGludm9rZXIgPSBUSFJPV19VQ1M7Ci0gICAgICAgIGlmIChpbnZva2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVEhST1dfVUNTID0gaW52b2tlciA9IElNUExfTE9PS1VQCi0gICAgICAgICAgICAgICAgICAgIC5maW5kU3RhdGljKENhbGxTaXRlLmNsYXNzLCAidW5pbml0aWFsaXplZENhbGxTaXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZS5tZXRob2RUeXBlKEVtcHR5LmNsYXNzKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcihleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW52b2tlciA9IE1ldGhvZEhhbmRsZXMuZXhwbGljaXRDYXN0QXJndW1lbnRzKGludm9rZXIsIE1ldGhvZFR5cGUubWV0aG9kVHlwZSh0YXJnZXRUeXBlLnJldHVyblR5cGUoKSkpOwotICAgICAgICBpbnZva2VyID0gaW52b2tlci5kcm9wQXJndW1lbnRzKHRhcmdldFR5cGUsIDAsIHRhcmdldFR5cGUucGFyYW1ldGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChpbnZva2VyLnR5cGUoKS5lcXVhbHModGFyZ2V0VHlwZSkpOwotICAgICAgICB1bmluaXRpYWxpemVkQ2FsbFNpdGUgPSBpbnZva2VyOwotICAgICAgICByZXR1cm4gaW52b2tlcjsKKyAgICAgICAgaWYgKGFyZ1R5cGUgPT0gT2JqZWN0LmNsYXNzKSAgcmV0dXJuIE9iamVjdFtdLmNsYXNzOworICAgICAgICByZXR1cm4gQXJyYXkubmV3SW5zdGFuY2UoYXJnVHlwZSwgMCkuZ2V0Q2xhc3MoKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMzA4LDcgKzI2MCw5IEBACiAgICAgICAgICAgICAgICAgOiBBcnJheXMuYXNMaXN0KG10eXBlLCBjdXN0b21pemVkLCB3aGljaCwgbmFtZUN1cnNvciwgbmFtZXMubGVuZ3RoKTsKICAgICAgICAgaWYgKE1UWVBFX0FSRyA+PSBJTkFSR19MSU1JVCkgewogICAgICAgICAgICAgYXNzZXJ0KG5hbWVzW01UWVBFX0FSR10gPT0gbnVsbCk7Ci0gICAgICAgICAgICBOYW1lZEZ1bmN0aW9uIGdldHRlciA9IEJvdW5kTWV0aG9kSGFuZGxlLmdldFNwZWNpZXNEYXRhKCJMIikuZ2V0dGVyRnVuY3Rpb24oMCk7CisgICAgICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSBzcGVjaWVzRGF0YSA9IEJvdW5kTWV0aG9kSGFuZGxlLnNwZWNpZXNEYXRhX0woKTsKKyAgICAgICAgICAgIG5hbWVzW1RISVNfTUhdID0gbmFtZXNbVEhJU19NSF0ud2l0aENvbnN0cmFpbnQoc3BlY2llc0RhdGEpOworICAgICAgICAgICAgTmFtZWRGdW5jdGlvbiBnZXR0ZXIgPSBzcGVjaWVzRGF0YS5nZXR0ZXJGdW5jdGlvbigwKTsKICAgICAgICAgICAgIG5hbWVzW01UWVBFX0FSR10gPSBuZXcgTmFtZShnZXR0ZXIsIG5hbWVzW1RISVNfTUhdKTsKICAgICAgICAgICAgIC8vIGVsc2UgaWYgaXNMaW5rZXIsIHRoZW4gTVRZUEUgaXMgcGFzc2VkIGluIGZyb20gdGhlIGNhbGxlciAoZS5nLiwgdGhlIEpWTSkKICAgICAgICAgfQpAQCAtMzYwLDkgKzMxNCw2IEBACiAgICAgT2JqZWN0IGNoZWNrR2VuZXJpY1R5cGUoT2JqZWN0IG1oT2JqLCBPYmplY3QgZXhwZWN0ZWRPYmopIHsKICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gKE1ldGhvZEhhbmRsZSkgbWhPYmo7CiAgICAgICAgIE1ldGhvZFR5cGUgZXhwZWN0ZWQgPSAoTWV0aG9kVHlwZSkgZXhwZWN0ZWRPYmo7Ci0gICAgICAgIGlmIChtaC50eXBlKCkgPT0gZXhwZWN0ZWQpICByZXR1cm4gbWg7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSBhdGMgPSBtaC5hc1R5cGVDYWNoZTsKLSAgICAgICAgaWYgKGF0YyAhPSBudWxsICYmIGF0Yy50eXBlKCkgPT0gZXhwZWN0ZWQpICByZXR1cm4gYXRjOwogICAgICAgICByZXR1cm4gbWguYXNUeXBlKGV4cGVjdGVkKTsKICAgICAgICAgLyogTWF5YmUgYWRkIG1vcmUgcGF0aHMgaGVyZS4gIFBvc3NpYmxlIG9wdGltaXphdGlvbnM6CiAgICAgICAgICAqIGZvciAoUilNSC5pbnZva2UoYSopLApAQCAtNDM2LDI3ICszODcsNDAgQEAKICAgICB9CiAKICAgICAvLyBMb2NhbCBjb25zdGFudCBmdW5jdGlvbnM6Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZWRGdW5jdGlvbiBORl9jaGVja0V4YWN0VHlwZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lZEZ1bmN0aW9uIE5GX2NoZWNrR2VuZXJpY1R5cGU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZWRGdW5jdGlvbiBORl9hc1R5cGU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZWRGdW5jdGlvbiBORl9nZXRDYWxsU2l0ZVRhcmdldDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lZEZ1bmN0aW9uCisgICAgICAgIE5GX2NoZWNrRXhhY3RUeXBlLAorICAgICAgICBORl9jaGVja0dlbmVyaWNUeXBlLAorICAgICAgICBORl9nZXRDYWxsU2l0ZVRhcmdldDsKICAgICBzdGF0aWMgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgTkZfY2hlY2tFeGFjdFR5cGUgPSBuZXcgTmFtZWRGdW5jdGlvbihJbnZva2Vycy5jbGFzcwotICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2QoImNoZWNrRXhhY3RUeXBlIiwgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpKTsKLSAgICAgICAgICAgIE5GX2NoZWNrR2VuZXJpY1R5cGUgPSBuZXcgTmFtZWRGdW5jdGlvbihJbnZva2Vycy5jbGFzcwotICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2QoImNoZWNrR2VuZXJpY1R5cGUiLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcykpOwotICAgICAgICAgICAgTkZfYXNUeXBlID0gbmV3IE5hbWVkRnVuY3Rpb24oTWV0aG9kSGFuZGxlLmNsYXNzCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZWNsYXJlZE1ldGhvZCgiYXNUeXBlIiwgTWV0aG9kVHlwZS5jbGFzcykpOwotICAgICAgICAgICAgTkZfZ2V0Q2FsbFNpdGVUYXJnZXQgPSBuZXcgTmFtZWRGdW5jdGlvbihJbnZva2Vycy5jbGFzcwotICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2QoImdldENhbGxTaXRlVGFyZ2V0IiwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICAgICAgICBORl9jaGVja0V4YWN0VHlwZS5yZXNvbHZlKCk7Ci0gICAgICAgICAgICBORl9jaGVja0dlbmVyaWNUeXBlLnJlc29sdmUoKTsKLSAgICAgICAgICAgIE5GX2dldENhbGxTaXRlVGFyZ2V0LnJlc29sdmUoKTsKLSAgICAgICAgICAgIC8vIGJvdW5kCisgICAgICAgICAgICBOYW1lZEZ1bmN0aW9uIG5mc1tdID0geworICAgICAgICAgICAgICAgIE5GX2NoZWNrRXhhY3RUeXBlID0gbmV3IE5hbWVkRnVuY3Rpb24oSW52b2tlcnMuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWNsYXJlZE1ldGhvZCgiY2hlY2tFeGFjdFR5cGUiLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcykpLAorICAgICAgICAgICAgICAgIE5GX2NoZWNrR2VuZXJpY1R5cGUgPSBuZXcgTmFtZWRGdW5jdGlvbihJbnZva2Vycy5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlY2xhcmVkTWV0aG9kKCJjaGVja0dlbmVyaWNUeXBlIiwgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpKSwKKyAgICAgICAgICAgICAgICBORl9nZXRDYWxsU2l0ZVRhcmdldCA9IG5ldyBOYW1lZEZ1bmN0aW9uKEludm9rZXJzLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2QoImdldENhbGxTaXRlVGFyZ2V0IiwgT2JqZWN0LmNsYXNzKSkKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBmb3IgKE5hbWVkRnVuY3Rpb24gbmYgOiBuZnMpIHsKKyAgICAgICAgICAgICAgICAvLyBFYWNoIG5mIG11c3QgYmUgc3RhdGljYWxseSBpbnZvY2FibGUgb3Igd2UgZ2V0IHRpZWQgdXAgaW4gb3VyIGJvb3RzdHJhcHMuCisgICAgICAgICAgICAgICAgYXNzZXJ0KEludm9rZXJCeXRlY29kZUdlbmVyYXRvci5pc1N0YXRpY2FsbHlJbnZvY2FibGUobmYubWVtYmVyKSkgOiBuZjsKKyAgICAgICAgICAgICAgICBuZi5yZXNvbHZlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoZXgpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGF6eSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZSBNSF9hc1NwcmVhZGVyOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1IX2FzU3ByZWFkZXIgPSBJTVBMX0xPT0tVUC5maW5kVmlydHVhbChNZXRob2RIYW5kbGUuY2xhc3MsICJhc1NwcmVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUubWV0aG9kVHlwZShNZXRob2RIYW5kbGUuY2xhc3MsIENsYXNzLmNsYXNzLCBpbnQuY2xhc3MpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTGFtYmRhRm9ybS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9MYW1iZGFGb3JtLmphdmEKaW5kZXggYTgyOTFlMi4uYjgzMDQwNiAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9MYW1iZGFGb3JtLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9MYW1iZGFGb3JtLmphdmEKQEAgLTI3LDE3ICsyNywxNiBAQAogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uKjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKIGltcG9ydCBzdW4uaW52b2tlLnV0aWwuV3JhcHBlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uQmFzaWNUeXBlLio7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlU3RhdGljcy4qOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZU5hdGl2ZXMuQ29uc3RhbnRzLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIC8qKgogICogVGhlIHN5bWJvbGljLCBub24tZXhlY3V0YWJsZSBmb3JtIG9mIGEgbWV0aG9kIGhhbmRsZSdzIGludm9jYXRpb24gc2VtYW50aWNzLgpAQCAtMTI1LDE5ICsxMjQsMTM2IEBACiAgICAgTWVtYmVyTmFtZSB2bWVudHJ5OyAgIC8vIGxvdy1sZXZlbCBiZWhhdmlvciwgb3IgbnVsbCBpZiBub3QgeWV0IHByZXBhcmVkCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGlsZWQ7CiAKLSAgICAvLyBDYWNoZXMgZm9yIGNvbW1vbiBzdHJ1Y3R1cmFsIHRyYW5zZm9ybXM6Ci0gICAgTGFtYmRhRm9ybVtdIGJpbmRDYWNoZTsKKyAgICBPYmplY3QgdHJhbnNmb3JtQ2FjaGU7ICAvLyBtYW5hZ2VkIGJ5IExhbWJkYUZvcm1FZGl0b3IKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPSURfUkVTVUxUID0gLTEsIExBU1RfUkVTVUxUID0gLTI7CiAKKyAgICBlbnVtIEJhc2ljVHlwZSB7CisgICAgICAgIExfVFlQRSgnTCcsIE9iamVjdC5jbGFzcywgV3JhcHBlci5PQkpFQ1QpLCAgLy8gYWxsIHJlZmVyZW5jZSB0eXBlcworICAgICAgICBJX1RZUEUoJ0knLCBpbnQuY2xhc3MsICAgIFdyYXBwZXIuSU5UKSwKKyAgICAgICAgSl9UWVBFKCdKJywgbG9uZy5jbGFzcywgICBXcmFwcGVyLkxPTkcpLAorICAgICAgICBGX1RZUEUoJ0YnLCBmbG9hdC5jbGFzcywgIFdyYXBwZXIuRkxPQVQpLAorICAgICAgICBEX1RZUEUoJ0QnLCBkb3VibGUuY2xhc3MsIFdyYXBwZXIuRE9VQkxFKSwgIC8vIGFsbCBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgVl9UWVBFKCdWJywgdm9pZC5jbGFzcywgICBXcmFwcGVyLlZPSUQpOyAgICAvLyBub3QgdmFsaWQgaW4gYWxsIGNvbnRleHRzCisKKyAgICAgICAgc3RhdGljIGZpbmFsIEJhc2ljVHlwZVtdIEFMTF9UWVBFUyA9IEJhc2ljVHlwZS52YWx1ZXMoKTsKKyAgICAgICAgc3RhdGljIGZpbmFsIEJhc2ljVHlwZVtdIEFSR19UWVBFUyA9IEFycmF5cy5jb3B5T2YoQUxMX1RZUEVTLCBBTExfVFlQRVMubGVuZ3RoLTEpOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQVJHX1RZUEVfTElNSVQgPSBBUkdfVFlQRVMubGVuZ3RoOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFRZUEVfTElNSVQgPSBBTExfVFlQRVMubGVuZ3RoOworCisgICAgICAgIHByaXZhdGUgZmluYWwgY2hhciBidENoYXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gYnRDbGFzczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXcmFwcGVyIGJ0V3JhcHBlcjsKKworICAgICAgICBwcml2YXRlIEJhc2ljVHlwZShjaGFyIGJ0Q2hhciwgQ2xhc3M8Pz4gYnRDbGFzcywgV3JhcHBlciB3cmFwcGVyKSB7CisgICAgICAgICAgICB0aGlzLmJ0Q2hhciA9IGJ0Q2hhcjsKKyAgICAgICAgICAgIHRoaXMuYnRDbGFzcyA9IGJ0Q2xhc3M7CisgICAgICAgICAgICB0aGlzLmJ0V3JhcHBlciA9IHdyYXBwZXI7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGJhc2ljVHlwZUNoYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gYnRDaGFyOworICAgICAgICB9CisgICAgICAgIENsYXNzPD8+IGJhc2ljVHlwZUNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIGJ0Q2xhc3M7CisgICAgICAgIH0KKyAgICAgICAgV3JhcHBlciBiYXNpY1R5cGVXcmFwcGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGJ0V3JhcHBlcjsKKyAgICAgICAgfQorICAgICAgICBpbnQgYmFzaWNUeXBlU2xvdHMoKSB7CisgICAgICAgICAgICByZXR1cm4gYnRXcmFwcGVyLnN0YWNrU2xvdHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBCYXNpY1R5cGUgYmFzaWNUeXBlKGJ5dGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIEFMTF9UWVBFU1t0eXBlXTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgQmFzaWNUeXBlIGJhc2ljVHlwZShjaGFyIHR5cGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ0wnOiByZXR1cm4gTF9UWVBFOworICAgICAgICAgICAgICAgIGNhc2UgJ0knOiByZXR1cm4gSV9UWVBFOworICAgICAgICAgICAgICAgIGNhc2UgJ0onOiByZXR1cm4gSl9UWVBFOworICAgICAgICAgICAgICAgIGNhc2UgJ0YnOiByZXR1cm4gRl9UWVBFOworICAgICAgICAgICAgICAgIGNhc2UgJ0QnOiByZXR1cm4gRF9UWVBFOworICAgICAgICAgICAgICAgIGNhc2UgJ1YnOiByZXR1cm4gVl9UWVBFOworICAgICAgICAgICAgICAgIC8vIGFsbCBzdWJ3b3JkIHR5cGVzIGFyZSByZXByZXNlbnRlZCBhcyBpbnRzCisgICAgICAgICAgICAgICAgY2FzZSAnWic6CisgICAgICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJX1RZUEU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcigiVW5rbm93biB0eXBlIGNoYXI6ICciK3R5cGUrIiciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgQmFzaWNUeXBlIGJhc2ljVHlwZShXcmFwcGVyIHR5cGUpIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHR5cGUuYmFzaWNUeXBlQ2hhcigpOworICAgICAgICAgICAgcmV0dXJuIGJhc2ljVHlwZShjKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgQmFzaWNUeXBlIGJhc2ljVHlwZShDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICBpZiAoIXR5cGUuaXNQcmltaXRpdmUoKSkgIHJldHVybiBMX1RZUEU7CisgICAgICAgICAgICByZXR1cm4gYmFzaWNUeXBlKFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZSh0eXBlKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2hhciBiYXNpY1R5cGVDaGFyKENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNpY1R5cGUodHlwZSkuYnRDaGFyOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBCYXNpY1R5cGVbXSBiYXNpY1R5cGVzKExpc3Q8Q2xhc3M8Pz4+IHR5cGVzKSB7CisgICAgICAgICAgICBCYXNpY1R5cGVbXSBidHlwZXMgPSBuZXcgQmFzaWNUeXBlW3R5cGVzLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ0eXBlc1tpXSA9IGJhc2ljVHlwZSh0eXBlcy5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ0eXBlczsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgQmFzaWNUeXBlW10gYmFzaWNUeXBlcyhTdHJpbmcgdHlwZXMpIHsKKyAgICAgICAgICAgIEJhc2ljVHlwZVtdIGJ0eXBlcyA9IG5ldyBCYXNpY1R5cGVbdHlwZXMubGVuZ3RoKCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidHlwZXNbaV0gPSBiYXNpY1R5cGUodHlwZXMuY2hhckF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidHlwZXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIGJ5dGVbXSBiYXNpY1R5cGVzT3JkKEJhc2ljVHlwZVtdIGJ0eXBlcykgeworICAgICAgICAgICAgYnl0ZVtdIG9yZHMgPSBuZXcgYnl0ZVtidHlwZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3Jkc1tpXSA9IChieXRlKWJ0eXBlc1tpXS5vcmRpbmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb3JkczsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgYm9vbGVhbiBpc0Jhc2ljVHlwZUNoYXIoY2hhciBjKSB7CisgICAgICAgICAgICByZXR1cm4gIkxJSkZEViIuaW5kZXhPZihjKSA+PSAwOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBib29sZWFuIGlzQXJnQmFzaWNUeXBlQ2hhcihjaGFyIGMpIHsKKyAgICAgICAgICAgIHJldHVybiAiTElKRkQiLmluZGV4T2YoYykgPj0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB7IGFzc2VydChjaGVja0Jhc2ljVHlwZSgpKTsgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQmFzaWNUeXBlKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUkdfVFlQRV9MSU1JVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IEFSR19UWVBFU1tpXS5vcmRpbmFsKCkgPT0gaTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgQVJHX1RZUEVTW2ldID09IEFMTF9UWVBFU1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVFlQRV9MSU1JVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IEFMTF9UWVBFU1tpXS5vcmRpbmFsKCkgPT0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBBTExfVFlQRVNbVFlQRV9MSU1JVCAtIDFdID09IFZfVFlQRTsKKyAgICAgICAgICAgIGFzc2VydCAhQXJyYXlzLmFzTGlzdChBUkdfVFlQRVMpLmNvbnRhaW5zKFZfVFlQRSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIExhbWJkYUZvcm0oU3RyaW5nIGRlYnVnTmFtZSwKICAgICAgICAgICAgICAgIGludCBhcml0eSwgTmFtZVtdIG5hbWVzLCBpbnQgcmVzdWx0KSB7CiAgICAgICAgIGFzc2VydChuYW1lc09LKGFyaXR5LCBuYW1lcykpOwogICAgICAgICB0aGlzLmFyaXR5ID0gYXJpdHk7CiAgICAgICAgIHRoaXMucmVzdWx0ID0gZml4UmVzdWx0KHJlc3VsdCwgbmFtZXMpOwogICAgICAgICB0aGlzLm5hbWVzID0gbmFtZXMuY2xvbmUoKTsKLSAgICAgICAgdGhpcy5kZWJ1Z05hbWUgPSBkZWJ1Z05hbWU7Ci0gICAgICAgIG5vcm1hbGl6ZSgpOworICAgICAgICB0aGlzLmRlYnVnTmFtZSA9IGZpeERlYnVnTmFtZShkZWJ1Z05hbWUpOworICAgICAgICBpbnQgbWF4T3V0QXJpdHkgPSBub3JtYWxpemUoKTsKKyAgICAgICAgaWYgKG1heE91dEFyaXR5ID4gTWV0aG9kVHlwZS5NQVhfTUhfSU5WT0tFUl9BUklUWSkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBMRiBpbnRlcnByZXRlciBvbiB2ZXJ5IGhpZ2ggYXJpdHkgZXhwcmVzc2lvbnMuCisgICAgICAgICAgICBhc3NlcnQobWF4T3V0QXJpdHkgPD0gTWV0aG9kVHlwZS5NQVhfSlZNX0FSSVRZKTsKKyAgICAgICAgICAgIGNvbXBpbGVUb0J5dGVjb2RlKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBMYW1iZGFGb3JtKFN0cmluZyBkZWJ1Z05hbWUsCkBAIC0xNjgsMTIgKzI4NCwxMiBAQAogICAgICAgICAvLyBDYWxsZWQgb25seSBmcm9tIGdldFByZXBhcmVkRm9ybS4KICAgICAgICAgYXNzZXJ0KGlzVmFsaWRTaWduYXR1cmUoc2lnKSk7CiAgICAgICAgIHRoaXMuYXJpdHkgPSBzaWduYXR1cmVBcml0eShzaWcpOwotICAgICAgICB0aGlzLnJlc3VsdCA9IChzaWduYXR1cmVSZXR1cm4oc2lnKSA9PSAnVicgPyAtMSA6IGFyaXR5KTsKKyAgICAgICAgdGhpcy5yZXN1bHQgPSAoc2lnbmF0dXJlUmV0dXJuKHNpZykgPT0gVl9UWVBFID8gLTEgOiBhcml0eSk7CiAgICAgICAgIHRoaXMubmFtZXMgPSBidWlsZEVtcHR5TmFtZXMoYXJpdHksIHNpZyk7CiAgICAgICAgIHRoaXMuZGVidWdOYW1lID0gIkxGLnplcm8iOwogICAgICAgICBhc3NlcnQobmFtZVJlZnNBcmVMZWdhbCgpKTsKICAgICAgICAgYXNzZXJ0KGlzRW1wdHkoKSk7Ci0gICAgICAgIGFzc2VydChzaWcuZXF1YWxzKGJhc2ljVHlwZVNpZ25hdHVyZSgpKSk7CisgICAgICAgIGFzc2VydChzaWcuZXF1YWxzKGJhc2ljVHlwZVNpZ25hdHVyZSgpKSkgOiBzaWcgKyAiICE9ICIgKyBiYXNpY1R5cGVTaWduYXR1cmUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBOYW1lW10gYnVpbGRFbXB0eU5hbWVzKGludCBhcml0eSwgU3RyaW5nIGJhc2ljVHlwZVNpZ25hdHVyZSkgewpAQCAtMTgxLDI0ICsyOTcsNTUgQEAKICAgICAgICAgaW50IHJlc3VsdFBvcyA9IGFyaXR5ICsgMTsgIC8vIHNraXAgJ18nCiAgICAgICAgIGlmIChhcml0eSA8IDAgfHwgYmFzaWNUeXBlU2lnbmF0dXJlLmxlbmd0aCgpICE9IHJlc3VsdFBvcysxKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIGFyaXR5IGZvciAiK2Jhc2ljVHlwZVNpZ25hdHVyZSk7Ci0gICAgICAgIGludCBudW1SZXMgPSAoYmFzaWNUeXBlU2lnbmF0dXJlLmNoYXJBdChyZXN1bHRQb3MpID09ICdWJyA/IDAgOiAxKTsKKyAgICAgICAgaW50IG51bVJlcyA9IChiYXNpY1R5cGUoYmFzaWNUeXBlU2lnbmF0dXJlLmNoYXJBdChyZXN1bHRQb3MpKSA9PSBWX1RZUEUgPyAwIDogMSk7CiAgICAgICAgIE5hbWVbXSBuYW1lcyA9IGFyZ3VtZW50cyhudW1SZXMsIGJhc2ljVHlwZVNpZ25hdHVyZS5zdWJzdHJpbmcoMCwgYXJpdHkpKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZXM7IGkrKykgewotICAgICAgICAgICAgbmFtZXNbYXJpdHkgKyBpXSA9IGNvbnN0YW50WmVybyhhcml0eSArIGksIGJhc2ljVHlwZVNpZ25hdHVyZS5jaGFyQXQocmVzdWx0UG9zICsgaSkpOworICAgICAgICAgICAgTmFtZSB6ZXJvID0gbmV3IE5hbWUoY29uc3RhbnRaZXJvKGJhc2ljVHlwZShiYXNpY1R5cGVTaWduYXR1cmUuY2hhckF0KHJlc3VsdFBvcyArIGkpKSkpOworICAgICAgICAgICAgbmFtZXNbYXJpdHkgKyBpXSA9IHplcm8ubmV3SW5kZXgoYXJpdHkgKyBpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmFtZXM7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpeFJlc3VsdChpbnQgcmVzdWx0LCBOYW1lW10gbmFtZXMpIHsKLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNbcmVzdWx0XS50eXBlID09ICdWJykKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IExBU1RfUkVTVUxUKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZXMubGVuZ3RoIC0gMTsKLSAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IExBU1RfUkVTVUxUKQorICAgICAgICAgICAgcmVzdWx0ID0gbmFtZXMubGVuZ3RoIC0gMTsgIC8vIG1pZ2h0IHN0aWxsIGJlIHZvaWQKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAwICYmIG5hbWVzW3Jlc3VsdF0udHlwZSA9PSBWX1RZUEUpCisgICAgICAgICAgICByZXN1bHQgPSBWT0lEX1JFU1VMVDsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZml4RGVidWdOYW1lKFN0cmluZyBkZWJ1Z05hbWUpIHsKKyAgICAgICAgaWYgKERFQlVHX05BTUVfQ09VTlRFUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHVuZGVyID0gZGVidWdOYW1lLmluZGV4T2YoJ18nKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBkZWJ1Z05hbWUubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAodW5kZXIgPCAwKSAgdW5kZXIgPSBsZW5ndGg7CisgICAgICAgICAgICBTdHJpbmcgZGVidWdOYW1lU3RlbSA9IGRlYnVnTmFtZS5zdWJzdHJpbmcoMCwgdW5kZXIpOworICAgICAgICAgICAgSW50ZWdlciBjdHI7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERFQlVHX05BTUVfQ09VTlRFUlMpIHsKKyAgICAgICAgICAgICAgICBjdHIgPSBERUJVR19OQU1FX0NPVU5URVJTLmdldChkZWJ1Z05hbWVTdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoY3RyID09IG51bGwpICBjdHIgPSAwOworICAgICAgICAgICAgICAgIERFQlVHX05BTUVfQ09VTlRFUlMucHV0KGRlYnVnTmFtZVN0ZW0sIGN0cisxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoZGVidWdOYW1lU3RlbSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCdfJyk7CisgICAgICAgICAgICBpbnQgbGVhZGluZ1plcm8gPSBidWYubGVuZ3RoKCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKChpbnQpIGN0cik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYnVmLmxlbmd0aCgpIC0gbGVhZGluZ1plcm87IGkgPCAzOyBpKyspCisgICAgICAgICAgICAgICAgYnVmLmluc2VydChsZWFkaW5nWmVybywgJzAnKTsKKyAgICAgICAgICAgIGlmICh1bmRlciA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICsrdW5kZXI7ICAgIC8vIHNraXAgIl8iCisgICAgICAgICAgICAgICAgd2hpbGUgKHVuZGVyIDwgbGVuZ3RoICYmIENoYXJhY3Rlci5pc0RpZ2l0KGRlYnVnTmFtZS5jaGFyQXQodW5kZXIpKSkgeworICAgICAgICAgICAgICAgICAgICArK3VuZGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodW5kZXIgPCBsZW5ndGggJiYgZGVidWdOYW1lLmNoYXJBdCh1bmRlcikgPT0gJ18nKSAgKyt1bmRlcjsKKyAgICAgICAgICAgICAgICBpZiAodW5kZXIgPCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ18nKS5hcHBlbmQoZGVidWdOYW1lLCB1bmRlciwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVidWdOYW1lOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmFtZXNPSyhpbnQgYXJpdHksIE5hbWVbXSBuYW1lcykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBOYW1lIG4gPSBuYW1lc1tpXTsKQEAgLTIxMSw5ICszNTgsMTIgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgLyoqIFJlbnVtYmVyIGFuZC9vciByZXBsYWNlIHBhcmFtcyBzbyB0aGF0IHRoZXkgYXJlIGludGVybmVkIGFuZCBjYW5vbmljYWxseSBudW1iZXJlZC4gKi8KLSAgICBwcml2YXRlIHZvaWQgbm9ybWFsaXplKCkgeworICAgIC8qKiBSZW51bWJlciBhbmQvb3IgcmVwbGFjZSBwYXJhbXMgc28gdGhhdCB0aGV5IGFyZSBpbnRlcm5lZCBhbmQgY2Fub25pY2FsbHkgbnVtYmVyZWQuCisgICAgICogIEByZXR1cm4gbWF4aW11bSBhcmd1bWVudCBsaXN0IGxlbmd0aCBhbW9uZyB0aGUgbmFtZXMgKHNpbmNlIHdlIGhhdmUgdG8gcGFzcyBvdmVyIHRoZW0gYW55d2F5KQorICAgICAqLworICAgIHByaXZhdGUgaW50IG5vcm1hbGl6ZSgpIHsKICAgICAgICAgTmFtZVtdIG9sZE5hbWVzID0gbnVsbDsKKyAgICAgICAgaW50IG1heE91dEFyaXR5ID0gMDsKICAgICAgICAgaW50IGNoYW5nZXNTdGFydCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIE5hbWUgbiA9IG5hbWVzW2ldOwpAQCAtMjI0LDYgKzM3NCw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5hbWVzW2ldID0gbi5jbG9uZVdpdGhJbmRleChpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuLmFyZ3VtZW50cyAhPSBudWxsICYmIG1heE91dEFyaXR5IDwgbi5hcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIG1heE91dEFyaXR5ID0gbi5hcmd1bWVudHMubGVuZ3RoOwogICAgICAgICB9CiAgICAgICAgIGlmIChvbGROYW1lcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBpbnQgc3RhcnRGaXhpbmcgPSBhcml0eTsKQEAgLTI1MCw2ICs0MDIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXNzZXJ0KG5hbWVSZWZzQXJlTGVnYWwoKSk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1heE91dEFyaXR5OwogICAgIH0KIAogICAgIC8qKgpAQCAtMjYxLDcgKzQxNCw3IEBACiAgICAgICogVGhpcyBhbGxvd3MgTmFtZSByZWZlcmVuY2VzIHRvIGJlIGZyZWVseSByZXVzZWQgdG8gY29uc3RydWN0CiAgICAgICogZnJlc2ggbGFtYmRhcywgd2l0aG91dCBjb25mdXNpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVSZWZzQXJlTGVnYWwoKSB7CisgICAgYm9vbGVhbiBuYW1lUmVmc0FyZUxlZ2FsKCkgewogICAgICAgICBhc3NlcnQoYXJpdHkgPj0gMCAmJiBhcml0eSA8PSBuYW1lcy5sZW5ndGgpOwogICAgICAgICBhc3NlcnQocmVzdWx0ID49IC0xICYmIHJlc3VsdCA8IG5hbWVzLmxlbmd0aCk7CiAgICAgICAgIC8vIERvIGFsbCBuYW1lcyBwb3NzZXNzIGFuIGluZGV4IGNvbnNpc3RlbnQgd2l0aCB0aGVpciBsb2NhbCBkZWZpbml0aW9uIG9yZGVyPwpAQCAtMjk0LDE2ICs0NDcsMjggQEAKICAgICAvLyB9CiAKICAgICAvKiogUmVwb3J0IHRoZSByZXR1cm4gdHlwZS4gKi8KLSAgICBjaGFyIHJldHVyblR5cGUoKSB7Ci0gICAgICAgIGlmIChyZXN1bHQgPCAwKSAgcmV0dXJuICdWJzsKKyAgICBCYXNpY1R5cGUgcmV0dXJuVHlwZSgpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApICByZXR1cm4gVl9UWVBFOwogICAgICAgICBOYW1lIG4gPSBuYW1lc1tyZXN1bHRdOwogICAgICAgICByZXR1cm4gbi50eXBlOwogICAgIH0KIAogICAgIC8qKiBSZXBvcnQgdGhlIE4tdGggYXJndW1lbnQgdHlwZS4gKi8KLSAgICBjaGFyIHBhcmFtZXRlclR5cGUoaW50IG4pIHsKKyAgICBCYXNpY1R5cGUgcGFyYW1ldGVyVHlwZShpbnQgbikgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyKG4pLnR5cGU7CisgICAgfQorCisgICAgLyoqIFJlcG9ydCB0aGUgTi10aCBhcmd1bWVudCBuYW1lLiAqLworICAgIE5hbWUgcGFyYW1ldGVyKGludCBuKSB7CiAgICAgICAgIGFzc2VydChuIDwgYXJpdHkpOwotICAgICAgICByZXR1cm4gbmFtZXNbbl0udHlwZTsKKyAgICAgICAgTmFtZSBwYXJhbSA9IG5hbWVzW25dOworICAgICAgICBhc3NlcnQocGFyYW0uaXNQYXJhbSgpKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8qKiBSZXBvcnQgdGhlIE4tdGggYXJndW1lbnQgdHlwZSBjb25zdHJhaW50LiAqLworICAgIE9iamVjdCBwYXJhbWV0ZXJDb25zdHJhaW50KGludCBuKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXIobikuY29uc3RyYWludDsKICAgICB9CiAKICAgICAvKiogUmVwb3J0IHRoZSBhcml0eS4gKi8KQEAgLTMxMSw2ICs0NzYsMTEgQEAKICAgICAgICAgcmV0dXJuIGFyaXR5OwogICAgIH0KIAorICAgIC8qKiBSZXBvcnQgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyAobm9uLXBhcmFtZXRlciBuYW1lcykuICovCisgICAgaW50IGV4cHJlc3Npb25Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVzLmxlbmd0aCAtIGFyaXR5OworICAgIH0KKwogICAgIC8qKiBSZXR1cm4gdGhlIG1ldGhvZCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gbXkgYmFzaWMgdHlwZSBzaWduYXR1cmUuICovCiAgICAgTWV0aG9kVHlwZSBtZXRob2RUeXBlKCkgewogICAgICAgICByZXR1cm4gc2lnbmF0dXJlVHlwZShiYXNpY1R5cGVTaWduYXR1cmUoKSk7CkBAIC0zMTksMTUgKzQ4OSwxNSBAQAogICAgIGZpbmFsIFN0cmluZyBiYXNpY1R5cGVTaWduYXR1cmUoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoYXJpdHkoKSArIDMpOwogICAgICAgICBmb3IgKGludCBpID0gMCwgYSA9IGFyaXR5KCk7IGkgPCBhOyBpKyspCi0gICAgICAgICAgICBidWYuYXBwZW5kKHBhcmFtZXRlclR5cGUoaSkpOwotICAgICAgICByZXR1cm4gYnVmLmFwcGVuZCgnXycpLmFwcGVuZChyZXR1cm5UeXBlKCkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKHBhcmFtZXRlclR5cGUoaSkuYmFzaWNUeXBlQ2hhcigpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5hcHBlbmQoJ18nKS5hcHBlbmQocmV0dXJuVHlwZSgpLmJhc2ljVHlwZUNoYXIoKSkudG9TdHJpbmcoKTsKICAgICB9CiAgICAgc3RhdGljIGludCBzaWduYXR1cmVBcml0eShTdHJpbmcgc2lnKSB7CiAgICAgICAgIGFzc2VydChpc1ZhbGlkU2lnbmF0dXJlKHNpZykpOwogICAgICAgICByZXR1cm4gc2lnLmluZGV4T2YoJ18nKTsKICAgICB9Ci0gICAgc3RhdGljIGNoYXIgc2lnbmF0dXJlUmV0dXJuKFN0cmluZyBzaWcpIHsKLSAgICAgICAgcmV0dXJuIHNpZy5jaGFyQXQoc2lnbmF0dXJlQXJpdHkoc2lnKSsxKTsKKyAgICBzdGF0aWMgQmFzaWNUeXBlIHNpZ25hdHVyZVJldHVybihTdHJpbmcgc2lnKSB7CisgICAgICAgIHJldHVybiBiYXNpY1R5cGUoc2lnLmNoYXJBdChzaWduYXR1cmVBcml0eShzaWcpICsgMSkpOwogICAgIH0KICAgICBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkU2lnbmF0dXJlKFN0cmluZyBzaWcpIHsKICAgICAgICAgaW50IGFyaXR5ID0gc2lnLmluZGV4T2YoJ18nKTsKQEAgLTMzOSwyNyArNTA5LDE1IEBACiAgICAgICAgICAgICBjaGFyIGMgPSBzaWcuY2hhckF0KGkpOwogICAgICAgICAgICAgaWYgKGMgPT0gJ1YnKQogICAgICAgICAgICAgICAgIHJldHVybiAoaSA9PSBzaWdsZW4gLSAxICYmIGFyaXR5ID09IHNpZ2xlbiAtIDIpOwotICAgICAgICAgICAgaWYgKEFMTF9UWVBFUy5pbmRleE9mKGMpIDwgMCkgIHJldHVybiBmYWxzZTsgLy8gbXVzdCBiZSBbTElKRkRdCisgICAgICAgICAgICBpZiAoIWlzQXJnQmFzaWNUeXBlQ2hhcihjKSkgIHJldHVybiBmYWxzZTsgLy8gbXVzdCBiZSBbTElKRkRdCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBbTElKRkRdKl9bTElKRkRWXQogICAgIH0KLSAgICBzdGF0aWMgQ2xhc3M8Pz4gdHlwZUNsYXNzKGNoYXIgdCkgewotICAgICAgICBzd2l0Y2ggKHQpIHsKLSAgICAgICAgY2FzZSAnSSc6IHJldHVybiBpbnQuY2xhc3M7Ci0gICAgICAgIGNhc2UgJ0onOiByZXR1cm4gbG9uZy5jbGFzczsKLSAgICAgICAgY2FzZSAnRic6IHJldHVybiBmbG9hdC5jbGFzczsKLSAgICAgICAgY2FzZSAnRCc6IHJldHVybiBkb3VibGUuY2xhc3M7Ci0gICAgICAgIGNhc2UgJ0wnOiByZXR1cm4gT2JqZWN0LmNsYXNzOwotICAgICAgICBjYXNlICdWJzogcmV0dXJuIHZvaWQuY2xhc3M7Ci0gICAgICAgIGRlZmF1bHQ6IGFzc2VydCBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CiAgICAgc3RhdGljIE1ldGhvZFR5cGUgc2lnbmF0dXJlVHlwZShTdHJpbmcgc2lnKSB7CiAgICAgICAgIENsYXNzPD8+W10gcHR5cGVzID0gbmV3IENsYXNzPD8+W3NpZ25hdHVyZUFyaXR5KHNpZyldOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHB0eXBlc1tpXSA9IHR5cGVDbGFzcyhzaWcuY2hhckF0KGkpKTsKLSAgICAgICAgQ2xhc3M8Pz4gcnR5cGUgPSB0eXBlQ2xhc3Moc2lnbmF0dXJlUmV0dXJuKHNpZykpOworICAgICAgICAgICAgcHR5cGVzW2ldID0gYmFzaWNUeXBlKHNpZy5jaGFyQXQoaSkpLmJ0Q2xhc3M7CisgICAgICAgIENsYXNzPD8+IHJ0eXBlID0gc2lnbmF0dXJlUmV0dXJuKHNpZykuYnRDbGFzczsKICAgICAgICAgcmV0dXJuIE1ldGhvZFR5cGUubWV0aG9kVHlwZShydHlwZSwgcHR5cGVzKTsKICAgICB9CiAKQEAgLTQ1NywyMSArNjE1LDEyIEBACiAgICAgICAgICAgICBpc0NvbXBpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiB2bWVudHJ5OwogICAgICAgICB9IGNhdGNoIChFcnJvciB8IEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcigiY29tcGlsZVRvQnl0ZWNvZGUiLCBleCk7CisgICAgICAgICAgICB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKHRoaXMudG9TdHJpbmcoKSwgZXgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLExhbWJkYUZvcm0+IFBSRVBBUkVEX0ZPUk1TOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIGludCAgIGNhcGFjaXR5ICAgPSA1MTI7ICAgIC8vIGV4cGVjdCBtYW55IGRpc3RpbmN0IHNpZ25hdHVyZXMgb3ZlciB0aW1lCi0gICAgICAgIGZsb2F0IGxvYWRGYWN0b3IgPSAwLjc1ZjsgIC8vIG5vcm1hbCBkZWZhdWx0Ci0gICAgICAgIGludCAgIHdyaXRlcnMgICAgPSAxOwotICAgICAgICBQUkVQQVJFRF9GT1JNUyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KGNhcGFjaXR5LCBsb2FkRmFjdG9yLCB3cml0ZXJzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLExhbWJkYUZvcm0+IGNvbXB1dGVJbml0aWFsUHJlcGFyZWRGb3JtcygpIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVJbml0aWFsUHJlcGFyZWRGb3JtcygpIHsKICAgICAgICAgLy8gRmluZCBhbGwgcHJlZGVmaW5lZCBpbnZva2VycyBhbmQgYXNzb2NpYXRlIHRoZW0gd2l0aCBjYW5vbmljYWwgZW1wdHkgbGFtYmRhIGZvcm1zLgotICAgICAgICBIYXNoTWFwPFN0cmluZyxMYW1iZGFGb3JtPiBmb3JtcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgZm9yIChNZW1iZXJOYW1lIG0gOiBNZW1iZXJOYW1lLmdldEZhY3RvcnkoKS5nZXRNZXRob2RzKExhbWJkYUZvcm0uY2xhc3MsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKSkgewogICAgICAgICAgICAgaWYgKCFtLmlzU3RhdGljKCkgfHwgIW0uaXNQYWNrYWdlKCkpICBjb250aW51ZTsKICAgICAgICAgICAgIE1ldGhvZFR5cGUgbXQgPSBtLmdldE1ldGhvZFR5cGUoKTsKQEAgLTQ4MiwxMyArNjMxLDkgQEAKICAgICAgICAgICAgICAgICBhc3NlcnQobS5nZXROYW1lKCkuZXF1YWxzKCJpbnRlcnByZXQiICsgc2lnLnN1YnN0cmluZyhzaWcuaW5kZXhPZignXycpKSkpOwogICAgICAgICAgICAgICAgIExhbWJkYUZvcm0gZm9ybSA9IG5ldyBMYW1iZGFGb3JtKHNpZyk7CiAgICAgICAgICAgICAgICAgZm9ybS52bWVudHJ5ID0gbTsKLSAgICAgICAgICAgICAgICBmb3JtID0gbXQuZm9ybSgpLnNldENhY2hlZExhbWJkYUZvcm0oTWV0aG9kVHlwZUZvcm0uTEZfQ09VTlRFUiwgZm9ybSk7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IGdldCByaWQgb2YgUFJFUEFSRURfRk9STVM7IHVzZSBNZXRob2RUeXBlRm9ybSBjYWNoZSBvbmx5Ci0gICAgICAgICAgICAgICAgZm9ybXMucHV0KHNpZywgZm9ybSk7CisgICAgICAgICAgICAgICAgZm9ybSA9IG10LmZvcm0oKS5zZXRDYWNoZWRMYW1iZGFGb3JtKE1ldGhvZFR5cGVGb3JtLkxGX0lOVEVSUFJFVCwgZm9ybSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbXB1dGVJbml0aWFsUHJlcGFyZWRGb3JtcyA9PiAiK2Zvcm1zKTsKLSAgICAgICAgcmV0dXJuIGZvcm1zOwogICAgIH0KIAogICAgIC8vIFNldCB0aGlzIGZhbHNlIHRvIGRpc2FibGUgdXNlIG9mIHRoZSBpbnRlcnByZXRfTCBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBmaWxlLgpAQCAtNTIyLDEzICs2NjcsMTEgQEAKICAgICB9CiAgICAgcHJpdmF0ZSBzdGF0aWMgTGFtYmRhRm9ybSBnZXRQcmVwYXJlZEZvcm0oU3RyaW5nIHNpZykgewogICAgICAgICBNZXRob2RUeXBlIG10eXBlID0gc2lnbmF0dXJlVHlwZShzaWcpOwotICAgICAgICAvL0xhbWJkYUZvcm0gcHJlcCA9IFBSRVBBUkVEX0ZPUk1TLmdldChzaWcpOwogICAgICAgICBMYW1iZGFGb3JtIHByZXAgPSAgbXR5cGUuZm9ybSgpLmNhY2hlZExhbWJkYUZvcm0oTWV0aG9kVHlwZUZvcm0uTEZfSU5URVJQUkVUKTsKICAgICAgICAgaWYgKHByZXAgIT0gbnVsbCkgIHJldHVybiBwcmVwOwogICAgICAgICBhc3NlcnQoaXNWYWxpZFNpZ25hdHVyZShzaWcpKTsKICAgICAgICAgcHJlcCA9IG5ldyBMYW1iZGFGb3JtKHNpZyk7CiAgICAgICAgIHByZXAudm1lbnRyeSA9IEludm9rZXJCeXRlY29kZUdlbmVyYXRvci5nZW5lcmF0ZUxhbWJkYUZvcm1JbnRlcnByZXRlckVudHJ5UG9pbnQoc2lnKTsKLSAgICAgICAgLy9MYW1iZGFGb3JtIHByZXAyID0gUFJFUEFSRURfRk9STVMucHV0SWZBYnNlbnQoc2lnLmludGVybigpLCBwcmVwKTsKICAgICAgICAgcmV0dXJuIG10eXBlLmZvcm0oKS5zZXRDYWNoZWRMYW1iZGFGb3JtKE1ldGhvZFR5cGVGb3JtLkxGX0lOVEVSUFJFVCwgcHJlcCk7CiAgICAgfQogCkBAIC01NDMsMjEgKzY4NiwyMSBAQAogICAgICAgICBhc3NlcnQobXQucGFyYW1ldGVyQ291bnQoKSA9PSBhcml0eS0xKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgQ2xhc3M8Pz4gcHQgPSAoaSA9PSAwID8gTWV0aG9kSGFuZGxlLmNsYXNzIDogbXQucGFyYW1ldGVyVHlwZShpLTEpKTsKLSAgICAgICAgICAgIGFzc2VydCh2YWx1ZU1hdGNoZXMoc2lnLmNoYXJBdChpKSwgcHQsIGF2W2ldKSk7CisgICAgICAgICAgICBhc3NlcnQodmFsdWVNYXRjaGVzKGJhc2ljVHlwZShzaWcuY2hhckF0KGkpKSwgcHQsIGF2W2ldKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsdWVNYXRjaGVzKGNoYXIgdGMsIENsYXNzPD8+IHR5cGUsIE9iamVjdCB4KSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB2YWx1ZU1hdGNoZXMoQmFzaWNUeXBlIHRjLCBDbGFzczw/PiB0eXBlLCBPYmplY3QgeCkgewogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgbmVlZGVkIGJlY2F1c2UgKC4uLil2b2lkIG1ldGhvZCBoYW5kbGVzIGNhbiB1c2Ugbm9uLXZvaWQgaW52b2tlcnMKLSAgICAgICAgaWYgKHR5cGUgPT0gdm9pZC5jbGFzcykgIHRjID0gJ1YnOyAgIC8vIGNhbiBkcm9wIGFueSBraW5kIG9mIHZhbHVlCisgICAgICAgIGlmICh0eXBlID09IHZvaWQuY2xhc3MpICB0YyA9IFZfVFlQRTsgICAvLyBjYW4gZHJvcCBhbnkga2luZCBvZiB2YWx1ZQogICAgICAgICBhc3NlcnQgdGMgPT0gYmFzaWNUeXBlKHR5cGUpIDogdGMgKyAiID09IGJhc2ljVHlwZSgiICsgdHlwZSArICIpPSIgKyBiYXNpY1R5cGUodHlwZSk7CiAgICAgICAgIHN3aXRjaCAodGMpIHsKLSAgICAgICAgY2FzZSAnSSc6IGFzc2VydCBjaGVja0ludCh0eXBlLCB4KSAgIDogImNoZWNrSW50KCIgKyB0eXBlICsgIiwiICsgeCArIikiOyAgIGJyZWFrOwotICAgICAgICBjYXNlICdKJzogYXNzZXJ0IHggaW5zdGFuY2VvZiBMb25nICAgOiAiaW5zdGFuY2VvZiBMb25nOiAiICsgeDsgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0YnOiBhc3NlcnQgeCBpbnN0YW5jZW9mIEZsb2F0ICA6ICJpbnN0YW5jZW9mIEZsb2F0OiAiICsgeDsgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRCc6IGFzc2VydCB4IGluc3RhbmNlb2YgRG91YmxlIDogImluc3RhbmNlb2YgRG91YmxlOiAiICsgeDsgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdMJzogYXNzZXJ0IGNoZWNrUmVmKHR5cGUsIHgpICAgOiAiY2hlY2tSZWYoIiArIHR5cGUgKyAiLCIgKyB4ICsgIikiOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1YnOiBicmVhazsgIC8vIGFsbG93IGFueXRoaW5nIGhlcmU7IHdpbGwgYmUgZHJvcHBlZAorICAgICAgICBjYXNlIElfVFlQRTogYXNzZXJ0IGNoZWNrSW50KHR5cGUsIHgpICAgOiAiY2hlY2tJbnQoIiArIHR5cGUgKyAiLCIgKyB4ICsiKSI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgSl9UWVBFOiBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmcgICA6ICJpbnN0YW5jZW9mIExvbmc6ICIgKyB4OyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGX1RZUEU6IGFzc2VydCB4IGluc3RhbmNlb2YgRmxvYXQgIDogImluc3RhbmNlb2YgRmxvYXQ6ICIgKyB4OyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERfVFlQRTogYXNzZXJ0IHggaW5zdGFuY2VvZiBEb3VibGUgOiAiaW5zdGFuY2VvZiBEb3VibGU6ICIgKyB4OyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTF9UWVBFOiBhc3NlcnQgY2hlY2tSZWYodHlwZSwgeCkgICA6ICJjaGVja1JlZigiICsgdHlwZSArICIsIiArIHggKyAiKSI7ICBicmVhazsKKyAgICAgICAgY2FzZSBWX1RZUEU6IGJyZWFrOyAgLy8gYWxsb3cgYW55dGhpbmcgaGVyZTsgd2lsbCBiZSBkcm9wcGVkCiAgICAgICAgIGRlZmF1bHQ6ICBhc3NlcnQoZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNTg0LDEwICs3MjcsNyBAQAogICAgIC8qKiBJZiB0aGUgaW52b2NhdGlvbiBjb3VudCBoaXRzIHRoZSB0aHJlc2hvbGQgd2Ugc3BpbiBieXRlY29kZXMgYW5kIGNhbGwgdGhhdCBzdWJzZXF1ZW50bHkuICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTVBJTEVfVEhSRVNIT0xEOwogICAgIHN0YXRpYyB7Ci0gICAgICAgIGlmIChNZXRob2RIYW5kbGVTdGF0aWNzLkNPTVBJTEVfVEhSRVNIT0xEICE9IG51bGwpCi0gICAgICAgICAgICBDT01QSUxFX1RIUkVTSE9MRCA9IE1ldGhvZEhhbmRsZVN0YXRpY3MuQ09NUElMRV9USFJFU0hPTEQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIENPTVBJTEVfVEhSRVNIT0xEID0gMzA7ICAvLyBkZWZhdWx0IHZhbHVlCisgICAgICAgIENPTVBJTEVfVEhSRVNIT0xEID0gTWF0aC5tYXgoLTEsIE1ldGhvZEhhbmRsZVN0YXRpY3MuQ09NUElMRV9USFJFU0hPTEQpOwogICAgIH0KICAgICBwcml2YXRlIGludCBpbnZvY2F0aW9uQ291bnRlciA9IDA7CiAKQEAgLTYwMyw3ICs3NDMsOSBAQAogICAgICAgICBmb3IgKGludCBpID0gYXJndW1lbnRWYWx1ZXMubGVuZ3RoOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBpbnRlcnByZXROYW1lKG5hbWVzW2ldLCB2YWx1ZXMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAocmVzdWx0IDwgMCkgPyBudWxsIDogdmFsdWVzW3Jlc3VsdF07CisgICAgICAgIE9iamVjdCBydiA9IChyZXN1bHQgPCAwKSA/IG51bGwgOiB2YWx1ZXNbcmVzdWx0XTsKKyAgICAgICAgYXNzZXJ0KHJlc3VsdENoZWNrKGFyZ3VtZW50VmFsdWVzLCBydikpOworICAgICAgICByZXR1cm4gcnY7CiAgICAgfQogCiAgICAgQEhpZGRlbgpAQCAtNjYwLDI4ICs4MDIsNiBAQAogICAgICAgICByZXR1cm4gcnZhbDsKICAgICB9CiAKLSAgICAvLyoqIFRoaXMgdHJhbnNmb3JtIGlzIGFwcGxpZWQgKHN0YXRpY2FsbHkpIHRvIGV2ZXJ5IG5hbWUuZnVuY3Rpb24uICovCi0gICAgLyoKLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RIYW5kbGUgZXJhc2VTdWJ3b3JkVHlwZXMoTWV0aG9kSGFuZGxlIG1oKSB7Ci0gICAgICAgIE1ldGhvZFR5cGUgbXQgPSBtaC50eXBlKCk7Ci0gICAgICAgIGlmIChtdC5oYXNQcmltaXRpdmVzKCkpIHsKLSAgICAgICAgICAgIG10ID0gbXQuY2hhbmdlUmV0dXJuVHlwZShlcmFzZVN1YndvcmRUeXBlKG10LnJldHVyblR5cGUoKSkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdC5wYXJhbWV0ZXJDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtdCA9IG10LmNoYW5nZVBhcmFtZXRlclR5cGUoaSwgZXJhc2VTdWJ3b3JkVHlwZShtdC5wYXJhbWV0ZXJUeXBlKGkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtaCA9IE1ldGhvZEhhbmRsZXMuZXhwbGljaXRDYXN0QXJndW1lbnRzKG1oLCBtdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1oOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBlcmFzZVN1YndvcmRUeXBlKENsYXNzPD8+IHR5cGUpIHsKLSAgICAgICAgaWYgKCF0eXBlLmlzUHJpbWl0aXZlKCkpICByZXR1cm4gdHlwZTsKLSAgICAgICAgaWYgKHR5cGUgPT0gaW50LmNsYXNzKSAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIFdyYXBwZXIgdyA9IFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZSh0eXBlKTsKLSAgICAgICAgaWYgKHcuaXNTdWJ3b3JkT3JJbnQoKSkgIHJldHVybiBpbnQuY2xhc3M7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLSAgICAqLwotCiAgICAgc3RhdGljIHZvaWQgdHJhY2VJbnRlcnByZXRlcihTdHJpbmcgZXZlbnQsIE9iamVjdCBvYmosIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIGlmIChUUkFDRV9JTlRFUlBSRVRFUikgewogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMRkk6ICIrZXZlbnQrIiAiKyhvYmogIT0gbnVsbCA/IG9iaiA6ICIiKSsoYXJncyAhPSBudWxsICYmIGFyZ3MubGVuZ3RoICE9IDAgPyBBcnJheXMuYXNMaXN0KGFyZ3MpIDogIiIpKTsKQEAgLTY5NCw4ICs4MTQsMTYgQEAKICAgICAgICAgYXNzZXJ0KGFyZ3VtZW50VmFsdWVzLmxlbmd0aCA9PSBhcml0eSkgOiBhcml0eSsiIT0iK0FycmF5cy5hc0xpc3QoYXJndW1lbnRWYWx1ZXMpKyIubGVuZ3RoIjsKICAgICAgICAgLy8gYWxzbyBjaGVjayB0aGF0IHRoZSBsZWFkaW5nIChyZWNlaXZlcikgYXJndW1lbnQgaXMgc29tZWhvdyBib3VuZCB0byB0aGlzIExGOgogICAgICAgICBhc3NlcnQoYXJndW1lbnRWYWx1ZXNbMF0gaW5zdGFuY2VvZiBNZXRob2RIYW5kbGUpIDogIm5vdCBNSDogIiArIGFyZ3VtZW50VmFsdWVzWzBdOwotICAgICAgICBhc3NlcnQoKChNZXRob2RIYW5kbGUpYXJndW1lbnRWYWx1ZXNbMF0pLmludGVybmFsRm9ybSgpID09IHRoaXMpOworICAgICAgICBNZXRob2RIYW5kbGUgbWggPSAoTWV0aG9kSGFuZGxlKSBhcmd1bWVudFZhbHVlc1swXTsKKyAgICAgICAgYXNzZXJ0KG1oLmludGVybmFsRm9ybSgpID09IHRoaXMpOwogICAgICAgICAvLyBub3RlOiAgYXJndW1lbnQgIzAgY291bGQgYWxzbyBiZSBhbiBpbnRlcmZhY2Ugd3JhcHBlciwgaW4gdGhlIGZ1dHVyZQorICAgICAgICBhcmd1bWVudFR5cGVzTWF0Y2goYmFzaWNUeXBlU2lnbmF0dXJlKCksIGFyZ3VtZW50VmFsdWVzKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiByZXN1bHRDaGVjayhPYmplY3RbXSBhcmd1bWVudFZhbHVlcywgT2JqZWN0IHJlc3VsdCkgeworICAgICAgICBNZXRob2RIYW5kbGUgbWggPSAoTWV0aG9kSGFuZGxlKSBhcmd1bWVudFZhbHVlc1swXTsKKyAgICAgICAgTWV0aG9kVHlwZSBtdCA9IG1oLnR5cGUoKTsKKyAgICAgICAgYXNzZXJ0KHZhbHVlTWF0Y2hlcyhyZXR1cm5UeXBlKCksIG10LnJldHVyblR5cGUoKSwgcmVzdWx0KSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNzE0LDcgKzg0Miw3IEBACiAgICAgICAgICAgICBpZiAoaSA9PSBhcml0eSkgIGJ1Zi5hcHBlbmQoIik9PnsiKTsKICAgICAgICAgICAgIE5hbWUgbiA9IG5hbWVzW2ldOwogICAgICAgICAgICAgaWYgKGkgPj0gYXJpdHkpICBidWYuYXBwZW5kKCJcbiAgICAiKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQobik7CisgICAgICAgICAgICBidWYuYXBwZW5kKG4ucGFyYW1TdHJpbmcoKSk7CiAgICAgICAgICAgICBpZiAoaSA8IGFyaXR5KSB7CiAgICAgICAgICAgICAgICAgaWYgKGkrMSA8IGFyaXR5KSAgYnVmLmFwcGVuZCgiLCIpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNzIyLDYgKzg1MCw3IEBACiAgICAgICAgICAgICBidWYuYXBwZW5kKCI9IikuYXBwZW5kKG4uZXhwclN0cmluZygpKTsKICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsiKTsKICAgICAgICAgfQorICAgICAgICBpZiAoYXJpdHkgPT0gbmFtZXMubGVuZ3RoKSAgYnVmLmFwcGVuZCgiKT0+eyIpOwogICAgICAgICBidWYuYXBwZW5kKHJlc3VsdCA8IDAgPyAidm9pZCIgOiBuYW1lc1tyZXN1bHRdKS5hcHBlbmQoIn0iKTsKICAgICAgICAgaWYgKFRSQUNFX0lOVEVSUFJFVEVSKSB7CiAgICAgICAgICAgICAvLyBFeHRyYSB2ZXJib3NpdHk6CkBAIC03MzEsMTM1ICs4NjAsMTkgQEAKICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEFwcGx5IGltbWVkaWF0ZSBiaW5kaW5nIGZvciBhIE5hbWUgaW4gdGhpcyBmb3JtIGluZGljYXRlZCBieSBpdHMgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGZvcm0uCi0gICAgICogVGhlIGZpcnN0IHBhcmFtZXRlciB0byBhIExhbWJkYUZvcm0sIGEwOkwsIGFsd2F5cyByZXByZXNlbnRzIHRoZSBmb3JtJ3MgbWV0aG9kIGhhbmRsZSwgc28gMCBpcyBub3QKLSAgICAgKiBhY2NlcHRlZCBhcyB2YWxpZC4KLSAgICAgKi8KLSAgICBMYW1iZGFGb3JtIGJpbmRJbW1lZGlhdGUoaW50IHBvcywgY2hhciBiYXNpY1R5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAvLyBtdXN0IGJlIGFuIGFyZ3VtZW50LCBhbmQgdGhlIHR5cGVzIG11c3QgbWF0Y2gKLSAgICAgICAgYXNzZXJ0IHBvcyA+IDAgJiYgcG9zIDwgYXJpdHkgJiYgbmFtZXNbcG9zXS50eXBlID09IGJhc2ljVHlwZSAmJiBOYW1lLnR5cGVzTWF0Y2goYmFzaWNUeXBlLCB2YWx1ZSk7Ci0KLSAgICAgICAgaW50IGFyaXR5MiA9IGFyaXR5IC0gMTsKLSAgICAgICAgTmFtZVtdIG5hbWVzMiA9IG5ldyBOYW1lW25hbWVzLmxlbmd0aCAtIDFdOwotICAgICAgICBmb3IgKGludCByID0gMCwgdyA9IDA7IHIgPCBuYW1lcy5sZW5ndGg7ICsrciwgKyt3KSB7IC8vIChyKWVhZCBmcm9tIG5hbWVzLCAodylyaXRlIHRvIG5hbWVzMgotICAgICAgICAgICAgTmFtZSBuID0gbmFtZXNbcl07Ci0gICAgICAgICAgICBpZiAobi5pc1BhcmFtKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobi5pbmRleCA9PSBwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGNvcHkgb3ZlciB0aGUgYXJndW1lbnQgdGhhdCBpcyB0byBiZSByZXBsYWNlZCB3aXRoIGEgbGl0ZXJhbCwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGFkanVzdCB0aGUgd3JpdGUgaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLS13OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzMlt3XSA9IG5ldyBOYW1lKHcsIG4udHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmd1bWVudHMyID0gbmV3IE9iamVjdFtuLmFyZ3VtZW50cy5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbi5hcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZyA9IG4uYXJndW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgTmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pID0gKChOYW1lKSBhcmcpLmluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5pID09IHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czJbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmkgPCBwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlbWVudCBwb3NpdGlvbiBub3QgeWV0IHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czJbaV0gPSBuYW1lczJbbmldOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlbWVudCBwb3NpdGlvbiBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMyW2ldID0gbmFtZXMyW25pIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMyW2ldID0gYXJnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVzMlt3XSA9IG5ldyBOYW1lKG4uZnVuY3Rpb24sIGFyZ3VtZW50czIpOwotICAgICAgICAgICAgICAgIG5hbWVzMlt3XS5pbml0SW5kZXgodyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmVzdWx0MiA9IHJlc3VsdCA9PSAtMSA/IC0xIDogcmVzdWx0IC0gMTsKLSAgICAgICAgcmV0dXJuIG5ldyBMYW1iZGFGb3JtKGRlYnVnTmFtZSwgYXJpdHkyLCBuYW1lczIsIHJlc3VsdDIpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBMYW1iZGFGb3JtICYmIGVxdWFscygoTGFtYmRhRm9ybSlvYmopOwogICAgIH0KLQotICAgIExhbWJkYUZvcm0gYmluZChpbnQgbmFtZVBvcywgQm91bmRNZXRob2RIYW5kbGUuU3BlY2llc0RhdGEgb2xkRGF0YSkgewotICAgICAgICBOYW1lIG5hbWUgPSBuYW1lc1tuYW1lUG9zXTsKLSAgICAgICAgQm91bmRNZXRob2RIYW5kbGUuU3BlY2llc0RhdGEgbmV3RGF0YSA9IG9sZERhdGEuZXh0ZW5kV2l0aFR5cGUobmFtZS50eXBlKTsKLSAgICAgICAgcmV0dXJuIGJpbmQobmFtZSwgbmV3RGF0YS5nZXR0ZXJOYW1lKG5hbWVzWzBdLCBvbGREYXRhLmZpZWxkQ291bnQoKSksIG9sZERhdGEsIG5ld0RhdGEpOworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhMYW1iZGFGb3JtIHRoYXQpIHsKKyAgICAgICAgaWYgKHRoaXMucmVzdWx0ICE9IHRoYXQucmVzdWx0KSAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyh0aGlzLm5hbWVzLCB0aGF0Lm5hbWVzKTsKICAgICB9Ci0gICAgTGFtYmRhRm9ybSBiaW5kKE5hbWUgbmFtZSwgTmFtZSBiaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSBvbGREYXRhLAotICAgICAgICAgICAgICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSBuZXdEYXRhKSB7Ci0gICAgICAgIGludCBwb3MgPSBuYW1lLmluZGV4OwotICAgICAgICBhc3NlcnQobmFtZS5pc1BhcmFtKCkpOwotICAgICAgICBhc3NlcnQoIWJpbmRpbmcuaXNQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0KG5hbWUudHlwZSA9PSBiaW5kaW5nLnR5cGUpOwotICAgICAgICBhc3NlcnQoMCA8PSBwb3MgJiYgcG9zIDwgYXJpdHkgJiYgbmFtZXNbcG9zXSA9PSBuYW1lKTsKLSAgICAgICAgYXNzZXJ0KGJpbmRpbmcuZnVuY3Rpb24ubWVtYmVyRGVjbGFyaW5nQ2xhc3NPck51bGwoKSA9PSBuZXdEYXRhLmNsYXp6KTsKLSAgICAgICAgYXNzZXJ0KG9sZERhdGEuZ2V0dGVycy5sZW5ndGggPT0gbmV3RGF0YS5nZXR0ZXJzLmxlbmd0aC0xKTsKLSAgICAgICAgaWYgKGJpbmRDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMYW1iZGFGb3JtIGZvcm0gPSBiaW5kQ2FjaGVbcG9zXTsKLSAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQoZm9ybS5jb250YWlucyhiaW5kaW5nKSkgOiAiZm9ybSA8PCAiICsgZm9ybSArICIgPj4gZG9lcyBub3QgY29udGFpbiBiaW5kaW5nIDw8ICIgKyBiaW5kaW5nICsgIiA+PiI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiaW5kQ2FjaGUgPSBuZXcgTGFtYmRhRm9ybVthcml0eV07Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KG5hbWVSZWZzQXJlTGVnYWwoKSk7Ci0gICAgICAgIGludCBhcml0eTIgPSBhcml0eS0xOwotICAgICAgICBOYW1lW10gbmFtZXMyID0gbmFtZXMuY2xvbmUoKTsKLSAgICAgICAgbmFtZXMyW3Bvc10gPSBiaW5kaW5nOyAgLy8gd2UgbWlnaHQgbW92ZSB0aGlzIGluIGEgbW9tZW50Ci0KLSAgICAgICAgLy8gVGhlIG5ld2x5IGNyZWF0ZWQgTEYgd2lsbCBydW4gd2l0aCBhIGRpZmZlcmVudCBCTUguCi0gICAgICAgIC8vIFN3aXRjaCBvdmVyIGFueSBwcmUtZXhpc3RpbmcgQk1IIGZpZWxkIHJlZmVyZW5jZXMgdG8gdGhlIG5ldyBCTUggY2xhc3MuCi0gICAgICAgIGludCBmaXJzdE9sZFJlZiA9IC0xOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzMi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTmFtZSBuID0gbmFtZXNbaV07Ci0gICAgICAgICAgICBpZiAobi5mdW5jdGlvbiAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgbi5mdW5jdGlvbi5tZW1iZXJEZWNsYXJpbmdDbGFzc09yTnVsbCgpID09IG9sZERhdGEuY2xhenopIHsKLSAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgb2xkR2V0dGVyID0gbi5mdW5jdGlvbi5yZXNvbHZlZEhhbmRsZTsKLSAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgbmV3R2V0dGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9sZERhdGEuZ2V0dGVycy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAob2xkR2V0dGVyID09IG9sZERhdGEuZ2V0dGVyc1tqXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0dldHRlciA9ICBuZXdEYXRhLmdldHRlcnNbal07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdHZXR0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RPbGRSZWYgPCAwKSAgZmlyc3RPbGRSZWYgPSBpOwotICAgICAgICAgICAgICAgICAgICBOYW1lIG4yID0gbmV3IE5hbWUobmV3R2V0dGVyLCBuLmFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzMltpXSA9IG4yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdhbGsgb3ZlciB0aGUgbmV3IGxpc3Qgb2YgbmFtZXMgb25jZSwgaW4gZm9yd2FyZCBvcmRlci4KLSAgICAgICAgLy8gUmVwbGFjZSByZWZlcmVuY2VzIHRvICduYW1lJyB3aXRoICdiaW5kaW5nJy4KLSAgICAgICAgLy8gUmVwbGFjZSBkYXRhIHN0cnVjdHVyZSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgQk1IIHNwZWNpZXMgd2l0aCB0aGUgbmV3LgotICAgICAgICAvLyBUaGlzIG1pZ2h0IGNhdXNlIGEgcmlwcGxlIGVmZmVjdCwgYnV0IGl0IHdpbGwgc2V0dGxlIGluIG9uZSBwYXNzLgotICAgICAgICBhc3NlcnQoZmlyc3RPbGRSZWYgPCAwIHx8IGZpcnN0T2xkUmVmID4gcG9zKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IHBvcysxOyBpIDwgbmFtZXMyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA8PSBhcml0eTIpICBjb250aW51ZTsKLSAgICAgICAgICAgIG5hbWVzMltpXSA9IG5hbWVzMltpXS5yZXBsYWNlTmFtZXMobmFtZXMsIG5hbWVzMiwgcG9zLCBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICAoYTAsIGExLCBuYW1lPWEyLCBhMywgYTQpICA9PiAgKGEwLCBhMSwgYTMsIGE0LCBiaW5kaW5nKQotICAgICAgICBpbnQgaW5zUG9zID0gcG9zOwotICAgICAgICBmb3IgKDsgaW5zUG9zKzEgPCBuYW1lczIubGVuZ3RoOyBpbnNQb3MrKykgewotICAgICAgICAgICAgTmFtZSBuID0gbmFtZXMyW2luc1BvcysxXTsKLSAgICAgICAgICAgIGlmIChuLmlzU2libGluZ0JpbmRpbmdCZWZvcmUoYmluZGluZykpIHsKLSAgICAgICAgICAgICAgICBuYW1lczJbaW5zUG9zXSA9IG47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5hbWVzMltpbnNQb3NdID0gYmluZGluZzsKLQotICAgICAgICAvLyBTaW5jZSB3ZSBtb3ZlZCBzb21lIHN0dWZmLCBtYXliZSB1cGRhdGUgdGhlIHJlc3VsdCByZWZlcmVuY2U6Ci0gICAgICAgIGludCByZXN1bHQyID0gcmVzdWx0OwotICAgICAgICBpZiAocmVzdWx0MiA9PSBwb3MpCi0gICAgICAgICAgICByZXN1bHQyID0gaW5zUG9zOwotICAgICAgICBlbHNlIGlmIChyZXN1bHQyID4gcG9zICYmIHJlc3VsdDIgPD0gaW5zUG9zKQotICAgICAgICAgICAgcmVzdWx0MiAtPSAxOwotCi0gICAgICAgIHJldHVybiBiaW5kQ2FjaGVbcG9zXSA9IG5ldyBMYW1iZGFGb3JtKGRlYnVnTmFtZSwgYXJpdHkyLCBuYW1lczIsIHJlc3VsdDIpOworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQgKyAzMSAqIEFycmF5cy5oYXNoQ29kZShuYW1lcyk7CisgICAgfQorICAgIExhbWJkYUZvcm1FZGl0b3IgZWRpdG9yKCkgeworICAgICAgICByZXR1cm4gTGFtYmRhRm9ybUVkaXRvci5sYW1iZGFGb3JtRWRpdG9yKHRoaXMpOwogICAgIH0KIAogICAgIGJvb2xlYW4gY29udGFpbnMoTmFtZSBuYW1lKSB7CkBAIC04NzQsMTcgKzg4NywxNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTGFtYmRhRm9ybSBhZGRBcmd1bWVudHMoaW50IHBvcywgY2hhci4uLiB0eXBlcykgewotICAgICAgICBhc3NlcnQocG9zIDw9IGFyaXR5KTsKKyAgICBMYW1iZGFGb3JtIGFkZEFyZ3VtZW50cyhpbnQgcG9zLCBCYXNpY1R5cGUuLi4gdHlwZXMpIHsKKyAgICAgICAgLy8gbmFtZXMgYXJyYXkgaGFzIE1IIGluIHNsb3QgMDsgc2tpcCBpdC4KKyAgICAgICAgaW50IGFyZ3BvcyA9IHBvcyArIDE7CisgICAgICAgIGFzc2VydChhcmdwb3MgPD0gYXJpdHkpOwogICAgICAgICBpbnQgbGVuZ3RoID0gbmFtZXMubGVuZ3RoOwogICAgICAgICBpbnQgaW5UeXBlcyA9IHR5cGVzLmxlbmd0aDsKICAgICAgICAgTmFtZVtdIG5hbWVzMiA9IEFycmF5cy5jb3B5T2YobmFtZXMsIGxlbmd0aCArIGluVHlwZXMpOwogICAgICAgICBpbnQgYXJpdHkyID0gYXJpdHkgKyBpblR5cGVzOwogICAgICAgICBpbnQgcmVzdWx0MiA9IHJlc3VsdDsKLSAgICAgICAgaWYgKHJlc3VsdDIgPj0gYXJpdHkpCisgICAgICAgIGlmIChyZXN1bHQyID49IGFyZ3BvcykKICAgICAgICAgICAgIHJlc3VsdDIgKz0gaW5UeXBlczsKLSAgICAgICAgLy8gbmFtZXMgYXJyYXkgaGFzIE1IIGluIHNsb3QgMDsgc2tpcCBpdC4KLSAgICAgICAgaW50IGFyZ3BvcyA9IHBvcyArIDE7CiAgICAgICAgIC8vIE5vdGU6ICBUaGUgTEYgY29uc3RydWN0b3Igd2lsbCByZW5hbWUgbmFtZXMyW2FyZ3Bvcy4uLl0uCiAgICAgICAgIC8vIE1ha2Ugc3BhY2UgZm9yIG5ldyBhcmd1bWVudHMgKHNoaWZ0IHRlbXBvcmFyaWVzKS4KICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lcywgYXJncG9zLCBuYW1lczIsIGFyZ3BvcyArIGluVHlwZXMsIGxlbmd0aCAtIGFyZ3Bvcyk7CkBAIC04OTUsMTMgKzkwOCwxMCBAQAogICAgIH0KIAogICAgIExhbWJkYUZvcm0gYWRkQXJndW1lbnRzKGludCBwb3MsIExpc3Q8Q2xhc3M8Pz4+IHR5cGVzKSB7Ci0gICAgICAgIGNoYXJbXSBiYXNpY1R5cGVzID0gbmV3IGNoYXJbdHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNpY1R5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgYmFzaWNUeXBlc1tpXSA9IGJhc2ljVHlwZSh0eXBlcy5nZXQoaSkpOwotICAgICAgICByZXR1cm4gYWRkQXJndW1lbnRzKHBvcywgYmFzaWNUeXBlcyk7CisgICAgICAgIHJldHVybiBhZGRBcmd1bWVudHMocG9zLCBiYXNpY1R5cGVzKHR5cGVzKSk7CiAgICAgfQogCi0gICAgTGFtYmRhRm9ybSBwZXJtdXRlQXJndW1lbnRzKGludCBza2lwLCBpbnRbXSByZW9yZGVyLCBjaGFyW10gdHlwZXMpIHsKKyAgICBMYW1iZGFGb3JtIHBlcm11dGVBcmd1bWVudHMoaW50IHNraXAsIGludFtdIHJlb3JkZXIsIEJhc2ljVHlwZVtdIHR5cGVzKSB7CiAgICAgICAgIC8vIE5vdGU6ICBXaGVuIGluQXJnID0gcmVvcmRlcltvdXRBcmddLCBvdXRBcmcgaXMgZmVkIGJ5IGEgY29weSBvZiBpbkFyZy4KICAgICAgICAgLy8gVGhlIHR5cGVzIGFyZSB0aGUgdHlwZXMgb2YgdGhlIG5ldyAoaW5jb21pbmcpIGFyZ3VtZW50cy4KICAgICAgICAgaW50IGxlbmd0aCA9IG5hbWVzLmxlbmd0aDsKQEAgLTk2MCw3ICs5NzAsNyBAQAogICAgICAgICByZXR1cm4gbmV3IExhbWJkYUZvcm0oZGVidWdOYW1lLCBhcml0eTIsIG5hbWVzMiwgcmVzdWx0Mik7CiAgICAgfQogCi0gICAgc3RhdGljIGJvb2xlYW4gcGVybXV0ZWRUeXBlc01hdGNoKGludFtdIHJlb3JkZXIsIGNoYXJbXSB0eXBlcywgTmFtZVtdIG5hbWVzLCBpbnQgc2tpcCkgeworICAgIHN0YXRpYyBib29sZWFuIHBlcm11dGVkVHlwZXNNYXRjaChpbnRbXSByZW9yZGVyLCBCYXNpY1R5cGVbXSB0eXBlcywgTmFtZVtdIG5hbWVzLCBpbnQgc2tpcCkgewogICAgICAgICBpbnQgaW5UeXBlcyA9IHR5cGVzLmxlbmd0aDsKICAgICAgICAgaW50IG91dEFyZ3MgPSByZW9yZGVyLmxlbmd0aDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRBcmdzOyBpKyspIHsKQEAgLTk4MCw4ICs5OTAsOSBAQAogICAgICAgICB9CiAgICAgICAgIE5hbWVkRnVuY3Rpb24oTWVtYmVyTmFtZSBtZW1iZXIsIE1ldGhvZEhhbmRsZSByZXNvbHZlZEhhbmRsZSkgewogICAgICAgICAgICAgdGhpcy5tZW1iZXIgPSBtZW1iZXI7Ci0gICAgICAgICAgICAvL3Jlc29sdmVkSGFuZGxlID0gZXJhc2VTdWJ3b3JkVHlwZXMocmVzb2x2ZWRIYW5kbGUpOwogICAgICAgICAgICAgdGhpcy5yZXNvbHZlZEhhbmRsZSA9IHJlc29sdmVkSGFuZGxlOworICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IGlzIGFsbW9zdCBhbHdheXMgY29ycmVjdCwgYnV0IHdpbGwgZmFpbCBmb3IgY29ybmVyIGNhc2VzLCBzdWNoIGFzIFByaXZhdGVJbnZva2VUZXN0LgorICAgICAgICAgICAgIC8vYXNzZXJ0KCFpc0ludm9rZUJhc2ljKCkpOwogICAgICAgICB9CiAgICAgICAgIE5hbWVkRnVuY3Rpb24oTWV0aG9kVHlwZSBiYXNpY0ludm9rZXJUeXBlKSB7CiAgICAgICAgICAgICBhc3NlcnQoYmFzaWNJbnZva2VyVHlwZSA9PSBiYXNpY0ludm9rZXJUeXBlLmJhc2ljVHlwZSgpKSA6IGJhc2ljSW52b2tlclR5cGU7CkBAIC05OTIsNiArMTAwMywxMyBAQAogICAgICAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSB0byBwYXNzIEJpZ0FyaXR5VGVzdAogICAgICAgICAgICAgICAgIHRoaXMubWVtYmVyID0gSW52b2tlcnMuaW52b2tlQmFzaWNNZXRob2QoYmFzaWNJbnZva2VyVHlwZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoaXNJbnZva2VCYXNpYygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0ludm9rZUJhc2ljKCkgeworICAgICAgICAgICAgcmV0dXJuIG1lbWJlciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgbWVtYmVyLmlzTWV0aG9kSGFuZGxlSW52b2tlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAiaW52b2tlQmFzaWMiLmVxdWFscyhtZW1iZXIuZ2V0TmFtZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZSBuZXh0IDMgY29uc3RydWN0b3JzIGFyZSB1c2VkIHRvIGJyZWFrIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBvbiBNSC5pbnZva2VTdGF0aWMsIGV0Yy4KQEAgLTEwNDQsMTAgKzEwNjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpZyA9IG0uZ2V0TmFtZSgpLnN1YnN0cmluZygiaW52b2tlXyIubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgICAgICBpbnQgYXJpdHkgPSBMYW1iZGFGb3JtLnNpZ25hdHVyZUFyaXR5KHNpZyk7CiAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUgc3JjVHlwZSA9IE1ldGhvZFR5cGUuZ2VuZXJpY01ldGhvZFR5cGUoYXJpdHkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTGFtYmRhRm9ybS5zaWduYXR1cmVSZXR1cm4oc2lnKSA9PSAnVicpCisgICAgICAgICAgICAgICAgICAgIGlmIChMYW1iZGFGb3JtLnNpZ25hdHVyZVJldHVybihzaWcpID09IFZfVFlQRSkKICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1R5cGUgPSBzcmNUeXBlLmNoYW5nZVJldHVyblR5cGUodm9pZC5jbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFR5cGVGb3JtIHR5cGVGb3JtID0gc3JjVHlwZS5mb3JtKCk7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVGb3JtLm5hbWVkRnVuY3Rpb25JbnZva2VyID0gRGlyZWN0TWV0aG9kSGFuZGxlLm1ha2UobSk7CisgICAgICAgICAgICAgICAgICAgIHR5cGVGb3JtLnNldENhY2hlZE1ldGhvZEhhbmRsZShNZXRob2RUeXBlRm9ybS5NSF9ORl9JTlYsIERpcmVjdE1ldGhvZEhhbmRsZS5tYWtlKG0pKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwNTcsODUgKzEwNzUsMTA0IEBACiAgICAgICAgIC8qKiB2b2lkIHJldHVybiB0eXBlIGludm9rZXJzLiAqLwogICAgICAgICBASGlkZGVuCiAgICAgICAgIHN0YXRpYyBPYmplY3QgaW52b2tlX19WKE1ldGhvZEhhbmRsZSBtaCwgT2JqZWN0W10gYSkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICBhc3NlcnQoYS5sZW5ndGggPT0gMCk7CisgICAgICAgICAgICBhc3NlcnQoYXJpdHlDaGVjaygwLCB2b2lkLmNsYXNzLCBtaCwgYSkpOwogICAgICAgICAgICAgbWguaW52b2tlQmFzaWMoKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIEBIaWRkZW4KICAgICAgICAgc3RhdGljIE9iamVjdCBpbnZva2VfTF9WKE1ldGhvZEhhbmRsZSBtaCwgT2JqZWN0W10gYSkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICBhc3NlcnQoYS5sZW5ndGggPT0gMSk7CisgICAgICAgICAgICBhc3NlcnQoYXJpdHlDaGVjaygxLCB2b2lkLmNsYXNzLCBtaCwgYSkpOwogICAgICAgICAgICAgbWguaW52b2tlQmFzaWMoYVswXSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBASGlkZGVuCiAgICAgICAgIHN0YXRpYyBPYmplY3QgaW52b2tlX0xMX1YoTWV0aG9kSGFuZGxlIG1oLCBPYmplY3RbXSBhKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIGFzc2VydChhLmxlbmd0aCA9PSAyKTsKKyAgICAgICAgICAgIGFzc2VydChhcml0eUNoZWNrKDIsIHZvaWQuY2xhc3MsIG1oLCBhKSk7CiAgICAgICAgICAgICBtaC5pbnZva2VCYXNpYyhhWzBdLCBhWzFdKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIEBIaWRkZW4KICAgICAgICAgc3RhdGljIE9iamVjdCBpbnZva2VfTExMX1YoTWV0aG9kSGFuZGxlIG1oLCBPYmplY3RbXSBhKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIGFzc2VydChhLmxlbmd0aCA9PSAzKTsKKyAgICAgICAgICAgIGFzc2VydChhcml0eUNoZWNrKDMsIHZvaWQuY2xhc3MsIG1oLCBhKSk7CiAgICAgICAgICAgICBtaC5pbnZva2VCYXNpYyhhWzBdLCBhWzFdLCBhWzJdKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIEBIaWRkZW4KICAgICAgICAgc3RhdGljIE9iamVjdCBpbnZva2VfTExMTF9WKE1ldGhvZEhhbmRsZSBtaCwgT2JqZWN0W10gYSkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICBhc3NlcnQoYS5sZW5ndGggPT0gNCk7CisgICAgICAgICAgICBhc3NlcnQoYXJpdHlDaGVjayg0LCB2b2lkLmNsYXNzLCBtaCwgYSkpOwogICAgICAgICAgICAgbWguaW52b2tlQmFzaWMoYVswXSwgYVsxXSwgYVsyXSwgYVszXSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBASGlkZGVuCiAgICAgICAgIHN0YXRpYyBPYmplY3QgaW52b2tlX0xMTExMX1YoTWV0aG9kSGFuZGxlIG1oLCBPYmplY3RbXSBhKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIGFzc2VydChhLmxlbmd0aCA9PSA1KTsKKyAgICAgICAgICAgIGFzc2VydChhcml0eUNoZWNrKDUsIHZvaWQuY2xhc3MsIG1oLCBhKSk7CiAgICAgICAgICAgICBtaC5pbnZva2VCYXNpYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIC8qKiBPYmplY3QgcmV0dXJuIHR5cGUgaW52b2tlcnMuICovCiAgICAgICAgIEBIaWRkZW4KICAgICAgICAgc3RhdGljIE9iamVjdCBpbnZva2VfX0woTWV0aG9kSGFuZGxlIG1oLCBPYmplY3RbXSBhKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIGFzc2VydChhLmxlbmd0aCA9PSAwKTsKKyAgICAgICAgICAgIGFzc2VydChhcml0eUNoZWNrKDAsIG1oLCBhKSk7CiAgICAgICAgICAgICByZXR1cm4gbWguaW52b2tlQmFzaWMoKTsKICAgICAgICAgfQogICAgICAgICBASGlkZGVuCiAgICAgICAgIHN0YXRpYyBPYmplY3QgaW52b2tlX0xfTChNZXRob2RIYW5kbGUgbWgsIE9iamVjdFtdIGEpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgYXNzZXJ0KGEubGVuZ3RoID09IDEpOworICAgICAgICAgICAgYXNzZXJ0KGFyaXR5Q2hlY2soMSwgbWgsIGEpKTsKICAgICAgICAgICAgIHJldHVybiBtaC5pbnZva2VCYXNpYyhhWzBdKTsKICAgICAgICAgfQogICAgICAgICBASGlkZGVuCiAgICAgICAgIHN0YXRpYyBPYmplY3QgaW52b2tlX0xMX0woTWV0aG9kSGFuZGxlIG1oLCBPYmplY3RbXSBhKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIGFzc2VydChhLmxlbmd0aCA9PSAyKTsKKyAgICAgICAgICAgIGFzc2VydChhcml0eUNoZWNrKDIsIG1oLCBhKSk7CiAgICAgICAgICAgICByZXR1cm4gbWguaW52b2tlQmFzaWMoYVswXSwgYVsxXSk7CiAgICAgICAgIH0KICAgICAgICAgQEhpZGRlbgogICAgICAgICBzdGF0aWMgT2JqZWN0IGludm9rZV9MTExfTChNZXRob2RIYW5kbGUgbWgsIE9iamVjdFtdIGEpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgYXNzZXJ0KGEubGVuZ3RoID09IDMpOworICAgICAgICAgICAgYXNzZXJ0KGFyaXR5Q2hlY2soMywgbWgsIGEpKTsKICAgICAgICAgICAgIHJldHVybiBtaC5pbnZva2VCYXNpYyhhWzBdLCBhWzFdLCBhWzJdKTsKICAgICAgICAgfQogICAgICAgICBASGlkZGVuCiAgICAgICAgIHN0YXRpYyBPYmplY3QgaW52b2tlX0xMTExfTChNZXRob2RIYW5kbGUgbWgsIE9iamVjdFtdIGEpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgYXNzZXJ0KGEubGVuZ3RoID09IDQpOworICAgICAgICAgICAgYXNzZXJ0KGFyaXR5Q2hlY2soNCwgbWgsIGEpKTsKICAgICAgICAgICAgIHJldHVybiBtaC5pbnZva2VCYXNpYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTsKICAgICAgICAgfQogICAgICAgICBASGlkZGVuCiAgICAgICAgIHN0YXRpYyBPYmplY3QgaW52b2tlX0xMTExMX0woTWV0aG9kSGFuZGxlIG1oLCBPYmplY3RbXSBhKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIGFzc2VydChhLmxlbmd0aCA9PSA1KTsKKyAgICAgICAgICAgIGFzc2VydChhcml0eUNoZWNrKDUsIG1oLCBhKSk7CiAgICAgICAgICAgICByZXR1cm4gbWguaW52b2tlQmFzaWMoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSk7CiAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcml0eUNoZWNrKGludCBhcml0eSwgTWV0aG9kSGFuZGxlIG1oLCBPYmplY3RbXSBhKSB7CisgICAgICAgICAgICByZXR1cm4gYXJpdHlDaGVjayhhcml0eSwgT2JqZWN0LmNsYXNzLCBtaCwgYSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcml0eUNoZWNrKGludCBhcml0eSwgQ2xhc3M8Pz4gcnR5cGUsIE1ldGhvZEhhbmRsZSBtaCwgT2JqZWN0W10gYSkgeworICAgICAgICAgICAgYXNzZXJ0KGEubGVuZ3RoID09IGFyaXR5KQorICAgICAgICAgICAgICAgICAgICA6IEFycmF5cy5hc0xpc3QoYS5sZW5ndGgsIGFyaXR5KTsKKyAgICAgICAgICAgIGFzc2VydChtaC50eXBlKCkuYmFzaWNUeXBlKCkgPT0gTWV0aG9kVHlwZS5nZW5lcmljTWV0aG9kVHlwZShhcml0eSkuY2hhbmdlUmV0dXJuVHlwZShydHlwZSkpCisgICAgICAgICAgICAgICAgICAgIDogQXJyYXlzLmFzTGlzdChtaCwgcnR5cGUsIGFyaXR5KTsKKyAgICAgICAgICAgIE1lbWJlck5hbWUgbWVtYmVyID0gbWguaW50ZXJuYWxNZW1iZXJOYW1lKCk7CisgICAgICAgICAgICBpZiAobWVtYmVyICE9IG51bGwgJiYgbWVtYmVyLmdldE5hbWUoKS5lcXVhbHMoImludm9rZUJhc2ljIikgJiYgbWVtYmVyLmlzTWV0aG9kSGFuZGxlSW52b2tlKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoYXJpdHkgPiAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoYVswXSBpbnN0YW5jZW9mIE1ldGhvZEhhbmRsZSk7CisgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oMiA9IChNZXRob2RIYW5kbGUpIGFbMF07CisgICAgICAgICAgICAgICAgYXNzZXJ0KG1oMi50eXBlKCkuYmFzaWNUeXBlKCkgPT0gTWV0aG9kVHlwZS5nZW5lcmljTWV0aG9kVHlwZShhcml0eS0xKS5jaGFuZ2VSZXR1cm5UeXBlKHJ0eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogQXJyYXlzLmFzTGlzdChtZW1iZXIsIG1oMiwgcnR5cGUsIGFyaXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKICAgICAgICAgc3RhdGljIGZpbmFsIE1ldGhvZFR5cGUgSU5WT0tFUl9NRVRIT0RfVFlQRSA9CiAgICAgICAgICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0LmNsYXNzLCBNZXRob2RIYW5kbGUuY2xhc3MsIE9iamVjdFtdLmNsYXNzKTsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RIYW5kbGUgY29tcHV0ZUludm9rZXIoTWV0aG9kVHlwZUZvcm0gdHlwZUZvcm0pIHsKLSAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IHR5cGVGb3JtLm5hbWVkRnVuY3Rpb25JbnZva2VyOworICAgICAgICAgICAgdHlwZUZvcm0gPSB0eXBlRm9ybS5iYXNpY1R5cGUoKS5mb3JtKCk7ICAvLyBub3JtYWxpemUgdG8gYmFzaWMgdHlwZQorICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gdHlwZUZvcm0uY2FjaGVkTWV0aG9kSGFuZGxlKE1ldGhvZFR5cGVGb3JtLk1IX05GX0lOVik7CiAgICAgICAgICAgICBpZiAobWggIT0gbnVsbCkgIHJldHVybiBtaDsKICAgICAgICAgICAgIE1lbWJlck5hbWUgaW52b2tlciA9IEludm9rZXJCeXRlY29kZUdlbmVyYXRvci5nZW5lcmF0ZU5hbWVkRnVuY3Rpb25JbnZva2VyKHR5cGVGb3JtKTsgIC8vIHRoaXMgY291bGQgdGFrZSBhIHdoaWxlCiAgICAgICAgICAgICBtaCA9IERpcmVjdE1ldGhvZEhhbmRsZS5tYWtlKGludm9rZXIpOwotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oMiA9IHR5cGVGb3JtLm5hbWVkRnVuY3Rpb25JbnZva2VyOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oMiA9IHR5cGVGb3JtLmNhY2hlZE1ldGhvZEhhbmRsZShNZXRob2RUeXBlRm9ybS5NSF9ORl9JTlYpOwogICAgICAgICAgICAgaWYgKG1oMiAhPSBudWxsKSAgcmV0dXJuIG1oMjsgIC8vIGJlbmlnbiByYWNlCiAgICAgICAgICAgICBpZiAoIW1oLnR5cGUoKS5lcXVhbHMoSU5WT0tFUl9NRVRIT0RfVFlQRSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IobWguZGVidWdTdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZUZvcm0ubmFtZWRGdW5jdGlvbkludm9rZXIgPSBtaDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKG1oLmRlYnVnU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHR5cGVGb3JtLnNldENhY2hlZE1ldGhvZEhhbmRsZShNZXRob2RUeXBlRm9ybS5NSF9ORl9JTlYsIG1oKTsKICAgICAgICAgfQogCiAgICAgICAgIEBIaWRkZW4KQEAgLTExOTMsMTEgKzEyMzAsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcgYmFzaWNUeXBlU2lnbmF0dXJlKCkgewotICAgICAgICAgICAgLy9yZXR1cm4gTGFtYmRhRm9ybS5iYXNpY1R5cGVTaWduYXR1cmUocmVzb2x2ZWRIYW5kbGUudHlwZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBMYW1iZGFGb3JtLmJhc2ljVHlwZVNpZ25hdHVyZShtZXRob2RUeXBlKCkpOwotICAgICAgICB9Ci0KICAgICAgICAgTWV0aG9kVHlwZSBtZXRob2RUeXBlKCkgewogICAgICAgICAgICAgaWYgKHJlc29sdmVkSGFuZGxlICE9IG51bGwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkSGFuZGxlLnR5cGUoKTsKQEAgLTEyMjQsMTggKzEyNTYsMTUgQEAKICAgICAgICAgICAgIHJldHVybiAobWVtYmVyID09IG51bGwpID8gbnVsbCA6IG1lbWJlci5nZXREZWNsYXJpbmdDbGFzcygpOwogICAgICAgICB9CiAKLSAgICAgICAgY2hhciByZXR1cm5UeXBlKCkgeworICAgICAgICBCYXNpY1R5cGUgcmV0dXJuVHlwZSgpIHsKICAgICAgICAgICAgIHJldHVybiBiYXNpY1R5cGUobWV0aG9kVHlwZSgpLnJldHVyblR5cGUoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBjaGFyIHBhcmFtZXRlclR5cGUoaW50IG4pIHsKKyAgICAgICAgQmFzaWNUeXBlIHBhcmFtZXRlclR5cGUoaW50IG4pIHsKICAgICAgICAgICAgIHJldHVybiBiYXNpY1R5cGUobWV0aG9kVHlwZSgpLnBhcmFtZXRlclR5cGUobikpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IGFyaXR5KCkgewotICAgICAgICAgICAgLy9pbnQgc2lnbGVuID0gbWVtYmVyLmdldE1ldGhvZFR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpOwotICAgICAgICAgICAgLy9pZiAoIW1lbWJlci5pc1N0YXRpYygpKSAgc2lnbGVuICs9IDE7Ci0gICAgICAgICAgICAvL3JldHVybiBzaWdsZW47CiAgICAgICAgICAgICByZXR1cm4gbWV0aG9kVHlwZSgpLnBhcmFtZXRlckNvdW50KCk7CiAgICAgICAgIH0KIApAQCAtMTI0Myw3NCArMTI3MiwxMDkgQEAKICAgICAgICAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgIHJldHVybiBTdHJpbmcudmFsdWVPZihyZXNvbHZlZEhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gbWVtYmVyLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKyIuIittZW1iZXIuZ2V0TmFtZSgpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgdm9pZCByZXNvbHZlKCkgewotICAgICAgICBmb3IgKE5hbWUgbiA6IG5hbWVzKSBuLnJlc29sdmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNoYXIgYmFzaWNUeXBlKENsYXNzPD8+IHR5cGUpIHsKLSAgICAgICAgY2hhciBjID0gV3JhcHBlci5iYXNpY1R5cGVDaGFyKHR5cGUpOwotICAgICAgICBpZiAoIlpCU0MiLmluZGV4T2YoYykgPj0gMCkgIGMgPSAnSSc7Ci0gICAgICAgIGFzc2VydCgiTElKRkRWIi5pbmRleE9mKGMpID49IDApOwotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBjaGFyW10gYmFzaWNUeXBlcyhMaXN0PENsYXNzPD8+PiB0eXBlcykgewotICAgICAgICBjaGFyW10gYnR5cGVzID0gbmV3IGNoYXJbdHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGJ0eXBlc1tpXSA9IGJhc2ljVHlwZSh0eXBlcy5nZXQoaSkpOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0lkZW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKGlkZW50aXR5KHJldHVyblR5cGUoKSkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidHlwZXM7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdGFudFplcm8oKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoY29uc3RhbnRaZXJvKHJldHVyblR5cGUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1ldGhvZEhhbmRsZUltcGwuSW50cmluc2ljIGludHJpbnNpY05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRIYW5kbGUgPT0gbnVsbCA/IE1ldGhvZEhhbmRsZUltcGwuSW50cmluc2ljLk5PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZWRIYW5kbGUuaW50cmluc2ljTmFtZSgpOworICAgICAgICB9CiAgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzaWNUeXBlU2lnbmF0dXJlKE1ldGhvZFR5cGUgdHlwZSkgewogICAgICAgICBjaGFyW10gc2lnID0gbmV3IGNoYXJbdHlwZS5wYXJhbWV0ZXJDb3VudCgpICsgMl07CiAgICAgICAgIGludCBzaWdwID0gMDsKICAgICAgICAgZm9yIChDbGFzczw/PiBwdCA6IHR5cGUucGFyYW1ldGVyTGlzdCgpKSB7Ci0gICAgICAgICAgICBzaWdbc2lncCsrXSA9IGJhc2ljVHlwZShwdCk7CisgICAgICAgICAgICBzaWdbc2lncCsrXSA9IGJhc2ljVHlwZUNoYXIocHQpOwogICAgICAgICB9CiAgICAgICAgIHNpZ1tzaWdwKytdID0gJ18nOwotICAgICAgICBzaWdbc2lncCsrXSA9IGJhc2ljVHlwZSh0eXBlLnJldHVyblR5cGUoKSk7CisgICAgICAgIHNpZ1tzaWdwKytdID0gYmFzaWNUeXBlQ2hhcih0eXBlLnJldHVyblR5cGUoKSk7CiAgICAgICAgIGFzc2VydChzaWdwID09IHNpZy5sZW5ndGgpOwogICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc2lnKTsKICAgICB9CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlblNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKSB7CisgICAgICAgIC8vIEhhY2sgdG8gbWFrZSBzaWduYXR1cmVzIG1vcmUgcmVhZGFibGUgd2hlbiB0aGV5IHNob3cgdXAgaW4gbWV0aG9kIG5hbWVzLgorICAgICAgICBmaW5hbCBpbnQgTk9fQ0hBUiA9IC0xLCBNSU5fUlVOID0gMzsKKyAgICAgICAgaW50IGMwLCBjMSA9IE5PX0NIQVIsIGMxcmVwcyA9IDA7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbnVsbDsKKyAgICAgICAgaW50IGxlbiA9IHNpZ25hdHVyZS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGxlbiA8IE1JTl9SVU4pICByZXR1cm4gc2lnbmF0dXJlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBsZW47IGkrKykgeworICAgICAgICAgICAgLy8gc2hpZnQgaW4gdGhlIG5leHQgY2hhcjoKKyAgICAgICAgICAgIGMwID0gYzE7IGMxID0gKGkgPT0gbGVuID8gTk9fQ0hBUiA6IHNpZ25hdHVyZS5jaGFyQXQoaSkpOworICAgICAgICAgICAgaWYgKGMxID09IGMwKSB7ICsrYzFyZXBzOyBjb250aW51ZTsgfQorICAgICAgICAgICAgLy8gc2hpZnQgaW4gdGhlIG5leHQgY291bnQ6CisgICAgICAgICAgICBpbnQgYzByZXBzID0gYzFyZXBzOyBjMXJlcHMgPSAxOworICAgICAgICAgICAgLy8gZW5kIG9mIGEgIGNoYXJhY3RlciBydW4KKyAgICAgICAgICAgIGlmIChjMHJlcHMgPCBNSU5fUlVOKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWMwcmVwcyA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhciljMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZm91bmQgdGhyZWUgb3IgbW9yZSBpbiBhIHJvdworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKHNpZ25hdHVyZSwgMCwgaSAtIGMwcmVwcyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKWMwKS5hcHBlbmQoYzByZXBzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGJ1ZiA9PSBudWxsKSA/IHNpZ25hdHVyZSA6IGJ1Zi50b1N0cmluZygpOworICAgIH0KIAogICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOYW1lIHsKLSAgICAgICAgZmluYWwgY2hhciB0eXBlOworICAgICAgICBmaW5hbCBCYXNpY1R5cGUgdHlwZTsKICAgICAgICAgcHJpdmF0ZSBzaG9ydCBpbmRleDsKICAgICAgICAgZmluYWwgTmFtZWRGdW5jdGlvbiBmdW5jdGlvbjsKKyAgICAgICAgZmluYWwgT2JqZWN0IGNvbnN0cmFpbnQ7ICAvLyBhZGRpdGlvbmFsIHR5cGUgaW5mb3JtYXRpb24sIGlmIG5vdCBudWxsCiAgICAgICAgIEBTdGFibGUgZmluYWwgT2JqZWN0W10gYXJndW1lbnRzOwogCi0gICAgICAgIHByaXZhdGUgTmFtZShpbnQgaW5kZXgsIGNoYXIgdHlwZSwgTmFtZWRGdW5jdGlvbiBmdW5jdGlvbiwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHByaXZhdGUgTmFtZShpbnQgaW5kZXgsIEJhc2ljVHlwZSB0eXBlLCBOYW1lZEZ1bmN0aW9uIGZ1bmN0aW9uLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKICAgICAgICAgICAgIHRoaXMuaW5kZXggPSAoc2hvcnQpaW5kZXg7CiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICAgdGhpcy5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnQgPSBudWxsOwogICAgICAgICAgICAgYXNzZXJ0KHRoaXMuaW5kZXggPT0gaW5kZXgpOwogICAgICAgICB9CisgICAgICAgIHByaXZhdGUgTmFtZShOYW1lIHRoYXQsIE9iamVjdCBjb25zdHJhaW50KSB7CisgICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhhdC5pbmRleDsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoYXQudHlwZTsKKyAgICAgICAgICAgIHRoaXMuZnVuY3Rpb24gPSB0aGF0LmZ1bmN0aW9uOworICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMgPSB0aGF0LmFyZ3VtZW50czsKKyAgICAgICAgICAgIHRoaXMuY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7CisgICAgICAgICAgICBhc3NlcnQoY29uc3RyYWludCA9PSBudWxsIHx8IGlzUGFyYW0oKSk7ICAvLyBvbmx5IHBhcmFtcyBoYXZlIGNvbnN0cmFpbnRzCisgICAgICAgICAgICBhc3NlcnQoY29uc3RyYWludCA9PSBudWxsIHx8IGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSB8fCBjb25zdHJhaW50IGluc3RhbmNlb2YgQ2xhc3MpOworICAgICAgICB9CiAgICAgICAgIE5hbWUoTWV0aG9kSGFuZGxlIGZ1bmN0aW9uLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7CiAgICAgICAgICAgICB0aGlzKG5ldyBOYW1lZEZ1bmN0aW9uKGZ1bmN0aW9uKSwgYXJndW1lbnRzKTsKICAgICAgICAgfQogICAgICAgICBOYW1lKE1ldGhvZFR5cGUgZnVuY3Rpb25UeXBlLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7CiAgICAgICAgICAgICB0aGlzKG5ldyBOYW1lZEZ1bmN0aW9uKGZ1bmN0aW9uVHlwZSksIGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICBhc3NlcnQoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgTmFtZSAmJiAoKE5hbWUpYXJndW1lbnRzWzBdKS50eXBlID09ICdMJyk7CisgICAgICAgICAgICBhc3NlcnQoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgTmFtZSAmJiAoKE5hbWUpYXJndW1lbnRzWzBdKS50eXBlID09IExfVFlQRSk7CiAgICAgICAgIH0KICAgICAgICAgTmFtZShNZW1iZXJOYW1lIGZ1bmN0aW9uLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7CiAgICAgICAgICAgICB0aGlzKG5ldyBOYW1lZEZ1bmN0aW9uKGZ1bmN0aW9uKSwgYXJndW1lbnRzKTsKICAgICAgICAgfQogICAgICAgICBOYW1lKE5hbWVkRnVuY3Rpb24gZnVuY3Rpb24sIE9iamVjdC4uLiBhcmd1bWVudHMpIHsKLSAgICAgICAgICAgIHRoaXMoLTEsIGZ1bmN0aW9uLnJldHVyblR5cGUoKSwgZnVuY3Rpb24sIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5jbG9uZSgpKTsKKyAgICAgICAgICAgIHRoaXMoLTEsIGZ1bmN0aW9uLnJldHVyblR5cGUoKSwgZnVuY3Rpb24sIGFyZ3VtZW50cyA9IEFycmF5cy5jb3B5T2YoYXJndW1lbnRzLCBhcmd1bWVudHMubGVuZ3RoLCBPYmplY3RbXS5jbGFzcykpOwogICAgICAgICAgICAgYXNzZXJ0KGFyZ3VtZW50cy5sZW5ndGggPT0gZnVuY3Rpb24uYXJpdHkoKSkgOiAiYXJpdHkgbWlzbWF0Y2g6IGFyZ3VtZW50cy5sZW5ndGg9IiArIGFyZ3VtZW50cy5sZW5ndGggKyAiID09IGZ1bmN0aW9uLmFyaXR5KCk9IiArIGZ1bmN0aW9uLmFyaXR5KCkgKyAiIGluICIgKyBkZWJ1Z1N0cmluZygpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVzTWF0Y2goZnVuY3Rpb24ucGFyYW1ldGVyVHlwZShpKSwgYXJndW1lbnRzW2ldKSkgOiAidHlwZXMgZG9uJ3QgbWF0Y2g6IGZ1bmN0aW9uLnBhcmFtZXRlclR5cGUoIiArIGkgKyAiKT0iICsgZnVuY3Rpb24ucGFyYW1ldGVyVHlwZShpKSArICIsIGFyZ3VtZW50c1siICsgaSArICJdPSIgKyBhcmd1bWVudHNbaV0gKyAiIGluICIgKyBkZWJ1Z1N0cmluZygpOwogICAgICAgICB9Ci0gICAgICAgIE5hbWUoaW50IGluZGV4LCBjaGFyIHR5cGUpIHsKKyAgICAgICAgLyoqIENyZWF0ZSBhIHJhdyBwYXJhbWV0ZXIgb2YgdGhlIGdpdmVuIHR5cGUsIHdpdGggYW4gZXhwZWN0ZWQgaW5kZXguICovCisgICAgICAgIE5hbWUoaW50IGluZGV4LCBCYXNpY1R5cGUgdHlwZSkgewogICAgICAgICAgICAgdGhpcyhpbmRleCwgdHlwZSwgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0KLSAgICAgICAgTmFtZShjaGFyIHR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMoLTEsIHR5cGUpOwotICAgICAgICB9CisgICAgICAgIC8qKiBDcmVhdGUgYSByYXcgcGFyYW1ldGVyIG9mIHRoZSBnaXZlbiB0eXBlLiAqLworICAgICAgICBOYW1lKEJhc2ljVHlwZSB0eXBlKSB7IHRoaXMoLTEsIHR5cGUpOyB9CiAKLSAgICAgICAgY2hhciB0eXBlKCkgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICBCYXNpY1R5cGUgdHlwZSgpIHsgcmV0dXJuIHR5cGU7IH0KICAgICAgICAgaW50IGluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KICAgICAgICAgYm9vbGVhbiBpbml0SW5kZXgoaW50IGkpIHsKICAgICAgICAgICAgIGlmIChpbmRleCAhPSBpKSB7CkBAIC0xMzE5LDcgKzEzODMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLQorICAgICAgICBjaGFyIHR5cGVDaGFyKCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuYnRDaGFyOworICAgICAgICB9CiAKICAgICAgICAgdm9pZCByZXNvbHZlKCkgewogICAgICAgICAgICAgaWYgKGZ1bmN0aW9uICE9IG51bGwpCkBAIC0xMzMyLDcgKzEzOTgsMTEgQEAKICAgICAgICAgfQogICAgICAgICBOYW1lIGNsb25lV2l0aEluZGV4KGludCBpKSB7CiAgICAgICAgICAgICBPYmplY3RbXSBuZXdBcmd1bWVudHMgPSAoYXJndW1lbnRzID09IG51bGwpID8gbnVsbCA6IGFyZ3VtZW50cy5jbG9uZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1lKGksIHR5cGUsIGZ1bmN0aW9uLCBuZXdBcmd1bWVudHMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1lKGksIHR5cGUsIGZ1bmN0aW9uLCBuZXdBcmd1bWVudHMpLndpdGhDb25zdHJhaW50KGNvbnN0cmFpbnQpOworICAgICAgICB9CisgICAgICAgIE5hbWUgd2l0aENvbnN0cmFpbnQoT2JqZWN0IGNvbnN0cmFpbnQpIHsKKyAgICAgICAgICAgIGlmIChjb25zdHJhaW50ID09IHRoaXMuY29uc3RyYWludCkgIHJldHVybiB0aGlzOworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1lKHRoaXMsIGNvbnN0cmFpbnQpOwogICAgICAgICB9CiAgICAgICAgIE5hbWUgcmVwbGFjZU5hbWUoTmFtZSBvbGROYW1lLCBOYW1lIG5ld05hbWUpIHsgIC8vIEZJWE1FOiB1c2UgcmVwbGFjZU5hbWVzIHVuaWZvcm1seQogICAgICAgICAgICAgaWYgKG9sZE5hbWUgPT0gbmV3TmFtZSkgIHJldHVybiB0aGlzOwpAQCAtMTM1Miw3ICsxNDIyLDExIEBACiAgICAgICAgICAgICBpZiAoIXJlcGxhY2VkKSAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICByZXR1cm4gbmV3IE5hbWUoZnVuY3Rpb24sIGFyZ3VtZW50cyk7CiAgICAgICAgIH0KKyAgICAgICAgLyoqIEluIHRoZSBhcmd1bWVudHMgb2YgdGhpcyBOYW1lLCByZXBsYWNlIG9sZE5hbWVzW2ldIHBhaXJ3aXNlIGJ5IG5ld05hbWVzW2ldLgorICAgICAgICAgKiAgTGltaXQgc3VjaCByZXBsYWNlbWVudHMgdG8ge0Bjb2RlIHN0YXJ0PD1pPGVuZH0uICBSZXR1cm4gcG9zc2libHkgY2hhbmdlZCBzZWxmLgorICAgICAgICAgKi8KICAgICAgICAgTmFtZSByZXBsYWNlTmFtZXMoTmFtZVtdIG9sZE5hbWVzLCBOYW1lW10gbmV3TmFtZXMsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAgICAgaWYgKHN0YXJ0ID49IGVuZCkgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIkxvY2FsVmFyaWFibGVIaWRlc01lbWJlclZhcmlhYmxlIikKICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3VtZW50cyA9IHRoaXMuYXJndW1lbnRzOwogICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlZCA9IGZhbHNlOwpAQCAtMTM5NywxOCArMTQ3MSwyNiBAQAogICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uID09IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBpc0NvbnN0YW50WmVybygpIHsKLSAgICAgICAgICAgIHJldHVybiAhaXNQYXJhbSgpICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMCAmJiBmdW5jdGlvbi5lcXVhbHMoY29uc3RhbnRaZXJvKDAsIHR5cGUpLmZ1bmN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiAhaXNQYXJhbSgpICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMCAmJiBmdW5jdGlvbi5pc0NvbnN0YW50WmVybygpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAoaXNQYXJhbSgpPyJhIjoidCIpKyhpbmRleCA+PSAwID8gaW5kZXggOiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSkrIjoiK3R5cGU7CisgICAgICAgICAgICByZXR1cm4gKGlzUGFyYW0oKT8iYSI6InQiKSsoaW5kZXggPj0gMCA/IGluZGV4IDogU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpKyI6Iit0eXBlQ2hhcigpOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVidWdTdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IHRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgcyA9IHBhcmFtU3RyaW5nKCk7CiAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uID09IG51bGwpID8gcyA6IHMgKyAiPSIgKyBleHByU3RyaW5nKCk7CiAgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBwYXJhbVN0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gdG9TdHJpbmcoKTsKKyAgICAgICAgICAgIE9iamVjdCBjID0gY29uc3RyYWludDsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIENsYXNzKSAgYyA9ICgoQ2xhc3M8Pz4pYykuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIHMgKyAiLyIgKyBjOworICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZXhwclN0cmluZygpIHsKLSAgICAgICAgICAgIGlmIChmdW5jdGlvbiA9PSBudWxsKSAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbiA9PSBudWxsKSAgcmV0dXJuIHRvU3RyaW5nKCk7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZ1bmN0aW9uLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgYnVmLmFwcGVuZCgiKCIpOwogICAgICAgICAgICAgU3RyaW5nIGNtYSA9ICIiOwpAQCAtMTQyMyw0OCArMTUwNSwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlc01hdGNoKGNoYXIgcGFyYW1ldGVyVHlwZSwgT2JqZWN0IG9iamVjdCkgeworICAgICAgICBzdGF0aWMgYm9vbGVhbiB0eXBlc01hdGNoKEJhc2ljVHlwZSBwYXJhbWV0ZXJUeXBlLCBPYmplY3Qgb2JqZWN0KSB7CiAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgICAgIHJldHVybiAoKE5hbWUpb2JqZWN0KS50eXBlID09IHBhcmFtZXRlclR5cGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdJJzogIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyOwotICAgICAgICAgICAgICAgIGNhc2UgJ0onOiAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIExvbmc7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRic6ICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRmxvYXQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRCc6ICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgSV9UWVBFOiAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEludGVnZXI7CisgICAgICAgICAgICAgICAgY2FzZSBKX1RZUEU6ICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgTG9uZzsKKyAgICAgICAgICAgICAgICBjYXNlIEZfVFlQRTogIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBGbG9hdDsKKyAgICAgICAgICAgICAgICBjYXNlIERfVFlQRTogIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBEb3VibGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnQocGFyYW1ldGVyVHlwZSA9PSAnTCcpOworICAgICAgICAgICAgYXNzZXJ0KHBhcmFtZXRlclR5cGUgPT0gTF9UWVBFKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvZXMgdGhpcyBOYW1lIHByZWNlZGUgdGhlIGdpdmVuIGJpbmRpbmcgbm9kZSBpbiBzb21lIGNhbm9uaWNhbCBvcmRlcj8KLSAgICAgICAgICogVGhpcyBwcmVkaWNhdGUgaXMgdXNlZCB0byBvcmRlciBkYXRhIGJpbmRpbmdzICh2aWEgaW5zZXJ0aW9uIHNvcnQpCi0gICAgICAgICAqIHdpdGggc29tZSBzdGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIGlzU2libGluZ0JpbmRpbmdCZWZvcmUoTmFtZSBiaW5kaW5nKSB7Ci0gICAgICAgICAgICBhc3NlcnQoIWJpbmRpbmcuaXNQYXJhbSgpKTsKLSAgICAgICAgICAgIGlmIChpc1BhcmFtKCkpICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChmdW5jdGlvbi5lcXVhbHMoYmluZGluZy5mdW5jdGlvbikgJiYKLSAgICAgICAgICAgICAgICBhcmd1bWVudHMubGVuZ3RoID09IGJpbmRpbmcuYXJndW1lbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2F3SW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGExID0gYXJndW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTIgPSBiaW5kaW5nLmFyZ3VtZW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhMS5lcXVhbHMoYTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYTEgaW5zdGFuY2VvZiBJbnRlZ2VyICYmIGEyIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdJbnQpICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXdJbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KWExIDwgKGludClhMikgIGNvbnRpbnVlOyAgLy8gc3RpbGwgbWlnaHQgYmUgdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzYXdJbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQogICAgICAgICAvKiogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIG4gaW4gdGhlIGFyZ3VtZW50IGFycmF5LgogICAgICAgICAgKiAgUmV0dXJuIC0xIGlmIHRoZSBuYW1lIGlzIG5vdCB1c2VkLgogICAgICAgICAgKi8KQEAgLTE1MTAsNyArMTU2NCw3IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICAgICAgaWYgKGlzUGFyYW0oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggfCAodHlwZSA8PCA4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggfCAodHlwZS5vcmRpbmFsKCkgPDwgOCk7CiAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24uaGFzaENvZGUoKSBeIEFycmF5cy5oYXNoQ29kZShhcmd1bWVudHMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU0NSwxNCArMTU5OSwxNyBAQAogICAgIH0KIAogICAgIHN0YXRpYyBOYW1lIGFyZ3VtZW50KGludCB3aGljaCwgY2hhciB0eXBlKSB7Ci0gICAgICAgIGludCB0biA9IEFMTF9UWVBFUy5pbmRleE9mKHR5cGUpOwotICAgICAgICBpZiAodG4gPCAwIHx8IHdoaWNoID49IElOVEVSTkVEX0FSR1VNRU5UX0xJTUlUKQorICAgICAgICByZXR1cm4gYXJndW1lbnQod2hpY2gsIGJhc2ljVHlwZSh0eXBlKSk7CisgICAgfQorICAgIHN0YXRpYyBOYW1lIGFyZ3VtZW50KGludCB3aGljaCwgQmFzaWNUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHdoaWNoID49IElOVEVSTkVEX0FSR1VNRU5UX0xJTUlUKQogICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1lKHdoaWNoLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIElOVEVSTkVEX0FSR1VNRU5UU1t0bl1bd2hpY2hdOworICAgICAgICByZXR1cm4gSU5URVJORURfQVJHVU1FTlRTW3R5cGUub3JkaW5hbCgpXVt3aGljaF07CiAgICAgfQogICAgIHN0YXRpYyBOYW1lIGludGVybkFyZ3VtZW50KE5hbWUgbikgewogICAgICAgICBhc3NlcnQobi5pc1BhcmFtKCkpIDogIm5vdCBwYXJhbTogIiArIG47CiAgICAgICAgIGFzc2VydChuLmluZGV4IDwgSU5URVJORURfQVJHVU1FTlRfTElNSVQpOworICAgICAgICBpZiAobi5jb25zdHJhaW50ICE9IG51bGwpICByZXR1cm4gbjsKICAgICAgICAgcmV0dXJuIGFyZ3VtZW50KG4uaW5kZXgsIG4udHlwZSk7CiAgICAgfQogICAgIHN0YXRpYyBOYW1lW10gYXJndW1lbnRzKGludCBleHRyYSwgU3RyaW5nIHR5cGVzKSB7CkBAIC0xNTkwLDU2ICsxNjQ3LDExOCBAQAogICAgICAgICAgICAgbmFtZXNbaV0gPSBhcmd1bWVudChpLCBiYXNpY1R5cGUodHlwZXMucGFyYW1ldGVyVHlwZShpKSkpOwogICAgICAgICByZXR1cm4gbmFtZXM7CiAgICAgfQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX1RZUEVTID0gIkxJSkZEIjsgIC8vIG9taXQgViwgbm90IGFuIGFyZ3VtZW50IHR5cGUKICAgICBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVEX0FSR1VNRU5UX0xJTUlUID0gMTA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZVtdW10gSU5URVJORURfQVJHVU1FTlRTCi0gICAgICAgICAgICA9IG5ldyBOYW1lW0FMTF9UWVBFUy5sZW5ndGgoKV1bSU5URVJORURfQVJHVU1FTlRfTElNSVRdOworICAgICAgICAgICAgPSBuZXcgTmFtZVtBUkdfVFlQRV9MSU1JVF1bSU5URVJORURfQVJHVU1FTlRfTElNSVRdOwogICAgIHN0YXRpYyB7Ci0gICAgICAgIGZvciAoaW50IHRuID0gMDsgdG4gPCBBTExfVFlQRVMubGVuZ3RoKCk7IHRuKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5URVJORURfQVJHVU1FTlRTW3RuXS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgdHlwZSA9IEFMTF9UWVBFUy5jaGFyQXQodG4pOwotICAgICAgICAgICAgICAgIElOVEVSTkVEX0FSR1VNRU5UU1t0bl1baV0gPSBuZXcgTmFtZShpLCB0eXBlKTsKKyAgICAgICAgZm9yIChCYXNpY1R5cGUgdHlwZSA6IEJhc2ljVHlwZS5BUkdfVFlQRVMpIHsKKyAgICAgICAgICAgIGludCBvcmQgPSB0eXBlLm9yZGluYWwoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5URVJORURfQVJHVU1FTlRTW29yZF0ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBJTlRFUk5FRF9BUkdVTUVOVFNbb3JkXVtpXSA9IG5ldyBOYW1lKGksIHR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVtYmVyTmFtZS5GYWN0b3J5IElNUExfTkFNRVMgPSBNZW1iZXJOYW1lLmdldEZhY3RvcnkoKTsKIAotICAgIHN0YXRpYyBOYW1lIGNvbnN0YW50WmVybyhpbnQgd2hpY2gsIGNoYXIgdHlwZSkgewotICAgICAgICByZXR1cm4gQ09OU1RBTlRfWkVST1tBTExfVFlQRVMuaW5kZXhPZih0eXBlKV0ubmV3SW5kZXgod2hpY2gpOworICAgIHN0YXRpYyBMYW1iZGFGb3JtIGlkZW50aXR5Rm9ybShCYXNpY1R5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gTEZfaWRlbnRpdHlGb3JtW3R5cGUub3JkaW5hbCgpXTsKICAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZVtdIENPTlNUQU5UX1pFUk8KLSAgICAgICAgICAgID0gbmV3IE5hbWVbQUxMX1RZUEVTLmxlbmd0aCgpXTsKLSAgICBzdGF0aWMgewotICAgICAgICBmb3IgKGludCB0biA9IDA7IHRuIDwgQUxMX1RZUEVTLmxlbmd0aCgpOyB0bisrKSB7Ci0gICAgICAgICAgICBjaGFyIGJ0ID0gQUxMX1RZUEVTLmNoYXJBdCh0bik7Ci0gICAgICAgICAgICBXcmFwcGVyIHdyYXAgPSBXcmFwcGVyLmZvckJhc2ljVHlwZShidCk7Ci0gICAgICAgICAgICBNZW1iZXJOYW1lIHptZW0gPSBuZXcgTWVtYmVyTmFtZShMYW1iZGFGb3JtLmNsYXNzLCAiemVybyIrYnQsIE1ldGhvZFR5cGUubWV0aG9kVHlwZSh3cmFwLnByaW1pdGl2ZVR5cGUoKSksIFJFRl9pbnZva2VTdGF0aWMpOworICAgIHN0YXRpYyBMYW1iZGFGb3JtIHplcm9Gb3JtKEJhc2ljVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBMRl96ZXJvRm9ybVt0eXBlLm9yZGluYWwoKV07CisgICAgfQorICAgIHN0YXRpYyBOYW1lZEZ1bmN0aW9uIGlkZW50aXR5KEJhc2ljVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBORl9pZGVudGl0eVt0eXBlLm9yZGluYWwoKV07CisgICAgfQorICAgIHN0YXRpYyBOYW1lZEZ1bmN0aW9uIGNvbnN0YW50WmVybyhCYXNpY1R5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gTkZfemVyb1t0eXBlLm9yZGluYWwoKV07CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExhbWJkYUZvcm1bXSBMRl9pZGVudGl0eUZvcm0gPSBuZXcgTGFtYmRhRm9ybVtUWVBFX0xJTUlUXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMYW1iZGFGb3JtW10gTEZfemVyb0Zvcm0gPSBuZXcgTGFtYmRhRm9ybVtUWVBFX0xJTUlUXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lZEZ1bmN0aW9uW10gTkZfaWRlbnRpdHkgPSBuZXcgTmFtZWRGdW5jdGlvbltUWVBFX0xJTUlUXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lZEZ1bmN0aW9uW10gTkZfemVybyA9IG5ldyBOYW1lZEZ1bmN0aW9uW1RZUEVfTElNSVRdOworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlSWRlbnRpdHlGb3JtcygpIHsKKyAgICAgICAgZm9yIChCYXNpY1R5cGUgdHlwZSA6IEJhc2ljVHlwZS5BTExfVFlQRVMpIHsKKyAgICAgICAgICAgIGludCBvcmQgPSB0eXBlLm9yZGluYWwoKTsKKyAgICAgICAgICAgIGNoYXIgYnRDaGFyID0gdHlwZS5iYXNpY1R5cGVDaGFyKCk7CisgICAgICAgICAgICBib29sZWFuIGlzVm9pZCA9ICh0eXBlID09IFZfVFlQRSk7CisgICAgICAgICAgICBDbGFzczw/PiBidENsYXNzID0gdHlwZS5idENsYXNzOworICAgICAgICAgICAgTWV0aG9kVHlwZSB6ZVR5cGUgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUoYnRDbGFzcyk7CisgICAgICAgICAgICBNZXRob2RUeXBlIGlkVHlwZSA9IGlzVm9pZCA/IHplVHlwZSA6IHplVHlwZS5hcHBlbmRQYXJhbWV0ZXJUeXBlcyhidENsYXNzKTsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBzb21lIHN5bWJvbGljIG5hbWVzLiAgSXQgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSB0byBoYXZlIHRoZXNlLAorICAgICAgICAgICAgLy8gYnV0IGlmIHdlIG5lZWQgdG8gZW1pdCBkaXJlY3QgcmVmZXJlbmNlcyB0byBieXRlY29kZXMsIGl0IGhlbHBzLgorICAgICAgICAgICAgLy8gWmVybyBpcyBidWlsdCBmcm9tIGEgY2FsbCB0byBhbiBpZGVudGl0eSBmdW5jdGlvbiB3aXRoIGEgY29uc3RhbnQgemVybyBpbnB1dC4KKyAgICAgICAgICAgIE1lbWJlck5hbWUgaWRNZW0gPSBuZXcgTWVtYmVyTmFtZShMYW1iZGFGb3JtLmNsYXNzLCAiaWRlbnRpdHlfIitidENoYXIsIGlkVHlwZSwgUkVGX2ludm9rZVN0YXRpYyk7CisgICAgICAgICAgICBNZW1iZXJOYW1lIHplTWVtID0gbmV3IE1lbWJlck5hbWUoTGFtYmRhRm9ybS5jbGFzcywgInplcm9fIitidENoYXIsIHplVHlwZSwgUkVGX2ludm9rZVN0YXRpYyk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHptZW0gPSBJTVBMX05BTUVTLnJlc29sdmVPckZhaWwoUkVGX2ludm9rZVN0YXRpYywgem1lbSwgbnVsbCwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB6ZU1lbSA9IElNUExfTkFNRVMucmVzb2x2ZU9yRmFpbChSRUZfaW52b2tlU3RhdGljLCB6ZU1lbSwgbnVsbCwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZE1lbSA9IElNUExfTkFNRVMucmVzb2x2ZU9yRmFpbChSRUZfaW52b2tlU3RhdGljLCBpZE1lbSwgbnVsbCwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcihleCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBOYW1lZEZ1bmN0aW9uIHpjb24gPSBuZXcgTmFtZWRGdW5jdGlvbih6bWVtKTsKLSAgICAgICAgICAgIE5hbWUgbiA9IG5ldyBOYW1lKHpjb24pLm5ld0luZGV4KDApOwotICAgICAgICAgICAgYXNzZXJ0KG4udHlwZSA9PSBBTExfVFlQRVMuY2hhckF0KHRuKSk7Ci0gICAgICAgICAgICBDT05TVEFOVF9aRVJPW3RuXSA9IG47Ci0gICAgICAgICAgICBhc3NlcnQobi5pc0NvbnN0YW50WmVybygpKTsKKworICAgICAgICAgICAgTmFtZWRGdW5jdGlvbiBpZEZ1biA9IG5ldyBOYW1lZEZ1bmN0aW9uKGlkTWVtKTsKKyAgICAgICAgICAgIExhbWJkYUZvcm0gaWRGb3JtOworICAgICAgICAgICAgaWYgKGlzVm9pZCkgeworICAgICAgICAgICAgICAgIE5hbWVbXSBpZE5hbWVzID0gbmV3IE5hbWVbXSB7IGFyZ3VtZW50KDAsIExfVFlQRSkgfTsKKyAgICAgICAgICAgICAgICBpZEZvcm0gPSBuZXcgTGFtYmRhRm9ybShpZE1lbS5nZXROYW1lKCksIDEsIGlkTmFtZXMsIFZPSURfUkVTVUxUKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTmFtZVtdIGlkTmFtZXMgPSBuZXcgTmFtZVtdIHsgYXJndW1lbnQoMCwgTF9UWVBFKSwgYXJndW1lbnQoMSwgdHlwZSkgfTsKKyAgICAgICAgICAgICAgICBpZEZvcm0gPSBuZXcgTGFtYmRhRm9ybShpZE1lbS5nZXROYW1lKCksIDIsIGlkTmFtZXMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTEZfaWRlbnRpdHlGb3JtW29yZF0gPSBpZEZvcm07CisgICAgICAgICAgICBORl9pZGVudGl0eVtvcmRdID0gaWRGdW47CisKKyAgICAgICAgICAgIE5hbWVkRnVuY3Rpb24gemVGdW4gPSBuZXcgTmFtZWRGdW5jdGlvbih6ZU1lbSk7CisgICAgICAgICAgICBMYW1iZGFGb3JtIHplRm9ybTsKKyAgICAgICAgICAgIGlmIChpc1ZvaWQpIHsKKyAgICAgICAgICAgICAgICB6ZUZvcm0gPSBpZEZvcm07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE9iamVjdCB6ZVZhbHVlID0gV3JhcHBlci5mb3JCYXNpY1R5cGUoYnRDaGFyKS56ZXJvKCk7CisgICAgICAgICAgICAgICAgTmFtZVtdIHplTmFtZXMgPSBuZXcgTmFtZVtdIHsgYXJndW1lbnQoMCwgTF9UWVBFKSwgbmV3IE5hbWUoaWRGdW4sIHplVmFsdWUpIH07CisgICAgICAgICAgICAgICAgemVGb3JtID0gbmV3IExhbWJkYUZvcm0oemVNZW0uZ2V0TmFtZSgpLCAxLCB6ZU5hbWVzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExGX3plcm9Gb3JtW29yZF0gPSB6ZUZvcm07CisgICAgICAgICAgICBORl96ZXJvW29yZF0gPSB6ZUZ1bjsKKworICAgICAgICAgICAgYXNzZXJ0KGlkRnVuLmlzSWRlbnRpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnQoemVGdW4uaXNDb25zdGFudFplcm8oKSk7CisgICAgICAgICAgICBhc3NlcnQobmV3IE5hbWUoemVGdW4pLmlzQ29uc3RhbnRaZXJvKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gdGhpcyBpbiBhIHNlcGFyYXRlIHBhc3MsIHNvIHRoYXQgU2ltcGxlTWV0aG9kSGFuZGxlLm1ha2UgY2FuIHNlZSB0aGUgdGFibGVzLgorICAgICAgICBmb3IgKEJhc2ljVHlwZSB0eXBlIDogQmFzaWNUeXBlLkFMTF9UWVBFUykgeworICAgICAgICAgICAgaW50IG9yZCA9IHR5cGUub3JkaW5hbCgpOworICAgICAgICAgICAgTmFtZWRGdW5jdGlvbiBpZEZ1biA9IE5GX2lkZW50aXR5W29yZF07CisgICAgICAgICAgICBMYW1iZGFGb3JtIGlkRm9ybSA9IExGX2lkZW50aXR5Rm9ybVtvcmRdOworICAgICAgICAgICAgTWVtYmVyTmFtZSBpZE1lbSA9IGlkRnVuLm1lbWJlcjsKKyAgICAgICAgICAgIGlkRnVuLnJlc29sdmVkSGFuZGxlID0gU2ltcGxlTWV0aG9kSGFuZGxlLm1ha2UoaWRNZW0uZ2V0SW52b2NhdGlvblR5cGUoKSwgaWRGb3JtKTsKKworICAgICAgICAgICAgTmFtZWRGdW5jdGlvbiB6ZUZ1biA9IE5GX3plcm9bb3JkXTsKKyAgICAgICAgICAgIExhbWJkYUZvcm0gemVGb3JtID0gTEZfemVyb0Zvcm1bb3JkXTsKKyAgICAgICAgICAgIE1lbWJlck5hbWUgemVNZW0gPSB6ZUZ1bi5tZW1iZXI7CisgICAgICAgICAgICB6ZUZ1bi5yZXNvbHZlZEhhbmRsZSA9IFNpbXBsZU1ldGhvZEhhbmRsZS5tYWtlKHplTWVtLmdldEludm9jYXRpb25UeXBlKCksIHplRm9ybSk7CisKKyAgICAgICAgICAgIGFzc2VydChpZEZ1bi5pc0lkZW50aXR5KCkpOworICAgICAgICAgICAgYXNzZXJ0KHplRnVuLmlzQ29uc3RhbnRaZXJvKCkpOworICAgICAgICAgICAgYXNzZXJ0KG5ldyBOYW1lKHplRnVuKS5pc0NvbnN0YW50WmVybygpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEF2b2lkIGFwcGVhbGluZyB0byBWYWx1ZUNvbnZlcnNpb25zIGF0IGJvb3RzdHJhcCB0aW1lOgotICAgIHByaXZhdGUgc3RhdGljIGludCB6ZXJvSSgpIHsgcmV0dXJuIDA7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHplcm9KKCkgeyByZXR1cm4gMDsgfQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHplcm9GKCkgeyByZXR1cm4gMDsgfQotICAgIHByaXZhdGUgc3RhdGljIGRvdWJsZSB6ZXJvRCgpIHsgcmV0dXJuIDA7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgemVyb0woKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICAvLyBQdXQgdGhpcyBsYXN0LCBzbyB0aGF0IHByZXZpb3VzIHN0YXRpYyBpbml0cyBjYW4gcnVuIGJlZm9yZS4KLSAgICBzdGF0aWMgewotICAgICAgICBpZiAoVVNFX1BSRURFRklORURfSU5URVJQUkVUX01FVEhPRFMpCi0gICAgICAgICAgICBQUkVQQVJFRF9GT1JNUy5wdXRBbGwoY29tcHV0ZUluaXRpYWxQcmVwYXJlZEZvcm1zKCkpOwotICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaWRlbnRpdHlfSShpbnQgeCkgeyByZXR1cm4geDsgfQorICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWRlbnRpdHlfSihsb25nIHgpIHsgcmV0dXJuIHg7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBpZGVudGl0eV9GKGZsb2F0IHgpIHsgcmV0dXJuIHg7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBkb3VibGUgaWRlbnRpdHlfRChkb3VibGUgeCkgeyByZXR1cm4geDsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpZGVudGl0eV9MKE9iamVjdCB4KSB7IHJldHVybiB4OyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZGVudGl0eV9WKCkgeyByZXR1cm47IH0gIC8vIHNhbWUgYXMgemVyb1YsIGJ1dCB0aGF0J3MgT0sKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgemVyb19JKCkgeyByZXR1cm4gMDsgfQorICAgIHByaXZhdGUgc3RhdGljIGxvbmcgemVyb19KKCkgeyByZXR1cm4gMDsgfQorICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHplcm9fRigpIHsgcmV0dXJuIDA7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBkb3VibGUgemVyb19EKCkgeyByZXR1cm4gMDsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCB6ZXJvX0woKSB7IHJldHVybiBudWxsOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB6ZXJvX1YoKSB7IHJldHVybjsgfQogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgbWFya2VyIGZvciBieXRlLWNvbXBpbGVkIExhbWJkYUZvcm1zLgpAQCAtMTY1OSwzOCArMTc3OCwyMSBAQAogICAgIEBpbnRlcmZhY2UgSGlkZGVuIHsKICAgICB9CiAKLQotLyoKLSAgICAvLyBTbW9rZS10ZXN0IGZvciB0aGUgaW52b2tlcnMgdXNlZCBpbiB0aGlzIGZpbGUuCi0gICAgc3RhdGljIHZvaWQgdGVzdE1ldGhvZEhhbmRsZUxpbmtlcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTWVtYmVyTmFtZS5GYWN0b3J5IGxvb2t1cCA9IE1lbWJlck5hbWUuZ2V0RmFjdG9yeSgpOwotICAgICAgICBNZW1iZXJOYW1lIGFzTGlzdF9NTiA9IG5ldyBNZW1iZXJOYW1lKEFycmF5cy5jbGFzcywgImFzTGlzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZS5tZXRob2RUeXBlKExpc3QuY2xhc3MsIE9iamVjdFtdLmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZfaW52b2tlU3RhdGljKTsKLSAgICAgICAgLy9NZXRob2RIYW5kbGVOYXRpdmVzLnJlc29sdmUoYXNMaXN0X01OLCBudWxsKTsKLSAgICAgICAgYXNMaXN0X01OID0gbG9va3VwLnJlc29sdmVPckZhaWwoYXNMaXN0X01OLCBSRUZfaW52b2tlU3RhdGljLCBudWxsLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFib3V0IHRvIGNhbGwgIithc0xpc3RfTU4pOwotICAgICAgICBPYmplY3RbXSBhYmMgPSB7ICJhIiwgImJjIiB9OwotICAgICAgICBMaXN0PD8+IGxzdCA9IChMaXN0PD8+KSBNZXRob2RIYW5kbGUubGlua1RvU3RhdGljKGFiYywgYXNMaXN0X01OKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJsc3Q9Iitsc3QpOwotICAgICAgICBNZW1iZXJOYW1lIHRvU3RyaW5nX01OID0gbmV3IE1lbWJlck5hbWUoT2JqZWN0LmNsYXNzLmdldE1ldGhvZCgidG9TdHJpbmciKSk7Ci0gICAgICAgIFN0cmluZyBzMSA9IChTdHJpbmcpIE1ldGhvZEhhbmRsZS5saW5rVG9WaXJ0dWFsKGxzdCwgdG9TdHJpbmdfTU4pOwotICAgICAgICB0b1N0cmluZ19NTiA9IG5ldyBNZW1iZXJOYW1lKE9iamVjdC5jbGFzcy5nZXRNZXRob2QoInRvU3RyaW5nIiksIHRydWUpOwotICAgICAgICBTdHJpbmcgczIgPSAoU3RyaW5nKSBNZXRob2RIYW5kbGUubGlua1RvU3BlY2lhbChsc3QsIHRvU3RyaW5nX01OKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbczEsczIsbHN0XT0iK0FycmF5cy5hc0xpc3QoczEsIHMyLCBsc3QudG9TdHJpbmcoKSkpOwotICAgICAgICBNZW1iZXJOYW1lIHRvQXJyYXlfTU4gPSBuZXcgTWVtYmVyTmFtZShMaXN0LmNsYXNzLmdldE1ldGhvZCgidG9BcnJheSIpKTsKLSAgICAgICAgT2JqZWN0W10gYXJyID0gKE9iamVjdFtdKSBNZXRob2RIYW5kbGUubGlua1RvSW50ZXJmYWNlKGxzdCwgdG9BcnJheV9NTik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidG9BcnJheT0iK0FycmF5cy50b1N0cmluZyhhcnIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPiBERUJVR19OQU1FX0NPVU5URVJTOworICAgIHN0YXRpYyB7CisgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIERFQlVHX05BTUVfQ09VTlRFUlMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIERFQlVHX05BTUVfQ09VTlRFUlMgPSBudWxsOwogICAgIH0KLSAgICBzdGF0aWMgeyB0cnkgeyB0ZXN0TWV0aG9kSGFuZGxlTGlua2VycygpOyB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOyB9IH0KLSAgICAvLyBSZXF1aXJlcyB0aGVzZSBkZWZpbml0aW9ucyBpbiBNZXRob2RIYW5kbGU6Ci0gICAgc3RhdGljIGZpbmFsIG5hdGl2ZSBPYmplY3QgbGlua1RvU3RhdGljKE9iamVjdCB4MSwgTWVtYmVyTmFtZSBtbikgdGhyb3dzIFRocm93YWJsZTsKLSAgICBzdGF0aWMgZmluYWwgbmF0aXZlIE9iamVjdCBsaW5rVG9WaXJ0dWFsKE9iamVjdCB4MSwgTWVtYmVyTmFtZSBtbikgdGhyb3dzIFRocm93YWJsZTsKLSAgICBzdGF0aWMgZmluYWwgbmF0aXZlIE9iamVjdCBsaW5rVG9TcGVjaWFsKE9iamVjdCB4MSwgTWVtYmVyTmFtZSBtbikgdGhyb3dzIFRocm93YWJsZTsKLSAgICBzdGF0aWMgZmluYWwgbmF0aXZlIE9iamVjdCBsaW5rVG9JbnRlcmZhY2UoT2JqZWN0IHgxLCBNZW1iZXJOYW1lIG1uKSB0aHJvd3MgVGhyb3dhYmxlOwotICovCiAKLSAgICBzdGF0aWMgeyBOYW1lZEZ1bmN0aW9uLmluaXRpYWxpemVJbnZva2VycygpOyB9CisgICAgLy8gUHV0IHRoaXMgbGFzdCwgc28gdGhhdCBwcmV2aW91cyBzdGF0aWMgaW5pdHMgY2FuIHJ1biBiZWZvcmUuCisgICAgc3RhdGljIHsKKyAgICAgICAgY3JlYXRlSWRlbnRpdHlGb3JtcygpOworICAgICAgICBpZiAoVVNFX1BSRURFRklORURfSU5URVJQUkVUX01FVEhPRFMpCisgICAgICAgICAgICBjb21wdXRlSW5pdGlhbFByZXBhcmVkRm9ybXMoKTsKKyAgICAgICAgTmFtZWRGdW5jdGlvbi5pbml0aWFsaXplSW52b2tlcnMoKTsKKyAgICB9CiAKICAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHN1cHByZXNzIFRSQUNFX0lOVEVSUFJFVEVSCiAgICAgLy8gZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgc3RhdGljIGluaXRpYWxpemVzIG9mIHRoaXMgY2xhc3MuCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0xhbWJkYUZvcm1CdWZmZXIuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTGFtYmRhRm9ybUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MmEyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0xhbWJkYUZvcm1CdWZmZXIuamF2YQpAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZhLmxhbmcuaW52b2tlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uKjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5MYW1iZGFGb3JtLkJhc2ljVHlwZS4qOworCisvKiogV29ya2luZyBzdG9yYWdlIGZvciBhbiBMRiB0aGF0IGlzIGJlaW5nIHRyYW5zZm9ybWVkLgorICogIFNpbWlsYXJseSB0byBhIFN0cmluZ0J1ZmZlciwgdGhlIGVkaXRpbmcgY2FuIHRha2UgcGxhY2UgaW4gbXVsdGlwbGUgc3RlcHMuCisgKi8KK2ZpbmFsIGNsYXNzIExhbWJkYUZvcm1CdWZmZXIgeworICAgIHByaXZhdGUgaW50IGFyaXR5LCBsZW5ndGg7CisgICAgcHJpdmF0ZSBOYW1lW10gbmFtZXM7CisgICAgcHJpdmF0ZSBOYW1lW10gb3JpZ2luYWxOYW1lczsgIC8vIHNuYXBzaG90IG9mIHByZS10cmFuc2FjdGlvbiBuYW1lcworICAgIHByaXZhdGUgYnl0ZSBmbGFnczsKKyAgICBwcml2YXRlIGludCBmaXJzdENoYW5nZTsKKyAgICBwcml2YXRlIE5hbWUgcmVzdWx0TmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWJ1Z05hbWU7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TmFtZT4gZHVwczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGX1RSQU5TID0gMHgxMCwgRl9PV05FRCA9IDB4MDM7CisKKyAgICBMYW1iZGFGb3JtQnVmZmVyKExhbWJkYUZvcm0gbGYpIHsKKyAgICAgICAgdGhpcyhsZi5hcml0eSwgbGYubmFtZXMsIGxmLnJlc3VsdCk7CisgICAgICAgIGRlYnVnTmFtZSA9IGxmLmRlYnVnTmFtZTsKKyAgICAgICAgYXNzZXJ0KGxmLm5hbWVSZWZzQXJlTGVnYWwoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMYW1iZGFGb3JtQnVmZmVyKGludCBhcml0eSwgTmFtZVtdIG5hbWVzLCBpbnQgcmVzdWx0KSB7CisgICAgICAgIHRoaXMuYXJpdHkgPSBhcml0eTsKKyAgICAgICAgc2V0TmFtZXMobmFtZXMpOworICAgICAgICBpZiAocmVzdWx0ID09IExBU1RfUkVTVUxUKSAgcmVzdWx0ID0gbGVuZ3RoIC0gMTsKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAwICYmIG5hbWVzW3Jlc3VsdF0udHlwZSAhPSBWX1RZUEUpCisgICAgICAgICAgICByZXN1bHROYW1lID0gbmFtZXNbcmVzdWx0XTsKKyAgICB9CisKKyAgICBwcml2YXRlIExhbWJkYUZvcm0gbGFtYmRhRm9ybSgpIHsKKyAgICAgICAgYXNzZXJ0KCFpblRyYW5zKCkpOyAgLy8gbmVlZCBlbmRFZGl0IGNhbGwgdG8gdGlkeSB0aGluZ3MgdXAKKyAgICAgICAgcmV0dXJuIG5ldyBMYW1iZGFGb3JtKGRlYnVnTmFtZSwgYXJpdHksIG5hbWVBcnJheSgpLCByZXN1bHRJbmRleCgpKTsKKyAgICB9CisKKyAgICBOYW1lIG5hbWUoaW50IGkpIHsKKyAgICAgICAgYXNzZXJ0KGkgPCBsZW5ndGgpOworICAgICAgICByZXR1cm4gbmFtZXNbaV07CisgICAgfQorCisgICAgTmFtZVtdIG5hbWVBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YobmFtZXMsIGxlbmd0aCk7CisgICAgfQorCisgICAgaW50IHJlc3VsdEluZGV4KCkgeworICAgICAgICBpZiAocmVzdWx0TmFtZSA9PSBudWxsKSAgcmV0dXJuIFZPSURfUkVTVUxUOworICAgICAgICBpbnQgaW5kZXggPSBpbmRleE9mKHJlc3VsdE5hbWUsIG5hbWVzKTsKKyAgICAgICAgYXNzZXJ0KGluZGV4ID49IDApOworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgdm9pZCBzZXROYW1lcyhOYW1lW10gbmFtZXMyKSB7CisgICAgICAgIG5hbWVzID0gb3JpZ2luYWxOYW1lcyA9IG5hbWVzMjsgIC8vIGtlZXAgYSByZWNvcmQgb2Ygd2hlcmUgZXZlcnl0aGluZyB3YXMgdG8gc3RhcnQgd2l0aAorICAgICAgICBsZW5ndGggPSBuYW1lczIubGVuZ3RoOworICAgICAgICBmbGFncyA9IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeUFyaXR5KCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyaXR5ICYmIGkgPCBmaXJzdENoYW5nZTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnQobmFtZXNbaV0uaXNQYXJhbSgpKSA6ICIjIiArIGkgKyAiPSIgKyBuYW1lc1tpXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gYXJpdHk7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0KCFuYW1lc1tpXS5pc1BhcmFtKCkpIDogIiMiICsgaSArICI9IiArIG5hbWVzW2ldOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBsZW5ndGg7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0KG5hbWVzW2ldID09IG51bGwpIDogIiMiICsgaSArICI9IiArIG5hbWVzW2ldOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIHJlc3VsdE5hbWUgYWxzbworICAgICAgICBpZiAocmVzdWx0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0SW5kZXggPSBpbmRleE9mKHJlc3VsdE5hbWUsIG5hbWVzKTsKKyAgICAgICAgICAgIGFzc2VydChyZXN1bHRJbmRleCA+PSAwKSA6ICJub3QgZm91bmQ6ICIgKyByZXN1bHROYW1lLmV4cHJTdHJpbmcoKSArIEFycmF5cy5hc0xpc3QobmFtZXMpOworICAgICAgICAgICAgYXNzZXJ0KG5hbWVzW3Jlc3VsdEluZGV4XSA9PSByZXN1bHROYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5Rmlyc3RDaGFuZ2UoKSB7CisgICAgICAgIGFzc2VydChpblRyYW5zKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZXNbaV0gIT0gb3JpZ2luYWxOYW1lc1tpXSkgeworICAgICAgICAgICAgICAgIGFzc2VydChmaXJzdENoYW5nZSA9PSBpKSA6IEFycmF5cy5hc0xpc3QoZmlyc3RDaGFuZ2UsIGksIG9yaWdpbmFsTmFtZXNbaV0uZXhwclN0cmluZygpLCBBcnJheXMuYXNMaXN0KG5hbWVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGZpcnN0Q2hhbmdlID09IGxlbmd0aCkgOiBBcnJheXMuYXNMaXN0KGZpcnN0Q2hhbmdlLCBBcnJheXMuYXNMaXN0KG5hbWVzKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBpbmRleE9mKE5hbWVkRnVuY3Rpb24gZm4sIE5hbWVkRnVuY3Rpb25bXSBmbnMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmbnNbaV0gPT0gZm4pICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoTmFtZSBuLCBOYW1lW10gbnMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG5zW2ldID09IG4pICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYm9vbGVhbiBpblRyYW5zKCkgeworICAgICAgICByZXR1cm4gKGZsYWdzICYgRl9UUkFOUykgIT0gMDsKKyAgICB9CisKKyAgICBpbnQgb3duZWRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzICYgRl9PV05FRDsKKyAgICB9CisKKyAgICB2b2lkIGdyb3dOYW1lcyhpbnQgaW5zZXJ0UG9zLCBpbnQgZ3Jvd0xlbmd0aCkgeworICAgICAgICBpbnQgb2xkTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICBpbnQgbmV3TGVuZ3RoID0gb2xkTGVuZ3RoICsgZ3Jvd0xlbmd0aDsKKyAgICAgICAgaW50IG9jID0gb3duZWRDb3VudCgpOworICAgICAgICBpZiAob2MgPT0gMCB8fCBuZXdMZW5ndGggPiBuYW1lcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIG5hbWVzID0gQXJyYXlzLmNvcHlPZihuYW1lcywgKG5hbWVzLmxlbmd0aCArIGdyb3dMZW5ndGgpICogNSAvIDQpOworICAgICAgICAgICAgaWYgKG9jID09IDApIHsKKyAgICAgICAgICAgICAgICBmbGFncysrOworICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG93bmVkQ291bnQoKSA9PSBvYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9yaWdpbmFsTmFtZXMgIT0gbnVsbCAmJiBvcmlnaW5hbE5hbWVzLmxlbmd0aCA8IG5hbWVzLmxlbmd0aCkgeworICAgICAgICAgICAgb3JpZ2luYWxOYW1lcyA9IEFycmF5cy5jb3B5T2Yob3JpZ2luYWxOYW1lcywgbmFtZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChvYyA9PSAxKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MrKzsKKyAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgIGFzc2VydChvd25lZENvdW50KCkgPT0gb2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChncm93TGVuZ3RoID09IDApICByZXR1cm47CisgICAgICAgIGludCBpbnNlcnRFbmQgPSBpbnNlcnRQb3MgKyBncm93TGVuZ3RoOworICAgICAgICBpbnQgdGFpbExlbmd0aCA9IG9sZExlbmd0aCAtIGluc2VydFBvczsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lcywgaW5zZXJ0UG9zLCBuYW1lcywgaW5zZXJ0RW5kLCB0YWlsTGVuZ3RoKTsKKyAgICAgICAgQXJyYXlzLmZpbGwobmFtZXMsIGluc2VydFBvcywgaW5zZXJ0RW5kLCBudWxsKTsKKyAgICAgICAgaWYgKG9yaWdpbmFsTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbE5hbWVzLCBpbnNlcnRQb3MsIG9yaWdpbmFsTmFtZXMsIGluc2VydEVuZCwgdGFpbExlbmd0aCk7CisgICAgICAgICAgICBBcnJheXMuZmlsbChvcmlnaW5hbE5hbWVzLCBpbnNlcnRQb3MsIGluc2VydEVuZCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gbmV3TGVuZ3RoOworICAgICAgICBpZiAoZmlyc3RDaGFuZ2UgPj0gaW5zZXJ0UG9zKSB7CisgICAgICAgICAgICBmaXJzdENoYW5nZSArPSBncm93TGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGxhc3RJbmRleE9mKE5hbWUgbikgeworICAgICAgICBpbnQgcmVzdWx0ID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lc1tpXSA9PSBuKSAgcmVzdWx0ID0gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKiBXZSBoYXZlIGp1c3Qgb3ZlcndyaXR0ZW4gdGhlIG5hbWUgYXQgcG9zMSB3aXRoIHRoZSBuYW1lIGF0IHBvczIuCisgICAgICogIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgdHdvIGNvcGllcyBvZiB0aGUgbmFtZSwgd2hpY2ggd2Ugd2lsbCBoYXZlIHRvIGZpeCBsYXRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm90ZUR1cGxpY2F0ZShpbnQgcG9zMSwgaW50IHBvczIpIHsKKyAgICAgICAgTmFtZSBuID0gbmFtZXNbcG9zMV07CisgICAgICAgIGFzc2VydChuID09IG5hbWVzW3BvczJdKTsKKyAgICAgICAgYXNzZXJ0KG9yaWdpbmFsTmFtZXNbcG9zMV0gIT0gbnVsbCk7ICAvLyBzb21ldGhpbmcgd2FzIHJlcGxhY2VkIGF0IHBvczEKKyAgICAgICAgYXNzZXJ0KG9yaWdpbmFsTmFtZXNbcG9zMl0gPT0gbnVsbCB8fCBvcmlnaW5hbE5hbWVzW3BvczJdID09IG4pOworICAgICAgICBpZiAoZHVwcyA9PSBudWxsKSB7CisgICAgICAgICAgICBkdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgZHVwcy5hZGQobik7CisgICAgfQorCisgICAgLyoqIFJlcGxhY2UgZHVwbGljYXRlIG5hbWVzIGJ5IG51bGxzLCBhbmQgcmVtb3ZlIGFsbCBudWxscy4gKi8KKyAgICBwcml2YXRlIHZvaWQgY2xlYXJEdXBsaWNhdGVzQW5kTnVsbHMoKSB7CisgICAgICAgIGlmIChkdXBzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBkdXBsaWNhdGVzLgorICAgICAgICAgICAgYXNzZXJ0KG93bmVkQ291bnQoKSA+PSAxKTsKKyAgICAgICAgICAgIGZvciAoTmFtZSBkdXAgOiBkdXBzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0Q2hhbmdlOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzW2ldID09IGR1cCAmJiBvcmlnaW5hbE5hbWVzW2ldICE9IGR1cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEFycmF5cy5hc0xpc3QobmFtZXMpLmNvbnRhaW5zKGR1cCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBraWxsIG9ubHkgb25lIGR1cAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVwcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIC8vIE5vdyB0aGF0IHdlIGFyZSBkb25lIHdpdGggb3JpZ2luYWxOYW1lcywgcmVtb3ZlICJraWxsZWQiIG5hbWVzLgorICAgICAgICBpbnQgb2xkTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gZmlyc3RDaGFuZ2U7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG5hbWVzW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCBpICsgMSwgbmFtZXMsIGksICgtLWxlbmd0aCAtIGkpKTsKKyAgICAgICAgICAgICAgICAtLWk7ICAvLyByZXN0YXJ0IGxvb3AgYXQgdGhpcyBwb3NpdGlvbgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsZW5ndGggPCBvbGRMZW5ndGgpIHsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKG5hbWVzLCBsZW5ndGgsIG9sZExlbmd0aCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KCFBcnJheXMuYXNMaXN0KG5hbWVzKS5zdWJMaXN0KDAsIGxlbmd0aCkuY29udGFpbnMobnVsbCkpOworICAgIH0KKworICAgIC8qKiBDcmVhdGUgYSBwcml2YXRlLCB3cml0YWJsZSBjb3B5IG9mIG5hbWVzLgorICAgICAqICBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgY29weSwgZm9yIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICB2b2lkIHN0YXJ0RWRpdCgpIHsKKyAgICAgICAgYXNzZXJ0KHZlcmlmeUFyaXR5KCkpOworICAgICAgICBpbnQgb2MgPSBvd25lZENvdW50KCk7CisgICAgICAgIGFzc2VydCghaW5UcmFucygpKTsgIC8vIG5vIG5lc3RlZCB0cmFuc2FjdGlvbnMKKyAgICAgICAgZmxhZ3MgfD0gRl9UUkFOUzsKKyAgICAgICAgTmFtZVtdIG9sZE5hbWVzID0gbmFtZXM7CisgICAgICAgIE5hbWVbXSBvd25CdWZmZXIgPSAob2MgPT0gMiA/IG9yaWdpbmFsTmFtZXMgOiBudWxsKTsKKyAgICAgICAgYXNzZXJ0KG93bkJ1ZmZlciAhPSBvbGROYW1lcyk7CisgICAgICAgIGlmIChvd25CdWZmZXIgIT0gbnVsbCAmJiBvd25CdWZmZXIubGVuZ3RoID49IGxlbmd0aCkgeworICAgICAgICAgICAgbmFtZXMgPSBjb3B5TmFtZXNJbnRvKG93bkJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBtYWtlIGEgbmV3IGJ1ZmZlciB0byBob2xkIHRoZSBuYW1lcworICAgICAgICAgICAgZmluYWwgaW50IFNMT1AgPSAyOworICAgICAgICAgICAgbmFtZXMgPSBBcnJheXMuY29weU9mKG9sZE5hbWVzLCBNYXRoLm1heChsZW5ndGggKyBTTE9QLCBvbGROYW1lcy5sZW5ndGgpKTsKKyAgICAgICAgICAgIGlmIChvYyA8IDIpICArK2ZsYWdzOworICAgICAgICAgICAgYXNzZXJ0KG93bmVkQ291bnQoKSA9PSBvYyArIDEpOworICAgICAgICB9CisgICAgICAgIG9yaWdpbmFsTmFtZXMgPSBvbGROYW1lczsKKyAgICAgICAgYXNzZXJ0KG9yaWdpbmFsTmFtZXMgIT0gbmFtZXMpOworICAgICAgICBmaXJzdENoYW5nZSA9IGxlbmd0aDsKKyAgICAgICAgYXNzZXJ0KGluVHJhbnMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZU5hbWUoaW50IGksIE5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnQoaW5UcmFucygpKTsKKyAgICAgICAgYXNzZXJ0KGkgPCBsZW5ndGgpOworICAgICAgICBOYW1lIG9sZE5hbWUgPSBuYW1lc1tpXTsKKyAgICAgICAgYXNzZXJ0KG9sZE5hbWUgPT0gb3JpZ2luYWxOYW1lc1tpXSk7ICAvLyBubyBtdWx0aXBsZSBjaGFuZ2VzCisgICAgICAgIGFzc2VydCh2ZXJpZnlGaXJzdENoYW5nZSgpKTsKKyAgICAgICAgaWYgKG93bmVkQ291bnQoKSA9PSAwKQorICAgICAgICAgICAgZ3Jvd05hbWVzKDAsIDApOworICAgICAgICBuYW1lc1tpXSA9IG5hbWU7CisgICAgICAgIGlmIChmaXJzdENoYW5nZSA+IGkpIHsKKyAgICAgICAgICAgIGZpcnN0Q2hhbmdlID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0TmFtZSAhPSBudWxsICYmIHJlc3VsdE5hbWUgPT0gb2xkTmFtZSkgeworICAgICAgICAgICAgcmVzdWx0TmFtZSA9IG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hhbmdlIHRoZSByZXN1bHQgbmFtZS4gIE51bGwgbWVhbnMgYSB2b2lkIHJlc3VsdC4gKi8KKyAgICB2b2lkIHNldFJlc3VsdChOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0KG5hbWUgPT0gbnVsbCB8fCBsYXN0SW5kZXhPZihuYW1lKSA+PSAwKTsKKyAgICAgICAgcmVzdWx0TmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqIEZpbmlzaCBhIHRyYW5zYWN0aW9uLiAqLworICAgIExhbWJkYUZvcm0gZW5kRWRpdCgpIHsKKyAgICAgICAgYXNzZXJ0KHZlcmlmeUZpcnN0Q2hhbmdlKCkpOworICAgICAgICAvLyBBc3N1bWluZyBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCBwYWlyd2lzZSBmcm9tIG9yaWdpbmFsTmFtZXNbaV0gdG8gbmFtZXNbaV0sCisgICAgICAgIC8vIHVwZGF0ZSBhcmd1bWVudHMgdG8gZW5zdXJlIHJlZmVyZW50aWFsIGludGVncml0eS4KKyAgICAgICAgZm9yIChpbnQgaSA9IE1hdGgubWF4KGZpcnN0Q2hhbmdlLCBhcml0eSk7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTmFtZSBuYW1lID0gbmFtZXNbaV07CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSAgY29udGludWU7ICAvLyBzcGFjZSBmb3IgcmVtb3ZlZCBkdXBsaWNhdGUKKyAgICAgICAgICAgIE5hbWUgbmV3TmFtZSA9IG5hbWUucmVwbGFjZU5hbWVzKG9yaWdpbmFsTmFtZXMsIG5hbWVzLCBmaXJzdENoYW5nZSwgaSk7CisgICAgICAgICAgICBpZiAobmV3TmFtZSAhPSBuYW1lKSB7CisgICAgICAgICAgICAgICAgbmFtZXNbaV0gPSBuZXdOYW1lOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHROYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0TmFtZSA9IG5ld05hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydChpblRyYW5zKCkpOworICAgICAgICBmbGFncyAmPSB+Rl9UUkFOUzsKKyAgICAgICAgY2xlYXJEdXBsaWNhdGVzQW5kTnVsbHMoKTsKKyAgICAgICAgb3JpZ2luYWxOYW1lcyA9IG51bGw7CisgICAgICAgIC8vIElmIGFueSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjaGFuZ2VkLCB0aGVuIHJlb3JkZXIgdGhlbSBhcyBuZWVkZWQuCisgICAgICAgIC8vIFRoaXMgaXMgYSAic2hlZXAtYW5kLWdvYXRzIiBzdGFibGUgc29ydCwgcHVzaGluZyBhbGwgbm9uLXBhcmFtZXRlcnMKKyAgICAgICAgLy8gdG8gdGhlIHJpZ2h0IG9mIGFsbCBwYXJhbWV0ZXJzLgorICAgICAgICBpZiAoZmlyc3RDaGFuZ2UgPCBhcml0eSkgeworICAgICAgICAgICAgTmFtZVtdIGV4cHJzID0gbmV3IE5hbWVbYXJpdHkgLSBmaXJzdENoYW5nZV07CisgICAgICAgICAgICBpbnQgYXJncCA9IGZpcnN0Q2hhbmdlLCBleHBycCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gZmlyc3RDaGFuZ2U7IGkgPCBhcml0eTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTmFtZSBuYW1lID0gbmFtZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuaXNQYXJhbSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVzW2FyZ3ArK10gPSBuYW1lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4cHJzW2V4cHJwKytdID0gbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZXhwcnAgPT0gKGFyaXR5IC0gYXJncCkpOworICAgICAgICAgICAgLy8gY29weSB0aGUgZXhwcnMganVzdCBhZnRlciB0aGUgbGFzdCByZW1haW5pbmcgcGFyYW0KKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZXhwcnMsIDAsIG5hbWVzLCBhcmdwLCBleHBycCk7CisgICAgICAgICAgICAvLyBhZGp1c3QgYXJpdHkKKyAgICAgICAgICAgIGFyaXR5IC09IGV4cHJwOworICAgICAgICB9CisgICAgICAgIGFzc2VydCh2ZXJpZnlBcml0eSgpKTsKKyAgICAgICAgcmV0dXJuIGxhbWJkYUZvcm0oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE5hbWVbXSBjb3B5TmFtZXNJbnRvKE5hbWVbXSBidWZmZXIpIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lcywgMCwgYnVmZmVyLCAwLCBsZW5ndGgpOworICAgICAgICBBcnJheXMuZmlsbChidWZmZXIsIGxlbmd0aCwgYnVmZmVyLmxlbmd0aCwgbnVsbCk7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCisgICAgLyoqIFJlcGxhY2UgYW55IE5hbWUgd2hvc2UgZnVuY3Rpb24gaXMgaW4gb2xkRm5zIHdpdGggYSBjb3B5CisgICAgICogIHdob3NlIGZ1bmN0aW9uIGlzIGluIHRoZSBjb3JyZXNwb25kaW5nIHBvc2l0aW9uIGluIG5ld0Zucy4KKyAgICAgKiAgT25seSBkbyB0aGlzIGlmIHRoZSBhcmd1bWVudHMgYXJlIGV4YWN0bHkgZXF1YWwgdG8gdGhlIGdpdmVuLgorICAgICAqLworICAgIExhbWJkYUZvcm1CdWZmZXIgcmVwbGFjZUZ1bmN0aW9ucyhOYW1lZEZ1bmN0aW9uW10gb2xkRm5zLCBOYW1lZEZ1bmN0aW9uW10gbmV3Rm5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuLi4gZm9yQXJndW1lbnRzKSB7CisgICAgICAgIGFzc2VydChpblRyYW5zKCkpOworICAgICAgICBpZiAob2xkRm5zLmxlbmd0aCA9PSAwKSAgcmV0dXJuIHRoaXM7CisgICAgICAgIGZvciAoaW50IGkgPSBhcml0eTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBOYW1lIG4gPSBuYW1lc1tpXTsKKyAgICAgICAgICAgIGludCBuZmkgPSBpbmRleE9mKG4uZnVuY3Rpb24sIG9sZEZucyk7CisgICAgICAgICAgICBpZiAobmZpID49IDAgJiYgQXJyYXlzLmVxdWFscyhuLmFyZ3VtZW50cywgZm9yQXJndW1lbnRzKSkgeworICAgICAgICAgICAgICAgIGNoYW5nZU5hbWUoaSwgbmV3IE5hbWUobmV3Rm5zW25maV0sIG4uYXJndW1lbnRzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VOYW1lKGludCBwb3MsIE5hbWUgYmluZGluZykgeworICAgICAgICBhc3NlcnQoaW5UcmFucygpKTsKKyAgICAgICAgYXNzZXJ0KHZlcmlmeUFyaXR5KCkpOworICAgICAgICBhc3NlcnQocG9zIDwgYXJpdHkpOworICAgICAgICBOYW1lIHBhcmFtID0gbmFtZXNbcG9zXTsKKyAgICAgICAgYXNzZXJ0KHBhcmFtLmlzUGFyYW0oKSk7CisgICAgICAgIGFzc2VydChwYXJhbS50eXBlID09IGJpbmRpbmcudHlwZSk7CisgICAgICAgIGNoYW5nZU5hbWUocG9zLCBiaW5kaW5nKTsKKyAgICB9CisKKyAgICAvKiogUmVwbGFjZSBhIHBhcmFtZXRlciBieSBhIGZyZXNoIHBhcmFtZXRlci4gKi8KKyAgICBMYW1iZGFGb3JtQnVmZmVyIHJlbmFtZVBhcmFtZXRlcihpbnQgcG9zLCBOYW1lIG5ld1BhcmFtKSB7CisgICAgICAgIGFzc2VydChuZXdQYXJhbS5pc1BhcmFtKCkpOworICAgICAgICByZXBsYWNlTmFtZShwb3MsIG5ld1BhcmFtKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqIFJlcGxhY2UgYSBwYXJhbWV0ZXIgYnkgYSBmcmVzaCBleHByZXNzaW9uLiAqLworICAgIExhbWJkYUZvcm1CdWZmZXIgcmVwbGFjZVBhcmFtZXRlckJ5TmV3RXhwcmVzc2lvbihpbnQgcG9zLCBOYW1lIGJpbmRpbmcpIHsKKyAgICAgICAgYXNzZXJ0KCFiaW5kaW5nLmlzUGFyYW0oKSk7CisgICAgICAgIGFzc2VydChsYXN0SW5kZXhPZihiaW5kaW5nKSA8IDApOyAgLy8gZWxzZSB1c2UgcmVwbGFjZVBhcmFtZXRlckJ5Q29weQorICAgICAgICByZXBsYWNlTmFtZShwb3MsIGJpbmRpbmcpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKiogUmVwbGFjZSBhIHBhcmFtZXRlciBieSBhbm90aGVyIHBhcmFtZXRlciBvciBleHByZXNzaW9uIGFscmVhZHkgaW4gdGhlIGZvcm0uICovCisgICAgTGFtYmRhRm9ybUJ1ZmZlciByZXBsYWNlUGFyYW1ldGVyQnlDb3B5KGludCBwb3MsIGludCB2YWx1ZVBvcykgeworICAgICAgICBhc3NlcnQocG9zICE9IHZhbHVlUG9zKTsKKyAgICAgICAgcmVwbGFjZU5hbWUocG9zLCBuYW1lc1t2YWx1ZVBvc10pOworICAgICAgICBub3RlRHVwbGljYXRlKHBvcywgdmFsdWVQb3MpOyAgLy8gdGVtcG9yYXJpbHksIHdpbGwgb2NjdXIgdHdpY2UgaW4gdGhlIG5hbWVzIGFycmF5CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnNlcnROYW1lKGludCBwb3MsIE5hbWUgZXhwciwgYm9vbGVhbiBpc1BhcmFtZXRlcikgeworICAgICAgICBhc3NlcnQoaW5UcmFucygpKTsKKyAgICAgICAgYXNzZXJ0KHZlcmlmeUFyaXR5KCkpOworICAgICAgICBhc3NlcnQoaXNQYXJhbWV0ZXIgPyBwb3MgPD0gYXJpdHkgOiBwb3MgPj0gYXJpdHkpOworICAgICAgICBncm93TmFtZXMocG9zLCAxKTsKKyAgICAgICAgaWYgKGlzUGFyYW1ldGVyKSAgYXJpdHkgKz0gMTsKKyAgICAgICAgY2hhbmdlTmFtZShwb3MsIGV4cHIpOworICAgIH0KKworICAgIC8qKiBJbnNlcnQgYSBmcmVzaCBleHByZXNzaW9uLiAqLworICAgIExhbWJkYUZvcm1CdWZmZXIgaW5zZXJ0RXhwcmVzc2lvbihpbnQgcG9zLCBOYW1lIGV4cHIpIHsKKyAgICAgICAgYXNzZXJ0KCFleHByLmlzUGFyYW0oKSk7CisgICAgICAgIGluc2VydE5hbWUocG9zLCBleHByLCBmYWxzZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKiBJbnNlcnQgYSBmcmVzaCBwYXJhbWV0ZXIuICovCisgICAgTGFtYmRhRm9ybUJ1ZmZlciBpbnNlcnRQYXJhbWV0ZXIoaW50IHBvcywgTmFtZSBwYXJhbSkgeworICAgICAgICBhc3NlcnQocGFyYW0uaXNQYXJhbSgpKTsKKyAgICAgICAgaW5zZXJ0TmFtZShwb3MsIHBhcmFtLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9MYW1iZGFGb3JtRWRpdG9yLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL0xhbWJkYUZvcm1FZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI5ZDczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9MYW1iZGFGb3JtRWRpdG9yLmphdmEKQEAgLTAsMCArMSw4MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YS5sYW5nLmludm9rZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS4qOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0uQmFzaWNUeXBlLio7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlSW1wbC5JbnRyaW5zaWM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworCitpbXBvcnQgc3VuLmludm9rZS51dGlsLldyYXBwZXI7CisKKy8qKiBUcmFuc2Zvcm1zIG9uIExGcy4KKyAqICBBIGxhbWJkYS1mb3JtIGVkaXRvciBjYW4gZGVyaXZlIG5ldyBMRnMgZnJvbSBpdHMgYmFzZSBMRi4KKyAqICBUaGUgZWRpdG9yIGNhbiBjYWNoZSBkZXJpdmVkIExGcywgd2hpY2ggc2ltcGxpZmllcyB0aGUgcmV1c2Ugb2YgdGhlaXIgdW5kZXJseWluZyBieXRlY29kZXMuCisgKiAgVG8gc3VwcG9ydCB0aGlzIGNhY2hpbmcsIGEgTEYgaGFzIGFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gaXRzIGVkaXRvci4KKyAqLworY2xhc3MgTGFtYmRhRm9ybUVkaXRvciB7CisgICAgZmluYWwgTGFtYmRhRm9ybSBsYW1iZGFGb3JtOworCisgICAgcHJpdmF0ZSBMYW1iZGFGb3JtRWRpdG9yKExhbWJkYUZvcm0gbGFtYmRhRm9ybSkgeworICAgICAgICB0aGlzLmxhbWJkYUZvcm0gPSBsYW1iZGFGb3JtOworICAgIH0KKworICAgIC8vIEZhY3RvcnkgbWV0aG9kLgorICAgIHN0YXRpYyBMYW1iZGFGb3JtRWRpdG9yIGxhbWJkYUZvcm1FZGl0b3IoTGFtYmRhRm9ybSBsYW1iZGFGb3JtKSB7CisgICAgICAgIC8vIFRPIERPOiAgQ29uc2lkZXIgcGxhY2luZyBpbnRlcm4gbG9naWMgaGVyZSwgdG8gY3V0IGRvd24gb24gZHVwbGljYXRpb24uCisgICAgICAgIC8vIGxhbWJkYUZvcm0gPSBmaW5kUHJlZXhpc3RpbmdFcXVpdmFsZW50KGxhbWJkYUZvcm0pCisgICAgICAgIHJldHVybiBuZXcgTGFtYmRhRm9ybUVkaXRvcihsYW1iZGFGb3JtKTsKKyAgICB9CisKKyAgICAvKiogQSBkZXNjcmlwdGlvbiBvZiBhIGNhY2hlZCB0cmFuc2Zvcm0sIHBvc3NpYmx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm0uCisgICAgICogIFRoZSBsb2dpY2FsIGNvbnRlbnQgaXMgYSBzZXF1ZW5jZSBvZiBieXRlIHZhbHVlcywgc3RhcnRpbmcgd2l0aCBhIEtpbmQub3JkaW5hbCB2YWx1ZS4KKyAgICAgKiAgVGhlIHNlcXVlbmNlIGlzIHVudGVybWluYXRlZCwgZW5kaW5nIHdpdGggYW4gaW5kZWZpbml0ZSBudW1iZXIgb2YgemVybyBieXRlcy4KKyAgICAgKiAgU2VxdWVuY2VzIHRoYXQgYXJlIHNpbXBsZSAoc2hvcnQgZW5vdWdoIGFuZCB3aXRoIHNtYWxsIGVub3VnaCB2YWx1ZXMpIHBhY2sgaW50byBhIDY0LWJpdCBsb25nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRyYW5zZm9ybSB7CisgICAgICAgIGZpbmFsIGxvbmcgcGFja2VkQnl0ZXM7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBmdWxsQnl0ZXM7CisgICAgICAgIGZpbmFsIExhbWJkYUZvcm0gcmVzdWx0OyAgLy8gcmVzdWx0IG9mIHRyYW5zZm9ybSwgb3IgbnVsbCwgaWYgdGhlcmUgaXMgbm9uZSBhdmFpbGFibGUKKworICAgICAgICBwcml2YXRlIGVudW0gS2luZCB7CisgICAgICAgICAgICBOT19LSU5ELCAgLy8gbmVjZXNzYXJ5IGJlY2F1c2Ugb3JkaW5hbCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCisgICAgICAgICAgICBCSU5EX0FSRywgQUREX0FSRywgRFVQX0FSRywKKyAgICAgICAgICAgIFNQUkVBRF9BUkdTLAorICAgICAgICAgICAgRklMVEVSX0FSRywgRklMVEVSX1JFVFVSTiwgRklMVEVSX1JFVFVSTl9UT19aRVJPLAorICAgICAgICAgICAgQ09MTEVDVF9BUkdTLCBDT0xMRUNUX0FSR1NfVE9fVk9JRCwgQ09MTEVDVF9BUkdTX1RPX0FSUkFZLAorICAgICAgICAgICAgRk9MRF9BUkdTLCBGT0xEX0FSR1NfVE9fVk9JRCwKKyAgICAgICAgICAgIFBFUk1VVEVfQVJHUworICAgICAgICAgICAgLy9tYXliZSBhZGQgbW9yZSBmb3IgZ3VhcmQgd2l0aCB0ZXN0LCBjYXRjaCBleGNlcHRpb24sIHBvaW50d2lzZSB0eXBlIGNvbnZlcnNpb25zCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUUkVTU19URVNUID0gZmFsc2U7IC8vIHR1cm4gb24gdG8gZGlzYWJsZSBtb3N0IHBhY2tpbmcKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50CisgICAgICAgICAgICAgICAgUEFDS0VEX0JZVEVfU0laRSA9IChTVFJFU1NfVEVTVCA/IDIgOiA0KSwKKyAgICAgICAgICAgICAgICBQQUNLRURfQllURV9NQVNLID0gKDEgPDwgUEFDS0VEX0JZVEVfU0laRSkgLSAxLAorICAgICAgICAgICAgICAgIFBBQ0tFRF9CWVRFX01BWF9MRU5HVEggPSAoU1RSRVNTX1RFU1QgPyAzIDogNjQgLyBQQUNLRURfQllURV9TSVpFKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhY2tlZEJ5dGVzKGJ5dGVbXSBieXRlcykgeworICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA+IFBBQ0tFRF9CWVRFX01BWF9MRU5HVEgpICByZXR1cm4gMDsKKyAgICAgICAgICAgIGxvbmcgcGIgPSAwOworICAgICAgICAgICAgaW50IGJpdHNldCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGIgPSBieXRlc1tpXSAmIDB4RkY7CisgICAgICAgICAgICAgICAgYml0c2V0IHw9IGI7CisgICAgICAgICAgICAgICAgcGIgfD0gKGxvbmcpYiA8PCAoaSAqIFBBQ0tFRF9CWVRFX1NJWkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpblJhbmdlKGJpdHNldCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gcGI7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBwYWNrZWRCeXRlcyhpbnQgYjAsIGludCBiMSkgeworICAgICAgICAgICAgYXNzZXJ0KGluUmFuZ2UoYjAgfCBiMSkpOworICAgICAgICAgICAgcmV0dXJuICggIChiMCA8PCAwKlBBQ0tFRF9CWVRFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgIHwgKGIxIDw8IDEqUEFDS0VEX0JZVEVfU0laRSkpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgcGFja2VkQnl0ZXMoaW50IGIwLCBpbnQgYjEsIGludCBiMikgeworICAgICAgICAgICAgYXNzZXJ0KGluUmFuZ2UoYjAgfCBiMSB8IGIyKSk7CisgICAgICAgICAgICByZXR1cm4gKCAgKGIwIDw8IDAqUEFDS0VEX0JZVEVfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgfCAoYjEgPDwgMSpQQUNLRURfQllURV9TSVpFKQorICAgICAgICAgICAgICAgICAgICB8IChiMiA8PCAyKlBBQ0tFRF9CWVRFX1NJWkUpKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhY2tlZEJ5dGVzKGludCBiMCwgaW50IGIxLCBpbnQgYjIsIGludCBiMykgeworICAgICAgICAgICAgYXNzZXJ0KGluUmFuZ2UoYjAgfCBiMSB8IGIyIHwgYjMpKTsKKyAgICAgICAgICAgIHJldHVybiAoICAoYjAgPDwgMCpQQUNLRURfQllURV9TSVpFKQorICAgICAgICAgICAgICAgICAgICB8IChiMSA8PCAxKlBBQ0tFRF9CWVRFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgIHwgKGIyIDw8IDIqUEFDS0VEX0JZVEVfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgfCAoYjMgPDwgMypQQUNLRURfQllURV9TSVpFKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpblJhbmdlKGludCBiaXRzZXQpIHsKKyAgICAgICAgICAgIGFzc2VydCgoYml0c2V0ICYgMHhGRikgPT0gYml0c2V0KTsgIC8vIGluY29taW5nIHZhbHVlcyBtdXN0IGZpdCBpbiAqdW5zaWduZWQqIGJ5dGUKKyAgICAgICAgICAgIHJldHVybiAoKGJpdHNldCAmIH5QQUNLRURfQllURV9NQVNLKSA9PSAwKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gZnVsbEJ5dGVzKGludC4uLiBieXRlVmFsdWVzKSB7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlVmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBidiA6IGJ5dGVWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBieXRlc1tpKytdID0gYnZhbChidik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQocGFja2VkQnl0ZXMoYnl0ZXMpID09IDApOworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBieXRlIGJ5dGVBdChpbnQgaSkgeworICAgICAgICAgICAgbG9uZyBwYiA9IHBhY2tlZEJ5dGVzOworICAgICAgICAgICAgaWYgKHBiID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBmdWxsQnl0ZXMubGVuZ3RoKSAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGxCeXRlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChmdWxsQnl0ZXMgPT0gbnVsbCk7CisgICAgICAgICAgICBpZiAoaSA+IFBBQ0tFRF9CWVRFX01BWF9MRU5HVEgpICByZXR1cm4gMDsKKyAgICAgICAgICAgIGludCBwb3MgPSAoaSAqIFBBQ0tFRF9CWVRFX1NJWkUpOworICAgICAgICAgICAgcmV0dXJuIChieXRlKSgocGIgPj4+IHBvcykgJiBQQUNLRURfQllURV9NQVNLKTsKKyAgICAgICAgfQorCisgICAgICAgIEtpbmQga2luZCgpIHsgcmV0dXJuIEtpbmQudmFsdWVzKClbYnl0ZUF0KDApXTsgfQorCisgICAgICAgIHByaXZhdGUgVHJhbnNmb3JtKGxvbmcgcGFja2VkQnl0ZXMsIGJ5dGVbXSBmdWxsQnl0ZXMsIExhbWJkYUZvcm0gcmVzdWx0KSB7CisgICAgICAgICAgICB0aGlzLnBhY2tlZEJ5dGVzID0gcGFja2VkQnl0ZXM7CisgICAgICAgICAgICB0aGlzLmZ1bGxCeXRlcyA9IGZ1bGxCeXRlczsKKyAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgVHJhbnNmb3JtKGxvbmcgcGFja2VkQnl0ZXMpIHsKKyAgICAgICAgICAgIHRoaXMocGFja2VkQnl0ZXMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0KHBhY2tlZEJ5dGVzICE9IDApOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgVHJhbnNmb3JtKGJ5dGVbXSBmdWxsQnl0ZXMpIHsKKyAgICAgICAgICAgIHRoaXMoMCwgZnVsbEJ5dGVzLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgYnZhbChpbnQgYikgeworICAgICAgICAgICAgYXNzZXJ0KChiICYgMHhGRikgPT0gYik7ICAvLyBpbmNvbWluZyB2YWx1ZSBtdXN0IGZpdCBpbiAqdW5zaWduZWQqIGJ5dGUKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSliOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgYnZhbChLaW5kIGspIHsKKyAgICAgICAgICAgIHJldHVybiBidmFsKGsub3JkaW5hbCgpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgVHJhbnNmb3JtIG9mKEtpbmQgaywgaW50IGIxKSB7CisgICAgICAgICAgICBieXRlIGIwID0gYnZhbChrKTsKKyAgICAgICAgICAgIGlmIChpblJhbmdlKGIwIHwgYjEpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKHBhY2tlZEJ5dGVzKGIwLCBiMSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKGZ1bGxCeXRlcyhiMCwgYjEpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgVHJhbnNmb3JtIG9mKEtpbmQgaywgaW50IGIxLCBpbnQgYjIpIHsKKyAgICAgICAgICAgIGJ5dGUgYjAgPSAoYnl0ZSkgay5vcmRpbmFsKCk7CisgICAgICAgICAgICBpZiAoaW5SYW5nZShiMCB8IGIxIHwgYjIpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKHBhY2tlZEJ5dGVzKGIwLCBiMSwgYjIpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybShmdWxsQnl0ZXMoYjAsIGIxLCBiMikpOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBUcmFuc2Zvcm0gb2YoS2luZCBrLCBpbnQgYjEsIGludCBiMiwgaW50IGIzKSB7CisgICAgICAgICAgICBieXRlIGIwID0gKGJ5dGUpIGsub3JkaW5hbCgpOworICAgICAgICAgICAgaWYgKGluUmFuZ2UoYjAgfCBiMSB8IGIyIHwgYjMpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKHBhY2tlZEJ5dGVzKGIwLCBiMSwgYjIsIGIzKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm0oZnVsbEJ5dGVzKGIwLCBiMSwgYjIsIGIzKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE5PX0JZVEVTID0ge307CisgICAgICAgIHN0YXRpYyBUcmFuc2Zvcm0gb2YoS2luZCBrLCBpbnQuLi4gYjEyMykgeworICAgICAgICAgICAgcmV0dXJuIG9mQm90aEFycmF5cyhrLCBiMTIzLCBOT19CWVRFUyk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIFRyYW5zZm9ybSBvZihLaW5kIGssIGludCBiMSwgYnl0ZVtdIGIyMzQpIHsKKyAgICAgICAgICAgIHJldHVybiBvZkJvdGhBcnJheXMoaywgbmV3IGludFtdeyBiMSB9LCBiMjM0KTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgVHJhbnNmb3JtIG9mKEtpbmQgaywgaW50IGIxLCBpbnQgYjIsIGJ5dGVbXSBiMzQ1KSB7CisgICAgICAgICAgICByZXR1cm4gb2ZCb3RoQXJyYXlzKGssIG5ldyBpbnRbXXsgYjEsIGIyIH0sIGIzNDUpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIFRyYW5zZm9ybSBvZkJvdGhBcnJheXMoS2luZCBrLCBpbnRbXSBiMTIzLCBieXRlW10gYjQ1NikgeworICAgICAgICAgICAgYnl0ZVtdIGZ1bGxCeXRlcyA9IG5ldyBieXRlWzEgKyBiMTIzLmxlbmd0aCArIGI0NTYubGVuZ3RoXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZ1bGxCeXRlc1tpKytdID0gYnZhbChrKTsKKyAgICAgICAgICAgIGZvciAoaW50IGJ2IDogYjEyMykgeworICAgICAgICAgICAgICAgIGZ1bGxCeXRlc1tpKytdID0gYnZhbChidik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGJ5dGUgYnYgOiBiNDU2KSB7CisgICAgICAgICAgICAgICAgZnVsbEJ5dGVzW2krK10gPSBidjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgcGFja2VkQnl0ZXMgPSBwYWNrZWRCeXRlcyhmdWxsQnl0ZXMpOworICAgICAgICAgICAgaWYgKHBhY2tlZEJ5dGVzICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ocGFja2VkQnl0ZXMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKGZ1bGxCeXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBUcmFuc2Zvcm0gd2l0aFJlc3VsdChMYW1iZGFGb3JtIHJlc3VsdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm0odGhpcy5wYWNrZWRCeXRlcywgdGhpcy5mdWxsQnl0ZXMsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBUcmFuc2Zvcm0gJiYgZXF1YWxzKChUcmFuc2Zvcm0pb2JqKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVHJhbnNmb3JtIHRoYXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnBhY2tlZEJ5dGVzID09IHRoYXQucGFja2VkQnl0ZXMgJiYgQXJyYXlzLmVxdWFscyh0aGlzLmZ1bGxCeXRlcywgdGhhdC5mdWxsQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaWYgKHBhY2tlZEJ5dGVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoZnVsbEJ5dGVzID09IG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBMb25nLmhhc2hDb2RlKHBhY2tlZEJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuaGFzaENvZGUoZnVsbEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGxvbmcgYml0cyA9IHBhY2tlZEJ5dGVzOworICAgICAgICAgICAgaWYgKGJpdHMgIT0gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIigiKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYml0cyAmIFBBQ0tFRF9CWVRFX01BU0spOworICAgICAgICAgICAgICAgICAgICBiaXRzID4+Pj0gUEFDS0VEX0JZVEVfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgIT0gMCkgIGJ1Zi5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZ1bGxCeXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgidW5wYWNrZWQiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKEFycmF5cy50b1N0cmluZyhmdWxsQnl0ZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiByZXN1bHQ9Iik7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEZpbmQgYSBwcmV2aW91c2x5IGNhY2hlZCB0cmFuc2Zvcm0gZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4gb25lLCBhbmQgcmV0dXJuIGl0cyByZXN1bHQuICovCisgICAgcHJpdmF0ZSBMYW1iZGFGb3JtIGdldEluQ2FjaGUoVHJhbnNmb3JtIGtleSkgeworICAgICAgICBhc3NlcnQoa2V5LnJlc3VsdCA9PSBudWxsKTsKKyAgICAgICAgLy8gVGhlIHRyYW5zZm9ybUNhY2hlIGlzIG9uZSBvZiBudWxsLCBUcmFuc2Zvcm0sIFRyYW5zZm9ybVtdLCBvciBDb25jdXJyZW50SGFzaE1hcC4KKyAgICAgICAgT2JqZWN0IGMgPSBsYW1iZGFGb3JtLnRyYW5zZm9ybUNhY2hlOworICAgICAgICBUcmFuc2Zvcm0gayA9IG51bGw7CisgICAgICAgIGlmIChjIGluc3RhbmNlb2YgQ29uY3VycmVudEhhc2hNYXApIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXA8VHJhbnNmb3JtLFRyYW5zZm9ybT4gbSA9IChDb25jdXJyZW50SGFzaE1hcDxUcmFuc2Zvcm0sVHJhbnNmb3JtPikgYzsKKyAgICAgICAgICAgIGsgPSBtLmdldChrZXkpOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkgeworICAgICAgICAgICAgLy8gb25lLWVsZW1lbnQgY2FjaGUgYXZvaWRzIG92ZXJoZWFkIG9mIGFuIGFycmF5CisgICAgICAgICAgICBUcmFuc2Zvcm0gdCA9IChUcmFuc2Zvcm0pYzsKKyAgICAgICAgICAgIGlmICh0LmVxdWFscyhrZXkpKSAgayA9IHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUcmFuc2Zvcm1bXSB0YSA9IChUcmFuc2Zvcm1bXSljOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFRyYW5zZm9ybSB0ID0gdGFbaV07CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICh0LmVxdWFscyhrZXkpKSB7IGsgPSB0OyBicmVhazsgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydChrID09IG51bGwgfHwga2V5LmVxdWFscyhrKSk7CisgICAgICAgIHJldHVybiBrID09IG51bGwgPyBudWxsIDogay5yZXN1bHQ7CisgICAgfQorCisgICAgLyoqIEFyYml0cmFyeSBidXQgcmVhc29uYWJsZSBsaW1pdHMgb24gVHJhbnNmb3JtW10gc2l6ZSBmb3IgY2FjaGUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9DQUNIRV9BUlJBWV9TSVpFID0gNCwgTUFYX0NBQ0hFX0FSUkFZX1NJWkUgPSAxNjsKKworICAgIC8qKiBDYWNoZSBhIHRyYW5zZm9ybSB3aXRoIGl0cyByZXN1bHQsIGFuZCByZXR1cm4gdGhhdCByZXN1bHQuCisgICAgICogIEJ1dCBpZiBhbiBlcXVpdmFsZW50IHRyYW5zZm9ybSBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCwgcmV0dXJuIGl0cyByZXN1bHQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhbWJkYUZvcm0gcHV0SW5DYWNoZShUcmFuc2Zvcm0ga2V5LCBMYW1iZGFGb3JtIGZvcm0pIHsKKyAgICAgICAga2V5ID0ga2V5LndpdGhSZXN1bHQoZm9ybSk7CisgICAgICAgIGZvciAoaW50IHBhc3MgPSAwOyA7IHBhc3MrKykgeworICAgICAgICAgICAgT2JqZWN0IGMgPSBsYW1iZGFGb3JtLnRyYW5zZm9ybUNhY2hlOworICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBDb25jdXJyZW50SGFzaE1hcCkgeworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwPFRyYW5zZm9ybSxUcmFuc2Zvcm0+IG0gPSAoQ29uY3VycmVudEhhc2hNYXA8VHJhbnNmb3JtLFRyYW5zZm9ybT4pIGM7CisgICAgICAgICAgICAgICAgVHJhbnNmb3JtIGsgPSBtLnB1dElmQWJzZW50KGtleSwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gayAhPSBudWxsID8gay5yZXN1bHQgOiBmb3JtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KHBhc3MgPT0gMCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxhbWJkYUZvcm0pIHsKKyAgICAgICAgICAgICAgICBjID0gbGFtYmRhRm9ybS50cmFuc2Zvcm1DYWNoZTsKKyAgICAgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIENvbmN1cnJlbnRIYXNoTWFwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxhbWJkYUZvcm0udHJhbnNmb3JtQ2FjaGUgPSBrZXk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1bXSB0YTsKKyAgICAgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkgeworICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0gayA9IChUcmFuc2Zvcm0pYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrLnJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBleHBhbmQgb25lLWVsZW1lbnQgY2FjaGUgdG8gc21hbGwgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgdGEgPSBuZXcgVHJhbnNmb3JtW01JTl9DQUNIRV9BUlJBWV9TSVpFXTsKKyAgICAgICAgICAgICAgICAgICAgdGFbMF0gPSBrOworICAgICAgICAgICAgICAgICAgICBsYW1iZGFGb3JtLnRyYW5zZm9ybUNhY2hlID0gYyA9IHRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGFscmVhZHkgZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgdGEgPSAoVHJhbnNmb3JtW10pYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHRhLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtIGsgPSB0YVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGsuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrLnJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikgeworICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZhbGwgdGhyb3VnaCB0byBjYWNoZSB1cGRhdGUKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA8IE1BWF9DQUNIRV9BUlJBWV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IE1hdGgubWluKGxlbiAqIDIsIE1BWF9DQUNIRV9BUlJBWV9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgdGEgPSBBcnJheXMuY29weU9mKHRhLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBsYW1iZGFGb3JtLnRyYW5zZm9ybUNhY2hlID0gdGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXA8VHJhbnNmb3JtLCBUcmFuc2Zvcm0+IG0gPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PihNQVhfQ0FDSEVfQVJSQVlfU0laRSAqIDIpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFRyYW5zZm9ybSBrIDogdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0ucHV0KGssIGspOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxhbWJkYUZvcm0udHJhbnNmb3JtQ2FjaGUgPSBtOworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2Vjb25kIGl0ZXJhdGlvbiB3aWxsIHVwZGF0ZSBmb3IgdGhpcyBxdWVyeSwgY29uY3VycmVudGx5LgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFbaV0gPSBrZXk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExhbWJkYUZvcm1CdWZmZXIgYnVmZmVyKCkgeworICAgICAgICByZXR1cm4gbmV3IExhbWJkYUZvcm1CdWZmZXIobGFtYmRhRm9ybSk7CisgICAgfQorCisgICAgLy8vIEVkaXRpbmcgbWV0aG9kcyBmb3IgbWV0aG9kIGhhbmRsZXMuICBUaGVzZSBuZWVkIHRvIGhhdmUgZmFzdCBwYXRocy4KKworICAgIHByaXZhdGUgQm91bmRNZXRob2RIYW5kbGUuU3BlY2llc0RhdGEgb2xkU3BlY2llc0RhdGEoKSB7CisgICAgICAgIHJldHVybiBCb3VuZE1ldGhvZEhhbmRsZS5zcGVjaWVzRGF0YShsYW1iZGFGb3JtKTsKKyAgICB9CisgICAgcHJpdmF0ZSBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSBuZXdTcGVjaWVzRGF0YShCYXNpY1R5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gb2xkU3BlY2llc0RhdGEoKS5leHRlbmRXaXRoKHR5cGUpOworICAgIH0KKworICAgIEJvdW5kTWV0aG9kSGFuZGxlIGJpbmRBcmd1bWVudEwoQm91bmRNZXRob2RIYW5kbGUgbWgsIGludCBwb3MsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBhc3NlcnQobWguc3BlY2llc0RhdGEoKSA9PSBvbGRTcGVjaWVzRGF0YSgpKTsKKyAgICAgICAgQmFzaWNUeXBlIGJ0ID0gTF9UWVBFOworICAgICAgICBNZXRob2RUeXBlIHR5cGUyID0gYmluZEFyZ3VtZW50VHlwZShtaCwgcG9zLCBidCk7CisgICAgICAgIExhbWJkYUZvcm0gZm9ybTIgPSBiaW5kQXJndW1lbnRGb3JtKDErcG9zKTsKKyAgICAgICAgcmV0dXJuIG1oLmNvcHlXaXRoRXh0ZW5kTCh0eXBlMiwgZm9ybTIsIHZhbHVlKTsKKyAgICB9CisgICAgQm91bmRNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50SShCb3VuZE1ldGhvZEhhbmRsZSBtaCwgaW50IHBvcywgaW50IHZhbHVlKSB7CisgICAgICAgIGFzc2VydChtaC5zcGVjaWVzRGF0YSgpID09IG9sZFNwZWNpZXNEYXRhKCkpOworICAgICAgICBCYXNpY1R5cGUgYnQgPSBJX1RZUEU7CisgICAgICAgIE1ldGhvZFR5cGUgdHlwZTIgPSBiaW5kQXJndW1lbnRUeXBlKG1oLCBwb3MsIGJ0KTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtMiA9IGJpbmRBcmd1bWVudEZvcm0oMStwb3MpOworICAgICAgICByZXR1cm4gbWguY29weVdpdGhFeHRlbmRJKHR5cGUyLCBmb3JtMiwgdmFsdWUpOworICAgIH0KKworICAgIEJvdW5kTWV0aG9kSGFuZGxlIGJpbmRBcmd1bWVudEooQm91bmRNZXRob2RIYW5kbGUgbWgsIGludCBwb3MsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0KG1oLnNwZWNpZXNEYXRhKCkgPT0gb2xkU3BlY2llc0RhdGEoKSk7CisgICAgICAgIEJhc2ljVHlwZSBidCA9IEpfVFlQRTsKKyAgICAgICAgTWV0aG9kVHlwZSB0eXBlMiA9IGJpbmRBcmd1bWVudFR5cGUobWgsIHBvcywgYnQpOworICAgICAgICBMYW1iZGFGb3JtIGZvcm0yID0gYmluZEFyZ3VtZW50Rm9ybSgxK3Bvcyk7CisgICAgICAgIHJldHVybiBtaC5jb3B5V2l0aEV4dGVuZEoodHlwZTIsIGZvcm0yLCB2YWx1ZSk7CisgICAgfQorCisgICAgQm91bmRNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50RihCb3VuZE1ldGhvZEhhbmRsZSBtaCwgaW50IHBvcywgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0KG1oLnNwZWNpZXNEYXRhKCkgPT0gb2xkU3BlY2llc0RhdGEoKSk7CisgICAgICAgIEJhc2ljVHlwZSBidCA9IEZfVFlQRTsKKyAgICAgICAgTWV0aG9kVHlwZSB0eXBlMiA9IGJpbmRBcmd1bWVudFR5cGUobWgsIHBvcywgYnQpOworICAgICAgICBMYW1iZGFGb3JtIGZvcm0yID0gYmluZEFyZ3VtZW50Rm9ybSgxK3Bvcyk7CisgICAgICAgIHJldHVybiBtaC5jb3B5V2l0aEV4dGVuZEYodHlwZTIsIGZvcm0yLCB2YWx1ZSk7CisgICAgfQorCisgICAgQm91bmRNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50RChCb3VuZE1ldGhvZEhhbmRsZSBtaCwgaW50IHBvcywgZG91YmxlIHZhbHVlKSB7CisgICAgICAgIGFzc2VydChtaC5zcGVjaWVzRGF0YSgpID09IG9sZFNwZWNpZXNEYXRhKCkpOworICAgICAgICBCYXNpY1R5cGUgYnQgPSBEX1RZUEU7CisgICAgICAgIE1ldGhvZFR5cGUgdHlwZTIgPSBiaW5kQXJndW1lbnRUeXBlKG1oLCBwb3MsIGJ0KTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtMiA9IGJpbmRBcmd1bWVudEZvcm0oMStwb3MpOworICAgICAgICByZXR1cm4gbWguY29weVdpdGhFeHRlbmREKHR5cGUyLCBmb3JtMiwgdmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgTWV0aG9kVHlwZSBiaW5kQXJndW1lbnRUeXBlKEJvdW5kTWV0aG9kSGFuZGxlIG1oLCBpbnQgcG9zLCBCYXNpY1R5cGUgYnQpIHsKKyAgICAgICAgYXNzZXJ0KG1oLmZvcm0gPT0gbGFtYmRhRm9ybSk7CisgICAgICAgIGFzc2VydChtaC5mb3JtLm5hbWVzWzErcG9zXS50eXBlID09IGJ0KTsKKyAgICAgICAgYXNzZXJ0KEJhc2ljVHlwZS5iYXNpY1R5cGUobWgudHlwZSgpLnBhcmFtZXRlclR5cGUocG9zKSkgPT0gYnQpOworICAgICAgICByZXR1cm4gbWgudHlwZSgpLmRyb3BQYXJhbWV0ZXJUeXBlcyhwb3MsIHBvcysxKTsKKyAgICB9CisKKyAgICAvLy8gRWRpdGluZyBtZXRob2RzIGZvciBsYW1iZGEgZm9ybXMuCisgICAgLy8gRWFjaCBlZGl0aW5nIG1ldGhvZCBjYW4gKHBvdGVudGlhbGx5KSBjYWNoZSB0aGUgZWRpdGVkIExGIHNvIHRoYXQgaXQgY2FuIGJlIHJldXNlZCBsYXRlci4KKworICAgIExhbWJkYUZvcm0gYmluZEFyZ3VtZW50Rm9ybShpbnQgcG9zKSB7CisgICAgICAgIFRyYW5zZm9ybSBrZXkgPSBUcmFuc2Zvcm0ub2YoVHJhbnNmb3JtLktpbmQuQklORF9BUkcsIHBvcyk7CisgICAgICAgIExhbWJkYUZvcm0gZm9ybSA9IGdldEluQ2FjaGUoa2V5KTsKKyAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0KGZvcm0ucGFyYW1ldGVyQ29uc3RyYWludCgwKSA9PSBuZXdTcGVjaWVzRGF0YShsYW1iZGFGb3JtLnBhcmFtZXRlclR5cGUocG9zKSkpOworICAgICAgICAgICAgcmV0dXJuIGZvcm07CisgICAgICAgIH0KKyAgICAgICAgTGFtYmRhRm9ybUJ1ZmZlciBidWYgPSBidWZmZXIoKTsKKyAgICAgICAgYnVmLnN0YXJ0RWRpdCgpOworCisgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlLlNwZWNpZXNEYXRhIG9sZERhdGEgPSBvbGRTcGVjaWVzRGF0YSgpOworICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSBuZXdEYXRhID0gbmV3U3BlY2llc0RhdGEobGFtYmRhRm9ybS5wYXJhbWV0ZXJUeXBlKHBvcykpOworICAgICAgICBOYW1lIG9sZEJhc2VBZGRyZXNzID0gbGFtYmRhRm9ybS5wYXJhbWV0ZXIoMCk7ICAvLyBCTUggaG9sZGluZyB0aGUgdmFsdWVzCisgICAgICAgIE5hbWUgbmV3QmFzZUFkZHJlc3M7CisgICAgICAgIE5hbWVkRnVuY3Rpb24gZ2V0dGVyID0gbmV3RGF0YS5nZXR0ZXJGdW5jdGlvbihvbGREYXRhLmZpZWxkQ291bnQoKSk7CisKKyAgICAgICAgaWYgKHBvcyAhPSAwKSB7CisgICAgICAgICAgICAvLyBUaGUgbmV3bHkgY3JlYXRlZCBMRiB3aWxsIHJ1biB3aXRoIGEgZGlmZmVyZW50IEJNSC4KKyAgICAgICAgICAgIC8vIFN3aXRjaCBvdmVyIGFueSBwcmUtZXhpc3RpbmcgQk1IIGZpZWxkIHJlZmVyZW5jZXMgdG8gdGhlIG5ldyBCTUggY2xhc3MuCisgICAgICAgICAgICBidWYucmVwbGFjZUZ1bmN0aW9ucyhvbGREYXRhLmdldHRlckZ1bmN0aW9ucygpLCBuZXdEYXRhLmdldHRlckZ1bmN0aW9ucygpLCBvbGRCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICBuZXdCYXNlQWRkcmVzcyA9IG9sZEJhc2VBZGRyZXNzLndpdGhDb25zdHJhaW50KG5ld0RhdGEpOworICAgICAgICAgICAgYnVmLnJlbmFtZVBhcmFtZXRlcigwLCBuZXdCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICBidWYucmVwbGFjZVBhcmFtZXRlckJ5TmV3RXhwcmVzc2lvbihwb3MsIG5ldyBOYW1lKGdldHRlciwgbmV3QmFzZUFkZHJlc3MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNhbm5vdCBiaW5kIHRoZSBNSCBhcmcgaXRzZWxmLCB1bmxlc3Mgb2xkRGF0YSBpcyBlbXB0eQorICAgICAgICAgICAgYXNzZXJ0KG9sZERhdGEgPT0gQm91bmRNZXRob2RIYW5kbGUuU3BlY2llc0RhdGEuRU1QVFkpOworICAgICAgICAgICAgbmV3QmFzZUFkZHJlc3MgPSBuZXcgTmFtZShMX1RZUEUpLndpdGhDb25zdHJhaW50KG5ld0RhdGEpOworICAgICAgICAgICAgYnVmLnJlcGxhY2VQYXJhbWV0ZXJCeU5ld0V4cHJlc3Npb24oMCwgbmV3IE5hbWUoZ2V0dGVyLCBuZXdCYXNlQWRkcmVzcykpOworICAgICAgICAgICAgYnVmLmluc2VydFBhcmFtZXRlcigwLCBuZXdCYXNlQWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBmb3JtID0gYnVmLmVuZEVkaXQoKTsKKyAgICAgICAgcmV0dXJuIHB1dEluQ2FjaGUoa2V5LCBmb3JtKTsKKyAgICB9CisKKyAgICBMYW1iZGFGb3JtIGFkZEFyZ3VtZW50Rm9ybShpbnQgcG9zLCBCYXNpY1R5cGUgdHlwZSkgeworICAgICAgICBUcmFuc2Zvcm0ga2V5ID0gVHJhbnNmb3JtLm9mKFRyYW5zZm9ybS5LaW5kLkFERF9BUkcsIHBvcywgdHlwZS5vcmRpbmFsKCkpOworICAgICAgICBMYW1iZGFGb3JtIGZvcm0gPSBnZXRJbkNhY2hlKGtleSk7CisgICAgICAgIGlmIChmb3JtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydChmb3JtLmFyaXR5ID09IGxhbWJkYUZvcm0uYXJpdHkrMSk7CisgICAgICAgICAgICBhc3NlcnQoZm9ybS5wYXJhbWV0ZXJUeXBlKHBvcykgPT0gdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gZm9ybTsKKyAgICAgICAgfQorICAgICAgICBMYW1iZGFGb3JtQnVmZmVyIGJ1ZiA9IGJ1ZmZlcigpOworICAgICAgICBidWYuc3RhcnRFZGl0KCk7CisKKyAgICAgICAgYnVmLmluc2VydFBhcmFtZXRlcihwb3MsIG5ldyBOYW1lKHR5cGUpKTsKKworICAgICAgICBmb3JtID0gYnVmLmVuZEVkaXQoKTsKKyAgICAgICAgcmV0dXJuIHB1dEluQ2FjaGUoa2V5LCBmb3JtKTsKKyAgICB9CisKKyAgICBMYW1iZGFGb3JtIGR1cEFyZ3VtZW50Rm9ybShpbnQgc3JjUG9zLCBpbnQgZHN0UG9zKSB7CisgICAgICAgIFRyYW5zZm9ybSBrZXkgPSBUcmFuc2Zvcm0ub2YoVHJhbnNmb3JtLktpbmQuRFVQX0FSRywgc3JjUG9zLCBkc3RQb3MpOworICAgICAgICBMYW1iZGFGb3JtIGZvcm0gPSBnZXRJbkNhY2hlKGtleSk7CisgICAgICAgIGlmIChmb3JtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydChmb3JtLmFyaXR5ID09IGxhbWJkYUZvcm0uYXJpdHktMSk7CisgICAgICAgICAgICByZXR1cm4gZm9ybTsKKyAgICAgICAgfQorICAgICAgICBMYW1iZGFGb3JtQnVmZmVyIGJ1ZiA9IGJ1ZmZlcigpOworICAgICAgICBidWYuc3RhcnRFZGl0KCk7CisKKyAgICAgICAgYXNzZXJ0KGxhbWJkYUZvcm0ucGFyYW1ldGVyKHNyY1BvcykuY29uc3RyYWludCA9PSBudWxsKTsKKyAgICAgICAgYXNzZXJ0KGxhbWJkYUZvcm0ucGFyYW1ldGVyKGRzdFBvcykuY29uc3RyYWludCA9PSBudWxsKTsKKyAgICAgICAgYnVmLnJlcGxhY2VQYXJhbWV0ZXJCeUNvcHkoZHN0UG9zLCBzcmNQb3MpOworCisgICAgICAgIGZvcm0gPSBidWYuZW5kRWRpdCgpOworICAgICAgICByZXR1cm4gcHV0SW5DYWNoZShrZXksIGZvcm0pOworICAgIH0KKworICAgIExhbWJkYUZvcm0gc3ByZWFkQXJndW1lbnRzRm9ybShpbnQgcG9zLCBDbGFzczw/PiBhcnJheVR5cGUsIGludCBhcnJheUxlbmd0aCkgeworICAgICAgICBDbGFzczw/PiBlbGVtZW50VHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIENsYXNzPD8+IGVyYXNlZEFycmF5VHlwZSA9IGFycmF5VHlwZTsKKyAgICAgICAgaWYgKCFlbGVtZW50VHlwZS5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgZXJhc2VkQXJyYXlUeXBlID0gT2JqZWN0W10uY2xhc3M7CisgICAgICAgIEJhc2ljVHlwZSBidCA9IGJhc2ljVHlwZShlbGVtZW50VHlwZSk7CisgICAgICAgIGludCBlbGVtZW50VHlwZUtleSA9IGJ0Lm9yZGluYWwoKTsKKyAgICAgICAgaWYgKGJ0LmJhc2ljVHlwZUNsYXNzKCkgIT0gZWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudFR5cGVLZXkgPSBUWVBFX0xJTUlUICsgV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKGVsZW1lbnRUeXBlKS5vcmRpbmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVHJhbnNmb3JtIGtleSA9IFRyYW5zZm9ybS5vZihUcmFuc2Zvcm0uS2luZC5TUFJFQURfQVJHUywgcG9zLCBlbGVtZW50VHlwZUtleSwgYXJyYXlMZW5ndGgpOworICAgICAgICBMYW1iZGFGb3JtIGZvcm0gPSBnZXRJbkNhY2hlKGtleSk7CisgICAgICAgIGlmIChmb3JtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydChmb3JtLmFyaXR5ID09IGxhbWJkYUZvcm0uYXJpdHkgLSBhcnJheUxlbmd0aCArIDEpOworICAgICAgICAgICAgcmV0dXJuIGZvcm07CisgICAgICAgIH0KKyAgICAgICAgTGFtYmRhRm9ybUJ1ZmZlciBidWYgPSBidWZmZXIoKTsKKyAgICAgICAgYnVmLnN0YXJ0RWRpdCgpOworCisgICAgICAgIGFzc2VydChwb3MgPD0gTWV0aG9kVHlwZS5NQVhfSlZNX0FSSVRZKTsKKyAgICAgICAgYXNzZXJ0KHBvcyArIGFycmF5TGVuZ3RoIDw9IGxhbWJkYUZvcm0uYXJpdHkpOworICAgICAgICBhc3NlcnQocG9zID4gMCk7ICAvLyBjYW5ub3Qgc3ByZWFkIHRoZSBNSCBhcmcgaXRzZWxmCisKKyAgICAgICAgTmFtZSBzcHJlYWRQYXJhbSA9IG5ldyBOYW1lKExfVFlQRSk7CisgICAgICAgIE5hbWUgY2hlY2tTcHJlYWQgPSBuZXcgTmFtZShNZXRob2RIYW5kbGVJbXBsLkxhenkuTkZfY2hlY2tTcHJlYWRBcmd1bWVudCwgc3ByZWFkUGFyYW0sIGFycmF5TGVuZ3RoKTsKKworICAgICAgICAvLyBpbnNlcnQgdGhlIG5ldyBleHByZXNzaW9ucworICAgICAgICBpbnQgZXhwclBvcyA9IGxhbWJkYUZvcm0uYXJpdHkoKTsKKyAgICAgICAgYnVmLmluc2VydEV4cHJlc3Npb24oZXhwclBvcysrLCBjaGVja1NwcmVhZCk7CisgICAgICAgIC8vIGFkanVzdCB0aGUgYXJndW1lbnRzCisgICAgICAgIE1ldGhvZEhhbmRsZSBhbG9hZCA9IE1ldGhvZEhhbmRsZXMuYXJyYXlFbGVtZW50R2V0dGVyKGVyYXNlZEFycmF5VHlwZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTmFtZSBsb2FkQXJndW1lbnQgPSBuZXcgTmFtZShhbG9hZCwgc3ByZWFkUGFyYW0sIGkpOworICAgICAgICAgICAgYnVmLmluc2VydEV4cHJlc3Npb24oZXhwclBvcyArIGksIGxvYWRBcmd1bWVudCk7CisgICAgICAgICAgICBidWYucmVwbGFjZVBhcmFtZXRlckJ5Q29weShwb3MgKyBpLCBleHByUG9zICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmluc2VydFBhcmFtZXRlcihwb3MsIHNwcmVhZFBhcmFtKTsKKworICAgICAgICBmb3JtID0gYnVmLmVuZEVkaXQoKTsKKyAgICAgICAgcmV0dXJuIHB1dEluQ2FjaGUoa2V5LCBmb3JtKTsKKyAgICB9CisKKyAgICBMYW1iZGFGb3JtIGNvbGxlY3RBcmd1bWVudHNGb3JtKGludCBwb3MsIE1ldGhvZFR5cGUgY29sbGVjdG9yVHlwZSkgeworICAgICAgICBpbnQgY29sbGVjdG9yQXJpdHkgPSBjb2xsZWN0b3JUeXBlLnBhcmFtZXRlckNvdW50KCk7CisgICAgICAgIGJvb2xlYW4gZHJvcFJlc3VsdCA9IChjb2xsZWN0b3JUeXBlLnJldHVyblR5cGUoKSA9PSB2b2lkLmNsYXNzKTsKKyAgICAgICAgaWYgKGNvbGxlY3RvckFyaXR5ID09IDEgJiYgIWRyb3BSZXN1bHQpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXJBcmd1bWVudEZvcm0ocG9zLCBiYXNpY1R5cGUoY29sbGVjdG9yVHlwZS5wYXJhbWV0ZXJUeXBlKDApKSk7CisgICAgICAgIH0KKyAgICAgICAgQmFzaWNUeXBlW10gbmV3VHlwZXMgPSBCYXNpY1R5cGUuYmFzaWNUeXBlcyhjb2xsZWN0b3JUeXBlLnBhcmFtZXRlckxpc3QoKSk7CisgICAgICAgIFRyYW5zZm9ybS5LaW5kIGtpbmQgPSAoZHJvcFJlc3VsdAorICAgICAgICAgICAgICAgID8gVHJhbnNmb3JtLktpbmQuQ09MTEVDVF9BUkdTX1RPX1ZPSUQKKyAgICAgICAgICAgICAgICA6IFRyYW5zZm9ybS5LaW5kLkNPTExFQ1RfQVJHUyk7CisgICAgICAgIGlmIChkcm9wUmVzdWx0ICYmIGNvbGxlY3RvckFyaXR5ID09IDApICBwb3MgPSAxOyAgLy8gcHVyZSBzaWRlIGVmZmVjdAorICAgICAgICBUcmFuc2Zvcm0ga2V5ID0gVHJhbnNmb3JtLm9mKGtpbmQsIHBvcywgY29sbGVjdG9yQXJpdHksIEJhc2ljVHlwZS5iYXNpY1R5cGVzT3JkKG5ld1R5cGVzKSk7CisgICAgICAgIExhbWJkYUZvcm0gZm9ybSA9IGdldEluQ2FjaGUoa2V5KTsKKyAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0KGZvcm0uYXJpdHkgPT0gbGFtYmRhRm9ybS5hcml0eSAtIChkcm9wUmVzdWx0ID8gMCA6IDEpICsgY29sbGVjdG9yQXJpdHkpOworICAgICAgICAgICAgcmV0dXJuIGZvcm07CisgICAgICAgIH0KKyAgICAgICAgZm9ybSA9IG1ha2VBcmd1bWVudENvbWJpbmF0aW9uRm9ybShwb3MsIGNvbGxlY3RvclR5cGUsIGZhbHNlLCBkcm9wUmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHB1dEluQ2FjaGUoa2V5LCBmb3JtKTsKKyAgICB9CisKKyAgICBMYW1iZGFGb3JtIGNvbGxlY3RBcmd1bWVudEFycmF5Rm9ybShpbnQgcG9zLCBNZXRob2RIYW5kbGUgYXJyYXlDb2xsZWN0b3IpIHsKKyAgICAgICAgTWV0aG9kVHlwZSBjb2xsZWN0b3JUeXBlID0gYXJyYXlDb2xsZWN0b3IudHlwZSgpOworICAgICAgICBpbnQgY29sbGVjdG9yQXJpdHkgPSBjb2xsZWN0b3JUeXBlLnBhcmFtZXRlckNvdW50KCk7CisgICAgICAgIGFzc2VydChhcnJheUNvbGxlY3Rvci5pbnRyaW5zaWNOYW1lKCkgPT0gSW50cmluc2ljLk5FV19BUlJBWSk7CisgICAgICAgIENsYXNzPD8+IGFycmF5VHlwZSA9IGNvbGxlY3RvclR5cGUucmV0dXJuVHlwZSgpOworICAgICAgICBDbGFzczw/PiBlbGVtZW50VHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIEJhc2ljVHlwZSBhcmdUeXBlID0gYmFzaWNUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgaW50IGFyZ1R5cGVLZXkgPSBhcmdUeXBlLm9yZGluYWwoKTsKKyAgICAgICAgaWYgKGFyZ1R5cGUuYmFzaWNUeXBlQ2xhc3MoKSAhPSBlbGVtZW50VHlwZSkgeworICAgICAgICAgICAgLy8gcmV0dXJuIG51bGwgaWYgaXQgcmVxdWlyZXMgbW9yZSBtZXRhZGF0YSAobGlrZSBTdHJpbmdbXS5jbGFzcykKKyAgICAgICAgICAgIGlmICghZWxlbWVudFR5cGUuaXNQcmltaXRpdmUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGFyZ1R5cGVLZXkgPSBUWVBFX0xJTUlUICsgV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKGVsZW1lbnRUeXBlKS5vcmRpbmFsKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGNvbGxlY3RvclR5cGUucGFyYW1ldGVyTGlzdCgpLmVxdWFscyhDb2xsZWN0aW9ucy5uQ29waWVzKGNvbGxlY3RvckFyaXR5LCBlbGVtZW50VHlwZSkpKTsKKyAgICAgICAgVHJhbnNmb3JtLktpbmQga2luZCA9IFRyYW5zZm9ybS5LaW5kLkNPTExFQ1RfQVJHU19UT19BUlJBWTsKKyAgICAgICAgVHJhbnNmb3JtIGtleSA9IFRyYW5zZm9ybS5vZihraW5kLCBwb3MsIGNvbGxlY3RvckFyaXR5LCBhcmdUeXBlS2V5KTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gZ2V0SW5DYWNoZShrZXkpOworICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnQoZm9ybS5hcml0eSA9PSBsYW1iZGFGb3JtLmFyaXR5IC0gMSArIGNvbGxlY3RvckFyaXR5KTsKKyAgICAgICAgICAgIHJldHVybiBmb3JtOworICAgICAgICB9CisgICAgICAgIExhbWJkYUZvcm1CdWZmZXIgYnVmID0gYnVmZmVyKCk7CisgICAgICAgIGJ1Zi5zdGFydEVkaXQoKTsKKworICAgICAgICBhc3NlcnQocG9zICsgMSA8PSBsYW1iZGFGb3JtLmFyaXR5KTsKKyAgICAgICAgYXNzZXJ0KHBvcyA+IDApOyAgLy8gY2Fubm90IGZpbHRlciB0aGUgTUggYXJnIGl0c2VsZgorCisgICAgICAgIE5hbWVbXSBuZXdQYXJhbXMgPSBuZXcgTmFtZVtjb2xsZWN0b3JBcml0eV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sbGVjdG9yQXJpdHk7IGkrKykgeworICAgICAgICAgICAgbmV3UGFyYW1zW2ldID0gbmV3IE5hbWUocG9zICsgaSwgYXJnVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgTmFtZSBjYWxsQ29tYmluZXIgPSBuZXcgTmFtZShhcnJheUNvbGxlY3RvciwgKE9iamVjdFtdKSAvKi4uLiovIG5ld1BhcmFtcyk7CisKKyAgICAgICAgLy8gaW5zZXJ0IHRoZSBuZXcgZXhwcmVzc2lvbgorICAgICAgICBpbnQgZXhwclBvcyA9IGxhbWJkYUZvcm0uYXJpdHkoKTsKKyAgICAgICAgYnVmLmluc2VydEV4cHJlc3Npb24oZXhwclBvcywgY2FsbENvbWJpbmVyKTsKKworICAgICAgICAvLyBpbnNlcnQgbmV3IGFyZ3VtZW50cworICAgICAgICBpbnQgYXJnUG9zID0gcG9zICsgMTsgIC8vIHNraXAgcmVzdWx0IHBhcmFtZXRlcgorICAgICAgICBmb3IgKE5hbWUgbmV3UGFyYW0gOiBuZXdQYXJhbXMpIHsKKyAgICAgICAgICAgIGJ1Zi5pbnNlcnRQYXJhbWV0ZXIoYXJnUG9zKyssIG5ld1BhcmFtKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoYnVmLmxhc3RJbmRleE9mKGNhbGxDb21iaW5lcikgPT0gZXhwclBvcytuZXdQYXJhbXMubGVuZ3RoKTsKKyAgICAgICAgYnVmLnJlcGxhY2VQYXJhbWV0ZXJCeUNvcHkocG9zLCBleHByUG9zK25ld1BhcmFtcy5sZW5ndGgpOworCisgICAgICAgIGZvcm0gPSBidWYuZW5kRWRpdCgpOworICAgICAgICByZXR1cm4gcHV0SW5DYWNoZShrZXksIGZvcm0pOworICAgIH0KKworICAgIExhbWJkYUZvcm0gZmlsdGVyQXJndW1lbnRGb3JtKGludCBwb3MsIEJhc2ljVHlwZSBuZXdUeXBlKSB7CisgICAgICAgIFRyYW5zZm9ybSBrZXkgPSBUcmFuc2Zvcm0ub2YoVHJhbnNmb3JtLktpbmQuRklMVEVSX0FSRywgcG9zLCBuZXdUeXBlLm9yZGluYWwoKSk7CisgICAgICAgIExhbWJkYUZvcm0gZm9ybSA9IGdldEluQ2FjaGUoa2V5KTsKKyAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0KGZvcm0uYXJpdHkgPT0gbGFtYmRhRm9ybS5hcml0eSk7CisgICAgICAgICAgICBhc3NlcnQoZm9ybS5wYXJhbWV0ZXJUeXBlKHBvcykgPT0gbmV3VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gZm9ybTsKKyAgICAgICAgfQorCisgICAgICAgIEJhc2ljVHlwZSBvbGRUeXBlID0gbGFtYmRhRm9ybS5wYXJhbWV0ZXJUeXBlKHBvcyk7CisgICAgICAgIE1ldGhvZFR5cGUgZmlsdGVyVHlwZSA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShvbGRUeXBlLmJhc2ljVHlwZUNsYXNzKCksCisgICAgICAgICAgICAgICAgbmV3VHlwZS5iYXNpY1R5cGVDbGFzcygpKTsKKyAgICAgICAgZm9ybSA9IG1ha2VBcmd1bWVudENvbWJpbmF0aW9uRm9ybShwb3MsIGZpbHRlclR5cGUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBwdXRJbkNhY2hlKGtleSwgZm9ybSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMYW1iZGFGb3JtIG1ha2VBcmd1bWVudENvbWJpbmF0aW9uRm9ybShpbnQgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZSBjb21iaW5lclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGtlZXBBcmd1bWVudHMsIGJvb2xlYW4gZHJvcFJlc3VsdCkgeworICAgICAgICBMYW1iZGFGb3JtQnVmZmVyIGJ1ZiA9IGJ1ZmZlcigpOworICAgICAgICBidWYuc3RhcnRFZGl0KCk7CisgICAgICAgIGludCBjb21iaW5lckFyaXR5ID0gY29tYmluZXJUeXBlLnBhcmFtZXRlckNvdW50KCk7CisgICAgICAgIGludCByZXN1bHRBcml0eSA9IChkcm9wUmVzdWx0ID8gMCA6IDEpOworCisgICAgICAgIGFzc2VydChwb3MgPD0gTWV0aG9kVHlwZS5NQVhfSlZNX0FSSVRZKTsKKyAgICAgICAgYXNzZXJ0KHBvcyArIHJlc3VsdEFyaXR5ICsgKGtlZXBBcmd1bWVudHMgPyBjb21iaW5lckFyaXR5IDogMCkgPD0gbGFtYmRhRm9ybS5hcml0eSk7CisgICAgICAgIGFzc2VydChwb3MgPiAwKTsgIC8vIGNhbm5vdCBmaWx0ZXIgdGhlIE1IIGFyZyBpdHNlbGYKKyAgICAgICAgYXNzZXJ0KGNvbWJpbmVyVHlwZSA9PSBjb21iaW5lclR5cGUuYmFzaWNUeXBlKCkpOworICAgICAgICBhc3NlcnQoY29tYmluZXJUeXBlLnJldHVyblR5cGUoKSAhPSB2b2lkLmNsYXNzIHx8IGRyb3BSZXN1bHQpOworCisgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlLlNwZWNpZXNEYXRhIG9sZERhdGEgPSBvbGRTcGVjaWVzRGF0YSgpOworICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSBuZXdEYXRhID0gbmV3U3BlY2llc0RhdGEoTF9UWVBFKTsKKworICAgICAgICAvLyBUaGUgbmV3bHkgY3JlYXRlZCBMRiB3aWxsIHJ1biB3aXRoIGEgZGlmZmVyZW50IEJNSC4KKyAgICAgICAgLy8gU3dpdGNoIG92ZXIgYW55IHByZS1leGlzdGluZyBCTUggZmllbGQgcmVmZXJlbmNlcyB0byB0aGUgbmV3IEJNSCBjbGFzcy4KKyAgICAgICAgTmFtZSBvbGRCYXNlQWRkcmVzcyA9IGxhbWJkYUZvcm0ucGFyYW1ldGVyKDApOyAgLy8gQk1IIGhvbGRpbmcgdGhlIHZhbHVlcworICAgICAgICBidWYucmVwbGFjZUZ1bmN0aW9ucyhvbGREYXRhLmdldHRlckZ1bmN0aW9ucygpLCBuZXdEYXRhLmdldHRlckZ1bmN0aW9ucygpLCBvbGRCYXNlQWRkcmVzcyk7CisgICAgICAgIE5hbWUgbmV3QmFzZUFkZHJlc3MgPSBvbGRCYXNlQWRkcmVzcy53aXRoQ29uc3RyYWludChuZXdEYXRhKTsKKyAgICAgICAgYnVmLnJlbmFtZVBhcmFtZXRlcigwLCBuZXdCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgTmFtZSBnZXRDb21iaW5lciA9IG5ldyBOYW1lKG5ld0RhdGEuZ2V0dGVyRnVuY3Rpb24ob2xkRGF0YS5maWVsZENvdW50KCkpLCBuZXdCYXNlQWRkcmVzcyk7CisgICAgICAgIE9iamVjdFtdIGNvbWJpbmVyQXJncyA9IG5ldyBPYmplY3RbMSArIGNvbWJpbmVyQXJpdHldOworICAgICAgICBjb21iaW5lckFyZ3NbMF0gPSBnZXRDb21iaW5lcjsKKyAgICAgICAgTmFtZVtdIG5ld1BhcmFtczsKKyAgICAgICAgaWYgKGtlZXBBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIG5ld1BhcmFtcyA9IG5ldyBOYW1lWzBdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsYW1iZGFGb3JtLm5hbWVzLCBwb3MgKyByZXN1bHRBcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZXJBcmdzLCAxLCBjb21iaW5lckFyaXR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld1BhcmFtcyA9IG5ldyBOYW1lW2NvbWJpbmVyQXJpdHldOworICAgICAgICAgICAgQmFzaWNUeXBlW10gbmV3VHlwZXMgPSBiYXNpY1R5cGVzKGNvbWJpbmVyVHlwZS5wYXJhbWV0ZXJMaXN0KCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG5ld1BhcmFtc1tpXSA9IG5ldyBOYW1lKHBvcyArIGksIG5ld1R5cGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3UGFyYW1zLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lckFyZ3MsIDEsIGNvbWJpbmVyQXJpdHkpOworICAgICAgICB9CisgICAgICAgIE5hbWUgY2FsbENvbWJpbmVyID0gbmV3IE5hbWUoY29tYmluZXJUeXBlLCBjb21iaW5lckFyZ3MpOworCisgICAgICAgIC8vIGluc2VydCB0aGUgdHdvIG5ldyBleHByZXNzaW9ucworICAgICAgICBpbnQgZXhwclBvcyA9IGxhbWJkYUZvcm0uYXJpdHkoKTsKKyAgICAgICAgYnVmLmluc2VydEV4cHJlc3Npb24oZXhwclBvcyswLCBnZXRDb21iaW5lcik7CisgICAgICAgIGJ1Zi5pbnNlcnRFeHByZXNzaW9uKGV4cHJQb3MrMSwgY2FsbENvbWJpbmVyKTsKKworICAgICAgICAvLyBpbnNlcnQgbmV3IGFyZ3VtZW50cywgaWYgbmVlZGVkCisgICAgICAgIGludCBhcmdQb3MgPSBwb3MgKyByZXN1bHRBcml0eTsgIC8vIHNraXAgcmVzdWx0IHBhcmFtZXRlcgorICAgICAgICBmb3IgKE5hbWUgbmV3UGFyYW0gOiBuZXdQYXJhbXMpIHsKKyAgICAgICAgICAgIGJ1Zi5pbnNlcnRQYXJhbWV0ZXIoYXJnUG9zKyssIG5ld1BhcmFtKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoYnVmLmxhc3RJbmRleE9mKGNhbGxDb21iaW5lcikgPT0gZXhwclBvcysxK25ld1BhcmFtcy5sZW5ndGgpOworICAgICAgICBpZiAoIWRyb3BSZXN1bHQpIHsKKyAgICAgICAgICAgIGJ1Zi5yZXBsYWNlUGFyYW1ldGVyQnlDb3B5KHBvcywgZXhwclBvcysxK25ld1BhcmFtcy5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1Zi5lbmRFZGl0KCk7CisgICAgfQorCisgICAgTGFtYmRhRm9ybSBmaWx0ZXJSZXR1cm5Gb3JtKEJhc2ljVHlwZSBuZXdUeXBlLCBib29sZWFuIGNvbnN0YW50WmVybykgeworICAgICAgICBUcmFuc2Zvcm0uS2luZCBraW5kID0gKGNvbnN0YW50WmVybyA/IFRyYW5zZm9ybS5LaW5kLkZJTFRFUl9SRVRVUk5fVE9fWkVSTyA6IFRyYW5zZm9ybS5LaW5kLkZJTFRFUl9SRVRVUk4pOworICAgICAgICBUcmFuc2Zvcm0ga2V5ID0gVHJhbnNmb3JtLm9mKGtpbmQsIG5ld1R5cGUub3JkaW5hbCgpKTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gZ2V0SW5DYWNoZShrZXkpOworICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnQoZm9ybS5hcml0eSA9PSBsYW1iZGFGb3JtLmFyaXR5KTsKKyAgICAgICAgICAgIGFzc2VydChmb3JtLnJldHVyblR5cGUoKSA9PSBuZXdUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBmb3JtOworICAgICAgICB9CisgICAgICAgIExhbWJkYUZvcm1CdWZmZXIgYnVmID0gYnVmZmVyKCk7CisgICAgICAgIGJ1Zi5zdGFydEVkaXQoKTsKKworICAgICAgICBpbnQgaW5zUG9zID0gbGFtYmRhRm9ybS5uYW1lcy5sZW5ndGg7CisgICAgICAgIE5hbWUgY2FsbEZpbHRlcjsKKyAgICAgICAgaWYgKGNvbnN0YW50WmVybykgeworICAgICAgICAgICAgLy8gU3ludGhlc2l6ZSBhIGNvbnN0YW50IHplcm8gdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAgICAgICAgaWYgKG5ld1R5cGUgPT0gVl9UWVBFKQorICAgICAgICAgICAgICAgIGNhbGxGaWx0ZXIgPSBudWxsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNhbGxGaWx0ZXIgPSBuZXcgTmFtZShjb25zdGFudFplcm8obmV3VHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQm91bmRNZXRob2RIYW5kbGUuU3BlY2llc0RhdGEgb2xkRGF0YSA9IG9sZFNwZWNpZXNEYXRhKCk7CisgICAgICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YSBuZXdEYXRhID0gbmV3U3BlY2llc0RhdGEoTF9UWVBFKTsKKworICAgICAgICAgICAgLy8gVGhlIG5ld2x5IGNyZWF0ZWQgTEYgd2lsbCBydW4gd2l0aCBhIGRpZmZlcmVudCBCTUguCisgICAgICAgICAgICAvLyBTd2l0Y2ggb3ZlciBhbnkgcHJlLWV4aXN0aW5nIEJNSCBmaWVsZCByZWZlcmVuY2VzIHRvIHRoZSBuZXcgQk1IIGNsYXNzLgorICAgICAgICAgICAgTmFtZSBvbGRCYXNlQWRkcmVzcyA9IGxhbWJkYUZvcm0ucGFyYW1ldGVyKDApOyAgLy8gQk1IIGhvbGRpbmcgdGhlIHZhbHVlcworICAgICAgICAgICAgYnVmLnJlcGxhY2VGdW5jdGlvbnMob2xkRGF0YS5nZXR0ZXJGdW5jdGlvbnMoKSwgbmV3RGF0YS5nZXR0ZXJGdW5jdGlvbnMoKSwgb2xkQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgTmFtZSBuZXdCYXNlQWRkcmVzcyA9IG9sZEJhc2VBZGRyZXNzLndpdGhDb25zdHJhaW50KG5ld0RhdGEpOworICAgICAgICAgICAgYnVmLnJlbmFtZVBhcmFtZXRlcigwLCBuZXdCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgICAgIE5hbWUgZ2V0RmlsdGVyID0gbmV3IE5hbWUobmV3RGF0YS5nZXR0ZXJGdW5jdGlvbihvbGREYXRhLmZpZWxkQ291bnQoKSksIG5ld0Jhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgIGJ1Zi5pbnNlcnRFeHByZXNzaW9uKGluc1BvcysrLCBnZXRGaWx0ZXIpOworICAgICAgICAgICAgQmFzaWNUeXBlIG9sZFR5cGUgPSBsYW1iZGFGb3JtLnJldHVyblR5cGUoKTsKKyAgICAgICAgICAgIGlmIChvbGRUeXBlID09IFZfVFlQRSkgeworICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUgZmlsdGVyVHlwZSA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShuZXdUeXBlLmJhc2ljVHlwZUNsYXNzKCkpOworICAgICAgICAgICAgICAgIGNhbGxGaWx0ZXIgPSBuZXcgTmFtZShmaWx0ZXJUeXBlLCBnZXRGaWx0ZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRob2RUeXBlIGZpbHRlclR5cGUgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUobmV3VHlwZS5iYXNpY1R5cGVDbGFzcygpLCBvbGRUeXBlLmJhc2ljVHlwZUNsYXNzKCkpOworICAgICAgICAgICAgICAgIGNhbGxGaWx0ZXIgPSBuZXcgTmFtZShmaWx0ZXJUeXBlLCBnZXRGaWx0ZXIsIGxhbWJkYUZvcm0ubmFtZXNbbGFtYmRhRm9ybS5yZXN1bHRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYWxsRmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICBidWYuaW5zZXJ0RXhwcmVzc2lvbihpbnNQb3MrKywgY2FsbEZpbHRlcik7CisgICAgICAgIGJ1Zi5zZXRSZXN1bHQoY2FsbEZpbHRlcik7CisKKyAgICAgICAgZm9ybSA9IGJ1Zi5lbmRFZGl0KCk7CisgICAgICAgIHJldHVybiBwdXRJbkNhY2hlKGtleSwgZm9ybSk7CisgICAgfQorCisgICAgTGFtYmRhRm9ybSBmb2xkQXJndW1lbnRzRm9ybShpbnQgZm9sZFBvcywgYm9vbGVhbiBkcm9wUmVzdWx0LCBNZXRob2RUeXBlIGNvbWJpbmVyVHlwZSkgeworICAgICAgICBpbnQgY29tYmluZXJBcml0eSA9IGNvbWJpbmVyVHlwZS5wYXJhbWV0ZXJDb3VudCgpOworICAgICAgICBUcmFuc2Zvcm0uS2luZCBraW5kID0gKGRyb3BSZXN1bHQgPyBUcmFuc2Zvcm0uS2luZC5GT0xEX0FSR1NfVE9fVk9JRCA6IFRyYW5zZm9ybS5LaW5kLkZPTERfQVJHUyk7CisgICAgICAgIFRyYW5zZm9ybSBrZXkgPSBUcmFuc2Zvcm0ub2Yoa2luZCwgZm9sZFBvcywgY29tYmluZXJBcml0eSk7CisgICAgICAgIExhbWJkYUZvcm0gZm9ybSA9IGdldEluQ2FjaGUoa2V5KTsKKyAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0KGZvcm0uYXJpdHkgPT0gbGFtYmRhRm9ybS5hcml0eSAtIChraW5kID09IFRyYW5zZm9ybS5LaW5kLkZPTERfQVJHUyA/IDEgOiAwKSk7CisgICAgICAgICAgICByZXR1cm4gZm9ybTsKKyAgICAgICAgfQorICAgICAgICBmb3JtID0gbWFrZUFyZ3VtZW50Q29tYmluYXRpb25Gb3JtKGZvbGRQb3MsIGNvbWJpbmVyVHlwZSwgdHJ1ZSwgZHJvcFJlc3VsdCk7CisgICAgICAgIHJldHVybiBwdXRJbkNhY2hlKGtleSwgZm9ybSk7CisgICAgfQorCisgICAgTGFtYmRhRm9ybSBwZXJtdXRlQXJndW1lbnRzRm9ybShpbnQgc2tpcCwgaW50W10gcmVvcmRlcikgeworICAgICAgICBhc3NlcnQoc2tpcCA9PSAxKTsgIC8vIHNraXAgb25seSB0aGUgbGVhZGluZyBNSCBhcmd1bWVudCwgbmFtZXNbMF0KKyAgICAgICAgaW50IGxlbmd0aCA9IGxhbWJkYUZvcm0ubmFtZXMubGVuZ3RoOworICAgICAgICBpbnQgb3V0QXJncyA9IHJlb3JkZXIubGVuZ3RoOworICAgICAgICBpbnQgaW5UeXBlcyA9IDA7CisgICAgICAgIGJvb2xlYW4gbnVsbFBlcm0gPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlb3JkZXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpbkFyZyA9IHJlb3JkZXJbaV07CisgICAgICAgICAgICBpZiAoaW5BcmcgIT0gaSkgIG51bGxQZXJtID0gZmFsc2U7CisgICAgICAgICAgICBpblR5cGVzID0gTWF0aC5tYXgoaW5UeXBlcywgaW5BcmcrMSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHNraXAgKyByZW9yZGVyLmxlbmd0aCA9PSBsYW1iZGFGb3JtLmFyaXR5KTsKKyAgICAgICAgaWYgKG51bGxQZXJtKSAgcmV0dXJuIGxhbWJkYUZvcm07ICAvLyBkbyBub3QgYm90aGVyIHRvIGNhY2hlCisgICAgICAgIFRyYW5zZm9ybSBrZXkgPSBUcmFuc2Zvcm0ub2YoVHJhbnNmb3JtLktpbmQuUEVSTVVURV9BUkdTLCByZW9yZGVyKTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gZ2V0SW5DYWNoZShrZXkpOworICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnQoZm9ybS5hcml0eSA9PSBza2lwK2luVHlwZXMpIDogZm9ybTsKKyAgICAgICAgICAgIHJldHVybiBmb3JtOworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNUeXBlW10gdHlwZXMgPSBuZXcgQmFzaWNUeXBlW2luVHlwZXNdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dEFyZ3M7IGkrKykgeworICAgICAgICAgICAgaW50IGluQXJnID0gcmVvcmRlcltpXTsKKyAgICAgICAgICAgIHR5cGVzW2luQXJnXSA9IGxhbWJkYUZvcm0ubmFtZXNbc2tpcCArIGldLnR5cGU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IChza2lwICsgb3V0QXJncyA9PSBsYW1iZGFGb3JtLmFyaXR5KTsKKyAgICAgICAgYXNzZXJ0IChwZXJtdXRlZFR5cGVzTWF0Y2gocmVvcmRlciwgdHlwZXMsIGxhbWJkYUZvcm0ubmFtZXMsIHNraXApKTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChwb3MgPCBvdXRBcmdzICYmIHJlb3JkZXJbcG9zXSA9PSBwb3MpIHsKKyAgICAgICAgICAgIHBvcyArPSAxOworICAgICAgICB9CisgICAgICAgIE5hbWVbXSBuYW1lczIgPSBuZXcgTmFtZVtsZW5ndGggLSBvdXRBcmdzICsgaW5UeXBlc107CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGFtYmRhRm9ybS5uYW1lcywgMCwgbmFtZXMyLCAwLCBza2lwICsgcG9zKTsKKyAgICAgICAgaW50IGJvZHlMZW5ndGggPSBsZW5ndGggLSBsYW1iZGFGb3JtLmFyaXR5OworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxhbWJkYUZvcm0ubmFtZXMsIHNraXAgKyBvdXRBcmdzLCBuYW1lczIsIHNraXAgKyBpblR5cGVzLCBib2R5TGVuZ3RoKTsKKyAgICAgICAgaW50IGFyaXR5MiA9IG5hbWVzMi5sZW5ndGggLSBib2R5TGVuZ3RoOworICAgICAgICBpbnQgcmVzdWx0MiA9IGxhbWJkYUZvcm0ucmVzdWx0OworICAgICAgICBpZiAocmVzdWx0MiA+PSAwKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0MiA8IHNraXAgKyBvdXRBcmdzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0MiA9IHJlb3JkZXJbcmVzdWx0MiAtIHNraXBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gcmVzdWx0MiAtIG91dEFyZ3MgKyBpblR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGogPSBwb3M7IGogPCBvdXRBcmdzOyBqKyspIHsKKyAgICAgICAgICAgIE5hbWUgbiA9IGxhbWJkYUZvcm0ubmFtZXNbc2tpcCArIGpdOworICAgICAgICAgICAgaW50IGkgPSByZW9yZGVyW2pdOworICAgICAgICAgICAgTmFtZSBuMiA9IG5hbWVzMltza2lwICsgaV07CisgICAgICAgICAgICBpZiAobjIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWVzMltza2lwICsgaV0gPSBuMiA9IG5ldyBOYW1lKHR5cGVzW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IChuMi50eXBlID09IHR5cGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGsgPSBhcml0eTI7IGsgPCBuYW1lczIubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICBuYW1lczJba10gPSBuYW1lczJba10ucmVwbGFjZU5hbWUobiwgbjIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBza2lwICsgcG9zOyBpIDwgYXJpdHkyOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lczJbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWVzMltpXSA9IGFyZ3VtZW50KGksIHR5cGVzW2kgLSBza2lwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaiA9IGxhbWJkYUZvcm0uYXJpdHk7IGogPCBsYW1iZGFGb3JtLm5hbWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBpbnQgaSA9IGogLSBsYW1iZGFGb3JtLmFyaXR5ICsgYXJpdHkyOworICAgICAgICAgICAgTmFtZSBuID0gbGFtYmRhRm9ybS5uYW1lc1tqXTsKKyAgICAgICAgICAgIE5hbWUgbjIgPSBuYW1lczJbaV07CisgICAgICAgICAgICBpZiAobiAhPSBuMikgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBpICsgMTsgayA8IG5hbWVzMi5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBuYW1lczJba10gPSBuYW1lczJba10ucmVwbGFjZU5hbWUobiwgbjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcm0gPSBuZXcgTGFtYmRhRm9ybShsYW1iZGFGb3JtLmRlYnVnTmFtZSwgYXJpdHkyLCBuYW1lczIsIHJlc3VsdDIpOworICAgICAgICByZXR1cm4gcHV0SW5DYWNoZShrZXksIGZvcm0pOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIHBlcm11dGVkVHlwZXNNYXRjaChpbnRbXSByZW9yZGVyLCBCYXNpY1R5cGVbXSB0eXBlcywgTmFtZVtdIG5hbWVzLCBpbnQgc2tpcCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlb3JkZXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydCAobmFtZXNbc2tpcCArIGldLmlzUGFyYW0oKSk7CisgICAgICAgICAgICBhc3NlcnQgKG5hbWVzW3NraXAgKyBpXS50eXBlID09IHR5cGVzW3Jlb3JkZXJbaV1dKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01lbWJlck5hbWUuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWVtYmVyTmFtZS5qYXZhCmluZGV4IDljYzkwMWUuLmNkMTY5ZjMgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWVtYmVyTmFtZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWVtYmVyTmFtZS5qYXZhCkBAIC0zMjcsMTAgKzMyNyw2IEBACiAgICAgICAgIGFzc2VydChnZXRSZWZlcmVuY2VLaW5kKCkgPT0gb2xkS2luZCk7CiAgICAgICAgIGFzc2VydChNZXRob2RIYW5kbGVOYXRpdmVzLnJlZktpbmRJc1ZhbGlkKHJlZktpbmQpKTsKICAgICAgICAgZmxhZ3MgKz0gKCgoaW50KXJlZktpbmQgLSBvbGRLaW5kKSA8PCBNTl9SRUZFUkVOQ0VfS0lORF9TSElGVCk7Ci0vLyAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IoKSAmJiByZWZLaW5kICE9IFJFRl9uZXdJbnZva2VTcGVjaWFsKQotLy8gICAgICAgICAgICBmbGFncyArPSAoSVNfTUVUSE9EIC0gSVNfQ09OU1RSVUNUT1IpOwotLy8gICAgICAgIGVsc2UgaWYgKHJlZktpbmQgPT0gUkVGX25ld0ludm9rZVNwZWNpYWwgJiYgaXNNZXRob2QoKSkKLS8vICAgICAgICAgICAgZmxhZ3MgKz0gKElTX0NPTlNUUlVDVE9SIC0gSVNfTUVUSE9EKTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCkBAIC0zNDQsOSArMzQwLDExIEBACiAgICAgICAgIHJldHVybiAhdGVzdEZsYWdzKG1hc2ssIDApOwogICAgIH0KIAotICAgIC8qKiBVdGlsaXR5IG1ldGhvZCB0byBxdWVyeSBpZiB0aGlzIG1lbWJlciBpcyBhIG1ldGhvZCBoYW5kbGUgaW52b2NhdGlvbiAoaW52b2tlIG9yIGludm9rZUV4YWN0KS4gKi8KKyAgICAvKiogVXRpbGl0eSBtZXRob2QgdG8gcXVlcnkgaWYgdGhpcyBtZW1iZXIgaXMgYSBtZXRob2QgaGFuZGxlIGludm9jYXRpb24gKGludm9rZSBvciBpbnZva2VFeGFjdCkuCisgICAgICogIEFsc28gcmV0dXJucyB0cnVlIGZvciB0aGUgbm9uLXB1YmxpYyBNSC5pbnZva2VCYXNpYy4KKyAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEhhbmRsZUludm9rZSgpIHsKLSAgICAgICAgZmluYWwgaW50IGJpdHMgPSBNSF9JTlZPS0VfTU9EUzsKKyAgICAgICAgZmluYWwgaW50IGJpdHMgPSBNSF9JTlZPS0VfTU9EUyAmfiBNb2RpZmllci5QVUJMSUM7CiAgICAgICAgIGZpbmFsIGludCBuZWdzID0gTW9kaWZpZXIuU1RBVElDOwogICAgICAgICBpZiAodGVzdEZsYWdzKGJpdHMgfCBuZWdzLCBiaXRzKSAmJgogICAgICAgICAgICAgY2xhenogPT0gTWV0aG9kSGFuZGxlLmNsYXNzKSB7CkBAIC0zNTUsNyArMzUzLDE0IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kSGFuZGxlSW52b2tlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMoImludm9rZSIpIHx8IG5hbWUuZXF1YWxzKCJpbnZva2VFeGFjdCIpOworICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKKyAgICAgICAgY2FzZSAiaW52b2tlIjoKKyAgICAgICAgY2FzZSAiaW52b2tlRXhhY3QiOgorICAgICAgICBjYXNlICJpbnZva2VCYXNpYyI6ICAvLyBpbnRlcm5hbCBzaWctcG9seSBtZXRob2QKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSF9JTlZPS0VfTU9EUyA9IE1vZGlmaWVyLk5BVElWRSB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuUFVCTElDOwogCkBAIC03MjAsMTYgKzcyNSw4IEBACiAgICAgICAgIGluaXQoZGVmQ2xhc3MsIG5hbWUsIHR5cGUsIGZsYWdzTW9kcyhJU19GSUVMRCwgMCwgcmVmS2luZCkpOwogICAgICAgICBpbml0UmVzb2x2ZWQoZmFsc2UpOwogICAgIH0KLSAgICAvKiogQ3JlYXRlIGEgZmllbGQgb3IgdHlwZSBuYW1lIGZyb20gdGhlIGdpdmVuIGNvbXBvbmVudHM6ICBEZWNsYXJpbmcgY2xhc3MsIG5hbWUsIHR5cGUuCi0gICAgICogIFRoZSBkZWNsYXJpbmcgY2xhc3MgbWF5IGJlIHN1cHBsaWVkIGFzIG51bGwgaWYgdGhpcyBpcyB0byBiZSBhIGJhcmUgbmFtZSBhbmQgdHlwZS4KLSAgICAgKiAgVGhlIG1vZGlmaWVyIGZsYWdzIGRlZmF1bHQgdG8gemVyby4KLSAgICAgKiAgVGhlIHJlc3VsdGluZyBuYW1lIHdpbGwgaW4gYW4gdW5yZXNvbHZlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVtYmVyTmFtZShDbGFzczw/PiBkZWZDbGFzcywgU3RyaW5nIG5hbWUsIENsYXNzPD8+IHR5cGUsIFZvaWQgdW51c2VkKSB7Ci0gICAgICAgIHRoaXMoZGVmQ2xhc3MsIG5hbWUsIHR5cGUsIFJFRl9OT05FKTsKLSAgICAgICAgaW5pdFJlc29sdmVkKGZhbHNlKTsKLSAgICB9Ci0gICAgLyoqIENyZWF0ZSBhIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBuYW1lIGZyb20gdGhlIGdpdmVuIGNvbXBvbmVudHM6ICBEZWNsYXJpbmcgY2xhc3MsIG5hbWUsIHR5cGUsIG1vZGlmaWVycy4KKyAgICAvKiogQ3JlYXRlIGEgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gY29tcG9uZW50czoKKyAgICAgKiAgRGVjbGFyaW5nIGNsYXNzLCBuYW1lLCB0eXBlLCByZWZlcmVuY2Uga2luZC4KICAgICAgKiAgSXQgd2lsbCBiZSBhIGNvbnN0cnVjdG9yIGlmIGFuZCBvbmx5IGlmIHRoZSBuYW1lIGlzIHtAY29kZSAiJmx0O2luaXQmZ3Q7In0uCiAgICAgICogIFRoZSBkZWNsYXJpbmcgY2xhc3MgbWF5IGJlIHN1cHBsaWVkIGFzIG51bGwgaWYgdGhpcyBpcyB0byBiZSBhIGJhcmUgbmFtZSBhbmQgdHlwZS4KICAgICAgKiAgVGhlIGxhc3QgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGEgYm9vbGVhbiB3aGljaCByZXF1ZXN0cyBSRUZfaW52b2tlU3BlY2lhbC4KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZS5qYXZhCmluZGV4IGNlMTE1ZGYuLmYwMTY5ZTcgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGUuamF2YQpAQCAtMjcsMTIgKzI3LDggQEAKIAogCiBpbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgc3VuLmludm9rZS51dGlsLio7Ci1pbXBvcnQgc3VuLm1pc2MuVW5zYWZlOwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlU3RhdGljcy4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKIAogLyoqCiAgKiBBIG1ldGhvZCBoYW5kbGUgaXMgYSB0eXBlZCwgZGlyZWN0bHkgZXhlY3V0YWJsZSByZWZlcmVuY2UgdG8gYW4gdW5kZXJseWluZyBtZXRob2QsCkBAIC02MjUsMTUgKzYyMSw4IEBACiAgICAgICogQHNlZSBNZXRob2RIYW5kbGVzI3NwcmVhZEludm9rZXIKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGludm9rZVdpdGhBcmd1bWVudHMoT2JqZWN0Li4uIGFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGludCBhcmdjID0gYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aDsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIkxvY2FsVmFyaWFibGVIaWRlc01lbWJlclZhcmlhYmxlIikKLSAgICAgICAgTWV0aG9kVHlwZSB0eXBlID0gdHlwZSgpOwotICAgICAgICBpZiAodHlwZS5wYXJhbWV0ZXJDb3VudCgpICE9IGFyZ2MgfHwgaXNWYXJhcmdzQ29sbGVjdG9yKCkpIHsKLSAgICAgICAgICAgIC8vIHNpbXVsYXRlIGludm9rZQotICAgICAgICAgICAgcmV0dXJuIGFzVHlwZShNZXRob2RUeXBlLmdlbmVyaWNNZXRob2RUeXBlKGFyZ2MpKS5pbnZva2VXaXRoQXJndW1lbnRzKGFyZ3VtZW50cyk7Ci0gICAgICAgIH0KLSAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSB0eXBlLmludm9rZXJzKCkudmFyYXJnc0ludm9rZXIoKTsKLSAgICAgICAgcmV0dXJuIGludm9rZXIuaW52b2tlRXhhY3QodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgTWV0aG9kVHlwZSBpbnZvY2F0aW9uVHlwZSA9IE1ldGhvZFR5cGUuZ2VuZXJpY01ldGhvZFR5cGUoYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBpbnZvY2F0aW9uVHlwZS5pbnZva2VycygpLnNwcmVhZEludm9rZXIoMCkuaW52b2tlRXhhY3QoYXNUeXBlKGludm9jYXRpb25UeXBlKSwgYXJndW1lbnRzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTczMSw3ICs3MjAsNyBAQAogICAgICAqIDxsaT5JZiB0aGUgcmV0dXJuIHR5cGUgPGVtPlQwPC9lbT4gaXMgdm9pZCBhbmQgPGVtPlQxPC9lbT4gYSBwcmltaXRpdmUsCiAgICAgICogICAgIGEgemVybyB2YWx1ZSBpcyBpbnRyb2R1Y2VkLgogICAgICAqIDwvdWw+Ci0gICAgKiAoPGVtPk5vdGU6PC9lbT4gQm90aCA8ZW0+VDA8L2VtPiBhbmQgPGVtPlQxPC9lbT4gbWF5IGJlIHJlZ2FyZGVkIGFzIHN0YXRpYyB0eXBlcywKKyAgICAgKiAoPGVtPk5vdGU6PC9lbT4gQm90aCA8ZW0+VDA8L2VtPiBhbmQgPGVtPlQxPC9lbT4gbWF5IGJlIHJlZ2FyZGVkIGFzIHN0YXRpYyB0eXBlcywKICAgICAgKiBiZWNhdXNlIG5laXRoZXIgY29ycmVzcG9uZHMgc3BlY2lmaWNhbGx5IHRvIHRoZSA8ZW0+ZHluYW1pYyB0eXBlPC9lbT4gb2YgYW55CiAgICAgICogYWN0dWFsIGFyZ3VtZW50IG9yIHJldHVybiB2YWx1ZS4pCiAgICAgICogPHA+CkBAIC03NjMsMTggKzc1MiwyNiBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KICAgICAgICAgLy8gUmV0dXJuICd0aGlzLmFzVHlwZUNhY2hlJyBpZiB0aGUgY29udmVyc2lvbiBpcyBhbHJlYWR5IG1lbW9pemVkLgorICAgICAgICBNZXRob2RIYW5kbGUgYXRjID0gYXNUeXBlQ2FjaGVkKG5ld1R5cGUpOworICAgICAgICBpZiAoYXRjICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhdGM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFzVHlwZVVuY2FjaGVkKG5ld1R5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgTWV0aG9kSGFuZGxlIGFzVHlwZUNhY2hlZChNZXRob2RUeXBlIG5ld1R5cGUpIHsKICAgICAgICAgTWV0aG9kSGFuZGxlIGF0YyA9IGFzVHlwZUNhY2hlOwogICAgICAgICBpZiAoYXRjICE9IG51bGwgJiYgbmV3VHlwZSA9PSBhdGMudHlwZSkgewogICAgICAgICAgICAgcmV0dXJuIGF0YzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gYXNUeXBlVW5jYWNoZWQobmV3VHlwZSk7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKiBPdmVycmlkZSB0aGlzIHRvIGNoYW5nZSBhc1R5cGUgYmVoYXZpb3IuICovCiAgICAgLypub24tcHVibGljKi8gTWV0aG9kSGFuZGxlIGFzVHlwZVVuY2FjaGVkKE1ldGhvZFR5cGUgbmV3VHlwZSkgewogICAgICAgICBpZiAoIXR5cGUuaXNDb252ZXJ0aWJsZVRvKG5ld1R5cGUpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nTWV0aG9kVHlwZUV4Y2VwdGlvbigiY2Fubm90IGNvbnZlcnQgIit0aGlzKyIgdG8gIituZXdUeXBlKTsKLSAgICAgICAgcmV0dXJuIGFzVHlwZUNhY2hlID0gY29udmVydEFyZ3VtZW50cyhuZXdUeXBlKTsKKyAgICAgICAgcmV0dXJuIGFzVHlwZUNhY2hlID0gTWV0aG9kSGFuZGxlSW1wbC5tYWtlUGFpcndpc2VDb252ZXJ0KHRoaXMsIG5ld1R5cGUsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODY3LDM0ICs4NjQsNDggQEAKICAgICAgKiBAc2VlICNhc0NvbGxlY3RvcgogICAgICAqLwogICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgYXNTcHJlYWRlcihDbGFzczw/PiBhcnJheVR5cGUsIGludCBhcnJheUxlbmd0aCkgewotICAgICAgICBhc1NwcmVhZGVyQ2hlY2tzKGFycmF5VHlwZSwgYXJyYXlMZW5ndGgpOwotICAgICAgICBpbnQgc3ByZWFkQXJnUG9zID0gdHlwZS5wYXJhbWV0ZXJDb3VudCgpIC0gYXJyYXlMZW5ndGg7Ci0gICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVJbXBsLm1ha2VTcHJlYWRBcmd1bWVudHModGhpcywgYXJyYXlUeXBlLCBzcHJlYWRBcmdQb3MsIGFycmF5TGVuZ3RoKTsKKyAgICAgICAgTWV0aG9kVHlwZSBwb3N0U3ByZWFkVHlwZSA9IGFzU3ByZWFkZXJDaGVja3MoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7CisgICAgICAgIGludCBhcml0eSA9IHR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpOworICAgICAgICBpbnQgc3ByZWFkQXJnUG9zID0gYXJpdHkgLSBhcnJheUxlbmd0aDsKKyAgICAgICAgaWYgKFVTRV9MQU1CREFfRk9STV9FRElUT1IpIHsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBhZnRlclNwcmVhZCA9IHRoaXMuYXNUeXBlKHBvc3RTcHJlYWRUeXBlKTsKKyAgICAgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlIG1oID0gYWZ0ZXJTcHJlYWQucmViaW5kKCk7CisgICAgICAgICAgICBMYW1iZGFGb3JtIGxmb3JtID0gbWguZWRpdG9yKCkuc3ByZWFkQXJndW1lbnRzRm9ybSgxICsgc3ByZWFkQXJnUG9zLCBhcnJheVR5cGUsIGFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIE1ldGhvZFR5cGUgcHJlU3ByZWFkVHlwZSA9IHBvc3RTcHJlYWRUeXBlLnJlcGxhY2VQYXJhbWV0ZXJUeXBlcyhzcHJlYWRBcmdQb3MsIGFyaXR5LCBhcnJheVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG1oLmNvcHlXaXRoKHByZVNwcmVhZFR5cGUsIGxmb3JtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVJbXBsLm1ha2VTcHJlYWRBcmd1bWVudHModGhpcywgYXJyYXlUeXBlLCBzcHJlYWRBcmdQb3MsIGFycmF5TGVuZ3RoKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhc1NwcmVhZGVyQ2hlY2tzKENsYXNzPD8+IGFycmF5VHlwZSwgaW50IGFycmF5TGVuZ3RoKSB7CisgICAgLyoqCisgICAgICogU2VlIGlmIHtAY29kZSBhc1NwcmVhZGVyfSBjYW4gYmUgdmFsaWRseSBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGhhbmRsZSBjYWxsIGFmdGVyIHNwcmVhZGluZyBidXQgYmVmb3JlIGNvbnZlcnNpb25zLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kVHlwZSBhc1NwcmVhZGVyQ2hlY2tzKENsYXNzPD8+IGFycmF5VHlwZSwgaW50IGFycmF5TGVuZ3RoKSB7CiAgICAgICAgIHNwcmVhZEFycmF5Q2hlY2tzKGFycmF5VHlwZSwgYXJyYXlMZW5ndGgpOwogICAgICAgICBpbnQgbmFyZ3MgPSB0eXBlKCkucGFyYW1ldGVyQ291bnQoKTsKICAgICAgICAgaWYgKG5hcmdzIDwgYXJyYXlMZW5ndGggfHwgYXJyYXlMZW5ndGggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgc3ByZWFkIGFycmF5IGxlbmd0aCIpOwotICAgICAgICBpZiAoYXJyYXlUeXBlICE9IE9iamVjdFtdLmNsYXNzICYmIGFycmF5TGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc2F3UHJvYmxlbSA9IGZhbHNlOwotICAgICAgICAgICAgQ2xhc3M8Pz4gYXJyYXlFbGVtZW50ID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBuYXJncyAtIGFycmF5TGVuZ3RoOyBpIDwgbmFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghTWV0aG9kVHlwZS5jYW5Db252ZXJ0KGFycmF5RWxlbWVudCwgdHlwZSgpLnBhcmFtZXRlclR5cGUoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNhd1Byb2JsZW0gPSB0cnVlOworICAgICAgICBDbGFzczw/PiBhcnJheUVsZW1lbnQgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICBNZXRob2RUeXBlIG10eXBlID0gdHlwZSgpOworICAgICAgICBib29sZWFuIG1hdGNoID0gdHJ1ZSwgZmFpbCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gbmFyZ3MgLSBhcnJheUxlbmd0aDsgaSA8IG5hcmdzOyBpKyspIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHB0eXBlID0gbXR5cGUucGFyYW1ldGVyVHlwZShpKTsKKyAgICAgICAgICAgIGlmIChwdHlwZSAhPSBhcnJheUVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghTWV0aG9kVHlwZS5jYW5Db252ZXJ0KGFycmF5RWxlbWVudCwgcHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2F3UHJvYmxlbSkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxDbGFzczw/Pj4gcHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KHR5cGUoKS5wYXJhbWV0ZXJMaXN0KCkpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBuYXJncyAtIGFycmF5TGVuZ3RoOyBpIDwgbmFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBwdHlwZXMuc2V0KGksIGFycmF5RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGVsaWNpdCBhbiBlcnJvcjoKLSAgICAgICAgICAgICAgICB0aGlzLmFzVHlwZShNZXRob2RUeXBlLm1ldGhvZFR5cGUodHlwZSgpLnJldHVyblR5cGUoKSwgcHR5cGVzKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoKSAgcmV0dXJuIG10eXBlOworICAgICAgICBNZXRob2RUeXBlIG5lZWRUeXBlID0gbXR5cGUuYXNTcHJlYWRlclR5cGUoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7CisgICAgICAgIGlmICghZmFpbCkgIHJldHVybiBuZWVkVHlwZTsKKyAgICAgICAgLy8gZWxpY2l0IGFuIGVycm9yOgorICAgICAgICB0aGlzLmFzVHlwZShuZWVkVHlwZSk7CisgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoInNob3VsZCBub3QgcmV0dXJuIiwgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNwcmVhZEFycmF5Q2hlY2tzKENsYXNzPD8+IGFycmF5VHlwZSwgaW50IGFycmF5TGVuZ3RoKSB7CkBAIC05ODQsMTYgKzk5NSwzMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgYXNDb2xsZWN0b3IoQ2xhc3M8Pz4gYXJyYXlUeXBlLCBpbnQgYXJyYXlMZW5ndGgpIHsKICAgICAgICAgYXNDb2xsZWN0b3JDaGVja3MoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7Ci0gICAgICAgIGludCBjb2xsZWN0QXJnUG9zID0gdHlwZSgpLnBhcmFtZXRlckNvdW50KCktMTsKLSAgICAgICAgTWV0aG9kSGFuZGxlIHRhcmdldCA9IHRoaXM7Ci0gICAgICAgIGlmIChhcnJheVR5cGUgIT0gdHlwZSgpLnBhcmFtZXRlclR5cGUoY29sbGVjdEFyZ1BvcykpCi0gICAgICAgICAgICB0YXJnZXQgPSBjb252ZXJ0QXJndW1lbnRzKHR5cGUoKS5jaGFuZ2VQYXJhbWV0ZXJUeXBlKGNvbGxlY3RBcmdQb3MsIGFycmF5VHlwZSkpOwotICAgICAgICBNZXRob2RIYW5kbGUgY29sbGVjdG9yID0gVmFsdWVDb252ZXJzaW9ucy52YXJhcmdzQXJyYXkoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVzLmNvbGxlY3RBcmd1bWVudHModGFyZ2V0LCBjb2xsZWN0QXJnUG9zLCBjb2xsZWN0b3IpOworICAgICAgICBpbnQgY29sbGVjdEFyZ1BvcyA9IHR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpIC0gMTsKKyAgICAgICAgaWYgKFVTRV9MQU1CREFfRk9STV9FRElUT1IpIHsKKyAgICAgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlIG1oID0gcmViaW5kKCk7CisgICAgICAgICAgICBNZXRob2RUeXBlIHJlc3VsdFR5cGUgPSB0eXBlKCkuYXNDb2xsZWN0b3JUeXBlKGFycmF5VHlwZSwgYXJyYXlMZW5ndGgpOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG5ld0FycmF5ID0gTWV0aG9kSGFuZGxlSW1wbC52YXJhcmdzQXJyYXkoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7CisgICAgICAgICAgICBMYW1iZGFGb3JtIGxmb3JtID0gbWguZWRpdG9yKCkuY29sbGVjdEFyZ3VtZW50QXJyYXlGb3JtKDEgKyBjb2xsZWN0QXJnUG9zLCBuZXdBcnJheSk7CisgICAgICAgICAgICBpZiAobGZvcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtaC5jb3B5V2l0aChyZXN1bHRUeXBlLCBsZm9ybSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZm9ybSA9IG1oLmVkaXRvcigpLmNvbGxlY3RBcmd1bWVudHNGb3JtKDEgKyBjb2xsZWN0QXJnUG9zLCBuZXdBcnJheS50eXBlKCkuYmFzaWNUeXBlKCkpOworICAgICAgICAgICAgcmV0dXJuIG1oLmNvcHlXaXRoRXh0ZW5kTChyZXN1bHRUeXBlLCBsZm9ybSwgbmV3QXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHRhcmdldCA9IHRoaXM7CisgICAgICAgICAgICBpZiAoYXJyYXlUeXBlICE9IHR5cGUoKS5wYXJhbWV0ZXJUeXBlKGNvbGxlY3RBcmdQb3MpKQorICAgICAgICAgICAgICAgIHRhcmdldCA9IE1ldGhvZEhhbmRsZUltcGwubWFrZVBhaXJ3aXNlQ29udmVydCh0aGlzLCB0eXBlKCkuY2hhbmdlUGFyYW1ldGVyVHlwZShjb2xsZWN0QXJnUG9zLCBhcnJheVR5cGUpLCB0cnVlKTsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBjb2xsZWN0b3IgPSBNZXRob2RIYW5kbGVJbXBsLnZhcmFyZ3NBcnJheShhcnJheVR5cGUsIGFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVzLmNvbGxlY3RBcmd1bWVudHModGFyZ2V0LCBjb2xsZWN0QXJnUG9zLCBjb2xsZWN0b3IpOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gcHJpdmF0ZSBBUEk6IHJldHVybiB0cnVlIGlmIGxhc3QgcGFyYW0gZXhhY3RseSBtYXRjaGVzIGFycmF5VHlwZQotICAgIHByaXZhdGUgYm9vbGVhbiBhc0NvbGxlY3RvckNoZWNrcyhDbGFzczw/PiBhcnJheVR5cGUsIGludCBhcnJheUxlbmd0aCkgeworICAgIC8qKgorICAgICAqIFNlZSBpZiB7QGNvZGUgYXNDb2xsZWN0b3J9IGNhbiBiZSB2YWxpZGx5IGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYXN0IHBhcmFtZXRlciBpcyBub3QgYW4gZXhhY3QgbWF0Y2ggdG8gYXJyYXlUeXBlLgorICAgICAqLworICAgIC8qbm9uLXB1YmxpYyovIGJvb2xlYW4gYXNDb2xsZWN0b3JDaGVja3MoQ2xhc3M8Pz4gYXJyYXlUeXBlLCBpbnQgYXJyYXlMZW5ndGgpIHsKICAgICAgICAgc3ByZWFkQXJyYXlDaGVja3MoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7CiAgICAgICAgIGludCBuYXJncyA9IHR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpOwogICAgICAgICBpZiAobmFyZ3MgIT0gMCkgewpAQCAtMTE1NSw3ICsxMTgxLDcgQEAKICAgICAgKiBAc2VlICNhc0ZpeGVkQXJpdHkKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kSGFuZGxlIGFzVmFyYXJnc0NvbGxlY3RvcihDbGFzczw/PiBhcnJheVR5cGUpIHsKLSAgICAgICAgQ2xhc3M8Pz4gYXJyYXlFbGVtZW50ID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgYXJyYXlUeXBlLmdldENsYXNzKCk7IC8vIGV4cGxpY2l0IE5QRQogICAgICAgICBib29sZWFuIGxhc3RNYXRjaCA9IGFzQ29sbGVjdG9yQ2hlY2tzKGFycmF5VHlwZSwgMCk7CiAgICAgICAgIGlmIChpc1ZhcmFyZ3NDb2xsZWN0b3IoKSAmJiBsYXN0TWF0Y2gpCiAgICAgICAgICAgICByZXR1cm4gdGhpczsKQEAgLTEyNTcsMTQgKzEyODMsOCBAQAogICAgICAqIEBzZWUgTWV0aG9kSGFuZGxlcyNpbnNlcnRBcmd1bWVudHMKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kSGFuZGxlIGJpbmRUbyhPYmplY3QgeCkgewotICAgICAgICBDbGFzczw/PiBwdHlwZTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIkxvY2FsVmFyaWFibGVIaWRlc01lbWJlclZhcmlhYmxlIikKLSAgICAgICAgTWV0aG9kVHlwZSB0eXBlID0gdHlwZSgpOwotICAgICAgICBpZiAodHlwZS5wYXJhbWV0ZXJDb3VudCgpID09IDAgfHwKLSAgICAgICAgICAgIChwdHlwZSA9IHR5cGUucGFyYW1ldGVyVHlwZSgwKSkuaXNQcmltaXRpdmUoKSkKLSAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gbGVhZGluZyByZWZlcmVuY2UgcGFyYW1ldGVyIiwgeCk7Ci0gICAgICAgIHggPSBwdHlwZS5jYXN0KHgpOyAgLy8gdGhyb3cgQ0NFIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gYmluZFJlY2VpdmVyKHgpOworICAgICAgICB4ID0gdHlwZS5sZWFkaW5nUmVmZXJlbmNlUGFyYW1ldGVyKCkuY2FzdCh4KTsgIC8vIHRocm93IENDRSBpZiBuZWVkZWQKKyAgICAgICAgcmV0dXJuIGJpbmRBcmd1bWVudEwoMCwgeCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjg0LDE0ICsxMzA0LDE3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKERFQlVHX01FVEhPRF9IQU5ETEVfTkFNRVMpICByZXR1cm4gZGVidWdTdHJpbmcoKTsKKyAgICAgICAgaWYgKERFQlVHX01FVEhPRF9IQU5ETEVfTkFNRVMpICByZXR1cm4gIk1ldGhvZEhhbmRsZSIrZGVidWdTdHJpbmcoKTsKICAgICAgICAgcmV0dXJuIHN0YW5kYXJkU3RyaW5nKCk7CiAgICAgfQogICAgIFN0cmluZyBzdGFuZGFyZFN0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJNZXRob2RIYW5kbGUiK3R5cGU7CiAgICAgfQorICAgIC8qKiBSZXR1cm4gYSBzdHJpbmcgd2l0aCBhIHNldmVyYWwgbGluZXMgZGVzY3JpYmluZyB0aGUgbWV0aG9kIGhhbmRsZSBzdHJ1Y3R1cmUuCisgICAgICogIFRoaXMgc3RyaW5nIHdvdWxkIGJlIHN1aXRhYmxlIGZvciBkaXNwbGF5IGluIGFuIElERSBkZWJ1Z2dlci4KKyAgICAgKi8KICAgICBTdHJpbmcgZGVidWdTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdGFuZGFyZFN0cmluZygpKyIvTEY9IitpbnRlcm5hbEZvcm0oKStpbnRlcm5hbFByb3BlcnRpZXMoKTsKKyAgICAgICAgcmV0dXJuIHR5cGUrIiA6ICIraW50ZXJuYWxGb3JtKCkraW50ZXJuYWxQcm9wZXJ0aWVzKCk7CiAgICAgfQogCiAgICAgLy8vLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzLgpAQCAtMTMwMCwyMiArMTMyMyw0MiBAQAogCiAgICAgLy8gT3RoZXIgdHJhbnNmb3JtcyB0byBkbzogIGNvbnZlcnQsIGV4cGxpY2l0Q2FzdCwgcGVybXV0ZSwgZHJvcCwgZmlsdGVyLCBmb2xkLCBHV1QsIGNhdGNoCiAKKyAgICBCb3VuZE1ldGhvZEhhbmRsZSBiaW5kQXJndW1lbnRMKGludCBwb3MsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcmViaW5kKCkuYmluZEFyZ3VtZW50TChwb3MsIHZhbHVlKTsKKyAgICB9CisKICAgICAvKm5vbi1wdWJsaWMqLwogICAgIE1ldGhvZEhhbmRsZSBzZXRWYXJhcmdzKE1lbWJlck5hbWUgbWVtYmVyKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbWVtYmVyLmlzVmFyYXJncygpKSAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIGludCBhcmdjID0gdHlwZSgpLnBhcmFtZXRlckNvdW50KCk7Ci0gICAgICAgIGlmIChhcmdjICE9IDApIHsKLSAgICAgICAgICAgIENsYXNzPD8+IGFycmF5VHlwZSA9IHR5cGUoKS5wYXJhbWV0ZXJUeXBlKGFyZ2MtMSk7Ci0gICAgICAgICAgICBpZiAoYXJyYXlUeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVJbXBsLm1ha2VWYXJhcmdzQ29sbGVjdG9yKHRoaXMsIGFycmF5VHlwZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIENsYXNzPD8+IGFycmF5VHlwZSA9IHR5cGUoKS5sYXN0UGFyYW1ldGVyVHlwZSgpOworICAgICAgICBpZiAoYXJyYXlUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZVZhcmFyZ3NDb2xsZWN0b3IodGhpcywgYXJyYXlUeXBlKTsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBtZW1iZXIubWFrZUFjY2Vzc0V4Y2VwdGlvbigiY2Fubm90IG1ha2UgdmFyaWFibGUgYXJpdHkiLCBudWxsKTsKICAgICB9CisKICAgICAvKm5vbi1wdWJsaWMqLwotICAgIE1ldGhvZEhhbmRsZSB2aWV3QXNUeXBlKE1ldGhvZFR5cGUgbmV3VHlwZSkgeworICAgIE1ldGhvZEhhbmRsZSB2aWV3QXNUeXBlKE1ldGhvZFR5cGUgbmV3VHlwZSwgYm9vbGVhbiBzdHJpY3QpIHsKICAgICAgICAgLy8gTm8gYWN0dWFsIGNvbnZlcnNpb25zLCBqdXN0IGEgbmV3IHZpZXcgb2YgdGhlIHNhbWUgbWV0aG9kLgotICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlSW1wbC5tYWtlUGFpcndpc2VDb252ZXJ0KHRoaXMsIG5ld1R5cGUsIDApOworICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gbXVzdCBub3QgcHJvZHVjZSBhIERpcmVjdE1ldGhvZEhhbmRsZSwKKyAgICAgICAgLy8gYmVjYXVzZSByZXR5cGVkIERNSHMsIGxpa2UgYW55IHRyYW5zZm9ybWVkIE1IcywKKyAgICAgICAgLy8gY2Fubm90IGJlIGNyYWNrZWQgaW50byBNZXRob2RIYW5kbGVJbmZvLgorICAgICAgICBhc3NlcnQgdmlld0FzVHlwZUNoZWNrcyhuZXdUeXBlLCBzdHJpY3QpOworICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZSBtaCA9IHJlYmluZCgpOworICAgICAgICBhc3NlcnQoISgoTWV0aG9kSGFuZGxlKW1oIGluc3RhbmNlb2YgRGlyZWN0TWV0aG9kSGFuZGxlKSk7CisgICAgICAgIHJldHVybiBtaC5jb3B5V2l0aChuZXdUeXBlLCBtaC5mb3JtKTsKKyAgICB9CisKKyAgICAvKm5vbi1wdWJsaWMqLworICAgIGJvb2xlYW4gdmlld0FzVHlwZUNoZWNrcyhNZXRob2RUeXBlIG5ld1R5cGUsIGJvb2xlYW4gc3RyaWN0KSB7CisgICAgICAgIGlmIChzdHJpY3QpIHsKKyAgICAgICAgICAgIGFzc2VydCh0eXBlKCkuaXNWaWV3YWJsZUFzKG5ld1R5cGUsIHRydWUpKQorICAgICAgICAgICAgICAgIDogQXJyYXlzLmFzTGlzdCh0aGlzLCBuZXdUeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydCh0eXBlKCkuYmFzaWNUeXBlKCkuaXNWaWV3YWJsZUFzKG5ld1R5cGUuYmFzaWNUeXBlKCksIHRydWUpKQorICAgICAgICAgICAgICAgIDogQXJyYXlzLmFzTGlzdCh0aGlzLCBuZXdUeXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvLyBEZWNvZGluZwpAQCAtMTMzNiw5ICsxMzc5LDE1IEBACiAgICAgfQogCiAgICAgLypub24tcHVibGljKi8KLSAgICBNZXRob2RIYW5kbGUgd2l0aEludGVybmFsTWVtYmVyTmFtZShNZW1iZXJOYW1lIG1lbWJlcikgeworICAgIE1ldGhvZEhhbmRsZUltcGwuSW50cmluc2ljIGludHJpbnNpY05hbWUoKSB7CisgICAgICAgIC8vIG5vIHNwZWNpYWwgaW50cmluc2ljIG1lYW5pbmcgdG8gbW9zdCBNSHMKKyAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwuSW50cmluc2ljLk5PTkU7CisgICAgfQorCisgICAgLypub24tcHVibGljKi8KKyAgICBNZXRob2RIYW5kbGUgd2l0aEludGVybmFsTWVtYmVyTmFtZShNZW1iZXJOYW1lIG1lbWJlciwgYm9vbGVhbiBpc0ludm9rZVNwZWNpYWwpIHsKICAgICAgICAgaWYgKG1lbWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlSW1wbC5tYWtlV3JhcHBlZE1lbWJlcih0aGlzLCBtZW1iZXIpOworICAgICAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZVdyYXBwZWRNZW1iZXIodGhpcywgbWVtYmVyLCBpc0ludm9rZVNwZWNpYWwpOwogICAgICAgICB9IGVsc2UgaWYgKGludGVybmFsTWVtYmVyTmFtZSgpID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFRoZSByZXF1aXJlZCBpbnRlcm5hTWVtYmVyTmFtZSBpcyBudWxsLCBhbmQgdGhpcyBNSCAobGlrZSBtb3N0KSBkb2Vzbid0IGhhdmUgb25lLgogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CkBAIC0xMzYyLDcgKzE0MTEsNyBAQAogCiAgICAgLypub24tcHVibGljKi8KICAgICBPYmplY3QgaW50ZXJuYWxQcm9wZXJ0aWVzKCkgewotICAgICAgICAvLyBPdmVycmlkZSB0byBzb21ldGhpbmcgbGlrZSAiL0ZPTz1iYXIiCisgICAgICAgIC8vIE92ZXJyaWRlIHRvIHNvbWV0aGluZyB0byBmb2xsb3cgdGhpcy5mb3JtLCBsaWtlICJcbiYgRk9PPWJhciIKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIApAQCAtMTM3MCwxMTQgKzE0MTksMTQgQEAKICAgICAvLy8vIFN1Yi1jbGFzc2VzIGNhbiBvdmVycmlkZSB0aGVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4KICAgICAvLy8vIEFsbCB0aGVzZSBtZXRob2RzIGFzc3VtZSBhcmd1bWVudHMgYXJlIGFscmVhZHkgdmFsaWRhdGVkLgogCi0gICAgLypub24tcHVibGljKi8gTWV0aG9kSGFuZGxlIGNvbnZlcnRBcmd1bWVudHMoTWV0aG9kVHlwZSBuZXdUeXBlKSB7Ci0gICAgICAgIC8vIE92ZXJyaWRlIHRoaXMgaWYgaXQgY2FuIGJlIGltcHJvdmVkLgotICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlSW1wbC5tYWtlUGFpcndpc2VDb252ZXJ0KHRoaXMsIG5ld1R5cGUsIDEpOwotICAgIH0KLQogICAgIC8qbm9uLXB1YmxpYyovCi0gICAgTWV0aG9kSGFuZGxlIGJpbmRBcmd1bWVudChpbnQgcG9zLCBjaGFyIGJhc2ljVHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIC8vIE92ZXJyaWRlIHRoaXMgaWYgaXQgY2FuIGJlIGltcHJvdmVkLgotICAgICAgICByZXR1cm4gcmViaW5kKCkuYmluZEFyZ3VtZW50KHBvcywgYmFzaWNUeXBlLCB2YWx1ZSk7Ci0gICAgfQorICAgIGFic3RyYWN0IE1ldGhvZEhhbmRsZSBjb3B5V2l0aChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmKTsKIAotICAgIC8qbm9uLXB1YmxpYyovCi0gICAgTWV0aG9kSGFuZGxlIGJpbmRSZWNlaXZlcihPYmplY3QgcmVjZWl2ZXIpIHsKLSAgICAgICAgLy8gT3ZlcnJpZGUgdGhpcyBpZiBpdCBjYW4gYmUgaW1wcm92ZWQuCi0gICAgICAgIHJldHVybiBiaW5kQXJndW1lbnQoMCwgJ0wnLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLypub24tcHVibGljKi8KLSAgICBNZXRob2RIYW5kbGUgYmluZEltbWVkaWF0ZShpbnQgcG9zLCBjaGFyIGJhc2ljVHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIC8vIEJpbmQgYW4gaW1tZWRpYXRlIHZhbHVlIHRvIGEgcG9zaXRpb24gaW4gdGhlIGFyZ3VtZW50cy4KLSAgICAgICAgLy8gVGhpcyBtZWFucywgZWxpZGUgdGhlIHJlc3BlY3RpdmUgYXJndW1lbnQsCi0gICAgICAgIC8vIGFuZCByZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGl0IGluIE5hbWVkRnVuY3Rpb24gYXJncyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0KLSAgICAgICAgLy8gQ1VSUkVOVCBSRVNUUklDVElPTlMKLSAgICAgICAgLy8gKiBvbmx5IGZvciBwb3MgMCBhbmQgVU5TQUZFIChwb3NpdGlvbiBpcyBhZGp1c3RlZCBpbiBNSEltcGwgdG8gbWFrZSBBUEkgdXNhYmxlIGZvciBvdGhlcnMpCi0gICAgICAgIGFzc2VydCBwb3MgPT0gMCAmJiBiYXNpY1R5cGUgPT0gJ0wnICYmIHZhbHVlIGluc3RhbmNlb2YgVW5zYWZlOwotICAgICAgICBNZXRob2RUeXBlIHR5cGUyID0gdHlwZS5kcm9wUGFyYW1ldGVyVHlwZXMocG9zLCBwb3MgKyAxKTsgLy8gYWRqdXN0bWVudDogaWdub3JlIHJlY2VpdmVyIQotICAgICAgICBMYW1iZGFGb3JtIGZvcm0yID0gZm9ybS5iaW5kSW1tZWRpYXRlKHBvcyArIDEsIGJhc2ljVHlwZSwgdmFsdWUpOyAvLyBhZGp1c3QgcG9zIHRvIGZvcm0tcmVsYXRpdmUgcG9zCi0gICAgICAgIHJldHVybiBjb3B5V2l0aCh0eXBlMiwgZm9ybTIpOwotICAgIH0KLQotICAgIC8qbm9uLXB1YmxpYyovCi0gICAgTWV0aG9kSGFuZGxlIGNvcHlXaXRoKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoImNvcHlXaXRoOiAiICsgdGhpcy5nZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICAvKm5vbi1wdWJsaWMqLwotICAgIE1ldGhvZEhhbmRsZSBkcm9wQXJndW1lbnRzKE1ldGhvZFR5cGUgc3JjVHlwZSwgaW50IHBvcywgaW50IGRyb3BzKSB7Ci0gICAgICAgIC8vIE92ZXJyaWRlIHRoaXMgaWYgaXQgY2FuIGJlIGltcHJvdmVkLgotICAgICAgICByZXR1cm4gcmViaW5kKCkuZHJvcEFyZ3VtZW50cyhzcmNUeXBlLCBwb3MsIGRyb3BzKTsKLSAgICB9Ci0KLSAgICAvKm5vbi1wdWJsaWMqLwotICAgIE1ldGhvZEhhbmRsZSBwZXJtdXRlQXJndW1lbnRzKE1ldGhvZFR5cGUgbmV3VHlwZSwgaW50W10gcmVvcmRlcikgewotICAgICAgICAvLyBPdmVycmlkZSB0aGlzIGlmIGl0IGNhbiBiZSBpbXByb3ZlZC4KLSAgICAgICAgcmV0dXJuIHJlYmluZCgpLnBlcm11dGVBcmd1bWVudHMobmV3VHlwZSwgcmVvcmRlcik7Ci0gICAgfQotCi0gICAgLypub24tcHVibGljKi8KLSAgICBNZXRob2RIYW5kbGUgcmViaW5kKCkgewotICAgICAgICAvLyBCaW5kICd0aGlzJyBpbnRvIGEgbmV3IGludm9rZXIsIG9mIHRoZSBrbm93biBjbGFzcyBCTUguCi0gICAgICAgIE1ldGhvZFR5cGUgdHlwZTIgPSB0eXBlKCk7Ci0gICAgICAgIExhbWJkYUZvcm0gZm9ybTIgPSByZWludm9rZXJGb3JtKHRoaXMpOwotICAgICAgICAvLyBmb3JtMiA9IGxhbWJkYSAoYm1oLCBhcmcqKSB7IHRoaXNtaCA9IGJtaFswXTsgaW52b2tlQmFzaWModGhpc21oLCBhcmcqKSB9Ci0gICAgICAgIHJldHVybiBCb3VuZE1ldGhvZEhhbmRsZS5iaW5kU2luZ2xlKHR5cGUyLCBmb3JtMiwgdGhpcyk7Ci0gICAgfQotCi0gICAgLypub24tcHVibGljKi8KLSAgICBNZXRob2RIYW5kbGUgcmVpbnZva2VyVGFyZ2V0KCkgewotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigibm90IGEgcmVpbnZva2VyIE1IOiAiK3RoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogIit0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiogQ3JlYXRlIGEgTEYgd2hpY2ggc2ltcGx5IHJlaW52b2tlcyBhIHRhcmdldCBvZiB0aGUgZ2l2ZW4gYmFzaWMgdHlwZS4KLSAgICAgKiAgVGhlIHRhcmdldCBNSCBtdXN0IG92ZXJyaWRlIHtAbGluayAjcmVpbnZva2VyVGFyZ2V0fSB0byBwcm92aWRlIHRoZSB0YXJnZXQuCisgICAgLyoqIFJlcXVpcmUgdGhpcyBtZXRob2QgaGFuZGxlIHRvIGJlIGEgQk1ILCBvciBlbHNlIHJlcGxhY2UgaXQgd2l0aCBhICJ3cmFwcGVyIiBCTUguCisgICAgICogIE1hbnkgdHJhbnNmb3JtcyBhcmUgaW1wbGVtZW50ZWQgb25seSBmb3IgQk1Icy4KKyAgICAgKiAgQHJldHVybiBhIGJlaGF2aW9yYWxseSBlcXVpdmFsZW50IEJNSAogICAgICAqLwotICAgIHN0YXRpYyBMYW1iZGFGb3JtIHJlaW52b2tlckZvcm0oTWV0aG9kSGFuZGxlIHRhcmdldCkgewotICAgICAgICBNZXRob2RUeXBlIG10eXBlID0gdGFyZ2V0LnR5cGUoKS5iYXNpY1R5cGUoKTsKLSAgICAgICAgTGFtYmRhRm9ybSByZWludm9rZXIgPSBtdHlwZS5mb3JtKCkuY2FjaGVkTGFtYmRhRm9ybShNZXRob2RUeXBlRm9ybS5MRl9SRUlOVk9LRSk7Ci0gICAgICAgIGlmIChyZWludm9rZXIgIT0gbnVsbCkgIHJldHVybiByZWludm9rZXI7Ci0gICAgICAgIGlmIChtdHlwZS5wYXJhbWV0ZXJTbG90Q291bnQoKSA+PSBNZXRob2RUeXBlLk1BWF9NSF9BUklUWSkKLSAgICAgICAgICAgIHJldHVybiBtYWtlUmVpbnZva2VyRm9ybSh0YXJnZXQudHlwZSgpLCB0YXJnZXQpOyAgLy8gY2Fubm90IGNhY2hlIHRoaXMKLSAgICAgICAgcmVpbnZva2VyID0gbWFrZVJlaW52b2tlckZvcm0obXR5cGUsIG51bGwpOwotICAgICAgICByZXR1cm4gbXR5cGUuZm9ybSgpLnNldENhY2hlZExhbWJkYUZvcm0oTWV0aG9kVHlwZUZvcm0uTEZfUkVJTlZPS0UsIHJlaW52b2tlcik7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIExhbWJkYUZvcm0gbWFrZVJlaW52b2tlckZvcm0oTWV0aG9kVHlwZSBtdHlwZSwgTWV0aG9kSGFuZGxlIGN1c3RvbVRhcmdldE9yTnVsbCkgewotICAgICAgICBib29sZWFuIGN1c3RvbWl6ZWQgPSAoY3VzdG9tVGFyZ2V0T3JOdWxsICE9IG51bGwpOwotICAgICAgICBNZXRob2RIYW5kbGUgTUhfaW52b2tlQmFzaWMgPSBjdXN0b21pemVkID8gbnVsbCA6IE1ldGhvZEhhbmRsZXMuYmFzaWNJbnZva2VyKG10eXBlKTsKLSAgICAgICAgZmluYWwgaW50IFRISVNfQk1IICAgID0gMDsKLSAgICAgICAgZmluYWwgaW50IEFSR19CQVNFICAgID0gMTsKLSAgICAgICAgZmluYWwgaW50IEFSR19MSU1JVCAgID0gQVJHX0JBU0UgKyBtdHlwZS5wYXJhbWV0ZXJDb3VudCgpOwotICAgICAgICBpbnQgbmFtZUN1cnNvciA9IEFSR19MSU1JVDsKLSAgICAgICAgZmluYWwgaW50IE5FWFRfTUggICAgID0gY3VzdG9taXplZCA/IC0xIDogbmFtZUN1cnNvcisrOwotICAgICAgICBmaW5hbCBpbnQgUkVJTlZPS0UgICAgPSBuYW1lQ3Vyc29yKys7Ci0gICAgICAgIExhbWJkYUZvcm0uTmFtZVtdIG5hbWVzID0gTGFtYmRhRm9ybS5hcmd1bWVudHMobmFtZUN1cnNvciAtIEFSR19MSU1JVCwgbXR5cGUuaW52b2tlclR5cGUoKSk7Ci0gICAgICAgIE9iamVjdFtdIHRhcmdldEFyZ3M7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSB0YXJnZXRNSDsKLSAgICAgICAgaWYgKGN1c3RvbWl6ZWQpIHsKLSAgICAgICAgICAgIHRhcmdldEFyZ3MgPSBBcnJheXMuY29weU9mUmFuZ2UobmFtZXMsIEFSR19CQVNFLCBBUkdfTElNSVQsIE9iamVjdFtdLmNsYXNzKTsKLSAgICAgICAgICAgIHRhcmdldE1IID0gY3VzdG9tVGFyZ2V0T3JOdWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmFtZXNbTkVYVF9NSF0gPSBuZXcgTGFtYmRhRm9ybS5OYW1lKE5GX3JlaW52b2tlclRhcmdldCwgbmFtZXNbVEhJU19CTUhdKTsKLSAgICAgICAgICAgIHRhcmdldEFyZ3MgPSBBcnJheXMuY29weU9mUmFuZ2UobmFtZXMsIFRISVNfQk1ILCBBUkdfTElNSVQsIE9iamVjdFtdLmNsYXNzKTsKLSAgICAgICAgICAgIHRhcmdldEFyZ3NbMF0gPSBuYW1lc1tORVhUX01IXTsgIC8vIG92ZXJ3cml0ZSB0aGlzIE1IIHdpdGggbmV4dCBNSAotICAgICAgICAgICAgdGFyZ2V0TUggPSBNZXRob2RIYW5kbGVzLmJhc2ljSW52b2tlcihtdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZXNbUkVJTlZPS0VdID0gbmV3IExhbWJkYUZvcm0uTmFtZSh0YXJnZXRNSCwgdGFyZ2V0QXJncyk7Ci0gICAgICAgIHJldHVybiBuZXcgTGFtYmRhRm9ybSgiQk1ILnJlaW52b2tlIiwgQVJHX0xJTUlULCBuYW1lcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGFtYmRhRm9ybS5OYW1lZEZ1bmN0aW9uIE5GX3JlaW52b2tlclRhcmdldDsKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTkZfcmVpbnZva2VyVGFyZ2V0ID0gbmV3IExhbWJkYUZvcm0uTmFtZWRGdW5jdGlvbihNZXRob2RIYW5kbGUuY2xhc3MKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2QoInJlaW52b2tlclRhcmdldCIpKTsKLSAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcihleCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgYWJzdHJhY3QgQm91bmRNZXRob2RIYW5kbGUgcmViaW5kKCk7CiAKICAgICAvKioKICAgICAgKiBSZXBsYWNlIHRoZSBvbGQgbGFtYmRhIGZvcm0gb2YgdGhpcyBtZXRob2QgaGFuZGxlIHdpdGggYSBuZXcgb25lLgpAQCAtMTQ4OSw2ICsxNDM4LDcgQEAKICAgICAvKm5vbi1wdWJsaWMqLwogICAgIHZvaWQgdXBkYXRlRm9ybShMYW1iZGFGb3JtIG5ld0Zvcm0pIHsKICAgICAgICAgaWYgKGZvcm0gPT0gbmV3Rm9ybSkgIHJldHVybjsKKyAgICAgICAgYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBEaXJlY3RNZXRob2RIYW5kbGUgJiYgdGhpcy5pbnRlcm5hbE1lbWJlck5hbWUoKS5pc1N0YXRpYygpKTsKICAgICAgICAgLy8gSVNTVUU6IFNob3VsZCB3ZSBoYXZlIGEgbWVtb3J5IGZlbmNlIGhlcmU/CiAgICAgICAgIFVOU0FGRS5wdXRPYmplY3QodGhpcywgRk9STV9PRkZTRVQsIG5ld0Zvcm0pOwogICAgICAgICB0aGlzLmZvcm0ucHJlcGFyZSgpOyAgLy8gYXMgaW4gTWV0aG9kSGFuZGxlLjxpbml0PgpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVJbXBsLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZUltcGwuamF2YQppbmRleCBlZTE1ODRmLi4wMjZiMmNkIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZUltcGwuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZUltcGwuamF2YQpAQCAtMjcsOCArMjcsMTAgQEAKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKwogaW1wb3J0IHN1bi5pbnZva2UuZW1wdHkuRW1wdHk7CiBpbXBvcnQgc3VuLmludm9rZS51dGlsLlZhbHVlQ29udmVyc2lvbnM7CiBpbXBvcnQgc3VuLmludm9rZS51dGlsLlZlcmlmeVR5cGU7CkBAIC00NCw2ICs0NiwyMCBAQAogICogQGF1dGhvciBqcm9zZQogICovCiAvKm5vbi1wdWJsaWMqLyBhYnN0cmFjdCBjbGFzcyBNZXRob2RIYW5kbGVJbXBsIHsKKyAgICAvLyBEbyBub3QgYWRqdXN0IHRoaXMgZXhjZXB0IGZvciBzcGVjaWFsIHBsYXRmb3JtczoKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FSSVRZOworICAgIHN0YXRpYyB7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIHZhbHVlcyA9IHsgMjU1IH07CisgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gSW50ZWdlci5nZXRJbnRlZ2VyKE1ldGhvZEhhbmRsZUltcGwuY2xhc3MuZ2V0TmFtZSgpKyIuTUFYX0FSSVRZIiwgMjU1KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIE1BWF9BUklUWSA9IChJbnRlZ2VyKSB2YWx1ZXNbMF07CisgICAgfQorCiAgICAgLy8vIEZhY3RvcnkgbWV0aG9kcyB0byBjcmVhdGUgbWV0aG9kIGhhbmRsZXM6CiAKICAgICBzdGF0aWMgdm9pZCBpbml0U3RhdGljcygpIHsKQEAgLTUyLDI3ICs2OCw1NSBAQAogICAgIH0KIAogICAgIHN0YXRpYyBNZXRob2RIYW5kbGUgbWFrZUFycmF5RWxlbWVudEFjY2Vzc29yKENsYXNzPD8+IGFycmF5Q2xhc3MsIGJvb2xlYW4gaXNTZXR0ZXIpIHsKKyAgICAgICAgaWYgKGFycmF5Q2xhc3MgPT0gT2JqZWN0W10uY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gKGlzU2V0dGVyID8gQXJyYXlBY2Nlc3Nvci5PQkpFQ1RfQVJSQVlfU0VUVEVSIDogQXJyYXlBY2Nlc3Nvci5PQkpFQ1RfQVJSQVlfR0VUVEVSKTsKICAgICAgICAgaWYgKCFhcnJheUNsYXNzLmlzQXJyYXkoKSkKICAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGFuIGFycmF5OiAiK2FycmF5Q2xhc3MpOwotICAgICAgICBNZXRob2RIYW5kbGUgYWNjZXNzb3IgPSBBcnJheUFjY2Vzc29yLmdldEFjY2Vzc29yKGFycmF5Q2xhc3MsIGlzU2V0dGVyKTsKLSAgICAgICAgTWV0aG9kVHlwZSBzcmNUeXBlID0gYWNjZXNzb3IudHlwZSgpLmVyYXNlKCk7Ci0gICAgICAgIE1ldGhvZFR5cGUgbGFtYmRhVHlwZSA9IHNyY1R5cGUuaW52b2tlclR5cGUoKTsKLSAgICAgICAgTmFtZVtdIG5hbWVzID0gYXJndW1lbnRzKDEsIGxhbWJkYVR5cGUpOwotICAgICAgICBOYW1lW10gYXJncyAgPSBBcnJheXMuY29weU9mUmFuZ2UobmFtZXMsIDEsIDEgKyBzcmNUeXBlLnBhcmFtZXRlckNvdW50KCkpOwotICAgICAgICBuYW1lc1tuYW1lcy5sZW5ndGggLSAxXSA9IG5ldyBOYW1lKGFjY2Vzc29yLmFzVHlwZShzcmNUeXBlKSwgKE9iamVjdFtdKSBhcmdzKTsKLSAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gbmV3IExhbWJkYUZvcm0oImdldEVsZW1lbnQiLCBsYW1iZGFUeXBlLnBhcmFtZXRlckNvdW50KCksIG5hbWVzKTsKLSAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gU2ltcGxlTWV0aG9kSGFuZGxlLm1ha2Uoc3JjVHlwZSwgZm9ybSk7Ci0gICAgICAgIGlmIChBcnJheUFjY2Vzc29yLm5lZWRDYXN0KGFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICBtaCA9IG1oLmJpbmRUbyhhcnJheUNsYXNzKTsKKyAgICAgICAgTWV0aG9kSGFuZGxlW10gY2FjaGUgPSBBcnJheUFjY2Vzc29yLlRZUEVEX0FDQ0VTU09SUy5nZXQoYXJyYXlDbGFzcyk7CisgICAgICAgIGludCBjYWNoZUluZGV4ID0gKGlzU2V0dGVyID8gQXJyYXlBY2Nlc3Nvci5TRVRURVJfSU5ERVggOiBBcnJheUFjY2Vzc29yLkdFVFRFUl9JTkRFWCk7CisgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGNhY2hlW2NhY2hlSW5kZXhdOworICAgICAgICBpZiAobWggIT0gbnVsbCkgIHJldHVybiBtaDsKKyAgICAgICAgbWggPSBBcnJheUFjY2Vzc29yLmdldEFjY2Vzc29yKGFycmF5Q2xhc3MsIGlzU2V0dGVyKTsKKyAgICAgICAgTWV0aG9kVHlwZSBjb3JyZWN0VHlwZSA9IEFycmF5QWNjZXNzb3IuY29ycmVjdFR5cGUoYXJyYXlDbGFzcywgaXNTZXR0ZXIpOworICAgICAgICBpZiAobWgudHlwZSgpICE9IGNvcnJlY3RUeXBlKSB7CisgICAgICAgICAgICBhc3NlcnQobWgudHlwZSgpLnBhcmFtZXRlclR5cGUoMCkgPT0gT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0KChpc1NldHRlciA/IG1oLnR5cGUoKS5wYXJhbWV0ZXJUeXBlKDIpIDogbWgudHlwZSgpLnJldHVyblR5cGUoKSkgPT0gT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydChpc1NldHRlciB8fCBjb3JyZWN0VHlwZS5wYXJhbWV0ZXJUeXBlKDApLmdldENvbXBvbmVudFR5cGUoKSA9PSBjb3JyZWN0VHlwZS5yZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgLy8gc2FmZSB0byB2aWV3IG5vbi1zdHJpY3RseSwgYmVjYXVzZSBlbGVtZW50IHR5cGUgZm9sbG93cyBmcm9tIGFycmF5IHR5cGUKKyAgICAgICAgICAgIG1oID0gbWgudmlld0FzVHlwZShjb3JyZWN0VHlwZSwgZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIG1oID0gbWguYXNUeXBlKEFycmF5QWNjZXNzb3IuY29ycmVjdFR5cGUoYXJyYXlDbGFzcywgaXNTZXR0ZXIpKTsKKyAgICAgICAgbWggPSBtYWtlSW50cmluc2ljKG1oLCAoaXNTZXR0ZXIgPyBJbnRyaW5zaWMuQVJSQVlfU1RPUkUgOiBJbnRyaW5zaWMuQVJSQVlfTE9BRCkpOworICAgICAgICAvLyBBdG9taWNhbGx5IHVwZGF0ZSBhY2Nlc3NvciBjYWNoZS4KKyAgICAgICAgc3luY2hyb25pemVkKGNhY2hlKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVbY2FjaGVJbmRleF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhY2hlW2NhY2hlSW5kZXhdID0gbWg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRocm93IGF3YXkgbmV3bHkgY29uc3RydWN0ZWQgYWNjZXNzb3IgYW5kIHVzZSBjYWNoZWQgdmVyc2lvbi4KKyAgICAgICAgICAgICAgICBtaCA9IGNhY2hlW2NhY2hlSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJldHVybiBtaDsKICAgICB9CiAKICAgICBzdGF0aWMgZmluYWwgY2xhc3MgQXJyYXlBY2Nlc3NvciB7CiAgICAgICAgIC8vLyBTdXBwb3J0IGZvciBhcnJheSBlbGVtZW50IGFjY2VzcwotICAgICAgICBzdGF0aWMgZmluYWwgSGFzaE1hcDxDbGFzczw/PiwgTWV0aG9kSGFuZGxlPiBHRVRURVJfQ0FDSEUgPSBuZXcgSGFzaE1hcDw+KCk7ICAvLyBUT0RPIHVzZSBpdAotICAgICAgICBzdGF0aWMgZmluYWwgSGFzaE1hcDxDbGFzczw/PiwgTWV0aG9kSGFuZGxlPiBTRVRURVJfQ0FDSEUgPSBuZXcgSGFzaE1hcDw+KCk7ICAvLyBUT0RPIHVzZSBpdAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEdFVFRFUl9JTkRFWCA9IDAsIFNFVFRFUl9JTkRFWCA9IDEsIElOREVYX0xJTUlUID0gMjsKKyAgICAgICAgc3RhdGljIGZpbmFsIENsYXNzVmFsdWU8TWV0aG9kSGFuZGxlW10+IFRZUEVEX0FDQ0VTU09SUworICAgICAgICAgICAgICAgID0gbmV3IENsYXNzVmFsdWU8TWV0aG9kSGFuZGxlW10+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIE1ldGhvZEhhbmRsZVtdIGNvbXB1dGVWYWx1ZShDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEhhbmRsZVtJTkRFWF9MSU1JVF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICBzdGF0aWMgZmluYWwgTWV0aG9kSGFuZGxlIE9CSkVDVF9BUlJBWV9HRVRURVIsIE9CSkVDVF9BUlJBWV9TRVRURVI7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBNZXRob2RIYW5kbGVbXSBjYWNoZSA9IFRZUEVEX0FDQ0VTU09SUy5nZXQoT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgY2FjaGVbR0VUVEVSX0lOREVYXSA9IE9CSkVDVF9BUlJBWV9HRVRURVIgPSBtYWtlSW50cmluc2ljKGdldEFjY2Vzc29yKE9iamVjdFtdLmNsYXNzLCBmYWxzZSksIEludHJpbnNpYy5BUlJBWV9MT0FEKTsKKyAgICAgICAgICAgIGNhY2hlW1NFVFRFUl9JTkRFWF0gPSBPQkpFQ1RfQVJSQVlfU0VUVEVSID0gbWFrZUludHJpbnNpYyhnZXRBY2Nlc3NvcihPYmplY3RbXS5jbGFzcywgdHJ1ZSksICBJbnRyaW5zaWMuQVJSQVlfU1RPUkUpOworCisgICAgICAgICAgICBhc3NlcnQoSW52b2tlckJ5dGVjb2RlR2VuZXJhdG9yLmlzU3RhdGljYWxseUludm9jYWJsZShBcnJheUFjY2Vzc29yLk9CSkVDVF9BUlJBWV9HRVRURVIuaW50ZXJuYWxNZW1iZXJOYW1lKCkpKTsKKyAgICAgICAgICAgIGFzc2VydChJbnZva2VyQnl0ZWNvZGVHZW5lcmF0b3IuaXNTdGF0aWNhbGx5SW52b2NhYmxlKEFycmF5QWNjZXNzb3IuT0JKRUNUX0FSUkFZX1NFVFRFUi5pbnRlcm5hbE1lbWJlck5hbWUoKSkpOworICAgICAgICB9CiAKICAgICAgICAgc3RhdGljIGludCAgICAgZ2V0RWxlbWVudEkoaW50W10gICAgIGEsIGludCBpKSAgICAgICAgICAgIHsgcmV0dXJuICAgICAgICAgICAgICBhW2ldOyB9CiAgICAgICAgIHN0YXRpYyBsb25nICAgIGdldEVsZW1lbnRKKGxvbmdbXSAgICBhLCBpbnQgaSkgICAgICAgICAgICB7IHJldHVybiAgICAgICAgICAgICAgYVtpXTsgfQpAQCAtOTQsNDUgKzEzOCwyMSBAQAogICAgICAgICBzdGF0aWMgdm9pZCAgICBzZXRFbGVtZW50QyhjaGFyW10gICAgYSwgaW50IGksIGNoYXIgICAgeCkgeyAgICAgICAgICAgICAgYVtpXSA9IHg7IH0KICAgICAgICAgc3RhdGljIHZvaWQgICAgc2V0RWxlbWVudEwoT2JqZWN0W10gIGEsIGludCBpLCBPYmplY3QgIHgpIHsgICAgICAgICAgICAgIGFbaV0gPSB4OyB9CiAKLSAgICAgICAgc3RhdGljIE9iamVjdCAgZ2V0RWxlbWVudEwoQ2xhc3M8Pz4gYXJyYXlDbGFzcywgT2JqZWN0W10gYSwgaW50IGkpICAgICAgICAgICB7IGFycmF5Q2xhc3MuY2FzdChhKTsgcmV0dXJuIGFbaV07IH0KLSAgICAgICAgc3RhdGljIHZvaWQgICAgc2V0RWxlbWVudEwoQ2xhc3M8Pz4gYXJyYXlDbGFzcywgT2JqZWN0W10gYSwgaW50IGksIE9iamVjdCB4KSB7IGFycmF5Q2xhc3MuY2FzdChhKTsgYVtpXSA9IHg7IH0KLQotICAgICAgICAvLyBXZWFrbHkgdHlwZWQgd3JhcHBlcnMgb2YgT2JqZWN0W10gYWNjZXNzb3JzOgotICAgICAgICBzdGF0aWMgT2JqZWN0ICBnZXRFbGVtZW50TChPYmplY3QgICAgYSwgaW50IGkpICAgICAgICAgICAgeyByZXR1cm4gZ2V0RWxlbWVudEwoKE9iamVjdFtdKWEsIGkpOyB9Ci0gICAgICAgIHN0YXRpYyB2b2lkICAgIHNldEVsZW1lbnRMKE9iamVjdCAgICBhLCBpbnQgaSwgT2JqZWN0ICB4KSB7ICAgICAgICBzZXRFbGVtZW50TCgoT2JqZWN0W10pIGEsIGksIHgpOyB9Ci0gICAgICAgIHN0YXRpYyBPYmplY3QgIGdldEVsZW1lbnRMKE9iamVjdCAgIGFycmF5Q2xhc3MsIE9iamVjdCBhLCBpbnQgaSkgICAgICAgICAgICAgeyByZXR1cm4gZ2V0RWxlbWVudEwoKENsYXNzPD8+KSBhcnJheUNsYXNzLCAoT2JqZWN0W10pYSwgaSk7IH0KLSAgICAgICAgc3RhdGljIHZvaWQgICAgc2V0RWxlbWVudEwoT2JqZWN0ICAgYXJyYXlDbGFzcywgT2JqZWN0IGEsIGludCBpLCBPYmplY3QgeCkgICB7ICAgICAgICBzZXRFbGVtZW50TCgoQ2xhc3M8Pz4pIGFycmF5Q2xhc3MsIChPYmplY3RbXSlhLCBpLCB4KTsgfQotCi0gICAgICAgIHN0YXRpYyBib29sZWFuIG5lZWRDYXN0KENsYXNzPD8+IGFycmF5Q2xhc3MpIHsKLSAgICAgICAgICAgIENsYXNzPD8+IGVsZW1DbGFzcyA9IGFycmF5Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgcmV0dXJuICFlbGVtQ2xhc3MuaXNQcmltaXRpdmUoKSAmJiBlbGVtQ2xhc3MgIT0gT2JqZWN0LmNsYXNzOwotICAgICAgICB9CiAgICAgICAgIHN0YXRpYyBTdHJpbmcgbmFtZShDbGFzczw/PiBhcnJheUNsYXNzLCBib29sZWFuIGlzU2V0dGVyKSB7CiAgICAgICAgICAgICBDbGFzczw/PiBlbGVtQ2xhc3MgPSBhcnJheUNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChlbGVtQ2xhc3MgPT0gbnVsbCkgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChlbGVtQ2xhc3MgPT0gbnVsbCkgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGFuIGFycmF5IiwgYXJyYXlDbGFzcyk7CiAgICAgICAgICAgICByZXR1cm4gKCFpc1NldHRlciA/ICJnZXRFbGVtZW50IiA6ICJzZXRFbGVtZW50IikgKyBXcmFwcGVyLmJhc2ljVHlwZUNoYXIoZWxlbUNsYXNzKTsKICAgICAgICAgfQotICAgICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfV0VBS0xZX1RZUEVEX0FSUkFZX0FDQ0VTU09SUyA9IGZhbHNlOyAgLy8gRklYTUU6IGRlY2lkZQogICAgICAgICBzdGF0aWMgTWV0aG9kVHlwZSB0eXBlKENsYXNzPD8+IGFycmF5Q2xhc3MsIGJvb2xlYW4gaXNTZXR0ZXIpIHsKICAgICAgICAgICAgIENsYXNzPD8+IGVsZW1DbGFzcyA9IGFycmF5Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwogICAgICAgICAgICAgQ2xhc3M8Pz4gYXJyYXlBcmdDbGFzcyA9IGFycmF5Q2xhc3M7CiAgICAgICAgICAgICBpZiAoIWVsZW1DbGFzcy5pc1ByaW1pdGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgYXJyYXlBcmdDbGFzcyA9IE9iamVjdFtdLmNsYXNzOwotICAgICAgICAgICAgICAgIGlmIChVU0VfV0VBS0xZX1RZUEVEX0FSUkFZX0FDQ0VTU09SUykKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlBcmdDbGFzcyA9IE9iamVjdC5jbGFzczsKKyAgICAgICAgICAgICAgICBlbGVtQ2xhc3MgPSBPYmplY3QuY2xhc3M7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW5lZWRDYXN0KGFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFpc1NldHRlciA/CisgICAgICAgICAgICByZXR1cm4gIWlzU2V0dGVyID8KICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZS5tZXRob2RUeXBlKGVsZW1DbGFzcywgIGFycmF5QXJnQ2xhc3MsIGludC5jbGFzcykgOgogICAgICAgICAgICAgICAgICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUodm9pZC5jbGFzcywgYXJyYXlBcmdDbGFzcywgaW50LmNsYXNzLCBlbGVtQ2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGFzc0FyZ0NsYXNzID0gQ2xhc3MuY2xhc3M7Ci0gICAgICAgICAgICAgICAgaWYgKFVTRV9XRUFLTFlfVFlQRURfQVJSQVlfQUNDRVNTT1JTKQotICAgICAgICAgICAgICAgICAgICBjbGFzc0FyZ0NsYXNzID0gT2JqZWN0LmNsYXNzOwotICAgICAgICAgICAgICAgIHJldHVybiAhaXNTZXR0ZXIgPwotICAgICAgICAgICAgICAgICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0LmNsYXNzLCBjbGFzc0FyZ0NsYXNzLCBhcnJheUFyZ0NsYXNzLCBpbnQuY2xhc3MpIDoKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZS5tZXRob2RUeXBlKHZvaWQuY2xhc3MsICAgY2xhc3NBcmdDbGFzcywgYXJyYXlBcmdDbGFzcywgaW50LmNsYXNzLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0YXRpYyBNZXRob2RUeXBlIGNvcnJlY3RUeXBlKENsYXNzPD8+IGFycmF5Q2xhc3MsIGJvb2xlYW4gaXNTZXR0ZXIpIHsKICAgICAgICAgICAgIENsYXNzPD8+IGVsZW1DbGFzcyA9IGFycmF5Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwpAQCAtMTU5LDQwICsxNzksMTEwIEBACiAgICAgICogaW50ZWdyYWwgd2lkZW5pbmcgb3IgbmFycm93aW5nLCBhbmQgZmxvYXRpbmcgcG9pbnQgd2lkZW5pbmcgb3IgbmFycm93aW5nLgogICAgICAqIEBwYXJhbSBzcmNUeXBlIHJlcXVpcmVkIGNhbGwgdHlwZQogICAgICAqIEBwYXJhbSB0YXJnZXQgb3JpZ2luYWwgbWV0aG9kIGhhbmRsZQotICAgICAqIEBwYXJhbSBsZXZlbCB3aGljaCBzdHJlbmd0aCBvZiBjb252ZXJzaW9uIGlzIGFsbG93ZWQKKyAgICAgKiBAcGFyYW0gc3RyaWN0IGlmIHRydWUsIG9ubHkgYXNUeXBlIGNvbnZlcnNpb25zIGFyZSBhbGxvd2VkOyBpZiBmYWxzZSwgZXhwbGljaXRDYXN0QXJndW1lbnRzIGNvbnZlcnNpb25zIGFsbG93ZWQKKyAgICAgKiBAcGFyYW0gbW9ub2JveCBpZiB0cnVlLCB1bmJveGluZyBjb252ZXJzaW9ucyBhcmUgYXNzdW1lZCB0byBiZSBleGFjdGx5IHR5cGVkIChJbnRlZ2VyIHRvIGludCBvbmx5LCBub3QgbG9uZyBvciBkb3VibGUpCiAgICAgICogQHJldHVybiBhbiBhZGFwdGVyIHRvIHRoZSBvcmlnaW5hbCBoYW5kbGUgd2l0aCB0aGUgZGVzaXJlZCBuZXcgdHlwZSwKICAgICAgKiAgICAgICAgICBvciB0aGUgb3JpZ2luYWwgdGFyZ2V0IGlmIHRoZSB0eXBlcyBhcmUgYWxyZWFkeSBpZGVudGljYWwKICAgICAgKiAgICAgICAgICBvciBudWxsIGlmIHRoZSBhZGFwdGF0aW9uIGNhbm5vdCBiZSBtYWRlCiAgICAgICovCi0gICAgc3RhdGljIE1ldGhvZEhhbmRsZSBtYWtlUGFpcndpc2VDb252ZXJ0KE1ldGhvZEhhbmRsZSB0YXJnZXQsIE1ldGhvZFR5cGUgc3JjVHlwZSwgaW50IGxldmVsKSB7Ci0gICAgICAgIGFzc2VydChsZXZlbCA+PSAwICYmIGxldmVsIDw9IDIpOworICAgIHN0YXRpYyBNZXRob2RIYW5kbGUgbWFrZVBhaXJ3aXNlQ29udmVydChNZXRob2RIYW5kbGUgdGFyZ2V0LCBNZXRob2RUeXBlIHNyY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RyaWN0LCBib29sZWFuIG1vbm9ib3gpIHsKICAgICAgICAgTWV0aG9kVHlwZSBkc3RUeXBlID0gdGFyZ2V0LnR5cGUoKTsKICAgICAgICAgYXNzZXJ0KGRzdFR5cGUucGFyYW1ldGVyQ291bnQoKSA9PSB0YXJnZXQudHlwZSgpLnBhcmFtZXRlckNvdW50KCkpOwogICAgICAgICBpZiAoc3JjVHlwZSA9PSBkc3RUeXBlKQogICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgaWYgKFVTRV9MQU1CREFfRk9STV9FRElUT1IpIHsKKyAgICAgICAgICAgIHJldHVybiBtYWtlUGFpcndpc2VDb252ZXJ0QnlFZGl0b3IodGFyZ2V0LCBzcmNUeXBlLCBzdHJpY3QsIG1vbm9ib3gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1ha2VQYWlyd2lzZUNvbnZlcnRJbmRpcmVjdCh0YXJnZXQsIHNyY1R5cGUsIHN0cmljdCwgbW9ub2JveCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgLy8gQ2FsY3VsYXRlIGV4dHJhIGFyZ3VtZW50cyAodGVtcG9yYXJpZXMpIHJlcXVpcmVkIGluIHRoZSBuYW1lcyBhcnJheS4KLSAgICAgICAgLy8gRklYTUU6IFVzZSBhbiBBcnJheUxpc3Q8TmFtZT4uICBTb21lIGFyZ3VtZW50cyByZXF1aXJlIG1vcmUgdGhhbiBvbmUgY29udmVyc2lvbiBzdGVwLgotICAgICAgICBmaW5hbCBpbnQgSU5BUkdfQ09VTlQgPSBzcmNUeXBlLnBhcmFtZXRlckNvdW50KCk7Ci0gICAgICAgIGludCBjb252ZXJzaW9ucyA9IDA7Ci0gICAgICAgIGJvb2xlYW5bXSBuZWVkQ29udiA9IG5ldyBib29sZWFuWzErSU5BUkdfQ09VTlRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBJTkFSR19DT1VOVDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGFzczw/PiBzcmMgPSAoaSA9PSBJTkFSR19DT1VOVCkgPyBkc3RUeXBlLnJldHVyblR5cGUoKSA6IHNyY1R5cGUucGFyYW1ldGVyVHlwZShpKTsKLSAgICAgICAgICAgIENsYXNzPD8+IGRzdCA9IChpID09IElOQVJHX0NPVU5UKSA/IHNyY1R5cGUucmV0dXJuVHlwZSgpIDogZHN0VHlwZS5wYXJhbWV0ZXJUeXBlKGkpOwotICAgICAgICAgICAgaWYgKCFWZXJpZnlUeXBlLmlzTnVsbENvbnZlcnNpb24oc3JjLCBkc3QpIHx8Ci0gICAgICAgICAgICAgICAgbGV2ZWwgPD0gMSAmJiBkc3QuaXNJbnRlcmZhY2UoKSAmJiAhZHN0LmlzQXNzaWduYWJsZUZyb20oc3JjKSkgewotICAgICAgICAgICAgICAgIG5lZWRDb252W2ldID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjb252ZXJzaW9ucysrOworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudE5vbk51bGwoT2JqZWN0W10gYXJyYXkpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChPYmplY3QgeCA6IGFycmF5KSB7CisgICAgICAgICAgICBpZiAoeCAhPSBudWxsKSAgKytjb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgc3RhdGljIE1ldGhvZEhhbmRsZSBtYWtlUGFpcndpc2VDb252ZXJ0QnlFZGl0b3IoTWV0aG9kSGFuZGxlIHRhcmdldCwgTWV0aG9kVHlwZSBzcmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RyaWN0LCBib29sZWFuIG1vbm9ib3gpIHsKKyAgICAgICAgT2JqZWN0W10gY29udlNwZWNzID0gY29tcHV0ZVZhbHVlQ29udmVyc2lvbnMoc3JjVHlwZSwgdGFyZ2V0LnR5cGUoKSwgc3RyaWN0LCBtb25vYm94KTsKKyAgICAgICAgaW50IGNvbnZDb3VudCA9IGNvdW50Tm9uTnVsbChjb252U3BlY3MpOworICAgICAgICBpZiAoY29udkNvdW50ID09IDApCisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnZpZXdBc1R5cGUoc3JjVHlwZSwgc3RyaWN0KTsKKyAgICAgICAgTWV0aG9kVHlwZSBiYXNpY1NyY1R5cGUgPSBzcmNUeXBlLmJhc2ljVHlwZSgpOworICAgICAgICBNZXRob2RUeXBlIG1pZFR5cGUgPSB0YXJnZXQudHlwZSgpLmJhc2ljVHlwZSgpOworICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZSBtaCA9IHRhcmdldC5yZWJpbmQoKTsKKyAgICAgICAgLy8gRklYTUU6IFJlZHVjZSBudW1iZXIgb2YgYmluZGluZ3Mgd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIENsYXNzIGNvbnZlcnNpb24uCisgICAgICAgIC8vIEZJWE1FOiBSZWR1Y2UgbnVtYmVyIG9mIGJpbmRpbmdzIHdoZW4gdGhlcmUgYXJlIHJlcGVhdGVkIGNvbnZlcnNpb25zLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnZTcGVjcy5sZW5ndGgtMTsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgY29udlNwZWMgPSBjb252U3BlY3NbaV07CisgICAgICAgICAgICBpZiAoY29udlNwZWMgPT0gbnVsbCkgIGNvbnRpbnVlOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGZuOworICAgICAgICAgICAgaWYgKGNvbnZTcGVjIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBmbiA9IExhenkuTUhfY2FzdFJlZmVyZW5jZS5iaW5kVG8oY29udlNwZWMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbiA9IChNZXRob2RIYW5kbGUpIGNvbnZTcGVjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2xhc3M8Pz4gbmV3VHlwZSA9IGJhc2ljU3JjVHlwZS5wYXJhbWV0ZXJUeXBlKGkpOworICAgICAgICAgICAgaWYgKC0tY29udkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgbWlkVHlwZSA9IHNyY1R5cGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWlkVHlwZSA9IG1pZFR5cGUuY2hhbmdlUGFyYW1ldGVyVHlwZShpLCBuZXdUeXBlKTsKKyAgICAgICAgICAgIExhbWJkYUZvcm0gZm9ybTIgPSBtaC5lZGl0b3IoKS5maWx0ZXJBcmd1bWVudEZvcm0oMStpLCBCYXNpY1R5cGUuYmFzaWNUeXBlKG5ld1R5cGUpKTsKKyAgICAgICAgICAgIG1oID0gbWguY29weVdpdGhFeHRlbmRMKG1pZFR5cGUsIGZvcm0yLCBmbik7CisgICAgICAgICAgICBtaCA9IG1oLnJlYmluZCgpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBjb252U3BlYyA9IGNvbnZTcGVjc1tjb252U3BlY3MubGVuZ3RoLTFdOworICAgICAgICBpZiAoY29udlNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGZuOworICAgICAgICAgICAgaWYgKGNvbnZTcGVjIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udlNwZWMgPT0gdm9pZC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgZm4gPSBudWxsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZm4gPSBMYXp5Lk1IX2Nhc3RSZWZlcmVuY2UuYmluZFRvKGNvbnZTcGVjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm4gPSAoTWV0aG9kSGFuZGxlKSBjb252U3BlYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzPD8+IG5ld1R5cGUgPSBiYXNpY1NyY1R5cGUucmV0dXJuVHlwZSgpOworICAgICAgICAgICAgYXNzZXJ0KC0tY29udkNvdW50ID09IDApOworICAgICAgICAgICAgbWlkVHlwZSA9IHNyY1R5cGU7CisgICAgICAgICAgICBpZiAoZm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1oID0gbWgucmViaW5kKCk7ICAvLyByZWJpbmQgaWYgdG9vIGNvbXBsZXgKKyAgICAgICAgICAgICAgICBMYW1iZGFGb3JtIGZvcm0yID0gbWguZWRpdG9yKCkuZmlsdGVyUmV0dXJuRm9ybShCYXNpY1R5cGUuYmFzaWNUeXBlKG5ld1R5cGUpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbWggPSBtaC5jb3B5V2l0aEV4dGVuZEwobWlkVHlwZSwgZm9ybTIsIGZuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTGFtYmRhRm9ybSBmb3JtMiA9IG1oLmVkaXRvcigpLmZpbHRlclJldHVybkZvcm0oQmFzaWNUeXBlLmJhc2ljVHlwZShuZXdUeXBlKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbWggPSBtaC5jb3B5V2l0aChtaWRUeXBlLCBmb3JtMik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiByZXRDb252ID0gbmVlZENvbnZbSU5BUkdfQ09VTlRdOworICAgICAgICBhc3NlcnQoY29udkNvdW50ID09IDApOworICAgICAgICBhc3NlcnQobWgudHlwZSgpLmVxdWFscyhzcmNUeXBlKSk7CisgICAgICAgIHJldHVybiBtaDsKKyAgICB9CisKKyAgICBzdGF0aWMgTWV0aG9kSGFuZGxlIG1ha2VQYWlyd2lzZUNvbnZlcnRJbmRpcmVjdChNZXRob2RIYW5kbGUgdGFyZ2V0LCBNZXRob2RUeXBlIHNyY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdHJpY3QsIGJvb2xlYW4gbW9ub2JveCkgeworICAgICAgICAvLyBDYWxjdWxhdGUgZXh0cmEgYXJndW1lbnRzICh0ZW1wb3JhcmllcykgcmVxdWlyZWQgaW4gdGhlIG5hbWVzIGFycmF5LgorICAgICAgICBPYmplY3RbXSBjb252U3BlY3MgPSBjb21wdXRlVmFsdWVDb252ZXJzaW9ucyhzcmNUeXBlLCB0YXJnZXQudHlwZSgpLCBzdHJpY3QsIG1vbm9ib3gpOworICAgICAgICBmaW5hbCBpbnQgSU5BUkdfQ09VTlQgPSBzcmNUeXBlLnBhcmFtZXRlckNvdW50KCk7CisgICAgICAgIGludCBjb252Q291bnQgPSBjb3VudE5vbk51bGwoY29udlNwZWNzKTsKKyAgICAgICAgYm9vbGVhbiByZXRDb252ID0gKGNvbnZTcGVjc1tJTkFSR19DT1VOVF0gIT0gbnVsbCk7CisgICAgICAgIGJvb2xlYW4gcmV0Vm9pZCA9IHNyY1R5cGUucmV0dXJuVHlwZSgpID09IHZvaWQuY2xhc3M7CisgICAgICAgIGlmIChyZXRDb252ICYmIHJldFZvaWQpIHsKKyAgICAgICAgICAgIGNvbnZDb3VudCAtPSAxOworICAgICAgICAgICAgcmV0Q29udiA9IGZhbHNlOworICAgICAgICB9CiAKICAgICAgICAgZmluYWwgaW50IElOX01IICAgICAgICAgPSAwOwogICAgICAgICBmaW5hbCBpbnQgSU5BUkdfQkFTRSAgICA9IDE7CiAgICAgICAgIGZpbmFsIGludCBJTkFSR19MSU1JVCAgID0gSU5BUkdfQkFTRSArIElOQVJHX0NPVU5UOwotICAgICAgICBmaW5hbCBpbnQgTkFNRV9MSU1JVCAgICA9IElOQVJHX0xJTUlUICsgY29udmVyc2lvbnMgKyAxOworICAgICAgICBmaW5hbCBpbnQgTkFNRV9MSU1JVCAgICA9IElOQVJHX0xJTUlUICsgY29udkNvdW50ICsgMTsKICAgICAgICAgZmluYWwgaW50IFJFVFVSTl9DT05WICAgPSAoIXJldENvbnYgPyAtMSAgICAgICAgIDogTkFNRV9MSU1JVCAtIDEpOwogICAgICAgICBmaW5hbCBpbnQgT1VUX0NBTEwgICAgICA9ICghcmV0Q29udiA/IE5BTUVfTElNSVQgOiBSRVRVUk5fQ09OVikgLSAxOworICAgICAgICBmaW5hbCBpbnQgUkVTVUxUICAgICAgICA9IChyZXRWb2lkID8gLTEgOiBOQU1FX0xJTUlUIC0gMSk7CiAKICAgICAgICAgLy8gTm93IGJ1aWxkIGEgTGFtYmRhRm9ybS4KICAgICAgICAgTWV0aG9kVHlwZSBsYW1iZGFUeXBlID0gc3JjVHlwZS5iYXNpY1R5cGUoKS5pbnZva2VyVHlwZSgpOwpAQCAtMjA0LDU5ICsyOTQsMjEgQEAKIAogICAgICAgICBpbnQgbmFtZUN1cnNvciA9IElOQVJHX0xJTUlUOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOQVJHX0NPVU5UOyBpKyspIHsKLSAgICAgICAgICAgIENsYXNzPD8+IHNyYyA9IHNyY1R5cGUucGFyYW1ldGVyVHlwZShpKTsKLSAgICAgICAgICAgIENsYXNzPD8+IGRzdCA9IGRzdFR5cGUucGFyYW1ldGVyVHlwZShpKTsKLQotICAgICAgICAgICAgaWYgKCFuZWVkQ29udltpXSkgeworICAgICAgICAgICAgT2JqZWN0IGNvbnZTcGVjID0gY29udlNwZWNzW2ldOworICAgICAgICAgICAgaWYgKGNvbnZTcGVjID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nOiBkaWZmZXJlbmNlIGlzIHRyaXZpYWwKICAgICAgICAgICAgICAgICBvdXRBcmdzW09VVEFSR19CQVNFICsgaV0gPSBuYW1lc1tJTkFSR19CQVNFICsgaV07CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFRyaWNreSBjYXNlIGFuYWx5c2lzIGZvbGxvd3MuCi0gICAgICAgICAgICBNZXRob2RIYW5kbGUgZm4gPSBudWxsOwotICAgICAgICAgICAgaWYgKHNyYy5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzdC5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZuID0gVmFsdWVDb252ZXJzaW9ucy5jb252ZXJ0UHJpbWl0aXZlKHNyYywgZHN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBXcmFwcGVyIHcgPSBXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUoc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGJveE1ldGhvZCA9IFZhbHVlQ29udmVyc2lvbnMuYm94KHcpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHN0ID09IHcud3JhcHBlclR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gYm94TWV0aG9kOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmbiA9IGJveE1ldGhvZC5hc1R5cGUoTWV0aG9kVHlwZS5tZXRob2RUeXBlKGRzdCwgc3JjKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgTmFtZSBjb252OworICAgICAgICAgICAgaWYgKGNvbnZTcGVjIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBjb252Q2xhc3MgPSAoQ2xhc3M8Pz4pIGNvbnZTcGVjOworICAgICAgICAgICAgICAgIGNvbnYgPSBuZXcgTmFtZShMYXp5Lk1IX2Nhc3RSZWZlcmVuY2UsIGNvbnZDbGFzcywgbmFtZXNbSU5BUkdfQkFTRSArIGldKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzdC5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbGxlciBoYXMgYm94ZWQgYSBwcmltaXRpdmUuICBVbmJveCBpdCBmb3IgdGhlIHRhcmdldC4KLSAgICAgICAgICAgICAgICAgICAgV3JhcHBlciB3ID0gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKGRzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwIHx8IFZlcmlmeVR5cGUuaXNOdWxsQ29udmVyc2lvbihzcmMsIHcud3JhcHBlclR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gVmFsdWVDb252ZXJzaW9ucy51bmJveChkc3QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYyA9PSBPYmplY3QuY2xhc3MgfHwgIVdyYXBwZXIuaXNXcmFwcGVyVHlwZShzcmMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGFtcGxlczogIE9iamVjdC0+aW50LCBOdW1iZXItPmludCwgQ29tcGFyYWJsZS0+aW50OyBCeXRlLT5pbnQsIENoYXJhY3Rlci0+aW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGluY2x1ZGUgYWRkaXRpb25hbCBjb252ZXJzaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjIG11c3QgYmUgZXhhbWluZWQgYXQgcnVudGltZSwgdG8gZGV0ZWN0IEJ5dGUsIENoYXJhY3RlciwgZXRjLgotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHVuYm94TWV0aG9kID0gKGxldmVsID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFZhbHVlQ29udmVyc2lvbnMudW5ib3goZHN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVmFsdWVDb252ZXJzaW9ucy51bmJveENhc3QoZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbiA9IHVuYm94TWV0aG9kOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhhbXBsZTogQnl0ZS0+aW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyB0aGlzIGJ5IHJlZm9ybXVsYXRpbmcgdGhlIHByb2JsZW0gdG8gQnl0ZS0+Ynl0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHNyY1ByaW0gPSBXcmFwcGVyLmZvcldyYXBwZXJUeXBlKHNyYykucHJpbWl0aXZlVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHVuYm94ID0gVmFsdWVDb252ZXJzaW9ucy51bmJveChzcmNQcmltKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBvc2UgdGhlIHR3byBjb252ZXJzaW9ucy4gIEZJWE1FOiAgc2hvdWxkIG1ha2UgdHdvIE5hbWVzIGZvciB0aGlzIGpvYgotICAgICAgICAgICAgICAgICAgICAgICAgZm4gPSB1bmJveC5hc1R5cGUoTWV0aG9kVHlwZS5tZXRob2RUeXBlKGRzdCwgc3JjKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGUgcmVmZXJlbmNlIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6ICBEbyBub3QgY2hlY2sgZm9yIGEgY2xhc3MgaGllcmFyY2h5IHJlbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gc3JjIGFuZCBkc3QuICBJbiBhbGwgY2FzZXMgYSAnbnVsbCcgYXJndW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwYXNzIHRoZSBjYXN0IGNvbnZlcnNpb24uCi0gICAgICAgICAgICAgICAgICAgIGZuID0gVmFsdWVDb252ZXJzaW9ucy5jYXN0KGRzdCwgTGF6eS5NSF9jYXN0UmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGZuID0gKE1ldGhvZEhhbmRsZSkgY29udlNwZWM7CisgICAgICAgICAgICAgICAgY29udiA9IG5ldyBOYW1lKGZuLCBuYW1lc1tJTkFSR19CQVNFICsgaV0pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTmFtZSBjb252ID0gbmV3IE5hbWUoZm4sIG5hbWVzW0lOQVJHX0JBU0UgKyBpXSk7CiAgICAgICAgICAgICBhc3NlcnQobmFtZXNbbmFtZUN1cnNvcl0gPT0gbnVsbCk7CiAgICAgICAgICAgICBuYW1lc1tuYW1lQ3Vyc29yKytdID0gY29udjsKICAgICAgICAgICAgIGFzc2VydChvdXRBcmdzW09VVEFSR19CQVNFICsgaV0gPT0gbnVsbCk7CkBAIC0yNjcsMjkgKzMxOSwyOSBAQAogICAgICAgICBhc3NlcnQobmFtZUN1cnNvciA9PSBPVVRfQ0FMTCk7CiAgICAgICAgIG5hbWVzW09VVF9DQUxMXSA9IG5ldyBOYW1lKHRhcmdldCwgb3V0QXJncyk7CiAKLSAgICAgICAgaWYgKFJFVFVSTl9DT05WIDwgMCkgeworICAgICAgICBPYmplY3QgY29udlNwZWMgPSBjb252U3BlY3NbSU5BUkdfQ09VTlRdOworICAgICAgICBpZiAoIXJldENvbnYpIHsKICAgICAgICAgICAgIGFzc2VydChPVVRfQ0FMTCA9PSBuYW1lcy5sZW5ndGgtMSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbGFzczw/PiBuZWVkUmV0dXJuID0gc3JjVHlwZS5yZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBDbGFzczw/PiBoYXZlUmV0dXJuID0gZHN0VHlwZS5yZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBNZXRob2RIYW5kbGUgZm47Ci0gICAgICAgICAgICBPYmplY3RbXSBhcmcgPSB7IG5hbWVzW09VVF9DQUxMXSB9OwotICAgICAgICAgICAgaWYgKGhhdmVSZXR1cm4gPT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIC8vIHN5bnRoZXNpemUgYSB6ZXJvIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdm9pZAotICAgICAgICAgICAgICAgIE9iamVjdCB6ZXJvID0gV3JhcHBlci5mb3JCYXNpY1R5cGUobmVlZFJldHVybikuemVybygpOwotICAgICAgICAgICAgICAgIGZuID0gTWV0aG9kSGFuZGxlcy5jb25zdGFudChuZWVkUmV0dXJuLCB6ZXJvKTsKLSAgICAgICAgICAgICAgICBhcmcgPSBuZXcgT2JqZWN0WzBdOyAgLy8gZG9uJ3QgcGFzcyBuYW1lc1tPVVRfQ0FMTF0gdG8gY29udmVyc2lvbgorICAgICAgICAgICAgTmFtZSBjb252OworICAgICAgICAgICAgaWYgKGNvbnZTcGVjID09IHZvaWQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBjb252ID0gbmV3IE5hbWUoTGFtYmRhRm9ybS5jb25zdGFudFplcm8oQmFzaWNUeXBlLmJhc2ljVHlwZShzcmNUeXBlLnJldHVyblR5cGUoKSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udlNwZWMgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IGNvbnZDbGFzcyA9IChDbGFzczw/PikgY29udlNwZWM7CisgICAgICAgICAgICAgICAgY29udiA9IG5ldyBOYW1lKExhenkuTUhfY2FzdFJlZmVyZW5jZSwgY29udkNsYXNzLCBuYW1lc1tPVVRfQ0FMTF0pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgaWRlbnRpdHkgPSBNZXRob2RIYW5kbGVzLmlkZW50aXR5KG5lZWRSZXR1cm4pOwotICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUgbmVlZENvbnZlcnNpb24gPSBpZGVudGl0eS50eXBlKCkuY2hhbmdlUGFyYW1ldGVyVHlwZSgwLCBoYXZlUmV0dXJuKTsKLSAgICAgICAgICAgICAgICBmbiA9IG1ha2VQYWlyd2lzZUNvbnZlcnQoaWRlbnRpdHksIG5lZWRDb252ZXJzaW9uLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGZuID0gKE1ldGhvZEhhbmRsZSkgY29udlNwZWM7CisgICAgICAgICAgICAgICAgaWYgKGZuLnR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnYgPSBuZXcgTmFtZShmbik7ICAvLyBkb24ndCBwYXNzIHJldHZhbCB0byB2b2lkIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbnYgPSBuZXcgTmFtZShmbiwgbmFtZXNbT1VUX0NBTExdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFzc2VydChuYW1lc1tSRVRVUk5fQ09OVl0gPT0gbnVsbCk7Ci0gICAgICAgICAgICBuYW1lc1tSRVRVUk5fQ09OVl0gPSBuZXcgTmFtZShmbiwgYXJnKTsKKyAgICAgICAgICAgIG5hbWVzW1JFVFVSTl9DT05WXSA9IGNvbnY7CiAgICAgICAgICAgICBhc3NlcnQoUkVUVVJOX0NPTlYgPT0gbmFtZXMubGVuZ3RoLTEpOwogICAgICAgICB9CiAKLSAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gbmV3IExhbWJkYUZvcm0oImNvbnZlcnQiLCBsYW1iZGFUeXBlLnBhcmFtZXRlckNvdW50KCksIG5hbWVzKTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gbmV3IExhbWJkYUZvcm0oImNvbnZlcnQiLCBsYW1iZGFUeXBlLnBhcmFtZXRlckNvdW50KCksIG5hbWVzLCBSRVNVTFQpOwogICAgICAgICByZXR1cm4gU2ltcGxlTWV0aG9kSGFuZGxlLm1ha2Uoc3JjVHlwZSwgZm9ybSk7CiAgICAgfQogCkBAIC0zMTIsMTIgKzM2NCw3OSBAQAogICAgICAgICByZXR1cm4gbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiQ2Fubm90IGNhc3QgIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdG8gIiArIHQuZ2V0TmFtZSgpKTsKICAgICB9CiAKLSAgICBzdGF0aWMgTWV0aG9kSGFuZGxlIG1ha2VSZWZlcmVuY2VJZGVudGl0eShDbGFzczw/PiByZWZUeXBlKSB7Ci0gICAgICAgIE1ldGhvZFR5cGUgbGFtYmRhVHlwZSA9IE1ldGhvZFR5cGUuZ2VuZXJpY01ldGhvZFR5cGUoMSkuaW52b2tlclR5cGUoKTsKLSAgICAgICAgTmFtZVtdIG5hbWVzID0gYXJndW1lbnRzKDEsIGxhbWJkYVR5cGUpOwotICAgICAgICBuYW1lc1tuYW1lcy5sZW5ndGggLSAxXSA9IG5ldyBOYW1lKFZhbHVlQ29udmVyc2lvbnMuaWRlbnRpdHkoKSwgbmFtZXNbMV0pOwotICAgICAgICBMYW1iZGFGb3JtIGZvcm0gPSBuZXcgTGFtYmRhRm9ybSgiaWRlbnRpdHkiLCBsYW1iZGFUeXBlLnBhcmFtZXRlckNvdW50KCksIG5hbWVzKTsKLSAgICAgICAgcmV0dXJuIFNpbXBsZU1ldGhvZEhhbmRsZS5tYWtlKE1ldGhvZFR5cGUubWV0aG9kVHlwZShyZWZUeXBlLCByZWZUeXBlKSwgZm9ybSk7CisgICAgc3RhdGljIE9iamVjdFtdIGNvbXB1dGVWYWx1ZUNvbnZlcnNpb25zKE1ldGhvZFR5cGUgc3JjVHlwZSwgTWV0aG9kVHlwZSBkc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0cmljdCwgYm9vbGVhbiBtb25vYm94KSB7CisgICAgICAgIGZpbmFsIGludCBJTkFSR19DT1VOVCA9IHNyY1R5cGUucGFyYW1ldGVyQ291bnQoKTsKKyAgICAgICAgT2JqZWN0W10gY29udlNwZWNzID0gbmV3IE9iamVjdFtJTkFSR19DT1VOVCsxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gSU5BUkdfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgYm9vbGVhbiBpc1JldCA9IChpID09IElOQVJHX0NPVU5UKTsKKyAgICAgICAgICAgIENsYXNzPD8+IHNyYyA9IGlzUmV0ID8gZHN0VHlwZS5yZXR1cm5UeXBlKCkgOiBzcmNUeXBlLnBhcmFtZXRlclR5cGUoaSk7CisgICAgICAgICAgICBDbGFzczw/PiBkc3QgPSBpc1JldCA/IHNyY1R5cGUucmV0dXJuVHlwZSgpIDogZHN0VHlwZS5wYXJhbWV0ZXJUeXBlKGkpOworICAgICAgICAgICAgaWYgKCFWZXJpZnlUeXBlLmlzTnVsbENvbnZlcnNpb24oc3JjLCBkc3QsIC8qa2VlcEludGVyZmFjZXM9Ki8gc3RyaWN0KSkgeworICAgICAgICAgICAgICAgIGNvbnZTcGVjc1tpXSA9IHZhbHVlQ29udmVyc2lvbihzcmMsIGRzdCwgc3RyaWN0LCBtb25vYm94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udlNwZWNzOworICAgIH0KKyAgICBzdGF0aWMgTWV0aG9kSGFuZGxlIG1ha2VQYWlyd2lzZUNvbnZlcnQoTWV0aG9kSGFuZGxlIHRhcmdldCwgTWV0aG9kVHlwZSBzcmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0cmljdCkgeworICAgICAgICByZXR1cm4gbWFrZVBhaXJ3aXNlQ29udmVydCh0YXJnZXQsIHNyY1R5cGUsIHN0cmljdCwgLyptb25vYm94PSovIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgdG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uLgorICAgICAqIFRoaXMgY29udmVyc2lvbiBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgYXMgYSBMRiBOYW1lZEZ1bmN0aW9uLgorICAgICAqIFJldHVybiBhIENsYXNzIG9iamVjdCBpZiBhIHNpbXBsZSBjYXN0IGlzIG5lZWRlZC4KKyAgICAgKiBSZXR1cm4gdm9pZC5jbGFzcyBpZiB2b2lkIGlzIGludm9sdmVkLgorICAgICAqLworICAgIHN0YXRpYyBPYmplY3QgdmFsdWVDb252ZXJzaW9uKENsYXNzPD8+IHNyYywgQ2xhc3M8Pz4gZHN0LCBib29sZWFuIHN0cmljdCwgYm9vbGVhbiBtb25vYm94KSB7CisgICAgICAgIGFzc2VydCghVmVyaWZ5VHlwZS5pc051bGxDb252ZXJzaW9uKHNyYywgZHN0LCAvKmtlZXBJbnRlcmZhY2VzPSovIHN0cmljdCkpOyAgLy8gY2FsbGVyIHJlc3BvbnNpYmlsaXR5CisgICAgICAgIGlmIChkc3QgPT0gdm9pZC5jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBkc3Q7CisgICAgICAgIE1ldGhvZEhhbmRsZSBmbjsKKyAgICAgICAgaWYgKHNyYy5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoc3JjID09IHZvaWQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdm9pZC5jbGFzczsgIC8vIGNhbGxlciBtdXN0IHJlY29nbml6ZSB0aGlzIHNwZWNpYWxseQorICAgICAgICAgICAgfSBlbHNlIGlmIChkc3QuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIC8vIEV4YW1wbGVzOiBpbnQtPmJ5dGUsIGJ5dGUtPmludCwgYm9vbGVhbi0+aW50ICghc3RyaWN0KQorICAgICAgICAgICAgICAgIGZuID0gVmFsdWVDb252ZXJzaW9ucy5jb252ZXJ0UHJpbWl0aXZlKHNyYywgZHN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRXhhbXBsZXM6IGludC0+SW50ZWdlciwgYm9vbGVhbi0+T2JqZWN0LCBmbG9hdC0+TnVtYmVyCisgICAgICAgICAgICAgICAgV3JhcHBlciB3c3JjID0gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKHNyYyk7CisgICAgICAgICAgICAgICAgZm4gPSBWYWx1ZUNvbnZlcnNpb25zLmJveEV4YWN0KHdzcmMpOworICAgICAgICAgICAgICAgIGFzc2VydChmbi50eXBlKCkucGFyYW1ldGVyVHlwZSgwKSA9PSB3c3JjLnByaW1pdGl2ZVR5cGUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZuLnR5cGUoKS5yZXR1cm5UeXBlKCkgPT0gd3NyYy53cmFwcGVyVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIVZlcmlmeVR5cGUuaXNOdWxsQ29udmVyc2lvbih3c3JjLndyYXBwZXJUeXBlKCksIGRzdCwgc3RyaWN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3JuZXIgY2FzZSwgc3VjaCBhcyBpbnQtPkxvbmcsIHdoaWNoIHdpbGwgcHJvYmFibHkgZmFpbC4KKyAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShkc3QsIHNyYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpY3QpCisgICAgICAgICAgICAgICAgICAgICAgICBmbiA9IGZuLmFzVHlwZShtdCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gTWV0aG9kSGFuZGxlSW1wbC5tYWtlUGFpcndpc2VDb252ZXJ0KGZuLCBtdCwgLypzdHJpY3Q9Ki8gZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkc3QuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgV3JhcHBlciB3ZHN0ID0gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKGRzdCk7CisgICAgICAgICAgICBpZiAobW9ub2JveCB8fCBzcmMgPT0gd2RzdC53cmFwcGVyVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlIGEgc3Ryb25nbHktdHlwZWQgdW5ib3hlciwgaWYgcG9zc2libGUuCisgICAgICAgICAgICAgICAgZm4gPSBWYWx1ZUNvbnZlcnNpb25zLnVuYm94RXhhY3Qod2RzdCwgc3RyaWN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRXhhbXBsZXM6ICBPYmplY3QtPmludCwgTnVtYmVyLT5pbnQsIENvbXBhcmFibGUtPmludCwgQnl0ZS0+aW50CisgICAgICAgICAgICAgICAgLy8gbXVzdCBpbmNsdWRlIGFkZGl0aW9uYWwgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICAvLyBzcmMgbXVzdCBiZSBleGFtaW5lZCBhdCBydW50aW1lLCB0byBkZXRlY3QgQnl0ZSwgQ2hhcmFjdGVyLCBldGMuCisgICAgICAgICAgICAgICAgZm4gPSAoc3RyaWN0CisgICAgICAgICAgICAgICAgICAgICAgICA/IFZhbHVlQ29udmVyc2lvbnMudW5ib3hXaWRlbih3ZHN0KQorICAgICAgICAgICAgICAgICAgICAgICAgOiBWYWx1ZUNvbnZlcnNpb25zLnVuYm94Q2FzdCh3ZHN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTaW1wbGUgcmVmZXJlbmNlIGNvbnZlcnNpb24uCisgICAgICAgICAgICAvLyBOb3RlOiAgRG8gbm90IGNoZWNrIGZvciBhIGNsYXNzIGhpZXJhcmNoeSByZWxhdGlvbgorICAgICAgICAgICAgLy8gYmV0d2VlbiBzcmMgYW5kIGRzdC4gIEluIGFsbCBjYXNlcyBhICdudWxsJyBhcmd1bWVudAorICAgICAgICAgICAgLy8gd2lsbCBwYXNzIHRoZSBjYXN0IGNvbnZlcnNpb24uCisgICAgICAgICAgICByZXR1cm4gZHN0OworICAgICAgICB9CisgICAgICAgIGFzc2VydChmbi50eXBlKCkucGFyYW1ldGVyQ291bnQoKSA8PSAxKSA6ICJwYyIrQXJyYXlzLmFzTGlzdChzcmMuZ2V0U2ltcGxlTmFtZSgpLCBkc3QuZ2V0U2ltcGxlTmFtZSgpLCBmbik7CisgICAgICAgIHJldHVybiBmbjsKICAgICB9CiAKICAgICBzdGF0aWMgTWV0aG9kSGFuZGxlIG1ha2VWYXJhcmdzQ29sbGVjdG9yKE1ldGhvZEhhbmRsZSB0YXJnZXQsIENsYXNzPD8+IGFycmF5VHlwZSkgewpAQCAtMzI2LDM0ICs0NDUsNDYgQEAKICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyVHlwZShsYXN0KSAhPSBhcnJheVR5cGUpCiAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuYXNUeXBlKHR5cGUuY2hhbmdlUGFyYW1ldGVyVHlwZShsYXN0LCBhcnJheVR5cGUpKTsKICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LmFzRml4ZWRBcml0eSgpOyAgLy8gbWFrZSBzdXJlIHRoaXMgYXR0cmlidXRlIGlzIHR1cm5lZCBvZmYKLSAgICAgICAgcmV0dXJuIG5ldyBBc1ZhcmFyZ3NDb2xsZWN0b3IodGFyZ2V0LCB0YXJnZXQudHlwZSgpLCBhcnJheVR5cGUpOworICAgICAgICByZXR1cm4gbmV3IEFzVmFyYXJnc0NvbGxlY3Rvcih0YXJnZXQsIGFycmF5VHlwZSk7CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIEFzVmFyYXJnc0NvbGxlY3RvciBleHRlbmRzIE1ldGhvZEhhbmRsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQXNWYXJhcmdzQ29sbGVjdG9yIGV4dGVuZHMgRGVsZWdhdGluZ01ldGhvZEhhbmRsZSB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kSGFuZGxlIHRhcmdldDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBhcnJheVR5cGU7Ci0gICAgICAgIHByaXZhdGUgLypAU3RhYmxlKi8gTWV0aG9kSGFuZGxlIGFzQ29sbGVjdG9yQ2FjaGU7CisgICAgICAgIHByaXZhdGUgQFN0YWJsZSBNZXRob2RIYW5kbGUgYXNDb2xsZWN0b3JDYWNoZTsKIAotICAgICAgICBBc1ZhcmFyZ3NDb2xsZWN0b3IoTWV0aG9kSGFuZGxlIHRhcmdldCwgTWV0aG9kVHlwZSB0eXBlLCBDbGFzczw/PiBhcnJheVR5cGUpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUsIHJlaW52b2tlckZvcm0odGFyZ2V0KSk7CisgICAgICAgIEFzVmFyYXJnc0NvbGxlY3RvcihNZXRob2RIYW5kbGUgdGFyZ2V0LCBDbGFzczw/PiBhcnJheVR5cGUpIHsKKyAgICAgICAgICAgIHRoaXModGFyZ2V0LnR5cGUoKSwgdGFyZ2V0LCBhcnJheVR5cGUpOworICAgICAgICB9CisgICAgICAgIEFzVmFyYXJnc0NvbGxlY3RvcihNZXRob2RUeXBlIHR5cGUsIE1ldGhvZEhhbmRsZSB0YXJnZXQsIENsYXNzPD8+IGFycmF5VHlwZSkgeworICAgICAgICAgICAgc3VwZXIodHlwZSwgdGFyZ2V0KTsKICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgICAgICAgdGhpcy5hcnJheVR5cGUgPSBhcnJheVR5cGU7CiAgICAgICAgICAgICB0aGlzLmFzQ29sbGVjdG9yQ2FjaGUgPSB0YXJnZXQuYXNDb2xsZWN0b3IoYXJyYXlUeXBlLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZSBNZXRob2RIYW5kbGUgcmVpbnZva2VyVGFyZ2V0KCkgeyByZXR1cm4gdGFyZ2V0OyB9Ci0KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFyYXJnc0NvbGxlY3RvcigpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBNZXRob2RIYW5kbGUgZ2V0VGFyZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgTWV0aG9kSGFuZGxlIGFzRml4ZWRBcml0eSgpIHsKICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgTWV0aG9kSGFuZGxlIHNldFZhcmFyZ3MoTWVtYmVyTmFtZSBtZW1iZXIpIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXIuaXNWYXJhcmdzKCkpICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIHJldHVybiBhc0ZpeGVkQXJpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgTWV0aG9kSGFuZGxlIGFzVHlwZVVuY2FjaGVkKE1ldGhvZFR5cGUgbmV3VHlwZSkgewogICAgICAgICAgICAgTWV0aG9kVHlwZSB0eXBlID0gdGhpcy50eXBlKCk7CiAgICAgICAgICAgICBpbnQgY29sbGVjdEFyZyA9IHR5cGUucGFyYW1ldGVyQ291bnQoKSAtIDE7CkBAIC0zODEsNTQgKzUxMiwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1ldGhvZEhhbmRsZSBzZXRWYXJhcmdzKE1lbWJlck5hbWUgbWVtYmVyKSB7Ci0gICAgICAgICAgICBpZiAobWVtYmVyLmlzVmFyYXJncygpKSAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICByZXR1cm4gYXNGaXhlZEFyaXR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWV0aG9kSGFuZGxlIHZpZXdBc1R5cGUoTWV0aG9kVHlwZSBuZXdUeXBlKSB7Ci0gICAgICAgICAgICBpZiAobmV3VHlwZS5sYXN0UGFyYW1ldGVyVHlwZSgpICE9IHR5cGUoKS5sYXN0UGFyYW1ldGVyVHlwZSgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0gICAgICAgICAgICBNZXRob2RIYW5kbGUgbmV3VGFyZ2V0ID0gYXNGaXhlZEFyaXR5KCkudmlld0FzVHlwZShuZXdUeXBlKTsKLSAgICAgICAgICAgIC8vIHB1dCBiYWNrIHRoZSB2YXJhcmdzIGJpdDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXNWYXJhcmdzQ29sbGVjdG9yKG5ld1RhcmdldCwgbmV3VHlwZSwgYXJyYXlUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZW1iZXJOYW1lIGludGVybmFsTWVtYmVyTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBhc0ZpeGVkQXJpdHkoKS5pbnRlcm5hbE1lbWJlck5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQ2xhc3M8Pz4gaW50ZXJuYWxDYWxsZXJDbGFzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBhc0ZpeGVkQXJpdHkoKS5pbnRlcm5hbENhbGxlckNsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKm5vbi1wdWJsaWMqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgYm9vbGVhbiBpc0ludm9rZVNwZWNpYWwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXNGaXhlZEFyaXR5KCkuaXNJbnZva2VTcGVjaWFsKCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50KGludCBwb3MsIGNoYXIgYmFzaWNUeXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBhc0ZpeGVkQXJpdHkoKS5iaW5kQXJndW1lbnQocG9zLCBiYXNpY1R5cGUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZXRob2RIYW5kbGUgYmluZFJlY2VpdmVyKE9iamVjdCByZWNlaXZlcikgewotICAgICAgICAgICAgcmV0dXJuIGFzRml4ZWRBcml0eSgpLmJpbmRSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWV0aG9kSGFuZGxlIGRyb3BBcmd1bWVudHMoTWV0aG9kVHlwZSBzcmNUeXBlLCBpbnQgcG9zLCBpbnQgZHJvcHMpIHsKLSAgICAgICAgICAgIHJldHVybiBhc0ZpeGVkQXJpdHkoKS5kcm9wQXJndW1lbnRzKHNyY1R5cGUsIHBvcywgZHJvcHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1ldGhvZEhhbmRsZSBwZXJtdXRlQXJndW1lbnRzKE1ldGhvZFR5cGUgbmV3VHlwZSwgaW50W10gcmVvcmRlcikgewotICAgICAgICAgICAgcmV0dXJuIGFzRml4ZWRBcml0eSgpLnBlcm11dGVBcmd1bWVudHMobmV3VHlwZSwgcmVvcmRlcik7CisgICAgICAgIGJvb2xlYW4gdmlld0FzVHlwZUNoZWNrcyhNZXRob2RUeXBlIG5ld1R5cGUsIGJvb2xlYW4gc3RyaWN0KSB7CisgICAgICAgICAgICBzdXBlci52aWV3QXNUeXBlQ2hlY2tzKG5ld1R5cGUsIHRydWUpOworICAgICAgICAgICAgaWYgKHN0cmljdCkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAvLyBleHRyYSBhc3NlcnRpb24gZm9yIG5vbi1zdHJpY3QgY2hlY2tzOgorICAgICAgICAgICAgYXNzZXJ0ICh0eXBlKCkubGFzdFBhcmFtZXRlclR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUZyb20oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZS5sYXN0UGFyYW1ldGVyVHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgIDogQXJyYXlzLmFzTGlzdCh0aGlzLCBuZXdUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC00OTksMzIgKzU5MSw0NiBAQAogICAgICAqIFByZS1pbml0aWFsaXplZCBOYW1lZEZ1bmN0aW9ucyBmb3IgYm9vdHN0cmFwcGluZyBwdXJwb3Nlcy4KICAgICAgKiBGYWN0b3JlZCBpbiBhbiBpbm5lciBjbGFzcyB0byBkZWxheSBpbml0aWFsaXphdGlvbiB1bnRpbCBmaXJzdCB1c2FnZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMYXp5IHsKKyAgICBzdGF0aWMgY2xhc3MgTGF6eSB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IE1ISSA9IE1ldGhvZEhhbmRsZUltcGwuY2xhc3M7CiAKICAgICAgICAgc3RhdGljIGZpbmFsIE5hbWVkRnVuY3Rpb24gTkZfY2hlY2tTcHJlYWRBcmd1bWVudDsKICAgICAgICAgc3RhdGljIGZpbmFsIE5hbWVkRnVuY3Rpb24gTkZfZ3VhcmRXaXRoQ2F0Y2g7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBOYW1lZEZ1bmN0aW9uIE5GX3NlbGVjdEFsdGVybmF0aXZlOwogICAgICAgICBzdGF0aWMgZmluYWwgTmFtZWRGdW5jdGlvbiBORl90aHJvd0V4Y2VwdGlvbjsKIAogICAgICAgICBzdGF0aWMgZmluYWwgTWV0aG9kSGFuZGxlIE1IX2Nhc3RSZWZlcmVuY2U7CisgICAgICAgIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgTUhfc2VsZWN0QWx0ZXJuYXRpdmU7CisgICAgICAgIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgTUhfY29weUFzUHJpbWl0aXZlQXJyYXk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgTUhfZmlsbE5ld1R5cGVkQXJyYXk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgTUhfZmlsbE5ld0FycmF5OworICAgICAgICBzdGF0aWMgZmluYWwgTWV0aG9kSGFuZGxlIE1IX2FycmF5SWRlbnRpdHk7CiAKICAgICAgICAgc3RhdGljIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgTkZfY2hlY2tTcHJlYWRBcmd1bWVudCA9IG5ldyBOYW1lZEZ1bmN0aW9uKE1ISS5nZXREZWNsYXJlZE1ldGhvZCgiY2hlY2tTcHJlYWRBcmd1bWVudCIsIE9iamVjdC5jbGFzcywgaW50LmNsYXNzKSk7CiAgICAgICAgICAgICAgICAgTkZfZ3VhcmRXaXRoQ2F0Y2ggICAgICA9IG5ldyBOYW1lZEZ1bmN0aW9uKE1ISS5nZXREZWNsYXJlZE1ldGhvZCgiZ3VhcmRXaXRoQ2F0Y2giLCBNZXRob2RIYW5kbGUuY2xhc3MsIENsYXNzLmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlLmNsYXNzLCBPYmplY3RbXS5jbGFzcykpOwotICAgICAgICAgICAgICAgIE5GX3NlbGVjdEFsdGVybmF0aXZlICAgPSBuZXcgTmFtZWRGdW5jdGlvbihNSEkuZ2V0RGVjbGFyZWRNZXRob2QoInNlbGVjdEFsdGVybmF0aXZlIiwgYm9vbGVhbi5jbGFzcywgTWV0aG9kSGFuZGxlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlLmNsYXNzKSk7CiAgICAgICAgICAgICAgICAgTkZfdGhyb3dFeGNlcHRpb24gICAgICA9IG5ldyBOYW1lZEZ1bmN0aW9uKE1ISS5nZXREZWNsYXJlZE1ldGhvZCgidGhyb3dFeGNlcHRpb24iLCBUaHJvd2FibGUuY2xhc3MpKTsKIAogICAgICAgICAgICAgICAgIE5GX2NoZWNrU3ByZWFkQXJndW1lbnQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgIE5GX2d1YXJkV2l0aENhdGNoLnJlc29sdmUoKTsKLSAgICAgICAgICAgICAgICBORl9zZWxlY3RBbHRlcm5hdGl2ZS5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgTkZfdGhyb3dFeGNlcHRpb24ucmVzb2x2ZSgpOwogCi0gICAgICAgICAgICAgICAgTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3QuY2xhc3MsIENsYXNzLmNsYXNzLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgIE1IX2Nhc3RSZWZlcmVuY2UgPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKE1ISSwgImNhc3RSZWZlcmVuY2UiLCBtdCk7CisgICAgICAgICAgICAgICAgTUhfY2FzdFJlZmVyZW5jZSAgICAgICAgPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKE1ISSwgImNhc3RSZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0LmNsYXNzLCBDbGFzcy5jbGFzcywgT2JqZWN0LmNsYXNzKSk7CisgICAgICAgICAgICAgICAgTUhfY29weUFzUHJpbWl0aXZlQXJyYXkgPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKE1ISSwgImNvcHlBc1ByaW1pdGl2ZUFycmF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZS5tZXRob2RUeXBlKE9iamVjdC5jbGFzcywgV3JhcHBlci5jbGFzcywgT2JqZWN0W10uY2xhc3MpKTsKKyAgICAgICAgICAgICAgICBNSF9hcnJheUlkZW50aXR5ICAgICAgICA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoTUhJLCAiaWRlbnRpdHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0W10uY2xhc3MsIE9iamVjdFtdLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgTUhfZmlsbE5ld0FycmF5ICAgICAgICAgPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKE1ISSwgImZpbGxOZXdBcnJheSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3RbXS5jbGFzcywgSW50ZWdlci5jbGFzcywgT2JqZWN0W10uY2xhc3MpKTsKKyAgICAgICAgICAgICAgICBNSF9maWxsTmV3VHlwZWRBcnJheSAgICA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoTUhJLCAiZmlsbE5ld1R5cGVkQXJyYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0W10uY2xhc3MsIE9iamVjdFtdLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBPYmplY3RbXS5jbGFzcykpOworCisgICAgICAgICAgICAgICAgTUhfc2VsZWN0QWx0ZXJuYXRpdmUgICAgPSBtYWtlSW50cmluc2ljKAorICAgICAgICAgICAgICAgICAgICAgICAgSU1QTF9MT09LVVAuZmluZFN0YXRpYyhNSEksICJzZWxlY3RBbHRlcm5hdGl2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUubWV0aG9kVHlwZShNZXRob2RIYW5kbGUuY2xhc3MsIGJvb2xlYW4uY2xhc3MsIE1ldGhvZEhhbmRsZS5jbGFzcywgTWV0aG9kSGFuZGxlLmNsYXNzKSksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWMuU0VMRUNUX0FMVEVSTkFUSVZFKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKGV4KTsKICAgICAgICAgICAgIH0KQEAgLTU5NSwyOSArNzAxLDY2IEBACiAgICAgTWV0aG9kSGFuZGxlIG1ha2VHdWFyZFdpdGhUZXN0KE1ldGhvZEhhbmRsZSB0ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgZmFsbGJhY2spIHsKLSAgICAgICAgTWV0aG9kVHlwZSBiYXNpY1R5cGUgPSB0YXJnZXQudHlwZSgpLmJhc2ljVHlwZSgpOwotICAgICAgICBNZXRob2RIYW5kbGUgaW52b2tlQmFzaWMgPSBNZXRob2RIYW5kbGVzLmJhc2ljSW52b2tlcihiYXNpY1R5cGUpOwotICAgICAgICBpbnQgYXJpdHkgPSBiYXNpY1R5cGUucGFyYW1ldGVyQ291bnQoKTsKLSAgICAgICAgaW50IGV4dHJhTmFtZXMgPSAzOwotICAgICAgICBNZXRob2RUeXBlIGxhbWJkYVR5cGUgPSBiYXNpY1R5cGUuaW52b2tlclR5cGUoKTsKLSAgICAgICAgTmFtZVtdIG5hbWVzID0gYXJndW1lbnRzKGV4dHJhTmFtZXMsIGxhbWJkYVR5cGUpOworICAgICAgICBNZXRob2RUeXBlIHR5cGUgPSB0YXJnZXQudHlwZSgpOworICAgICAgICBhc3NlcnQodGVzdC50eXBlKCkuZXF1YWxzKHR5cGUuY2hhbmdlUmV0dXJuVHlwZShib29sZWFuLmNsYXNzKSkgJiYgZmFsbGJhY2sudHlwZSgpLmVxdWFscyh0eXBlKSk7CisgICAgICAgIE1ldGhvZFR5cGUgYmFzaWNUeXBlID0gdHlwZS5iYXNpY1R5cGUoKTsKKyAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gbWFrZUd1YXJkV2l0aFRlc3RGb3JtKGJhc2ljVHlwZSk7CisgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlLlNwZWNpZXNEYXRhIGRhdGEgPSBCb3VuZE1ldGhvZEhhbmRsZS5zcGVjaWVzRGF0YV9MTEwoKTsKKyAgICAgICAgQm91bmRNZXRob2RIYW5kbGUgbWg7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtaCA9IChCb3VuZE1ldGhvZEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKHR5cGUsIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0KSB0ZXN0LCAoT2JqZWN0KSB0YXJnZXQsIChPYmplY3QpIGZhbGxiYWNrKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICB0aHJvdyB1bmNhdWdodEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KG1oLnR5cGUoKSA9PSB0eXBlKTsKKyAgICAgICAgcmV0dXJuIG1oOworICAgIH0KIAotICAgICAgICBPYmplY3RbXSB0ZXN0QXJncyAgID0gQXJyYXlzLmNvcHlPZlJhbmdlKG5hbWVzLCAxLCAxICsgYXJpdHksIE9iamVjdFtdLmNsYXNzKTsKLSAgICAgICAgT2JqZWN0W10gdGFyZ2V0QXJncyA9IEFycmF5cy5jb3B5T2ZSYW5nZShuYW1lcywgMCwgMSArIGFyaXR5LCBPYmplY3RbXS5jbGFzcyk7CisgICAgc3RhdGljCisgICAgTGFtYmRhRm9ybSBtYWtlR3VhcmRXaXRoVGVzdEZvcm0oTWV0aG9kVHlwZSBiYXNpY1R5cGUpIHsKKyAgICAgICAgTGFtYmRhRm9ybSBsZm9ybSA9IGJhc2ljVHlwZS5mb3JtKCkuY2FjaGVkTGFtYmRhRm9ybShNZXRob2RUeXBlRm9ybS5MRl9HV1QpOworICAgICAgICBpZiAobGZvcm0gIT0gbnVsbCkgIHJldHVybiBsZm9ybTsKKyAgICAgICAgZmluYWwgaW50IFRISVNfTUggICAgICA9IDA7ICAvLyB0aGUgQk1IX0xMTAorICAgICAgICBmaW5hbCBpbnQgQVJHX0JBU0UgICAgID0gMTsgIC8vIHN0YXJ0IG9mIGluY29taW5nIGFyZ3VtZW50cworICAgICAgICBmaW5hbCBpbnQgQVJHX0xJTUlUICAgID0gQVJHX0JBU0UgKyBiYXNpY1R5cGUucGFyYW1ldGVyQ291bnQoKTsKKyAgICAgICAgaW50IG5hbWVDdXJzb3IgPSBBUkdfTElNSVQ7CisgICAgICAgIGZpbmFsIGludCBHRVRfVEVTVCAgICAgPSBuYW1lQ3Vyc29yKys7CisgICAgICAgIGZpbmFsIGludCBHRVRfVEFSR0VUICAgPSBuYW1lQ3Vyc29yKys7CisgICAgICAgIGZpbmFsIGludCBHRVRfRkFMTEJBQ0sgPSBuYW1lQ3Vyc29yKys7CisgICAgICAgIGZpbmFsIGludCBDQUxMX1RFU1QgICAgPSBuYW1lQ3Vyc29yKys7CisgICAgICAgIGZpbmFsIGludCBTRUxFQ1RfQUxUICAgPSBuYW1lQ3Vyc29yKys7CisgICAgICAgIGZpbmFsIGludCBDQUxMX1RBUkdFVCAgPSBuYW1lQ3Vyc29yKys7CisgICAgICAgIGFzc2VydChDQUxMX1RBUkdFVCA9PSBTRUxFQ1RfQUxUKzEpOyAgLy8gbXVzdCBiZSB0cnVlIHRvIHRyaWdnZXIgSUJHLmVtaXRTZWxlY3RBbHRlcm5hdGl2ZQorCisgICAgICAgIE1ldGhvZFR5cGUgbGFtYmRhVHlwZSA9IGJhc2ljVHlwZS5pbnZva2VyVHlwZSgpOworICAgICAgICBOYW1lW10gbmFtZXMgPSBhcmd1bWVudHMobmFtZUN1cnNvciAtIEFSR19MSU1JVCwgbGFtYmRhVHlwZSk7CisKKyAgICAgICAgQm91bmRNZXRob2RIYW5kbGUuU3BlY2llc0RhdGEgZGF0YSA9IEJvdW5kTWV0aG9kSGFuZGxlLnNwZWNpZXNEYXRhX0xMTCgpOworICAgICAgICBuYW1lc1tUSElTX01IXSA9IG5hbWVzW1RISVNfTUhdLndpdGhDb25zdHJhaW50KGRhdGEpOworICAgICAgICBuYW1lc1tHRVRfVEVTVF0gICAgID0gbmV3IE5hbWUoZGF0YS5nZXR0ZXJGdW5jdGlvbigwKSwgbmFtZXNbVEhJU19NSF0pOworICAgICAgICBuYW1lc1tHRVRfVEFSR0VUXSAgID0gbmV3IE5hbWUoZGF0YS5nZXR0ZXJGdW5jdGlvbigxKSwgbmFtZXNbVEhJU19NSF0pOworICAgICAgICBuYW1lc1tHRVRfRkFMTEJBQ0tdID0gbmV3IE5hbWUoZGF0YS5nZXR0ZXJGdW5jdGlvbigyKSwgbmFtZXNbVEhJU19NSF0pOworCisgICAgICAgIE9iamVjdFtdIGludm9rZUFyZ3MgPSBBcnJheXMuY29weU9mUmFuZ2UobmFtZXMsIDAsIEFSR19MSU1JVCwgT2JqZWN0W10uY2xhc3MpOwogCiAgICAgICAgIC8vIGNhbGwgdGVzdAotICAgICAgICBuYW1lc1thcml0eSArIDFdID0gbmV3IE5hbWUodGVzdCwgdGVzdEFyZ3MpOworICAgICAgICBNZXRob2RUeXBlIHRlc3RUeXBlID0gYmFzaWNUeXBlLmNoYW5nZVJldHVyblR5cGUoYm9vbGVhbi5jbGFzcykuYmFzaWNUeXBlKCk7CisgICAgICAgIGludm9rZUFyZ3NbMF0gPSBuYW1lc1tHRVRfVEVTVF07CisgICAgICAgIG5hbWVzW0NBTExfVEVTVF0gPSBuZXcgTmFtZSh0ZXN0VHlwZSwgaW52b2tlQXJncyk7CiAKICAgICAgICAgLy8gY2FsbCBzZWxlY3RBbHRlcm5hdGl2ZQotICAgICAgICBPYmplY3RbXSBzZWxlY3RBcmdzID0geyBuYW1lc1thcml0eSArIDFdLCB0YXJnZXQsIGZhbGxiYWNrIH07Ci0gICAgICAgIG5hbWVzW2FyaXR5ICsgMl0gPSBuZXcgTmFtZShMYXp5Lk5GX3NlbGVjdEFsdGVybmF0aXZlLCBzZWxlY3RBcmdzKTsKLSAgICAgICAgdGFyZ2V0QXJnc1swXSA9IG5hbWVzW2FyaXR5ICsgMl07CisgICAgICAgIG5hbWVzW1NFTEVDVF9BTFRdID0gbmV3IE5hbWUoTGF6eS5NSF9zZWxlY3RBbHRlcm5hdGl2ZSwgbmFtZXNbQ0FMTF9URVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc1tHRVRfVEFSR0VUXSwgbmFtZXNbR0VUX0ZBTExCQUNLXSk7CiAKICAgICAgICAgLy8gY2FsbCB0YXJnZXQgb3IgZmFsbGJhY2sKLSAgICAgICAgbmFtZXNbYXJpdHkgKyAzXSA9IG5ldyBOYW1lKG5ldyBOYW1lZEZ1bmN0aW9uKGludm9rZUJhc2ljKSwgdGFyZ2V0QXJncyk7CisgICAgICAgIGludm9rZUFyZ3NbMF0gPSBuYW1lc1tTRUxFQ1RfQUxUXTsKKyAgICAgICAgbmFtZXNbQ0FMTF9UQVJHRVRdID0gbmV3IE5hbWUoYmFzaWNUeXBlLCBpbnZva2VBcmdzKTsKIAotICAgICAgICBMYW1iZGFGb3JtIGZvcm0gPSBuZXcgTGFtYmRhRm9ybSgiZ3VhcmQiLCBsYW1iZGFUeXBlLnBhcmFtZXRlckNvdW50KCksIG5hbWVzKTsKLSAgICAgICAgcmV0dXJuIFNpbXBsZU1ldGhvZEhhbmRsZS5tYWtlKHRhcmdldC50eXBlKCksIGZvcm0pOworICAgICAgICBsZm9ybSA9IG5ldyBMYW1iZGFGb3JtKCJndWFyZCIsIGxhbWJkYVR5cGUucGFyYW1ldGVyQ291bnQoKSwgbmFtZXMpOworCisgICAgICAgIHJldHVybiBiYXNpY1R5cGUuZm9ybSgpLnNldENhY2hlZExhbWJkYUZvcm0oTWV0aG9kVHlwZUZvcm0uTEZfR1dULCBsZm9ybSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NjUsNiArODA4LDcgQEAKICAgICAgICAgTmFtZVtdIG5hbWVzID0gYXJndW1lbnRzKG5hbWVDdXJzb3IgLSBBUkdfTElNSVQsIGxhbWJkYVR5cGUpOwogCiAgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlLlNwZWNpZXNEYXRhIGRhdGEgPSBCb3VuZE1ldGhvZEhhbmRsZS5zcGVjaWVzRGF0YV9MTExMTCgpOworICAgICAgICBuYW1lc1tUSElTX01IXSAgICAgICAgICA9IG5hbWVzW1RISVNfTUhdLndpdGhDb25zdHJhaW50KGRhdGEpOwogICAgICAgICBuYW1lc1tHRVRfVEFSR0VUXSAgICAgICA9IG5ldyBOYW1lKGRhdGEuZ2V0dGVyRnVuY3Rpb24oMCksIG5hbWVzW1RISVNfTUhdKTsKICAgICAgICAgbmFtZXNbR0VUX0NMQVNTXSAgICAgICAgPSBuZXcgTmFtZShkYXRhLmdldHRlckZ1bmN0aW9uKDEpLCBuYW1lc1tUSElTX01IXSk7CiAgICAgICAgIG5hbWVzW0dFVF9DQVRDSEVSXSAgICAgID0gbmV3IE5hbWUoZGF0YS5nZXR0ZXJGdW5jdGlvbigyKSwgbmFtZXNbVEhJU19NSF0pOwpAQCAtNjc5LDcgKzgyMyw3IEBACiAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W2ludm9rZUJhc2ljLnR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpXTsKICAgICAgICAgYXJnc1swXSA9IG5hbWVzW0dFVF9DT0xMRUNUX0FSR1NdOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCBBUkdfQkFTRSwgYXJncywgMSwgQVJHX0xJTUlULUFSR19CQVNFKTsKLSAgICAgICAgbmFtZXNbQk9YRURfQVJHU10gPSBuZXcgTmFtZShuZXcgTmFtZWRGdW5jdGlvbihpbnZva2VCYXNpYyksIGFyZ3MpOworICAgICAgICBuYW1lc1tCT1hFRF9BUkdTXSA9IG5ldyBOYW1lKG1ha2VJbnRyaW5zaWMoaW52b2tlQmFzaWMsIEludHJpbnNpYy5HVUFSRF9XSVRIX0NBVENIKSwgYXJncyk7CiAKICAgICAgICAgLy8gdF97aSsxfTpMPU1ldGhvZEhhbmRsZUltcGwuZ3VhcmRXaXRoQ2F0Y2godGFyZ2V0OkwsZXhUeXBlOkwsY2F0Y2hlcjpMLHRfe2l9OkwpOwogICAgICAgICBPYmplY3RbXSBnd2NBcmdzID0gbmV3IE9iamVjdFtdIHtuYW1lc1tHRVRfVEFSR0VUXSwgbmFtZXNbR0VUX0NMQVNTXSwgbmFtZXNbR0VUX0NBVENIRVJdLCBuYW1lc1tCT1hFRF9BUkdTXX07CkBAIC02ODgsNyArODMyLDcgQEAKICAgICAgICAgLy8gdF97aSsyfTpJPU1ldGhvZEhhbmRsZS5pbnZva2VCYXNpYyh1bmJveDpMLHRfe2krMX06TCk7CiAgICAgICAgIE1ldGhvZEhhbmRsZSBpbnZva2VCYXNpY1VuYm94ID0gTWV0aG9kSGFuZGxlcy5iYXNpY0ludm9rZXIoTWV0aG9kVHlwZS5tZXRob2RUeXBlKGJhc2ljVHlwZS5ydHlwZSgpLCBPYmplY3QuY2xhc3MpKTsKICAgICAgICAgT2JqZWN0W10gdW5ib3hBcmdzICA9IG5ldyBPYmplY3RbXSB7bmFtZXNbR0VUX1VOQk9YX1JFU1VMVF0sIG5hbWVzW1RSWV9DQVRDSF19OwotICAgICAgICBuYW1lc1tVTkJPWF9SRVNVTFRdID0gbmV3IE5hbWUobmV3IE5hbWVkRnVuY3Rpb24oaW52b2tlQmFzaWNVbmJveCksIHVuYm94QXJncyk7CisgICAgICAgIG5hbWVzW1VOQk9YX1JFU1VMVF0gPSBuZXcgTmFtZShpbnZva2VCYXNpY1VuYm94LCB1bmJveEFyZ3MpOwogCiAgICAgICAgIGxmb3JtID0gbmV3IExhbWJkYUZvcm0oImd1YXJkV2l0aENhdGNoIiwgbGFtYmRhVHlwZS5wYXJhbWV0ZXJDb3VudCgpLCBuYW1lcyk7CiAKQEAgLTcwNSwyMiArODQ5LDI3IEBACiAgICAgICAgIC8vIFByZXBhcmUgYXV4aWxpYXJ5IG1ldGhvZCBoYW5kbGVzIHVzZWQgZHVyaW5nIExhbWJkYUZvcm0gaW50ZXJwcmVhdGlvbi4KICAgICAgICAgLy8gQm94IGFyZ3VtZW50cyBhbmQgd3JhcCB0aGVtIGludG8gT2JqZWN0W106IFZhbHVlQ29udmVyc2lvbnMuYXJyYXkoKS4KICAgICAgICAgTWV0aG9kVHlwZSB2YXJhcmdzVHlwZSA9IHR5cGUuY2hhbmdlUmV0dXJuVHlwZShPYmplY3RbXS5jbGFzcyk7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSBjb2xsZWN0QXJncyA9IFZhbHVlQ29udmVyc2lvbnMudmFyYXJnc0FycmF5KHR5cGUucGFyYW1ldGVyQ291bnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc1R5cGUodmFyYXJnc1R5cGUpOworICAgICAgICBNZXRob2RIYW5kbGUgY29sbGVjdEFyZ3MgPSB2YXJhcmdzQXJyYXkodHlwZS5wYXJhbWV0ZXJDb3VudCgpKS5hc1R5cGUodmFyYXJnc1R5cGUpOwogICAgICAgICAvLyBSZXN1bHQgdW5ib3hpbmc6IFZhbHVlQ29udmVyc2lvbnMudW5ib3goKSBPUiBWYWx1ZUNvbnZlcnNpb25zLmlkZW50aXR5KCkgT1IgVmFsdWVDb252ZXJzaW9ucy5pZ25vcmUoKS4KICAgICAgICAgTWV0aG9kSGFuZGxlIHVuYm94UmVzdWx0OwotICAgICAgICBpZiAodHlwZS5yZXR1cm5UeXBlKCkuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgdW5ib3hSZXN1bHQgPSBWYWx1ZUNvbnZlcnNpb25zLnVuYm94KHR5cGUucmV0dXJuVHlwZSgpKTsKKyAgICAgICAgQ2xhc3M8Pz4gcnR5cGUgPSB0eXBlLnJldHVyblR5cGUoKTsKKyAgICAgICAgaWYgKHJ0eXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmIChydHlwZSA9PSB2b2lkLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgdW5ib3hSZXN1bHQgPSBWYWx1ZUNvbnZlcnNpb25zLmlnbm9yZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXcmFwcGVyIHcgPSBXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUodHlwZS5yZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgICAgIHVuYm94UmVzdWx0ID0gVmFsdWVDb252ZXJzaW9ucy51bmJveEV4YWN0KHcpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5ib3hSZXN1bHQgPSBWYWx1ZUNvbnZlcnNpb25zLmlkZW50aXR5KCk7CisgICAgICAgICAgICB1bmJveFJlc3VsdCA9IE1ldGhvZEhhbmRsZXMuaWRlbnRpdHkoT2JqZWN0LmNsYXNzKTsKICAgICAgICAgfQogCiAgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlLlNwZWNpZXNEYXRhIGRhdGEgPSBCb3VuZE1ldGhvZEhhbmRsZS5zcGVjaWVzRGF0YV9MTExMTCgpOwogICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZSBtaDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1oID0gKEJvdW5kTWV0aG9kSGFuZGxlKQotICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnN0cnVjdG9yWzBdLmludm9rZUJhc2ljKHR5cGUsIGZvcm0sIChPYmplY3QpIHRhcmdldCwgKE9iamVjdCkgZXhUeXBlLCAoT2JqZWN0KSBjYXRjaGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3QpIGNvbGxlY3RBcmdzLCAoT2JqZWN0KSB1bmJveFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuY29uc3RydWN0b3IoKS5pbnZva2VCYXNpYyh0eXBlLCBmb3JtLCAoT2JqZWN0KSB0YXJnZXQsIChPYmplY3QpIGV4VHlwZSwgKE9iamVjdCkgY2F0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3QpIGNvbGxlY3RBcmdzLCAoT2JqZWN0KSB1bmJveFJlc3VsdCk7CiAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgewogICAgICAgICAgICAgdGhyb3cgdW5jYXVnaHRFeGNlcHRpb24oZXgpOwogICAgICAgICB9CkBAIC03NTgsOSArOTA3LDExIEBACiAgICAgICAgIGFzc2VydChUaHJvd2FibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlLnBhcmFtZXRlclR5cGUoMCkpKTsKICAgICAgICAgaW50IGFyaXR5ID0gdHlwZS5wYXJhbWV0ZXJDb3VudCgpOwogICAgICAgICBpZiAoYXJpdHkgPiAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24odHlwZS5kcm9wUGFyYW1ldGVyVHlwZXMoMSwgYXJpdHkpKS5kcm9wQXJndW1lbnRzKHR5cGUsIDEsIGFyaXR5LTEpOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gdGhyb3dFeGNlcHRpb24odHlwZS5kcm9wUGFyYW1ldGVyVHlwZXMoMSwgYXJpdHkpKTsKKyAgICAgICAgICAgIG1oID0gTWV0aG9kSGFuZGxlcy5kcm9wQXJndW1lbnRzKG1oLCAxLCB0eXBlLnBhcmFtZXRlckxpc3QoKS5zdWJMaXN0KDEsIGFyaXR5KSk7CisgICAgICAgICAgICByZXR1cm4gbWg7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ha2VQYWlyd2lzZUNvbnZlcnQoTGF6eS5ORl90aHJvd0V4Y2VwdGlvbi5yZXNvbHZlZEhhbmRsZSgpLCB0eXBlLCAyKTsKKyAgICAgICAgcmV0dXJuIG1ha2VQYWlyd2lzZUNvbnZlcnQoTGF6eS5ORl90aHJvd0V4Y2VwdGlvbi5yZXNvbHZlZEhhbmRsZSgpLCB0eXBlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgc3RhdGljIDxUIGV4dGVuZHMgVGhyb3dhYmxlPiBFbXB0eSB0aHJvd0V4Y2VwdGlvbihUIHQpIHRocm93cyBUIHsgdGhyb3cgdDsgfQpAQCAtNzgyLDcgKzkzMyw3IEBACiAgICAgICAgIG1oID0gbWguYmluZFRvKG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHJlZmxlY3RpdmVseSBpbnZva2UgTWV0aG9kSGFuZGxlIikpOwogICAgICAgICBpZiAoIW1ldGhvZC5nZXRJbnZvY2F0aW9uVHlwZSgpLmVxdWFscyhtaC50eXBlKCkpKQogICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IobWV0aG9kLnRvU3RyaW5nKCkpOwotICAgICAgICBtaCA9IG1oLndpdGhJbnRlcm5hbE1lbWJlck5hbWUobWV0aG9kKTsKKyAgICAgICAgbWggPSBtaC53aXRoSW50ZXJuYWxNZW1iZXJOYW1lKG1ldGhvZCwgZmFsc2UpOwogICAgICAgICBtaCA9IG1oLmFzVmFyYXJnc0NvbGxlY3RvcihPYmplY3RbXS5jbGFzcyk7CiAgICAgICAgIGFzc2VydChtZXRob2QuaXNWYXJhcmdzKCkpOwogICAgICAgICBGQUtFX01FVEhPRF9IQU5ETEVfSU5WT0tFW2lkeF0gPSBtaDsKQEAgLTgxOSw3ICs5NzAsNyBAQAogICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHZhbWggPSBwcmVwYXJlRm9ySW52b2tlcihtaCk7CiAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IG9mIG1ha2VJbmplY3RlZEludm9rZXIgb25jZSBwZXIgYXJndW1lbnQgY2xhc3MuCiAgICAgICAgICAgICBNZXRob2RIYW5kbGUgYmNjSW52b2tlciA9IENWX21ha2VJbmplY3RlZEludm9rZXIuZ2V0KGhvc3RDbGFzcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdG9yZVRvVHlwZShiY2NJbnZva2VyLmJpbmRUbyh2YW1oKSwgbWgudHlwZSgpLCBtaC5pbnRlcm5hbE1lbWJlck5hbWUoKSwgaG9zdENsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiByZXN0b3JlVG9UeXBlKGJjY0ludm9rZXIuYmluZFRvKHZhbWgpLCBtaCwgaG9zdENsYXNzKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBtYWtlSW5qZWN0ZWRJbnZva2VyKENsYXNzPD8+IGhvc3RDbGFzcykgewpAQCAtODc0LDEyICsxMDI1LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBVbmRvIHRoZSBhZGFwdGVyIGVmZmVjdCBvZiBwcmVwYXJlRm9ySW52b2tlcjoKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIHJlc3RvcmVUb1R5cGUoTWV0aG9kSGFuZGxlIHZhbWgsIE1ldGhvZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyTmFtZSBtZW1iZXIsCisgICAgICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSByZXN0b3JlVG9UeXBlKE1ldGhvZEhhbmRsZSB2YW1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgb3JpZ2luYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGhvc3RDbGFzcykgeworICAgICAgICAgICAgTWV0aG9kVHlwZSB0eXBlID0gb3JpZ2luYWwudHlwZSgpOwogICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gdmFtaC5hc0NvbGxlY3RvcihPYmplY3RbXS5jbGFzcywgdHlwZS5wYXJhbWV0ZXJDb3VudCgpKTsKKyAgICAgICAgICAgIE1lbWJlck5hbWUgbWVtYmVyID0gb3JpZ2luYWwuaW50ZXJuYWxNZW1iZXJOYW1lKCk7CiAgICAgICAgICAgICBtaCA9IG1oLmFzVHlwZSh0eXBlKTsKLSAgICAgICAgICAgIG1oID0gbmV3IFdyYXBwZWRNZW1iZXIobWgsIHR5cGUsIG1lbWJlciwgaG9zdENsYXNzKTsKKyAgICAgICAgICAgIG1oID0gbmV3IFdyYXBwZWRNZW1iZXIobWgsIHR5cGUsIG1lbWJlciwgb3JpZ2luYWwuaXNJbnZva2VTcGVjaWFsKCksIGhvc3RDbGFzcyk7CiAgICAgICAgICAgICByZXR1cm4gbWg7CiAgICAgICAgIH0KIApAQCAtOTQ1LDI5ICsxMDk4LDIzIEBACiAKIAogICAgIC8qKiBUaGlzIHN1YmNsYXNzIGFsbG93cyBhIHdyYXBwZWQgbWV0aG9kIGhhbmRsZSB0byBiZSByZS1hc3NvY2lhdGVkIHdpdGggYW4gYXJiaXRyYXJ5IG1lbWJlciBuYW1lLiAqLwotICAgIHN0YXRpYyBjbGFzcyBXcmFwcGVkTWVtYmVyIGV4dGVuZHMgTWV0aG9kSGFuZGxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBXcmFwcGVkTWVtYmVyIGV4dGVuZHMgRGVsZWdhdGluZ01ldGhvZEhhbmRsZSB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kSGFuZGxlIHRhcmdldDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZW1iZXJOYW1lIG1lbWJlcjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBjYWxsZXJDbGFzczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzSW52b2tlU3BlY2lhbDsKIAotICAgICAgICBwcml2YXRlIFdyYXBwZWRNZW1iZXIoTWV0aG9kSGFuZGxlIHRhcmdldCwgTWV0aG9kVHlwZSB0eXBlLCBNZW1iZXJOYW1lIG1lbWJlciwgQ2xhc3M8Pz4gY2FsbGVyQ2xhc3MpIHsKLSAgICAgICAgICAgIHN1cGVyKHR5cGUsIHJlaW52b2tlckZvcm0odGFyZ2V0KSk7CisgICAgICAgIHByaXZhdGUgV3JhcHBlZE1lbWJlcihNZXRob2RIYW5kbGUgdGFyZ2V0LCBNZXRob2RUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJOYW1lIG1lbWJlciwgYm9vbGVhbiBpc0ludm9rZVNwZWNpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjYWxsZXJDbGFzcykgeworICAgICAgICAgICAgc3VwZXIodHlwZSwgdGFyZ2V0KTsKICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgICAgICAgdGhpcy5tZW1iZXIgPSBtZW1iZXI7CiAgICAgICAgICAgICB0aGlzLmNhbGxlckNsYXNzID0gY2FsbGVyQ2xhc3M7CisgICAgICAgICAgICB0aGlzLmlzSW52b2tlU3BlY2lhbCA9IGlzSW52b2tlU3BlY2lhbDsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZXRob2RIYW5kbGUgcmVpbnZva2VyVGFyZ2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1ldGhvZEhhbmRsZSBhc1R5cGVVbmNhY2hlZChNZXRob2RUeXBlIG5ld1R5cGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgTUggaXMgYW4gYWxpYXMgZm9yIHRhcmdldCwgZXhjZXB0IGZvciB0aGUgTWVtYmVyTmFtZQotICAgICAgICAgICAgLy8gRHJvcCB0aGUgTWVtYmVyTmFtZSBpZiB0aGVyZSBpcyBhbnkgY29udmVyc2lvbi4KLSAgICAgICAgICAgIHJldHVybiBhc1R5cGVDYWNoZSA9IHRhcmdldC5hc1R5cGUobmV3VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIE1lbWJlck5hbWUgaW50ZXJuYWxNZW1iZXJOYW1lKCkgewogICAgICAgICAgICAgcmV0dXJuIG1lbWJlcjsKICAgICAgICAgfQpAQCAtOTc3LDE4ICsxMTI0LDM2NyBAQAogICAgICAgICB9CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBib29sZWFuIGlzSW52b2tlU3BlY2lhbCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQuaXNJbnZva2VTcGVjaWFsKCk7CisgICAgICAgICAgICByZXR1cm4gaXNJbnZva2VTcGVjaWFsOwogICAgICAgICB9CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZXRob2RIYW5kbGUgdmlld0FzVHlwZShNZXRob2RUeXBlIG5ld1R5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZE1lbWJlcih0YXJnZXQsIG5ld1R5cGUsIG1lbWJlciwgY2FsbGVyQ2xhc3MpOworICAgICAgICBwcm90ZWN0ZWQgTWV0aG9kSGFuZGxlIGdldFRhcmdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgYXNUeXBlVW5jYWNoZWQoTWV0aG9kVHlwZSBuZXdUeXBlKSB7CisgICAgICAgICAgICAvLyBUaGlzIE1IIGlzIGFuIGFsaWFzIGZvciB0YXJnZXQsIGV4Y2VwdCBmb3IgdGhlIE1lbWJlck5hbWUKKyAgICAgICAgICAgIC8vIERyb3AgdGhlIE1lbWJlck5hbWUgaWYgdGhlcmUgaXMgYW55IGNvbnZlcnNpb24uCisgICAgICAgICAgICByZXR1cm4gYXNUeXBlQ2FjaGUgPSB0YXJnZXQuYXNUeXBlKG5ld1R5cGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdGljIE1ldGhvZEhhbmRsZSBtYWtlV3JhcHBlZE1lbWJlcihNZXRob2RIYW5kbGUgdGFyZ2V0LCBNZW1iZXJOYW1lIG1lbWJlcikgewotICAgICAgICBpZiAobWVtYmVyLmVxdWFscyh0YXJnZXQuaW50ZXJuYWxNZW1iZXJOYW1lKCkpKQorICAgIHN0YXRpYyBNZXRob2RIYW5kbGUgbWFrZVdyYXBwZWRNZW1iZXIoTWV0aG9kSGFuZGxlIHRhcmdldCwgTWVtYmVyTmFtZSBtZW1iZXIsIGJvb2xlYW4gaXNJbnZva2VTcGVjaWFsKSB7CisgICAgICAgIGlmIChtZW1iZXIuZXF1YWxzKHRhcmdldC5pbnRlcm5hbE1lbWJlck5hbWUoKSkgJiYgaXNJbnZva2VTcGVjaWFsID09IHRhcmdldC5pc0ludm9rZVNwZWNpYWwoKSkKICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgICAgIHJldHVybiBuZXcgV3JhcHBlZE1lbWJlcih0YXJnZXQsIHRhcmdldC50eXBlKCksIG1lbWJlciwgbnVsbCk7CisgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZE1lbWJlcih0YXJnZXQsIHRhcmdldC50eXBlKCksIG1lbWJlciwgaXNJbnZva2VTcGVjaWFsLCBudWxsKTsKICAgICB9CiAKKyAgICAvKiogSW50cmluc2ljIElEcyAqLworICAgIC8qbm9uLXB1YmxpYyovCisgICAgZW51bSBJbnRyaW5zaWMgeworICAgICAgICBTRUxFQ1RfQUxURVJOQVRJVkUsCisgICAgICAgIEdVQVJEX1dJVEhfQ0FUQ0gsCisgICAgICAgIE5FV19BUlJBWSwKKyAgICAgICAgQVJSQVlfTE9BRCwKKyAgICAgICAgQVJSQVlfU1RPUkUsCisgICAgICAgIElERU5USVRZLAorICAgICAgICBaRVJPLAorICAgICAgICBOT05FIC8vIG5vIGludHJpbnNpYyBhc3NvY2lhdGVkCisgICAgfQorCisgICAgLyoqIE1hcmsgYXJiaXRyYXJ5IG1ldGhvZCBoYW5kbGUgYXMgaW50cmluc2ljLgorICAgICAqIEludm9rZXJCeXRlY29kZUdlbmVyYXRvciB1c2VzIHRoaXMgaW5mbyB0byBwcm9kdWNlIG1vcmUgZWZmaWNpZW50IGJ5dGVjb2RlIHNoYXBlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEludHJpbnNpY01ldGhvZEhhbmRsZSBleHRlbmRzIERlbGVnYXRpbmdNZXRob2RIYW5kbGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZEhhbmRsZSB0YXJnZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgSW50cmluc2ljIGludHJpbnNpY05hbWU7CisKKyAgICAgICAgSW50cmluc2ljTWV0aG9kSGFuZGxlKE1ldGhvZEhhbmRsZSB0YXJnZXQsIEludHJpbnNpYyBpbnRyaW5zaWNOYW1lKSB7CisgICAgICAgICAgICBzdXBlcih0YXJnZXQudHlwZSgpLCB0YXJnZXQpOworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgICAgICB0aGlzLmludHJpbnNpY05hbWUgPSBpbnRyaW5zaWNOYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBNZXRob2RIYW5kbGUgZ2V0VGFyZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBJbnRyaW5zaWMgaW50cmluc2ljTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnRyaW5zaWNOYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgYXNUeXBlVW5jYWNoZWQoTWV0aG9kVHlwZSBuZXdUeXBlKSB7CisgICAgICAgICAgICAvLyBUaGlzIE1IIGlzIGFuIGFsaWFzIGZvciB0YXJnZXQsIGV4Y2VwdCBmb3IgdGhlIGludHJpbnNpYyBuYW1lCisgICAgICAgICAgICAvLyBEcm9wIHRoZSBuYW1lIGlmIHRoZXJlIGlzIGFueSBjb252ZXJzaW9uLgorICAgICAgICAgICAgcmV0dXJuIGFzVHlwZUNhY2hlID0gdGFyZ2V0LmFzVHlwZShuZXdUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBTdHJpbmcgaW50ZXJuYWxQcm9wZXJ0aWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmludGVybmFsUHJvcGVydGllcygpICsKKyAgICAgICAgICAgICAgICAgICAgIlxuJiBJbnRyaW5zaWM9IitpbnRyaW5zaWNOYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgYXNDb2xsZWN0b3IoQ2xhc3M8Pz4gYXJyYXlUeXBlLCBpbnQgYXJyYXlMZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChpbnRyaW5zaWNOYW1lID09IEludHJpbnNpYy5JREVOVElUWSkgeworICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUgcmVzdWx0VHlwZSA9IHR5cGUoKS5hc0NvbGxlY3RvclR5cGUoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7CisgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG5ld0FycmF5ID0gTWV0aG9kSGFuZGxlSW1wbC52YXJhcmdzQXJyYXkoYXJyYXlUeXBlLCBhcnJheUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0FycmF5LmFzVHlwZShyZXN1bHRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5hc0NvbGxlY3RvcihhcnJheVR5cGUsIGFycmF5TGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBNZXRob2RIYW5kbGUgbWFrZUludHJpbnNpYyhNZXRob2RIYW5kbGUgdGFyZ2V0LCBJbnRyaW5zaWMgaW50cmluc2ljTmFtZSkgeworICAgICAgICBpZiAoaW50cmluc2ljTmFtZSA9PSB0YXJnZXQuaW50cmluc2ljTmFtZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRyaW5zaWNNZXRob2RIYW5kbGUodGFyZ2V0LCBpbnRyaW5zaWNOYW1lKTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWV0aG9kSGFuZGxlIG1ha2VJbnRyaW5zaWMoTWV0aG9kVHlwZSB0eXBlLCBMYW1iZGFGb3JtIGZvcm0sIEludHJpbnNpYyBpbnRyaW5zaWNOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50cmluc2ljTWV0aG9kSGFuZGxlKFNpbXBsZU1ldGhvZEhhbmRsZS5tYWtlKHR5cGUsIGZvcm0pLCBpbnRyaW5zaWNOYW1lKTsKKyAgICB9CisKKyAgICAvLy8gQ29sbGVjdGlvbiBvZiBtdWx0aXBsZSBhcmd1bWVudHMuCisKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RIYW5kbGUgZmluZENvbGxlY3RvcihTdHJpbmcgbmFtZSwgaW50IG5hcmdzLCBDbGFzczw/PiBydHlwZSwgQ2xhc3M8Pz4uLi4gcHR5cGVzKSB7CisgICAgICAgIE1ldGhvZFR5cGUgdHlwZSA9IE1ldGhvZFR5cGUuZ2VuZXJpY01ldGhvZFR5cGUobmFyZ3MpCisgICAgICAgICAgICAgICAgLmNoYW5nZVJldHVyblR5cGUocnR5cGUpCisgICAgICAgICAgICAgICAgLmluc2VydFBhcmFtZXRlclR5cGVzKDAsIHB0eXBlcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSU1QTF9MT09LVVAuZmluZFN0YXRpYyhNZXRob2RIYW5kbGVJbXBsLmNsYXNzLCBuYW1lLCB0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBOT19BUkdTX0FSUkFZID0ge307CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gbWFrZUFycmF5KE9iamVjdC4uLiBhcmdzKSB7IHJldHVybiBhcmdzOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoKSB7IHJldHVybiBOT19BUkdTX0FSUkFZOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCk7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBhcnJheShPYmplY3QgYTAsIE9iamVjdCBhMSkKKyAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTAsIGExKTsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUFycmF5KGEwLCBhMSwgYTIpOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCwgYTEsIGEyLCBhMyk7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBhcnJheShPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0KQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCwgYTEsIGEyLCBhMywgYTQpOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1KQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQsIE9iamVjdCBhNSwgT2JqZWN0IGE2KQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBhcnJheShPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LCBPYmplY3QgYTUsIE9iamVjdCBhNiwgT2JqZWN0IGE3KQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYsIE9iamVjdCBhNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTgpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUFycmF5KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYsIE9iamVjdCBhNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTgsIE9iamVjdCBhOSkKKyAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlW10gbWFrZUFycmF5cygpIHsKKyAgICAgICAgQXJyYXlMaXN0PE1ldGhvZEhhbmRsZT4gbWhzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGZpbmRDb2xsZWN0b3IoImFycmF5IiwgbWhzLnNpemUoKSwgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgaWYgKG1oID09IG51bGwpICBicmVhazsKKyAgICAgICAgICAgIG1oID0gbWFrZUludHJpbnNpYyhtaCwgSW50cmluc2ljLk5FV19BUlJBWSk7CisgICAgICAgICAgICBtaHMuYWRkKG1oKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQobWhzLnNpemUoKSA9PSAxMSk7ICAvLyBjdXJyZW50IG51bWJlciBvZiBtZXRob2RzCisgICAgICAgIHJldHVybiBtaHMudG9BcnJheShuZXcgTWV0aG9kSGFuZGxlW01BWF9BUklUWSsxXSk7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZVtdIEFSUkFZUyA9IG1ha2VBcnJheXMoKTsKKworICAgIC8vIGZpbGxpbmcgdmVyc2lvbnMgb2YgdGhlIGFib3ZlOgorICAgIC8vIHVzaW5nIEludGVnZXIgbGVuIGluc3RlYWQgb2YgaW50IGxlbiBhbmQgbm8gdmFyYXJncyB0byBhdm9pZCBib290c3RyYXBwaW5nIHByb2JsZW1zCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbE5ld0FycmF5KEludGVnZXIgbGVuLCBPYmplY3RbXSAvKm5vdCAuLi4qLyBhcmdzKSB7CisgICAgICAgIE9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W2xlbl07CisgICAgICAgIGZpbGxXaXRoQXJndW1lbnRzKGEsIDAsIGFyZ3MpOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbE5ld1R5cGVkQXJyYXkoT2JqZWN0W10gZXhhbXBsZSwgSW50ZWdlciBsZW4sIE9iamVjdFtdIC8qbm90IC4uLiovIGFyZ3MpIHsKKyAgICAgICAgT2JqZWN0W10gYSA9IEFycmF5cy5jb3B5T2YoZXhhbXBsZSwgbGVuKTsKKyAgICAgICAgYXNzZXJ0KGEuZ2V0Q2xhc3MoKSAhPSBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgIGZpbGxXaXRoQXJndW1lbnRzKGEsIDAsIGFyZ3MpOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsV2l0aEFyZ3VtZW50cyhPYmplY3RbXSBhLCBpbnQgcG9zLCBPYmplY3QuLi4gYXJncykgeworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIGEsIHBvcywgYXJncy5sZW5ndGgpOworICAgIH0KKyAgICAvLyB1c2luZyBJbnRlZ2VyIHBvcyBpbnN0ZWFkIG9mIGludCBwb3MgdG8gYXZvaWQgYm9vdHN0cmFwcGluZyBwcm9ibGVtcworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGZpbGxBcnJheShJbnRlZ2VyIHBvcywgT2JqZWN0W10gYSwgT2JqZWN0IGEwKQorICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCk7IHJldHVybiBhOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTAsIE9iamVjdCBhMSkKKyAgICAgICAgICAgICAgICB7IGZpbGxXaXRoQXJndW1lbnRzKGEsIHBvcywgYTAsIGExKTsgcmV0dXJuIGE7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaWxsQXJyYXkoSW50ZWdlciBwb3MsIE9iamVjdFtdIGEsIE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIpCisgICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwLCBhMSwgYTIpOyByZXR1cm4gYTsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGZpbGxBcnJheShJbnRlZ2VyIHBvcywgT2JqZWN0W10gYSwgT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzKQorICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCwgYTEsIGEyLCBhMyk7IHJldHVybiBhOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0KQorICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCwgYTEsIGEyLCBhMywgYTQpOyByZXR1cm4gYTsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGZpbGxBcnJheShJbnRlZ2VyIHBvcywgT2JqZWN0W10gYSwgT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1KQorICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsgcmV0dXJuIGE7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaWxsQXJyYXkoSW50ZWdlciBwb3MsIE9iamVjdFtdIGEsIE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQsIE9iamVjdCBhNSwgT2JqZWN0IGE2KQorICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7IHJldHVybiBhOyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LCBPYmplY3QgYTUsIE9iamVjdCBhNiwgT2JqZWN0IGE3KQorICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOyByZXR1cm4gYTsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGZpbGxBcnJheShJbnRlZ2VyIHBvcywgT2JqZWN0W10gYSwgT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYsIE9iamVjdCBhNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTgpCisgICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOyByZXR1cm4gYTsgfQorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGZpbGxBcnJheShJbnRlZ2VyIHBvcywgT2JqZWN0W10gYSwgT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYsIE9iamVjdCBhNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTgsIE9iamVjdCBhOSkKKyAgICAgICAgICAgICAgICB7IGZpbGxXaXRoQXJndW1lbnRzKGEsIHBvcywgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOyByZXR1cm4gYTsgfQorICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZVtdIG1ha2VGaWxsQXJyYXlzKCkgeworICAgICAgICBBcnJheUxpc3Q8TWV0aG9kSGFuZGxlPiBtaHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbWhzLmFkZChudWxsKTsgIC8vIHRoZXJlIGlzIG5vIGVtcHR5IGZpbGw7IGF0IGxlYXN0IGEwIGlzIHJlcXVpcmVkCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGZpbmRDb2xsZWN0b3IoImZpbGxBcnJheSIsIG1ocy5zaXplKCksIE9iamVjdFtdLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICBpZiAobWggPT0gbnVsbCkgIGJyZWFrOworICAgICAgICAgICAgbWhzLmFkZChtaCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KG1ocy5zaXplKCkgPT0gMTEpOyAgLy8gY3VycmVudCBudW1iZXIgb2YgbWV0aG9kcworICAgICAgICByZXR1cm4gbWhzLnRvQXJyYXkobmV3IE1ldGhvZEhhbmRsZVswXSk7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZVtdIEZJTExfQVJSQVlTID0gbWFrZUZpbGxBcnJheXMoKTsKKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjb3B5QXNQcmltaXRpdmVBcnJheShXcmFwcGVyIHcsIE9iamVjdC4uLiBib3hlcykgeworICAgICAgICBPYmplY3QgYSA9IHcubWFrZUFycmF5KGJveGVzLmxlbmd0aCk7CisgICAgICAgIHcuY29weUFycmF5VW5ib3hpbmcoYm94ZXMsIDAsIGEsIDAsIGJveGVzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gYSBtZXRob2QgaGFuZGxlIHRoYXQgdGFrZXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YgT2JqZWN0CisgICAgICogIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhbiBPYmplY3QgYXJyYXkgb2YgdGhlbSwgYXMgaWYgZm9yIHZhcmFyZ3MuCisgICAgICovCisgICAgc3RhdGljIE1ldGhvZEhhbmRsZSB2YXJhcmdzQXJyYXkoaW50IG5hcmdzKSB7CisgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IEFSUkFZU1tuYXJnc107CisgICAgICAgIGlmIChtaCAhPSBudWxsKSAgcmV0dXJuIG1oOworICAgICAgICBtaCA9IGZpbmRDb2xsZWN0b3IoImFycmF5IiwgbmFyZ3MsIE9iamVjdFtdLmNsYXNzKTsKKyAgICAgICAgaWYgKG1oICE9IG51bGwpICBtaCA9IG1ha2VJbnRyaW5zaWMobWgsIEludHJpbnNpYy5ORVdfQVJSQVkpOworICAgICAgICBpZiAobWggIT0gbnVsbCkgIHJldHVybiBBUlJBWVNbbmFyZ3NdID0gbWg7CisgICAgICAgIG1oID0gYnVpbGRWYXJhcmdzQXJyYXkoTGF6eS5NSF9maWxsTmV3QXJyYXksIExhenkuTUhfYXJyYXlJZGVudGl0eSwgbmFyZ3MpOworICAgICAgICBhc3NlcnQoYXNzZXJ0Q29ycmVjdEFyaXR5KG1oLCBuYXJncykpOworICAgICAgICBtaCA9IG1ha2VJbnRyaW5zaWMobWgsIEludHJpbnNpYy5ORVdfQVJSQVkpOworICAgICAgICByZXR1cm4gQVJSQVlTW25hcmdzXSA9IG1oOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXNzZXJ0Q29ycmVjdEFyaXR5KE1ldGhvZEhhbmRsZSBtaCwgaW50IGFyaXR5KSB7CisgICAgICAgIGFzc2VydChtaC50eXBlKCkucGFyYW1ldGVyQ291bnQoKSA9PSBhcml0eSkgOiAiYXJpdHkgIT0gIithcml0eSsiOiAiK21oOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBcnJheSBpZGVudGl0eSBmdW5jdGlvbiAodXNlZCBhcyBMYXp5Lk1IX2FycmF5SWRlbnRpdHkpLgorICAgIHN0YXRpYyA8VD4gVFtdIGlkZW50aXR5KFRbXSB4KSB7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBidWlsZFZhcmFyZ3NBcnJheShNZXRob2RIYW5kbGUgbmV3QXJyYXksIE1ldGhvZEhhbmRsZSBmaW5pc2hlciwgaW50IG5hcmdzKSB7CisgICAgICAgIC8vIEJ1aWxkIHVwIHRoZSByZXN1bHQgbWggYXMgYSBzZXF1ZW5jZSBvZiBmaWxscyBsaWtlIHRoaXM6CisgICAgICAgIC8vICAgZmluaXNoZXIoZmlsbChmaWxsKG5ld0FycmF5V0EoMjMseDEuLngxMCksMTAseDExLi54MjApLDIwLHgyMS4ueDIzKSkKKyAgICAgICAgLy8gVGhlIHZhcmlvdXMgZmlsbChfLDEwKkksX19fKltKXSkgYXJlIHJldXNhYmxlLgorICAgICAgICBpbnQgbGVmdExlbiA9IE1hdGgubWluKG5hcmdzLCBMRUZUX0FSR1MpOyAgLy8gYWJzb3JiIHNvbWUgYXJndW1lbnRzIGltbWVkaWF0ZWx5CisgICAgICAgIGludCByaWdodExlbiA9IG5hcmdzIC0gbGVmdExlbjsKKyAgICAgICAgTWV0aG9kSGFuZGxlIGxlZnRDb2xsZWN0b3IgPSBuZXdBcnJheS5iaW5kVG8obmFyZ3MpOworICAgICAgICBsZWZ0Q29sbGVjdG9yID0gbGVmdENvbGxlY3Rvci5hc0NvbGxlY3RvcihPYmplY3RbXS5jbGFzcywgbGVmdExlbik7CisgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGZpbmlzaGVyOworICAgICAgICBpZiAocmlnaHRMZW4gPiAwKSB7CisgICAgICAgICAgICBNZXRob2RIYW5kbGUgcmlnaHRGaWxsZXIgPSBmaWxsVG9SaWdodChMRUZUX0FSR1MgKyByaWdodExlbik7CisgICAgICAgICAgICBpZiAobWggPT0gTGF6eS5NSF9hcnJheUlkZW50aXR5KQorICAgICAgICAgICAgICAgIG1oID0gcmlnaHRGaWxsZXI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWggPSBNZXRob2RIYW5kbGVzLmNvbGxlY3RBcmd1bWVudHMobWgsIDAsIHJpZ2h0RmlsbGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWggPT0gTGF6eS5NSF9hcnJheUlkZW50aXR5KQorICAgICAgICAgICAgbWggPSBsZWZ0Q29sbGVjdG9yOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtaCA9IE1ldGhvZEhhbmRsZXMuY29sbGVjdEFyZ3VtZW50cyhtaCwgMCwgbGVmdENvbGxlY3Rvcik7CisgICAgICAgIHJldHVybiBtaDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9BUkdTID0gKEZJTExfQVJSQVlTLmxlbmd0aCAtIDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZVtdIEZJTExfQVJSQVlfVE9fUklHSFQgPSBuZXcgTWV0aG9kSGFuZGxlW01BWF9BUklUWSsxXTsKKyAgICAvKiogZmlsbF9hcnJheV90b19yaWdodChOKS5pbnZva2UoYSwgYXJnTC4uYXJnW04tMV0pCisgICAgICogIGZpbGxzIGFbTF0uLmFbTi0xXSB3aXRoIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzLAorICAgICAqICBhbmQgdGhlbiByZXR1cm5zIGEuICBUaGUgdmFsdWUgTCBpcyBhIGdsb2JhbCBjb25zdGFudCAoTEVGVF9BUkdTKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RIYW5kbGUgZmlsbFRvUmlnaHQoaW50IG5hcmdzKSB7CisgICAgICAgIE1ldGhvZEhhbmRsZSBmaWxsZXIgPSBGSUxMX0FSUkFZX1RPX1JJR0hUW25hcmdzXTsKKyAgICAgICAgaWYgKGZpbGxlciAhPSBudWxsKSAgcmV0dXJuIGZpbGxlcjsKKyAgICAgICAgZmlsbGVyID0gYnVpbGRGaWxsZXIobmFyZ3MpOworICAgICAgICBhc3NlcnQoYXNzZXJ0Q29ycmVjdEFyaXR5KGZpbGxlciwgbmFyZ3MgLSBMRUZUX0FSR1MgKyAxKSk7CisgICAgICAgIHJldHVybiBGSUxMX0FSUkFZX1RPX1JJR0hUW25hcmdzXSA9IGZpbGxlcjsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIGJ1aWxkRmlsbGVyKGludCBuYXJncykgeworICAgICAgICBpZiAobmFyZ3MgPD0gTEVGVF9BUkdTKQorICAgICAgICAgICAgcmV0dXJuIExhenkuTUhfYXJyYXlJZGVudGl0eTsgIC8vIG5vIGFyZ3MgdG8gZmlsbDsgcmV0dXJuIHRoZSBhcnJheSB1bmNoYW5nZWQKKyAgICAgICAgLy8gd2UgbmVlZCByb29tIGZvciBib3RoIG1oIGFuZCBhIGluIG1oLmludm9rZShhLCBhcmcqW25hcmdzXSkKKyAgICAgICAgZmluYWwgaW50IENIVU5LID0gTEVGVF9BUkdTOworICAgICAgICBpbnQgcmlnaHRMZW4gPSBuYXJncyAlIENIVU5LOworICAgICAgICBpbnQgbWlkTGVuID0gbmFyZ3MgLSByaWdodExlbjsKKyAgICAgICAgaWYgKHJpZ2h0TGVuID09IDApIHsKKyAgICAgICAgICAgIG1pZExlbiA9IG5hcmdzIC0gKHJpZ2h0TGVuID0gQ0hVTkspOworICAgICAgICAgICAgaWYgKEZJTExfQVJSQVlfVE9fUklHSFRbbWlkTGVuXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gYnVpbGQgc29tZSBwcmVjdXJzb3JzIGZyb20gbGVmdCB0byByaWdodAorICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBMRUZUX0FSR1MgJSBDSFVOSzsgaiA8IG1pZExlbjsgaiArPSBDSFVOSykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPiBMRUZUX0FSR1MpICBmaWxsVG9SaWdodChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWlkTGVuIDwgTEVGVF9BUkdTKSByaWdodExlbiA9IG5hcmdzIC0gKG1pZExlbiA9IExFRlRfQVJHUyk7CisgICAgICAgIGFzc2VydChyaWdodExlbiA+IDApOworICAgICAgICBNZXRob2RIYW5kbGUgbWlkRmlsbCA9IGZpbGxUb1JpZ2h0KG1pZExlbik7ICAvLyByZWN1cnNpdmUgZmlsbAorICAgICAgICBNZXRob2RIYW5kbGUgcmlnaHRGaWxsID0gRklMTF9BUlJBWVNbcmlnaHRMZW5dLmJpbmRUbyhtaWRMZW4pOyAgLy8gW21pZExlbi4ubmFyZ3MtMV0KKyAgICAgICAgYXNzZXJ0KG1pZEZpbGwudHlwZSgpLnBhcmFtZXRlckNvdW50KCkgICA9PSAxICsgbWlkTGVuIC0gTEVGVF9BUkdTKTsKKyAgICAgICAgYXNzZXJ0KHJpZ2h0RmlsbC50eXBlKCkucGFyYW1ldGVyQ291bnQoKSA9PSAxICsgcmlnaHRMZW4pOworCisgICAgICAgIC8vIENvbWJpbmUgdGhlIHR3byBmaWxsczoKKyAgICAgICAgLy8gICByaWdodChtaWQoYSwgeDEwLi54MTkpLCB4MjAuLngyMykKKyAgICAgICAgLy8gVGhlIGZpbmFsIHByb2R1Y3Qgd2lsbCBsb29rIGxpa2UgdGhpczoKKyAgICAgICAgLy8gICByaWdodChtaWQobmV3QXJyYXlMZWZ0KDI0LCB4MC4ueDkpLCB4MTAuLngxOSksIHgyMC4ueDIzKQorICAgICAgICBpZiAobWlkTGVuID09IExFRlRfQVJHUykKKyAgICAgICAgICAgIHJldHVybiByaWdodEZpbGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVzLmNvbGxlY3RBcmd1bWVudHMocmlnaHRGaWxsLCAwLCBtaWRGaWxsKTsKKyAgICB9CisKKyAgICAvLyBUeXBlLXBvbHltb3JwaGljIHZlcnNpb24gb2YgdmFyYXJncyBtYWtlci4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1ZhbHVlPE1ldGhvZEhhbmRsZVtdPiBUWVBFRF9DT0xMRUNUT1JTCisgICAgICAgID0gbmV3IENsYXNzVmFsdWU8TWV0aG9kSGFuZGxlW10+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTWV0aG9kSGFuZGxlW10gY29tcHV0ZVZhbHVlKENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEhhbmRsZVsyNTZdOworICAgICAgICAgICAgfQorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9KVk1fQVJJVFkgPSAyNTU7ICAvLyBsaW1pdCBpbXBvc2VkIGJ5IHRoZSBKVk0KKworICAgIC8qKiBSZXR1cm4gYSBtZXRob2QgaGFuZGxlIHRoYXQgdGFrZXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YKKyAgICAgKiAgdHlwZWQgYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZW0uCisgICAgICogIFRoZSB0eXBlIGFyZ3VtZW50IGlzIHRoZSBhcnJheSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBNZXRob2RIYW5kbGUgdmFyYXJnc0FycmF5KENsYXNzPD8+IGFycmF5VHlwZSwgaW50IG5hcmdzKSB7CisgICAgICAgIENsYXNzPD8+IGVsZW1UeXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgaWYgKGVsZW1UeXBlID09IG51bGwpICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3QgYW4gYXJyYXk6ICIrYXJyYXlUeXBlKTsKKyAgICAgICAgLy8gRklYTUU6IE5lZWQgbW9yZSBzcGVjaWFsIGNhc2luZyBhbmQgY2FjaGluZyBoZXJlLgorICAgICAgICBpZiAobmFyZ3MgPj0gTUFYX0pWTV9BUklUWS8yIC0gMSkgeworICAgICAgICAgICAgaW50IHNsb3RzID0gbmFyZ3M7CisgICAgICAgICAgICBmaW5hbCBpbnQgTUFYX0FSUkFZX1NMT1RTID0gTUFYX0pWTV9BUklUWSAtIDE7ICAvLyAxIGZvciByZWNlaXZlciBNSAorICAgICAgICAgICAgaWYgKHNsb3RzIDw9IE1BWF9BUlJBWV9TTE9UUyAmJiBlbGVtVHlwZS5pc1ByaW1pdGl2ZSgpKQorICAgICAgICAgICAgICAgIHNsb3RzICo9IFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZShlbGVtVHlwZSkuc3RhY2tTbG90cygpOworICAgICAgICAgICAgaWYgKHNsb3RzID4gTUFYX0FSUkFZX1NMT1RTKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRvbyBtYW55IGFyZ3VtZW50czogIithcnJheVR5cGUuZ2V0U2ltcGxlTmFtZSgpKyIsIGxlbmd0aCAiK25hcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbVR5cGUgPT0gT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIHZhcmFyZ3NBcnJheShuYXJncyk7CisgICAgICAgIC8vIG90aGVyIGNhc2VzOiAgcHJpbWl0aXZlIGFycmF5cywgc3VidHlwZXMgb2YgT2JqZWN0W10KKyAgICAgICAgTWV0aG9kSGFuZGxlIGNhY2hlW10gPSBUWVBFRF9DT0xMRUNUT1JTLmdldChlbGVtVHlwZSk7CisgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IG5hcmdzIDwgY2FjaGUubGVuZ3RoID8gY2FjaGVbbmFyZ3NdIDogbnVsbDsKKyAgICAgICAgaWYgKG1oICE9IG51bGwpICByZXR1cm4gbWg7CisgICAgICAgIGlmIChuYXJncyA9PSAwKSB7CisgICAgICAgICAgICBPYmplY3QgZXhhbXBsZSA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCksIDApOworICAgICAgICAgICAgbWggPSBNZXRob2RIYW5kbGVzLmNvbnN0YW50KGFycmF5VHlwZSwgZXhhbXBsZSk7CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGJ1aWxkZXIgPSBMYXp5Lk1IX2ZpbGxOZXdBcnJheTsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBwcm9kdWNlciA9IGJ1aWxkQXJyYXlQcm9kdWNlcihhcnJheVR5cGUpOworICAgICAgICAgICAgbWggPSBidWlsZFZhcmFyZ3NBcnJheShidWlsZGVyLCBwcm9kdWNlciwgbmFyZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE9iamVjdFtdPiBvYmpBcnJheVR5cGUgPSBhcnJheVR5cGUuYXNTdWJjbGFzcyhPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICBPYmplY3RbXSBleGFtcGxlID0gQXJyYXlzLmNvcHlPZihOT19BUkdTX0FSUkFZLCAwLCBvYmpBcnJheVR5cGUpOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGJ1aWxkZXIgPSBMYXp5Lk1IX2ZpbGxOZXdUeXBlZEFycmF5LmJpbmRUbyhleGFtcGxlKTsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBwcm9kdWNlciA9IExhenkuTUhfYXJyYXlJZGVudGl0eTsgLy8gbXVzdCBiZSB3ZWFrbHkgdHlwZWQKKyAgICAgICAgICAgIG1oID0gYnVpbGRWYXJhcmdzQXJyYXkoYnVpbGRlciwgcHJvZHVjZXIsIG5hcmdzKTsKKyAgICAgICAgfQorICAgICAgICBtaCA9IG1oLmFzVHlwZShNZXRob2RUeXBlLm1ldGhvZFR5cGUoYXJyYXlUeXBlLCBDb2xsZWN0aW9ucy48Q2xhc3M8Pz4+bkNvcGllcyhuYXJncywgZWxlbVR5cGUpKSk7CisgICAgICAgIG1oID0gbWFrZUludHJpbnNpYyhtaCwgSW50cmluc2ljLk5FV19BUlJBWSk7CisgICAgICAgIGFzc2VydChhc3NlcnRDb3JyZWN0QXJpdHkobWgsIG5hcmdzKSk7CisgICAgICAgIGlmIChuYXJncyA8IGNhY2hlLmxlbmd0aCkKKyAgICAgICAgICAgIGNhY2hlW25hcmdzXSA9IG1oOworICAgICAgICByZXR1cm4gbWg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIGJ1aWxkQXJyYXlQcm9kdWNlcihDbGFzczw/PiBhcnJheVR5cGUpIHsKKyAgICAgICAgQ2xhc3M8Pz4gZWxlbVR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICBhc3NlcnQoZWxlbVR5cGUuaXNQcmltaXRpdmUoKSk7CisgICAgICAgIHJldHVybiBMYXp5Lk1IX2NvcHlBc1ByaW1pdGl2ZUFycmF5LmJpbmRUbyhXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUoZWxlbVR5cGUpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZU5hdGl2ZXMuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlTmF0aXZlcy5qYXZhCmluZGV4IGZkNWNhYzguLjBmNTE2OWUgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlTmF0aXZlcy5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlTmF0aXZlcy5qYXZhCkBAIC03OCw3ICs3OCw3IEBACiAKICAgICAgICAgLy8gVGhlIEpWTSBjYWxscyBNZXRob2RIYW5kbGVOYXRpdmVzLjxjbGluaXQ+LiAgQ2FzY2FkZSB0aGUgPGNsaW5pdD4gY2FsbHMgYXMgbmVlZGVkOgogICAgICAgICBNZXRob2RIYW5kbGVJbXBsLmluaXRTdGF0aWNzKCk7Ci19CisgICAgfQogCiAgICAgLy8gQWxsIGNvbXBpbGUtdGltZSBjb25zdGFudHMgZ28gaGVyZS4KICAgICAvLyBUaGVyZSBpcyBhbiBvcHBvcnR1bml0eSB0byBjaGVjayB0aGVtIGFnYWluc3QgdGhlIEpWTSdzIGlkZWEgb2YgdGhlbS4KQEAgLTI5Myw2ICsyOTMsMTcgQEAKICAgICAgICAgQ2xhc3M8Pz4gY2FsbGVyID0gKENsYXNzPD8+KWNhbGxlck9iajsKICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lT2JqLnRvU3RyaW5nKCkuaW50ZXJuKCk7CiAgICAgICAgIE1ldGhvZFR5cGUgdHlwZSA9IChNZXRob2RUeXBlKXR5cGVPYmo7CisgICAgICAgIGlmICghVFJBQ0VfTUVUSE9EX0xJTktBR0UpCisgICAgICAgICAgICByZXR1cm4gbGlua0NhbGxTaXRlSW1wbChjYWxsZXIsIGJvb3RzdHJhcE1ldGhvZCwgbmFtZSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0FyZ3VtZW50cywgYXBwZW5kaXhSZXN1bHQpOworICAgICAgICByZXR1cm4gbGlua0NhbGxTaXRlVHJhY2luZyhjYWxsZXIsIGJvb3RzdHJhcE1ldGhvZCwgbmFtZSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQXJndW1lbnRzLCBhcHBlbmRpeFJlc3VsdCk7CisgICAgfQorICAgIHN0YXRpYyBNZW1iZXJOYW1lIGxpbmtDYWxsU2l0ZUltcGwoQ2xhc3M8Pz4gY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGJvb3RzdHJhcE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBNZXRob2RUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3RhdGljQXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXBwZW5kaXhSZXN1bHQpIHsKICAgICAgICAgQ2FsbFNpdGUgY2FsbFNpdGUgPSBDYWxsU2l0ZS5tYWtlU2l0ZShib290c3RyYXBNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLApAQCAtMzA2LDYgKzMxNywzMCBAQAogICAgICAgICAgICAgcmV0dXJuIEludm9rZXJzLmxpbmtUb0NhbGxTaXRlTWV0aG9kKHR5cGUpOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIFRyYWNpbmcgbG9naWM6CisgICAgc3RhdGljIE1lbWJlck5hbWUgbGlua0NhbGxTaXRlVHJhY2luZyhDbGFzczw/PiBjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgYm9vdHN0cmFwTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIE1ldGhvZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzdGF0aWNBcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcHBlbmRpeFJlc3VsdCkgeworICAgICAgICBPYmplY3QgYnNtUmVmZXJlbmNlID0gYm9vdHN0cmFwTWV0aG9kLmludGVybmFsTWVtYmVyTmFtZSgpOworICAgICAgICBpZiAoYnNtUmVmZXJlbmNlID09IG51bGwpICBic21SZWZlcmVuY2UgPSBib290c3RyYXBNZXRob2Q7CisgICAgICAgIE9iamVjdCBzdGF0aWNBcmdsaXN0ID0gKHN0YXRpY0FyZ3VtZW50cyBpbnN0YW5jZW9mIE9iamVjdFtdID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5hc0xpc3QoKE9iamVjdFtdKSBzdGF0aWNBcmd1bWVudHMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQXJndW1lbnRzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJsaW5rQ2FsbFNpdGUgIitjYWxsZXIuZ2V0TmFtZSgpKyIgIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzbVJlZmVyZW5jZSsiICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lK3R5cGUrIi8iK3N0YXRpY0FyZ2xpc3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVtYmVyTmFtZSByZXMgPSBsaW5rQ2FsbFNpdGVJbXBsKGNhbGxlciwgYm9vdHN0cmFwTWV0aG9kLCBuYW1lLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0FyZ3VtZW50cywgYXBwZW5kaXhSZXN1bHQpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJsaW5rQ2FsbFNpdGUgPT4gIityZXMrIiArICIrYXBwZW5kaXhSZXN1bHRbMF0pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxpbmtDYWxsU2l0ZSA9PiB0aHJvdyAiK2V4KTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhlIEpWTSB3YW50cyBhIHBvaW50ZXIgdG8gYSBNZXRob2RUeXBlLiAgT2JsaWdlIGl0IGJ5IGZpbmRpbmcgb3IgY3JlYXRpbmcgb25lLgpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVQcm94aWVzLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZVByb3hpZXMuamF2YQppbmRleCA4ZDVlZTJjLi5kNTQ5YjYzIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZVByb3hpZXMuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZVByb3hpZXMuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IHN1bi5yZWZsZWN0LkNhbGxlclNlbnNpdGl2ZTsKIGltcG9ydCBzdW4ucmVmbGVjdC5SZWZsZWN0aW9uOwogaW1wb3J0IHN1bi5yZWZsZWN0Lm1pc2MuUmVmbGVjdFV0aWw7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlU3RhdGljcy4qOwogCiAvKioKICAqIFRoaXMgY2xhc3MgY29uc2lzdHMgZXhjbHVzaXZlbHkgb2Ygc3RhdGljIG1ldGhvZHMgdGhhdCBoZWxwIGFkYXB0CkBAIC0xNDgsNyArMTQ5LDcgQEAKICAgICBwdWJsaWMgc3RhdGljCiAgICAgPFQ+IFQgYXNJbnRlcmZhY2VJbnN0YW5jZShmaW5hbCBDbGFzczxUPiBpbnRmYywgZmluYWwgTWV0aG9kSGFuZGxlIHRhcmdldCkgewogICAgICAgICBpZiAoIWludGZjLmlzSW50ZXJmYWNlKCkgfHwgIU1vZGlmaWVyLmlzUHVibGljKGludGZjLmdldE1vZGlmaWVycygpKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdCBhIHB1YmxpYyBpbnRlcmZhY2U6ICIraW50ZmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGEgcHVibGljIGludGVyZmFjZSIsIGludGZjLmdldE5hbWUoKSk7CiAgICAgICAgIGZpbmFsIE1ldGhvZEhhbmRsZSBtaDsKICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjYWxsZXIgPSBSZWZsZWN0aW9uLmdldENhbGxlckNsYXNzKCk7CkBAIC0xNjUsNyArMTY2LDcgQEAKICAgICAgICAgfQogICAgICAgICBmaW5hbCBNZXRob2RbXSBtZXRob2RzID0gZ2V0U2luZ2xlTmFtZU1ldGhvZHMoaW50ZmMpOwogICAgICAgICBpZiAobWV0aG9kcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGEgc2luZ2xlLW1ldGhvZCBpbnRlcmZhY2U6ICIraW50ZmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGEgc2luZ2xlLW1ldGhvZCBpbnRlcmZhY2UiLCBpbnRmYy5nZXROYW1lKCkpOwogICAgICAgICBmaW5hbCBNZXRob2RIYW5kbGVbXSB2YVRhcmdldHMgPSBuZXcgTWV0aG9kSGFuZGxlW21ldGhvZHMubGVuZ3RoXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBNZXRob2Qgc20gPSBtZXRob2RzW2ldOwpAQCAtMTg5LDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXJnKG1ldGhvZC5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3RNZXRob2QobWV0aG9kKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsT2JqZWN0TWV0aG9kKHByb3h5LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiYmFkIHByb3h5IG1ldGhvZDogIittZXRob2QpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdJbnRlcm5hbEVycm9yKCJiYWQgcHJveHkgbWV0aG9kOiAiK21ldGhvZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKIApAQCAtMjQwLDcgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIChXcmFwcGVySW5zdGFuY2UpIHg7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewogICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdCBhIHdyYXBwZXIgaW5zdGFuY2UiKTsKKyAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3QgYSB3cmFwcGVyIGluc3RhbmNlIik7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZVN0YXRpY3MuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlU3RhdGljcy5qYXZhCmluZGV4IDhhOGVlZGYuLmMzZDlhYzEgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlU3RhdGljcy5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlU3RhdGljcy5qYXZhCkBAIC00NSwxNiArNDUsMjEgQEAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBEVU1QX0NMQVNTX0ZJTEVTOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0lOVEVSUFJFVEVSOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX01FVEhPRF9MSU5LQUdFOwotICAgIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENPTVBJTEVfVEhSRVNIT0xEOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9MQU1CREFfRk9STV9FRElUT1I7CisgICAgc3RhdGljIGZpbmFsIGludCBDT01QSUxFX1RIUkVTSE9MRDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfTEVWRUw7CisKICAgICBzdGF0aWMgewotICAgICAgICBmaW5hbCBPYmplY3RbXSB2YWx1ZXMgPSB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBudWxsIH07CisgICAgICAgIGZpbmFsIE9iamVjdFtdIHZhbHVlcyA9IHsgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsIH07CiAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+KCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gQm9vbGVhbi5nZXRCb29sZWFuKCJqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZS5ERUJVR19OQU1FUyIpOwogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gPSBCb29sZWFuLmdldEJvb2xlYW4oImphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlLkRVTVBfQ0xBU1NfRklMRVMiKTsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzWzJdID0gQm9vbGVhbi5nZXRCb29sZWFuKCJqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZS5UUkFDRV9JTlRFUlBSRVRFUiIpOwogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbM10gPSBCb29sZWFuLmdldEJvb2xlYW4oImphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlLlRSQUNFX01FVEhPRF9MSU5LQUdFIik7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc1s0XSA9IEludGVnZXIuZ2V0SW50ZWdlcigiamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGUuQ09NUElMRV9USFJFU0hPTEQiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzWzRdID0gQm9vbGVhbi5nZXRCb29sZWFuKCJqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZS5VU0VfTEZfRURJVE9SIik7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1s1XSA9IEludGVnZXIuZ2V0SW50ZWdlcigiamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGUuQ09NUElMRV9USFJFU0hPTEQiLCAzMCk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1s2XSA9IEludGVnZXIuZ2V0SW50ZWdlcigiamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGUuUFJPRklMRV9MRVZFTCIsIDApOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKQEAgLTYyLDcgKzY3LDE5IEBACiAgICAgICAgIERVTVBfQ0xBU1NfRklMRVMgICAgICAgICAgPSAoQm9vbGVhbikgdmFsdWVzWzFdOwogICAgICAgICBUUkFDRV9JTlRFUlBSRVRFUiAgICAgICAgID0gKEJvb2xlYW4pIHZhbHVlc1syXTsKICAgICAgICAgVFJBQ0VfTUVUSE9EX0xJTktBR0UgICAgICA9IChCb29sZWFuKSB2YWx1ZXNbM107Ci0gICAgICAgIENPTVBJTEVfVEhSRVNIT0xEICAgICAgICAgPSAoSW50ZWdlcikgdmFsdWVzWzRdOworICAgICAgICBVU0VfTEFNQkRBX0ZPUk1fRURJVE9SICAgID0gKEJvb2xlYW4pIHZhbHVlc1s0XTsKKyAgICAgICAgQ09NUElMRV9USFJFU0hPTEQgICAgICAgICA9IChJbnRlZ2VyKSB2YWx1ZXNbNV07CisgICAgICAgIFBST0ZJTEVfTEVWRUwgICAgICAgICAgICAgPSAoSW50ZWdlcikgdmFsdWVzWzZdOworICAgIH0KKworICAgIC8qKiBUZWxsIGlmIGFueSBvZiB0aGUgZGVidWdnaW5nIHN3aXRjaGVzIGFyZSB0dXJuZWQgb24uCisgICAgICogIElmIHRoaXMgaXMgdGhlIGNhc2UsIGl0IGlzIHJlYXNvbmFibGUgdG8gcGVyZm9ybSBleHRyYSBjaGVja3Mgb3Igc2F2ZSBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICAvKm5vbi1wdWJsaWMqLyBzdGF0aWMgYm9vbGVhbiBkZWJ1Z0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAoREVCVUdfTUVUSE9EX0hBTkRMRV9OQU1FUyB8CisgICAgICAgICAgICAgICAgRFVNUF9DTEFTU19GSUxFUyB8CisgICAgICAgICAgICAgICAgVFJBQ0VfSU5URVJQUkVURVIgfAorICAgICAgICAgICAgICAgIFRSQUNFX01FVEhPRF9MSU5LQUdFKTsKICAgICB9CiAKICAgICAvKm5vbi1wdWJsaWMqLyBzdGF0aWMgU3RyaW5nIGdldE5hbWVTdHJpbmcoTWV0aG9kSGFuZGxlIHRhcmdldCwgTWV0aG9kVHlwZSB0eXBlKSB7CkBAIC05Myw2ICsxMTAsOSBAQAogICAgIH0KIAogICAgIC8vIGhhbmR5IHNoYXJlZCBleGNlcHRpb24gbWFrZXJzICh0aGV5IHNpbXBsaWZ5IHRoZSBjb21tb24gY2FzZSBjb2RlKQorICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYyBJbnRlcm5hbEVycm9yIG5ld0ludGVybmFsRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKG1lc3NhZ2UpOworICAgIH0KICAgICAvKm5vbi1wdWJsaWMqLyBzdGF0aWMgSW50ZXJuYWxFcnJvciBuZXdJbnRlcm5hbEVycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CkBAIC0xMTQsNyArMTM0LDEwIEBACiAgICAgLypub24tcHVibGljKi8gc3RhdGljIFJ1bnRpbWVFeGNlcHRpb24gbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb2JqLCBPYmplY3Qgb2JqMikgewogICAgICAgICByZXR1cm4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKG1lc3NhZ2UsIG9iaiwgb2JqMikpOwogICAgIH0KKyAgICAvKiogUHJvcGFnYXRlIHVuY2hlY2tlZCBleGNlcHRpb25zIGFuZCBlcnJvcnMsIGJ1dCB3cmFwIGFueXRoaW5nIGNoZWNrZWQgYW5kIHRocm93IHRoYXQgaW5zdGVhZC4gKi8KICAgICAvKm5vbi1wdWJsaWMqLyBzdGF0aWMgRXJyb3IgdW5jYXVnaHRFeGNlcHRpb24oVGhyb3dhYmxlIGV4KSB7CisgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEVycm9yKSAgdGhyb3cgKEVycm9yKSBleDsKKyAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBleDsKICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcigidW5jYXVnaHQgZXhjZXB0aW9uIiwgZXgpOwogICAgIH0KICAgICBzdGF0aWMgRXJyb3IgTllJKCkgewpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMuamF2YQppbmRleCAwOTEwM2Q1Li42OGZmMzE3IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMuamF2YQpAQCAtMjYsOCArMjYsOCBAQAogcGFja2FnZSBqYXZhLmxhbmcuaW52b2tlOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogaW1wb3J0IHN1bi5pbnZva2UudXRpbC5WYWx1ZUNvbnZlcnNpb25zOwpAQCAtMzcsMTMgKzM3LDE0IEBACiBpbXBvcnQgc3VuLnJlZmxlY3QuUmVmbGVjdGlvbjsKIGltcG9ydCBzdW4ucmVmbGVjdC5taXNjLlJlZmxlY3RVdGlsOwogaW1wb3J0IHN1bi5zZWN1cml0eS51dGlsLlNlY3VyaXR5Q29uc3RhbnRzOworaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS5CYXNpY1R5cGU7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS5CYXNpY1R5cGUuKjsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVTdGF0aWNzLio7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlSW1wbC5JbnRyaW5zaWM7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlTmF0aXZlcy5Db25zdGFudHMuKjsKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogCi1pbXBvcnQgc3VuLnNlY3VyaXR5LnV0aWwuU2VjdXJpdHlDb25zdGFudHM7Ci0KIC8qKgogICogVGhpcyBjbGFzcyBjb25zaXN0cyBleGNsdXNpdmVseSBvZiBzdGF0aWMgbWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gb3IgcmV0dXJuCiAgKiBtZXRob2QgaGFuZGxlcy4gVGhleSBmYWxsIGludG8gc2V2ZXJhbCBjYXRlZ29yaWVzOgpAQCAtODYzLDYgKzg2NCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZXIodHlwZSk7CiAgICAgICAgICAgICBpZiAoImludm9rZUV4YWN0Ii5lcXVhbHMobmFtZSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGV4YWN0SW52b2tlcih0eXBlKTsKKyAgICAgICAgICAgIGlmICgiaW52b2tlQmFzaWMiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNJbnZva2VyKHR5cGUpOwogICAgICAgICAgICAgYXNzZXJ0KCFNZW1iZXJOYW1lLmlzTWV0aG9kSGFuZGxlSW52b2tlTmFtZShuYW1lKSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQpAQCAtMTE0Miw3ICsxMTQ1LDcgQEAKICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+IHJlZmMgPSByZWNlaXZlci5nZXRDbGFzcygpOyAvLyBtYXkgZ2V0IE5QRQogICAgICAgICAgICAgTWVtYmVyTmFtZSBtZXRob2QgPSByZXNvbHZlT3JGYWlsKFJFRl9pbnZva2VTcGVjaWFsLCByZWZjLCBuYW1lLCB0eXBlKTsKICAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGdldERpcmVjdE1ldGhvZE5vUmVzdHJpY3QoUkVGX2ludm9rZVNwZWNpYWwsIHJlZmMsIG1ldGhvZCwgZmluZEJvdW5kQ2FsbGVyQ2xhc3MobWV0aG9kKSk7Ci0gICAgICAgICAgICByZXR1cm4gbWguYmluZFJlY2VpdmVyKHJlY2VpdmVyKS5zZXRWYXJhcmdzKG1ldGhvZCk7CisgICAgICAgICAgICByZXR1cm4gbWguYmluZEFyZ3VtZW50TCgwLCByZWNlaXZlcikuc2V0VmFyYXJncyhtZXRob2QpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xNTc3LDcgKzE1ODAsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kSGFuZGxlIHJlc3RyaWN0UmVjZWl2ZXIoTWVtYmVyTmFtZSBtZXRob2QsIE1ldGhvZEhhbmRsZSBtaCwgQ2xhc3M8Pz4gY2FsbGVyKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIHByaXZhdGUgTWV0aG9kSGFuZGxlIHJlc3RyaWN0UmVjZWl2ZXIoTWVtYmVyTmFtZSBtZXRob2QsIERpcmVjdE1ldGhvZEhhbmRsZSBtaCwgQ2xhc3M8Pz4gY2FsbGVyKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBhc3NlcnQoIW1ldGhvZC5pc1N0YXRpYygpKTsKICAgICAgICAgICAgIC8vIHJlY2VpdmVyIHR5cGUgb2YgbWggaXMgdG9vIHdpZGU7IG5hcnJvdyB0byBjYWxsZXIKICAgICAgICAgICAgIGlmICghbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShjYWxsZXIpKSB7CkBAIC0xNTg2LDcgKzE1ODksOSBAQAogICAgICAgICAgICAgTWV0aG9kVHlwZSByYXdUeXBlID0gbWgudHlwZSgpOwogICAgICAgICAgICAgaWYgKHJhd1R5cGUucGFyYW1ldGVyVHlwZSgwKSA9PSBjYWxsZXIpICByZXR1cm4gbWg7CiAgICAgICAgICAgICBNZXRob2RUeXBlIG5hcnJvd1R5cGUgPSByYXdUeXBlLmNoYW5nZVBhcmFtZXRlclR5cGUoMCwgY2FsbGVyKTsKLSAgICAgICAgICAgIHJldHVybiBtaC52aWV3QXNUeXBlKG5hcnJvd1R5cGUpOworICAgICAgICAgICAgYXNzZXJ0KCFtaC5pc1ZhcmFyZ3NDb2xsZWN0b3IoKSk7ICAvLyB2aWV3QXNUeXBlIHdpbGwgbG9zZSB2YXJhcmdzLW5lc3MKKyAgICAgICAgICAgIGFzc2VydChtaC52aWV3QXNUeXBlQ2hlY2tzKG5hcnJvd1R5cGUsIHRydWUpKTsKKyAgICAgICAgICAgIHJldHVybiBtaC5jb3B5V2l0aChuYXJyb3dUeXBlLCBtaC5mb3JtKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKiBDaGVjayBhY2Nlc3MgYW5kIGdldCB0aGUgcmVxdWVzdGVkIG1ldGhvZC4gKi8KQEAgLTE2NDgsMTUgKzE2NTMsMTcgQEAKICAgICAgICAgICAgICAgICBjaGVja01ldGhvZChyZWZLaW5kLCByZWZjLCBtZXRob2QpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBEaXJlY3RNZXRob2RIYW5kbGUubWFrZShyZWZLaW5kLCByZWZjLCBtZXRob2QpOwotICAgICAgICAgICAgbWggPSBtYXliZUJpbmRDYWxsZXIobWV0aG9kLCBtaCwgY2FsbGVyQ2xhc3MpOwotICAgICAgICAgICAgbWggPSBtaC5zZXRWYXJhcmdzKG1ldGhvZCk7CisgICAgICAgICAgICBEaXJlY3RNZXRob2RIYW5kbGUgZG1oID0gRGlyZWN0TWV0aG9kSGFuZGxlLm1ha2UocmVmS2luZCwgcmVmYywgbWV0aG9kKTsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGRtaDsKICAgICAgICAgICAgIC8vIE9wdGlvbmFsbHkgbmFycm93IHRoZSByZWNlaXZlciBhcmd1bWVudCB0byByZWZjIHVzaW5nIHJlc3RyaWN0UmVjZWl2ZXIuCiAgICAgICAgICAgICBpZiAoZG9SZXN0cmljdCAmJgogICAgICAgICAgICAgICAgICAgIChyZWZLaW5kID09IFJFRl9pbnZva2VTcGVjaWFsIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChNZXRob2RIYW5kbGVOYXRpdmVzLnJlZktpbmRIYXNSZWNlaXZlcihyZWZLaW5kKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RQcm90ZWN0ZWRSZWNlaXZlcihtZXRob2QpKSkpCi0gICAgICAgICAgICAgICAgbWggPSByZXN0cmljdFJlY2VpdmVyKG1ldGhvZCwgbWgsIGxvb2t1cENsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RQcm90ZWN0ZWRSZWNlaXZlcihtZXRob2QpKSkpIHsKKyAgICAgICAgICAgICAgICBtaCA9IHJlc3RyaWN0UmVjZWl2ZXIobWV0aG9kLCBkbWgsIGxvb2t1cENsYXNzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWggPSBtYXliZUJpbmRDYWxsZXIobWV0aG9kLCBtaCwgY2FsbGVyQ2xhc3MpOworICAgICAgICAgICAgbWggPSBtaC5zZXRWYXJhcmdzKG1ldGhvZCk7CiAgICAgICAgICAgICByZXR1cm4gbWg7CiAgICAgICAgIH0KICAgICAgICAgcHJpdmF0ZSBNZXRob2RIYW5kbGUgbWF5YmVCaW5kQ2FsbGVyKE1lbWJlck5hbWUgbWV0aG9kLCBNZXRob2RIYW5kbGUgbWgsCkBAIC0xNjg4LDEyICsxNjk1LDEyIEBACiAgICAgICAgICAgICAvLyBPcHRpb25hbGx5IGNoZWNrIHdpdGggdGhlIHNlY3VyaXR5IG1hbmFnZXI7IHRoaXMgaXNuJ3QgbmVlZGVkIGZvciB1bnJlZmxlY3QqIGNhbGxzLgogICAgICAgICAgICAgaWYgKGNoZWNrU2VjdXJpdHkpCiAgICAgICAgICAgICAgICAgY2hlY2tTZWN1cml0eU1hbmFnZXIocmVmYywgZmllbGQpOwotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gRGlyZWN0TWV0aG9kSGFuZGxlLm1ha2UocmVmYywgZmllbGQpOworICAgICAgICAgICAgRGlyZWN0TWV0aG9kSGFuZGxlIGRtaCA9IERpcmVjdE1ldGhvZEhhbmRsZS5tYWtlKHJlZmMsIGZpZWxkKTsKICAgICAgICAgICAgIGJvb2xlYW4gZG9SZXN0cmljdCA9IChNZXRob2RIYW5kbGVOYXRpdmVzLnJlZktpbmRIYXNSZWNlaXZlcihyZWZLaW5kKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RQcm90ZWN0ZWRSZWNlaXZlcihmaWVsZCkpOwogICAgICAgICAgICAgaWYgKGRvUmVzdHJpY3QpCi0gICAgICAgICAgICAgICAgbWggPSByZXN0cmljdFJlY2VpdmVyKGZpZWxkLCBtaCwgbG9va3VwQ2xhc3MoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbWg7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3RyaWN0UmVjZWl2ZXIoZmllbGQsIGRtaCwgbG9va3VwQ2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gZG1oOwogICAgICAgICB9CiAgICAgICAgIC8qKiBDaGVjayBhY2Nlc3MgYW5kIGdldCB0aGUgcmVxdWVzdGVkIGNvbnN0cnVjdG9yLiAqLwogICAgICAgICBwcml2YXRlIE1ldGhvZEhhbmRsZSBnZXREaXJlY3RDb25zdHJ1Y3RvcihDbGFzczw/PiByZWZjLCBNZW1iZXJOYW1lIGN0b3IpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKQEAgLTE4ODAsNyArMTg4Nyw4IEBACiAgICAgc3RhdGljIHB1YmxpYwogICAgIE1ldGhvZEhhbmRsZSBzcHJlYWRJbnZva2VyKE1ldGhvZFR5cGUgdHlwZSwgaW50IGxlYWRpbmdBcmdDb3VudCkgewogICAgICAgICBpZiAobGVhZGluZ0FyZ0NvdW50IDwgMCB8fCBsZWFkaW5nQXJnQ291bnQgPiB0eXBlLnBhcmFtZXRlckNvdW50KCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgYXJndW1lbnQgY291bnQgIitsZWFkaW5nQXJnQ291bnQpOworICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgYXJndW1lbnQgY291bnQiLCBsZWFkaW5nQXJnQ291bnQpOworICAgICAgICB0eXBlID0gdHlwZS5hc1NwcmVhZGVyVHlwZShPYmplY3RbXS5jbGFzcywgdHlwZS5wYXJhbWV0ZXJDb3VudCgpIC0gbGVhZGluZ0FyZ0NvdW50KTsKICAgICAgICAgcmV0dXJuIHR5cGUuaW52b2tlcnMoKS5zcHJlYWRJbnZva2VyKGxlYWRpbmdBcmdDb3VudCk7CiAgICAgfQogCkBAIC0xOTYwLDEyICsxOTY4LDEyIEBACiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYwogICAgIE1ldGhvZEhhbmRsZSBpbnZva2VyKE1ldGhvZFR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gdHlwZS5pbnZva2VycygpLmdlbmVyYWxJbnZva2VyKCk7CisgICAgICAgIHJldHVybiB0eXBlLmludm9rZXJzKCkuZ2VuZXJpY0ludm9rZXIoKTsKICAgICB9CiAKICAgICBzdGF0aWMgLypub24tcHVibGljKi8KICAgICBNZXRob2RIYW5kbGUgYmFzaWNJbnZva2VyKE1ldGhvZFR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gdHlwZS5mb3JtKCkuYmFzaWNJbnZva2VyKCk7CisgICAgICAgIHJldHVybiB0eXBlLmludm9rZXJzKCkuYmFzaWNJbnZva2VyKCk7CiAgICAgfQogCiAgICAgIC8vLyBtZXRob2QgaGFuZGxlIG1vZGlmaWNhdGlvbiAoY3JlYXRpb24gZnJvbSBvdGhlciBtZXRob2QgaGFuZGxlcykKQEAgLTIwMTksNyArMjAyNyw3IEBACiAgICAgICAgIGlmICghdGFyZ2V0LnR5cGUoKS5pc0Nhc3RhYmxlVG8obmV3VHlwZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBXcm9uZ01ldGhvZFR5cGVFeGNlcHRpb24oImNhbm5vdCBleHBsaWNpdGx5IGNhc3QgIit0YXJnZXQrIiB0byAiK25ld1R5cGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVJbXBsLm1ha2VQYWlyd2lzZUNvbnZlcnQodGFyZ2V0LCBuZXdUeXBlLCAyKTsKKyAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZVBhaXJ3aXNlQ29udmVydCh0YXJnZXQsIG5ld1R5cGUsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwODMsMTIgKzIwOTEsMTY1IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYwogICAgIE1ldGhvZEhhbmRsZSBwZXJtdXRlQXJndW1lbnRzKE1ldGhvZEhhbmRsZSB0YXJnZXQsIE1ldGhvZFR5cGUgbmV3VHlwZSwgaW50Li4uIHJlb3JkZXIpIHsKLSAgICAgICAgcmVvcmRlciA9IHJlb3JkZXIuY2xvbmUoKTsKLSAgICAgICAgY2hlY2tSZW9yZGVyKHJlb3JkZXIsIG5ld1R5cGUsIHRhcmdldC50eXBlKCkpOwotICAgICAgICByZXR1cm4gdGFyZ2V0LnBlcm11dGVBcmd1bWVudHMobmV3VHlwZSwgcmVvcmRlcik7CisgICAgICAgIHJlb3JkZXIgPSByZW9yZGVyLmNsb25lKCk7ICAvLyBnZXQgYSBwcml2YXRlIGNvcHkKKyAgICAgICAgTWV0aG9kVHlwZSBvbGRUeXBlID0gdGFyZ2V0LnR5cGUoKTsKKyAgICAgICAgcGVybXV0ZUFyZ3VtZW50Q2hlY2tzKHJlb3JkZXIsIG5ld1R5cGUsIG9sZFR5cGUpOworICAgICAgICBpZiAoVVNFX0xBTUJEQV9GT1JNX0VESVRPUikgeworICAgICAgICAgICAgLy8gZmlyc3QgZGV0ZWN0IGRyb3BwZWQgYXJndW1lbnRzIGFuZCBoYW5kbGUgdGhlbSBzZXBhcmF0ZWx5CisgICAgICAgICAgICBpbnRbXSBvcmlnaW5hbFJlb3JkZXIgPSByZW9yZGVyOworICAgICAgICAgICAgQm91bmRNZXRob2RIYW5kbGUgcmVzdWx0ID0gdGFyZ2V0LnJlYmluZCgpOworICAgICAgICAgICAgTGFtYmRhRm9ybSBmb3JtID0gcmVzdWx0LmZvcm07CisgICAgICAgICAgICBpbnQgbmV3QXJpdHkgPSBuZXdUeXBlLnBhcmFtZXRlckNvdW50KCk7CisgICAgICAgICAgICAvLyBOb3JtYWxpemUgdGhlIHJlb3JkZXJpbmcgaW50byBhIHJlYWwgcGVybXV0YXRpb24sCisgICAgICAgICAgICAvLyBieSByZW1vdmluZyBkdXBsaWNhdGVzIGFuZCBhZGRpbmcgZHJvcHBlZCBlbGVtZW50cy4KKyAgICAgICAgICAgIC8vIFRoaXMgc29tZXdoYXQgaW1wcm92ZXMgbGFtYmRhIGZvcm0gY2FjaGluZywgYXMgd2VsbAorICAgICAgICAgICAgLy8gYXMgc2ltcGxpZnlpbmcgdGhlIHRyYW5zZm9ybSBieSBicmVha2luZyBpdCB1cCBpbnRvIHN0ZXBzLgorICAgICAgICAgICAgZm9yIChpbnQgZGRJZHg7IChkZElkeCA9IGZpbmRGaXJzdER1cE9yRHJvcChyZW9yZGVyLCBuZXdBcml0eSkpICE9IDA7ICkgeworICAgICAgICAgICAgICAgIGlmIChkZElkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBkdXBsaWNhdGVkIGVudHJ5IGF0IHJlb3JkZXJbZGRJZHhdLgorICAgICAgICAgICAgICAgICAgICAvLyBFeGFtcGxlOiAgKHgseSx6KS0+YXNMaXN0KHgseSx6KQorICAgICAgICAgICAgICAgICAgICAvLyBwZXJtdXRlZCBieSBbMSosMCwxXSA9PiAoYTAsYTEpPT5hc0xpc3QoYTEsYTAsYTEpCisgICAgICAgICAgICAgICAgICAgIC8vIHBlcm11dGVkIGJ5IFswLDEsMCpdID0+IChhMCxhMSk9PmFzTGlzdChhMCxhMSxhMCkKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0YXJyZWQgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCBieSB0aGUgZHVwQXJndW1lbnRGb3JtIHRyYW5zZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgaW50IHNyY1BvcyA9IGRkSWR4LCBkc3RQb3MgPSBzcmNQb3MsIGR1cFZhbCA9IHJlb3JkZXJbc3JjUG9zXTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBraWxsRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgdmFsOyAodmFsID0gcmVvcmRlclstLWRzdFBvc10pICE9IGR1cFZhbDsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQga2lsbEZpcnN0IGlmIHRoZSBkdXAgaXMgbGFyZ2VyIHRoYW4gYW4gaW50ZXJ2ZW5pbmcgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVtb3ZlIGF0IGxlYXN0IG9uZSBpbnZlcnNpb24gZnJvbSB0aGUgcGVybXV0YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVwVmFsID4gdmFsKSBraWxsRmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgha2lsbEZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNQb3MgPSBkc3RQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RQb3MgPSBkZElkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3JtID0gZm9ybS5lZGl0b3IoKS5kdXBBcmd1bWVudEZvcm0oMSArIHNyY1BvcywgMSArIGRzdFBvcyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAocmVvcmRlcltzcmNQb3NdID09IHJlb3JkZXJbZHN0UG9zXSk7CisgICAgICAgICAgICAgICAgICAgIG9sZFR5cGUgPSBvbGRUeXBlLmRyb3BQYXJhbWV0ZXJUeXBlcyhkc3RQb3MsIGRzdFBvcyArIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBjb250cmFjdCB0aGUgcmVvcmRlcmluZyBieSByZW1vdmluZyB0aGUgZWxlbWVudCBhdCBkc3RQb3MKKyAgICAgICAgICAgICAgICAgICAgaW50IHRhaWxQb3MgPSBkc3RQb3MgKyAxOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlb3JkZXIsIHRhaWxQb3MsIHJlb3JkZXIsIGRzdFBvcywgcmVvcmRlci5sZW5ndGggLSB0YWlsUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgcmVvcmRlciA9IEFycmF5cy5jb3B5T2YocmVvcmRlciwgcmVvcmRlci5sZW5ndGggLSAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgZHJvcFZhbCA9IH5kZElkeCwgaW5zUG9zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluc1BvcyA8IHJlb3JkZXIubGVuZ3RoICYmIHJlb3JkZXJbaW5zUG9zXSA8IGRyb3BWYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgZmlyc3QgZWxlbWVudCBvZiByZW9yZGVyIGxhcmdlciB0aGFuIGRyb3BWYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgaW5zZXJ0IHRoZSBkcm9wVmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5zUG9zICs9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcHR5cGUgPSBuZXdUeXBlLnBhcmFtZXRlclR5cGUoZHJvcFZhbCk7CisgICAgICAgICAgICAgICAgICAgIGZvcm0gPSBmb3JtLmVkaXRvcigpLmFkZEFyZ3VtZW50Rm9ybSgxICsgaW5zUG9zLCBCYXNpY1R5cGUuYmFzaWNUeXBlKHB0eXBlKSk7CisgICAgICAgICAgICAgICAgICAgIG9sZFR5cGUgPSBvbGRUeXBlLmluc2VydFBhcmFtZXRlclR5cGVzKGluc1BvcywgcHR5cGUpOworICAgICAgICAgICAgICAgICAgICAvLyBleHBhbmQgdGhlIHJlb3JkZXJpbmcgYnkgaW5zZXJ0aW5nIGFuIGVsZW1lbnQgYXQgaW5zUG9zCisgICAgICAgICAgICAgICAgICAgIGludCB0YWlsUG9zID0gaW5zUG9zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgcmVvcmRlciA9IEFycmF5cy5jb3B5T2YocmVvcmRlciwgcmVvcmRlci5sZW5ndGggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZW9yZGVyLCBpbnNQb3MsIHJlb3JkZXIsIHRhaWxQb3MsIHJlb3JkZXIubGVuZ3RoIC0gdGFpbFBvcyk7CisgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJbaW5zUG9zXSA9IGRyb3BWYWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydCAocGVybXV0ZUFyZ3VtZW50Q2hlY2tzKHJlb3JkZXIsIG5ld1R5cGUsIG9sZFR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCAocmVvcmRlci5sZW5ndGggPT0gbmV3QXJpdHkpOyAgLy8gYSBwZXJmZWN0IHBlcm11dGF0aW9uCisgICAgICAgICAgICAvLyBOb3RlOiAgVGhpcyBtYXkgY2FjaGUgdG9vIG1hbnkgZGlzdGluY3QgTEZzLiBDb25zaWRlciBiYWNraW5nIG9mZiB0byB2YXJhcmdzIGNvZGUuCisgICAgICAgICAgICBmb3JtID0gZm9ybS5lZGl0b3IoKS5wZXJtdXRlQXJndW1lbnRzRm9ybSgxLCByZW9yZGVyKTsKKyAgICAgICAgICAgIGlmIChuZXdUeXBlID09IHJlc3VsdC50eXBlKCkgJiYgZm9ybSA9PSByZXN1bHQuaW50ZXJuYWxGb3JtKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuY29weVdpdGgobmV3VHlwZSwgZm9ybSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBmaXJzdCBkZXRlY3QgZHJvcHBlZCBhcmd1bWVudHMgYW5kIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBvcmlnaW5hbFRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgICAgIGludCBuZXdBcml0eSA9IG5ld1R5cGUucGFyYW1ldGVyQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGRyb3BJZHg7IChkcm9wSWR4ID0gZmluZEZpcnN0RHJvcChyZW9yZGVyLCBuZXdBcml0eSkpID49IDA7ICkgeworICAgICAgICAgICAgICAgIC8vIGRyb3BJZHggaXMgbWlzc2luZyBmcm9tIHJlb3JkZXI7IGFkZCBpdCBpbiBhdCB0aGUgZW5kCisgICAgICAgICAgICAgICAgaW50IG9sZEFyaXR5ID0gcmVvcmRlci5sZW5ndGg7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHJvcEFyZ3VtZW50cyh0YXJnZXQsIG9sZEFyaXR5LCBuZXdUeXBlLnBhcmFtZXRlclR5cGUoZHJvcElkeCkpOworICAgICAgICAgICAgICAgIHJlb3JkZXIgPSBBcnJheXMuY29weU9mKHJlb3JkZXIsIG9sZEFyaXR5KzEpOworICAgICAgICAgICAgICAgIHJlb3JkZXJbb2xkQXJpdHldID0gZHJvcElkeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCh0YXJnZXQgPT0gb3JpZ2luYWxUYXJnZXQgfHwgcGVybXV0ZUFyZ3VtZW50Q2hlY2tzKHJlb3JkZXIsIG5ld1R5cGUsIHRhcmdldC50eXBlKCkpKTsKKyAgICAgICAgICAgIC8vIE5vdGU6ICBUaGlzIG1heSBjYWNoZSB0b28gbWFueSBkaXN0aW5jdCBMRnMuIENvbnNpZGVyIGJhY2tpbmcgb2ZmIHRvIHZhcmFyZ3MgY29kZS4KKyAgICAgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlIHJlc3VsdCA9IHRhcmdldC5yZWJpbmQoKTsKKyAgICAgICAgICAgIExhbWJkYUZvcm0gZm9ybSA9IHJlc3VsdC5mb3JtLnBlcm11dGVBcmd1bWVudHMoMSwgcmVvcmRlciwgYmFzaWNUeXBlcyhuZXdUeXBlLnBhcmFtZXRlckxpc3QoKSkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jb3B5V2l0aChuZXdUeXBlLCBmb3JtKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tSZW9yZGVyKGludFtdIHJlb3JkZXIsIE1ldGhvZFR5cGUgbmV3VHlwZSwgTWV0aG9kVHlwZSBvbGRUeXBlKSB7CisgICAgLyoqIFJldHVybiB0aGUgZmlyc3QgdmFsdWUgaW4gWzAuLm5ld0FyaXR5LTFdIHRoYXQgaXMgbm90IHByZXNlbnQgaW4gcmVvcmRlci4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZEZpcnN0RHJvcChpbnRbXSByZW9yZGVyLCBpbnQgbmV3QXJpdHkpIHsKKyAgICAgICAgZmluYWwgaW50IEJJVF9MSU1JVCA9IDYzOyAgLy8gbWF4IG51bWJlciBvZiBiaXRzIGluIGJpdCBtYXNrCisgICAgICAgIGlmIChuZXdBcml0eSA8IEJJVF9MSU1JVCkgeworICAgICAgICAgICAgbG9uZyBtYXNrID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGFyZyA6IHJlb3JkZXIpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoYXJnIDwgbmV3QXJpdHkpOworICAgICAgICAgICAgICAgIG1hc2sgfD0gKDEgPDwgYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXNrID09ICgxIDw8IG5ld0FyaXR5KSAtIDEpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoTG9uZy5udW1iZXJPZlRyYWlsaW5nWmVyb3MoTG9uZy5sb3dlc3RPbmVCaXQofm1hc2spKSA9PSBuZXdBcml0eSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmluZCBmaXJzdCB6ZXJvCisgICAgICAgICAgICBsb25nIHplcm9CaXQgPSBMb25nLmxvd2VzdE9uZUJpdCh+bWFzayk7CisgICAgICAgICAgICBpbnQgemVyb1BvcyA9IExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zKHplcm9CaXQpOworICAgICAgICAgICAgYXNzZXJ0KHplcm9Qb3MgPCBuZXdBcml0eSk7CisgICAgICAgICAgICByZXR1cm4gemVyb1BvczsKKyAgICAgICAgfQorICAgICAgICBCaXRTZXQgbWFzayA9IG5ldyBCaXRTZXQobmV3QXJpdHkpOworICAgICAgICBmb3IgKGludCBhcmcgOiByZW9yZGVyKSB7CisgICAgICAgICAgICBhc3NlcnQoYXJnIDwgbmV3QXJpdHkpOworICAgICAgICAgICAgbWFzay5zZXQoYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgemVyb1BvcyA9IG1hc2submV4dENsZWFyQml0KDApOworICAgICAgICBpZiAoemVyb1BvcyA9PSBuZXdBcml0eSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIHplcm9Qb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGluZGljYXRpb24gb2YgYW55IGR1cGxpY2F0ZSBvciBvbWlzc2lvbiBpbiByZW9yZGVyLgorICAgICAqIElmIHRoZSByZW9yZGVyIGNvbnRhaW5zIGEgZHVwbGljYXRlIGVudHJ5LCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzZWNvbmQgb2NjdXJyZW5jZS4KKyAgICAgKiBPdGhlcndpc2UsIHJldHVybiB+KG4pLCBmb3IgdGhlIGZpcnN0IG4gaW4gWzAuLm5ld0FyaXR5LTFdIHRoYXQgaXMgbm90IHByZXNlbnQgaW4gcmVvcmRlci4KKyAgICAgKiBPdGhlcndpc2UsIHJldHVybiB6ZXJvLgorICAgICAqIElmIGFuIGVsZW1lbnQgbm90IGluIFswLi5uZXdBcml0eS0xXSBpcyBlbmNvdW50ZXJlZCwgcmV0dXJuIHJlb3JkZXIubGVuZ3RoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kRmlyc3REdXBPckRyb3AoaW50W10gcmVvcmRlciwgaW50IG5ld0FyaXR5KSB7CisgICAgICAgIGZpbmFsIGludCBCSVRfTElNSVQgPSA2MzsgIC8vIG1heCBudW1iZXIgb2YgYml0cyBpbiBiaXQgbWFzaworICAgICAgICBpZiAobmV3QXJpdHkgPCBCSVRfTElNSVQpIHsKKyAgICAgICAgICAgIGxvbmcgbWFzayA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlb3JkZXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYXJnID0gcmVvcmRlcltpXTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID49IG5ld0FyaXR5KSAgcmV0dXJuIHJlb3JkZXIubGVuZ3RoOworICAgICAgICAgICAgICAgIGludCBiaXQgPSAxIDw8IGFyZzsKKyAgICAgICAgICAgICAgICBpZiAoKG1hc2sgJiBiaXQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOyAgLy8gPjAgaW5kaWNhdGVzIGEgZHVwCisgICAgICAgICAgICAgICAgbWFzayB8PSBiaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFzayA9PSAoMSA8PCBuZXdBcml0eSkgLSAxKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zKExvbmcubG93ZXN0T25lQml0KH5tYXNrKSkgPT0gbmV3QXJpdHkpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmluZCBmaXJzdCB6ZXJvCisgICAgICAgICAgICBsb25nIHplcm9CaXQgPSBMb25nLmxvd2VzdE9uZUJpdCh+bWFzayk7CisgICAgICAgICAgICBpbnQgemVyb1BvcyA9IExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zKHplcm9CaXQpOworICAgICAgICAgICAgYXNzZXJ0KHplcm9Qb3MgPCBuZXdBcml0eSk7CisgICAgICAgICAgICByZXR1cm4gfnplcm9Qb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzYW1lIGFsZ29yaXRobSwgZGlmZmVyZW50IGJpdCBzZXQKKyAgICAgICAgICAgIEJpdFNldCBtYXNrID0gbmV3IEJpdFNldChuZXdBcml0eSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlb3JkZXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYXJnID0gcmVvcmRlcltpXTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID49IG5ld0FyaXR5KSAgcmV0dXJuIHJlb3JkZXIubGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChtYXNrLmdldChhcmcpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsgIC8vID4wIGluZGljYXRlcyBhIGR1cAorICAgICAgICAgICAgICAgIG1hc2suc2V0KGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgemVyb1BvcyA9IG1hc2submV4dENsZWFyQml0KDApOworICAgICAgICAgICAgaWYgKHplcm9Qb3MgPT0gbmV3QXJpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB+emVyb1BvczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGVybXV0ZUFyZ3VtZW50Q2hlY2tzKGludFtdIHJlb3JkZXIsIE1ldGhvZFR5cGUgbmV3VHlwZSwgTWV0aG9kVHlwZSBvbGRUeXBlKSB7CiAgICAgICAgIGlmIChuZXdUeXBlLnJldHVyblR5cGUoKSAhPSBvbGRUeXBlLnJldHVyblR5cGUoKSkKICAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmV0dXJuIHR5cGVzIGRvIG5vdCBtYXRjaCIsCiAgICAgICAgICAgICAgICAgICAgIG9sZFR5cGUsIG5ld1R5cGUpOwpAQCAtMjEwNiw3ICsyMjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJhbWV0ZXIgdHlwZXMgZG8gbm90IG1hdGNoIGFmdGVyIHJlb3JkZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFR5cGUsIG5ld1R5cGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFiYWQpICByZXR1cm47CisgICAgICAgICAgICBpZiAoIWJhZCkgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIHJlb3JkZXIgYXJyYXk6ICIrQXJyYXlzLnRvU3RyaW5nKHJlb3JkZXIpKTsKICAgICB9CkBAIC0yMTMyLDkgKzIyOTMsMTQgQEAKICAgICAgICAgICAgIGlmICh0eXBlID09IHZvaWQuY2xhc3MpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2b2lkIHR5cGUiKTsKICAgICAgICAgICAgIFdyYXBwZXIgdyA9IFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZSh0eXBlKTsKLSAgICAgICAgICAgIHJldHVybiBpbnNlcnRBcmd1bWVudHMoaWRlbnRpdHkodHlwZSksIDAsIHcuY29udmVydCh2YWx1ZSwgdHlwZSkpOworICAgICAgICAgICAgdmFsdWUgPSB3LmNvbnZlcnQodmFsdWUsIHR5cGUpOworICAgICAgICAgICAgaWYgKHcuemVybygpLmVxdWFscyh2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHplcm8odywgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gaW5zZXJ0QXJndW1lbnRzKGlkZW50aXR5KHR5cGUpLCAwLCB2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkodHlwZSkuYmluZFRvKHR5cGUuY2FzdCh2YWx1ZSkpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHplcm8oV3JhcHBlci5PQkpFQ1QsIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5KHR5cGUpLmJpbmRUbyh2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxNDcsMTQgKzIzMTMsNDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljCiAgICAgTWV0aG9kSGFuZGxlIGlkZW50aXR5KENsYXNzPD8+IHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gdm9pZC5jbGFzcykKLSAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidm9pZCB0eXBlIik7Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gT2JqZWN0LmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIFZhbHVlQ29udmVyc2lvbnMuaWRlbnRpdHkoKTsKLSAgICAgICAgZWxzZSBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKQotICAgICAgICAgICAgcmV0dXJuIFZhbHVlQ29udmVyc2lvbnMuaWRlbnRpdHkoV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKHR5cGUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZVJlZmVyZW5jZUlkZW50aXR5KHR5cGUpOworICAgICAgICBXcmFwcGVyIGJ0dyA9ICh0eXBlLmlzUHJpbWl0aXZlKCkgPyBXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUodHlwZSkgOiBXcmFwcGVyLk9CSkVDVCk7CisgICAgICAgIGludCBwb3MgPSBidHcub3JkaW5hbCgpOworICAgICAgICBNZXRob2RIYW5kbGUgaWRlbnQgPSBJREVOVElUWV9NSFNbcG9zXTsKKyAgICAgICAgaWYgKGlkZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlkZW50ID0gc2V0Q2FjaGVkTWV0aG9kSGFuZGxlKElERU5USVRZX01IUywgcG9zLCBtYWtlSWRlbnRpdHkoYnR3LnByaW1pdGl2ZVR5cGUoKSkpOworICAgICAgICB9CisgICAgICAgIGlmIChpZGVudC50eXBlKCkucmV0dXJuVHlwZSgpID09IHR5cGUpCisgICAgICAgICAgICByZXR1cm4gaWRlbnQ7CisgICAgICAgIC8vIHNvbWV0aGluZyBsaWtlIGlkZW50aXR5KEZvby5jbGFzcyk7IGRvIG5vdCBib3RoZXIgdG8gaW50ZXJuIHRoZXNlCisgICAgICAgIGFzc2VydChidHcgPT0gV3JhcHBlci5PQkpFQ1QpOworICAgICAgICByZXR1cm4gbWFrZUlkZW50aXR5KHR5cGUpOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGVbXSBJREVOVElUWV9NSFMgPSBuZXcgTWV0aG9kSGFuZGxlW1dyYXBwZXIudmFsdWVzKCkubGVuZ3RoXTsKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RIYW5kbGUgbWFrZUlkZW50aXR5KENsYXNzPD8+IHB0eXBlKSB7CisgICAgICAgIE1ldGhvZFR5cGUgbXR5cGUgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUocHR5cGUsIHB0eXBlKTsKKyAgICAgICAgTGFtYmRhRm9ybSBsZm9ybSA9IExhbWJkYUZvcm0uaWRlbnRpdHlGb3JtKEJhc2ljVHlwZS5iYXNpY1R5cGUocHR5cGUpKTsKKyAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZUludHJpbnNpYyhtdHlwZSwgbGZvcm0sIEludHJpbnNpYy5JREVOVElUWSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIHplcm8oV3JhcHBlciBidHcsIENsYXNzPD8+IHJ0eXBlKSB7CisgICAgICAgIGludCBwb3MgPSBidHcub3JkaW5hbCgpOworICAgICAgICBNZXRob2RIYW5kbGUgemVybyA9IFpFUk9fTUhTW3Bvc107CisgICAgICAgIGlmICh6ZXJvID09IG51bGwpIHsKKyAgICAgICAgICAgIHplcm8gPSBzZXRDYWNoZWRNZXRob2RIYW5kbGUoWkVST19NSFMsIHBvcywgbWFrZVplcm8oYnR3LnByaW1pdGl2ZVR5cGUoKSkpOworICAgICAgICB9CisgICAgICAgIGlmICh6ZXJvLnR5cGUoKS5yZXR1cm5UeXBlKCkgPT0gcnR5cGUpCisgICAgICAgICAgICByZXR1cm4gemVybzsKKyAgICAgICAgYXNzZXJ0KGJ0dyA9PSBXcmFwcGVyLk9CSkVDVCk7CisgICAgICAgIHJldHVybiBtYWtlWmVybyhydHlwZSk7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZVtdIFpFUk9fTUhTID0gbmV3IE1ldGhvZEhhbmRsZVtXcmFwcGVyLnZhbHVlcygpLmxlbmd0aF07CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIG1ha2VaZXJvKENsYXNzPD8+IHJ0eXBlKSB7CisgICAgICAgIE1ldGhvZFR5cGUgbXR5cGUgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUocnR5cGUpOworICAgICAgICBMYW1iZGFGb3JtIGxmb3JtID0gTGFtYmRhRm9ybS56ZXJvRm9ybShCYXNpY1R5cGUuYmFzaWNUeXBlKHJ0eXBlKSk7CisgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVJbXBsLm1ha2VJbnRyaW5zaWMobXR5cGUsIGxmb3JtLCBJbnRyaW5zaWMuWkVSTyk7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBzZXRDYWNoZWRNZXRob2RIYW5kbGUoTWV0aG9kSGFuZGxlW10gY2FjaGUsIGludCBwb3MsIE1ldGhvZEhhbmRsZSB2YWx1ZSkgeworICAgICAgICAvLyBTaW11bGF0ZSBhIENBUywgdG8gYXZvaWQgcmFjeSBkdXBsaWNhdGlvbiBvZiByZXN1bHRzLgorICAgICAgICBNZXRob2RIYW5kbGUgcHJldiA9IGNhY2hlW3Bvc107CisgICAgICAgIGlmIChwcmV2ICE9IG51bGwpIHJldHVybiBwcmV2OworICAgICAgICByZXR1cm4gY2FjaGVbcG9zXSA9IHZhbHVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE5MCw2ICsyMzkwLDM3IEBACiAgICAgcHVibGljIHN0YXRpYwogICAgIE1ldGhvZEhhbmRsZSBpbnNlcnRBcmd1bWVudHMoTWV0aG9kSGFuZGxlIHRhcmdldCwgaW50IHBvcywgT2JqZWN0Li4uIHZhbHVlcykgewogICAgICAgICBpbnQgaW5zQ291bnQgPSB2YWx1ZXMubGVuZ3RoOworICAgICAgICBDbGFzczw/PltdIHB0eXBlcyA9IGluc2VydEFyZ3VtZW50c0NoZWNrcyh0YXJnZXQsIGluc0NvdW50LCBwb3MpOworICAgICAgICBpZiAoaW5zQ291bnQgPT0gMCkgIHJldHVybiB0YXJnZXQ7CisgICAgICAgIEJvdW5kTWV0aG9kSGFuZGxlIHJlc3VsdCA9IHRhcmdldC5yZWJpbmQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB2YWx1ZXNbaV07CisgICAgICAgICAgICBDbGFzczw/PiBwdHlwZSA9IHB0eXBlc1twb3MraV07CisgICAgICAgICAgICBpZiAocHR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGluc2VydEFyZ3VtZW50UHJpbWl0aXZlKHJlc3VsdCwgcG9zLCBwdHlwZSwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHB0eXBlLmNhc3QodmFsdWUpOyAgLy8gdGhyb3cgQ0NFIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kQXJndW1lbnRMKHBvcywgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQm91bmRNZXRob2RIYW5kbGUgaW5zZXJ0QXJndW1lbnRQcmltaXRpdmUoQm91bmRNZXRob2RIYW5kbGUgcmVzdWx0LCBpbnQgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHB0eXBlLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgV3JhcHBlciB3ID0gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKHB0eXBlKTsKKyAgICAgICAgLy8gcGVyZm9ybSB1bmJveGluZyBhbmQvb3IgcHJpbWl0aXZlIGNvbnZlcnNpb24KKyAgICAgICAgdmFsdWUgPSB3LmNvbnZlcnQodmFsdWUsIHB0eXBlKTsKKyAgICAgICAgc3dpdGNoICh3KSB7CisgICAgICAgIGNhc2UgSU5UOiAgICAgcmV0dXJuIHJlc3VsdC5iaW5kQXJndW1lbnRJKHBvcywgKGludCl2YWx1ZSk7CisgICAgICAgIGNhc2UgTE9ORzogICAgcmV0dXJuIHJlc3VsdC5iaW5kQXJndW1lbnRKKHBvcywgKGxvbmcpdmFsdWUpOworICAgICAgICBjYXNlIEZMT0FUOiAgIHJldHVybiByZXN1bHQuYmluZEFyZ3VtZW50Rihwb3MsIChmbG9hdCl2YWx1ZSk7CisgICAgICAgIGNhc2UgRE9VQkxFOiAgcmV0dXJuIHJlc3VsdC5iaW5kQXJndW1lbnREKHBvcywgKGRvdWJsZSl2YWx1ZSk7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgcmV0dXJuIHJlc3VsdC5iaW5kQXJndW1lbnRJKHBvcywgVmFsdWVDb252ZXJzaW9ucy53aWRlblN1YndvcmQodmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+W10gaW5zZXJ0QXJndW1lbnRzQ2hlY2tzKE1ldGhvZEhhbmRsZSB0YXJnZXQsIGludCBpbnNDb3VudCwgaW50IHBvcykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewogICAgICAgICBNZXRob2RUeXBlIG9sZFR5cGUgPSB0YXJnZXQudHlwZSgpOwogICAgICAgICBpbnQgb3V0YXJncyA9IG9sZFR5cGUucGFyYW1ldGVyQ291bnQoKTsKICAgICAgICAgaW50IGluYXJncyAgPSBvdXRhcmdzIC0gaW5zQ291bnQ7CkBAIC0yMTk3LDMxICsyNDI4LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9vIG1hbnkgdmFsdWVzIHRvIGluc2VydCIpOwogICAgICAgICBpZiAocG9zIDwgMCB8fCBwb3MgPiBpbmFyZ3MpCiAgICAgICAgICAgICB0aHJvdyBuZXdJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIGFyZ3VtZW50IHR5cGUgdG8gYXBwZW5kIik7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSByZXN1bHQgPSB0YXJnZXQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zQ291bnQ7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdmFsdWVzW2ldOwotICAgICAgICAgICAgQ2xhc3M8Pz4gcHR5cGUgPSBvbGRUeXBlLnBhcmFtZXRlclR5cGUocG9zK2kpOwotICAgICAgICAgICAgaWYgKHB0eXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGJ0eXBlID0gJ0knOwotICAgICAgICAgICAgICAgIFdyYXBwZXIgdyA9IFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZShwdHlwZSk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBMT05HOiAgICBidHlwZSA9ICdKJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGTE9BVDogICBidHlwZSA9ICdGJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBET1VCTEU6ICBidHlwZSA9ICdEJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gdW5ib3hpbmcgYW5kL29yIHByaW1pdGl2ZSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgdmFsdWUgPSB3LmNvbnZlcnQodmFsdWUsIHB0eXBlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuYmluZEFyZ3VtZW50KHBvcywgYnR5cGUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gcHR5cGUuY2FzdCh2YWx1ZSk7ICAvLyB0aHJvdyBDQ0UgaWYgbmVlZGVkCi0gICAgICAgICAgICBpZiAocG9zID09IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuYmluZFJlY2VpdmVyKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmJpbmRBcmd1bWVudChwb3MsICdMJywgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBvbGRUeXBlLnB0eXBlcygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI2OSwxOCArMjQ3NiwzMyBAQAogICAgIHB1YmxpYyBzdGF0aWMKICAgICBNZXRob2RIYW5kbGUgZHJvcEFyZ3VtZW50cyhNZXRob2RIYW5kbGUgdGFyZ2V0LCBpbnQgcG9zLCBMaXN0PENsYXNzPD8+PiB2YWx1ZVR5cGVzKSB7CiAgICAgICAgIE1ldGhvZFR5cGUgb2xkVHlwZSA9IHRhcmdldC50eXBlKCk7ICAvLyBnZXQgTlBFCisgICAgICAgIGludCBkcm9wcGVkID0gZHJvcEFyZ3VtZW50Q2hlY2tzKG9sZFR5cGUsIHBvcywgdmFsdWVUeXBlcyk7CisgICAgICAgIGlmIChkcm9wcGVkID09IDApICByZXR1cm4gdGFyZ2V0OworICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZSByZXN1bHQgPSB0YXJnZXQucmViaW5kKCk7CisgICAgICAgIExhbWJkYUZvcm0gbGZvcm0gPSByZXN1bHQuZm9ybTsKKyAgICAgICAgaWYgKFVTRV9MQU1CREFfRk9STV9FRElUT1IpIHsKKyAgICAgICAgICAgIGludCBpbnNlcnRGb3JtQXJnID0gMSArIHBvczsKKyAgICAgICAgICAgIGZvciAoQ2xhc3M8Pz4gcHR5cGUgOiB2YWx1ZVR5cGVzKSB7CisgICAgICAgICAgICAgICAgbGZvcm0gPSBsZm9ybS5lZGl0b3IoKS5hZGRBcmd1bWVudEZvcm0oaW5zZXJ0Rm9ybUFyZysrLCBCYXNpY1R5cGUuYmFzaWNUeXBlKHB0eXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZm9ybSA9IGxmb3JtLmFkZEFyZ3VtZW50cyhwb3MsIHZhbHVlVHlwZXMpOworICAgICAgICB9CisgICAgICAgIE1ldGhvZFR5cGUgbmV3VHlwZSA9IG9sZFR5cGUuaW5zZXJ0UGFyYW1ldGVyVHlwZXMocG9zLCB2YWx1ZVR5cGVzKTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvcHlXaXRoKG5ld1R5cGUsIGxmb3JtKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZHJvcEFyZ3VtZW50Q2hlY2tzKE1ldGhvZFR5cGUgb2xkVHlwZSwgaW50IHBvcywgTGlzdDxDbGFzczw/Pj4gdmFsdWVUeXBlcykgewogICAgICAgICBpbnQgZHJvcHBlZCA9IHZhbHVlVHlwZXMuc2l6ZSgpOwogICAgICAgICBNZXRob2RUeXBlLmNoZWNrU2xvdENvdW50KGRyb3BwZWQpOwotICAgICAgICBpZiAoZHJvcHBlZCA9PSAwKSAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgaW50IG91dGFyZ3MgPSBvbGRUeXBlLnBhcmFtZXRlckNvdW50KCk7CiAgICAgICAgIGludCBpbmFyZ3MgID0gb3V0YXJncyArIGRyb3BwZWQ7Ci0gICAgICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+PSBpbmFyZ3MpCi0gICAgICAgICAgICB0aHJvdyBuZXdJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIGFyZ3VtZW50IHR5cGUgdG8gcmVtb3ZlIik7Ci0gICAgICAgIEFycmF5TGlzdDxDbGFzczw/Pj4gcHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KG9sZFR5cGUucGFyYW1ldGVyTGlzdCgpKTsKLSAgICAgICAgcHR5cGVzLmFkZEFsbChwb3MsIHZhbHVlVHlwZXMpOwotICAgICAgICBpZiAocHR5cGVzLnNpemUoKSAhPSBpbmFyZ3MpICB0aHJvdyBuZXdJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlVHlwZXMiKTsKLSAgICAgICAgTWV0aG9kVHlwZSBuZXdUeXBlID0gTWV0aG9kVHlwZS5tZXRob2RUeXBlKG9sZFR5cGUucmV0dXJuVHlwZSgpLCBwdHlwZXMpOwotICAgICAgICByZXR1cm4gdGFyZ2V0LmRyb3BBcmd1bWVudHMobmV3VHlwZSwgcG9zLCBkcm9wcGVkKTsKKyAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID4gb3V0YXJncykKKyAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gYXJndW1lbnQgdHlwZSB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgICAgICsgQXJyYXlzLmFzTGlzdChvbGRUeXBlLCBwb3MsIHZhbHVlVHlwZXMsIGluYXJncywgb3V0YXJncykKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIGRyb3BwZWQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDAyLDMyICsyNjI0LDQ3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYwogICAgIE1ldGhvZEhhbmRsZSBmaWx0ZXJBcmd1bWVudHMoTWV0aG9kSGFuZGxlIHRhcmdldCwgaW50IHBvcywgTWV0aG9kSGFuZGxlLi4uIGZpbHRlcnMpIHsKLSAgICAgICAgTWV0aG9kVHlwZSB0YXJnZXRUeXBlID0gdGFyZ2V0LnR5cGUoKTsKKyAgICAgICAgZmlsdGVyQXJndW1lbnRzQ2hlY2tBcml0eSh0YXJnZXQsIHBvcywgZmlsdGVycyk7CiAgICAgICAgIE1ldGhvZEhhbmRsZSBhZGFwdGVyID0gdGFyZ2V0OwotICAgICAgICBNZXRob2RUeXBlIGFkYXB0ZXJUeXBlID0gbnVsbDsKLSAgICAgICAgYXNzZXJ0KChhZGFwdGVyVHlwZSA9IHRhcmdldFR5cGUpICE9IG51bGwpOwotICAgICAgICBpbnQgbWF4UG9zID0gdGFyZ2V0VHlwZS5wYXJhbWV0ZXJDb3VudCgpOwotICAgICAgICBpZiAocG9zICsgZmlsdGVycy5sZW5ndGggPiBtYXhQb3MpCi0gICAgICAgICAgICB0aHJvdyBuZXdJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRvbyBtYW55IGZpbHRlcnMiKTsKICAgICAgICAgaW50IGN1clBvcyA9IHBvcy0xOyAgLy8gcHJlLWluY3JlbWVudGVkCiAgICAgICAgIGZvciAoTWV0aG9kSGFuZGxlIGZpbHRlciA6IGZpbHRlcnMpIHsKICAgICAgICAgICAgIGN1clBvcyArPSAxOwogICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSAgY29udGludWU7ICAvLyBpZ25vcmUgbnVsbCBlbGVtZW50cyBvZiBmaWx0ZXJzCiAgICAgICAgICAgICBhZGFwdGVyID0gZmlsdGVyQXJndW1lbnQoYWRhcHRlciwgY3VyUG9zLCBmaWx0ZXIpOwotICAgICAgICAgICAgYXNzZXJ0KChhZGFwdGVyVHlwZSA9IGFkYXB0ZXJUeXBlLmNoYW5nZVBhcmFtZXRlclR5cGUoY3VyUG9zLCBmaWx0ZXIudHlwZSgpLnBhcmFtZXRlclR5cGUoMCkpKSAhPSBudWxsKTsKICAgICAgICAgfQotICAgICAgICBhc3NlcnQoYWRhcHRlclR5cGUuZXF1YWxzKGFkYXB0ZXIudHlwZSgpKSk7CiAgICAgICAgIHJldHVybiBhZGFwdGVyOwogICAgIH0KIAogICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYwogICAgIE1ldGhvZEhhbmRsZSBmaWx0ZXJBcmd1bWVudChNZXRob2RIYW5kbGUgdGFyZ2V0LCBpbnQgcG9zLCBNZXRob2RIYW5kbGUgZmlsdGVyKSB7CisgICAgICAgIGZpbHRlckFyZ3VtZW50Q2hlY2tzKHRhcmdldCwgcG9zLCBmaWx0ZXIpOworICAgICAgICBpZiAoVVNFX0xBTUJEQV9GT1JNX0VESVRPUikgeworICAgICAgICAgICAgTWV0aG9kVHlwZSB0YXJnZXRUeXBlID0gdGFyZ2V0LnR5cGUoKTsKKyAgICAgICAgICAgIE1ldGhvZFR5cGUgZmlsdGVyVHlwZSA9IGZpbHRlci50eXBlKCk7CisgICAgICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZSByZXN1bHQgPSB0YXJnZXQucmViaW5kKCk7CisgICAgICAgICAgICBDbGFzczw/PiBuZXdQYXJhbVR5cGUgPSBmaWx0ZXJUeXBlLnBhcmFtZXRlclR5cGUoMCk7CisgICAgICAgICAgICBMYW1iZGFGb3JtIGxmb3JtID0gcmVzdWx0LmVkaXRvcigpLmZpbHRlckFyZ3VtZW50Rm9ybSgxICsgcG9zLCBCYXNpY1R5cGUuYmFzaWNUeXBlKG5ld1BhcmFtVHlwZSkpOworICAgICAgICAgICAgTWV0aG9kVHlwZSBuZXdUeXBlID0gdGFyZ2V0VHlwZS5jaGFuZ2VQYXJhbWV0ZXJUeXBlKHBvcywgbmV3UGFyYW1UeXBlKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb3B5V2l0aEV4dGVuZEwobmV3VHlwZSwgbGZvcm0sIGZpbHRlcik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZUNvbGxlY3RBcmd1bWVudHModGFyZ2V0LCBmaWx0ZXIsIHBvcywgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWx0ZXJBcmd1bWVudHNDaGVja0FyaXR5KE1ldGhvZEhhbmRsZSB0YXJnZXQsIGludCBwb3MsIE1ldGhvZEhhbmRsZVtdIGZpbHRlcnMpIHsKKyAgICAgICAgTWV0aG9kVHlwZSB0YXJnZXRUeXBlID0gdGFyZ2V0LnR5cGUoKTsKKyAgICAgICAgaW50IG1heFBvcyA9IHRhcmdldFR5cGUucGFyYW1ldGVyQ291bnQoKTsKKyAgICAgICAgaWYgKHBvcyArIGZpbHRlcnMubGVuZ3RoID4gbWF4UG9zKQorICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0b28gbWFueSBmaWx0ZXJzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWx0ZXJBcmd1bWVudENoZWNrcyhNZXRob2RIYW5kbGUgdGFyZ2V0LCBpbnQgcG9zLCBNZXRob2RIYW5kbGUgZmlsdGVyKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgICAgIE1ldGhvZFR5cGUgdGFyZ2V0VHlwZSA9IHRhcmdldC50eXBlKCk7CiAgICAgICAgIE1ldGhvZFR5cGUgZmlsdGVyVHlwZSA9IGZpbHRlci50eXBlKCk7CiAgICAgICAgIGlmIChmaWx0ZXJUeXBlLnBhcmFtZXRlckNvdW50KCkgIT0gMQogICAgICAgICAgICAgfHwgZmlsdGVyVHlwZS5yZXR1cm5UeXBlKCkgIT0gdGFyZ2V0VHlwZS5wYXJhbWV0ZXJUeXBlKHBvcykpCiAgICAgICAgICAgICB0aHJvdyBuZXdJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRhcmdldCBhbmQgZmlsdGVyIHR5cGVzIGRvIG5vdCBtYXRjaCIsIHRhcmdldFR5cGUsIGZpbHRlclR5cGUpOwotICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlSW1wbC5tYWtlQ29sbGVjdEFyZ3VtZW50cyh0YXJnZXQsIGZpbHRlciwgcG9zLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTM4LDEyICsyNzc1LDM2IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYwogICAgIE1ldGhvZEhhbmRsZSBjb2xsZWN0QXJndW1lbnRzKE1ldGhvZEhhbmRsZSB0YXJnZXQsIGludCBwb3MsIE1ldGhvZEhhbmRsZSBmaWx0ZXIpIHsKKyAgICAgICAgTWV0aG9kVHlwZSBuZXdUeXBlID0gY29sbGVjdEFyZ3VtZW50c0NoZWNrcyh0YXJnZXQsIHBvcywgZmlsdGVyKTsKKyAgICAgICAgaWYgKFVTRV9MQU1CREFfRk9STV9FRElUT1IpIHsKKyAgICAgICAgICAgIE1ldGhvZFR5cGUgY29sbGVjdG9yVHlwZSA9IGZpbHRlci50eXBlKCk7CisgICAgICAgICAgICBCb3VuZE1ldGhvZEhhbmRsZSByZXN1bHQgPSB0YXJnZXQucmViaW5kKCk7CisgICAgICAgICAgICBMYW1iZGFGb3JtIGxmb3JtOworICAgICAgICAgICAgaWYgKGNvbGxlY3RvclR5cGUucmV0dXJuVHlwZSgpLmlzQXJyYXkoKSAmJiBmaWx0ZXIuaW50cmluc2ljTmFtZSgpID09IEludHJpbnNpYy5ORVdfQVJSQVkpIHsKKyAgICAgICAgICAgICAgICBsZm9ybSA9IHJlc3VsdC5lZGl0b3IoKS5jb2xsZWN0QXJndW1lbnRBcnJheUZvcm0oMSArIHBvcywgZmlsdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAobGZvcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNvcHlXaXRoKG5ld1R5cGUsIGxmb3JtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZm9ybSA9IHJlc3VsdC5lZGl0b3IoKS5jb2xsZWN0QXJndW1lbnRzRm9ybSgxICsgcG9zLCBjb2xsZWN0b3JUeXBlLmJhc2ljVHlwZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuY29weVdpdGhFeHRlbmRMKG5ld1R5cGUsIGxmb3JtLCBmaWx0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZUNvbGxlY3RBcmd1bWVudHModGFyZ2V0LCBmaWx0ZXIsIHBvcywgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kVHlwZSBjb2xsZWN0QXJndW1lbnRzQ2hlY2tzKE1ldGhvZEhhbmRsZSB0YXJnZXQsIGludCBwb3MsIE1ldGhvZEhhbmRsZSBmaWx0ZXIpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKICAgICAgICAgTWV0aG9kVHlwZSB0YXJnZXRUeXBlID0gdGFyZ2V0LnR5cGUoKTsKICAgICAgICAgTWV0aG9kVHlwZSBmaWx0ZXJUeXBlID0gZmlsdGVyLnR5cGUoKTsKLSAgICAgICAgaWYgKGZpbHRlclR5cGUucmV0dXJuVHlwZSgpICE9IHZvaWQuY2xhc3MgJiYKLSAgICAgICAgICAgIGZpbHRlclR5cGUucmV0dXJuVHlwZSgpICE9IHRhcmdldFR5cGUucGFyYW1ldGVyVHlwZShwb3MpKQorICAgICAgICBDbGFzczw/PiBydHlwZSA9IGZpbHRlclR5cGUucmV0dXJuVHlwZSgpOworICAgICAgICBMaXN0PENsYXNzPD8+PiBmaWx0ZXJBcmdzID0gZmlsdGVyVHlwZS5wYXJhbWV0ZXJMaXN0KCk7CisgICAgICAgIGlmIChydHlwZSA9PSB2b2lkLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0VHlwZS5pbnNlcnRQYXJhbWV0ZXJUeXBlcyhwb3MsIGZpbHRlckFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChydHlwZSAhPSB0YXJnZXRUeXBlLnBhcmFtZXRlclR5cGUocG9zKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0YXJnZXQgYW5kIGZpbHRlciB0eXBlcyBkbyBub3QgbWF0Y2giLCB0YXJnZXRUeXBlLCBmaWx0ZXJUeXBlKTsKLSAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZUNvbGxlY3RBcmd1bWVudHModGFyZ2V0LCBmaWx0ZXIsIHBvcywgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0YXJnZXRUeXBlLmRyb3BQYXJhbWV0ZXJUeXBlcyhwb3MsIHBvcysxKS5pbnNlcnRQYXJhbWV0ZXJUeXBlcyhwb3MsIGZpbHRlckFyZ3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjYwNywxNSArMjg2OCwyNiBAQAogICAgIE1ldGhvZEhhbmRsZSBmaWx0ZXJSZXR1cm5WYWx1ZShNZXRob2RIYW5kbGUgdGFyZ2V0LCBNZXRob2RIYW5kbGUgZmlsdGVyKSB7CiAgICAgICAgIE1ldGhvZFR5cGUgdGFyZ2V0VHlwZSA9IHRhcmdldC50eXBlKCk7CiAgICAgICAgIE1ldGhvZFR5cGUgZmlsdGVyVHlwZSA9IGZpbHRlci50eXBlKCk7CisgICAgICAgIGZpbHRlclJldHVyblZhbHVlQ2hlY2tzKHRhcmdldFR5cGUsIGZpbHRlclR5cGUpOworICAgICAgICBpZiAoVVNFX0xBTUJEQV9GT1JNX0VESVRPUikgeworICAgICAgICAgICAgQm91bmRNZXRob2RIYW5kbGUgcmVzdWx0ID0gdGFyZ2V0LnJlYmluZCgpOworICAgICAgICAgICAgQmFzaWNUeXBlIHJ0eXBlID0gQmFzaWNUeXBlLmJhc2ljVHlwZShmaWx0ZXJUeXBlLnJldHVyblR5cGUoKSk7CisgICAgICAgICAgICBMYW1iZGFGb3JtIGxmb3JtID0gcmVzdWx0LmVkaXRvcigpLmZpbHRlclJldHVybkZvcm0ocnR5cGUsIGZhbHNlKTsKKyAgICAgICAgICAgIE1ldGhvZFR5cGUgbmV3VHlwZSA9IHRhcmdldFR5cGUuY2hhbmdlUmV0dXJuVHlwZShmaWx0ZXJUeXBlLnJldHVyblR5cGUoKSk7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29weVdpdGhFeHRlbmRMKG5ld1R5cGUsIGxmb3JtLCBmaWx0ZXIpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVJbXBsLm1ha2VDb2xsZWN0QXJndW1lbnRzKGZpbHRlciwgdGFyZ2V0LCAwLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbHRlclJldHVyblZhbHVlQ2hlY2tzKE1ldGhvZFR5cGUgdGFyZ2V0VHlwZSwgTWV0aG9kVHlwZSBmaWx0ZXJUeXBlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgICAgIENsYXNzPD8+IHJ0eXBlID0gdGFyZ2V0VHlwZS5yZXR1cm5UeXBlKCk7CiAgICAgICAgIGludCBmaWx0ZXJWYWx1ZXMgPSBmaWx0ZXJUeXBlLnBhcmFtZXRlckNvdW50KCk7CiAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZXMgPT0gMAogICAgICAgICAgICAgICAgID8gKHJ0eXBlICE9IHZvaWQuY2xhc3MpCiAgICAgICAgICAgICAgICAgOiAocnR5cGUgIT0gZmlsdGVyVHlwZS5wYXJhbWV0ZXJUeXBlKDApKSkKLSAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFyZ2V0IGFuZCBmaWx0ZXIgdHlwZXMgZG8gbm90IG1hdGNoIiwgdGFyZ2V0LCBmaWx0ZXIpOwotICAgICAgICAvLyByZXN1bHQgPSBmb2xkKCBsYW1iZGEocmV0dmFsLCBhcmcuLi4pIHsgZmlsdGVyKHJldHZhbCkgfSwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgbGFtYmRhKCAgICAgICAgYXJnLi4uKSB7IHRhcmdldChhcmcuLi4pIH0gKQotICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlSW1wbC5tYWtlQ29sbGVjdEFyZ3VtZW50cyhmaWx0ZXIsIHRhcmdldCwgMCwgZmFsc2UpOworICAgICAgICAgICAgdGhyb3cgbmV3SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0YXJnZXQgYW5kIGZpbHRlciB0eXBlcyBkbyBub3QgbWF0Y2giLCB0YXJnZXRUeXBlLCBmaWx0ZXJUeXBlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2OTYsMjQgKzI5NjgsNDAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljCiAgICAgTWV0aG9kSGFuZGxlIGZvbGRBcmd1bWVudHMoTWV0aG9kSGFuZGxlIHRhcmdldCwgTWV0aG9kSGFuZGxlIGNvbWJpbmVyKSB7Ci0gICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBpbnQgZm9sZFBvcyA9IDA7CiAgICAgICAgIE1ldGhvZFR5cGUgdGFyZ2V0VHlwZSA9IHRhcmdldC50eXBlKCk7CiAgICAgICAgIE1ldGhvZFR5cGUgY29tYmluZXJUeXBlID0gY29tYmluZXIudHlwZSgpOwotICAgICAgICBpbnQgZm9sZFBvcyA9IHBvczsKLSAgICAgICAgaW50IGZvbGRBcmdzID0gY29tYmluZXJUeXBlLnBhcmFtZXRlckNvdW50KCk7Ci0gICAgICAgIGludCBmb2xkVmFscyA9IGNvbWJpbmVyVHlwZS5yZXR1cm5UeXBlKCkgPT0gdm9pZC5jbGFzcyA/IDAgOiAxOworICAgICAgICBDbGFzczw/PiBydHlwZSA9IGZvbGRBcmd1bWVudENoZWNrcyhmb2xkUG9zLCB0YXJnZXRUeXBlLCBjb21iaW5lclR5cGUpOworICAgICAgICBpZiAoVVNFX0xBTUJEQV9GT1JNX0VESVRPUikgeworICAgICAgICAgICAgQm91bmRNZXRob2RIYW5kbGUgcmVzdWx0ID0gdGFyZ2V0LnJlYmluZCgpOworICAgICAgICAgICAgYm9vbGVhbiBkcm9wUmVzdWx0ID0gKHJ0eXBlID09IHZvaWQuY2xhc3MpOworICAgICAgICAgICAgLy8gTm90ZTogIFRoaXMgbWF5IGNhY2hlIHRvbyBtYW55IGRpc3RpbmN0IExGcy4gQ29uc2lkZXIgYmFja2luZyBvZmYgdG8gdmFyYXJncyBjb2RlLgorICAgICAgICAgICAgTGFtYmRhRm9ybSBsZm9ybSA9IHJlc3VsdC5lZGl0b3IoKS5mb2xkQXJndW1lbnRzRm9ybSgxICsgZm9sZFBvcywgZHJvcFJlc3VsdCwgY29tYmluZXJUeXBlLmJhc2ljVHlwZSgpKTsKKyAgICAgICAgICAgIE1ldGhvZFR5cGUgbmV3VHlwZSA9IHRhcmdldFR5cGU7CisgICAgICAgICAgICBpZiAoIWRyb3BSZXN1bHQpCisgICAgICAgICAgICAgICAgbmV3VHlwZSA9IG5ld1R5cGUuZHJvcFBhcmFtZXRlclR5cGVzKGZvbGRQb3MsIGZvbGRQb3MgKyAxKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb3B5V2l0aEV4dGVuZEwobmV3VHlwZSwgbGZvcm0sIGNvbWJpbmVyKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlSW1wbC5tYWtlQ29sbGVjdEFyZ3VtZW50cyh0YXJnZXQsIGNvbWJpbmVyLCBmb2xkUG9zLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IGZvbGRBcmd1bWVudENoZWNrcyhpbnQgZm9sZFBvcywgTWV0aG9kVHlwZSB0YXJnZXRUeXBlLCBNZXRob2RUeXBlIGNvbWJpbmVyVHlwZSkgeworICAgICAgICBpbnQgZm9sZEFyZ3MgICA9IGNvbWJpbmVyVHlwZS5wYXJhbWV0ZXJDb3VudCgpOworICAgICAgICBDbGFzczw/PiBydHlwZSA9IGNvbWJpbmVyVHlwZS5yZXR1cm5UeXBlKCk7CisgICAgICAgIGludCBmb2xkVmFscyA9IHJ0eXBlID09IHZvaWQuY2xhc3MgPyAwIDogMTsKICAgICAgICAgaW50IGFmdGVySW5zZXJ0UG9zID0gZm9sZFBvcyArIGZvbGRWYWxzOwogICAgICAgICBib29sZWFuIG9rID0gKHRhcmdldFR5cGUucGFyYW1ldGVyQ291bnQoKSA+PSBhZnRlckluc2VydFBvcyArIGZvbGRBcmdzKTsKICAgICAgICAgaWYgKG9rICYmICEoY29tYmluZXJUeXBlLnBhcmFtZXRlckxpc3QoKQogICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRhcmdldFR5cGUucGFyYW1ldGVyTGlzdCgpLnN1Ykxpc3QoYWZ0ZXJJbnNlcnRQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckluc2VydFBvcyArIGZvbGRBcmdzKSkpKQogICAgICAgICAgICAgb2sgPSBmYWxzZTsKLSAgICAgICAgaWYgKG9rICYmIGZvbGRWYWxzICE9IDAgJiYgIWNvbWJpbmVyVHlwZS5yZXR1cm5UeXBlKCkuZXF1YWxzKHRhcmdldFR5cGUucGFyYW1ldGVyVHlwZSgwKSkpCisgICAgICAgIGlmIChvayAmJiBmb2xkVmFscyAhPSAwICYmIGNvbWJpbmVyVHlwZS5yZXR1cm5UeXBlKCkgIT0gdGFyZ2V0VHlwZS5wYXJhbWV0ZXJUeXBlKDApKQogICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgIHRocm93IG1pc01hdGNoZWRUeXBlcygidGFyZ2V0IGFuZCBjb21iaW5lciB0eXBlcyIsIHRhcmdldFR5cGUsIGNvbWJpbmVyVHlwZSk7Ci0gICAgICAgIE1ldGhvZFR5cGUgbmV3VHlwZSA9IHRhcmdldFR5cGUuZHJvcFBhcmFtZXRlclR5cGVzKGZvbGRQb3MsIGFmdGVySW5zZXJ0UG9zKTsKLSAgICAgICAgcmV0dXJuIE1ldGhvZEhhbmRsZUltcGwubWFrZUNvbGxlY3RBcmd1bWVudHModGFyZ2V0LCBjb21iaW5lciwgZm9sZFBvcywgdHJ1ZSk7CisgICAgICAgIHJldHVybiBydHlwZTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RUeXBlLmphdmEKaW5kZXggYzI2NDYwMC4uNGU5NTdmZSAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RUeXBlLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RUeXBlLmphdmEKQEAgLTQ2Niw2ICs0NjYsNzUgQEAKICAgICAgICAgcmV0dXJuIGRyb3BQYXJhbWV0ZXJUeXBlcyhzdGFydCwgZW5kKS5pbnNlcnRQYXJhbWV0ZXJUeXBlcyhzdGFydCwgcHR5cGVzVG9JbnNlcnQpOwogICAgIH0KIAorICAgIC8qKiBSZXBsYWNlIHRoZSBsYXN0IGFycmF5TGVuZ3RoIHBhcmFtZXRlciB0eXBlcyB3aXRoIHRoZSBjb21wb25lbnQgdHlwZSBvZiBhcnJheVR5cGUuCisgICAgICogQHBhcmFtIGFycmF5VHlwZSBhbnkgYXJyYXkgdHlwZQorICAgICAqIEBwYXJhbSBhcnJheUxlbmd0aCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcyB0byBjaGFuZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgdHlwZQorICAgICAqLworICAgIC8qbm9uLXB1YmxpYyovIE1ldGhvZFR5cGUgYXNTcHJlYWRlclR5cGUoQ2xhc3M8Pz4gYXJyYXlUeXBlLCBpbnQgYXJyYXlMZW5ndGgpIHsKKyAgICAgICAgYXNzZXJ0KHBhcmFtZXRlckNvdW50KCkgPj0gYXJyYXlMZW5ndGgpOworICAgICAgICBpbnQgc3ByZWFkUG9zID0gcHR5cGVzLmxlbmd0aCAtIGFycmF5TGVuZ3RoOworICAgICAgICBpZiAoYXJyYXlMZW5ndGggPT0gMCkgIHJldHVybiB0aGlzOyAgLy8gbm90aGluZyB0byBjaGFuZ2UKKyAgICAgICAgaWYgKGFycmF5VHlwZSA9PSBPYmplY3RbXS5jbGFzcykgeworICAgICAgICAgICAgaWYgKGlzR2VuZXJpYygpKSAgcmV0dXJuIHRoaXM7ICAvLyBub3RoaW5nIHRvIGNoYW5nZQorICAgICAgICAgICAgaWYgKHNwcmVhZFBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gbGVhZGluZyBhcmd1bWVudHMgdG8gcHJlc2VydmU7IGdvIGdlbmVyaWMKKyAgICAgICAgICAgICAgICBNZXRob2RUeXBlIHJlcyA9IGdlbmVyaWNNZXRob2RUeXBlKGFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAocnR5cGUgIT0gT2JqZWN0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jaGFuZ2VSZXR1cm5UeXBlKHJ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDbGFzczw/PiBlbGVtVHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIGFzc2VydChlbGVtVHlwZSAhPSBudWxsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHNwcmVhZFBvczsgaSA8IHB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHB0eXBlc1tpXSAhPSBlbGVtVHlwZSkgeworICAgICAgICAgICAgICAgIENsYXNzPD8+W10gZml4ZWRQdHlwZXMgPSBwdHlwZXMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChmaXhlZFB0eXBlcywgaSwgcHR5cGVzLmxlbmd0aCwgZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RUeXBlKHJ0eXBlLCBmaXhlZFB0eXBlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7ICAvLyBhcmd1bWVudHMgY2hlY2sgb3V0OyBubyBjaGFuZ2UKKyAgICB9CisKKyAgICAvKiogUmV0dXJuIHRoZSBsZWFkaW5nIHBhcmFtZXRlciB0eXBlLCB3aGljaCBtdXN0IGV4aXN0IGFuZCBiZSBhIHJlZmVyZW5jZS4KKyAgICAgKiAgQHJldHVybiB0aGUgbGVhZGluZyBwYXJhbWV0ZXIgdHlwZSwgYWZ0ZXIgZXJyb3IgY2hlY2tzCisgICAgICovCisgICAgLypub24tcHVibGljKi8gQ2xhc3M8Pz4gbGVhZGluZ1JlZmVyZW5jZVBhcmFtZXRlcigpIHsKKyAgICAgICAgQ2xhc3M8Pz4gcHR5cGU7CisgICAgICAgIGlmIChwdHlwZXMubGVuZ3RoID09IDAgfHwKKyAgICAgICAgICAgIChwdHlwZSA9IHB0eXBlc1swXSkuaXNQcmltaXRpdmUoKSkKKyAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gbGVhZGluZyByZWZlcmVuY2UgcGFyYW1ldGVyIik7CisgICAgICAgIHJldHVybiBwdHlwZTsKKyAgICB9CisKKyAgICAvKiogRGVsZXRlIHRoZSBsYXN0IHBhcmFtZXRlciB0eXBlIGFuZCByZXBsYWNlIGl0IHdpdGggYXJyYXlMZW5ndGggY29waWVzIG9mIHRoZSBjb21wb25lbnQgdHlwZSBvZiBhcnJheVR5cGUuCisgICAgICogQHBhcmFtIGFycmF5VHlwZSBhbnkgYXJyYXkgdHlwZQorICAgICAqIEBwYXJhbSBhcnJheUxlbmd0aCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcyB0byBpbnNlcnQKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgdHlwZQorICAgICAqLworICAgIC8qbm9uLXB1YmxpYyovIE1ldGhvZFR5cGUgYXNDb2xsZWN0b3JUeXBlKENsYXNzPD8+IGFycmF5VHlwZSwgaW50IGFycmF5TGVuZ3RoKSB7CisgICAgICAgIGFzc2VydChwYXJhbWV0ZXJDb3VudCgpID49IDEpOworICAgICAgICBhc3NlcnQobGFzdFBhcmFtZXRlclR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKGFycmF5VHlwZSkpOworICAgICAgICBNZXRob2RUeXBlIHJlczsKKyAgICAgICAgaWYgKGFycmF5VHlwZSA9PSBPYmplY3RbXS5jbGFzcykgeworICAgICAgICAgICAgcmVzID0gZ2VuZXJpY01ldGhvZFR5cGUoYXJyYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHJ0eXBlICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jaGFuZ2VSZXR1cm5UeXBlKHJ0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENsYXNzPD8+IGVsZW1UeXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgIGFzc2VydChlbGVtVHlwZSAhPSBudWxsKTsKKyAgICAgICAgICAgIHJlcyA9IG1ldGhvZFR5cGUocnR5cGUsIENvbGxlY3Rpb25zLm5Db3BpZXMoYXJyYXlMZW5ndGgsIGVsZW1UeXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0eXBlcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXMuaW5zZXJ0UGFyYW1ldGVyVHlwZXMoMCwgcGFyYW1ldGVyTGlzdCgpLnN1Ykxpc3QoMCwgcHR5cGVzLmxlbmd0aC0xKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBGaW5kcyBvciBjcmVhdGVzIGEgbWV0aG9kIHR5cGUgd2l0aCBzb21lIHBhcmFtZXRlciB0eXBlcyBvbWl0dGVkLgogICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Ige0BsaW5rICNtZXRob2RUeXBlKGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLkNsYXNzW10pIG1ldGhvZFR5cGV9LgpAQCAtNTczLDYgKzY0MiwxMCBAQAogICAgICAgICByZXR1cm4gZ2VuZXJpY01ldGhvZFR5cGUocGFyYW1ldGVyQ291bnQoKSk7CiAgICAgfQogCisgICAgLypub24tcHVibGljKi8gYm9vbGVhbiBpc0dlbmVyaWMoKSB7CisgICAgICAgIHJldHVybiB0aGlzID09IGVyYXNlKCkgJiYgIWhhc1ByaW1pdGl2ZXMoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb252ZXJ0cyBhbGwgcHJpbWl0aXZlIHR5cGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgd3JhcHBlciB0eXBlcy4KICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHtAbGluayAjbWV0aG9kVHlwZShqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5DbGFzc1tdKSBtZXRob2RUeXBlfS4KQEAgLTcyOCw0NCArODAxLDExNCBAQAogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKLQorICAgIC8qKiBUcnVlIGlmIHRoZSBvbGQgcmV0dXJuIHR5cGUgY2FuIGFsd2F5cyBiZSB2aWV3ZWQgKHcvbyBjYXN0aW5nKSB1bmRlciBuZXcgcmV0dXJuIHR5cGUsCisgICAgICogIGFuZCB0aGUgbmV3IHBhcmFtZXRlcnMgY2FuIGJlIHZpZXdlZCAody9vIGNhc3RpbmcpIHVuZGVyIHRoZSBvbGQgcGFyYW1ldGVyIHR5cGVzLgorICAgICAqLwogICAgIC8qbm9uLXB1YmxpYyovCi0gICAgYm9vbGVhbiBpc1ZpZXdhYmxlQXMoTWV0aG9kVHlwZSBuZXdUeXBlKSB7Ci0gICAgICAgIGlmICghVmVyaWZ5VHlwZS5pc051bGxDb252ZXJzaW9uKHJldHVyblR5cGUoKSwgbmV3VHlwZS5yZXR1cm5UeXBlKCkpKQorICAgIGJvb2xlYW4gaXNWaWV3YWJsZUFzKE1ldGhvZFR5cGUgbmV3VHlwZSwgYm9vbGVhbiBrZWVwSW50ZXJmYWNlcykgeworICAgICAgICBpZiAoIVZlcmlmeVR5cGUuaXNOdWxsQ29udmVyc2lvbihyZXR1cm5UeXBlKCksIG5ld1R5cGUucmV0dXJuVHlwZSgpLCBrZWVwSW50ZXJmYWNlcykpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzQXJlVmlld2FibGVBcyhuZXdUeXBlLCBrZWVwSW50ZXJmYWNlcyk7CisgICAgfQorICAgIC8qKiBUcnVlIGlmIHRoZSBuZXcgcGFyYW1ldGVycyBjYW4gYmUgdmlld2VkICh3L28gY2FzdGluZykgdW5kZXIgdGhlIG9sZCBwYXJhbWV0ZXIgdHlwZXMuICovCisgICAgLypub24tcHVibGljKi8KKyAgICBib29sZWFuIHBhcmFtZXRlcnNBcmVWaWV3YWJsZUFzKE1ldGhvZFR5cGUgbmV3VHlwZSwgYm9vbGVhbiBrZWVwSW50ZXJmYWNlcykgeworICAgICAgICBpZiAoZm9ybSA9PSBuZXdUeXBlLmZvcm0gJiYgZm9ybS5lcmFzZWRUeXBlID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIG15IHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGFyZSBhbGwgT2JqZWN0CisgICAgICAgIGlmIChwdHlwZXMgPT0gbmV3VHlwZS5wdHlwZXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgaW50IGFyZ2MgPSBwYXJhbWV0ZXJDb3VudCgpOwogICAgICAgICBpZiAoYXJnYyAhPSBuZXdUeXBlLnBhcmFtZXRlckNvdW50KCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIVZlcmlmeVR5cGUuaXNOdWxsQ29udmVyc2lvbihuZXdUeXBlLnBhcmFtZXRlclR5cGUoaSksIHBhcmFtZXRlclR5cGUoaSkpKQorICAgICAgICAgICAgaWYgKCFWZXJpZnlUeXBlLmlzTnVsbENvbnZlcnNpb24obmV3VHlwZS5wYXJhbWV0ZXJUeXBlKGkpLCBwYXJhbWV0ZXJUeXBlKGkpLCBrZWVwSW50ZXJmYWNlcykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAvKm5vbi1wdWJsaWMqLwogICAgIGJvb2xlYW4gaXNDYXN0YWJsZVRvKE1ldGhvZFR5cGUgbmV3VHlwZSkgeworICAgICAgICBNZXRob2RUeXBlRm9ybSBvbGRGb3JtID0gdGhpcy5mb3JtKCk7CisgICAgICAgIE1ldGhvZFR5cGVGb3JtIG5ld0Zvcm0gPSBuZXdUeXBlLmZvcm0oKTsKKyAgICAgICAgaWYgKG9sZEZvcm0gPT0gbmV3Rm9ybSkKKyAgICAgICAgICAgIC8vIHNhbWUgcGFyYW1ldGVyIGNvdW50LCBzYW1lIHByaW1pdGl2ZS9vYmplY3QgbWl4CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgaW50IGFyZ2MgPSBwYXJhbWV0ZXJDb3VudCgpOwogICAgICAgICBpZiAoYXJnYyAhPSBuZXdUeXBlLnBhcmFtZXRlckNvdW50KCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyBDb3JuZXIgY2FzZTogIGJveGluZyAocHJpbWl0aXZlLXRvLXJlZmVyZW5jZSkgbXVzdCBoYXZlIGEgcGxhdXNpYmxlIHRhcmdldCB0eXBlCisgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgbWF5IGhhdmUgdG8gcmV0dXJuIGZhbHNlIGZvciBhIGJveGluZyBvcGVyYXRpb24uCisgICAgICAgIGlmICghY2FuQ2FzdChyZXR1cm5UeXBlKCksIG5ld1R5cGUucmV0dXJuVHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5ld0Zvcm0ucHJpbWl0aXZlUGFyYW1ldGVyQ291bnQoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBubyBwcmltaXRpdmUgc291cmNlcyB0byBtZXNzIHRoaW5ncyB1cAorICAgICAgICBpZiAob2xkRm9ybS5lcmFzZWRUeXBlID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIG5vIGZ1bm55IHRhcmdldCByZWZlcmVuY2VzIHRvIG1lc3MgdGhpbmdzIHVwCisgICAgICAgIHJldHVybiBjYW5DYXN0UGFyYW1ldGVycyhuZXdUeXBlLnB0eXBlcywgcHR5cGVzKTsKICAgICB9CiAgICAgLypub24tcHVibGljKi8KICAgICBib29sZWFuIGlzQ29udmVydGlibGVUbyhNZXRob2RUeXBlIG5ld1R5cGUpIHsKKyAgICAgICAgTWV0aG9kVHlwZUZvcm0gb2xkRm9ybSA9IHRoaXMuZm9ybSgpOworICAgICAgICBNZXRob2RUeXBlRm9ybSBuZXdGb3JtID0gbmV3VHlwZS5mb3JtKCk7CisgICAgICAgIGlmIChvbGRGb3JtID09IG5ld0Zvcm0pCisgICAgICAgICAgICAvLyBzYW1lIHBhcmFtZXRlciBjb3VudCwgc2FtZSBwcmltaXRpdmUvb2JqZWN0IG1peAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGlmICghY2FuQ29udmVydChyZXR1cm5UeXBlKCksIG5ld1R5cGUucmV0dXJuVHlwZSgpKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGFyZ2MgPSBwYXJhbWV0ZXJDb3VudCgpOwotICAgICAgICBpZiAoYXJnYyAhPSBuZXdUeXBlLnBhcmFtZXRlckNvdW50KCkpCisgICAgICAgIENsYXNzPD8+W10gc3JjVHlwZXMgPSBuZXdUeXBlLnB0eXBlczsKKyAgICAgICAgQ2xhc3M8Pz5bXSBkc3RUeXBlcyA9IHB0eXBlczsKKyAgICAgICAgaWYgKHNyY1R5cGVzID09IGRzdFR5cGVzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGludCBhcmdjOworICAgICAgICBpZiAoKGFyZ2MgPSBzcmNUeXBlcy5sZW5ndGgpICE9IGRzdFR5cGVzLmxlbmd0aCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghY2FuQ29udmVydChuZXdUeXBlLnBhcmFtZXRlclR5cGUoaSksIHBhcmFtZXRlclR5cGUoaSkpKQorICAgICAgICBpZiAoYXJnYyA8PSAxKSB7CisgICAgICAgICAgICBpZiAoYXJnYyA9PSAxICYmICFjYW5Db252ZXJ0KHNyY1R5cGVzWzBdLCBkc3RUeXBlc1swXSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChvbGRGb3JtLnByaW1pdGl2ZVBhcmFtZXRlckNvdW50KCkgPT0gMCAmJiBvbGRGb3JtLmVyYXNlZFR5cGUgPT0gdGhpcykgfHwKKyAgICAgICAgICAgIChuZXdGb3JtLnByaW1pdGl2ZVBhcmFtZXRlckNvdW50KCkgPT0gMCAmJiBuZXdGb3JtLmVyYXNlZFR5cGUgPT0gbmV3VHlwZSkpIHsKKyAgICAgICAgICAgIC8vIFNvbWV3aGF0IGNvbXBsaWNhdGVkIHRlc3QgdG8gYXZvaWQgYSBsb29wIG9mIDIgb3IgbW9yZSB0cmlwcy4KKyAgICAgICAgICAgIC8vIElmIGVpdGhlciB0eXBlIGhhcyBvbmx5IE9iamVjdCBwYXJhbWV0ZXJzLCB3ZSBrbm93IHdlIGNhbiBjb252ZXJ0LgorICAgICAgICAgICAgYXNzZXJ0KGNhbkNvbnZlcnRQYXJhbWV0ZXJzKHNyY1R5cGVzLCBkc3RUeXBlcykpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhbkNvbnZlcnRQYXJhbWV0ZXJzKHNyY1R5cGVzLCBkc3RUeXBlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNhbkNhc3RQYXJhbWV0ZXJzKENsYXNzPD8+W10gc3JjVHlwZXMsIENsYXNzPD8+W10gZHN0VHlwZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjYW5DYXN0KHNyY1R5cGVzW2ldLCBkc3RUeXBlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNhbkNvbnZlcnRQYXJhbWV0ZXJzKENsYXNzPD8+W10gc3JjVHlwZXMsIENsYXNzPD8+W10gZHN0VHlwZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjYW5Db252ZXJ0KHNyY1R5cGVzW2ldLCBkc3RUeXBlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5DYXN0KENsYXNzPD8+IHNyYywgQ2xhc3M8Pz4gZHN0KSB7CisgICAgICAgIGlmIChzcmMuaXNQcmltaXRpdmUoKSAmJiAhZHN0LmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmIChkc3QgPT0gT2JqZWN0LmNsYXNzIHx8IGRzdC5pc0ludGVyZmFjZSgpKSAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAvLyBIZXJlIGlzIHRoZSBjb3JuZXIgY2FzZSB0aGF0IGlzIG5vdCBjYXN0YWJsZS4gIEV4YW1wbGU6ICBpbnQgLT4gU3RyaW5nCisgICAgICAgICAgICBXcmFwcGVyIHN3ID0gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKHNyYyk7CisgICAgICAgICAgICByZXR1cm4gZHN0LmlzQXNzaWduYWJsZUZyb20oc3cud3JhcHBlclR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgLypub24tcHVibGljKi8KICAgICBzdGF0aWMgYm9vbGVhbiBjYW5Db252ZXJ0KENsYXNzPD8+IHNyYywgQ2xhc3M8Pz4gZHN0KSB7CiAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgYSBmZXcgY2FzZXM6Ci0gICAgICAgIGlmIChzcmMgPT0gZHN0IHx8IGRzdCA9PSBPYmplY3QuY2xhc3MpICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKHNyYyA9PSBkc3QgfHwgc3JjID09IE9iamVjdC5jbGFzcyB8fCBkc3QgPT0gT2JqZWN0LmNsYXNzKSAgcmV0dXJuIHRydWU7CiAgICAgICAgIC8vIHRoZSByZW1haW5kZXIgb2YgdGhpcyBsb2dpYyBpcyBkb2N1bWVudGVkIGluIE1ldGhvZEhhbmRsZS5hc1R5cGUKICAgICAgICAgaWYgKHNyYy5pc1ByaW1pdGl2ZSgpKSB7CiAgICAgICAgICAgICAvLyBjYW4gZm9yY2Ugdm9pZCB0byBhbiBleHBsaWNpdCBudWxsLCBhIGxhIHJlZmxlY3QuTWV0aG9kLmludm9rZQpAQCAtOTA3LDcgKzEwNTAsNyBAQAogICAgICAgICBpZiAoIWRlc2NyaXB0b3Iuc3RhcnRzV2l0aCgiKCIpIHx8ICAvLyBhbHNvIGdlbmVyYXRlcyBOUEUgaWYgbmVlZGVkCiAgICAgICAgICAgICBkZXNjcmlwdG9yLmluZGV4T2YoJyknKSA8IDAgfHwKICAgICAgICAgICAgIGRlc2NyaXB0b3IuaW5kZXhPZignLicpID49IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3QgYSBtZXRob2QgZGVzY3JpcHRvcjogIitkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGEgbWV0aG9kIGRlc2NyaXB0b3I6ICIrZGVzY3JpcHRvcik7CiAgICAgICAgIExpc3Q8Q2xhc3M8Pz4+IHR5cGVzID0gQnl0ZWNvZGVEZXNjcmlwdG9yLnBhcnNlTWV0aG9kKGRlc2NyaXB0b3IsIGxvYWRlcik7CiAgICAgICAgIENsYXNzPD8+IHJ0eXBlID0gdHlwZXMucmVtb3ZlKHR5cGVzLnNpemUoKSAtIDEpOwogICAgICAgICBjaGVja1Nsb3RDb3VudCh0eXBlcy5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RUeXBlRm9ybS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RUeXBlRm9ybS5qYXZhCmluZGV4IGQzNGEyOTkuLjQzZTg1NTggMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZUZvcm0uamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZFR5cGVGb3JtLmphdmEKQEAgLTQ3LDE1ICs0NywxNyBAQAogICAgIGZpbmFsIGludFtdIGFyZ1RvU2xvdFRhYmxlLCBzbG90VG9BcmdUYWJsZTsKICAgICBmaW5hbCBsb25nIGFyZ0NvdW50czsgICAgICAgICAgICAgICAvLyBwYWNrZWQgc2xvdCAmIHZhbHVlIGNvdW50cwogICAgIGZpbmFsIGxvbmcgcHJpbUNvdW50czsgICAgICAgICAgICAgIC8vIHBhY2tlZCBwcmltICYgZG91YmxlIGNvdW50cwotICAgIGZpbmFsIGludCB2bXNsb3RzOyAgICAgICAgICAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBwYXJhbWV0ZXIgc2xvdHMKICAgICBmaW5hbCBNZXRob2RUeXBlIGVyYXNlZFR5cGU7ICAgICAgICAvLyB0aGUgY2Fub25pY2FsIGVyYXN1cmUKICAgICBmaW5hbCBNZXRob2RUeXBlIGJhc2ljVHlwZTsgICAgICAgICAvLyB0aGUgY2Fub25pY2FsIGVyYXN1cmUsIHdpdGggcHJpbWl0aXZlcyBzaW1wbGlmaWVkCiAKICAgICAvLyBDYWNoZWQgYWRhcHRlciBpbmZvcm1hdGlvbjoKLSAgICBAU3RhYmxlIFN0cmluZyB0eXBlU3RyaW5nOyAgICAgICAgICAgLy8gYXJndW1lbnQgdHlwZSBzaWduYXR1cmUgY2hhcmFjdGVycwotICAgIEBTdGFibGUgTWV0aG9kSGFuZGxlIGdlbmVyaWNJbnZva2VyOyAvLyBKVk0gaG9vayBmb3IgaW5leGFjdCBpbnZva2UKLSAgICBAU3RhYmxlIE1ldGhvZEhhbmRsZSBiYXNpY0ludm9rZXI7ICAgLy8gY2FjaGVkIGluc3RhbmNlIG9mIE1ILmludm9rZUJhc2ljCi0gICAgQFN0YWJsZSBNZXRob2RIYW5kbGUgbmFtZWRGdW5jdGlvbkludm9rZXI7IC8vIGNhY2hlZCBoZWxwZXIgZm9yIExGLk5hbWVkRnVuY3Rpb24KKyAgICBAU3RhYmxlIGZpbmFsIE1ldGhvZEhhbmRsZVtdIG1ldGhvZEhhbmRsZXM7CisgICAgLy8gSW5kZXhlcyBpbnRvIG1ldGhvZEhhbmRsZXM6CisgICAgc3RhdGljIGZpbmFsIGludAorICAgICAgICAgICAgTUhfQkFTSUNfSU5WICAgICAgPSAgMCwgIC8vIGNhY2hlZCBpbnN0YW5jZSBvZiBNSC5pbnZva2VCYXNpYworICAgICAgICAgICAgTUhfTkZfSU5WICAgICAgICAgPSAgMSwgIC8vIGNhY2hlZCBoZWxwZXIgZm9yIExGLk5hbWVkRnVuY3Rpb24KKyAgICAgICAgICAgIE1IX1VOSU5JVF9DUyAgICAgID0gIDIsICAvLyB1bmluaXRpYWxpemVkIGNhbGwgc2l0ZQorICAgICAgICAgICAgTUhfTElNSVQgICAgICAgICAgPSAgMzsKIAogICAgIC8vIENhY2hlZCBsYW1iZGEgZm9ybSBpbmZvcm1hdGlvbiwgZm9yIGJhc2ljIHR5cGVzIG9ubHk6CiAgICAgZmluYWwgQFN0YWJsZSBMYW1iZGFGb3JtW10gbGFtYmRhRm9ybXM7CkBAIC02OCwyNiArNzAsNTUgQEAKICAgICAgICAgICAgIExGX0lOVklOVEVSRkFDRSAgID0gIDQsCiAgICAgICAgICAgICBMRl9JTlZTVEFUSUNfSU5JVCA9ICA1LCAgLy8gRE1IIGludm9rZVN0YXRpYyB3aXRoIDxjbGluaXQ+IGJhcnJpZXIKICAgICAgICAgICAgIExGX0lOVEVSUFJFVCAgICAgID0gIDYsICAvLyBMRiBpbnRlcnByZXRlcgotICAgICAgICAgICAgTEZfQ09VTlRFUiAgICAgICAgPSAgNywgIC8vIENNSCB3cmFwcGVyCi0gICAgICAgICAgICBMRl9SRUlOVk9LRSAgICAgICA9ICA4LCAgLy8gb3RoZXIgd3JhcHBlcgotICAgICAgICAgICAgTEZfRVhfTElOS0VSICAgICAgPSAgOSwgIC8vIGludm9rZUV4YWN0X01UCi0gICAgICAgICAgICBMRl9FWF9JTlZPS0VSICAgICA9IDEwLCAgLy8gaW52b2tlRXhhY3QgTUgKLSAgICAgICAgICAgIExGX0dFTl9MSU5LRVIgICAgID0gMTEsCi0gICAgICAgICAgICBMRl9HRU5fSU5WT0tFUiAgICA9IDEyLAorICAgICAgICAgICAgTEZfUkVCSU5EICAgICAgICAgPSAgNywgIC8vIEJvdW5kTWV0aG9kSGFuZGxlCisgICAgICAgICAgICBMRl9ERUxFR0FURSAgICAgICA9ICA4LCAgLy8gRGVsZWdhdGluZ01ldGhvZEhhbmRsZQorICAgICAgICAgICAgTEZfRVhfTElOS0VSICAgICAgPSAgOSwgIC8vIGludm9rZUV4YWN0X01UIChmb3IgaW52b2tlaGFuZGxlKQorICAgICAgICAgICAgTEZfRVhfSU5WT0tFUiAgICAgPSAxMCwgIC8vIE1Icy5pbnZva2VFeGFjdAorICAgICAgICAgICAgTEZfR0VOX0xJTktFUiAgICAgPSAxMSwgIC8vIGdlbmVyaWMgaW52b2tlX01UIChmb3IgaW52b2tlaGFuZGxlKQorICAgICAgICAgICAgTEZfR0VOX0lOVk9LRVIgICAgPSAxMiwgIC8vIGdlbmVyaWMgTUhzLmludm9rZQogICAgICAgICAgICAgTEZfQ1NfTElOS0VSICAgICAgPSAxMywgIC8vIGxpbmtUb0NhbGxTaXRlX0NTCiAgICAgICAgICAgICBMRl9NSF9MSU5LRVIgICAgICA9IDE0LCAgLy8gbGlua1RvQ2FsbFNpdGVfTUgKLSAgICAgICAgICAgIExGX0dXQyAgICAgICAgICAgID0gMTUsCi0gICAgICAgICAgICBMRl9MSU1JVCAgICAgICAgICA9IDE2OworICAgICAgICAgICAgTEZfR1dDICAgICAgICAgICAgPSAxNSwgIC8vIGd1YXJkV2l0aENhdGNoIChjYXRjaEV4Y2VwdGlvbikKKyAgICAgICAgICAgIExGX0dXVCAgICAgICAgICAgID0gMTYsICAvLyBndWFyZFdpdGhUZXN0CisgICAgICAgICAgICBMRl9MSU1JVCAgICAgICAgICA9IDE3OwogCisgICAgLyoqIFJldHVybiB0aGUgdHlwZSBjb3JyZXNwb25kaW5nIHVuaXF1ZWx5ICgxLTEpIHRvIHRoaXMgTVQtZm9ybS4KKyAgICAgKiAgSXQgbWlnaHQgaGF2ZSBhbnkgcHJpbWl0aXZlIHJldHVybnMgb3IgYXJndW1lbnRzLCBidXQgd2lsbCBoYXZlIG5vIHJlZmVyZW5jZXMgZXhjZXB0IE9iamVjdC4KKyAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kVHlwZSBlcmFzZWRUeXBlKCkgewogICAgICAgICByZXR1cm4gZXJhc2VkVHlwZTsKICAgICB9CiAKKyAgICAvKiogUmV0dXJuIHRoZSBiYXNpYyB0eXBlIGRlcml2ZWQgZnJvbSB0aGUgZXJhc2VkIHR5cGUgb2YgdGhpcyBNVC1mb3JtLgorICAgICAqICBBIGJhc2ljIHR5cGUgaXMgZXJhc2VkIChhbGwgcmVmZXJlbmNlcyBPYmplY3QpIGFuZCBhbHNvIGhhcyBhbGwgcHJpbWl0aXZlCisgICAgICogIHR5cGVzIChleGNlcHQgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlLCB2b2lkKSBub3JtYWxpemVkIHRvIGludC4KKyAgICAgKiAgU3VjaCBiYXNpYyB0eXBlcyBjb3JyZXNwb25kIHRvIGxvdy1sZXZlbCBKVk0gY2FsbGluZyBzZXF1ZW5jZXMuCisgICAgICovCiAgICAgcHVibGljIE1ldGhvZFR5cGUgYmFzaWNUeXBlKCkgewogICAgICAgICByZXR1cm4gYmFzaWNUeXBlOwogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBhc3NlcnRJc0Jhc2ljVHlwZSgpIHsKKyAgICAgICAgLy8gcHJpbWl0aXZlcyBtdXN0IGJlIGZsYXR0ZW5lZCBhbHNvCisgICAgICAgIGFzc2VydChlcmFzZWRUeXBlID09IGJhc2ljVHlwZSkKKyAgICAgICAgICAgICAgICA6ICJlcmFzZWRUeXBlOiAiICsgZXJhc2VkVHlwZSArICIgIT0gYmFzaWNUeXBlOiAiICsgYmFzaWNUeXBlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kSGFuZGxlIGNhY2hlZE1ldGhvZEhhbmRsZShpbnQgd2hpY2gpIHsKKyAgICAgICAgYXNzZXJ0KGFzc2VydElzQmFzaWNUeXBlKCkpOworICAgICAgICByZXR1cm4gbWV0aG9kSGFuZGxlc1t3aGljaF07CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHB1YmxpYyBNZXRob2RIYW5kbGUgc2V0Q2FjaGVkTWV0aG9kSGFuZGxlKGludCB3aGljaCwgTWV0aG9kSGFuZGxlIG1oKSB7CisgICAgICAgIC8vIFNpbXVsYXRlIGEgQ0FTLCB0byBhdm9pZCByYWN5IGR1cGxpY2F0aW9uIG9mIHJlc3VsdHMuCisgICAgICAgIE1ldGhvZEhhbmRsZSBwcmV2ID0gbWV0aG9kSGFuZGxlc1t3aGljaF07CisgICAgICAgIGlmIChwcmV2ICE9IG51bGwpICByZXR1cm4gcHJldjsKKyAgICAgICAgcmV0dXJuIG1ldGhvZEhhbmRsZXNbd2hpY2hdID0gbWg7CisgICAgfQorCiAgICAgcHVibGljIExhbWJkYUZvcm0gY2FjaGVkTGFtYmRhRm9ybShpbnQgd2hpY2gpIHsKKyAgICAgICAgYXNzZXJ0KGFzc2VydElzQmFzaWNUeXBlKCkpOwogICAgICAgICByZXR1cm4gbGFtYmRhRm9ybXNbd2hpY2hdOwogICAgIH0KIApAQCAtOTgsMjggKzEyOSw2IEBACiAgICAgICAgIHJldHVybiBsYW1iZGFGb3Jtc1t3aGljaF0gPSBmb3JtOwogICAgIH0KIAotICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgYmFzaWNJbnZva2VyKCkgewotICAgICAgICBhc3NlcnQoZXJhc2VkVHlwZSA9PSBiYXNpY1R5cGUpIDogImVyYXNlZFR5cGU6ICIgKyBlcmFzZWRUeXBlICsgIiAhPSBiYXNpY1R5cGU6ICIgKyBiYXNpY1R5cGU7ICAvLyBwcmltaXRpdmVzIG11c3QgYmUgZmxhdHRlbmVkIGFsc28KLSAgICAgICAgTWV0aG9kSGFuZGxlIGludm9rZXIgPSBiYXNpY0ludm9rZXI7Ci0gICAgICAgIGlmIChpbnZva2VyICE9IG51bGwpICByZXR1cm4gaW52b2tlcjsKLSAgICAgICAgaW52b2tlciA9IERpcmVjdE1ldGhvZEhhbmRsZS5tYWtlKGludm9rZUJhc2ljTWV0aG9kKGJhc2ljVHlwZSkpOwotICAgICAgICBiYXNpY0ludm9rZXIgPSBpbnZva2VyOwotICAgICAgICByZXR1cm4gaW52b2tlcjsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIG5leHQgb25lIGlzIGNhbGxlZCBmcm9tIExhbWJkYUZvcm0uTmFtZWRGdW5jdGlvbi48aW5pdD4uCi0gICAgLypub24tcHVibGljKi8gc3RhdGljIE1lbWJlck5hbWUgaW52b2tlQmFzaWNNZXRob2QoTWV0aG9kVHlwZSBiYXNpY1R5cGUpIHsKLSAgICAgICAgYXNzZXJ0KGJhc2ljVHlwZSA9PSBiYXNpY1R5cGUuYmFzaWNUeXBlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gRG8gYXBwcm94aW1hdGVseSB0aGUgc2FtZSBhcyB0aGlzIHB1YmxpYyBBUEkgY2FsbDoKLSAgICAgICAgICAgIC8vICAgTG9va3VwLmZpbmRWaXJ0dWFsKE1ldGhvZEhhbmRsZS5jbGFzcywgbmFtZSwgdHlwZSk7Ci0gICAgICAgICAgICAvLyBCdXQgYnlwYXNzIGFjY2VzcyBhbmQgY29ybmVyIGNhc2UgY2hlY2tzLCBzaW5jZSB3ZSBrbm93IGV4YWN0bHkgd2hhdCB3ZSBuZWVkLgotICAgICAgICAgICAgcmV0dXJuIElNUExfTE9PS1VQLnJlc29sdmVPckZhaWwoUkVGX2ludm9rZVZpcnR1YWwsIE1ldGhvZEhhbmRsZS5jbGFzcywgImludm9rZUJhc2ljIiwgYmFzaWNUeXBlKTsKLSAgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoIkpWTSBjYW5ub3QgZmluZCBpbnZva2VyIGZvciAiK2Jhc2ljVHlwZSwgZXgpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQnVpbGQgYW4gTVRGIGZvciBhIGdpdmVuIHR5cGUsIHdoaWNoIG11c3QgaGF2ZSBhbGwgcmVmZXJlbmNlcyBlcmFzZWQgdG8gT2JqZWN0LgogICAgICAqIFRoaXMgTVRGIHdpbGwgc3RhbmQgZm9yIHRoYXQgdHlwZSBhbmQgYWxsIHVuLWVyYXNlZCB2YXJpYXRpb25zLgpAQCAtMTcyLDYgKzE4MSwxNiBAQAogICAgICAgICAgICAgdGhpcy5iYXNpY1R5cGUgPSBlcmFzZWRUeXBlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhpcy5iYXNpY1R5cGUgPSBNZXRob2RUeXBlLm1ha2VJbXBsKGJ0LCBicHRzLCB0cnVlKTsKKyAgICAgICAgICAgIC8vIGZpbGwgaW4gcmVzdCBvZiBkYXRhIGZyb20gdGhlIGJhc2ljIHR5cGU6CisgICAgICAgICAgICBNZXRob2RUeXBlRm9ybSB0aGF0ID0gdGhpcy5iYXNpY1R5cGUuZm9ybSgpOworICAgICAgICAgICAgYXNzZXJ0KHRoaXMgIT0gdGhhdCk7CisgICAgICAgICAgICB0aGlzLnByaW1Db3VudHMgPSB0aGF0LnByaW1Db3VudHM7CisgICAgICAgICAgICB0aGlzLmFyZ0NvdW50cyA9IHRoYXQuYXJnQ291bnRzOworICAgICAgICAgICAgdGhpcy5hcmdUb1Nsb3RUYWJsZSA9IHRoYXQuYXJnVG9TbG90VGFibGU7CisgICAgICAgICAgICB0aGlzLnNsb3RUb0FyZ1RhYmxlID0gdGhhdC5zbG90VG9BcmdUYWJsZTsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kSGFuZGxlcyA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmxhbWJkYUZvcm1zID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAobGFjICE9IDApIHsKICAgICAgICAgICAgIGludCBzbG90ID0gcHR5cGVDb3VudCArIGxhYzsKQEAgLTE4NywxMCArMjA2LDE0IEBACiAgICAgICAgICAgICAgICAgYXJnVG9TbG90VGFiWzEraV0gID0gc2xvdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFzc2VydChzbG90ID09IDApOyAgLy8gZmlsbGVkIHRoZSB0YWJsZQotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHJpbUNvdW50cyA9IHBhY2sobHJjLCBwcmMsIGxhYywgcGFjKTsKLSAgICAgICAgdGhpcy5hcmdDb3VudHMgPSBwYWNrKHJzbG90Q291bnQsIHJ0eXBlQ291bnQsIHBzbG90Q291bnQsIHB0eXBlQ291bnQpOwotICAgICAgICBpZiAoc2xvdFRvQXJnVGFiID09IG51bGwpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwYWMgIT0gMCkgeworICAgICAgICAgICAgLy8gaGF2ZSBwcmltaXRpdmVzIGJ1dCBubyBsb25nIHByaW1pdGl2ZXM7IHNoYXJlIHNsb3QgY291bnRzIHdpdGggZ2VuZXJpYworICAgICAgICAgICAgYXNzZXJ0KHB0eXBlQ291bnQgPT0gcHNsb3RDb3VudCk7CisgICAgICAgICAgICBNZXRob2RUeXBlRm9ybSB0aGF0ID0gTWV0aG9kVHlwZS5nZW5lcmljTWV0aG9kVHlwZShwdHlwZUNvdW50KS5mb3JtKCk7CisgICAgICAgICAgICBhc3NlcnQodGhpcyAhPSB0aGF0KTsKKyAgICAgICAgICAgIHNsb3RUb0FyZ1RhYiA9IHRoYXQuc2xvdFRvQXJnVGFibGU7CisgICAgICAgICAgICBhcmdUb1Nsb3RUYWIgPSB0aGF0LmFyZ1RvU2xvdFRhYmxlOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IHNsb3QgPSBwdHlwZUNvdW50OyAvLyBmaXJzdCBhcmcgaXMgZGVlcGVzdCBpbiBzdGFjawogICAgICAgICAgICAgc2xvdFRvQXJnVGFiID0gbmV3IGludFtzbG90KzFdOwogICAgICAgICAgICAgYXJnVG9TbG90VGFiID0gbmV3IGludFsxK3B0eXBlQ291bnRdOwpAQCAtMjAxLDE5ICsyMjQsMTcgQEAKICAgICAgICAgICAgICAgICBhcmdUb1Nsb3RUYWJbMStpXSAgPSBzbG90OwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHRoaXMucHJpbUNvdW50cyA9IHBhY2sobHJjLCBwcmMsIGxhYywgcGFjKTsKKyAgICAgICAgdGhpcy5hcmdDb3VudHMgPSBwYWNrKHJzbG90Q291bnQsIHJ0eXBlQ291bnQsIHBzbG90Q291bnQsIHB0eXBlQ291bnQpOwogICAgICAgICB0aGlzLmFyZ1RvU2xvdFRhYmxlID0gYXJnVG9TbG90VGFiOwogICAgICAgICB0aGlzLnNsb3RUb0FyZ1RhYmxlID0gc2xvdFRvQXJnVGFiOwogCiAgICAgICAgIGlmIChwc2xvdENvdW50ID49IDI1NikgIHRocm93IG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9vIG1hbnkgYXJndW1lbnRzIik7CiAKLSAgICAgICAgLy8gc2VuZCBhIGZldyBiaXRzIGRvd24gdG8gdGhlIEpWTToKLSAgICAgICAgdGhpcy52bXNsb3RzID0gcGFyYW1ldGVyU2xvdENvdW50KCk7Ci0KLSAgICAgICAgaWYgKGJhc2ljVHlwZSA9PSBlcmFzZWRUeXBlKSB7Ci0gICAgICAgICAgICBsYW1iZGFGb3JtcyA9IG5ldyBMYW1iZGFGb3JtW0xGX0xJTUlUXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxhbWJkYUZvcm1zID0gbnVsbDsgIC8vIGNvdWxkIGJlIGJhc2ljVHlwZS5mb3JtKCkubGFtYmRhRm9ybXM7Ci0gICAgICAgIH0KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBjYWNoZXMsIGJ1dCBvbmx5IGZvciBiYXNpYyB0eXBlcworICAgICAgICBhc3NlcnQoYmFzaWNUeXBlID09IGVyYXNlZFR5cGUpOworICAgICAgICB0aGlzLmxhbWJkYUZvcm1zID0gbmV3IExhbWJkYUZvcm1bTEZfTElNSVRdOworICAgICAgICB0aGlzLm1ldGhvZEhhbmRsZXMgPSBuZXcgTWV0aG9kSGFuZGxlW01IX0xJTUlUXTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhY2soaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKQEAgLTMwMCw3ICszMjEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kVHlwZSBjYW5vbmljYWxpemUoTWV0aG9kVHlwZSBtdCwgaW50IGhvd1JldCwgaW50IGhvd0FyZ3MpIHsKICAgICAgICAgQ2xhc3M8Pz5bXSBwdHlwZXMgPSBtdC5wdHlwZXMoKTsKLSAgICAgICAgQ2xhc3M8Pz5bXSBwdGMgPSBNZXRob2RUeXBlRm9ybS5jYW5vbmljYWxpemVzKHB0eXBlcywgaG93QXJncyk7CisgICAgICAgIENsYXNzPD8+W10gcHRjID0gTWV0aG9kVHlwZUZvcm0uY2Fub25pY2FsaXplQWxsKHB0eXBlcywgaG93QXJncyk7CiAgICAgICAgIENsYXNzPD8+IHJ0eXBlID0gbXQucmV0dXJuVHlwZSgpOwogICAgICAgICBDbGFzczw/PiBydGMgPSBNZXRob2RUeXBlRm9ybS5jYW5vbmljYWxpemUocnR5cGUsIGhvd1JldCk7CiAgICAgICAgIGlmIChwdGMgPT0gbnVsbCAmJiBydGMgPT0gbnVsbCkgewpAQCAtMzY4LDcgKzM4OSw3IEBACiAgICAgLyoqIENhbm9uaWNhbGl6ZSBlYWNoIHBhcmFtIHR5cGUgaW4gdGhlIGdpdmVuIGFycmF5LgogICAgICAqICBSZXR1cm4gbnVsbCBpZiBhbGwgdHlwZXMgYXJlIGFscmVhZHkgY2Fub25pY2FsaXplZC4KICAgICAgKi8KLSAgICBzdGF0aWMgQ2xhc3M8Pz5bXSBjYW5vbmljYWxpemVzKENsYXNzPD8+W10gdHMsIGludCBob3cpIHsKKyAgICBzdGF0aWMgQ2xhc3M8Pz5bXSBjYW5vbmljYWxpemVBbGwoQ2xhc3M8Pz5bXSB0cywgaW50IGhvdykgewogICAgICAgICBDbGFzczw/PltdIGNzID0gbnVsbDsKICAgICAgICAgZm9yIChpbnQgaW1heCA9IHRzLmxlbmd0aCwgaSA9IDA7IGkgPCBpbWF4OyBpKyspIHsKICAgICAgICAgICAgIENsYXNzPD8+IGMgPSBjYW5vbmljYWxpemUodHNbaV0sIGhvdyk7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL1NpbXBsZU1ldGhvZEhhbmRsZS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9TaW1wbGVNZXRob2RIYW5kbGUuamF2YQppbmRleCBjMmQ4ZTU4Li5jOWUzN2E4IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL1NpbXBsZU1ldGhvZEhhbmRsZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvU2ltcGxlTWV0aG9kSGFuZGxlLmphdmEKQEAgLTI1LDQ2ICsyNSw3NyBAQAogCiBwYWNrYWdlIGphdmEubGFuZy5pbnZva2U7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5MYW1iZGFGb3JtLio7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlTmF0aXZlcy5Db25zdGFudHMuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybS5CYXNpY1R5cGUuKjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVTdGF0aWNzLio7CiAKIC8qKgogICogQSBtZXRob2QgaGFuZGxlIHdob3NlIGJlaGF2aW9yIGlzIGRldGVybWluZWQgb25seSBieSBpdHMgTGFtYmRhRm9ybS4KICAqIEBhdXRob3IganJvc2UKICAqLwotZmluYWwgY2xhc3MgU2ltcGxlTWV0aG9kSGFuZGxlIGV4dGVuZHMgTWV0aG9kSGFuZGxlIHsKK2ZpbmFsIGNsYXNzIFNpbXBsZU1ldGhvZEhhbmRsZSBleHRlbmRzIEJvdW5kTWV0aG9kSGFuZGxlIHsKICAgICBwcml2YXRlIFNpbXBsZU1ldGhvZEhhbmRsZShNZXRob2RUeXBlIHR5cGUsIExhbWJkYUZvcm0gZm9ybSkgewogICAgICAgICBzdXBlcih0eXBlLCBmb3JtKTsKICAgICB9CiAKLSAgICAvKm5vbi1wdWJsaWMqLyBzdGF0aWMgU2ltcGxlTWV0aG9kSGFuZGxlIG1ha2UoTWV0aG9kVHlwZSB0eXBlLCBMYW1iZGFGb3JtIGZvcm0pIHsKKyAgICAvKm5vbi1wdWJsaWMqLyBzdGF0aWMgQm91bmRNZXRob2RIYW5kbGUgbWFrZShNZXRob2RUeXBlIHR5cGUsIExhbWJkYUZvcm0gZm9ybSkgewogICAgICAgICByZXR1cm4gbmV3IFNpbXBsZU1ldGhvZEhhbmRsZSh0eXBlLCBmb3JtKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBNZXRob2RIYW5kbGUgYmluZEFyZ3VtZW50KGludCBwb3MsIGNoYXIgYmFzaWNUeXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgTWV0aG9kVHlwZSB0eXBlMiA9IHR5cGUoKS5kcm9wUGFyYW1ldGVyVHlwZXMocG9zLCBwb3MrMSk7Ci0gICAgICAgIExhbWJkYUZvcm0gZm9ybTIgPSBpbnRlcm5hbEZvcm0oKS5iaW5kKDErcG9zLCBCb3VuZE1ldGhvZEhhbmRsZS5TcGVjaWVzRGF0YS5FTVBUWSk7Ci0gICAgICAgIHJldHVybiBCb3VuZE1ldGhvZEhhbmRsZS5iaW5kU2luZ2xlKHR5cGUyLCBmb3JtMiwgYmFzaWNUeXBlLCB2YWx1ZSk7CisgICAgLypub24tcHVibGljKi8gc3RhdGljIGZpbmFsIFNwZWNpZXNEYXRhIFNQRUNJRVNfREFUQSA9IFNwZWNpZXNEYXRhLkVNUFRZOworCisgICAgLypub24tcHVibGljKi8gcHVibGljIFNwZWNpZXNEYXRhIHNwZWNpZXNEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIFNQRUNJRVNfREFUQTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBNZXRob2RIYW5kbGUgZHJvcEFyZ3VtZW50cyhNZXRob2RUeXBlIHNyY1R5cGUsIGludCBwb3MsIGludCBkcm9wcykgewotICAgICAgICBMYW1iZGFGb3JtIG5ld0Zvcm0gPSBpbnRlcm5hbEZvcm0oKS5hZGRBcmd1bWVudHMocG9zLCBzcmNUeXBlLnBhcmFtZXRlckxpc3QoKS5zdWJMaXN0KHBvcywgcG9zK2Ryb3BzKSk7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlTWV0aG9kSGFuZGxlKHNyY1R5cGUsIG5ld0Zvcm0pOworICAgIC8qbm9uLXB1YmxpYyovIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYpIHsKKyAgICAgICAgcmV0dXJuIG1ha2UobXQsIGxmKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBNZXRob2RIYW5kbGUgcGVybXV0ZUFyZ3VtZW50cyhNZXRob2RUeXBlIG5ld1R5cGUsIGludFtdIHJlb3JkZXIpIHsKLSAgICAgICAgTGFtYmRhRm9ybSBmb3JtMiA9IGludGVybmFsRm9ybSgpLnBlcm11dGVBcmd1bWVudHMoMSwgcmVvcmRlciwgYmFzaWNUeXBlcyhuZXdUeXBlLnBhcmFtZXRlckxpc3QoKSkpOwotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZU1ldGhvZEhhbmRsZShuZXdUeXBlLCBmb3JtMik7CisgICAgU3RyaW5nIGludGVybmFsUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuICJcbiYgQ2xhc3M9IitnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBNZXRob2RIYW5kbGUgY29weVdpdGgoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZikgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZU1ldGhvZEhhbmRsZShtdCwgbGYpOworICAgIC8qbm9uLXB1YmxpYyovIHB1YmxpYyBpbnQgZmllbGRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgLypub24tcHVibGljKi8gZmluYWwgQm91bmRNZXRob2RIYW5kbGUgY29weVdpdGhFeHRlbmRMKE1ldGhvZFR5cGUgbXQsIExhbWJkYUZvcm0gbGYsIE9iamVjdCBuYXJnKSB7CisgICAgICAgIHJldHVybiBCb3VuZE1ldGhvZEhhbmRsZS5iaW5kU2luZ2xlKG10LCBsZiwgbmFyZyk7IC8vIFVzZSBrbm93biBmYXN0IHBhdGguCisgICAgfQorICAgIEBPdmVycmlkZQorICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kSShNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBpbnQgbmFyZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGgoSV9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKG10LCBsZiwgbmFyZyk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgdGhyb3cgdW5jYXVnaHRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kSihNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBsb25nIG5hcmcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoQm91bmRNZXRob2RIYW5kbGUpIFNQRUNJRVNfREFUQS5leHRlbmRXaXRoKEpfVFlQRSkuY29uc3RydWN0b3IoKS5pbnZva2VCYXNpYyhtdCwgbGYsIG5hcmcpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICAvKm5vbi1wdWJsaWMqLyBmaW5hbCBCb3VuZE1ldGhvZEhhbmRsZSBjb3B5V2l0aEV4dGVuZEYoTWV0aG9kVHlwZSBtdCwgTGFtYmRhRm9ybSBsZiwgZmxvYXQgbmFyZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGgoRl9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKG10LCBsZiwgbmFyZyk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgdGhyb3cgdW5jYXVnaHRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIC8qbm9uLXB1YmxpYyovIGZpbmFsIEJvdW5kTWV0aG9kSGFuZGxlIGNvcHlXaXRoRXh0ZW5kRChNZXRob2RUeXBlIG10LCBMYW1iZGFGb3JtIGxmLCBkb3VibGUgbmFyZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChCb3VuZE1ldGhvZEhhbmRsZSkgU1BFQ0lFU19EQVRBLmV4dGVuZFdpdGgoRF9UWVBFKS5jb25zdHJ1Y3RvcigpLmludm9rZUJhc2ljKG10LCBsZiwgbmFyZyk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgdGhyb3cgdW5jYXVnaHRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9UeXBlQ29udmVydGluZ01ldGhvZEFkYXB0ZXIuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvVHlwZUNvbnZlcnRpbmdNZXRob2RBZGFwdGVyLmphdmEKaW5kZXggYWVjYmViNi4uNmJmYmY2YiAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9UeXBlQ29udmVydGluZ01ldGhvZEFkYXB0ZXIuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL1R5cGVDb252ZXJ0aW5nTWV0aG9kQWRhcHRlci5qYXZhCkBAIC0xNTgsMTkgKzE1OCwxOSBAQAogICAgICAgICB2aXNpdE1ldGhvZEluc24oT3Bjb2Rlcy5JTlZPS0VTVEFUSUMsCiAgICAgICAgICAgICAgICAgd3JhcHBlck5hbWUodyksCiAgICAgICAgICAgICAgICAgTkFNRV9CT1hfTUVUSE9ELAotICAgICAgICAgICAgICAgIGJveGluZ0Rlc2NyaXB0b3IodykpOworICAgICAgICAgICAgICAgIGJveGluZ0Rlc2NyaXB0b3IodyksIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDb252ZXJ0IHR5cGVzIGJ5IHVuYm94aW5nLiBUaGUgc291cmNlIHR5cGUgaXMga25vd24gdG8gYmUgYSBwcmltaXRpdmUgd3JhcHBlci4KLSAgICAgKiBAcGFyYW0gd3MgQSBwcmltaXRpdmUgd3JhcHBlciBjb3JyZXNwb25kaW5nIHRvIHdyYXBwZWQgcmVmZXJlbmNlIHNvdXJjZSB0eXBlCisgICAgICogQHBhcmFtIHNuYW1lIEEgcHJpbWl0aXZlIHdyYXBwZXIgY29ycmVzcG9uZGluZyB0byB3cmFwcGVkIHJlZmVyZW5jZSBzb3VyY2UgdHlwZQogICAgICAqIEBwYXJhbSB3dCBBIHByaW1pdGl2ZSB3cmFwcGVyIGJlaW5nIGNvbnZlcnRlZCB0bwogICAgICAqLwogICAgIHZvaWQgdW5ib3goU3RyaW5nIHNuYW1lLCBXcmFwcGVyIHd0KSB7CiAgICAgICAgIHZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRVZJUlRVQUwsCiAgICAgICAgICAgICAgICAgc25hbWUsCiAgICAgICAgICAgICAgICAgdW5ib3hNZXRob2Qod3QpLAotICAgICAgICAgICAgICAgIHVuYm94aW5nRGVzY3JpcHRvcih3dCkpOworICAgICAgICAgICAgICAgIHVuYm94aW5nRGVzY3JpcHRvcih3dCksIGZhbHNlKTsKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdG9yVG9OYW1lKFN0cmluZyBkZXNjKSB7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3Rvci5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IuamF2YQppbmRleCA3YTg1NTQ1Li4xNjY3MWViIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3Rvci5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yLmphdmEKQEAgLTk0LDkgKzk0LDIwIEBACiAgICAgLy8gRm9yIHNoYXJpbmcgb2YgQ29uc3RydWN0b3JBY2Nlc3NvcnMuIFRoaXMgYnJhbmNoaW5nIHN0cnVjdHVyZQogICAgIC8vIGlzIGN1cnJlbnRseSBvbmx5IHR3byBsZXZlbHMgZGVlcCAoaS5lLiwgb25lIHJvb3QgQ29uc3RydWN0b3IKICAgICAvLyBhbmQgcG90ZW50aWFsbHkgbWFueSBDb25zdHJ1Y3RvciBvYmplY3RzIHBvaW50aW5nIHRvIGl0LikKKyAgICAvLworICAgIC8vIElmIHRoaXMgYnJhbmNoaW5nIHN0cnVjdHVyZSB3b3VsZCBldmVyIGNvbnRhaW4gY3ljbGVzLCBkZWFkbG9ja3MgY2FuCisgICAgLy8gb2NjdXIgaW4gYW5ub3RhdGlvbiBjb2RlLgogICAgIHByaXZhdGUgQ29uc3RydWN0b3I8VD4gICAgICByb290OwogCiAgICAgLyoqCisgICAgICogVXNlZCBieSBFeGNlY3V0YWJsZSBmb3IgYW5ub3RhdGlvbiBzaGFyaW5nLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEV4ZWN1dGFibGUgZ2V0Um9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkgUmVmbGVjdEFjY2VzcyB0byBlbmFibGUKICAgICAgKiBpbnN0YW50aWF0aW9uIG9mIHRoZXNlIG9iamVjdHMgaW4gSmF2YSBjb2RlIGZyb20gdGhlIGphdmEubGFuZwogICAgICAqIHBhY2thZ2UgdmlhIHN1bi5yZWZsZWN0LkxhbmdSZWZsZWN0QWNjZXNzLgpAQCAtMTMyLDYgKzE0Myw5IEBACiAgICAgICAgIC8vIHdoaWNoIGltcGxpY2l0bHkgcmVxdWlyZXMgdGhhdCBuZXcgamF2YS5sYW5nLnJlZmxlY3QKICAgICAgICAgLy8gb2JqZWN0cyBiZSBmYWJyaWNhdGVkIGZvciBlYWNoIHJlZmxlY3RpdmUgY2FsbCBvbiBDbGFzcwogICAgICAgICAvLyBvYmplY3RzLikKKyAgICAgICAgaWYgKHRoaXMucm9vdCAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG5vdCBjb3B5IGEgbm9uLXJvb3QgQ29uc3RydWN0b3IiKTsKKwogICAgICAgICBDb25zdHJ1Y3RvcjxUPiByZXMgPSBuZXcgQ29uc3RydWN0b3I8PihjbGF6eiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvblR5cGVzLCBtb2RpZmllcnMsIHNsb3QsCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9FeGVjdXRhYmxlLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9FeGVjdXRhYmxlLmphdmEKaW5kZXggYjRlODg3NC4uNzBkODdkOCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL3JlZmxlY3QvRXhlY3V0YWJsZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9yZWZsZWN0L0V4ZWN1dGFibGUuamF2YQpAQCAtNTMsNiArNTMsMTEgQEAKICAgICBhYnN0cmFjdCBieXRlW10gZ2V0QW5ub3RhdGlvbkJ5dGVzKCk7CiAKICAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBtZXRob2QgdG8gYWxsb3cgY29kZSBzaGFyaW5nCisgICAgICovCisgICAgYWJzdHJhY3QgRXhlY3V0YWJsZSBnZXRSb290KCk7CisKKyAgICAvKioKICAgICAgKiBEb2VzIHRoZSBFeGVjdXRhYmxlIGhhdmUgZ2VuZXJpYyBpbmZvcm1hdGlvbi4KICAgICAgKi8KICAgICBhYnN0cmFjdCBib29sZWFuIGhhc0dlbmVyaWNJbmZvcm1hdGlvbigpOwpAQCAtNTQzLDExICs1NDgsMTYgQEAKIAogICAgIHByaXZhdGUgc3luY2hyb25pemVkICBNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBBbm5vdGF0aW9uPiBkZWNsYXJlZEFubm90YXRpb25zKCkgewogICAgICAgICBpZiAoZGVjbGFyZWRBbm5vdGF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWNsYXJlZEFubm90YXRpb25zID0gQW5ub3RhdGlvblBhcnNlci5wYXJzZUFubm90YXRpb25zKAotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25CeXRlcygpLAotICAgICAgICAgICAgICAgIHN1bi5taXNjLlNoYXJlZFNlY3JldHMuZ2V0SmF2YUxhbmdBY2Nlc3MoKS4KLSAgICAgICAgICAgICAgICBnZXRDb25zdGFudFBvb2woZ2V0RGVjbGFyaW5nQ2xhc3MoKSksCi0gICAgICAgICAgICAgICAgZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7CisgICAgICAgICAgICBFeGVjdXRhYmxlIHJvb3QgPSBnZXRSb290KCk7CisgICAgICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVjbGFyZWRBbm5vdGF0aW9ucyA9IHJvb3QuZGVjbGFyZWRBbm5vdGF0aW9ucygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWNsYXJlZEFubm90YXRpb25zID0gQW5ub3RhdGlvblBhcnNlci5wYXJzZUFubm90YXRpb25zKAorICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uQnl0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgc3VuLm1pc2MuU2hhcmVkU2VjcmV0cy5nZXRKYXZhTGFuZ0FjY2VzcygpLgorICAgICAgICAgICAgICAgICAgICBnZXRDb25zdGFudFBvb2woZ2V0RGVjbGFyaW5nQ2xhc3MoKSksCisgICAgICAgICAgICAgICAgICAgIGdldERlY2xhcmluZ0NsYXNzKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkZWNsYXJlZEFubm90YXRpb25zOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9GaWVsZC5qYXZhCmluZGV4IDZlMjQzYmMuLmJiMjNiMjIgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL3JlZmxlY3QvRmllbGQuamF2YQpAQCAtODEsNiArODEsOSBAQAogICAgIC8vIEZvciBzaGFyaW5nIG9mIEZpZWxkQWNjZXNzb3JzLiBUaGlzIGJyYW5jaGluZyBzdHJ1Y3R1cmUgaXMKICAgICAvLyBjdXJyZW50bHkgb25seSB0d28gbGV2ZWxzIGRlZXAgKGkuZS4sIG9uZSByb290IEZpZWxkIGFuZAogICAgIC8vIHBvdGVudGlhbGx5IG1hbnkgRmllbGQgb2JqZWN0cyBwb2ludGluZyB0byBpdC4pCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGJyYW5jaGluZyBzdHJ1Y3R1cmUgd291bGQgZXZlciBjb250YWluIGN5Y2xlcywgZGVhZGxvY2tzIGNhbgorICAgIC8vIG9jY3VyIGluIGFubm90YXRpb24gY29kZS4KICAgICBwcml2YXRlIEZpZWxkICAgICAgICAgICAgICAgcm9vdDsKIAogICAgIC8vIEdlbmVyaWNzIGluZnJhc3RydWN0dXJlCkBAIC0xNDEsNiArMTQ0LDkgQEAKICAgICAgICAgLy8gd2hpY2ggaW1wbGljaXRseSByZXF1aXJlcyB0aGF0IG5ldyBqYXZhLmxhbmcucmVmbGVjdAogICAgICAgICAvLyBvYmplY3RzIGJlIGZhYnJpY2F0ZWQgZm9yIGVhY2ggcmVmbGVjdGl2ZSBjYWxsIG9uIENsYXNzCiAgICAgICAgIC8vIG9iamVjdHMuKQorICAgICAgICBpZiAodGhpcy5yb290ICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4gbm90IGNvcHkgYSBub24tcm9vdCBGaWVsZCIpOworCiAgICAgICAgIEZpZWxkIHJlcyA9IG5ldyBGaWVsZChjbGF6eiwgbmFtZSwgdHlwZSwgbW9kaWZpZXJzLCBzbG90LCBzaWduYXR1cmUsIGFubm90YXRpb25zKTsKICAgICAgICAgcmVzLnJvb3QgPSB0aGlzOwogICAgICAgICAvLyBNaWdodCBhcyB3ZWxsIGVhZ2VybHkgcHJvcGFnYXRlIHRoaXMgaWYgYWxyZWFkeSBwcmVzZW50CkBAIC0xMTM3LDEwICsxMTQzLDE1IEBACiAKICAgICBwcml2YXRlIHN5bmNocm9uaXplZCAgTWFwPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiwgQW5ub3RhdGlvbj4gZGVjbGFyZWRBbm5vdGF0aW9ucygpIHsKICAgICAgICAgaWYgKGRlY2xhcmVkQW5ub3RhdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgZGVjbGFyZWRBbm5vdGF0aW9ucyA9IEFubm90YXRpb25QYXJzZXIucGFyc2VBbm5vdGF0aW9ucygKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucywgc3VuLm1pc2MuU2hhcmVkU2VjcmV0cy5nZXRKYXZhTGFuZ0FjY2VzcygpLgotICAgICAgICAgICAgICAgIGdldENvbnN0YW50UG9vbChnZXREZWNsYXJpbmdDbGFzcygpKSwKLSAgICAgICAgICAgICAgICBnZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICAgICAgICAgIEZpZWxkIHJvb3QgPSB0aGlzLnJvb3Q7CisgICAgICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVjbGFyZWRBbm5vdGF0aW9ucyA9IHJvb3QuZGVjbGFyZWRBbm5vdGF0aW9ucygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWNsYXJlZEFubm90YXRpb25zID0gQW5ub3RhdGlvblBhcnNlci5wYXJzZUFubm90YXRpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdW4ubWlzYy5TaGFyZWRTZWNyZXRzLmdldEphdmFMYW5nQWNjZXNzKCkuZ2V0Q29uc3RhbnRQb29sKGdldERlY2xhcmluZ0NsYXNzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGRlY2xhcmVkQW5ub3RhdGlvbnM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QuamF2YQppbmRleCBiMDQ2YTdhLi43ODZhYWM2IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QuamF2YQpAQCAtNzksNiArNzksOSBAQAogICAgIC8vIEZvciBzaGFyaW5nIG9mIE1ldGhvZEFjY2Vzc29ycy4gVGhpcyBicmFuY2hpbmcgc3RydWN0dXJlIGlzCiAgICAgLy8gY3VycmVudGx5IG9ubHkgdHdvIGxldmVscyBkZWVwIChpLmUuLCBvbmUgcm9vdCBNZXRob2QgYW5kCiAgICAgLy8gcG90ZW50aWFsbHkgbWFueSBNZXRob2Qgb2JqZWN0cyBwb2ludGluZyB0byBpdC4pCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGJyYW5jaGluZyBzdHJ1Y3R1cmUgd291bGQgZXZlciBjb250YWluIGN5Y2xlcywgZGVhZGxvY2tzIGNhbgorICAgIC8vIG9jY3VyIGluIGFubm90YXRpb24gY29kZS4KICAgICBwcml2YXRlIE1ldGhvZCAgICAgICAgICAgICAgcm9vdDsKIAogICAgIC8vIEdlbmVyaWNzIGluZnJhc3RydWN0dXJlCkBAIC0xNDQsNiArMTQ3LDkgQEAKICAgICAgICAgLy8gd2hpY2ggaW1wbGljaXRseSByZXF1aXJlcyB0aGF0IG5ldyBqYXZhLmxhbmcucmVmbGVjdAogICAgICAgICAvLyBvYmplY3RzIGJlIGZhYnJpY2F0ZWQgZm9yIGVhY2ggcmVmbGVjdGl2ZSBjYWxsIG9uIENsYXNzCiAgICAgICAgIC8vIG9iamVjdHMuKQorICAgICAgICBpZiAodGhpcy5yb290ICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4gbm90IGNvcHkgYSBub24tcm9vdCBNZXRob2QiKTsKKwogICAgICAgICBNZXRob2QgcmVzID0gbmV3IE1ldGhvZChjbGF6eiwgbmFtZSwgcGFyYW1ldGVyVHlwZXMsIHJldHVyblR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvblR5cGVzLCBtb2RpZmllcnMsIHNsb3QsIHNpZ25hdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsIHBhcmFtZXRlckFubm90YXRpb25zLCBhbm5vdGF0aW9uRGVmYXVsdCk7CkBAIC0xNTMsNiArMTU5LDE0IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVXNlZCBieSBFeGNlY3V0YWJsZSBmb3IgYW5ub3RhdGlvbiBzaGFyaW5nLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEV4ZWN1dGFibGUgZ2V0Um9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgYm9vbGVhbiBoYXNHZW5lcmljSW5mb3JtYXRpb24oKSB7CiAgICAgICAgIHJldHVybiAoZ2V0R2VuZXJpY1NpZ25hdHVyZSgpICE9IG51bGwpOwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0N1cnJlbmN5RGF0YS5wcm9wZXJ0aWVzIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0N1cnJlbmN5RGF0YS5wcm9wZXJ0aWVzCmluZGV4IGEyMmRkZDQuLjJiNWE1NzAgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9DdXJyZW5jeURhdGEucHJvcGVydGllcworKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvQ3VycmVuY3lEYXRhLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw3ICsyOCw3IEBACiAjIFZlcnNpb24gb2YgdGhlIGN1cnJlbmN5IGNvZGUgaW5mb3JtYXRpb24gaW4gdGhpcyBjbGFzcy4KICMgSXQgaXMgYSBzZXJpYWwgbnVtYmVyIHRoYXQgYWNjb21wYW5pZXMgd2l0aCBlYWNoIGFtZW5kbWVudC4KIAotZGF0YVZlcnNpb249MTU2CitkYXRhVmVyc2lvbj0xNTkKIAogIyBMaXN0IG9mIGFsbCB2YWxpZCBJU08gNDIxNyBjdXJyZW5jeSBjb2Rlcy4KICMgVG8gZW5zdXJlIGNvbXBhdGliaWxpdHksIGRvIG5vdCByZW1vdmUgY29kZXMuCkBAIC0zMzIsNyArMzMyLDcgQEAKICMgTElFQ0hURU5TVEVJTgogTEk9Q0hGCiAjIExJVEhVQU5JQQotTFQ9TFRMCitMVD1MVEw7MjAxNC0xMi0zMS0yMi0wMC0wMDtFVVIKICMgTFVYRU1CT1VSRwogTFU9RVVSCiAjIE1BQ0FVCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvY29uY3VycmVudC9Db21wbGV0YWJsZUZ1dHVyZS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2NvbmN1cnJlbnQvQ29tcGxldGFibGVGdXR1cmUuamF2YQppbmRleCA5ZTg5MTY5Li44NDc2ZGNjIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvY29uY3VycmVudC9Db21wbGV0YWJsZUZ1dHVyZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbXBsZXRhYmxlRnV0dXJlLmphdmEKQEAgLTUwLDcgKzUwLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uU3RhZ2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9ja1N1cHBvcnQ7CiAKIC8qKgpAQCAtNzcsOSArNzYsOSBAQAogICogPGxpPkFsbCA8ZW0+YXN5bmM8L2VtPiBtZXRob2RzIHdpdGhvdXQgYW4gZXhwbGljaXQgRXhlY3V0b3IKICAqIGFyZ3VtZW50IGFyZSBwZXJmb3JtZWQgdXNpbmcgdGhlIHtAbGluayBGb3JrSm9pblBvb2wjY29tbW9uUG9vbCgpfQogICogKHVubGVzcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGEgcGFyYWxsZWxpc20gbGV2ZWwgb2YgYXQgbGVhc3QgdHdvLCBpbgotICogd2hpY2ggY2FzZSwgYSBuZXcgVGhyZWFkIGlzIHVzZWQpLiBUbyBzaW1wbGlmeSBtb25pdG9yaW5nLAotICogZGVidWdnaW5nLCBhbmQgdHJhY2tpbmcsIGFsbCBnZW5lcmF0ZWQgYXN5bmNocm9ub3VzIHRhc2tzIGFyZQotICogaW5zdGFuY2VzIG9mIHRoZSBtYXJrZXIgaW50ZXJmYWNlIHtAbGluaworICogd2hpY2ggY2FzZSwgYSBuZXcgVGhyZWFkIGlzIGNyZWF0ZWQgdG8gcnVuIGVhY2ggdGFzaykuICBUbyBzaW1wbGlmeQorICogbW9uaXRvcmluZywgZGVidWdnaW5nLCBhbmQgdHJhY2tpbmcsIGFsbCBnZW5lcmF0ZWQgYXN5bmNocm9ub3VzCisgKiB0YXNrcyBhcmUgaW5zdGFuY2VzIG9mIHRoZSBtYXJrZXIgaW50ZXJmYWNlIHtAbGluawogICogQXN5bmNocm9ub3VzQ29tcGxldGlvblRhc2t9LiA8L2xpPgogICoKICAqIDxsaT5BbGwgQ29tcGxldGlvblN0YWdlIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluZGVwZW5kZW50bHkgb2YKQEAgLTExMywxNDEgKzExMiwxNTU2IEBACiAgICAgLyoKICAgICAgKiBPdmVydmlldzoKICAgICAgKgotICAgICAqIDEuIE5vbi1udWxsbmVzcyBvZiBmaWVsZCByZXN1bHQgKHNldCB2aWEgQ0FTKSBpbmRpY2F0ZXMgZG9uZS4KLSAgICAgKiBBbiBBbHRSZXN1bHQgaXMgdXNlZCB0byBib3ggbnVsbCBhcyBhIHJlc3VsdCwgYXMgd2VsbCBhcyB0bwotICAgICAqIGhvbGQgZXhjZXB0aW9ucy4gIFVzaW5nIGEgc2luZ2xlIGZpZWxkIG1ha2VzIGNvbXBsZXRpb24gZmFzdAotICAgICAqIGFuZCBzaW1wbGUgdG8gZGV0ZWN0IGFuZCB0cmlnZ2VyLCBhdCB0aGUgZXhwZW5zZSBvZiBhIGxvdCBvZgotICAgICAqIGVuY29kaW5nIGFuZCBkZWNvZGluZyB0aGF0IGluZmlsdHJhdGVzIG1hbnkgbWV0aG9kcy4gT25lIG1pbm9yCi0gICAgICogc2ltcGxpZmljYXRpb24gcmVsaWVzIG9uIHRoZSAoc3RhdGljKSBOSUwgKHRvIGJveCBudWxsIHJlc3VsdHMpCi0gICAgICogYmVpbmcgdGhlIG9ubHkgQWx0UmVzdWx0IHdpdGggYSBudWxsIGV4Y2VwdGlvbiBmaWVsZCwgc28gd2UKLSAgICAgKiBkb24ndCB1c3VhbGx5IG5lZWQgZXhwbGljaXQgY29tcGFyaXNvbnMgd2l0aCBOSUwuIFRoZSBDRgotICAgICAqIGV4Y2VwdGlvbiBwcm9wYWdhdGlvbiBtZWNoYW5pY3Mgc3Vycm91bmRpbmcgZGVjb2RpbmcgcmVseSBvbgotICAgICAqIHVuY2hlY2tlZCBjYXN0cyBvZiBkZWNvZGVkIHJlc3VsdHMgcmVhbGx5IGJlaW5nIHVuY2hlY2tlZCwKLSAgICAgKiB3aGVyZSB1c2VyIHR5cGUgZXJyb3JzIGFyZSBjYXVnaHQgYXQgcG9pbnQgb2YgdXNlLCBhcyBpcwotICAgICAqIGN1cnJlbnRseSB0aGUgY2FzZSBpbiBKYXZhLiBUaGVzZSBhcmUgaGlnaGxpZ2h0ZWQgYnkgdXNpbmcKLSAgICAgKiBTdXBwcmVzc1dhcm5pbmdzLWFubm90YXRlZCB0ZW1wb3Jhcmllcy4KKyAgICAgKiBBIENvbXBsZXRhYmxlRnV0dXJlIG1heSBoYXZlIGRlcGVuZGVudCBjb21wbGV0aW9uIGFjdGlvbnMsCisgICAgICogY29sbGVjdGVkIGluIGEgbGlua2VkIHN0YWNrLiBJdCBhdG9taWNhbGx5IGNvbXBsZXRlcyBieSBDQVNpbmcKKyAgICAgKiBhIHJlc3VsdCBmaWVsZCwgYW5kIHRoZW4gcG9wcyBvZmYgYW5kIHJ1bnMgdGhvc2UgYWN0aW9ucy4gVGhpcworICAgICAqIGFwcGxpZXMgYWNyb3NzIG5vcm1hbCB2cyBleGNlcHRpb25hbCBvdXRjb21lcywgc3luYyB2cyBhc3luYworICAgICAqIGFjdGlvbnMsIGJpbmFyeSB0cmlnZ2VycywgYW5kIHZhcmlvdXMgZm9ybXMgb2YgY29tcGxldGlvbnMuCiAgICAgICoKLSAgICAgKiAyLiBXYWl0ZXJzIGFyZSBoZWxkIGluIGEgVHJlaWJlciBzdGFjayBzaW1pbGFyIHRvIHRoZSBvbmUgdXNlZAotICAgICAqIGluIEZ1dHVyZVRhc2ssIFBoYXNlciwgYW5kIFN5bmNocm9ub3VzUXVldWUuIFNlZSB0aGVpcgotICAgICAqIGludGVybmFsIGRvY3VtZW50YXRpb24gZm9yIGFsZ29yaXRobWljIGRldGFpbHMuCisgICAgICogTm9uLW51bGxuZXNzIG9mIGZpZWxkIHJlc3VsdCAoc2V0IHZpYSBDQVMpIGluZGljYXRlcyBkb25lLiAgQW4KKyAgICAgKiBBbHRSZXN1bHQgaXMgdXNlZCB0byBib3ggbnVsbCBhcyBhIHJlc3VsdCwgYXMgd2VsbCBhcyB0byBob2xkCisgICAgICogZXhjZXB0aW9ucy4gIFVzaW5nIGEgc2luZ2xlIGZpZWxkIG1ha2VzIGNvbXBsZXRpb24gc2ltcGxlIHRvCisgICAgICogZGV0ZWN0IGFuZCB0cmlnZ2VyLiAgRW5jb2RpbmcgYW5kIGRlY29kaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZAorICAgICAqIGJ1dCBhZGRzIHRvIHRoZSBzcHJhd2wgb2YgdHJhcHBpbmcgYW5kIGFzc29jaWF0aW5nIGV4Y2VwdGlvbnMKKyAgICAgKiB3aXRoIHRhcmdldHMuICBNaW5vciBzaW1wbGlmaWNhdGlvbnMgcmVseSBvbiAoc3RhdGljKSBOSUwgKHRvCisgICAgICogYm94IG51bGwgcmVzdWx0cykgYmVpbmcgdGhlIG9ubHkgQWx0UmVzdWx0IHdpdGggYSBudWxsCisgICAgICogZXhjZXB0aW9uIGZpZWxkLCBzbyB3ZSBkb24ndCB1c3VhbGx5IG5lZWQgZXhwbGljaXQgY29tcGFyaXNvbnMuCisgICAgICogRXZlbiB0aG91Z2ggc29tZSBvZiB0aGUgZ2VuZXJpY3MgY2FzdHMgYXJlIHVuY2hlY2tlZCAoc2VlCisgICAgICogU3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9ucyksIHRoZXkgYXJlIHBsYWNlZCB0byBiZQorICAgICAqIGFwcHJvcHJpYXRlIGV2ZW4gaWYgY2hlY2tlZC4KICAgICAgKgotICAgICAqIDMuIENvbXBsZXRpb25zIGFyZSBhbHNvIGtlcHQgaW4gYSBsaXN0L3N0YWNrLCBhbmQgcHVsbGVkIG9mZgotICAgICAqIGFuZCBydW4gd2hlbiBjb21wbGV0aW9uIGlzIHRyaWdnZXJlZC4gKFdlIGNvdWxkIGV2ZW4gdXNlIHRoZQotICAgICAqIHNhbWUgc3RhY2sgYXMgZm9yIHdhaXRlcnMsIGJ1dCB3b3VsZCBnaXZlIHVwIHRoZSBwb3RlbnRpYWwKLSAgICAgKiBwYXJhbGxlbGlzbSBvYnRhaW5lZCBiZWNhdXNlIHdva2VuIHdhaXRlcnMgaGVscCByZWxlYXNlL3J1bgotICAgICAqIG90aGVycyAtLSBzZWUgbWV0aG9kIHBvc3RDb21wbGV0ZSkuICBCZWNhdXNlIHBvc3QtcHJvY2Vzc2luZwotICAgICAqIG1heSByYWNlIHdpdGggZGlyZWN0IGNhbGxzLCBjbGFzcyBDb21wbGV0aW9uIG9wcG9ydHVuaXN0aWNhbGx5Ci0gICAgICogZXh0ZW5kcyBBdG9taWNJbnRlZ2VyIHNvIGNhbGxlcnMgY2FuIGNsYWltIHRoZSBhY3Rpb24gdmlhCi0gICAgICogY29tcGFyZUFuZFNldCgwLCAxKS4gIFRoZSBDb21wbGV0aW9uLnJ1biBtZXRob2RzIGFyZSBhbGwKLSAgICAgKiB3cml0dGVuIGEgYm9yaW5nbHkgc2ltaWxhciB1bmlmb3JtIHdheSAodGhhdCBzb21ldGltZXMgaW5jbHVkZXMKLSAgICAgKiB1bm5lY2Vzc2FyeS1sb29raW5nIGNoZWNrcywga2VwdCB0byBtYWludGFpbiB1bmlmb3JtaXR5KS4KLSAgICAgKiBUaGVyZSBhcmUgZW5vdWdoIGRpbWVuc2lvbnMgdXBvbiB3aGljaCB0aGV5IGRpZmZlciB0aGF0Ci0gICAgICogYXR0ZW1wdHMgdG8gZmFjdG9yIGNvbW1vbmFsaXRpZXMgd2hpbGUgbWFpbnRhaW5pbmcgZWZmaWNpZW5jeQotICAgICAqIHJlcXVpcmUgbW9yZSBsaW5lcyBvZiBjb2RlIHRoYW4gdGhleSB3b3VsZCBzYXZlLgorICAgICAqIERlcGVuZGVudCBhY3Rpb25zIGFyZSByZXByZXNlbnRlZCBieSBDb21wbGV0aW9uIG9iamVjdHMgbGlua2VkCisgICAgICogYXMgVHJlaWJlciBzdGFja3MgaGVhZGVkIGJ5IGZpZWxkICJzdGFjayIuIFRoZXJlIGFyZSBDb21wbGV0aW9uCisgICAgICogY2xhc3NlcyBmb3IgZWFjaCBraW5kIG9mIGFjdGlvbiwgZ3JvdXBlZCBpbnRvIHNpbmdsZS1pbnB1dAorICAgICAqIChVbmlDb21wbGV0aW9uKSwgdHdvLWlucHV0IChCaUNvbXBsZXRpb24pLCBwcm9qZWN0ZWQKKyAgICAgKiAoQmlDb21wbGV0aW9ucyB1c2luZyBlaXRoZXIgKG5vdCBib3RoKSBvZiB0d28gaW5wdXRzKSwgc2hhcmVkCisgICAgICogKENvQ29tcGxldGlvbiwgdXNlZCBieSB0aGUgc2Vjb25kIG9mIHR3byBzb3VyY2VzKSwgemVyby1pbnB1dAorICAgICAqIHNvdXJjZSBhY3Rpb25zLCBhbmQgU2lnbmFsbGVycyB0aGF0IHVuYmxvY2sgd2FpdGVycy4gQ2xhc3MKKyAgICAgKiBDb21wbGV0aW9uIGV4dGVuZHMgRm9ya0pvaW5UYXNrIHRvIGVuYWJsZSBhc3luYyBleGVjdXRpb24KKyAgICAgKiAoYWRkaW5nIG5vIHNwYWNlIG92ZXJoZWFkIGJlY2F1c2Ugd2UgZXhwbG9pdCBpdHMgInRhZyIgbWV0aG9kcworICAgICAqIHRvIG1haW50YWluIGNsYWltcykuIEl0IGlzIGFsc28gZGVjbGFyZWQgYXMgUnVubmFibGUgdG8gYWxsb3cKKyAgICAgKiB1c2FnZSB3aXRoIGFyYml0cmFyeSBleGVjdXRvcnMuCiAgICAgICoKLSAgICAgKiA0LiBUaGUgZXhwb3J0ZWQgdGhlbi9hbmQvb3IgbWV0aG9kcyBkbyBzdXBwb3J0IGEgYml0IG9mCi0gICAgICogZmFjdG9yaW5nIChzZWUgZG9UaGVuQXBwbHkgZXRjKS4gVGhleSBtdXN0IGNvcGUgd2l0aCB0aGUKLSAgICAgKiBpbnRyaW5zaWMgcmFjZXMgc3Vycm91bmRpbmcgYWRkaXRpb24gb2YgYSBkZXBlbmRlbnQgYWN0aW9uCi0gICAgICogdmVyc3VzIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiBkaXJlY3RseSBiZWNhdXNlIHRoZSB0YXNrIGlzCi0gICAgICogYWxyZWFkeSBjb21wbGV0ZS4gIEZvciBleGFtcGxlLCBhIENGIG1heSBub3QgYmUgY29tcGxldGUgdXBvbgotICAgICAqIGVudHJ5LCBzbyBhIGRlcGVuZGVudCBjb21wbGV0aW9uIGlzIGFkZGVkLCBidXQgYnkgdGhlIHRpbWUgaXQKLSAgICAgKiBpcyBhZGRlZCwgdGhlIHRhcmdldCBDRiBpcyBjb21wbGV0ZSwgc28gbXVzdCBiZSBkaXJlY3RseQotICAgICAqIGV4ZWN1dGVkLiBUaGlzIGlzIGFsbCBkb25lIHdoaWxlIGF2b2lkaW5nIHVubmVjZXNzYXJ5IG9iamVjdAotICAgICAqIGNvbnN0cnVjdGlvbiBpbiBzYWZlLWJ5cGFzcyBjYXNlcy4KKyAgICAgKiBTdXBwb3J0IGZvciBlYWNoIGtpbmQgb2YgQ29tcGxldGlvblN0YWdlIHJlbGllcyBvbiBhIHNlcGFyYXRlCisgICAgICogY2xhc3MsIGFsb25nIHdpdGggdHdvIENvbXBsZXRhYmxlRnV0dXJlIG1ldGhvZHM6CisgICAgICoKKyAgICAgKiAqIEEgQ29tcGxldGlvbiBjbGFzcyB3aXRoIG5hbWUgWCBjb3JyZXNwb25kaW5nIHRvIGZ1bmN0aW9uLAorICAgICAqICAgcHJlZmFjZWQgd2l0aCAiVW5pIiwgIkJpIiwgb3IgIk9yIi4gRWFjaCBjbGFzcyBjb250YWlucworICAgICAqICAgZmllbGRzIGZvciBzb3VyY2UocyksIGFjdGlvbnMsIGFuZCBkZXBlbmRlbnQuIFRoZXkgYXJlCisgICAgICogICBib3JpbmdseSBzaW1pbGFyLCBkaWZmZXJpbmcgZnJvbSBvdGhlcnMgb25seSB3aXRoIHJlc3BlY3QgdG8KKyAgICAgKiAgIHVuZGVybHlpbmcgZnVuY3Rpb25hbCBmb3Jtcy4gV2UgZG8gdGhpcyBzbyB0aGF0IHVzZXJzIGRvbid0CisgICAgICogICBlbmNvdW50ZXIgbGF5ZXJzIG9mIGFkYXB0b3JzIGluIGNvbW1vbiB1c2FnZXMuIFdlIGFsc28KKyAgICAgKiAgIGluY2x1ZGUgIlJlbGF5IiBjbGFzc2VzL21ldGhvZHMgdGhhdCBkb24ndCBjb3JyZXNwb25kIHRvIHVzZXIKKyAgICAgKiAgIG1ldGhvZHM7IHRoZXkgY29weSByZXN1bHRzIGZyb20gb25lIHN0YWdlIHRvIGFub3RoZXIuCisgICAgICoKKyAgICAgKiAqIEJvb2xlYW4gQ29tcGxldGFibGVGdXR1cmUgbWV0aG9kIHgoLi4uKSAoZm9yIGV4YW1wbGUKKyAgICAgKiAgIHVuaUFwcGx5KSB0YWtlcyBhbGwgb2YgdGhlIGFyZ3VtZW50cyBuZWVkZWQgdG8gY2hlY2sgdGhhdCBhbgorICAgICAqICAgYWN0aW9uIGlzIHRyaWdnZXJhYmxlLCBhbmQgdGhlbiBlaXRoZXIgcnVucyB0aGUgYWN0aW9uIG9yCisgICAgICogICBhcnJhbmdlcyBpdHMgYXN5bmMgZXhlY3V0aW9uIGJ5IGV4ZWN1dGluZyBpdHMgQ29tcGxldGlvbgorICAgICAqICAgYXJndW1lbnQsIGlmIHByZXNlbnQuIFRoZSBtZXRob2QgcmV0dXJucyB0cnVlIGlmIGtub3duIHRvIGJlCisgICAgICogICBjb21wbGV0ZS4KKyAgICAgKgorICAgICAqICogQ29tcGxldGlvbiBtZXRob2QgdHJ5RmlyZShpbnQgbW9kZSkgaW52b2tlcyB0aGUgYXNzb2NpYXRlZCB4CisgICAgICogICBtZXRob2Qgd2l0aCBpdHMgaGVsZCBhcmd1bWVudHMsIGFuZCBvbiBzdWNjZXNzIGNsZWFucyB1cC4KKyAgICAgKiAgIFRoZSBtb2RlIGFyZ3VtZW50IGFsbG93cyB0cnlGaXJlIHRvIGJlIGNhbGxlZCB0d2ljZSAoU1lOQywKKyAgICAgKiAgIHRoZW4gQVNZTkMpOyB0aGUgZmlyc3QgdG8gc2NyZWVuIGFuZCB0cmFwIGV4Y2VwdGlvbnMgd2hpbGUKKyAgICAgKiAgIGFycmFuZ2luZyB0byBleGVjdXRlLCBhbmQgdGhlIHNlY29uZCB3aGVuIGNhbGxlZCBmcm9tIGEKKyAgICAgKiAgIHRhc2suIChBIGZldyBjbGFzc2VzIGFyZSBub3QgdXNlZCBhc3luYyBzbyB0YWtlIHNsaWdodGx5CisgICAgICogICBkaWZmZXJlbnQgZm9ybXMuKSAgVGhlIGNsYWltKCkgY2FsbGJhY2sgc3VwcHJlc3NlcyBmdW5jdGlvbgorICAgICAqICAgaW52b2NhdGlvbiBpZiBhbHJlYWR5IGNsYWltZWQgYnkgYW5vdGhlciB0aHJlYWQuCisgICAgICoKKyAgICAgKiAqIENvbXBsZXRhYmxlRnV0dXJlIG1ldGhvZCB4U3RhZ2UoLi4uKSBpcyBjYWxsZWQgZnJvbSBhIHB1YmxpYworICAgICAqICAgc3RhZ2UgbWV0aG9kIG9mIENvbXBsZXRhYmxlRnV0dXJlIHguIEl0IHNjcmVlbnMgdXNlcgorICAgICAqICAgYXJndW1lbnRzIGFuZCBpbnZva2VzIGFuZC9vciBjcmVhdGVzIHRoZSBzdGFnZSBvYmplY3QuICBJZgorICAgICAqICAgbm90IGFzeW5jIGFuZCB4IGlzIGFscmVhZHkgY29tcGxldGUsIHRoZSBhY3Rpb24gaXMgcnVuCisgICAgICogICBpbW1lZGlhdGVseS4gIE90aGVyd2lzZSBhIENvbXBsZXRpb24gYyBpcyBjcmVhdGVkLCBwdXNoZWQgdG8KKyAgICAgKiAgIHgncyBzdGFjayAodW5sZXNzIGRvbmUpLCBhbmQgc3RhcnRlZCBvciB0cmlnZ2VyZWQgdmlhCisgICAgICogICBjLnRyeUZpcmUuICBUaGlzIGFsc28gY292ZXJzIHJhY2VzIHBvc3NpYmxlIGlmIHggY29tcGxldGVzCisgICAgICogICB3aGlsZSBwdXNoaW5nLiAgQ2xhc3NlcyB3aXRoIHR3byBpbnB1dHMgKGZvciBleGFtcGxlIEJpQXBwbHkpCisgICAgICogICBkZWFsIHdpdGggcmFjZXMgYWNyb3NzIGJvdGggd2hpbGUgcHVzaGluZyBhY3Rpb25zLiAgVGhlCisgICAgICogICBzZWNvbmQgY29tcGxldGlvbiBpcyBhIENvQ29tcGxldGlvbiBwb2ludGluZyB0byB0aGUgZmlyc3QsCisgICAgICogICBzaGFyZWQgc28gdGhhdCBhdCBtb3N0IG9uZSBwZXJmb3JtcyB0aGUgYWN0aW9uLiAgVGhlCisgICAgICogICBtdWx0aXBsZS1hcml0eSBtZXRob2RzIGFsbE9mIGFuZCBhbnlPZiBkbyB0aGlzIHBhaXJ3aXNlIHRvCisgICAgICogICBmb3JtIHRyZWVzIG9mIGNvbXBsZXRpb25zLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyBvZiBtZXRob2RzIHZhcnkgYWNjb3JkaW5nCisgICAgICogdG8gd2hldGhlciAidGhpcyIgaXMgYSBzb3VyY2UsIGRlcGVuZGVudCwgb3IgY29tcGxldGlvbi4KKyAgICAgKgorICAgICAqIE1ldGhvZCBwb3N0Q29tcGxldGUgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbiB1bmxlc3MgdGhlIHRhcmdldAorICAgICAqIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIG9ic2VydmFibGUgKGkuZS4sIG5vdCB5ZXQgcmV0dXJuZWQgb3IKKyAgICAgKiBsaW5rZWQpLiBNdWx0aXBsZSB0aHJlYWRzIGNhbiBjYWxsIHBvc3RDb21wbGV0ZSwgd2hpY2gKKyAgICAgKiBhdG9taWNhbGx5IHBvcHMgZWFjaCBkZXBlbmRlbnQgYWN0aW9uLCBhbmQgdHJpZXMgdG8gdHJpZ2dlciBpdAorICAgICAqIHZpYSBtZXRob2QgdHJ5RmlyZSwgaW4gTkVTVEVEIG1vZGUuICBUcmlnZ2VyaW5nIGNhbiBwcm9wYWdhdGUKKyAgICAgKiByZWN1cnNpdmVseSwgc28gTkVTVEVEIG1vZGUgcmV0dXJucyBpdHMgY29tcGxldGVkIGRlcGVuZGVudCAoaWYKKyAgICAgKiBvbmUgZXhpc3RzKSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IGl0cyBjYWxsZXIgKHNlZSBtZXRob2QKKyAgICAgKiBwb3N0RmlyZSkuCisgICAgICoKKyAgICAgKiBCbG9ja2luZyBtZXRob2RzIGdldCgpIGFuZCBqb2luKCkgcmVseSBvbiBTaWduYWxsZXIgQ29tcGxldGlvbnMKKyAgICAgKiB0aGF0IHdha2UgdXAgd2FpdGluZyB0aHJlYWRzLiAgVGhlIG1lY2hhbmljcyBhcmUgc2ltaWxhciB0bworICAgICAqIFRyZWliZXIgc3RhY2sgd2FpdC1ub2RlcyB1c2VkIGluIEZ1dHVyZVRhc2ssIFBoYXNlciwgYW5kCisgICAgICogU3luY2hyb25vdXNRdWV1ZS4gU2VlIHRoZWlyIGludGVybmFsIGRvY3VtZW50YXRpb24gZm9yCisgICAgICogYWxnb3JpdGhtaWMgZGV0YWlscy4KKyAgICAgKgorICAgICAqIFdpdGhvdXQgcHJlY2F1dGlvbnMsIENvbXBsZXRhYmxlRnV0dXJlcyB3b3VsZCBiZSBwcm9uZSB0bworICAgICAqIGdhcmJhZ2UgYWNjdW11bGF0aW9uIGFzIGNoYWlucyBvZiBDb21wbGV0aW9ucyBidWlsZCB1cCwgZWFjaAorICAgICAqIHBvaW50aW5nIGJhY2sgdG8gaXRzIHNvdXJjZXMuIFNvIHdlIG51bGwgb3V0IGZpZWxkcyBhcyBzb29uIGFzCisgICAgICogcG9zc2libGUgKHNlZSBlc3BlY2lhbGx5IG1ldGhvZCBDb21wbGV0aW9uLmRldGFjaCkuIFRoZQorICAgICAqIHNjcmVlbmluZyBjaGVja3MgbmVlZGVkIGFueXdheSBoYXJtbGVzc2x5IGlnbm9yZSBudWxsIGFyZ3VtZW50cworICAgICAqIHRoYXQgbWF5IGhhdmUgYmVlbiBvYnRhaW5lZCBkdXJpbmcgcmFjZXMgd2l0aCB0aHJlYWRzIG51bGxpbmcKKyAgICAgKiBvdXQgZmllbGRzLiAgV2UgYWxzbyB0cnkgdG8gdW5saW5rIGZpcmVkIENvbXBsZXRpb25zIGZyb20KKyAgICAgKiBzdGFja3MgdGhhdCBtaWdodCBuZXZlciBiZSBwb3BwZWQgKHNlZSBtZXRob2QgcG9zdEZpcmUpLgorICAgICAqIENvbXBsZXRpb24gZmllbGRzIG5lZWQgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHZvbGF0aWxlCisgICAgICogYmVjYXVzZSB0aGV5IGFyZSBvbmx5IHZpc2libGUgdG8gb3RoZXIgdGhyZWFkcyB1cG9uIHNhZmUKKyAgICAgKiBwdWJsaWNhdGlvbi4KICAgICAgKi8KIAotICAgIC8vIHByZWxpbWluYXJpZXMKKyAgICB2b2xhdGlsZSBPYmplY3QgcmVzdWx0OyAgICAgICAvLyBFaXRoZXIgdGhlIHJlc3VsdCBvciBib3hlZCBBbHRSZXN1bHQKKyAgICB2b2xhdGlsZSBDb21wbGV0aW9uIHN0YWNrOyAgICAvLyBUb3Agb2YgVHJlaWJlciBzdGFjayBvZiBkZXBlbmRlbnQgYWN0aW9ucwogCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEFsdFJlc3VsdCB7Ci0gICAgICAgIGZpbmFsIFRocm93YWJsZSBleDsgLy8gbnVsbCBvbmx5IGZvciBOSUwKLSAgICAgICAgQWx0UmVzdWx0KFRocm93YWJsZSBleCkgeyB0aGlzLmV4ID0gZXg7IH0KKyAgICBmaW5hbCBib29sZWFuIGludGVybmFsQ29tcGxldGUoT2JqZWN0IHIpIHsgLy8gQ0FTIGZyb20gbnVsbCB0byByCisgICAgICAgIHJldHVybiBVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QodGhpcywgUkVTVUxULCBudWxsLCByKTsKICAgICB9CiAKKyAgICBmaW5hbCBib29sZWFuIGNhc1N0YWNrKENvbXBsZXRpb24gY21wLCBDb21wbGV0aW9uIHZhbCkgeworICAgICAgICByZXR1cm4gVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIFNUQUNLLCBjbXAsIHZhbCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcHVzaGVkIGMgb250byBzdGFjay4gKi8KKyAgICBmaW5hbCBib29sZWFuIHRyeVB1c2hTdGFjayhDb21wbGV0aW9uIGMpIHsKKyAgICAgICAgQ29tcGxldGlvbiBoID0gc3RhY2s7CisgICAgICAgIGxhenlTZXROZXh0KGMsIGgpOworICAgICAgICByZXR1cm4gVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIFNUQUNLLCBoLCBjKTsKKyAgICB9CisKKyAgICAvKiogVW5jb25kaXRpb25hbGx5IHB1c2hlcyBjIG9udG8gc3RhY2ssIHJldHJ5aW5nIGlmIG5lY2Vzc2FyeS4gKi8KKyAgICBmaW5hbCB2b2lkIHB1c2hTdGFjayhDb21wbGV0aW9uIGMpIHsKKyAgICAgICAgZG8ge30gd2hpbGUgKCF0cnlQdXNoU3RhY2soYykpOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0gRW5jb2RpbmcgYW5kIGRlY29kaW5nIG91dGNvbWVzIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQWx0UmVzdWx0IHsgLy8gU2VlIGFib3ZlCisgICAgICAgIGZpbmFsIFRocm93YWJsZSBleDsgICAgICAgIC8vIG51bGwgb25seSBmb3IgTklMCisgICAgICAgIEFsdFJlc3VsdChUaHJvd2FibGUgeCkgeyB0aGlzLmV4ID0geDsgfQorICAgIH0KKworICAgIC8qKiBUaGUgZW5jb2Rpbmcgb2YgdGhlIG51bGwgdmFsdWUuICovCiAgICAgc3RhdGljIGZpbmFsIEFsdFJlc3VsdCBOSUwgPSBuZXcgQWx0UmVzdWx0KG51bGwpOwogCi0gICAgLy8gRmllbGRzCisgICAgLyoqIENvbXBsZXRlcyB3aXRoIHRoZSBudWxsIHZhbHVlLCB1bmxlc3MgYWxyZWFkeSBjb21wbGV0ZWQuICovCisgICAgZmluYWwgYm9vbGVhbiBjb21wbGV0ZU51bGwoKSB7CisgICAgICAgIHJldHVybiBVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QodGhpcywgUkVTVUxULCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JTCk7CisgICAgfQogCi0gICAgdm9sYXRpbGUgT2JqZWN0IHJlc3VsdDsgICAgLy8gRWl0aGVyIHRoZSByZXN1bHQgb3IgYm94ZWQgQWx0UmVzdWx0Ci0gICAgdm9sYXRpbGUgV2FpdE5vZGUgd2FpdGVyczsgLy8gVHJlaWJlciBzdGFjayBvZiB0aHJlYWRzIGJsb2NrZWQgb24gZ2V0KCkKLSAgICB2b2xhdGlsZSBDb21wbGV0aW9uTm9kZSBjb21wbGV0aW9uczsgLy8gbGlzdCAoVHJlaWJlciBzdGFjaykgb2YgY29tcGxldGlvbnMKKyAgICAvKiogUmV0dXJucyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIG5vbi1leGNlcHRpb25hbCB2YWx1ZS4gKi8KKyAgICBmaW5hbCBPYmplY3QgZW5jb2RlVmFsdWUoVCB0KSB7CisgICAgICAgIHJldHVybiAodCA9PSBudWxsKSA/IE5JTCA6IHQ7CisgICAgfQogCi0gICAgLy8gQmFzaWMgdXRpbGl0aWVzIGZvciB0cmlnZ2VyaW5nIGFuZCBwcm9jZXNzaW5nIGNvbXBsZXRpb25zCisgICAgLyoqIENvbXBsZXRlcyB3aXRoIGEgbm9uLWV4Y2VwdGlvbmFsIHJlc3VsdCwgdW5sZXNzIGFscmVhZHkgY29tcGxldGVkLiAqLworICAgIGZpbmFsIGJvb2xlYW4gY29tcGxldGVWYWx1ZShUIHQpIHsKKyAgICAgICAgcmV0dXJuIFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdCh0aGlzLCBSRVNVTFQsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgPT0gbnVsbCkgPyBOSUwgOiB0KTsKKyAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuZCBzaWduYWxzIGFsbCB3YWl0aW5nIHRocmVhZHMgYW5kIHJ1bnMgYWxsIGNvbXBsZXRpb25zLgorICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIG9mIHRoZSBnaXZlbiAobm9uLW51bGwpIGV4Y2VwdGlvbiBhcyBhCisgICAgICogd3JhcHBlZCBDb21wbGV0aW9uRXhjZXB0aW9uIHVubGVzcyBpdCBpcyBvbmUgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBzdGF0aWMgQWx0UmVzdWx0IGVuY29kZVRocm93YWJsZShUaHJvd2FibGUgeCkgeworICAgICAgICByZXR1cm4gbmV3IEFsdFJlc3VsdCgoeCBpbnN0YW5jZW9mIENvbXBsZXRpb25FeGNlcHRpb24pID8geCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wbGV0aW9uRXhjZXB0aW9uKHgpKTsKKyAgICB9CisKKyAgICAvKiogQ29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uYWwgcmVzdWx0LCB1bmxlc3MgYWxyZWFkeSBjb21wbGV0ZWQuICovCisgICAgZmluYWwgYm9vbGVhbiBjb21wbGV0ZVRocm93YWJsZShUaHJvd2FibGUgeCkgeworICAgICAgICByZXR1cm4gVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIFJFU1VMVCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVUaHJvd2FibGUoeCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIG9mIHRoZSBnaXZlbiAobm9uLW51bGwpIGV4Y2VwdGlvbiBhcyBhCisgICAgICogd3JhcHBlZCBDb21wbGV0aW9uRXhjZXB0aW9uIHVubGVzcyBpdCBpcyBvbmUgYWxyZWFkeS4gIE1heQorICAgICAqIHJldHVybiB0aGUgZ2l2ZW4gT2JqZWN0IHIgKHdoaWNoIG11c3QgaGF2ZSBiZWVuIHRoZSByZXN1bHQgb2YgYQorICAgICAqIHNvdXJjZSBmdXR1cmUpIGlmIGl0IGlzIGVxdWl2YWxlbnQsIGkuZS4gaWYgdGhpcyBpcyBhIHNpbXBsZQorICAgICAqIHJlbGF5IG9mIGFuIGV4aXN0aW5nIENvbXBsZXRpb25FeGNlcHRpb24uCisgICAgICovCisgICAgc3RhdGljIE9iamVjdCBlbmNvZGVUaHJvd2FibGUoVGhyb3dhYmxlIHgsIE9iamVjdCByKSB7CisgICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBDb21wbGV0aW9uRXhjZXB0aW9uKSkKKyAgICAgICAgICAgIHggPSBuZXcgQ29tcGxldGlvbkV4Y2VwdGlvbih4KTsKKyAgICAgICAgZWxzZSBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCAmJiB4ID09ICgoQWx0UmVzdWx0KXIpLmV4KQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIHJldHVybiBuZXcgQWx0UmVzdWx0KHgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBsZXRlcyB3aXRoIHRoZSBnaXZlbiAobm9uLW51bGwpIGV4Y2VwdGlvbmFsIHJlc3VsdCBhcyBhCisgICAgICogd3JhcHBlZCBDb21wbGV0aW9uRXhjZXB0aW9uIHVubGVzcyBpdCBpcyBvbmUgYWxyZWFkeSwgdW5sZXNzCisgICAgICogYWxyZWFkeSBjb21wbGV0ZWQuICBNYXkgY29tcGxldGUgd2l0aCB0aGUgZ2l2ZW4gT2JqZWN0IHIKKyAgICAgKiAod2hpY2ggbXVzdCBoYXZlIGJlZW4gdGhlIHJlc3VsdCBvZiBhIHNvdXJjZSBmdXR1cmUpIGlmIGl0IGlzCisgICAgICogZXF1aXZhbGVudCwgaS5lLiBpZiB0aGlzIGlzIGEgc2ltcGxlIHByb3BhZ2F0aW9uIG9mIGFuCisgICAgICogZXhpc3RpbmcgQ29tcGxldGlvbkV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBmaW5hbCBib29sZWFuIGNvbXBsZXRlVGhyb3dhYmxlKFRocm93YWJsZSB4LCBPYmplY3QgcikgeworICAgICAgICByZXR1cm4gVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIFJFU1VMVCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVUaHJvd2FibGUoeCwgcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIG9mIHRoZSBnaXZlbiBhcmd1bWVudHM6IGlmIHRoZSBleGNlcHRpb24KKyAgICAgKiBpcyBub24tbnVsbCwgZW5jb2RlcyBhcyBBbHRSZXN1bHQuICBPdGhlcndpc2UgdXNlcyB0aGUgZ2l2ZW4KKyAgICAgKiB2YWx1ZSwgYm94ZWQgYXMgTklMIGlmIG51bGwuCisgICAgICovCisgICAgT2JqZWN0IGVuY29kZU91dGNvbWUoVCB0LCBUaHJvd2FibGUgeCkgeworICAgICAgICByZXR1cm4gKHggPT0gbnVsbCkgPyAodCA9PSBudWxsKSA/IE5JTCA6IHQgOiBlbmNvZGVUaHJvd2FibGUoeCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW5jb2Rpbmcgb2YgYSBjb3BpZWQgb3V0Y29tZTsgaWYgZXhjZXB0aW9uYWwsCisgICAgICogcmV3cmFwcyBhcyBhIENvbXBsZXRpb25FeGNlcHRpb24sIGVsc2UgcmV0dXJucyBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0IGVuY29kZVJlbGF5KE9iamVjdCByKSB7CisgICAgICAgIFRocm93YWJsZSB4OworICAgICAgICByZXR1cm4gKCgociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgJiYKKyAgICAgICAgICAgICAgICAgKHggPSAoKEFsdFJlc3VsdClyKS5leCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAhKHggaW5zdGFuY2VvZiBDb21wbGV0aW9uRXhjZXB0aW9uKSkgPworICAgICAgICAgICAgICAgIG5ldyBBbHRSZXN1bHQobmV3IENvbXBsZXRpb25FeGNlcHRpb24oeCkpIDogcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGxldGVzIHdpdGggciBvciBhIGNvcHkgb2YgciwgdW5sZXNzIGFscmVhZHkgY29tcGxldGVkLgorICAgICAqIElmIGV4Y2VwdGlvbmFsLCByIGlzIGZpcnN0IGNvZXJjZWQgdG8gYSBDb21wbGV0aW9uRXhjZXB0aW9uLgorICAgICAqLworICAgIGZpbmFsIGJvb2xlYW4gY29tcGxldGVSZWxheShPYmplY3QgcikgeworICAgICAgICByZXR1cm4gVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIFJFU1VMVCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVSZWxheShyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0cyByZXN1bHQgdXNpbmcgRnV0dXJlLmdldCBjb252ZW50aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCByZXBvcnRHZXQoT2JqZWN0IHIpCisgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHIgPT0gbnVsbCkgLy8gYnkgY29udmVudGlvbiBiZWxvdywgbnVsbCBtZWFucyBpbnRlcnJ1cHRlZAorICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7CisgICAgICAgICAgICBUaHJvd2FibGUgeCwgY2F1c2U7CisgICAgICAgICAgICBpZiAoKHggPSAoKEFsdFJlc3VsdClyKS5leCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93IChDYW5jZWxsYXRpb25FeGNlcHRpb24peDsKKyAgICAgICAgICAgIGlmICgoeCBpbnN0YW5jZW9mIENvbXBsZXRpb25FeGNlcHRpb24pICYmCisgICAgICAgICAgICAgICAgKGNhdXNlID0geC5nZXRDYXVzZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHggPSBjYXVzZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oeCk7CisgICAgICAgIH0KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdCA9IChUKSByOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIG91dGNvbWUgdG8gcmV0dXJuIHJlc3VsdCBvciB0aHJvdyB1bmNoZWNrZWQgZXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIHJlcG9ydEpvaW4oT2JqZWN0IHIpIHsKKyAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSB4OworICAgICAgICAgICAgaWYgKCh4ID0gKChBbHRSZXN1bHQpcikuZXgpID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIENhbmNlbGxhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKXg7CisgICAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIENvbXBsZXRpb25FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgKENvbXBsZXRpb25FeGNlcHRpb24peDsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb21wbGV0aW9uRXhjZXB0aW9uKHgpOworICAgICAgICB9CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHQgPSAoVCkgcjsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLSBBc3luYyB0YXNrIHByZWxpbWluYXJpZXMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIEEgbWFya2VyIGludGVyZmFjZSBpZGVudGlmeWluZyBhc3luY2hyb25vdXMgdGFza3MgcHJvZHVjZWQgYnkKKyAgICAgKiB7QGNvZGUgYXN5bmN9IG1ldGhvZHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgbW9uaXRvcmluZywKKyAgICAgKiBkZWJ1Z2dpbmcsIGFuZCB0cmFja2luZyBhc3luY2hyb25vdXMgYWN0aXZpdGllcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBc3luY2hyb25vdXNDb21wbGV0aW9uVGFzayB7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VDb21tb25Qb29sID0KKyAgICAgICAgKEZvcmtKb2luUG9vbC5nZXRDb21tb25Qb29sUGFyYWxsZWxpc20oKSA+IDEpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBleGVjdXRvciAtLSBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpIHVubGVzcyBpdCBjYW5ub3QKKyAgICAgKiBzdXBwb3J0IHBhcmFsbGVsaXNtLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yIGFzeW5jUG9vbCA9IHVzZUNvbW1vblBvb2wgPworICAgICAgICBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpIDogbmV3IFRocmVhZFBlclRhc2tFeGVjdXRvcigpOworCisgICAgLyoqIEZhbGxiYWNrIGlmIEZvcmtKb2luUG9vbC5jb21tb25Qb29sKCkgY2Fubm90IHN1cHBvcnQgcGFyYWxsZWxpc20gKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgVGhyZWFkUGVyVGFza0V4ZWN1dG9yIGltcGxlbWVudHMgRXhlY3V0b3IgeworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHIpIHsgbmV3IFRocmVhZChyKS5zdGFydCgpOyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTnVsbC1jaGVja3MgdXNlciBleGVjdXRvciBhcmd1bWVudCwgYW5kIHRyYW5zbGF0ZXMgdXNlcyBvZgorICAgICAqIGNvbW1vblBvb2wgdG8gYXN5bmNQb29sIGluIGNhc2UgcGFyYWxsZWxpc20gZGlzYWJsZWQuCisgICAgICovCisgICAgc3RhdGljIEV4ZWN1dG9yIHNjcmVlbkV4ZWN1dG9yKEV4ZWN1dG9yIGUpIHsKKyAgICAgICAgaWYgKCF1c2VDb21tb25Qb29sICYmIGUgPT0gRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSkKKyAgICAgICAgICAgIHJldHVybiBhc3luY1Bvb2w7CisgICAgICAgIGlmIChlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICAvLyBNb2RlcyBmb3IgQ29tcGxldGlvbi50cnlGaXJlLiBTaWduZWRuZXNzIG1hdHRlcnMuCisgICAgc3RhdGljIGZpbmFsIGludCBTWU5DICAgPSAgMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEFTWU5DICA9ICAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVTVEVEID0gLTE7CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tIEJhc2UgQ29tcGxldGlvbiBjbGFzc2VzIGFuZCBvcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ29tcGxldGlvbiBleHRlbmRzIEZvcmtKb2luVGFzazxWb2lkPgorICAgICAgICBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBBc3luY2hyb25vdXNDb21wbGV0aW9uVGFzayB7CisgICAgICAgIHZvbGF0aWxlIENvbXBsZXRpb24gbmV4dDsgICAgICAvLyBUcmVpYmVyIHN0YWNrIGxpbmsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgY29tcGxldGlvbiBhY3Rpb24gaWYgdHJpZ2dlcmVkLCByZXR1cm5pbmcgYQorICAgICAgICAgKiBkZXBlbmRlbnQgdGhhdCBtYXkgbmVlZCBwcm9wYWdhdGlvbiwgaWYgb25lIGV4aXN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGUgU1lOQywgQVNZTkMsIG9yIE5FU1RFRAorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgQ29tcGxldGFibGVGdXR1cmU8Pz4gdHJ5RmlyZShpbnQgbW9kZSk7CisKKyAgICAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBwb3NzaWJseSBzdGlsbCB0cmlnZ2VyYWJsZS4gVXNlZCBieSBjbGVhblN0YWNrLiAqLworICAgICAgICBhYnN0cmFjdCBib29sZWFuIGlzTGl2ZSgpOworCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpICAgICAgICAgICAgICAgIHsgdHJ5RmlyZShBU1lOQyk7IH0KKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXhlYygpICAgICAgICAgICAgeyB0cnlGaXJlKEFTWU5DKTsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgcHVibGljIGZpbmFsIFZvaWQgZ2V0UmF3UmVzdWx0KCkgICAgICAgeyByZXR1cm4gbnVsbDsgfQorICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSYXdSZXN1bHQoVm9pZCB2KSB7fQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGxhenlTZXROZXh0KENvbXBsZXRpb24gYywgQ29tcGxldGlvbiBuZXh0KSB7CisgICAgICAgIFVOU0FGRS5wdXRPcmRlcmVkT2JqZWN0KGMsIE5FWFQsIG5leHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHMgYW5kIHRyaWVzIHRvIHRyaWdnZXIgYWxsIHJlYWNoYWJsZSBkZXBlbmRlbnRzLiAgQ2FsbCBvbmx5CisgICAgICogd2hlbiBrbm93biB0byBiZSBkb25lLgogICAgICAqLwogICAgIGZpbmFsIHZvaWQgcG9zdENvbXBsZXRlKCkgewotICAgICAgICBXYWl0Tm9kZSBxOyBUaHJlYWQgdDsKLSAgICAgICAgd2hpbGUgKChxID0gd2FpdGVycykgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdCh0aGlzLCBXQUlURVJTLCBxLCBxLm5leHQpICYmCi0gICAgICAgICAgICAgICAgKHQgPSBxLnRocmVhZCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHEudGhyZWFkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC51bnBhcmsodCk7CisgICAgICAgIC8qCisgICAgICAgICAqIE9uIGVhY2ggc3RlcCwgdmFyaWFibGUgZiBob2xkcyBjdXJyZW50IGRlcGVuZGVudHMgdG8gcG9wCisgICAgICAgICAqIGFuZCBydW4uICBJdCBpcyBleHRlbmRlZCBhbG9uZyBvbmx5IG9uZSBwYXRoIGF0IGEgdGltZSwKKyAgICAgICAgICogcHVzaGluZyBvdGhlcnMgdG8gYXZvaWQgdW5ib3VuZGVkIHJlY3Vyc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8+IGYgPSB0aGlzOyBDb21wbGV0aW9uIGg7CisgICAgICAgIHdoaWxlICgoaCA9IGYuc3RhY2spICE9IG51bGwgfHwKKyAgICAgICAgICAgICAgIChmICE9IHRoaXMgJiYgKGggPSAoZiA9IHRoaXMpLnN0YWNrKSAhPSBudWxsKSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Pz4gZDsgQ29tcGxldGlvbiB0OworICAgICAgICAgICAgaWYgKGYuY2FzU3RhY2soaCwgdCA9IGgubmV4dCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGgubmV4dCA9IG51bGw7ICAgIC8vIGRldGFjaAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmID0gKGQgPSBoLnRyeUZpcmUoTkVTVEVEKSkgPT0gbnVsbCA/IHRoaXMgOiBkOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIENvbXBsZXRpb25Ob2RlIGg7IENvbXBsZXRpb24gYzsKLSAgICAgICAgd2hpbGUgKChoID0gY29tcGxldGlvbnMpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QodGhpcywgQ09NUExFVElPTlMsIGgsIGgubmV4dCkgJiYKLSAgICAgICAgICAgICAgICAoYyA9IGguY29tcGxldGlvbikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjLnJ1bigpOworICAgIC8qKiBUcmF2ZXJzZXMgc3RhY2sgYW5kIHVubGlua3MgZGVhZCBDb21wbGV0aW9ucy4gKi8KKyAgICBmaW5hbCB2b2lkIGNsZWFuU3RhY2soKSB7CisgICAgICAgIGZvciAoQ29tcGxldGlvbiBwID0gbnVsbCwgcSA9IHN0YWNrOyBxICE9IG51bGw7KSB7CisgICAgICAgICAgICBDb21wbGV0aW9uIHMgPSBxLm5leHQ7CisgICAgICAgICAgICBpZiAocS5pc0xpdmUoKSkgeworICAgICAgICAgICAgICAgIHAgPSBxOworICAgICAgICAgICAgICAgIHEgPSBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2FzU3RhY2socSwgcyk7CisgICAgICAgICAgICAgICAgcSA9IHN0YWNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcC5uZXh0ID0gczsKKyAgICAgICAgICAgICAgICBpZiAocC5pc0xpdmUoKSkKKyAgICAgICAgICAgICAgICAgICAgcSA9IHM7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBudWxsOyAgLy8gcmVzdGFydAorICAgICAgICAgICAgICAgICAgICBxID0gc3RhY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLSBPbmUtaW5wdXQgQ29tcGxldGlvbnMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKiBBIENvbXBsZXRpb24gd2l0aCBhIHNvdXJjZSwgZGVwZW5kZW50LCBhbmQgZXhlY3V0b3IuICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFVuaUNvbXBsZXRpb248VCxWPiBleHRlbmRzIENvbXBsZXRpb24geworICAgICAgICBFeGVjdXRvciBleGVjdXRvcjsgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dG9yIHRvIHVzZSAobnVsbCBpZiBub25lKQorICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkZXA7ICAgICAgICAgIC8vIHRoZSBkZXBlbmRlbnQgdG8gY29tcGxldGUKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjOyAgICAgICAgICAvLyBzb3VyY2UgZm9yIGFjdGlvbgorCisgICAgICAgIFVuaUNvbXBsZXRpb24oRXhlY3V0b3IgZXhlY3V0b3IsIENvbXBsZXRhYmxlRnV0dXJlPFY+IGRlcCwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBzcmMpIHsKKyAgICAgICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsgdGhpcy5kZXAgPSBkZXA7IHRoaXMuc3JjID0gc3JjOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhY3Rpb24gY2FuIGJlIHJ1bi4gQ2FsbCBvbmx5IHdoZW4ga25vd24gdG8KKyAgICAgICAgICogYmUgdHJpZ2dlcmFibGUuIFVzZXMgRkogdGFnIGJpdCB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZQorICAgICAgICAgKiB0aHJlYWQgY2xhaW1zIG93bmVyc2hpcC4gIElmIGFzeW5jLCBzdGFydHMgYXMgdGFzayAtLSBhCisgICAgICAgICAqIGxhdGVyIGNhbGwgdG8gdHJ5RmlyZSB3aWxsIHJ1biBhY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBib29sZWFuIGNsYWltKCkgeworICAgICAgICAgICAgRXhlY3V0b3IgZSA9IGV4ZWN1dG9yOworICAgICAgICAgICAgaWYgKGNvbXBhcmVBbmRTZXRGb3JrSm9pblRhc2tUYWcoKHNob3J0KTAsIChzaG9ydCkxKSkgeworICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yID0gbnVsbDsgLy8gZGlzYWJsZQorICAgICAgICAgICAgICAgIGUuZXhlY3V0ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNMaXZlKCkgeyByZXR1cm4gZGVwICE9IG51bGw7IH0KKyAgICB9CisKKyAgICAvKiogUHVzaGVzIHRoZSBnaXZlbiBjb21wbGV0aW9uIChpZiBpdCBleGlzdHMpIHVubGVzcyBkb25lLiAqLworICAgIGZpbmFsIHZvaWQgcHVzaChVbmlDb21wbGV0aW9uPD8sPz4gYykgeworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgIXRyeVB1c2hTdGFjayhjKSkKKyAgICAgICAgICAgICAgICBsYXp5U2V0TmV4dChjLCBudWxsKTsgLy8gY2xlYXIgb24gZmFpbHVyZQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJpZ2dlcnMgY29tcGxldGlvbiB3aXRoIHRoZSBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gYXJndW1lbnRzOgotICAgICAqIGlmIHRoZSBleGNlcHRpb24gaXMgbm9uLW51bGwsIGVuY29kZXMgaXQgYXMgYSB3cmFwcGVkCi0gICAgICogQ29tcGxldGlvbkV4Y2VwdGlvbiB1bmxlc3MgaXQgaXMgb25lIGFscmVhZHkuICBPdGhlcndpc2UgdXNlcwotICAgICAqIHRoZSBnaXZlbiByZXN1bHQsIGJveGVkIGFzIE5JTCBpZiBudWxsLgorICAgICAqIFBvc3QtcHJvY2Vzc2luZyBieSBkZXBlbmRlbnQgYWZ0ZXIgc3VjY2Vzc2Z1bCBVbmlDb21wbGV0aW9uCisgICAgICogdHJ5RmlyZS4gIFRyaWVzIHRvIGNsZWFuIHN0YWNrIG9mIHNvdXJjZSBhLCBhbmQgdGhlbiBlaXRoZXIgcnVucworICAgICAqIHBvc3RDb21wbGV0ZSBvciByZXR1cm5zIHRoaXMgdG8gY2FsbGVyLCBkZXBlbmRpbmcgb24gbW9kZS4KICAgICAgKi8KLSAgICBmaW5hbCB2b2lkIGludGVybmFsQ29tcGxldGUoVCB2LCBUaHJvd2FibGUgZXgpIHsKKyAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiBwb3N0RmlyZShDb21wbGV0YWJsZUZ1dHVyZTw/PiBhLCBpbnQgbW9kZSkgeworICAgICAgICBpZiAoYSAhPSBudWxsICYmIGEuc3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1vZGUgPCAwIHx8IGEucmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICAgICAgYS5jbGVhblN0YWNrKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYS5wb3N0Q29tcGxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgc3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1vZGUgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBvc3RDb21wbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBVbmlBcHBseTxULFY+IGV4dGVuZHMgVW5pQ29tcGxldGlvbjxULFY+IHsKKyAgICAgICAgRnVuY3Rpb248PyBzdXBlciBULD8gZXh0ZW5kcyBWPiBmbjsKKyAgICAgICAgVW5pQXBwbHkoRXhlY3V0b3IgZXhlY3V0b3IsIENvbXBsZXRhYmxlRnV0dXJlPFY+IGRlcCwKKyAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFY+IGZuKSB7CisgICAgICAgICAgICBzdXBlcihleGVjdXRvciwgZGVwLCBzcmMpOyB0aGlzLmZuID0gZm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vj4gdHJ5RmlyZShpbnQgbW9kZSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vj4gZDsgQ29tcGxldGFibGVGdXR1cmU8VD4gYTsKKyAgICAgICAgICAgIGlmICgoZCA9IGRlcCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICFkLnVuaUFwcGx5KGEgPSBzcmMsIGZuLCBtb2RlID4gMCA/IG51bGwgOiB0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGRlcCA9IG51bGw7IHNyYyA9IG51bGw7IGZuID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkLnBvc3RGaXJlKGEsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgPFM+IGJvb2xlYW4gdW5pQXBwbHkoQ29tcGxldGFibGVGdXR1cmU8Uz4gYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFMsPyBleHRlbmRzIFQ+IGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pQXBwbHk8UyxUPiBjKSB7CisgICAgICAgIE9iamVjdCByOyBUaHJvd2FibGUgeDsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCAociA9IGEucmVzdWx0KSA9PSBudWxsIHx8IGYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5Q29tcGxldGU6IGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHggPSAoKEFsdFJlc3VsdClyKS5leCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVRocm93YWJsZSh4LCByKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgdHJ5Q29tcGxldGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmICFjLmNsYWltKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgUyBzID0gKFMpIHI7CisgICAgICAgICAgICAgICAgY29tcGxldGVWYWx1ZShmLmFwcGx5KHMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxWPiBDb21wbGV0YWJsZUZ1dHVyZTxWPiB1bmlBcHBseVN0YWdlKAorICAgICAgICBFeGVjdXRvciBlLCBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFY+IGYpIHsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFY+IGQgPSAgbmV3IENvbXBsZXRhYmxlRnV0dXJlPFY+KCk7CisgICAgICAgIGlmIChlICE9IG51bGwgfHwgIWQudW5pQXBwbHkodGhpcywgZiwgbnVsbCkpIHsKKyAgICAgICAgICAgIFVuaUFwcGx5PFQsVj4gYyA9IG5ldyBVbmlBcHBseTxULFY+KGUsIGQsIHRoaXMsIGYpOworICAgICAgICAgICAgcHVzaChjKTsKKyAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgVW5pQWNjZXB0PFQ+IGV4dGVuZHMgVW5pQ29tcGxldGlvbjxULFZvaWQ+IHsKKyAgICAgICAgQ29uc3VtZXI8PyBzdXBlciBUPiBmbjsKKyAgICAgICAgVW5pQWNjZXB0KEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkZXAsCisgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBzcmMsIENvbnN1bWVyPD8gc3VwZXIgVD4gZm4pIHsKKyAgICAgICAgICAgIHN1cGVyKGV4ZWN1dG9yLCBkZXAsIHNyYyk7IHRoaXMuZm4gPSBmbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0cnlGaXJlKGludCBtb2RlKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkOyBDb21wbGV0YWJsZUZ1dHVyZTxUPiBhOworICAgICAgICAgICAgaWYgKChkID0gZGVwKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIWQudW5pQWNjZXB0KGEgPSBzcmMsIGZuLCBtb2RlID4gMCA/IG51bGwgOiB0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGRlcCA9IG51bGw7IHNyYyA9IG51bGw7IGZuID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkLnBvc3RGaXJlKGEsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgPFM+IGJvb2xlYW4gdW5pQWNjZXB0KENvbXBsZXRhYmxlRnV0dXJlPFM+IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgUz4gZiwgVW5pQWNjZXB0PFM+IGMpIHsKKyAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSB4OworICAgICAgICBpZiAoYSA9PSBudWxsIHx8IChyID0gYS5yZXN1bHQpID09IG51bGwgfHwgZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB0cnlDb21wbGV0ZTogaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgeworICAgICAgICAgICAgICAgIGlmICgoeCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKHgsIHIpOworICAgICAgICAgICAgICAgICAgICBicmVhayB0cnlDb21wbGV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgIWMuY2xhaW0oKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBTIHMgPSAoUykgcjsKKyAgICAgICAgICAgICAgICBmLmFjY2VwdChzKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZU51bGwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHVuaUFjY2VwdFN0YWdlKEV4ZWN1dG9yIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lcjw/IHN1cGVyIFQ+IGYpIHsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCB8fCAhZC51bmlBY2NlcHQodGhpcywgZiwgbnVsbCkpIHsKKyAgICAgICAgICAgIFVuaUFjY2VwdDxUPiBjID0gbmV3IFVuaUFjY2VwdDxUPihlLCBkLCB0aGlzLCBmKTsKKyAgICAgICAgICAgIHB1c2goYyk7CisgICAgICAgICAgICBjLnRyeUZpcmUoU1lOQyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFVuaVJ1bjxUPiBleHRlbmRzIFVuaUNvbXBsZXRpb248VCxWb2lkPiB7CisgICAgICAgIFJ1bm5hYmxlIGZuOworICAgICAgICBVbmlSdW4oRXhlY3V0b3IgZXhlY3V0b3IsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRlcCwKKyAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHNyYywgUnVubmFibGUgZm4pIHsKKyAgICAgICAgICAgIHN1cGVyKGV4ZWN1dG9yLCBkZXAsIHNyYyk7IHRoaXMuZm4gPSBmbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0cnlGaXJlKGludCBtb2RlKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkOyBDb21wbGV0YWJsZUZ1dHVyZTxUPiBhOworICAgICAgICAgICAgaWYgKChkID0gZGVwKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIWQudW5pUnVuKGEgPSBzcmMsIGZuLCBtb2RlID4gMCA/IG51bGwgOiB0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGRlcCA9IG51bGw7IHNyYyA9IG51bGw7IGZuID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkLnBvc3RGaXJlKGEsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgYm9vbGVhbiB1bmlSdW4oQ29tcGxldGFibGVGdXR1cmU8Pz4gYSwgUnVubmFibGUgZiwgVW5pUnVuPD8+IGMpIHsKKyAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSB4OworICAgICAgICBpZiAoYSA9PSBudWxsIHx8IChyID0gYS5yZXN1bHQpID09IG51bGwgfHwgZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0ICYmICh4ID0gKChBbHRSZXN1bHQpcikuZXgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiAhYy5jbGFpbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmLnJ1bigpOworICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU51bGwoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHVuaVJ1blN0YWdlKEV4ZWN1dG9yIGUsIFJ1bm5hYmxlIGYpIHsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCB8fCAhZC51bmlSdW4odGhpcywgZiwgbnVsbCkpIHsKKyAgICAgICAgICAgIFVuaVJ1bjxUPiBjID0gbmV3IFVuaVJ1bjxUPihlLCBkLCB0aGlzLCBmKTsKKyAgICAgICAgICAgIHB1c2goYyk7CisgICAgICAgICAgICBjLnRyeUZpcmUoU1lOQyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFVuaVdoZW5Db21wbGV0ZTxUPiBleHRlbmRzIFVuaUNvbXBsZXRpb248VCxUPiB7CisgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFRocm93YWJsZT4gZm47CisgICAgICAgIFVuaVdoZW5Db21wbGV0ZShFeGVjdXRvciBleGVjdXRvciwgQ29tcGxldGFibGVGdXR1cmU8VD4gZGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVGhyb3dhYmxlPiBmbikgeworICAgICAgICAgICAgc3VwZXIoZXhlY3V0b3IsIGRlcCwgc3JjKTsgdGhpcy5mbiA9IGZuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHRyeUZpcmUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGQ7IENvbXBsZXRhYmxlRnV0dXJlPFQ+IGE7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAhZC51bmlXaGVuQ29tcGxldGUoYSA9IHNyYywgZm4sIG1vZGUgPiAwID8gbnVsbCA6IHRoaXMpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgZGVwID0gbnVsbDsgc3JjID0gbnVsbDsgZm4gPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGQucG9zdEZpcmUoYSwgbW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBib29sZWFuIHVuaVdoZW5Db21wbGV0ZShDb21wbGV0YWJsZUZ1dHVyZTxUPiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULD8gc3VwZXIgVGhyb3dhYmxlPiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaVdoZW5Db21wbGV0ZTxUPiBjKSB7CisgICAgICAgIE9iamVjdCByOyBUIHQ7IFRocm93YWJsZSB4ID0gbnVsbDsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCAociA9IGEucmVzdWx0KSA9PSBudWxsIHx8IGYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgIWMuY2xhaW0oKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAoKEFsdFJlc3VsdClyKS5leDsKKyAgICAgICAgICAgICAgICAgICAgdCA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKKyAgICAgICAgICAgICAgICAgICAgdCA9IHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLmFjY2VwdCh0LCB4KTsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGludGVybmFsQ29tcGxldGUocik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHggPSBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKHgsIHIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGxldGFibGVGdXR1cmU8VD4gdW5pV2hlbkNvbXBsZXRlU3RhZ2UoCisgICAgICAgIEV4ZWN1dG9yIGUsIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFRocm93YWJsZT4gZikgeworICAgICAgICBpZiAoZiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxUPigpOworICAgICAgICBpZiAoZSAhPSBudWxsIHx8ICFkLnVuaVdoZW5Db21wbGV0ZSh0aGlzLCBmLCBudWxsKSkgeworICAgICAgICAgICAgVW5pV2hlbkNvbXBsZXRlPFQ+IGMgPSBuZXcgVW5pV2hlbkNvbXBsZXRlPFQ+KGUsIGQsIHRoaXMsIGYpOworICAgICAgICAgICAgcHVzaChjKTsKKyAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgVW5pSGFuZGxlPFQsVj4gZXh0ZW5kcyBVbmlDb21wbGV0aW9uPFQsVj4geworICAgICAgICBCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVj4gZm47CisgICAgICAgIFVuaUhhbmRsZShFeGVjdXRvciBleGVjdXRvciwgQ29tcGxldGFibGVGdXR1cmU8Vj4gZGVwLAorICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsIFRocm93YWJsZSwgPyBleHRlbmRzIFY+IGZuKSB7CisgICAgICAgICAgICBzdXBlcihleGVjdXRvciwgZGVwLCBzcmMpOyB0aGlzLmZuID0gZm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vj4gdHJ5RmlyZShpbnQgbW9kZSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vj4gZDsgQ29tcGxldGFibGVGdXR1cmU8VD4gYTsKKyAgICAgICAgICAgIGlmICgoZCA9IGRlcCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICFkLnVuaUhhbmRsZShhID0gc3JjLCBmbiwgbW9kZSA+IDAgPyBudWxsIDogdGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBkZXAgPSBudWxsOyBzcmMgPSBudWxsOyBmbiA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIDxTPiBib29sZWFuIHVuaUhhbmRsZShDb21wbGV0YWJsZUZ1dHVyZTxTPiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUZ1bmN0aW9uPD8gc3VwZXIgUywgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVD4gZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pSGFuZGxlPFMsVD4gYykgeworICAgICAgICBPYmplY3QgcjsgUyBzOyBUaHJvd2FibGUgeDsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCAociA9IGEucmVzdWx0KSA9PSBudWxsIHx8IGYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgIWMuY2xhaW0oKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAoKEFsdFJlc3VsdClyKS5leDsKKyAgICAgICAgICAgICAgICAgICAgcyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBTIHNzID0gKFMpIHI7CisgICAgICAgICAgICAgICAgICAgIHMgPSBzczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tcGxldGVWYWx1ZShmLmFwcGx5KHMsIHgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxWPiBDb21wbGV0YWJsZUZ1dHVyZTxWPiB1bmlIYW5kbGVTdGFnZSgKKyAgICAgICAgRXhlY3V0b3IgZSwgQmlGdW5jdGlvbjw/IHN1cGVyIFQsIFRocm93YWJsZSwgPyBleHRlbmRzIFY+IGYpIHsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFY+IGQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vj4oKTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCB8fCAhZC51bmlIYW5kbGUodGhpcywgZiwgbnVsbCkpIHsKKyAgICAgICAgICAgIFVuaUhhbmRsZTxULFY+IGMgPSBuZXcgVW5pSGFuZGxlPFQsVj4oZSwgZCwgdGhpcywgZik7CisgICAgICAgICAgICBwdXNoKGMpOworICAgICAgICAgICAgYy50cnlGaXJlKFNZTkMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBVbmlFeGNlcHRpb25hbGx5PFQ+IGV4dGVuZHMgVW5pQ29tcGxldGlvbjxULFQ+IHsKKyAgICAgICAgRnVuY3Rpb248PyBzdXBlciBUaHJvd2FibGUsID8gZXh0ZW5kcyBUPiBmbjsKKyAgICAgICAgVW5pRXhjZXB0aW9uYWxseShDb21wbGV0YWJsZUZ1dHVyZTxUPiBkZXAsIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFRocm93YWJsZSwgPyBleHRlbmRzIFQ+IGZuKSB7CisgICAgICAgICAgICBzdXBlcihudWxsLCBkZXAsIHNyYyk7IHRoaXMuZm4gPSBmbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiB0cnlGaXJlKGludCBtb2RlKSB7IC8vIG5ldmVyIEFTWU5DCisgICAgICAgICAgICAvLyBhc3NlcnQgbW9kZSAhPSBBU1lOQzsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGQ7IENvbXBsZXRhYmxlRnV0dXJlPFQ+IGE7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApID09IG51bGwgfHwgIWQudW5pRXhjZXB0aW9uYWxseShhID0gc3JjLCBmbiwgdGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBkZXAgPSBudWxsOyBzcmMgPSBudWxsOyBmbiA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gdW5pRXhjZXB0aW9uYWxseShDb21wbGV0YWJsZUZ1dHVyZTxUPiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFRocm93YWJsZSwgPyBleHRlbmRzIFQ+IGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUV4Y2VwdGlvbmFsbHk8VD4gYykgeworICAgICAgICBPYmplY3QgcjsgVGhyb3dhYmxlIHg7CisgICAgICAgIGlmIChhID09IG51bGwgfHwgKHIgPSBhLnJlc3VsdCkgPT0gbnVsbCB8fCBmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCAmJiAoeCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgIWMuY2xhaW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGVWYWx1ZShmLmFwcGx5KHgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxDb21wbGV0ZShyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHVuaUV4Y2VwdGlvbmFsbHlTdGFnZSgKKyAgICAgICAgRnVuY3Rpb248VGhyb3dhYmxlLCA/IGV4dGVuZHMgVD4gZikgeworICAgICAgICBpZiAoZiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxUPigpOworICAgICAgICBpZiAoIWQudW5pRXhjZXB0aW9uYWxseSh0aGlzLCBmLCBudWxsKSkgeworICAgICAgICAgICAgVW5pRXhjZXB0aW9uYWxseTxUPiBjID0gbmV3IFVuaUV4Y2VwdGlvbmFsbHk8VD4oZCwgdGhpcywgZik7CisgICAgICAgICAgICBwdXNoKGMpOworICAgICAgICAgICAgYy50cnlGaXJlKFNZTkMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBVbmlSZWxheTxUPiBleHRlbmRzIFVuaUNvbXBsZXRpb248VCxUPiB7IC8vIGZvciBDb21wb3NlCisgICAgICAgIFVuaVJlbGF5KENvbXBsZXRhYmxlRnV0dXJlPFQ+IGRlcCwgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjKSB7CisgICAgICAgICAgICBzdXBlcihudWxsLCBkZXAsIHNyYyk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VD4gdHJ5RmlyZShpbnQgbW9kZSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gZDsgQ29tcGxldGFibGVGdXR1cmU8VD4gYTsKKyAgICAgICAgICAgIGlmICgoZCA9IGRlcCkgPT0gbnVsbCB8fCAhZC51bmlSZWxheShhID0gc3JjKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHNyYyA9IG51bGw7IGRlcCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gdW5pUmVsYXkoQ29tcGxldGFibGVGdXR1cmU8VD4gYSkgeworICAgICAgICBPYmplY3QgcjsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCAociA9IGEucmVzdWx0KSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIC8vIG5vIG5lZWQgdG8gY2xhaW0KKyAgICAgICAgICAgIGNvbXBsZXRlUmVsYXkocik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBVbmlDb21wb3NlPFQsVj4gZXh0ZW5kcyBVbmlDb21wbGV0aW9uPFQsVj4geworICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8Vj4+IGZuOworICAgICAgICBVbmlDb21wb3NlKEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkZXAsCisgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIENvbXBsZXRpb25TdGFnZTxWPj4gZm4pIHsKKyAgICAgICAgICAgIHN1cGVyKGV4ZWN1dG9yLCBkZXAsIHNyYyk7IHRoaXMuZm4gPSBmbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWPiB0cnlGaXJlKGludCBtb2RlKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkOyBDb21wbGV0YWJsZUZ1dHVyZTxUPiBhOworICAgICAgICAgICAgaWYgKChkID0gZGVwKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIWQudW5pQ29tcG9zZShhID0gc3JjLCBmbiwgbW9kZSA+IDAgPyBudWxsIDogdGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBkZXAgPSBudWxsOyBzcmMgPSBudWxsOyBmbiA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIDxTPiBib29sZWFuIHVuaUNvbXBvc2UoCisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFM+IGEsCisgICAgICAgIEZ1bmN0aW9uPD8gc3VwZXIgUywgPyBleHRlbmRzIENvbXBsZXRpb25TdGFnZTxUPj4gZiwKKyAgICAgICAgVW5pQ29tcG9zZTxTLFQ+IGMpIHsKKyAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSB4OworICAgICAgICBpZiAoYSA9PSBudWxsIHx8IChyID0gYS5yZXN1bHQpID09IG51bGwgfHwgZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB0cnlDb21wbGV0ZTogaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgeworICAgICAgICAgICAgICAgIGlmICgoeCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKHgsIHIpOworICAgICAgICAgICAgICAgICAgICBicmVhayB0cnlDb21wbGV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgIWMuY2xhaW0oKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBTIHMgPSAoUykgcjsKKyAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBnID0gZi5hcHBseShzKS50b0NvbXBsZXRhYmxlRnV0dXJlKCk7CisgICAgICAgICAgICAgICAgaWYgKGcucmVzdWx0ID09IG51bGwgfHwgIXVuaVJlbGF5KGcpKSB7CisgICAgICAgICAgICAgICAgICAgIFVuaVJlbGF5PFQ+IGNvcHkgPSBuZXcgVW5pUmVsYXk8VD4odGhpcywgZyk7CisgICAgICAgICAgICAgICAgICAgIGcucHVzaChjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgY29weS50cnlGaXJlKFNZTkMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgPFY+IENvbXBsZXRhYmxlRnV0dXJlPFY+IHVuaUNvbXBvc2VTdGFnZSgKKyAgICAgICAgRXhlY3V0b3IgZSwgRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgQ29tcGxldGlvblN0YWdlPFY+PiBmKSB7CisgICAgICAgIGlmIChmID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBPYmplY3QgcjsgVGhyb3dhYmxlIHg7CisgICAgICAgIGlmIChlID09IG51bGwgJiYgKHIgPSByZXN1bHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHRyeSB0byByZXR1cm4gZnVuY3Rpb24gcmVzdWx0IGRpcmVjdGx5CisgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgeworICAgICAgICAgICAgICAgIGlmICgoeCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vj4oZW5jb2RlVGhyb3dhYmxlKHgsIHIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHQgPSAoVCkgcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZi5hcHBseSh0KS50b0NvbXBsZXRhYmxlRnV0dXJlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFY+KGVuY29kZVRocm93YWJsZShleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFY+IGQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vj4oKTsKKyAgICAgICAgVW5pQ29tcG9zZTxULFY+IGMgPSBuZXcgVW5pQ29tcG9zZTxULFY+KGUsIGQsIHRoaXMsIGYpOworICAgICAgICBwdXNoKGMpOworICAgICAgICBjLnRyeUZpcmUoU1lOQyk7CisgICAgICAgIHJldHVybiBkOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0gVHdvLWlucHV0IENvbXBsZXRpb25zIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKiogQSBDb21wbGV0aW9uIGZvciBhbiBhY3Rpb24gd2l0aCB0d28gc291cmNlcyAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCaUNvbXBsZXRpb248VCxVLFY+IGV4dGVuZHMgVW5pQ29tcGxldGlvbjxULFY+IHsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gc25kOyAvLyBzZWNvbmQgc291cmNlIGZvciBhY3Rpb24KKyAgICAgICAgQmlDb21wbGV0aW9uKEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkZXAsCisgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBzcmMsIENvbXBsZXRhYmxlRnV0dXJlPFU+IHNuZCkgeworICAgICAgICAgICAgc3VwZXIoZXhlY3V0b3IsIGRlcCwgc3JjKTsgdGhpcy5zbmQgPSBzbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQSBDb21wbGV0aW9uIGRlbGVnYXRpbmcgdG8gYSBCaUNvbXBsZXRpb24gKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ29Db21wbGV0aW9uIGV4dGVuZHMgQ29tcGxldGlvbiB7CisgICAgICAgIEJpQ29tcGxldGlvbjw/LD8sPz4gYmFzZTsKKyAgICAgICAgQ29Db21wbGV0aW9uKEJpQ29tcGxldGlvbjw/LD8sPz4gYmFzZSkgeyB0aGlzLmJhc2UgPSBiYXNlOyB9CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHRyeUZpcmUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIEJpQ29tcGxldGlvbjw/LD8sPz4gYzsgQ29tcGxldGFibGVGdXR1cmU8Pz4gZDsKKyAgICAgICAgICAgIGlmICgoYyA9IGJhc2UpID09IG51bGwgfHwgKGQgPSBjLnRyeUZpcmUobW9kZSkpID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBiYXNlID0gbnVsbDsgLy8gZGV0YWNoCisgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGlzTGl2ZSgpIHsKKyAgICAgICAgICAgIEJpQ29tcGxldGlvbjw/LD8sPz4gYzsKKyAgICAgICAgICAgIHJldHVybiAoYyA9IGJhc2UpICE9IG51bGwgJiYgYy5kZXAgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBQdXNoZXMgY29tcGxldGlvbiB0byB0aGlzIGFuZCBiIHVubGVzcyBib3RoIGRvbmUuICovCisgICAgZmluYWwgdm9pZCBiaXB1c2goQ29tcGxldGFibGVGdXR1cmU8Pz4gYiwgQmlDb21wbGV0aW9uPD8sPyw/PiBjKSB7CisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIE9iamVjdCByOworICAgICAgICAgICAgd2hpbGUgKChyID0gcmVzdWx0KSA9PSBudWxsICYmICF0cnlQdXNoU3RhY2soYykpCisgICAgICAgICAgICAgICAgbGF6eVNldE5leHQoYywgbnVsbCk7IC8vIGNsZWFyIG9uIGZhaWx1cmUKKyAgICAgICAgICAgIGlmIChiICE9IG51bGwgJiYgYiAhPSB0aGlzICYmIGIucmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb21wbGV0aW9uIHEgPSAociAhPSBudWxsKSA/IGMgOiBuZXcgQ29Db21wbGV0aW9uKGMpOworICAgICAgICAgICAgICAgIHdoaWxlIChiLnJlc3VsdCA9PSBudWxsICYmICFiLnRyeVB1c2hTdGFjayhxKSkKKyAgICAgICAgICAgICAgICAgICAgbGF6eVNldE5leHQocSwgbnVsbCk7IC8vIGNsZWFyIG9uIGZhaWx1cmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBQb3N0LXByb2Nlc3NpbmcgYWZ0ZXIgc3VjY2Vzc2Z1bCBCaUNvbXBsZXRpb24gdHJ5RmlyZS4gKi8KKyAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiBwb3N0RmlyZShDb21wbGV0YWJsZUZ1dHVyZTw/PiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8+IGIsIGludCBtb2RlKSB7CisgICAgICAgIGlmIChiICE9IG51bGwgJiYgYi5zdGFjayAhPSBudWxsKSB7IC8vIGNsZWFuIHNlY29uZCBzb3VyY2UKKyAgICAgICAgICAgIGlmIChtb2RlIDwgMCB8fCBiLnJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGIuY2xlYW5TdGFjaygpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGIucG9zdENvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvc3RGaXJlKGEsIG1vZGUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBCaUFwcGx5PFQsVSxWPiBleHRlbmRzIEJpQ29tcGxldGlvbjxULFUsVj4geworICAgICAgICBCaUZ1bmN0aW9uPD8gc3VwZXIgVCw/IHN1cGVyIFUsPyBleHRlbmRzIFY+IGZuOworICAgICAgICBCaUFwcGx5KEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkZXAsCisgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLCBDb21wbGV0YWJsZUZ1dHVyZTxVPiBzbmQsCisgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsPyBzdXBlciBVLD8gZXh0ZW5kcyBWPiBmbikgeworICAgICAgICAgICAgc3VwZXIoZXhlY3V0b3IsIGRlcCwgc3JjLCBzbmQpOyB0aGlzLmZuID0gZm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vj4gdHJ5RmlyZShpbnQgbW9kZSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vj4gZDsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGE7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBiOworICAgICAgICAgICAgaWYgKChkID0gZGVwKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIWQuYmlBcHBseShhID0gc3JjLCBiID0gc25kLCBmbiwgbW9kZSA+IDAgPyBudWxsIDogdGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBkZXAgPSBudWxsOyBzcmMgPSBudWxsOyBzbmQgPSBudWxsOyBmbiA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBiLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIDxSLFM+IGJvb2xlYW4gYmlBcHBseShDb21wbGV0YWJsZUZ1dHVyZTxSPiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTPiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUZ1bmN0aW9uPD8gc3VwZXIgUiw/IHN1cGVyIFMsPyBleHRlbmRzIFQ+IGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQXBwbHk8UixTLFQ+IGMpIHsKKyAgICAgICAgT2JqZWN0IHIsIHM7IFRocm93YWJsZSB4OworICAgICAgICBpZiAoYSA9PSBudWxsIHx8IChyID0gYS5yZXN1bHQpID09IG51bGwgfHwKKyAgICAgICAgICAgIGIgPT0gbnVsbCB8fCAocyA9IGIucmVzdWx0KSA9PSBudWxsIHx8IGYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5Q29tcGxldGU6IGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHggPSAoKEFsdFJlc3VsdClyKS5leCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVRocm93YWJsZSh4LCByKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgdHJ5Q29tcGxldGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHggPSAoKEFsdFJlc3VsdClzKS5leCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVRocm93YWJsZSh4LCBzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgdHJ5Q29tcGxldGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmICFjLmNsYWltKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgUiByciA9IChSKSByOworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBTIHNzID0gKFMpIHM7CisgICAgICAgICAgICAgICAgY29tcGxldGVWYWx1ZShmLmFwcGx5KHJyLCBzcykpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgPFUsVj4gQ29tcGxldGFibGVGdXR1cmU8Vj4gYmlBcHBseVN0YWdlKAorICAgICAgICBFeGVjdXRvciBlLCBDb21wbGV0aW9uU3RhZ2U8VT4gbywKKyAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsPyBzdXBlciBVLD8gZXh0ZW5kcyBWPiBmKSB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGI7CisgICAgICAgIGlmIChmID09IG51bGwgfHwgKGIgPSBvLnRvQ29tcGxldGFibGVGdXR1cmUoKSkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFY+KCk7CisgICAgICAgIGlmIChlICE9IG51bGwgfHwgIWQuYmlBcHBseSh0aGlzLCBiLCBmLCBudWxsKSkgeworICAgICAgICAgICAgQmlBcHBseTxULFUsVj4gYyA9IG5ldyBCaUFwcGx5PFQsVSxWPihlLCBkLCB0aGlzLCBiLCBmKTsKKyAgICAgICAgICAgIGJpcHVzaChiLCBjKTsKKyAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQmlBY2NlcHQ8VCxVPiBleHRlbmRzIEJpQ29tcGxldGlvbjxULFUsVm9pZD4geworICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCw/IHN1cGVyIFU+IGZuOworICAgICAgICBCaUFjY2VwdChFeGVjdXRvciBleGVjdXRvciwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZGVwLAorICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBzcmMsIENvbXBsZXRhYmxlRnV0dXJlPFU+IHNuZCwKKyAgICAgICAgICAgICAgICAgQmlDb25zdW1lcjw/IHN1cGVyIFQsPyBzdXBlciBVPiBmbikgeworICAgICAgICAgICAgc3VwZXIoZXhlY3V0b3IsIGRlcCwgc3JjLCBzbmQpOyB0aGlzLmZuID0gZm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdHJ5RmlyZShpbnQgbW9kZSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZDsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGE7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBiOworICAgICAgICAgICAgaWYgKChkID0gZGVwKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIWQuYmlBY2NlcHQoYSA9IHNyYywgYiA9IHNuZCwgZm4sIG1vZGUgPiAwID8gbnVsbCA6IHRoaXMpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgZGVwID0gbnVsbDsgc3JjID0gbnVsbDsgc25kID0gbnVsbDsgZm4gPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGQucG9zdEZpcmUoYSwgYiwgbW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCA8UixTPiBib29sZWFuIGJpQWNjZXB0KENvbXBsZXRhYmxlRnV0dXJlPFI+IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTPiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlDb25zdW1lcjw/IHN1cGVyIFIsPyBzdXBlciBTPiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlBY2NlcHQ8UixTPiBjKSB7CisgICAgICAgIE9iamVjdCByLCBzOyBUaHJvd2FibGUgeDsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCAociA9IGEucmVzdWx0KSA9PSBudWxsIHx8CisgICAgICAgICAgICBiID09IG51bGwgfHwgKHMgPSBiLnJlc3VsdCkgPT0gbnVsbCB8fCBmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHRyeUNvbXBsZXRlOiBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKCh4ID0gKChBbHRSZXN1bHQpcikuZXgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRyeUNvbXBsZXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKCh4ID0gKChBbHRSZXN1bHQpcykuZXgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRyeUNvbXBsZXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiAhYy5jbGFpbSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFIgcnIgPSAoUikgcjsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgUyBzcyA9IChTKSBzOworICAgICAgICAgICAgICAgIGYuYWNjZXB0KHJyLCBzcyk7CisgICAgICAgICAgICAgICAgY29tcGxldGVOdWxsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZVRocm93YWJsZShleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VT4gQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gYmlBY2NlcHRTdGFnZSgKKyAgICAgICAgRXhlY3V0b3IgZSwgQ29tcGxldGlvblN0YWdlPFU+IG8sCisgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULD8gc3VwZXIgVT4gZikgeworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBiOworICAgICAgICBpZiAoZiA9PSBudWxsIHx8IChiID0gby50b0NvbXBsZXRhYmxlRnV0dXJlKCkpID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPigpOworICAgICAgICBpZiAoZSAhPSBudWxsIHx8ICFkLmJpQWNjZXB0KHRoaXMsIGIsIGYsIG51bGwpKSB7CisgICAgICAgICAgICBCaUFjY2VwdDxULFU+IGMgPSBuZXcgQmlBY2NlcHQ8VCxVPihlLCBkLCB0aGlzLCBiLCBmKTsKKyAgICAgICAgICAgIGJpcHVzaChiLCBjKTsKKyAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQmlSdW48VCxVPiBleHRlbmRzIEJpQ29tcGxldGlvbjxULFUsVm9pZD4geworICAgICAgICBSdW5uYWJsZSBmbjsKKyAgICAgICAgQmlSdW4oRXhlY3V0b3IgZXhlY3V0b3IsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRlcCwKKyAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBzbmQsCisgICAgICAgICAgICAgIFJ1bm5hYmxlIGZuKSB7CisgICAgICAgICAgICBzdXBlcihleGVjdXRvciwgZGVwLCBzcmMsIHNuZCk7IHRoaXMuZm4gPSBmbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0cnlGaXJlKGludCBtb2RlKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkOworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gYTsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGI7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAhZC5iaVJ1bihhID0gc3JjLCBiID0gc25kLCBmbiwgbW9kZSA+IDAgPyBudWxsIDogdGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBkZXAgPSBudWxsOyBzcmMgPSBudWxsOyBzbmQgPSBudWxsOyBmbiA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBiLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gYmlSdW4oQ29tcGxldGFibGVGdXR1cmU8Pz4gYSwgQ29tcGxldGFibGVGdXR1cmU8Pz4gYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGYsIEJpUnVuPD8sPz4gYykgeworICAgICAgICBPYmplY3QgciwgczsgVGhyb3dhYmxlIHg7CisgICAgICAgIGlmIChhID09IG51bGwgfHwgKHIgPSBhLnJlc3VsdCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgYiA9PSBudWxsIHx8IChzID0gYi5yZXN1bHQpID09IG51bGwgfHwgZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0ICYmICh4ID0gKChBbHRSZXN1bHQpcikuZXgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcik7CisgICAgICAgICAgICBlbHNlIGlmIChzIGluc3RhbmNlb2YgQWx0UmVzdWx0ICYmICh4ID0gKChBbHRSZXN1bHQpcykuZXgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiAhYy5jbGFpbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmLnJ1bigpOworICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU51bGwoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGJpUnVuU3RhZ2UoRXhlY3V0b3IgZSwgQ29tcGxldGlvblN0YWdlPD8+IG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGYpIHsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Pz4gYjsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCB8fCAoYiA9IG8udG9Db21wbGV0YWJsZUZ1dHVyZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCB8fCAhZC5iaVJ1bih0aGlzLCBiLCBmLCBudWxsKSkgeworICAgICAgICAgICAgQmlSdW48VCw/PiBjID0gbmV3IEJpUnVuPD4oZSwgZCwgdGhpcywgYiwgZik7CisgICAgICAgICAgICBiaXB1c2goYiwgYyk7CisgICAgICAgICAgICBjLnRyeUZpcmUoU1lOQyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEJpUmVsYXk8VCxVPiBleHRlbmRzIEJpQ29tcGxldGlvbjxULFUsVm9pZD4geyAvLyBmb3IgQW5kCisgICAgICAgIEJpUmVsYXkoQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZGVwLAorICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHNyYywKKyAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBzbmQpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwsIGRlcCwgc3JjLCBzbmQpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHRyeUZpcmUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQ7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBhOworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gYjsKKyAgICAgICAgICAgIGlmICgoZCA9IGRlcCkgPT0gbnVsbCB8fCAhZC5iaVJlbGF5KGEgPSBzcmMsIGIgPSBzbmQpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgc3JjID0gbnVsbDsgc25kID0gbnVsbDsgZGVwID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkLnBvc3RGaXJlKGEsIGIsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBiaVJlbGF5KENvbXBsZXRhYmxlRnV0dXJlPD8+IGEsIENvbXBsZXRhYmxlRnV0dXJlPD8+IGIpIHsKKyAgICAgICAgT2JqZWN0IHIsIHM7IFRocm93YWJsZSB4OworICAgICAgICBpZiAoYSA9PSBudWxsIHx8IChyID0gYS5yZXN1bHQpID09IG51bGwgfHwKKyAgICAgICAgICAgIGIgPT0gbnVsbCB8fCAocyA9IGIucmVzdWx0KSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0ICYmICh4ID0gKChBbHRSZXN1bHQpcikuZXgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcik7CisgICAgICAgICAgICBlbHNlIGlmIChzIGluc3RhbmNlb2YgQWx0UmVzdWx0ICYmICh4ID0gKChBbHRSZXN1bHQpcykuZXgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcGxldGVOdWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIFJlY3Vyc2l2ZWx5IGNvbnN0cnVjdHMgYSB0cmVlIG9mIGNvbXBsZXRpb25zLiAqLworICAgIHN0YXRpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBhbmRUcmVlKENvbXBsZXRhYmxlRnV0dXJlPD8+W10gY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbywgaW50IGhpKSB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKKyAgICAgICAgaWYgKGxvID4gaGkpIC8vIGVtcHR5CisgICAgICAgICAgICBkLnJlc3VsdCA9IE5JTDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/PiBhLCBiOworICAgICAgICAgICAgaW50IG1pZCA9IChsbyArIGhpKSA+Pj4gMTsKKyAgICAgICAgICAgIGlmICgoYSA9IChsbyA9PSBtaWQgPyBjZnNbbG9dIDoKKyAgICAgICAgICAgICAgICAgICAgICBhbmRUcmVlKGNmcywgbG8sIG1pZCkpKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgKGIgPSAobG8gPT0gaGkgPyBhIDogKGhpID09IG1pZCsxKSA/IGNmc1toaV0gOgorICAgICAgICAgICAgICAgICAgICAgIGFuZFRyZWUoY2ZzLCBtaWQrMSwgaGkpKSkgID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAoIWQuYmlSZWxheShhLCBiKSkgeworICAgICAgICAgICAgICAgIEJpUmVsYXk8Pyw/PiBjID0gbmV3IEJpUmVsYXk8PihkLCBhLCBiKTsKKyAgICAgICAgICAgICAgICBhLmJpcHVzaChiLCBjKTsKKyAgICAgICAgICAgICAgICBjLnRyeUZpcmUoU1lOQyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLSBQcm9qZWN0ZWQgKE9yZWQpIEJpQ29tcGxldGlvbnMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKiBQdXNoZXMgY29tcGxldGlvbiB0byB0aGlzIGFuZCBiIHVubGVzcyBlaXRoZXIgZG9uZS4gKi8KKyAgICBmaW5hbCB2b2lkIG9ycHVzaChDb21wbGV0YWJsZUZ1dHVyZTw/PiBiLCBCaUNvbXBsZXRpb248Pyw/LD8+IGMpIHsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKChiID09IG51bGwgfHwgYi5yZXN1bHQgPT0gbnVsbCkgJiYgcmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJ5UHVzaFN0YWNrKGMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiICE9IG51bGwgJiYgYiAhPSB0aGlzICYmIGIucmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRpb24gcSA9IG5ldyBDb0NvbXBsZXRpb24oYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYi5yZXN1bHQgPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFiLnRyeVB1c2hTdGFjayhxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U2V0TmV4dChxLCBudWxsKTsgLy8gY2xlYXIgb24gZmFpbHVyZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXp5U2V0TmV4dChjLCBudWxsKTsgLy8gY2xlYXIgb24gZmFpbHVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE9yQXBwbHk8VCxVIGV4dGVuZHMgVCxWPiBleHRlbmRzIEJpQ29tcGxldGlvbjxULFUsVj4geworICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFY+IGZuOworICAgICAgICBPckFwcGx5KEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkZXAsCisgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IHNuZCwKKyAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFY+IGZuKSB7CisgICAgICAgICAgICBzdXBlcihleGVjdXRvciwgZGVwLCBzcmMsIHNuZCk7IHRoaXMuZm4gPSBmbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWPiB0cnlGaXJlKGludCBtb2RlKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkOworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gYTsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGI7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAhZC5vckFwcGx5KGEgPSBzcmMsIGIgPSBzbmQsIGZuLCBtb2RlID4gMCA/IG51bGwgOiB0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGRlcCA9IG51bGw7IHNyYyA9IG51bGw7IHNuZCA9IG51bGw7IGZuID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkLnBvc3RGaXJlKGEsIGIsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgPFIsUyBleHRlbmRzIFI+IGJvb2xlYW4gb3JBcHBseShDb21wbGV0YWJsZUZ1dHVyZTxSPiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Uz4gYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPD8gc3VwZXIgUiwgPyBleHRlbmRzIFQ+IGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPckFwcGx5PFIsUyxUPiBjKSB7CisgICAgICAgIE9iamVjdCByOyBUaHJvd2FibGUgeDsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwKKyAgICAgICAgICAgICgociA9IGEucmVzdWx0KSA9PSBudWxsICYmIChyID0gYi5yZXN1bHQpID09IG51bGwpIHx8IGYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5Q29tcGxldGU6IGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmICFjLmNsYWltKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSAoKEFsdFJlc3VsdClyKS5leCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoeCwgcik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB0cnlDb21wbGV0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFIgcnIgPSAoUikgcjsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZVZhbHVlKGYuYXBwbHkocnIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxVIGV4dGVuZHMgVCxWPiBDb21wbGV0YWJsZUZ1dHVyZTxWPiBvckFwcGx5U3RhZ2UoCisgICAgICAgIEV4ZWN1dG9yIGUsIENvbXBsZXRpb25TdGFnZTxVPiBvLAorICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBWPiBmKSB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGI7CisgICAgICAgIGlmIChmID09IG51bGwgfHwgKGIgPSBvLnRvQ29tcGxldGFibGVGdXR1cmUoKSkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFY+KCk7CisgICAgICAgIGlmIChlICE9IG51bGwgfHwgIWQub3JBcHBseSh0aGlzLCBiLCBmLCBudWxsKSkgeworICAgICAgICAgICAgT3JBcHBseTxULFUsVj4gYyA9IG5ldyBPckFwcGx5PFQsVSxWPihlLCBkLCB0aGlzLCBiLCBmKTsKKyAgICAgICAgICAgIG9ycHVzaChiLCBjKTsKKyAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgT3JBY2NlcHQ8VCxVIGV4dGVuZHMgVD4gZXh0ZW5kcyBCaUNvbXBsZXRpb248VCxVLFZvaWQ+IHsKKyAgICAgICAgQ29uc3VtZXI8PyBzdXBlciBUPiBmbjsKKyAgICAgICAgT3JBY2NlcHQoRXhlY3V0b3IgZXhlY3V0b3IsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRlcCwKKyAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBzbmQsCisgICAgICAgICAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgVD4gZm4pIHsKKyAgICAgICAgICAgIHN1cGVyKGV4ZWN1dG9yLCBkZXAsIHNyYywgc25kKTsgdGhpcy5mbiA9IGZuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHRyeUZpcmUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQ7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBhOworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gYjsKKyAgICAgICAgICAgIGlmICgoZCA9IGRlcCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICFkLm9yQWNjZXB0KGEgPSBzcmMsIGIgPSBzbmQsIGZuLCBtb2RlID4gMCA/IG51bGwgOiB0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGRlcCA9IG51bGw7IHNyYyA9IG51bGw7IHNuZCA9IG51bGw7IGZuID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkLnBvc3RGaXJlKGEsIGIsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgPFIsUyBleHRlbmRzIFI+IGJvb2xlYW4gb3JBY2NlcHQoQ29tcGxldGFibGVGdXR1cmU8Uj4gYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTPiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgUj4gZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPckFjY2VwdDxSLFM+IGMpIHsKKyAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSB4OworICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fAorICAgICAgICAgICAgKChyID0gYS5yZXN1bHQpID09IG51bGwgJiYgKHIgPSBiLnJlc3VsdCkgPT0gbnVsbCkgfHwgZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB0cnlDb21wbGV0ZTogaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgIWMuY2xhaW0oKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVRocm93YWJsZSh4LCByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRyeUNvbXBsZXRlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgUiByciA9IChSKSByOworICAgICAgICAgICAgICAgIGYuYWNjZXB0KHJyKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZU51bGwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRlVGhyb3dhYmxlKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxVIGV4dGVuZHMgVD4gQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gb3JBY2NlcHRTdGFnZSgKKyAgICAgICAgRXhlY3V0b3IgZSwgQ29tcGxldGlvblN0YWdlPFU+IG8sIENvbnN1bWVyPD8gc3VwZXIgVD4gZikgeworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBiOworICAgICAgICBpZiAoZiA9PSBudWxsIHx8IChiID0gby50b0NvbXBsZXRhYmxlRnV0dXJlKCkpID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPigpOworICAgICAgICBpZiAoZSAhPSBudWxsIHx8ICFkLm9yQWNjZXB0KHRoaXMsIGIsIGYsIG51bGwpKSB7CisgICAgICAgICAgICBPckFjY2VwdDxULFU+IGMgPSBuZXcgT3JBY2NlcHQ8VCxVPihlLCBkLCB0aGlzLCBiLCBmKTsKKyAgICAgICAgICAgIG9ycHVzaChiLCBjKTsKKyAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgT3JSdW48VCxVPiBleHRlbmRzIEJpQ29tcGxldGlvbjxULFUsVm9pZD4geworICAgICAgICBSdW5uYWJsZSBmbjsKKyAgICAgICAgT3JSdW4oRXhlY3V0b3IgZXhlY3V0b3IsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRlcCwKKyAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gc3JjLAorICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBzbmQsCisgICAgICAgICAgICAgIFJ1bm5hYmxlIGZuKSB7CisgICAgICAgICAgICBzdXBlcihleGVjdXRvciwgZGVwLCBzcmMsIHNuZCk7IHRoaXMuZm4gPSBmbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0cnlGaXJlKGludCBtb2RlKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkOworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gYTsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGI7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAhZC5vclJ1bihhID0gc3JjLCBiID0gc25kLCBmbiwgbW9kZSA+IDAgPyBudWxsIDogdGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBkZXAgPSBudWxsOyBzcmMgPSBudWxsOyBzbmQgPSBudWxsOyBmbiA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBiLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gb3JSdW4oQ29tcGxldGFibGVGdXR1cmU8Pz4gYSwgQ29tcGxldGFibGVGdXR1cmU8Pz4gYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGYsIE9yUnVuPD8sPz4gYykgeworICAgICAgICBPYmplY3QgcjsgVGhyb3dhYmxlIHg7CisgICAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsIHx8CisgICAgICAgICAgICAoKHIgPSBhLnJlc3VsdCkgPT0gbnVsbCAmJiAociA9IGIucmVzdWx0KSA9PSBudWxsKSB8fCBmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmICFjLmNsYWltKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCAmJiAoeCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVRocm93YWJsZSh4LCByKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZi5ydW4oKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGVOdWxsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICAgICAgY29tcGxldGVUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gb3JSdW5TdGFnZShFeGVjdXRvciBlLCBDb21wbGV0aW9uU3RhZ2U8Pz4gbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVubmFibGUgZikgeworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/PiBiOworICAgICAgICBpZiAoZiA9PSBudWxsIHx8IChiID0gby50b0NvbXBsZXRhYmxlRnV0dXJlKCkpID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPigpOworICAgICAgICBpZiAoZSAhPSBudWxsIHx8ICFkLm9yUnVuKHRoaXMsIGIsIGYsIG51bGwpKSB7CisgICAgICAgICAgICBPclJ1bjxULD8+IGMgPSBuZXcgT3JSdW48PihlLCBkLCB0aGlzLCBiLCBmKTsKKyAgICAgICAgICAgIG9ycHVzaChiLCBjKTsKKyAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgT3JSZWxheTxULFU+IGV4dGVuZHMgQmlDb21wbGV0aW9uPFQsVSxPYmplY3Q+IHsgLy8gZm9yIE9yCisgICAgICAgIE9yUmVsYXkoQ29tcGxldGFibGVGdXR1cmU8T2JqZWN0PiBkZXAsIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHNyYywKKyAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBzbmQpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwsIGRlcCwgc3JjLCBzbmQpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPE9iamVjdD4gdHJ5RmlyZShpbnQgbW9kZSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8T2JqZWN0PiBkOworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gYTsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGI7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApID09IG51bGwgfHwgIWQub3JSZWxheShhID0gc3JjLCBiID0gc25kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHNyYyA9IG51bGw7IHNuZCA9IG51bGw7IGRlcCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZC5wb3N0RmlyZShhLCBiLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gb3JSZWxheShDb21wbGV0YWJsZUZ1dHVyZTw/PiBhLCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBiKSB7CisgICAgICAgIE9iamVjdCByOworICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fAorICAgICAgICAgICAgKChyID0gYS5yZXN1bHQpID09IG51bGwgJiYgKHIgPSBiLnJlc3VsdCkgPT0gbnVsbCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICh0aGlzLCBSRVNVTFQsIG51bGwsCi0gICAgICAgICAgICAgICAgIChleCA9PSBudWxsKSA/ICh2ID09IG51bGwpID8gTklMIDogdiA6Ci0gICAgICAgICAgICAgICAgIG5ldyBBbHRSZXN1bHQoKGV4IGluc3RhbmNlb2YgQ29tcGxldGlvbkV4Y2VwdGlvbikgPyBleCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBsZXRpb25FeGNlcHRpb24oZXgpKSk7Ci0gICAgICAgIHBvc3RDb21wbGV0ZSgpOyAvLyBoZWxwIG91dCBldmVuIGlmIG5vdCB0cmlnZ2VyZWQKKyAgICAgICAgICAgIGNvbXBsZXRlUmVsYXkocik7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIElmIHRyaWdnZXJlZCwgaGVscHMgcmVsZWFzZSBhbmQvb3IgcHJvY2VzcyBjb21wbGV0aW9ucy4KLSAgICAgKi8KLSAgICBmaW5hbCB2b2lkIGhlbHBQb3N0Q29tcGxldGUoKSB7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHBvc3RDb21wbGV0ZSgpOworICAgIC8qKiBSZWN1cnNpdmVseSBjb25zdHJ1Y3RzIGEgdHJlZSBvZiBjb21wbGV0aW9ucy4gKi8KKyAgICBzdGF0aWMgQ29tcGxldGFibGVGdXR1cmU8T2JqZWN0PiBvclRyZWUoQ29tcGxldGFibGVGdXR1cmU8Pz5bXSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbywgaW50IGhpKSB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPE9iamVjdD4gZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+KCk7CisgICAgICAgIGlmIChsbyA8PSBoaSkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Pz4gYSwgYjsKKyAgICAgICAgICAgIGludCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7CisgICAgICAgICAgICBpZiAoKGEgPSAobG8gPT0gbWlkID8gY2ZzW2xvXSA6CisgICAgICAgICAgICAgICAgICAgICAgb3JUcmVlKGNmcywgbG8sIG1pZCkpKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgKGIgPSAobG8gPT0gaGkgPyBhIDogKGhpID09IG1pZCsxKSA/IGNmc1toaV0gOgorICAgICAgICAgICAgICAgICAgICAgIG9yVHJlZShjZnMsIG1pZCsxLCBoaSkpKSAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICghZC5vclJlbGF5KGEsIGIpKSB7CisgICAgICAgICAgICAgICAgT3JSZWxheTw/LD8+IGMgPSBuZXcgT3JSZWxheTw+KGQsIGEsIGIpOworICAgICAgICAgICAgICAgIGEub3JwdXNoKGIsIGMpOworICAgICAgICAgICAgICAgIGMudHJ5RmlyZShTWU5DKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKICAgICB9CiAKLSAgICAvKiAtLS0tLS0tLS0tLS0tIHdhaXRpbmcgZm9yIGNvbXBsZXRpb25zIC0tLS0tLS0tLS0tLS0tICovCisgICAgLyogLS0tLS0tLS0tLS0tLSBaZXJvLWlucHV0IEFzeW5jIGZvcm1zIC0tLS0tLS0tLS0tLS0tICovCiAKLSAgICAvKiogTnVtYmVyIG9mIHByb2Nlc3NvcnMsIGZvciBzcGluIGNvbnRyb2wgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5DUFUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEFzeW5jU3VwcGx5PFQ+IGV4dGVuZHMgRm9ya0pvaW5UYXNrPFZvaWQ+CisgICAgICAgICAgICBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBBc3luY2hyb25vdXNDb21wbGV0aW9uVGFzayB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGRlcDsgU3VwcGxpZXI8VD4gZm47CisgICAgICAgIEFzeW5jU3VwcGx5KENvbXBsZXRhYmxlRnV0dXJlPFQ+IGRlcCwgU3VwcGxpZXI8VD4gZm4pIHsKKyAgICAgICAgICAgIHRoaXMuZGVwID0gZGVwOyB0aGlzLmZuID0gZm47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgVm9pZCBnZXRSYXdSZXN1bHQoKSB7IHJldHVybiBudWxsOyB9CisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJhd1Jlc3VsdChWb2lkIHYpIHt9CisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWMoKSB7IHJ1bigpOyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGQ7IFN1cHBsaWVyPFQ+IGY7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApICE9IG51bGwgJiYgKGYgPSBmbikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlcCA9IG51bGw7IGZuID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoZC5yZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZC5jb21wbGV0ZVZhbHVlKGYuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQuY29tcGxldGVUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGQucG9zdENvbXBsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IGFzeW5jU3VwcGx5U3RhZ2UoRXhlY3V0b3IgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcGxpZXI8VT4gZikgeworICAgICAgICBpZiAoZiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxVPigpOworICAgICAgICBlLmV4ZWN1dGUobmV3IEFzeW5jU3VwcGx5PFU+KGQsIGYpKTsKKyAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEFzeW5jUnVuIGV4dGVuZHMgRm9ya0pvaW5UYXNrPFZvaWQ+CisgICAgICAgICAgICBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBBc3luY2hyb25vdXNDb21wbGV0aW9uVGFzayB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRlcDsgUnVubmFibGUgZm47CisgICAgICAgIEFzeW5jUnVuKENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRlcCwgUnVubmFibGUgZm4pIHsKKyAgICAgICAgICAgIHRoaXMuZGVwID0gZGVwOyB0aGlzLmZuID0gZm47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgVm9pZCBnZXRSYXdSZXN1bHQoKSB7IHJldHVybiBudWxsOyB9CisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJhd1Jlc3VsdChWb2lkIHYpIHt9CisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWMoKSB7IHJ1bigpOyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQ7IFJ1bm5hYmxlIGY7CisgICAgICAgICAgICBpZiAoKGQgPSBkZXApICE9IG51bGwgJiYgKGYgPSBmbikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlcCA9IG51bGw7IGZuID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoZC5yZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5ydW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQuY29tcGxldGVOdWxsKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZC5jb21wbGV0ZVRocm93YWJsZShleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZC5wb3N0Q29tcGxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBhc3luY1J1blN0YWdlKEV4ZWN1dG9yIGUsIFJ1bm5hYmxlIGYpIHsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKKyAgICAgICAgZS5leGVjdXRlKG5ldyBBc3luY1J1bihkLCBmKSk7CisgICAgICAgIHJldHVybiBkOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0gU2lnbmFsbGVycyAtLS0tLS0tLS0tLS0tLSAqLwogCiAgICAgLyoqCi0gICAgICogSGV1cmlzdGljIHNwaW4gdmFsdWUgZm9yIHdhaXRpbmdHZXQoKSBiZWZvcmUgYmxvY2tpbmcgb24KLSAgICAgKiBtdWx0aXByb2Nlc3NvcnMKKyAgICAgKiBDb21wbGV0aW9uIGZvciByZWNvcmRpbmcgYW5kIHJlbGVhc2luZyBhIHdhaXRpbmcgdGhyZWFkLiAgVGhpcworICAgICAqIGNsYXNzIGltcGxlbWVudHMgTWFuYWdlZEJsb2NrZXIgdG8gYXZvaWQgc3RhcnZhdGlvbiB3aGVuCisgICAgICogYmxvY2tpbmcgYWN0aW9ucyBwaWxlIHVwIGluIEZvcmtKb2luUG9vbHMuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBTUElOUyA9IChOQ1BVID4gMSkgPyAxIDw8IDggOiAwOwotCi0gICAgLyoqCi0gICAgICogTGlua2VkIG5vZGVzIHRvIHJlY29yZCB3YWl0aW5nIHRocmVhZHMgaW4gYSBUcmVpYmVyIHN0YWNrLiAgU2VlCi0gICAgICogb3RoZXIgY2xhc3NlcyBzdWNoIGFzIFBoYXNlciBhbmQgU3luY2hyb25vdXNRdWV1ZSBmb3IgbW9yZQotICAgICAqIGRldGFpbGVkIGV4cGxhbmF0aW9uLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgTWFuYWdlZEJsb2NrZXIgdG8KLSAgICAgKiBhdm9pZCBzdGFydmF0aW9uIHdoZW4gYmxvY2tpbmcgYWN0aW9ucyBwaWxlIHVwIGluCi0gICAgICogRm9ya0pvaW5Qb29scy4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgV2FpdE5vZGUgaW1wbGVtZW50cyBGb3JrSm9pblBvb2wuTWFuYWdlZEJsb2NrZXIgewotICAgICAgICBsb25nIG5hbm9zOyAgICAgICAgICAvLyB3YWl0IHRpbWUgaWYgdGltZWQKLSAgICAgICAgZmluYWwgbG9uZyBkZWFkbGluZTsgLy8gbm9uLXplcm8gaWYgdGltZWQKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU2lnbmFsbGVyIGV4dGVuZHMgQ29tcGxldGlvbgorICAgICAgICBpbXBsZW1lbnRzIEZvcmtKb2luUG9vbC5NYW5hZ2VkQmxvY2tlciB7CisgICAgICAgIGxvbmcgbmFub3M7ICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IHRpbWUgaWYgdGltZWQKKyAgICAgICAgZmluYWwgbG9uZyBkZWFkbGluZTsgICAgICAgICAgIC8vIG5vbi16ZXJvIGlmIHRpbWVkCiAgICAgICAgIHZvbGF0aWxlIGludCBpbnRlcnJ1cHRDb250cm9sOyAvLyA+IDA6IGludGVycnVwdGlibGUsIDwgMDogaW50ZXJydXB0ZWQKICAgICAgICAgdm9sYXRpbGUgVGhyZWFkIHRocmVhZDsKLSAgICAgICAgdm9sYXRpbGUgV2FpdE5vZGUgbmV4dDsKLSAgICAgICAgV2FpdE5vZGUoYm9vbGVhbiBpbnRlcnJ1cHRpYmxlLCBsb25nIG5hbm9zLCBsb25nIGRlYWRsaW5lKSB7CisKKyAgICAgICAgU2lnbmFsbGVyKGJvb2xlYW4gaW50ZXJydXB0aWJsZSwgbG9uZyBuYW5vcywgbG9uZyBkZWFkbGluZSkgewogICAgICAgICAgICAgdGhpcy50aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwogICAgICAgICAgICAgdGhpcy5pbnRlcnJ1cHRDb250cm9sID0gaW50ZXJydXB0aWJsZSA/IDEgOiAwOwogICAgICAgICAgICAgdGhpcy5uYW5vcyA9IG5hbm9zOwogICAgICAgICAgICAgdGhpcy5kZWFkbGluZSA9IGRlYWRsaW5lOwogICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHRyeUZpcmUoaW50IGlnbm9yZSkgeworICAgICAgICAgICAgVGhyZWFkIHc7IC8vIG5vIG5lZWQgdG8gYXRvbWljYWxseSBjbGFpbQorICAgICAgICAgICAgaWYgKCh3ID0gdGhyZWFkKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC51bnBhcmsodyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbGVhc2FibGUoKSB7CiAgICAgICAgICAgICBpZiAodGhyZWFkID09IG51bGwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yNzMsNiArMTY4Nyw3IEBACiAgICAgICAgICAgICAgICAgTG9ja1N1cHBvcnQucGFya05hbm9zKHRoaXMsIG5hbm9zKTsKICAgICAgICAgICAgIHJldHVybiBpc1JlbGVhc2FibGUoKTsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGlzTGl2ZSgpIHsgcmV0dXJuIHRocmVhZCAhPSBudWxsOyB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODAsMTgzMiArMTY5NSw4OSBAQAogICAgICAqIGludGVycnVwdGVkLgogICAgICAqLwogICAgIHByaXZhdGUgT2JqZWN0IHdhaXRpbmdHZXQoYm9vbGVhbiBpbnRlcnJ1cHRpYmxlKSB7Ci0gICAgICAgIFdhaXROb2RlIHEgPSBudWxsOworICAgICAgICBTaWduYWxsZXIgcSA9IG51bGw7CiAgICAgICAgIGJvb2xlYW4gcXVldWVkID0gZmFsc2U7Ci0gICAgICAgIGludCBzcGlucyA9IFNQSU5TOwotICAgICAgICBmb3IgKE9iamVjdCByOzspIHsKLSAgICAgICAgICAgIGlmICgociA9IHJlc3VsdCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHsgLy8gc3VwcHJlc3MgdW5wYXJrCi0gICAgICAgICAgICAgICAgICAgIHEudGhyZWFkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHEuaW50ZXJydXB0Q29udHJvbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlV2FpdGVyKHEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3N0Q29tcGxldGUoKTsgLy8gaGVscCByZWxlYXNlIG90aGVycwotICAgICAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICAgICAgfQorICAgICAgICBpbnQgc3BpbnMgPSAtMTsKKyAgICAgICAgT2JqZWN0IHI7CisgICAgICAgIHdoaWxlICgociA9IHJlc3VsdCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNwaW5zIDwgMCkKKyAgICAgICAgICAgICAgICBzcGlucyA9IChSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCkgPiAxKSA/CisgICAgICAgICAgICAgICAgICAgIDEgPDwgOCA6IDA7IC8vIFVzZSBicmllZiBzcGluLXdhaXQgb24gbXVsdGlwcm9jZXNzb3JzCiAgICAgICAgICAgICBlbHNlIGlmIChzcGlucyA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgcm5kID0gVGhyZWFkTG9jYWxSYW5kb20ubmV4dFNlY29uZGFyeVNlZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAocm5kID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJuZCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJuZCA+PSAwKQorICAgICAgICAgICAgICAgIGlmIChUaHJlYWRMb2NhbFJhbmRvbS5uZXh0U2Vjb25kYXJ5U2VlZCgpID49IDApCiAgICAgICAgICAgICAgICAgICAgIC0tc3BpbnM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChxID09IG51bGwpCi0gICAgICAgICAgICAgICAgcSA9IG5ldyBXYWl0Tm9kZShpbnRlcnJ1cHRpYmxlLCAwTCwgMEwpOworICAgICAgICAgICAgICAgIHEgPSBuZXcgU2lnbmFsbGVyKGludGVycnVwdGlibGUsIDBMLCAwTCk7CiAgICAgICAgICAgICBlbHNlIGlmICghcXVldWVkKQotICAgICAgICAgICAgICAgIHF1ZXVlZCA9IFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdCh0aGlzLCBXQUlURVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLm5leHQgPSB3YWl0ZXJzLCBxKTsKKyAgICAgICAgICAgICAgICBxdWV1ZWQgPSB0cnlQdXNoU3RhY2socSk7CiAgICAgICAgICAgICBlbHNlIGlmIChpbnRlcnJ1cHRpYmxlICYmIHEuaW50ZXJydXB0Q29udHJvbCA8IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmVXYWl0ZXIocSk7CisgICAgICAgICAgICAgICAgcS50aHJlYWQgPSBudWxsOworICAgICAgICAgICAgICAgIGNsZWFuU3RhY2soKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKHEudGhyZWFkICE9IG51bGwgJiYgcmVzdWx0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBGb3JrSm9pblBvb2wubWFuYWdlZEJsb2NrKHEpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKICAgICAgICAgICAgICAgICAgICAgcS5pbnRlcnJ1cHRDb250cm9sID0gLTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChxICE9IG51bGwpIHsKKyAgICAgICAgICAgIHEudGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChxLmludGVycnVwdENvbnRyb2wgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdGlibGUpCisgICAgICAgICAgICAgICAgICAgIHIgPSBudWxsOyAvLyByZXBvcnQgaW50ZXJydXB0aW9uCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBvc3RDb21wbGV0ZSgpOworICAgICAgICByZXR1cm4gcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBd2FpdHMgY29tcGxldGlvbiBvciBhYm9ydHMgb24gaW50ZXJydXB0IG9yIHRpbWVvdXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFub3MgdGltZSB0byB3YWl0Ci0gICAgICogQHJldHVybiByYXcgcmVzdWx0CisgICAgICogUmV0dXJucyByYXcgcmVzdWx0IGFmdGVyIHdhaXRpbmcsIG9yIG51bGwgaWYgaW50ZXJydXB0ZWQsIG9yCisgICAgICogdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gb24gdGltZW91dC4KICAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCB0aW1lZEF3YWl0RG9uZShsb25nIG5hbm9zKQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBXYWl0Tm9kZSBxID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdCB0aW1lZEdldChsb25nIG5hbm9zKSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAobmFub3MgPD0gMEwpCisgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigpOworICAgICAgICBsb25nIGQgPSBTeXN0ZW0ubmFub1RpbWUoKSArIG5hbm9zOworICAgICAgICBTaWduYWxsZXIgcSA9IG5ldyBTaWduYWxsZXIodHJ1ZSwgbmFub3MsIGQgPT0gMEwgPyAxTCA6IGQpOyAvLyBhdm9pZCAwCiAgICAgICAgIGJvb2xlYW4gcXVldWVkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoT2JqZWN0IHI7OykgewotICAgICAgICAgICAgaWYgKChyID0gcmVzdWx0KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBxLnRocmVhZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxLmludGVycnVwdENvbnRyb2wgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVXYWl0ZXIocSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3N0Q29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChuYW5vcyA8PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBsb25nIGQgPSBTeXN0ZW0ubmFub1RpbWUoKSArIG5hbm9zOwotICAgICAgICAgICAgICAgIHEgPSBuZXcgV2FpdE5vZGUodHJ1ZSwgbmFub3MsIGQgPT0gMEwgPyAxTCA6IGQpOyAvLyBhdm9pZCAwCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghcXVldWVkKQotICAgICAgICAgICAgICAgIHF1ZXVlZCA9IFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdCh0aGlzLCBXQUlURVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLm5leHQgPSB3YWl0ZXJzLCBxKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHEuaW50ZXJydXB0Q29udHJvbCA8IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmVXYWl0ZXIocSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChxLm5hbm9zIDw9IDBMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVdhaXRlcihxKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIE9iamVjdCByOworICAgICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHNwaW4gaGVyZSAoYXMgd2FpdGluZ0dldCBkb2VzKSBiZWNhdXNlCisgICAgICAgIC8vIHRoZSBjYWxsIHRvIG5hbm9UaW1lKCkgYWJvdmUgYWN0cyBtdWNoIGxpa2UgYSBzcGluLgorICAgICAgICB3aGlsZSAoKHIgPSByZXN1bHQpID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghcXVldWVkKQorICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRyeVB1c2hTdGFjayhxKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHEuaW50ZXJydXB0Q29udHJvbCA8IDAgfHwgcS5uYW5vcyA8PSAwTCkgeworICAgICAgICAgICAgICAgIHEudGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjbGVhblN0YWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKHEuaW50ZXJydXB0Q29udHJvbCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChxLnRocmVhZCAhPSBudWxsICYmIHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgRm9ya0pvaW5Qb29sLm1hbmFnZWRCbG9jayhxKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CiAgICAgICAgICAgICAgICAgICAgIHEuaW50ZXJydXB0Q29udHJvbCA9IC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAocS5pbnRlcnJ1cHRDb250cm9sIDwgMCkKKyAgICAgICAgICAgIHIgPSBudWxsOworICAgICAgICBxLnRocmVhZCA9IG51bGw7CisgICAgICAgIHBvc3RDb21wbGV0ZSgpOworICAgICAgICByZXR1cm4gcjsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUcmllcyB0byB1bmxpbmsgYSB0aW1lZC1vdXQgb3IgaW50ZXJydXB0ZWQgd2FpdCBub2RlIHRvIGF2b2lkCi0gICAgICogYWNjdW11bGF0aW5nIGdhcmJhZ2UuICBJbnRlcm5hbCBub2RlcyBhcmUgc2ltcGx5IHVuc3BsaWNlZAotICAgICAqIHdpdGhvdXQgQ0FTIHNpbmNlIGl0IGlzIGhhcm1sZXNzIGlmIHRoZXkgYXJlIHRyYXZlcnNlZCBhbnl3YXkKLSAgICAgKiBieSByZWxlYXNlcnMuICBUbyBhdm9pZCBlZmZlY3RzIG9mIHVuc3BsaWNpbmcgZnJvbSBhbHJlYWR5Ci0gICAgICogcmVtb3ZlZCBub2RlcywgdGhlIGxpc3QgaXMgcmV0cmF2ZXJzZWQgaW4gY2FzZSBvZiBhbiBhcHBhcmVudAotICAgICAqIHJhY2UuICBUaGlzIGlzIHNsb3cgd2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2Ygbm9kZXMsIGJ1dCB3ZSBkb24ndAotICAgICAqIGV4cGVjdCBsaXN0cyB0byBiZSBsb25nIGVub3VnaCB0byBvdXR3ZWlnaCBoaWdoZXItb3ZlcmhlYWQKLSAgICAgKiBzY2hlbWVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVXYWl0ZXIoV2FpdE5vZGUgbm9kZSkgewotICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBub2RlLnRocmVhZCA9IG51bGw7Ci0gICAgICAgICAgICByZXRyeToKLSAgICAgICAgICAgIGZvciAoOzspIHsgICAgICAgICAgLy8gcmVzdGFydCBvbiByZW1vdmVXYWl0ZXIgcmFjZQotICAgICAgICAgICAgICAgIGZvciAoV2FpdE5vZGUgcHJlZCA9IG51bGwsIHEgPSB3YWl0ZXJzLCBzOyBxICE9IG51bGw7IHEgPSBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBxLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxLnRocmVhZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCA9IHE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5uZXh0ID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkLnRocmVhZCA9PSBudWxsKSAvLyBjaGVjayBmb3IgcmFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHJldHJ5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QodGhpcywgV0FJVEVSUywgcSwgcykpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSByZXRyeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tIEFzeW5jIHRhc2tzIC0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvKioKLSAgICAgKiBBIG1hcmtlciBpbnRlcmZhY2UgaWRlbnRpZnlpbmcgYXN5bmNocm9ub3VzIHRhc2tzIHByb2R1Y2VkIGJ5Ci0gICAgICoge0Bjb2RlIGFzeW5jfSBtZXRob2RzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIG1vbml0b3JpbmcsCi0gICAgICogZGVidWdnaW5nLCBhbmQgdHJhY2tpbmcgYXN5bmNocm9ub3VzIGFjdGl2aXRpZXMuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS44Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQXN5bmNocm9ub3VzQ29tcGxldGlvblRhc2sgewotICAgIH0KLQotICAgIC8qKiBCYXNlIGNsYXNzIGNhbiBhY3QgYXMgZWl0aGVyIEZKIG9yIHBsYWluIFJ1bm5hYmxlICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0gICAgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFzeW5jIGV4dGVuZHMgRm9ya0pvaW5UYXNrPFZvaWQ+Ci0gICAgICAgIGltcGxlbWVudHMgUnVubmFibGUsIEFzeW5jaHJvbm91c0NvbXBsZXRpb25UYXNrIHsKLSAgICAgICAgcHVibGljIGZpbmFsIFZvaWQgZ2V0UmF3UmVzdWx0KCkgeyByZXR1cm4gbnVsbDsgfQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSYXdSZXN1bHQoVm9pZCB2KSB7IH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgeyBleGVjKCk7IH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIGdpdmVuIGFzeW5jIHRhc2sgdXNpbmcgdGhlIGdpdmVuIGV4ZWN1dG9yLCB1bmxlc3MKLSAgICAgKiB0aGUgZXhlY3V0b3IgaXMgRm9ya0pvaW5Qb29sLmNvbW1vblBvb2wgYW5kIGl0IGhhcyBiZWVuCi0gICAgICogZGlzYWJsZWQsIGluIHdoaWNoIGNhc2Ugc3RhcnRzIGEgbmV3IHRocmVhZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBleGVjQXN5bmMoRXhlY3V0b3IgZSwgQXN5bmMgcikgewotICAgICAgICBpZiAoZSA9PSBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpICYmCi0gICAgICAgICAgICBGb3JrSm9pblBvb2wuZ2V0Q29tbW9uUG9vbFBhcmFsbGVsaXNtKCkgPD0gMSkKLSAgICAgICAgICAgIG5ldyBUaHJlYWQocikuc3RhcnQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZS5leGVjdXRlKHIpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBc3luY1J1biBleHRlbmRzIEFzeW5jIHsKLSAgICAgICAgZmluYWwgUnVubmFibGUgZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdDsKLSAgICAgICAgQXN5bmNSdW4oUnVubmFibGUgZm4sIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdCkgewotICAgICAgICAgICAgdGhpcy5mbiA9IGZuOyB0aGlzLmRzdCA9IGRzdDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBleGVjKCkgewotICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZDsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKChkID0gdGhpcy5kc3QpICE9IG51bGwgJiYgZC5yZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZuLnJ1bigpOwotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZC5pbnRlcm5hbENvbXBsZXRlKG51bGwsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBc3luY1N1cHBseTxVPiBleHRlbmRzIEFzeW5jIHsKLSAgICAgICAgZmluYWwgU3VwcGxpZXI8VT4gZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdDsKLSAgICAgICAgQXN5bmNTdXBwbHkoU3VwcGxpZXI8VT4gZm4sIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdCkgewotICAgICAgICAgICAgdGhpcy5mbiA9IGZuOyB0aGlzLmRzdCA9IGRzdDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBleGVjKCkgewotICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZDsgVSB1OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGQgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJiBkLnJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdSA9IGZuLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgdSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGQuaW50ZXJuYWxDb21wbGV0ZSh1LCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjMyNDUzOTUyMjc2ODg1MDcwTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQXN5bmNBcHBseTxULFU+IGV4dGVuZHMgQXN5bmMgewotICAgICAgICBmaW5hbCBUIGFyZzsKLSAgICAgICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBULD8gZXh0ZW5kcyBVPiBmbjsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0OwotICAgICAgICBBc3luY0FwcGx5KFQgYXJnLCBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFU+IGZuLAotICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdCkgewotICAgICAgICAgICAgdGhpcy5hcmcgPSBhcmc7IHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXhlYygpIHsKLSAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGQ7IFUgdTsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKChkID0gdGhpcy5kc3QpICE9IG51bGwgJiYgZC5yZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHUgPSBmbi5hcHBseShhcmcpOwotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgdSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGQuaW50ZXJuYWxDb21wbGV0ZSh1LCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjMyNDUzOTUyMjc2ODg1MDcwTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQXN5bmNDb21iaW5lPFQsVSxWPiBleHRlbmRzIEFzeW5jIHsKLSAgICAgICAgZmluYWwgVCBhcmcxOwotICAgICAgICBmaW5hbCBVIGFyZzI7Ci0gICAgICAgIGZpbmFsIEJpRnVuY3Rpb248PyBzdXBlciBULD8gc3VwZXIgVSw/IGV4dGVuZHMgVj4gZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFY+IGRzdDsKLSAgICAgICAgQXN5bmNDb21iaW5lKFQgYXJnMSwgVSBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsPyBzdXBlciBVLD8gZXh0ZW5kcyBWPiBmbiwKLSAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFY+IGRzdCkgewotICAgICAgICAgICAgdGhpcy5hcmcxID0gYXJnMTsgdGhpcy5hcmcyID0gYXJnMjsgdGhpcy5mbiA9IGZuOyB0aGlzLmRzdCA9IGRzdDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBleGVjKCkgewotICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vj4gZDsgViB2OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGQgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJiBkLnJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdiA9IGZuLmFwcGx5KGFyZzEsIGFyZzIpOwotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGQuaW50ZXJuYWxDb21wbGV0ZSh2LCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjMyNDUzOTUyMjc2ODg1MDcwTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQXN5bmNBY2NlcHQ8VD4gZXh0ZW5kcyBBc3luYyB7Ci0gICAgICAgIGZpbmFsIFQgYXJnOwotICAgICAgICBmaW5hbCBDb25zdW1lcjw/IHN1cGVyIFQ+IGZuOwotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBkc3Q7Ci0gICAgICAgIEFzeW5jQWNjZXB0KFQgYXJnLCBDb25zdW1lcjw/IHN1cGVyIFQ+IGZuLAotICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/PiBkc3QpIHsKLSAgICAgICAgICAgIHRoaXMuYXJnID0gYXJnOyB0aGlzLmZuID0gZm47IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWMoKSB7Ci0gICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/PiBkOyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGQgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJiBkLnJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm4uYWNjZXB0KGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkLmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzMjQ1Mzk1MjI3Njg4NTA3MEw7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEFzeW5jQWNjZXB0Qm90aDxULFU+IGV4dGVuZHMgQXN5bmMgewotICAgICAgICBmaW5hbCBUIGFyZzE7Ci0gICAgICAgIGZpbmFsIFUgYXJnMjsKLSAgICAgICAgZmluYWwgQmlDb25zdW1lcjw/IHN1cGVyIFQsPyBzdXBlciBVPiBmbjsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gZHN0OwotICAgICAgICBBc3luY0FjY2VwdEJvdGgoVCBhcmcxLCBVIGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCw/IHN1cGVyIFU+IGZuLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Pz4gZHN0KSB7Ci0gICAgICAgICAgICB0aGlzLmFyZzEgPSBhcmcxOyB0aGlzLmFyZzIgPSBhcmcyOyB0aGlzLmZuID0gZm47IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWMoKSB7Ci0gICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/PiBkOyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGQgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJiBkLnJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm4uYWNjZXB0KGFyZzEsIGFyZzIpOwotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZC5pbnRlcm5hbENvbXBsZXRlKG51bGwsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBc3luY0NvbXBvc2U8VCxVPiBleHRlbmRzIEFzeW5jIHsKLSAgICAgICAgZmluYWwgVCBhcmc7Ci0gICAgICAgIGZpbmFsIEZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIENvbXBsZXRpb25TdGFnZTxVPj4gZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdDsKLSAgICAgICAgQXN5bmNDb21wb3NlKFQgYXJnLAotICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgQ29tcGxldGlvblN0YWdlPFU+PiBmbiwKLSAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdCkgewotICAgICAgICAgICAgdGhpcy5hcmcgPSBhcmc7IHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXhlYygpIHsKLSAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGQsIGZyOyBVIHU7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmICgoZCA9IHRoaXMuZHN0KSAhPSBudWxsICYmIGQucmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDb21wbGV0aW9uU3RhZ2U8VT4gY3MgPSBmbi5hcHBseShhcmcpOwotICAgICAgICAgICAgICAgICAgICBmciA9IChjcyA9PSBudWxsKSA/IG51bGwgOiBjcy50b0NvbXBsZXRhYmxlRnV0dXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gKGZyID09IG51bGwpID8gbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkgOiBudWxsOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSByZXg7Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHUgPSBudWxsOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgciA9IGZyLnJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmci53YWl0aW5nR2V0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBVIHVyID0gKFUpIHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1ID0gdXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZC5pbnRlcm5hbENvbXBsZXRlKHUsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBc3luY1doZW5Db21wbGV0ZTxUPiBleHRlbmRzIEFzeW5jIHsKLSAgICAgICAgZmluYWwgVCBhcmcxOwotICAgICAgICBmaW5hbCBUaHJvd2FibGUgYXJnMjsKLSAgICAgICAgZmluYWwgQmlDb25zdW1lcjw/IHN1cGVyIFQsPyBzdXBlciBUaHJvd2FibGU+IGZuOwotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiBkc3Q7Ci0gICAgICAgIEFzeW5jV2hlbkNvbXBsZXRlKFQgYXJnMSwgVGhyb3dhYmxlIGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULD8gc3VwZXIgVGhyb3dhYmxlPiBmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gZHN0KSB7Ci0gICAgICAgICAgICB0aGlzLmFyZzEgPSBhcmcxOyB0aGlzLmFyZzIgPSBhcmcyOyB0aGlzLmZuID0gZm47IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWMoKSB7Ci0gICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBkOwotICAgICAgICAgICAgaWYgKChkID0gdGhpcy5kc3QpICE9IG51bGwgJiYgZC5yZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRocm93YWJsZSBleCA9IGFyZzI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm4uYWNjZXB0KGFyZzEsIGV4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZXggPSByZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGQuaW50ZXJuYWxDb21wbGV0ZShhcmcxLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjMyNDUzOTUyMjc2ODg1MDcwTDsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tIENvbXBsZXRpb25zIC0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgbGlua2VkIGxpc3Qgbm9kZXMgdG8gcmVjb3JkIGNvbXBsZXRpb25zLCB1c2VkIGluCi0gICAgICogYmFzaWNhbGx5IHRoZSBzYW1lIHdheSBhcyBXYWl0Tm9kZXMuIChXZSBzZXBhcmF0ZSBub2RlcyBmcm9tCi0gICAgICogdGhlIENvbXBsZXRpb25zIHRoZW1zZWx2ZXMgbWFpbmx5IGJlY2F1c2UgZm9yIHRoZSBBbmQgYW5kIE9yCi0gICAgICogbWV0aG9kcywgdGhlIHNhbWUgQ29tcGxldGlvbiBvYmplY3QgcmVzaWRlcyBpbiB0d28gbGlzdHMuKQotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21wbGV0aW9uTm9kZSB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRpb24gY29tcGxldGlvbjsKLSAgICAgICAgdm9sYXRpbGUgQ29tcGxldGlvbk5vZGUgbmV4dDsKLSAgICAgICAgQ29tcGxldGlvbk5vZGUoQ29tcGxldGlvbiBjb21wbGV0aW9uKSB7IHRoaXMuY29tcGxldGlvbiA9IGNvbXBsZXRpb247IH0KLSAgICB9Ci0KLSAgICAvLyBPcHBvcnR1bmlzdGljYWxseSBzdWJjbGFzcyBBdG9taWNJbnRlZ2VyIHRvIHVzZSBjb21wYXJlQW5kU2V0IHRvIGNsYWltLgotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDb21wbGV0aW9uIGV4dGVuZHMgQXRvbWljSW50ZWdlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVGhlbkFwcGx5PFQsVT4gZXh0ZW5kcyBDb21wbGV0aW9uIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYzsKLSAgICAgICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBULD8gZXh0ZW5kcyBVPiBmbjsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0OwotICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKLSAgICAgICAgVGhlbkFwcGx5KENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzcmMsCi0gICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFU+IGZuLAotICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0LAotICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgICAgIHRoaXMuc3JjID0gc3JjOyB0aGlzLmZuID0gZm47IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBhOwotICAgICAgICAgICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBULD8gZXh0ZW5kcyBVPiBmbjsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdDsKLSAgICAgICAgICAgIE9iamVjdCByOyBUIHQ7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmICgoZHN0ID0gdGhpcy5kc3QpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoZm4gPSB0aGlzLmZuKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGEgPSB0aGlzLnNyYykgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChyID0gYS5yZXN1bHQpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjb21wYXJlQW5kU2V0KDAsIDEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSAoKEFsdFJlc3VsdClyKS5leDsKLSAgICAgICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHRyID0gKFQpIHI7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSB0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3IgZSA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgICAgIFUgdSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY0FwcGx5PFQsVT4odCwgZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBmbi5hcHBseSh0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXggPSByZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBleCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZSh1LCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzMjQ1Mzk1MjI3Njg4NTA3MEw7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFRoZW5BY2NlcHQ8VD4gZXh0ZW5kcyBDb21wbGV0aW9uIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYzsKLSAgICAgICAgZmluYWwgQ29uc3VtZXI8PyBzdXBlciBUPiBmbjsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gZHN0OwotICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKLSAgICAgICAgVGhlbkFjY2VwdChDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gc3JjLAotICAgICAgICAgICAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgVD4gZm4sCi0gICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Pz4gZHN0LAotICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICB0aGlzLnNyYyA9IHNyYzsgdGhpcy5mbiA9IGZuOyB0aGlzLmRzdCA9IGRzdDsKLSAgICAgICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gYTsKLSAgICAgICAgICAgIGZpbmFsIENvbnN1bWVyPD8gc3VwZXIgVD4gZm47Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgcjsgVCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGRzdCA9IHRoaXMuZHN0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGZuID0gdGhpcy5mbikgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhID0gdGhpcy5zcmMpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAociA9IGEucmVzdWx0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgY29tcGFyZUFuZFNldCgwLCAxKSkgewotICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGUgPSBleGVjdXRvcjsKLSAgICAgICAgICAgICAgICBpZiAoZXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjQXN5bmMoZSwgbmV3IEFzeW5jQWNjZXB0PFQ+KHQsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi5hY2NlcHQodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBUaGVuUnVuIGV4dGVuZHMgQ29tcGxldGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHNyYzsKLSAgICAgICAgZmluYWwgUnVubmFibGUgZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdDsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgICAgIFRoZW5SdW4oQ29tcGxldGFibGVGdXR1cmU8Pz4gc3JjLAotICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGZuLAotICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdCwKLSAgICAgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7IHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gYTsKLSAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGZuOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0OwotICAgICAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmICgoZHN0ID0gdGhpcy5kc3QpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoZm4gPSB0aGlzLmZuKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGEgPSB0aGlzLnNyYykgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChyID0gYS5yZXN1bHQpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjb21wYXJlQW5kU2V0KDAsIDEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3IgZSA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgICAgIGlmIChleCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNBc3luYyhlLCBuZXcgQXN5bmNSdW4oZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuLnJ1bigpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsIHx8IGV4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKG51bGwsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjMyNDUzOTUyMjc2ODg1MDcwTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVGhlbkNvbWJpbmU8VCxVLFY+IGV4dGVuZHMgQ29tcGxldGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzcmM7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBVPiBzbmQ7Ci0gICAgICAgIGZpbmFsIEJpRnVuY3Rpb248PyBzdXBlciBULD8gc3VwZXIgVSw/IGV4dGVuZHMgVj4gZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFY+IGRzdDsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgICAgIFRoZW5Db21iaW5lKENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzcmMsCi0gICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBVPiBzbmQsCi0gICAgICAgICAgICAgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULD8gc3VwZXIgVSw/IGV4dGVuZHMgVj4gZm4sCi0gICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFY+IGRzdCwKLSAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgICAgIHRoaXMuc3JjID0gc3JjOyB0aGlzLnNuZCA9IHNuZDsKLSAgICAgICAgICAgIHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGE7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVT4gYjsKLSAgICAgICAgICAgIGZpbmFsIEJpRnVuY3Rpb248PyBzdXBlciBULD8gc3VwZXIgVSw/IGV4dGVuZHMgVj4gZm47Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgciwgczsgVCB0OyBVIHU7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmICgoZHN0ID0gdGhpcy5kc3QpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoZm4gPSB0aGlzLmZuKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGEgPSB0aGlzLnNyYykgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChyID0gYS5yZXN1bHQpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYiA9IHRoaXMuc25kKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHMgPSBiLnJlc3VsdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGNvbXBhcmVBbmRTZXQoMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocyBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXMpLmV4OwotICAgICAgICAgICAgICAgICAgICB1ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBVIHVzID0gKFUpIHM7Ci0gICAgICAgICAgICAgICAgICAgIHUgPSB1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3IgZSA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgICAgIFYgdiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY0NvbWJpbmU8VCxVLFY+KHQsIHUsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZm4uYXBwbHkodCwgdSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUodiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBUaGVuQWNjZXB0Qm90aDxULFU+IGV4dGVuZHMgQ29tcGxldGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzcmM7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBVPiBzbmQ7Ci0gICAgICAgIGZpbmFsIEJpQ29uc3VtZXI8PyBzdXBlciBULD8gc3VwZXIgVT4gZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdDsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgICAgIFRoZW5BY2NlcHRCb3RoKENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBVPiBzbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULD8gc3VwZXIgVT4gZm4sCi0gICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgICAgIHRoaXMuc3JjID0gc3JjOyB0aGlzLnNuZCA9IHNuZDsKLSAgICAgICAgICAgIHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGE7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVT4gYjsKLSAgICAgICAgICAgIGZpbmFsIEJpQ29uc3VtZXI8PyBzdXBlciBULD8gc3VwZXIgVT4gZm47Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgciwgczsgVCB0OyBVIHU7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmICgoZHN0ID0gdGhpcy5kc3QpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoZm4gPSB0aGlzLmZuKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGEgPSB0aGlzLnNyYykgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChyID0gYS5yZXN1bHQpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYiA9IHRoaXMuc25kKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHMgPSBiLnJlc3VsdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGNvbXBhcmVBbmRTZXQoMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocyBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXMpLmV4OwotICAgICAgICAgICAgICAgICAgICB1ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBVIHVzID0gKFUpIHM7Ci0gICAgICAgICAgICAgICAgICAgIHUgPSB1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3IgZSA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgICAgIGlmIChleCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNBc3luYyhlLCBuZXcgQXN5bmNBY2NlcHRCb3RoPFQsVT4odCwgdSwgZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFjY2VwdCh0LCB1KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXggPSByZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBleCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZShudWxsLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzMjQ1Mzk1MjI3Njg4NTA3MEw7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bkFmdGVyQm90aCBleHRlbmRzIENvbXBsZXRpb24gewotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBzcmM7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHNuZDsKLSAgICAgICAgZmluYWwgUnVubmFibGUgZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdDsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgICAgIFJ1bkFmdGVyQm90aChDb21wbGV0YWJsZUZ1dHVyZTw/PiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/PiBzbmQsCi0gICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSBmbiwKLSAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdCwKLSAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICB0aGlzLnNyYyA9IHNyYzsgdGhpcy5zbmQgPSBzbmQ7Ci0gICAgICAgICAgICB0aGlzLmZuID0gZm47IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IGE7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBiOwotICAgICAgICAgICAgZmluYWwgUnVubmFibGUgZm47Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgciwgczsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKChkc3QgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmbiA9IHRoaXMuZm4pICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYSA9IHRoaXMuc3JjKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHIgPSBhLnJlc3VsdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChiID0gdGhpcy5zbmQpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAocyA9IGIucmVzdWx0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgY29tcGFyZUFuZFNldCgwLCAxKSkgewotICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KQotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChleCA9PSBudWxsICYmIChzIGluc3RhbmNlb2YgQWx0UmVzdWx0KSkKLSAgICAgICAgICAgICAgICAgICAgZXggPSAoKEFsdFJlc3VsdClzKS5leDsKLSAgICAgICAgICAgICAgICBFeGVjdXRvciBlID0gZXhlY3V0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY1J1bihmbiwgZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4ucnVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBbmRDb21wbGV0aW9uIGV4dGVuZHMgQ29tcGxldGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHNyYzsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gc25kOwotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3Q7Ci0gICAgICAgIEFuZENvbXBsZXRpb24oQ29tcGxldGFibGVGdXR1cmU8Pz4gc3JjLAotICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8+IHNuZCwKLSAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3QpIHsKLSAgICAgICAgICAgIHRoaXMuc3JjID0gc3JjOyB0aGlzLnNuZCA9IHNuZDsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gYTsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IGI7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgciwgczsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKChkc3QgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhID0gdGhpcy5zcmMpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAociA9IGEucmVzdWx0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGIgPSB0aGlzLnNuZCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChzID0gYi5yZXN1bHQpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjb21wYXJlQW5kU2V0KDAsIDEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGV4ID09IG51bGwgJiYgKHMgaW5zdGFuY2VvZiBBbHRSZXN1bHQpKQotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXMpLmV4OwotICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKG51bGwsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjMyNDUzOTUyMjc2ODg1MDcwTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgQXBwbHlUb0VpdGhlcjxULFU+IGV4dGVuZHMgQ29tcGxldGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzcmM7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzbmQ7Ci0gICAgICAgIGZpbmFsIEZ1bmN0aW9uPD8gc3VwZXIgVCw/IGV4dGVuZHMgVT4gZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdDsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgICAgIEFwcGx5VG9FaXRoZXIoQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYywKLSAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gc25kLAotICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPD8gc3VwZXIgVCw/IGV4dGVuZHMgVT4gZm4sCi0gICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0LAotICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICB0aGlzLnNyYyA9IHNyYzsgdGhpcy5zbmQgPSBzbmQ7Ci0gICAgICAgICAgICB0aGlzLmZuID0gZm47IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBhOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGI7Ci0gICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFU+IGZuOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0OwotICAgICAgICAgICAgT2JqZWN0IHI7IFQgdDsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKChkc3QgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmbiA9IHRoaXMuZm4pICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoKChhID0gdGhpcy5zcmMpICE9IG51bGwgJiYgKHIgPSBhLnJlc3VsdCkgIT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgKChiID0gdGhpcy5zbmQpICE9IG51bGwgJiYgKHIgPSBiLnJlc3VsdCkgIT0gbnVsbCkpICYmCi0gICAgICAgICAgICAgICAgY29tcGFyZUFuZFNldCgwLCAxKSkgewotICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGUgPSBleGVjdXRvcjsKLSAgICAgICAgICAgICAgICBVIHUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChleCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNBc3luYyhlLCBuZXcgQXN5bmNBcHBseTxULFU+KHQsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gZm4uYXBwbHkodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUodSwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBY2NlcHRFaXRoZXI8VD4gZXh0ZW5kcyBDb21wbGV0aW9uIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYzsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNuZDsKLSAgICAgICAgZmluYWwgQ29uc3VtZXI8PyBzdXBlciBUPiBmbjsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0OwotICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKLSAgICAgICAgQWNjZXB0RWl0aGVyKENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gc25kLAotICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZXI8PyBzdXBlciBUPiBmbiwKLSAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdCwKLSAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICB0aGlzLnNyYyA9IHNyYzsgdGhpcy5zbmQgPSBzbmQ7Ci0gICAgICAgICAgICB0aGlzLmZuID0gZm47IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBhOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGI7Ci0gICAgICAgICAgICBmaW5hbCBDb25zdW1lcjw/IHN1cGVyIFQ+IGZuOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0OwotICAgICAgICAgICAgT2JqZWN0IHI7IFQgdDsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKChkc3QgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmbiA9IHRoaXMuZm4pICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoKChhID0gdGhpcy5zcmMpICE9IG51bGwgJiYgKHIgPSBhLnJlc3VsdCkgIT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgKChiID0gdGhpcy5zbmQpICE9IG51bGwgJiYgKHIgPSBiLnJlc3VsdCkgIT0gbnVsbCkpICYmCi0gICAgICAgICAgICAgICAgY29tcGFyZUFuZFNldCgwLCAxKSkgewotICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGUgPSBleGVjdXRvcjsKLSAgICAgICAgICAgICAgICBpZiAoZXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjQXN5bmMoZSwgbmV3IEFzeW5jQWNjZXB0PFQ+KHQsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi5hY2NlcHQodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSdW5BZnRlckVpdGhlciBleHRlbmRzIENvbXBsZXRpb24gewotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBzcmM7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHNuZDsKLSAgICAgICAgZmluYWwgUnVubmFibGUgZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdDsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgICAgIFJ1bkFmdGVyRWl0aGVyKENvbXBsZXRhYmxlRnV0dXJlPD8+IHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Pz4gc25kLAotICAgICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSBmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0LAotICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7IHRoaXMuc25kID0gc25kOwotICAgICAgICAgICAgdGhpcy5mbiA9IGZuOyB0aGlzLmRzdCA9IGRzdDsKLSAgICAgICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBhOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gYjsKLSAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGZuOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0OwotICAgICAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmICgoZHN0ID0gdGhpcy5kc3QpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoZm4gPSB0aGlzLmZuKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKCgoYSA9IHRoaXMuc3JjKSAhPSBudWxsICYmIChyID0gYS5yZXN1bHQpICE9IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICgoYiA9IHRoaXMuc25kKSAhPSBudWxsICYmIChyID0gYi5yZXN1bHQpICE9IG51bGwpKSAmJgotICAgICAgICAgICAgICAgIGNvbXBhcmVBbmRTZXQoMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgZXggPSAoKEFsdFJlc3VsdClyKS5leDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBFeGVjdXRvciBlID0gZXhlY3V0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY1J1bihmbiwgZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4ucnVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBPckNvbXBsZXRpb24gZXh0ZW5kcyBDb21wbGV0aW9uIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gc3JjOwotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBzbmQ7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPE9iamVjdD4gZHN0OwotICAgICAgICBPckNvbXBsZXRpb24oQ29tcGxldGFibGVGdXR1cmU8Pz4gc3JjLAotICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Pz4gc25kLAotICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8T2JqZWN0PiBkc3QpIHsKLSAgICAgICAgICAgIHRoaXMuc3JjID0gc3JjOyB0aGlzLnNuZCA9IHNuZDsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Pz4gYTsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IGI7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+IGRzdDsKLSAgICAgICAgICAgIE9iamVjdCByLCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGRzdCA9IHRoaXMuZHN0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKCgoYSA9IHRoaXMuc3JjKSAhPSBudWxsICYmIChyID0gYS5yZXN1bHQpICE9IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICgoYiA9IHRoaXMuc25kKSAhPSBudWxsICYmIChyID0gYi5yZXN1bHQpICE9IG51bGwpKSAmJgotICAgICAgICAgICAgICAgIGNvbXBhcmVBbmRTZXQoMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKHQsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjMyNDUzOTUyMjc2ODg1MDcwTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgRXhjZXB0aW9uQ29tcGxldGlvbjxUPiBleHRlbmRzIENvbXBsZXRpb24gewotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gc3JjOwotICAgICAgICBmaW5hbCBGdW5jdGlvbjw/IHN1cGVyIFRocm93YWJsZSwgPyBleHRlbmRzIFQ+IGZuOwotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiBkc3Q7Ci0gICAgICAgIEV4Y2VwdGlvbkNvbXBsZXRpb24oQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFRocm93YWJsZSwgPyBleHRlbmRzIFQ+IGZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGRzdCkgewotICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7IHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGE7Ci0gICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjw/IHN1cGVyIFRocm93YWJsZSwgPyBleHRlbmRzIFQ+IGZuOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VD4gZHN0OwotICAgICAgICAgICAgT2JqZWN0IHI7IFQgdCA9IG51bGw7IFRocm93YWJsZSBleCwgZHggPSBudWxsOwotICAgICAgICAgICAgaWYgKChkc3QgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmbiA9IHRoaXMuZm4pICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYSA9IHRoaXMuc3JjKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHIgPSBhLnJlc3VsdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGNvbXBhcmVBbmRTZXQoMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpICYmCi0gICAgICAgICAgICAgICAgICAgIChleCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gZm4uYXBwbHkoZXgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkeCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZSh0LCBkeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzMjQ1Mzk1MjI3Njg4NTA3MEw7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFdoZW5Db21wbGV0ZUNvbXBsZXRpb248VD4gZXh0ZW5kcyBDb21wbGV0aW9uIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYzsKLSAgICAgICAgZmluYWwgQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVGhyb3dhYmxlPiBmbjsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VD4gZHN0OwotICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKLSAgICAgICAgV2hlbkNvbXBsZXRlQ29tcGxldGlvbihDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFRocm93YWJsZT4gZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICB0aGlzLnNyYyA9IHNyYzsgdGhpcy5mbiA9IGZuOyB0aGlzLmRzdCA9IGRzdDsKLSAgICAgICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gYTsKLSAgICAgICAgICAgIGZpbmFsIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFRocm93YWJsZT4gZm47Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgcjsgVCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGRzdCA9IHRoaXMuZHN0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGZuID0gdGhpcy5mbikgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhID0gdGhpcy5zcmMpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAociA9IGEucmVzdWx0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgY29tcGFyZUFuZFNldCgwLCAxKSkgewotICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGUgPSBleGVjdXRvcjsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgZHggPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGVjQXN5bmMoZSwgbmV3IEFzeW5jV2hlbkNvbXBsZXRlPFQ+KHQsIGV4LCBmbiwgZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFjY2VwdCh0LCBleCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBkeCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBkeCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZSh0LCBleCAhPSBudWxsID8gZXggOiBkeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzMjQ1Mzk1MjI3Njg4NTA3MEw7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFRoZW5Db3B5PFQ+IGV4dGVuZHMgQ29tcGxldGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHNyYzsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VD4gZHN0OwotICAgICAgICBUaGVuQ29weShDb21wbGV0YWJsZUZ1dHVyZTw/PiBzcmMsCi0gICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGRzdCkgewotICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7IHRoaXMuZHN0ID0gZHN0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IGE7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgcjsgVCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGRzdCA9IHRoaXMuZHN0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGEgPSB0aGlzLnNyYykgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChyID0gYS5yZXN1bHQpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjb21wYXJlQW5kU2V0KDAsIDEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSAoKEFsdFJlc3VsdClyKS5leDsKLSAgICAgICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHRyID0gKFQpIHI7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSB0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUodCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIC8vIHZlcnNpb24gb2YgVGhlbkNvcHkgZm9yIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdAotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBUaGVuUHJvcGFnYXRlIGV4dGVuZHMgQ29tcGxldGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPD8+IHNyYzsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0OwotICAgICAgICBUaGVuUHJvcGFnYXRlKENvbXBsZXRhYmxlRnV0dXJlPD8+IHNyYywKLSAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3QpIHsKLSAgICAgICAgICAgIHRoaXMuc3JjID0gc3JjOyB0aGlzLmRzdCA9IGRzdDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/PiBhOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0OwotICAgICAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmICgoZHN0ID0gdGhpcy5kc3QpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYSA9IHRoaXMuc3JjKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHIgPSBhLnJlc3VsdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGNvbXBhcmVBbmRTZXQoMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgZXggPSAoKEFsdFJlc3VsdClyKS5leDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZShudWxsLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzMjQ1Mzk1MjI3Njg4NTA3MEw7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIEhhbmRsZUNvbXBsZXRpb248VCxVPiBleHRlbmRzIENvbXBsZXRpb24gewotICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gc3JjOwotICAgICAgICBmaW5hbCBCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVT4gZm47Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdDsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgICAgIEhhbmRsZUNvbXBsZXRpb24oQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVT4gZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7IHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGE7Ci0gICAgICAgICAgICBmaW5hbCBCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVT4gZm47Ci0gICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxVPiBkc3Q7Ci0gICAgICAgICAgICBPYmplY3QgcjsgVCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAoKGRzdCA9IHRoaXMuZHN0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGZuID0gdGhpcy5mbikgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhID0gdGhpcy5zcmMpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAociA9IGEucmVzdWx0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgY29tcGFyZUFuZFNldCgwLCAxKSkgewotICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGUgPSBleGVjdXRvcjsKLSAgICAgICAgICAgICAgICBVIHUgPSBudWxsOwotICAgICAgICAgICAgICAgIFRocm93YWJsZSBkeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNBc3luYyhlLCBuZXcgQXN5bmNDb21iaW5lPFQsVGhyb3dhYmxlLFU+KHQsIGV4LCBmbiwgZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBmbi5hcHBseSh0LCBleCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBkeCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBkeCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZSh1LCBkeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTIzMjQ1Mzk1MjI3Njg4NTA3MEw7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFRoZW5Db21wb3NlPFQsVT4gZXh0ZW5kcyBDb21wbGV0aW9uIHsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYzsKLSAgICAgICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgQ29tcGxldGlvblN0YWdlPFU+PiBmbjsKLSAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0OwotICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKLSAgICAgICAgVGhlbkNvbXBvc2UoQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IHNyYywKLSAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgQ29tcGxldGlvblN0YWdlPFU+PiBmbiwKLSAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0LAotICAgICAgICAgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7IHRoaXMuZm4gPSBmbjsgdGhpcy5kc3QgPSBkc3Q7Ci0gICAgICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGE7Ci0gICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuOwotICAgICAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0OwotICAgICAgICAgICAgT2JqZWN0IHI7IFQgdDsgVGhyb3dhYmxlIGV4OyBFeGVjdXRvciBlOwotICAgICAgICAgICAgaWYgKChkc3QgPSB0aGlzLmRzdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmbiA9IHRoaXMuZm4pICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYSA9IHRoaXMuc3JjKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHIgPSBhLnJlc3VsdCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGNvbXBhcmVBbmRTZXQoMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBjID0gbnVsbDsKLSAgICAgICAgICAgICAgICBVIHUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoZXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGUgPSBleGVjdXRvcikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNBc3luYyhlLCBuZXcgQXN5bmNDb21wb3NlPFQsVT4odCwgZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGlvblN0YWdlPFU+IGNzID0gZm4uYXBwbHkodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChjcyA9PSBudWxsKSA/IG51bGwgOiBjcy50b0NvbXBsZXRhYmxlRnV0dXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXggPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRoZW5Db3B5PFU+IGQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzID0gYy5yZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRpb25Ob2RlIHAgPSBuZXcgQ29tcGxldGlvbk5vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCA9IG5ldyBUaGVuQ29weTxVPihjLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocyA9IGMucmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYywgQ09NUExFVElPTlMsIHAubmV4dCA9IGMuY29tcGxldGlvbnMsIHApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsICYmIChkID09IG51bGwgfHwgZC5jb21wYXJlQW5kU2V0KDAsIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXMpLmV4OyAgLy8gbm8gcmV3cmFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVSB1cyA9IChVKSBzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1czsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29tcGxldGUgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUodSwgZXgpOwotICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGMuaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzI0NTM5NTIyNzY4ODUwNzBMOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9ucyBvZiBzdGFnZSBtZXRob2RzIHdpdGggKHBsYWluLCBhc3luYywgRXhlY3V0b3IpIGZvcm1zCi0KLSAgICBwcml2YXRlIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiBkb1RoZW5BcHBseQotICAgICAgICAoRnVuY3Rpb248PyBzdXBlciBULD8gZXh0ZW5kcyBVPiBmbiwKLSAgICAgICAgIEV4ZWN1dG9yIGUpIHsKLSAgICAgICAgaWYgKGZuID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8VT4oKTsKLSAgICAgICAgVGhlbkFwcGx5PFQsVT4gZCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByOwotICAgICAgICBpZiAoKHIgPSByZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgIENvbXBsZXRpb25Ob2RlIHAgPSBuZXcgQ29tcGxldGlvbk5vZGUKLSAgICAgICAgICAgICAgICAoZCA9IG5ldyBUaGVuQXBwbHk8VCxVPih0aGlzLCBmbiwgZHN0LCBlKSk7Ci0gICAgICAgICAgICB3aGlsZSAoKHIgPSByZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICh0aGlzLCBDT01QTEVUSU9OUywgcC5uZXh0ID0gY29tcGxldGlvbnMsIHApKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAociAhPSBudWxsICYmIChkID09IG51bGwgfHwgZC5jb21wYXJlQW5kU2V0KDAsIDEpKSkgewotICAgICAgICAgICAgVCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVIHUgPSBudWxsOwotICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY0FwcGx5PFQsVT4odCwgZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB1ID0gZm4uYXBwbHkodCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZSA9PSBudWxsIHx8IGV4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUodSwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRvVGhlbkFjY2VwdChDb25zdW1lcjw/IHN1cGVyIFQ+IGZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGUpIHsKLSAgICAgICAgaWYgKGZuID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKLSAgICAgICAgVGhlbkFjY2VwdDxUPiBkID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHI7Ci0gICAgICAgIGlmICgociA9IHJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcCA9IG5ldyBDb21wbGV0aW9uTm9kZQotICAgICAgICAgICAgICAgIChkID0gbmV3IFRoZW5BY2NlcHQ8VD4odGhpcywgZm4sIGRzdCwgZSkpOwotICAgICAgICAgICAgd2hpbGUgKChyID0gcmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAodGhpcywgQ09NUExFVElPTlMsIHAubmV4dCA9IGNvbXBsZXRpb25zLCBwKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgIFQgdDsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHRyID0gKFQpIHI7Ci0gICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY0FjY2VwdDxUPih0LCBmbiwgZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFjY2VwdCh0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZShudWxsLCBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZG9UaGVuUnVuKFJ1bm5hYmxlIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvciBlKSB7Ci0gICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPigpOwotICAgICAgICBUaGVuUnVuIGQgPSBudWxsOwotICAgICAgICBPYmplY3QgcjsKLSAgICAgICAgaWYgKChyID0gcmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb21wbGV0aW9uTm9kZSBwID0gbmV3IENvbXBsZXRpb25Ob2RlCi0gICAgICAgICAgICAgICAgKGQgPSBuZXcgVGhlblJ1bih0aGlzLCBhY3Rpb24sIGRzdCwgZSkpOwotICAgICAgICAgICAgd2hpbGUgKChyID0gcmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAodGhpcywgQ09NUExFVElPTlMsIHAubmV4dCA9IGNvbXBsZXRpb25zLCBwKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KQotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY1J1bihhY3Rpb24sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZSA9PSBudWxsIHx8IGV4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIDxVLFY+IENvbXBsZXRhYmxlRnV0dXJlPFY+IGRvVGhlbkNvbWJpbmUKLSAgICAgICAgKENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBVPiBvdGhlciwKLSAgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULD8gc3VwZXIgVSw/IGV4dGVuZHMgVj4gZm4sCi0gICAgICAgICBFeGVjdXRvciBlKSB7Ci0gICAgICAgIGlmIChvdGhlciA9PSBudWxsIHx8IGZuID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWPiBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vj4oKTsKLSAgICAgICAgVGhlbkNvbWJpbmU8VCxVLFY+IGQgPSBudWxsOwotICAgICAgICBPYmplY3QgciwgcyA9IG51bGw7Ci0gICAgICAgIGlmICgociA9IHJlc3VsdCkgPT0gbnVsbCB8fCAocyA9IG90aGVyLnJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZCA9IG5ldyBUaGVuQ29tYmluZTxULFUsVj4odGhpcywgb3RoZXIsIGZuLCBkc3QsIGUpOwotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcSA9IG51bGwsIHAgPSBuZXcgQ29tcGxldGlvbk5vZGUoZCk7Ci0gICAgICAgICAgICB3aGlsZSAoKHIgPT0gbnVsbCAmJiAociA9IHJlc3VsdCkgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAocyA9PSBudWxsICYmIChzID0gb3RoZXIucmVzdWx0KSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIsIENPTVBMRVRJT05TLCBxLm5leHQgPSBvdGhlci5jb21wbGV0aW9ucywgcSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAociAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMsIENPTVBMRVRJT05TLCBwLm5leHQgPSBjb21wbGV0aW9ucywgcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBxID0gbmV3IENvbXBsZXRpb25Ob2RlKGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAociAhPSBudWxsICYmIHMgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgIFQgdDsgVSB1OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB1ID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXMpLmV4OwotICAgICAgICAgICAgICAgIHUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFUgdXMgPSAoVSkgczsKLSAgICAgICAgICAgICAgICB1ID0gdXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBWIHYgPSBudWxsOwotICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY0NvbWJpbmU8VCxVLFY+KHQsIHUsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZuLmFwcGx5KHQsIHUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSByZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBleCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKHYsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBoZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIG90aGVyLmhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkb1RoZW5BY2NlcHRCb3RoCi0gICAgICAgIChDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVT4gb3RoZXIsCi0gICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCw/IHN1cGVyIFU+IGZuLAotICAgICAgICAgRXhlY3V0b3IgZSkgewotICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCB8fCBmbiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0ID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+KCk7Ci0gICAgICAgIFRoZW5BY2NlcHRCb3RoPFQsVT4gZCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByLCBzID0gbnVsbDsKLSAgICAgICAgaWYgKChyID0gcmVzdWx0KSA9PSBudWxsIHx8IChzID0gb3RoZXIucmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkID0gbmV3IFRoZW5BY2NlcHRCb3RoPFQsVT4odGhpcywgb3RoZXIsIGZuLCBkc3QsIGUpOwotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcSA9IG51bGwsIHAgPSBuZXcgQ29tcGxldGlvbk5vZGUoZCk7Ci0gICAgICAgICAgICB3aGlsZSAoKHIgPT0gbnVsbCAmJiAociA9IHJlc3VsdCkgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAocyA9PSBudWxsICYmIChzID0gb3RoZXIucmVzdWx0KSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIsIENPTVBMRVRJT05TLCBxLm5leHQgPSBvdGhlci5jb21wbGV0aW9ucywgcSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAociAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMsIENPTVBMRVRJT05TLCBwLm5leHQgPSBjb21wbGV0aW9ucywgcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBxID0gbmV3IENvbXBsZXRpb25Ob2RlKGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAociAhPSBudWxsICYmIHMgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgIFQgdDsgVSB1OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB1ID0gbnVsbDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXMpLmV4OwotICAgICAgICAgICAgICAgIHUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFUgdXMgPSAoVSkgczsKLSAgICAgICAgICAgICAgICB1ID0gdXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGVjQXN5bmMoZSwgbmV3IEFzeW5jQWNjZXB0Qm90aDxULFU+KHQsIHUsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZm4uYWNjZXB0KHQsIHUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSByZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBleCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKG51bGwsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBoZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIG90aGVyLmhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRvUnVuQWZ0ZXJCb3RoKENvbXBsZXRhYmxlRnV0dXJlPD8+IG90aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVubmFibGUgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZSkgewotICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCB8fCBhY3Rpb24gPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRzdCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPigpOwotICAgICAgICBSdW5BZnRlckJvdGggZCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByLCBzID0gbnVsbDsKLSAgICAgICAgaWYgKChyID0gcmVzdWx0KSA9PSBudWxsIHx8IChzID0gb3RoZXIucmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkID0gbmV3IFJ1bkFmdGVyQm90aCh0aGlzLCBvdGhlciwgYWN0aW9uLCBkc3QsIGUpOwotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcSA9IG51bGwsIHAgPSBuZXcgQ29tcGxldGlvbk5vZGUoZCk7Ci0gICAgICAgICAgICB3aGlsZSAoKHIgPT0gbnVsbCAmJiAociA9IHJlc3VsdCkgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAocyA9PSBudWxsICYmIChzID0gb3RoZXIucmVzdWx0KSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIsIENPTVBMRVRJT05TLCBxLm5leHQgPSBvdGhlci5jb21wbGV0aW9ucywgcSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAociAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMsIENPTVBMRVRJT05TLCBwLm5leHQgPSBjb21wbGV0aW9ucywgcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBxID0gbmV3IENvbXBsZXRpb25Ob2RlKGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAociAhPSBudWxsICYmIHMgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KQotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgaWYgKGV4ID09IG51bGwgJiYgKHMgaW5zdGFuY2VvZiBBbHRSZXN1bHQpKQotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcykuZXg7Ci0gICAgICAgICAgICBpZiAoZXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGVjQXN5bmMoZSwgbmV3IEFzeW5jUnVuKGFjdGlvbiwgZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gcmV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZXggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZShudWxsLCBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICBvdGhlci5oZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIHJldHVybiBkc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gZG9BcHBseVRvRWl0aGVyCi0gICAgICAgIChDb21wbGV0YWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4gb3RoZXIsCi0gICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsIFU+IGZuLAotICAgICAgICAgRXhlY3V0b3IgZSkgewotICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCB8fCBmbiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0ID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFU+KCk7Ci0gICAgICAgIEFwcGx5VG9FaXRoZXI8VCxVPiBkID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHI7Ci0gICAgICAgIGlmICgociA9IHJlc3VsdCkgPT0gbnVsbCAmJiAociA9IG90aGVyLnJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZCA9IG5ldyBBcHBseVRvRWl0aGVyPFQsVT4odGhpcywgb3RoZXIsIGZuLCBkc3QsIGUpOwotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcSA9IG51bGwsIHAgPSBuZXcgQ29tcGxldGlvbk5vZGUoZCk7Ci0gICAgICAgICAgICB3aGlsZSAoKHIgPSByZXN1bHQpID09IG51bGwgJiYgKHIgPSBvdGhlci5yZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlciwgQ09NUExFVElPTlMsIHEubmV4dCA9IG90aGVyLmNvbXBsZXRpb25zLCBxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcywgQ09NUExFVElPTlMsIHAubmV4dCA9IGNvbXBsZXRpb25zLCBwKSkKLSAgICAgICAgICAgICAgICAgICAgcSA9IG5ldyBDb21wbGV0aW9uTm9kZShkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAociAhPSBudWxsICYmIChkID09IG51bGwgfHwgZC5jb21wYXJlQW5kU2V0KDAsIDEpKSkgewotICAgICAgICAgICAgVCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVIHUgPSBudWxsOwotICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY0FwcGx5PFQsVT4odCwgZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB1ID0gZm4uYXBwbHkodCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZSA9PSBudWxsIHx8IGV4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUodSwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgb3RoZXIuaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZG9BY2NlcHRFaXRoZXIKLSAgICAgICAgKENvbXBsZXRhYmxlRnV0dXJlPD8gZXh0ZW5kcyBUPiBvdGhlciwKLSAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgVD4gZm4sCi0gICAgICAgICBFeGVjdXRvciBlKSB7Ci0gICAgICAgIGlmIChvdGhlciA9PSBudWxsIHx8IGZuID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKLSAgICAgICAgQWNjZXB0RWl0aGVyPFQ+IGQgPSBudWxsOwotICAgICAgICBPYmplY3QgcjsKLSAgICAgICAgaWYgKChyID0gcmVzdWx0KSA9PSBudWxsICYmIChyID0gb3RoZXIucmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkID0gbmV3IEFjY2VwdEVpdGhlcjxUPih0aGlzLCBvdGhlciwgZm4sIGRzdCwgZSk7Ci0gICAgICAgICAgICBDb21wbGV0aW9uTm9kZSBxID0gbnVsbCwgcCA9IG5ldyBDb21wbGV0aW9uTm9kZShkKTsKLSAgICAgICAgICAgIHdoaWxlICgociA9IHJlc3VsdCkgPT0gbnVsbCAmJiAociA9IG90aGVyLnJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLCBDT01QTEVUSU9OUywgcS5uZXh0ID0gb3RoZXIuY29tcGxldGlvbnMsIHEpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLCBDT01QTEVUSU9OUywgcC5uZXh0ID0gY29tcGxldGlvbnMsIHApKQotICAgICAgICAgICAgICAgICAgICBxID0gbmV3IENvbXBsZXRpb25Ob2RlKGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyICE9IG51bGwgJiYgKGQgPT0gbnVsbCB8fCBkLmNvbXBhcmVBbmRTZXQoMCwgMSkpKSB7Ci0gICAgICAgICAgICBUIHQ7IFRocm93YWJsZSBleDsKLSAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgZXggPSAoKEFsdFJlc3VsdClyKS5leDsKLSAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgICAgIHQgPSB0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNBc3luYyhlLCBuZXcgQXN5bmNBY2NlcHQ8VD4odCwgZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmbi5hY2NlcHQodCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJleCkgewotICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZSA9PSBudWxsIHx8IGV4ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgb3RoZXIuaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZG9SdW5BZnRlckVpdGhlcgotICAgICAgICAoQ29tcGxldGFibGVGdXR1cmU8Pz4gb3RoZXIsCi0gICAgICAgICBSdW5uYWJsZSBhY3Rpb24sCi0gICAgICAgICBFeGVjdXRvciBlKSB7Ci0gICAgICAgIGlmIChvdGhlciA9PSBudWxsIHx8IGFjdGlvbiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZHN0ID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+KCk7Ci0gICAgICAgIFJ1bkFmdGVyRWl0aGVyIGQgPSBudWxsOwotICAgICAgICBPYmplY3QgcjsKLSAgICAgICAgaWYgKChyID0gcmVzdWx0KSA9PSBudWxsICYmIChyID0gb3RoZXIucmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkID0gbmV3IFJ1bkFmdGVyRWl0aGVyKHRoaXMsIG90aGVyLCBhY3Rpb24sIGRzdCwgZSk7Ci0gICAgICAgICAgICBDb21wbGV0aW9uTm9kZSBxID0gbnVsbCwgcCA9IG5ldyBDb21wbGV0aW9uTm9kZShkKTsKLSAgICAgICAgICAgIHdoaWxlICgociA9IHJlc3VsdCkgPT0gbnVsbCAmJiAociA9IG90aGVyLnJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLCBDT01QTEVUSU9OUywgcS5uZXh0ID0gb3RoZXIuY29tcGxldGlvbnMsIHEpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLCBDT01QTEVUSU9OUywgcC5uZXh0ID0gY29tcGxldGlvbnMsIHApKQotICAgICAgICAgICAgICAgICAgICBxID0gbmV3IENvbXBsZXRpb25Ob2RlKGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyICE9IG51bGwgJiYgKGQgPT0gbnVsbCB8fCBkLmNvbXBhcmVBbmRTZXQoMCwgMSkpKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChleCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNBc3luYyhlLCBuZXcgQXN5bmNSdW4oYWN0aW9uLCBkc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXggPSByZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBleCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKG51bGwsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBoZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIG90aGVyLmhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiBkb1RoZW5Db21wb3NlCi0gICAgICAgIChGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuLAotICAgICAgICAgRXhlY3V0b3IgZSkgewotICAgICAgICBpZiAoZm4gPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFU+IGRzdCA9IG51bGw7Ci0gICAgICAgIFRoZW5Db21wb3NlPFQsVT4gZCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByOwotICAgICAgICBpZiAoKHIgPSByZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgIGRzdCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxVPigpOwotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcCA9IG5ldyBDb21wbGV0aW9uTm9kZQotICAgICAgICAgICAgICAgIChkID0gbmV3IFRoZW5Db21wb3NlPFQsVT4odGhpcywgZm4sIGRzdCwgZSkpOwotICAgICAgICAgICAgd2hpbGUgKChyID0gcmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAodGhpcywgQ09NUExFVElPTlMsIHAubmV4dCA9IGNvbXBsZXRpb25zLCBwKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgIFQgdDsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHRyID0gKFQpIHI7Ci0gICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxVPigpOwotICAgICAgICAgICAgICAgICAgICBleGVjQXN5bmMoZSwgbmV3IEFzeW5jQ29tcG9zZTxULFU+KHQsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0aW9uU3RhZ2U8VT4gY3MgPSBmbi5hcHBseSh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcyA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRzdCA9IGNzLnRvQ29tcGxldGFibGVGdXR1cmUoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8VT4oKTsKLSAgICAgICAgICAgIGlmIChleCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKG51bGwsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBoZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIGRzdC5oZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIHJldHVybiBkc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb21wbGV0YWJsZUZ1dHVyZTxUPiBkb1doZW5Db21wbGV0ZQotICAgICAgICAoQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVGhyb3dhYmxlPiBmbiwKLSAgICAgICAgIEV4ZWN1dG9yIGUpIHsKLSAgICAgICAgaWYgKGZuID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxUPiBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8VD4oKTsKLSAgICAgICAgV2hlbkNvbXBsZXRlQ29tcGxldGlvbjxUPiBkID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHI7Ci0gICAgICAgIGlmICgociA9IHJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcCA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXRpb25Ob2RlKGQgPSBuZXcgV2hlbkNvbXBsZXRlQ29tcGxldGlvbjxUPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcywgZm4sIGRzdCwgZSkpOwotICAgICAgICAgICAgd2hpbGUgKChyID0gcmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdCh0aGlzLCBDT01QTEVUSU9OUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubmV4dCA9IGNvbXBsZXRpb25zLCBwKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgIFQgdDsgVGhyb3dhYmxlIGV4OwotICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXggPSBudWxsOwotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHRyID0gKFQpIHI7Ci0gICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGhyb3dhYmxlIGR4ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY1doZW5Db21wbGV0ZTxUPih0LCBleCwgZm4sIGRzdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZm4uYWNjZXB0KHQsIGV4KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICBkeCA9IHJleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZHggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZSh0LCBleCAhPSBudWxsID8gZXggOiBkeCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLQotICAgIHByaXZhdGUgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IGRvSGFuZGxlCi0gICAgICAgIChCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVT4gZm4sCi0gICAgICAgICBFeGVjdXRvciBlKSB7Ci0gICAgICAgIGlmIChmbiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZHN0ID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFU+KCk7Ci0gICAgICAgIEhhbmRsZUNvbXBsZXRpb248VCxVPiBkID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHI7Ci0gICAgICAgIGlmICgociA9IHJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29tcGxldGlvbk5vZGUgcCA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXRpb25Ob2RlKGQgPSBuZXcgSGFuZGxlQ29tcGxldGlvbjxULFU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLCBmbiwgZHN0LCBlKSk7Ci0gICAgICAgICAgICB3aGlsZSAoKHIgPSByZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIENPTVBMRVRJT05TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5uZXh0ID0gY29tcGxldGlvbnMsIHApKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAociAhPSBudWxsICYmIChkID09IG51bGwgfHwgZC5jb21wYXJlQW5kU2V0KDAsIDEpKSkgewotICAgICAgICAgICAgVCB0OyBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgewotICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgICAgICB0ID0gdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVIHUgPSBudWxsOwotICAgICAgICAgICAgVGhyb3dhYmxlIGR4ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZXhlY0FzeW5jKGUsIG5ldyBBc3luY0NvbWJpbmU8VCxUaHJvd2FibGUsVT4odCwgZXgsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdSA9IGZuLmFwcGx5KHQsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZHggPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSByZXgpIHsKLSAgICAgICAgICAgICAgICBkeCA9IHJleDsKLSAgICAgICAgICAgICAgICB1ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZHggIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZSh1LCBkeCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLQotCi0gICAgLy8gcHVibGljIG1ldGhvZHMKKyAgICAvKiAtLS0tLS0tLS0tLS0tIHB1YmxpYyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tICovCiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IGluY29tcGxldGUgQ29tcGxldGFibGVGdXR1cmUuCkBAIC0yMTE0LDYgKzE3ODYsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRlIENvbXBsZXRhYmxlRnV0dXJlIHdpdGggZ2l2ZW4gZW5jb2RlZCByZXN1bHQuCisgICAgICovCisgICAgcHJpdmF0ZSBDb21wbGV0YWJsZUZ1dHVyZShPYmplY3QgcikgeworICAgICAgICB0aGlzLnJlc3VsdCA9IHI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyBDb21wbGV0YWJsZUZ1dHVyZSB0aGF0IGlzIGFzeW5jaHJvbm91c2x5IGNvbXBsZXRlZAogICAgICAqIGJ5IGEgdGFzayBydW5uaW5nIGluIHRoZSB7QGxpbmsgRm9ya0pvaW5Qb29sI2NvbW1vblBvb2woKX0gd2l0aAogICAgICAqIHRoZSB2YWx1ZSBvYnRhaW5lZCBieSBjYWxsaW5nIHRoZSBnaXZlbiBTdXBwbGllci4KQEAgLTIxMjQsMTAgKzE4MDMsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBDb21wbGV0YWJsZUZ1dHVyZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IHN1cHBseUFzeW5jKFN1cHBsaWVyPFU+IHN1cHBsaWVyKSB7Ci0gICAgICAgIGlmIChzdXBwbGllciA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZiA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxVPigpOwotICAgICAgICBleGVjQXN5bmMoRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSwgbmV3IEFzeW5jU3VwcGx5PFU+KHN1cHBsaWVyLCBmKSk7Ci0gICAgICAgIHJldHVybiBmOworICAgICAgICByZXR1cm4gYXN5bmNTdXBwbHlTdGFnZShhc3luY1Bvb2wsIHN1cHBsaWVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNDMsMTEgKzE4MTksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IHN1cHBseUFzeW5jKFN1cHBsaWVyPFU+IHN1cHBsaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsIHx8IHN1cHBsaWVyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VT4gZiA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxVPigpOwotICAgICAgICBleGVjQXN5bmMoZXhlY3V0b3IsIG5ldyBBc3luY1N1cHBseTxVPihzdXBwbGllciwgZikpOwotICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgcmV0dXJuIGFzeW5jU3VwcGx5U3RhZ2Uoc2NyZWVuRXhlY3V0b3IoZXhlY3V0b3IpLCBzdXBwbGllcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTYwLDEwICsxODMyLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQ29tcGxldGFibGVGdXR1cmUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHJ1bkFzeW5jKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGlmIChydW5uYWJsZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZiA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPigpOwotICAgICAgICBleGVjQXN5bmMoRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSwgbmV3IEFzeW5jUnVuKHJ1bm5hYmxlLCBmKSk7Ci0gICAgICAgIHJldHVybiBmOworICAgICAgICByZXR1cm4gYXN5bmNSdW5TdGFnZShhc3luY1Bvb2wsIHJ1bm5hYmxlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNzgsMTEgKzE4NDcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gcnVuQXN5bmMoUnVubmFibGUgcnVubmFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCB8fCBydW5uYWJsZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGYgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKLSAgICAgICAgZXhlY0FzeW5jKGV4ZWN1dG9yLCBuZXcgQXN5bmNSdW4ocnVubmFibGUsIGYpKTsKLSAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIHJldHVybiBhc3luY1J1blN0YWdlKHNjcmVlbkV4ZWN1dG9yKGV4ZWN1dG9yKSwgcnVubmFibGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE5NCw5ICsxODU5LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZWQgQ29tcGxldGFibGVGdXR1cmUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiBjb21wbGV0ZWRGdXR1cmUoVSB2YWx1ZSkgewotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxVPiBmID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFU+KCk7Ci0gICAgICAgIGYucmVzdWx0ID0gKHZhbHVlID09IG51bGwpID8gTklMIDogdmFsdWU7Ci0gICAgICAgIHJldHVybiBmOworICAgICAgICByZXR1cm4gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFU+KCh2YWx1ZSA9PSBudWxsKSA/IE5JTCA6IHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMjAsMjEgKzE4ODMsOCBAQAogICAgICAqIHdoaWxlIHdhaXRpbmcKICAgICAgKi8KICAgICBwdWJsaWMgVCBnZXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCByOyBUaHJvd2FibGUgZXgsIGNhdXNlOwotICAgICAgICBpZiAoKHIgPSByZXN1bHQpID09IG51bGwgJiYgKHIgPSB3YWl0aW5nR2V0KHRydWUpKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmICghKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpKSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgcmV0dXJuIHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZXggPSAoKEFsdFJlc3VsdClyKS5leCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FeGNlcHRpb24pCi0gICAgICAgICAgICB0aHJvdyAoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKWV4OwotICAgICAgICBpZiAoKGV4IGluc3RhbmNlb2YgQ29tcGxldGlvbkV4Y2VwdGlvbikgJiYKLSAgICAgICAgICAgIChjYXVzZSA9IGV4LmdldENhdXNlKCkpICE9IG51bGwpCi0gICAgICAgICAgICBleCA9IGNhdXNlOwotICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgT2JqZWN0IHI7CisgICAgICAgIHJldHVybiByZXBvcnRHZXQoKHIgPSByZXN1bHQpID09IG51bGwgPyB3YWl0aW5nR2V0KHRydWUpIDogcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMjUyLDI0ICsxOTAyLDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgVCBnZXQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KQogICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCByOyBUaHJvd2FibGUgZXgsIGNhdXNlOworICAgICAgICBPYmplY3QgcjsKICAgICAgICAgbG9uZyBuYW5vcyA9IHVuaXQudG9OYW5vcyh0aW1lb3V0KTsKLSAgICAgICAgaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmICgociA9IHJlc3VsdCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHIgPSB0aW1lZEF3YWl0RG9uZShuYW5vcyk7Ci0gICAgICAgIGlmICghKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpKSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB0ciA9IChUKSByOwotICAgICAgICAgICAgcmV0dXJuIHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZXggPSAoKEFsdFJlc3VsdClyKS5leCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FeGNlcHRpb24pCi0gICAgICAgICAgICB0aHJvdyAoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKWV4OwotICAgICAgICBpZiAoKGV4IGluc3RhbmNlb2YgQ29tcGxldGlvbkV4Y2VwdGlvbikgJiYKLSAgICAgICAgICAgIChjYXVzZSA9IGV4LmdldENhdXNlKCkpICE9IG51bGwpCi0gICAgICAgICAgICBleCA9IGNhdXNlOwotICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydEdldCgociA9IHJlc3VsdCkgPT0gbnVsbCA/IHRpbWVkR2V0KG5hbm9zKSA6IHIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI4NywyMCArMTkyMiw4IEBACiAgICAgICogZXhjZXB0aW9uYWxseSBvciBhIGNvbXBsZXRpb24gY29tcHV0YXRpb24gdGhyZXcgYW4gZXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIFQgam9pbigpIHsKLSAgICAgICAgT2JqZWN0IHI7IFRocm93YWJsZSBleDsKLSAgICAgICAgaWYgKChyID0gcmVzdWx0KSA9PSBudWxsKQotICAgICAgICAgICAgciA9IHdhaXRpbmdHZXQoZmFsc2UpOwotICAgICAgICBpZiAoIShyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSkgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgIHJldHVybiB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGV4ID0gKChBbHRSZXN1bHQpcikuZXgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKQotICAgICAgICAgICAgdGhyb3cgKENhbmNlbGxhdGlvbkV4Y2VwdGlvbilleDsKLSAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ29tcGxldGlvbkV4Y2VwdGlvbikKLSAgICAgICAgICAgIHRocm93IChDb21wbGV0aW9uRXhjZXB0aW9uKWV4OwotICAgICAgICB0aHJvdyBuZXcgQ29tcGxldGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgIE9iamVjdCByOworICAgICAgICByZXR1cm4gcmVwb3J0Sm9pbigociA9IHJlc3VsdCkgPT0gbnVsbCA/IHdhaXRpbmdHZXQoZmFsc2UpIDogcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzE0LDIwICsxOTM3LDggQEAKICAgICAgKiBleGNlcHRpb25hbGx5IG9yIGEgY29tcGxldGlvbiBjb21wdXRhdGlvbiB0aHJldyBhbiBleGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgVCBnZXROb3coVCB2YWx1ZUlmQWJzZW50KSB7Ci0gICAgICAgIE9iamVjdCByOyBUaHJvd2FibGUgZXg7Ci0gICAgICAgIGlmICgociA9IHJlc3VsdCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZUlmQWJzZW50OwotICAgICAgICBpZiAoIShyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSkgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFQgdHIgPSAoVCkgcjsKLSAgICAgICAgICAgIHJldHVybiB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGV4ID0gKChBbHRSZXN1bHQpcikuZXgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKQotICAgICAgICAgICAgdGhyb3cgKENhbmNlbGxhdGlvbkV4Y2VwdGlvbilleDsKLSAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ29tcGxldGlvbkV4Y2VwdGlvbikKLSAgICAgICAgICAgIHRocm93IChDb21wbGV0aW9uRXhjZXB0aW9uKWV4OwotICAgICAgICB0aHJvdyBuZXcgQ29tcGxldGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgIE9iamVjdCByOworICAgICAgICByZXR1cm4gKChyID0gcmVzdWx0KSA9PSBudWxsKSA/IHZhbHVlSWZBYnNlbnQgOiByZXBvcnRKb2luKHIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjMzOSw5ICsxOTUwLDcgQEAKICAgICAgKiB0byB0cmFuc2l0aW9uIHRvIGEgY29tcGxldGVkIHN0YXRlLCBlbHNlIHtAY29kZSBmYWxzZX0KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb21wbGV0ZShUIHZhbHVlKSB7Ci0gICAgICAgIGJvb2xlYW4gdHJpZ2dlcmVkID0gcmVzdWx0ID09IG51bGwgJiYKLSAgICAgICAgICAgIFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdCh0aGlzLCBSRVNVTFQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT0gbnVsbCA/IE5JTCA6IHZhbHVlKTsKKyAgICAgICAgYm9vbGVhbiB0cmlnZ2VyZWQgPSBjb21wbGV0ZVZhbHVlKHZhbHVlKTsKICAgICAgICAgcG9zdENvbXBsZXRlKCk7CiAgICAgICAgIHJldHVybiB0cmlnZ2VyZWQ7CiAgICAgfQpAQCAtMjM1NiwyNDQgKzE5NjUsMjAwIEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29tcGxldGVFeGNlcHRpb25hbGx5KFRocm93YWJsZSBleCkgewogICAgICAgICBpZiAoZXggPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gdHJpZ2dlcmVkID0gcmVzdWx0ID09IG51bGwgJiYKLSAgICAgICAgICAgIFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdCh0aGlzLCBSRVNVTFQsIG51bGwsIG5ldyBBbHRSZXN1bHQoZXgpKTsKKyAgICAgICAgYm9vbGVhbiB0cmlnZ2VyZWQgPSBpbnRlcm5hbENvbXBsZXRlKG5ldyBBbHRSZXN1bHQoZXgpKTsKICAgICAgICAgcG9zdENvbXBsZXRlKCk7CiAgICAgICAgIHJldHVybiB0cmlnZ2VyZWQ7CiAgICAgfQogCi0gICAgLy8gQ29tcGxldGlvblN0YWdlIG1ldGhvZHMKLQotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gdGhlbkFwcGx5Ci0gICAgICAgIChGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFU+IGZuKSB7Ci0gICAgICAgIHJldHVybiBkb1RoZW5BcHBseShmbiwgbnVsbCk7CisgICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiB0aGVuQXBwbHkoCisgICAgICAgIEZ1bmN0aW9uPD8gc3VwZXIgVCw/IGV4dGVuZHMgVT4gZm4pIHsKKyAgICAgICAgcmV0dXJuIHVuaUFwcGx5U3RhZ2UobnVsbCwgZm4pOwogICAgIH0KIAotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gdGhlbkFwcGx5QXN5bmMKLSAgICAgICAgKEZ1bmN0aW9uPD8gc3VwZXIgVCw/IGV4dGVuZHMgVT4gZm4pIHsKLSAgICAgICAgcmV0dXJuIGRvVGhlbkFwcGx5KGZuLCBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpKTsKKyAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IHRoZW5BcHBseUFzeW5jKAorICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsPyBleHRlbmRzIFU+IGZuKSB7CisgICAgICAgIHJldHVybiB1bmlBcHBseVN0YWdlKGFzeW5jUG9vbCwgZm4pOwogICAgIH0KIAotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gdGhlbkFwcGx5QXN5bmMKLSAgICAgICAgKEZ1bmN0aW9uPD8gc3VwZXIgVCw/IGV4dGVuZHMgVT4gZm4sCi0gICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiBkb1RoZW5BcHBseShmbiwgZXhlY3V0b3IpOworICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gdGhlbkFwcGx5QXN5bmMoCisgICAgICAgIEZ1bmN0aW9uPD8gc3VwZXIgVCw/IGV4dGVuZHMgVT4gZm4sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgIHJldHVybiB1bmlBcHBseVN0YWdlKHNjcmVlbkV4ZWN1dG9yKGV4ZWN1dG9yKSwgZm4pOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0aGVuQWNjZXB0Ci0gICAgICAgIChDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbikgewotICAgICAgICByZXR1cm4gZG9UaGVuQWNjZXB0KGFjdGlvbiwgbnVsbCk7CisgICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHRoZW5BY2NlcHQoQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHVuaUFjY2VwdFN0YWdlKG51bGwsIGFjdGlvbik7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHRoZW5BY2NlcHRBc3luYwotICAgICAgICAoQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIGRvVGhlbkFjY2VwdChhY3Rpb24sIEZvcmtKb2luUG9vbC5jb21tb25Qb29sKCkpOworICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0aGVuQWNjZXB0QXN5bmMoQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHVuaUFjY2VwdFN0YWdlKGFzeW5jUG9vbCwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdGhlbkFjY2VwdEFzeW5jCi0gICAgICAgIChDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbiwKLSAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIGRvVGhlbkFjY2VwdChhY3Rpb24sIGV4ZWN1dG9yKTsKKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdGhlbkFjY2VwdEFzeW5jKENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgcmV0dXJuIHVuaUFjY2VwdFN0YWdlKHNjcmVlbkV4ZWN1dG9yKGV4ZWN1dG9yKSwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdGhlblJ1bgotICAgICAgICAoUnVubmFibGUgYWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBkb1RoZW5SdW4oYWN0aW9uLCBudWxsKTsKKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdGhlblJ1bihSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHVuaVJ1blN0YWdlKG51bGwsIGFjdGlvbik7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHRoZW5SdW5Bc3luYwotICAgICAgICAoUnVubmFibGUgYWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBkb1RoZW5SdW4oYWN0aW9uLCBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpKTsKKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdGhlblJ1bkFzeW5jKFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICByZXR1cm4gdW5pUnVuU3RhZ2UoYXN5bmNQb29sLCBhY3Rpb24pOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0aGVuUnVuQXN5bmMKLSAgICAgICAgKFJ1bm5hYmxlIGFjdGlvbiwKLSAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIGRvVGhlblJ1bihhY3Rpb24sIGV4ZWN1dG9yKTsKKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdGhlblJ1bkFzeW5jKFJ1bm5hYmxlIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgIHJldHVybiB1bmlSdW5TdGFnZShzY3JlZW5FeGVjdXRvcihleGVjdXRvciksIGFjdGlvbik7CiAgICAgfQogCi0gICAgcHVibGljIDxVLFY+IENvbXBsZXRhYmxlRnV0dXJlPFY+IHRoZW5Db21iaW5lCi0gICAgICAgIChDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAotICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsPyBzdXBlciBVLD8gZXh0ZW5kcyBWPiBmbikgewotICAgICAgICByZXR1cm4gZG9UaGVuQ29tYmluZShvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGZuLCBudWxsKTsKKyAgICBwdWJsaWMgPFUsVj4gQ29tcGxldGFibGVGdXR1cmU8Vj4gdGhlbkNvbWJpbmUoCisgICAgICAgIENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVT4gb3RoZXIsCisgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULD8gc3VwZXIgVSw/IGV4dGVuZHMgVj4gZm4pIHsKKyAgICAgICAgcmV0dXJuIGJpQXBwbHlTdGFnZShudWxsLCBvdGhlciwgZm4pOwogICAgIH0KIAotICAgIHB1YmxpYyA8VSxWPiBDb21wbGV0YWJsZUZ1dHVyZTxWPiB0aGVuQ29tYmluZUFzeW5jCi0gICAgICAgIChDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAotICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsPyBzdXBlciBVLD8gZXh0ZW5kcyBWPiBmbikgewotICAgICAgICByZXR1cm4gZG9UaGVuQ29tYmluZShvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpKTsKKyAgICBwdWJsaWMgPFUsVj4gQ29tcGxldGFibGVGdXR1cmU8Vj4gdGhlbkNvbWJpbmVBc3luYygKKyAgICAgICAgQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKKyAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsPyBzdXBlciBVLD8gZXh0ZW5kcyBWPiBmbikgeworICAgICAgICByZXR1cm4gYmlBcHBseVN0YWdlKGFzeW5jUG9vbCwgb3RoZXIsIGZuKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFUsVj4gQ29tcGxldGFibGVGdXR1cmU8Vj4gdGhlbkNvbWJpbmVBc3luYwotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKLSAgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULD8gc3VwZXIgVSw/IGV4dGVuZHMgVj4gZm4sCi0gICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiBkb1RoZW5Db21iaW5lKG90aGVyLnRvQ29tcGxldGFibGVGdXR1cmUoKSwgZm4sIGV4ZWN1dG9yKTsKKyAgICBwdWJsaWMgPFUsVj4gQ29tcGxldGFibGVGdXR1cmU8Vj4gdGhlbkNvbWJpbmVBc3luYygKKyAgICAgICAgQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKKyAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsPyBzdXBlciBVLD8gZXh0ZW5kcyBWPiBmbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgcmV0dXJuIGJpQXBwbHlTdGFnZShzY3JlZW5FeGVjdXRvcihleGVjdXRvciksIG90aGVyLCBmbik7CiAgICAgfQogCi0gICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0aGVuQWNjZXB0Qm90aAotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKLSAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFU+IGFjdGlvbikgewotICAgICAgICByZXR1cm4gZG9UaGVuQWNjZXB0Qm90aChvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGFjdGlvbiwgbnVsbCk7CisgICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0aGVuQWNjZXB0Qm90aCgKKyAgICAgICAgQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKKyAgICAgICAgQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVT4gYWN0aW9uKSB7CisgICAgICAgIHJldHVybiBiaUFjY2VwdFN0YWdlKG51bGwsIG90aGVyLCBhY3Rpb24pOwogICAgIH0KIAotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gdGhlbkFjY2VwdEJvdGhBc3luYwotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKLSAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFU+IGFjdGlvbikgewotICAgICAgICByZXR1cm4gZG9UaGVuQWNjZXB0Qm90aChvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSk7CisgICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0aGVuQWNjZXB0Qm90aEFzeW5jKAorICAgICAgICBDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBVPiBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGJpQWNjZXB0U3RhZ2UoYXN5bmNQb29sLCBvdGhlciwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHRoZW5BY2NlcHRCb3RoQXN5bmMKLSAgICAgICAgKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVT4gb3RoZXIsCi0gICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBVPiBhY3Rpb24sCi0gICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiBkb1RoZW5BY2NlcHRCb3RoKG90aGVyLnRvQ29tcGxldGFibGVGdXR1cmUoKSwgYWN0aW9uLCBleGVjdXRvcik7CisgICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiB0aGVuQWNjZXB0Qm90aEFzeW5jKAorICAgICAgICBDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBVPiBhY3Rpb24sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgIHJldHVybiBiaUFjY2VwdFN0YWdlKHNjcmVlbkV4ZWN1dG9yKGV4ZWN1dG9yKSwgb3RoZXIsIGFjdGlvbik7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHJ1bkFmdGVyQm90aAotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLAotICAgICAgICAgUnVubmFibGUgYWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBkb1J1bkFmdGVyQm90aChvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGFjdGlvbiwgbnVsbCk7CisgICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHJ1bkFmdGVyQm90aChDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGJpUnVuU3RhZ2UobnVsbCwgb3RoZXIsIGFjdGlvbik7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHJ1bkFmdGVyQm90aEFzeW5jCi0gICAgICAgIChDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsCi0gICAgICAgICBSdW5uYWJsZSBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIGRvUnVuQWZ0ZXJCb3RoKG90aGVyLnRvQ29tcGxldGFibGVGdXR1cmUoKSwgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSk7CisgICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHJ1bkFmdGVyQm90aEFzeW5jKENvbXBsZXRpb25TdGFnZTw/PiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgIHJldHVybiBiaVJ1blN0YWdlKGFzeW5jUG9vbCwgb3RoZXIsIGFjdGlvbik7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHJ1bkFmdGVyQm90aEFzeW5jCi0gICAgICAgIChDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsCi0gICAgICAgICBSdW5uYWJsZSBhY3Rpb24sCi0gICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiBkb1J1bkFmdGVyQm90aChvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGFjdGlvbiwgZXhlY3V0b3IpOworICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBydW5BZnRlckJvdGhBc3luYyhDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgcmV0dXJuIGJpUnVuU3RhZ2Uoc2NyZWVuRXhlY3V0b3IoZXhlY3V0b3IpLCBvdGhlciwgYWN0aW9uKTsKICAgICB9CiAKLQotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gYXBwbHlUb0VpdGhlcgotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBUPiBvdGhlciwKLSAgICAgICAgIEZ1bmN0aW9uPD8gc3VwZXIgVCwgVT4gZm4pIHsKLSAgICAgICAgcmV0dXJuIGRvQXBwbHlUb0VpdGhlcihvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGZuLCBudWxsKTsKKyAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IGFwcGx5VG9FaXRoZXIoCisgICAgICAgIENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsIEZ1bmN0aW9uPD8gc3VwZXIgVCwgVT4gZm4pIHsKKyAgICAgICAgcmV0dXJuIG9yQXBwbHlTdGFnZShudWxsLCBvdGhlciwgZm4pOwogICAgIH0KIAotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gYXBwbHlUb0VpdGhlckFzeW5jCi0gICAgICAgIChDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFQ+IG90aGVyLAotICAgICAgICAgRnVuY3Rpb248PyBzdXBlciBULCBVPiBmbikgewotICAgICAgICByZXR1cm4gZG9BcHBseVRvRWl0aGVyKG90aGVyLnRvQ29tcGxldGFibGVGdXR1cmUoKSwgZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSk7CisgICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiBhcHBseVRvRWl0aGVyQXN5bmMoCisgICAgICAgIENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsIEZ1bmN0aW9uPD8gc3VwZXIgVCwgVT4gZm4pIHsKKyAgICAgICAgcmV0dXJuIG9yQXBwbHlTdGFnZShhc3luY1Bvb2wsIG90aGVyLCBmbik7CiAgICAgfQogCi0gICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiBhcHBseVRvRWl0aGVyQXN5bmMKLSAgICAgICAgKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsCi0gICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsIFU+IGZuLAotICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gZG9BcHBseVRvRWl0aGVyKG90aGVyLnRvQ29tcGxldGFibGVGdXR1cmUoKSwgZm4sIGV4ZWN1dG9yKTsKKyAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IGFwcGx5VG9FaXRoZXJBc3luYygKKyAgICAgICAgQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBUPiBvdGhlciwgRnVuY3Rpb248PyBzdXBlciBULCBVPiBmbiwKKyAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgcmV0dXJuIG9yQXBwbHlTdGFnZShzY3JlZW5FeGVjdXRvcihleGVjdXRvciksIG90aGVyLCBmbik7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGFjY2VwdEVpdGhlcgotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBUPiBvdGhlciwKLSAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBkb0FjY2VwdEVpdGhlcihvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGFjdGlvbiwgbnVsbCk7CisgICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGFjY2VwdEVpdGhlcigKKyAgICAgICAgQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBUPiBvdGhlciwgQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIG9yQWNjZXB0U3RhZ2UobnVsbCwgb3RoZXIsIGFjdGlvbik7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGFjY2VwdEVpdGhlckFzeW5jCi0gICAgICAgIChDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFQ+IG90aGVyLAotICAgICAgICAgQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIGRvQWNjZXB0RWl0aGVyKG90aGVyLnRvQ29tcGxldGFibGVGdXR1cmUoKSwgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSk7CisgICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGFjY2VwdEVpdGhlckFzeW5jKAorICAgICAgICBDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFQ+IG90aGVyLCBDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbikgeworICAgICAgICByZXR1cm4gb3JBY2NlcHRTdGFnZShhc3luY1Bvb2wsIG90aGVyLCBhY3Rpb24pOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBhY2NlcHRFaXRoZXJBc3luYwotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBUPiBvdGhlciwKLSAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uLAotICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gZG9BY2NlcHRFaXRoZXIob3RoZXIudG9Db21wbGV0YWJsZUZ1dHVyZSgpLCBhY3Rpb24sIGV4ZWN1dG9yKTsKKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gYWNjZXB0RWl0aGVyQXN5bmMoCisgICAgICAgIENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsIENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uLAorICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICByZXR1cm4gb3JBY2NlcHRTdGFnZShzY3JlZW5FeGVjdXRvcihleGVjdXRvciksIG90aGVyLCBhY3Rpb24pOwogICAgIH0KIAogICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBydW5BZnRlckVpdGhlcihDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGFjdGlvbikgewotICAgICAgICByZXR1cm4gZG9SdW5BZnRlckVpdGhlcihvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGFjdGlvbiwgbnVsbCk7CisgICAgICAgIHJldHVybiBvclJ1blN0YWdlKG51bGwsIG90aGVyLCBhY3Rpb24pOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBydW5BZnRlckVpdGhlckFzeW5jCi0gICAgICAgIChDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsCi0gICAgICAgICBSdW5uYWJsZSBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIGRvUnVuQWZ0ZXJFaXRoZXIob3RoZXIudG9Db21wbGV0YWJsZUZ1dHVyZSgpLCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcmtKb2luUG9vbC5jb21tb25Qb29sKCkpOworICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBydW5BZnRlckVpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/PiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIG9yUnVuU3RhZ2UoYXN5bmNQb29sLCBvdGhlciwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gcnVuQWZ0ZXJFaXRoZXJBc3luYwotICAgICAgICAoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLAotICAgICAgICAgUnVubmFibGUgYWN0aW9uLAotICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gZG9SdW5BZnRlckVpdGhlcihvdGhlci50b0NvbXBsZXRhYmxlRnV0dXJlKCksIGFjdGlvbiwgZXhlY3V0b3IpOworICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBydW5BZnRlckVpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/PiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgcmV0dXJuIG9yUnVuU3RhZ2Uoc2NyZWVuRXhlY3V0b3IoZXhlY3V0b3IpLCBvdGhlciwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IHRoZW5Db21wb3NlCi0gICAgICAgIChGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuKSB7Ci0gICAgICAgIHJldHVybiBkb1RoZW5Db21wb3NlKGZuLCBudWxsKTsKKyAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IHRoZW5Db21wb3NlKAorICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuKSB7CisgICAgICAgIHJldHVybiB1bmlDb21wb3NlU3RhZ2UobnVsbCwgZm4pOwogICAgIH0KIAotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gdGhlbkNvbXBvc2VBc3luYwotICAgICAgICAoRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgQ29tcGxldGlvblN0YWdlPFU+PiBmbikgewotICAgICAgICByZXR1cm4gZG9UaGVuQ29tcG9zZShmbiwgRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSk7CisgICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiB0aGVuQ29tcG9zZUFzeW5jKAorICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuKSB7CisgICAgICAgIHJldHVybiB1bmlDb21wb3NlU3RhZ2UoYXN5bmNQb29sLCBmbik7CiAgICAgfQogCi0gICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiB0aGVuQ29tcG9zZUFzeW5jCi0gICAgICAgIChGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuLAotICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gZG9UaGVuQ29tcG9zZShmbiwgZXhlY3V0b3IpOworICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gdGhlbkNvbXBvc2VBc3luYygKKyAgICAgICAgRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgQ29tcGxldGlvblN0YWdlPFU+PiBmbiwKKyAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgcmV0dXJuIHVuaUNvbXBvc2VTdGFnZShzY3JlZW5FeGVjdXRvcihleGVjdXRvciksIGZuKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8VD4gd2hlbkNvbXBsZXRlCi0gICAgICAgIChCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBUaHJvd2FibGU+IGFjdGlvbikgewotICAgICAgICByZXR1cm4gZG9XaGVuQ29tcGxldGUoYWN0aW9uLCBudWxsKTsKKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8VD4gd2hlbkNvbXBsZXRlKAorICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBUaHJvd2FibGU+IGFjdGlvbikgeworICAgICAgICByZXR1cm4gdW5pV2hlbkNvbXBsZXRlU3RhZ2UobnVsbCwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8VD4gd2hlbkNvbXBsZXRlQXN5bmMKLSAgICAgICAgKEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFRocm93YWJsZT4gYWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBkb1doZW5Db21wbGV0ZShhY3Rpb24sIEZvcmtKb2luUG9vbC5jb21tb25Qb29sKCkpOworICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxUPiB3aGVuQ29tcGxldGVBc3luYygKKyAgICAgICAgQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVGhyb3dhYmxlPiBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHVuaVdoZW5Db21wbGV0ZVN0YWdlKGFzeW5jUG9vbCwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8VD4gd2hlbkNvbXBsZXRlQXN5bmMKLSAgICAgICAgKEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFRocm93YWJsZT4gYWN0aW9uLAotICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gZG9XaGVuQ29tcGxldGUoYWN0aW9uLCBleGVjdXRvcik7CisgICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHdoZW5Db21wbGV0ZUFzeW5jKAorICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBUaHJvd2FibGU+IGFjdGlvbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgcmV0dXJuIHVuaVdoZW5Db21wbGV0ZVN0YWdlKHNjcmVlbkV4ZWN1dG9yKGV4ZWN1dG9yKSwgYWN0aW9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IGhhbmRsZQotICAgICAgICAoQmlGdW5jdGlvbjw/IHN1cGVyIFQsIFRocm93YWJsZSwgPyBleHRlbmRzIFU+IGZuKSB7Ci0gICAgICAgIHJldHVybiBkb0hhbmRsZShmbiwgbnVsbCk7CisgICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiBoYW5kbGUoCisgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULCBUaHJvd2FibGUsID8gZXh0ZW5kcyBVPiBmbikgeworICAgICAgICByZXR1cm4gdW5pSGFuZGxlU3RhZ2UobnVsbCwgZm4pOwogICAgIH0KIAotICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gaGFuZGxlQXN5bmMKLSAgICAgICAgKEJpRnVuY3Rpb248PyBzdXBlciBULCBUaHJvd2FibGUsID8gZXh0ZW5kcyBVPiBmbikgewotICAgICAgICByZXR1cm4gZG9IYW5kbGUoZm4sIEZvcmtKb2luUG9vbC5jb21tb25Qb29sKCkpOworICAgIHB1YmxpYyA8VT4gQ29tcGxldGFibGVGdXR1cmU8VT4gaGFuZGxlQXN5bmMoCisgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULCBUaHJvd2FibGUsID8gZXh0ZW5kcyBVPiBmbikgeworICAgICAgICByZXR1cm4gdW5pSGFuZGxlU3RhZ2UoYXN5bmNQb29sLCBmbik7CiAgICAgfQogCi0gICAgcHVibGljIDxVPiBDb21wbGV0YWJsZUZ1dHVyZTxVPiBoYW5kbGVBc3luYwotICAgICAgICAoQmlGdW5jdGlvbjw/IHN1cGVyIFQsIFRocm93YWJsZSwgPyBleHRlbmRzIFU+IGZuLAotICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gZG9IYW5kbGUoZm4sIGV4ZWN1dG9yKTsKKyAgICBwdWJsaWMgPFU+IENvbXBsZXRhYmxlRnV0dXJlPFU+IGhhbmRsZUFzeW5jKAorICAgICAgICBCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVT4gZm4sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgIHJldHVybiB1bmlIYW5kbGVTdGFnZShzY3JlZW5FeGVjdXRvcihleGVjdXRvciksIGZuKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgQ29tcGxldGFibGVGdXR1cmUKKyAgICAgKiBSZXR1cm5zIHRoaXMgQ29tcGxldGFibGVGdXR1cmUuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoaXMgQ29tcGxldGFibGVGdXR1cmUKICAgICAgKi8KQEAgLTI2MTgsNTIgKzIxODMsMTMgQEAKICAgICAgKiBleGNlcHRpb25hbGx5CiAgICAgICogQHJldHVybiB0aGUgbmV3IENvbXBsZXRhYmxlRnV0dXJlCiAgICAgICovCi0gICAgcHVibGljIENvbXBsZXRhYmxlRnV0dXJlPFQ+IGV4Y2VwdGlvbmFsbHkKLSAgICAgICAgKEZ1bmN0aW9uPFRocm93YWJsZSwgPyBleHRlbmRzIFQ+IGZuKSB7Ci0gICAgICAgIGlmIChmbiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8VD4gZHN0ID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPFQ+KCk7Ci0gICAgICAgIEV4Y2VwdGlvbkNvbXBsZXRpb248VD4gZCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByOwotICAgICAgICBpZiAoKHIgPSByZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgIENvbXBsZXRpb25Ob2RlIHAgPQotICAgICAgICAgICAgICAgIG5ldyBDb21wbGV0aW9uTm9kZShkID0gbmV3IEV4Y2VwdGlvbkNvbXBsZXRpb248VD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMsIGZuLCBkc3QpKTsKLSAgICAgICAgICAgIHdoaWxlICgociA9IHJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QodGhpcywgQ09NUExFVElPTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLm5leHQgPSBjb21wbGV0aW9ucywgcCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyICE9IG51bGwgJiYgKGQgPT0gbnVsbCB8fCBkLmNvbXBhcmVBbmRTZXQoMCwgMSkpKSB7Ci0gICAgICAgICAgICBUIHQgPSBudWxsOyBUaHJvd2FibGUgZXgsIGR4ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKChleCA9ICgoQWx0UmVzdWx0KXIpLmV4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gZm4uYXBwbHkoZXgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgcmV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkeCA9IHJleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBUIHRyID0gKFQpIHI7Ci0gICAgICAgICAgICAgICAgdCA9IHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUodCwgZHgpOwotICAgICAgICB9Ci0gICAgICAgIGhlbHBQb3N0Q29tcGxldGUoKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8VD4gZXhjZXB0aW9uYWxseSgKKyAgICAgICAgRnVuY3Rpb248VGhyb3dhYmxlLCA/IGV4dGVuZHMgVD4gZm4pIHsKKyAgICAgICAgcmV0dXJuIHVuaUV4Y2VwdGlvbmFsbHlTdGFnZShmbik7CiAgICAgfQogCiAgICAgLyogLS0tLS0tLS0tLS0tLSBBcmJpdHJhcnktYXJpdHkgY29uc3RydWN0aW9ucyAtLS0tLS0tLS0tLS0tLSAqLwogCi0gICAgLyoKLSAgICAgKiBUaGUgYmFzaWMgcGxhbiBvZiBhdHRhY2sgaXMgdG8gcmVjdXJzaXZlbHkgZm9ybSBiaW5hcnkKLSAgICAgKiBjb21wbGV0aW9uIHRyZWVzIG9mIGVsZW1lbnRzLiBUaGlzIGNhbiBiZSBvdmVya2lsbCBmb3Igc21hbGwKLSAgICAgKiBzZXRzLCBidXQgc2NhbGVzIG5pY2VseS4gVGhlIEFuZC9BbGwgdnMgT3IvQW55IGZvcm1zIHVzZSB0aGUKLSAgICAgKiBzYW1lIGlkZWEsIGJ1dCBkZXRhaWxzIGRpZmZlci4KLSAgICAgKi8KLQogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcgQ29tcGxldGFibGVGdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQgd2hlbiBhbGwgb2YKICAgICAgKiB0aGUgZ2l2ZW4gQ29tcGxldGFibGVGdXR1cmVzIGNvbXBsZXRlLiAgSWYgYW55IG9mIHRoZSBnaXZlbgpAQCAtMjY4OCw4MiArMjIxNCw3IEBACiAgICAgICoge0Bjb2RlIG51bGx9CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBhbGxPZihDb21wbGV0YWJsZUZ1dHVyZTw/Pi4uLiBjZnMpIHsKLSAgICAgICAgaW50IGxlbiA9IGNmcy5sZW5ndGg7IC8vIERpcmVjdGx5IGhhbmRsZSBlbXB0eSBhbmQgc2luZ2xldG9uIGNhc2VzCi0gICAgICAgIGlmIChsZW4gPiAxKQotICAgICAgICAgICAgcmV0dXJuIGFsbFRyZWUoY2ZzLCAwLCBsZW4gLSAxKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKLSAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8+IGY7Ci0gICAgICAgICAgICBpZiAobGVuID09IDApCi0gICAgICAgICAgICAgICAgZHN0LnJlc3VsdCA9IE5JTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKChmID0gY2ZzWzBdKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgVGhlblByb3BhZ2F0ZSBkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBDb21wbGV0aW9uTm9kZSBwID0gbnVsbDsKLSAgICAgICAgICAgICAgICBPYmplY3QgcjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKHIgPSBmLnJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgZCA9IG5ldyBUaGVuUHJvcGFnYXRlKGYsIGRzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgQ29tcGxldGlvbk5vZGUoZCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFVOU0FGRS5jb21wYXJlQW5kU3dhcE9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZiwgQ09NUExFVElPTlMsIHAubmV4dCA9IGYuY29tcGxldGlvbnMsIHApKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwgJiYgKGQgPT0gbnVsbCB8fCBkLmNvbXBhcmVBbmRTZXQoMCwgMSkpKQotICAgICAgICAgICAgICAgICAgICBkc3QuaW50ZXJuYWxDb21wbGV0ZShudWxsLCAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFsdFJlc3VsdClyKS5leCA6IG51bGwpOwotICAgICAgICAgICAgICAgIGYuaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZWx5IGNvbnN0cnVjdHMgYW4gQW5kJ2VkIHRyZWUgb2YgQ29tcGxldGFibGVGdXR1cmVzLgotICAgICAqIENhbGxlZCBvbmx5IHdoZW4gYXJyYXkga25vd24gdG8gaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gYWxsVHJlZShDb21wbGV0YWJsZUZ1dHVyZTw/PltdIGNmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbywgaW50IGhpKSB7Ci0gICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8+IGZzdCwgc25kOwotICAgICAgICBpbnQgbWlkID0gKGxvICsgaGkpID4+PiAxOwotICAgICAgICBpZiAoKGZzdCA9IChsbyA9PSBtaWQgICA/IGNmc1tsb10gOiBhbGxUcmVlKGNmcywgbG8sICAgIG1pZCkpKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAoc25kID0gKGhpID09IG1pZCsxID8gY2ZzW2hpXSA6IGFsbFRyZWUoY2ZzLCBtaWQrMSwgaGkpKSkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkc3QgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4oKTsKLSAgICAgICAgQW5kQ29tcGxldGlvbiBkID0gbnVsbDsKLSAgICAgICAgQ29tcGxldGlvbk5vZGUgcCA9IG51bGwsIHEgPSBudWxsOwotICAgICAgICBPYmplY3QgciA9IG51bGwsIHMgPSBudWxsOwotICAgICAgICB3aGlsZSAoKHIgPSBmc3QucmVzdWx0KSA9PSBudWxsIHx8IChzID0gc25kLnJlc3VsdCkgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBkID0gbmV3IEFuZENvbXBsZXRpb24oZnN0LCBzbmQsIGRzdCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwID09IG51bGwpCi0gICAgICAgICAgICAgICAgcCA9IG5ldyBDb21wbGV0aW9uTm9kZShkKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QKLSAgICAgICAgICAgICAgICAgICAgKGZzdCwgQ09NUExFVElPTlMsIHAubmV4dCA9IGZzdC5jb21wbGV0aW9ucywgcCkpCi0gICAgICAgICAgICAgICAgICAgIHEgPSBuZXcgQ29tcGxldGlvbk5vZGUoZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QKLSAgICAgICAgICAgICAgICAgICAgIChzbmQsIENPTVBMRVRJT05TLCBxLm5leHQgPSBzbmQuY29tcGxldGlvbnMsIHEpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgociAhPSBudWxsIHx8IChyID0gZnN0LnJlc3VsdCkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgIChzICE9IG51bGwgfHwgKHMgPSBzbmQucmVzdWx0KSAhPSBudWxsKSAmJgotICAgICAgICAgICAgKGQgPT0gbnVsbCB8fCBkLmNvbXBhcmVBbmRTZXQoMCwgMSkpKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgZXg7Ci0gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFsdFJlc3VsdCkKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXIpLmV4OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChleCA9PSBudWxsICYmIChzIGluc3RhbmNlb2YgQWx0UmVzdWx0KSkKLSAgICAgICAgICAgICAgICBleCA9ICgoQWx0UmVzdWx0KXMpLmV4OwotICAgICAgICAgICAgZHN0LmludGVybmFsQ29tcGxldGUobnVsbCwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGZzdC5oZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIHNuZC5oZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgIHJldHVybiBkc3Q7CisgICAgICAgIHJldHVybiBhbmRUcmVlKGNmcywgMCwgY2ZzLmxlbmd0aCAtIDEpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc4Miw5MiArMjIzMyw3IEBACiAgICAgICoge0Bjb2RlIG51bGx9CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+IGFueU9mKENvbXBsZXRhYmxlRnV0dXJlPD8+Li4uIGNmcykgewotICAgICAgICBpbnQgbGVuID0gY2ZzLmxlbmd0aDsgLy8gU2FtZSBpZGVhIGFzIGFsbE9mCi0gICAgICAgIGlmIChsZW4gPiAxKQotICAgICAgICAgICAgcmV0dXJuIGFueVRyZWUoY2ZzLCAwLCBsZW4gLSAxKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+IGRzdCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+KCk7Ci0gICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTw/PiBmOwotICAgICAgICAgICAgaWYgKGxlbiA9PSAwKQotICAgICAgICAgICAgICAgIDsgLy8gc2tpcAotICAgICAgICAgICAgZWxzZSBpZiAoKGYgPSBjZnNbMF0pID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBUaGVuQ29weTxPYmplY3Q+IGQgPSBudWxsOwotICAgICAgICAgICAgICAgIENvbXBsZXRpb25Ob2RlIHAgPSBudWxsOwotICAgICAgICAgICAgICAgIE9iamVjdCByOwotICAgICAgICAgICAgICAgIHdoaWxlICgociA9IGYucmVzdWx0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBkID0gbmV3IFRoZW5Db3B5PE9iamVjdD4oZiwgZHN0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG5ldyBDb21wbGV0aW9uTm9kZShkKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmLCBDT01QTEVUSU9OUywgcC5uZXh0ID0gZi5jb21wbGV0aW9ucywgcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiAoZCA9PSBudWxsIHx8IGQuY29tcGFyZUFuZFNldCgwLCAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGV4OyBPYmplY3QgdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBbHRSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gKChBbHRSZXN1bHQpcikuZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQgPSByOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKHQsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZi5oZWxwUG9zdENvbXBsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZHN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjdXJzaXZlbHkgY29uc3RydWN0cyBhbiBPcidlZCB0cmVlIG9mIENvbXBsZXRhYmxlRnV0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+IGFueVRyZWUoQ29tcGxldGFibGVGdXR1cmU8Pz5bXSBjZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbywgaW50IGhpKSB7Ci0gICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPD8+IGZzdCwgc25kOwotICAgICAgICBpbnQgbWlkID0gKGxvICsgaGkpID4+PiAxOwotICAgICAgICBpZiAoKGZzdCA9IChsbyA9PSBtaWQgICA/IGNmc1tsb10gOiBhbnlUcmVlKGNmcywgbG8sICAgIG1pZCkpKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAoc25kID0gKGhpID09IG1pZCsxID8gY2ZzW2hpXSA6IGFueVRyZWUoY2ZzLCBtaWQrMSwgaGkpKSkgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+IGRzdCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+KCk7Ci0gICAgICAgIE9yQ29tcGxldGlvbiBkID0gbnVsbDsKLSAgICAgICAgQ29tcGxldGlvbk5vZGUgcCA9IG51bGwsIHEgPSBudWxsOwotICAgICAgICBPYmplY3QgcjsKLSAgICAgICAgd2hpbGUgKChyID0gZnN0LnJlc3VsdCkgPT0gbnVsbCAmJiAociA9IHNuZC5yZXN1bHQpID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkID09IG51bGwpCi0gICAgICAgICAgICAgICAgZCA9IG5ldyBPckNvbXBsZXRpb24oZnN0LCBzbmQsIGRzdCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwID09IG51bGwpCi0gICAgICAgICAgICAgICAgcCA9IG5ldyBDb21wbGV0aW9uTm9kZShkKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QKLSAgICAgICAgICAgICAgICAgICAgKGZzdCwgQ09NUExFVElPTlMsIHAubmV4dCA9IGZzdC5jb21wbGV0aW9ucywgcCkpCi0gICAgICAgICAgICAgICAgICAgIHEgPSBuZXcgQ29tcGxldGlvbk5vZGUoZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QKLSAgICAgICAgICAgICAgICAgICAgIChzbmQsIENPTVBMRVRJT05TLCBxLm5leHQgPSBzbmQuY29tcGxldGlvbnMsIHEpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgociAhPSBudWxsIHx8IChyID0gZnN0LnJlc3VsdCkgIT0gbnVsbCB8fAotICAgICAgICAgICAgIChyID0gc25kLnJlc3VsdCkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgIChkID09IG51bGwgfHwgZC5jb21wYXJlQW5kU2V0KDAsIDEpKSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIGV4OyBPYmplY3QgdDsKLSAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQWx0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgZXggPSAoKEFsdFJlc3VsdClyKS5leDsKLSAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGV4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0ID0gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdC5pbnRlcm5hbENvbXBsZXRlKHQsIGV4KTsKLSAgICAgICAgfQotICAgICAgICBmc3QuaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICBzbmQuaGVscFBvc3RDb21wbGV0ZSgpOwotICAgICAgICByZXR1cm4gZHN0OworICAgICAgICByZXR1cm4gb3JUcmVlKGNmcywgMCwgY2ZzLmxlbmd0aCAtIDEpOwogICAgIH0KIAogICAgIC8qIC0tLS0tLS0tLS0tLS0gQ29udHJvbCBhbmQgc3RhdHVzIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI4ODcsOCArMjI1Myw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsKGJvb2xlYW4gbWF5SW50ZXJydXB0SWZSdW5uaW5nKSB7CiAgICAgICAgIGJvb2xlYW4gY2FuY2VsbGVkID0gKHJlc3VsdCA9PSBudWxsKSAmJgotICAgICAgICAgICAgVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0Ci0gICAgICAgICAgICAodGhpcywgUkVTVUxULCBudWxsLCBuZXcgQWx0UmVzdWx0KG5ldyBDYW5jZWxsYXRpb25FeGNlcHRpb24oKSkpOworICAgICAgICAgICAgaW50ZXJuYWxDb21wbGV0ZShuZXcgQWx0UmVzdWx0KG5ldyBDYW5jZWxsYXRpb25FeGNlcHRpb24oKSkpOwogICAgICAgICBwb3N0Q29tcGxldGUoKTsKICAgICAgICAgcmV0dXJuIGNhbmNlbGxlZCB8fCBpc0NhbmNlbGxlZCgpOwogICAgIH0KQEAgLTI5NDAsMTEgKzIzMDUsMTIgQEAKICAgICAgKiBGb3JjaWJseSBjYXVzZXMgc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiBtZXRob2Qge0BsaW5rICNnZXQoKX0KICAgICAgKiBhbmQgcmVsYXRlZCBtZXRob2RzIHRvIHRocm93IHRoZSBnaXZlbiBleGNlcHRpb24sIHdoZXRoZXIgb3IKICAgICAgKiBub3QgYWxyZWFkeSBjb21wbGV0ZWQuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIGZvciB1c2Ugb25seSBpbgotICAgICAqIHJlY292ZXJ5IGFjdGlvbnMsIGFuZCBldmVuIGluIHN1Y2ggc2l0dWF0aW9ucyBtYXkgcmVzdWx0IGluCi0gICAgICogb25nb2luZyBkZXBlbmRlbnQgY29tcGxldGlvbnMgdXNpbmcgZXN0YWJsaXNoZWQgdmVyc3VzCisgICAgICogZXJyb3IgcmVjb3ZlcnkgYWN0aW9ucywgYW5kIGV2ZW4gaW4gc3VjaCBzaXR1YXRpb25zIG1heSByZXN1bHQKKyAgICAgKiBpbiBvbmdvaW5nIGRlcGVuZGVudCBjb21wbGV0aW9ucyB1c2luZyBlc3RhYmxpc2hlZCB2ZXJzdXMKICAgICAgKiBvdmVyd3JpdHRlbiBvdXRjb21lcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBleCB0aGUgZXhjZXB0aW9uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZXhjZXB0aW9uIGlzIG51bGwKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvYnRydWRlRXhjZXB0aW9uKFRocm93YWJsZSBleCkgewogICAgICAgICBpZiAoZXggPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CkBAIC0yOTYyLDcgKzIzMjgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZEZXBlbmRlbnRzKCkgewogICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IgKENvbXBsZXRpb25Ob2RlIHAgPSBjb21wbGV0aW9uczsgcCAhPSBudWxsOyBwID0gcC5uZXh0KQorICAgICAgICBmb3IgKENvbXBsZXRpb24gcCA9IHN0YWNrOyBwICE9IG51bGw7IHAgPSBwLm5leHQpCiAgICAgICAgICAgICArK2NvdW50OwogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQpAQCAtMjk5MywyMCArMjM1OSwxOSBAQAogICAgIC8vIFVuc2FmZSBtZWNoYW5pY3MKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgVU5TQUZFOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVTVUxUOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgV0FJVEVSUzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENPTVBMRVRJT05TOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1RBQ0s7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBORVhUOwogICAgIHN0YXRpYyB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVTlNBRkUgPSBzdW4ubWlzYy5VbnNhZmUuZ2V0VW5zYWZlKCk7CisgICAgICAgICAgICBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgdTsKKyAgICAgICAgICAgIFVOU0FGRSA9IHUgPSBzdW4ubWlzYy5VbnNhZmUuZ2V0VW5zYWZlKCk7CiAgICAgICAgICAgICBDbGFzczw/PiBrID0gQ29tcGxldGFibGVGdXR1cmUuY2xhc3M7Ci0gICAgICAgICAgICBSRVNVTFQgPSBVTlNBRkUub2JqZWN0RmllbGRPZmZzZXQKLSAgICAgICAgICAgICAgICAoay5nZXREZWNsYXJlZEZpZWxkKCJyZXN1bHQiKSk7Ci0gICAgICAgICAgICBXQUlURVJTID0gVU5TQUZFLm9iamVjdEZpZWxkT2Zmc2V0Ci0gICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgid2FpdGVycyIpKTsKLSAgICAgICAgICAgIENPTVBMRVRJT05TID0gVU5TQUZFLm9iamVjdEZpZWxkT2Zmc2V0Ci0gICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgiY29tcGxldGlvbnMiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7CisgICAgICAgICAgICBSRVNVTFQgPSB1Lm9iamVjdEZpZWxkT2Zmc2V0KGsuZ2V0RGVjbGFyZWRGaWVsZCgicmVzdWx0IikpOworICAgICAgICAgICAgU1RBQ0sgPSB1Lm9iamVjdEZpZWxkT2Zmc2V0KGsuZ2V0RGVjbGFyZWRGaWVsZCgic3RhY2siKSk7CisgICAgICAgICAgICBORVhUID0gdS5vYmplY3RGaWVsZE9mZnNldAorICAgICAgICAgICAgICAgIChDb21wbGV0aW9uLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm5leHQiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoeCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvY29uY3VycmVudC9Db21wbGV0aW9uU3RhZ2UuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbXBsZXRpb25TdGFnZS5qYXZhCmluZGV4IDZkZTYwOTguLjMwNGVkZTUgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbXBsZXRpb25TdGFnZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9jb25jdXJyZW50L0NvbXBsZXRpb25TdGFnZS5qYXZhCkBAIC00MDcsNyArNDA3LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IENvbXBsZXRpb25TdGFnZSB0aGF0LCB3aGVuIHRoaXMgYW5kIHRoZSBvdGhlcgogICAgICAqIGdpdmVuIHN0YWdlIGNvbXBsZXRlIG5vcm1hbGx5LCBleGVjdXRlcyB0aGUgZ2l2ZW4gYWN0aW9uIHVzaW5nCi0gICAgICogdGhlIHN1cHBsaWVkIGV4ZWN1dG9yCisgICAgICogdGhlIHN1cHBsaWVkIGV4ZWN1dG9yLgogICAgICAqCiAgICAgICogU2VlIHRoZSB7QGxpbmsgQ29tcGxldGlvblN0YWdlfSBkb2N1bWVudGF0aW9uIGZvciBydWxlcwogICAgICAqIGNvdmVyaW5nIGV4Y2VwdGlvbmFsIGNvbXBsZXRpb24uCkBAIC01NjksNyArNTY5LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IENvbXBsZXRpb25TdGFnZSB0aGF0LCB3aGVuIGVpdGhlciB0aGlzIG9yIHRoZQogICAgICAqIG90aGVyIGdpdmVuIHN0YWdlIGNvbXBsZXRlIG5vcm1hbGx5LCBleGVjdXRlcyB0aGUgZ2l2ZW4gYWN0aW9uCi0gICAgICogdXNpbmcgc3VwcGxpZWQgZXhlY3V0b3IuCisgICAgICogdXNpbmcgdGhlIHN1cHBsaWVkIGV4ZWN1dG9yLgogICAgICAqCiAgICAgICogU2VlIHRoZSB7QGxpbmsgQ29tcGxldGlvblN0YWdlfSBkb2N1bWVudGF0aW9uIGZvciBydWxlcwogICAgICAqIGNvdmVyaW5nIGV4Y2VwdGlvbmFsIGNvbXBsZXRpb24uCkBAIC02NDksMTAgKzY0OSwxNSBAQAogICAgICAgICAoRnVuY3Rpb248VGhyb3dhYmxlLCA/IGV4dGVuZHMgVD4gZm4pOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBDb21wbGV0aW9uU3RhZ2Ugd2l0aCB0aGUgc2FtZSByZXN1bHQgb3IgZXhjZXB0aW9uCi0gICAgICogYXMgdGhpcyBzdGFnZSwgYW5kIHdoZW4gdGhpcyBzdGFnZSBjb21wbGV0ZXMsIGV4ZWN1dGVzIHRoZQotICAgICAqIGdpdmVuIGFjdGlvbiB3aXRoIHRoZSByZXN1bHQgKG9yIHtAY29kZSBudWxsfSBpZiBub25lKSBhbmQgdGhlCi0gICAgICogZXhjZXB0aW9uIChvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSkgb2YgdGhpcyBzdGFnZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IENvbXBsZXRpb25TdGFnZSB3aXRoIHRoZSBzYW1lIHJlc3VsdCBvciBleGNlcHRpb24gYXMKKyAgICAgKiB0aGlzIHN0YWdlLCB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBhY3Rpb24gd2hlbiB0aGlzIHN0YWdlIGNvbXBsZXRlcy4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyBzdGFnZSBpcyBjb21wbGV0ZSwgdGhlIGdpdmVuIGFjdGlvbiBpcyBpbnZva2VkIHdpdGggdGhlCisgICAgICogcmVzdWx0IChvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSkgYW5kIHRoZSBleGNlcHRpb24gKG9yIHtAY29kZSBudWxsfQorICAgICAqIGlmIG5vbmUpIG9mIHRoaXMgc3RhZ2UgYXMgYXJndW1lbnRzLiAgVGhlIHJldHVybmVkIHN0YWdlIGlzIGNvbXBsZXRlZAorICAgICAqIHdoZW4gdGhlIGFjdGlvbiByZXR1cm5zLiAgSWYgdGhlIHN1cHBsaWVkIGFjdGlvbiBpdHNlbGYgZW5jb3VudGVycyBhbgorICAgICAqIGV4Y2VwdGlvbiwgdGhlbiB0aGUgcmV0dXJuZWQgc3RhZ2UgZXhjZXB0aW9uYWxseSBjb21wbGV0ZXMgd2l0aCB0aGlzCisgICAgICogZXhjZXB0aW9uIHVubGVzcyB0aGlzIHN0YWdlIGFsc28gY29tcGxldGVkIGV4Y2VwdGlvbmFsbHkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gcGVyZm9ybQogICAgICAqIEByZXR1cm4gdGhlIG5ldyBDb21wbGV0aW9uU3RhZ2UKQEAgLTY2MSwxMiArNjY2LDE2IEBACiAgICAgICAgIChCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBUaHJvd2FibGU+IGFjdGlvbik7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IENvbXBsZXRpb25TdGFnZSB3aXRoIHRoZSBzYW1lIHJlc3VsdCBvciBleGNlcHRpb24KLSAgICAgKiBhcyB0aGlzIHN0YWdlLCBhbmQgd2hlbiB0aGlzIHN0YWdlIGNvbXBsZXRlcywgZXhlY3V0ZXMgdGhlCi0gICAgICogZ2l2ZW4gYWN0aW9uIGV4ZWN1dGVzIHRoZSBnaXZlbiBhY3Rpb24gdXNpbmcgdGhpcyBzdGFnZSdzCi0gICAgICogZGVmYXVsdCBhc3luY2hyb25vdXMgZXhlY3V0aW9uIGZhY2lsaXR5LCB3aXRoIHRoZSByZXN1bHQgKG9yCi0gICAgICoge0Bjb2RlIG51bGx9IGlmIG5vbmUpIGFuZCB0aGUgZXhjZXB0aW9uIChvciB7QGNvZGUgbnVsbH0gaWYKLSAgICAgKiBub25lKSBvZiB0aGlzIHN0YWdlIGFzIGFyZ3VtZW50cy4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IENvbXBsZXRpb25TdGFnZSB3aXRoIHRoZSBzYW1lIHJlc3VsdCBvciBleGNlcHRpb24gYXMKKyAgICAgKiB0aGlzIHN0YWdlLCB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBhY3Rpb24gdXNpbmcgdGhpcyBzdGFnZSdzCisgICAgICogZGVmYXVsdCBhc3luY2hyb25vdXMgZXhlY3V0aW9uIGZhY2lsaXR5IHdoZW4gdGhpcyBzdGFnZSBjb21wbGV0ZXMuCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHRoaXMgc3RhZ2UgaXMgY29tcGxldGUsIHRoZSBnaXZlbiBhY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZQorICAgICAqIHJlc3VsdCAob3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUpIGFuZCB0aGUgZXhjZXB0aW9uIChvciB7QGNvZGUgbnVsbH0KKyAgICAgKiBpZiBub25lKSBvZiB0aGlzIHN0YWdlIGFzIGFyZ3VtZW50cy4gIFRoZSByZXR1cm5lZCBzdGFnZSBpcyBjb21wbGV0ZWQKKyAgICAgKiB3aGVuIHRoZSBhY3Rpb24gcmV0dXJucy4gIElmIHRoZSBzdXBwbGllZCBhY3Rpb24gaXRzZWxmIGVuY291bnRlcnMgYW4KKyAgICAgKiBleGNlcHRpb24sIHRoZW4gdGhlIHJldHVybmVkIHN0YWdlIGV4Y2VwdGlvbmFsbHkgY29tcGxldGVzIHdpdGggdGhpcworICAgICAqIGV4Y2VwdGlvbiB1bmxlc3MgdGhpcyBzdGFnZSBhbHNvIGNvbXBsZXRlZCBleGNlcHRpb25hbGx5LgogICAgICAqCiAgICAgICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIHBlcmZvcm0KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQ29tcGxldGlvblN0YWdlCkBAIC02NzUsMTEgKzY4NCwxNiBAQAogICAgICAgICAoQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVGhyb3dhYmxlPiBhY3Rpb24pOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBDb21wbGV0aW9uU3RhZ2Ugd2l0aCB0aGUgc2FtZSByZXN1bHQgb3IgZXhjZXB0aW9uCi0gICAgICogYXMgdGhpcyBzdGFnZSwgYW5kIHdoZW4gdGhpcyBzdGFnZSBjb21wbGV0ZXMsIGV4ZWN1dGVzIHVzaW5nCi0gICAgICogdGhlIHN1cHBsaWVkIEV4ZWN1dG9yLCB0aGUgZ2l2ZW4gYWN0aW9uIHdpdGggdGhlIHJlc3VsdCAob3IKLSAgICAgKiB7QGNvZGUgbnVsbH0gaWYgbm9uZSkgYW5kIHRoZSBleGNlcHRpb24gKG9yIHtAY29kZSBudWxsfSBpZgotICAgICAqIG5vbmUpIG9mIHRoaXMgc3RhZ2UgYXMgYXJndW1lbnRzLgorICAgICAqIFJldHVybnMgYSBuZXcgQ29tcGxldGlvblN0YWdlIHdpdGggdGhlIHNhbWUgcmVzdWx0IG9yIGV4Y2VwdGlvbiBhcworICAgICAqIHRoaXMgc3RhZ2UsIHRoYXQgZXhlY3V0ZXMgdGhlIGdpdmVuIGFjdGlvbiB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICAgKiBFeGVjdXRvciB3aGVuIHRoaXMgc3RhZ2UgY29tcGxldGVzLgorICAgICAqCisgICAgICogPHA+V2hlbiB0aGlzIHN0YWdlIGlzIGNvbXBsZXRlLCB0aGUgZ2l2ZW4gYWN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGUKKyAgICAgKiByZXN1bHQgKG9yIHtAY29kZSBudWxsfSBpZiBub25lKSBhbmQgdGhlIGV4Y2VwdGlvbiAob3Ige0Bjb2RlIG51bGx9CisgICAgICogaWYgbm9uZSkgb2YgdGhpcyBzdGFnZSBhcyBhcmd1bWVudHMuICBUaGUgcmV0dXJuZWQgc3RhZ2UgaXMgY29tcGxldGVkCisgICAgICogd2hlbiB0aGUgYWN0aW9uIHJldHVybnMuICBJZiB0aGUgc3VwcGxpZWQgYWN0aW9uIGl0c2VsZiBlbmNvdW50ZXJzIGFuCisgICAgICogZXhjZXB0aW9uLCB0aGVuIHRoZSByZXR1cm5lZCBzdGFnZSBleGNlcHRpb25hbGx5IGNvbXBsZXRlcyB3aXRoIHRoaXMKKyAgICAgKiBleGNlcHRpb24gdW5sZXNzIHRoaXMgc3RhZ2UgYWxzbyBjb21wbGV0ZWQgZXhjZXB0aW9uYWxseS4KICAgICAgKgogICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBwZXJmb3JtCiAgICAgICogQHBhcmFtIGV4ZWN1dG9yIHRoZSBleGVjdXRvciB0byB1c2UgZm9yIGFzeW5jaHJvbm91cyBleGVjdXRpb24KQEAgLTY5Myw5ICs3MDcsMTEgQEAKICAgICAgKiBSZXR1cm5zIGEgbmV3IENvbXBsZXRpb25TdGFnZSB0aGF0LCB3aGVuIHRoaXMgc3RhZ2UgY29tcGxldGVzCiAgICAgICogZWl0aGVyIG5vcm1hbGx5IG9yIGV4Y2VwdGlvbmFsbHksIGlzIGV4ZWN1dGVkIHdpdGggdGhpcyBzdGFnZSdzCiAgICAgICogcmVzdWx0IGFuZCBleGNlcHRpb24gYXMgYXJndW1lbnRzIHRvIHRoZSBzdXBwbGllZCBmdW5jdGlvbi4KLSAgICAgKiBUaGUgZ2l2ZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZSByZXN1bHQgKG9yIHtAY29kZSBudWxsfQotICAgICAqIGlmIG5vbmUpIGFuZCB0aGUgZXhjZXB0aW9uIChvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSkgb2YgdGhpcwotICAgICAqIHN0YWdlIHdoZW4gY29tcGxldGUgYXMgYXJndW1lbnRzLgorICAgICAqCisgICAgICogPHA+V2hlbiB0aGlzIHN0YWdlIGlzIGNvbXBsZXRlLCB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgaW52b2tlZAorICAgICAqIHdpdGggdGhlIHJlc3VsdCAob3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUpIGFuZCB0aGUgZXhjZXB0aW9uIChvcgorICAgICAqIHtAY29kZSBudWxsfSBpZiBub25lKSBvZiB0aGlzIHN0YWdlIGFzIGFyZ3VtZW50cywgYW5kIHRoZQorICAgICAqIGZ1bmN0aW9uJ3MgcmVzdWx0IGlzIHVzZWQgdG8gY29tcGxldGUgdGhlIHJldHVybmVkIHN0YWdlLgogICAgICAqCiAgICAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byB1c2UgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICogcmV0dXJuZWQgQ29tcGxldGlvblN0YWdlCkBAIC03MTAsOSArNzI2LDExIEBACiAgICAgICogZWl0aGVyIG5vcm1hbGx5IG9yIGV4Y2VwdGlvbmFsbHksIGlzIGV4ZWN1dGVkIHVzaW5nIHRoaXMgc3RhZ2UncwogICAgICAqIGRlZmF1bHQgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbiBmYWNpbGl0eSwgd2l0aCB0aGlzIHN0YWdlJ3MKICAgICAgKiByZXN1bHQgYW5kIGV4Y2VwdGlvbiBhcyBhcmd1bWVudHMgdG8gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uLgotICAgICAqIFRoZSBnaXZlbiBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggdGhlIHJlc3VsdCAob3Ige0Bjb2RlIG51bGx9Ci0gICAgICogaWYgbm9uZSkgYW5kIHRoZSBleGNlcHRpb24gKG9yIHtAY29kZSBudWxsfSBpZiBub25lKSBvZiB0aGlzCi0gICAgICogc3RhZ2Ugd2hlbiBjb21wbGV0ZSBhcyBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHRoaXMgc3RhZ2UgaXMgY29tcGxldGUsIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBpbnZva2VkCisgICAgICogd2l0aCB0aGUgcmVzdWx0IChvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSkgYW5kIHRoZSBleGNlcHRpb24gKG9yCisgICAgICoge0Bjb2RlIG51bGx9IGlmIG5vbmUpIG9mIHRoaXMgc3RhZ2UgYXMgYXJndW1lbnRzLCBhbmQgdGhlCisgICAgICogZnVuY3Rpb24ncyByZXN1bHQgaXMgdXNlZCB0byBjb21wbGV0ZSB0aGUgcmV0dXJuZWQgc3RhZ2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgKiByZXR1cm5lZCBDb21wbGV0aW9uU3RhZ2UKQEAgLTcyNiwxMCArNzQ0LDEyIEBACiAgICAgICogUmV0dXJucyBhIG5ldyBDb21wbGV0aW9uU3RhZ2UgdGhhdCwgd2hlbiB0aGlzIHN0YWdlIGNvbXBsZXRlcwogICAgICAqIGVpdGhlciBub3JtYWxseSBvciBleGNlcHRpb25hbGx5LCBpcyBleGVjdXRlZCB1c2luZyB0aGUKICAgICAgKiBzdXBwbGllZCBleGVjdXRvciwgd2l0aCB0aGlzIHN0YWdlJ3MgcmVzdWx0IGFuZCBleGNlcHRpb24gYXMKLSAgICAgKiBhcmd1bWVudHMgdG8gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uLiAgVGhlIGdpdmVuIGZ1bmN0aW9uIGlzCi0gICAgICogaW52b2tlZCB3aXRoIHRoZSByZXN1bHQgKG9yIHtAY29kZSBudWxsfSBpZiBub25lKSBhbmQgdGhlCi0gICAgICogZXhjZXB0aW9uIChvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSkgb2YgdGhpcyBzdGFnZSB3aGVuIGNvbXBsZXRlCi0gICAgICogYXMgYXJndW1lbnRzLgorICAgICAqIGFyZ3VtZW50cyB0byB0aGUgc3VwcGxpZWQgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHRoaXMgc3RhZ2UgaXMgY29tcGxldGUsIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBpbnZva2VkCisgICAgICogd2l0aCB0aGUgcmVzdWx0IChvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSkgYW5kIHRoZSBleGNlcHRpb24gKG9yCisgICAgICoge0Bjb2RlIG51bGx9IGlmIG5vbmUpIG9mIHRoaXMgc3RhZ2UgYXMgYXJndW1lbnRzLCBhbmQgdGhlCisgICAgICogZnVuY3Rpb24ncyByZXN1bHQgaXMgdXNlZCB0byBjb21wbGV0ZSB0aGUgcmV0dXJuZWQgc3RhZ2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgKiByZXR1cm5lZCBDb21wbGV0aW9uU3RhZ2UKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0ZpbGVIYW5kbGVyLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlci5qYXZhCmluZGV4IDRkNjNiNzcuLjk2OTliNzIgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0ZpbGVIYW5kbGVyLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvRmlsZUhhbmRsZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogCiBwYWNrYWdlIGphdmEudXRpbC5sb2dnaW5nOwogCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORDsKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb24uQ1JFQVRFX05FVzsKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb24uV1JJVEU7CiAKQEAgLTM0LDEwICszNSwxNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogU2ltcGxlIGZpbGUgbG9nZ2luZyA8dHQ+SGFuZGxlcjwvdHQ+LgpAQCAtMTQ5LDcgKzE1Nyw3IEBACiAgICAgcHJpdmF0ZSBGaWxlQ2hhbm5lbCBsb2NrRmlsZUNoYW5uZWw7CiAgICAgcHJpdmF0ZSBGaWxlIGZpbGVzW107CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MT0NLUyA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbG9ja3MgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IGxvY2tzID0gbmV3IEhhc2hTZXQ8PigpOwogCiAgICAgLyoqCiAgICAgICogQSBtZXRlcmVkIHN0cmVhbSBpcyBhIHN1YmNsYXNzIG9mIE91dHB1dFN0cmVhbSB0aGF0CkBAIC00MjgsMzQgKzQzNiw4MCBAQAogICAgICAgICAgICAgLy8gYmV0d2VlbiBwcm9jZXNzZXMgKGFuZCBub3Qgd2l0aGluIGEgcHJvY2VzcyksIHdlIGZpcnN0IGNoZWNrCiAgICAgICAgICAgICAvLyBpZiB3ZSBvdXJzZWxmIGFscmVhZHkgaGF2ZSB0aGUgZmlsZSBsb2NrZWQuCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobG9ja3MpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9ja3MuZ2V0KGxvY2tGaWxlTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2Nrcy5jb250YWlucyhsb2NrRmlsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgb3duIHRoaXMgbG9jaywgZm9yIGEgZGlmZmVyZW50IEZpbGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdC4gIFRyeSBhZ2Fpbi4KICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbG9ja0ZpbGVDaGFubmVsID0gRmlsZUNoYW5uZWwub3BlbihQYXRocy5nZXQobG9ja0ZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEVfTkVXLCBXUklURSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZUFscmVhZHlFeGlzdHNFeGNlcHRpb24gaXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBuZXh0IGxvY2sgZmlsZSBuYW1lIGluIHRoZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIGxvY2tGaWxlUGF0aCA9IFBhdGhzLmdldChsb2NrRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIGludCByZXRyaWVzID0gLTE7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmaWxlQ3JlYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdoaWxlIChjaGFubmVsID09IG51bGwgJiYgcmV0cmllcysrIDwgMSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IEZpbGVDaGFubmVsLm9wZW4obG9ja0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEVfTkVXLCBXUklURSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ3JlYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVBbHJlYWR5RXhpc3RzRXhjZXB0aW9uIGl4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBhIHpvbWJpZSBmaWxlIGxlZnQgb3ZlciBieSBhIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIFJldXNlIGl0IC0gYnV0IG9ubHkgaWYgd2UgY2FuIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0byBpdHMgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBzaXR1YXRpb24gdGhhdCBtYXkgaGFwcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG5vdCB0b28gZnJlcXVlbnRseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlcy5pc1JlZ3VsYXJGaWxlKGxvY2tGaWxlUGF0aCwgTGlua09wdGlvbi5OT0ZPTExPV19MSU5LUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBGaWxlcy5pc1dyaXRhYmxlKGxvY2tGaWxlUGF0aC5nZXRQYXJlbnQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gRmlsZUNoYW5uZWwub3Blbihsb2NrRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSwgQVBQRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWxlRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmFjZSBjb25kaXRpb24gLSByZXRyeSBvbmNlLCBhbmQgaWYgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlscyBhZ2FpbiBqdXN0IHRyeSB0aGUgbmV4dCBuYW1lIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIG1heSBub3QgYmUgd3JpdGFibGUgZm9yIHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdGhlIG5leHQgbmFtZSBpbiB0aGUgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IGNoYW5uZWwgc2hvdWxkIHN0aWxsIGJlIG51bGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJlYWsgYW5kIHRyeSB0aGUgbmV4dCBuYW1lIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmIChjaGFubmVsID09IG51bGwpIGNvbnRpbnVlOyAvLyB0cnkgdGhlIG5leHQgbmFtZTsKKyAgICAgICAgICAgICAgICBsb2NrRmlsZUNoYW5uZWwgPSBjaGFubmVsOworCiAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdmFpbGFibGU7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gbG9ja0ZpbGVDaGFubmVsLnRyeUxvY2soKSAhPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAvLyBXZSBnb3QgdGhlIGxvY2sgT0suCisgICAgICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgY291bGQgY2FsbCBGaWxlLmRlbGV0ZU9uRXhpdCgpLgorICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGlzIGNvdWxkIGhhdmUgdW5kZXNpcmFibGUgc2lkZSBlZmZlY3RzCisgICAgICAgICAgICAgICAgICAgIC8vIGFzIGluZGljYXRlZCBieSBKREstNDg3MjAxNC4gU28gd2Ugd2lsbCBpbnN0ZWFkCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBjbG9zZSgpIHdpbGwgcmVtb3ZlIHRoZSBsb2NrCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgYW5kIHRoYXQgd2hvZXZlciBpcyBjcmVhdGluZyBGaWxlSGFuZGxlcnMgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZW0uCiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaXgpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ290IGFuIElPRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBnZXQgdGhlIGxvY2suCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9ybWFsbHkgaW5kaWNhdGVzIHRoYXQgbG9ja2luZyBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHRoZSB0YXJnZXQgZGlyZWN0b3J5LiAgV2UgaGF2ZSB0byBwcm9jZWVkIHdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0dGluZyBhIGxvY2suICAgRHJvcCB0aHJvdWdoLgotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvLyBnZXR0aW5nIGEgbG9jay4gICBEcm9wIHRocm91Z2gsIGJ1dCBvbmx5IGlmIHdlIGRpZAorICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGZpbGUuLi4KKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gZmlsZUNyZWF0ZWQ7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWVvbmUgYWxyZWFkeSBsb2NrZWQgdGhpcyBmaWxlIGluIHRoaXMgVk0sIHRocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBvdGhlciBjaGFubmVsIC0gdGhhdCBpcyAtIHVzaW5nIHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gbmV3IEZpbGVIYW5kbGVyKC4uLik7CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgYW4gYXZhaWxhYmxlIGxvY2suCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdvdCB0aGUgbG9jay4gIFJlbWVtYmVyIGl0LgotICAgICAgICAgICAgICAgICAgICBsb2Nrcy5wdXQobG9ja0ZpbGVOYW1lLCBsb2NrRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBsb2Nrcy5hZGQobG9ja0ZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL0ZvckVhY2hPcHMuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vRm9yRWFjaE9wcy5qYXZhCmluZGV4IDJjMzQzZmIuLmI1MjdmMDUgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vRm9yRWFjaE9wcy5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vRm9yRWFjaE9wcy5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Eb3VibGVDb25zdW1lcjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uSW50Q29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkludEZ1bmN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nQ29uc3VtZXI7CiAKIC8qKgpAQCAtMzE3LDEyICszMTgsNTUgQEAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKICAgICBzdGF0aWMgZmluYWwgY2xhc3MgRm9yRWFjaE9yZGVyZWRUYXNrPFMsIFQ+IGV4dGVuZHMgQ291bnRlZENvbXBsZXRlcjxWb2lkPiB7CisgICAgICAgIC8qCisgICAgICAgICAqIE91ciBnb2FsIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYSB0YXNrIGFyZQorICAgICAgICAgKiBwcm9jZXNzZWQgYWNjb3JkaW5nIHRvIGFuIGluLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgY29tcHV0YXRpb24gdHJlZS4KKyAgICAgICAgICogV2UgdXNlIGNvbXBsZXRpb24gY291bnRzIGZvciByZXByZXNlbnRpbmcgdGhlc2UgZGVwZW5kZW5jaWVzLCBzbyB0aGF0CisgICAgICAgICAqIGEgdGFzayBkb2VzIG5vdCBjb21wbGV0ZSB1bnRpbCBhbGwgdGhlIHRhc2tzIHByZWNlZGluZyBpdCBpbiB0aGlzCisgICAgICAgICAqIG9yZGVyIGNvbXBsZXRlLiAgV2UgdXNlIHRoZSAiY29tcGxldGlvbiBtYXAiIHRvIGFzc29jaWF0ZSB0aGUgbmV4dAorICAgICAgICAgKiB0YXNrIGluIHRoaXMgb3JkZXIgZm9yIGFueSBsZWZ0IGNoaWxkLiAgV2UgaW5jcmVhc2UgdGhlIHBlbmRpbmcgY291bnQKKyAgICAgICAgICogb2YgYW55IG5vZGUgb24gdGhlIHJpZ2h0IHNpZGUgb2Ygc3VjaCBhIG1hcHBpbmcgYnkgb25lIHRvIGluZGljYXRlCisgICAgICAgICAqIGl0cyBkZXBlbmRlbmN5LCBhbmQgd2hlbiBhIG5vZGUgb24gdGhlIGxlZnQgc2lkZSBvZiBzdWNoIGEgbWFwcGluZworICAgICAgICAgKiBjb21wbGV0ZXMsIGl0IGRlY3JlbWVudHMgdGhlIHBlbmRpbmcgY291bnQgb2YgaXRzIGNvcnJlc3BvbmRpbmcgcmlnaHQKKyAgICAgICAgICogc2lkZS4gIEFzIHRoZSBjb21wdXRhdGlvbiB0cmVlIGlzIGV4cGFuZGVkIGJ5IHNwbGl0dGluZywgd2UgbXVzdAorICAgICAgICAgKiBhdG9taWNhbGx5IHVwZGF0ZSB0aGUgbWFwcGluZ3MgdG8gbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IHRoZQorICAgICAgICAgKiBjb21wbGV0aW9uIG1hcCBtYXBzIGxlZnQgY2hpbGRyZW4gdG8gdGhlIG5leHQgbm9kZSBpbiB0aGUgaW4tb3JkZXIKKyAgICAgICAgICogdHJhdmVyc2FsLgorICAgICAgICAgKgorICAgICAgICAgKiBUYWtlLCBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb21wdXRhdGlvbiB0cmVlIG9mIHRhc2tzOgorICAgICAgICAgKgorICAgICAgICAgKiAgICAgICBhCisgICAgICAgICAqICAgICAgLyBcCisgICAgICAgICAqICAgICBiICAgYworICAgICAgICAgKiAgICAvIFwgLyBcCisgICAgICAgICAqICAgZCAgZSBmICBnCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBjb21wbGV0ZSBtYXAgd2lsbCBjb250YWluIChub3QgbmVjZXNzYXJpbHkgYWxsIGF0IHRoZSBzYW1lIHRpbWUpCisgICAgICAgICAqIHRoZSBmb2xsb3dpbmcgYXNzb2NpYXRpb25zOgorICAgICAgICAgKgorICAgICAgICAgKiAgIGQgLT4gZQorICAgICAgICAgKiAgIGIgLT4gZgorICAgICAgICAgKiAgIGYgLT4gZworICAgICAgICAgKgorICAgICAgICAgKiBUYXNrcyBlLCBmLCBnIHdpbGwgaGF2ZSB0aGVpciBwZW5kaW5nIGNvdW50cyBpbmNyZWFzZWQgYnkgMS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyByZWxhdGlvbnNoaXBzIGhvbGQ6CisgICAgICAgICAqCisgICAgICAgICAqICAgLSBjb21wbGV0aW9uIG9mIGQgImhhcHBlbnMtYmVmb3JlIiBlOworICAgICAgICAgKiAgIC0gY29tcGxldGlvbiBvZiBkIGFuZCBlICJoYXBwZW5zLWJlZm9yZSBiOworICAgICAgICAgKiAgIC0gY29tcGxldGlvbiBvZiBiICJoYXBwZW5zLWJlZm9yZSIgZjsgYW5kCisgICAgICAgICAqICAgLSBjb21wbGV0aW9uIG9mIGYgImhhcHBlbnMtYmVmb3JlIiBnCisgICAgICAgICAqCisgICAgICAgICAqIFRodXMgb3ZlcmFsbCB0aGUgImhhcHBlbnMtYmVmb3JlIiByZWxhdGlvbnNoaXAgaG9sZHMgZm9yIHRoZQorICAgICAgICAgKiByZXBvcnRpbmcgb2YgZWxlbWVudHMsIGNvdmVyZWQgYnkgdGFza3MgZCwgZSwgZiBhbmQgZywgYXMgc3BlY2lmaWVkCisgICAgICAgICAqIGJ5IHRoZSBmb3JFYWNoT3JkZXJlZCBvcGVyYXRpb24uCisgICAgICAgICAqLworCiAgICAgICAgIHByaXZhdGUgZmluYWwgUGlwZWxpbmVIZWxwZXI8VD4gaGVscGVyOwogICAgICAgICBwcml2YXRlIFNwbGl0ZXJhdG9yPFM+IHNwbGl0ZXJhdG9yOwogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgdGFyZ2V0U2l6ZTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxGb3JFYWNoT3JkZXJlZFRhc2s8UywgVD4sIEZvckVhY2hPcmRlcmVkVGFzazxTLCBUPj4gY29tcGxldGlvbk1hcDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTaW5rPFQ+IGFjdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbG9jazsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBGb3JFYWNoT3JkZXJlZFRhc2s8UywgVD4gbGVmdFByZWRlY2Vzc29yOwogICAgICAgICBwcml2YXRlIE5vZGU8VD4gbm9kZTsKIApAQCAtMzMzLDkgKzM3Nyw5IEBACiAgICAgICAgICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKICAgICAgICAgICAgIHRoaXMuc3BsaXRlcmF0b3IgPSBzcGxpdGVyYXRvcjsKICAgICAgICAgICAgIHRoaXMudGFyZ2V0U2l6ZSA9IEFic3RyYWN0VGFzay5zdWdnZXN0VGFyZ2V0U2l6ZShzcGxpdGVyYXRvci5lc3RpbWF0ZVNpemUoKSk7Ci0gICAgICAgICAgICB0aGlzLmNvbXBsZXRpb25NYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgICAgICAgICAgLy8gU2l6ZSBtYXAgdG8gYXZvaWQgY29uY3VycmVudCByZS1zaXplcworICAgICAgICAgICAgdGhpcy5jb21wbGV0aW9uTWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oTWF0aC5tYXgoMTYsIEFic3RyYWN0VGFzay5MRUFGX1RBUkdFVCA8PCAxKSk7CiAgICAgICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgICAgIHRoaXMubG9jayA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgICAgIHRoaXMubGVmdFByZWRlY2Vzc29yID0gbnVsbDsKICAgICAgICAgfQogCkBAIC0zNDgsNyArMzkyLDYgQEAKICAgICAgICAgICAgIHRoaXMudGFyZ2V0U2l6ZSA9IHBhcmVudC50YXJnZXRTaXplOwogICAgICAgICAgICAgdGhpcy5jb21wbGV0aW9uTWFwID0gcGFyZW50LmNvbXBsZXRpb25NYXA7CiAgICAgICAgICAgICB0aGlzLmFjdGlvbiA9IHBhcmVudC5hY3Rpb247Ci0gICAgICAgICAgICB0aGlzLmxvY2sgPSBwYXJlbnQubG9jazsKICAgICAgICAgICAgIHRoaXMubGVmdFByZWRlY2Vzc29yID0gbGVmdFByZWRlY2Vzc29yOwogICAgICAgICB9CiAKQEAgLTM2NywxNiArNDEwLDQyIEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JFYWNoT3JkZXJlZFRhc2s8Pih0YXNrLCBsZWZ0U3BsaXQsIHRhc2subGVmdFByZWRlY2Vzc29yKTsKICAgICAgICAgICAgICAgICBGb3JFYWNoT3JkZXJlZFRhc2s8UywgVD4gcmlnaHRDaGlsZCA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JFYWNoT3JkZXJlZFRhc2s8Pih0YXNrLCByaWdodFNwbGl0LCBsZWZ0Q2hpbGQpOworCisgICAgICAgICAgICAgICAgLy8gRm9yayB0aGUgcGFyZW50IHRhc2sKKyAgICAgICAgICAgICAgICAvLyBDb21wbGV0aW9uIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBjaGlsZHJlbiAiaGFwcGVucy1iZWZvcmUiCisgICAgICAgICAgICAgICAgLy8gY29tcGxldGlvbiBvZiB0aGUgcGFyZW50CisgICAgICAgICAgICAgICAgdGFzay5hZGRUb1BlbmRpbmdDb3VudCgxKTsKKyAgICAgICAgICAgICAgICAvLyBDb21wbGV0aW9uIG9mIHRoZSBsZWZ0IGNoaWxkICJoYXBwZW5zLWJlZm9yZSIgY29tcGxldGlvbiBvZgorICAgICAgICAgICAgICAgIC8vIHRoZSByaWdodCBjaGlsZAorICAgICAgICAgICAgICAgIHJpZ2h0Q2hpbGQuYWRkVG9QZW5kaW5nQ291bnQoMSk7CiAgICAgICAgICAgICAgICAgdGFzay5jb21wbGV0aW9uTWFwLnB1dChsZWZ0Q2hpbGQsIHJpZ2h0Q2hpbGQpOwotICAgICAgICAgICAgICAgIHRhc2suYWRkVG9QZW5kaW5nQ291bnQoMSk7IC8vIGZvcmtpbmcKLSAgICAgICAgICAgICAgICByaWdodENoaWxkLmFkZFRvUGVuZGluZ0NvdW50KDEpOyAvLyByaWdodCBwZW5kaW5nIG9uIGxlZnQgY2hpbGQKKworICAgICAgICAgICAgICAgIC8vIElmIHRhc2sgaXMgbm90IG9uIHRoZSBsZWZ0IHNwaW5lCiAgICAgICAgICAgICAgICAgaWYgKHRhc2subGVmdFByZWRlY2Vzc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdENoaWxkLmFkZFRvUGVuZGluZ0NvdW50KDEpOyAvLyBsZWZ0IHBlbmRpbmcgb24gcHJldmlvdXMgc3VidHJlZSwgZXhjZXB0IGxlZnQgc3BpbmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suY29tcGxldGlvbk1hcC5yZXBsYWNlKHRhc2subGVmdFByZWRlY2Vzc29yLCB0YXNrLCBsZWZ0Q2hpbGQpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5hZGRUb1BlbmRpbmdDb3VudCgtMSk7IC8vIHRyYW5zZmVyIG15ICJyaWdodCBjaGlsZCIgY291bnQgdG8gbXkgbGVmdCBjaGlsZAotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Q2hpbGQuYWRkVG9QZW5kaW5nQ291bnQoLTEpOyAvLyBsZWZ0IGNoaWxkIGlzIHJlYWR5IHRvIGdvIHdoZW4gcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogQ29tcGxldGlvbiBvZiBsZWZ0LXByZWRlY2Vzc29yLCBvciBsZWZ0IHN1YnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAqICJoYXBwZW5zLWJlZm9yZSIgY29tcGxldGlvbiBvZiBsZWZ0LW1vc3QgbGVhZiBub2RlIG9mCisgICAgICAgICAgICAgICAgICAgICAqIHJpZ2h0IHN1YnRyZWUuCisgICAgICAgICAgICAgICAgICAgICAqIFRoZSBsZWZ0IGNoaWxkJ3MgcGVuZGluZyBjb3VudCBuZWVkcyB0byBiZSB1cGRhdGVkIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgKiBpdCBpcyBhc3NvY2lhdGVkIGluIHRoZSBjb21wbGV0aW9uIG1hcCwgb3RoZXJ3aXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBsZWZ0IGNoaWxkIGNhbiBjb21wbGV0ZSBwcmVtYXR1cmVseSBhbmQgdmlvbGF0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogImhhcHBlbnMtYmVmb3JlIiBjb25zdHJhaW50LgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbGVmdENoaWxkLmFkZFRvUGVuZGluZ0NvdW50KDEpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYXNzb2NpYXRpb24gb2YgbGVmdC1wcmVkZWNlc3NvciB0byBsZWZ0LW1vc3QKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhZiBub2RlIG9mIHJpZ2h0IHN1YnRyZWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suY29tcGxldGlvbk1hcC5yZXBsYWNlKHRhc2subGVmdFByZWRlY2Vzc29yLCB0YXNrLCBsZWZ0Q2hpbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiByZXBsYWNlZCwgYWRqdXN0IHRoZSBwZW5kaW5nIGNvdW50IG9mIHRoZSBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbXBsZXRlIHdoZW4gaXRzIGNoaWxkcmVuIGNvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmFkZFRvUGVuZGluZ0NvdW50KC0xKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZnQtcHJlZGVjZXNzb3IgaGFzIGFscmVhZHkgY29tcGxldGVkLCBwYXJlbnQncworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZyBjb3VudCBpcyBhZGp1c3RlZCBieSBsZWZ0LXByZWRlY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVmdCBjaGlsZCBpcyByZWFkeSB0byBjb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdENoaWxkLmFkZFRvUGVuZGluZ0NvdW50KC0xKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIEZvckVhY2hPcmRlcmVkVGFzazxTLCBUPiB0YXNrVG9Gb3JrOwogICAgICAgICAgICAgICAgIGlmIChmb3JrUmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9ya1JpZ2h0ID0gZmFsc2U7CkBAIC0zOTEsMzEgKzQ2MCw0OSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0YXNrVG9Gb3JrLmZvcmsoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0YXNrLmdldFBlbmRpbmdDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICB0YXNrLmhlbHBlci53cmFwQW5kQ29weUludG8odGFzay5hY3Rpb24sIHJpZ2h0U3BsaXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUYXNrJ3MgcGVuZGluZyBjb3VudCBpcyBlaXRoZXIgMCBvciAxLiAgSWYgMSB0aGVuIHRoZSBjb21wbGV0aW9uCisgICAgICAgICAgICAgKiBtYXAgd2lsbCBjb250YWluIGEgdmFsdWUgdGhhdCBpcyB0YXNrLCBhbmQgdHdvIGNhbGxzIHRvCisgICAgICAgICAgICAgKiB0cnlDb21wbGV0ZSBhcmUgcmVxdWlyZWQgZm9yIGNvbXBsZXRpb24sIG9uZSBiZWxvdyBhbmQgb25lCisgICAgICAgICAgICAgKiB0cmlnZ2VyZWQgYnkgdGhlIGNvbXBsZXRpb24gb2YgdGFzaydzIGxlZnQtcHJlZGVjZXNzb3IgaW4KKyAgICAgICAgICAgICAqIG9uQ29tcGxldGlvbi4gIFRoZXJlZm9yZSB0aGVyZSBpcyBubyBkYXRhIHJhY2Ugd2l0aGluIHRoZSBpZgorICAgICAgICAgICAgICogYmxvY2suCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0YXNrLmdldFBlbmRpbmdDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIC8vIENhbm5vdCBjb21wbGV0ZSBqdXN0IHlldCBzbyBidWZmZXIgZWxlbWVudHMgaW50byBhIE5vZGUKKyAgICAgICAgICAgICAgICAvLyBmb3IgdXNlIHdoZW4gY29tcGxldGlvbiBvY2N1cnMKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgICAgICBJbnRGdW5jdGlvbjxUW10+IGdlbmVyYXRvciA9IHNpemUgLT4gKFRbXSkgbmV3IE9iamVjdFtzaXplXTsKICAgICAgICAgICAgICAgICBOb2RlLkJ1aWxkZXI8VD4gbmIgPSB0YXNrLmhlbHBlci5tYWtlTm9kZUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICB0YXNrLmhlbHBlci5leGFjdE91dHB1dFNpemVJZktub3duKHJpZ2h0U3BsaXQpLAotICAgICAgICAgICAgICAgICAgc2l6ZSAtPiAoVFtdKSBuZXcgT2JqZWN0W3NpemVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaGVscGVyLmV4YWN0T3V0cHV0U2l6ZUlmS25vd24ocmlnaHRTcGxpdCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IpOwogICAgICAgICAgICAgICAgIHRhc2subm9kZSA9IHRhc2suaGVscGVyLndyYXBBbmRDb3B5SW50byhuYiwgcmlnaHRTcGxpdCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB0YXNrLnNwbGl0ZXJhdG9yID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRhc2sudHJ5Q29tcGxldGUoKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRpb24oQ291bnRlZENvbXBsZXRlcjw/PiBjYWxsZXIpIHsKLSAgICAgICAgICAgIHNwbGl0ZXJhdG9yID0gbnVsbDsKICAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBEdW1wIGFueSBkYXRhIGZyb20gdGhpcyBsZWFmIGludG8gdGhlIHNpbmsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5mb3JFYWNoKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIER1bXAgYnVmZmVyZWQgZWxlbWVudHMgZnJvbSB0aGlzIGxlYWYgaW50byB0aGUgc2luaworICAgICAgICAgICAgICAgIG5vZGUuZm9yRWFjaChhY3Rpb24pOwogICAgICAgICAgICAgICAgIG5vZGUgPSBudWxsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRm9yRWFjaE9yZGVyZWRUYXNrPFMsIFQ+IHZpY3RpbSA9IGNvbXBsZXRpb25NYXAucmVtb3ZlKHRoaXMpOwotICAgICAgICAgICAgaWYgKHZpY3RpbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHZpY3RpbS50cnlDb21wbGV0ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoc3BsaXRlcmF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIER1bXAgZWxlbWVudHMgb3V0cHV0IGZyb20gdGhpcyBsZWFmJ3MgcGlwZWxpbmUgaW50byB0aGUgc2luaworICAgICAgICAgICAgICAgIGhlbHBlci53cmFwQW5kQ29weUludG8oYWN0aW9uLCBzcGxpdGVyYXRvcik7CisgICAgICAgICAgICAgICAgc3BsaXRlcmF0b3IgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgY29tcGxldGlvbiBvZiB0aGlzIHRhc2sgKmFuZCogdGhlIGR1bXBpbmcgb2YgZWxlbWVudHMKKyAgICAgICAgICAgIC8vICJoYXBwZW5zLWJlZm9yZSIgY29tcGxldGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBsZWZ0LW1vc3QgbGVhZiB0YXNrCisgICAgICAgICAgICAvLyBvZiByaWdodCBzdWJ0cmVlIChpZiBhbnksIHdoaWNoIGNhbiBiZSB0aGlzIHRhc2sncyByaWdodCBzaWJsaW5nKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEZvckVhY2hPcmRlcmVkVGFzazxTLCBUPiBsZWZ0RGVzY2VuZGFudCA9IGNvbXBsZXRpb25NYXAucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgaWYgKGxlZnREZXNjZW5kYW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgbGVmdERlc2NlbmRhbnQudHJ5Q29tcGxldGUoKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vTm9kZXMuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vTm9kZXMuamF2YQppbmRleCBkNjliOWY2Li5jMTg1NDBjIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL05vZGVzLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3N0cmVhbS9Ob2Rlcy5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAgICAgLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG1lc3NhZ2VzCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBCQURfU0laRSA9ICJTdHJlYW0gc2l6ZSBleGNlZWRzIG1heCBhcnJheSBzaXplIjsKIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXciKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9kZSBFTVBUWV9OT0RFID0gbmV3IEVtcHR5Tm9kZS5PZlJlZigpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vZGUuT2ZJbnQgRU1QVFlfSU5UX05PREUgPSBuZXcgRW1wdHlOb2RlLk9mSW50KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9kZS5PZkxvbmcgRU1QVFlfTE9OR19OT0RFID0gbmV3IEVtcHR5Tm9kZS5PZkxvbmcoKTsKQEAgLTk1Niw2ICs5NTYsNyBAQAogICAgICAgICAgKiBJbml0aWF0ZSBhIHN0YWNrIGNvbnRhaW5pbmcsIGluIGxlZnQtdG8tcmlnaHQgb3JkZXIsIHRoZSBjaGlsZCBub2RlcwogICAgICAgICAgKiBjb3ZlcmVkIGJ5IHRoaXMgc3BsaXRlcmF0b3IKICAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBwcm90ZWN0ZWQgZmluYWwgRGVxdWU8Tj4gaW5pdFN0YWNrKCkgewogICAgICAgICAgICAgLy8gQmlhcyBzaXplIHRvIHRoZSBjYXNlIHdoZXJlIGxlYWYgbm9kZXMgYXJlIGNsb3NlIHRvIHRoaXMgbm9kZQogICAgICAgICAgICAgLy8gOCBpcyB0aGUgbWluaW11bSBpbml0aWFsIGNhcGFjaXR5IGZvciB0aGUgQXJyYXlEZXF1ZSBpbXBsZW1lbnRhdGlvbgpAQCAtOTY5LDYgKzk3MCw3IEBACiAgICAgICAgICAqIERlcHRoIGZpcnN0IHNlYXJjaCwgaW4gbGVmdC10by1yaWdodCBvcmRlciwgb2YgdGhlIG5vZGUgdHJlZSwgdXNpbmcKICAgICAgICAgICogYW4gZXhwbGljaXQgc3RhY2ssIHRvIGZpbmQgdGhlIG5leHQgbm9uLWVtcHR5IGxlYWYgbm9kZS4KICAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBwcm90ZWN0ZWQgZmluYWwgTiBmaW5kTmV4dExlYWZOb2RlKERlcXVlPE4+IHN0YWNrKSB7CiAgICAgICAgICAgICBOIG4gPSBudWxsOwogICAgICAgICAgICAgd2hpbGUgKChuID0gc3RhY2sucG9sbEZpcnN0KCkpICE9IG51bGwpIHsKQEAgLTk4NCw2ICs5ODYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaW5pdFRyeUFkdmFuY2UoKSB7CiAgICAgICAgICAgICBpZiAoY3VyTm9kZSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE4NzAsNiArMTg3Myw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGFzc2VydCB0YXNrLm9mZnNldCArIHRhc2subGVuZ3RoIDwgTUFYX0FSUkFZX1NJWkU7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgICAgIFRfU0lOSyBzaW5rID0gKFRfU0lOSykgdGFzazsKICAgICAgICAgICAgIHRhc2suaGVscGVyLndyYXBBbmRDb3B5SW50byhzaW5rLCByaWdodFNwbGl0KTsKICAgICAgICAgICAgIHRhc2sucHJvcGFnYXRlQ29tcGxldGlvbigpOwpAQCAtMjE3Myw2ICsyMTc3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgcHJvdGVjdGVkIFRfTk9ERSBkb0xlYWYoKSB7CiAgICAgICAgICAgICBUX0JVSUxERVIgYnVpbGRlciA9IGJ1aWxkZXJGYWN0b3J5LmFwcGx5KGhlbHBlci5leGFjdE91dHB1dFNpemVJZktub3duKHNwbGl0ZXJhdG9yKSk7CiAgICAgICAgICAgICByZXR1cm4gKFRfTk9ERSkgaGVscGVyLndyYXBBbmRDb3B5SW50byhidWlsZGVyLCBzcGxpdGVyYXRvcikuYnVpbGQoKTsKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vU29ydGVkT3BzLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL1NvcnRlZE9wcy5qYXZhCmluZGV4IDgxMGRlMWMuLjU5MmI2MDkgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vU29ydGVkT3BzLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3N0cmVhbS9Tb3J0ZWRPcHMuamF2YQpAQCAtMjksNyArMjksNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Gb3JrSm9pblRhc2s7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkludEZ1bmN0aW9uOwogCiAKQEAgLTExMyw3ICsxMTIsOSBAQAogICAgICAgICAgICAgICAgICAgU3RyZWFtT3BGbGFnLklTX09SREVSRUQgfCBTdHJlYW1PcEZsYWcuSVNfU09SVEVEKTsKICAgICAgICAgICAgIHRoaXMuaXNOYXR1cmFsU29ydCA9IHRydWU7CiAgICAgICAgICAgICAvLyBXaWxsIHRocm93IENDRSB3aGVuIHdlIHRyeSB0byBzb3J0IGlmIFQgaXMgbm90IENvbXBhcmFibGUKLSAgICAgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IChDb21wYXJhdG9yPD8gc3VwZXIgVD4pIENvbXBhcmF0b3IubmF0dXJhbE9yZGVyKCk7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wID0gKENvbXBhcmF0b3I8PyBzdXBlciBUPikgQ29tcGFyYXRvci5uYXR1cmFsT3JkZXIoKTsKKyAgICAgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGNvbXA7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTE3MCw3ICsxNzEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaW5rPEludGVnZXI+IG9wV3JhcFNpbmsoaW50IGZsYWdzLCBTaW5rIHNpbmspIHsKKyAgICAgICAgcHVibGljIFNpbms8SW50ZWdlcj4gb3BXcmFwU2luayhpbnQgZmxhZ3MsIFNpbms8SW50ZWdlcj4gc2luaykgewogICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChzaW5rKTsKIAogICAgICAgICAgICAgaWYgKFN0cmVhbU9wRmxhZy5TT1JURUQuaXNLbm93bihmbGFncykpCkBAIC0zMzUsNiArMzM2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgcHVibGljIHZvaWQgYmVnaW4obG9uZyBzaXplKSB7CiAgICAgICAgICAgICBpZiAoc2l6ZSA+PSBOb2Rlcy5NQVhfQVJSQVlfU0laRSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5vZGVzLkJBRF9TSVpFKTsKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vU3BpbmVkQnVmZmVyLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL1NwaW5lZEJ1ZmZlci5qYXZhCmluZGV4IDg3OGIyYzIuLjE2MzY5MmMgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vU3BpbmVkQnVmZmVyLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3N0cmVhbS9TcGluZWRCdWZmZXIuamF2YQpAQCAtOTIsNiArOTIsNyBAQAogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eQogICAgICAqICAgICAgICAgaXMgbmVnYXRpdmUKICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBTcGluZWRCdWZmZXIoaW50IGluaXRpYWxDYXBhY2l0eSkgewogICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHkpOwogICAgICAgICBjdXJDaHVuayA9IChFW10pIG5ldyBPYmplY3RbMSA8PCBpbml0aWFsQ2h1bmtQb3dlcl07CkBAIC0xMDAsNiArMTAxLDcgQEAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGxpc3Qgd2l0aCBhbiBpbml0aWFsIGNhcGFjaXR5IG9mIHNpeHRlZW4uCiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgU3BpbmVkQnVmZmVyKCkgewogICAgICAgICBzdXBlcigpOwogICAgICAgICBjdXJDaHVuayA9IChFW10pIG5ldyBPYmplY3RbMSA8PCBpbml0aWFsQ2h1bmtQb3dlcl07CkBAIC0xMTQsNiArMTE2LDcgQEAKICAgICAgICAgICAgICAgIDogcHJpb3JFbGVtZW50Q291bnRbc3BpbmVJbmRleF0gKyBzcGluZVtzcGluZUluZGV4XS5sZW5ndGg7CiAgICAgfQogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHJpdmF0ZSB2b2lkIGluZmxhdGVTcGluZSgpIHsKICAgICAgICAgaWYgKHNwaW5lID09IG51bGwpIHsKICAgICAgICAgICAgIHNwaW5lID0gKEVbXVtdKSBuZXcgT2JqZWN0W01JTl9TUElORV9TSVpFXVtdOwpAQCAtMTI1LDYgKzEyOCw3IEBACiAgICAgLyoqCiAgICAgICogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYXQgbGVhc3QgY2FwYWNpdHkgdG8gaG9sZCB0aGUgdGFyZ2V0IHNpemUKICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbnN1cmVDYXBhY2l0eShsb25nIHRhcmdldFNpemUpIHsKICAgICAgICAgbG9uZyBjYXBhY2l0eSA9IGNhcGFjaXR5KCk7CiAgICAgICAgIGlmICh0YXJnZXRTaXplID4gY2FwYWNpdHkpIHsKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vU3RyZWFtU3BsaXRlcmF0b3JzLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL1N0cmVhbVNwbGl0ZXJhdG9ycy5qYXZhCmluZGV4IDczMjI3NzMuLjY3NjgzNDIgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9zdHJlYW0vU3RyZWFtU3BsaXRlcmF0b3JzLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3N0cmVhbS9TdHJlYW1TcGxpdGVyYXRvcnMuamF2YQpAQCAtNTE2LDYgKzUxNiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgICAgIHB1YmxpYyBUX1NQTElUUiB0cnlTcGxpdCgpIHsKICAgICAgICAgICAgIHJldHVybiAoVF9TUExJVFIpIGdldCgpLnRyeVNwbGl0KCk7CiAgICAgICAgIH0KQEAgLTY0Myw2ICs2NDQsNyBAQAogICAgICAgICAgICAgLy8gZXhpc3RpbmcgYW5kIGFkZGl0aW9uYWxseSBjcmVhdGVkIEYvSiB0YXNrcyB0aGF0IHBlcmZvcm0KICAgICAgICAgICAgIC8vIHJlZHVuZGFudCB3b3JrIG9uIG5vIGVsZW1lbnRzLgogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgICAgICAgICBUX1NQTElUUiBsZWZ0U3BsaXQgPSAoVF9TUExJVFIpIHMudHJ5U3BsaXQoKTsKICAgICAgICAgICAgICAgICBpZiAobGVmdFNwbGl0ID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtOTcwLDYgKzk3Miw3IEBACiAgICAgICAgICAgICAvLyBTdG9wIHNwbGl0dGluZyB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGxpbWl0IHBlcm1pdHMKICAgICAgICAgICAgIGlmIChwZXJtaXRzLmdldCgpID09IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgICAgIFRfU1BMSVRSIHNwbGl0ID0gKFRfU1BMSVRSKSBzLnRyeVNwbGl0KCk7CiAgICAgICAgICAgICByZXR1cm4gc3BsaXQgPT0gbnVsbCA/IG51bGwgOiBtYWtlU3BsaXRlcmF0b3Ioc3BsaXQpOwogICAgICAgICB9CkBAIC0xMDY4LDE2ICsxMDcxLDE4IEBACiAgICAgICAgICAgICAgICAgc3VwZXIocywgc2tpcCwgbGltaXQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBPZlByaW1pdGl2ZShUX1NQTElUUiBzLCBVbm9yZGVyZWRTbGljZVNwbGl0ZXJhdG9yLk9mUHJpbWl0aXZlIHBhcmVudCkgeworICAgICAgICAgICAgT2ZQcmltaXRpdmUoVF9TUExJVFIgcywgVW5vcmRlcmVkU2xpY2VTcGxpdGVyYXRvci5PZlByaW1pdGl2ZTxULCBUX0NPTlMsIFRfQlVGRiwgVF9TUExJVFI+IHBhcmVudCkgewogICAgICAgICAgICAgICAgIHN1cGVyKHMsIHBhcmVudCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdHJ5QWR2YW5jZShUX0NPTlMgYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChhY3Rpb24pOworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgICAgIFRfQ09OUyBjb25zdW1lciA9IChUX0NPTlMpIHRoaXM7CiAKICAgICAgICAgICAgICAgICB3aGlsZSAocGVybWl0U3RhdHVzKCkgIT0gUGVybWl0U3RhdHVzLk5PX01PUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzLnRyeUFkdmFuY2UoKFRfQ09OUykgdGhpcykpCisgICAgICAgICAgICAgICAgICAgIGlmICghcy50cnlBZHZhbmNlKGNvbnN1bWVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWNxdWlyZVBlcm1pdHMoMSkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0Q29uc3VtZWQoYWN0aW9uKTsKQEAgLTEzMTYsNyArMTMyMSw3IEBACiAgICAgICogZXN0aW1hdGUgc2l6ZSBpcyAwLgogICAgICAqCiAgICAgICogPHA+VGhlIHtAY29kZSBmb3JFYWNoUmVtYWluaW5nfSBtZXRob2QgaWYgaW52b2tlZCB3aWxsIG5ldmVyIHRlcm1pbmF0ZS4KLSAgICAgKiBUaGUge0Bjb2UgdHJ5QWR2YW5jZX0gbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRydWUuCisgICAgICogVGhlIHtAY29kZSB0cnlBZHZhbmNlfSBtZXRob2QgYWx3YXlzIHJldHVybnMgdHJ1ZS4KICAgICAgKgogICAgICAqLwogICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBJbmZpbml0ZVN1cHBseWluZ1NwbGl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgU3BsaXRlcmF0b3I8VD4gewpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3N0cmVhbS9TdHJlYW1zLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL1N0cmVhbXMuamF2YQppbmRleCA0MWYzYWRhLi4wNzI2OTFhIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL1N0cmVhbXMuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvc3RyZWFtL1N0cmVhbXMuamF2YQpAQCAtNzE1LDYgKzcxNSw3IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBUX1NQTElUUiB0cnlTcGxpdCgpIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICAgICAgVF9TUExJVFIgcmV0ID0gYmVmb3JlU3BsaXQgPyBhU3BsaXRlcmF0b3IgOiAoVF9TUExJVFIpIGJTcGxpdGVyYXRvci50cnlTcGxpdCgpOwogICAgICAgICAgICAgYmVmb3JlU3BsaXQgPSBmYWxzZTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KRGVza3RvcFBhbmUuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pEZXNrdG9wUGFuZS5qYXZhCmluZGV4IGI1OTQ1ZGQuLjBmMDVmNzkgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pEZXNrdG9wUGFuZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pEZXNrdG9wUGFuZS5qYXZhCkBAIC00Myw2ICs0Myw3IEBACiBpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eVZldG9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIC8qKgogICogQSBjb250YWluZXIgdXNlZCB0byBjcmVhdGUgYSBtdWx0aXBsZS1kb2N1bWVudCBpbnRlcmZhY2Ugb3IgYSB2aXJ0dWFsIGRlc2t0b3AuCiAgKiBZb3UgY3JlYXRlIDxjb2RlPkpJbnRlcm5hbEZyYW1lPC9jb2RlPiBvYmplY3RzIGFuZCBhZGQgdGhlbSB0byB0aGUKQEAgLTI2Niw3ICsyNjcsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxKSW50ZXJuYWxGcmFtZT4gZ2V0QWxsRnJhbWVzKENvbnRhaW5lciBwYXJlbnQpIHsKICAgICAgICAgaW50IGksIGNvdW50OwotICAgICAgICBDb2xsZWN0aW9uPEpJbnRlcm5hbEZyYW1lPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxKSW50ZXJuYWxGcmFtZT4oKTsKKyAgICAgICAgQ29sbGVjdGlvbjxKSW50ZXJuYWxGcmFtZT4gcmVzdWx0cyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKICAgICAgICAgY291bnQgPSBwYXJlbnQuZ2V0Q29tcG9uZW50Q291bnQoKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgIENvbXBvbmVudCBuZXh0ID0gcGFyZW50LmdldENvbXBvbmVudChpKTsKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pbnZva2UvdXRpbC9WYWx1ZUNvbnZlcnNpb25zLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW52b2tlL3V0aWwvVmFsdWVDb252ZXJzaW9ucy5qYXZhCmluZGV4IGUzMDk1ZmMuLjY0YjUyZjQgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pbnZva2UvdXRpbC9WYWx1ZUNvbnZlcnNpb25zLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS91dGlsL1ZhbHVlQ29udmVyc2lvbnMuamF2YQpAQCAtMjksMzggKzI5LDM0IEBACiBpbXBvcnQgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVzOwogaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlcy5Mb29rdXA7CiBpbXBvcnQgamF2YS5sYW5nLmludm9rZS5NZXRob2RUeXBlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogcHVibGljIGNsYXNzIFZhbHVlQ29udmVyc2lvbnMgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IFRISVNfQ0xBU1MgPSBWYWx1ZUNvbnZlcnNpb25zLmNsYXNzOwotICAgIC8vIERvIG5vdCBhZGp1c3QgdGhpcyBleGNlcHQgZm9yIHNwZWNpYWwgcGxhdGZvcm1zOgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVJJVFk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgZmluYWwgT2JqZWN0W10gdmFsdWVzID0geyAyNTUgfTsKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Vm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIFZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBJbnRlZ2VyLmdldEludGVnZXIoVEhJU19DTEFTUy5nZXROYW1lKCkrIi5NQVhfQVJJVFkiLCAyNTUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgTUFYX0FSSVRZID0gKEludGVnZXIpIHZhbHVlc1swXTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb29rdXAgSU1QTF9MT09LVVAgPSBNZXRob2RIYW5kbGVzLmxvb2t1cCgpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+W10gbmV3V3JhcHBlckNhY2hlcyhpbnQgbikgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgIC8vIGdlbmVyaWMgYXJyYXkgY3JlYXRpb24KLSAgICAgICAgRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+W10gY2FjaGVzCi0gICAgICAgICAgICAgICAgPSAoRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+W10pIG5ldyBFbnVtTWFwPD8sPz5bbl07CisgICAgLyoqIFRocmVhZC1zYWZlIGNhbm9uaWNhbGl6ZWQgbWFwcGluZyBmcm9tIFdyYXBwZXIgdG8gTWV0aG9kSGFuZGxlCisgICAgICogd2l0aCB1bnN5bmNocm9uaXplZCByZWFkcyBhbmQgc3luY2hyb25pemVkIHdyaXRlcy4KKyAgICAgKiBJdCdzIHNhZmUgdG8gcHVibGlzaCBNZXRob2RIYW5kbGVzIGJ5IGRhdGEgcmFjZSBiZWNhdXNlIHRoZXkgYXJlIGltbXV0YWJsZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXcmFwcGVyQ2FjaGUgeworICAgICAgICAvKiogRW51bU1hcCB1c2VzIHByZWNvbnN0cnVjdGVkIGFycmF5IGludGVybmFsbHksIHdoaWNoIGlzIGNvbnN0YW50IGR1cmluZyBpdCdzIGxpZmV0aW1lLiAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEVudW1NYXA8V3JhcHBlciwgTWV0aG9kSGFuZGxlPiBtYXAgPSBuZXcgRW51bU1hcDw+KFdyYXBwZXIuY2xhc3MpOworCisgICAgICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgZ2V0KFdyYXBwZXIgdykgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5nZXQodyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBNZXRob2RIYW5kbGUgcHV0KGZpbmFsIFdyYXBwZXIgdywgZmluYWwgTWV0aG9kSGFuZGxlIG1oKSB7CisgICAgICAgICAgICAvLyBTaW11bGF0ZSBDQVMgdG8gYXZvaWQgcmFjeSBkdXBsaWNhdGlvbgorICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHByZXYgPSBtYXAucHV0SWZBYnNlbnQodywgbWgpOworICAgICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkgIHJldHVybiBwcmV2OworICAgICAgICAgICAgcmV0dXJuIG1oOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgV3JhcHBlckNhY2hlW10gbmV3V3JhcHBlckNhY2hlcyhpbnQgbikgeworICAgICAgICBXcmFwcGVyQ2FjaGVbXSBjYWNoZXMgPSBuZXcgV3JhcHBlckNhY2hlW25dOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKLSAgICAgICAgICAgIGNhY2hlc1tpXSA9IG5ldyBFbnVtTWFwPD4oV3JhcHBlci5jbGFzcyk7CisgICAgICAgICAgICBjYWNoZXNbaV0gPSBuZXcgV3JhcHBlckNhY2hlKCk7CiAgICAgICAgIHJldHVybiBjYWNoZXM7CiAgICAgfQogCkBAIC03MSw2MyArNjcsOTIgQEAKICAgICAvLyAgIGltcGxpY2l0IGNvbnZlcnNpb25zIHNhbmN0aW9uZWQgYnkgSkxTIDUuMS4yLCBldGMuCiAgICAgLy8gICBleHBsaWNpdCBjb252ZXJzaW9ucyBhcyBhbGxvd2VkIGJ5IGV4cGxpY2l0Q2FzdEFyZ3VtZW50cwogCisgICAgc3RhdGljIGludCB1bmJveEludGVnZXIoSW50ZWdlciB4KSB7CisgICAgICAgIHJldHVybiB4OworICAgIH0KICAgICBzdGF0aWMgaW50IHVuYm94SW50ZWdlcihPYmplY3QgeCwgYm9vbGVhbiBjYXN0KSB7CiAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHgpLmludFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gKEludGVnZXIpIHg7CiAgICAgICAgIHJldHVybiBwcmltaXRpdmVDb252ZXJzaW9uKFdyYXBwZXIuSU5ULCB4LCBjYXN0KS5pbnRWYWx1ZSgpOwogICAgIH0KIAorICAgIHN0YXRpYyBieXRlIHVuYm94Qnl0ZShCeXRlIHgpIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQogICAgIHN0YXRpYyBieXRlIHVuYm94Qnl0ZShPYmplY3QgeCwgYm9vbGVhbiBjYXN0KSB7CiAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQnl0ZSkKLSAgICAgICAgICAgIHJldHVybiAoKEJ5dGUpIHgpLmJ5dGVWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIChCeXRlKSB4OwogICAgICAgICByZXR1cm4gcHJpbWl0aXZlQ29udmVyc2lvbihXcmFwcGVyLkJZVEUsIHgsIGNhc3QpLmJ5dGVWYWx1ZSgpOwogICAgIH0KIAorICAgIHN0YXRpYyBzaG9ydCB1bmJveFNob3J0KFNob3J0IHgpIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQogICAgIHN0YXRpYyBzaG9ydCB1bmJveFNob3J0KE9iamVjdCB4LCBib29sZWFuIGNhc3QpIHsKICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBTaG9ydCkKLSAgICAgICAgICAgIHJldHVybiAoKFNob3J0KSB4KS5zaG9ydFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gKFNob3J0KSB4OwogICAgICAgICByZXR1cm4gcHJpbWl0aXZlQ29udmVyc2lvbihXcmFwcGVyLlNIT1JULCB4LCBjYXN0KS5zaG9ydFZhbHVlKCk7CiAgICAgfQogCisgICAgc3RhdGljIGJvb2xlYW4gdW5ib3hCb29sZWFuKEJvb2xlYW4geCkgeworICAgICAgICByZXR1cm4geDsKKyAgICB9CiAgICAgc3RhdGljIGJvb2xlYW4gdW5ib3hCb29sZWFuKE9iamVjdCB4LCBib29sZWFuIGNhc3QpIHsKICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBCb29sZWFuKQotICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgeCkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIHg7CiAgICAgICAgIHJldHVybiAocHJpbWl0aXZlQ29udmVyc2lvbihXcmFwcGVyLkJPT0xFQU4sIHgsIGNhc3QpLmludFZhbHVlKCkgJiAxKSAhPSAwOwogICAgIH0KIAorICAgIHN0YXRpYyBjaGFyIHVuYm94Q2hhcmFjdGVyKENoYXJhY3RlciB4KSB7CisgICAgICAgIHJldHVybiB4OworICAgIH0KICAgICBzdGF0aWMgY2hhciB1bmJveENoYXJhY3RlcihPYmplY3QgeCwgYm9vbGVhbiBjYXN0KSB7CiAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotICAgICAgICAgICAgcmV0dXJuICgoQ2hhcmFjdGVyKSB4KS5jaGFyVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiAoQ2hhcmFjdGVyKSB4OwogICAgICAgICByZXR1cm4gKGNoYXIpIHByaW1pdGl2ZUNvbnZlcnNpb24oV3JhcHBlci5DSEFSLCB4LCBjYXN0KS5pbnRWYWx1ZSgpOwogICAgIH0KIAorICAgIHN0YXRpYyBsb25nIHVuYm94TG9uZyhMb25nIHgpIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQogICAgIHN0YXRpYyBsb25nIHVuYm94TG9uZyhPYmplY3QgeCwgYm9vbGVhbiBjYXN0KSB7CiAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHJldHVybiAoKExvbmcpIHgpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIChMb25nKSB4OwogICAgICAgICByZXR1cm4gcHJpbWl0aXZlQ29udmVyc2lvbihXcmFwcGVyLkxPTkcsIHgsIGNhc3QpLmxvbmdWYWx1ZSgpOwogICAgIH0KIAorICAgIHN0YXRpYyBmbG9hdCB1bmJveEZsb2F0KEZsb2F0IHgpIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQogICAgIHN0YXRpYyBmbG9hdCB1bmJveEZsb2F0KE9iamVjdCB4LCBib29sZWFuIGNhc3QpIHsKICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBGbG9hdCkKLSAgICAgICAgICAgIHJldHVybiAoKEZsb2F0KSB4KS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gKEZsb2F0KSB4OwogICAgICAgICByZXR1cm4gcHJpbWl0aXZlQ29udmVyc2lvbihXcmFwcGVyLkZMT0FULCB4LCBjYXN0KS5mbG9hdFZhbHVlKCk7CiAgICAgfQogCisgICAgc3RhdGljIGRvdWJsZSB1bmJveERvdWJsZShEb3VibGUgeCkgeworICAgICAgICByZXR1cm4geDsKKyAgICB9CiAgICAgc3RhdGljIGRvdWJsZSB1bmJveERvdWJsZShPYmplY3QgeCwgYm9vbGVhbiBjYXN0KSB7CiAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSB4KS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIChEb3VibGUpIHg7CiAgICAgICAgIHJldHVybiBwcmltaXRpdmVDb252ZXJzaW9uKFdyYXBwZXIuRE9VQkxFLCB4LCBjYXN0KS5kb3VibGVWYWx1ZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZFR5cGUgdW5ib3hUeXBlKFdyYXBwZXIgd3JhcCkgeworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZFR5cGUgdW5ib3hUeXBlKFdyYXBwZXIgd3JhcCwgaW50IGtpbmQpIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBNZXRob2RUeXBlLm1ldGhvZFR5cGUod3JhcC5wcmltaXRpdmVUeXBlKCksIHdyYXAud3JhcHBlclR5cGUoKSk7CiAgICAgICAgIHJldHVybiBNZXRob2RUeXBlLm1ldGhvZFR5cGUod3JhcC5wcmltaXRpdmVUeXBlKCksIE9iamVjdC5jbGFzcywgYm9vbGVhbi5jbGFzcyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+W10KLSAgICAgICAgICAgIFVOQk9YX0NPTlZFUlNJT05TID0gbmV3V3JhcHBlckNhY2hlcygyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXcmFwcGVyQ2FjaGVbXSBVTkJPWF9DT05WRVJTSU9OUyA9IG5ld1dyYXBwZXJDYWNoZXMoNCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RIYW5kbGUgdW5ib3goV3JhcHBlciB3cmFwLCBib29sZWFuIGNhc3QpIHsKLSAgICAgICAgRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+IGNhY2hlID0gVU5CT1hfQ09OVkVSU0lPTlNbKGNhc3Q/MTowKV07CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIHVuYm94KFdyYXBwZXIgd3JhcCwgaW50IGtpbmQpIHsKKyAgICAgICAgLy8ga2luZCAwIC0+IHN0cm9uZ2x5IHR5cGVkIHdpdGggTlBFCisgICAgICAgIC8vIGtpbmQgMSAtPiBzdHJvbmdseSB0eXBlZCBidXQgemVybyBmb3IgbnVsbCwKKyAgICAgICAgLy8ga2luZCAyIC0+IGFzVHlwZSBydWxlczogYWNjZXB0IG11bHRpcGxlIGJveCB0eXBlcyBidXQgb25seSB3aWRlbmluZyBjb252ZXJzaW9ucyB3aXRoIE5QRQorICAgICAgICAvLyBraW5kIDMgLT4gZXhwbGljaXRDYXN0QXJndW1lbnRzIHJ1bGVzOiBhbGxvdyBuYXJyb3dpbmcgY29udmVyc2lvbnMsIHplcm8gZm9yIG51bGwKKyAgICAgICAgV3JhcHBlckNhY2hlIGNhY2hlID0gVU5CT1hfQ09OVkVSU0lPTlNba2luZF07CiAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGNhY2hlLmdldCh3cmFwKTsKICAgICAgICAgaWYgKG1oICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBtaDsKQEAgLTEzNSw0MSArMTYwLDU5IEBACiAgICAgICAgIC8vIHNsb3cgcGF0aAogICAgICAgICBzd2l0Y2ggKHdyYXApIHsKICAgICAgICAgICAgIGNhc2UgT0JKRUNUOgotICAgICAgICAgICAgICAgIG1oID0gSURFTlRJVFk7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICAgICAgICAgIG1oID0gSUdOT1JFOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobWggIT0gbnVsbCkgewotICAgICAgICAgICAgY2FjaGUucHV0KHdyYXAsIG1oKTsKLSAgICAgICAgICAgIHJldHVybiBtaDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmJveCAiK3dyYXApOwogICAgICAgICB9CiAgICAgICAgIC8vIGxvb2sgdXAgdGhlIG1ldGhvZAogICAgICAgICBTdHJpbmcgbmFtZSA9ICJ1bmJveCIgKyB3cmFwLndyYXBwZXJTaW1wbGVOYW1lKCk7Ci0gICAgICAgIE1ldGhvZFR5cGUgdHlwZSA9IHVuYm94VHlwZSh3cmFwKTsKKyAgICAgICAgTWV0aG9kVHlwZSB0eXBlID0gdW5ib3hUeXBlKHdyYXAsIGtpbmQpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbWggPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKFRISVNfQ0xBU1MsIG5hbWUsIHR5cGUpOwogICAgICAgICB9IGNhdGNoIChSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBtaCA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1oICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1oID0gTWV0aG9kSGFuZGxlcy5pbnNlcnRBcmd1bWVudHMobWgsIDEsIGNhc3QpOwotICAgICAgICAgICAgY2FjaGUucHV0KHdyYXAsIG1oKTsKLSAgICAgICAgICAgIHJldHVybiBtaDsKKyAgICAgICAgICAgIGlmIChraW5kID4gMCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FzdCA9IChraW5kICE9IDIpOworICAgICAgICAgICAgICAgIG1oID0gTWV0aG9kSGFuZGxlcy5pbnNlcnRBcmd1bWVudHMobWgsIDEsIGNhc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGtpbmQgPT0gMSkgeyAgLy8gY2FzdGluZyBidXQgZXhhY3QgKG51bGwgLT4gemVybykKKyAgICAgICAgICAgICAgICBtaCA9IG1oLmFzVHlwZSh1bmJveFR5cGUod3JhcCwgMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlLnB1dCh3cmFwLCBtaCk7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2Fubm90IGZpbmQgdW5ib3ggYWRhcHRlciBmb3IgIiArIHdyYXAKLSAgICAgICAgICAgICAgICArIChjYXN0ID8gIiAoY2FzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICArIChraW5kIDw9IDEgPyAiIChleGFjdCkiIDoga2luZCA9PSAzID8gIiAoY2FzdCkiIDogIiIpKTsKICAgICB9CiAKKyAgICAvKiogUmV0dXJuIGFuIGV4YWN0IHVuYm94ZXIgZm9yIHRoZSBnaXZlbiBwcmltaXRpdmUgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZSB1bmJveEV4YWN0KFdyYXBwZXIgdHlwZSkgeworICAgICAgICByZXR1cm4gdW5ib3godHlwZSwgMCk7CisgICAgfQorCisgICAgLyoqIFJldHVybiBhbiBleGFjdCB1bmJveGVyIGZvciB0aGUgZ2l2ZW4gcHJpbWl0aXZlIHR5cGUsIHdpdGggb3B0aW9uYWwgbnVsbC10by16ZXJvIGNvbnZlcnNpb24uCisgICAgICogIFRoZSBib29sZWFuIHNheXMgd2hldGhlciB0byB0aHJvdyBhbiBOUEUgb24gYSBudWxsIHZhbHVlIChmYWxzZSBtZWFucyB1bmJveCBhIHplcm8pLgorICAgICAqICBUaGUgdHlwZSBvZiB0aGUgdW5ib3hlciBpcyBvZiBhIGZvcm0gbGlrZSAoSW50ZWdlcilpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgdW5ib3hFeGFjdChXcmFwcGVyIHR5cGUsIGJvb2xlYW4gdGhyb3dOUEUpIHsKKyAgICAgICAgcmV0dXJuIHVuYm94KHR5cGUsIHRocm93TlBFID8gMCA6IDEpOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gYSB3aWRlbmluZyB1bmJveGVyIGZvciB0aGUgZ2l2ZW4gcHJpbWl0aXZlIHR5cGUuCisgICAgICogIFdpZGVuIG5hcnJvd2VyIHByaW1pdGl2ZSBib3hlcyB0byB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKiAgRG8gbm90IG5hcnJvdyBhbnkgcHJpbWl0aXZlIHZhbHVlcyBvciBjb252ZXJ0IG51bGwgdG8gemVyby4KKyAgICAgKiAgVGhlIHR5cGUgb2YgdGhlIHVuYm94ZXIgaXMgb2YgYSBmb3JtIGxpa2UgKE9iamVjdClpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgdW5ib3hXaWRlbihXcmFwcGVyIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHVuYm94KHR5cGUsIDIpOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gYSBjYXN0aW5nIHVuYm94ZXIgZm9yIHRoZSBnaXZlbiBwcmltaXRpdmUgdHlwZS4KKyAgICAgKiAgV2lkZW4gb3IgbmFycm93IHByaW1pdGl2ZSB2YWx1ZXMgdG8gdGhlIGdpdmVuIHR5cGUsIG9yIGNvbnZlcnQgbnVsbCB0byB6ZXJvLCBhcyBuZWVkZWQuCisgICAgICogIFRoZSB0eXBlIG9mIHRoZSB1bmJveGVyIGlzIG9mIGEgZm9ybSBsaWtlIChPYmplY3QpaW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlIHVuYm94Q2FzdChXcmFwcGVyIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHVuYm94KHR5cGUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlIHVuYm94KENsYXNzPD8+IHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHVuYm94KFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZSh0eXBlKSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlIHVuYm94Q2FzdChDbGFzczw/PiB0eXBlKSB7Ci0gICAgICAgIHJldHVybiB1bmJveChXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUodHlwZSksIHRydWUpOworICAgICAgICByZXR1cm4gdW5ib3godHlwZSwgMyk7CiAgICAgfQogCiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgSW50ZWdlciBaRVJPX0lOVCA9IDAsIE9ORV9JTlQgPSAxOwpAQCAtMjY2LDU3ICszMDksMjYgQEAKICAgICAgICAgcmV0dXJuIE1ldGhvZFR5cGUubWV0aG9kVHlwZShib3hUeXBlLCB3cmFwLnByaW1pdGl2ZVR5cGUoKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+W10KLSAgICAgICAgICAgIEJPWF9DT05WRVJTSU9OUyA9IG5ld1dyYXBwZXJDYWNoZXMoMik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV3JhcHBlckNhY2hlW10gQk9YX0NPTlZFUlNJT05TID0gbmV3V3JhcHBlckNhY2hlcygxKTsKIAotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBib3goV3JhcHBlciB3cmFwLCBib29sZWFuIGV4YWN0KSB7Ci0gICAgICAgIEVudW1NYXA8V3JhcHBlciwgTWV0aG9kSGFuZGxlPiBjYWNoZSA9IEJPWF9DT05WRVJTSU9OU1soZXhhY3Q/MTowKV07CisgICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgYm94RXhhY3QoV3JhcHBlciB3cmFwKSB7CisgICAgICAgIFdyYXBwZXJDYWNoZSBjYWNoZSA9IEJPWF9DT05WRVJTSU9OU1swXTsKICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gY2FjaGUuZ2V0KHdyYXApOwogICAgICAgICBpZiAobWggIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG1oOwogICAgICAgICB9Ci0gICAgICAgIC8vIHNsb3cgcGF0aAotICAgICAgICBzd2l0Y2ggKHdyYXApIHsKLSAgICAgICAgICAgIGNhc2UgT0JKRUNUOgotICAgICAgICAgICAgICAgIG1oID0gSURFTlRJVFk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICAgICAgICAgIG1oID0gWkVST19PQkpFQ1Q7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1oICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlLnB1dCh3cmFwLCBtaCk7Ci0gICAgICAgICAgICByZXR1cm4gbWg7Ci0gICAgICAgIH0KICAgICAgICAgLy8gbG9vayB1cCB0aGUgbWV0aG9kCiAgICAgICAgIFN0cmluZyBuYW1lID0gImJveCIgKyB3cmFwLndyYXBwZXJTaW1wbGVOYW1lKCk7CiAgICAgICAgIE1ldGhvZFR5cGUgdHlwZSA9IGJveFR5cGUod3JhcCk7Ci0gICAgICAgIGlmIChleGFjdCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtaCA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgbmFtZSwgdHlwZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgbWggPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWggPSBib3god3JhcCwgIWV4YWN0KS5hc1R5cGUodHlwZS5lcmFzZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1oID0gSU1QTF9MT09LVVAuZmluZFN0YXRpYyhUSElTX0NMQVNTLCBuYW1lLCB0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbWggPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChtaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZS5wdXQod3JhcCwgbWgpOwotICAgICAgICAgICAgcmV0dXJuIG1oOworICAgICAgICAgICAgcmV0dXJuIGNhY2hlLnB1dCh3cmFwLCBtaCk7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2Fubm90IGZpbmQgYm94IGFkYXB0ZXIgZm9yICIKLSAgICAgICAgICAgICAgICArIHdyYXAgKyAoZXhhY3QgPyAiIChleGFjdCkiIDogIiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZSBib3goQ2xhc3M8Pz4gdHlwZSkgewotICAgICAgICBib29sZWFuIGV4YWN0ID0gZmFsc2U7Ci0gICAgICAgIC8vIGUuZy4sIGJveFNob3J0KHNob3J0KVNob3J0IGlmIGV4YWN0LAotICAgICAgICAvLyBlLmcuLCBib3hTaG9ydChzaG9ydClPYmplY3QgaWYgIWV4YWN0Ci0gICAgICAgIHJldHVybiBib3goV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKHR5cGUpLCBleGFjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgYm94KFdyYXBwZXIgdHlwZSkgewotICAgICAgICBib29sZWFuIGV4YWN0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBib3godHlwZSwgZXhhY3QpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW5ub3QgZmluZCBib3ggYWRhcHRlciBmb3IgIiArIHdyYXApOwogICAgIH0KIAogICAgIC8vLyBDb25zdGFudCBmdW5jdGlvbnMKQEAgLTM0OCwxMSArMzYwLDEwIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVudW1NYXA8V3JhcHBlciwgTWV0aG9kSGFuZGxlPltdCi0gICAgICAgICAgICBDT05TVEFOVF9GVU5DVElPTlMgPSBuZXdXcmFwcGVyQ2FjaGVzKDIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdyYXBwZXJDYWNoZVtdIENPTlNUQU5UX0ZVTkNUSU9OUyA9IG5ld1dyYXBwZXJDYWNoZXMoMik7CiAKICAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZSB6ZXJvQ29uc3RhbnRGdW5jdGlvbihXcmFwcGVyIHdyYXApIHsKLSAgICAgICAgRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+IGNhY2hlID0gQ09OU1RBTlRfRlVOQ1RJT05TWzBdOworICAgICAgICBXcmFwcGVyQ2FjaGUgY2FjaGUgPSBDT05TVEFOVF9GVU5DVElPTlNbMF07CiAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGNhY2hlLmdldCh3cmFwKTsKICAgICAgICAgaWYgKG1oICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBtaDsKQEAgLTM3MywxODQgKzM4NCwzNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChtaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZS5wdXQod3JhcCwgbWgpOwotICAgICAgICAgICAgcmV0dXJuIG1oOworICAgICAgICAgICAgcmV0dXJuIGNhY2hlLnB1dCh3cmFwLCBtaCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB1c2UgemVyb0ludCBhbmQgY2FzdCB0aGUgcmVzdWx0CiAgICAgICAgIGlmICh3cmFwLmlzU3Vid29yZE9ySW50KCkgJiYgd3JhcCAhPSBXcmFwcGVyLklOVCkgewogICAgICAgICAgICAgbWggPSBNZXRob2RIYW5kbGVzLmV4cGxpY2l0Q2FzdEFyZ3VtZW50cyh6ZXJvQ29uc3RhbnRGdW5jdGlvbihXcmFwcGVyLklOVCksIHR5cGUpOwotICAgICAgICAgICAgY2FjaGUucHV0KHdyYXAsIG1oKTsKLSAgICAgICAgICAgIHJldHVybiBtaDsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZS5wdXQod3JhcCwgbWgpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbm5vdCBmaW5kIHplcm8gY29uc3RhbnQgZm9yICIgKyB3cmFwKTsKICAgICB9CiAKLSAgICAvLy8gQ29udmVydGluZyByZWZlcmVuY2VzIHRvIHJlZmVyZW5jZXMuCi0KLSAgICAvKioKLSAgICAgKiBJZGVudGl0eSBmdW5jdGlvbi4KLSAgICAgKiBAcGFyYW0geCBhbiBhcmJpdHJhcnkgcmVmZXJlbmNlIHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgc2FtZSB2YWx1ZSB4Ci0gICAgICovCi0gICAgc3RhdGljIDxUPiBUIGlkZW50aXR5KFQgeCkgewotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgPFQ+IFRbXSBpZGVudGl0eShUW10geCkgewotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZGVudGl0eSBmdW5jdGlvbiBvbiBpbnRzLgotICAgICAqIEBwYXJhbSB4IGFuIGFyYml0cmFyeSBpbnQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIHZhbHVlIHgKLSAgICAgKi8KLSAgICBzdGF0aWMgaW50IGlkZW50aXR5KGludCB4KSB7Ci0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIHN0YXRpYyBieXRlIGlkZW50aXR5KGJ5dGUgeCkgewotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgc2hvcnQgaWRlbnRpdHkoc2hvcnQgeCkgewotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpZGVudGl0eShib29sZWFuIHgpIHsKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0gICAgc3RhdGljIGNoYXIgaWRlbnRpdHkoY2hhciB4KSB7Ci0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElkZW50aXR5IGZ1bmN0aW9uIG9uIGxvbmdzLgotICAgICAqIEBwYXJhbSB4IGFuIGFyYml0cmFyeSBsb25nIHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgc2FtZSB2YWx1ZSB4Ci0gICAgICovCi0gICAgc3RhdGljIGxvbmcgaWRlbnRpdHkobG9uZyB4KSB7Ci0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIHN0YXRpYyBmbG9hdCBpZGVudGl0eShmbG9hdCB4KSB7Ci0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIHN0YXRpYyBkb3VibGUgaWRlbnRpdHkoZG91YmxlIHgpIHsKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NDYXN0RXhjZXB0aW9uIG5ld0NsYXNzQ2FzdEV4Y2VwdGlvbihDbGFzczw/PiB0LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJDYW5ub3QgY2FzdCAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB0byAiICsgdC5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZSBJREVOVElUWSwgQ0FTVF9SRUZFUkVOQ0UsIFpFUk9fT0JKRUNULCBJR05PUkUsIEVNUFRZLAotICAgICAgICAgICAgQVJSQVlfSURFTlRJVFksIEZJTExfTkVXX1RZUEVEX0FSUkFZLCBGSUxMX05FV19BUlJBWTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgQ0FTVF9SRUZFUkVOQ0UsIElHTk9SRSwgRU1QVFk7CiAgICAgc3RhdGljIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE1ldGhvZFR5cGUgaWRUeXBlID0gTWV0aG9kVHlwZS5nZW5lcmljTWV0aG9kVHlwZSgxKTsKICAgICAgICAgICAgIE1ldGhvZFR5cGUgaWdub3JlVHlwZSA9IGlkVHlwZS5jaGFuZ2VSZXR1cm5UeXBlKHZvaWQuY2xhc3MpOwotICAgICAgICAgICAgTWV0aG9kVHlwZSB6ZXJvT2JqZWN0VHlwZSA9IE1ldGhvZFR5cGUuZ2VuZXJpY01ldGhvZFR5cGUoMCk7Ci0gICAgICAgICAgICBJREVOVElUWSA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgImlkZW50aXR5IiwgaWRUeXBlKTsKICAgICAgICAgICAgIENBU1RfUkVGRVJFTkNFID0gSU1QTF9MT09LVVAuZmluZFZpcnR1YWwoQ2xhc3MuY2xhc3MsICJjYXN0IiwgaWRUeXBlKTsKLSAgICAgICAgICAgIFpFUk9fT0JKRUNUID0gSU1QTF9MT09LVVAuZmluZFN0YXRpYyhUSElTX0NMQVNTLCAiemVyb09iamVjdCIsIHplcm9PYmplY3RUeXBlKTsKICAgICAgICAgICAgIElHTk9SRSA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgImlnbm9yZSIsIGlnbm9yZVR5cGUpOwogICAgICAgICAgICAgRU1QVFkgPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKFRISVNfQ0xBU1MsICJlbXB0eSIsIGlnbm9yZVR5cGUuZHJvcFBhcmFtZXRlclR5cGVzKDAsIDEpKTsKLSAgICAgICAgICAgIEFSUkFZX0lERU5USVRZID0gSU1QTF9MT09LVVAuZmluZFN0YXRpYyhUSElTX0NMQVNTLCAiaWRlbnRpdHkiLCBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0W10uY2xhc3MsIE9iamVjdFtdLmNsYXNzKSk7Ci0gICAgICAgICAgICBGSUxMX05FV19BUlJBWSA9IElNUExfTE9PS1VQCi0gICAgICAgICAgICAgICAgICAgIC5maW5kU3RhdGljKFRISVNfQ0xBU1MsICJmaWxsTmV3QXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0W10uY2xhc3MsIEludGVnZXIuY2xhc3MsIE9iamVjdFtdLmNsYXNzKSk7Ci0gICAgICAgICAgICBGSUxMX05FV19UWVBFRF9BUlJBWSA9IElNUExfTE9PS1VQCi0gICAgICAgICAgICAgICAgICAgIC5maW5kU3RhdGljKFRISVNfQ0xBU1MsICJmaWxsTmV3VHlwZWRBcnJheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3RbXS5jbGFzcywgT2JqZWN0W10uY2xhc3MsIEludGVnZXIuY2xhc3MsIE9iamVjdFtdLmNsYXNzKSk7CiAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoInVuY2F1Z2h0IGV4Y2VwdGlvbiIsIGV4KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFZhcmFyZ3MgbWV0aG9kcyBuZWVkIHRvIGJlIGluIGEgc2VwYXJhdGVseSBpbml0aWFsaXplZCBjbGFzcywgdG8gYXZvaWQgYm9vdHN0cmFwcGluZyBwcm9ibGVtcy4KLSAgICBzdGF0aWMgY2xhc3MgTGF6eVN0YXRpY3MgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGUgQ09QWV9BU19SRUZFUkVOQ0VfQVJSQVksIENPUFlfQVNfUFJJTUlUSVZFX0FSUkFZLCBNQUtFX0xJU1Q7Ci0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vTUFLRV9BUlJBWSA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgIm1ha2VBcnJheSIsIE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3RbXS5jbGFzcywgT2JqZWN0W10uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICBDT1BZX0FTX1JFRkVSRU5DRV9BUlJBWSA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgImNvcHlBc1JlZmVyZW5jZUFycmF5IiwgTWV0aG9kVHlwZS5tZXRob2RUeXBlKE9iamVjdFtdLmNsYXNzLCBDbGFzcy5jbGFzcywgT2JqZWN0W10uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICBDT1BZX0FTX1BSSU1JVElWRV9BUlJBWSA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgImNvcHlBc1ByaW1pdGl2ZUFycmF5IiwgTWV0aG9kVHlwZS5tZXRob2RUeXBlKE9iamVjdC5jbGFzcywgV3JhcHBlci5jbGFzcywgT2JqZWN0W10uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICBNQUtFX0xJU1QgPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKFRISVNfQ0xBU1MsICJtYWtlTGlzdCIsIE1ldGhvZFR5cGUubWV0aG9kVHlwZShMaXN0LmNsYXNzLCBPYmplY3RbXS5jbGFzcykpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoInVuY2F1Z2h0IGV4Y2VwdGlvbiIsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlIGlnbm9yZSgpIHsKKyAgICAgICAgcmV0dXJuIElHTk9SRTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnVtTWFwPFdyYXBwZXIsIE1ldGhvZEhhbmRsZT5bXSBXUkFQUEVSX0NBU1RTCi0gICAgICAgICAgICA9IG5ld1dyYXBwZXJDYWNoZXMoMSk7Ci0KLSAgICAvKiogUmV0dXJuIGEgbWV0aG9kIHRoYXQgY2FzdHMgaXRzIHNvbGUgYXJndW1lbnQgKGFuIE9iamVjdCkgdG8gdGhlIGdpdmVuIHR5cGUKLSAgICAgKiAgYW5kIHJldHVybnMgaXQgYXMgdGhlIGdpdmVuIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgY2FzdChDbGFzczw/PiB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBjYXN0KHR5cGUsIENBU1RfUkVGRVJFTkNFKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgY2FzdChDbGFzczw/PiB0eXBlLCBNZXRob2RIYW5kbGUgY2FzdFJlZmVyZW5jZSkgewotICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKSAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2Fubm90IGNhc3QgcHJpbWl0aXZlIHR5cGUgIit0eXBlKTsKLSAgICAgICAgTWV0aG9kSGFuZGxlIG1oOwotICAgICAgICBXcmFwcGVyIHdyYXAgPSBudWxsOwotICAgICAgICBFbnVtTWFwPFdyYXBwZXIsIE1ldGhvZEhhbmRsZT4gY2FjaGUgPSBudWxsOwotICAgICAgICBpZiAoV3JhcHBlci5pc1dyYXBwZXJUeXBlKHR5cGUpKSB7Ci0gICAgICAgICAgICB3cmFwID0gV3JhcHBlci5mb3JXcmFwcGVyVHlwZSh0eXBlKTsKLSAgICAgICAgICAgIGNhY2hlID0gV1JBUFBFUl9DQVNUU1swXTsKLSAgICAgICAgICAgIG1oID0gY2FjaGUuZ2V0KHdyYXApOwotICAgICAgICAgICAgaWYgKG1oICE9IG51bGwpICByZXR1cm4gbWg7Ci0gICAgICAgIH0KLSAgICAgICAgbWggPSBNZXRob2RIYW5kbGVzLmluc2VydEFyZ3VtZW50cyhjYXN0UmVmZXJlbmNlLCAwLCB0eXBlKTsKLSAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpCi0gICAgICAgICAgICBjYWNoZS5wdXQod3JhcCwgbWgpOwotICAgICAgICByZXR1cm4gbWg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgaWRlbnRpdHkoKSB7Ci0gICAgICAgIHJldHVybiBJREVOVElUWTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZSBpZGVudGl0eShDbGFzczw/PiB0eXBlKSB7Ci0gICAgICAgIGlmICghdHlwZS5pc1ByaW1pdGl2ZSgpKQotICAgICAgICAgICAgLy8gUmVmZXJlbmNlIGlkZW50aXR5IGhhcyBiZWVuIG1vdmVkIGludG8gTWV0aG9kSGFuZGxlczoKLSAgICAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVzLmlkZW50aXR5KHR5cGUpOwotICAgICAgICByZXR1cm4gaWRlbnRpdHkoV3JhcHBlci5maW5kUHJpbWl0aXZlVHlwZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgaWRlbnRpdHkoV3JhcHBlciB3cmFwKSB7Ci0gICAgICAgIEVudW1NYXA8V3JhcHBlciwgTWV0aG9kSGFuZGxlPiBjYWNoZSA9IENPTlNUQU5UX0ZVTkNUSU9OU1sxXTsKLSAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gY2FjaGUuZ2V0KHdyYXApOwotICAgICAgICBpZiAobWggIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1oOwotICAgICAgICB9Ci0gICAgICAgIC8vIHNsb3cgcGF0aAotICAgICAgICBNZXRob2RUeXBlIHR5cGUgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUod3JhcC5wcmltaXRpdmVUeXBlKCkpOwotICAgICAgICBpZiAod3JhcCAhPSBXcmFwcGVyLlZPSUQpCi0gICAgICAgICAgICB0eXBlID0gdHlwZS5hcHBlbmRQYXJhbWV0ZXJUeXBlcyh3cmFwLnByaW1pdGl2ZVR5cGUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtaCA9IElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgImlkZW50aXR5IiwgdHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIG1oID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWggPT0gbnVsbCAmJiB3cmFwID09IFdyYXBwZXIuVk9JRCkgewotICAgICAgICAgICAgbWggPSBFTVBUWTsgIC8vICMoKXt9IDogIygpdm9pZAotICAgICAgICB9Ci0gICAgICAgIGlmIChtaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZS5wdXQod3JhcCwgbWgpOwotICAgICAgICAgICAgcmV0dXJuIG1oOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1oICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlLnB1dCh3cmFwLCBtaCk7Ci0gICAgICAgICAgICByZXR1cm4gbWg7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2Fubm90IGZpbmQgaWRlbnRpdHkgZm9yICIgKyB3cmFwKTsKKyAgICAvKiogUmV0dXJuIGEgbWV0aG9kIHRoYXQgY2FzdHMgaXRzIHNlY29uZCBhcmd1bWVudCAoYW4gT2JqZWN0KSB0byB0aGUgZ2l2ZW4gdHlwZSAoYSBDbGFzcykuICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgY2FzdCgpIHsKKyAgICAgICAgcmV0dXJuIENBU1RfUkVGRVJFTkNFOwogICAgIH0KIAogICAgIC8vLyBQcmltaXRpdmUgY29udmVyc2lvbnMuCkBAIC03NTksMTEgKzYyMywxMCBAQAogICAgICAgICByZXR1cm4gKHggPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW51bU1hcDxXcmFwcGVyLCBNZXRob2RIYW5kbGU+W10KLSAgICAgICAgICAgIENPTlZFUlRfUFJJTUlUSVZFX0ZVTkNUSU9OUyA9IG5ld1dyYXBwZXJDYWNoZXMoV3JhcHBlci52YWx1ZXMoKS5sZW5ndGgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdyYXBwZXJDYWNoZVtdIENPTlZFUlRfUFJJTUlUSVZFX0ZVTkNUSU9OUyA9IG5ld1dyYXBwZXJDYWNoZXMoV3JhcHBlci52YWx1ZXMoKS5sZW5ndGgpOwogCiAgICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGUgY29udmVydFByaW1pdGl2ZShXcmFwcGVyIHdzcmMsIFdyYXBwZXIgd2RzdCkgewotICAgICAgICBFbnVtTWFwPFdyYXBwZXIsIE1ldGhvZEhhbmRsZT4gY2FjaGUgPSBDT05WRVJUX1BSSU1JVElWRV9GVU5DVElPTlNbd3NyYy5vcmRpbmFsKCldOworICAgICAgICBXcmFwcGVyQ2FjaGUgY2FjaGUgPSBDT05WRVJUX1BSSU1JVElWRV9GVU5DVElPTlNbd3NyYy5vcmRpbmFsKCldOwogICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBjYWNoZS5nZXQod2RzdCk7CiAgICAgICAgIGlmIChtaCAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbWg7CkBAIC03NzEsMTcgKzYzNCw5IEBACiAgICAgICAgIC8vIHNsb3cgcGF0aAogICAgICAgICBDbGFzczw/PiBzcmMgPSB3c3JjLnByaW1pdGl2ZVR5cGUoKTsKICAgICAgICAgQ2xhc3M8Pz4gZHN0ID0gd2RzdC5wcmltaXRpdmVUeXBlKCk7Ci0gICAgICAgIE1ldGhvZFR5cGUgdHlwZSA9IHNyYyA9PSB2b2lkLmNsYXNzID8gTWV0aG9kVHlwZS5tZXRob2RUeXBlKGRzdCkgOiBNZXRob2RUeXBlLm1ldGhvZFR5cGUoZHN0LCBzcmMpOworICAgICAgICBNZXRob2RUeXBlIHR5cGUgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUoZHN0LCBzcmMpOwogICAgICAgICBpZiAod3NyYyA9PSB3ZHN0KSB7Ci0gICAgICAgICAgICBtaCA9IGlkZW50aXR5KHNyYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAod3NyYyA9PSBXcmFwcGVyLlZPSUQpIHsKLSAgICAgICAgICAgIG1oID0gemVyb0NvbnN0YW50RnVuY3Rpb24od2RzdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAod2RzdCA9PSBXcmFwcGVyLlZPSUQpIHsKLSAgICAgICAgICAgIG1oID0gTWV0aG9kSGFuZGxlcy5kcm9wQXJndW1lbnRzKEVNUFRZLCAwLCBzcmMpOyAgLy8gRGVmZXIgYmFjayB0byBNZXRob2RIYW5kbGVzLgotICAgICAgICB9IGVsc2UgaWYgKHdzcmMgPT0gV3JhcHBlci5PQkpFQ1QpIHsKLSAgICAgICAgICAgIG1oID0gdW5ib3hDYXN0KGRzdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAod2RzdCA9PSBXcmFwcGVyLk9CSkVDVCkgewotICAgICAgICAgICAgbWggPSBib3goc3JjKTsKKyAgICAgICAgICAgIG1oID0gTWV0aG9kSGFuZGxlcy5pZGVudGl0eShzcmMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXNzZXJ0KHNyYy5pc1ByaW1pdGl2ZSgpICYmIGRzdC5pc1ByaW1pdGl2ZSgpKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC03OTIsOCArNjQ3LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobWggIT0gbnVsbCkgewogICAgICAgICAgICAgYXNzZXJ0KG1oLnR5cGUoKSA9PSB0eXBlKSA6IG1oOwotICAgICAgICAgICAgY2FjaGUucHV0KHdkc3QsIG1oKTsKLSAgICAgICAgICAgIHJldHVybiBtaDsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZS5wdXQod2RzdCwgbWgpOwogICAgICAgICB9CiAKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2Fubm90IGZpbmQgcHJpbWl0aXZlIGNvbnZlcnNpb24gZnVuY3Rpb24gZm9yICIgKwpAQCAtODA4LDM2MyArNjYyLDYgQEAKICAgICAgICAgcmV0dXJuIENoYXJhY3Rlci50b1VwcGVyQ2FzZSh4LmNoYXJBdCgwKSkreC5zdWJzdHJpbmcoMSk7CiAgICAgfQogCi0gICAgLy8vIENvbGxlY3Rpb24gb2YgbXVsdGlwbGUgYXJndW1lbnRzLgotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydEFycmF5RWxlbWVudHMoQ2xhc3M8Pz4gYXJyYXlUeXBlLCBPYmplY3QgYXJyYXkpIHsKLSAgICAgICAgQ2xhc3M8Pz4gc3JjID0gYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgIENsYXNzPD8+IGRzdCA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgIGlmIChzcmMgPT0gbnVsbCB8fCBkc3QgPT0gbnVsbCkgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdCBhcnJheSB0eXBlIik7Ci0gICAgICAgIFdyYXBwZXIgc3cgPSAoc3JjLmlzUHJpbWl0aXZlKCkgPyBXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUoc3JjKSA6IG51bGwpOwotICAgICAgICBXcmFwcGVyIGR3ID0gKGRzdC5pc1ByaW1pdGl2ZSgpID8gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKGRzdCkgOiBudWxsKTsKLSAgICAgICAgaW50IGxlbmd0aDsKLSAgICAgICAgaWYgKHN3ID09IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdFtdIGEgPSAoT2JqZWN0W10pIGFycmF5OwotICAgICAgICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7Ci0gICAgICAgICAgICBpZiAoZHcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZihhLCBsZW5ndGgsIGFycmF5VHlwZS5hc1N1YmNsYXNzKE9iamVjdFtdLmNsYXNzKSk7Ci0gICAgICAgICAgICBPYmplY3QgcmVzID0gZHcubWFrZUFycmF5KGxlbmd0aCk7Ci0gICAgICAgICAgICBkdy5jb3B5QXJyYXlVbmJveGluZyhhLCAwLCByZXMsIDAsIGxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIGxlbmd0aCA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgIE9iamVjdFtdIHJlczsKLSAgICAgICAgaWYgKGR3ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlcyA9IEFycmF5cy5jb3B5T2YoTk9fQVJHU19BUlJBWSwgbGVuZ3RoLCBhcnJheVR5cGUuYXNTdWJjbGFzcyhPYmplY3RbXS5jbGFzcykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gbmV3IE9iamVjdFtsZW5ndGhdOwotICAgICAgICB9Ci0gICAgICAgIHN3LmNvcHlBcnJheUJveGluZyhhcnJheSwgMCwgcmVzLCAwLCBsZW5ndGgpOwotICAgICAgICBpZiAoZHcgPT0gbnVsbCkgIHJldHVybiByZXM7Ci0gICAgICAgIE9iamVjdCBhID0gZHcubWFrZUFycmF5KGxlbmd0aCk7Ci0gICAgICAgIGR3LmNvcHlBcnJheVVuYm94aW5nKHJlcywgMCwgYSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIGE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIGZpbmRDb2xsZWN0b3IoU3RyaW5nIG5hbWUsIGludCBuYXJncywgQ2xhc3M8Pz4gcnR5cGUsIENsYXNzPD8+Li4uIHB0eXBlcykgewotICAgICAgICBNZXRob2RUeXBlIHR5cGUgPSBNZXRob2RUeXBlLmdlbmVyaWNNZXRob2RUeXBlKG5hcmdzKQotICAgICAgICAgICAgICAgIC5jaGFuZ2VSZXR1cm5UeXBlKHJ0eXBlKQotICAgICAgICAgICAgICAgIC5pbnNlcnRQYXJhbWV0ZXJUeXBlcygwLCBwdHlwZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIElNUExfTE9PS1VQLmZpbmRTdGF0aWMoVEhJU19DTEFTUywgbmFtZSwgdHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gTk9fQVJHU19BUlJBWSA9IHt9OwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIG1ha2VBcnJheShPYmplY3QuLi4gYXJncykgeyByZXR1cm4gYXJnczsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KCkgeyByZXR1cm4gTk9fQVJHU19BUlJBWTsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KE9iamVjdCBhMCkKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTApOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwLCBPYmplY3QgYTEpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUFycmF5KGEwLCBhMSk7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBhcnJheShPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCwgYTEsIGEyKTsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMykKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTAsIGExLCBhMiwgYTMpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCkKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTAsIGExLCBhMiwgYTMsIGE0KTsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQsIE9iamVjdCBhNSkKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBhcnJheShPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LCBPYmplY3QgYTUsIE9iamVjdCBhNikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gYXJyYXkoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYsIE9iamVjdCBhNykKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlQXJyYXkoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQsIE9iamVjdCBhNSwgT2JqZWN0IGE2LCBPYmplY3QgYTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE4KQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VBcnJheShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGFycmF5KE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQsIE9iamVjdCBhNSwgT2JqZWN0IGE2LCBPYmplY3QgYTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE4LCBPYmplY3QgYTkpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUFycmF5KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTsgfQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZVtdIG1ha2VBcnJheXMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxNZXRob2RIYW5kbGU+IG1ocyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBmaW5kQ29sbGVjdG9yKCJhcnJheSIsIG1ocy5zaXplKCksIE9iamVjdFtdLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtaCA9PSBudWxsKSAgYnJlYWs7Ci0gICAgICAgICAgICBtaHMuYWRkKG1oKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQobWhzLnNpemUoKSA9PSAxMSk7ICAvLyBjdXJyZW50IG51bWJlciBvZiBtZXRob2RzCi0gICAgICAgIHJldHVybiBtaHMudG9BcnJheShuZXcgTWV0aG9kSGFuZGxlW01BWF9BUklUWSsxXSk7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZVtdIEFSUkFZUyA9IG1ha2VBcnJheXMoKTsKLQotICAgIC8vIGZpbGxpbmcgdmVyc2lvbnMgb2YgdGhlIGFib3ZlOgotICAgIC8vIHVzaW5nIEludGVnZXIgbGVuIGluc3RlYWQgb2YgaW50IGxlbiBhbmQgbm8gdmFyYXJncyB0byBhdm9pZCBib290c3RyYXBwaW5nIHByb2JsZW1zCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbE5ld0FycmF5KEludGVnZXIgbGVuLCBPYmplY3RbXSAvKm5vdCAuLi4qLyBhcmdzKSB7Ci0gICAgICAgIE9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W2xlbl07Ci0gICAgICAgIGZpbGxXaXRoQXJndW1lbnRzKGEsIDAsIGFyZ3MpOwotICAgICAgICByZXR1cm4gYTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbE5ld1R5cGVkQXJyYXkoT2JqZWN0W10gZXhhbXBsZSwgSW50ZWdlciBsZW4sIE9iamVjdFtdIC8qbm90IC4uLiovIGFyZ3MpIHsKLSAgICAgICAgT2JqZWN0W10gYSA9IEFycmF5cy5jb3B5T2YoZXhhbXBsZSwgbGVuKTsKLSAgICAgICAgZmlsbFdpdGhBcmd1bWVudHMoYSwgMCwgYXJncyk7Ci0gICAgICAgIHJldHVybiBhOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxXaXRoQXJndW1lbnRzKE9iamVjdFtdIGEsIGludCBwb3MsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgYSwgcG9zLCBhcmdzLmxlbmd0aCk7Ci0gICAgfQotICAgIC8vIHVzaW5nIEludGVnZXIgcG9zIGluc3RlYWQgb2YgaW50IHBvcyB0byBhdm9pZCBib290c3RyYXBwaW5nIHByb2JsZW1zCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTApCi0gICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwKTsgcmV0dXJuIGE7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaWxsQXJyYXkoSW50ZWdlciBwb3MsIE9iamVjdFtdIGEsIE9iamVjdCBhMCwgT2JqZWN0IGExKQotICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCwgYTEpOyByZXR1cm4gYTsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGZpbGxBcnJheShJbnRlZ2VyIHBvcywgT2JqZWN0W10gYSwgT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMikKLSAgICAgICAgICAgICAgICB7IGZpbGxXaXRoQXJndW1lbnRzKGEsIHBvcywgYTAsIGExLCBhMik7IHJldHVybiBhOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMpCi0gICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwLCBhMSwgYTIsIGEzKTsgcmV0dXJuIGE7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaWxsQXJyYXkoSW50ZWdlciBwb3MsIE9iamVjdFtdIGEsIE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQpCi0gICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwLCBhMSwgYTIsIGEzLCBhNCk7IHJldHVybiBhOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LCBPYmplY3QgYTUpCi0gICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOyByZXR1cm4gYTsgfQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGZpbGxBcnJheShJbnRlZ2VyIHBvcywgT2JqZWN0W10gYSwgT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYpCi0gICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsgcmV0dXJuIGE7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaWxsQXJyYXkoSW50ZWdlciBwb3MsIE9iamVjdFtdIGEsIE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIsIE9iamVjdCBhMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTQsIE9iamVjdCBhNSwgT2JqZWN0IGE2LCBPYmplY3QgYTcpCi0gICAgICAgICAgICAgICAgeyBmaWxsV2l0aEFyZ3VtZW50cyhhLCBwb3MsIGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7IHJldHVybiBhOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LCBPYmplY3QgYTUsIE9iamVjdCBhNiwgT2JqZWN0IGE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhOCkKLSAgICAgICAgICAgICAgICB7IGZpbGxXaXRoQXJndW1lbnRzKGEsIHBvcywgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7IHJldHVybiBhOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZmlsbEFycmF5KEludGVnZXIgcG9zLCBPYmplY3RbXSBhLCBPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LCBPYmplY3QgYTUsIE9iamVjdCBhNiwgT2JqZWN0IGE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhOCwgT2JqZWN0IGE5KQotICAgICAgICAgICAgICAgIHsgZmlsbFdpdGhBcmd1bWVudHMoYSwgcG9zLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7IHJldHVybiBhOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlW10gbWFrZUZpbGxBcnJheXMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxNZXRob2RIYW5kbGU+IG1ocyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtaHMuYWRkKG51bGwpOyAgLy8gdGhlcmUgaXMgbm8gZW1wdHkgZmlsbDsgYXQgbGVhc3QgYTAgaXMgcmVxdWlyZWQKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gZmluZENvbGxlY3RvcigiZmlsbEFycmF5IiwgbWhzLnNpemUoKSwgT2JqZWN0W10uY2xhc3MsIEludGVnZXIuY2xhc3MsIE9iamVjdFtdLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtaCA9PSBudWxsKSAgYnJlYWs7Ci0gICAgICAgICAgICBtaHMuYWRkKG1oKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQobWhzLnNpemUoKSA9PSAxMSk7ICAvLyBjdXJyZW50IG51bWJlciBvZiBtZXRob2RzCi0gICAgICAgIHJldHVybiBtaHMudG9BcnJheShuZXcgTWV0aG9kSGFuZGxlWzBdKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kSGFuZGxlW10gRklMTF9BUlJBWVMgPSBtYWtlRmlsbEFycmF5cygpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gY29weUFzUmVmZXJlbmNlQXJyYXkoQ2xhc3M8PyBleHRlbmRzIE9iamVjdFtdPiBhcnJheVR5cGUsIE9iamVjdC4uLiBhKSB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKGEsIGEubGVuZ3RoLCBhcnJheVR5cGUpOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgY29weUFzUHJpbWl0aXZlQXJyYXkoV3JhcHBlciB3LCBPYmplY3QuLi4gYm94ZXMpIHsKLSAgICAgICAgT2JqZWN0IGEgPSB3Lm1ha2VBcnJheShib3hlcy5sZW5ndGgpOwotICAgICAgICB3LmNvcHlBcnJheVVuYm94aW5nKGJveGVzLCAwLCBhLCAwLCBib3hlcy5sZW5ndGgpOwotICAgICAgICByZXR1cm4gYTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJuIGEgbWV0aG9kIGhhbmRsZSB0aGF0IHRha2VzIHRoZSBpbmRpY2F0ZWQgbnVtYmVyIG9mIE9iamVjdAotICAgICAqICBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4gT2JqZWN0IGFycmF5IG9mIHRoZW0sIGFzIGlmIGZvciB2YXJhcmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlIHZhcmFyZ3NBcnJheShpbnQgbmFyZ3MpIHsKLSAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gQVJSQVlTW25hcmdzXTsKLSAgICAgICAgaWYgKG1oICE9IG51bGwpICByZXR1cm4gbWg7Ci0gICAgICAgIG1oID0gZmluZENvbGxlY3RvcigiYXJyYXkiLCBuYXJncywgT2JqZWN0W10uY2xhc3MpOwotICAgICAgICBpZiAobWggIT0gbnVsbCkgIHJldHVybiBBUlJBWVNbbmFyZ3NdID0gbWg7Ci0gICAgICAgIG1oID0gYnVpbGRWYXJhcmdzQXJyYXkoRklMTF9ORVdfQVJSQVksIEFSUkFZX0lERU5USVRZLCBuYXJncyk7Ci0gICAgICAgIGFzc2VydChhc3NlcnRDb3JyZWN0QXJpdHkobWgsIG5hcmdzKSk7Ci0gICAgICAgIHJldHVybiBBUlJBWVNbbmFyZ3NdID0gbWg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhc3NlcnRDb3JyZWN0QXJpdHkoTWV0aG9kSGFuZGxlIG1oLCBpbnQgYXJpdHkpIHsKLSAgICAgICAgYXNzZXJ0KG1oLnR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpID09IGFyaXR5KSA6ICJhcml0eSAhPSAiK2FyaXR5KyI6ICIrbWg7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBidWlsZFZhcmFyZ3NBcnJheShNZXRob2RIYW5kbGUgbmV3QXJyYXksIE1ldGhvZEhhbmRsZSBmaW5pc2hlciwgaW50IG5hcmdzKSB7Ci0gICAgICAgIC8vIEJ1aWxkIHVwIHRoZSByZXN1bHQgbWggYXMgYSBzZXF1ZW5jZSBvZiBmaWxscyBsaWtlIHRoaXM6Ci0gICAgICAgIC8vICAgZmluaXNoZXIoZmlsbChmaWxsKG5ld0FycmF5V0EoMjMseDEuLngxMCksMTAseDExLi54MjApLDIwLHgyMS4ueDIzKSkKLSAgICAgICAgLy8gVGhlIHZhcmlvdXMgZmlsbChfLDEwKkksX19fKltKXSkgYXJlIHJldXNhYmxlLgotICAgICAgICBpbnQgbGVmdExlbiA9IE1hdGgubWluKG5hcmdzLCBMRUZUX0FSR1MpOyAgLy8gYWJzb3JiIHNvbWUgYXJndW1lbnRzIGltbWVkaWF0ZWx5Ci0gICAgICAgIGludCByaWdodExlbiA9IG5hcmdzIC0gbGVmdExlbjsKLSAgICAgICAgTWV0aG9kSGFuZGxlIGxlZnRDb2xsZWN0b3IgPSBuZXdBcnJheS5iaW5kVG8obmFyZ3MpOwotICAgICAgICBsZWZ0Q29sbGVjdG9yID0gbGVmdENvbGxlY3Rvci5hc0NvbGxlY3RvcihPYmplY3RbXS5jbGFzcywgbGVmdExlbik7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGZpbmlzaGVyOwotICAgICAgICBpZiAocmlnaHRMZW4gPiAwKSB7Ci0gICAgICAgICAgICBNZXRob2RIYW5kbGUgcmlnaHRGaWxsZXIgPSBmaWxsVG9SaWdodChMRUZUX0FSR1MgKyByaWdodExlbik7Ci0gICAgICAgICAgICBpZiAobWggPT0gQVJSQVlfSURFTlRJVFkpCi0gICAgICAgICAgICAgICAgbWggPSByaWdodEZpbGxlcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtaCA9IE1ldGhvZEhhbmRsZXMuY29sbGVjdEFyZ3VtZW50cyhtaCwgMCwgcmlnaHRGaWxsZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtaCA9PSBBUlJBWV9JREVOVElUWSkKLSAgICAgICAgICAgIG1oID0gbGVmdENvbGxlY3RvcjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWggPSBNZXRob2RIYW5kbGVzLmNvbGxlY3RBcmd1bWVudHMobWgsIDAsIGxlZnRDb2xsZWN0b3IpOwotICAgICAgICByZXR1cm4gbWg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFRlRfQVJHUyA9IChGSUxMX0FSUkFZUy5sZW5ndGggLSAxKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGVbXSBGSUxMX0FSUkFZX1RPX1JJR0hUID0gbmV3IE1ldGhvZEhhbmRsZVtNQVhfQVJJVFkrMV07Ci0gICAgLyoqIGZpbGxfYXJyYXlfdG9fcmlnaHQoTikuaW52b2tlKGEsIGFyZ0wuLmFyZ1tOLTFdKQotICAgICAqICBmaWxscyBhW0xdLi5hW04tMV0gd2l0aCBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cywKLSAgICAgKiAgYW5kIHRoZW4gcmV0dXJucyBhLiAgVGhlIHZhbHVlIEwgaXMgYSBnbG9iYWwgY29uc3RhbnQgKExFRlRfQVJHUykuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIGZpbGxUb1JpZ2h0KGludCBuYXJncykgewotICAgICAgICBNZXRob2RIYW5kbGUgZmlsbGVyID0gRklMTF9BUlJBWV9UT19SSUdIVFtuYXJnc107Ci0gICAgICAgIGlmIChmaWxsZXIgIT0gbnVsbCkgIHJldHVybiBmaWxsZXI7Ci0gICAgICAgIGZpbGxlciA9IGJ1aWxkRmlsbGVyKG5hcmdzKTsKLSAgICAgICAgYXNzZXJ0KGFzc2VydENvcnJlY3RBcml0eShmaWxsZXIsIG5hcmdzIC0gTEVGVF9BUkdTICsgMSkpOwotICAgICAgICByZXR1cm4gRklMTF9BUlJBWV9UT19SSUdIVFtuYXJnc10gPSBmaWxsZXI7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBidWlsZEZpbGxlcihpbnQgbmFyZ3MpIHsKLSAgICAgICAgaWYgKG5hcmdzIDw9IExFRlRfQVJHUykKLSAgICAgICAgICAgIHJldHVybiBBUlJBWV9JREVOVElUWTsgIC8vIG5vIGFyZ3MgdG8gZmlsbDsgcmV0dXJuIHRoZSBhcnJheSB1bmNoYW5nZWQKLSAgICAgICAgLy8gd2UgbmVlZCByb29tIGZvciBib3RoIG1oIGFuZCBhIGluIG1oLmludm9rZShhLCBhcmcqW25hcmdzXSkKLSAgICAgICAgZmluYWwgaW50IENIVU5LID0gTEVGVF9BUkdTOwotICAgICAgICBpbnQgcmlnaHRMZW4gPSBuYXJncyAlIENIVU5LOwotICAgICAgICBpbnQgbWlkTGVuID0gbmFyZ3MgLSByaWdodExlbjsKLSAgICAgICAgaWYgKHJpZ2h0TGVuID09IDApIHsKLSAgICAgICAgICAgIG1pZExlbiA9IG5hcmdzIC0gKHJpZ2h0TGVuID0gQ0hVTkspOwotICAgICAgICAgICAgaWYgKEZJTExfQVJSQVlfVE9fUklHSFRbbWlkTGVuXSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gYnVpbGQgc29tZSBwcmVjdXJzb3JzIGZyb20gbGVmdCB0byByaWdodAotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBMRUZUX0FSR1MgJSBDSFVOSzsgaiA8IG1pZExlbjsgaiArPSBDSFVOSykKLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPiBMRUZUX0FSR1MpICBmaWxsVG9SaWdodChqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWlkTGVuIDwgTEVGVF9BUkdTKSByaWdodExlbiA9IG5hcmdzIC0gKG1pZExlbiA9IExFRlRfQVJHUyk7Ci0gICAgICAgIGFzc2VydChyaWdodExlbiA+IDApOwotICAgICAgICBNZXRob2RIYW5kbGUgbWlkRmlsbCA9IGZpbGxUb1JpZ2h0KG1pZExlbik7ICAvLyByZWN1cnNpdmUgZmlsbAotICAgICAgICBNZXRob2RIYW5kbGUgcmlnaHRGaWxsID0gRklMTF9BUlJBWVNbcmlnaHRMZW5dLmJpbmRUbyhtaWRMZW4pOyAgLy8gW21pZExlbi4ubmFyZ3MtMV0KLSAgICAgICAgYXNzZXJ0KG1pZEZpbGwudHlwZSgpLnBhcmFtZXRlckNvdW50KCkgICA9PSAxICsgbWlkTGVuIC0gTEVGVF9BUkdTKTsKLSAgICAgICAgYXNzZXJ0KHJpZ2h0RmlsbC50eXBlKCkucGFyYW1ldGVyQ291bnQoKSA9PSAxICsgcmlnaHRMZW4pOwotCi0gICAgICAgIC8vIENvbWJpbmUgdGhlIHR3byBmaWxsczoKLSAgICAgICAgLy8gICByaWdodChtaWQoYSwgeDEwLi54MTkpLCB4MjAuLngyMykKLSAgICAgICAgLy8gVGhlIGZpbmFsIHByb2R1Y3Qgd2lsbCBsb29rIGxpa2UgdGhpczoKLSAgICAgICAgLy8gICByaWdodChtaWQobmV3QXJyYXlMZWZ0KDI0LCB4MC4ueDkpLCB4MTAuLngxOSksIHgyMC4ueDIzKQotICAgICAgICBpZiAobWlkTGVuID09IExFRlRfQVJHUykKLSAgICAgICAgICAgIHJldHVybiByaWdodEZpbGw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBNZXRob2RIYW5kbGVzLmNvbGxlY3RBcmd1bWVudHMocmlnaHRGaWxsLCAwLCBtaWRGaWxsKTsKLSAgICB9Ci0KLSAgICAvLyBUeXBlLXBvbHltb3JwaGljIHZlcnNpb24gb2YgdmFyYXJncyBtYWtlci4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1ZhbHVlPE1ldGhvZEhhbmRsZVtdPiBUWVBFRF9DT0xMRUNUT1JTCi0gICAgICAgID0gbmV3IENsYXNzVmFsdWU8TWV0aG9kSGFuZGxlW10+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgTWV0aG9kSGFuZGxlW10gY29tcHV0ZVZhbHVlKENsYXNzPD8+IHR5cGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEhhbmRsZVsyNTZdOwotICAgICAgICAgICAgfQotICAgIH07Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9KVk1fQVJJVFkgPSAyNTU7ICAvLyBsaW1pdCBpbXBvc2VkIGJ5IHRoZSBKVk0KLQotICAgIC8qKiBSZXR1cm4gYSBtZXRob2QgaGFuZGxlIHRoYXQgdGFrZXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YKLSAgICAgKiAgdHlwZWQgYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZW0uCi0gICAgICogIFRoZSB0eXBlIGFyZ3VtZW50IGlzIHRoZSBhcnJheSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlIHZhcmFyZ3NBcnJheShDbGFzczw/PiBhcnJheVR5cGUsIGludCBuYXJncykgewotICAgICAgICBDbGFzczw/PiBlbGVtVHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgIGlmIChlbGVtVHlwZSA9PSBudWxsKSAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGFuIGFycmF5OiAiK2FycmF5VHlwZSk7Ci0gICAgICAgIC8vIEZJWE1FOiBOZWVkIG1vcmUgc3BlY2lhbCBjYXNpbmcgYW5kIGNhY2hpbmcgaGVyZS4KLSAgICAgICAgaWYgKG5hcmdzID49IE1BWF9KVk1fQVJJVFkvMiAtIDEpIHsKLSAgICAgICAgICAgIGludCBzbG90cyA9IG5hcmdzOwotICAgICAgICAgICAgZmluYWwgaW50IE1BWF9BUlJBWV9TTE9UUyA9IE1BWF9KVk1fQVJJVFkgLSAxOyAgLy8gMSBmb3IgcmVjZWl2ZXIgTUgKLSAgICAgICAgICAgIGlmIChhcnJheVR5cGUgPT0gZG91YmxlW10uY2xhc3MgfHwgYXJyYXlUeXBlID09IGxvbmdbXS5jbGFzcykKLSAgICAgICAgICAgICAgICBzbG90cyAqPSAyOwotICAgICAgICAgICAgaWYgKHNsb3RzID4gTUFYX0FSUkFZX1NMT1RTKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRvbyBtYW55IGFyZ3VtZW50czogIithcnJheVR5cGUuZ2V0U2ltcGxlTmFtZSgpKyIsIGxlbmd0aCAiK25hcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxlbVR5cGUgPT0gT2JqZWN0LmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIHZhcmFyZ3NBcnJheShuYXJncyk7Ci0gICAgICAgIC8vIG90aGVyIGNhc2VzOiAgcHJpbWl0aXZlIGFycmF5cywgc3VidHlwZXMgb2YgT2JqZWN0W10KLSAgICAgICAgTWV0aG9kSGFuZGxlIGNhY2hlW10gPSBUWVBFRF9DT0xMRUNUT1JTLmdldChlbGVtVHlwZSk7Ci0gICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IG5hcmdzIDwgY2FjaGUubGVuZ3RoID8gY2FjaGVbbmFyZ3NdIDogbnVsbDsKLSAgICAgICAgaWYgKG1oICE9IG51bGwpICByZXR1cm4gbWg7Ci0gICAgICAgIGlmIChlbGVtVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICBNZXRob2RIYW5kbGUgYnVpbGRlciA9IEZJTExfTkVXX0FSUkFZOwotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHByb2R1Y2VyID0gYnVpbGRBcnJheVByb2R1Y2VyKGFycmF5VHlwZSk7Ci0gICAgICAgICAgICBtaCA9IGJ1aWxkVmFyYXJnc0FycmF5KGJ1aWxkZXIsIHByb2R1Y2VyLCBuYXJncyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBPYmplY3RbXT4gb2JqQXJyYXlUeXBlID0gKENsYXNzPD8gZXh0ZW5kcyBPYmplY3RbXT4pIGFycmF5VHlwZTsKLSAgICAgICAgICAgIE9iamVjdFtdIGV4YW1wbGUgPSBBcnJheXMuY29weU9mKE5PX0FSR1NfQVJSQVksIDAsIG9iakFycmF5VHlwZSk7Ci0gICAgICAgICAgICBNZXRob2RIYW5kbGUgYnVpbGRlciA9IEZJTExfTkVXX1RZUEVEX0FSUkFZLmJpbmRUbyhleGFtcGxlKTsKLSAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBwcm9kdWNlciA9IEFSUkFZX0lERU5USVRZOwotICAgICAgICAgICAgbWggPSBidWlsZFZhcmFyZ3NBcnJheShidWlsZGVyLCBwcm9kdWNlciwgbmFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIG1oID0gbWguYXNUeXBlKE1ldGhvZFR5cGUubWV0aG9kVHlwZShhcnJheVR5cGUsIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5uQ29waWVzKG5hcmdzLCBlbGVtVHlwZSkpKTsKLSAgICAgICAgYXNzZXJ0KGFzc2VydENvcnJlY3RBcml0eShtaCwgbmFyZ3MpKTsKLSAgICAgICAgaWYgKG5hcmdzIDwgY2FjaGUubGVuZ3RoKQotICAgICAgICAgICAgY2FjaGVbbmFyZ3NdID0gbWg7Ci0gICAgICAgIHJldHVybiBtaDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RIYW5kbGUgYnVpbGRBcnJheVByb2R1Y2VyKENsYXNzPD8+IGFycmF5VHlwZSkgewotICAgICAgICBDbGFzczw/PiBlbGVtVHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgIGlmIChlbGVtVHlwZS5pc1ByaW1pdGl2ZSgpKQotICAgICAgICAgICAgcmV0dXJuIExhenlTdGF0aWNzLkNPUFlfQVNfUFJJTUlUSVZFX0FSUkFZLmJpbmRUbyhXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUoZWxlbVR5cGUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIExhenlTdGF0aWNzLkNPUFlfQVNfUkVGRVJFTkNFX0FSUkFZLmJpbmRUbyhhcnJheVR5cGUpOwotICAgIH0KLQotICAgIC8vIExpc3QgdmVyc2lvbiBvZiB2YXJhcmdzIG1ha2VyLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxPYmplY3Q+IE5PX0FSR1NfTElTVCA9IEFycmF5cy5hc0xpc3QoTk9fQVJHU19BUlJBWSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IG1ha2VMaXN0KE9iamVjdC4uLiBhcmdzKSB7IHJldHVybiBBcnJheXMuYXNMaXN0KGFyZ3MpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QoKSB7IHJldHVybiBOT19BUkdTX0xJU1Q7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE9iamVjdD4gbGlzdChPYmplY3QgYTApCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUxpc3QoYTApOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QoT2JqZWN0IGEwLCBPYmplY3QgYTEpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUxpc3QoYTAsIGExKTsgfQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8T2JqZWN0PiBsaXN0KE9iamVjdCBhMCwgT2JqZWN0IGExLCBPYmplY3QgYTIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUxpc3QoYTAsIGExLCBhMik7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE9iamVjdD4gbGlzdChPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUxpc3QoYTAsIGExLCBhMiwgYTMpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCkKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlTGlzdChhMCwgYTEsIGEyLCBhMywgYTQpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1KQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VMaXN0KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUxpc3QoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYsIE9iamVjdCBhNykKLSAgICAgICAgICAgICAgICB7IHJldHVybiBtYWtlTGlzdChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOyB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QoT2JqZWN0IGEwLCBPYmplY3QgYTEsIE9iamVjdCBhMiwgT2JqZWN0IGEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhNCwgT2JqZWN0IGE1LCBPYmplY3QgYTYsIE9iamVjdCBhNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYTgpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gbWFrZUxpc3QoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7IH0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE9iamVjdD4gbGlzdChPYmplY3QgYTAsIE9iamVjdCBhMSwgT2JqZWN0IGEyLCBPYmplY3QgYTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGE0LCBPYmplY3QgYTUsIE9iamVjdCBhNiwgT2JqZWN0IGE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhOCwgT2JqZWN0IGE5KQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ha2VMaXN0KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTsgfQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZVtdIG1ha2VMaXN0cygpIHsKLSAgICAgICAgQXJyYXlMaXN0PE1ldGhvZEhhbmRsZT4gbWhzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBtaCA9IGZpbmRDb2xsZWN0b3IoImxpc3QiLCBtaHMuc2l6ZSgpLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtaCA9PSBudWxsKSAgYnJlYWs7Ci0gICAgICAgICAgICBtaHMuYWRkKG1oKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQobWhzLnNpemUoKSA9PSAxMSk7ICAvLyBjdXJyZW50IG51bWJlciBvZiBtZXRob2RzCi0gICAgICAgIHJldHVybiBtaHMudG9BcnJheShuZXcgTWV0aG9kSGFuZGxlW01BWF9BUklUWSsxXSk7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZVtdIExJU1RTID0gbWFrZUxpc3RzKCk7Ci0KLSAgICAvKiogUmV0dXJuIGEgbWV0aG9kIGhhbmRsZSB0aGF0IHRha2VzIHRoZSBpbmRpY2F0ZWQgbnVtYmVyIG9mIE9iamVjdAotICAgICAqICBhcmd1bWVudHMgYW5kIHJldHVybnMgYSBMaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlIHZhcmFyZ3NMaXN0KGludCBuYXJncykgewotICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBMSVNUU1tuYXJnc107Ci0gICAgICAgIGlmIChtaCAhPSBudWxsKSAgcmV0dXJuIG1oOwotICAgICAgICBtaCA9IGZpbmRDb2xsZWN0b3IoImxpc3QiLCBuYXJncywgTGlzdC5jbGFzcyk7Ci0gICAgICAgIGlmIChtaCAhPSBudWxsKSAgcmV0dXJuIExJU1RTW25hcmdzXSA9IG1oOwotICAgICAgICByZXR1cm4gTElTVFNbbmFyZ3NdID0gYnVpbGRWYXJhcmdzTGlzdChuYXJncyk7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBidWlsZFZhcmFyZ3NMaXN0KGludCBuYXJncykgewotICAgICAgICByZXR1cm4gTWV0aG9kSGFuZGxlcy5maWx0ZXJSZXR1cm5WYWx1ZSh2YXJhcmdzQXJyYXkobmFyZ3MpLCBMYXp5U3RhdGljcy5NQUtFX0xJU1QpOwotICAgIH0KLQogICAgIC8vIGhhbmR5IHNoYXJlZCBleGNlcHRpb24gbWFrZXJzICh0aGV5IHNpbXBsaWZ5IHRoZSBjb21tb24gY2FzZSBjb2RlKQogICAgIHByaXZhdGUgc3RhdGljIEludGVybmFsRXJyb3IgbmV3SW50ZXJuYWxFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihtZXNzYWdlLCBjYXVzZSk7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW52b2tlL3V0aWwvVmVyaWZ5VHlwZS5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS91dGlsL1ZlcmlmeVR5cGUuamF2YQppbmRleCA1MmIzMmM0Li5jZTM3Yjg4IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW52b2tlL3V0aWwvVmVyaWZ5VHlwZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pbnZva2UvdXRpbC9WZXJpZnlUeXBlLmphdmEKQEAgLTQwLDE4ICs0MCwzOCBAQAogICAgIC8qKgogICAgICAqIFRydWUgaWYgYSB2YWx1ZSBjYW4gYmUgc3RhY2tlZCBhcyB0aGUgc291cmNlIHR5cGUgYW5kIHVuc3RhY2tlZCBhcyB0aGUKICAgICAgKiBkZXN0aW5hdGlvbiB0eXBlLCB3aXRob3V0IHZpb2xhdGluZyB0aGUgSlZNJ3MgdHlwZSBjb25zaXN0ZW5jeS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBib3RoIHR5cGVzIGFyZSByZWZlcmVuY2VzLCB3ZSBhcHBseSB0aGUgdmVyaWZpZXIncyBzdWJjbGFzcyBjaGVjaworICAgICAqIChvciBzdWJ0eXBpbmcsIGlmIGtlZXBJbnRlcmZhY2VzKS4KKyAgICAgKiBJZiB0aGUgc3JjIHR5cGUgaXMgYSB0eXBlIGd1YXJhbnRlZWQgdG8gYmUgbnVsbCAoVm9pZCkgaXQgY2FuIGJlIGNvbnZlcnRlZAorICAgICAqIHRvIGFueSBvdGhlciByZWZlcmVuY2UgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBib3RoIHR5cGVzIGFyZSBwcmltaXRpdmVzLCB3ZSBhcHBseSB0aGUgdmVyaWZpZXIncyBwcmltaXRpdmUgY29udmVyc2lvbnMuCisgICAgICogVGhlc2UgZG8gbm90IGluY2x1ZGUgSmF2YSBjb252ZXJzaW9ucyBzdWNoIGFzIGxvbmcgdG8gZG91YmxlLCBzaW5jZSB0aG9zZQorICAgICAqIHJlcXVpcmUgY29tcHV0YXRpb24gYW5kIChpbiBnZW5lcmFsKSBzdGFjayBkZXB0aCBjaGFuZ2VzLgorICAgICAqIEJ1dCB2ZXJ5IHNpbXBsZSAzMi1iaXQgdmlld2luZyBjaGFuZ2VzLCBzdWNoIGFzIGJ5dGUgdG8gaW50LAorICAgICAqIGFyZSBudWxsIGNvbnZlcnNpb25zLCBiZWNhdXNlIHRoZXkgZG8gbm90IHJlcXVpcmUgYW55IGNvbXB1dGF0aW9uLgorICAgICAqIFRoZXNlIGNvbnZlcnNpb25zIGFyZSBmcm9tIGFueSB0eXBlIHRvIGEgd2lkZXIgdHlwZSB1cCB0byAzMiBiaXRzLAorICAgICAqIGFzIGxvbmcgYXMgdGhlIGNvbnZlcnNpb24gaXMgbm90IHNpZ25lZCB0byB1bnNpZ25lZCAoYnl0ZSB0byBjaGFyKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJpbWl0aXZlIHR5cGUgJ3ZvaWQnIGRvZXMgbm90IGludGVyY29udmVydCB3aXRoIGFueSBvdGhlciB0eXBlLAorICAgICAqIGV2ZW4gdGhvdWdoIGl0IGlzIGxlZ2FsIHRvIGRyb3AgYW55IHR5cGUgZnJvbSB0aGUgc3RhY2sgYW5kICJyZXR1cm4gdm9pZCIuCisgICAgICogVGhlIHN0YWNrIGVmZmVjdHMsIHRob3VnaCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdm9pZCBhbmQgYW55IG90aGVyIHR5cGUsCisgICAgICogc28gaXQgaXMgc2FmZXIgdG8gcmVwb3J0IGEgbm9uLXRyaXZpYWwgY29udmVyc2lvbi4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcmMgdGhlIHR5cGUgb2YgYSBzdGFja2VkIHZhbHVlCiAgICAgICogQHBhcmFtIGRzdCB0aGUgdHlwZSBieSB3aGljaCB3ZSdkIGxpa2UgdG8gdHJlYXQgaXQKKyAgICAgKiBAcGFyYW0ga2VlcEludGVyZmFjZXMgaWYgZmFsc2UsIHdlIHRyZWF0IGFueSBpbnRlcmZhY2UgYXMgaWYgaXQgd2VyZSBPYmplY3QKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJldHlwaW5nIGNhbiBiZSBkb25lIHdpdGhvdXQgbW90aW9uIG9yIHJlZm9ybWF0dGluZwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGxDb252ZXJzaW9uKENsYXNzPD8+IHNyYywgQ2xhc3M8Pz4gZHN0KSB7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTnVsbENvbnZlcnNpb24oQ2xhc3M8Pz4gc3JjLCBDbGFzczw/PiBkc3QsIGJvb2xlYW4ga2VlcEludGVyZmFjZXMpIHsKICAgICAgICAgaWYgKHNyYyA9PSBkc3QpICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIC8vIFZlcmlmaWVyIGFsbG93cyBhbnkgaW50ZXJmYWNlIHRvIGJlIHRyZWF0ZWQgYXMgT2JqZWN0OgotICAgICAgICBpZiAoZHN0LmlzSW50ZXJmYWNlKCkpICAgICBkc3QgPSBPYmplY3QuY2xhc3M7Ci0gICAgICAgIGlmIChzcmMuaXNJbnRlcmZhY2UoKSkgICAgIHNyYyA9IE9iamVjdC5jbGFzczsKLSAgICAgICAgaWYgKHNyYyA9PSBkc3QpICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBjaGVjayBhZ2FpbgotICAgICAgICBpZiAoZHN0ID09IHZvaWQuY2xhc3MpICAgICByZXR1cm4gdHJ1ZTsgIC8vIGRyb3AgYW55IHJldHVybiB2YWx1ZQorICAgICAgICBpZiAoIWtlZXBJbnRlcmZhY2VzKSB7CisgICAgICAgICAgICBpZiAoZHN0LmlzSW50ZXJmYWNlKCkpICBkc3QgPSBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICBpZiAoc3JjLmlzSW50ZXJmYWNlKCkpICBzcmMgPSBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICBpZiAoc3JjID09IGRzdCkgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIGNoZWNrIGFnYWluCisgICAgICAgIH0KICAgICAgICAgaWYgKGlzTnVsbFR5cGUoc3JjKSkgICAgICAgcmV0dXJuICFkc3QuaXNQcmltaXRpdmUoKTsKICAgICAgICAgaWYgKCFzcmMuaXNQcmltaXRpdmUoKSkgICAgcmV0dXJuIGRzdC5pc0Fzc2lnbmFibGVGcm9tKHNyYyk7CiAgICAgICAgIGlmICghZHN0LmlzUHJpbWl0aXZlKCkpICAgIHJldHVybiBmYWxzZTsKQEAgLTgyLDI1ICsxMDIsMTMgQEAKICAgICAgKiBJcyB0aGUgZ2l2ZW4gdHlwZSBqYXZhLmxhbmcuTnVsbCBvciBhbiBlcXVpdmFsZW50IG51bGwtb25seSB0eXBlPwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGxUeXBlKENsYXNzPD8+IHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHR5cGUgPT0gTlVMTF9DTEFTUwotICAgICAgICAgICAgLy8gVGhpcyBvbmUgbWF5IGFsc28gYmUgdXNlZCBhcyBhIG51bGwgdHlwZS4KLSAgICAgICAgICAgIC8vIFRPIERPOiBEZWNpZGUgaWYgd2UgcmVhbGx5IHdhbnQgdG8gbGVnaXRpbWl6ZSBpdCBoZXJlLgotICAgICAgICAgICAgLy8gUHJvYmFibHkgd2UgZG8sIHVubGVzcyBqYXZhLmxhbmcuTnVsbCByZWFsbHkgbWFrZXMgaXQgaW50byBKYXZhIDcKLSAgICAgICAgICAgIC8vfHwgdHlwZSA9PSBWb2lkLmNsYXNzCi0gICAgICAgICAgICAvLyBMb2NhbGx5IGtub3duIG51bGwtb25seSBjbGFzczoKLSAgICAgICAgICAgIHx8IHR5cGUgPT0gRW1wdHkuY2xhc3MKLSAgICAgICAgICAgIDsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gTlVMTF9DTEFTUzsKLSAgICBzdGF0aWMgewotICAgICAgICBDbGFzczw/PiBudWxsQ2xhc3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbnVsbENsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLk51bGwiKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gT0ssIHdlJ2xsIGNvcGUKLSAgICAgICAgfQotICAgICAgICBOVUxMX0NMQVNTID0gbnVsbENsYXNzOworICAgICAgICAvLyBBbnkgcmVmZXJlbmNlIHN0YXRpY2FsbHkgdHlwZWQgYXMgVm9pZCBpcyBndWFyYW50ZWVkIHRvIGJlIG51bGwuCisgICAgICAgIC8vIFRoZXJlZm9yZSwgaXQgY2FuIGJlIHNhZmVseSB0cmVhdGVkIGFzIGEgdmFsdWUgb2YgYW55CisgICAgICAgIC8vIG90aGVyIHR5cGUgdGhhdCBhZG1pdHMgbnVsbCwgaS5lLiwgYSByZWZlcmVuY2UgdHlwZS4KKyAgICAgICAgaWYgKHR5cGUgPT0gVm9pZC5jbGFzcykgIHJldHVybiB0cnVlOworICAgICAgICAvLyBMb2NhbGx5IGtub3duIG51bGwtb25seSBjbGFzczoKKyAgICAgICAgaWYgKHR5cGUgPT0gRW1wdHkuY2xhc3MpICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTExLDE0ICsxMTksMTQgQEAKICAgICAgKiBAcGFyYW0gcmVjdiB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGhhbmRsZSByZWNlaXZpbmcgdGhlIGNhbGwKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJldHlwaW5nIGNhbiBiZSBkb25lIHdpdGhvdXQgbW90aW9uIG9yIHJlZm9ybWF0dGluZwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGxDb252ZXJzaW9uKE1ldGhvZFR5cGUgY2FsbCwgTWV0aG9kVHlwZSByZWN2KSB7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTnVsbENvbnZlcnNpb24oTWV0aG9kVHlwZSBjYWxsLCBNZXRob2RUeXBlIHJlY3YsIGJvb2xlYW4ga2VlcEludGVyZmFjZXMpIHsKICAgICAgICAgaWYgKGNhbGwgPT0gcmVjdikgIHJldHVybiB0cnVlOwogICAgICAgICBpbnQgbGVuID0gY2FsbC5wYXJhbWV0ZXJDb3VudCgpOwogICAgICAgICBpZiAobGVuICE9IHJlY3YucGFyYW1ldGVyQ291bnQoKSkgIHJldHVybiBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIGlmICghaXNOdWxsQ29udmVyc2lvbihjYWxsLnBhcmFtZXRlclR5cGUoaSksIHJlY3YucGFyYW1ldGVyVHlwZShpKSkpCisgICAgICAgICAgICBpZiAoIWlzTnVsbENvbnZlcnNpb24oY2FsbC5wYXJhbWV0ZXJUeXBlKGkpLCByZWN2LnBhcmFtZXRlclR5cGUoaSksIGtlZXBJbnRlcmZhY2VzKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBpc051bGxDb252ZXJzaW9uKHJlY3YucmV0dXJuVHlwZSgpLCBjYWxsLnJldHVyblR5cGUoKSk7CisgICAgICAgIHJldHVybiBpc051bGxDb252ZXJzaW9uKHJlY3YucmV0dXJuVHlwZSgpLCBjYWxsLnJldHVyblR5cGUoKSwga2VlcEludGVyZmFjZXMpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS91dGlsL1dyYXBwZXIuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pbnZva2UvdXRpbC9XcmFwcGVyLmphdmEKaW5kZXggNmM0YmU0NS4uMjczMmUyOCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS91dGlsL1dyYXBwZXIuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW52b2tlL3V0aWwvV3JhcHBlci5qYXZhCkBAIC0yMzAsMTQgKzIzMCw2IEBACiAgICAgICovCiAgICAgcHVibGljIDxUPiBUIHplcm8oQ2xhc3M8VD4gdHlwZSkgeyByZXR1cm4gY29udmVydCh6ZXJvLCB0eXBlKTsgfQogCi0vLyAgICAvKiogUHJvZHVjZSBhIHdyYXBwZXIgZm9yIHRoZSBnaXZlbiB3cmFwcGVyIG9yIHByaW1pdGl2ZSB0eXBlLiAqLwotLy8gICAgcHVibGljIHN0YXRpYyBXcmFwcGVyIHZhbHVlT2YoQ2xhc3M8Pz4gdHlwZSkgewotLy8gICAgICAgIGlmIChpc1ByaW1pdGl2ZVR5cGUodHlwZSkpCi0vLyAgICAgICAgICAgIHJldHVybiBmb3JQcmltaXRpdmVUeXBlKHR5cGUpOwotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgcmV0dXJuIGZvcldyYXBwZXJUeXBlKHR5cGUpOwotLy8gICAgfQotCiAgICAgLyoqIFJldHVybiB0aGUgd3JhcHBlciB0aGF0IHdyYXBzIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgICAgKiAgVGhlIHR5cGUgbWF5IGJlIHtAY29kZSBPYmplY3R9LCBtZWFuaW5nIHRoZSB7QGNvZGUgT0JKRUNUfSB3cmFwcGVyLgogICAgICAqICBPdGhlcndpc2UsIHRoZSB0eXBlIG11c3QgYmUgYSBwcmltaXRpdmUuCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9jYWxlbmRhci9ab25lSW5mb0ZpbGUuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2NhbGVuZGFyL1pvbmVJbmZvRmlsZS5qYXZhCmluZGV4IDRjNDIzYjcuLjc4ZDlmM2UgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2NhbGVuZGFyL1pvbmVJbmZvRmlsZS5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2NhbGVuZGFyL1pvbmVJbmZvRmlsZS5qYXZhCkBAIC02MTUsNyArNjE1LDkgQEAKICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhcnRUaW1lPTg2NDAwMDAwICAgPD0gMjQgaG91cnMKICAgICAgICAgICAgICAgICAvLyBUaGlzOiAgICAgICAgICAgc3RhcnREYXlPZldlZWs9NgogICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFydFRpbWU9MAotICAgICAgICAgICAgICAgIC8vIEJlbG93IGlzIHRoZSB3b3JrYXJvdW5kLCBpdCBwcm9iYWJseSBzbG93cyBkb3duIGV2ZXJ5b25lIGEgbGl0dGxlCisgICAgICAgICAgICAgICAgLy8gU2ltaWxhciB3b3JrYXJvdW5kIG5lZWRzIHRvIGJlIGFwcGxpZWQgdG8gQWZyaWNhL0NhaXJvIGFuZAorICAgICAgICAgICAgICAgIC8vIGl0cyBlbmREYXlPZldlZWsgYW5kIGVuZFRpbWUKKyAgICAgICAgICAgICAgICAvLyBCZWxvdyBpcyB0aGUgd29ya2Fyb3VuZHMsIGl0IHByb2JhYmx5IHNsb3dzIGRvd24gZXZlcnlvbmUgYSBsaXR0bGUKICAgICAgICAgICAgICAgICBpZiAocGFyYW1zWzJdID09IDYgJiYgcGFyYW1zWzNdID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgKHpvbmVJZC5lcXVhbHMoIkFzaWEvQW1tYW4iKSB8fAogICAgICAgICAgICAgICAgICAgICAgem9uZUlkLmVxdWFscygiQXNpYS9HYXphIikgfHwKQEAgLTYyMyw2ICs2MjUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzJdID0gNTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzNdID0gODY0MDAwMDA7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vZW5kRGF5T2ZXZWVrIGFuZCBlbmRUaW1lIHdvcmthcm91bmQKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zWzddID09IDYgJiYgcGFyYW1zWzhdID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgKHpvbmVJZC5lcXVhbHMoIkFmcmljYS9DYWlybyIpKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbXNbN10gPSA1OworICAgICAgICAgICAgICAgICAgICBwYXJhbXNbOF0gPSA4NjQwMDAwMDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0gZWxzZSBpZiAoblRyYW5zID4gMCkgeyAgLy8gb25seSBkbyB0aGlzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBpbiB0YWJsZSBhbHJlYWR5CiAgICAgICAgICAgICAgICAgaWYgKGxhc3R5ZWFyIDwgTEFTVFlFQVIpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gWm9uZUluZm8gaGFzIGFuIGVuZGluZyBlbnRyeSBmb3IgMjAzNwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL1RpbWVab25lTmFtZXMuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9UaW1lWm9uZU5hbWVzLmphdmEKaW5kZXggMjk4YTIzMy4uOWFiOTJjOSAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL1RpbWVab25lTmFtZXMuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvVGltZVpvbmVOYW1lcy5qYXZhCkBAIC00Nyw5ICs0Nyw5IEBACiAgICAgICAgIFN0cmluZyBBQ1RbXSA9IG5ldyBTdHJpbmdbXSB7IkFjcmUgVGltZSIsICJBQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3JlIFN1bW1lciBUaW1lIiwgIkFDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3JlIFRpbWUiLCAiQUNUIn07Ci0gICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiQ2VudHJhbCBTdGFuZGFyZCBUaW1lIChTb3V0aCBBdXN0cmFsaWEpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCBTdW1tZXIgVGltZSAoU291dGggQXVzdHJhbGlhKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgVGltZSAoU291dGggQXVzdHJhbGlhKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgQURFTEFJREVbXSA9IG5ldyBTdHJpbmdbXSB7IkF1c3RyYWxpYW4gQ2VudHJhbCBTdGFuZGFyZCBUaW1lIChTb3V0aCBBdXN0cmFsaWEpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gQ2VudHJhbCBEYXlsaWdodCBUaW1lIChTb3V0aCBBdXN0cmFsaWEpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gQ2VudHJhbCBUaW1lIChTb3V0aCBBdXN0cmFsaWEpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQUdUW10gPSBuZXcgU3RyaW5nW10geyJBcmdlbnRpbmUgVGltZSIsICJBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmdlbnRpbmUgU3VtbWVyIFRpbWUiLCAiQVJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ2VudGluZSBUaW1lIiwgIkFSVCJ9OwpAQCAtNzEsMTIgKzcxLDEyIEBACiAgICAgICAgIFN0cmluZyBCRFRbXSA9IG5ldyBTdHJpbmdbXSB7IkJhbmdsYWRlc2ggVGltZSIsICJCRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5nbGFkZXNoIFN1bW1lciBUaW1lIiwgIkJEU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5nbGFkZXNoIFRpbWUiLCAiQkRUIn07Ci0gICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiRWFzdGVybiBTdGFuZGFyZCBUaW1lIChRdWVlbnNsYW5kKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVhc3Rlcm4gU3VtbWVyIFRpbWUgKFF1ZWVuc2xhbmQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWFzdGVybiBUaW1lIChRdWVlbnNsYW5kKSIsICJFVCJ9OwotICAgICAgICBTdHJpbmcgQlJPS0VOX0hJTExbXSA9IG5ldyBTdHJpbmdbXSB7IkNlbnRyYWwgU3RhbmRhcmQgVGltZSAoU291dGggQXVzdHJhbGlhL05ldyBTb3V0aCBXYWxlcykiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmFsIFN1bW1lciBUaW1lIChTb3V0aCBBdXN0cmFsaWEvTmV3IFNvdXRoIFdhbGVzKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgVGltZSAoU291dGggQXVzdHJhbGlhL05ldyBTb3V0aCBXYWxlcykiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEJSSVNCQU5FW10gPSBuZXcgU3RyaW5nW10geyJBdXN0cmFsaWFuIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoUXVlZW5zbGFuZCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzdHJhbGlhbiBFYXN0ZXJuIERheWxpZ2h0IFRpbWUgKFF1ZWVuc2xhbmQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gRWFzdGVybiBUaW1lIChRdWVlbnNsYW5kKSIsICJBRVQifTsKKyAgICAgICAgU3RyaW5nIEJST0tFTl9ISUxMW10gPSBuZXcgU3RyaW5nW10geyJBdXN0cmFsaWFuIENlbnRyYWwgU3RhbmRhcmQgVGltZSAoU291dGggQXVzdHJhbGlhL05ldyBTb3V0aCBXYWxlcykiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzdHJhbGlhbiBDZW50cmFsIERheWxpZ2h0IFRpbWUgKFNvdXRoIEF1c3RyYWxpYS9OZXcgU291dGggV2FsZXMpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gQ2VudHJhbCBUaW1lIChTb3V0aCBBdXN0cmFsaWEvTmV3IFNvdXRoIFdhbGVzKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIEJSVFtdID0gbmV3IFN0cmluZ1tdIHsiQnJhc2lsaWEgVGltZSIsICJCUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmFzaWxpYSBTdW1tZXIgVGltZSIsICJCUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJhc2lsaWEgVGltZSIsICJCUlQifTsKQEAgLTExMCw5ICsxMTAsOSBAQAogICAgICAgICBTdHJpbmcgQ1VCQVtdID0gbmV3IFN0cmluZ1tdIHsiQ3ViYSBTdGFuZGFyZCBUaW1lIiwgIkNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDdWJhIERheWxpZ2h0IFRpbWUiLCAiQ0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN1YmEgVGltZSIsICJDVCJ9OwotICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJDZW50cmFsIFN0YW5kYXJkIFRpbWUgKE5vcnRoZXJuIFRlcnJpdG9yeSkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCBTdW1tZXIgVGltZSAoTm9ydGhlcm4gVGVycml0b3J5KSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmFsIFRpbWUgKE5vcnRoZXJuIFRlcnJpdG9yeSkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIERBUldJTltdID0gbmV3IFN0cmluZ1tdIHsiQXVzdHJhbGlhbiBDZW50cmFsIFN0YW5kYXJkIFRpbWUgKE5vcnRoZXJuIFRlcnJpdG9yeSkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gQ2VudHJhbCBEYXlsaWdodCBUaW1lIChOb3J0aGVybiBUZXJyaXRvcnkpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXN0cmFsaWFuIENlbnRyYWwgVGltZSAoTm9ydGhlcm4gVGVycml0b3J5KSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIERVQkxJTltdID0gbmV3IFN0cmluZ1tdIHsiR3JlZW53aWNoIE1lYW4gVGltZSIsICJHTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmlzaCBTdW1tZXIgVGltZSIsICJJU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmlzaCBUaW1lIiwgIklUIn07CkBAIC0xMzEsOSArMTMxLDkgQEAKICAgICAgICAgU3RyaW5nIEVTVFtdID0gbmV3IFN0cmluZ1tdIHsiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgIkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVhc3Rlcm4gRGF5bGlnaHQgVGltZSIsICJFRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYXN0ZXJuIFRpbWUiLCAiRVQifTsKLSAgICAgICAgU3RyaW5nIEVTVF9OU1dbXSA9IG5ldyBTdHJpbmdbXSB7IkVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoTmV3IFNvdXRoIFdhbGVzKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWFzdGVybiBTdW1tZXIgVGltZSAoTmV3IFNvdXRoIFdhbGVzKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWFzdGVybiBUaW1lIChOZXcgU291dGggV2FsZXMpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJBdXN0cmFsaWFuIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoTmV3IFNvdXRoIFdhbGVzKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gRWFzdGVybiBEYXlsaWdodCBUaW1lIChOZXcgU291dGggV2FsZXMpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzdHJhbGlhbiBFYXN0ZXJuIFRpbWUgKE5ldyBTb3V0aCBXYWxlcykiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1cnRoZXItZWFzdGVybiBFdXJvcGVhbiBUaW1lIiwgIkZFVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1cnRoZXItZWFzdGVybiBFdXJvcGVhbiBTdW1tZXIgVGltZSIsICJGRVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVydGhlci1lYXN0ZXJuIEV1cm9wZWFuIFRpbWUiLCAiRkVUIn07CkBAIC0xNjcsNiArMTY3LDkgQEAKICAgICAgICAgU3RyaW5nIElSVFtdID0gbmV3IFN0cmluZ1tdIHsiSXJhbiBTdGFuZGFyZCBUaW1lIiwgIklSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmFuIERheWxpZ2h0IFRpbWUiLCAiSVJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklyYW4gVGltZSIsICJJUlQifTsKKyAgICAgICAgU3RyaW5nIElSS1RbXSA9IG5ldyBTdHJpbmdbXSB7Iklya3V0c2sgVGltZSIsICJJUktUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklya3V0c2sgU3VtbWVyIFRpbWUiLCAiSVJLU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXJrdXRzayBUaW1lIiwgIklSS1QifTsKICAgICAgICAgU3RyaW5nIElTUkFFTFtdID0gbmV3IFN0cmluZ1tdIHsiSXNyYWVsIFN0YW5kYXJkIFRpbWUiLCAiSVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXNyYWVsIERheWxpZ2h0IFRpbWUiLCAiSURUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXNyYWVsIFRpbWUiLCAiSVQifTsKQEAgLTE3NiwxMSArMTc5LDE0IEBACiAgICAgICAgIFN0cmluZyBKU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkphcGFuIFN0YW5kYXJkIFRpbWUiLCAiSlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmFwYW4gRGF5bGlnaHQgVGltZSIsICJKRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXBhbiBUaW1lIiwgIkpUIn07CisgICAgICAgIFN0cmluZyBLUkFUW10gPSBuZXcgU3RyaW5nW10geyJLcmFzbm95YXJzayBUaW1lIiwgIktSQVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS3Jhc25veWFyc2sgU3VtbWVyIFRpbWUiLCAiS1JBU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS3Jhc25veWFyc2sgVGltZSIsICJLUkFUIn07CiAgICAgICAgIFN0cmluZyBLU1RbXSA9IG5ldyBTdHJpbmdbXSB7IktvcmVhIFN0YW5kYXJkIFRpbWUiLCAiS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS29yZWEgRGF5bGlnaHQgVGltZSIsICJLRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLb3JlYSBUaW1lIiwgIktUIn07CiAgICAgICAgIFN0cmluZyBMT1JEX0hPV0VbXSA9IG5ldyBTdHJpbmdbXSB7IkxvcmQgSG93ZSBTdGFuZGFyZCBUaW1lIiwgIkxIU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3JkIEhvd2UgU3VtbWVyIFRpbWUiLCAiTEhTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvcmQgSG93ZSBEYXlsaWdodCBUaW1lIiwgIkxIRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3JkIEhvd2UgVGltZSIsICJMSFQifTsKICAgICAgICAgU3RyaW5nIE1IVFtdID0gbmV3IFN0cmluZ1tdIHsiTWFyc2hhbGwgSXNsYW5kcyBUaW1lIiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMgU3VtbWVyIFRpbWUiLCAiTUhTVCIsCkBAIC0yMzAsMjEgKzIzNiwxNSBAQAogICAgICAgICBTdHJpbmcgU0dUW10gPSBuZXcgU3RyaW5nW10geyJTaW5nYXBvcmUgVGltZSIsICJTR1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW5nYXBvcmUgU3VtbWVyIFRpbWUiLCAiU0dTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbmdhcG9yZSBUaW1lIiwgIlNHVCJ9OwotICAgICAgICBTdHJpbmcgU0xTVFtdID0gbmV3IFN0cmluZ1tdIHsiR3JlZW53aWNoIE1lYW4gVGltZSIsICJHTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2llcnJhIExlb25lIFN1bW1lciBUaW1lIiwgIlNMU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2llcnJhIExlb25lIFRpbWUiLCAiU0xUIn07Ci0gICAgICAgIFN0cmluZyBUQVNNQU5JQVtdID0gbmV3IFN0cmluZ1tdIHsiRWFzdGVybiBTdGFuZGFyZCBUaW1lIChUYXNtYW5pYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYXN0ZXJuIFN1bW1lciBUaW1lIChUYXNtYW5pYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYXN0ZXJuIFRpbWUgKFRhc21hbmlhKSIsICJFVCJ9OworICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7IkF1c3RyYWxpYW4gRWFzdGVybiBTdGFuZGFyZCBUaW1lIChUYXNtYW5pYSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzdHJhbGlhbiBFYXN0ZXJuIERheWxpZ2h0IFRpbWUgKFRhc21hbmlhKSIsICJBRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXN0cmFsaWFuIEVhc3Rlcm4gVGltZSAoVGFzbWFuaWEpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVE1UW10gPSBuZXcgU3RyaW5nW10geyJUdXJrbWVuaXN0YW4gVGltZSIsICJUTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdXJrbWVuaXN0YW4gU3VtbWVyIFRpbWUiLCAiVE1TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1cmttZW5pc3RhbiBUaW1lIiwgIlRNVCJ9OwogICAgICAgICBTdHJpbmcgVUxBVFtdPSBuZXcgU3RyaW5nW10geyJVbGFhbmJhYXRhciBUaW1lIiwgIlVMQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbGFhbmJhYXRhciBTdW1tZXIgVGltZSIsICJVTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVsYWFuYmFhdGFyIFRpbWUiLCAiVUxBVCJ9OwotICAgICAgICBTdHJpbmcgV0FSVFtdID0gbmV3IFN0cmluZ1tdIHsiV2VzdGVybiBBcmdlbnRpbmUgVGltZSIsICJXQVJUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3Rlcm4gQXJnZW50aW5lIFN1bW1lciBUaW1lIiwgIldBUlNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3Rlcm4gQXJnZW50aW5lIFRpbWUiLCAiV0FSVCJ9OwogICAgICAgICBTdHJpbmcgV0FUW10gPSBuZXcgU3RyaW5nW10geyJXZXN0ZXJuIEFmcmljYW4gVGltZSIsICJXQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZXN0ZXJuIEFmcmljYW4gU3VtbWVyIFRpbWUiLCAiV0FTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3Rlcm4gQWZyaWNhbiBUaW1lIiwgIldBVCJ9OwpAQCAtMjU0LDI3ICsyNTQsMzAgQEAKICAgICAgICAgU3RyaW5nIFdJVFtdID0gbmV3IFN0cmluZ1tdIHsiV2VzdCBJbmRvbmVzaWEgVGltZSIsICJXSUIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZXN0IEluZG9uZXNpYSBTdW1tZXIgVGltZSIsICJXSVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdCBJbmRvbmVzaWEgVGltZSIsICJXSUIifTsKLSAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ildlc3Rlcm4gU3RhbmRhcmQgVGltZSAoQXVzdHJhbGlhKSIsICJXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdGVybiBTdW1tZXIgVGltZSAoQXVzdHJhbGlhKSIsICJXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdGVybiBUaW1lIChBdXN0cmFsaWEpIiwgIldUIn07CisgICAgICAgIFN0cmluZyBXU1RfQVVTW10gPSBuZXcgU3RyaW5nW10geyJBdXN0cmFsaWFuIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSIsICJBV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gV2VzdGVybiBEYXlsaWdodCBUaW1lIiwgIkFXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzdHJhbGlhbiBXZXN0ZXJuIFRpbWUiLCAiQVdUIn07CiAgICAgICAgIFN0cmluZyBTQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiU2Ftb2EgU3RhbmRhcmQgVGltZSIsICJTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbW9hIERheWxpZ2h0IFRpbWUiLCAiU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1vYSBUaW1lIiwgIlNUIn07Ci0gICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7Ildlc3QgU2Ftb2EgVGltZSIsICJXU1QiLAorICAgICAgICBTdHJpbmcgV1NUX1NBTU9BW10gPSBuZXcgU3RyaW5nW10geyJXZXN0IFNhbW9hIFN0YW5kYXJkIFRpbWUiLCAiV1NTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3QgU2Ftb2EgRGF5bGlnaHQgVGltZSIsICJXU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdCBTYW1vYSBUaW1lIiwgIldTVCJ9OwogICAgICAgICBTdHJpbmcgQ2hTVFtdID0gbmV3IFN0cmluZ1tdIHsiQ2hhbW9ycm8gU3RhbmRhcmQgVGltZSIsICJDaFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW1vcnJvIERheWxpZ2h0IFRpbWUiLCAiQ2hEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFtb3JybyBUaW1lIiwgIkNoVCJ9OwotICAgICAgICBTdHJpbmcgVklDVE9SSUFbXSA9IG5ldyBTdHJpbmdbXSB7IkVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoVmljdG9yaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWFzdGVybiBTdW1tZXIgVGltZSAoVmljdG9yaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWFzdGVybiBUaW1lIChWaWN0b3JpYSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJBdXN0cmFsaWFuIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoVmljdG9yaWEpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gRWFzdGVybiBEYXlsaWdodCBUaW1lIChWaWN0b3JpYSkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzdHJhbGlhbiBFYXN0ZXJuIFRpbWUgKFZpY3RvcmlhKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFVUQ1tdID0gbmV3IFN0cmluZ1tdIHsiQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUiLCAiVVRDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUiLCAiVVRDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUiLCAiVVRDIn07CiAgICAgICAgIFN0cmluZyBVWlRbXSA9IG5ldyBTdHJpbmdbXSB7IlV6YmVraXN0YW4gVGltZSIsICJVWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVemJla2lzdGFuIFN1bW1lciBUaW1lIiwgIlVaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVemJla2lzdGFuIFRpbWUiLCAiVVpUIn07CisgICAgICAgIFN0cmluZyBYSlRbXSA9IG5ldyBTdHJpbmdbXSB7IlhpbmppYW5nIFN0YW5kYXJkIFRpbWUiLCAiWEpUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWGluamlhbmcgRGF5bGlnaHQgVGltZSIsICJYSkRUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWGluamlhbmcgVGltZSIsICJYSlQifTsKIAogICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW10gewogICAgICAgICAgICAgeyJBbWVyaWNhL0xvc19BbmdlbGVzIiwgUFNUfSwKQEAgLTMzNiw3ICszMzksNyBAQAogICAgICAgICAgICAgeyJBZnJpY2EvRGppYm91dGkiLCBFQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRG91YWxhIiwgV0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0VsX0FhaXVuIiwgV0VUfSwKLSAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgU0xTVH0sCisgICAgICAgICAgICB7IkFmcmljYS9GcmVldG93biIsIEdNVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9HYWJvcm9uZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9IYXJhcmUiLCBDQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvSm9oYW5uZXNidXJnIiwgU0FTVH0sCkBAIC00MzcsNyArNDQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdGVybiBHcmVlbmxhbmQgU3VtbWVyIFRpbWUiLCAiV0dTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3Rlcm4gR3JlZW5sYW5kIFRpbWUiLCAiV0dUIn19LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dvb3NlX0JheSIsIEFTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEVTVH0sCisgICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3JlbmFkYSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhZGVsb3VwZSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhdGVtYWxhIiwgQ1NUfSwKQEAgLTQ4NCw5ICs0ODcsNyBAQAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbmRvemEiLCBBR1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbm9taW5lZSIsIENTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVyaWRhIiwgQ1NUfSwKLSAgICAgICAgICAgIHsiQW1lcmljYS9NZXRsYWthdGxhIiwgbmV3IFN0cmluZ1tdIHsiTWV0bGFrYXRsYSBTdGFuZGFyZCBUaW1lIiwgIk1lU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRsYWthdGxhIERheWxpZ2h0IFRpbWUiLCAiTWVEVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGxha2F0bGEgVGltZSIsICJNZVQifX0sCisgICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIFBTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWV4aWNvX0NpdHkiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01pcXVlbG9uIiwgbmV3IFN0cmluZ1tdIHsiUGllcnJlICYgTWlxdWVsb24gU3RhbmRhcmQgVGltZSIsICJQTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpZXJyZSAmIE1pcXVlbG9uIERheWxpZ2h0IFRpbWUiLCAiUE1EVCIsCkBAIC01NTUsOCArNTU2LDggQEAKICAgICAgICAgICAgIHsiQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZSIsIG5ldyBTdHJpbmdbXSB7IkR1bW9udC1kJ1VydmlsbGUgVGltZSIsICJERFVUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1bW9udC1kJ1VydmlsbGUgU3VtbWVyIFRpbWUiLCAiRERVU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVtb250LWQnVXJ2aWxsZSBUaW1lIiwgIkREVVQifX0sCi0gICAgICAgICAgICB7IkFudGFyY3RpY2EvTWFjcXVhcmllIiwgbmV3IFN0cmluZ1tdIHsiTWFjcXVhcmllIElzbGFuZCBUaW1lIiwgIk1JU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hY3F1YXJpZSBJc2xhbmQgU3VtbWVyIFRpbWUiLCAiTUlTVCIsCisgICAgICAgICAgICB7IkFudGFyY3RpY2EvTWFjcXVhcmllIiwgbmV3IFN0cmluZ1tdIHsiTWFjcXVhcmllIElzbGFuZCBTdGFuZGFyZCBUaW1lIiwgIk1JU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hY3F1YXJpZSBJc2xhbmQgRGF5bGlnaHQgVGltZSIsICJNSURUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWNxdWFyaWUgSXNsYW5kIFRpbWUiLCAiTUlTVCJ9fSwKICAgICAgICAgICAgIHsiQW50YXJjdGljYS9NYXdzb24iLCBuZXcgU3RyaW5nW10geyJNYXdzb24gVGltZSIsICJNQVdUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXdzb24gU3VtbWVyIFRpbWUiLCAiTUFXU1QiLApAQCAtNjA3LDYgKzYwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJ1bmVpIFN1bW1lciBUaW1lIiwgIkJOU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJydW5laSBUaW1lIiwgIkJOVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9DYWxjdXR0YSIsIElTVH0sCisgICAgICAgICAgICB7IkFzaWEvQ2hpdGEiLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9DaG9pYmFsc2FuIiwgbmV3IFN0cmluZ1tdIHsiQ2hvaWJhbHNhbiBUaW1lIiwgIkNIT1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaG9pYmFsc2FuIFN1bW1lciBUaW1lIiwgIkNIT1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hvaWJhbHNhbiBUaW1lIiwgIkNIT1QifX0sCkBAIC02MzEsOSArNjMzLDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9Ib3ZkIiwgbmV3IFN0cmluZ1tdIHsiSG92ZCBUaW1lIiwgIkhPVlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3ZkIFN1bW1lciBUaW1lIiwgIkhPVlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG92ZCBUaW1lIiwgIkhPVlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIG5ldyBTdHJpbmdbXSB7Iklya3V0c2sgVGltZSIsICJJUktUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXJrdXRzayBTdW1tZXIgVGltZSIsICJJUktTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklya3V0c2sgVGltZSIsICJJUktUIn19LAorICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmFrYXJ0YSIsIFdJVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmF5YXB1cmEiLCBuZXcgU3RyaW5nW10geyJFYXN0IEluZG9uZXNpYSBUaW1lIiwgIldJVCIsCkBAIC02NDYsNyArNjQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXRyb3BhdmxvdnNrLUthbWNoYXRza2kgU3VtbWVyIFRpbWUiLCAiUEVUU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBldHJvcGF2bG92c2stS2FtY2hhdHNraSBUaW1lIiwgIlBFVFQifX0sCiAgICAgICAgICAgICB7IkFzaWEvS2FyYWNoaSIsIFBLVH0sCi0gICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIFhKVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2F0aG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRtYW5kdSIsIE5QVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2hhbmR5Z2EiLCBuZXcgU3RyaW5nW10geyJLaGFuZHlnYSBUaW1lIiwgIllBS1QiLApAQCAtNjU0LDkgKzY1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLaGFuZHlnYSBUaW1lIiwgIllBS1QifX0sCiAKICAgICAgICAgICAgIHsiQXNpYS9Lb2xrYXRhIiwgSVNUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIG5ldyBTdHJpbmdbXSB7IktyYXNub3lhcnNrIFRpbWUiLCAiS1JBVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLcmFzbm95YXJzayBTdW1tZXIgVGltZSIsICJLUkFTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLcmFzbm95YXJzayBUaW1lIiwgIktSQVQifX0sCisgICAgICAgICAgICB7IkFzaWEvS3Jhc25veWFyc2siLCBLUkFUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWFsYV9MdW1wdXIiLCBNWVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1Y2hpbmciLCBNWVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1d2FpdCIsIEFSQVNUfSwKQEAgLTY3MSw3ICs2NjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBoaWxpcHBpbmVzIFRpbWUiLCAiUEhUIn19LAogICAgICAgICAgICAgeyJBc2lhL011c2NhdCIsIEdTVH0sCiAgICAgICAgICAgICB7IkFzaWEvTmljb3NpYSIsIEVFVH0sCi0gICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgTk9WVH0sCisgICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvTm92b3NpYmlyc2siLCBOT1ZUfSwKICAgICAgICAgICAgIHsiQXNpYS9PcmFsIiwgbmV3IFN0cmluZ1tdIHsiT3JhbCBUaW1lIiwgIk9SQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmFsIFN1bW1lciBUaW1lIiwgIk9SQVNUIiwKQEAgLTY5Nyw2ICs2OTUsOSBAQAogICAgICAgICAgICAgeyJBc2lhL1NhbWFya2FuZCIsIFVaVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2VvdWwiLCBLU1R9LAogICAgICAgICAgICAgeyJBc2lhL1NpbmdhcG9yZSIsIFNHVH0sCisgICAgICAgICAgICB7IkFzaWEvU3JlZG5la29seW1zayIsIG5ldyBTdHJpbmdbXSB7IlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBEYXlsaWdodCBUaW1lIiwgIlNSRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBUaW1lIiwgIlNSRVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvVGFpcGVpIiwgQ1RUfSwKICAgICAgICAgICAgIHsiQXNpYS9UZWxfQXZpdiIsIElTUkFFTH0sCiAgICAgICAgICAgICB7IkFzaWEvVGFzaGtlbnQiLCBVWlR9LApAQCAtNzA5LDcgKzcxMCw3IEBACiAgICAgICAgICAgICB7IkFzaWEvVWp1bmdfUGFuZGFuZyIsIENJVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhYW5iYWF0YXIiLCBVTEFUfSwKICAgICAgICAgICAgIHsiQXNpYS9VbGFuX0JhdG9yIiwgVUxBVH0sCi0gICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9VcnVtcWkiLCBYSlR9LAogICAgICAgICAgICAgeyJBc2lhL1VzdC1OZXJhIiwgbmV3IFN0cmluZ1tdIHsiVXN0LU5lcmEgVGltZSIsICJWTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzdC1OZXJhIFN1bW1lciBUaW1lIiwgIlZMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzdC1OZXJhIFRpbWUiLCAiVkxBVCJ9fSwKQEAgLTc1MSw5ICs3NTIsOSBAQAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ2FuYmVycmEiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0N1cnJpZSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvRGFyd2luIiwgREFSV0lOfSwKLSAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiQ2VudHJhbCBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUgKEF1c3RyYWxpYSkiLCAiQ1dTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgV2VzdGVybiBTdW1tZXIgVGltZSAoQXVzdHJhbGlhKSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCBXZXN0ZXJuIFRpbWUgKEF1c3RyYWxpYSkiLCAiQ1dUIn19LAorICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJBdXN0cmFsaWFuIENlbnRyYWwgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgIkFDV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVzdHJhbGlhbiBDZW50cmFsIFdlc3Rlcm4gRGF5bGlnaHQgVGltZSIsICJBQ1dEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYW4gQ2VudHJhbCBXZXN0ZXJuIFRpbWUiLCAiQUNXVCJ9fSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0hvYmFydCIsIFRBU01BTklBfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0xISSIsIExPUkRfSE9XRX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9MaW5kZW1hbiIsIEJSSVNCQU5FfSwKQEAgLTgxOSw3ICs4MjAsNyBAQAogICAgICAgICAgICAgeyJFdXJvcGUvSXNsZV9vZl9NYW4iLCBHTVRCU1R9LAogICAgICAgICAgICAgeyJFdXJvcGUvSXN0YW5idWwiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvSmVyc2V5IiwgR01UQlNUfSwKLSAgICAgICAgICAgIHsiRXVyb3BlL0thbGluaW5ncmFkIiwgRkVUfSwKKyAgICAgICAgICAgIHsiRXVyb3BlL0thbGluaW5ncmFkIiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0tpZXYiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvTGlzYm9uIiwgV0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0xqdWJsamFuYSIsIENFVH0sCkBAIC04NTQsOSArODU1LDcgQEAKICAgICAgICAgICAgIHsiRXVyb3BlL1ZhdGljYW4iLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvVmllbm5hIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1ZpbG5pdXMiLCBFRVR9LAotICAgICAgICAgICAgeyJFdXJvcGUvVm9sZ29ncmFkIiwgbmV3IFN0cmluZ1tdIHsiVm9sZ29ncmFkIFRpbWUiLCAiVk9MVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb2xnb2dyYWQgU3VtbWVyIFRpbWUiLCAiVk9MU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVm9sZ29ncmFkIFRpbWUiLCAiVk9MVCJ9fSwKKyAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIE1TS30sCiAgICAgICAgICAgICB7IkV1cm9wZS9XYXJzYXciLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvWmFncmViIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phcG9yb3poeWUiLCBFRVR9LApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2RlL1RpbWVab25lTmFtZXNfZGUuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9kZS9UaW1lWm9uZU5hbWVzX2RlLmphdmEKaW5kZXggZWE3YWI1Ny4uOWI0ZTY1MCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2RlL1RpbWVab25lTmFtZXNfZGUuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvZGUvVGltZVpvbmVOYW1lc19kZS5qYXZhCkBAIC00OCw5ICs0OCw5IEBACiAgICAgICAgIFN0cmluZyBBQ1RbXSA9IG5ldyBTdHJpbmdbXSB7IkFjcmUgTm9ybWFsemVpdCIsICJBQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3JlIFNvbW1lcnplaXQiLCAiQUNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjcmUgTm9ybWFsemVpdCIsICJBQ1QifTsKLSAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJaZW50cmFsZSBOb3JtYWx6ZWl0IChTXHUwMEZDZGF1c3RyYWxpZW4pIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVudHJhbGUgU29tbWVyemVpdCAoU1x1MDBGQ2RhdXN0cmFsaWVuKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplbnRyYWxlIFplaXR6b25lIChTXHUwMEZDZGF1c3RyYWxpZW4pIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiWmVudHJhbGUgTm9ybWFsemVpdCAoU1x1MDBGQ2RhdXN0cmFsaWVuKSIsICJBQ1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZW50cmFsZSBTb21tZXJ6ZWl0IChTXHUwMEZDZGF1c3RyYWxpZW4pIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplbnRyYWxlIFplaXR6b25lIChTXHUwMEZDZGF1c3RyYWxpZW4pIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQUdUW10gPSBuZXcgU3RyaW5nW10geyJBcmdlbnRpbmlzY2hlIFplaXQiLCAiQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJnZW50aW5pc2NoZSBTb21tZXJ6ZWl0IiwgIkFSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmdlbnRpbmlzY2hlIFplaXQiLCAiQVJUIn07CkBAIC03MiwxMiArNzIsMTIgQEAKICAgICAgICAgU3RyaW5nIEJEVFtdID0gbmV3IFN0cmluZ1tdIHsiQmFuZ2xhZGVzY2ggWmVpdCIsICJCRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5nbGFkZXNjaCBTb21tZXJ6ZWl0IiwgIkJEU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5nbGFkZXNjaCBaZWl0IiwgIkJEVCJ9OwotICAgICAgICBTdHJpbmcgQlJJU0JBTkVbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MDBENnN0bGljaGUgTm9ybWFsemVpdCAoUXVlZW5zbGFuZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpY2hlIFNvbW1lcnplaXQgKFF1ZWVuc2xhbmQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWNoZSBaZWl0em9uZSAoUXVlZW5zbGFuZCkiLCAiRVQifTsKLSAgICAgICAgU3RyaW5nIEJST0tFTl9ISUxMW10gPSBuZXcgU3RyaW5nW10geyJaZW50cmFsZSBOb3JtYWx6ZWl0IChTXHUwMEZDZGF1c3RyYWxpZW4vTmV3IFNvdXRoIFdhbGVzKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplbnRyYWxlIFNvbW1lcnplaXQgKFNcdTAwRkNkYXVzdHJhbGllbi9OZXcgU291dGggV2FsZXMpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVudHJhbGUgWmVpdHpvbmUgKFNcdTAwRkNkYXVzdHJhbGllbi9OZXcgU291dGggV2FsZXMpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiXHUwMEQ2c3RsaWNoZSBOb3JtYWx6ZWl0IChRdWVlbnNsYW5kKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpY2hlIFNvbW1lcnplaXQgKFF1ZWVuc2xhbmQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgWmVpdHpvbmUgKFF1ZWVuc2xhbmQpIiwgIkFFVCJ9OworICAgICAgICBTdHJpbmcgQlJPS0VOX0hJTExbXSA9IG5ldyBTdHJpbmdbXSB7IlplbnRyYWxlIE5vcm1hbHplaXQgKFNcdTAwRkNkYXVzdHJhbGllbi9OZXcgU291dGggV2FsZXMpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplbnRyYWxlIFNvbW1lcnplaXQgKFNcdTAwRkNkYXVzdHJhbGllbi9OZXcgU291dGggV2FsZXMpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplbnRyYWxlIFplaXR6b25lIChTXHUwMEZDZGF1c3RyYWxpZW4vTmV3IFNvdXRoIFdhbGVzKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIEJSVFtdID0gbmV3IFN0cmluZ1tdIHsiQnJhc2lsaWFuaXNjaGUgWmVpdCIsICJCUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmFzaWxpYW5pc2NoZSBTb21tZXJ6ZWl0IiwgIkJSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmFzaWxpYW5pc2NoZSBaZWl0IiwgIkJSVCJ9OwpAQCAtMTExLDkgKzExMSw5IEBACiAgICAgICAgIFN0cmluZyBDVUJBW10gPSBuZXcgU3RyaW5nW10geyJLdWJhbmlzY2hlIE5vcm1hbHplaXQiLCAiQ1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkt1YmFuaXNjaGUgU29tbWVyemVpdCIsICJDRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS3ViYW5pc2NoZSBOb3JtYWx6ZWl0IiwgIkNUIn07Ci0gICAgICAgIFN0cmluZyBEQVJXSU5bXSA9IG5ldyBTdHJpbmdbXSB7IlplbnRyYWxlIE5vcm1hbHplaXQgKE5vcnRoZXJuIFRlcnJpdG9yeSkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVudHJhbGUgU29tbWVyemVpdCAoTm9ydGhlcm4gVGVycml0b3J5KSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZW50cmFsZSBaZWl0em9uZSAoTm9ydGhlcm4gVGVycml0b3J5KSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJaZW50cmFsZSBOb3JtYWx6ZWl0IChOb3J0aGVybiBUZXJyaXRvcnkpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZW50cmFsZSBTb21tZXJ6ZWl0IChOb3J0aGVybiBUZXJyaXRvcnkpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZW50cmFsZSBaZWl0em9uZSAoTm9ydGhlcm4gVGVycml0b3J5KSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIERVQkxJTltdID0gbmV3IFN0cmluZ1tdIHsiR3JlZW53aWNoIFplaXQiLCAiR01UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXJpc2NoZSBTb21tZXJ6ZWl0IiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklyaXNjaGUgWmVpdCIsICJJVCJ9OwpAQCAtMTMyLDkgKzEzMiw5IEBACiAgICAgICAgIFN0cmluZyBFU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MDBkNnN0bGljaGUgTm9ybWFsemVpdCIsICJFU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwZDZzdGxpY2hlIFNvbW1lcnplaXQiLCAiRURUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWNoZSBaZWl0em9uZSIsICJFVCJ9OwotICAgICAgICBTdHJpbmcgRVNUX05TV1tdID0gbmV3IFN0cmluZ1tdIHsiXHUwMEQ2c3RsaWNoZSBOb3JtYWx6ZWl0IChOZXcgU291dGggV2FsZXMpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpY2hlIFNvbW1lcnplaXQgKE5ldyBTb3V0aCBXYWxlcykiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgWmVpdHpvbmUgKE5ldyBTb3V0aCBXYWxlcykiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIEVTVF9OU1dbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MDBENnN0bGljaGUgTm9ybWFsemVpdCAoTmV3IFNvdXRoIFdhbGVzKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgU29tbWVyemVpdCAoTmV3IFNvdXRoIFdhbGVzKSIsICJBRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgWmVpdHpvbmUgKE5ldyBTb3V0aCBXYWxlcykiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7IkthbGluaW5ncmFkZXIgWmVpdCIsICJGRVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLYWxpbmluZ3JhZGVyIFNvbW1lcnplaXQiLCAiRkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkthbGluaW5ncmFkZXIgWmVpdCIsICJGRVQifTsKQEAgLTE2NSw2ICsxNjUsOSBAQAogICAgICAgICBTdHJpbmcgSUNUW10gPSBuZXcgU3RyaW5nW10geyJJbmRvY2hpbmEgWmVpdCIsICJJQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRvY2hpbmEgU29tbWVyemVpdCIsICJJQ1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kb2NoaW5hIFplaXQiLCAiSUNUIn07CisgICAgICAgIFN0cmluZyBJUktUW10gPSBuZXcgU3RyaW5nW10geyJJcmt1dHNrIFplaXQiLCAiSVJLVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmt1dHNrIFNvbW1lcnplaXQiLCAiSVJLU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXJrdXRzayBaZWl0IiwgIklSS1QifTsKICAgICAgICAgU3RyaW5nIElSVFtdID0gbmV3IFN0cmluZ1tdIHsiSXJhbmlzY2hlIE5vcm1hbHplaXQiLCAiSVJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklyYW5pc2NoZSBTb21tZXJ6ZWl0IiwgIklSRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmFuaXNjaGUgWmVpdCIsICJJUlQifTsKQEAgLTE3NywxMSArMTgwLDE0IEBACiAgICAgICAgIFN0cmluZyBKU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkphcGFuaXNjaGUgTm9ybWFsemVpdCIsICJKU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXBhbmlzY2hlIFNvbW1lcnplaXQiLCAiSkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVpdHpvbmUgZlx1MDBGQ3IgSmFwYW4iLCAiSlQifTsKKyAgICAgICAgU3RyaW5nIEtSQVRbXSA9IG5ldyBTdHJpbmdbXSB7IktyYXNub2phcnNrZXIgWmVpdCIsICJLUkFUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktyYXNub2phcnNrZXIgU29tbWVyemVpdCIsICJLUkFTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLcmFzbm9qYXJza2VyIFplaXQiLCAiS1JBVCJ9OwogICAgICAgICBTdHJpbmcgS1NUW10gPSBuZXcgU3RyaW5nW10geyJLb3JlYW5pc2NoZSBOb3JtYWx6ZWl0IiwgIktTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktvcmVhbmlzY2hlIFNvbW1lcnplaXQiLCAiS0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVpdHpvbmUgZlx1MDBGQ3IgS29yZWEiLCAiS1QifTsKICAgICAgICAgU3RyaW5nIExPUkRfSE9XRVtdID0gbmV3IFN0cmluZ1tdIHsiTG9yZCBIb3dlIE5vcm1hbHplaXQiLCAiTEhTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvcmQgSG93ZSBTb21tZXJ6ZWl0IiwgIkxIU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3JkIEhvd2UgU29tbWVyemVpdCIsICJMSERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9yZC1Ib3dlIE5vcm1hbHplaXQiLCAiTEhUIn07CiAgICAgICAgIFN0cmluZyBNSFRbXSA9IG5ldyBTdHJpbmdbXSB7Ik1hcnNoYWxsaW5zZWxuIFplaXQiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFyc2hhbGxpbnNlbG4gU29tbWVyemVpdCIsICJNSFNUIiwKQEAgLTIzMSwyMCArMjM3LDE1IEBACiAgICAgICAgIFN0cmluZyBTR1RbXSA9IG5ldyBTdHJpbmdbXSB7IlNpbmdhcHVyIFplaXQiLCAiU0dUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2luZ2FwdXIgU29tbWVyemVpdCIsICJTR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2luZ2FwdXIgWmVpdCIsICJTR1QifTsKLSAgICAgICAgU3RyaW5nIFNMU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkdyZWVud2ljaCBOb3JtYWx6ZWl0IiwgIkdNVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaWVycmEgTGVvbmUgU29tbWVyemVpdCIsICJTTFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpZXJyYSBMZW9uZSBaZWl0IiwgIlNMVCJ9OwotICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MDBENnN0bGljaGUgTm9ybWFsemVpdCAoVGFzbWFuaWVuKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgU29tbWVyemVpdCAoVGFzbWFuaWVuKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgWmVpdHpvbmUgKFRhc21hbmllbikiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFRBU01BTklBW10gPSBuZXcgU3RyaW5nW10geyJcdTAwRDZzdGxpY2hlIE5vcm1hbHplaXQgKFRhc21hbmllbikiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWNoZSBTb21tZXJ6ZWl0IChUYXNtYW5pZW4pIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgWmVpdHpvbmUgKFRhc21hbmllbikiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBUTVRbXSA9IG5ldyBTdHJpbmdbXSB7IlR1cmttZW5pc2NoZSBaZWl0IiwgIlRNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1cmttZW5pc2NoZSBTb21tZXJ6ZWl0IiwgIlRNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdXJrbWVuaXNjaGUgWmVpdCIsICJUTVQifTsKICAgICAgICAgU3RyaW5nIFVMQVRbXT0gbmV3IFN0cmluZ1tdIHsiVWxhYW5iYWF0YXIgWmVpdCIsICJVTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVWxhYW5iYWF0YXIgU29tbWVyemVpdCIsICJVTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVsYWFuYmFhdGFyIFplaXQiLCAiVUxBVCJ9OwotICAgICAgICBTdHJpbmcgV0FSVFtdID0gbmV3IFN0cmluZ1tdIHsiV2VzdGFyZ2VudGluaXNjaGUgWmVpdCIsICJXQVJUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3RhcmdlbnRpbmlzY2hlIFNvbW1lcnplaXQiLCAiV0FSU1QifTsKICAgICAgICAgU3RyaW5nIFdBVFtdID0gbmV3IFN0cmluZ1tdIHsiV2VzdGFmcmlrYW5pc2NoZSBaZWl0IiwgIldBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3RhZnJpa2FuaXNjaGUgU29tbWVyemVpdCIsICJXQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdGFmcmlrYW5pc2NoZSBaZWl0IiwgIldBVCJ9OwpAQCAtMjU0LDI3ICsyNTUsMzAgQEAKICAgICAgICAgU3RyaW5nIFdJVFtdID0gbmV3IFN0cmluZ1tdIHsiV2VzdGluZG9uZXNpc2NoZSBaZWl0IiwgIldJQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3RpbmRvbmVzaXNjaGUgU29tbWVyemVpdCIsICJXSVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdGluZG9uZXNpc2NoZSBaZWl0IiwgIldJQiJ9OwotICAgICAgICBTdHJpbmcgV1NUX0FVU1tdID0gbmV3IFN0cmluZ1tdIHsiV2VzdGxpY2hlIE5vcm1hbHplaXQgKEF1c3RyYWxpZW4pIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZXN0bGljaGUgU29tbWVyemVpdCAoQXVzdHJhbGllbikiLCAiV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3RsaWNoZSBaZWl0em9uZSAoQXVzdHJhbGllbikiLCAiV1QifTsKKyAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ildlc3RsaWNoZSBOb3JtYWx6ZWl0IChBdXN0cmFsaWVuKSIsICJBV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3RsaWNoZSBTb21tZXJ6ZWl0IChBdXN0cmFsaWVuKSIsICJBV0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3RsaWNoZSBaZWl0em9uZSAoQXVzdHJhbGllbikiLCAiQVdUIn07CiAgICAgICAgIFN0cmluZyBTQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiU2Ftb2EgTm9ybWFsemVpdCIsICJTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbW9hIFNvbW1lcnplaXQiLCAiU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZWl0em9uZSBmXHUwMEZDciBTYW1vYSIsICJTVCJ9OwotICAgICAgICBTdHJpbmcgV1NUX1NBTU9BW10gPSBuZXcgU3RyaW5nW10geyJXZXN0IFNhbW9hIFplaXQiLCAiV1NUIiwKKyAgICAgICAgU3RyaW5nIFdTVF9TQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiV2VzdCBTYW1vYSBaZWl0IiwgIldTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZXN0IFNhbW9hIFNvbW1lcnplaXQiLCAiV1NEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlc3QgU2Ftb2EgWmVpdCIsICJXU1QifTsKICAgICAgICAgU3RyaW5nIENoU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkNoYW1vcnJvIE5vcm1hbHplaXQiLCAiQ2hTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgIkNoYW1vcnJvIFNvbW1lcnplaXQiLCAiQ2hEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlplaXR6b25lIGZcdTAwRkNyIGRpZSBNYXJpYW5lbiIsICJDaFQifTsKLSAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJcdTAwRDZzdGxpY2hlIE5vcm1hbHplaXQgKFZpY3RvcmlhKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGljaGUgU29tbWVyemVpdCAoVmljdG9yaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWNoZSBaZWl0em9uZSAoVmljdG9yaWEpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBWSUNUT1JJQVtdID0gbmV3IFN0cmluZ1tdIHsiXHUwMEQ2c3RsaWNoZSBOb3JtYWx6ZWl0IChWaWN0b3JpYSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWNoZSBTb21tZXJ6ZWl0IChWaWN0b3JpYSkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWNoZSBaZWl0em9uZSAoVmljdG9yaWEpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVVRDW10gPSBuZXcgU3RyaW5nW10geyJLb29yZGluaWVydGUgVW5pdmVyc2FsemVpdCIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLb29yZGluaWVydGUgVW5pdmVyc2FsemVpdCIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLb29yZGluaWVydGUgVW5pdmVyc2FsemVpdCIsICJVVEMifTsKICAgICAgICAgU3RyaW5nIFVaVFtdID0gbmV3IFN0cmluZ1tdIHsiVXNiZWtpc3RhbiBaZWl0IiwgIlVaVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzYmVraXN0YW4gU29tbWVyemVpdCIsICJVWlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNiZWtpc3RhbiBaZWl0IiwgIlVaVCJ9OworICAgICAgICBTdHJpbmcgWEpUW10gPSBuZXcgU3RyaW5nW10geyJDaGluZXNpc2NoZSBOb3JtYWx6ZWl0IiwgIlhKVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5lc2lzY2hlIFNvbW1lcnplaXQiLCAiWEpEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplaXR6b25lIGZcdTAwRkNyIENoaW5hIiwgIlhKVCJ9OwogCiAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CiAgICAgICAgICAgICB7IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCBQU1R9LApAQCAtMzM2LDcgKzM0MCw3IEBACiAgICAgICAgICAgICB7IkFmcmljYS9Eamlib3V0aSIsIEVBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Eb3VhbGEiLCBXQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRWxfQWFpdW4iLCBXRVR9LAotICAgICAgICAgICAgeyJBZnJpY2EvRnJlZXRvd24iLCBTTFNUfSwKKyAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgR01UfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0dhYm9yb25lIiwgQ0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0hhcmFyZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Kb2hhbm5lc2J1cmciLCBTQVNUfSwKQEAgLTQzNyw3ICs0NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZXN0Z3JcdTAwZjZubFx1MDBlNG5kaXNjaGUgU29tbWVyemVpdCIsICJXR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdGdyXHUwMEY2bmxcdTAwRTRuZGlzY2hlIFplaXQiLCAiV0dUIn19LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dvb3NlX0JheSIsIEFTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEVTVH0sCisgICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3JlbmFkYSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhZGVsb3VwZSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhdGVtYWxhIiwgQ1NUfSwKQEAgLTQ4NCw5ICs0ODgsNyBAQAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbmRvemEiLCBBR1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbm9taW5lZSIsIENTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVyaWRhIiwgQ1NUfSwKLSAgICAgICAgICAgIHsiQW1lcmljYS9NZXRsYWthdGxhIiwgbmV3IFN0cmluZ1tdIHsiTWV0bGFrYXRsYSBOb3JtYWx6ZWl0IiwgIk1lU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRsYWthdGxhIFNvbW1lcnplaXQiLCAiTWVEVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGxha2F0bGEgTm9ybWFsemVpdCIsICJNZVQifX0sCisgICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIFBTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWV4aWNvX0NpdHkiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01pcXVlbG9uIiwgbmV3IFN0cmluZ1tdIHsiUGllcnJlICYgTWlxdWVsb24gTm9ybWFsemVpdCIsICJQTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpZXJyZSAmIE1pcXVlbG9uIFNvbW1lcnplaXQiLCAiUE1EVCIsCkBAIC02MDcsNiArNjA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcnVuZWkgU29tbWVyemVpdCIsICJCTlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcnVuZWkgWmVpdCIsICJCTlQifX0sCiAgICAgICAgICAgICB7IkFzaWEvQ2FsY3V0dGEiLCBJU1R9LAorICAgICAgICAgICAgeyJBc2lhL0NoaXRhIiwgSVJLVH0sCiAgICAgICAgICAgICB7IkFzaWEvQ2hvaWJhbHNhbiIsIG5ldyBTdHJpbmdbXSB7IkNob2liYWxzYW4gWmVpdCIsICJDSE9UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hvaWJhbHNhbiBTb21tZXJ6ZWl0IiwgIkNIT1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hvaWJhbHNhbiBaZWl0IiwgIkNIT1QifX0sCkBAIC02MzEsOSArNjM0LDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9Ib3ZkIiwgbmV3IFN0cmluZ1tdIHsiSG92ZCBaZWl0IiwgIkhPVlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3ZkIFNvbW1lcnplaXQiLCAiSE9WU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3ZkIFplaXQiLCAiSE9WVCJ9fSwKLSAgICAgICAgICAgIHsiQXNpYS9Jcmt1dHNrIiwgbmV3IFN0cmluZ1tdIHsiSXJrdXRzayBaZWl0IiwgIklSS1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmt1dHNrIFNvbW1lcnplaXQiLCAiSVJLU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmt1dHNrIFplaXQiLCAiSVJLVCJ9fSwKKyAgICAgICAgICAgIHsiQXNpYS9Jcmt1dHNrIiwgSVJLVH0sCiAgICAgICAgICAgICB7IkFzaWEvSXN0YW5idWwiLCBFRVR9LAogICAgICAgICAgICAgeyJBc2lhL0pha2FydGEiLCBXSVR9LAogICAgICAgICAgICAgeyJBc2lhL0pheWFwdXJhIiwgbmV3IFN0cmluZ1tdIHsiT3N0aW5kb25lc2lzY2hlIFplaXQiLCAiV0lUIiwKQEAgLTY0NiwxNiArNjQ3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGV0cm9wYXdsb3dzay1LYW10c2NoYXRraXNjaGUgU29tbWVyemVpdCIsICJQRVRTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGV0cm9wYXdsb3dzay1LYW10c2NoYXRraXNjaGUgWmVpdCIsICJQRVRUIn19LAogICAgICAgICAgICAgeyJBc2lhL0thcmFjaGkiLCBQS1R9LAotICAgICAgICAgICAgeyJBc2lhL0thc2hnYXIiLCBDVFR9LAorICAgICAgICAgICAgeyJBc2lhL0thc2hnYXIiLCBYSlR9LAogICAgICAgICAgICAgeyJBc2lhL0thdGhtYW5kdSIsIE5QVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2F0bWFuZHUiLCBOUFR9LAogICAgICAgICAgICAgeyJBc2lhL0toYW5keWdhIiwgbmV3IFN0cmluZ1tdIHsiQ2hhbmR5Z2EgWmVpdCIsICJZQUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW5keWdhIFNvbW1lcnplaXQiLCAiWUFLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbmR5Z2EgWmVpdCIsICJZQUtUIn19LAogICAgICAgICAgICAgeyJBc2lhL0tvbGthdGEiLCBJU1R9LAotICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgbmV3IFN0cmluZ1tdIHsiS3Jhc25vamFyc2tlciBaZWl0IiwgIktSQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS3Jhc25vamFyc2tlciBTb21tZXJ6ZWl0IiwgIktSQVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktyYXNub2phcnNrZXIgWmVpdCIsICJLUkFUIn19LAorICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VhbGFfTHVtcHVyIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWNoaW5nIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdXdhaXQiLCBBUkFTVH0sCkBAIC02NzAsNyArNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaGlsaXBwaW5pc2NoZSBaZWl0IiwgIlBIVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9NdXNjYXQiLCBHU1R9LAogICAgICAgICAgICAgeyJBc2lhL05pY29zaWEiLCBFRVR9LAotICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIE5PVlR9LAorICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIEtSQVR9LAogICAgICAgICAgICAgeyJBc2lhL05vdm9zaWJpcnNrIiwgTk9WVH0sCiAgICAgICAgICAgICB7IkFzaWEvT3JhbCIsIG5ldyBTdHJpbmdbXSB7Ik9yYWwgWmVpdCIsICJPUkFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhbCBTb21tZXJ6ZWl0IiwgIk9SQVNUIiwKQEAgLTY5Niw2ICs2OTUsOSBAQAogICAgICAgICAgICAgeyJBc2lhL1NhbWFya2FuZCIsIFVaVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2VvdWwiLCBLU1R9LAogICAgICAgICAgICAgeyJBc2lhL1NpbmdhcG9yZSIsIFNHVH0sCisgICAgICAgICAgICB7IkFzaWEvU3JlZG5la29seW1zayIsIG5ldyBTdHJpbmdbXSB7IlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBEYXlsaWdodCBUaW1lIiwgIlNSRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBUaW1lIiwgIlNSRVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvVGFpcGVpIiwgQ1RUfSwKICAgICAgICAgICAgIHsiQXNpYS9UZWxfQXZpdiIsIElTUkFFTH0sCiAgICAgICAgICAgICB7IkFzaWEvVGFzaGtlbnQiLCBVWlR9LApAQCAtNzA4LDcgKzcxMCw3IEBACiAgICAgICAgICAgICB7IkFzaWEvVWp1bmdfUGFuZGFuZyIsIENJVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhYW5iYWF0YXIiLCBVTEFUfSwKICAgICAgICAgICAgIHsiQXNpYS9VbGFuX0JhdG9yIiwgVUxBVH0sCi0gICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9VcnVtcWkiLCBYSlR9LAogICAgICAgICAgICAgeyJBc2lhL1VzdC1OZXJhIiwgbmV3IFN0cmluZ1tdIHsiVXN0LU5lcmEgWmVpdCIsICJWTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzdC1OZXJhIFNvbW1lcnplaXQiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXN0LU5lcmEgWmVpdCIsICJWTEFUIn19LApAQCAtNzUwLDkgKzc1Miw5IEBACiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9DYW5iZXJyYSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ3VycmllIiwgRVNUX05TV30sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9EYXJ3aW4iLCBEQVJXSU59LAotICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJaZW50cmFsLVdlc3RsaWNoZSBOb3JtYWx6ZWl0IChBdXN0cmFsaWVuKSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVudHJhbC1XZXN0bGljaGUgU29tbWVyemVpdCAoQXVzdHJhbGllbikiLCAiQ1dTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplbnRyYWwtV2VzdGxpY2hlIE5vcm1hbHplaXQgKEF1c3RyYWxpZW4pIiwgIkNXVCJ9fSwKKyAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiWmVudHJhbC1XZXN0bGljaGUgTm9ybWFsemVpdCAoQXVzdHJhbGllbikiLCAiQUNXU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZW50cmFsLVdlc3RsaWNoZSBTb21tZXJ6ZWl0IChBdXN0cmFsaWVuKSIsICJBQ1dEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplbnRyYWwtV2VzdGxpY2hlIE5vcm1hbHplaXQgKEF1c3RyYWxpZW4pIiwgIkFDV1QifX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9Ib2JhcnQiLCBUQVNNQU5JQX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9MSEkiLCBMT1JEX0hPV0V9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTGluZGVtYW4iLCBCUklTQkFORX0sCkBAIC04MTgsNyArODIwLDcgQEAKICAgICAgICAgICAgIHsiRXVyb3BlL0lzbGVfb2ZfTWFuIiwgR01UQlNUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0lzdGFuYnVsIiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0plcnNleSIsIEdNVEJTVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEZFVH0sCisgICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9LaWV2IiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0xpc2JvbiIsIFdFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9ManVibGphbmEiLCBDRVR9LApAQCAtODUzLDkgKzg1NSw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9WYXRpY2FuIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1ZpZW5uYSIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWxuaXVzIiwgRUVUfSwKLSAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIG5ldyBTdHJpbmdbXSB7IldvbGdvZ3JhZGVyIFplaXQiLCAiVk9MVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXb2xnb2dyYWRlciBTb21tZXJ6ZWl0IiwgIlZPTFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvbGdvZ3JhZGVyIFplaXQiLCAiVk9MVCJ9fSwKKyAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIE1TS30sCiAgICAgICAgICAgICB7IkV1cm9wZS9XYXJzYXciLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvWmFncmViIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phcG9yb3poeWUiLCBFRVR9LApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2VzL1RpbWVab25lTmFtZXNfZXMuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9lcy9UaW1lWm9uZU5hbWVzX2VzLmphdmEKaW5kZXggYzM1YzgwOS4uMDIzNTE1OCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2VzL1RpbWVab25lTmFtZXNfZXMuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvZXMvVGltZVpvbmVOYW1lc19lcy5qYXZhCkBAIC00OCw5ICs0OCw5IEBACiAgICAgICAgIFN0cmluZyBBQ1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgQWNyZSIsICJBQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBBY3JlIiwgIkFDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIEFjcmUiLCAiQUNUIn07Ci0gICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBlc3RcdTAwRTFuZGFyIENlbnRyYWwgKFN1ciBkZSBBdXN0cmFsaWEpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gQ2VudHJhbCAoU3VyIGRlIEF1c3RyYWxpYSkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIENlbnRyYWwgKEF1c3RyYWxpYSBkZWwgU3VyKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgQURFTEFJREVbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMEUxbmRhciBDZW50cmFsIChTdXIgZGUgQXVzdHJhbGlhKSIsICJBQ1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBDZW50cmFsIChTdXIgZGUgQXVzdHJhbGlhKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIENlbnRyYWwgKEF1c3RyYWxpYSBkZWwgU3VyKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIEFHVFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBBcmdlbnRpbmEiLCAiQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgQXJnZW50aW5hIiwgIkFSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIEFyZ2VudGluYSIsICJBUlQifTsKQEAgLTcyLDEyICs3MiwxMiBAQAogICAgICAgICBTdHJpbmcgQkRUW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGRlIEJhbmdsYWRlc2giLCAiQkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgQmFuZ2xhZGVzaCIsICJCRFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBCYW5nbGFkZXNoIiwgIkJEVCJ9OwotICAgICAgICBTdHJpbmcgQlJJU0JBTkVbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMEUxbmRhciBkZWwgRXN0ZSAoUXVlZW5zbGFuZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGVzdFx1MDBFMW5kYXIgZGUgdmVyYW5vIGRlbCBFc3RlIChRdWVlbnNsYW5kKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgT3JpZW50YWwgKFF1ZWVuc2xhbmQpIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBlc3RcdTAwRTFuZGFyIENlbnRyYWwgKFN1ciBkZSBBdXN0cmFsaWEvTnVldmEgR2FsZXMgZGVsIFN1cikiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBDZW50cmFsIChTdXIgZGUgQXVzdHJhbGlhL051ZXZhIEdhbGVzIGRlbCBTdXIpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBDZW50cmFsIChBdXN0cmFsaWEgZGVsIFN1ci9OdWV2YSBHYWxlcyBkZWwgU3VyKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgQlJJU0JBTkVbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMEUxbmRhciBkZWwgRXN0ZSAoUXVlZW5zbGFuZCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBlc3RcdTAwRTFuZGFyIGRlIHZlcmFubyBkZWwgRXN0ZSAoUXVlZW5zbGFuZCkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBPcmllbnRhbCAoUXVlZW5zbGFuZCkiLCAiQUVUIn07CisgICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBlc3RcdTAwRTFuZGFyIENlbnRyYWwgKFN1ciBkZSBBdXN0cmFsaWEvTnVldmEgR2FsZXMgZGVsIFN1cikiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gQ2VudHJhbCAoU3VyIGRlIEF1c3RyYWxpYS9OdWV2YSBHYWxlcyBkZWwgU3VyKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIENlbnRyYWwgKEF1c3RyYWxpYSBkZWwgU3VyL051ZXZhIEdhbGVzIGRlbCBTdXIpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQlJUW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGRlIEJyYXNpbCIsICJCUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBCcmFzaWwiLCAiQlJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgQnJhc2lsIiwgIkJSVCJ9OwpAQCAtMTExLDkgKzExMSw5IEBACiAgICAgICAgIFN0cmluZyBDVUJBW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBlMW5kYXIgZGUgQ3ViYSIsICJDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgQ3ViYSIsICJDRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBDdWJhIiwgIkNUIn07Ci0gICAgICAgIFN0cmluZyBEQVJXSU5bXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMEUxbmRhciBDZW50cmFsICh0ZXJyaXRvcmlvIGRlbCBOb3J0ZSkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gQ2VudHJhbCAodGVycml0b3JpbyBkZWwgTm9ydGUpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgQ2VudHJhbCAoVGVycml0b3JpbyBTZXB0ZW50cmlvbmFsKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgQ2VudHJhbCAodGVycml0b3JpbyBkZWwgTm9ydGUpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBDZW50cmFsICh0ZXJyaXRvcmlvIGRlbCBOb3J0ZSkiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgQ2VudHJhbCAoVGVycml0b3JpbyBTZXB0ZW50cmlvbmFsKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIERVQkxJTltdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZWwgTWVyaWRpYW5vIGRlIEdyZWVud2ljaCIsICJHTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBJcmxhbmRhIiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgSXJsYW5kYSIsICJJVCJ9OwpAQCAtMTMyLDkgKzEzMiw5IEBACiAgICAgICAgIFN0cmluZyBFU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMGUxbmRhciBPcmllbnRhbCIsICJFU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBPcmllbnRhbCIsICJFRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIE9yaWVudGFsIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgT3JpZW50YWwgKE51ZXZhIEdhbGVzIGRlbCBTdXIpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBPcmllbnRhbCAoTnVldmEgR2FsZXMgZGVsIFN1cikiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgT3JpZW50YWwgKE51ZXZhIEdhbGVzIGRlbCBTdXIpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgT3JpZW50YWwgKE51ZXZhIEdhbGVzIGRlbCBTdXIpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gT3JpZW50YWwgKE51ZXZhIEdhbGVzIGRlbCBTdXIpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBPcmllbnRhbCAoTnVldmEgR2FsZXMgZGVsIFN1cikiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgRXVyb3BhIG1cdTAwRTFzIE9yaWVudGFsIiwgIkZFVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIEV1cm9wYSBtXHUwMEUxcyBPcmllbnRhbCIsICJGRVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBFdXJvcGEgbVx1MDBFMXMgT3JpZW50YWwiLCAiRkVUIn07CkBAIC0xNjUsNiArMTY1LDkgQEAKICAgICAgICAgU3RyaW5nIElDVFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBJbmRvY2hpbmEiLCAiSUNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgSW5kb2NoaW5hIiwgIklDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIEluZG9jaGluYSIsICJJQ1QifTsKKyAgICAgICAgU3RyaW5nIElSS1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgSXJrdXRzayIsICJJUktUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIElya3V0c2siLCAiSVJLU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBJcmt1dHNrIiwgIklSS1QifTsKICAgICAgICAgU3RyaW5nIElSVFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBlc3RcdTAwZTFuZGFyIGRlIElyXHUwMGUxbiIsICJJUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgSXJcdTAwZTFuIiwgIklSRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIElyXHUwMEUxbiIsICJJUlQifTsKQEAgLTE3NywxMSArMTgwLDE0IEBACiAgICAgICAgIFN0cmluZyBKU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMGUxbmRhciBkZSBKYXBcdTAwZjNuIiwgIkpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIEphcFx1MDBmM24iLCAiSkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBKYXBcdTAwRjNuIiwgIkpUIn07CisgICAgICAgIFN0cmluZyBLUkFUW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGRlIEtyYXNub3lhcnNrIiwgIktSQVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgS3Jhc25veWFyc2siLCAiS1JBU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBLcmFzbm95YXJzayIsICJLUkFUIn07CiAgICAgICAgIFN0cmluZyBLU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMGUxbmRhciBkZSBDb3JlYSIsICJLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBDb3JlYSIsICJLRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIENvcmVhIiwgIktUIn07CiAgICAgICAgIFN0cmluZyBMT1JEX0hPV0VbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMGUxbmRhciBkZSBMb3JkIEhvd2UiLCAiTEhTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIExvcmQgSG93ZSIsICJMSFNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgTG9yZCBIb3dlIiwgIkxIRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIExvcmQgSG93ZSIsICJMSFQifTsKICAgICAgICAgU3RyaW5nIE1IVFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBsYXMgSXNsYXMgTWFyc2hhbGwiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgbGFzIElzbGFzIE1hcnNoYWxsIiwgIk1IU1QiLApAQCAtMjMxLDIwICsyMzcsMTUgQEAKICAgICAgICAgU3RyaW5nIFNHVFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBTaW5nYXB1ciIsICJTR1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSAgU2luZ2FwdXIiLCAiU0dTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgU2luZ2FwdXIiLCAiU0dUIn07Ci0gICAgICAgIFN0cmluZyBTTFNUW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGRlbCBNZXJpZGlhbm8gZGUgR3JlZW53aWNoIiwgIkdNVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBTaWVycmEgTGVvbmEiLCAiU0xTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhcmlvIGRlIFNpZXJyYSBMZW9uYSIsICJTTFQifTsKLSAgICAgICAgU3RyaW5nIFRBU01BTklBW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgZGVsIEVzdGUgKFRhc21hbmlhKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlbCBFc3RlIChUYXNtYW5pYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIE9yaWVudGFsIChUYXNtYW5pYSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFRBU01BTklBW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgZGVsIEVzdGUgKFRhc21hbmlhKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZWwgRXN0ZSAoVGFzbWFuaWEpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgT3JpZW50YWwgKFRhc21hbmlhKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFRNVFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBUdXJrbWVuaXN0XHUwMGUxbiIsICJUTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBUdXJrbWVuaXN0XHUwMGUxbiIsICJUTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBUdXJrbWVuaXN0XHUwMEUxbiIsICJUTVQifTsKICAgICAgICAgU3RyaW5nIFVMQVRbXT0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBVbGFuIEJhdG9yIiwgIlVMQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBVbGFuIEJhdG9yIiwgIlVMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBVbGFuIEJhdG9yIiwgIlVMQVQifTsKLSAgICAgICAgU3RyaW5nIFdBUlRbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgQXJnZW50aW5hIE9jY2lkZW50YWwiLCAiV0FSVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBBcmdlbnRpbmEgT2NjaWRlbnRhbCIsICJXQVJTVCJ9OwogICAgICAgICBTdHJpbmcgV0FUW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGRlIFx1MDBjMWZyaWNhIE9jY2lkZW50YWwiLCAiV0FUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgXHUwMGMxZnJpY2EgT2NjaWRlbnRhbCIsICJXQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBcdTAwQzFmcmljYSBPY2NpZGVudGFsIiwgIldBVCJ9OwpAQCAtMjU0LDI3ICsyNTUsMzAgQEAKICAgICAgICAgU3RyaW5nIFdJVFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBJbmRvbmVzaWEgT2NjaWRlbnRhbCIsICJXSUIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRvbmVzaWEgSG9yYSBkZSB2ZXJhbm8gZGUgSW5kb25lc2lhIE9jY2lkZW50YWwiLCAiV0lTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgSW5kb25lc2lhIE9jY2lkZW50YWwiLCAiV0lCIn07Ci0gICAgICAgIFN0cmluZyBXU1RfQVVTW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgT2NjaWRlbnRhbCAoQXVzdHJhbGlhKSIsICJXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gT2NjaWRlbnRhbCAoQXVzdHJhbGlhKSIsICJXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBPY2NpZGVudGFsIChBdXN0cmFsaWEpIiwgIldUIn07CisgICAgICAgIFN0cmluZyBXU1RfQVVTW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgT2NjaWRlbnRhbCAoQXVzdHJhbGlhKSIsICJBV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIE9jY2lkZW50YWwgKEF1c3RyYWxpYSkiLCAiQVdEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIE9jY2lkZW50YWwgKEF1c3RyYWxpYSkiLCAiQVdUIn07CiAgICAgICAgIFN0cmluZyBTQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBlc3RcdTAwZTFuZGFyIGRlIFNhbW9hIiwgIlNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgU2Ftb2EiLCAiU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIFNhbW9hIiwgIlNUIn07Ci0gICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgU2Ftb2EgT2NjaWRlbnRhbCIsICJXU1QiLAorICAgICAgICBTdHJpbmcgV1NUX1NBTU9BW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGRlIFNhbW9hIE9jY2lkZW50YWwiLCAiV1NTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIFNhbW9hIE9jY2lkZW50YWwiLCAiV1NEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgU2Ftb2EgT2NjaWRlbnRhbCIsICJXU1QifTsKICAgICAgICAgU3RyaW5nIENoU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMGUxbmRhciBkZSBDaGFtb3JybyIsICJDaFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIENoYW1vcnJvIiwgIkNoRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBDaGFtb3JybyIsICJDaFQifTsKLSAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgZGVsIEVzdGUgKFZpY3RvcmlhKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlbCBFc3RlIChWaWN0b3JpYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIE9yaWVudGFsIChWaWN0b3JpYSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgZGVsIEVzdGUgKFZpY3RvcmlhKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZWwgRXN0ZSAoVmljdG9yaWEpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgT3JpZW50YWwgKFZpY3RvcmlhKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFVUQ1tdID0gbmV3IFN0cmluZ1tdIHsiSG9yYSBVbml2ZXJzYWwgQ29vcmRpbmFkYSIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIFVuaXZlcnNhbCBDb29yZGluYWRhIiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgVW5pdmVyc2FsIENvb3JkaW5hZGEiLCAiVVRDIn07CiAgICAgICAgIFN0cmluZyBVWlRbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgVXpiZWtpc3RcdTAwZTFuIiwgIlVaVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIFV6YmVraXN0XHUwMGUxbiIsICJVWlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBVemJla2lzdFx1MDBFMW4iLCAiVVpUIn07CisgICAgICAgIFN0cmluZyBYSlRbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMGUxbmRhciBkZSBDaGluYSIsICJYSlQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBDaGluYSIsICJYSkRUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBDaGluYSIsICJYSlQifTsKIAogICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW10gewogICAgICAgICAgICAgeyJBbWVyaWNhL0xvc19BbmdlbGVzIiwgUFNUfSwKQEAgLTMzNiw3ICszNDAsNyBAQAogICAgICAgICAgICAgeyJBZnJpY2EvRGppYm91dGkiLCBFQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRG91YWxhIiwgV0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0VsX0FhaXVuIiwgV0VUfSwKLSAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgU0xTVH0sCisgICAgICAgICAgICB7IkFmcmljYS9GcmVldG93biIsIEdNVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9HYWJvcm9uZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9IYXJhcmUiLCBDQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvSm9oYW5uZXNidXJnIiwgU0FTVH0sCkBAIC00MzcsNyArNDQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgR3JvZW5sYW5kaWEgT2NjaWRlbnRhbCIsICJXR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBHcm9lbmxhbmRpYSBPY2NpZGVudGFsIiwgIldHVCJ9fSwKICAgICAgICAgICAgIHsiQW1lcmljYS9Hb29zZV9CYXkiLCBBU1R9LAotICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBFU1R9LAorICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dyZW5hZGEiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YWRlbG91cGUiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YXRlbWFsYSIsIENTVH0sCkBAIC00ODQsOSArNDg4LDcgQEAKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5kb3phIiwgQUdUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5vbWluZWUiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lcmlkYSIsIENTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgTWV0bGFrYXRsYSIsICJNZVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgTWV0bGFrYXRsYSIsICJNZURUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0bGFrYXRsYSBUaW1lIiwgIk1lVCJ9fSwKKyAgICAgICAgICAgIHsiQW1lcmljYS9NZXRsYWthdGxhIiwgUFNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZXhpY29fQ2l0eSIsIENTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWlxdWVsb24iLCBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBlMW5kYXIgZGUgUGllcnJlICYgTWlxdWVsb24iLCAiUE1TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBQaWVycmUgJiBNaXF1ZWxvbiIsICJQTURUIiwKQEAgLTYwNyw2ICs2MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIEJydW5laSIsICJCTlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIEJydW5laSIsICJCTlQifX0sCiAgICAgICAgICAgICB7IkFzaWEvQ2FsY3V0dGEiLCBJU1R9LAorICAgICAgICAgICAgeyJBc2lhL0NoaXRhIiwgSVJLVH0sCiAgICAgICAgICAgICB7IkFzaWEvQ2hvaWJhbHNhbiIsIG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgQ2hvaWJhbHNhbiIsICJDSE9UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgQ2hvaWJhbHNhbiIsICJDSE9TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgQ2hvaWJhbHNhbiIsICJDSE9UIn19LApAQCAtNjMxLDkgKzYzNCw3IEBACiAgICAgICAgICAgICB7IkFzaWEvSG92ZCIsIG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgSG92ZCIsICJIT1ZUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgSG92ZCIsICJIT1ZTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgSG92ZCIsICJIT1ZUIn19LAotICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBuZXcgU3RyaW5nW10geyJIb3JhIGRlIElya3V0c2siLCAiSVJLVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIElya3V0c2siLCAiSVJLU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIElya3V0c2siLCAiSVJLVCJ9fSwKKyAgICAgICAgICAgIHsiQXNpYS9Jcmt1dHNrIiwgSVJLVH0sCiAgICAgICAgICAgICB7IkFzaWEvSXN0YW5idWwiLCBFRVR9LAogICAgICAgICAgICAgeyJBc2lhL0pha2FydGEiLCBXSVR9LAogICAgICAgICAgICAgeyJBc2lhL0pheWFwdXJhIiwgbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBJbmRvbmVzaWEgT3JpZW50YWwiLCAiV0lUIiwKQEAgLTY0NiwxNiArNjQ3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIiwgIlBFVFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIFBldHJvcGF2bG92c2stS2FtY2hhdHNraSIsICJQRVRUIn19LAogICAgICAgICAgICAgeyJBc2lhL0thcmFjaGkiLCBQS1R9LAotICAgICAgICAgICAgeyJBc2lhL0thc2hnYXIiLCBDVFR9LAorICAgICAgICAgICAgeyJBc2lhL0thc2hnYXIiLCBYSlR9LAogICAgICAgICAgICAgeyJBc2lhL0thdGhtYW5kdSIsIE5QVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2F0bWFuZHUiLCBOUFR9LAogICAgICAgICAgICAgeyJBc2lhL0toYW5keWdhIiwgbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBLaGFuZHlnYSIsICJZQUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIEtoYW5keWdhIiwgIllBS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgS2hhbmR5Z2EiLCAiWUFLVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9Lb2xrYXRhIiwgSVNUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgS3Jhc25veWFyc2siLCAiS1JBVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBLcmFzbm95YXJzayIsICJLUkFTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIEtyYXNub3lhcnNrIiwgIktSQVQifX0sCisgICAgICAgICAgICB7IkFzaWEvS3Jhc25veWFyc2siLCBLUkFUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWFsYV9MdW1wdXIiLCBNWVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1Y2hpbmciLCBNWVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1d2FpdCIsIEFSQVNUfSwKQEAgLTY3MCw3ICs2NjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgRmlsaXBpbmFzIiwgIlBIVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9NdXNjYXQiLCBHU1R9LAogICAgICAgICAgICAgeyJBc2lhL05pY29zaWEiLCBFRVR9LAotICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIE5PVlR9LAorICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIEtSQVR9LAogICAgICAgICAgICAgeyJBc2lhL05vdm9zaWJpcnNrIiwgTk9WVH0sCiAgICAgICAgICAgICB7IkFzaWEvT3JhbCIsIG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgVXJhbHNrIiwgIk9SQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBVcmFsc2siLCAiT1JBU1QiLApAQCAtNjk2LDYgKzY5NSw5IEBACiAgICAgICAgICAgICB7IkFzaWEvU2FtYXJrYW5kIiwgVVpUfSwKICAgICAgICAgICAgIHsiQXNpYS9TZW91bCIsIEtTVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2luZ2Fwb3JlIiwgU0dUfSwKKyAgICAgICAgICAgIHsiQXNpYS9TcmVkbmVrb2x5bXNrIiwgbmV3IFN0cmluZ1tdIHsiU3JlZG5la29seW1zayBUaW1lIiwgIlNSRVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcmVkbmVrb2x5bXNrIERheWxpZ2h0IFRpbWUiLCAiU1JFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcmVkbmVrb2x5bXNrIFRpbWUiLCAiU1JFVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9UYWlwZWkiLCBDVFR9LAogICAgICAgICAgICAgeyJBc2lhL1RlbF9Bdml2IiwgSVNSQUVMfSwKICAgICAgICAgICAgIHsiQXNpYS9UYXNoa2VudCIsIFVaVH0sCkBAIC03MDgsNyArNzEwLDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9VanVuZ19QYW5kYW5nIiwgQ0lUfSwKICAgICAgICAgICAgIHsiQXNpYS9VbGFhbmJhYXRhciIsIFVMQVR9LAogICAgICAgICAgICAgeyJBc2lhL1VsYW5fQmF0b3IiLCBVTEFUfSwKLSAgICAgICAgICAgIHsiQXNpYS9VcnVtcWkiLCBDVFR9LAorICAgICAgICAgICAgeyJBc2lhL1VydW1xaSIsIFhKVH0sCiAgICAgICAgICAgICB7IkFzaWEvVXN0LU5lcmEiLCBuZXcgU3RyaW5nW10geyJIb3JhIGRlIFVzdC1OZXJhIiwgIlZMQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgVXN0LU5lcmEiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBVc3QtTmVyYSIsICJWTEFUIn19LApAQCAtNzUwLDkgKzc1Miw5IEBACiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9DYW5iZXJyYSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ3VycmllIiwgRVNUX05TV30sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9EYXJ3aW4iLCBEQVJXSU59LAotICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgZGUgQXVzdHJhbGlhIENlbnRyYWwgeSBPY2NpZGVudGFsIiwgIkNXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGVzdFx1MDBFMW5kYXIgZGUgdmVyYW5vIGRlIEF1c3RyYWxpYSBDZW50cmFsIHkgT2NjaWRlbnRhbCIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBBdXN0cmFsaWEgQ2VudHJhbCB5IE9jY2lkZW50YWwiLCAiQ1dUIn19LAorICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJIb3JhIGVzdFx1MDBFMW5kYXIgZGUgQXVzdHJhbGlhIENlbnRyYWwgeSBPY2NpZGVudGFsIiwgIkFDV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBlc3RcdTAwRTFuZGFyIGRlIHZlcmFubyBkZSBBdXN0cmFsaWEgQ2VudHJhbCB5IE9jY2lkZW50YWwiLCAiQUNXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIEF1c3RyYWxpYSBDZW50cmFsIHkgT2NjaWRlbnRhbCIsICJBQ1dUIn19LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvSG9iYXJ0IiwgVEFTTUFOSUF9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTEhJIiwgTE9SRF9IT1dFfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0xpbmRlbWFuIiwgQlJJU0JBTkV9LApAQCAtODE4LDcgKzgyMCw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9Jc2xlX29mX01hbiIsIEdNVEJTVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9KZXJzZXkiLCBHTVRCU1R9LAotICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBGRVR9LAorICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvS2lldiIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9MaXNib24iLCBXRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvTGp1YmxqYW5hIiwgQ0VUfSwKQEAgLTg1Myw5ICs4NTUsNyBAQAogICAgICAgICAgICAgeyJFdXJvcGUvVmF0aWNhbiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWVubmEiLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvVmlsbml1cyIsIEVFVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBuZXcgU3RyaW5nW10geyJIb3JhIGRlIFZvbGdvZ3JhZG8iLCAiVk9MVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBWb2xnb2dyYWRvIiwgIlZPTFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgVm9sZ29ncmFkbyIsICJWT0xUIn19LAorICAgICAgICAgICAgeyJFdXJvcGUvVm9sZ29ncmFkIiwgTVNLfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1dhcnNhdyIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9aYWdyZWIiLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvWmFwb3Jvemh5ZSIsIEVFVH0sCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvZnIvVGltZVpvbmVOYW1lc19mci5qYXZhIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2ZyL1RpbWVab25lTmFtZXNfZnIuamF2YQppbmRleCAzOTNlNDVkLi4xZDhiODU2IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvZnIvVGltZVpvbmVOYW1lc19mci5qYXZhCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9mci9UaW1lWm9uZU5hbWVzX2ZyLmphdmEKQEAgLTQ4LDkgKzQ4LDkgQEAKICAgICAgICAgU3RyaW5nIEFDVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgZGUgbCdBY3JlIiwgIkFDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZSBsJ0FjcmUiLCAiQUNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIGwnQWNyZSIsICJBQ1QifTsKLSAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkJ0F1c3RyYWxpZSBjZW50cmFsZSAoQXVzdHJhbGllIGR1IHN1ZCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBFOXRcdTAwRTkgZCdBdXN0cmFsaWUgY2VudHJhbGUgKEF1c3RyYWxpZSBkdSBzdWQpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJlIChBdXN0cmFsaWUtTVx1MDBFOXJpZGlvbmFsZSkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkJ0F1c3RyYWxpZSBjZW50cmFsZSAoQXVzdHJhbGllIGR1IHN1ZCkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwRTl0XHUwMEU5IGQnQXVzdHJhbGllIGNlbnRyYWxlIChBdXN0cmFsaWUgZHUgc3VkKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmUgKEF1c3RyYWxpZS1NXHUwMEU5cmlkaW9uYWxlKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIEFHVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgRCdBcmdlbnRpbmUiLCAiQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IEQnQXJnZW50aW5lIiwgIkFSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ0FyZ2VudGluZSIsICJBUlQifSA7CkBAIC03MiwxMiArNzIsMTIgQEAKICAgICAgICAgU3RyaW5nIEJEVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgZHUgQmFuZ2xhZGVzaCIsICJCRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZHUgQmFuZ2xhZGVzaCIsICJCRFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZHUgQmFuZ2xhZGVzaCIsICJCRFQifSA7Ci0gICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgc3RhbmRhcmQgZCdBdXN0cmFsaWUgb3JpZW50YWxlIChRdWVlbnNsYW5kKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkJ0F1c3RyYWxpZSBvcmllbnRhbGUgKFF1ZWVuc2xhbmQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1x1MDBGNHRlIEVzdCAoUXVlZW5zbGFuZCkiLCAiRVQifTsKLSAgICAgICAgU3RyaW5nIEJST0tFTl9ISUxMW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkJ0F1c3RyYWxpZSBjZW50cmFsZSAoQXVzdHJhbGllIGR1IHN1ZC9Ob3V2ZWxsZS1HYWxsZXMgZHUgc3VkKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkJ0F1c3RyYWxpZSBjZW50cmFsZSAoQXVzdHJhbGllIGR1IHN1ZC9Ob3V2ZWxsZS1HYWxsZXMgZHUgc3VkKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyZSAoQXVzdHJhbGllLU1cdTAwRTlyaWRpb25hbGUvTm91dmVsbGUtR2FsbGVzIGR1IFN1ZCkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEJSSVNCQU5FW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkJ0F1c3RyYWxpZSBvcmllbnRhbGUgKFF1ZWVuc2xhbmQpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkJ0F1c3RyYWxpZSBvcmllbnRhbGUgKFF1ZWVuc2xhbmQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNcdTAwRjR0ZSBFc3QgKFF1ZWVuc2xhbmQpIiwgIkFFVCJ9OworICAgICAgICBTdHJpbmcgQlJPS0VOX0hJTExbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIHN0YW5kYXJkIGQnQXVzdHJhbGllIGNlbnRyYWxlIChBdXN0cmFsaWUgZHUgc3VkL05vdXZlbGxlLUdhbGxlcyBkdSBzdWQpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkJ0F1c3RyYWxpZSBjZW50cmFsZSAoQXVzdHJhbGllIGR1IHN1ZC9Ob3V2ZWxsZS1HYWxsZXMgZHUgc3VkKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmUgKEF1c3RyYWxpZS1NXHUwMEU5cmlkaW9uYWxlL05vdXZlbGxlLUdhbGxlcyBkdSBTdWQpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQlJUW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBkdSBCclx1MDBlOXNpbCIsICJCUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZHUgQnJcdTAwZTlzaWwiLCAiQlJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGR1IEJyXHUwMEU5c2lsIiwgIkJSVCJ9IDsKQEAgLTExMSw5ICsxMTEsOSBAQAogICAgICAgICBTdHJpbmcgQ1VCQVtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgc3RhbmRhcmQgZGUgQ3ViYSIsICJDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGRlIEN1YmEiLCAiQ0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIEN1YmEiLCAiQ1QifTsKLSAgICAgICAgU3RyaW5nIERBUldJTltdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgc3RhbmRhcmQgZCdBdXN0cmFsaWUgY2VudHJhbGUgKFRlcnJpdG9pcmUgZHUgTm9yZCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwRTl0XHUwMEU5IGQnQXVzdHJhbGllIGNlbnRyYWxlIChUZXJyaXRvaXJlIGR1IE5vcmQpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyZSAoVGVycml0b2lyZSBkdSBOb3JkKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkJ0F1c3RyYWxpZSBjZW50cmFsZSAoVGVycml0b2lyZSBkdSBOb3JkKSIsICJBQ1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwRTl0XHUwMEU5IGQnQXVzdHJhbGllIGNlbnRyYWxlIChUZXJyaXRvaXJlIGR1IE5vcmQpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmUgKFRlcnJpdG9pcmUgZHUgTm9yZCkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBEVUJMSU5bXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGR1IG1cdTAwZTlyaWRpZW4gZGUgR3JlZW53aWNoIiwgIkdNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBpcmxhbmRhaXNlIiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGlybGFuZGFpc2UiLCAiSVQifTsKQEAgLTEzMiw5ICsxMzIsOSBAQAogICAgICAgICBTdHJpbmcgRVNUW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBub3JtYWxlIGRlIGwnRXN0IiwgIkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGF2YW5jXHUwMGU5ZSBkZSBsJ0VzdCIsICJFRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDXHUwMEY0dGUgRXN0IiwgIkVUIn0gOwotICAgICAgICBTdHJpbmcgRVNUX05TV1tdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgbm9ybWFsZSBkZSBsJ0VzdCAoTm91dmVsbGUtR2FsbGVzIGR1IFN1ZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkZSBsJ0VzdCAoTm91dmVsbGUtR2FsbGVzIGR1IFN1ZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNcdTAwRjR0ZSBFc3QgKE5vdXZlbGxlLUdhbGxlcyBkdSBTdWQpIiwgIkVUIn0gOworICAgICAgICBTdHJpbmcgRVNUX05TV1tdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgbm9ybWFsZSBkZSBsJ0VzdCAoTm91dmVsbGUtR2FsbGVzIGR1IFN1ZCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBFOXRcdTAwRTkgZGUgbCdFc3QgKE5vdXZlbGxlLUdhbGxlcyBkdSBTdWQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1x1MDBGNHRlIEVzdCAoTm91dmVsbGUtR2FsbGVzIGR1IFN1ZCkiLCAiQUVUIn0gOwogICAgICAgICBTdHJpbmcgRkVUW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBkJ0V1cm9wZSBkZSBsJ0VzdCBVVEMrMyIsICJGRVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBFOXRcdTAwRTkgZCdFdXJvcGUgZGUgbCdFc3QgVVRDKzMiLCAiRkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnRXVyb3BlIGRlIGwnRXN0IFVUQyszIiwgIkZFVCJ9OwpAQCAtMTY1LDYgKzE2NSw5IEBACiAgICAgICAgIFN0cmluZyBJQ1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGQnSW5kb2NoaW5lIiwgIklDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkJ0luZG9jaGluZSIsICJJQ1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdJbmRvY2hpbmUiLCAiSUNUIn0gOworICAgICAgICBTdHJpbmcgSVJLVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgZCdJcmt1dHNrIiwgIklSS1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGQnSXJrdXRzayIsICJJUktTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ0lya3V0c2siLCAiSVJLVCJ9OwogICAgICAgICBTdHJpbmcgSVJUW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBub3JtYWxlIGQnSXJhbiIsICJJUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgYXZhbmNcdTAwZTllIGQnSXJhbiIsICJJUkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdJcmFuIiwgIklSVCJ9IDsKQEAgLTE3NywxMSArMTgwLDE0IEBACiAgICAgICAgIFN0cmluZyBKU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIG5vcm1hbGUgZHUgSmFwb24iLCAiSlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgYXZhbmNcdTAwZTllIGR1IEphcG9uIiwgIkpEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcG9uIiwgIkpUIn0gOworICAgICAgICBTdHJpbmcgS1JBVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgZGUgS3Jhc25vXHUwMGVmYXJzayIsICJLUkFUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZSBLcmFzbm9cdTAwZWZhcnNrIiwgIktSQVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIEtyYXNub1x1MDBFRmFyc2siLCAiS1JBVCJ9OwogICAgICAgICBTdHJpbmcgS1NUW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBub3JtYWxlIGRlIENvclx1MDBlOWUiLCAiS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgYXZhbmNcdTAwZTllIGRlIENvclx1MDBlOWUiLCAiS0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29yXHUwMEU5ZSIsICJLVCJ9IDsKICAgICAgICAgU3RyaW5nIExPUkRfSE9XRVtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgc3RhbmRhcmQgZGUgTG9yZCBIb3dlIiwgIkxIU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZGUgTG9yZCBIb3dlIiwgIkxIU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZGUgTG9yZCBIb3dlIiwgIkxIRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBMb3JkIEhvd2UiLCAiTEhUIn07CiAgICAgICAgIFN0cmluZyBNSFRbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlcyBJbGVzIE1hcnNoYWxsIiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZXMgSWxlcyBNYXJzaGFsbCIsICJNSFNUIiwKQEAgLTIzMSwyMCArMjM3LDE1IEBACiAgICAgICAgIFN0cmluZyBTR1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlIFNpbmdhcG91ciIsICJTR1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZGUgU2luZ2Fwb3VyIiwgIlNHU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBTaW5nYXBvdXIiLCAiU0dUIn07Ci0gICAgICAgIFN0cmluZyBTTFNUW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBkdSBtXHUwMGU5cmlkaWVuIGRlIEdyZWVud2ljaCIsICJHTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGRlIFNpZXJyYSBMZW9uZSIsICJTTFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIFNpZXJyYSBMZW9uZSIsICJTTFQifTsKLSAgICAgICAgU3RyaW5nIFRBU01BTklBW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkJ0F1c3RyYWxpZSBvcmllbnRhbGUgKFRhc21hbmllKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkJ0F1c3RyYWxpZSBvcmllbnRhbGUgKFRhc21hbmllKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNcdTAwRjR0ZSBFc3QgKFRhc21hbmllKSIsICJFVCJ9OworICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIHN0YW5kYXJkIGQnQXVzdHJhbGllIG9yaWVudGFsZSAoVGFzbWFuaWUpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkJ0F1c3RyYWxpZSBvcmllbnRhbGUgKFRhc21hbmllKSIsICJBRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDXHUwMEY0dGUgRXN0IChUYXNtYW5pZSkiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBUTVRbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGR1IFR1cmttXHUwMGU5bmlzdGFuIiwgIlRNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkdSBUdXJrbVx1MDBlOW5pc3RhbiIsICJUTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZHUgVHVya21cdTAwRTluaXN0YW4iLCAiVE1UIn0gOwogICAgICAgICBTdHJpbmcgVUxBVFtdPSBuZXcgU3RyaW5nW10geyJIZXVyZSBkZSBsJ1VsYWFuYmFhdGFyIiwgIlVMQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZGUgbCdVbGFhbmJhYXRhciIsICJVTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIGwnVWxhYW5iYWF0YXIiLCAiVUxBVCJ9IDsKLSAgICAgICAgU3RyaW5nIFdBUlRbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIEQnQXJnZW50aW5lIGRlIGwnT3Vlc3QiLCAiV0FSVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgRCdBcmdlbnRpbmUgZGUgbCdPdWVzdCIsICJXQVJTVCJ9IDsKICAgICAgICAgU3RyaW5nIFdBVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgZCdBZnJpcXVlIGRlIGwnT3Vlc3QiLCAiV0FUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGQnQWZyaXF1ZSBkZSBsJ091ZXN0IiwgIldBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ0FmcmlxdWUgZGUgbCdPdWVzdCIsICJXQVQifSA7CkBAIC0yNTQsMjcgKzI1NSwzMCBAQAogICAgICAgICBTdHJpbmcgV0lUW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBkZSBsJ0luZG9uXHUwMGU5c2llIG9jY2lkZW50YWxlIiwgIldJQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZSBsJ0luZG9uXHUwMGU5c2llIG9jY2lkZW50YWxlIiwgIldJU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBsJ0luZG9uXHUwMEU5c2llIG9jY2lkZW50YWxlIiwgIldJQiJ9OwotICAgICAgICBTdHJpbmcgV1NUX0FVU1tdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgbm9ybWFsZSBkZSBsJ091ZXN0IChBdXN0cmFsaWUpIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBFOXRcdTAwRTkgZGUgbCdPdWVzdCAoQXVzdHJhbGllKSIsICJXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3Vlc3QgKEF1c3RyYWxpZSkiLCAiV1QifSA7CisgICAgICAgIFN0cmluZyBXU1RfQVVTW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBub3JtYWxlIGRlIGwnT3Vlc3QgKEF1c3RyYWxpZSkiLCAiQVdTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBFOXRcdTAwRTkgZGUgbCdPdWVzdCAoQXVzdHJhbGllKSIsICJBV0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91ZXN0IChBdXN0cmFsaWUpIiwgIkFXVCJ9IDsKICAgICAgICAgU3RyaW5nIFNBTU9BW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkZSBTYW1vYSIsICJTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGF2YW5jXHUwMGU5ZSBkZSBTYW1vYSIsICJTRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbW9hIiwgIlNUIn07Ci0gICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlcyBTYW1vYXMgb2NjaWRlbnRhbGVzIiwgIldTVCIsCisgICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlcyBTYW1vYXMgb2NjaWRlbnRhbGVzIiwgIldTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZGVzIFNhbW9hcyBvY2NpZGVudGFsZXMiLCAiV1NEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlcyBTYW1vYXMgb2NjaWRlbnRhbGVzIiwgIldTVCJ9IDsKICAgICAgICAgU3RyaW5nIENoU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIG5vcm1hbGUgZGVzIFx1MDBlZWxlcyBNYXJpYW5uZXMiLCAiQ2hTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZXMgXHUwMGVlbGVzIE1hcmlhbm5lcyIsICJDaERUIiwKICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbW9ycm8iLCAiQ2hUIn07Ci0gICAgICAgIFN0cmluZyBWSUNUT1JJQVtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgc3RhbmRhcmQgZCdBdXN0cmFsaWUgb3JpZW50YWxlIChWaWN0b3JpYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBFOXRcdTAwRTkgZCdBdXN0cmFsaWUgb3JpZW50YWxlIChWaWN0b3JpYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDXHUwMEY0dGUgRXN0IChWaWN0b3JpYSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkJ0F1c3RyYWxpZSBvcmllbnRhbGUgKFZpY3RvcmlhKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBFOXRcdTAwRTkgZCdBdXN0cmFsaWUgb3JpZW50YWxlIChWaWN0b3JpYSkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1x1MDBGNHRlIEVzdCAoVmljdG9yaWEpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVVRDW10gPSBuZXcgU3RyaW5nW10geyJUZW1wcyB1bml2ZXJzZWwgY29vcmRvbm5cdTAwZTkiLCAiVVRDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVtcHMgdW5pdmVyc2VsIGNvb3Jkb25uXHUwMGU5IiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbXBzIHVuaXZlcnNlbCBjb29yZG9ublx1MDBFOSIsICJVVEMifTsKICAgICAgICAgU3RyaW5nIFVaVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgZGUgbCdPdXpiXHUwMGU5a2lzdGFuIiwgIlVaVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZSBsJ091emJcdTAwZTlraXN0YW4iLCAiVVpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIGwnT3V6Ylx1MDBFOWtpc3RhbiIsICJVWlQifTsKKyAgICAgICAgU3RyaW5nIFhKVFtdID0gbmV3IFN0cmluZ1tdIHsiSGV1cmUgbm9ybWFsZSBkZSBDaGluZSIsICJYSlQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBhdmFuY1x1MDBlOWUgZGUgQ2hpbmUiLCAiWEpEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5lIiwgIlhKVCJ9OwogCiAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CiAgICAgICAgICAgICB7IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCBQU1R9LApAQCAtMzM2LDcgKzM0MCw3IEBACiAgICAgICAgICAgICB7IkFmcmljYS9Eamlib3V0aSIsIEVBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Eb3VhbGEiLCBXQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRWxfQWFpdW4iLCBXRVR9LAotICAgICAgICAgICAgeyJBZnJpY2EvRnJlZXRvd24iLCBTTFNUfSwKKyAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgR01UfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0dhYm9yb25lIiwgQ0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0hhcmFyZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Kb2hhbm5lc2J1cmciLCBTQVNUfSwKQEAgLTQzNyw3ICs0NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZHUgR3JvZW5sYW5kIGRlIGwnT3Vlc3QiLCAiV0dTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGR1IEdyb2VubGFuZCBkZSBsJ091ZXN0IiwgIldHVCJ9fSwKICAgICAgICAgICAgIHsiQW1lcmljYS9Hb29zZV9CYXkiLCBBU1R9LAotICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBFU1R9LAorICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dyZW5hZGEiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YWRlbG91cGUiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YXRlbWFsYSIsIENTVH0sCkBAIC00ODQsOSArNDg4LDcgQEAKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5kb3phIiwgQUdUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5vbWluZWUiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lcmlkYSIsIENTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIG5ldyBTdHJpbmdbXSB7IkhldXJlIG5vcm1hbGUgZGUgTWV0bGFrYXRsYSIsICJNZVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgYXZhbmNcdTAwRTllIGRlIE1ldGxha2F0bGEiLCAiTWVEVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIE1ldGxha2F0bGEiLCAiTWVUIn19LAorICAgICAgICAgICAgeyJBbWVyaWNhL01ldGxha2F0bGEiLCBQU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01leGljb19DaXR5IiwgQ1NUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NaXF1ZWxvbiIsIG5ldyBTdHJpbmdbXSB7IkhldXJlIG5vcm1hbGUgZGUgU2FpbnQtUGllcnJlIGV0IE1pcXVlbG9uIiwgIlBNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgYXZhbmNcdTAwZTllIGRlIFNhaW50LVBpZXJyZSBldCBNaXF1ZWxvbiIsICJQTURUIiwKQEAgLTYwNyw2ICs2MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkdSBCcnVuZWkiLCAiQk5TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZHUgQnJ1bmVpIiwgIkJOVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9DYWxjdXR0YSIsIElTVH0sCisgICAgICAgICAgICB7IkFzaWEvQ2hpdGEiLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9DaG9pYmFsc2FuIiwgbmV3IFN0cmluZ1tdIHsiSGV1cmUgZGUgQ2hvaWJhbHNhbiIsICJDSE9UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGRlIENob2liYWxzYW4iLCAiQ0hPU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBDaG9pYmFsc2FuIiwgIkNIT1QifX0sCkBAIC02MzEsOSArNjM0LDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9Ib3ZkIiwgbmV3IFN0cmluZ1tdIHsiSGV1cmUgZGUgSG92ZCIsICJIT1ZUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGRlIEhvdmQiLCAiSE9WU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBIb3ZkIiwgIkhPVlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIG5ldyBTdHJpbmdbXSB7IkhldXJlIGQnSXJrdXRzayIsICJJUktUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGQnSXJrdXRzayIsICJJUktTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnSXJrdXRzayIsICJJUktUIn19LAorICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmFrYXJ0YSIsIFdJVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmF5YXB1cmEiLCBuZXcgU3RyaW5nW10geyJIZXVyZSBkJ0luZG9uXHUwMGU5c2llIG9yaWVudGFsZSIsICJXSVQiLApAQCAtNjQ2LDE2ICs2NDcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZGUgUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIiwgIlBFVFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBQZXRyb3BhdmxvdnNrLUthbWNoYXRza2kiLCAiUEVUVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9LYXJhY2hpIiwgUEtUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRobWFuZHUiLCBOUFR9LAogICAgICAgICAgICAgeyJBc2lhL0thdG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LaGFuZHlnYSIsIG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlIEtoYW5keWdhIiwgIllBS1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwRTl0XHUwMEU5IGRlIEtoYW5keWdhIiwgIllBS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIEtoYW5keWdhIiwgIllBS1QifX0sCiAgICAgICAgICAgICB7IkFzaWEvS29sa2F0YSIsIElTVH0sCi0gICAgICAgICAgICB7IkFzaWEvS3Jhc25veWFyc2siLCBuZXcgU3RyaW5nW10geyJIZXVyZSBkZSBLcmFzbm9cdTAwZWZhcnNrIiwgIktSQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGRlIEtyYXNub1x1MDBlZmFyc2siLCAiS1JBU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZGUgS3Jhc25vXHUwMEVGYXJzayIsICJLUkFUIn19LAorICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VhbGFfTHVtcHVyIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWNoaW5nIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdXdhaXQiLCBBUkFTVH0sCkBAIC02NzAsNyArNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZXMgUGhpbGlwcGluZXMiLCAiUEhUIn19LAogICAgICAgICAgICAgeyJBc2lhL011c2NhdCIsIEdTVH0sCiAgICAgICAgICAgICB7IkFzaWEvTmljb3NpYSIsIEVFVH0sCi0gICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgTk9WVH0sCisgICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvTm92b3NpYmlyc2siLCBOT1ZUfSwKICAgICAgICAgICAgIHsiQXNpYS9PcmFsIiwgbmV3IFN0cmluZ1tdIHsiSGV1cmUgZCdPcmFsIiwgIk9SQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZCdPcmFsIiwgIk9SQVNUIiwKQEAgLTY5Niw2ICs2OTUsOSBAQAogICAgICAgICAgICAgeyJBc2lhL1NhbWFya2FuZCIsIFVaVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2VvdWwiLCBLU1R9LAogICAgICAgICAgICAgeyJBc2lhL1NpbmdhcG9yZSIsIFNHVH0sCisgICAgICAgICAgICB7IkFzaWEvU3JlZG5la29seW1zayIsIG5ldyBTdHJpbmdbXSB7IlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBEYXlsaWdodCBUaW1lIiwgIlNSRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBUaW1lIiwgIlNSRVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvVGFpcGVpIiwgQ1RUfSwKICAgICAgICAgICAgIHsiQXNpYS9UZWxfQXZpdiIsIElTUkFFTH0sCiAgICAgICAgICAgICB7IkFzaWEvVGFzaGtlbnQiLCBVWlR9LApAQCAtNzA4LDcgKzcxMCw3IEBACiAgICAgICAgICAgICB7IkFzaWEvVWp1bmdfUGFuZGFuZyIsIENJVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhYW5iYWF0YXIiLCBVTEFUfSwKICAgICAgICAgICAgIHsiQXNpYS9VbGFuX0JhdG9yIiwgVUxBVH0sCi0gICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9VcnVtcWkiLCBYSlR9LAogICAgICAgICAgICAgeyJBc2lhL1VzdC1OZXJhIiwgbmV3IFN0cmluZ1tdIHsiSGV1cmUgZCdVc3QtTmVyYSIsICJWTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkJ1VzdC1OZXJhIiwgIlZMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnVXN0LU5lcmEiLCAiVkxBVCJ9fSwKQEAgLTc1MCw5ICs3NTIsOSBAQAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ2FuYmVycmEiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0N1cnJpZSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvRGFyd2luIiwgREFSV0lOfSwKLSAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiSGV1cmUgc3RhbmRhcmQgZGUgbCdBdXN0cmFsaWUgb2NjaWRlbnRhbGUgKGNlbnRyZSkiLCAiQ1dTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkZSBsJ0F1c3RyYWxpZSBvY2NpZGVudGFsZSAoY2VudHJlKSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZGUgbCdBdXN0cmFsaWUgb2NjaWRlbnRhbGUgKGNlbnRyZSkiLCAiQ1dUIn19LAorICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJIZXVyZSBzdGFuZGFyZCBkZSBsJ0F1c3RyYWxpZSBvY2NpZGVudGFsZSAoY2VudHJlKSIsICJBQ1dTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMEU5dFx1MDBFOSBkZSBsJ0F1c3RyYWxpZSBvY2NpZGVudGFsZSAoY2VudHJlKSIsICJBQ1dEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIGwnQXVzdHJhbGllIG9jY2lkZW50YWxlIChjZW50cmUpIiwgIkFDV1QifX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9Ib2JhcnQiLCBUQVNNQU5JQX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9MSEkiLCBMT1JEX0hPV0V9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTGluZGVtYW4iLCBCUklTQkFORX0sCkBAIC04MTgsNyArODIwLDcgQEAKICAgICAgICAgICAgIHsiRXVyb3BlL0lzbGVfb2ZfTWFuIiwgR01UQlNUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0lzdGFuYnVsIiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0plcnNleSIsIEdNVEJTVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEZFVH0sCisgICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9LaWV2IiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0xpc2JvbiIsIFdFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9ManVibGphbmEiLCBDRVR9LApAQCAtODUzLDkgKzg1NSw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9WYXRpY2FuIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1ZpZW5uYSIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWxuaXVzIiwgRUVUfSwKLSAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlIFZvbGdvZ3JhZCIsICJWT0xUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZSBWb2xnb2dyYWQiLCAiVk9MU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZGUgVm9sZ29ncmFkIiwgIlZPTFQifX0sCisgICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBNU0t9LAogICAgICAgICAgICAgeyJFdXJvcGUvV2Fyc2F3IiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phZ3JlYiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9aYXBvcm96aHllIiwgRUVUfSwKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9pdC9UaW1lWm9uZU5hbWVzX2l0LmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvaXQvVGltZVpvbmVOYW1lc19pdC5qYXZhCmluZGV4IDMwOWE3NzEuLjQzMDM1YjYgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9pdC9UaW1lWm9uZU5hbWVzX2l0LmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2l0L1RpbWVab25lTmFtZXNfaXQuamF2YQpAQCAtNDgsOSArNDgsOSBAQAogICAgICAgICBTdHJpbmcgQUNUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgZGkgQWNyZSIsICJBQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRpIEFjcmUiLCAiQUNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBBY3JlIiwgIkFDVCJ9OwotICAgICAgICBTdHJpbmcgQURFTEFJREVbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBzdGFuZGFyZCBjZW50cmFsZSAoQXVzdHJhbGlhIGRlbCBTdWQpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBjZW50cmFsZSAoQXVzdHJhbGlhIGRlbCBTdWQpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGZ1c28gY2VudHJhbGUgKEF1c3RyYWxpYSBkZWwgU3VkKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgQURFTEFJREVbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBzdGFuZGFyZCBjZW50cmFsZSAoQXVzdHJhbGlhIGRlbCBTdWQpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgY2VudHJhbGUgKEF1c3RyYWxpYSBkZWwgU3VkKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZnVzbyBjZW50cmFsZSAoQXVzdHJhbGlhIGRlbCBTdWQpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQUdUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgZGVsbCdBcmdlbnRpbmEiLCAiQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWxsJ0FyZ2VudGluYSIsICJBUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGRlbGwnQXJnZW50aW5hIiwgIkFSVCJ9OwpAQCAtNzIsMTIgKzcyLDEyIEBACiAgICAgICAgIFN0cmluZyBCRFRbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkZWwgQmFuZ2xhZGVzaCIsICJCRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbCBCYW5nbGFkZXNoIiwgIkJEU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGVsIEJhbmdsYWRlc2giLCAiQkRUIn07Ci0gICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIG9yaWVudGFsZSAoUXVlZW5zbGFuZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIG9yaWVudGFsZSAoUXVlZW5zbGFuZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZnVzbyBvcmllbnRhbGUgKFF1ZWVuc2xhbmQpIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIGNlbnRyYWxlIChBdXN0cmFsaWEgZGVsIFN1ZC9OdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGNlbnRyYWxlIChBdXN0cmFsaWEgZGVsIFN1ZC9OdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZnVzbyBjZW50cmFsZSAoQXVzdHJhbGlhIGRlbCBTdWQvTnVvdm8gR2FsbGVzIGRlbCBTdWQpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIG9yaWVudGFsZSAoUXVlZW5zbGFuZCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBvcmllbnRhbGUgKFF1ZWVuc2xhbmQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBmdXNvIG9yaWVudGFsZSAoUXVlZW5zbGFuZCkiLCAiQUVUIn07CisgICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIGNlbnRyYWxlIChBdXN0cmFsaWEgZGVsIFN1ZC9OdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBjZW50cmFsZSAoQXVzdHJhbGlhIGRlbCBTdWQvTnVvdm8gR2FsbGVzIGRlbCBTdWQpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBmdXNvIGNlbnRyYWxlIChBdXN0cmFsaWEgZGVsIFN1ZC9OdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBCUlRbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkZWwgQnJhc2lsZSIsICJCUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbCBCcmFzaWxlIiwgIkJSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgQnJhc2lsaWEiLCAiQlJUIn07CkBAIC0xMTEsOSArMTExLDkgQEAKICAgICAgICAgU3RyaW5nIENVQkFbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBzb2xhcmUgQ3ViYSIsICJDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGxlZ2FsZSBDdWJhIiwgIkNEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgQ3ViYSIsICJDVCJ9OwotICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgY2VudHJhbGUgKFRlcnJpdG9yaSBkZWwgTm9yZCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBjZW50cmFsZSAoVGVycml0b3JpIGRlbCBOb3JkKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZnVzbyBjZW50cmFsZSAoVGVycml0b3JpIGRlbCBOb3JkKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgY2VudHJhbGUgKFRlcnJpdG9yaSBkZWwgTm9yZCkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgY2VudHJhbGUgKFRlcnJpdG9yaSBkZWwgTm9yZCkiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBmdXNvIGNlbnRyYWxlIChUZXJyaXRvcmkgZGVsIE5vcmQpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgRFVCTElOW10gPSBuZXcgU3RyaW5nW10geyJPcmEgbWVkaWEgZGkgR3JlZW53aWNoIiwgIkdNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgaXJsYW5kZXNlIiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBpcmxhbmRlc2UiLCAiSVQifTsKQEAgLTEzMiw5ICsxMzIsOSBAQAogICAgICAgICBTdHJpbmcgRVNUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc29sYXJlIFVTQSBvcmllbnRhbGUiLCAiRVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGxlZ2FsZSBVU0Egb3JpZW50YWxlIiwgIkVEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gb3JpZW50YWxlIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgZGVsbCdBdXN0cmFsaWEgb3JpZW50YWxlIChOdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGVsbCdBdXN0cmFsaWEgb3JpZW50YWxlIChOdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBmdXNvIG9yaWVudGFsZSAoTnVvdm8gR2FsbGVzIGRlbCBTdWQpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgZGVsbCdBdXN0cmFsaWEgb3JpZW50YWxlIChOdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbGwnQXVzdHJhbGlhIG9yaWVudGFsZSAoTnVvdm8gR2FsbGVzIGRlbCBTdWQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGZ1c28gb3JpZW50YWxlIChOdW92byBHYWxsZXMgZGVsIFN1ZCkiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkZWkgcGFlc2kgZXVyb3BlaSBwaVx1MDBGOSBvcmllbnRhbGkiLCAiRkVUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWkgcGFlc2kgZXVyb3BlaSBwaVx1MDBGOSBvcmllbnRhbGkiLCAiRkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkZWkgcGFlc2kgZXVyb3BlaSBwaVx1MDBGOSBvcmllbnRhbGkiLCAiRkVUIn07CkBAIC0xNjUsNiArMTY1LDkgQEAKICAgICAgICAgU3RyaW5nIElDVFtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIGRlbGwnSW5kb2NpbmEiLCAiSUNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWxsJ0luZG9jaW5hIiwgIklDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGVsbCdJbmRvY2luYSIsICJJQ1QifTsKKyAgICAgICAgU3RyaW5nIElSS1RbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkaSBJcmt1dHNrIiwgIklSS1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkaSBJcmt1dHNrIiwgIklSS1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBJcmt1dHNrIiwgIklSS1QifTsKICAgICAgICAgU3RyaW5nIElSVFtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHNvbGFyZSBJcmFuIiwgIklSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgbGVnYWxlIElyYW4iLCAiSVJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBJcmFuIiwgIklSVCJ9OwpAQCAtMTc3LDExICsxODAsMTQgQEAKICAgICAgICAgU3RyaW5nIEpTVFtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHNvbGFyZSBkZWwgR2lhcHBvbmUiLCAiSlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGxlZ2FsZSBkZWwgR2lhcHBvbmUiLCAiSkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIEdpYXBwb25lIiwgIkpUIn07CisgICAgICAgIFN0cmluZyBLUkFUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgZGkgS3Jhc25vamFyc2siLCAiS1JBVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRpIEtyYXNub2phcnNrIiwgIktSQVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBLcmFzbm9qYXJzayIsICJLUkFUIn07CiAgICAgICAgIFN0cmluZyBLU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBzb2xhcmUgZGVsbGEgQ29yZWEiLCAiS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGxlZ2FsZSBkZWxsYSBDb3JlYSIsICJLRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgQ29yZWEiLCAiS1QifTsKICAgICAgICAgU3RyaW5nIExPUkRfSE9XRVtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIGRpIExvcmQgSG93ZSIsICJMSFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkaSBMb3JkIEhvd2UiLCAiTEhTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGkgTG9yZCBIb3dlIiwgIkxIRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgTG9yZCBIb3dlIiwgIkxIVCJ9OwogICAgICAgICBTdHJpbmcgTUhUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgZGVsbGUgSXNvbGUgTWFyc2hhbGwiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWxsZSBJc29sZSBNYXJzaGFsbCIsICJNSFNUIiwKQEAgLTIzMSwyMCArMjM3LDE1IEBACiAgICAgICAgIFN0cmluZyBTR1RbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkaSBTaW5nYXBvcmUiLCAiU0dUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkaSBTaW5nYXBvcmUiLCAiU0dTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBTaW5nYXBvcmUiLCAiU0dUIn07Ci0gICAgICAgIFN0cmluZyBTTFNUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgbWVkaWEgZGkgR3JlZW53aWNoIiwgIkdNVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgbGVnYWxlIGRlbGxhIFNpZXJyYSBMZW9uZSIsICJTTFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkZWxsYSBTaWVycmEgTGVvbmUiLCAiU0xUIn07Ci0gICAgICAgIFN0cmluZyBUQVNNQU5JQVtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIG9yaWVudGFsZSAoVGFzbWFuaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBvcmllbnRhbGUgKFRhc21hbmlhKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBmdXNvIG9yaWVudGFsZSAoVGFzbWFuaWEpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBUQVNNQU5JQVtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIG9yaWVudGFsZSAoVGFzbWFuaWEpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgb3JpZW50YWxlIChUYXNtYW5pYSkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGZ1c28gb3JpZW50YWxlIChUYXNtYW5pYSkiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBUTVRbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkZWwgVHVya21lbmlzdGFuIiwgIlRNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGVsIFR1cmttZW5pc3RhbiIsICJUTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGRlbCBUdXJrbWVuaXN0YW4iLCAiVE1UIn07CiAgICAgICAgIFN0cmluZyBVTEFUW109IG5ldyBTdHJpbmdbXSB7Ik9yYSBkaSBVbGFhbmJhYXRhciIsICJVTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkaSBVbGFhbmJhYXRhciIsICJVTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBVbGFhbmJhYXRhciIsICJVTEFUIn07Ci0gICAgICAgIFN0cmluZyBXQVJUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgZGVsbCdBcmdlbnRpbmEgb2NjaWRlbnRhbGUiLCAiV0FSVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbGwnQXJnZW50aW5hIG9jY2lkZW50YWxlIiwgIldBUlNUIn07CiAgICAgICAgIFN0cmluZyBXQVRbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkZWxsJ0FmcmljYSBvY2NpZGVudGFsZSIsICJXQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbGwnQWZyaWNhIG9jY2lkZW50YWxlIiwgIldBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGVsbCdBZnJpY2Egb2NjaWRlbnRhbGUiLCAiV0FUIn07CkBAIC0yNTQsMjcgKzI1NSwzMCBAQAogICAgICAgICBTdHJpbmcgV0lUW10gPSBuZXcgU3RyaW5nW10geyJPcmEgZGVsbCdJbmRvbmVzaWEgb2NjaWRlbnRhbGUiLCAiV0lCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWxsJ0luZG9uZXNpYSBvY2NpZGVudGFsZSIsICJXSVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGRlbGwnSW5kb25lc2lhIG9jY2lkZW50YWxlIiwgIldJQiJ9OwotICAgICAgICBTdHJpbmcgV1NUX0FVU1tdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIGRlbGwnQXVzdHJhbGlhIG9jY2lkZW50YWxlIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbGwnQXVzdHJhbGlhIG9jY2lkZW50YWxlIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgQXVzdHJhbGlhIG9jY2lkZW50YWxlIiwgIldUIn07CisgICAgICAgIFN0cmluZyBXU1RfQVVTW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgZGVsbCdBdXN0cmFsaWEgb2NjaWRlbnRhbGUiLCAiQVdTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbGwnQXVzdHJhbGlhIG9jY2lkZW50YWxlIiwgIkFXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIEF1c3RyYWxpYSBvY2NpZGVudGFsZSIsICJBV1QifTsKICAgICAgICAgU3RyaW5nIFNBTU9BW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgZGkgU2Ftb2EiLCAiU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgbGVnYWxlIGRpIFNhbW9hIiwgIlNEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIFNhbW9hIiwgIlNUIn07Ci0gICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkaSBTYW1vYSIsICJXU1QiLAorICAgICAgICBTdHJpbmcgV1NUX1NBTU9BW10gPSBuZXcgU3RyaW5nW10geyJPcmEgZGkgU2Ftb2EiLCAiV1NTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGkgU2Ftb2EiLCAiV1NEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBTYW1vYSBvY2NpZGVudGFsZSIsICJXU1QifTsKICAgICAgICAgU3RyaW5nIENoU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBzdGFuZGFyZCBkaSBDaGFtb3JybyIsICJDaFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgbGVnYWxlIGRpIENoYW1vcnJvIiwgIkNoRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBDaGFtb3JybyIsICJDaFQifTsKLSAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgb3JpZW50YWxlIChWaWN0b3JpYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIG9yaWVudGFsZSAoVmljdG9yaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGZ1c28gb3JpZW50YWxlIChWaWN0b3JpYSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgb3JpZW50YWxlIChWaWN0b3JpYSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBvcmllbnRhbGUgKFZpY3RvcmlhKSIsICJBRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZnVzbyBvcmllbnRhbGUgKFZpY3RvcmlhKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFVUQ1tdID0gbmV3IFN0cmluZ1tdIHsiVGVtcG8gdW5pdmVyc2FsZSBjb29yZGluYXRvIiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbXBvIHVuaXZlcnNhbGUgY29vcmRpbmF0byIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wbyB1bml2ZXJzYWxlIGNvb3JkaW5hdG8iLCAiVVRDIn07CiAgICAgICAgIFN0cmluZyBVWlRbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBkZWxsJ1V6YmVraXN0YW4iLCAiVVpUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWxsJ1V6YmVraXN0YW4iLCAiVVpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkZWxsJ1V6YmVraXN0YW4iLCAiVVpUIn07CisgICAgICAgIFN0cmluZyBYSlRbXSA9IG5ldyBTdHJpbmdbXSB7Ik9yYSBzb2xhcmUgZGVsbGEgQ2luYSIsICJYSlQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgbGVnYWxlIGRlbGxhIENpbmEiLCAiWEpEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBDaW5hIiwgIlhKVCJ9OwogCiAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CiAgICAgICAgICAgICB7IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCBQU1R9LApAQCAtMzM2LDcgKzM0MCw3IEBACiAgICAgICAgICAgICB7IkFmcmljYS9Eamlib3V0aSIsIEVBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Eb3VhbGEiLCBXQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRWxfQWFpdW4iLCBXRVR9LAotICAgICAgICAgICAgeyJBZnJpY2EvRnJlZXRvd24iLCBTTFNUfSwKKyAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgR01UfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0dhYm9yb25lIiwgQ0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0hhcmFyZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Kb2hhbm5lc2J1cmciLCBTQVNUfSwKQEAgLTQzNyw3ICs0NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRlbGxhIEdyb2VubGFuZGlhIG9jY2lkZW50YWxlIiwgIldHU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGVsbGEgR3JvZW5sYW5kaWEgb2NjaWRlbnRhbGUiLCAiV0dUIn19LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dvb3NlX0JheSIsIEFTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEVTVH0sCisgICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3JlbmFkYSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhZGVsb3VwZSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhdGVtYWxhIiwgQ1NUfSwKQEAgLTQ4NCw5ICs0ODgsNyBAQAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbmRvemEiLCBBR1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbm9taW5lZSIsIENTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVyaWRhIiwgQ1NUfSwKLSAgICAgICAgICAgIHsiQW1lcmljYS9NZXRsYWthdGxhIiwgbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIGRpIE1ldGxha2F0bGEiLCAiTWVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBsZWdhbGUgZGkgTWV0bGFrYXRsYSIsICJNZURUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGRpIE1ldGxha2F0bGEiLCAiTWVUIn19LAorICAgICAgICAgICAgeyJBbWVyaWNhL01ldGxha2F0bGEiLCBQU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01leGljb19DaXR5IiwgQ1NUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NaXF1ZWxvbiIsIG5ldyBTdHJpbmdbXSB7Ik9yYSBzb2xhcmUgZGkgU2FpbnQtUGllcnJlIGUgTWlxdWVsb24iLCAiUE1TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgbGVnYWxlIGRpIFNhaW50LVBpZXJyZSBlIE1pcXVlbG9uIiwgIlBNRFQiLApAQCAtNjA3LDYgKzYwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWwgQnJ1bmVpIiwgIkJOU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkZWwgQnJ1bmVpIiwgIkJOVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9DYWxjdXR0YSIsIElTVH0sCisgICAgICAgICAgICB7IkFzaWEvQ2hpdGEiLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9DaG9pYmFsc2FuIiwgbmV3IFN0cmluZ1tdIHsiT3JhIGRpIENob2liYWxzYW4iLCAiQ0hPVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGkgQ2hvaWJhbHNhbiIsICJDSE9TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBDaG9pYmFsc2FuIiwgIkNIT1QifX0sCkBAIC02MzEsOSArNjM0LDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9Ib3ZkIiwgbmV3IFN0cmluZ1tdIHsiT3JhIGRpIEhvdmQiLCAiSE9WVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGkgSG92ZCIsICJIT1ZTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBIb3ZkIiwgIkhPVlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIG5ldyBTdHJpbmdbXSB7Ik9yYSBkaSBJcmt1dHNrIiwgIklSS1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRpIElya3V0c2siLCAiSVJLU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgSXJrdXRzayIsICJJUktUIn19LAorICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmFrYXJ0YSIsIFdJVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmF5YXB1cmEiLCBuZXcgU3RyaW5nW10geyJPcmEgZGVsbCdJbmRvbmVzaWEgb3JpZW50YWxlIiwgIldJVCIsCkBAIC02NDYsMTYgKzY0NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGkgUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIiwgIlBFVFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIiwgIlBFVFQifX0sCiAgICAgICAgICAgICB7IkFzaWEvS2FyYWNoaSIsIFBLVH0sCi0gICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIFhKVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2F0aG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRtYW5kdSIsIE5QVH0sCiAgICAgICAgICAgICB7IkFzaWEvS29sa2F0YSIsIElTVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2hhbmR5Z2EiLCBuZXcgU3RyaW5nW10geyJPcmEgZGkgS2hhbmR5Z2EiLCAiWUFLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRpIEtoYW5keWdhIiwgIllBS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBLaGFuZHlnYSIsICJZQUtUIn19LAotICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgbmV3IFN0cmluZ1tdIHsiT3JhIGRpIEtyYXNub2phcnNrIiwgIktSQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkaSBLcmFzbm9qYXJzayIsICJLUkFTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgS3Jhc25vamFyc2siLCAiS1JBVCJ9fSwKKyAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIEtSQVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1YWxhX0x1bXB1ciIsIE1ZVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VjaGluZyIsIE1ZVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3V3YWl0IiwgQVJBU1R9LApAQCAtNjcwLDcgKzY2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGRlbGxlIEZpbGlwcGluZSIsICJQSFQifX0sCiAgICAgICAgICAgICB7IkFzaWEvTXVzY2F0IiwgR1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9OaWNvc2lhIiwgRUVUfSwKLSAgICAgICAgICAgIHsiQXNpYS9Ob3Zva3V6bmV0c2siLCBOT1ZUfSwKKyAgICAgICAgICAgIHsiQXNpYS9Ob3Zva3V6bmV0c2siLCBLUkFUfSwKICAgICAgICAgICAgIHsiQXNpYS9Ob3Zvc2liaXJzayIsIE5PVlR9LAogICAgICAgICAgICAgeyJBc2lhL09yYWwiLCBuZXcgU3RyaW5nW10geyJPcmEgZGkgT3JhbCIsICJPUkFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkaSBPcmFsIiwgIk9SQVNUIiwKQEAgLTY5Niw2ICs2OTUsOSBAQAogICAgICAgICAgICAgeyJBc2lhL1NhbWFya2FuZCIsIFVaVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2VvdWwiLCBLU1R9LAogICAgICAgICAgICAgeyJBc2lhL1NpbmdhcG9yZSIsIFNHVH0sCisgICAgICAgICAgICB7IkFzaWEvU3JlZG5la29seW1zayIsIG5ldyBTdHJpbmdbXSB7IlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBEYXlsaWdodCBUaW1lIiwgIlNSRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3JlZG5la29seW1zayBUaW1lIiwgIlNSRVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvVGFpcGVpIiwgQ1RUfSwKICAgICAgICAgICAgIHsiQXNpYS9UZWxfQXZpdiIsIElTUkFFTH0sCiAgICAgICAgICAgICB7IkFzaWEvVGFzaGtlbnQiLCBVWlR9LApAQCAtNzA4LDcgKzcxMCw3IEBACiAgICAgICAgICAgICB7IkFzaWEvVWp1bmdfUGFuZGFuZyIsIENJVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhYW5iYWF0YXIiLCBVTEFUfSwKICAgICAgICAgICAgIHsiQXNpYS9VbGFuX0JhdG9yIiwgVUxBVH0sCi0gICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9VcnVtcWkiLCBYSlR9LAogICAgICAgICAgICAgeyJBc2lhL1VzdC1OZXJhIiwgbmV3IFN0cmluZ1tdIHsiT3JhIGRpIFVzdC1OZXJhIiwgIlZMQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkaSBVc3QtTmVyYSIsICJWTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgVXN0LU5lcmEiLCAiVkxBVCJ9fSwKQEAgLTc1MCw5ICs3NTIsOSBAQAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ2FuYmVycmEiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0N1cnJpZSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvRGFyd2luIiwgREFSV0lOfSwKLSAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIEF1c3RyYWxpYSBjZW50cm8tb2NjaWRlbnRhbGUiLCAiQ1dTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgQXVzdHJhbGlhIGNlbnRyby1vY2NpZGVudGFsZSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIEF1c3RyYWxpYSBjZW50cm8tb2NjaWRlbnRhbGUiLCAiQ1dUIn19LAorICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJPcmEgc3RhbmRhcmQgQXVzdHJhbGlhIGNlbnRyby1vY2NpZGVudGFsZSIsICJBQ1dTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgQXVzdHJhbGlhIGNlbnRyby1vY2NpZGVudGFsZSIsICJBQ1dEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBBdXN0cmFsaWEgY2VudHJvLW9jY2lkZW50YWxlIiwgIkFDV1QifX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9Ib2JhcnQiLCBUQVNNQU5JQX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9MSEkiLCBMT1JEX0hPV0V9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTGluZGVtYW4iLCBCUklTQkFORX0sCkBAIC04MTgsNyArODIwLDcgQEAKICAgICAgICAgICAgIHsiRXVyb3BlL0lzbGVfb2ZfTWFuIiwgR01UQlNUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0lzdGFuYnVsIiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0plcnNleSIsIEdNVEJTVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEZFVH0sCisgICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9LaWV2IiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0xpc2JvbiIsIFdFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9ManVibGphbmEiLCBDRVR9LApAQCAtODUzLDkgKzg1NSw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9WYXRpY2FuIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1ZpZW5uYSIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWxuaXVzIiwgRUVUfSwKLSAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIG5ldyBTdHJpbmdbXSB7Ik9yYSBkaSBWb2xnb2dyYWQiLCAiVk9MVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRpIFZvbGdvZ3JhZCIsICJWT0xTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgVm9sZ29ncmFkIiwgIlZPTFQifX0sCisgICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBNU0t9LAogICAgICAgICAgICAgeyJFdXJvcGUvV2Fyc2F3IiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phZ3JlYiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9aYXBvcm96aHllIiwgRUVUfSwKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9qYS9UaW1lWm9uZU5hbWVzX2phLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvamEvVGltZVpvbmVOYW1lc19qYS5qYXZhCmluZGV4IDIzYmJjZDYuLjY4YmQ2YzMgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9qYS9UaW1lWm9uZU5hbWVzX2phLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2phL1RpbWVab25lTmFtZXNfamEuamF2YQpAQCAtNDgsOSArNDgsOSBAQAogICAgICAgICBTdHJpbmcgQUNUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYTJcdTMwYWZcdTMwZWNcdTY2NDJcdTk1OTMiLCAiQUNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGEyXHUzMGFmXHUzMGVjXHU1OTBmXHU2NjQyXHU5NTkzIiwgIkFDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYTJcdTMwYWZcdTMwZWNcdTY2NDJcdTk1OTMiLCAiQUNUIn07Ci0gICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTU5MEZcdTY2NDJcdTk1OTMoXHU1MzU3XHUzMEFBXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEU5XHUzMEVBXHUzMEEyKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTUzNTdcdTMwQUFcdTMwRkNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwRUFcdTMwQTIpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBBR1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MzBhMlx1MzBlYlx1MzBiY1x1MzBmM1x1MzBjMVx1MzBmM1x1NjY0Mlx1OTU5MyIsICJBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYTJcdTMwZWJcdTMwYmNcdTMwZjNcdTMwYzFcdTMwZjNcdTU5MGZcdTY2NDJcdTk1OTMiLCAiQVJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBBMlx1MzBFQlx1MzBCQ1x1MzBGM1x1MzBDMVx1MzBGM1x1NjY0Mlx1OTU5MyIsICJBUlQifTsKQEAgLTcyLDEyICs3MiwxMiBAQAogICAgICAgICBTdHJpbmcgQkRUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwZDBcdTMwZjNcdTMwYjBcdTMwZTlcdTMwYzdcdTMwYjdcdTMwZTVcdTY2NDJcdTk1OTMiLCAiQkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGQwXHUzMGYzXHUzMGIwXHUzMGU5XHUzMGM3XHUzMGI3XHUzMGU1XHU1OTBmXHU2NjQyXHU5NTkzIiwgIkJEU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRDBcdTMwRjNcdTMwQjBcdTMwRTlcdTMwQzdcdTMwQjdcdTMwRTVcdTY2NDJcdTk1OTMiLCAiQkRUIn07Ci0gICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBBRlx1MzBBNFx1MzBGQ1x1MzBGM1x1MzBCQVx1MzBFOVx1MzBGM1x1MzBDOSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTU5MEZcdTY2NDJcdTk1OTMoXHUzMEFGXHUzMEE0XHUzMEZDXHUzMEYzXHUzMEJBXHUzMEU5XHUzMEYzXHUzMEM5KSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwQUZcdTMwQTRcdTMwRkNcdTMwRjNcdTMwQkFcdTMwRTlcdTMwRjNcdTMwQzkpIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMi9cdTMwQ0JcdTMwRTVcdTMwRkNcdTMwQjVcdTMwQTZcdTMwQjlcdTMwQTZcdTMwQTdcdTMwRkNcdTMwRUJcdTMwQkEpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMi9cdTMwQ0JcdTMwRTVcdTMwRkNcdTMwQjVcdTMwQTZcdTMwQjlcdTMwQTZcdTMwQTdcdTMwRkNcdTMwRUJcdTMwQkEpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMi9cdTMwQ0JcdTMwRTVcdTMwRkNcdTMwQjVcdTMwQTZcdTMwQjlcdTMwQTZcdTMwQTdcdTMwRkNcdTMwRUJcdTMwQkEpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBBRlx1MzBBNFx1MzBGQ1x1MzBGM1x1MzBCQVx1MzBFOVx1MzBGM1x1MzBDOSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1MzBBRlx1MzBBNFx1MzBGQ1x1MzBGM1x1MzBCQVx1MzBFOVx1MzBGM1x1MzBDOSkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBBRlx1MzBBNFx1MzBGQ1x1MzBGM1x1MzBCQVx1MzBFOVx1MzBGM1x1MzBDOSkiLCAiQUVUIn07CisgICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1NTM1N1x1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMi9cdTMwQ0JcdTMwRTVcdTMwRkNcdTMwQjVcdTMwQTZcdTMwQjlcdTMwQTZcdTMwQTdcdTMwRkNcdTMwRUJcdTMwQkEpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NTkwRlx1NjY0Mlx1OTU5MyhcdTUzNTdcdTMwQUFcdTMwRkNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwRUFcdTMwQTIvXHUzMENCXHUzMEU1XHUzMEZDXHUzMEI1XHUzMEE2XHUzMEI5XHUzMEE2XHUzMEE3XHUzMEZDXHUzMEVCXHUzMEJBKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDIoXHU1MzU3XHUzMEFBXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEU5XHUzMEVBXHUzMEEyL1x1MzBDQlx1MzBFNVx1MzBGQ1x1MzBCNVx1MzBBNlx1MzBCOVx1MzBBNlx1MzBBN1x1MzBGQ1x1MzBFQlx1MzBCQSkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBCUlRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MzBkNlx1MzBlOVx1MzBiOFx1MzBlYlx1NjY0Mlx1OTU5MyIsICJCUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwZDZcdTMwZTlcdTMwYjhcdTMwZWJcdTU5MGZcdTY2NDJcdTk1OTMiLCAiQlJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBENlx1MzBFOVx1MzBCOFx1MzBFQVx1MzBBMlx1NjY0Mlx1OTU5MyIsICJCUlQifTsKQEAgLTExMSw5ICsxMTEsOSBAQAogICAgICAgICBTdHJpbmcgQ1VCQVtdID0gbmV3IFN0cmluZ1tdIHsiXHUzMGFkXHUzMGU1XHUzMGZjXHUzMGQwXHU2YTE5XHU2ZTk2XHU2NjQyIiwgIkNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYWRcdTMwZTVcdTMwZmNcdTMwZDBcdTU5MGZcdTY2NDJcdTk1OTMiLCAiQ0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBFNVx1MzBGQ1x1MzBEMFx1NjY0Mlx1OTU5MyIsICJDVCJ9OwotICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDIoXHUzMENFXHUzMEZDXHUzMEI2XHUzMEYzXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTU5MEZcdTY2NDJcdTk1OTMoXHUzMENFXHUzMEZDXHUzMEI2XHUzMEYzXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDIoXHUzMENFXHUzMEZDXHUzMEI2XHUzMEYzXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDIoXHUzMENFXHUzMEZDXHUzMEI2XHUzMEYzXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDKSIsICJBQ1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1MzBDRVx1MzBGQ1x1MzBCNlx1MzBGM1x1MzBDNlx1MzBFQVx1MzBDOFx1MzBFQVx1MzBGQykiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwQ0VcdTMwRkNcdTMwQjZcdTMwRjNcdTMwQzZcdTMwRUFcdTMwQzhcdTMwRUFcdTMwRkMpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgRFVCTElOW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYjBcdTMwZWFcdTMwY2JcdTMwYzNcdTMwYjhcdTZhMTlcdTZlOTZcdTY2NDIiLCAiR01UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGEyXHUzMGE0XHUzMGViXHUzMGU5XHUzMGYzXHUzMGM5XHU1OTBmXHU2NjQyXHU5NTkzIiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBBMlx1MzBBNFx1MzBFQlx1MzBFOVx1MzBGM1x1MzBDOVx1NjY0Mlx1OTU5MyIsICJJVCJ9OwpAQCAtMTMyLDkgKzEzMiw5IEBACiAgICAgICAgIFN0cmluZyBFU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njc3MVx1OTBlOFx1NmExOVx1NmU5Nlx1NjY0MiIsICJFU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwZThcdTU5MGZcdTY2NDJcdTk1OTMiLCAiRURUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJcdTY3NzFcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDIoXHUzMENCXHUzMEU1XHUzMEZDXHUzMEI1XHUzMEE2XHUzMEI5XHUzMEE2XHUzMEE3XHUzMEZDXHUzMEVCXHUzMEJBKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1MzBDQlx1MzBFNVx1MzBGQ1x1MzBCNVx1MzBBNlx1MzBCOVx1MzBBNlx1MzBBN1x1MzBGQ1x1MzBFQlx1MzBCQSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwQ0JcdTMwRTVcdTMwRkNcdTMwQjVcdTMwQTZcdTMwQjlcdTMwQTZcdTMwQTdcdTMwRkNcdTMwRUJcdTMwQkEpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJcdTY3NzFcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDIoXHUzMENCXHUzMEU1XHUzMEZDXHUzMEI1XHUzMEE2XHUzMEI5XHUzMEE2XHUzMEE3XHUzMEZDXHUzMEVCXHUzMEJBKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NTkwRlx1NjY0Mlx1OTU5MyhcdTMwQ0JcdTMwRTVcdTMwRkNcdTMwQjVcdTMwQTZcdTMwQjlcdTMwQTZcdTMwQTdcdTMwRkNcdTMwRUJcdTMwQkEpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBDQlx1MzBFNVx1MzBGQ1x1MzBCNVx1MzBBNlx1MzBCOVx1MzBBNlx1MzBBN1x1MzBGQ1x1MzBFQlx1MzBCQSkiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njk3NVx1Njc3MVx1MzBFOFx1MzBGQ1x1MzBFRFx1MzBDM1x1MzBEMVx1NjY0Mlx1OTU5MyIsICJGRVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY5NzVcdTY3NzFcdTMwRThcdTMwRkNcdTMwRURcdTMwQzNcdTMwRDFcdTU5MEZcdTY2NDJcdTk1OTMiLCAiRkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njk3NVx1Njc3MVx1MzBFOFx1MzBGQ1x1MzBFRFx1MzBDM1x1MzBEMVx1NjY0Mlx1OTU5MyIsICJGRVQifTsKQEAgLTE2NSw2ICsxNjUsOSBAQAogICAgICAgICBTdHJpbmcgSUNUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYTRcdTMwZjNcdTMwYzlcdTMwYjdcdTMwY2FcdTY2NDJcdTk1OTMiLCAiSUNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGE0XHUzMGYzXHUzMGM5XHUzMGI3XHUzMGNhXHU1OTBmXHU2NjQyXHU5NTkzIiwgIklDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQTRcdTMwRjNcdTMwQzlcdTMwQjdcdTMwQ0FcdTY2NDJcdTk1OTMiLCAiSUNUIn07CisgICAgICAgIFN0cmluZyBJUktUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYTRcdTMwZWJcdTMwYWZcdTMwZmNcdTMwYzRcdTMwYWZcdTY2NDJcdTk1OTMiLCAiSVJLVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYTRcdTMwZWJcdTMwYWZcdTMwZmNcdTMwYzRcdTMwYWZcdTU5MGZcdTY2NDJcdTk1OTMiLCAiSVJLU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEE0XHUzMEVCXHUzMEFGXHUzMEZDXHUzMEM0XHUzMEFGXHU2NjQyXHU5NTkzIiwgIklSS1QifTsKICAgICAgICAgU3RyaW5nIElSVFtdID0gbmV3IFN0cmluZ1tdIHsiXHUzMGE0XHUzMGU5XHUzMGYzXHU2YTE5XHU2ZTk2XHU2NjQyIiwgIklSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYTRcdTMwZTlcdTMwZjNcdTU5MGZcdTY2NDJcdTk1OTMiLCAiSVJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBBNFx1MzBFOVx1MzBGM1x1NjY0Mlx1OTU5MyIsICJJUlQifTsKQEAgLTE3NywxMSArMTgwLDE0IEBACiAgICAgICAgIFN0cmluZyBKU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NjVlNVx1NjcyY1x1NmExOVx1NmU5Nlx1NjY0MiIsICJKU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY1ZTVcdTY3MmNcdTU5MGZcdTY2NDJcdTk1OTMiLCAiSkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NUU1XHU2NzJDXHU2NjQyXHU5NTkzIiwgIkpUIn07CisgICAgICAgIFN0cmluZyBLUkFUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYWZcdTMwZTlcdTMwYjlcdTMwY2VcdTMwZTRcdTMwZWJcdTMwYjlcdTMwYWZcdTY2NDJcdTk1OTMiLCAiS1JBVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYWZcdTMwZTlcdTMwYjlcdTMwY2VcdTMwZTRcdTMwZWJcdTMwYjlcdTMwYWZcdTU5MGZcdTY2NDJcdTk1OTMiLCAiS1JBU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEFGXHUzMEU5XHUzMEI5XHUzMENFXHUzMEU0XHUzMEVCXHUzMEI5XHUzMEFGXHU2NjQyXHU5NTkzIiwgIktSQVQifTsKICAgICAgICAgU3RyaW5nIEtTVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU5N2QzXHU1NmZkXHU2YTE5XHU2ZTk2XHU2NjQyIiwgIktTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTdkM1x1NTZmZFx1NTkwZlx1NjY0Mlx1OTU5MyIsICJLRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTk3RDNcdTU2RkRcdTY2NDJcdTk1OTMiLCAiS1QifTsKICAgICAgICAgU3RyaW5nIExPUkRfSE9XRVtdID0gbmV3IFN0cmluZ1tdIHsiXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGNmXHUzMGE2XHU1Y2Y2XHU2YTE5XHU2ZTk2XHU2NjQyIiwgIkxIU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwY2ZcdTMwYTZcdTVjZjZcdTU5MGZcdTY2NDJcdTk1OTMiLCAiTEhTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBlZFx1MzBmY1x1MzBjOVx1MzBjZlx1MzBhNlx1NWNmNlx1NTkwZlx1NjY0Mlx1OTU5MyIsICJMSERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVEXHUzMEZDXHUzMEM5XHUzMENGXHUzMEE2XHU2NjQyXHU5NTkzIiwgIkxIVCJ9OwogICAgICAgICBTdHJpbmcgTUhUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwZGVcdTMwZmNcdTMwYjdcdTMwZTNcdTMwZWJcdTVjZjZcdTY2NDJcdTk1OTMiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGRlXHUzMGZjXHUzMGI3XHUzMGUzXHUzMGViXHU1Y2Y2XHU1OTBmXHU2NjQyXHU5NTkzIiwgIk1IU1QiLApAQCAtMjMxLDIwICsyMzcsMTUgQEAKICAgICAgICAgU3RyaW5nIFNHVFtdID0gbmV3IFN0cmluZ1tdIHsiXHUzMGI3XHUzMGYzXHUzMGFjXHUzMGRkXHUzMGZjXHUzMGViXHU2NjQyXHU5NTkzIiwgIlNHVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBiN1x1MzBmM1x1MzBhY1x1MzBkZFx1MzBmY1x1MzBlYlx1NTkwZlx1NjY0Mlx1OTU5MyIsICJTR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEI3XHUzMEYzXHUzMEFDXHUzMEREXHUzMEZDXHUzMEVCXHU2NjQyXHU5NTkzIiwgIlNHVCJ9OwotICAgICAgICBTdHJpbmcgU0xTVFtdID0gbmV3IFN0cmluZ1tdIHsiXHUzMGIwXHUzMGVhXHUzMGNiXHUzMGMzXHUzMGI4XHU2YTE5XHU2ZTk2XHU2NjQyIiwgIkdNVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYjdcdTMwYThcdTMwZTlcdTMwZWNcdTMwYWFcdTMwY2RcdTU5MGZcdTY2NDJcdTk1OTMiLCAiU0xTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQjdcdTMwQThcdTMwRTlcdTMwRUNcdTMwQUFcdTMwQ0RcdTY2NDJcdTk1OTMiLCAiU0xUIn07Ci0gICAgICAgIFN0cmluZyBUQVNNQU5JQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBCRlx1MzBCOVx1MzBERVx1MzBDQlx1MzBBMikiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTU5MEZcdTY2NDJcdTk1OTMoXHUzMEJGXHUzMEI5XHUzMERFXHUzMENCXHUzMEEyKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwQkZcdTMwQjlcdTMwREVcdTMwQ0JcdTMwQTIpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBUQVNNQU5JQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBCRlx1MzBCOVx1MzBERVx1MzBDQlx1MzBBMikiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1MzBCRlx1MzBCOVx1MzBERVx1MzBDQlx1MzBBMikiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBCRlx1MzBCOVx1MzBERVx1MzBDQlx1MzBBMikiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBUTVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MzBjOFx1MzBlYlx1MzBhZlx1MzBlMVx1MzBjYlx1MzBiOVx1MzBiZlx1MzBmM1x1NjY0Mlx1OTU5MyIsICJUTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYzhcdTMwZWJcdTMwYWZcdTMwZTFcdTMwY2JcdTMwYjlcdTMwYmZcdTMwZjNcdTU5MGZcdTY2NDJcdTk1OTMiLCAiVE1TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBDOFx1MzBFQlx1MzBBRlx1MzBFMVx1MzBDQlx1MzBCOVx1MzBCRlx1MzBGM1x1NjY0Mlx1OTU5MyIsICJUTVQifTsKICAgICAgICAgU3RyaW5nIFVMQVRbXT0gbmV3IFN0cmluZ1tdIHsiXHUzMGE2XHUzMGU5XHUzMGZjXHUzMGYzXHUzMGQwXHUzMGZjXHUzMGM4XHUzMGViXHU2NjQyXHU5NTkzIiwgIlVMQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYTZcdTMwZTlcdTMwZmNcdTMwZjNcdTMwZDBcdTMwZmNcdTMwYzhcdTMwZWJcdTU5MGZcdTY2NDJcdTk1OTMiLCAiVUxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQTZcdTMwRTlcdTMwRjNcdTMwRDBcdTMwRkNcdTMwQzhcdTMwRUJcdTY2NDJcdTk1OTMiLCAiVUxBVCJ9OwotICAgICAgICBTdHJpbmcgV0FSVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdmXHUzMGEyXHUzMGViXHUzMGJjXHUzMGYzXHUzMGMxXHUzMGYzXHU2NjQyXHU5NTkzIiwgIldBUlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdmXHUzMGEyXHUzMGViXHUzMGJjXHUzMGYzXHUzMGMxXHUzMGYzXHU1OTBmXHU2NjQyXHU5NTkzIiwgIldBUlNUIn07CiAgICAgICAgIFN0cmluZyBXQVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Zlx1MzBhMlx1MzBkNVx1MzBlYVx1MzBhYlx1NjY0Mlx1OTU5MyIsICJXQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N2ZcdTMwYTJcdTMwZDVcdTMwZWFcdTMwYWJcdTU5MGZcdTY2NDJcdTk1OTMiLCAiV0FTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1OTBFOFx1MzBBMlx1MzBENVx1MzBFQVx1MzBBQlx1NjY0Mlx1OTU5MyIsICJXQVQifTsKQEAgLTI1NCwyNyArMjU1LDMwIEBACiAgICAgICAgIFN0cmluZyBXSVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Zlx1MzBhNFx1MzBmM1x1MzBjOVx1MzBjZFx1MzBiN1x1MzBhMlx1NjY0Mlx1OTU5MyIsICJXSUIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N2ZcdTMwYTRcdTMwZjNcdTMwYzlcdTMwY2RcdTMwYjdcdTMwYTJcdTU5MGZcdTY2NDJcdTk1OTMiLCAiV0lTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1OTBFOFx1MzBBNFx1MzBGM1x1MzBDOVx1MzBDRFx1MzBCN1x1MzBBMlx1NjY0Mlx1OTU5MyIsICJXSUIifTsKLSAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Rlx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwQUFcdTMwRkNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwRUFcdTMwQTIpIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N0ZcdTkwRThcdTU5MEZcdTY2NDJcdTk1OTMoXHUzMEFBXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEU5XHUzMEVBXHUzMEEyKSIsICJXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU5MEU4XHU2NjQyXHU5NTkzKFx1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiV1QifTsKKyAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Rlx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwQUFcdTMwRkNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwRUFcdTMwQTIpIiwgIkFXU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiQVdEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N0ZcdTkwRThcdTY2NDJcdTk1OTMoXHUzMEFBXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEU5XHUzMEVBXHUzMEEyKSIsICJBV1QifTsKICAgICAgICAgU3RyaW5nIFNBTU9BW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYjVcdTMwZTJcdTMwYTJcdTZhMTlcdTZlOTZcdTY2NDIiLCAiU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYjVcdTMwZTJcdTMwYTJcdTU5MGZcdTY2NDJcdTk1OTMiLCAiU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQjVcdTMwRTJcdTMwQTJcdTY2NDJcdTk1OTMiLCAiU1QifTsKLSAgICAgICAgU3RyaW5nIFdTVF9TQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdmXHUzMGI1XHUzMGUyXHUzMGEyXHU2NjQyXHU5NTkzIiwgIldTVCIsCisgICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Zlx1MzBiNVx1MzBlMlx1MzBhMlx1NjY0Mlx1OTU5MyIsICJXU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdmXHUzMGI1XHUzMGUyXHUzMGEyXHU1OTBmXHU2NjQyXHU5NTkzIiwgIldTRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N0ZcdTMwQjVcdTMwRTJcdTMwQTJcdTY2NDJcdTk1OTMiLCAiV1NUIn07CiAgICAgICAgIFN0cmluZyBDaFNUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYjBcdTMwYTJcdTMwZTBcdTZhMTlcdTZlOTZcdTY2NDIiLCAiQ2hTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYjBcdTMwYTJcdTMwZTBcdTU5MGZcdTY2NDJcdTk1OTMiLCAiQ2hEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQzFcdTMwRTNcdTMwRTJcdTMwRURcdTY2NDJcdTk1OTMiLCAiQ2hUIn07Ci0gICAgICAgIFN0cmluZyBWSUNUT1JJQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBEM1x1MzBBRlx1MzBDOFx1MzBFQVx1MzBBMikiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTU5MEZcdTY2NDJcdTk1OTMoXHUzMEQzXHUzMEFGXHUzMEM4XHUzMEVBXHUzMEEyKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwRDNcdTMwQUZcdTMwQzhcdTMwRUFcdTMwQTIpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBWSUNUT1JJQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBEM1x1MzBBRlx1MzBDOFx1MzBFQVx1MzBBMikiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1MzBEM1x1MzBBRlx1MzBDOFx1MzBFQVx1MzBBMikiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBEM1x1MzBBRlx1MzBDOFx1MzBFQVx1MzBBMikiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBVVENbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NTM1NFx1NWI5YVx1NGUxNlx1NzU0Y1x1NjY0MiIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUzNTRcdTViOWFcdTRlMTZcdTc1NGNcdTY2NDIiLCAiVVRDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1MzU0XHU1QjlBXHU0RTE2XHU3NTRDXHU2NjQyIiwgIlVUQyJ9OwogICAgICAgICBTdHJpbmcgVVpUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwYTZcdTMwYmFcdTMwZDlcdTMwYWRcdTMwYjlcdTMwYmZcdTMwZjNcdTY2NDJcdTk1OTMiLCAiVVpUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGE2XHUzMGJhXHUzMGQ5XHUzMGFkXHUzMGI5XHUzMGJmXHUzMGYzXHU1OTBmXHU2NjQyXHU5NTkzIiwgIlVaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQTZcdTMwQkFcdTMwRDlcdTMwQURcdTMwQjlcdTMwQkZcdTMwRjNcdTY2NDJcdTk1OTMiLCAiVVpUIn07CisgICAgICAgIFN0cmluZyBYSlRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NGUyZFx1NTZmZFx1NmExOVx1NmU5Nlx1NjY0MiIsICJYSlQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRlMmRcdTU2ZmRcdTU5MGZcdTY2NDJcdTk1OTMiLCAiWEpEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1NTZGRFx1NjY0Mlx1OTU5MyIsICJYSlQifTsKIAogICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW10gewogICAgICAgICAgICAgeyJBbWVyaWNhL0xvc19BbmdlbGVzIiwgUFNUfSwKQEAgLTMzNiw3ICszNDAsNyBAQAogICAgICAgICAgICAgeyJBZnJpY2EvRGppYm91dGkiLCBFQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRG91YWxhIiwgV0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0VsX0FhaXVuIiwgV0VUfSwKLSAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgU0xTVH0sCisgICAgICAgICAgICB7IkFmcmljYS9GcmVldG93biIsIEdNVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9HYWJvcm9uZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9IYXJhcmUiLCBDQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvSm9oYW5uZXNidXJnIiwgU0FTVH0sCkBAIC00MzcsNyArNDQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdmXHUzMGIwXHUzMGVhXHUzMGZjXHUzMGYzXHUzMGU5XHUzMGYzXHUzMGM5XHU1OTBmXHU2NjQyXHU5NTkzIiwgIldHU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N0ZcdTkwRThcdTMwQjBcdTMwRUFcdTMwRkNcdTMwRjNcdTMwRTlcdTMwRjNcdTMwQzlcdTY2NDJcdTk1OTMiLCAiV0dUIn19LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dvb3NlX0JheSIsIEFTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEVTVH0sCisgICAgICAgICAgICB7IkFtZXJpY2EvR3JhbmRfVHVyayIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3JlbmFkYSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhZGVsb3VwZSIsIEFTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR3VhdGVtYWxhIiwgQ1NUfSwKQEAgLTQ4NCw5ICs0ODgsNyBAQAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbmRvemEiLCBBR1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lbm9taW5lZSIsIENTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVyaWRhIiwgQ1NUfSwKLSAgICAgICAgICAgIHsiQW1lcmljYS9NZXRsYWthdGxhIiwgbmV3IFN0cmluZ1tdIHsiXHUzMEUxXHUzMEM4XHUzMEU5XHUzMEFCXHUzMEM4XHUzMEU5XHU2QTE5XHU2RTk2XHU2NjQyXHU5NTkzIiwgIk1lU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRTFcdTMwQzhcdTMwRTlcdTMwQUJcdTMwQzhcdTMwRTlcdTU5MEZcdTY2NDJcdTk1OTMiLCAiTWVEVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBFMVx1MzBDOFx1MzBFOVx1MzBBQlx1MzBDOFx1MzBFOVx1NjY0Mlx1OTU5MyIsICJNZVQifX0sCisgICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIFBTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWV4aWNvX0NpdHkiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01pcXVlbG9uIiwgbmV3IFN0cmluZ1tdIHsiXHUzMGI1XHUzMGYzXHUzMGQ0XHUzMGE4XHUzMGZjXHUzMGViXHUzMGZiXHUzMGRmXHUzMGFmXHUzMGVkXHUzMGYzXHU4YWY4XHU1Y2Y2XHU2YTE5XHU2ZTk2XHU2NjQyIiwgIlBNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGI1XHUzMGYzXHUzMGQ0XHUzMGE4XHUzMGZjXHUzMGViXHUzMGZiXHUzMGRmXHUzMGFmXHUzMGVkXHUzMGYzXHU4YWY4XHU1Y2Y2XHU1OTBmXHU2NjQyXHU5NTkzIiwgIlBNRFQiLApAQCAtNjA3LDYgKzYwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGQ2XHUzMGViXHUzMGNkXHUzMGE0XHU1OTBmXHU2NjQyXHU5NTkzIiwgIkJOU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBENlx1MzBFQlx1MzBDRFx1MzBBNFx1NjY0Mlx1OTU5MyIsICJCTlQifX0sCiAgICAgICAgICAgICB7IkFzaWEvQ2FsY3V0dGEiLCBJU1R9LAorICAgICAgICAgICAgeyJBc2lhL0NoaXRhIiwgSVJLVH0sCiAgICAgICAgICAgICB7IkFzaWEvQ2hvaWJhbHNhbiIsIG5ldyBTdHJpbmdbXSB7Ilx1MzBjMVx1MzBlN1x1MzBhNFx1MzBkMFx1MzBlYlx1MzBiNVx1MzBmM1x1NjY0Mlx1OTU5MyIsICJDSE9UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGMxXHUzMGU3XHUzMGE0XHUzMGQwXHUzMGViXHUzMGI1XHUzMGYzXHU1OTBmXHU2NjQyXHU5NTkzIiwgIkNIT1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEMxXHUzMEU3XHUzMEE0XHUzMEQwXHUzMEVCXHUzMEI1XHUzMEYzXHU2NjQyXHU5NTkzIiwgIkNIT1QifX0sCkBAIC02MzEsOSArNjM0LDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9Ib3ZkIiwgbmV3IFN0cmluZ1tdIHsiXHUzMGRiXHUzMGQ2XHUzMGM5XHU2NjQyXHU5NTkzIiwgIkhPVlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwZGJcdTMwZDZcdTMwYzlcdTU5MGZcdTY2NDJcdTk1OTMiLCAiSE9WU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREJcdTMwRDZcdTMwQzlcdTY2NDJcdTk1OTMiLCAiSE9WVCJ9fSwKLSAgICAgICAgICAgIHsiQXNpYS9Jcmt1dHNrIiwgbmV3IFN0cmluZ1tdIHsiXHUzMGE0XHUzMGViXHUzMGFmXHUzMGZjXHUzMGM0XHUzMGFmXHU2NjQyXHU5NTkzIiwgIklSS1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYTRcdTMwZWJcdTMwYWZcdTMwZmNcdTMwYzRcdTMwYWZcdTU5MGZcdTY2NDJcdTk1OTMiLCAiSVJLU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQTRcdTMwRUJcdTMwQUZcdTMwRkNcdTMwQzRcdTMwQUZcdTY2NDJcdTk1OTMiLCAiSVJLVCJ9fSwKKyAgICAgICAgICAgIHsiQXNpYS9Jcmt1dHNrIiwgSVJLVH0sCiAgICAgICAgICAgICB7IkFzaWEvSXN0YW5idWwiLCBFRVR9LAogICAgICAgICAgICAgeyJBc2lhL0pha2FydGEiLCBXSVR9LAogICAgICAgICAgICAgeyJBc2lhL0pheWFwdXJhIiwgbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHUzMGE0XHUzMGYzXHUzMGM5XHUzMGNkXHUzMGI3XHUzMGEyXHU2NjQyXHU5NTkzIiwgIldJVCIsCkBAIC02NDYsMTYgKzY0NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBkYVx1MzBjOFx1MzBlZFx1MzBkMVx1MzBkNlx1MzBlZFx1MzBkNVx1MzBiOVx1MzBhZlx1MzBhYlx1MzBlMFx1MzBjMVx1MzBlM1x1MzBjNFx1MzBhZFx1MzBmY1x1NTkwZlx1NjY0Mlx1OTU5MyIsICJQRVRTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMERBXHUzMEM4XHUzMEVEXHUzMEQxXHUzMEQ2XHUzMEVEXHUzMEQ1XHUzMEI5XHUzMEFGXHUzMEZCXHUzMEFCXHUzMEUwXHUzMEMxXHUzMEUzXHUzMEM0XHUzMEFEXHUzMEZDXHU2NjQyXHU5NTkzIiwgIlBFVFQifX0sCiAgICAgICAgICAgICB7IkFzaWEvS2FyYWNoaSIsIFBLVH0sCi0gICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIFhKVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2F0aG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRtYW5kdSIsIE5QVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2hhbmR5Z2EiLCBuZXcgU3RyaW5nW10geyJcdTMwQ0ZcdTMwRjNcdTMwQzlcdTMwQTVcdTMwQTRcdTMwQUNcdTY2NDJcdTk1OTMiLCAiWUFLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQ0ZcdTMwRjNcdTMwQzlcdTMwQTVcdTMwQTRcdTMwQUNcdTU5MEZcdTY2NDJcdTk1OTMiLCAiWUFLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMENGXHUzMEYzXHUzMEM5XHUzMEE1XHUzMEE0XHUzMEFDXHU2NjQyXHU5NTkzIiwgIllBS1QifX0sCiAgICAgICAgICAgICB7IkFzaWEvS29sa2F0YSIsIElTVH0sCi0gICAgICAgICAgICB7IkFzaWEvS3Jhc25veWFyc2siLCBuZXcgU3RyaW5nW10geyJcdTMwYWZcdTMwZTlcdTMwYjlcdTMwY2VcdTMwZTRcdTMwZWJcdTMwYjlcdTMwYWZcdTY2NDJcdTk1OTMiLCAiS1JBVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYWZcdTMwZTlcdTMwYjlcdTMwY2VcdTMwZTRcdTMwZWJcdTMwYjlcdTMwYWZcdTU5MGZcdTY2NDJcdTk1OTMiLCAiS1JBU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEFGXHUzMEU5XHUzMEI5XHUzMENFXHUzMEU0XHUzMEVCXHUzMEI5XHUzMEFGXHU2NjQyXHU5NTkzIiwgIktSQVQifX0sCisgICAgICAgICAgICB7IkFzaWEvS3Jhc25veWFyc2siLCBLUkFUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWFsYV9MdW1wdXIiLCBNWVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1Y2hpbmciLCBNWVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1d2FpdCIsIEFSQVNUfSwKQEAgLTY3MCw3ICs2NjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBENVx1MzBBM1x1MzBFQVx1MzBENFx1MzBGM1x1NjY0Mlx1OTU5MyIsICJQSFQifX0sCiAgICAgICAgICAgICB7IkFzaWEvTXVzY2F0IiwgR1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9OaWNvc2lhIiwgRUVUfSwKLSAgICAgICAgICAgIHsiQXNpYS9Ob3Zva3V6bmV0c2siLCBOT1ZUfSwKKyAgICAgICAgICAgIHsiQXNpYS9Ob3Zva3V6bmV0c2siLCBLUkFUfSwKICAgICAgICAgICAgIHsiQXNpYS9Ob3Zvc2liaXJzayIsIE5PVlR9LAogICAgICAgICAgICAgeyJBc2lhL09yYWwiLCBuZXcgU3RyaW5nW10geyJcdTMwYWFcdTMwZTlcdTMwZWJcdTY2NDJcdTk1OTMiLCAiT1JBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBhYVx1MzBlOVx1MzBlYlx1NTkwZlx1NjY0Mlx1OTU5MyIsICJPUkFTVCIsCkBAIC02OTYsNiArNjk1LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9TYW1hcmthbmQiLCBVWlR9LAogICAgICAgICAgICAgeyJBc2lhL1Nlb3VsIiwgS1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9TaW5nYXBvcmUiLCBTR1R9LAorICAgICAgICAgICAgeyJBc2lhL1NyZWRuZWtvbHltc2siLCBuZXcgU3RyaW5nW10geyJTcmVkbmVrb2x5bXNrIFRpbWUiLCAiU1JFVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgRGF5bGlnaHQgVGltZSIsICJTUkVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIn19LAogICAgICAgICAgICAgeyJBc2lhL1RhaXBlaSIsIENUVH0sCiAgICAgICAgICAgICB7IkFzaWEvVGVsX0F2aXYiLCBJU1JBRUx9LAogICAgICAgICAgICAgeyJBc2lhL1Rhc2hrZW50IiwgVVpUfSwKQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgICAgICAgICAgeyJBc2lhL1VqdW5nX1BhbmRhbmciLCBDSVR9LAogICAgICAgICAgICAgeyJBc2lhL1VsYWFuYmFhdGFyIiwgVUxBVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhbl9CYXRvciIsIFVMQVR9LAotICAgICAgICAgICAgeyJBc2lhL1VydW1xaSIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9Vc3QtTmVyYSIsIG5ldyBTdHJpbmdbXSB7Ilx1MzBBNlx1MzBCOVx1MzBDMVx1MzBDRFx1MzBFOVx1NjY0Mlx1OTU5MyIsICJWTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBBNlx1MzBCOVx1MzBDMVx1MzBDRFx1MzBFOVx1NTkwRlx1NjY0Mlx1OTU5MyIsICJWTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwQTZcdTMwQjlcdTMwQzFcdTMwQ0RcdTMwRTlcdTY2NDJcdTk1OTMiLCAiVkxBVCJ9fSwKQEAgLTc1MCw5ICs3NTIsOSBAQAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ2FuYmVycmEiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0N1cnJpZSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvRGFyd2luIiwgREFSV0lOfSwKLSAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU4OTdGXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyKFx1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiQ1dTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1ODk3Rlx1OTBFOFx1NTkwRlx1NjY0Mlx1OTU5MyhcdTMwQUFcdTMwRkNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwRUFcdTMwQTIpIiwgIkNXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTg5N0ZcdTkwRThcdTY2NDJcdTk1OTMoXHUzMEFBXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEU5XHUzMEVBXHUzMEEyKSIsICJDV1QifX0sCisgICAgICAgICAgICB7IkF1c3RyYWxpYS9FdWNsYSIsIG5ldyBTdHJpbmdbXSB7Ilx1NEUyRFx1ODk3Rlx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0MihcdTMwQUFcdTMwRkNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwRUFcdTMwQTIpIiwgIkFDV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU4OTdGXHU5MEU4XHU1OTBGXHU2NjQyXHU5NTkzKFx1MzBBQVx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBFOVx1MzBFQVx1MzBBMikiLCAiQUNXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTg5N0ZcdTkwRThcdTY2NDJcdTk1OTMoXHUzMEFBXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEU5XHUzMEVBXHUzMEEyKSIsICJBQ1dUIn19LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvSG9iYXJ0IiwgVEFTTUFOSUF9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTEhJIiwgTE9SRF9IT1dFfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0xpbmRlbWFuIiwgQlJJU0JBTkV9LApAQCAtODE4LDcgKzgyMCw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9Jc2xlX29mX01hbiIsIEdNVEJTVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9KZXJzZXkiLCBHTVRCU1R9LAotICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBGRVR9LAorICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvS2lldiIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9MaXNib24iLCBXRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvTGp1YmxqYW5hIiwgQ0VUfSwKQEAgLTg1Myw5ICs4NTUsNyBAQAogICAgICAgICAgICAgeyJFdXJvcGUvVmF0aWNhbiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWVubmEiLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvVmlsbml1cyIsIEVFVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBuZXcgU3RyaW5nW10geyJcdTMwZGNcdTMwZWJcdTMwYjRcdTMwYjBcdTMwZTlcdTMwZmNcdTMwYzlcdTY2NDJcdTk1OTMiLCAiVk9MVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwZGNcdTMwZWJcdTMwYjRcdTMwYjBcdTMwZTlcdTMwZmNcdTMwYzlcdTU5MGZcdTY2NDJcdTk1OTMiLCAiVk9MU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMERDXHUzMEVCXHUzMEI0XHUzMEIwXHUzMEU5XHUzMEZDXHUzMEM5XHU2NjQyXHU5NTkzIiwgIlZPTFQifX0sCisgICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBNU0t9LAogICAgICAgICAgICAgeyJFdXJvcGUvV2Fyc2F3IiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phZ3JlYiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9aYXBvcm96aHllIiwgRUVUfSwKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9rby9UaW1lWm9uZU5hbWVzX2tvLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMva28vVGltZVpvbmVOYW1lc19rby5qYXZhCmluZGV4IGQxZTEwNmUuLmZjZmQ3NDggMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9rby9UaW1lWm9uZU5hbWVzX2tvLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2tvL1RpbWVab25lTmFtZXNfa28uamF2YQpAQCAtNDgsOSArNDgsOSBAQAogICAgICAgICBTdHJpbmcgQUNUW10gPSBuZXcgU3RyaW5nW10geyJcdWM1ZDBcdWM3NzRcdWNlZTQgXHVjMmRjXHVhYzA0IiwgIkFDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzVkMFx1Yzc3NFx1Y2VlNCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiQUNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzVkMFx1Yzc3NFx1Y2VlNCBcdWMyZGNcdWFjMDQiLCAiQUNUIn07Ci0gICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiXHVDOTExXHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUIwQThcdUJEODAgXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0KSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUIwQThcdUJEODAgXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0KSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVCMEE4XHVCRDgwIFx1QzYyNFx1QzJBNFx1RDJCOFx1QjgwOFx1Qzc3Q1x1QjlBQ1x1QzU0NCkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJcdUM5MTFcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QjBBOFx1QkQ4MCBcdUM2MjRcdUMyQTRcdUQyQjhcdUI4MDhcdUM3N0NcdUI5QUNcdUM1NDQpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUIwQThcdUJEODAgXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0KSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUM5MTFcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QjBBOFx1QkQ4MCBcdUM2MjRcdUMyQTRcdUQyQjhcdUI4MDhcdUM3N0NcdUI5QUNcdUM1NDQpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQUdUW10gPSBuZXcgU3RyaW5nW10geyJcdWM1NDRcdWI5NzRcdWQ1ZThcdWQyZjBcdWIwOTggXHVjMmRjXHVhYzA0IiwgIkFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzU0NFx1Yjk3NFx1ZDVlOFx1ZDJmMFx1YjA5OCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiQVJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzU0NFx1Qjk3NFx1RDVFOFx1RDJGMFx1QjA5OCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiQVJUIn07CkBAIC03MiwxMiArNzIsMTIgQEAKICAgICAgICAgU3RyaW5nIEJEVFtdID0gbmV3IFN0cmluZ1tdIHsiXHViYzI5XHVhZTAwXHViNzdjXHViMzcwXHVjMmRjIFx1YzJkY1x1YWMwNCIsICJCRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWJjMjlcdWFlMDBcdWI3N2NcdWIzNzBcdWMyZGMgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIkJEU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUJDMjlcdUFFMDBcdUI3N0NcdUIzNzBcdUMyREMgXHVENDVDXHVDOTAwXHVDMkRDIiwgIkJEVCJ9OwotICAgICAgICBTdHJpbmcgQlJJU0JBTkVbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1QjNEOVx1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVEMDM4XHVDOTkwXHVCNzlDXHVCNERDKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QjNEOVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUQwMzhcdUM5OTBcdUI3OUNcdUI0REMpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUQwMzhcdUM5OTBcdUI3OUNcdUI0REMpIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiXHVDOTExXHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUIwQThcdUJEODAgXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0L1x1QjI3NFx1QzBBQ1x1QzZCMFx1QzJBNFx1QzZFOFx1Qzc3Q1x1Qzk4OCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUM5MTFcdUJEODAgXHVDNzdDXHVBRDExIFx1QzgwOFx1QzU3RCBcdUMyRENcdUFDMDQoXHVCMEE4XHVCRDgwIFx1QzYyNFx1QzJBNFx1RDJCOFx1QjgwOFx1Qzc3Q1x1QjlBQ1x1QzU0NC9cdUIyNzRcdUMwQUNcdUM2QjBcdUMyQTRcdUM2RThcdUM3N0NcdUM5ODgpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDOTExXHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUIwQThcdUJEODAgXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0L1x1QjI3NFx1QzBBQ1x1QzZCMFx1QzJBNFx1QzZFOFx1Qzc3Q1x1Qzk4OCkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEJSSVNCQU5FW10gPSBuZXcgU3RyaW5nW10geyJcdUIzRDlcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1RDAzOFx1Qzk5MFx1Qjc5Q1x1QjREQykiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1Qzc3Q1x1QUQxMSBcdUM4MDhcdUM1N0QgXHVDMkRDXHVBQzA0KFx1RDAzOFx1Qzk5MFx1Qjc5Q1x1QjREQykiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUQwMzhcdUM5OTBcdUI3OUNcdUI0REMpIiwgIkFFVCJ9OworICAgICAgICBTdHJpbmcgQlJPS0VOX0hJTExbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1QzkxMVx1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVCMEE4XHVCRDgwIFx1QzYyNFx1QzJBNFx1RDJCOFx1QjgwOFx1Qzc3Q1x1QjlBQ1x1QzU0NC9cdUIyNzRcdUMwQUNcdUM2QjBcdUMyQTRcdUM2RThcdUM3N0NcdUM5ODgpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUIwQThcdUJEODAgXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0L1x1QjI3NFx1QzBBQ1x1QzZCMFx1QzJBNFx1QzZFOFx1Qzc3Q1x1Qzk4OCkiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDOTExXHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUIwQThcdUJEODAgXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0L1x1QjI3NFx1QzBBQ1x1QzZCMFx1QzJBNFx1QzZFOFx1Qzc3Q1x1Qzk4OCkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBCUlRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YmUwY1x1Yjc3Y1x1YzljOFx1YjlhY1x1YzU0NCBcdWMyZGNcdWFjMDQiLCAiQlJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHViZTBjXHViNzdjXHVjOWM4XHViOWFjXHVjNTQ0IFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJCUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCRTBDXHVCNzdDXHVDOUM4XHVCOUFDXHVDNTQ0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJCUlQifTsKQEAgLTExMSw5ICsxMTEsOSBAQAogICAgICAgICBTdHJpbmcgQ1VCQVtdID0gbmV3IFN0cmluZ1tdIHsiXHVjZmUwXHViYzE0IFx1ZDQ1Y1x1YzkwMFx1YzJkYyIsICJDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjZmUwXHViYzE0IFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJDRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDRkUwXHVCQzE0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJDVCJ9OwotICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJcdUM5MTFcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QkQ4MVx1QkQ4MCBcdUM5QzBcdUM1RUQpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUJEODFcdUJEODAgXHVDOUMwXHVDNUVEKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUM5MTFcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QkQ4MVx1QkQ4MCBcdUM5QzBcdUM1RUQpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBEQVJXSU5bXSA9IG5ldyBTdHJpbmdbXSB7Ilx1QzkxMVx1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVCRDgxXHVCRDgwIFx1QzlDMFx1QzVFRCkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUJEODFcdUJEODAgXHVDOUMwXHVDNUVEKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDOTExXHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUJEODFcdUJEODAgXHVDOUMwXHVDNUVEKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIERVQkxJTltdID0gbmV3IFN0cmluZ1tdIHsiXHVhZGY4XHViOWFjXHViMmM4XHVjZTU4IFx1ZDQ1Y1x1YzkwMFx1YzJkYyIsICJHTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWM1NDRcdWM3N2NcdWI3OWNcdWI0ZGMgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzU0NFx1Qzc3Q1x1Qjc5Q1x1QjREQyBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiSVQifTsKQEAgLTEzMiw5ICsxMzIsOSBAQAogICAgICAgICBTdHJpbmcgRVNUW10gPSBuZXcgU3RyaW5nW10geyJcdWIzZDlcdWJkODAgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YjNkOVx1YmQ4MCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiRURUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJFVCJ9OwotICAgICAgICBTdHJpbmcgRVNUX05TV1tdID0gbmV3IFN0cmluZ1tdIHsiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUIyNzRcdUMwQUNcdUM2QjBcdUMyQTRcdUM2RThcdUM3N0NcdUM5ODgpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUIzRDlcdUJEODAgXHVDNzdDXHVBRDExIFx1QzgwOFx1QzU3RCBcdUMyRENcdUFDMDQoXHVCMjc0XHVDMEFDXHVDNkIwXHVDMkE0XHVDNkU4XHVDNzdDXHVDOTg4KSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUIyNzRcdUMwQUNcdUM2QjBcdUMyQTRcdUM2RThcdUM3N0NcdUM5ODgpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJcdUIzRDlcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QjI3NFx1QzBBQ1x1QzZCMFx1QzJBNFx1QzZFOFx1Qzc3Q1x1Qzk4OCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUIzRDlcdUJEODAgXHVDNzdDXHVBRDExIFx1QzgwOFx1QzU3RCBcdUMyRENcdUFDMDQoXHVCMjc0XHVDMEFDXHVDNkIwXHVDMkE0XHVDNkU4XHVDNzdDXHVDOTg4KSIsICJBRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QjNEOVx1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVCMjc0XHVDMEFDXHVDNkIwXHVDMkE0XHVDNkU4XHVDNzdDXHVDOTg4KSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIEZFVFtdID0gbmV3IFN0cmluZ1tdIHsiXHVBREY5XHVCM0Q5IFx1QzcyMFx1QjdGRCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiRkVUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVBREY5XHVCM0Q5IFx1QzcyMFx1QjdGRCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNCIsICJGRVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVBREY5XHVCM0Q5IFx1QzcyMFx1QjdGRCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiRkVUIn07CkBAIC0xNjUsNiArMTY1LDkgQEAKICAgICAgICAgU3RyaW5nIElDVFtdID0gbmV3IFN0cmluZ1tdIHsiXHVjNzc4XHViM2M0XHVjYzI4XHVjNzc0XHViMDk4IFx1YmMxOFx1YjNjNCBcdWMyZGNcdWFjMDQiLCAiSUNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjNzc4XHViM2M0XHVjYzI4XHVjNzc0XHViMDk4IFx1YmMxOFx1YjNjNCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiSUNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Qzc3OFx1QjNDNFx1Q0MyOFx1Qzc3NFx1QjA5OCBcdUJDMThcdUIzQzQgXHVENDVDXHVDOTAwXHVDMkRDIiwgIklDVCJ9OworICAgICAgICBTdHJpbmcgSVJLVFtdID0gIG5ldyBTdHJpbmdbXSB7Ilx1Yzc3NFx1Yjk3NFx1Y2ZlMFx1Y2UyMFx1ZDA2YyBcdWMyZGNcdWFjMDQiLCAiSVJLVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjNzc0XHViOTc0XHVjZmUwXHVjZTIwXHVkMDZjIFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJJUktTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDNzc0XHVCOTc0XHVDRkUwXHVDRTIwXHVEMDZDIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJJUktUIn07CiAgICAgICAgIFN0cmluZyBJUlRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Yzc3NFx1Yjc4MCBcdWQ0NWNcdWM5MDBcdWMyZGMiLCAiSVJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Yzc3NFx1Yjc4MCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiSVJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Qzc3NFx1Qjc4MCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiSVJUIn07CkBAIC0xNzcsMTEgKzE4MCwxNCBAQAogICAgICAgICBTdHJpbmcgSlNUW10gPSBuZXcgU3RyaW5nW10geyJcdWM3N2NcdWJjZjggXHVkNDVjXHVjOTAwXHVjMmRjIiwgIkpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Yzc3Y1x1YmNmOCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiSkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDNzdDXHVCQ0Y4IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJKVCJ9OworICAgICAgICBTdHJpbmcgS1JBVFtdID0gbmV3IFN0cmluZ1tdIHsiXHVkMDZjXHViNzdjXHVjMmE0XHViMTc4XHVjNTdjXHViOTc0XHVjMmE0XHVkMDZjIFx1YzJkY1x1YWMwNCIsICJLUkFUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ZDA2Y1x1Yjc3Y1x1YzJhNFx1YjE3OFx1YzU3Y1x1Yjk3NFx1YzJhNFx1ZDA2YyBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiS1JBU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVEMDZDXHVCNzdDXHVDMkE0XHVCMTc4XHVDNTdDXHVCOTc0XHVDMkE0XHVEMDZDIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJLUkFUIn07CiAgICAgICAgIFN0cmluZyBLU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ZDU1Y1x1YWQ2ZCBcdWQ0NWNcdWM5MDBcdWMyZGMiLCAiS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVkNTVjXHVhZDZkIFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJLRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUIzMDBcdUQ1NUNcdUJCRkNcdUFENkQgXHVENDVDXHVDOTAwXHVDMkRDIiwgIktUIn07CiAgICAgICAgIFN0cmluZyBMT1JEX0hPV0VbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Yjg1Y1x1YjRkYyBcdWQ1NThcdWM2YjAgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIkxIU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWI4NWNcdWI0ZGMgXHVkNTU4XHVjNmIwIFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJMSFNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHViODVjXHViNGRjIFx1ZDU1OFx1YzZiMCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiTEhEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Qjg1Q1x1QjREQ1x1RDU1OFx1QzZCMCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiTEhUIn07CiAgICAgICAgIFN0cmluZyBNSFRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YjljOFx1YzE1Y1x1YzgxY1x1YjNjNCBcdWMyZGNcdWFjMDQiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHViOWM4XHVjMTVjXHVjODFjXHViM2M0IFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJNSFNUIiwKQEAgLTIzMSwyMCArMjM3LDE1IEBACiAgICAgICAgIFN0cmluZyBTR1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YzJmMVx1YWMwMFx1ZDNlY1x1Yjk3NCBcdWMyZGNcdWFjMDQiLCAiU0dUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjMmYxXHVhYzAwXHVkM2VjXHViOTc0IFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJTR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDMkYxXHVBQzAwXHVEM0VDXHVCOTc0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJTR1QifTsKLSAgICAgICAgU3RyaW5nIFNMU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YWRmOFx1YjlhY1x1YjJjOFx1Y2U1OCBcdWQ0NWNcdWM5MDBcdWMyZGMiLCAiR01UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzJkY1x1YzVkMFx1Yjc3Y1x1YjlhY1x1YzYyOCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiU0xTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUMyRENcdUM1RDBcdUI3N0NcdUI5QUNcdUM2MjggXHVENDVDXHVDOTAwXHVDMkRDIiwgIlNMVCJ9OwotICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1QjNEOVx1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVEMERDXHVDOTg4XHVCQTU0XHVDNzc0XHVCMkM4XHVDNTQ0KSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QjNEOVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUQwRENcdUM5ODhcdUJBNTRcdUM3NzRcdUIyQzhcdUM1NDQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUQwRENcdUM5ODhcdUJBNTRcdUM3NzRcdUIyQzhcdUM1NDQpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBUQVNNQU5JQVtdID0gbmV3IFN0cmluZ1tdIHsiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUQwRENcdUM5ODhcdUJBNTRcdUM3NzRcdUIyQzhcdUM1NDQpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QjNEOVx1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUQwRENcdUM5ODhcdUJBNTRcdUM3NzRcdUIyQzhcdUM1NDQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QjNEOVx1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVEMERDXHVDOTg4XHVCQTU0XHVDNzc0XHVCMkM4XHVDNTQ0KSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFRNVFtdID0gbmV3IFN0cmluZ1tdIHsiXHVkMjJjXHViOTc0XHVkMDZjXHViYTU0XHViMmM4XHVjMmE0XHVkMGM0IFx1YzJkY1x1YWMwNCIsICJUTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWQyMmNcdWI5NzRcdWQwNmNcdWJhNTRcdWIyYzhcdWMyYTRcdWQwYzQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIlRNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUQyMkNcdUI5NzRcdUQwNkNcdUJBNTRcdUIyQzhcdUMyQTRcdUQwQzQgXHVENDVDXHVDOTAwXHVDMkRDIiwgIlRNVCJ9OwogICAgICAgICBTdHJpbmcgVUxBVFtdPSBuZXcgU3RyaW5nW10geyJcdWM2YjhcdWI3ODBcdWJjMTRcdWQwYzBcdWI5NzQgXHVjMmRjXHVhYzA0IiwgIlVMQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWM2YjhcdWI3ODBcdWJjMTRcdWQwYzBcdWI5NzQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIlVMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDNkI4XHVCNzgwXHVCQzE0XHVEMUEwXHVCOTc0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJVTEFUIn07Ci0gICAgICAgIFN0cmluZyBXQVJUW10gPSBuZXcgU3RyaW5nW10geyJcdWMxMWNcdWJkODAgXHVjNTQ0XHViOTc0XHVkNWU4XHVkMmYwXHViMDk4IFx1YzJkY1x1YWMwNCIsICJXQVJUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzExY1x1YmQ4MCBcdWM1NDRcdWI5NzRcdWQ1ZThcdWQyZjBcdWIwOTggXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIldBUlNUIn07CiAgICAgICAgIFN0cmluZyBXQVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YzExY1x1YmQ4MCBcdWM1NDRcdWQ1MDRcdWI5YWNcdWNlNzQgXHVjMmRjXHVhYzA0IiwgIldBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzExY1x1YmQ4MCBcdWM1NDRcdWQ1MDRcdWI5YWNcdWNlNzQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIldBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUMxMUNcdUJEODAgXHVDNTQ0XHVENTA0XHVCOUFDXHVDRTc0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJXQVQifTsKQEAgLTI1NCwyNyArMjU1LDMwIEBACiAgICAgICAgIFN0cmluZyBXSVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YzExY1x1Yzc3OFx1YjNjNFx1YjEyNFx1YzJkY1x1YzU0NCBcdWMyZGNcdWFjMDQiLCAiV0lCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjMTFjXHVjNzc4XHViM2M0XHViMTI0XHVjMmRjXHVjNTQ0IFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJXSVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDMTFDXHVCRDgwIFx1Qzc3OFx1QjNDNFx1QjEyNFx1QzJEQ1x1QzU0NCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiV0lCIn07Ci0gICAgICAgIFN0cmluZyBXU1RfQVVTW10gPSBuZXcgU3RyaW5nW10geyJcdUMxMUNcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QzYyNFx1QzJBNFx1RDJCOFx1QjgwOFx1Qzc3Q1x1QjlBQ1x1QzU0NCkiLCAiV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzExQ1x1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUM2MjRcdUMyQTRcdUQyQjhcdUI4MDhcdUM3N0NcdUI5QUNcdUM1NDQpIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUMxMUNcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QzYyNFx1QzJBNFx1RDJCOFx1QjgwOFx1Qzc3Q1x1QjlBQ1x1QzU0NCkiLCAiV1QifTsKKyAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1QzExQ1x1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0KSIsICJBV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzExQ1x1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUM2MjRcdUMyQTRcdUQyQjhcdUI4MDhcdUM3N0NcdUI5QUNcdUM1NDQpIiwgIkFXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDMTFDXHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUM2MjRcdUMyQTRcdUQyQjhcdUI4MDhcdUM3N0NcdUI5QUNcdUM1NDQpIiwgIkFXVCJ9OwogICAgICAgICBTdHJpbmcgU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YzBhY1x1YmFhOFx1YzU0NCBcdWQ0NWNcdWM5MDBcdWMyZGMiLCAiU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWMwYWNcdWJhYThcdWM1NDQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIlNEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDMEFDXHVCQUE4XHVDNTQ0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJTVCJ9OwotICAgICAgICBTdHJpbmcgV1NUX1NBTU9BW10gPSBuZXcgU3RyaW5nW10geyJcdWMxMWNcdWMwYWNcdWJhYThcdWM1NDQgXHVjMmRjXHVhYzA0IiwgIldTVCIsCisgICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1YzExY1x1YzBhY1x1YmFhOFx1YzU0NCBcdWMyZGNcdWFjMDQiLCAiV1NTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzExY1x1YzBhY1x1YmFhOFx1YzU0NCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiV1NEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzExQ1x1QzBBQ1x1QkFBOFx1QzU0NCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiV1NUIn07CiAgICAgICAgIFN0cmluZyBDaFNUW10gPSBuZXcgU3RyaW5nW10geyJcdWNjMjhcdWJhYThcdWI4NWMgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIkNoU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjYzI4XHViYWE4XHViODVjIFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJDaERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Q0MyOFx1QkFBOFx1Qjk3NCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiQ2hUIn07Ci0gICAgICAgIFN0cmluZyBWSUNUT1JJQVtdID0gbmV3IFN0cmluZ1tdIHsiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUJFNDVcdUQxQTBcdUI5QUNcdUM1NDQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1Qzc3Q1x1QUQxMSBcdUM4MDhcdUM1N0QgXHVDMkRDXHVBQzA0KFx1QkU0NVx1RDFBMFx1QjlBQ1x1QzU0NCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUIzRDlcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QkU0NVx1RDFBMFx1QjlBQ1x1QzU0NCkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJcdUIzRDlcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QkU0NVx1RDFBMFx1QjlBQ1x1QzU0NCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1Qzc3Q1x1QUQxMSBcdUM4MDhcdUM1N0QgXHVDMkRDXHVBQzA0KFx1QkU0NVx1RDFBMFx1QjlBQ1x1QzU0NCkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCM0Q5XHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUJFNDVcdUQxQTBcdUI5QUNcdUM1NDQpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVVRDW10gPSBuZXcgU3RyaW5nW10geyJcdWMxMzhcdWFjYzQgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzEzOFx1YWNjNCBcdWQ0NWNcdWM5MDBcdWMyZGMiLCAiVVRDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDOUMwXHVDNUVEIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJVVEMifTsKICAgICAgICAgU3RyaW5nIFVaVFtdID0gbmV3IFN0cmluZ1tdIHsiXHVjNmIwXHVjOTg4XHViY2EwXHVkMGE0XHVjMmE0XHVkMGM0IFx1YzJkY1x1YWMwNCIsICJVWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWM2YjBcdWM5ODhcdWJjYTBcdWQwYTRcdWMyYTRcdWQwYzQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIlVaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUM2QjBcdUM5ODhcdUJDQTBcdUQwQTRcdUMyQTRcdUQwQzQgXHVENDVDXHVDOTAwXHVDMkRDIiwgIlVaVCJ9OworICAgICAgICBTdHJpbmcgWEpUW10gPSBuZXcgU3RyaW5nW10geyJcdWM5MTFcdWFkNmQgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIlhKVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzkxMVx1YWQ2ZCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiWEpEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QUQ2RCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiWEpUIn07CiAKICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKICAgICAgICAgICAgIHsiQW1lcmljYS9Mb3NfQW5nZWxlcyIsIFBTVH0sCkBAIC0zMzYsNyArMzQwLDcgQEAKICAgICAgICAgICAgIHsiQWZyaWNhL0RqaWJvdXRpIiwgRUFUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0RvdWFsYSIsIFdBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9FbF9BYWl1biIsIFdFVH0sCi0gICAgICAgICAgICB7IkFmcmljYS9GcmVldG93biIsIFNMU1R9LAorICAgICAgICAgICAgeyJBZnJpY2EvRnJlZXRvd24iLCBHTVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvR2Fib3JvbmUiLCBDQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvSGFyYXJlIiwgQ0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0pvaGFubmVzYnVyZyIsIFNBU1R9LApAQCAtNDM3LDcgKzQ0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YzExY1x1YmQ4MCBcdWFkZjhcdWI5YjBcdWI3OWNcdWI0ZGMgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIldHU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUMxMUNcdUJEODAgXHVBREY4XHVCOUIwXHVCNzgwXHVCNERDIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJXR1QifX0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR29vc2VfQmF5IiwgQVNUfSwKLSAgICAgICAgICAgIHsiQW1lcmljYS9HcmFuZF9UdXJrIiwgRVNUfSwKKyAgICAgICAgICAgIHsiQW1lcmljYS9HcmFuZF9UdXJrIiwgQVNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9HcmVuYWRhIiwgQVNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9HdWFkZWxvdXBlIiwgQVNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9HdWF0ZW1hbGEiLCBDU1R9LApAQCAtNDg0LDkgKzQ4OCw3IEBACiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVuZG96YSIsIEFHVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVub21pbmVlIiwgQ1NUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZXJpZGEiLCBDU1R9LAotICAgICAgICAgICAgeyJBbWVyaWNhL01ldGxha2F0bGEiLCBuZXcgU3RyaW5nW10geyJcdUJBNTRcdUQyQjhcdUI3N0NcdUNFNzRcdUQyQjhcdUI3N0MgXHVENDVDXHVDOTAwXHVDMkRDIiwgIk1lU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUJBNTRcdUQyQjhcdUI3N0NcdUNFNzRcdUQyQjhcdUI3N0MgXHVDNzdDXHVBRDExIFx1QzgwOFx1QzU3RCBcdUMyRENcdUFDMDQiLCAiTWVEVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QkE1NFx1RDJCOFx1Qjc3Q1x1Q0U3NFx1RDJCOFx1Qjc3QyBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiTWVUIn19LAorICAgICAgICAgICAgeyJBbWVyaWNhL01ldGxha2F0bGEiLCBQU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01leGljb19DaXR5IiwgQ1NUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NaXF1ZWxvbiIsIG5ldyBTdHJpbmdbXSB7Ilx1ZDUzY1x1YzVkMFx1Yjk3NCBcdWJiZjhcdWQwNmNcdWI4NjAgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIlBNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVkNTNjXHVjNWQwXHViOTc0IFx1YmJmOFx1ZDA2Y1x1Yjg2MCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiUE1EVCIsCkBAIC02MDcsNiArNjA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWJlMGNcdWI4ZThcdWIwOThcdWM3NzQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIkJOU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QkUwQ1x1QjhFOFx1QjA5OFx1Qzc3NCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiQk5UIn19LAogICAgICAgICAgICAgeyJBc2lhL0NhbGN1dHRhIiwgSVNUfSwKKyAgICAgICAgICAgIHsiQXNpYS9DaGl0YSIsIElSS1R9LAogICAgICAgICAgICAgeyJBc2lhL0Nob2liYWxzYW4iLCBuZXcgU3RyaW5nW10geyJDaG9pYmFsc2FuIFx1YzJkY1x1YWMwNCIsICJDSE9UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hvaWJhbHNhbiBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiQ0hPU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUNEMDhcdUM3NzRcdUJDMUNcdUMwQjAgXHVENDVDXHVDOTAwXHVDMkRDIiwgIkNIT1QifX0sCkBAIC02MzEsOSArNjM0LDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9Ib3ZkIiwgbmV3IFN0cmluZ1tdIHsiSG92ZCBcdWMyZGNcdWFjMDQiLCAiSE9WVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvdmQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIkhPVlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVENjM4XHVCRTBDXHVCNERDIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJIT1ZUIn19LAotICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBuZXcgU3RyaW5nW10geyJcdWM3NzRcdWI5NzRcdWNmZTBcdWNlMjBcdWQwNmMgXHVjMmRjXHVhYzA0IiwgIklSS1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjNzc0XHViOTc0XHVjZmUwXHVjZTIwXHVkMDZjIFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJJUktTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUM3NzRcdUI5NzRcdUNGRTBcdUNFMjBcdUQwNkMgXHVENDVDXHVDOTAwXHVDMkRDIiwgIklSS1QifX0sCisgICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIElSS1R9LAogICAgICAgICAgICAgeyJBc2lhL0lzdGFuYnVsIiwgRUVUfSwKICAgICAgICAgICAgIHsiQXNpYS9KYWthcnRhIiwgV0lUfSwKICAgICAgICAgICAgIHsiQXNpYS9KYXlhcHVyYSIsIG5ldyBTdHJpbmdbXSB7Ilx1YjNkOVx1YmQ4MCBcdWM3NzhcdWIzYzRcdWIxMjRcdWMyZGNcdWM1NDQgXHVjMmRjXHVhYzA0IiwgIldJVCIsCkBAIC02NDYsMTYgKzY0NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVkMzk4XHVkMmI4XHViODVjXHVkMzBjXHViZTE0XHViODVjXHVkNTA0XHVjMmE0XHVkMDZjLVx1Y2U4NFx1Y2MyOFx1Y2UyMFx1ZDBhNCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiUEVUU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVEMzk4XHVEMkI4XHVCODVDXHVEMzBDXHVCRTBDXHVCODVDXHVENTA0XHVDMkE0XHVEMDZDLVx1Q0U4NFx1Q0MyOFx1Q0UyMFx1RDBBNCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiUEVUVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9LYXJhY2hpIiwgUEtUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRobWFuZHUiLCBOUFR9LAogICAgICAgICAgICAgeyJBc2lhL0thdG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LaGFuZHlnYSIsIG5ldyBTdHJpbmdbXSB7Ilx1RDU1Q1x1QjUxNFx1QUMwMCBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiWUFLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUQ1NUNcdUI1MTRcdUFDMDAgXHVDNzdDXHVBRDExIFx1QzgwOFx1QzU3RCBcdUMyRENcdUFDMDQiLCAiWUFLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVENTVDXHVCNTE0XHVBQzAwIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJZQUtUIn19LAogICAgICAgICAgICAgeyJBc2lhL0tvbGthdGEiLCBJU1R9LAotICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgbmV3IFN0cmluZ1tdIHsiXHVkMDZjXHViNzdjXHVjMmE0XHViMTc4XHVjNTdjXHViOTc0XHVjMmE0XHVkMDZjIFx1YzJkY1x1YWMwNCIsICJLUkFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ZDA2Y1x1Yjc3Y1x1YzJhNFx1YjE3OFx1YzU3Y1x1Yjk3NFx1YzJhNFx1ZDA2YyBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiS1JBU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVEMDZDXHVCNzdDXHVDMkE0XHVCMTc4XHVDNTdDXHVCOTc0XHVDMkE0XHVEMDZDIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJLUkFUIn19LAorICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VhbGFfTHVtcHVyIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWNoaW5nIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdXdhaXQiLCBBUkFTVH0sCkBAIC02NzAsNyArNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUQ1NDRcdUI5QUNcdUQ1NDAgXHVENDVDXHVDOTAwXHVDMkRDIiwgIlBIVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9NdXNjYXQiLCBHU1R9LAogICAgICAgICAgICAgeyJBc2lhL05pY29zaWEiLCBFRVR9LAotICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIE5PVlR9LAorICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIEtSQVR9LAogICAgICAgICAgICAgeyJBc2lhL05vdm9zaWJpcnNrIiwgTk9WVH0sCiAgICAgICAgICAgICB7IkFzaWEvT3JhbCIsIG5ldyBTdHJpbmdbXSB7Ik9yYWwgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIk9SQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmFsIFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJPUkFTVCIsCkBAIC02OTYsNiArNjk1LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9TYW1hcmthbmQiLCBVWlR9LAogICAgICAgICAgICAgeyJBc2lhL1Nlb3VsIiwgS1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9TaW5nYXBvcmUiLCBTR1R9LAorICAgICAgICAgICAgeyJBc2lhL1NyZWRuZWtvbHltc2siLCBuZXcgU3RyaW5nW10geyJTcmVkbmVrb2x5bXNrIFRpbWUiLCAiU1JFVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgRGF5bGlnaHQgVGltZSIsICJTUkVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIn19LAogICAgICAgICAgICAgeyJBc2lhL1RhaXBlaSIsIENUVH0sCiAgICAgICAgICAgICB7IkFzaWEvVGVsX0F2aXYiLCBJU1JBRUx9LAogICAgICAgICAgICAgeyJBc2lhL1Rhc2hrZW50IiwgVVpUfSwKQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgICAgICAgICAgeyJBc2lhL1VqdW5nX1BhbmRhbmciLCBDSVR9LAogICAgICAgICAgICAgeyJBc2lhL1VsYWFuYmFhdGFyIiwgVUxBVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhbl9CYXRvciIsIFVMQVR9LAotICAgICAgICAgICAgeyJBc2lhL1VydW1xaSIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9Vc3QtTmVyYSIsIG5ldyBTdHJpbmdbXSB7Ilx1QzZCMFx1QzJBNFx1RDJGMFx1QjEyNFx1Qjc3QyBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiVkxBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUM2QjBcdUMyQTRcdUQyRjBcdUIxMjRcdUI3N0MgXHVDNzdDXHVBRDExIFx1QzgwOFx1QzU3RCBcdUMyRENcdUFDMDQiLCAiVkxBU1QiICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzZCMFx1QzJBNFx1RDJGMFx1QjEyNFx1Qjc3QyBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiVkxBVCJ9fSwKQEAgLTc1MCw5ICs3NTIsOSBAQAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ2FuYmVycmEiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0N1cnJpZSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvRGFyd2luIiwgREFSV0lOfSwKLSAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiXHVDOTExXHVDNTU5IFx1QzExQ1x1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0KSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVDOTExXHVDNTU5IFx1QzExQ1x1QkQ4MCBcdUM3N0NcdUFEMTEgXHVDODA4XHVDNTdEIFx1QzJEQ1x1QUMwNChcdUM2MjRcdUMyQTRcdUQyQjhcdUI4MDhcdUM3N0NcdUI5QUNcdUM1NDQpIiwgIkNXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUM5MTFcdUM1NTkgXHVDMTFDXHVCRDgwIFx1RDQ1Q1x1QzkwMFx1QzJEQyhcdUM2MjRcdUMyQTRcdUQyQjhcdUI4MDhcdUM3N0NcdUI5QUNcdUM1NDQpIiwgIkNXVCJ9fSwKKyAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiXHVDOTExXHVDNTU5IFx1QzExQ1x1QkQ4MCBcdUQ0NUNcdUM5MDBcdUMyREMoXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0KSIsICJBQ1dTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QzU1OSBcdUMxMUNcdUJEODAgXHVDNzdDXHVBRDExIFx1QzgwOFx1QzU3RCBcdUMyRENcdUFDMDQoXHVDNjI0XHVDMkE0XHVEMkI4XHVCODA4XHVDNzdDXHVCOUFDXHVDNTQ0KSIsICJBQ1dEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzkxMVx1QzU1OSBcdUMxMUNcdUJEODAgXHVENDVDXHVDOTAwXHVDMkRDKFx1QzYyNFx1QzJBNFx1RDJCOFx1QjgwOFx1Qzc3Q1x1QjlBQ1x1QzU0NCkiLCAiQUNXVCJ9fSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0hvYmFydCIsIFRBU01BTklBfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0xISSIsIExPUkRfSE9XRX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9MaW5kZW1hbiIsIEJSSVNCQU5FfSwKQEAgLTgxOCw3ICs4MjAsNyBAQAogICAgICAgICAgICAgeyJFdXJvcGUvSXNsZV9vZl9NYW4iLCBHTVRCU1R9LAogICAgICAgICAgICAgeyJFdXJvcGUvSXN0YW5idWwiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvSmVyc2V5IiwgR01UQlNUfSwKLSAgICAgICAgICAgIHsiRXVyb3BlL0thbGluaW5ncmFkIiwgRkVUfSwKKyAgICAgICAgICAgIHsiRXVyb3BlL0thbGluaW5ncmFkIiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0tpZXYiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvTGlzYm9uIiwgV0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0xqdWJsamFuYSIsIENFVH0sCkBAIC04NTMsOSArODU1LDcgQEAKICAgICAgICAgICAgIHsiRXVyb3BlL1ZhdGljYW4iLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvVmllbm5hIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1ZpbG5pdXMiLCBFRVR9LAotICAgICAgICAgICAgeyJFdXJvcGUvVm9sZ29ncmFkIiwgbmV3IFN0cmluZ1tdIHsiXHViY2ZjXHVhY2UwXHVhZGY4XHViNzdjXHViNGRjIFx1YzJkY1x1YWMwNCIsICJWT0xUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YmNmY1x1YWNlMFx1YWRmOFx1Yjc3Y1x1YjRkYyBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiVk9MU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCQ0ZDXHVBQ0UwXHVBREY4XHVCNzdDXHVCNERDIFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJWT0xUIn19LAorICAgICAgICAgICAgeyJFdXJvcGUvVm9sZ29ncmFkIiwgTVNLfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1dhcnNhdyIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9aYWdyZWIiLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvWmFwb3Jvemh5ZSIsIEVFVH0sCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvbHQvQ3VycmVuY3lOYW1lc19sdF9MVC5wcm9wZXJ0aWVzIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2x0L0N1cnJlbmN5TmFtZXNfbHRfTFQucHJvcGVydGllcwppbmRleCBmNzI3NTIxLi5hMDg4NGZhIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvbHQvQ3VycmVuY3lOYW1lc19sdF9MVC5wcm9wZXJ0aWVzCisrKyBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9sdC9DdXJyZW5jeU5hbWVzX2x0X0xULnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjIAotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzUsNCArMzUsNSBAQAogIyBUaGlzIG5vdGljZSBhbmQgYXR0cmlidXRpb24gdG8gVGFsaWdlbnQgbWF5IG5vdCBiZSByZW1vdmVkLgogIyBUYWxpZ2VudCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRhbGlnZW50LCBJbmMuCiAKK0VVUj1cdTIwQUMKIExUTD1MdApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3B0L1RpbWVab25lTmFtZXNfcHRfQlIuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9wdC9UaW1lWm9uZU5hbWVzX3B0X0JSLmphdmEKaW5kZXggMjE4NTJhZC4uNjA2NjRjNSAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3B0L1RpbWVab25lTmFtZXNfcHRfQlIuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvcHQvVGltZVpvbmVOYW1lc19wdF9CUi5qYXZhCkBAIC00OCw5ICs0OCw5IEBACiAgICAgICAgIFN0cmluZyBBQ1RbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRvIEFjcmUiLCAiQUNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkbyBBY3JlIiwgIkFDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkbyBBY3JlIiwgIkFDVCJ9OwotICAgICAgICBTdHJpbmcgQURFTEFJREVbXSA9IG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpby1QYWRyXHUwMEUzbyBDZW50cmFsIChBdXN0clx1MDBFMWxpYSBkbyBTdWwpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBDZW50cmFsIChBdXN0clx1MDBFMWxpYSBkbyBTdWwpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIENlbnRyYWwgKEF1c3RyXHUwMEUxbGlhIGRvIFN1bCkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJIb3JcdTAwRTFyaW8tUGFkclx1MDBFM28gQ2VudHJhbCAoQXVzdHJcdTAwRTFsaWEgZG8gU3VsKSIsICJBQ1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIEhvclx1MDBFMXJpbyBkZSBWZXJcdTAwRTNvIENlbnRyYWwgKEF1c3RyXHUwMEUxbGlhIGRvIFN1bCkiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIENlbnRyYWwgKEF1c3RyXHUwMEUxbGlhIGRvIFN1bCkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBBR1RbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRhIEFyZ2VudGluYSIsICJBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTNvIGRhIEFyZ2VudGluYSIsICJBUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRhIEFyZ2VudGluYSIsICJBUlQifTsKQEAgLTcyLDEyICs3MiwxMiBAQAogICAgICAgICBTdHJpbmcgQkRUW10gPSBuZXcgU3RyaW5nW10geyJGdXNvIGhvclx1MDBlMXJpbyBkZSBCYW5nbGFkZXNoIiwgIkJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgQmFuZ2xhZGVzaCIsICJCRFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRlIEJhbmdsYWRlc2giLCAiQkRUIn07Ci0gICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiSG9yXHUwMEUxcmlvLVBhZHJcdTAwRTNvIGRvIExlc3RlIChRdWVlbnNsYW5kKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFZlclx1MDBFM28gT3JpZW50YWwgKFF1ZWVuc2xhbmQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRvIExlc3RlIChRdWVlbnNsYW5kKSIsICJFVCJ9OwotICAgICAgICBTdHJpbmcgQlJPS0VOX0hJTExbXSA9IG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpby1QYWRyXHUwMEUzbyBDZW50cmFsIChBdXN0clx1MDBFMWxpYSBkbyBTdWwvTm92YSBHYWxlcyBkbyBTdWwpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBDZW50cmFsIChBdXN0clx1MDBFMWxpYSBkbyBTdWwvTm92YSBHYWxlcyBkbyBTdWwpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIENlbnRyYWwgKEF1c3RyXHUwMEUxbGlhIGRvIFN1bC9Ob3ZhIEdhbGVzIGRvIFN1bCkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEJSSVNCQU5FW10gPSBuZXcgU3RyaW5nW10geyJIb3JcdTAwRTFyaW8tUGFkclx1MDBFM28gZG8gTGVzdGUgKFF1ZWVuc2xhbmQpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFZlclx1MDBFM28gT3JpZW50YWwgKFF1ZWVuc2xhbmQpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkbyBMZXN0ZSAoUXVlZW5zbGFuZCkiLCAiQUVUIn07CisgICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiSG9yXHUwMEUxcmlvLVBhZHJcdTAwRTNvIENlbnRyYWwgKEF1c3RyXHUwMEUxbGlhIGRvIFN1bC9Ob3ZhIEdhbGVzIGRvIFN1bCkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBDZW50cmFsIChBdXN0clx1MDBFMWxpYSBkbyBTdWwvTm92YSBHYWxlcyBkbyBTdWwpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBDZW50cmFsIChBdXN0clx1MDBFMWxpYSBkbyBTdWwvTm92YSBHYWxlcyBkbyBTdWwpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQlJUW10gPSBuZXcgU3RyaW5nW10geyJGdXNvIGhvclx1MDBlMXJpbyBkZSBCcmFzXHUwMGVkbGlhIiwgIkJSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgQnJhc1x1MDBlZGxpYSIsICJCUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRlIEJyYXNcdTAwRURsaWEiLCAiQlJUIn07CkBAIC0xMDgsOSArMTA4LDkgQEAKICAgICAgICAgU3RyaW5nIENVQkFbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIHBhZHJcdTAwZTNvIGRlIEN1YmEiLCAiQ1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBlMXJpbyBkZSBsdXogbmF0dXJhbCBkZSBDdWJhIiwgIkNEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgQ3ViYSIsICJDVCJ9OwotICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJIb3JcdTAwRTFyaW8tUGFkclx1MDBFM28gQ2VudHJhbCAoVGVycml0XHUwMEYzcmlvIGRvIE5vcnRlKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIEhvclx1MDBFMXJpbyBkZSBWZXJcdTAwRTNvIENlbnRyYWwgKFRlcnJpdFx1MDBGM3JpbyBkbyBOb3J0ZSkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIENlbnRyYWwgKFRlcnJpdFx1MDBGM3JpbyBkbyBOb3J0ZSkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIERBUldJTltdID0gbmV3IFN0cmluZ1tdIHsiSG9yXHUwMEUxcmlvLVBhZHJcdTAwRTNvIENlbnRyYWwgKFRlcnJpdFx1MDBGM3JpbyBkbyBOb3J0ZSkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFZlclx1MDBFM28gQ2VudHJhbCAoVGVycml0XHUwMEYzcmlvIGRvIE5vcnRlKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIENlbnRyYWwgKFRlcnJpdFx1MDBGM3JpbyBkbyBOb3J0ZSkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBEVUJMSU5bXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRvIG1lcmlkaWFubyBkZSBHcmVlbndpY2giLCAiR01UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkYSBJcmxhbmRhIiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkYSBSZXBcdTAwRkFibGljYSBkYSBJcmxhbmRhIiwgIklUIn07CkBAIC0xMjksOSArMTI5LDkgQEAKICAgICAgICAgU3RyaW5nIEVTVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gcGFkclx1MDBlM28gb3JpZW50YWwiLCAiRVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMGUxcmlvIGRlIGx1eiBuYXR1cmFsIG9yaWVudGFsIiwgIkVEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkbyBMZXN0ZSIsICJFVCJ9OwotICAgICAgICBTdHJpbmcgRVNUX05TV1tdID0gbmV3IFN0cmluZ1tdIHsiSG9yXHUwMEUxcmlvLVBhZHJcdTAwRTNvIE9yaWVudGFsIChOb3ZhIEdhbGVzIGRvIFN1bCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFZlclx1MDBFM28gT3JpZW50YWwgKE5vdmEgR2FsZXMgZG8gU3VsKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIE9yaWVudGFsIChOb3ZhIEdhbGVzIGRvIFN1bCkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIEVTVF9OU1dbXSA9IG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpby1QYWRyXHUwMEUzbyBPcmllbnRhbCAoTm92YSBHYWxlcyBkbyBTdWwpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBPcmllbnRhbCAoTm92YSBHYWxlcyBkbyBTdWwpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIE9yaWVudGFsIChOb3ZhIEdhbGVzIGRvIFN1bCkiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpbyBkbyBFeHRyZW1vIExlc3RlIEV1cm9wZXUgKEZFVCkiLCAiRkVUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBkbyBFeHRyZW1vIExlc3RlIEV1cm9wZXUiLCAiRkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkbyBFeHRyZW1vIExlc3RlIEV1cm9wZXUgKEZFVCkiLCAiRkVUIn07CkBAIC0xNjIsNiArMTYyLDkgQEAKICAgICAgICAgU3RyaW5nIElDVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGEgSW5kb2NoaW5hIiwgIklDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGEgSW5kb2NoaW5hIiwgIklDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGEgSW5kb2NoaW5hIiwgIklDVCJ9OworICAgICAgICBTdHJpbmcgSVJLVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGUgSXJrdXRzayIsICJJUktUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgSXJrdXRzayIsICJJUktTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgSXJrdXRzayIsICJJUktUIn07CiAgICAgICAgIFN0cmluZyBJUlRbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRvIElyXHUwMGUzIiwgIklSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwZTFyaW8gZGUgbHV6IG5hdHVyYWwgZG8gSXJcdTAwZTMiLCAiSVJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkbyBJclx1MDBFMyIsICJJUlQifTsKQEAgLTE3NCwxMSArMTc3LDE0IEBACiAgICAgICAgIFN0cmluZyBKU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIHBhZHJcdTAwZTNvIGRvIEphcFx1MDBlM28iLCAiSlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMGUxcmlvIGRlIGx1eiBuYXR1cmFsIGRvIEphcFx1MDBlM28iLCAiSkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRvIEphcFx1MDBFM28iLCAiSlQifTsKKyAgICAgICAgU3RyaW5nIEtSQVRbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIEtyYXNub3lhcnNrIiwgIktSQVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkZSBLcmFzbm95YXJzayIsICJLUkFTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgS3Jhc25veWFyc2siLCAiS1JBVCJ9OwogICAgICAgICBTdHJpbmcgS1NUW10gPSBuZXcgU3RyaW5nW10geyJGdXNvIGhvclx1MDBlMXJpbyBwYWRyXHUwMGUzbyBkYSBDb3JlaWEiLCAiS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMGUxcmlvIGRlIGx1eiBuYXR1cmFsIGRhIENvcmVpYSIsICJLRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGEgQ29yZWlhIiwgIktUIn07CiAgICAgICAgIFN0cmluZyBMT1JEX0hPV0VbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIHBhZHJcdTAwZTNvIGRlIExvcmQgSG93ZSIsICJMSFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkZSBMb3JkIEhvd2UiLCAiTEhTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgTG9yZCBIb3dlIiwgIkxIRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgTG9yZCBIb3dlIiwgIkxIVCJ9OwogICAgICAgICBTdHJpbmcgTUhUW10gPSBuZXcgU3RyaW5nW10geyJGdXNvIGhvclx1MDBlMXJpbyBkYXMgSWxoYXMgTWFyc2hhbGwiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkYXMgSWxoYXMgTWFyc2hhbGwiLCAiTUhTVCIsCkBAIC0yMjgsMTIgKzIzNCw5IEBACiAgICAgICAgIFN0cmluZyBTR1RbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIENpbmdhcHVyYSIsICJTR1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTEgZGUgQ2luZ2FwdXJhIiwgIlNHU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgQ2luZ2FwdXJhIiwgIlNHVCJ9OwotICAgICAgICBTdHJpbmcgU0xTVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZG8gbWVyaWRpYW5vIGRlIEdyZWVud2ljaCIsICJHTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkZSBTZXJyYSBMZW9hIiwgIlNMU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRlIFNlcnJhIExlb2EiLCAiU0xUIn07Ci0gICAgICAgIFN0cmluZyBUQVNNQU5JQVtdID0gbmV3IFN0cmluZ1tdIHsiSG9yXHUwMEUxcmlvLVBhZHJcdTAwRTNvIGRvIExlc3RlIChUYXNtXHUwMEUybmlhKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFZlclx1MDBFM28gT3JpZW50YWwgKFRhc21cdTAwRTJuaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRvIExlc3RlIChUYXNtXHUwMEUybmlhKSIsICJFVCJ9OworICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpby1QYWRyXHUwMEUzbyBkbyBMZXN0ZSAoVGFzbVx1MDBFMm5pYSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBPcmllbnRhbCAoVGFzbVx1MDBFMm5pYSkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRvIExlc3RlIChUYXNtXHUwMEUybmlhKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFRNVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZG8gVHVyY29tZW5pc3RcdTAwZTNvIiwgIlRNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZG8gVHVyY29tZW5pc3RcdTAwZTNvIiwgIlRNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZG8gVHVyY29tZW5pc3RcdTAwRTNvIiwgIlRNVCJ9OwpAQCAtMjUyLDI5ICsyNTUsMzAgQEAKICAgICAgICAgU3RyaW5nIFdJVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGEgSW5kb25cdTAwZTlzaWEgT2NpZGVudGFsIiwgIldJQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGEgSW5kb25cdTAwZTlzaWEgT2NpZGVudGFsIiwgIldJU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGEgSW5kb25cdTAwRTlzaWEgT2NpZGVudGFsIiwgIldJQiJ9OwotICAgICAgICBTdHJpbmcgV1NUX0FVU1tdID0gbmV3IFN0cmluZ1tdIHsiSG9yXHUwMEUxcmlvLVBhZHJcdTAwRTNvIE9jaWRlbnRhbCAoQXVzdHJcdTAwRTFsaWEpIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIEhvclx1MDBFMXJpbyBkZSBWZXJcdTAwRTNvIE9jaWRlbnRhbCAoQXVzdHJcdTAwRTFsaWEpIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gT2NpZGVudGFsIChBdXN0clx1MDBFMWxpYSkiLCAiV1QifTsKKyAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpby1QYWRyXHUwMEUzbyBPY2lkZW50YWwgKEF1c3RyXHUwMEUxbGlhKSIsICJBV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFZlclx1MDBFM28gT2NpZGVudGFsIChBdXN0clx1MDBFMWxpYSkiLCAiQVdEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gT2NpZGVudGFsIChBdXN0clx1MDBFMWxpYSkiLCAiQVdUIn07CiAgICAgICAgIFN0cmluZyBTQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gcGFkclx1MDBlM28gZGUgU2Ftb2EiLCAiU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwZTFyaW8gZGUgbHV6IG5hdHVyYWwgZGUgU2Ftb2EiLCAiU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGEgU2Ftb2EiLCAiU1QifTsKLSAgICAgICAgU3RyaW5nIFdTVF9TQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGUgU2Ftb2EgT2NpZGVudGFsIiwgIldTVCIsCisgICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIFNhbW9hIE9jaWRlbnRhbCIsICJXU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkZSBTYW1vYSBPY2lkZW50YWwiLCAiV1NEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFNhbW9hIE9jaWRlbnRhbCIsICJXU1QifTsKICAgICAgICAgU3RyaW5nIENoU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIHBhZHJcdTAwZTNvIGRlIENoYW1vcnJvIiwgIkNoU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMGUxcmlvIGRlIGx1eiBuYXR1cmFsIGRlIENoYW1vcnJvIiwgIkNoRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRlIENoYW1vcnJvIiwgIkNoVCJ9OwotICAgICAgICBTdHJpbmcgVklDVE9SSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpby1QYWRyXHUwMEUzbyBkbyBMZXN0ZSAoVmljdG9yaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBPcmllbnRhbCAoVmljdG9yaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRvIExlc3RlIChWaWN0b3JpYSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJIb3JcdTAwRTFyaW8tUGFkclx1MDBFM28gZG8gTGVzdGUgKFZpY3RvcmlhKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIEhvclx1MDBFMXJpbyBkZSBWZXJcdTAwRTNvIE9yaWVudGFsIChWaWN0b3JpYSkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRvIExlc3RlIChWaWN0b3JpYSkiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBVVENbXSA9IG5ldyBTdHJpbmdbXSB7IlRlbXBvIHVuaXZlcnNhbCBjb29yZGVuYWRvIiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbXBvIHVuaXZlcnNhbCBjb29yZGVuYWRvIiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBVbml2ZXJzYWwgQ29vcmRlbmFkbyIsICJVVEMifTsKICAgICAgICAgU3RyaW5nIFVaVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZG8gVXpiZXF1aXN0XHUwMGUzbyIsICJVWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTNvIGRvIFV6YmVxdWlzdFx1MDBlM28iLCAiVVpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkbyBVemJlcXVpc3RcdTAwRTNvIiwgIlVaVCJ9OwotICAgICAgICBTdHJpbmcgV0FSVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGEgQXJnZW50aW5hIE9jaWRlbnRhbCIsICJXQVJUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGEgQXJnZW50aW5hIE9jaWRlbnRhbCIsICJXQVJTVCJ9OworICAgICAgICBTdHJpbmcgWEpUW10gPSBuZXcgU3RyaW5nW10geyJGdXNvIGhvclx1MDBlMXJpbyBwYWRyXHUwMGUzbyBkYSBDaGluYSIsICJYSlQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwZTFyaW8gZGUgbHV6IG5hdHVyYWwgZGEgQ2hpbmEiLCAiWEpEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkYSBDaGluYSIsICJYSlQifTsKIAogICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW10gewogICAgICAgICAgICAgeyJBbWVyaWNhL0xvc19BbmdlbGVzIiwgUFNUfSwKQEAgLTMzNiw3ICszNDAsNyBAQAogICAgICAgICAgICAgeyJBZnJpY2EvRGppYm91dGkiLCBFQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRG91YWxhIiwgV0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0VsX0FhaXVuIiwgV0VUfSwKLSAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgU0xTVH0sCisgICAgICAgICAgICB7IkFmcmljYS9GcmVldG93biIsIEdNVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9HYWJvcm9uZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9IYXJhcmUiLCBDQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvSm9oYW5uZXNidXJnIiwgU0FTVH0sCkBAIC00MzcsNyArNDQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkYSBHcm9lbmxcdTAwZTJuZGlhIE9jaWRlbnRhbCIsICJXR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRhIEdyb2VubFx1MDBFMm5kaWEgT2NpZGVudGFsIiwgIldHVCJ9fSwKICAgICAgICAgICAgIHsiQW1lcmljYS9Hb29zZV9CYXkiLCBBU1R9LAotICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBFU1R9LAorICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dyZW5hZGEiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YWRlbG91cGUiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YXRlbWFsYSIsIENTVH0sCkBAIC00ODQsOSArNDg4LDcgQEAKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5kb3phIiwgQUdUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5vbWluZWUiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lcmlkYSIsIENTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpbyBQYWRyXHUwMEUzbyBkZSBNZXRsYWthdGxhIiwgIk1lU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgTHV6IE5hdHVyYWwgZGUgTWV0bGFrYXRsYSIsICJNZURUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRlIE1ldGxha2F0bGEiLCAiTWVUIn19LAorICAgICAgICAgICAgeyJBbWVyaWNhL01ldGxha2F0bGEiLCBQU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01leGljb19DaXR5IiwgQ1NUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NaXF1ZWxvbiIsIG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIHBhZHJcdTAwZTNvIGRlIFNcdTAwZTNvIFBlZHJvIGUgTWlxdWVsb24iLCAiUE1TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwZTFyaW8gZGUgbHV6IG5hdHVyYWwgZGUgU1x1MDBlM28gUGVkcm8gZSBNaXF1ZWxvbiIsICJQTURUIiwKQEAgLTYwNyw2ICs2MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgQnJ1bmVpIiwgIkJOU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkZSBCcnVuZWkiLCAiQk5UIn19LAogICAgICAgICAgICAgeyJBc2lhL0NhbGN1dHRhIiwgSVNUfSwKKyAgICAgICAgICAgIHsiQXNpYS9DaGl0YSIsIElSS1R9LAogICAgICAgICAgICAgeyJBc2lhL0Nob2liYWxzYW4iLCBuZXcgU3RyaW5nW10geyJGdXNvIGhvclx1MDBlMXJpbyBkZSBDaG9pYmFsc2FuIiwgIkNIT1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTNvIGRlIENob2liYWxzYW4iLCAiQ0hPU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgQ2hvaWJhbHNhbiIsICJDSE9UIn19LApAQCAtNjMxLDkgKzYzNCw3IEBACiAgICAgICAgICAgICB7IkFzaWEvSG92ZCIsIG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIEhvdmQiLCAiSE9WVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgSG92ZCIsICJIT1ZTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkZSBIb3ZkIiwgIkhPVlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIElya3V0c2siLCAiSVJLVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgSXJrdXRzayIsICJJUktTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkZSBJcmt1dHNrIiwgIklSS1QifX0sCisgICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIElSS1R9LAogICAgICAgICAgICAgeyJBc2lhL0lzdGFuYnVsIiwgRUVUfSwKICAgICAgICAgICAgIHsiQXNpYS9KYWthcnRhIiwgV0lUfSwKICAgICAgICAgICAgIHsiQXNpYS9KYXlhcHVyYSIsIG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRhIEluZG9uXHUwMGU5c2lhIE9yaWVudGFsIiwgIldJVCIsCkBAIC02NDYsMTYgKzY0NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIiwgIlBFVFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIiwgIlBFVFQifX0sCiAgICAgICAgICAgICB7IkFzaWEvS2FyYWNoaSIsIFBLVH0sCi0gICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvS2FzaGdhciIsIFhKVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2F0aG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRtYW5kdSIsIE5QVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2hhbmR5Z2EiLCBuZXcgU3RyaW5nW10geyJIb3JcdTAwRTFyaW8gZGUgS2hhbmR5Z2EiLCAiWUFLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgVmVyXHUwMEUzbyBkZSBLaGFuZHlnYSIsICJZQUtTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgS2hhbmR5Z2EiLCAiWUFLVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9Lb2xrYXRhIiwgSVNUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIEtyYXNub3lhcnNrIiwgIktSQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkZSBLcmFzbm95YXJzayIsICJLUkFTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgS3Jhc25veWFyc2siLCAiS1JBVCJ9fSwKKyAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIEtSQVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1YWxhX0x1bXB1ciIsIE1ZVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VjaGluZyIsIE1ZVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3V3YWl0IiwgQVJBU1R9LApAQCAtNjcwLDcgKzY2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRhcyBGaWxpcGluYXMiLCAiUEhUIn19LAogICAgICAgICAgICAgeyJBc2lhL011c2NhdCIsIEdTVH0sCiAgICAgICAgICAgICB7IkFzaWEvTmljb3NpYSIsIEVFVH0sCi0gICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgTk9WVH0sCisgICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvTm92b3NpYmlyc2siLCBOT1ZUfSwKICAgICAgICAgICAgIHsiQXNpYS9PcmFsIiwgbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGUgVXJhbHNrIiwgIk9SQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTNvIGRlIFVyYWxzayIsICJPUkFTVCIsCkBAIC02OTYsNiArNjk1LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9TYW1hcmthbmQiLCBVWlR9LAogICAgICAgICAgICAgeyJBc2lhL1Nlb3VsIiwgS1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9TaW5nYXBvcmUiLCBTR1R9LAorICAgICAgICAgICAgeyJBc2lhL1NyZWRuZWtvbHltc2siLCBuZXcgU3RyaW5nW10geyJTcmVkbmVrb2x5bXNrIFRpbWUiLCAiU1JFVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgRGF5bGlnaHQgVGltZSIsICJTUkVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIn19LAogICAgICAgICAgICAgeyJBc2lhL1RhaXBlaSIsIENUVH0sCiAgICAgICAgICAgICB7IkFzaWEvVGVsX0F2aXYiLCBJU1JBRUx9LAogICAgICAgICAgICAgeyJBc2lhL1Rhc2hrZW50IiwgVVpUfSwKQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgICAgICAgICAgeyJBc2lhL1VqdW5nX1BhbmRhbmciLCBDSVR9LAogICAgICAgICAgICAgeyJBc2lhL1VsYWFuYmFhdGFyIiwgVUxBVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhbl9CYXRvciIsIFVMQVR9LAotICAgICAgICAgICAgeyJBc2lhL1VydW1xaSIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9Vc3QtTmVyYSIsIG5ldyBTdHJpbmdbXSB7Ikhvclx1MDBFMXJpbyBkZSBVc3QtTmVyYSIsICJWTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkZSBWZXJcdTAwRTNvIGRlIFVzdC1OZXJhIiwgIlZMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkZSBVc3QtTmVyYSIsICJWTEFUIn19LApAQCAtNzUwLDkgKzc1Miw5IEBACiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9DYW5iZXJyYSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ3VycmllIiwgRVNUX05TV30sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9EYXJ3aW4iLCBEQVJXSU59LAotICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJGdXNvIEhvclx1MDBFMXJpbyBPY2lkZW50YWwgQ2VudHJhbCAoQXVzdHJcdTAwRTFsaWEpIiwgIkNXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIEhvclx1MDBFMXJpbyBkZSBWZXJcdTAwRTNvIE9jaWRlbnRhbCBDZW50cmFsIChBdXN0clx1MDBFMWxpYSkiLCAiQ1dTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBPY2lkZW50YWwgQ2VudHJhbCAoQXVzdHJcdTAwRTFsaWEpIiwgIkNXVCJ9fSwKKyAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiRnVzbyBIb3JcdTAwRTFyaW8gT2NpZGVudGFsIENlbnRyYWwgKEF1c3RyXHUwMEUxbGlhKSIsICJBQ1dTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gSG9yXHUwMEUxcmlvIGRlIFZlclx1MDBFM28gT2NpZGVudGFsIENlbnRyYWwgKEF1c3RyXHUwMEUxbGlhKSIsICJBQ1dEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBPY2lkZW50YWwgQ2VudHJhbCAoQXVzdHJcdTAwRTFsaWEpIiwgIkFDV1QifX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9Ib2JhcnQiLCBUQVNNQU5JQX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9MSEkiLCBMT1JEX0hPV0V9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTGluZGVtYW4iLCBCUklTQkFORX0sCkBAIC04MTgsNyArODIwLDcgQEAKICAgICAgICAgICAgIHsiRXVyb3BlL0lzbGVfb2ZfTWFuIiwgR01UQlNUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0lzdGFuYnVsIiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0plcnNleSIsIEdNVEJTVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEZFVH0sCisgICAgICAgICAgICB7IkV1cm9wZS9LYWxpbmluZ3JhZCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9LaWV2IiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0xpc2JvbiIsIFdFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9ManVibGphbmEiLCBDRVR9LApAQCAtODUzLDkgKzg1NSw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9WYXRpY2FuIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1ZpZW5uYSIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWxuaXVzIiwgRUVUfSwKLSAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIFZvbGdvZ3JhZG8iLCAiVk9MVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTNvIGRlIFZvbGdvZ3JhZG8iLCAiVk9MU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMEUxcmlvIGRlIFZvbGdvZ3JhZG8iLCAiVk9MVCJ9fSwKKyAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIE1TS30sCiAgICAgICAgICAgICB7IkV1cm9wZS9XYXJzYXciLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvWmFncmViIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phcG9yb3poeWUiLCBFRVR9LApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3N2L1RpbWVab25lTmFtZXNfc3YuamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9zdi9UaW1lWm9uZU5hbWVzX3N2LmphdmEKaW5kZXggZGQ1MDllMS4uYWIyOGUwMCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3N2L1RpbWVab25lTmFtZXNfc3YuamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvc3YvVGltZVpvbmVOYW1lc19zdi5qYXZhCkBAIC00OCw5ICs0OCw5IEBACiAgICAgICAgIFN0cmluZyBBQ1RbXSA9IG5ldyBTdHJpbmdbXSB7IkFjcmUsIG5vcm1hbHRpZCIsICJBQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3JlLCBzb21tYXJ0aWQiLCAiQUNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjcmUsIG5vcm1hbHRpZCIsICJBQ1QifTsKLSAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJDZW50cmFsIHN0YW5kYXJkdGlkIChTeWRhdXN0cmFsaWVuKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgc29tbWFydGlkIChTb3V0aCBBdXN0cmFsaWEpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCB0aWQgKFN5ZGF1c3RyYWxpZW4pIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiQ2VudHJhbCBzdGFuZGFyZHRpZCAoU3lkYXVzdHJhbGllbikiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCBzb21tYXJ0aWQgKFNvdXRoIEF1c3RyYWxpYSkiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCB0aWQgKFN5ZGF1c3RyYWxpZW4pIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgQUdUW10gPSBuZXcgU3RyaW5nW10geyJBcmdlbnRpbmEsIG5vcm1hbHRpZCIsICJBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmdlbnRpbmEsIHNvbW1hcnRpZCIsICJBUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJnZW50aW5zayB0aWQiLCAiQVJUIn07CkBAIC03MiwxMiArNzIsMTIgQEAKICAgICAgICAgU3RyaW5nIEJEVFtdID0gbmV3IFN0cmluZ1tdIHsiQmFuZ2xhZGVzaCwgbm9ybWFsdGlkIiwgIkJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhbmdsYWRlc2gsIHNvbW1hcnRpZCIsICJCRFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFuZ2xhZGVzaGlzayB0aWQiLCAiQkRUIn07Ci0gICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiXHUwMEQ2c3RsaWcgc3RhbmRhcmR0aWQgKFF1ZWVuc2xhbmQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWcgc29tbWFydGlkIChRdWVlbnNsYW5kKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGlnIHRpZCAoUXVlZW5zbGFuZCkiLCAiRVQifTsKLSAgICAgICAgU3RyaW5nIEJST0tFTl9ISUxMW10gPSBuZXcgU3RyaW5nW10geyJDZW50cmFsIHN0YW5kYXJkdGlkIChTeWRhdXN0cmFsaWVuL05ldyBTb3V0aCBXYWxlcykiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmFsIHNvbW1hcnRpZCAoU291dGggQXVzdHJhbGlhL05ldyBTb3V0aCBXYWxlcykiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmFsIHRpZCAoU3lkYXVzdHJhbGllbi9OZXcgU291dGggV2FsZXMpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiXHUwMEQ2c3RsaWcgc3RhbmRhcmR0aWQgKFF1ZWVuc2xhbmQpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGlnIHNvbW1hcnRpZCAoUXVlZW5zbGFuZCkiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWcgdGlkIChRdWVlbnNsYW5kKSIsICJBRVQifTsKKyAgICAgICAgU3RyaW5nIEJST0tFTl9ISUxMW10gPSBuZXcgU3RyaW5nW10geyJDZW50cmFsIHN0YW5kYXJkdGlkIChTeWRhdXN0cmFsaWVuL05ldyBTb3V0aCBXYWxlcykiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCBzb21tYXJ0aWQgKFNvdXRoIEF1c3RyYWxpYS9OZXcgU291dGggV2FsZXMpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgdGlkIChTeWRhdXN0cmFsaWVuL05ldyBTb3V0aCBXYWxlcykiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBCUlRbXSA9IG5ldyBTdHJpbmdbXSB7IkJyYXNpbGllbiwgbm9ybWFsdGlkIiwgIkJSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJyYXNpbGllbiwgc29tbWFydGlkIiwgIkJSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmFzaWxpYW5zayB0aWQiLCAiQlJUIn07CkBAIC0xMTEsOSArMTExLDkgQEAKICAgICAgICAgU3RyaW5nIENVQkFbXSA9IG5ldyBTdHJpbmdbXSB7Ikt1YmEsIG5vcm1hbHRpZCIsICJDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS3ViYSwgc29tbWFydGlkIiwgIkNEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLdWJhbnNrIHRpZCIsICJDVCJ9OwotICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJDZW50cmFsIHN0YW5kYXJkdGlkIChOb3JkdGVycml0b3JpZXQpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgc29tbWFydGlkIChOb3JkdGVycml0b3JpZXQpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgdGlkIChOb3JkdGVycml0b3JpZXQpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBEQVJXSU5bXSA9IG5ldyBTdHJpbmdbXSB7IkNlbnRyYWwgc3RhbmRhcmR0aWQgKE5vcmR0ZXJyaXRvcmlldCkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgc29tbWFydGlkIChOb3JkdGVycml0b3JpZXQpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmFsIHRpZCAoTm9yZHRlcnJpdG9yaWV0KSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIERVQkxJTltdID0gbmV3IFN0cmluZ1tdIHsiR3JlZW53aWNodGlkIiwgIkdNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklybGFuZCwgc29tbWFydGlkIiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklybFx1MDBFNG5kc2sgdGlkIiwgIklUIn07CkBAIC0xMzIsOSArMTMyLDkgQEAKICAgICAgICAgU3RyaW5nIEVTVFtdID0gbmV3IFN0cmluZ1tdIHsiRWFzdGVybiwgbm9ybWFsdGlkIiwgIkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVhc3Rlcm4sIHNvbW1hcnRpZCIsICJFRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpZyB0aWQiLCAiRVQifTsKLSAgICAgICAgU3RyaW5nIEVTVF9OU1dbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MDBENnN0bGlnIHN0YW5kYXJkdGlkIChOZXcgU291dGggV2FsZXMpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpZyBzb21tYXJ0aWQgKE5ldyBTb3V0aCBXYWxlcykiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGlnIHRpZCAoTmV3IFNvdXRoIFdhbGVzKSIsICJFVCJ9OworICAgICAgICBTdHJpbmcgRVNUX05TV1tdID0gbmV3IFN0cmluZ1tdIHsiXHUwMEQ2c3RsaWcgc3RhbmRhcmR0aWQgKE5ldyBTb3V0aCBXYWxlcykiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpZyBzb21tYXJ0aWQgKE5ldyBTb3V0aCBXYWxlcykiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpZyB0aWQgKE5ldyBTb3V0aCBXYWxlcykiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7IkthbGluaW5ncmFkdGlkIiwgIkZFVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0ZXVyb3BlaXNrIHNvbW1hcnRpZCIsICJGRVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FsaW5pbmdyYWR0aWQiLCAiRkVUIn07CkBAIC0xNjUsNiArMTY1LDkgQEAKICAgICAgICAgU3RyaW5nIElDVFtdID0gbmV3IFN0cmluZ1tdIHsiSW5kb2tpbmVzaXNrIHRpZCIsICJJQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRva2luZXNpc2sgc29tbWFydGlkIiwgIklDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRva2luZXNpc2sgdGlkIiwgIklDVCJ9OworICAgICAgICBTdHJpbmcgSVJLVFtdID0gbmV3IFN0cmluZ1tdIHsiSXJrdXRzaywgbm9ybWFsdGlkIiwgIklSS1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXJrdXRzaywgc29tbWFydGlkIiwgIklSS1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklya3V0c2stdGlkIiwgIklSS1QifTsKICAgICAgICAgU3RyaW5nIElSVFtdID0gbmV3IFN0cmluZ1tdIHsiSXJhbiwgbm9ybWFsdGlkIiwgIklSU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmFuLCBzb21tYXJ0aWQiLCAiSVJEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklyYW5zayB0aWQiLCAiSVJUIn07CkBAIC0xNzcsMTEgKzE4MCwxNCBAQAogICAgICAgICBTdHJpbmcgSlNUW10gPSBuZXcgU3RyaW5nW10geyJKYXBhbiwgbm9ybWFsdGlkIiwgIkpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcGFuLCBzb21tYXJ0aWQiLCAiSkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmFwYW5zayB0aWQiLCAiSlQifTsKKyAgICAgICAgU3RyaW5nIEtSQVRbXSA9IG5ldyBTdHJpbmdbXSB7IktyYXNub2phcnNrLCBub3JtYWx0aWQiLCAiS1JBVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLcmFzbm9qYXJzaywgc29tbWFydGlkIiwgIktSQVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktyYXNub2phcnNrLXRpZCIsICJLUkFUIn07CiAgICAgICAgIFN0cmluZyBLU1RbXSA9IG5ldyBTdHJpbmdbXSB7IktvcmVhLCBub3JtYWx0aWQiLCAiS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS29yZWEsIHNvbW1hcnRpZCIsICJLRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLb3JlYW5zayB0aWQiLCAiS1QifTsKICAgICAgICAgU3RyaW5nIExPUkRfSE9XRVtdID0gbmV3IFN0cmluZ1tdIHsiTG9yZCBIb3dlLCBub3JtYWx0aWQiLCAiTEhTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvcmQgSG93ZSwgc29tbWFydGlkIiwgIkxIU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3JkIEhvd2UsIHNvbW1hcnRpZCIsICJMSERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9yZCBIb3dlLXRpZCIsICJMSFQifTsKICAgICAgICAgU3RyaW5nIE1IVFtdID0gbmV3IFN0cmluZ1tdIHsiTWFyc2hhbGxcdTAwZjZhcm5hLCBub3JtYWx0aWQiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFyc2hhbGxcdTAwZjZhcm5hLCBzb21tYXJ0aWQiLCAiTUhTVCIsCkBAIC0yMzEsMjAgKzIzNywxNSBAQAogICAgICAgICBTdHJpbmcgU0dUW10gPSBuZXcgU3RyaW5nW10geyJTaW5nYXBvcmUsIG5vcm1hbHRpZCIsICJTR1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW5nYXBvcmUsIHNvbW1hcnRpZCIsICJTR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2luZ2Fwb3JlLXRpZCIsICJTR1QifTsKLSAgICAgICAgU3RyaW5nIFNMU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkdyZWVud2ljaHRpZCIsICJHTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2llcnJhIExlb25lLCBzb21tYXJ0aWQiLCAiU0xTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaWVycmEgTGVvbmUtdGlkIiwgIlNMVCJ9OwotICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MDBENnN0bGlnIHN0YW5kYXJkdGlkIChUYXNtYW5pYSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpZyBzb21tYXJ0aWQgKFRhc21hbmllbikiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwRDZzdGxpZyB0aWQgKFRhc21hbmlhKSIsICJFVCJ9OworICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MDBENnN0bGlnIHN0YW5kYXJkdGlkIChUYXNtYW5pYSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWcgc29tbWFydGlkIChUYXNtYW5pZW4pIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGlnIHRpZCAoVGFzbWFuaWEpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVE1UW10gPSBuZXcgU3RyaW5nW10geyJUdXJrbWVuaXN0YW4sIG5vcm1hbHRpZCIsICJUTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdXJrbWVuaXN0YW4sIHNvbW1hcnRpZCIsICJUTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHVya21lbnNrIHRpZCIsICJUTVQifTsKICAgICAgICAgU3RyaW5nIFVMQVRbXT0gbmV3IFN0cmluZ1tdIHsiVWxhYW5iYWF0YXIsIG5vcm1hbHRpZCIsICJVTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVWxhYW5iYWF0YXIsIHNvbW1hcnRpZCIsICJVTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVsYWFuYmFhdGFyLXRpZCIsICJVTEFUIn07Ci0gICAgICAgIFN0cmluZyBXQVJUW10gPSBuZXcgU3RyaW5nW10geyJWXHUwMGU0c3RhcmdlbnRpbmEsIG5vcm1hbHRpZCIsICJXQVJUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZcdTAwZTRzdGFyZ2VudGluYSwgc29tbWFydGlkIiwgIldBUlNUIn07CiAgICAgICAgIFN0cmluZyBXQVRbXSA9IG5ldyBTdHJpbmdbXSB7IlZcdTAwZTRzdGFmcmlrYW5zayB0aWQiLCAiV0FUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlx1MDBlNHN0YWZyaWthbnNrIHNvbW1hcnRpZCIsICJXQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlx1MDBFNHN0YWZyaWthbnNrIHRpZCIsICJXQVQifTsKQEAgLTI1NCwyNyArMjU1LDMwIEBACiAgICAgICAgIFN0cmluZyBXSVRbXSA9IG5ldyBTdHJpbmdbXSB7IlZcdTAwZTRzdGluZG9uZXNpc2sgdGlkIiwgIldJQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZcdTAwZTRzdGluZG9uZXNpc2sgc29tbWFydGlkIiwgIldJU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWXHUwMEU0c3RpbmRvbmVzaXNrIHRpZCIsICJXSUIifTsKLSAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ildlc3Rlcm4gU3RhbmRhcmQgVGltZSAoQXVzdHJhbGllbikiLCAiV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZcdTAwRTRzdGxpZyBzb21tYXJ0aWQgKEF1c3RyYWxpZW4pIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWXHUwMEU0c3RsaWcgdGlkIChBdXN0cmFsaWVuKSIsICJXVCJ9OworICAgICAgICBTdHJpbmcgV1NUX0FVU1tdID0gbmV3IFN0cmluZ1tdIHsiV2VzdGVybiBTdGFuZGFyZCBUaW1lIChBdXN0cmFsaWVuKSIsICJBV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZcdTAwRTRzdGxpZyBzb21tYXJ0aWQgKEF1c3RyYWxpZW4pIiwgIkFXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlx1MDBFNHN0bGlnIHRpZCAoQXVzdHJhbGllbikiLCAiQVdUIn07CiAgICAgICAgIFN0cmluZyBTQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiU2Ftb2EsIG5vcm1hbHRpZCIsICJTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbW9hLCBzb21tYXJ0aWQiLCAiU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1vYW5zayB0aWQiLCAiU1QifTsKLSAgICAgICAgU3RyaW5nIFdTVF9TQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiVlx1MDBlNHN0c2Ftb2Fuc2sgdGlkIiwgIldTVCIsCisgICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7IlZcdTAwZTRzdHNhbW9hbnNrIHRpZCIsICJXU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlx1MDBlNHN0c2Ftb2Fuc2sgc29tbWFydGlkIiwgIldTRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWXHUwMEU0c3RzYW1vYW5zayB0aWQiLCAiV1NUIn07CiAgICAgICAgIFN0cmluZyBDaFNUW10gPSBuZXcgU3RyaW5nW10geyJDaGFtb3Jybywgbm9ybWFsdGlkIiwgIkNoU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbW9ycm8sIHNvbW1hcnRpZCIsICJDaERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW1vcnJvcyB0aWQiLCAiQ2hUIn07Ci0gICAgICAgIFN0cmluZyBWSUNUT1JJQVtdID0gbmV3IFN0cmluZ1tdIHsiXHUwMEQ2c3RsaWcgc3RhbmRhcmR0aWQgKFZpY3RvcmlhKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGlnIHNvbW1hcnRpZCAoVmljdG9yaWEpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUwMEQ2c3RsaWcgdGlkIChWaWN0b3JpYSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJcdTAwRDZzdGxpZyBzdGFuZGFyZHRpZCAoVmljdG9yaWEpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGlnIHNvbW1hcnRpZCAoVmljdG9yaWEpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDBENnN0bGlnIHRpZCAoVmljdG9yaWEpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVVRDW10gPSBuZXcgU3RyaW5nW10geyJLb29yZGluZXJhZCB1bml2ZXJzZWxsIHRpZCIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLb29yZGluZXJhZCB1bml2ZXJzZWxsIHRpZCIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEMgKGtvb3JkaW5lcmFkIHZcdTAwRTRybGRzdGlkKSIsICJVVEMifTsKICAgICAgICAgU3RyaW5nIFVaVFtdID0gbmV3IFN0cmluZ1tdIHsiVXpiZWtpc3Rhbiwgbm9ybWFsdGlkIiwgIlVaVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlV6YmVraXN0YW4sIHNvbW1hcnRpZCIsICJVWlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXpiZWtpc2sgdGlkIiwgIlVaVCJ9OworICAgICAgICBTdHJpbmcgWEpUW10gPSBuZXcgU3RyaW5nW10geyJLaW5hLCBub3JtYWx0aWQiLCAiWEpUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2luYSwgc29tbWFydGlkIiwgIlhKRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLaW5lc2lzayB0aWQiLCAiWEpUIn07CiAKICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKICAgICAgICAgICAgIHsiQW1lcmljYS9Mb3NfQW5nZWxlcyIsIFBTVH0sCkBAIC0zMzYsNyArMzQwLDcgQEAKICAgICAgICAgICAgIHsiQWZyaWNhL0RqaWJvdXRpIiwgRUFUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0RvdWFsYSIsIFdBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9FbF9BYWl1biIsIFdFVH0sCi0gICAgICAgICAgICB7IkFmcmljYS9GcmVldG93biIsIFNMU1R9LAorICAgICAgICAgICAgeyJBZnJpY2EvRnJlZXRvd24iLCBHTVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvR2Fib3JvbmUiLCBDQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvSGFyYXJlIiwgQ0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0pvaGFubmVzYnVyZyIsIFNBU1R9LApAQCAtNDM3LDcgKzQ0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZcdTAwZTRzdHJhIEdyXHUwMGY2bmxhbmQsIHNvbW1hcnRpZCIsICJXR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlx1MDBFNHN0Z3JcdTAwRjZubFx1MDBFNG5kc2sgdGlkIiwgIldHVCJ9fSwKICAgICAgICAgICAgIHsiQW1lcmljYS9Hb29zZV9CYXkiLCBBU1R9LAotICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBFU1R9LAorICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dyZW5hZGEiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YWRlbG91cGUiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YXRlbWFsYSIsIENTVH0sCkBAIC00ODQsOSArNDg4LDcgQEAKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5kb3phIiwgQUdUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5vbWluZWUiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lcmlkYSIsIENTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIG5ldyBTdHJpbmdbXSB7Ik1ldGxha2F0bGEsIG5vcm1hbHRpZCIsICJNZVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0bGFrYXRsYSwgc29tbWFydGlkIiwgIk1lRFQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRsYWthdGxhLXRpZCIsICJNZVQifX0sCisgICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIFBTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWV4aWNvX0NpdHkiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01pcXVlbG9uIiwgbmV3IFN0cmluZ1tdIHsiU2FpbnQtUGllcnJlLWV0LU1pcXVlbG9uLCBub3JtYWx0aWQiLCAiUE1TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYWludC1QaWVycmUtZXQtTWlxdWVsb24sIHNvbW1hcnRpZCIsICJQTURUIiwKQEAgLTYxMiw2ICs2MTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaG9pYmFsc2FuLXRpZCIsICJDSE9UIn19LAogICAgICAgICAgICAgeyJBc2lhL0Nob25ncWluZyIsIENUVH0sCiAgICAgICAgICAgICB7IkFzaWEvQ2h1bmdraW5nIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9DaGl0YSIsIElSS1R9LAogICAgICAgICAgICAgeyJBc2lhL0NvbG9tYm8iLCBJU1R9LAogICAgICAgICAgICAgeyJBc2lhL0RhY2NhIiwgQkRUfSwKICAgICAgICAgICAgIHsiQXNpYS9EaGFrYSIsIEJEVH0sCkBAIC02MzEsOSArNjM0LDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9Ib3ZkIiwgbmV3IFN0cmluZ1tdIHsiSG92ZCwgbm9ybWFsdGlkIiwgIkhPVlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3ZkLCBzb21tYXJ0aWQiLCAiSE9WU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3ZkLXRpZCIsICJIT1ZUIn19LAotICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBuZXcgU3RyaW5nW10geyJJcmt1dHNrLCBub3JtYWx0aWQiLCAiSVJLVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklya3V0c2ssIHNvbW1hcnRpZCIsICJJUktTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklya3V0c2stdGlkIiwgIklSS1QifX0sCisgICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIElSS1R9LAogICAgICAgICAgICAgeyJBc2lhL0lzdGFuYnVsIiwgRUVUfSwKICAgICAgICAgICAgIHsiQXNpYS9KYWthcnRhIiwgV0lUfSwKICAgICAgICAgICAgIHsiQXNpYS9KYXlhcHVyYSIsIG5ldyBTdHJpbmdbXSB7Ilx1MDBkNnN0aW5kb25lc2lzayB0aWQiLCAiV0lUIiwKQEAgLTY0NiwxNiArNjQ3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGV0cm9wYXZsb3Zzay1LYW10amF0a2EsIHNvbW1hcnRpZCIsICJQRVRTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGV0cm9wYXZsb3Zzay1LYW10amF0c2tpai10aWQiLCAiUEVUVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9LYXJhY2hpIiwgUEtUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRobWFuZHUiLCBOUFR9LAogICAgICAgICAgICAgeyJBc2lhL0thdG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LaGFuZHlnYSIsIG5ldyBTdHJpbmdbXSB7IktoYW5keWdhLCBub3JtYWx0aWQiLCAiWUFLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLaGFuZHlnYSwgc29tbWFydGlkIiwgIllBS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktoYW5keWdhLCBub3JtYWx0aWQiLCAiWUFLVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9Lb2xrYXRhIiwgSVNUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIG5ldyBTdHJpbmdbXSB7IktyYXNub2phcnNrLCBub3JtYWx0aWQiLCAiS1JBVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLcmFzbm9qYXJzaywgc29tbWFydGlkIiwgIktSQVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktyYXNub2phcnNrLXRpZCIsICJLUkFUIn19LAorICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VhbGFfTHVtcHVyIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWNoaW5nIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdXdhaXQiLCBBUkFTVH0sCkBAIC02NzAsNyArNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxpcHBpbnNrIHRpZCIsICJQSFQifX0sCiAgICAgICAgICAgICB7IkFzaWEvTXVzY2F0IiwgR1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9OaWNvc2lhIiwgRUVUfSwKLSAgICAgICAgICAgIHsiQXNpYS9Ob3Zva3V6bmV0c2siLCBOT1ZUfSwKKyAgICAgICAgICAgIHsiQXNpYS9Ob3Zva3V6bmV0c2siLCBLUkFUfSwKICAgICAgICAgICAgIHsiQXNpYS9Ob3Zvc2liaXJzayIsIE5PVlR9LAogICAgICAgICAgICAgeyJBc2lhL09yYWwiLCBuZXcgU3RyaW5nW10geyJPcmFsLCBub3JtYWx0aWQiLCAiT1JBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYWwsIHNvbW1hcnRpZCIsICJPUkFTVCIsCkBAIC02OTYsNiArNjk1LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9TYW1hcmthbmQiLCBVWlR9LAogICAgICAgICAgICAgeyJBc2lhL1Nlb3VsIiwgS1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9TaW5nYXBvcmUiLCBTR1R9LAorICAgICAgICAgICAgeyJBc2lhL1NyZWRuZWtvbHltc2siLCBuZXcgU3RyaW5nW10geyJTcmVkbmVrb2x5bXNrIFRpbWUiLCAiU1JFVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgRGF5bGlnaHQgVGltZSIsICJTUkVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIn19LAogICAgICAgICAgICAgeyJBc2lhL1RhaXBlaSIsIENUVH0sCiAgICAgICAgICAgICB7IkFzaWEvVGVsX0F2aXYiLCBJU1JBRUx9LAogICAgICAgICAgICAgeyJBc2lhL1Rhc2hrZW50IiwgVVpUfSwKQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgICAgICAgICAgeyJBc2lhL1VqdW5nX1BhbmRhbmciLCBDSVR9LAogICAgICAgICAgICAgeyJBc2lhL1VsYWFuYmFhdGFyIiwgVUxBVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhbl9CYXRvciIsIFVMQVR9LAotICAgICAgICAgICAgeyJBc2lhL1VydW1xaSIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9Vc3QtTmVyYSIsIG5ldyBTdHJpbmdbXSB7IlVzdC1OZXJhLCBub3JtYWx0aWQiLCAiVkxBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc3QtTmVyYSwgc29tbWFydGlkIiwgIlZMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzdC1OZXJhLCBub3JtYWx0aWQiLCAiVkxBVCJ9fSwKQEAgLTc1MCw5ICs3NTIsOSBAQAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ2FuYmVycmEiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0N1cnJpZSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvRGFyd2luIiwgREFSV0lOfSwKLSAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiQ2VudHJhbCB2XHUwMEU0c3RsaWcgbm9ybWFsdGlkIChBdXN0cmFsaWVuKSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCB2XHUwMEU0c3RsaWcgc29tbWFydGlkIChBdXN0cmFsaWVuKSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCB2XHUwMEU0c3RsaWcgdGlkIChBdXN0cmFsaWVuKSIsICJDV1QifX0sCisgICAgICAgICAgICB7IkF1c3RyYWxpYS9FdWNsYSIsIG5ldyBTdHJpbmdbXSB7IkNlbnRyYWwgdlx1MDBFNHN0bGlnIG5vcm1hbHRpZCAoQXVzdHJhbGllbikiLCAiQUNXU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDZW50cmFsIHZcdTAwRTRzdGxpZyBzb21tYXJ0aWQgKEF1c3RyYWxpZW4pIiwgIkFDV0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VudHJhbCB2XHUwMEU0c3RsaWcgdGlkIChBdXN0cmFsaWVuKSIsICJBQ1dUIn19LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvSG9iYXJ0IiwgVEFTTUFOSUF9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTEhJIiwgTE9SRF9IT1dFfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0xpbmRlbWFuIiwgQlJJU0JBTkV9LApAQCAtODE4LDcgKzgyMCw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9Jc2xlX29mX01hbiIsIEdNVEJTVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9KZXJzZXkiLCBHTVRCU1R9LAotICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBGRVR9LAorICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvS2lldiIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9MaXNib24iLCBXRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvTGp1YmxqYW5hIiwgQ0VUfSwKQEAgLTg1Myw5ICs4NTUsNyBAQAogICAgICAgICAgICAgeyJFdXJvcGUvVmF0aWNhbiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWVubmEiLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvVmlsbml1cyIsIEVFVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBuZXcgU3RyaW5nW10geyJWb2xnb2dyYWQtdGlkIiwgIlZPTFQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVm9sZ29ncmFkLCBzb21tYXJ0aWQiLCAiVk9MU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVm9sZ29ncmFkLCBub3JtYWx0aWQiLCAiVk9MVCJ9fSwKKyAgICAgICAgICAgIHsiRXVyb3BlL1ZvbGdvZ3JhZCIsIE1TS30sCiAgICAgICAgICAgICB7IkV1cm9wZS9XYXJzYXciLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvWmFncmViIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phcG9yb3poeWUiLCBFRVR9LApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3poL1RpbWVab25lTmFtZXNfemhfQ04uamF2YSBiL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy96aC9UaW1lWm9uZU5hbWVzX3poX0NOLmphdmEKaW5kZXggZTRmY2EzOC4uYzhmMTA5YSAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3poL1RpbWVab25lTmFtZXNfemhfQ04uamF2YQorKysgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvemgvVGltZVpvbmVOYW1lc196aF9DTi5qYXZhCkBAIC00OCw5ICs0OCw5IEBACiAgICAgICAgIFN0cmluZyBBQ1RbXSA9IG5ldyBTdHJpbmdbXSB7IkFjcmUgXHU2NWY2XHU5NWY0IiwgIkFDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjcmUgXHU1OTBmXHU0ZWU0XHU2NWY2IiwgIkFDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3JlIFx1NjVmNlx1OTVmNCIsICJBQ1QifTsKLSAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTU5MkVcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NTM1N1x1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QSkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTU5MkVcdTU5MEZcdTRFRTRcdTY1RjYgKFx1NTM1N1x1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QSkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTY1RjZcdTk1RjQgKFx1NTM1N1x1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QSkiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEFERUxBSURFW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTU5MkVcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NTM1N1x1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QSkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU1OTJFXHU1OTBGXHU0RUU0XHU2NUY2IChcdTUzNTdcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NjVGNlx1OTVGNCAoXHU1MzU3XHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIEFHVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU5NjNmXHU2ODM5XHU1ZWY3XHU2NWY2XHU5NWY0IiwgIkFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTYzZlx1NjgzOVx1NWVmN1x1NTkwZlx1NGVlNFx1NjVmNiIsICJBUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU5NjNGXHU2ODM5XHU1RUY3XHU2NUY2XHU5NUY0IiwgIkFSVCJ9OwpAQCAtNzIsMTIgKzcyLDEyIEBACiAgICAgICAgIFN0cmluZyBCRFRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NWI1Zlx1NTJhMFx1NjJjOVx1NjVmNlx1OTVmNCIsICJCRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTViNWZcdTUyYTBcdTYyYzlcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiQkRTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NUI1Rlx1NTJBMFx1NjJDOVx1NjVGNlx1OTVGNCIsICJCRFQifTsKLSAgICAgICAgU3RyaW5nIEJSSVNCQU5FW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMUNcdTkwRThcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NjYwNlx1NThFQlx1NTE3MCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTU5MEZcdTRFRTRcdTY1RjYgKFx1NjYwNlx1NThFQlx1NTE3MCkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTY1RjZcdTk1RjQgKFx1NjYwNlx1NThFQlx1NTE3MCkiLCAiRVQifTsKLSAgICAgICAgU3RyaW5nIEJST0tFTl9ISUxMW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTU5MkVcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NTM1N1x1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QS9cdTY1QjBcdTUzNTdcdTVBMDFcdTVDMTRcdTY1QUYpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU1OTJFXHU1OTBGXHU0RUU0XHU2NUY2IChcdTUzNTdcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEvXHU2NUIwXHU1MzU3XHU1QTAxXHU1QzE0XHU2NUFGKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NjVGNlx1OTVGNCAoXHU1MzU3XHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBL1x1NjVCMFx1NTM1N1x1NUEwMVx1NUMxNFx1NjVBRikiLCAiQ1QifTsKKyAgICAgICAgU3RyaW5nIEJSSVNCQU5FW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMUNcdTkwRThcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NjYwNlx1NThFQlx1NTE3MCkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTFDXHU5MEU4XHU1OTBGXHU0RUU0XHU2NUY2IChcdTY2MDZcdTU4RUJcdTUxNzApIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxQ1x1OTBFOFx1NjVGNlx1OTVGNCAoXHU2NjA2XHU1OEVCXHU1MTcwKSIsICJBRVQifTsKKyAgICAgICAgU3RyaW5nIEJST0tFTl9ISUxMW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTU5MkVcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NTM1N1x1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QS9cdTY1QjBcdTUzNTdcdTVBMDFcdTVDMTRcdTY1QUYpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1NTkyRVx1NTkwRlx1NEVFNFx1NjVGNiAoXHU1MzU3XHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBL1x1NjVCMFx1NTM1N1x1NUEwMVx1NUMxNFx1NjVBRikiLCAiQUNEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU2NUY2XHU5NUY0IChcdTUzNTdcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEvXHU2NUIwXHU1MzU3XHU1QTAxXHU1QzE0XHU2NUFGKSIsICJBQ1QifTsKICAgICAgICAgU3RyaW5nIEJSVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU1ZGY0XHU4OTdmXHU1MjI5XHU0ZTlhXHU2NWY2XHU5NWY0IiwgIkJSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NWRmNFx1ODk3Zlx1NTIyOVx1NGU5YVx1NTkwZlx1NGVlNFx1NjVmNiIsICJCUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1REY0XHU4OTdGXHU1MjI5XHU0RTlBXHU2NUY2XHU5NUY0IiwgIkJSVCJ9OwpAQCAtMTExLDkgKzExMSw5IEBACiAgICAgICAgIFN0cmluZyBDVUJBW10gPSBuZXcgU3RyaW5nW10geyJcdTUzZTRcdTVkZjRcdTY4MDdcdTUxYzZcdTY1ZjZcdTk1ZjQiLCAiQ1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTNlNFx1NWRmNFx1NTkwZlx1NGVlNFx1NjVmNiIsICJDRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1M0U0XHU1REY0XHU2NUY2XHU5NUY0IiwgIkNUIn07Ci0gICAgICAgIFN0cmluZyBEQVJXSU5bXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NEUyRFx1NTkyRVx1NjgwN1x1NTFDNlx1NjVGNlx1OTVGNCAoXHU1MzE3XHU5ODg2XHU1NzMwKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTU5MkVcdTU5MEZcdTRFRTRcdTY1RjYgKFx1NTMxN1x1OTg4Nlx1NTczMCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU2NUY2XHU5NUY0IChcdTUzMTdcdTkwRThcdTU3MzBcdTUzM0EpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBEQVJXSU5bXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NEUyRFx1NTkyRVx1NjgwN1x1NTFDNlx1NjVGNlx1OTVGNCAoXHU1MzE3XHU5ODg2XHU1NzMwKSIsICJBQ1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU1OTJFXHU1OTBGXHU0RUU0XHU2NUY2IChcdTUzMTdcdTk4ODZcdTU3MzApIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTY1RjZcdTk1RjQgKFx1NTMxN1x1OTBFOFx1NTczMFx1NTMzQSkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBEVUJMSU5bXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NjgzY1x1Njc5N1x1NWEwMVx1NmNiYlx1NjVmNlx1OTVmNCIsICJHTVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTcyMzFcdTVjMTRcdTUxNzBcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiSVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3MjMxXHU1QzE0XHU1MTcwXHU2NUY2XHU5NUY0IiwgIklUIn07CkBAIC0xMzIsOSArMTMyLDkgQEAKICAgICAgICAgU3RyaW5nIEVTVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU0ZTFjXHU5MGU4XHU2ODA3XHU1MWM2XHU2NWY2XHU5NWY0IiwgIkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NGUxY1x1OTBlOFx1NTkwZlx1NGVlNFx1NjVmNiIsICJFRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTY1RjZcdTk1RjQiLCAiRVQifTsKLSAgICAgICAgU3RyaW5nIEVTVF9OU1dbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NEUxQ1x1OTBFOFx1NjgwN1x1NTFDNlx1NjVGNlx1OTVGNCAoXHU2NUIwXHU1MzU3XHU1QTAxXHU1QzE0XHU2NUFGKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTFDXHU5MEU4XHU1OTBGXHU0RUU0XHU2NUY2IChcdTY1QjBcdTUzNTdcdTVBMDFcdTVDMTRcdTY1QUYpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTY1RjZcdTk1RjQgKFx1NjVCMFx1NTM1N1x1NUEwMVx1NUMxNFx1NjVBRikiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIEVTVF9OU1dbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NEUxQ1x1OTBFOFx1NjgwN1x1NTFDNlx1NjVGNlx1OTVGNCAoXHU2NUIwXHU1MzU3XHU1QTAxXHU1QzE0XHU2NUFGKSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxQ1x1OTBFOFx1NTkwRlx1NEVFNFx1NjVGNiAoXHU2NUIwXHU1MzU3XHU1QTAxXHU1QzE0XHU2NUFGKSIsICJBRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxQ1x1OTBFOFx1NjVGNlx1OTVGNCAoXHU2NUIwXHU1MzU3XHU1QTAxXHU1QzE0XHU2NUFGKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIEZFVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU4RkRDXHU0RTFDXHU2QjI3XHU2NUY2XHU5NUY0IiwgIkZFVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OEZEQ1x1NEUxQ1x1NkIyN1x1NTkwRlx1NEVFNFx1NjVGNiIsICJGRVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4RkRDXHU0RTFDXHU2QjI3XHU2NUY2XHU5NUY0IiwgIkZFVCJ9OwpAQCAtMTY1LDYgKzE2NSw5IEBACiAgICAgICAgIFN0cmluZyBJQ1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NTM3MFx1NWVhNlx1NjUyZlx1OTBhM1x1NjVmNlx1OTVmNCIsICJJQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUzNzBcdTVlYTZcdTY1MmZcdTkwYTNcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiSUNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTM3MFx1NUVBNlx1NjUyRlx1OTBBM1x1NjVGNlx1OTVGNCIsICJJQ1QifTsKKyAgICAgICAgU3RyaW5nIElSS1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NGYwYVx1NWMxNFx1NWU5M1x1NmIyMVx1NTE0Ylx1NjVmNlx1OTVmNCIsICJJUktUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NGYwYVx1NWMxNFx1NWU5M1x1NmIyMVx1NTE0Ylx1NTkwZlx1NGVlNFx1NjVmNiIsICJJUktTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRGMEFcdTVDMTRcdTVFOTNcdTZCMjFcdTUxNEJcdTY1RjZcdTk1RjQiLCAiSVJLVCJ9OwogICAgICAgICBTdHJpbmcgSVJUW10gPSBuZXcgU3RyaW5nW10geyJcdTRmMGFcdTY3MTdcdTY4MDdcdTUxYzZcdTY1ZjZcdTk1ZjQiLCAiSVJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NGYwYVx1NjcxN1x1NTkwZlx1NGVlNFx1NjVmNiIsICJJUkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RjBBXHU2NzE3XHU2NUY2XHU5NUY0IiwgIklSVCJ9OwpAQCAtMTc3LDExICsxODAsMTQgQEAKICAgICAgICAgU3RyaW5nIEpTVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NWU1XHU2NzJjXHU2ODA3XHU1MWM2XHU2NWY2XHU5NWY0IiwgIkpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVlNVx1NjcyY1x1NTkwZlx1NGVlNFx1NjVmNiIsICJKRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY1RTVcdTY3MkNcdTY1RjZcdTk1RjQiLCAiSlQifTsKKyAgICAgICAgU3RyaW5nIEtSQVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NTE0Ylx1NjJjOVx1NjVhZlx1OGJmYVx1NGU5YVx1NWMxNFx1NjVhZlx1NTE0Ylx1NjVmNlx1OTVmNCIsICJLUkFUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTE0Ylx1NjJjOVx1NjVhZlx1OGJmYVx1NGU5YVx1NWMxNFx1NjVhZlx1NTE0Ylx1NTkwZlx1NGVlNFx1NjVmNiIsICJLUkFTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUxNEJcdTYyQzlcdTY1QUZcdThCRkFcdTRFOUFcdTVDMTRcdTY1QUZcdTUxNEJcdTY1RjZcdTk1RjQiLCAiS1JBVCJ9OwogICAgICAgICBTdHJpbmcgS1NUW10gPSBuZXcgU3RyaW5nW10geyJcdTk3ZTlcdTU2ZmRcdTY4MDdcdTUxYzZcdTY1ZjZcdTk1ZjQiLCAiS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU5N2U5XHU1NmZkXHU1OTBmXHU0ZWU0XHU2NWY2IiwgIktEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTdFOVx1NTZGRFx1NjVGNlx1OTVGNCIsICJLVCJ9OwogICAgICAgICBTdHJpbmcgTE9SRF9IT1dFW10gPSBuZXcgU3RyaW5nW10geyJcdThjNmFcdTUxNmNcdTY4MDdcdTUxYzZcdTY1ZjZcdTk1ZjQiLCAiTEhTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OGM2YVx1NTE2Y1x1NTkwZlx1NGVlNFx1NjVmNiIsICJMSFNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4YzZhXHU1MTZjXHU1OTBmXHU0ZWU0XHU2NWY2IiwgIkxIRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdThDNkFcdTUxNkNcdTY1RjZcdTk1RjQiLCAiTEhUIn07CiAgICAgICAgIFN0cmluZyBNSFRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1OWE2Y1x1N2VjZFx1NWMxNFx1N2ZhNFx1NWM5Ylx1NjVmNlx1OTVmNCIsICJNSFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTlhNmNcdTdlY2RcdTVjMTRcdTdmYTRcdTVjOWJcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiTUhTVCIsCkBAIC0yMzEsMjAgKzIzNywxNSBAQAogICAgICAgICBTdHJpbmcgU0dUW10gPSBuZXcgU3RyaW5nW10geyJcdTY1YjBcdTUyYTBcdTU3NjFcdTY1ZjZcdTk1ZjQiLCAiU0dUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NWIwXHU1MmEwXHU1NzYxXHU1OTBmXHU0ZWU0XHU2NWY2IiwgIlNHU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY1QjBcdTUyQTBcdTU3NjFcdTY1RjZcdTk1RjQiLCAiU0dUIn07Ci0gICAgICAgIFN0cmluZyBTTFNUW10gPSBuZXcgU3RyaW5nW10geyJcdTY4M2NcdTY3OTdcdTVhMDFcdTZjYmJcdTY1ZjZcdTk1ZjQiLCAiR01UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTg1ZVx1NjJjOVx1NTIyOVx1NjYwMlx1NTkwZlx1NGVlNFx1NjVmNiIsICJTTFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTg1RVx1NjJDOVx1OTFDQ1x1NjYwMlx1NjVGNlx1OTVGNCIsICJTTFQifTsKLSAgICAgICAgU3RyaW5nIFRBU01BTklBW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMUNcdTkwRThcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NTg1NFx1NjVBRlx1OUE2Q1x1NUMzQ1x1NEU5QSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTU5MEZcdTRFRTRcdTY1RjYgKFx1NTg1NFx1NjVBRlx1OUE2Q1x1NUMzQ1x1NEU5QSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTY1RjZcdTk1RjQgKFx1NTg1NFx1NjVBRlx1OUE2Q1x1NUMzQ1x1NEU5QSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFRBU01BTklBW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMUNcdTkwRThcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1NTg1NFx1NjVBRlx1OUE2Q1x1NUMzQ1x1NEU5QSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTFDXHU5MEU4XHU1OTBGXHU0RUU0XHU2NUY2IChcdTU4NTRcdTY1QUZcdTlBNkNcdTVDM0NcdTRFOUEpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxQ1x1OTBFOFx1NjVGNlx1OTVGNCAoXHU1ODU0XHU2NUFGXHU5QTZDXHU1QzNDXHU0RTlBKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFRNVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU1NzFmXHU1ZTkzXHU2NmZjXHU2NWY2XHU5NWY0IiwgIlRNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTcxZlx1NWU5M1x1NjZmY1x1NTkwZlx1NGVlNFx1NjVmNiIsICJUTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1NzFGXHU1RTkzXHU2NkZDXHU2NUY2XHU5NUY0IiwgIlRNVCJ9OwogICAgICAgICBTdHJpbmcgVUxBVFtdPSBuZXcgU3RyaW5nW10geyJcdTVlOTNcdTRmMjZcdTY1ZjZcdTk1ZjQiLCAiVUxBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NWU5M1x1NGYyNlx1NTkwZlx1NGVlNFx1NjVmNiIsICJVTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NUU5M1x1NEYyNlx1NjVGNlx1OTVGNCIsICJVTEFUIn07Ci0gICAgICAgIFN0cmluZyBXQVJUW10gPSBuZXcgU3RyaW5nW10geyJcdTg5N2ZcdTk2M2ZcdTY4MzlcdTVlZjdcdTY1ZjZcdTk1ZjQiLCAiV0FSVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N2ZcdTk2M2ZcdTY4MzlcdTVlZjdcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiV0FSU1QifTsKICAgICAgICAgU3RyaW5nIFdBVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdmXHU5NzVlXHU2NWY2XHU5NWY0IiwgIldBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Zlx1OTc1ZVx1NTkwZlx1NGVlNFx1NjVmNiIsICJXQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU5NzVFXHU2NUY2XHU5NUY0IiwgIldBVCJ9OwpAQCAtMjU0LDI3ICsyNTUsMzAgQEAKICAgICAgICAgU3RyaW5nIFdJVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdmXHU1MzcwXHU1ZWE2XHU1YzNjXHU4OTdmXHU0ZTlhXHU2NWY2XHU5NWY0IiwgIldJQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Zlx1NTM3MFx1NWVhNlx1NWMzY1x1ODk3Zlx1NGU5YVx1NTkwZlx1NGVlNFx1NjVmNiIsICJXSVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU1MzcwXHU1RUE2XHU1QzNDXHU4OTdGXHU0RTlBXHU2NUY2XHU5NUY0IiwgIldJQiJ9OwotICAgICAgICBTdHJpbmcgV1NUX0FVU1tdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdGXHU5MEU4XHU2ODA3XHU1MUM2XHU2NUY2XHU5NUY0IChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEpIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N0ZcdTkwRThcdTU5MEZcdTRFRTRcdTY1RjYgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QSkiLCAiV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1OTBFOFx1NjVGNlx1OTVGNCAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBKSIsICJXVCJ9OworICAgICAgICBTdHJpbmcgV1NUX0FVU1tdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdGXHU5MEU4XHU2ODA3XHU1MUM2XHU2NUY2XHU5NUY0IChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEpIiwgIkFXU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU5MEU4XHU1OTBGXHU0RUU0XHU2NUY2IChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEpIiwgIkFXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU5MEU4XHU2NUY2XHU5NUY0IChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEpIiwgIkFXVCJ9OwogICAgICAgICBTdHJpbmcgU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODQyOFx1NjQ2OVx1NGU5YVx1N2ZhNFx1NWM5Ylx1NjgwN1x1NTFjNlx1NjVmNlx1OTVmNCIsICJTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODQyOFx1NjQ2OVx1NGU5YVx1N2ZhNFx1NWM5Ylx1NTkwZlx1NGVlNFx1NjVmNiIsICJTRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODQyOFx1NjQ2OVx1NEU5QVx1NjVGNlx1OTVGNCIsICJTVCJ9OwotICAgICAgICBTdHJpbmcgV1NUX1NBTU9BW10gPSBuZXcgU3RyaW5nW10geyJcdTg5N2ZcdTg0MjhcdTY0NjlcdTRlOWFcdTY1ZjZcdTk1ZjQiLCAiV1NUIiwKKyAgICAgICAgU3RyaW5nIFdTVF9TQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdmXHU4NDI4XHU2NDY5XHU0ZTlhXHU2NWY2XHU5NWY0IiwgIldTU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N2ZcdTg0MjhcdTY0NjlcdTRlOWFcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiV1NEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1ODQyOFx1NjQ2OVx1NEU5QVx1NjVGNlx1OTVGNCIsICJXU1QifTsKICAgICAgICAgU3RyaW5nIENoU1RbXSA9IG5ldyBTdHJpbmdbXSB7IkNoYW1vcnJvIFx1NjgwN1x1NTFjNlx1NjVmNlx1OTVmNCIsICJDaFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW1vcnJvIFx1NTkwZlx1NGVlNFx1NjVmNiIsICJDaERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjdFNVx1NjQ2OVx1NkQxQlx1NjVGNlx1OTVGNCIsICJDaFQifTsKLSAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMUNcdTkwRThcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1N0VGNFx1NTkxQVx1NTIyOVx1NEU5QSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTU5MEZcdTRFRTRcdTY1RjYgKFx1N0VGNFx1NTkxQVx1NTIyOVx1NEU5QSkiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMUNcdTkwRThcdTY1RjZcdTk1RjQgKFx1N0VGNFx1NTkxQVx1NTIyOVx1NEU5QSkiLCAiRVQifTsKKyAgICAgICAgU3RyaW5nIFZJQ1RPUklBW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMUNcdTkwRThcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQgKFx1N0VGNFx1NTkxQVx1NTIyOVx1NEU5QSkiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTFDXHU5MEU4XHU1OTBGXHU0RUU0XHU2NUY2IChcdTdFRjRcdTU5MUFcdTUyMjlcdTRFOUEpIiwgIkFFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxQ1x1OTBFOFx1NjVGNlx1OTVGNCAoXHU3RUY0XHU1OTFBXHU1MjI5XHU0RTlBKSIsICJBRVQifTsKICAgICAgICAgU3RyaW5nIFVUQ1tdID0gbmV3IFN0cmluZ1tdIHsiXHU1MzRmXHU4YzAzXHU0ZTE2XHU3NTRjXHU2NWY2XHU5NWY0IiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTM0Zlx1OGMwM1x1NGUxNlx1NzU0Y1x1NjVmNlx1OTVmNCIsICJVVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUzNEZcdThDMDNcdTRFMTZcdTc1NENcdTY1RjZcdTk1RjQiLCAiVVRDIn07CiAgICAgICAgIFN0cmluZyBVWlRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NGU0Y1x1NTE3OVx1NTIyYlx1NTE0Ylx1NjVhZlx1NTc2Nlx1NjVmNlx1OTVmNCIsICJVWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRlNGNcdTUxNzlcdTUyMmJcdTUxNGJcdTY1YWZcdTU3NjZcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiVVpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEU0Q1x1NTE3OVx1NTIyQlx1NTE0Qlx1NjVBRlx1NTc2Nlx1NjVGNlx1OTVGNCIsICJVWlQifTsKKyAgICAgICAgU3RyaW5nIFhKVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU0ZTJkXHU1NmZkXHU2ODA3XHU1MWM2XHU2NWY2XHU5NWY0IiwgIlhKVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NGUyZFx1NTZmZFx1NTkwZlx1NGVlNFx1NjVmNiIsICJYSkRUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU1NkZEXHU2NUY2XHU5NUY0IiwgIlhKVCJ9OwogCiAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CiAgICAgICAgICAgICB7IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCBQU1R9LApAQCAtMzM2LDcgKzM0MCw3IEBACiAgICAgICAgICAgICB7IkFmcmljYS9Eamlib3V0aSIsIEVBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Eb3VhbGEiLCBXQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvRWxfQWFpdW4iLCBXRVR9LAotICAgICAgICAgICAgeyJBZnJpY2EvRnJlZXRvd24iLCBTTFNUfSwKKyAgICAgICAgICAgIHsiQWZyaWNhL0ZyZWV0b3duIiwgR01UfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0dhYm9yb25lIiwgQ0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0hhcmFyZSIsIENBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9Kb2hhbm5lc2J1cmciLCBTQVNUfSwKQEAgLTQzNyw3ICs0NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N2ZcdTY4M2NcdTY3OTdcdTUxNzBcdTVjOWJcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiV0dTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1NjgzQ1x1Njc5N1x1NTE3MFx1NUM5Qlx1NjVGNlx1OTVGNCIsICJXR1QifX0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvR29vc2VfQmF5IiwgQVNUfSwKLSAgICAgICAgICAgIHsiQW1lcmljYS9HcmFuZF9UdXJrIiwgRVNUfSwKKyAgICAgICAgICAgIHsiQW1lcmljYS9HcmFuZF9UdXJrIiwgQVNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9HcmVuYWRhIiwgQVNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9HdWFkZWxvdXBlIiwgQVNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9HdWF0ZW1hbGEiLCBDU1R9LApAQCAtNDg0LDkgKzQ4OCw3IEBACiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVuZG96YSIsIEFHVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWVub21pbmVlIiwgQ1NUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZXJpZGEiLCBDU1R9LAotICAgICAgICAgICAgeyJBbWVyaWNhL01ldGxha2F0bGEiLCBuZXcgU3RyaW5nW10geyJcdTY4ODVcdTcyNzlcdTYyQzlcdTUzNjFcdTcyNzlcdTYyQzlcdTY4MDdcdTUxQzZcdTY1RjZcdTk1RjQiLCAiTWVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njg4NVx1NzI3OVx1NjJDOVx1NTM2MVx1NzI3OVx1NjJDOVx1NTkwRlx1NEVFNFx1NjVGNiIsICJNZURUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2ODg1XHU3Mjc5XHU2MkM5XHU1MzYxXHU3Mjc5XHU2MkM5XHU2NUY2XHU5NUY0IiwgIk1lVCJ9fSwKKyAgICAgICAgICAgIHsiQW1lcmljYS9NZXRsYWthdGxhIiwgUFNUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZXhpY29fQ2l0eSIsIENTVH0sCiAgICAgICAgICAgICB7IkFtZXJpY2EvTWlxdWVsb24iLCBuZXcgU3RyaW5nW10geyJcdTc2YWVcdTU3YzNcdTVjMTRcdTVjOWJcdTUzY2FcdTViYzZcdTUxNGJcdTk2ODZcdTVjOWJcdTY4MDdcdTUxYzZcdTY1ZjZcdTk1ZjQiLCAiUE1TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTc2YWVcdTU3YzNcdTVjMTRcdTVjOWJcdTUzY2FcdTViYzZcdTUxNGJcdTk2ODZcdTVjOWJcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiUE1EVCIsCkBAIC02MDcsNiArNjA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY1ODdcdTgzYjFcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiQk5TVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NTg3XHU4M0IxXHU2NUY2XHU5NUY0IiwgIkJOVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9DYWxjdXR0YSIsIElTVH0sCisgICAgICAgICAgICB7IkFzaWEvQ2hpdGEiLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9DaG9pYmFsc2FuIiwgbmV3IFN0cmluZ1tdIHsiQ2hvaWJhbHNhbiBcdTY1ZjZcdTk1ZjQiLCAiQ0hPVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNob2liYWxzYW4gXHU1OTBmXHU0ZWU0XHU2NWY2IiwgIkNIT1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hvaWJhbHNhbiBcdTY1RjZcdTk1RjQiLCAiQ0hPVCJ9fSwKQEAgLTYzMSw5ICs2MzQsNyBAQAogICAgICAgICAgICAgeyJBc2lhL0hvdmQiLCBuZXcgU3RyaW5nW10geyJcdTc5ZDFcdTVlMDNcdTU5MWFcdTY1ZjZcdTk1ZjQiLCAiSE9WVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NzlkMVx1NWUwM1x1NTkxYVx1NTkwZlx1NGVlNFx1NjVmNiIsICJIT1ZTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NzlEMVx1NUUwM1x1NTkxQVx1NjVGNlx1OTVGNCIsICJIT1ZUIn19LAotICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBuZXcgU3RyaW5nW10geyJcdTRmMGFcdTVjMTRcdTVlOTNcdTZiMjFcdTUxNGJcdTY1ZjZcdTk1ZjQiLCAiSVJLVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NGYwYVx1NWMxNFx1NWU5M1x1NmIyMVx1NTE0Ylx1NTkwZlx1NGVlNFx1NjVmNiIsICJJUktTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEYwQVx1NUMxNFx1NUU5M1x1NkIyMVx1NTE0Qlx1NjVGNlx1OTVGNCIsICJJUktUIn19LAorICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmFrYXJ0YSIsIFdJVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmF5YXB1cmEiLCBuZXcgU3RyaW5nW10geyJcdTRlMWNcdTUzNzBcdTVlYTZcdTVjM2NcdTg5N2ZcdTRlOWFcdTY1ZjZcdTk1ZjQiLCAiV0lUIiwKQEAgLTY0NiwxNiArNjQ3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1ZjdjXHU1Zjk3XHU3ZjU3XHU1ZGY0XHU3NTJiXHU2ZDFiXHU1OTJiXHU2NWFmXHU1MTRiXHU1OTBmXHU0ZWU0XHU2NWY2IiwgIlBFVFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTVGN0NcdTVGOTdcdTdGNTdcdTVERjRcdTc1MkJcdTZEMUJcdTU5MkJcdTY1QUZcdTUxNEJcdTY1RjZcdTk1RjQiLCAiUEVUVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9LYXJhY2hpIiwgUEtUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgQ1RUfSwKKyAgICAgICAgICAgIHsiQXNpYS9LYXNoZ2FyIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9LYXRobWFuZHUiLCBOUFR9LAogICAgICAgICAgICAgeyJBc2lhL0thdG1hbmR1IiwgTlBUfSwKICAgICAgICAgICAgIHsiQXNpYS9LaGFuZHlnYSIsIG5ldyBTdHJpbmdbXSB7Ilx1NkM0OVx1NUZCN1x1NTJBMFx1NjVGNlx1OTVGNCIsICJZQUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NkM0OVx1NUZCN1x1NTJBMFx1NTkwRlx1NEVFNFx1NjVGNiIsICJZQUtTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTZDNDlcdTVGQjdcdTUyQTBcdTY1RjZcdTk1RjQiLCAiWUFLVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9Lb2xrYXRhIiwgSVNUfSwKLSAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIG5ldyBTdHJpbmdbXSB7Ilx1NTE0Ylx1NjJjOVx1NjVhZlx1OGJmYVx1NGU5YVx1NWMxNFx1NjVhZlx1NTE0Ylx1NjVmNlx1OTVmNCIsICJLUkFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTE0Ylx1NjJjOVx1NjVhZlx1OGJmYVx1NGU5YVx1NWMxNFx1NjVhZlx1NTE0Ylx1NTkwZlx1NGVlNFx1NjVmNiIsICJLUkFTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUxNEJcdTYyQzlcdTY1QUZcdThCRkFcdTRFOUFcdTVDMTRcdTY1QUZcdTUxNEJcdTY1RjZcdTk1RjQiLCAiS1JBVCJ9fSwKKyAgICAgICAgICAgIHsiQXNpYS9LcmFzbm95YXJzayIsIEtSQVR9LAogICAgICAgICAgICAgeyJBc2lhL0t1YWxhX0x1bXB1ciIsIE1ZVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VjaGluZyIsIE1ZVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3V3YWl0IiwgQVJBU1R9LApAQCAtNjcwLDcgKzY2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4M0YyXHU1RjhCXHU1QkJFXHU2NUY2XHU5NUY0IiwgIlBIVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9NdXNjYXQiLCBHU1R9LAogICAgICAgICAgICAgeyJBc2lhL05pY29zaWEiLCBFRVR9LAotICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIE5PVlR9LAorICAgICAgICAgICAgeyJBc2lhL05vdm9rdXpuZXRzayIsIEtSQVR9LAogICAgICAgICAgICAgeyJBc2lhL05vdm9zaWJpcnNrIiwgTk9WVH0sCiAgICAgICAgICAgICB7IkFzaWEvT3JhbCIsIG5ldyBTdHJpbmdbXSB7Ik9yYWwgXHU2NWY2XHU5NWY0IiwgIk9SQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmFsIFx1NTkwZlx1NGVlNFx1NjVmNiIsICJPUkFTVCIsCkBAIC02OTYsNiArNjk1LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9TYW1hcmthbmQiLCBVWlR9LAogICAgICAgICAgICAgeyJBc2lhL1Nlb3VsIiwgS1NUfSwKICAgICAgICAgICAgIHsiQXNpYS9TaW5nYXBvcmUiLCBTR1R9LAorICAgICAgICAgICAgeyJBc2lhL1NyZWRuZWtvbHltc2siLCBuZXcgU3RyaW5nW10geyJTcmVkbmVrb2x5bXNrIFRpbWUiLCAiU1JFVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgRGF5bGlnaHQgVGltZSIsICJTUkVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNyZWRuZWtvbHltc2sgVGltZSIsICJTUkVUIn19LAogICAgICAgICAgICAgeyJBc2lhL1RhaXBlaSIsIENUVH0sCiAgICAgICAgICAgICB7IkFzaWEvVGVsX0F2aXYiLCBJU1JBRUx9LAogICAgICAgICAgICAgeyJBc2lhL1Rhc2hrZW50IiwgVVpUfSwKQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgICAgICAgICAgeyJBc2lhL1VqdW5nX1BhbmRhbmciLCBDSVR9LAogICAgICAgICAgICAgeyJBc2lhL1VsYWFuYmFhdGFyIiwgVUxBVH0sCiAgICAgICAgICAgICB7IkFzaWEvVWxhbl9CYXRvciIsIFVMQVR9LAotICAgICAgICAgICAgeyJBc2lhL1VydW1xaSIsIENUVH0sCisgICAgICAgICAgICB7IkFzaWEvVXJ1bXFpIiwgWEpUfSwKICAgICAgICAgICAgIHsiQXNpYS9Vc3QtTmVyYSIsIG5ldyBTdHJpbmdbXSB7Ilx1NEU0Q1x1NjVBRlx1NUI2M1x1NkQ4NVx1NjJDOVx1NjVGNlx1OTVGNCIsICJWTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEU0Q1x1NjVBRlx1NUI2M1x1NkQ4NVx1NjJDOVx1NTkwRlx1NEVFNFx1NjVGNiIsICJWTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFNENcdTY1QUZcdTVCNjNcdTZEODVcdTYyQzlcdTY1RjZcdTk1RjQiLCAiVkxBVCJ9fSwKQEAgLTc1MCw5ICs3NTIsOSBAQAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvQ2FuYmVycmEiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0N1cnJpZSIsIEVTVF9OU1d9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvRGFyd2luIiwgREFSV0lOfSwKLSAgICAgICAgICAgIHsiQXVzdHJhbGlhL0V1Y2xhIiwgbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU4OTdGXHU5MEU4XHU2ODA3XHU1MUM2XHU2NUY2XHU5NUY0IChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUEpIiwgIkNXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTg5N0ZcdTkwRThcdTU5MEZcdTRFRTRcdTY1RjYgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5QSkiLCAiQ1dTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1ODk3Rlx1OTBFOFx1NjVGNlx1OTVGNCAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBKSIsICJDV1QifX0sCisgICAgICAgICAgICB7IkF1c3RyYWxpYS9FdWNsYSIsIG5ldyBTdHJpbmdbXSB7Ilx1NEUyRFx1ODk3Rlx1OTBFOFx1NjgwN1x1NTFDNlx1NjVGNlx1OTVGNCAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBKSIsICJBQ1dTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1ODk3Rlx1OTBFOFx1NTkwRlx1NEVFNFx1NjVGNiAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBKSIsICJBQ1dEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1ODk3Rlx1OTBFOFx1NjVGNlx1OTVGNCAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlBKSIsICJBQ1dUIn19LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvSG9iYXJ0IiwgVEFTTUFOSUF9LAogICAgICAgICAgICAgeyJBdXN0cmFsaWEvTEhJIiwgTE9SRF9IT1dFfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0xpbmRlbWFuIiwgQlJJU0JBTkV9LApAQCAtODE4LDcgKzgyMCw3IEBACiAgICAgICAgICAgICB7IkV1cm9wZS9Jc2xlX29mX01hbiIsIEdNVEJTVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9KZXJzZXkiLCBHTVRCU1R9LAotICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBGRVR9LAorICAgICAgICAgICAgeyJFdXJvcGUvS2FsaW5pbmdyYWQiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvS2lldiIsIEVFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9MaXNib24iLCBXRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvTGp1YmxqYW5hIiwgQ0VUfSwKQEAgLTg1Myw5ICs4NTUsNyBAQAogICAgICAgICAgICAgeyJFdXJvcGUvVmF0aWNhbiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9WaWVubmEiLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvVmlsbml1cyIsIEVFVH0sCi0gICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBuZXcgU3RyaW5nW10geyJcdTRmMGZcdTVjMTRcdTUyYTBcdTY4M2NcdTUyZDJcdTY1ZjZcdTk1ZjQiLCAiVk9MVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRmMGZcdTVjMTRcdTUyYTBcdTY4M2NcdTUyZDJcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiVk9MU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RjBGXHU1QzE0XHU1MkEwXHU2ODNDXHU1MkQyXHU2NUY2XHU5NUY0IiwgIlZPTFQifX0sCisgICAgICAgICAgICB7IkV1cm9wZS9Wb2xnb2dyYWQiLCBNU0t9LAogICAgICAgICAgICAgeyJFdXJvcGUvV2Fyc2F3IiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1phZ3JlYiIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9aYXBvcm96aHllIiwgRUVUfSwKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy96aC9UaW1lWm9uZU5hbWVzX3poX1RXLmphdmEgYi9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvemgvVGltZVpvbmVOYW1lc196aF9UVy5qYXZhCmluZGV4IDIwY2ZhMjMuLjY5NmI1NzEgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy96aC9UaW1lWm9uZU5hbWVzX3poX1RXLmphdmEKKysrIGIvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3poL1RpbWVab25lTmFtZXNfemhfVFcuamF2YQpAQCAtNDgsOSArNDgsOSBAQAogICAgICAgICBTdHJpbmcgQUNUW10gPSBuZXcgU3RyaW5nW10geyJBY3JlIFx1NjY0Mlx1OTU5MyIsICJBQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3JlIFx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJBQ1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNyZSBcdTY2NDJcdTk1OTMiLCAiQUNUIn07Ci0gICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUVcdTUzNTdcdTkwRTgpIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU1OTBGXHU0RUU0XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUVcdTUzNTdcdTUzNDApIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUVcdTUzNTdcdTkwRTgpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBBREVMQUlERVtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUVcdTUzNTdcdTkwRTgpIiwgIkFDU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFXHU1MzU3XHU1MzQwKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RVx1NTM1N1x1OTBFOCkiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBBR1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1OTYzZlx1NjgzOVx1NWVmN1x1NjY0Mlx1OTU5MyIsICJBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTk2M2ZcdTY4MzlcdTVlZjdcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiQVJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTYzRlx1NjgzOVx1NUVGN1x1NjY0Mlx1OTU5MyIsICJBUlQifTsKQEAgLTcyLDEyICs3MiwxMiBAQAogICAgICAgICBTdHJpbmcgQkRUW10gPSBuZXcgU3RyaW5nW10geyJcdTViNWZcdTUyYTBcdTYyYzlcdTY2NDJcdTk1OTMiLCAiQkRUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1YjVmXHU1MmEwXHU2MmM5XHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIkJEU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTVCNUZcdTUyQTBcdTYyQzlcdTY2NDJcdTk1OTMiLCAiQkRUIn07Ci0gICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyXHU5NTkzIChcdTY2MDZcdTU4RUJcdTg2MkQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU1OTBGXHU0RUU0XHU2NjQyXHU5NTkzIChcdTY2MDZcdTU4RUJcdTg2MkQpIiwgIkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2NjQyXHU5NTkzIChcdTY2MDZcdTU4RUJcdTg2MkQpIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUVcdTUzNTdcdTUzNDAvXHU2NUIwXHU1MzU3XHU1QTAxXHU3MjNFXHU2NUFGKSIsICJDU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFXHU1MzU3XHU1MzQwL1x1NjVCMFx1NTM1N1x1NUEwMVx1NzIzRVx1NjVBRikiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RVx1NTM1N1x1OTBFOC9cdTY1QjBcdTUzNTdcdTVBMDFcdTcyM0VcdTY1QUYpIiwgIkNUIn07CisgICAgICAgIFN0cmluZyBCUklTQkFORVtdID0gbmV3IFN0cmluZ1tdIHsiXHU2NzcxXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyXHU5NTkzIChcdTY2MDZcdTU4RUJcdTg2MkQpIiwgIkFFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU2NjA2XHU1OEVCXHU4NjJEKSIsICJBRURUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTY2NDJcdTk1OTMgKFx1NjYwNlx1NThFQlx1ODYyRCkiLCAiQUVUIn07CisgICAgICAgIFN0cmluZyBCUk9LRU5fSElMTFtdID0gbmV3IFN0cmluZ1tdIHsiXHU0RTJEXHU5MEU4XHU2QTE5XHU2RTk2XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUVcdTUzNTdcdTUzNDAvXHU2NUIwXHU1MzU3XHU1QTAxXHU3MjNFXHU2NUFGKSIsICJBQ1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTkwRThcdTU5MEZcdTRFRTRcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RVx1NTM1N1x1NTM0MC9cdTY1QjBcdTUzNTdcdTVBMDFcdTcyM0VcdTY1QUYpIiwgIkFDRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFXHU1MzU3XHU5MEU4L1x1NjVCMFx1NTM1N1x1NUEwMVx1NzIzRVx1NjVBRikiLCAiQUNUIn07CiAgICAgICAgIFN0cmluZyBCUlRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NWRmNFx1ODk3Zlx1NTIyOVx1NGU5ZVx1NjY0Mlx1OTU5MyIsICJCUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTVkZjRcdTg5N2ZcdTUyMjlcdTRlOWVcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiQlJTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NURGNFx1ODk3Rlx1NTIyOVx1NEU5RVx1NjY0Mlx1OTU5MyIsICJCUlQifTsKQEAgLTExMSw5ICsxMTEsOSBAQAogICAgICAgICBTdHJpbmcgQ1VCQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU1M2U0XHU1ZGY0XHU2YTE5XHU2ZTk2XHU2NjQyXHU5NTkzIiwgIkNTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUzZTRcdTVkZjRcdTY1ZTVcdTUxNDlcdTdiYzBcdTdkMDRcdTY2NDJcdTk1OTMiLCAiQ0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTNFNFx1NURGNFx1NjY0Mlx1OTU5MyIsICJDVCJ9OwotICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDJcdTk1OTMgKFx1NTMxN1x1OTBFOFx1NTQwNFx1NTczMFx1NTM0MCkiLCAiQ1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU5MEU4XHU1OTBGXHU0RUU0XHU2NjQyXHU5NTkzIChcdTUzMTdcdTkwRThcdTU0MDRcdTU3MzBcdTUzNDApIiwgIkNTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RVx1NEUyRFx1OTBFOFx1NjY0Mlx1OTU5MyAoXHU1MzE3XHU2NUI5XHU1MzQwXHU1N0RGKSIsICJDVCJ9OworICAgICAgICBTdHJpbmcgREFSV0lOW10gPSBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDJcdTk1OTMgKFx1NTMxN1x1OTBFOFx1NTQwNFx1NTczMFx1NTM0MCkiLCAiQUNTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUyRFx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU1MzE3XHU5MEU4XHU1NDA0XHU1NzMwXHU1MzQwKSIsICJBQ0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFXHU0RTJEXHU5MEU4XHU2NjQyXHU5NTkzIChcdTUzMTdcdTY1QjlcdTUzNDBcdTU3REYpIiwgIkFDVCJ9OwogICAgICAgICBTdHJpbmcgRFVCTElOW10gPSBuZXcgU3RyaW5nW10geyJcdTY4M2NcdTY3OTdcdTVhMDFcdTZjYmJcdTVlNzNcdTU3NDdcdTY2NDJcdTk1OTMiLCAiR01UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2MTFiXHU3MjNlXHU4NjJkXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIklTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjExQlx1NzIzRVx1ODYyRFx1NjU4N1x1NjY0Mlx1OTU5MyIsICJJVCJ9OwpAQCAtMTMyLDkgKzEzMiw5IEBACiAgICAgICAgIFN0cmluZyBFU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njc3MVx1NjViOVx1NmExOVx1NmU5Nlx1NjY0Mlx1OTU5MyIsICJFU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTY1YjlcdTY1ZTVcdTUxNDlcdTdiYzBcdTdkMDRcdTY2NDJcdTk1OTMiLCAiRURUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3RjhFXHU1NzBCXHU2NzcxXHU5MEU4XHU2NjQyXHU5NTkzIiwgIkVUIn07Ci0gICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJcdTY3NzFcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDJcdTk1OTMgKFx1NjVCMFx1NTM1N1x1NUEwMVx1NzIzRVx1NjVBRikiLCAiRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU2NUIwXHU1MzU3XHU1QTAxXHU3MjNFXHU2NUFGKSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2NjQyXHU5NTkzIChcdTY1QjBcdTUzNTdcdTVBMDFcdTcyM0VcdTY1QUYpIiwgIkVUIn07CisgICAgICAgIFN0cmluZyBFU1RfTlNXW10gPSBuZXcgU3RyaW5nW10geyJcdTY3NzFcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDJcdTk1OTMgKFx1NjVCMFx1NTM1N1x1NUEwMVx1NzIzRVx1NjVBRikiLCAiQUVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTU5MEZcdTRFRTRcdTY2NDJcdTk1OTMgKFx1NjVCMFx1NTM1N1x1NUEwMVx1NzIzRVx1NjVBRikiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTY2NDJcdTk1OTMgKFx1NjVCMFx1NTM1N1x1NUEwMVx1NzIzRVx1NjVBRikiLCAiQUVUIn07CiAgICAgICAgIFN0cmluZyBGRVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njc3MVx1NkI1MFx1NTE2N1x1OTY3OFx1NjY0Mlx1OTU5MyIsICJGRVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTZCNTBcdTUxNjdcdTk2NzhcdTU5MEZcdTRFRTRcdTY2NDJcdTk1OTMiLCAiRkVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1NkI1MFx1NTE2N1x1OTY3OFx1NjY0Mlx1OTU5MyIsICJGRVQifTsKQEAgLTE2NSw2ICsxNjUsOSBAQAogICAgICAgICBTdHJpbmcgSUNUW10gPSBuZXcgU3RyaW5nW10geyJcdTUzNzBcdTVlYTZcdTY1MmZcdTkwYTNcdTY2NDJcdTk1OTMiLCAiSUNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1MzcwXHU1ZWE2XHU2NTJmXHU5MGEzXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIklDU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUzNzBcdTVFQTZcdTY1MkZcdTkwQTNcdTY2NDJcdTk1OTMiLCAiSUNUIn07CisgICAgICAgIFN0cmluZyBJUktUW10gPSBuZXcgU3RyaW5nW10geyJJcmt1dHNrIFx1NjY0Mlx1OTU5MyIsICJJUktUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklya3V0c2sgXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIklSS1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEYwQVx1NzIzRVx1NUVBQlx1NkIyMVx1NTE0Qlx1NjY0Mlx1OTU5MyIsICJJUktUIn07CiAgICAgICAgIFN0cmluZyBJUlRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NGYwYVx1NjcxN1x1NmExOVx1NmU5Nlx1NjY0Mlx1OTU5MyIsICJJUlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0ZjBhXHU2NzE3XHU2NWU1XHU1MTQ5XHU3YmMwXHU3ZDA0XHU2NjQyXHU5NTkzIiwgIklSRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRGMEFcdTY3MTdcdTY2NDJcdTk1OTMiLCAiSVJUIn07CkBAIC0xNzcsMTEgKzE4MCwxNCBAQAogICAgICAgICBTdHJpbmcgSlNUW10gPSBuZXcgU3RyaW5nW10geyJcdTY1ZTVcdTY3MmNcdTZhMTlcdTZlOTZcdTY2NDJcdTk1OTMiLCAiSlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NWU1XHU2NzJjXHU2NWU1XHU1MTQ5XHU3YmMwXHU3ZDA0XHU2NjQyXHU5NTkzIiwgIkpEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVFNVx1NjcyQ1x1NjY0Mlx1OTU5MyIsICJKVCJ9OworICAgICAgICBTdHJpbmcgS1JBVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU1MTRiXHU2MmM5XHU2NWFmXHU4YWZlXHU0ZTllXHU3MjNlXHU2NWFmXHU1MTRiXHU2NjQyXHU5NTkzIiwgIktSQVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1MTRiXHU2MmM5XHU2NWFmXHU4YWZlXHU0ZTllXHU3MjNlXHU2NWFmXHU1MTRiXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIktSQVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTE0Qlx1NjJDOVx1NjVBRlx1OEFGRVx1NEU5RVx1NzIzRVx1NjVBRlx1NTE0Qlx1NjY0Mlx1OTU5MyIsICJLUkFUIn07CiAgICAgICAgIFN0cmluZyBLU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1OTdkM1x1NTcwYlx1NmExOVx1NmU5Nlx1NjY0Mlx1OTU5MyIsICJLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTk3ZDNcdTU3MGJcdTY1ZTVcdTUxNDlcdTdiYzBcdTdkMDRcdTY2NDJcdTk1OTMiLCAiS0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU5N0QzXHU1NzBCXHU2NjQyXHU5NTkzIiwgIktUIn07CiAgICAgICAgIFN0cmluZyBMT1JEX0hPV0VbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1OGM2YVx1NTJmM1x1NzIzNVx1NWNmNlx1NmExOVx1NmU5Nlx1NjY0Mlx1OTU5MyIsICJMSFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4YzZhXHU1MmYzXHU3MjM1XHU1Y2Y2XHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIkxIU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdThjNmFcdTUyZjNcdTcyMzVcdTVjZjZcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiTEhEVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OEM2QVx1NTJGM1x1NzIzNVx1NUNGNlx1NjY0Mlx1OTU5MyIsICJMSFQifTsKICAgICAgICAgU3RyaW5nIE1IVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU5OWFjXHU3ZDM5XHU3MjNlXHU3ZmE0XHU1Y2Y2XHU2NjQyXHU5NTkzIiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTlhY1x1N2QzOVx1NzIzZVx1N2ZhNFx1NWNmNlx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJNSFNUIiwKQEAgLTIzMSwyMCArMjM3LDE1IEBACiAgICAgICAgIFN0cmluZyBTR1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NjViMFx1NTJhMFx1NTc2MVx1NjY0Mlx1OTU5MyIsICJTR1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY1YjBcdTUyYTBcdTU3NjFcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiU0dTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVCMFx1NTJBMFx1NTc2MVx1NjY0Mlx1OTU5MyIsICJTR1QifTsKLSAgICAgICAgU3RyaW5nIFNMU1RbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1NjgzY1x1Njc5N1x1NWEwMVx1NmNiYlx1NWU3M1x1NTc0N1x1NjY0Mlx1OTU5MyIsICJHTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3MzQ1XHU1YjUwXHU1YzcxXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIlNMU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3MzQ1XHU1QjUwXHU1QzcxXHU2NjQyXHU5NTkzIiwgIlNMVCJ9OwotICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyAoXHU1ODU0XHU2NUFGXHU2ODg1XHU1QzNDXHU0RTlFXHU1Q0Y2KSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU1ODU0XHU2NUFGXHU2ODg1XHU1QzNDXHU0RTlFXHU1Q0Y2KSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RVx1Njc3MVx1OTBFOFx1NjY0Mlx1OTU5MyAoXHU1ODU0XHU2NUFGXHU5OUFDXHU1QzNDXHU0RTlFXHU1Q0Y2KSIsICJFVCJ9OworICAgICAgICBTdHJpbmcgVEFTTUFOSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyAoXHU1ODU0XHU2NUFGXHU2ODg1XHU1QzNDXHU0RTlFXHU1Q0Y2KSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTU5MEZcdTRFRTRcdTY2NDJcdTk1OTMgKFx1NTg1NFx1NjVBRlx1Njg4NVx1NUMzQ1x1NEU5RVx1NUNGNikiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFXHU2NzcxXHU5MEU4XHU2NjQyXHU5NTkzIChcdTU4NTRcdTY1QUZcdTk5QUNcdTVDM0NcdTRFOUVcdTVDRjYpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVE1UW10gPSBuZXcgU3RyaW5nW10geyJcdTU3MWZcdTVlYWJcdTY2ZmNcdTY2NDJcdTk1OTMiLCAiVE1UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1NzFmXHU1ZWFiXHU2NmZjXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIlRNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTU3MUZcdTVFQUJcdTY2RkNcdTY2NDJcdTk1OTMiLCAiVE1UIn07CiAgICAgICAgIFN0cmluZyBVTEFUW109IG5ldyBTdHJpbmdbXSB7Ilx1NWVhYlx1NTAyYlx1NjY0Mlx1OTU5MyIsICJVTEFUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1ZWFiXHU1MDJiXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIlVMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1RUFCXHU1MDJCXHU2NjQyXHU5NTkzIiwgIlVMQVQifTsKLSAgICAgICAgICBTdHJpbmcgV0FSVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdmXHU5NjNmXHU2ODM5XHU1ZWY3XHU2NjQyXHU5NTkzIiwgIldBUlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdmXHU5NjNmXHU2ODM5XHU1ZWY3XHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIldBUlNUIn07CiAgICAgICAgIFN0cmluZyBXQVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Zlx1OTc1ZVx1NjY0Mlx1OTU5MyIsICJXQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N2ZcdTk3NWVcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiV0FTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1OTc1RVx1NjY0Mlx1OTU5MyIsICJXQVQifTsKQEAgLTI1NCwyNyArMjU1LDMwIEBACiAgICAgICAgIFN0cmluZyBXSVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Zlx1NTM3MFx1NWMzY1x1NjY0Mlx1OTU5MyIsICJXSUIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N2ZcdTUzNzBcdTVjM2NcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiV0lTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1NTM3MFx1NUMzQ1x1NjY0Mlx1OTU5MyIsICJXSUIifTsKLSAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Rlx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFKSIsICJXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU5MEU4XHU1OTBGXHU0RUU0XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUUpIiwgIldTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N0ZcdTkwRThcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RSkiLCAiV1QifTsKKyAgICAgICAgU3RyaW5nIFdTVF9BVVNbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Rlx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFKSIsICJBV1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFKSIsICJBV0RUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Rlx1OTBFOFx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFKSIsICJBV1QifTsKICAgICAgICAgU3RyaW5nIFNBTU9BW10gPSBuZXcgU3RyaW5nW10geyJcdTg1YTlcdTY0NjlcdTRlOWVcdTZhMTlcdTZlOTZcdTY2NDJcdTk1OTMiLCAiU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg1YTlcdTY0NjlcdTRlOWVcdTY1ZTVcdTUxNDlcdTdiYzBcdTdkMDRcdTY2NDJcdTk1OTMiLCAiU0RUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg1QTlcdTY0NjlcdTRFOUVcdTY2NDJcdTk1OTMiLCAiU1QifTsKLSAgICAgICAgU3RyaW5nIFdTVF9TQU1PQVtdID0gbmV3IFN0cmluZ1tdIHsiXHU4OTdmXHU4NWE5XHU2NDY5XHU0ZTllXHU2NjQyXHU5NTkzIiwgIldTVCIsCisgICAgICAgIFN0cmluZyBXU1RfU0FNT0FbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODk3Zlx1ODVhOVx1NjQ2OVx1NGU5ZVx1NjY0Mlx1OTU5MyIsICJXU1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdmXHU4NWE5XHU2NDY5XHU0ZTllXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIldTRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTg5N0ZcdTg1QTlcdTY0NjlcdTRFOUVcdTY2NDJcdTk1OTMiLCAiV1NUIn07CiAgICAgICAgIFN0cmluZyBDaFNUW10gPSBuZXcgU3RyaW5nW10geyJcdTY3ZTVcdTgzYWJcdTZkMWJcdTZhMTlcdTZlOTZcdTY2NDJcdTk1OTMiLCAiQ2hTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjdlNVx1ODNhYlx1NmQxYlx1NjVlNVx1NTE0OVx1N2JjMFx1N2QwNFx1NjY0Mlx1OTU5MyIsICJDaERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2N0U1XHU4M0FCXHU3Rjg1XHU2NjQyXHU5NTkzIiwgIkNoVCJ9OwotICAgICAgICBTdHJpbmcgVklDVE9SSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyAoXHU3REFEXHU1OTFBXHU1MjI5XHU0RTlFXHU5MEE2KSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NTkwRlx1NEVFNFx1NjY0Mlx1OTU5MyAoXHU3REFEXHU1OTFBXHU1MjI5XHU0RTlFXHU5MEE2KSIsICJFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1OTBFOFx1NjY0Mlx1OTU5MyAoXHU3REFEXHU1OTFBXHU1MjI5XHU0RTlFKSIsICJFVCJ9OworICAgICAgICBTdHJpbmcgVklDVE9SSUFbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1Njc3MVx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyAoXHU3REFEXHU1OTFBXHU1MjI5XHU0RTlFXHU5MEE2KSIsICJBRVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTkwRThcdTU5MEZcdTRFRTRcdTY2NDJcdTk1OTMgKFx1N0RBRFx1NTkxQVx1NTIyOVx1NEU5RVx1OTBBNikiLCAiQUVEVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU5MEU4XHU2NjQyXHU5NTkzIChcdTdEQURcdTU5MUFcdTUyMjlcdTRFOUUpIiwgIkFFVCJ9OwogICAgICAgICBTdHJpbmcgVVRDW10gPSBuZXcgU3RyaW5nW10geyJcdTUzNTRcdThhYmZcdTRlMTZcdTc1NGNcdTY2NDJcdTk1OTMiLCAiVVRDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1MzU0XHU4YWJmXHU0ZTE2XHU3NTRjXHU2NjQyXHU5NTkzIiwgIlVUQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTM1NFx1OEFCRlx1NEUxNlx1NzU0Q1x1NjY0Mlx1OTU5MyIsICJVVEMifTsKICAgICAgICAgU3RyaW5nIFVaVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU3MGNmXHU4MzMyXHU1MjI1XHU1MTRiXHU2NWFmXHU1NzY2XHU2NjQyXHU5NTkzIiwgIlVaVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NzBjZlx1ODMzMlx1NTIyNVx1NTE0Ylx1NjVhZlx1NTc2Nlx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJVWlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3MENGXHU4MzMyXHU1MjI1XHU1MTRCXHU2NUFGXHU1NzY2XHU2NjQyXHU5NTkzIiwgIlVaVCJ9OworICAgICAgICBTdHJpbmcgWEpUW10gPSBuZXcgU3RyaW5nW10geyJcdTRlMmRcdTU3MGJcdTZhMTlcdTZlOTZcdTY2NDJcdTk1OTMiLCAiWEpUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0ZTJkXHU1NzBiXHU2NWU1XHU1MTQ5XHU3YmMwXHU3ZDA0XHU2NjQyXHU5NTkzIiwgIlhKRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTU3MEJcdTY2NDJcdTk1OTMiLCAiWEpUIn07CiAKICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKICAgICAgICAgICAgIHsiQW1lcmljYS9Mb3NfQW5nZWxlcyIsIFBTVH0sCkBAIC0zMzYsNyArMzQwLDcgQEAKICAgICAgICAgICAgIHsiQWZyaWNhL0RqaWJvdXRpIiwgRUFUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0RvdWFsYSIsIFdBVH0sCiAgICAgICAgICAgICB7IkFmcmljYS9FbF9BYWl1biIsIFdFVH0sCi0gICAgICAgICAgICB7IkFmcmljYS9GcmVldG93biIsIFNMU1R9LAorICAgICAgICAgICAgeyJBZnJpY2EvRnJlZXRvd24iLCBHTVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvR2Fib3JvbmUiLCBDQVR9LAogICAgICAgICAgICAgeyJBZnJpY2EvSGFyYXJlIiwgQ0FUfSwKICAgICAgICAgICAgIHsiQWZyaWNhL0pvaGFubmVzYnVyZyIsIFNBU1R9LApAQCAtNDM3LDcgKzQ0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODk3Zlx1NjgzY1x1Njc5N1x1ODYyZFx1NWNmNlx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJXR1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4OTdGXHU2ODNDXHU5Njc1XHU4NjJEXHU2NjQyXHU5NTkzIiwgIldHVCJ9fSwKICAgICAgICAgICAgIHsiQW1lcmljYS9Hb29zZV9CYXkiLCBBU1R9LAotICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBFU1R9LAorICAgICAgICAgICAgeyJBbWVyaWNhL0dyYW5kX1R1cmsiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0dyZW5hZGEiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YWRlbG91cGUiLCBBU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL0d1YXRlbWFsYSIsIENTVH0sCkBAIC00ODQsOSArNDg4LDcgQEAKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5kb3phIiwgQUdUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NZW5vbWluZWUiLCBDU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01lcmlkYSIsIENTVH0sCi0gICAgICAgICAgICB7IkFtZXJpY2EvTWV0bGFrYXRsYSIsIG5ldyBTdHJpbmdbXSB7Ilx1Njg4NVx1NzI3OVx1NjJDOVx1NTM2MVx1NzI3OVx1NjJDOVx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyIsICJNZVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2ODg1XHU3Mjc5XHU2MkM5XHU1MzYxXHU3Mjc5XHU2MkM5XHU2NUU1XHU1MTQ5XHU3QkMwXHU3RDA0XHU2NjQyXHU5NTkzIiwgIk1lRFQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY4ODVcdTcyNzlcdTYyQzlcdTUzNjFcdTcyNzlcdTYyQzlcdTY2NDJcdTk1OTMiLCAiTWVUIn19LAorICAgICAgICAgICAgeyJBbWVyaWNhL01ldGxha2F0bGEiLCBQU1R9LAogICAgICAgICAgICAgeyJBbWVyaWNhL01leGljb19DaXR5IiwgQ1NUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9NaXF1ZWxvbiIsIG5ldyBTdHJpbmdbXSB7Ilx1NzZhZVx1NTdjM1x1NzIzZVx1NWNmNlx1NTNjYVx1NWJjNlx1NTE0Ylx1OTY4Nlx1NWNmNlx1NmExOVx1NmU5Nlx1NjY0Mlx1OTU5MyIsICJQTVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NzZhZVx1NTdjM1x1NzIzZVx1NWNmNlx1NTNjYVx1NWJjNlx1NTE0Ylx1OTY4Nlx1NWNmNlx1NjVlNVx1NTE0OVx1N2JjMFx1N2QwNFx1NjY0Mlx1OTU5MyIsICJQTURUIiwKQEAgLTYwNyw2ICs2MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NmM3Nlx1ODQwYVx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJCTlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTZDNzZcdTg0MEFcdTY2NDJcdTk1OTMiLCAiQk5UIn19LAogICAgICAgICAgICAgeyJBc2lhL0NhbGN1dHRhIiwgSVNUfSwKKyAgICAgICAgICAgIHsiQXNpYS9DaGl0YSIsIElSS1R9LAogICAgICAgICAgICAgeyJBc2lhL0Nob2liYWxzYW4iLCBuZXcgU3RyaW5nW10geyJcdTVkZTdcdTVkZjRcdTVjNzEgKENob2liYWxzYW4pIFx1NjY0Mlx1OTU5MyIsICJDSE9UIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1ZGU3XHU1ZGY0XHU1YzcxIChDaG9pYmFsc2FuKSBcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiQ0hPU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTVERTdcdTVERjRcdTVDNzEgKENob2liYWxzYW4pIFx1NjY0Mlx1OTU5MyIsICJDSE9UIn19LApAQCAtNjMxLDkgKzYzNCw3IEBACiAgICAgICAgICAgICB7IkFzaWEvSG92ZCIsIG5ldyBTdHJpbmdbXSB7Ilx1NGZhZlx1NWZiNyAoSG92ZCkgXHU2NjQyXHU5NTkzIiwgIkhPVlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRmYWZcdTVmYjcgKEhvdmQpIFx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJIT1ZTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEZBRlx1NUZCNyAoSG92ZCkgXHU2NjQyXHU5NTkzIiwgIkhPVlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvSXJrdXRzayIsIG5ldyBTdHJpbmdbXSB7Iklya3V0c2sgXHU2NjQyXHU5NTkzIiwgIklSS1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcmt1dHNrIFx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJJUktTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEYwQVx1NzIzRVx1NUVBQlx1NkIyMVx1NTE0Qlx1NjY0Mlx1OTU5MyIsICJJUktUIn19LAorICAgICAgICAgICAgeyJBc2lhL0lya3V0c2siLCBJUktUfSwKICAgICAgICAgICAgIHsiQXNpYS9Jc3RhbmJ1bCIsIEVFVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmFrYXJ0YSIsIFdJVH0sCiAgICAgICAgICAgICB7IkFzaWEvSmF5YXB1cmEiLCBuZXcgU3RyaW5nW10geyJcdTY3NzFcdTUzNzBcdTVlYTZcdTVjM2NcdTg5N2ZcdTRlOWVcdTY2NDJcdTk1OTMiLCAiV0lUIiwKQEAgLTY0NiwxNiArNjQ3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIFx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJQRVRTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIFx1NjY0Mlx1OTU5MyIsICJQRVRUIn19LAogICAgICAgICAgICAgeyJBc2lhL0thcmFjaGkiLCBQS1R9LAotICAgICAgICAgICAgeyJBc2lhL0thc2hnYXIiLCBDVFR9LAorICAgICAgICAgICAgeyJBc2lhL0thc2hnYXIiLCBYSlR9LAogICAgICAgICAgICAgeyJBc2lhL0thdGhtYW5kdSIsIE5QVH0sCiAgICAgICAgICAgICB7IkFzaWEvS2F0bWFuZHUiLCBOUFR9LAogICAgICAgICAgICAgeyJBc2lhL0toYW5keWdhIiwgbmV3IFN0cmluZ1tdIHsiXHU2RjIyXHU1NzMwXHU1MkEwIChLaGFuZHlnYSkgXHU2NjQyXHU5NTkzIiwgIllBS1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2RjIyXHU1NzMwXHU1MkEwIChLaGFuZHlnYSkgXHU1OTBGXHU0RUU0XHU2NjQyXHU5NTkzIiwgIllBS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NkYyMlx1NTczMFx1NTJBMCAoS2hhbmR5Z2EpIFx1NjY0Mlx1OTU5MyIsICJZQUtUIn19LAogICAgICAgICAgICAgeyJBc2lhL0tvbGthdGEiLCBJU1R9LAotICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgbmV3IFN0cmluZ1tdIHsiXHU1MTRiXHU2MmM5XHU2NWFmXHU4YWZlXHU0ZTllXHU3MjNlXHU2NWFmXHU1MTRiXHU2NjQyXHU5NTkzIiwgIktSQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU1MTRiXHU2MmM5XHU2NWFmXHU4YWZlXHU0ZTllXHU3MjNlXHU2NWFmXHU1MTRiXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIktSQVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTE0Qlx1NjJDOVx1NjVBRlx1OEFGRVx1NEU5RVx1NzIzRVx1NjVBRlx1NTE0Qlx1NjY0Mlx1OTU5MyIsICJLUkFUIn19LAorICAgICAgICAgICAgeyJBc2lhL0tyYXNub3lhcnNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvS3VhbGFfTHVtcHVyIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdWNoaW5nIiwgTVlUfSwKICAgICAgICAgICAgIHsiQXNpYS9LdXdhaXQiLCBBUkFTVH0sCkBAIC02NzAsNyArNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTgzRjJcdTVGOEJcdThDRDNcdTY2NDJcdTk1OTMiLCAiUEhUIn19LAogICAgICAgICAgICAgeyJBc2lhL011c2NhdCIsIEdTVH0sCiAgICAgICAgICAgICB7IkFzaWEvTmljb3NpYSIsIEVFVH0sCi0gICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgTk9WVH0sCisgICAgICAgICAgICB7IkFzaWEvTm92b2t1em5ldHNrIiwgS1JBVH0sCiAgICAgICAgICAgICB7IkFzaWEvTm92b3NpYmlyc2siLCBOT1ZUfSwKICAgICAgICAgICAgIHsiQXNpYS9PcmFsIiwgbmV3IFN0cmluZ1tdIHsiXHU2YjUwXHU0ZjViXHU2NjQyXHU5NTkzIiwgIk9SQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTZiNTBcdTRmNWJcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiT1JBU1QiLApAQCAtNjk2LDYgKzY5NSw5IEBACiAgICAgICAgICAgICB7IkFzaWEvU2FtYXJrYW5kIiwgVVpUfSwKICAgICAgICAgICAgIHsiQXNpYS9TZW91bCIsIEtTVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2luZ2Fwb3JlIiwgU0dUfSwKKyAgICAgICAgICAgIHsiQXNpYS9TcmVkbmVrb2x5bXNrIiwgbmV3IFN0cmluZ1tdIHsiU3JlZG5la29seW1zayBUaW1lIiwgIlNSRVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcmVkbmVrb2x5bXNrIERheWxpZ2h0IFRpbWUiLCAiU1JFRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcmVkbmVrb2x5bXNrIFRpbWUiLCAiU1JFVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9UYWlwZWkiLCBuZXcgU3RyaW5nW10geyJcdTUzZjBcdTcwNjNcdTZhMTlcdTZlOTZcdTY2NDJcdTk1OTMiLCAiVFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUzZjBcdTcwNjNcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiVERUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTUzZjBcdTcwNjNcdTY2NDJcdTk1OTMiLCAiVFQifX0sCkBAIC03MTAsNyArNzEyLDcgQEAKICAgICAgICAgICAgIHsiQXNpYS9VanVuZ19QYW5kYW5nIiwgQ0lUfSwKICAgICAgICAgICAgIHsiQXNpYS9VbGFhbmJhYXRhciIsIFVMQVR9LAogICAgICAgICAgICAgeyJBc2lhL1VsYW5fQmF0b3IiLCBVTEFUfSwKLSAgICAgICAgICAgIHsiQXNpYS9VcnVtcWkiLCBDVFR9LAorICAgICAgICAgICAgeyJBc2lhL1VydW1xaSIsIFhKVH0sCiAgICAgICAgICAgICB7IkFzaWEvVXN0LU5lcmEiLCBuZXcgU3RyaW5nW10geyJcdTcwQ0ZcdTY1QUZcdTUxNjdcdTYyQzkgKFVzdC1OZXJhKSBcdTY2NDJcdTk1OTMiLCAiVkxBVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTcwQ0ZcdTY1QUZcdTUxNjdcdTYyQzkgKFVzdC1OZXJhKSBcdTU5MEZcdTRFRTRcdTY2NDJcdTk1OTMiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3MENGXHU2NUFGXHU1MTY3XHU2MkM5IChVc3QtTmVyYSkgXHU2NjQyXHU5NTkzIiwgIlZMQVQifX0sCkBAIC03NTIsOSArNzU0LDkgQEAKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0NhbmJlcnJhIiwgRVNUX05TV30sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9DdXJyaWUiLCBFU1RfTlNXfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0RhcndpbiIsIERBUldJTn0sCi0gICAgICAgICAgICB7IkF1c3RyYWxpYS9FdWNsYSIsIG5ldyBTdHJpbmdbXSB7Ilx1NEUyRFx1ODk3Rlx1OTBFOFx1NkExOVx1NkU5Nlx1NjY0Mlx1OTU5MyAoXHU2RkIzXHU1OTI3XHU1MjI5XHU0RTlFKSIsICJDV1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTJEXHU4OTdGXHU5MEU4XHU1OTBGXHU0RUU0XHU2NjQyXHU5NTkzIChcdTZGQjNcdTU5MjdcdTUyMjlcdTRFOUUpIiwgIkNXU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTg5N0ZcdTkwRThcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RSkiLCAiQ1dUIn19LAorICAgICAgICAgICAgeyJBdXN0cmFsaWEvRXVjbGEiLCBuZXcgU3RyaW5nW10geyJcdTRFMkRcdTg5N0ZcdTkwRThcdTZBMTlcdTZFOTZcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RSkiLCAiQUNXU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTg5N0ZcdTkwRThcdTU5MEZcdTRFRTRcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RSkiLCAiQUNXRFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMkRcdTg5N0ZcdTkwRThcdTY2NDJcdTk1OTMgKFx1NkZCM1x1NTkyN1x1NTIyOVx1NEU5RSkiLCAiQUNXVCJ9fSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0hvYmFydCIsIFRBU01BTklBfSwKICAgICAgICAgICAgIHsiQXVzdHJhbGlhL0xISSIsIExPUkRfSE9XRX0sCiAgICAgICAgICAgICB7IkF1c3RyYWxpYS9MaW5kZW1hbiIsIEJSSVNCQU5FfSwKQEAgLTgyMCw3ICs4MjIsNyBAQAogICAgICAgICAgICAgeyJFdXJvcGUvSXNsZV9vZl9NYW4iLCBHTVRCU1R9LAogICAgICAgICAgICAgeyJFdXJvcGUvSXN0YW5idWwiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvSmVyc2V5IiwgR01UQlNUfSwKLSAgICAgICAgICAgIHsiRXVyb3BlL0thbGluaW5ncmFkIiwgRkVUfSwKKyAgICAgICAgICAgIHsiRXVyb3BlL0thbGluaW5ncmFkIiwgRUVUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0tpZXYiLCBFRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvTGlzYm9uIiwgV0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL0xqdWJsamFuYSIsIENFVH0sCkBAIC04NTUsOSArODU3LDcgQEAKICAgICAgICAgICAgIHsiRXVyb3BlL1ZhdGljYW4iLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvVmllbm5hIiwgQ0VUfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1ZpbG5pdXMiLCBFRVR9LAotICAgICAgICAgICAgeyJFdXJvcGUvVm9sZ29ncmFkIiwgbmV3IFN0cmluZ1tdIHsiXHU0ZjBmXHU3MjNlXHU1MmEwXHU2ODNjXHU1MmQyXHU2NjQyXHU5NTkzIiwgIlZPTFQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0ZjBmXHU3MjNlXHU1MmEwXHU2ODNjXHU1MmQyXHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIlZPTFNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEYwRlx1NzIzRVx1NTJBMFx1NjgzQ1x1NTJEMlx1NjY0Mlx1OTU5MyIsICJWT0xUIn19LAorICAgICAgICAgICAgeyJFdXJvcGUvVm9sZ29ncmFkIiwgTVNLfSwKICAgICAgICAgICAgIHsiRXVyb3BlL1dhcnNhdyIsIENFVH0sCiAgICAgICAgICAgICB7IkV1cm9wZS9aYWdyZWIiLCBDRVR9LAogICAgICAgICAgICAgeyJFdXJvcGUvWmFwb3Jvemh5ZSIsIEVFVH0sCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY2FtMDIuYyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjYW0wMi5jCmluZGV4IDM4ZDE2NGEuLjg2ZWMxNjcgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjYW0wMi5jCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjYW0wMi5jCkBAIC00NjcsMTEgKzQ2NywxMiBAQAogICAgIENBTTAyQ09MT1IgY2xyOwogICAgIGNtc0NJRUNBTTAyKiBscE1vZCA9IChjbXNDSUVDQU0wMiopIGhNb2RlbDsKIAotICAgIG1lbXNldCgmY2xyLCAwLCBzaXplb2YoY2xyKSk7CiAgICAgX2Ntc0Fzc2VydChscE1vZCAhPSBOVUxMKTsKICAgICBfY21zQXNzZXJ0KHBJbiAhPSBOVUxMKTsKICAgICBfY21zQXNzZXJ0KHBPdXQgIT0gTlVMTCk7CiAKKyAgICBtZW1zZXQoJmNsciwgMCwgc2l6ZW9mKGNscikpOworCiAgICAgY2xyLlhZWlswXSA9IHBJbiAtPlg7CiAgICAgY2xyLlhZWlsxXSA9IHBJbiAtPlk7CiAgICAgY2xyLlhZWlsyXSA9IHBJbiAtPlo7CkBAIC00OTIsMTEgKzQ5MywxMiBAQAogICAgIENBTTAyQ09MT1IgY2xyOwogICAgIGNtc0NJRUNBTTAyKiBscE1vZCA9IChjbXNDSUVDQU0wMiopIGhNb2RlbDsKIAotICAgIG1lbXNldCgmY2xyLCAwLCBzaXplb2YoY2xyKSk7CiAgICAgX2Ntc0Fzc2VydChscE1vZCAhPSBOVUxMKTsKICAgICBfY21zQXNzZXJ0KHBJbiAhPSBOVUxMKTsKICAgICBfY21zQXNzZXJ0KHBPdXQgIT0gTlVMTCk7CiAKKyAgICBtZW1zZXQoJmNsciwgMCwgc2l6ZW9mKGNscikpOworCiAgICAgY2xyLkogPSBwSW4gLT4gSjsKICAgICBjbHIuQyA9IHBJbiAtPiBDOwogICAgIGNsci5oID0gcEluIC0+IGg7CkBAIC01MTEsNCArNTEzLDMgQEAKICAgICBwT3V0IC0+WSA9IGNsci5YWVpbMV07CiAgICAgcE91dCAtPlogPSBjbHIuWFlaWzJdOwogfQotCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY2dhdHMuYyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjZ2F0cy5jCmluZGV4IDExZmUzNmUuLmUzMDc5ZDEgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjZ2F0cy5jCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjZ2F0cy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAvLyBTeW1ib2xzCiB0eXBlZGVmIGVudW0gewogCi0gICAgICAgIFNOT05FLAorICAgICAgICBTVU5ERUZJTkVELAogICAgICAgICBTSU5VTSwgICAgICAvLyBJbnRlZ2VyCiAgICAgICAgIFNETlVNLCAgICAgIC8vIFJlYWwKICAgICAgICAgU0lERU5ULCAgICAgLy8gSWRlbnRpZmllcgpAQCAtNTUwLDcgKzU1MCw3IEBACiAgICAgICAgIGVsc2UgbCA9IHggKyAxOwogICAgIH0KIAotICAgIHJldHVybiBTTk9ORTsKKyAgICByZXR1cm4gU1VOREVGSU5FRDsKIH0KIAogCkBAIC03MzUsNyArNzM1LDcgQEAKIAogCiAgICAgICAgICAgICBrZXkgPSBCaW5TcmNoS2V5KGl0OC0+aWQpOwotICAgICAgICAgICAgaWYgKGtleSA9PSBTTk9ORSkgaXQ4LT5zeSA9IFNJREVOVDsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gU1VOREVGSU5FRCkgaXQ4LT5zeSA9IFNJREVOVDsKICAgICAgICAgICAgIGVsc2UgaXQ4LT5zeSA9IGtleTsKIAogICAgICAgICB9CkBAIC0xMzI2LDcgKzEzMjYsNyBAQAogICAgIGl0OC0+VmFsaWRLZXl3b3JkcyA9IE5VTEw7CiAgICAgaXQ4LT5WYWxpZFNhbXBsZUlEID0gTlVMTDsKIAotICAgIGl0OCAtPiBzeSA9IFNOT05FOworICAgIGl0OCAtPiBzeSA9IFNVTkRFRklORUQ7CiAgICAgaXQ4IC0+IGNoID0gJyAnOwogICAgIGl0OCAtPiBTb3VyY2UgPSBOVUxMOwogICAgIGl0OCAtPiBpbnVtID0gMDsKQEAgLTIxNzksOSArMjE3OSw5IEBACiAKICAgICAgICAgaWYgKGNtc3N0cmNhc2VjbXAoRmxkLCAiU0FNUExFX0lEIikgPT0gMCkgewogCi0gICAgICAgICAgICAgICAgICAgIHQgLT4gU2FtcGxlSUQgPSBpZEZpZWxkOworICAgICAgICAgICAgdCAtPiBTYW1wbGVJRCA9IGlkRmllbGQ7CiAKLSAgICAgICAgZm9yIChpPTA7IGkgPCB0IC0+IG5QYXRjaGVzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgdCAtPiBuUGF0Y2hlczsgaSsrKSB7CiAKICAgICAgICAgICAgICAgICBjaGFyICpEYXRhID0gR2V0RGF0YShpdDgsIGksIGlkRmllbGQpOwogICAgICAgICAgICAgICAgIGlmIChEYXRhKSB7CkBAIC0yMTk2LDcgKzIxOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU2V0RGF0YShpdDgsIGksIGlkRmllbGQsIEJ1ZmZlcik7CiAKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2NudnJ0LmMgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY252cnQuYwppbmRleCBjZWEzYjhiLi5iYzJiMGRhIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY252cnQuYworKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY252cnQuYwpAQCAtMTM3LDE1ICsxMzcsNjggQEAKIAogCiAvLyBBIHBvaW50ZXIgdG8gdGhlIGJlZ2luaW5nIG9mIHRoZSBsaXN0Ci1zdGF0aWMgY21zSW50ZW50c0xpc3QgKkludGVudHMgPSBEZWZhdWx0SW50ZW50czsKK19jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKworLy8gRHVwbGljYXRlcyB0aGUgem9uZSBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcGx1Zy1pbiBpbiB0aGUgbmV3IGNvbnRleHQKK3N0YXRpYwordm9pZCBEdXBQbHVnaW5JbnRlbnRzTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKKyAgIGNtc0ludGVudHNMaXN0KiAgZW50cnk7CisgICBjbXNJbnRlbnRzTGlzdCogIEFudGVyaW9yID0gTlVMTDsKKyAgIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKiBoZWFkID0gKF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKikgc3JjLT5jaHVua3NbSW50ZW50UGx1Z2luXTsKKworICAgIC8vIFdhbGsgdGhlIGxpc3QgY29weWluZyBhbGwgbm9kZXMKKyAgIGZvciAoZW50cnkgPSBoZWFkLT5JbnRlbnRzOworICAgICAgICBlbnRyeSAhPSBOVUxMOworICAgICAgICBlbnRyeSA9IGVudHJ5IC0+TmV4dCkgeworCisgICAgICAgICAgICBjbXNJbnRlbnRzTGlzdCAqbmV3RW50cnkgPSAoIGNtc0ludGVudHNMaXN0ICopIF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBlbnRyeSwgc2l6ZW9mKGNtc0ludGVudHNMaXN0KSk7CisKKyAgICAgICAgICAgIGlmIChuZXdFbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBrZWVwIHRoZSBsaW5rZWQgbGlzdCBvcmRlciwgc28gdGhpcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2t5CisgICAgICAgICAgICBuZXdFbnRyeSAtPiBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChBbnRlcmlvcikKKyAgICAgICAgICAgICAgICBBbnRlcmlvciAtPiBOZXh0ID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgIGlmIChuZXdIZWFkLkludGVudHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBuZXdIZWFkLkludGVudHMgPSBuZXdFbnRyeTsKKyAgICB9CisKKyAgY3R4IC0+Y2h1bmtzW0ludGVudFBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4LT5NZW1Qb29sLCAmbmV3SGVhZCwgc2l6ZW9mKF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKSk7Cit9CisKK3ZvaWQgIF9jbXNBbGxvY0ludGVudHNQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBpZiAoc3JjICE9IE5VTEwpIHsKKworICAgICAgICAvLyBDb3B5IGFsbCBsaW5rZWQgbGlzdAorICAgICAgICBEdXBQbHVnaW5JbnRlbnRzTGlzdChjdHgsIHNyYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUgSW50ZW50c1BsdWdpbkNodW5rVHlwZSA9IHsgTlVMTCB9OworICAgICAgICBjdHggLT5jaHVua3NbSW50ZW50UGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmSW50ZW50c1BsdWdpbkNodW5rVHlwZSwgc2l6ZW9mKF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKSk7CisgICAgfQorfQorCiAKIC8vIFNlYXJjaCB0aGUgbGlzdCBmb3IgYSBzdWl0YWJsZSBpbnRlbnQuIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQKIHN0YXRpYwotY21zSW50ZW50c0xpc3QqIFNlYXJjaEludGVudChjbXNVSW50MzJOdW1iZXIgSW50ZW50KQorY21zSW50ZW50c0xpc3QqIFNlYXJjaEludGVudChjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEludGVudCkKIHsKKyAgICBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBJbnRlbnRQbHVnaW4pOwogICAgIGNtc0ludGVudHNMaXN0KiBwdDsKIAotICAgIGZvciAocHQgPSBJbnRlbnRzOyBwdCAhPSBOVUxMOyBwdCA9IHB0IC0+IE5leHQpCisgICAgZm9yIChwdCA9IGN0eCAtPiBJbnRlbnRzOyBwdCAhPSBOVUxMOyBwdCA9IHB0IC0+IE5leHQpCisgICAgICAgIGlmIChwdCAtPkludGVudCA9PSBJbnRlbnQpIHJldHVybiBwdDsKKworICAgIGZvciAocHQgPSBEZWZhdWx0SW50ZW50czsgcHQgIT0gTlVMTDsgcHQgPSBwdCAtPiBOZXh0KQogICAgICAgICBpZiAocHQgLT5JbnRlbnQgPT0gSW50ZW50KSByZXR1cm4gcHQ7CiAKICAgICByZXR1cm4gTlVMTDsKQEAgLTEwMzEsNyArMTA4NCw3IEBACiAgICAgLy8gdGhpcyBjYXNlIHdvdWxkIHByZXNlbnQgc29tZSBpc3N1ZXMgaWYgdGhlIGN1c3RvbSBpbnRlbnQgdHJpZXMgdG8gZG8gdGhpbmdzIGxpa2UKICAgICAvLyBwcmVzZXJ2ZSBwcmltYXJpZXMuIFRoaXMgc29sdXRpb24gaXMgbm90IHBlcmZlY3QsIGJ1dCB3b3JrcyB3ZWxsIG9uIG1vc3QgY2FzZXMuCiAKLSAgICBJbnRlbnQgPSBTZWFyY2hJbnRlbnQoVGhlSW50ZW50c1swXSk7CisgICAgSW50ZW50ID0gU2VhcmNoSW50ZW50KENvbnRleHRJRCwgVGhlSW50ZW50c1swXSk7CiAgICAgaWYgKEludGVudCA9PSBOVUxMKSB7CiAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCBpbnRlbnQgJyVkJyIsIFRoZUludGVudHNbMF0pOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEwNDYsMTIgKzEwOTksMTQgQEAKIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgaW50ZW50cy4gbk1heCBpcyB0aGUgbWF4aW11bSBzcGFjZSBmb3IgdGhlIHN1cHBsaWVkICJDb2RlcyIKIC8vIGFuZCAiRGVzY3JpcHRpb25zIiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGludGVudHMsIHdoaWNoIG1heSBiZSBncmVhdGVyCiAvLyB0aGFuIG5NYXgsIGFsdGhvdWdoIHRoZSBtYXRyaWNlcyBhcmUgbm90IHBvcHVsYXRlZCBiZXlvbmQgdGhpcyBsZXZlbC4KLWNtc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zR2V0U3VwcG9ydGVkSW50ZW50cyhjbXNVSW50MzJOdW1iZXIgbk1heCwgY21zVUludDMyTnVtYmVyKiBDb2RlcywgY2hhcioqIERlc2NyaXB0aW9ucykKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zR2V0U3VwcG9ydGVkSW50ZW50c1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5NYXgsIGNtc1VJbnQzMk51bWJlciogQ29kZXMsIGNoYXIqKiBEZXNjcmlwdGlvbnMpCiB7CisgICAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgSW50ZW50UGx1Z2luKTsKICAgICBjbXNJbnRlbnRzTGlzdCogcHQ7CiAgICAgY21zVUludDMyTnVtYmVyIG5JbnRlbnRzOwogCi0gICAgZm9yIChuSW50ZW50cz0wLCBwdCA9IEludGVudHM7IHB0ICE9IE5VTEw7IHB0ID0gcHQgLT4gTmV4dCkKKworICAgIGZvciAobkludGVudHM9MCwgcHQgPSBjdHgtPkludGVudHM7IHB0ICE9IE5VTEw7IHB0ID0gcHQgLT4gTmV4dCkKICAgICB7CiAgICAgICAgIGlmIChuSW50ZW50cyA8IG5NYXgpIHsKICAgICAgICAgICAgIGlmIChDb2RlcyAhPSBOVUxMKQpAQCAtMTA2NCwzNyArMTExOSw1MiBAQAogICAgICAgICBuSW50ZW50cysrOwogICAgIH0KIAorICAgIGZvciAobkludGVudHM9MCwgcHQgPSBEZWZhdWx0SW50ZW50czsgcHQgIT0gTlVMTDsgcHQgPSBwdCAtPiBOZXh0KQorICAgIHsKKyAgICAgICAgaWYgKG5JbnRlbnRzIDwgbk1heCkgeworICAgICAgICAgICAgaWYgKENvZGVzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgQ29kZXNbbkludGVudHNdID0gcHQgLT5JbnRlbnQ7CisKKyAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvbnMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbnNbbkludGVudHNdID0gcHQgLT5EZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIG5JbnRlbnRzKys7CisgICAgfQogICAgIHJldHVybiBuSW50ZW50czsKIH0KIAorY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzKGNtc1VJbnQzMk51bWJlciBuTWF4LCBjbXNVSW50MzJOdW1iZXIqIENvZGVzLCBjaGFyKiogRGVzY3JpcHRpb25zKQoreworICAgIHJldHVybiBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzVEhSKE5VTEwsIG5NYXgsIENvZGVzLCBEZXNjcmlwdGlvbnMpOworfQorCiAvLyBUaGUgcGx1Zy1pbiByZWdpc3RyYXRpb24uIFVzZXIgY2FuIGFkZCBuZXcgaW50ZW50cyBvciBvdmVycmlkZSBkZWZhdWx0IHJvdXRpbmVzCiBjbXNCb29sICBfY21zUmVnaXN0ZXJSZW5kZXJpbmdJbnRlbnRQbHVnaW4oY21zQ29udGV4dCBpZCwgY21zUGx1Z2luQmFzZSogRGF0YSkKIHsKKyAgICBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoaWQsIEludGVudFBsdWdpbik7CiAgICAgY21zUGx1Z2luUmVuZGVyaW5nSW50ZW50KiBQbHVnaW4gPSAoY21zUGx1Z2luUmVuZGVyaW5nSW50ZW50KikgRGF0YTsKICAgICBjbXNJbnRlbnRzTGlzdCogZmw7CiAKLSAgICAvLyBEbyB3ZSBoYXZlIHRvIHJlc2V0IHRoZSBpbnRlbnRzPworICAgIC8vIERvIHdlIGhhdmUgdG8gcmVzZXQgdGhlIGN1c3RvbSBpbnRlbnRzPwogICAgIGlmIChEYXRhID09IE5VTEwpIHsKIAotICAgICAgIEludGVudHMgPSBEZWZhdWx0SW50ZW50czsKLSAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgY3R4LT5JbnRlbnRzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgZmwgPSBTZWFyY2hJbnRlbnQoUGx1Z2luIC0+SW50ZW50KTsKKyAgICBmbCA9IChjbXNJbnRlbnRzTGlzdCopIF9jbXNQbHVnaW5NYWxsb2MoaWQsIHNpemVvZihjbXNJbnRlbnRzTGlzdCkpOworICAgIGlmIChmbCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKLSAgICBpZiAoZmwgPT0gTlVMTCkgewotICAgICAgICBmbCA9IChjbXNJbnRlbnRzTGlzdCopIF9jbXNQbHVnaW5NYWxsb2MoaWQsIHNpemVvZihjbXNJbnRlbnRzTGlzdCkpOwotICAgICAgICBpZiAoZmwgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotICAgIH0KIAogICAgIGZsIC0+SW50ZW50ICA9IFBsdWdpbiAtPkludGVudDsKLSAgICBzdHJuY3B5KGZsIC0+RGVzY3JpcHRpb24sIFBsdWdpbiAtPkRlc2NyaXB0aW9uLCAyNTUpOwotICAgIGZsIC0+RGVzY3JpcHRpb25bMjU1XSA9IDA7CisgICAgc3RybmNweShmbCAtPkRlc2NyaXB0aW9uLCBQbHVnaW4gLT5EZXNjcmlwdGlvbiwgc2l6ZW9mKGZsIC0+RGVzY3JpcHRpb24pLTEpOworICAgIGZsIC0+RGVzY3JpcHRpb25bc2l6ZW9mKGZsIC0+RGVzY3JpcHRpb24pLTFdID0gMDsKIAogICAgIGZsIC0+TGluayAgICA9IFBsdWdpbiAtPkxpbms7CiAKLSAgICBmbCAtPk5leHQgPSBJbnRlbnRzOwotICAgIEludGVudHMgPSBmbDsKKyAgICBmbCAtPk5leHQgPSBjdHggLT5JbnRlbnRzOworICAgIGN0eCAtPkludGVudHMgPSBmbDsKIAogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2Vyci5jIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2Vyci5jCmluZGV4IGJmMWUyNjAuLjMwNmQwMzYgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNlcnIuYworKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zZXJyLmMKQEAgLTYwLDEzICs2MCwxNCBAQAogLy8gY29tcGFyZSB0d28gc3RyaW5ncyBpZ25vcmluZyBjYXNlCiBpbnQgQ01TRVhQT1JUIGNtc3N0cmNhc2VjbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKQogewotICAgICAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqdXMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVzMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqdXMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1czIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMyOwogCi0gICAgICAgIHdoaWxlICh0b3VwcGVyKCp1czEpID09IHRvdXBwZXIoKnVzMisrKSkKLSAgICAgICAgICAgICAgICBpZiAoKnVzMSsrID09ICdcMCcpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICByZXR1cm4gKHRvdXBwZXIoKnVzMSkgLSB0b3VwcGVyKCotLXVzMikpOworICAgIHdoaWxlICh0b3VwcGVyKCp1czEpID09IHRvdXBwZXIoKnVzMisrKSkKKyAgICAgICAgaWYgKCp1czErKyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKHRvdXBwZXIoKnVzMSkgLSB0b3VwcGVyKCotLXVzMikpOwogfQogCiAvLyBsb25nIGludCBiZWNhdXNlIEM5OSBzcGVjaWZpZXMgZnRlbGwgaW4gc3VjaCB3YXkgKDcuMTkuOS4yKQpAQCAtOTEsOSArOTIsOCBAQAogLy8KIC8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMuIEJ5IGRlZmF1bHQgYSBzaW1wbGUKIC8vIHdyYXBwaW5nIHRvIG1hbGxvYy9mcmVlL3JlYWxsb2MgaXMgcHJvdmlkZWQsIGFsdGhvdWdoIHRoZXJlIGlzIGEgbGltaXQgb24gdGhlIG1heAotLy8gYW1vdW50IG9mIG1lbW95IHRoYXQgY2FuIGJlIHJlY2xhaW1lZC4gVGhpcyBpcyBtb3N0bHkgYXMgYSBzYWZldHkgZmVhdHVyZSB0bwotLy8gcHJldmVudCBib2d1cyBvciBtYWxpbnRlbnRpb25hdGVkIGNvZGUgdG8gYWxsb2NhdGUgaHVnZSBibG9ja3MgdGhhdCBvdGhlcndpc2UgbGNtcwotLy8gd291bGQgbmV2ZXIgbmVlZC4KKy8vIGFtb3VudCBvZiBtZW1veSB0aGF0IGNhbiBiZSByZWNsYWltZWQuIFRoaXMgaXMgbW9zdGx5IGFzIGEgc2FmZXR5IGZlYXR1cmUgdG8gcHJldmVudAorLy8gYm9ndXMgb3IgZXZpbCBjb2RlIHRvIGFsbG9jYXRlIGh1Z2UgYmxvY2tzIHRoYXQgb3RoZXJ3aXNlIGxjbXMgd291bGQgbmV2ZXIgbmVlZC4KIAogI2RlZmluZSBNQVhfTUVNT1JZX0ZPUl9BTExPQyAgKChjbXNVSW50MzJOdW1iZXIpKDEwMjRVKjEwMjRVKjUxMlUpKQogCkBAIC0xMDMsNyArMTAzLDcgQEAKIC8vIHJlcXVpcmVkIHRvIGJlIGltcGxlbWVudGVkOiBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUsIGFsdGhvdWdoIHRoZSB1c2VyIG1heSB3YW50IHRvCiAvLyByZXBsYWNlIHRoZSBvcHRpb25hbCBtYWxsb2NaZXJvLCBjYWxsb2MgYW5kIGR1cCBhcyB3ZWxsLgogCi1jbXNCb29sICAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworY21zQm9vbCAgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7CiAKIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKENvbnRleHRJRCk7CiB9CiAKLS8vIFRoZSBkZWZhdWx0IHJlYWxsb2MgZnVuY3Rpb24uIEFnYWluIGl0IGNoZWNrIGZvciBleHBsb2l0cy4gSWYgUHRyIGlzIE5VTEwsCisvLyBUaGUgZGVmYXVsdCByZWFsbG9jIGZ1bmN0aW9uLiBBZ2FpbiBpdCBjaGVja3MgZm9yIGV4cGxvaXRzLiBJZiBQdHIgaXMgTlVMTCwKIC8vIHJlYWxsb2MgYmVoYXZlcyB0aGUgc2FtZSB3YXkgYXMgbWFsbG9jIGFuZCBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2Ygc2l6ZSBieXRlcy4KIHN0YXRpYwogdm9pZCogX2Ntc1JlYWxsb2NEZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIHNpemUpCkBAIC0xOTYsMjggKzE5Niw3MyBAQAogICAgIHJldHVybiBtZW07CiB9CiAKLS8vIFBvaW50ZXJzIHRvIG1hbGxvYyBhbmQgX2Ntc0ZyZWUgZnVuY3Rpb25zIGluIGN1cnJlbnQgZW52aXJvbm1lbnQKLXN0YXRpYyB2b2lkICogKCogTWFsbG9jUHRyKShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpICAgICAgICAgICAgICAgICAgICAgPSBfY21zTWFsbG9jRGVmYXVsdEZuOwotc3RhdGljIHZvaWQgKiAoKiBNYWxsb2NaZXJvUHRyKShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpICAgICAgICAgICAgICAgICA9IF9jbXNNYWxsb2NaZXJvRGVmYXVsdEZuOwotc3RhdGljIHZvaWQgICAoKiBGcmVlUHRyKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IF9jbXNGcmVlRGVmYXVsdEZuOwotc3RhdGljIHZvaWQgKiAoKiBSZWFsbG9jUHRyKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgTmV3U2l6ZSkgICAgICA9IF9jbXNSZWFsbG9jRGVmYXVsdEZuOwotc3RhdGljIHZvaWQgKiAoKiBDYWxsb2NQdHIpKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbnVtLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk9IF9jbXNDYWxsb2NEZWZhdWx0Rm47Ci1zdGF0aWMgdm9pZCAqICgqIER1cFB0cikoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IHZvaWQqIE9yZywgY21zVUludDMyTnVtYmVyIHNpemUpICAgICAgID0gX2Ntc0R1cERlZmF1bHRGbjsKKworLy8gUG9pbnRlcnMgdG8gbWVtb3J5IG1hbmFnZXIgZnVuY3Rpb25zIGluIENvbnRleHQwCitfY21zTWVtUGx1Z2luQ2h1bmtUeXBlIF9jbXNNZW1QbHVnaW5DaHVuayA9IHsgX2Ntc01hbGxvY0RlZmF1bHRGbiwgX2Ntc01hbGxvY1plcm9EZWZhdWx0Rm4sIF9jbXNGcmVlRGVmYXVsdEZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNSZWFsbG9jRGVmYXVsdEZuLCBfY21zQ2FsbG9jRGVmYXVsdEZuLCAgICBfY21zRHVwRGVmYXVsdEZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKworLy8gUmVzZXQgYW5kIGR1cGxpY2F0ZSBtZW1vcnkgbWFuYWdlcgordm9pZCBfY21zQWxsb2NNZW1QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBfY21zQXNzZXJ0KGN0eCAhPSBOVUxMKTsKKworICAgIGlmIChzcmMgIT0gTlVMTCkgeworCisgICAgICAgIC8vIER1cGxpY2F0ZQorICAgICAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBzcmMgLT5jaHVua3NbTWVtUGx1Z2luXSwgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUpKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgLy8gVG8gcmVzZXQgaXQsIHdlIHVzZSB0aGUgZGVmYXVsdCBhbGxvY2F0b3JzLCB3aGljaCBjYW5ub3QgYmUgb3ZlcnJpZGVuCisgICAgICAgIGN0eCAtPmNodW5rc1tNZW1QbHVnaW5dID0gJmN0eCAtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyOworICAgIH0KK30KKworLy8gQXV4aWxpYXIgdG8gZmlsbCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgZnJvbSBwbHVnaW4gKG9yIGNvbnRleHQgMCBkZWZhdWx0cykKK3ZvaWQgX2Ntc0luc3RhbGxBbGxvY0Z1bmN0aW9ucyhjbXNQbHVnaW5NZW1IYW5kbGVyKiBQbHVnaW4sIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqIHB0cikKK3sKKyAgICBpZiAoUGx1Z2luID09IE5VTEwpIHsKKworICAgICAgICBtZW1jcHkocHRyLCAmX2Ntc01lbVBsdWdpbkNodW5rLCBzaXplb2YoX2Ntc01lbVBsdWdpbkNodW5rKSk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIHB0ciAtPk1hbGxvY1B0ciAgPSBQbHVnaW4gLT4gTWFsbG9jUHRyOworICAgICAgICBwdHIgLT5GcmVlUHRyICAgID0gUGx1Z2luIC0+IEZyZWVQdHI7CisgICAgICAgIHB0ciAtPlJlYWxsb2NQdHIgPSBQbHVnaW4gLT4gUmVhbGxvY1B0cjsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgcmV2ZXJ0IHRvIGRlZmF1bHRzCisgICAgICAgIHB0ciAtPk1hbGxvY1plcm9QdHI9IF9jbXNNYWxsb2NaZXJvRGVmYXVsdEZuOworICAgICAgICBwdHIgLT5DYWxsb2NQdHIgICAgPSBfY21zQ2FsbG9jRGVmYXVsdEZuOworICAgICAgICBwdHIgLT5EdXBQdHIgICAgICAgPSBfY21zRHVwRGVmYXVsdEZuOworCisgICAgICAgIGlmIChQbHVnaW4gLT5NYWxsb2NaZXJvUHRyICE9IE5VTEwpIHB0ciAtPk1hbGxvY1plcm9QdHIgPSBQbHVnaW4gLT4gTWFsbG9jWmVyb1B0cjsKKyAgICAgICAgaWYgKFBsdWdpbiAtPkNhbGxvY1B0ciAhPSBOVUxMKSAgICAgcHRyIC0+Q2FsbG9jUHRyICAgICA9IFBsdWdpbiAtPiBDYWxsb2NQdHI7CisgICAgICAgIGlmIChQbHVnaW4gLT5EdXBQdHIgIT0gTlVMTCkgICAgICAgIHB0ciAtPkR1cFB0ciAgICAgICAgPSBQbHVnaW4gLT4gRHVwUHRyOworCisgICAgfQorfQorCiAKIC8vIFBsdWctaW4gcmVwbGFjZW1lbnQgZW50cnkKLWNtc0Jvb2wgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oY21zUGx1Z2luQmFzZSAqRGF0YSkKK2Ntc0Jvb2wgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UgKkRhdGEpCiB7CiAgICAgY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luID0gKGNtc1BsdWdpbk1lbUhhbmRsZXIqKSBEYXRhOworICAgIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqIHB0cjsKIAotICAgIC8vIE5VTEwgZm9yY2VzIHRvIHJlc2V0IHRvIGRlZmF1bHRzCisgICAgLy8gTlVMTCBmb3JjZXMgdG8gcmVzZXQgdG8gZGVmYXVsdHMuIEluIHRoaXMgc3BlY2lhbCBjYXNlLCB0aGUgZGVmYXVsdHMgYXJlIHN0b3JlZCBpbiB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCisgICAgLy8gUmVtYWluaW5nIHBsdWctaW5zIGRvZXMgTk9UIGhhdmUgYW55IGNvcHkgaW4gdGhlIGNvbnRleHQgc3RydWN0dXJlLCBidXQgdGhpcyBpcyBzb21laG93IHNwZWNpYWwgYXMgdGhlCisgICAgLy8gY29udGV4dCBpbnRlcm5hbCBkYXRhIHNob3VsZCBiZSBtYWxsb2NlJ2QgYnkgdXNpbmcgdGhvc2UgZnVuY3Rpb25zLgogICAgIGlmIChEYXRhID09IE5VTEwpIHsKIAotICAgICAgICBNYWxsb2NQdHIgICAgPSBfY21zTWFsbG9jRGVmYXVsdEZuOwotICAgICAgICBNYWxsb2NaZXJvUHRyPSBfY21zTWFsbG9jWmVyb0RlZmF1bHRGbjsKLSAgICAgICAgRnJlZVB0ciAgICAgID0gX2Ntc0ZyZWVEZWZhdWx0Rm47Ci0gICAgICAgIFJlYWxsb2NQdHIgICA9IF9jbXNSZWFsbG9jRGVmYXVsdEZuOwotICAgICAgICBDYWxsb2NQdHIgICAgPSBfY21zQ2FsbG9jRGVmYXVsdEZuOwotICAgICAgICBEdXBQdHIgICAgICAgPSBfY21zRHVwRGVmYXVsdEZuOworICAgICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCA9ICggc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCopIENvbnRleHRJRDsKKworICAgICAgIC8vIFJldHVybiB0byB0aGUgZGVmYXVsdCBhbGxvY2F0b3JzCisgICAgICAgIGlmIChDb250ZXh0SUQgIT0gTlVMTCkgeworICAgICAgICAgICAgY3R4LT5jaHVua3NbTWVtUGx1Z2luXSA9ICh2b2lkKikgJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCkBAIC0yMjcsNTEgKzI3Miw1NiBAQAogICAgICAgICBQbHVnaW4gLT4gUmVhbGxvY1B0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKICAgICAvLyBTZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb25zCi0gICAgTWFsbG9jUHRyICA9IFBsdWdpbiAtPiBNYWxsb2NQdHI7Ci0gICAgRnJlZVB0ciAgICA9IFBsdWdpbiAtPiBGcmVlUHRyOwotICAgIFJlYWxsb2NQdHIgPSBQbHVnaW4gLT4gUmVhbGxvY1B0cjsKKyAgICBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOworICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKFBsdWdpbiAtPk1hbGxvY1plcm9QdHIgIT0gTlVMTCkgTWFsbG9jWmVyb1B0ciA9IFBsdWdpbiAtPk1hbGxvY1plcm9QdHI7Ci0gICAgaWYgKFBsdWdpbiAtPkNhbGxvY1B0ciAhPSBOVUxMKSAgICAgQ2FsbG9jUHRyICAgICA9IFBsdWdpbiAtPiBDYWxsb2NQdHI7Ci0gICAgaWYgKFBsdWdpbiAtPkR1cFB0ciAhPSBOVUxMKSAgICAgICAgRHVwUHRyICAgICAgICA9IFBsdWdpbiAtPiBEdXBQdHI7Ci0KKyAgICBfY21zSW5zdGFsbEFsbG9jRnVuY3Rpb25zKFBsdWdpbiwgcHRyKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIAogLy8gR2VuZXJpYyBhbGxvY2F0ZQogdm9pZCogQ01TRVhQT1JUIF9jbXNNYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKQogewotICAgIHJldHVybiBNYWxsb2NQdHIoQ29udGV4dElELCBzaXplKTsKKyAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOworICAgIHJldHVybiBwdHIgLT5NYWxsb2NQdHIoQ29udGV4dElELCBzaXplKTsKIH0KIAogLy8gR2VuZXJpYyBhbGxvY2F0ZSAmIHplcm8KIHZvaWQqIENNU0VYUE9SVCBfY21zTWFsbG9jWmVybyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCiB7Ci0gICAgcmV0dXJuIE1hbGxvY1plcm9QdHIoQ29udGV4dElELCBzaXplKTsKKyAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOworICAgIHJldHVybiBwdHItPk1hbGxvY1plcm9QdHIoQ29udGV4dElELCBzaXplKTsKIH0KIAogLy8gR2VuZXJpYyBjYWxsb2MKIHZvaWQqIENNU0VYUE9SVCBfY21zQ2FsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbnVtLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKIHsKLSAgICByZXR1cm4gQ2FsbG9jUHRyKENvbnRleHRJRCwgbnVtLCBzaXplKTsKKyAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOworICAgIHJldHVybiBwdHItPkNhbGxvY1B0cihDb250ZXh0SUQsIG51bSwgc2l6ZSk7CiB9CiAKIC8vIEdlbmVyaWMgcmVhbGxvY2F0ZQogdm9pZCogQ01TRVhQT1JUIF9jbXNSZWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBzaXplKQogewotICAgIHJldHVybiBSZWFsbG9jUHRyKENvbnRleHRJRCwgUHRyLCBzaXplKTsKKyAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOworICAgIHJldHVybiBwdHItPlJlYWxsb2NQdHIoQ29udGV4dElELCBQdHIsIHNpemUpOwogfQogCiAvLyBHZW5lcmljIGZyZWUgbWVtb3J5CiB2b2lkIENNU0VYUE9SVCBfY21zRnJlZShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyKQogewotICAgIGlmIChQdHIgIT0gTlVMTCkgRnJlZVB0cihDb250ZXh0SUQsIFB0cik7CisgICAgaWYgKFB0ciAhPSBOVUxMKSB7CisgICAgICAgIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqIHB0ciA9IChfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE1lbVBsdWdpbik7CisgICAgICAgIHB0ciAtPkZyZWVQdHIoQ29udGV4dElELCBQdHIpOworICAgIH0KIH0KIAogLy8gR2VuZXJpYyBibG9jayBkdXBsaWNhdGlvbgogdm9pZCogQ01TRVhQT1JUIF9jbXNEdXBNZW0oY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IHZvaWQqIE9yZywgY21zVUludDMyTnVtYmVyIHNpemUpCiB7Ci0gICAgcmV0dXJuIER1cFB0cihDb250ZXh0SUQsIE9yZywgc2l6ZSk7CisgICAgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTWVtUGx1Z2luKTsKKyAgICByZXR1cm4gcHRyIC0+RHVwUHRyKENvbnRleHRJRCwgT3JnLCBzaXplKTsKIH0KIAogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM4MCw2ICs0MzAsMjYgQEAKICAgICByZXR1cm4gKHZvaWQqKSBwdHI7CiB9CiAKKy8vIER1cGxpY2F0ZSBpbiBwb29sCit2b2lkKiBfY21zU3ViQWxsb2NEdXAoX2Ntc1N1YkFsbG9jYXRvciogcywgY29uc3Qgdm9pZCAqcHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICB2b2lkICpOZXdQdHI7CisKKyAgICAvLyBEdXAgb2YgbnVsbCBwb2ludGVyIGlzIGFsc28gTlVMTAorICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBOZXdQdHIgPSBfY21zU3ViQWxsb2Mocywgc2l6ZSk7CisKKyAgICBpZiAocHRyICE9IE5VTEwgJiYgTmV3UHRyICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KE5ld1B0ciwgcHRyLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gTmV3UHRyOworfQorCisKKwogLy8gRXJyb3IgbG9nZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogLy8gVGhlcmUgaXMgbm8gZXJyb3IgaGFuZGxpbmcgYXQgYWxsLiBXaGVuIGEgZnVudGlvbiBmYWlscywgaXQgcmV0dXJucyBwcm9wZXIgdmFsdWUuCkBAIC00MDEsOCArNDcxLDI2IEBACiAvLyBUaGlzIGlzIG91ciBkZWZhdWx0IGxvZyBlcnJvcgogc3RhdGljIHZvaWQgRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgRXJyb3JDb2RlLCBjb25zdCBjaGFyICpUZXh0KTsKIAotLy8gVGhlIGN1cnJlbnQgaGFuZGxlciBpbiBhY3R1YWwgZW52aXJvbm1lbnQKLXN0YXRpYyBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBMb2dFcnJvckhhbmRsZXIgICA9IERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbjsKKy8vIENvbnRleHQwIHN0b3JhZ2UsIHdoaWNoIGlzIGdsb2JhbAorX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlIF9jbXNMb2dFcnJvckNodW5rID0geyBEZWZhdWx0TG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gfTsKKworLy8gQWxsb2NhdGVzIGFuZCBpbml0cyBlcnJvciBsb2dnZXIgY29udGFpbmVyIGZvciBhIGdpdmVuIGNvbnRleHQuIElmIHNyYyBpcyBOVUxMLCBvbmx5IGluaXRpYWxpemVzIHRoZSB2YWx1ZQorLy8gdG8gdGhlIGRlZmF1bHQuIE90aGVyd2lzZSwgaXQgZHVwbGljYXRlcyB0aGUgdmFsdWUuIFRoZSBpbnRlcmZhY2UgaXMgc3RhbmRhcmQgYWNyb3NzIGFsbCBjb250ZXh0IGNsaWVudHMKK3ZvaWQgX2Ntc0FsbG9jTG9nRXJyb3JDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIHN0YXRpYyBfY21zTG9nRXJyb3JDaHVua1R5cGUgTG9nRXJyb3JDaHVuayA9IHsgRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIH07CisgICAgdm9pZCogZnJvbTsKKworICAgICBpZiAoc3JjICE9IE5VTEwpIHsKKyAgICAgICAgZnJvbSA9IHNyYyAtPmNodW5rc1tMb2dnZXJdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICBmcm9tID0gJkxvZ0Vycm9yQ2h1bms7CisgICAgfQorCisgICAgY3R4IC0+Y2h1bmtzW0xvZ2dlcl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZnJvbSwgc2l6ZW9mKF9jbXNMb2dFcnJvckNodW5rVHlwZSkpOworfQogCiAvLyBUaGUgZGVmYXVsdCBlcnJvciBsb2dnZXIgZG9lcyBub3RoaW5nLgogc3RhdGljCkBAIC00MTYsMTMgKzUwNCwyNCBAQAogICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFRleHQpOwogfQogCi0vLyBDaGFuZ2UgbG9nIGVycm9yCisvLyBDaGFuZ2UgbG9nIGVycm9yLCBjb250ZXh0IGJhc2VkCit2b2lkIENNU0VYUE9SVCBjbXNTZXRMb2dFcnJvckhhbmRsZXJUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0xvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIEZuKQoreworICAgIF9jbXNMb2dFcnJvckNodW5rVHlwZSogbGhnID0gKF9jbXNMb2dFcnJvckNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBMb2dnZXIpOworCisgICAgaWYgKGxoZyAhPSBOVUxMKSB7CisKKyAgICAgICAgaWYgKEZuID09IE5VTEwpCisgICAgICAgICAgICBsaGcgLT4gTG9nRXJyb3JIYW5kbGVyID0gRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaGcgLT4gTG9nRXJyb3JIYW5kbGVyID0gRm47CisgICAgfQorfQorCisvLyBDaGFuZ2UgbG9nIGVycm9yLCBsZWdhY3kKIHZvaWQgQ01TRVhQT1JUIGNtc1NldExvZ0Vycm9ySGFuZGxlcihjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBGbikKIHsKLSAgICBpZiAoRm4gPT0gTlVMTCkKLSAgICAgICAgTG9nRXJyb3JIYW5kbGVyID0gRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uOwotICAgIGVsc2UKLSAgICAgICAgTG9nRXJyb3JIYW5kbGVyID0gRm47CisgICAgY21zU2V0TG9nRXJyb3JIYW5kbGVyVEhSKE5VTEwsIEZuKTsKIH0KIAogLy8gTG9nIGFuIGVycm9yCkBAIC00MzEsMTMgKzUzMCwxOCBAQAogewogICAgIHZhX2xpc3QgYXJnczsKICAgICBjaGFyIEJ1ZmZlcltNQVhfRVJST1JfTUVTU0FHRV9MRU5dOworICAgIF9jbXNMb2dFcnJvckNodW5rVHlwZSogbGhnOworCiAKICAgICB2YV9zdGFydChhcmdzLCBFcnJvclRleHQpOwogICAgIHZzbnByaW50ZihCdWZmZXIsIE1BWF9FUlJPUl9NRVNTQUdFX0xFTi0xLCBFcnJvclRleHQsIGFyZ3MpOwogICAgIHZhX2VuZChhcmdzKTsKIAotICAgIC8vIENhbGwgaGFuZGxlcgotICAgIExvZ0Vycm9ySGFuZGxlcihDb250ZXh0SUQsIEVycm9yQ29kZSwgQnVmZmVyKTsKKyAgICAvLyBDaGVjayBmb3IgdGhlIGNvbnRleHQsIGlmIHNwZWNpZmllZCBnbyB0aGVyZS4gSWYgbm90LCBnbyBmb3IgdGhlIGdsb2JhbAorICAgIGxoZyA9IChfY21zTG9nRXJyb3JDaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTG9nZ2VyKTsKKyAgICBpZiAobGhnIC0+TG9nRXJyb3JIYW5kbGVyKSB7CisgICAgICAgIGxoZyAtPkxvZ0Vycm9ySGFuZGxlcihDb250ZXh0SUQsIEVycm9yQ29kZSwgQnVmZmVyKTsKKyAgICB9CiB9CiAKIC8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgc2lnbmF0dXJlcwpAQCAtNDU1LDMgKzU1OSwxMjUgQEAKICAgICBTdHJpbmdbNF0gPSAwOwogfQogCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdGljCit2b2lkKiBkZWZNdHhDcmVhdGUoY21zQ29udGV4dCBpZCkKK3sKKyAgICBfY21zTXV0ZXgqIHB0cl9tdXRleCA9IChfY21zTXV0ZXgqKSBfY21zTWFsbG9jKGlkLCBzaXplb2YoX2Ntc011dGV4KSk7CisgICAgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShwdHJfbXV0ZXgpOworICAgIHJldHVybiAodm9pZCopIHB0cl9tdXRleDsKK30KKworc3RhdGljCit2b2lkIGRlZk10eERlc3Ryb3koY21zQ29udGV4dCBpZCwgdm9pZCogbXR4KQoreworICAgIF9jbXNEZXN0cm95TXV0ZXhQcmltaXRpdmUoKF9jbXNNdXRleCAqKSBtdHgpOworICAgIF9jbXNGcmVlKGlkLCBtdHgpOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgZGVmTXR4TG9jayhjbXNDb250ZXh0IGlkLCB2b2lkKiBtdHgpCit7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpZCk7CisgICAgcmV0dXJuIF9jbXNMb2NrUHJpbWl0aXZlKChfY21zTXV0ZXggKikgbXR4KSA9PSAwOworfQorCitzdGF0aWMKK3ZvaWQgZGVmTXR4VW5sb2NrKGNtc0NvbnRleHQgaWQsIHZvaWQqIG10eCkKK3sKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGlkKTsKKyAgICBfY21zVW5sb2NrUHJpbWl0aXZlKChfY21zTXV0ZXggKikgbXR4KTsKK30KKworCisKKy8vIFBvaW50ZXJzIHRvIG1lbW9yeSBtYW5hZ2VyIGZ1bmN0aW9ucyBpbiBDb250ZXh0MAorX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlIF9jbXNNdXRleFBsdWdpbkNodW5rID0geyBkZWZNdHhDcmVhdGUsIGRlZk10eERlc3Ryb3ksIGRlZk10eExvY2ssIGRlZk10eFVubG9jayB9OworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBtdXRleCBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY011dGV4UGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBzdGF0aWMgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlIE11dGV4Q2h1bmsgPSB7ZGVmTXR4Q3JlYXRlLCBkZWZNdHhEZXN0cm95LCBkZWZNdHhMb2NrLCBkZWZNdHhVbmxvY2sgfTsKKyAgICB2b2lkKiBmcm9tOworCisgICAgIGlmIChzcmMgIT0gTlVMTCkgeworICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW011dGV4UGx1Z2luXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgZnJvbSA9ICZNdXRleENodW5rOworICAgIH0KKworICAgIGN0eCAtPmNodW5rc1tNdXRleFBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZnJvbSwgc2l6ZW9mKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSkpOworfQorCisvLyBSZWdpc3RlciBuZXcgd2F5cyB0byB0cmFuc2Zvcm0KK2Ntc0Jvb2wgIF9jbXNSZWdpc3Rlck11dGV4UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBEYXRhKQoreworICAgIGNtc1BsdWdpbk11dGV4KiBQbHVnaW4gPSAoY21zUGx1Z2luTXV0ZXgqKSBEYXRhOworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTXV0ZXhQbHVnaW4pOworCisgICAgaWYgKERhdGEgPT0gTlVMTCkgeworCisgICAgICAgIC8vIE5vIGxvY2sgcm91dGluZXMKKyAgICAgICAgY3R4LT5DcmVhdGVNdXRleFB0ciA9IE5VTEw7CisgICAgICAgIGN0eC0+RGVzdHJveU11dGV4UHRyID0gTlVMTDsKKyAgICAgICAgY3R4LT5Mb2NrTXV0ZXhQdHIgPSBOVUxMOworICAgICAgICBjdHggLT5VbmxvY2tNdXRleFB0ciA9IE5VTEw7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8vIEZhY3RvcnkgY2FsbGJhY2sgaXMgcmVxdWlyZWQKKyAgICBpZiAoUGx1Z2luIC0+Q3JlYXRlTXV0ZXhQdHIgPT0gTlVMTCB8fCBQbHVnaW4gLT5EZXN0cm95TXV0ZXhQdHIgPT0gTlVMTCB8fAorICAgICAgICBQbHVnaW4gLT5Mb2NrTXV0ZXhQdHIgPT0gTlVMTCB8fCBQbHVnaW4gLT5VbmxvY2tNdXRleFB0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKworICAgIGN0eC0+Q3JlYXRlTXV0ZXhQdHIgID0gUGx1Z2luLT5DcmVhdGVNdXRleFB0cjsKKyAgICBjdHgtPkRlc3Ryb3lNdXRleFB0ciA9IFBsdWdpbiAtPkRlc3Ryb3lNdXRleFB0cjsKKyAgICBjdHggLT5Mb2NrTXV0ZXhQdHIgICA9IFBsdWdpbiAtPkxvY2tNdXRleFB0cjsKKyAgICBjdHggLT5VbmxvY2tNdXRleFB0ciA9IFBsdWdpbiAtPlVubG9ja011dGV4UHRyOworCisgICAgLy8gQWxsIGlzIG9rCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIEdlbmVyaWMgTXV0ZXggZm5zCit2b2lkKiBDTVNFWFBPUlQgX2Ntc0NyZWF0ZU11dGV4KGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+Q3JlYXRlTXV0ZXhQdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gcHRyIC0+Q3JlYXRlTXV0ZXhQdHIoQ29udGV4dElEKTsKK30KKwordm9pZCBDTVNFWFBPUlQgX2Ntc0Rlc3Ryb3lNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+RGVzdHJveU11dGV4UHRyICE9IE5VTEwpIHsKKworICAgICAgICBwdHIgLT5EZXN0cm95TXV0ZXhQdHIoQ29udGV4dElELCBtdHgpOworICAgIH0KK30KKworY21zQm9vbCBDTVNFWFBPUlQgX2Ntc0xvY2tNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+TG9ja011dGV4UHRyID09IE5VTEwpIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIHB0ciAtPkxvY2tNdXRleFB0cihDb250ZXh0SUQsIG10eCk7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIF9jbXNVbmxvY2tNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+VW5sb2NrTXV0ZXhQdHIgIT0gTlVMTCkgeworCisgICAgICAgIHB0ciAtPlVubG9ja011dGV4UHRyKENvbnRleHRJRCwgbXR4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zZ2FtbWEuYyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnYW1tYS5jCmluZGV4IDc5YWZmYjAuLmU2OGYyNTggMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnYW1tYS5jCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnYW1tYS5jCkBAIC04Miw3ICs4Miw2IEBACiAKIH0gX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uOwogCi0KIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgKGJ1aWx0LWluKSBldmFsdWF0b3IKIHN0YXRpYyBjbXNGbG9hdDY0TnVtYmVyIERlZmF1bHRFdmFsUGFyYW1ldHJpY0ZuKGNtc0ludDMyTnVtYmVyIFR5cGUsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zW10sIGNtc0Zsb2F0NjROdW1iZXIgUik7CiAKQEAgLTk1LDIyICs5NCw3NyBAQAogICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgaW4gY2hhaW4KIH07CiAKKy8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CitzdGF0aWMKK3ZvaWQgRHVwUGx1Z2luQ3VydmVzTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgIF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUgbmV3SGVhZCA9IHsgTlVMTCB9OworICAgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKiAgZW50cnk7CisgICBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24qICBBbnRlcmlvciA9IE5VTEw7CisgICBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKiBoZWFkID0gKF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tDdXJ2ZXNQbHVnaW5dOworCisgICAgX2Ntc0Fzc2VydChoZWFkICE9IE5VTEwpOworCisgICAgLy8gV2FsayB0aGUgbGlzdCBjb3B5aW5nIGFsbCBub2RlcworICAgZm9yIChlbnRyeSA9IGhlYWQtPlBhcmFtZXRyaWNDdXJ2ZXM7CisgICAgICAgIGVudHJ5ICE9IE5VTEw7CisgICAgICAgIGVudHJ5ID0gZW50cnkgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiAqbmV3RW50cnkgPSAoIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24pKTsKKworICAgICAgICAgICAgaWYgKG5ld0VudHJ5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIGxpbmtlZCBsaXN0IG9yZGVyLCBzbyB0aGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kKKyAgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOworICAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBuZXdFbnRyeTsKKworICAgICAgICAgICAgQW50ZXJpb3IgPSBuZXdFbnRyeTsKKworICAgICAgICAgICAgaWYgKG5ld0hlYWQuUGFyYW1ldHJpY0N1cnZlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIG5ld0hlYWQuUGFyYW1ldHJpY0N1cnZlcyA9IG5ld0VudHJ5OworICAgIH0KKworICBjdHggLT5jaHVua3NbQ3VydmVzUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSkpOworfQorCisvLyBUaGUgYWxsb2NhdG9yIGhhdmUgdG8gZm9sbG93IHRoZSBjaGFpbgordm9pZCBfY21zQWxsb2NDdXJ2ZXNQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBfY21zQXNzZXJ0KGN0eCAhPSBOVUxMKTsKKworICAgIGlmIChzcmMgIT0gTlVMTCkgeworCisgICAgICAgIC8vIENvcHkgYWxsIGxpbmtlZCBsaXN0CisgICAgICAgRHVwUGx1Z2luQ3VydmVzTGlzdChjdHgsIHNyYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSBDdXJ2ZXNQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworICAgICAgICBjdHggLT5jaHVua3NbQ3VydmVzUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmQ3VydmVzUGx1Z2luQ2h1bmssIHNpemVvZihfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKSk7CisgICAgfQorfQorCisKIC8vIFRoZSBsaW5rZWQgbGlzdCBoZWFkCi1zdGF0aWMgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKiBQYXJhbWV0cmljQ3VydmVzID0gJkRlZmF1bHRDdXJ2ZXM7CitfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlIF9jbXNDdXJ2ZXNQbHVnaW5DaHVuayA9IHsgTlVMTCB9OwogCiAvLyBBcyBhIHdheSB0byBpbnN0YWxsIG5ldyBwYXJhbWV0cmljIGN1cnZlcwotY21zQm9vbCBfY21zUmVnaXN0ZXJQYXJhbWV0cmljQ3VydmVzUGx1Z2luKGNtc0NvbnRleHQgaWQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCitjbXNCb29sIF9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCiB7CisgICAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEN1cnZlc1BsdWdpbik7CiAgICAgY21zUGx1Z2luUGFyYW1ldHJpY0N1cnZlcyogUGx1Z2luID0gKGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZXMqKSBEYXRhOwogICAgIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiogZmw7CiAKICAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CiAKLSAgICAgICAgICBQYXJhbWV0cmljQ3VydmVzID0gICZEZWZhdWx0Q3VydmVzOworICAgICAgICAgIGN0eCAtPiBQYXJhbWV0cmljQ3VydmVzID0gIE5VTEw7CiAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgZmwgPSAoX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKikgX2Ntc1BsdWdpbk1hbGxvYyhpZCwgc2l6ZW9mKF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbikpOworICAgIGZsID0gKF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiopIF9jbXNQbHVnaW5NYWxsb2MoQ29udGV4dElELCBzaXplb2YoX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKSk7CiAgICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgIC8vIENvcHkgdGhlIHBhcmFtZXRlcnMKQEAgLTEyNiw4ICsxODAsOCBAQAogICAgIG1lbW1vdmUoZmwtPlBhcmFtZXRlckNvdW50LCBQbHVnaW4gLT5QYXJhbWV0ZXJDb3VudCwgIGZsLT5uRnVuY3Rpb25zICogc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOwogCiAgICAgLy8gS2VlcCBsaW5rZWQgbGlzdAotICAgIGZsIC0+TmV4dCA9IFBhcmFtZXRyaWNDdXJ2ZXM7Ci0gICAgUGFyYW1ldHJpY0N1cnZlcyA9IGZsOworICAgIGZsIC0+TmV4dCA9IGN0eC0+UGFyYW1ldHJpY0N1cnZlczsKKyAgICBjdHgtPlBhcmFtZXRyaWNDdXJ2ZXMgPSBmbDsKIAogICAgIC8vIEFsbCBpcyBvawogICAgIHJldHVybiBUUlVFOwpAQCAtMTQ5LDEyICsyMDMsMjQgQEAKIAogLy8gU2VhcmNoIGZvciB0aGUgY29sbGVjdGlvbiB3aGljaCBjb250YWlucyBhIHNwZWNpZmljIHR5cGUKIHN0YXRpYwotX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uICpHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoaW50IFR5cGUsIGludCogaW5kZXgpCitfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24gKkdldFBhcmFtZXRyaWNDdXJ2ZUJ5VHlwZShjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IFR5cGUsIGludCogaW5kZXgpCiB7CiAgICAgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKiBjOwogICAgIGludCBQb3NpdGlvbjsKKyAgICBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgQ3VydmVzUGx1Z2luKTsKIAotICAgIGZvciAoYyA9IFBhcmFtZXRyaWNDdXJ2ZXM7IGMgIT0gTlVMTDsgYyA9IGMgLT5OZXh0KSB7CisgICAgZm9yIChjID0gY3R4LT5QYXJhbWV0cmljQ3VydmVzOyBjICE9IE5VTEw7IGMgPSBjIC0+TmV4dCkgeworCisgICAgICAgIFBvc2l0aW9uID0gSXNJblNldChUeXBlLCBjKTsKKworICAgICAgICBpZiAoUG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICppbmRleCA9IFBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgbm9uZSBmb3VuZCwgcmV2ZXJ0IGZvciBkZWZhdWx0cworICAgIGZvciAoYyA9ICZEZWZhdWx0Q3VydmVzOyBjICE9IE5VTEw7IGMgPSBjIC0+TmV4dCkgewogCiAgICAgICAgIFBvc2l0aW9uID0gSXNJblNldChUeXBlLCBjKTsKIApAQCAtMjUxLDcgKzMxNyw3IEBACiAgICAgICAgICAgICAgICAgcCAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPSBOVUxMOwogCiAKLSAgICAgICAgICAgIGMgPSBHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoU2VnbWVudHNbaV0uVHlwZSwgTlVMTCk7CisgICAgICAgICAgICBjID0gR2V0UGFyYW1ldHJpY0N1cnZlQnlUeXBlKENvbnRleHRJRCwgU2VnbWVudHNbaV0uVHlwZSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAoYyAhPSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBwIC0+RXZhbHNbaV0gPSBjIC0+RXZhbHVhdG9yOwogICAgICAgICB9CkBAIC02NzcsMTIgKzc0MywxMiBAQAogICAgIGNtc0N1cnZlU2VnbWVudCBTZWcwOwogICAgIGludCBQb3MgPSAwOwogICAgIGNtc1VJbnQzMk51bWJlciBzaXplOwotICAgIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiogYyA9IEdldFBhcmFtZXRyaWNDdXJ2ZUJ5VHlwZShUeXBlLCAmUG9zKTsKKyAgICBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24qIGMgPSBHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoQ29udGV4dElELCBUeXBlLCAmUG9zKTsKIAogICAgIF9jbXNBc3NlcnQoUGFyYW1zICE9IE5VTEwpOwogCiAgICAgaWYgKGMgPT0gTlVMTCkgewotICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIkludmFsaWQgcGFyYW1ldHJpYyBjdXJ2ZSB0eXBlICVkIiwgVHlwZSk7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJJbnZhbGlkIHBhcmFtZXRyaWMgY3VydmUgdHlwZSAlZCIsIFR5cGUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTg3Miw3ICs5MzgsMTAgQEAKICAgICBfY21zQXNzZXJ0KEluQ3VydmUgIT0gTlVMTCk7CiAKICAgICAvLyBUcnkgdG8gcmV2ZXJzZSBpdCBhbmFseXRpY2FsbHkgd2hhdGV2ZXIgcG9zc2libGUKLSAgICBpZiAoSW5DdXJ2ZSAtPm5TZWdtZW50cyA9PSAxICYmIEluQ3VydmUgLT5TZWdtZW50c1swXS5UeXBlID4gMCAmJiBJbkN1cnZlIC0+IFNlZ21lbnRzWzBdLlR5cGUgPD0gNSkgeworCisgICAgaWYgKEluQ3VydmUgLT5uU2VnbWVudHMgPT0gMSAmJiBJbkN1cnZlIC0+U2VnbWVudHNbMF0uVHlwZSA+IDAgJiYKKyAgICAgICAgLyogSW5DdXJ2ZSAtPiBTZWdtZW50c1swXS5UeXBlIDw9IDUgKi8KKyAgICAgICAgR2V0UGFyYW1ldHJpY0N1cnZlQnlUeXBlKEluQ3VydmUgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwgSW5DdXJ2ZSAtPlNlZ21lbnRzWzBdLlR5cGUsIE5VTEwpICE9IE5VTEwpIHsKIAogICAgICAgICByZXR1cm4gY21zQnVpbGRQYXJhbWV0cmljVG9uZUN1cnZlKEluQ3VydmUgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oSW5DdXJ2ZSAtPiBTZWdtZW50c1swXS5UeXBlKSwKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnbXQuYyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnbXQuYwppbmRleCA4YWNlMjAzLi4wYmU5MTczIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zZ210LmMKKysrIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2dtdC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAogICAgIG91dCA9IENvbXB1dGVLVG9Mc3RhcihDb250ZXh0SUQsIG5Qb2ludHMsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50cyArIChuUHJvZmlsZXMgLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHJvZmlsZXMgKyAoblByb2ZpbGVzIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQcm9maWxlcyBbblByb2ZpbGVzIC0gMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBDICsgKG5Qcm9maWxlcyAtIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0YXRpb25TdGF0ZXMgKyAoblByb2ZpbGVzIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW50cnAuYyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbnRycC5jCmluZGV4IGFkOTcxYjUuLmU1N2U2ZWEgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbnRycC5jCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbnRycC5jCkBAIC02MiwzMSArNjIsNTcgQEAKIHN0YXRpYyBjbXNJbnRlcnBGdW5jdGlvbiBEZWZhdWx0SW50ZXJwb2xhdG9yc0ZhY3RvcnkoY21zVUludDMyTnVtYmVyIG5JbnB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgbk91dHB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CiAKIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZmFjdG9yeQotc3RhdGljIGNtc0ludGVycEZuRmFjdG9yeSBJbnRlcnBvbGF0b3JzID0gRGVmYXVsdEludGVycG9sYXRvcnNGYWN0b3J5OworX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSBfY21zSW50ZXJwUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKworLy8gVGhlIGludGVycG9sYXRpb24gcGx1Zy1pbiBtZW1vcnkgY2h1bmsgYWxsb2NhdG9yL2R1cAordm9pZCBfY21zQWxsb2NJbnRlcnBQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICB2b2lkKiBmcm9tOworCisgICAgX2Ntc0Fzc2VydChjdHggIT0gTlVMTCk7CisKKyAgICBpZiAoc3JjICE9IE5VTEwpIHsKKyAgICAgICAgZnJvbSA9IHNyYyAtPmNodW5rc1tJbnRlcnBQbHVnaW5dOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RhdGljIF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUgSW50ZXJwUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKworICAgICAgICBmcm9tID0gJkludGVycFBsdWdpbkNodW5rOworICAgIH0KKworICAgIF9jbXNBc3NlcnQoZnJvbSAhPSBOVUxMKTsKKyAgICBjdHggLT5jaHVua3NbSW50ZXJwUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSkpOworfQogCiAKIC8vIE1haW4gcGx1Zy1pbiBlbnRyeQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGNtc1BsdWdpbkJhc2UqIERhdGEpCitjbXNCb29sICBfY21zUmVnaXN0ZXJJbnRlcnBQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCiB7CiAgICAgY21zUGx1Z2luSW50ZXJwb2xhdGlvbiogUGx1Z2luID0gKGNtc1BsdWdpbkludGVycG9sYXRpb24qKSBEYXRhOworICAgIF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUqIHB0ciA9IChfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEludGVycFBsdWdpbik7CiAKICAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CiAKLSAgICAgICAgSW50ZXJwb2xhdG9ycyA9IERlZmF1bHRJbnRlcnBvbGF0b3JzRmFjdG9yeTsKKyAgICAgICAgcHRyIC0+SW50ZXJwb2xhdG9ycyA9IE5VTEw7CiAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAogICAgIC8vIFNldCByZXBsYWNlbWVudCBmdW5jdGlvbnMKLSAgICBJbnRlcnBvbGF0b3JzID0gUGx1Z2luIC0+SW50ZXJwb2xhdG9yc0ZhY3Rvcnk7CisgICAgcHRyIC0+SW50ZXJwb2xhdG9ycyA9IFBsdWdpbiAtPkludGVycG9sYXRvcnNGYWN0b3J5OwogICAgIHJldHVybiBUUlVFOwogfQogCiAKIC8vIFNldCB0aGUgaW50ZXJwb2xhdGlvbiBtZXRob2QKLWNtc0Jvb2wgX2Ntc1NldEludGVycG9sYXRpb25Sb3V0aW5lKGNtc0ludGVycFBhcmFtcyogcCkKK2Ntc0Jvb2wgX2Ntc1NldEludGVycG9sYXRpb25Sb3V0aW5lKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJbnRlcnBQYXJhbXMqIHApCiB7Ci0gICAgLy8gSW52b2tlIGZhY3RvcnksIHBvc3NpYmx5IGluIHRoZSBQbHVnLWluCi0gICAgcCAtPkludGVycG9sYXRpb24gPSBJbnRlcnBvbGF0b3JzKHAgLT4gbklucHV0cywgcCAtPm5PdXRwdXRzLCBwIC0+ZHdGbGFncyk7CisgICAgX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgSW50ZXJwUGx1Z2luKTsKKworICAgIHAgLT5JbnRlcnBvbGF0aW9uLkxlcnAxNiA9IE5VTEw7CisKKyAgIC8vIEludm9rZSBmYWN0b3J5LCBwb3NzaWJseSBpbiB0aGUgUGx1Zy1pbgorICAgIGlmIChwdHIgLT5JbnRlcnBvbGF0b3JzICE9IE5VTEwpCisgICAgICAgIHAgLT5JbnRlcnBvbGF0aW9uID0gcHRyLT5JbnRlcnBvbGF0b3JzKHAgLT4gbklucHV0cywgcCAtPm5PdXRwdXRzLCBwIC0+ZHdGbGFncyk7CiAKICAgICAvLyBJZiB1bnN1cHBvcnRlZCBieSB0aGUgcGx1Zy1pbiwgZ28gZm9yIHRoZSBMaXR0bGVDTVMgZGVmYXVsdC4KICAgICAvLyBJZiBoYXBwZW5zIG9ubHkgaWYgYW4gZXh0ZXJuIHBsdWctaW4gaXMgYmVpbmcgdXNlZApAQCAtOTcsNiArMTIzLDcgQEAKICAgICBpZiAocCAtPkludGVycG9sYXRpb24uTGVycDE2ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTQxLDcgKzE2OCw3IEBACiAgICAgICAgIHAgLT5vcHRhW2ldID0gcCAtPm9wdGFbaS0xXSAqIG5TYW1wbGVzW0lucHV0Q2hhbi1pXTsKIAogCi0gICAgaWYgKCFfY21zU2V0SW50ZXJwb2xhdGlvblJvdXRpbmUocCkpIHsKKyAgICBpZiAoIV9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShDb250ZXh0SUQsIHApKSB7CiAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiAoJWQtPiVkIGNoYW5uZWxzKSIsIElucHV0Q2hhbiwgT3V0cHV0Q2hhbik7CiAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgcCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2lvMC5jIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2lvMC5jCmluZGV4IDhmNDIxYzIuLmQ0ZGMxYjAgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbzAuYworKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW8wLmMKQEAgLTIyOSwxNSArMjI5LDE0IEBACiAgICAgaWYgKFJlc0RhdGEgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOyAvLyBIb3VzZWtlZXBpbmcKIAogICAgIC8vIENoZWNrIGZvciBhdmFpbGFibGUgc3BhY2UuIENsaXAuCi0gICAgaWYgKGlvaGFuZGxlciAtPlVzZWRTcGFjZSArIHNpemUgPiBSZXNEYXRhLT5TaXplKSB7Ci0gICAgICAgIHNpemUgPSBSZXNEYXRhIC0+U2l6ZSAtIGlvaGFuZGxlciAtPlVzZWRTcGFjZTsKKyAgICBpZiAoUmVzRGF0YS0+UG9pbnRlciArIHNpemUgPiBSZXNEYXRhLT5TaXplKSB7CisgICAgICAgIHNpemUgPSBSZXNEYXRhIC0+U2l6ZSAtIFJlc0RhdGEtPlBvaW50ZXI7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIFRSVUU7ICAgICAvLyBXcml0ZSB6ZXJvIGJ5dGVzIGlzIG9rLCBidXQgZG9lcyBub3RoaW5nCiAKICAgICBtZW1tb3ZlKFJlc0RhdGEgLT5CbG9jayArIFJlc0RhdGEgLT5Qb2ludGVyLCBQdHIsIHNpemUpOwogICAgIFJlc0RhdGEgLT5Qb2ludGVyICs9IHNpemU7Ci0gICAgaW9oYW5kbGVyLT5Vc2VkU3BhY2UgKz0gc2l6ZTsKIAogICAgIGlmIChSZXNEYXRhIC0+UG9pbnRlciA+IGlvaGFuZGxlci0+VXNlZFNwYWNlKQogICAgICAgICBpb2hhbmRsZXItPlVzZWRTcGFjZSA9IFJlc0RhdGEgLT5Qb2ludGVyOwpAQCAtMzcxLDcgKzM3MCw3IEBACiBzdGF0aWMKIGNtc1VJbnQzMk51bWJlciBGaWxlVGVsbChjbXNJT0hBTkRMRVIqIGlvaGFuZGxlcikKIHsKLSAgICByZXR1cm4gZnRlbGwoKEZJTEUqKWlvaGFuZGxlciAtPnN0cmVhbSk7CisgICAgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpIGZ0ZWxsKChGSUxFKilpb2hhbmRsZXIgLT5zdHJlYW0pOwogfQogCiAvLyBXcml0ZXMgZGF0YSB0byBzdHJlYW0sIGFsc28ga2VlcHMgdXNlZCBzcGFjZSBmb3IgZnVydGhlciByZWZlcmVuY2UuIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvcgpAQCAtNDE0LDcgKzQxMyw3IEBACiAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9GSUxFLCAiRmlsZSAnJXMnIG5vdCBmb3VuZCIsIEZpbGVOYW1lKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGlvaGFuZGxlciAtPiBSZXBvcnRlZFNpemUgPSBjbXNmaWxlbGVuZ3RoKGZtKTsKKyAgICAgICAgaW9oYW5kbGVyIC0+IFJlcG9ydGVkU2l6ZSA9IChjbXNVSW50MzJOdW1iZXIpIGNtc2ZpbGVsZW5ndGgoZm0pOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgJ3cnOgpAQCAtNDYxLDcgKzQ2MCw3IEBACiAgICAgaW9oYW5kbGVyIC0+IENvbnRleHRJRCA9IENvbnRleHRJRDsKICAgICBpb2hhbmRsZXIgLT4gc3RyZWFtID0gKHZvaWQqKSBTdHJlYW07CiAgICAgaW9oYW5kbGVyIC0+IFVzZWRTcGFjZSA9IDA7Ci0gICAgaW9oYW5kbGVyIC0+IFJlcG9ydGVkU2l6ZSA9IGNtc2ZpbGVsZW5ndGgoU3RyZWFtKTsKKyAgICBpb2hhbmRsZXIgLT4gUmVwb3J0ZWRTaXplID0gKGNtc1VJbnQzMk51bWJlcikgY21zZmlsZWxlbmd0aChTdHJlYW0pOwogICAgIGlvaGFuZGxlciAtPiBQaHlzaWNhbEZpbGVbMF0gPSAwOwogCiAgICAgaW9oYW5kbGVyIC0+UmVhZCAgICA9IEZpbGVSZWFkOwpAQCAtNTAxLDYgKzUwMCw5IEBACiAgICAgLy8gU2V0IGNyZWF0aW9uIGRhdGUvdGltZQogICAgIG1lbW1vdmUoJkljYyAtPkNyZWF0ZWQsIGdtdGltZSgmbm93KSwgc2l6ZW9mKEljYyAtPkNyZWF0ZWQpKTsKIAorICAgIC8vIENyZWF0ZSBhIG11dGV4IGlmIHRoZSB1c2VyIHByb3ZpZGVkIHByb3BlciBwbHVnaW4uIE5VTEwgb3RoZXJ3aXNlCisgICAgSWNjIC0+VXNyTXV0ZXggPSBfY21zQ3JlYXRlTXV0ZXgoQ29udGV4dElEKTsKKwogICAgIC8vIFJldHVybiB0aGUgaGFuZGxlCiAgICAgcmV0dXJuIChjbXNIUFJPRklMRSkgSWNjOwogfQpAQCAtNTc5LDkgKzU4MSwzOSBAQAogICAgIHJldHVybiBuOwogfQogCisvLyBEZWxldGVzIGEgdGFnIGVudHJ5CiAKLS8vIENyZWF0ZSBhIG5ldyB0YWcgZW50cnkKK3N0YXRpYwordm9pZCBfY21zRGVsZXRlVGFnQnlQb3MoX2Ntc0lDQ1BST0ZJTEUqIEljYywgaW50IGkpCit7CisgICAgX2Ntc0Fzc2VydChJY2MgIT0gTlVMTCk7CisgICAgX2Ntc0Fzc2VydChpID49IDApOwogCisKKyAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbaV0gIT0gTlVMTCkgeworCisgICAgICAgIC8vIEZyZWUgcHJldmlvdXMgdmVyc2lvbgorICAgICAgICBpZiAoSWNjIC0+VGFnU2F2ZUFzUmF3W2ldKSB7CisgICAgICAgICAgICBfY21zRnJlZShJY2MgLT5Db250ZXh0SUQsIEljYyAtPlRhZ1B0cnNbaV0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyID0gSWNjIC0+VGFnVHlwZUhhbmRsZXJzW2ldOworCisgICAgICAgICAgICBpZiAoVHlwZUhhbmRsZXIgIT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgY21zVGFnVHlwZUhhbmRsZXIgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKKyAgICAgICAgICAgICAgICBMb2NhbFR5cGVIYW5kbGVyLkNvbnRleHRJRCA9IEljYyAtPkNvbnRleHRJRDsgICAgICAgICAgICAgIC8vIEFzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKKyAgICAgICAgICAgICAgICBMb2NhbFR5cGVIYW5kbGVyLkZyZWVQdHIoJkxvY2FsVHlwZUhhbmRsZXIsIEljYyAtPiBUYWdQdHJzW2ldKTsKKyAgICAgICAgICAgICAgICBJY2MgLT5UYWdQdHJzW2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQorCisKKy8vIENyZWF0ZXMgYSBuZXcgdGFnIGVudHJ5CiBzdGF0aWMKIGNtc0Jvb2wgX2Ntc05ld1RhZyhfY21zSUNDUFJPRklMRSogSWNjLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBpbnQqIE5ld1BvcykKIHsKQEAgLTU4OSwxNSArNjIxLDE1IEBACiAKICAgICAvLyBTZWFyY2ggZm9yIHRoZSB0YWcKICAgICBpID0gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgRkFMU0UpOwotCi0gICAgLy8gTm93IGxldCdzIGRvIGl0IGVhc3kuIElmIHRoZSB0YWcgaGFzIGJlZW4gYWxyZWFkeSB3cml0dGVuLCB0aGF0J3MgYW4gZXJyb3IKICAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfQUxSRUFEWV9ERUZJTkVELCAiVGFnICcleCcgYWxyZWFkeSBleGlzdHMiLCBzaWcpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgLy8gQWxyZWFkeSBleGlzdHM/IGRlbGV0ZSBpdAorICAgICAgICBfY21zRGVsZXRlVGFnQnlQb3MoSWNjLCBpKTsKKyAgICAgICAgKk5ld1BvcyA9IGk7CiAgICAgfQogICAgIGVsc2UgIHsKIAotICAgICAgICAvLyBOZXcgb25lCisgICAgICAgIC8vIE5vLCBtYWtlIGEgbmV3IG9uZQogCiAgICAgICAgIGlmIChJY2MgLT4gVGFnQ291bnQgPj0gTUFYX1RBQkxFX1RBRykgewogICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IHRhZ3MgKCVkKSIsIE1BWF9UQUJMRV9UQUcpOwpAQCAtOTc5LDcgKzEwMTEsNyBAQAogCiAgICAgLy8gNC4yIC0+IDB4NDIwMDAwMAogCi0gICAgSWNjIC0+IFZlcnNpb24gPSBCYXNlVG9CYXNlKChjbXNVSW50MzJOdW1iZXIpIGZsb29yKFZlcnNpb24gKiAxMDAuMCksIDEwLCAxNikgPDwgMTY7CisgICAgSWNjIC0+IFZlcnNpb24gPSBCYXNlVG9CYXNlKChjbXNVSW50MzJOdW1iZXIpIGZsb29yKFZlcnNpb24gKiAxMDAuMCArIDAuNSksIDEwLCAxNikgPDwgMTY7CiB9CiAKIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0dldFByb2ZpbGVWZXJzaW9uKGNtc0hQUk9GSUxFIGhQcm9maWxlKQpAQCAtMTAxMSw2ICsxMDQzLDMyIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKKy8vIENyZWF0ZSBwcm9maWxlIGZyb20gSU9oYW5kbGVyCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tSU9oYW5kbGVyMlRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSU9IQU5ETEVSKiBpbywgY21zQm9vbCB3cml0ZSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogTmV3SWNjOworICAgIGNtc0hQUk9GSUxFIGhFbXB0eSA9IGNtc0NyZWF0ZVByb2ZpbGVQbGFjZWhvbGRlcihDb250ZXh0SUQpOworCisgICAgaWYgKGhFbXB0eSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIE5ld0ljYyA9IChfY21zSUNDUFJPRklMRSopIGhFbXB0eTsKKworICAgIE5ld0ljYyAtPklPaGFuZGxlciA9IGlvOworICAgIGlmICh3cml0ZSkgeworCisgICAgICAgIE5ld0ljYyAtPiBJc1dyaXRlID0gVFJVRTsKKyAgICAgICAgcmV0dXJuIGhFbXB0eTsKKyAgICB9CisKKyAgICBpZiAoIV9jbXNSZWFkSGVhZGVyKE5ld0ljYykpIGdvdG8gRXJyb3I7CisgICAgcmV0dXJuIGhFbXB0eTsKKworRXJyb3I6CisgICAgY21zQ2xvc2VQcm9maWxlKGhFbXB0eSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKwogLy8gQ3JlYXRlIHByb2ZpbGUgZnJvbSBkaXNrIGZpbGUKIGNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21GaWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjaGFyICpscEZpbGVOYW1lLCBjb25zdCBjaGFyICpzQWNjZXNzKQogewpAQCAtMTIwMiw3ICsxMjYwLDcgQEAKICAgICAgICAgZWxzZSB7CiAKICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3Igc3VwcG9ydCBvbiB0aGlzIHRhZwotICAgICAgICAgICAgVGFnRGVzY3JpcHRvciA9IF9jbXNHZXRUYWdEZXNjcmlwdG9yKEljYyAtPiBUYWdOYW1lc1tpXSk7CisgICAgICAgICAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoSWNjLT4gQ29udGV4dElELCBJY2MgLT4gVGFnTmFtZXNbaV0pOwogICAgICAgICAgICAgaWYgKFRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQsIGlnbm9yZSBpdAogCiAgICAgICAgICAgICBpZiAoVGFnRGVzY3JpcHRvciAtPkRlY2lkZVR5cGUgIT0gTlVMTCkgewpAQCAtMTIxNCw3ICsxMjcyLDcgQEAKICAgICAgICAgICAgICAgICBUeXBlID0gVGFnRGVzY3JpcHRvciAtPlN1cHBvcnRlZFR5cGVzWzBdOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBUeXBlSGFuZGxlciA9ICBfY21zR2V0VGFnVHlwZUhhbmRsZXIoVHlwZSk7CisgICAgICAgICAgICBUeXBlSGFuZGxlciA9ICBfY21zR2V0VGFnVHlwZUhhbmRsZXIoSWNjLT5Db250ZXh0SUQsIFR5cGUpOwogCiAgICAgICAgICAgICBpZiAoVHlwZUhhbmRsZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfSU5URVJOQUwsICIoSW50ZXJuYWwpIG5vIGhhbmRsZXIgZm9yIHRhZyAleCIsIEljYyAtPiBUYWdOYW1lc1tpXSk7CkBAIC0xMjgyLDEwICsxMzQwLDEyIEBACiB7CiAgICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwogICAgIF9jbXNJQ0NQUk9GSUxFIEtlZXA7Ci0gICAgY21zSU9IQU5ETEVSKiBQcmV2SU87CisgICAgY21zSU9IQU5ETEVSKiBQcmV2SU8gPSBOVUxMOwogICAgIGNtc1VJbnQzMk51bWJlciBVc2VkU3BhY2U7CiAgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7CiAKKyAgICBfY21zQXNzZXJ0KGhQcm9maWxlICE9IE5VTEwpOworCiAgICAgbWVtbW92ZSgmS2VlcCwgSWNjLCBzaXplb2YoX2Ntc0lDQ1BST0ZJTEUpKTsKIAogICAgIENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOwpAQCAtMTI5NCwxOCArMTM1NCwxOSBAQAogCiAgICAgLy8gUGFzcyAjMSBkb2VzIGNvbXB1dGUgb2Zmc2V0cwogCi0gICAgaWYgKCFfY21zV3JpdGVIZWFkZXIoSWNjLCAwKSkgcmV0dXJuIDA7Ci0gICAgaWYgKCFTYXZlVGFncyhJY2MsICZLZWVwKSkgcmV0dXJuIDA7CisgICAgaWYgKCFfY21zV3JpdGVIZWFkZXIoSWNjLCAwKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVNhdmVUYWdzKEljYywgJktlZXApKSBnb3RvIEVycm9yOwogCiAgICAgVXNlZFNwYWNlID0gUHJldklPIC0+VXNlZFNwYWNlOwogCiAgICAgLy8gUGFzcyAjMiBkb2VzIHNhdmUgdG8gaW9oYW5kbGVyCiAKICAgICBpZiAoaW8gIT0gTlVMTCkgeworCiAgICAgICAgIEljYyAtPklPaGFuZGxlciA9IGlvOwotICAgICAgICBpZiAoIVNldExpbmtzKEljYykpIGdvdG8gQ2xlYW5VcDsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVIZWFkZXIoSWNjLCBVc2VkU3BhY2UpKSBnb3RvIENsZWFuVXA7Ci0gICAgICAgIGlmICghU2F2ZVRhZ3MoSWNjLCAmS2VlcCkpIGdvdG8gQ2xlYW5VcDsKKyAgICAgICAgaWYgKCFTZXRMaW5rcyhJY2MpKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIV9jbXNXcml0ZUhlYWRlcihJY2MsIFVzZWRTcGFjZSkpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghU2F2ZVRhZ3MoSWNjLCAmS2VlcCkpIGdvdG8gRXJyb3I7CiAgICAgfQogCiAgICAgbWVtbW92ZShJY2MsICZLZWVwLCBzaXplb2YoX2Ntc0lDQ1BST0ZJTEUpKTsKQEAgLTEzMTQsNyArMTM3NSw3IEBACiAgICAgcmV0dXJuIFVzZWRTcGFjZTsKIAogCi1DbGVhblVwOgorRXJyb3I6CiAgICAgY21zQ2xvc2VJT2hhbmRsZXIoUHJldklPKTsKICAgICBtZW1tb3ZlKEljYywgJktlZXAsIHNpemVvZihfY21zSUNDUFJPRklMRSkpOwogICAgIHJldHVybiAwOwpAQCAtMTM2MiwxMSArMTQyMywxMyBAQAogICAgIGNtc0lPSEFORExFUiogaW87CiAgICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKIAorICAgIF9jbXNBc3NlcnQoQnl0ZXNOZWVkZWQgIT0gTlVMTCk7CisKICAgICAvLyBTaG91bGQgd2UganVzdCBjYWxjdWxhdGUgdGhlIG5lZWRlZCBzcGFjZT8KICAgICBpZiAoTWVtUHRyID09IE5VTEwpIHsKIAogICAgICAgICAgICAqQnl0ZXNOZWVkZWQgPSAgY21zU2F2ZVByb2ZpbGVUb0lPaGFuZGxlcihoUHJvZmlsZSwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm4gKCpCeXRlc05lZWRlZCA9PSAwID8gRkFMU0UgOiBUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiAoKkJ5dGVzTmVlZGVkID09IDApID8gRkFMU0UgOiBUUlVFOwogICAgIH0KIAogICAgIC8vIFRoYXQgaXMgYSByZWFsIHdyaXRlIG9wZXJhdGlvbgpAQCAtMTQxOSw2ICsxNDgyLDggQEAKICAgICAgICAgcmMgJj0gY21zQ2xvc2VJT2hhbmRsZXIoSWNjLT5JT2hhbmRsZXIpOwogICAgIH0KIAorICAgIF9jbXNEZXN0cm95TXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYy0+VXNyTXV0ZXgpOworCiAgICAgX2Ntc0ZyZWUoSWNjIC0+Q29udGV4dElELCBJY2MpOyAgIC8vIEZyZWUgcGxhY2Vob2xkZXIgbWVtb3J5CiAKICAgICByZXR1cm4gcmM7CkBAIC0xNDU5LDE0ICsxNTI0LDE4IEBACiAgICAgY21zVUludDMyTnVtYmVyIEVsZW1Db3VudDsKICAgICBpbnQgbjsKIAorICAgIGlmICghX2Ntc0xvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpKSByZXR1cm4gTlVMTDsKKwogICAgIG4gPSBfY21zU2VhcmNoVGFnKEljYywgc2lnLCBUUlVFKTsKLSAgICBpZiAobiA8IDApIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgLy8gTm90IGZvdW5kLCByZXR1cm4gTlVMTAorICAgIGlmIChuIDwgMCkgZ290byBFcnJvcjsgICAgICAgICAgICAgICAvLyBOb3QgZm91bmQsIHJldHVybiBOVUxMCiAKIAogICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgaW4gbWVtb3J5LCByZXR1cm4gdGhlIHBvaW50ZXIKICAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbbl0pIHsKIAotICAgICAgICBpZiAoSWNjIC0+VGFnU2F2ZUFzUmF3W25dKSByZXR1cm4gTlVMTDsgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVhZCByYXcgdGFncyBhcyBjb29rZWQKKyAgICAgICAgaWYgKEljYyAtPlRhZ1NhdmVBc1Jhd1tuXSkgZ290byBFcnJvcjsgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVhZCByYXcgdGFncyBhcyBjb29rZWQKKworICAgICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKICAgICAgICAgcmV0dXJuIEljYyAtPiBUYWdQdHJzW25dOwogICAgIH0KIApAQCAtMTQ3NiwyMyArMTU0NSwzMiBAQAogCiAgICAgLy8gU2VlayB0byBpdHMgbG9jYXRpb24KICAgICBpZiAoIWlvIC0+IFNlZWsoaW8sIE9mZnNldCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIEVycm9yOwogCiAgICAgLy8gU2VhcmNoIGZvciBzdXBwb3J0IG9uIHRoaXMgdGFnCi0gICAgVGFnRGVzY3JpcHRvciA9IF9jbXNHZXRUYWdEZXNjcmlwdG9yKHNpZyk7Ci0gICAgaWYgKFRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgcmV0dXJuIE5VTEw7ICAgICAvLyBVbnN1cHBvcnRlZC4KKyAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoSWNjLT4gQ29udGV4dElELCBzaWcpOworICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpIHsKKworICAgICAgICBjaGFyIFN0cmluZ1s1XTsKKworICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIHNpZyk7CisKKyAgICAgICAgLy8gQW4gdW5rbm93biBlbGVtZW50IHdhcyBmb3VuZC4KKyAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gdGFnIHR5cGUgJyVzJyBmb3VuZC4iLCBTdHJpbmcpOworICAgICAgICBnb3RvIEVycm9yOyAgICAgLy8gVW5zdXBwb3J0ZWQuCisgICAgfQogCiAgICAgLy8gaWYgc3VwcG9ydGVkLCBnZXQgdHlwZSBhbmQgY2hlY2sgaWYgaW4gbGlzdAogICAgIEJhc2VUeXBlID0gX2Ntc1JlYWRUeXBlQmFzZShpbyk7Ci0gICAgaWYgKEJhc2VUeXBlID09IDApIHJldHVybiBOVUxMOworICAgIGlmIChCYXNlVHlwZSA9PSAwKSBnb3RvIEVycm9yOwogCi0gICAgaWYgKCFJc1R5cGVTdXBwb3J0ZWQoVGFnRGVzY3JpcHRvciwgQmFzZVR5cGUpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUlzVHlwZVN1cHBvcnRlZChUYWdEZXNjcmlwdG9yLCBCYXNlVHlwZSkpIGdvdG8gRXJyb3I7CiAKICAgICBUYWdTaXplICAtPSA4OyAgICAgICAgICAgICAgICAgICAgICAvLyBBbHJlZHkgcmVhZCBieSB0aGUgdHlwZSBiYXNlIGxvZ2ljCiAKICAgICAvLyBHZXQgdHlwZSBoYW5kbGVyCi0gICAgVHlwZUhhbmRsZXIgPSBfY21zR2V0VGFnVHlwZUhhbmRsZXIoQmFzZVR5cGUpOwotICAgIGlmIChUeXBlSGFuZGxlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBUeXBlSGFuZGxlciA9IF9jbXNHZXRUYWdUeXBlSGFuZGxlcihJY2MgLT5Db250ZXh0SUQsIEJhc2VUeXBlKTsKKyAgICBpZiAoVHlwZUhhbmRsZXIgPT0gTlVMTCkgZ290byBFcnJvcjsKICAgICBMb2NhbFR5cGVIYW5kbGVyID0gKlR5cGVIYW5kbGVyOwogCiAKQEAgLTE1MTEsNyArMTU4OSw3IEBACiAKICAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCBzaWcpOwogICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICJDb3JydXB0ZWQgdGFnICclcyciLCBTdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBFcnJvcjsKICAgICB9CiAKICAgICAvLyBUaGlzIGlzIGEgd2VpcmQgZXJyb3IgdGhhdCBtYXkgYmUgYSBzeW1wdG9tIG9mIHNvbWV0aGluZyBtb3JlIHNlcmlvdXMsIHRoZSBudW1iZXIgb2YKQEAgLTE1MjcsNyArMTYwNSwxNCBAQAogCiAKICAgICAvLyBSZXR1cm4gdGhlIGRhdGEKKyAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKICAgICByZXR1cm4gSWNjIC0+IFRhZ1B0cnNbbl07CisKKworICAgIC8vIFJldHVybiBlcnJvciBhbmQgdW5sb2NrIHRoYSBkYXRhCitFcnJvcjoKKyAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xNTYxLDQ5ICsxNjQ2LDI2IEBACiAgICAgY21zRmxvYXQ2NE51bWJlciBWZXJzaW9uOwogICAgIGNoYXIgVHlwZVN0cmluZ1s1XSwgU2lnU3RyaW5nWzVdOwogCisgICAgaWYgKCFfY21zTG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCkpIHJldHVybiBGQUxTRTsKIAorICAgIC8vIFRvIGRlbGV0ZSB0YWdzLgogICAgIGlmIChkYXRhID09IE5VTEwpIHsKIAorICAgICAgICAgLy8gRGVsZXRlIHRoZSB0YWcKICAgICAgICAgIGkgPSBfY21zU2VhcmNoVGFnKEljYywgc2lnLCBGQUxTRSk7Ci0gICAgICAgICBpZiAoaSA+PSAwKQorICAgICAgICAgaWYgKGkgPj0gMCkgeworCisgICAgICAgICAgICAgLy8gVXNlIHplcm8gYXMgYSBtYXJrIG9mIGRlbGV0ZWQKKyAgICAgICAgICAgICBfY21zRGVsZXRlVGFnQnlQb3MoSWNjLCBpKTsKICAgICAgICAgICAgICBJY2MgLT5UYWdOYW1lc1tpXSA9IChjbXNUYWdTaWduYXR1cmUpIDA7Ci0gICAgICAgICAvLyBVbnN1cHBvcnRlZCBieSBub3csIHJlc2VydmVkIGZvciBmdXR1cmUgYW1wbGlhdGlvbnMgKGRlbGV0ZSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgIH0KKyAgICAgICAgIC8vIERpZG4ndCBmaW5kIHRoZSB0YWcKKyAgICAgICAgZ290byBFcnJvcjsKICAgICB9CiAKLSAgICBpID0gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgRkFMU0UpOwotICAgIGlmIChpID49MCkgewotCi0gICAgICAgIGlmIChJY2MgLT4gVGFnUHRyc1tpXSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIEFscmVhZHkgZXhpc3RzLiBGcmVlIHByZXZpb3VzIHZlcnNpb24KLSAgICAgICAgICAgIGlmIChJY2MgLT5UYWdTYXZlQXNSYXdbaV0pIHsKLSAgICAgICAgICAgICAgICBfY21zRnJlZShJY2MgLT5Db250ZXh0SUQsIEljYyAtPlRhZ1B0cnNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgVHlwZUhhbmRsZXIgPSBJY2MgLT5UYWdUeXBlSGFuZGxlcnNbaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoVHlwZUhhbmRsZXIgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIgPSAqVHlwZUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEID0gSWNjIC0+Q29udGV4dElEOyAgICAgICAgICAgICAgLy8gQXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlci5GcmVlUHRyKCZMb2NhbFR5cGVIYW5kbGVyLCBJY2MgLT4gVGFnUHRyc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgIHsKLSAgICAgICAgLy8gTmV3IG9uZQotICAgICAgICBpID0gSWNjIC0+IFRhZ0NvdW50OwotCi0gICAgICAgIGlmIChpID49IE1BWF9UQUJMRV9UQUcpIHsKLSAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJUb28gbWFueSB0YWdzICglZCkiLCBNQVhfVEFCTEVfVEFHKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIEljYyAtPiBUYWdDb3VudCsrOwotICAgIH0KKyAgICBpZiAoIV9jbXNOZXdUYWcoSWNjLCBzaWcsICZpKSkgZ290byBFcnJvcjsKIAogICAgIC8vIFRoaXMgaXMgbm90IHJhdwogICAgIEljYyAtPlRhZ1NhdmVBc1Jhd1tpXSA9IEZBTFNFOwpAQCAtMTYxMiwxMCArMTY3NCwxMCBAQAogICAgIEljYyAtPlRhZ0xpbmtlZFtpXSA9IChjbXNUYWdTaWduYXR1cmUpIDA7CiAKICAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRBRy4KLSAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3Ioc2lnKTsKKyAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoSWNjLT4gQ29udGV4dElELCBzaWcpOwogICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpewogICAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHRhZyAnJXgnIiwgc2lnKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBnb3RvIEVycm9yOwogICAgIH0KIAogCkBAIC0xNjMzLDcgKzE2OTUsNiBAQAogICAgIH0KICAgICBlbHNlIHsKIAotCiAgICAgICAgIFR5cGUgPSBUYWdEZXNjcmlwdG9yIC0+U3VwcG9ydGVkVHlwZXNbMF07CiAgICAgfQogCkBAIC0xNjQ0LDE4ICsxNzA1LDE4IEBACiAgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFNpZ1N0cmluZywgIHNpZyk7CiAKICAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHR5cGUgJyVzJyBmb3IgdGFnICclcyciLCBUeXBlU3RyaW5nLCBTaWdTdHJpbmcpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGdvdG8gRXJyb3I7CiAgICAgfQogCiAgICAgLy8gRG9lcyB3ZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyB0eXBlPwotICAgIFR5cGVIYW5kbGVyID0gIF9jbXNHZXRUYWdUeXBlSGFuZGxlcihUeXBlKTsKKyAgICBUeXBlSGFuZGxlciA9ICBfY21zR2V0VGFnVHlwZUhhbmRsZXIoSWNjLT5Db250ZXh0SUQsIFR5cGUpOwogICAgIGlmIChUeXBlSGFuZGxlciA9PSBOVUxMKSB7CiAKICAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoVHlwZVN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgVHlwZSk7CiAgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFNpZ1N0cmluZywgIHNpZyk7CiAKICAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHR5cGUgJyVzJyBmb3IgdGFnICclcyciLCBUeXBlU3RyaW5nLCBTaWdTdHJpbmcpOwotICAgICAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgIGdvdG8gRXJyb3I7ICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCiAgICAgfQogCiAKQEAgLTE2NjgsNyArMTcyOSw3IEBACiAgICAgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKICAgICBMb2NhbFR5cGVIYW5kbGVyLkNvbnRleHRJRCAgPSBJY2MgLT5Db250ZXh0SUQ7CiAgICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKLSAgICBJY2MgLT5UYWdQdHJzW2ldICAgICAgICAgPSBMb2NhbFR5cGVIYW5kbGVyLkR1cFB0cigmTG9jYWxUeXBlSGFuZGxlciwgZGF0YSwgVGFnRGVzY3JpcHRvciAtPkVsZW1Db3VudCk7CisgICAgSWNjIC0+VGFnUHRyc1tpXSAgICAgICAgICAgID0gTG9jYWxUeXBlSGFuZGxlci5EdXBQdHIoJkxvY2FsVHlwZUhhbmRsZXIsIGRhdGEsIFRhZ0Rlc2NyaXB0b3IgLT5FbGVtQ291bnQpOwogCiAgICAgaWYgKEljYyAtPlRhZ1B0cnNbaV0gPT0gTlVMTCkgIHsKIApAQCAtMTY3NiwxMCArMTczNywxNiBAQAogICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTaWdTdHJpbmcsICBzaWcpOwogICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICJNYWxmb3JtZWQgc3RydWN0IGluIHR5cGUgJyVzJyBmb3IgdGFnICclcyciLCBUeXBlU3RyaW5nLCBTaWdTdHJpbmcpOwogCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgZ290byBFcnJvcjsKICAgICB9CiAKKyAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKICAgICByZXR1cm4gVFJVRTsKKworRXJyb3I6CisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgcmV0dXJuIEZBTFNFOworCiB9CiAKIC8vIFJlYWQgYW5kIHdyaXRlIHJhdyBkYXRhLiBUaGUgb25seSB3YXkgdGhvc2UgZnVuY3Rpb24gd291bGQgd29yayBhbmQga2VlcCBjb25zaXN0ZW5jZSB3aXRoIG5vcm1hbCByZWFkIGFuZCB3cml0ZQpAQCAtMTcwMCw5ICsxNzY3LDExIEBACiAgICAgY21zVUludDMyTnVtYmVyIHJjOwogICAgIGNtc1VJbnQzMk51bWJlciBPZmZzZXQsIFRhZ1NpemU7CiAKKyAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIDA7CisKICAgICAvLyBTZWFyY2ggZm9yIGdpdmVuIHRhZyBpbiBJQ0MgcHJvZmlsZSBkaXJlY3RvcnkKICAgICBpID0gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgVFJVRSk7Ci0gICAgaWYgKGkgPCAwKSByZXR1cm4gMDsgICAgICAgICAgICAgICAgIC8vIE5vdCBmb3VuZCwgcmV0dXJuIDAKKyAgICBpZiAoaSA8IDApIGdvdG8gRXJyb3I7ICAgICAgICAgICAgICAgICAvLyBOb3QgZm91bmQsCiAKICAgICAvLyBJdCBpcyBhbHJlYWR5IHJlYWQ/CiAgICAgaWYgKEljYyAtPiBUYWdQdHJzW2ldID09IE5VTEwpIHsKQEAgLTE3MTcsMTIgKzE3ODYsMTQgQEAKICAgICAgICAgICAgIGlmIChCdWZmZXJTaXplIDwgVGFnU2l6ZSkKICAgICAgICAgICAgICAgICBUYWdTaXplID0gQnVmZmVyU2l6ZTsKIAotICAgICAgICAgICAgaWYgKCFJY2MgLT5JT2hhbmRsZXIgLT5TZWVrKEljYyAtPklPaGFuZGxlciwgT2Zmc2V0KSkgcmV0dXJuIDA7Ci0gICAgICAgICAgICBpZiAoIUljYyAtPklPaGFuZGxlciAtPlJlYWQoSWNjIC0+SU9oYW5kbGVyLCBkYXRhLCAxLCBUYWdTaXplKSkgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoIUljYyAtPklPaGFuZGxlciAtPlNlZWsoSWNjIC0+SU9oYW5kbGVyLCBPZmZzZXQpKSBnb3RvIEVycm9yOworICAgICAgICAgICAgaWYgKCFJY2MgLT5JT2hhbmRsZXIgLT5SZWFkKEljYyAtPklPaGFuZGxlciwgZGF0YSwgMSwgVGFnU2l6ZSkpIGdvdG8gRXJyb3I7CiAKKyAgICAgICAgICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOwogICAgICAgICAgICAgcmV0dXJuIFRhZ1NpemU7CiAgICAgICAgIH0KIAorICAgICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKICAgICAgICAgcmV0dXJuIEljYyAtPlRhZ1NpemVzW2ldOwogICAgIH0KIApAQCAtMTczOCwxNiArMTgwOSwyMiBAQAogCiAgICAgICAgICAgICBtZW1tb3ZlKGRhdGEsIEljYyAtPlRhZ1B0cnNbaV0sIFRhZ1NpemUpOwogCisgICAgICAgICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKICAgICAgICAgICAgIHJldHVybiBUYWdTaXplOwogICAgICAgICB9CiAKKyAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CiAgICAgICAgIHJldHVybiBJY2MgLT5UYWdTaXplc1tpXTsKICAgICB9CiAKICAgICAvLyBBbHJlYWR5IHJlYWRlZCwgb3IgcHJldmlvdXNseSBzZXQgYnkgY21zV3JpdGVUYWcoKS4gV2UgbmVlZCB0byBzZXJpYWxpemUgdGhhdAogICAgIC8vIGRhdGEgdG8gcmF3IGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5LgorCisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CiAgICAgT2JqZWN0ID0gY21zUmVhZFRhZyhoUHJvZmlsZSwgc2lnKTsKLSAgICBpZiAoT2JqZWN0ID09IE5VTEwpIHJldHVybiAwOworICAgIGlmICghX2Ntc0xvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpKSByZXR1cm4gMDsKKworICAgIGlmIChPYmplY3QgPT0gTlVMTCkgZ290byBFcnJvcjsKIAogICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHNlcmlhbGl6ZSB0byBhIG1lbW9yeSBibG9jazoganVzdCB1c2UgYSBtZW1vcnkgaW9oYW5kbGVyCiAKQEAgLTE3NTYsMTcgKzE4MzMsMTggQEAKICAgICB9IGVsc2V7CiAgICAgICAgIE1lbUlPID0gY21zT3BlbklPaGFuZGxlckZyb21NZW0oY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSksIGRhdGEsIEJ1ZmZlclNpemUsICJ3Iik7CiAgICAgfQotICAgIGlmIChNZW1JTyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAoTWVtSU8gPT0gTlVMTCkgZ290byBFcnJvcjsKIAogICAgIC8vIE9idGFpbiB0eXBlIGhhbmRsaW5nIGZvciB0aGUgdGFnCiAgICAgVHlwZUhhbmRsZXIgPSBJY2MgLT5UYWdUeXBlSGFuZGxlcnNbaV07Ci0gICAgVGFnRGVzY3JpcHRvciA9IF9jbXNHZXRUYWdEZXNjcmlwdG9yKHNpZyk7CisgICAgVGFnRGVzY3JpcHRvciA9IF9jbXNHZXRUYWdEZXNjcmlwdG9yKEljYy0+IENvbnRleHRJRCwgc2lnKTsKICAgICBpZiAoVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgIGNtc0Nsb3NlSU9oYW5kbGVyKE1lbUlPKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGdvdG8gRXJyb3I7CiAgICAgfQogCi0gICAgLy8gRklYTUU6IE5vIGhhbmRsaW5nIGZvciBUeXBlSGFuZGxlciA9PSBOVUxMIGhlcmU/CisgICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpIGdvdG8gRXJyb3I7CisKICAgICAvLyBTZXJpYWxpemUKICAgICBMb2NhbFR5cGVIYW5kbGVyID0gKlR5cGVIYW5kbGVyOwogICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEICA9IEljYyAtPkNvbnRleHRJRDsKQEAgLTE3NzQsMTkgKzE4NTIsMjQgQEAKIAogICAgIGlmICghX2Ntc1dyaXRlVHlwZUJhc2UoTWVtSU8sIFR5cGVIYW5kbGVyIC0+U2lnbmF0dXJlKSkgewogICAgICAgICBjbXNDbG9zZUlPaGFuZGxlcihNZW1JTyk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBnb3RvIEVycm9yOwogICAgIH0KIAogICAgIGlmICghTG9jYWxUeXBlSGFuZGxlci5Xcml0ZVB0cigmTG9jYWxUeXBlSGFuZGxlciwgTWVtSU8sIE9iamVjdCwgVGFnRGVzY3JpcHRvciAtPkVsZW1Db3VudCkpIHsKICAgICAgICAgY21zQ2xvc2VJT2hhbmRsZXIoTWVtSU8pOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ290byBFcnJvcjsKICAgICB9CiAKICAgICAvLyBHZXQgU2l6ZSBhbmQgY2xvc2UKICAgICByYyA9IE1lbUlPIC0+VGVsbChNZW1JTyk7CiAgICAgY21zQ2xvc2VJT2hhbmRsZXIoTWVtSU8pOyAgICAgIC8vIElnbm9yZSByZXR1cm4gY29kZSB0aGlzIHRpbWUKIAorICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOwogICAgIHJldHVybiByYzsKKworRXJyb3I6CisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8vIFNpbWlsYXIgdG8gdGhlIGFudGVyaW9yLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byB3cml0ZSBkaXJlY3RseSB0byB0aGUgSUNDIHByb2ZpbGUgYW55IGRhdGEsIHdpdGhvdXQKQEAgLTE3OTgsNyArMTg4MSwxMiBAQAogICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKICAgICBpbnQgaTsKIAotICAgIGlmICghX2Ntc05ld1RhZyhJY2MsIHNpZywgJmkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zTG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCkpIHJldHVybiAwOworCisgICAgaWYgKCFfY21zTmV3VGFnKEljYywgc2lnLCAmaSkpIHsKKyAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCiAgICAgLy8gTWFyayB0aGUgdGFnIGFzIGJlaW5nIHdyaXR0ZW4gYXMgUkFXCiAgICAgSWNjIC0+VGFnU2F2ZUFzUmF3W2ldID0gVFJVRTsKQEAgLTE4MDksNiArMTg5Nyw3IEBACiAgICAgSWNjIC0+VGFnUHRyc1tpXSAgPSBfY21zRHVwTWVtKEljYyAtPkNvbnRleHRJRCwgZGF0YSwgU2l6ZSk7CiAgICAgSWNjIC0+VGFnU2l6ZXNbaV0gPSBTaXplOwogCisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTE4MTgsNyArMTkwNywxMiBAQAogICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKICAgICBpbnQgaTsKIAotICAgIGlmICghX2Ntc05ld1RhZyhJY2MsIHNpZywgJmkpKSByZXR1cm4gRkFMU0U7CisgICAgIGlmICghX2Ntc0xvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoIV9jbXNOZXdUYWcoSWNjLCBzaWcsICZpKSkgeworICAgICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KIAogICAgIC8vIEtlZXAgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCiAgICAgSWNjIC0+VGFnU2F2ZUFzUmF3W2ldID0gRkFMU0U7CkBAIC0xODI5LDYgKzE5MjMsNyBAQAogICAgIEljYyAtPlRhZ1NpemVzW2ldICAgPSAwOwogICAgIEljYyAtPlRhZ09mZnNldHNbaV0gPSAwOwogCisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbzEuYyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbzEuYwppbmRleCBlZmRjNmJmLi42MWMyY2E1IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW8xLmMKKysrIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2lvMS5jCkBAIC0zMzQsNyArMzM0LDggQEAKIAogCiAvLyBSZWFkIGFuZCBjcmVhdGUgYSBCUkFORCBORVcgTVBFIExVVCBmcm9tIGEgZ2l2ZW4gcHJvZmlsZS4gQWxsIHN0dWZmIGRlcGVuZGVudCBvZiB2ZXJzaW9uLCBldGMKLS8vIGlzIGFkanVzdGVkIGhlcmUgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTFVUIHRoYXQgdGFrZXMgY2FyZSBvZiBhbGwgdGhvc2UgZGV0YWlscworLy8gaXMgYWRqdXN0ZWQgaGVyZSBpbiBvcmRlciB0byBjcmVhdGUgYSBMVVQgdGhhdCB0YWtlcyBjYXJlIG9mIGFsbCB0aG9zZSBkZXRhaWxzLgorLy8gV2UgYWRkIGludGVudCA9IC0xIGFzIGEgd2F5IHRvIHJlYWQgbWF0cml4IHNoYXBlciBhbHdheXMsIG5vIG1hdHRlciBvZiBvdGhlciBMVVQKIGNtc1BpcGVsaW5lKiBfY21zUmVhZElucHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KQogewogICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgT3JpZ2luYWxUeXBlOwpAQCAtMzY0LDQ5ICszNjUsNTQgQEAKICAgICAgICAgcmV0dXJuIEx1dDsKICAgICB9CiAKLSAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KSkgeyAgLy8gRmxvYXQgdGFnIHRha2VzIHByZWNlZGVuY2UKKyAgICAvLyBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gcmV1c2UgdGhpcyBmdW50aW9uIHRvIHJldHJpZXZlIHRoZSBtYXRyaXgtc2hhcGVyIGFzIHBpcGVsaW5lIG5vCisgICAgLy8gbWF0dGVyIG90aGVyIExVVCBhcmUgcHJlc2VudCBhbmQgaGF2ZSBwcmVjZWRlbmNlLiBJbnRlbnQgPSAtMSBtZWFucyBqdXN0IHRoaXMuCisgICAgaWYgKEludGVudCAhPSAtMSkgewogCi0gICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IExVVCBhcmUgYWx3YXlzIFY0LCBidXQgdGhlIGVuY29kaW5nIHJhbmdlIGlzIG5vCi0gICAgICAgIC8vIGxvbmdlciAwLi4xLjAsIHNvIHdlIG5lZWQgdG8gYWRkIGFuIHN0YWdlIGRlcGVuZGluZyBvbiB0aGUgY29sb3Igc3BhY2UKLSAgICAgICAgIHJldHVybiBfY21zUmVhZEZsb2F0SW5wdXRUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KTsKLSAgICB9CisgICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7ICAvLyBGbG9hdCB0YWcgdGFrZXMgcHJlY2VkZW5jZQogCi0gICAgLy8gUmV2ZXJ0IHRvIHBlcmNlcHR1YWwgaWYgbm8gdGFnIGlzIGZvdW5kCi0gICAgaWYgKCFjbXNJc1RhZyhoUHJvZmlsZSwgdGFnMTYpKSB7Ci0gICAgICAgIHRhZzE2ID0gRGV2aWNlMlBDUzE2WzBdOwotICAgIH0KKyAgICAgICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IExVVCBhcmUgYWx3YXlzIFY0LCBidXQgdGhlIGVuY29kaW5nIHJhbmdlIGlzIG5vCisgICAgICAgICAgICAvLyBsb25nZXIgMC4uMS4wLCBzbyB3ZSBuZWVkIHRvIGFkZCBhbiBzdGFnZSBkZXBlbmRpbmcgb24gdGhlIGNvbG9yIHNwYWNlCisgICAgICAgICAgICByZXR1cm4gX2Ntc1JlYWRGbG9hdElucHV0VGFnKGhQcm9maWxlLCB0YWdGbG9hdCk7CisgICAgICAgIH0KIAotICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnMTYpKSB7IC8vIElzIHRoZXJlIGFueSBMVVQtQmFzZWQgdGFibGU/CisgICAgICAgIC8vIFJldmVydCB0byBwZXJjZXB0dWFsIGlmIG5vIHRhZyBpcyBmb3VuZAorICAgICAgICBpZiAoIWNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsKKyAgICAgICAgICAgIHRhZzE2ID0gRGV2aWNlMlBDUzE2WzBdOworICAgICAgICB9CiAKLSAgICAgICAgLy8gQ2hlY2sgcHJvZmlsZSB2ZXJzaW9uIGFuZCBMVVQgdHlwZS4gRG8gdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpZiBuZWVkZWQKKyAgICAgICAgaWYgKGNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsgLy8gSXMgdGhlcmUgYW55IExVVC1CYXNlZCB0YWJsZT8KIAotICAgICAgICAvLyBGaXJzdCByZWFkIHRoZSB0YWcKLSAgICAgICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIHRhZzE2KTsKLSAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIC8vIENoZWNrIHByb2ZpbGUgdmVyc2lvbiBhbmQgTFVUIHR5cGUuIERvIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgaWYgbmVlZGVkCiAKLSAgICAgICAgLy8gQWZ0ZXIgcmVhZGluZyBpdCwgd2UgaGF2ZSBub3cgaW5mbyBhYm91dCB0aGUgb3JpZ2luYWwgdHlwZQotICAgICAgICBPcmlnaW5hbFR5cGUgPSAgX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7CisgICAgICAgICAgICAvLyBGaXJzdCByZWFkIHRoZSB0YWcKKyAgICAgICAgICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWcxNik7CisgICAgICAgICAgICBpZiAoTHV0ID09IE5VTEwpIHJldHVybiBOVUxMOwogCi0gICAgICAgIC8vIFRoZSBwcm9maWxlIG93bnMgdGhlIEx1dCwgc28gd2UgbmVlZCB0byBjb3B5IGl0Ci0gICAgICAgIEx1dCA9IGNtc1BpcGVsaW5lRHVwKEx1dCk7CisgICAgICAgICAgICAvLyBBZnRlciByZWFkaW5nIGl0LCB3ZSBoYXZlIG5vdyBpbmZvIGFib3V0IHRoZSBvcmlnaW5hbCB0eXBlCisgICAgICAgICAgICBPcmlnaW5hbFR5cGUgPSAgX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7CiAKLSAgICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgZGF0YSBvbmx5IGZvciBMYWIxNiBvbiBvdXRwdXQKLSAgICAgICAgaWYgKE9yaWdpbmFsVHlwZSAhPSBjbXNTaWdMdXQxNlR5cGUgfHwgY21zR2V0UENTKGhQcm9maWxlKSAhPSBjbXNTaWdMYWJEYXRhKQorICAgICAgICAgICAgLy8gVGhlIHByb2ZpbGUgb3ducyB0aGUgTHV0LCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQKKyAgICAgICAgICAgIEx1dCA9IGNtc1BpcGVsaW5lRHVwKEx1dCk7CisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IGRhdGEgb25seSBmb3IgTGFiMTYgb24gb3V0cHV0CisgICAgICAgICAgICBpZiAoT3JpZ2luYWxUeXBlICE9IGNtc1NpZ0x1dDE2VHlwZSB8fCBjbXNHZXRQQ1MoaFByb2ZpbGUpICE9IGNtc1NpZ0xhYkRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEx1dDsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIExhYiwgYWRkIGFsc28gYSBjb252ZXJzaW9uIGF0IHRoZSBiZWdpbgorICAgICAgICAgICAgaWYgKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEgJiYKKyAgICAgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihDb250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworCisgICAgICAgICAgICAvLyBBZGQgYSBtYXRyaXggZm9yIGNvbnZlcnNpb24gVjIgdG8gVjQgTGFiIFBDUworICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBfY21zU3RhZ2VBbGxvY0xhYlYyVG9WNChDb250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworCiAgICAgICAgICAgICByZXR1cm4gTHV0OwotCi0gICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBMYWIsIGFkZCBhbHNvIGEgY29udmVyc2lvbiBhdCB0aGUgYmVnaW4KLSAgICAgICAgaWYgKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEgJiYKLSAgICAgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jTGFiVjRUb1YyKENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICAvLyBBZGQgYSBtYXRyaXggZm9yIGNvbnZlcnNpb24gVjIgdG8gVjQgTGFiIFBDUwotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICByZXR1cm4gTHV0OwogRXJyb3I6Ci0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBMdXQgd2FzIG5vdCBmb3VuZCwgdHJ5IHRvIGNyZWF0ZSBhIG1hdHJpeC1zaGFwZXIKQEAgLTU1MSw3ICs1NTcsNyBAQAogICAgICAgICAgICAgICAgIF9jbXNTdGFnZUNMdXREYXRhKiBDTFVUID0gKF9jbXNTdGFnZUNMdXREYXRhKikgU3RhZ2UgLT5EYXRhOwogCiAgICAgICAgICAgICAgICAgQ0xVVCAtPlBhcmFtcy0+ZHdGbGFncyB8PSBDTVNfTEVSUF9GTEFHU19UUklMSU5FQVI7Ci0gICAgICAgICAgICAgICAgX2Ntc1NldEludGVycG9sYXRpb25Sb3V0aW5lKENMVVQgLT5QYXJhbXMpOworICAgICAgICAgICAgICAgIF9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShMdXQtPkNvbnRleHRJRCwgQ0xVVCAtPlBhcmFtcyk7CiAgICAgICAgICAgICB9CiAgICAgfQogfQpAQCAtNjA5LDU0ICs2MTUsNTggQEAKICAgICBjbXNUYWdTaWduYXR1cmUgdGFnRmxvYXQgPSBQQ1MyRGV2aWNlRmxvYXRbSW50ZW50XTsKICAgICBjbXNDb250ZXh0IENvbnRleHRJRCAgICAgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKIAotICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7ICAvLyBGbG9hdCB0YWcgdGFrZXMgcHJlY2VkZW5jZQogCi0gICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IExVVCBhcmUgYWx3YXlzIFY0Ci0gICAgICAgIHJldHVybiBfY21zUmVhZEZsb2F0T3V0cHV0VGFnKGhQcm9maWxlLCB0YWdGbG9hdCk7Ci0gICAgfQorICAgIGlmIChJbnRlbnQgIT0gLTEpIHsKIAotICAgIC8vIFJldmVydCB0byBwZXJjZXB0dWFsIGlmIG5vIHRhZyBpcyBmb3VuZAotICAgIGlmICghY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgewotICAgICAgICB0YWcxNiA9IFBDUzJEZXZpY2UxNlswXTsKLSAgICB9CisgICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7ICAvLyBGbG9hdCB0YWcgdGFrZXMgcHJlY2VkZW5jZQogCi0gICAgaWYgKGNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsgLy8gSXMgdGhlcmUgYW55IExVVC1CYXNlZCB0YWJsZT8KKyAgICAgICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IExVVCBhcmUgYWx3YXlzIFY0CisgICAgICAgICAgICByZXR1cm4gX2Ntc1JlYWRGbG9hdE91dHB1dFRhZyhoUHJvZmlsZSwgdGFnRmxvYXQpOworICAgICAgICB9CiAKLSAgICAgICAgLy8gQ2hlY2sgcHJvZmlsZSB2ZXJzaW9uIGFuZCBMVVQgdHlwZS4gRG8gdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpZiBuZWVkZWQKKyAgICAgICAgLy8gUmV2ZXJ0IHRvIHBlcmNlcHR1YWwgaWYgbm8gdGFnIGlzIGZvdW5kCisgICAgICAgIGlmICghY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgeworICAgICAgICAgICAgdGFnMTYgPSBQQ1MyRGV2aWNlMTZbMF07CisgICAgICAgIH0KIAotICAgICAgICAvLyBGaXJzdCByZWFkIHRoZSB0YWcKLSAgICAgICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIHRhZzE2KTsKLSAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsgLy8gSXMgdGhlcmUgYW55IExVVC1CYXNlZCB0YWJsZT8KIAotICAgICAgICAvLyBBZnRlciByZWFkaW5nIGl0LCB3ZSBoYXZlIGluZm8gYWJvdXQgdGhlIG9yaWdpbmFsIHR5cGUKLSAgICAgICAgT3JpZ2luYWxUeXBlID0gIF9jbXNHZXRUYWdUcnVlVHlwZShoUHJvZmlsZSwgdGFnMTYpOworICAgICAgICAgICAgLy8gQ2hlY2sgcHJvZmlsZSB2ZXJzaW9uIGFuZCBMVVQgdHlwZS4gRG8gdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpZiBuZWVkZWQKIAotICAgICAgICAvLyBUaGUgcHJvZmlsZSBvd25zIHRoZSBMdXQsIHNvIHdlIG5lZWQgdG8gY29weSBpdAotICAgICAgICBMdXQgPSBjbXNQaXBlbGluZUR1cChMdXQpOwotICAgICAgICBpZiAoTHV0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgICAgICAgLy8gRmlyc3QgcmVhZCB0aGUgdGFnCisgICAgICAgICAgICBjbXNQaXBlbGluZSogTHV0ID0gKGNtc1BpcGVsaW5lKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnMTYpOworICAgICAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKIAotICAgICAgICAvLyBOb3cgaXQgaXMgdGltZSBmb3IgYSBjb250cm92ZXJzaWFsIHN0dWZmLiBJIGZvdW5kIHRoYXQgZm9yIDNEIExVVFMgdXNpbmcKLSAgICAgICAgLy8gTGFiIHVzZWQgYXMgaW5kZXhlciBzcGFjZSwgIHRyaWxpbmVhciBpbnRlcnBvbGF0aW9uIHNob3VsZCBiZSB1c2VkCi0gICAgICAgIGlmIChjbXNHZXRQQ1MoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpCi0gICAgICAgICAgICBDaGFuZ2VJbnRlcnBvbGF0aW9uVG9UcmlsaW5lYXIoTHV0KTsKKyAgICAgICAgICAgIC8vIEFmdGVyIHJlYWRpbmcgaXQsIHdlIGhhdmUgaW5mbyBhYm91dCB0aGUgb3JpZ2luYWwgdHlwZQorICAgICAgICAgICAgT3JpZ2luYWxUeXBlID0gIF9jbXNHZXRUYWdUcnVlVHlwZShoUHJvZmlsZSwgdGFnMTYpOwogCi0gICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IGRhdGEgb25seSBmb3IgTGFiIGFuZCBMdXQxNiB0eXBlCi0gICAgICAgIGlmIChPcmlnaW5hbFR5cGUgIT0gY21zU2lnTHV0MTZUeXBlIHx8IGNtc0dldFBDUyhoUHJvZmlsZSkgIT0gY21zU2lnTGFiRGF0YSkKLSAgICAgICAgICAgIHJldHVybiBMdXQ7CisgICAgICAgICAgICAvLyBUaGUgcHJvZmlsZSBvd25zIHRoZSBMdXQsIHNvIHdlIG5lZWQgdG8gY29weSBpdAorICAgICAgICAgICAgTHV0ID0gY21zUGlwZWxpbmVEdXAoTHV0KTsKKyAgICAgICAgICAgIGlmIChMdXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgLy8gQWRkIGEgbWF0cml4IGZvciBjb252ZXJzaW9uIFY0IHRvIFYyIExhYiBQQ1MKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jTGFiVjRUb1YyKENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIC8vIE5vdyBpdCBpcyB0aW1lIGZvciBhIGNvbnRyb3ZlcnNpYWwgc3R1ZmYuIEkgZm91bmQgdGhhdCBmb3IgM0QgTFVUUyB1c2luZworICAgICAgICAgICAgLy8gTGFiIHVzZWQgYXMgaW5kZXhlciBzcGFjZSwgIHRyaWxpbmVhciBpbnRlcnBvbGF0aW9uIHNob3VsZCBiZSB1c2VkCisgICAgICAgICAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKQorICAgICAgICAgICAgICAgIENoYW5nZUludGVycG9sYXRpb25Ub1RyaWxpbmVhcihMdXQpOwogCi0gICAgICAgIC8vIElmIHRoZSBvdXRwdXQgaXMgTGFiLCBhZGQgYWxzbyBhIGNvbnZlcnNpb24gYXQgdGhlIGVuZAotICAgICAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBkYXRhIG9ubHkgZm9yIExhYiBhbmQgTHV0MTYgdHlwZQorICAgICAgICAgICAgaWYgKE9yaWdpbmFsVHlwZSAhPSBjbXNTaWdMdXQxNlR5cGUgfHwgY21zR2V0UENTKGhQcm9maWxlKSAhPSBjbXNTaWdMYWJEYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBMdXQ7CisKKyAgICAgICAgICAgIC8vIEFkZCBhIG1hdHJpeCBmb3IgY29udmVyc2lvbiBWNCB0byBWMiBMYWIgUENTCisgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoQ29udGV4dElEKSkpCiAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKIAotICAgICAgICByZXR1cm4gTHV0OworICAgICAgICAgICAgLy8gSWYgdGhlIG91dHB1dCBpcyBMYWIsIGFkZCBhbHNvIGEgY29udmVyc2lvbiBhdCB0aGUgZW5kCisgICAgICAgICAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkKKyAgICAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KENvbnRleHRJRCkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworCisgICAgICAgICAgICByZXR1cm4gTHV0OwogRXJyb3I6Ci0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBMdXQgbm90IGZvdW5kLCB0cnkgdG8gY3JlYXRlIGEgbWF0cml4LXNoYXBlcgpAQCAtNzgyLDcgKzc5Miw3IEBACiAKICAgICAvLyBOb3cgaXQgaXMgdGltZSBmb3IgYSBjb250cm92ZXJzaWFsIHN0dWZmLiBJIGZvdW5kIHRoYXQgZm9yIDNEIExVVFMgdXNpbmcKICAgICAvLyBMYWIgdXNlZCBhcyBpbmRleGVyIHNwYWNlLCAgdHJpbGluZWFyIGludGVycG9sYXRpb24gc2hvdWxkIGJlIHVzZWQKLSAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkKKyAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKQogICAgICAgICBDaGFuZ2VJbnRlcnBvbGF0aW9uVG9UcmlsaW5lYXIoTHV0KTsKIAogICAgIC8vIEFmdGVyIHJlYWRpbmcgaXQsIHdlIGhhdmUgaW5mbyBhYm91dCB0aGUgb3JpZ2luYWwgdHlwZQpAQCAtNzkzLDEyICs4MDMsMTIgQEAKIAogICAgIC8vIEhlcmUgaXQgaXMgcG9zc2libGUgdG8gZ2V0IExhYiBvbiBib3RoIHNpZGVzCiAKLSAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKSB7CisgICAgaWYgKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpIHsKICAgICAgICAgaWYoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoQ29udGV4dElEKSkpCiAgICAgICAgICAgICBnb3RvIEVycm9yMjsKICAgICB9CiAKLSAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkgeworICAgIGlmIChjbXNHZXRQQ1MoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpIHsKICAgICAgICAgaWYoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KENvbnRleHRJRCkpKQogICAgICAgICAgICAgZ290byBFcnJvcjI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc29wdC5jIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc29wdC5jCmluZGV4IGQxODRlZDcuLmI5ZDY5NTEgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNvcHQuYworKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zb3B0LmMKQEAgLTU0MiwxMSArNTQyLDEzIEBACiAKICAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogSW52ZXJzZVBvc3RMaW4gPSBjbXNSZXZlcnNlVG9uZUN1cnZlKEN1cnZlc1tpXSk7CiAgICAgICAgICAgICBpZiAoSW52ZXJzZVBvc3RMaW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFdoaXRlT3V0W2ldID0gMDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBXaGl0ZU91dFtpXSA9IFdoaXRlUG9pbnRPdXRbaV07CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBXaGl0ZU91dFtpXSA9IGNtc0V2YWxUb25lQ3VydmUxNihJbnZlcnNlUG9zdExpbiwgV2hpdGVQb2ludE91dFtpXSk7CisgICAgICAgICAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShJbnZlcnNlUG9zdExpbik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBXaGl0ZU91dFtpXSA9IGNtc0V2YWxUb25lQ3VydmUxNihJbnZlcnNlUG9zdExpbiwgV2hpdGVQb2ludE91dFtpXSk7Ci0gICAgICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKEludmVyc2VQb3N0TGluKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKQEAgLTE2NjYsNDQgKzE2NjgsMTAyIEBACiB9OwogCiAvLyBUaGUgbGlua2VkIGxpc3QgaGVhZAotc3RhdGljIF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKiBPcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gRGVmYXVsdE9wdGltaXphdGlvbjsKK19jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rID0geyBOVUxMIH07CisKKworLy8gRHVwbGljYXRlcyB0aGUgem9uZSBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcGx1Zy1pbiBpbiB0aGUgbmV3IGNvbnRleHQKK3N0YXRpYwordm9pZCBEdXBQbHVnaW5PcHRpbWl6YXRpb25MaXN0KHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKKyAgIF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKiAgZW50cnk7CisgICBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiogIEFudGVyaW9yID0gTlVMTDsKKyAgIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW09wdGltaXphdGlvblBsdWdpbl07CisKKyAgICBfY21zQXNzZXJ0KGN0eCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KGhlYWQgIT0gTlVMTCk7CisKKyAgICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCisgICBmb3IgKGVudHJ5ID0gaGVhZC0+T3B0aW1pemF0aW9uQ29sbGVjdGlvbjsKKyAgICAgICAgZW50cnkgIT0gTlVMTDsKKyAgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKKworICAgICAgICAgICAgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24gKm5ld0VudHJ5ID0gKCBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbikpOworCisgICAgICAgICAgICBpZiAobmV3RW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQorICAgICAgICAgICAgbmV3RW50cnkgLT4gTmV4dCA9IE5VTEw7CisgICAgICAgICAgICBpZiAoQW50ZXJpb3IpCisgICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OworCisgICAgICAgICAgICBBbnRlcmlvciA9IG5ld0VudHJ5OworCisgICAgICAgICAgICBpZiAobmV3SGVhZC5PcHRpbWl6YXRpb25Db2xsZWN0aW9uID09IE5VTEwpCisgICAgICAgICAgICAgICAgbmV3SGVhZC5PcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gbmV3RW50cnk7CisgICAgfQorCisgIGN0eCAtPmNodW5rc1tPcHRpbWl6YXRpb25QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eC0+TWVtUG9vbCwgJm5ld0hlYWQsIHNpemVvZihfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKSk7Cit9CisKK3ZvaWQgIF9jbXNBbGxvY09wdGltaXphdGlvblBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICBpZiAoc3JjICE9IE5VTEwpIHsKKworICAgICAgICAvLyBDb3B5IGFsbCBsaW5rZWQgbGlzdAorICAgICAgIER1cFBsdWdpbk9wdGltaXphdGlvbkxpc3QoY3R4LCBzcmMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RhdGljIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUgT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlID0geyBOVUxMIH07CisgICAgICAgIGN0eCAtPmNodW5rc1tPcHRpbWl6YXRpb25QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUsIHNpemVvZihfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKSk7CisgICAgfQorfQorCiAKIC8vIFJlZ2lzdGVyIG5ldyB3YXlzIHRvIG9wdGltaXplCi1jbXNCb29sICBfY21zUmVnaXN0ZXJPcHRpbWl6YXRpb25QbHVnaW4oY21zQ29udGV4dCBpZCwgY21zUGx1Z2luQmFzZSogRGF0YSkKK2Ntc0Jvb2wgIF9jbXNSZWdpc3Rlck9wdGltaXphdGlvblBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogRGF0YSkKIHsKICAgICBjbXNQbHVnaW5PcHRpbWl6YXRpb24qIFBsdWdpbiA9IChjbXNQbHVnaW5PcHRpbWl6YXRpb24qKSBEYXRhOworICAgIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBPcHRpbWl6YXRpb25QbHVnaW4pOwogICAgIF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKiBmbDsKIAogICAgIGlmIChEYXRhID09IE5VTEwpIHsKIAotICAgICAgICBPcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gRGVmYXVsdE9wdGltaXphdGlvbjsKKyAgICAgICAgY3R4LT5PcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gTlVMTDsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCiAgICAgLy8gT3B0aW1pemVyIGNhbGxiYWNrIGlzIHJlcXVpcmVkCiAgICAgaWYgKFBsdWdpbiAtPk9wdGltaXplUHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAotICAgIGZsID0gKF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKikgX2Ntc1BsdWdpbk1hbGxvYyhpZCwgc2l6ZW9mKF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKSk7CisgICAgZmwgPSAoX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24qKSBfY21zUGx1Z2luTWFsbG9jKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKSk7CiAgICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgIC8vIENvcHkgdGhlIHBhcmFtZXRlcnMKICAgICBmbCAtPk9wdGltaXplUHRyID0gUGx1Z2luIC0+T3B0aW1pemVQdHI7CiAKICAgICAvLyBLZWVwIGxpbmtlZCBsaXN0Ci0gICAgZmwgLT5OZXh0ID0gT3B0aW1pemF0aW9uQ29sbGVjdGlvbjsKLSAgICBPcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gZmw7CisgICAgZmwgLT5OZXh0ID0gY3R4LT5PcHRpbWl6YXRpb25Db2xsZWN0aW9uOworCisgICAgLy8gU2V0IHRoZSBoZWFkCisgICAgY3R4IC0+T3B0aW1pemF0aW9uQ29sbGVjdGlvbiA9IGZsOwogCiAgICAgLy8gQWxsIGlzIG9rCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vIFRoZSBlbnRyeSBwb2ludCBmb3IgTFVUIG9wdGltaXphdGlvbgotY21zQm9vbCBfY21zT3B0aW1pemVQaXBlbGluZShjbXNQaXBlbGluZSoqICAgIFB0ckx1dCwKK2Ntc0Jvb2wgX2Ntc09wdGltaXplUGlwZWxpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lKiogICAgUHRyTHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIEludGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogZHdGbGFncykKIHsKKyAgICBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgT3B0aW1pemF0aW9uUGx1Z2luKTsKICAgICBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiogT3B0czsKICAgICBjbXNCb29sIEFueVN1Y2Nlc3MgPSBGQUxTRTsKIApAQCAtMTczMyw4ICsxNzkzLDggQEAKICAgICBpZiAoKmR3RmxhZ3MgJiBjbXNGTEFHU19OT09QVElNSVpFKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICAvLyBUcnkgYnVpbHQtaW4gb3B0aW1pemF0aW9ucyBhbmQgcGx1Zy1pbgotICAgIGZvciAoT3B0cyA9IE9wdGltaXphdGlvbkNvbGxlY3Rpb247CisgICAgLy8gVHJ5IHBsdWctaW4gb3B0aW1pemF0aW9ucworICAgIGZvciAoT3B0cyA9IGN0eC0+T3B0aW1pemF0aW9uQ29sbGVjdGlvbjsKICAgICAgICAgIE9wdHMgIT0gTlVMTDsKICAgICAgICAgIE9wdHMgPSBPcHRzIC0+TmV4dCkgewogCkBAIC0xNzQ1LDYgKzE4MDUsMTcgQEAKICAgICAgICAgICAgIH0KICAgICB9CiAKKyAgIC8vIFRyeSBidWlsdC1pbiBvcHRpbWl6YXRpb25zCisgICAgZm9yIChPcHRzID0gRGVmYXVsdE9wdGltaXphdGlvbjsKKyAgICAgICAgIE9wdHMgIT0gTlVMTDsKKyAgICAgICAgIE9wdHMgPSBPcHRzIC0+TmV4dCkgeworCisgICAgICAgICAgICBpZiAoT3B0cyAtPk9wdGltaXplUHRyKFB0ckx1dCwgSW50ZW50LCBJbnB1dEZvcm1hdCwgT3V0cHV0Rm9ybWF0LCBkd0ZsYWdzKSkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgfQorCiAgICAgLy8gT25seSBzaW1wbGUgb3B0aW1pemF0aW9ucyBzdWNjZWVkZWQKICAgICByZXR1cm4gQW55U3VjY2VzczsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwYWNrLmMgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGFjay5jCmluZGV4IGI4OTgzMGMuLjY2NTk3NzQgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwYWNrLmMKKysrIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BhY2suYwpAQCAtODgzLDYgKzg4Myw0MiBAQAogICAgIH0KIH0KIAorLy8gVGhpcyBpcyBhIGNvbnZlcnNpb24gb2YgWFlaIGZsb2F0IHRvIDE2IGJpdHMKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbFhZWkZsb2F0VG8xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCkpIHsKKworICAgICAgICBjbXNGbG9hdDMyTnVtYmVyKiBQdCA9IChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW07CisgICAgICAgIGNtc0NJRVhZWiBYWVo7CisKKyAgICAgICAgWFlaLlggPSBQdFswXTsKKyAgICAgICAgWFlaLlkgPSBQdFtTdHJpZGVdOworICAgICAgICBYWVouWiA9IFB0W1N0cmlkZSoyXTsKKyAgICAgICAgY21zRmxvYXQyWFlaRW5jb2RlZCh3SW4sICZYWVopOworCisgICAgICAgIHJldHVybiBhY2N1bSArIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKTsKKworICAgIH0KKworICAgIGVsc2UgeworICAgICAgICBjbXNGbG9hdDMyTnVtYmVyKiBQdCA9IChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW07CisgICAgICAgIGNtc0NJRVhZWiBYWVo7CisKKyAgICAgICAgWFlaLlggPSBQdFswXTsKKyAgICAgICAgWFlaLlkgPSBQdFsxXTsKKyAgICAgICAgWFlaLlogPSBQdFsyXTsKKyAgICAgICAgY21zRmxvYXQyWFlaRW5jb2RlZCh3SW4sICZYWVopOworCisgICAgICAgIGFjY3VtICs9IDMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikgKyBUX0VYVFJBKGluZm8gLT5JbnB1dEZvcm1hdCkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisKKyAgICAgICAgcmV0dXJuIGFjY3VtOworICAgIH0KK30KKwogLy8gQ2hlY2sgaWYgc3BhY2UgaXMgbWFya2VkIGFzIGluawogY21zSU5MSU5FIGNtc0Jvb2wgSXNJbmtTcGFjZShjbXNVSW50MzJOdW1iZXIgVHlwZSkKIHsKQEAgLTIzMzQsNiArMjM3MCwzOSBAQAogfQogCiBzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrWFlaRmxvYXRGcm9tMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpZiAoVF9QTEFOQVIoSW5mbyAtPiBPdXRwdXRGb3JtYXQpKSB7CisKKyAgICAgICAgY21zQ0lFWFlaIFhZWjsKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciogT3V0ID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQ7CisgICAgICAgIGNtc1hZWkVuY29kZWQyRmxvYXQoJlhZWiwgd091dCk7CisKKyAgICAgICAgT3V0WzBdICAgICAgICA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWDsKKyAgICAgICAgT3V0W1N0cmlkZV0gICA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWTsKKyAgICAgICAgT3V0W1N0cmlkZSoyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWjsKKworICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIGNtc0NJRVhZWiBYWVo7CisgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIqIE91dCA9IChjbXNGbG9hdDMyTnVtYmVyKikgb3V0cHV0OworICAgICAgICBjbXNYWVpFbmNvZGVkMkZsb2F0KCZYWVosIHdPdXQpOworCisgICAgICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWDsKKyAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIFhZWi5ZOworICAgICAgICBPdXRbMl0gPSAoY21zRmxvYXQzMk51bWJlcikgWFlaLlo7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dCArICgzICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7CisgICAgfQorfQorCitzdGF0aWMKIGNtc1VJbnQ4TnVtYmVyKiBQYWNrRG91YmxlRnJvbTE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCkBAIC0yODkzLDYgKzI5NjIsNyBAQAogICAgIHsgVFlQRV9MYWJfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBVbnJvbGxMYWJEb3VibGVUbzE2fSwKICAgICB7IFRZUEVfWFlaX0RCTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgVW5yb2xsWFlaRG91YmxlVG8xNn0sCiAgICAgeyBUWVBFX0xhYl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFVucm9sbExhYkZsb2F0VG8xNn0sCisgICAgeyBUWVBFX1hZWl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFVucm9sbFhZWkZsb2F0VG8xNn0sCiAgICAgeyBUWVBFX0dSQVlfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIFVucm9sbERvdWJsZTFDaGFufSwKICAgICB7IEZMT0FUX1NIKDEpfEJZVEVTX1NIKDApLCBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZU1dBUEZJUlNUfEFOWUZMQVZPUnwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNXQVB8QU5ZRVhUUkF8QU5ZU1BBQ0UsICAgVW5yb2xsRG91YmxlVG8xNn0sCkBAIC0zMDI3LDYgKzMwOTcsNyBAQAogICAgIHsgVFlQRV9YWVpfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgUGFja1hZWkRvdWJsZUZyb20xNn0sCiAKICAgICB7IFRZUEVfTGFiX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgIFBhY2tMYWJGbG9hdEZyb20xNn0sCisgICAgeyBUWVBFX1hZWl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICBQYWNrWFlaRmxvYXRGcm9tMTZ9LAogCiAgICAgeyBGTE9BVF9TSCgxKXxCWVRFU19TSCgwKSwgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZRVhUUkF8QU5ZU1BBQ0UsICBQYWNrRG91YmxlRnJvbTE2fSwKQEAgLTMxODIsNDAgKzMyNTMsOTggQEAKIAogfSBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3Q7CiAKLXN0YXRpYyBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QqIEZhY3RvcnlMaXN0ID0gTlVMTDsKK19jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKworCisvLyBEdXBsaWNhdGVzIHRoZSB6b25lIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBwbHVnLWluIGluIHRoZSBuZXcgY29udGV4dAorc3RhdGljCit2b2lkIER1cEZvcm1hdHRlckZhY3RvcnlMaXN0KHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUgbmV3SGVhZCA9IHsgTlVMTCB9OworICAgY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KiAgZW50cnk7CisgICBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QqICBBbnRlcmlvciA9IE5VTEw7CisgICBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW0Zvcm1hdHRlcnNQbHVnaW5dOworCisgICAgIF9jbXNBc3NlcnQoaGVhZCAhPSBOVUxMKTsKKworICAgLy8gV2FsayB0aGUgbGlzdCBjb3B5aW5nIGFsbCBub2RlcworICAgZm9yIChlbnRyeSA9IGhlYWQtPkZhY3RvcnlMaXN0OworICAgICAgIGVudHJ5ICE9IE5VTEw7CisgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKKworICAgICAgICAgICBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QgKm5ld0VudHJ5ID0gKCBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QgKikgX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGVudHJ5LCBzaXplb2YoY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KSk7CisKKyAgICAgICAgICAgaWYgKG5ld0VudHJ5ID09IE5VTEwpCisgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgLy8gV2Ugd2FudCB0byBrZWVwIHRoZSBsaW5rZWQgbGlzdCBvcmRlciwgc28gdGhpcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2t5CisgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOworICAgICAgICAgICBpZiAoQW50ZXJpb3IpCisgICAgICAgICAgICAgICBBbnRlcmlvciAtPiBOZXh0ID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgQW50ZXJpb3IgPSBuZXdFbnRyeTsKKworICAgICAgICAgICBpZiAobmV3SGVhZC5GYWN0b3J5TGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgbmV3SGVhZC5GYWN0b3J5TGlzdCA9IG5ld0VudHJ5OworICAgfQorCisgICBjdHggLT5jaHVua3NbRm9ybWF0dGVyc1BsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4LT5NZW1Qb29sLCAmbmV3SGVhZCwgc2l6ZW9mKF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlKSk7Cit9CisKKy8vIFRoZSBpbnRlcnBvbGF0aW9uIHBsdWctaW4gbWVtb3J5IGNodW5rIGFsbG9jYXRvci9kdXAKK3ZvaWQgX2Ntc0FsbG9jRm9ybWF0dGVyc1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOworCisgICAgIGlmIChzcmMgIT0gTlVMTCkgeworCisgICAgICAgICAvLyBEdXBsaWNhdGUgdGhlIExJU1QKKyAgICAgICAgIER1cEZvcm1hdHRlckZhY3RvcnlMaXN0KGN0eCwgc3JjKTsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgICBzdGF0aWMgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUgRm9ybWF0dGVyc1BsdWdpbkNodW5rID0geyBOVUxMIH07CisgICAgICAgICAgY3R4IC0+Y2h1bmtzW0Zvcm1hdHRlcnNQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZGb3JtYXR0ZXJzUGx1Z2luQ2h1bmssIHNpemVvZihfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSkpOworICAgICB9Cit9CisKIAogCiAvLyBGb3JtYXR0ZXJzIG1hbmFnZW1lbnQKLWNtc0Jvb2wgIF9jbXNSZWdpc3RlckZvcm1hdHRlcnNQbHVnaW4oY21zQ29udGV4dCBpZCwgY21zUGx1Z2luQmFzZSogRGF0YSkKK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlckZvcm1hdHRlcnNQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCiB7CisgICAgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgRm9ybWF0dGVyc1BsdWdpbik7CiAgICAgY21zUGx1Z2luRm9ybWF0dGVycyogUGx1Z2luID0gKGNtc1BsdWdpbkZvcm1hdHRlcnMqKSBEYXRhOwogICAgIGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdCogZmwgOwogCi0gICAgLy8gUmVzZXQKKyAgICAvLyBSZXNldCB0byBidWlsdC1pbiBkZWZhdWx0cwogICAgIGlmIChEYXRhID09IE5VTEwpIHsKIAotICAgICAgICAgIEZhY3RvcnlMaXN0ID0gTlVMTDsKKyAgICAgICAgICBjdHggLT5GYWN0b3J5TGlzdCA9IE5VTEw7CiAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgZmwgPSAoY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KikgX2Ntc1BsdWdpbk1hbGxvYyhpZCwgc2l6ZW9mKGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdCkpOworICAgIGZsID0gKGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdCopIF9jbXNQbHVnaW5NYWxsb2MoQ29udGV4dElELCBzaXplb2YoY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KSk7CiAgICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgIGZsIC0+RmFjdG9yeSAgICA9IFBsdWdpbiAtPkZvcm1hdHRlcnNGYWN0b3J5OwogCi0gICAgZmwgLT5OZXh0ID0gRmFjdG9yeUxpc3Q7Ci0gICAgRmFjdG9yeUxpc3QgPSBmbDsKKyAgICBmbCAtPk5leHQgPSBjdHggLT4gRmFjdG9yeUxpc3Q7CisgICAgY3R4IC0+RmFjdG9yeUxpc3QgPSBmbDsKIAogICAgIHJldHVybiBUUlVFOwogfQogCi1jbXNGb3JtYXR0ZXIgX2Ntc0dldEZvcm1hdHRlcihjbXNVSW50MzJOdW1iZXIgVHlwZSwgICAgICAgICAvLyBTcGVjaWZpYyB0eXBlLCBpLmUuIFRZUEVfUkdCXzgKK2Ntc0Zvcm1hdHRlciBfY21zR2V0Rm9ybWF0dGVyKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVHlwZSwgICAgICAgICAvLyBTcGVjaWZpYyB0eXBlLCBpLmUuIFRZUEVfUkdCXzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRm9ybWF0dGVyRGlyZWN0aW9uIERpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCiB7CisgICAgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgRm9ybWF0dGVyc1BsdWdpbik7CiAgICAgY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KiBmOwogCi0gICAgZm9yIChmID0gRmFjdG9yeUxpc3Q7IGYgIT0gTlVMTDsgZiA9IGYgLT5OZXh0KSB7CisgICAgZm9yIChmID1jdHgtPkZhY3RvcnlMaXN0OyBmICE9IE5VTEw7IGYgPSBmIC0+TmV4dCkgewogCiAgICAgICAgIGNtc0Zvcm1hdHRlciBmbiA9IGYgLT5GYWN0b3J5KFR5cGUsIERpciwgZHdGbGFncyk7CiAgICAgICAgIGlmIChmbi5GbXQxNiAhPSBOVUxMKSByZXR1cm4gZm47CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGx1Z2luLmMgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGx1Z2luLmMKaW5kZXggM2Q0MzQ4NS4uZWY3NWUxMyAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BsdWdpbi5jCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwbHVnaW4uYwpAQCAtNTQ0LDIyICs1NDQsMzEgQEAKIAogLy8gUGx1Z2luIG1lbW9yeSBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIF9jbXNTdWJBbGxvY2F0b3IqIFBsdWdpblBvb2wgPSBOVUxMOwotCiAvLyBTcGVjaWFsaXplZCBtYWxsb2MgZm9yIHBsdWctaW5zLCB0aGF0IGlzIGZyZWVkIHVwb24gZXhpdC4KLXZvaWQqIF9jbXNQbHVnaW5NYWxsb2MoY21zQ29udGV4dCBpZCwgY21zVUludDMyTnVtYmVyIHNpemUpCit2b2lkKiBfY21zUGx1Z2luTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKIHsKLSAgICBpZiAoUGx1Z2luUG9vbCA9PSBOVUxMKQotICAgICAgICBQbHVnaW5Qb29sID0gX2Ntc0NyZWF0ZVN1YkFsbG9jKGlkLCA0KjEwMjQpOworICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCA9IF9jbXNHZXRDb250ZXh0KENvbnRleHRJRCk7CiAKLSAgICByZXR1cm4gX2Ntc1N1YkFsbG9jKFBsdWdpblBvb2wsIHNpemUpOworICAgIGlmIChjdHggLT5NZW1Qb29sID09IE5VTEwpIHsKKworICAgICAgICBpZiAoQ29udGV4dElEID09IE5VTEwpIHsKKworICAgICAgICAgICAgY3R4LT5NZW1Qb29sID0gX2Ntc0NyZWF0ZVN1YkFsbG9jKDAsIDIqMTAyNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICJOVUxMIG1lbW9yeSBwb29sIG9uIGNvbnRleHQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIF9jbXNTdWJBbGxvYyhjdHgtPk1lbVBvb2wsIHNpemUpOwogfQogCiAKIC8vIE1haW4gcGx1Zy1pbiBkaXNwYXRjaGVyCiBjbXNCb29sIENNU0VYUE9SVCBjbXNQbHVnaW4odm9pZCogUGx1Z19pbikKIHsKLSAgcmV0dXJuIGNtc1BsdWdpblRIUihOVUxMLCBQbHVnX2luKTsKKyAgICByZXR1cm4gY21zUGx1Z2luVEhSKE5VTEwsIFBsdWdfaW4pOwogfQogCiBjbXNCb29sIENNU0VYUE9SVCBjbXNQbHVnaW5USFIoY21zQ29udGV4dCBpZCwgdm9pZCogUGx1Z19pbikKQEAgLTU3MSwxMiArNTgwLDEyIEBACiAgICAgICAgICBQbHVnaW4gPSBQbHVnaW4gLT4gTmV4dCkgewogCiAgICAgICAgICAgICBpZiAoUGx1Z2luIC0+IE1hZ2ljICE9IGNtc1BsdWdpbk1hZ2ljTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoMCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnJlY29nbml6ZWQgcGx1Z2luIik7CisgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoaWQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5yZWNvZ25pemVkIHBsdWdpbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKFBsdWdpbiAtPkV4cGVjdGVkVmVyc2lvbiA+IExDTVNfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKDAsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAicGx1Z2luIG5lZWRzIExpdHRsZSBDTVMgJWQsIGN1cnJlbnQgIHZlcnNpb24gaXMgJWQiLAorICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKGlkLCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgInBsdWdpbiBuZWVkcyBMaXR0bGUgQ01TICVkLCBjdXJyZW50IHZlcnNpb24gaXMgJWQiLAogICAgICAgICAgICAgICAgICAgICBQbHVnaW4gLT5FeHBlY3RlZFZlcnNpb24sIExDTVNfVkVSU0lPTik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQpAQCAtNTg0LDExICs1OTMsMTEgQEAKICAgICAgICAgICAgIHN3aXRjaCAoUGx1Z2luIC0+IFR5cGUpIHsKIAogICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luTWVtSGFuZGxlclNpZzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKFBsdWdpbikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5JbnRlcnBvbGF0aW9uU2lnOgotICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlckludGVycFBsdWdpbihQbHVnaW4pKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5UYWdUeXBlU2lnOgpAQCAtNjIzLDggKzYzMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlclRyYW5zZm9ybVBsdWdpbihpZCwgUGx1Z2luKSkgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luTXV0ZXhTaWc6CisgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlZ2lzdGVyTXV0ZXhQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcigwLCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVucmVjb2duaXplZCBwbHVnaW4gdHlwZSAnJVgnIiwgUGx1Z2luIC0+IFR5cGUpOworICAgICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihpZCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnJlY29nbml6ZWQgcGx1Z2luIHR5cGUgJyVYJyIsIFBsdWdpbiAtPiBUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQogICAgIH0KQEAgLTYzNywxOSArNjUwLDMzNyBAQAogLy8gUmV2ZXJ0IGFsbCBwbHVnLWlucyB0byBkZWZhdWx0CiB2b2lkIENNU0VYUE9SVCBjbXNVbnJlZ2lzdGVyUGx1Z2lucyh2b2lkKQogewotICAgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKE5VTEwpOwotICAgIF9jbXNSZWdpc3RlclRhZ1R5cGVQbHVnaW4oTlVMTCwgTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKE5VTEwsIE5VTEwpOwotICAgIF9jbXNSZWdpc3RlckZvcm1hdHRlcnNQbHVnaW4oTlVMTCwgTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVyUmVuZGVyaW5nSW50ZW50UGx1Z2luKE5VTEwsIE5VTEwpOwotICAgIF9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oTlVMTCwgTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVyTXVsdGlQcm9jZXNzRWxlbWVudFBsdWdpbihOVUxMLCBOVUxMKTsKLSAgICBfY21zUmVnaXN0ZXJPcHRpbWl6YXRpb25QbHVnaW4oTlVMTCwgTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVyVHJhbnNmb3JtUGx1Z2luKE5VTEwsIE5VTEwpOwotCi0gICAgaWYgKFBsdWdpblBvb2wgIT0gTlVMTCkKLSAgICAgICAgX2Ntc1N1YkFsbG9jRGVzdHJveShQbHVnaW5Qb29sKTsKLQotICAgIFBsdWdpblBvb2wgPSBOVUxMOworICAgIGNtc1VucmVnaXN0ZXJQbHVnaW5zVEhSKE5VTEwpOwogfQorCisKKy8vIFRoZSBHbG9iYWwgc3RvcmFnZSBmb3Igc3lzdGVtIGNvbnRleHQuIFRoaXMgaXMgdGhlIG9uZSBhbmQgb25seSBnbG9iYWwgdmFyaWFibGUKKy8vIHBvaW50ZXJzIHN0cnVjdHVyZS4gQWxsIGdsb2JhbCB2YXJzIGFyZSByZWZlcmVuY2VkIGhlcmUuCitzdGF0aWMgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCBnbG9iYWxDb250ZXh0ID0geworCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgaW4gdGhlIGxpbmtlZCBsaXN0CisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzdWJhbGxvY2F0b3IKKyAgICB7CisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgVXNlclB0ciwKKyAgICAgICAgJl9jbXNMb2dFcnJvckNodW5rLCAgICAgICAgICAgIC8vICBMb2dnZXIsCisgICAgICAgICZfY21zQWxhcm1Db2Rlc0NodW5rLCAgICAgICAgICAvLyAgQWxhcm1Db2RlcywKKyAgICAgICAgJl9jbXNBZGFwdGF0aW9uU3RhdGVDaHVuaywgICAgIC8vICBBZGFwdGF0aW9uU3RhdGUsCisgICAgICAgICZfY21zTWVtUGx1Z2luQ2h1bmssICAgICAgICAgICAvLyAgTWVtUGx1Z2luLAorICAgICAgICAmX2Ntc0ludGVycFBsdWdpbkNodW5rLCAgICAgICAgLy8gIEludGVycFBsdWdpbiwKKyAgICAgICAgJl9jbXNDdXJ2ZXNQbHVnaW5DaHVuaywgICAgICAgIC8vICBDdXJ2ZXNQbHVnaW4sCisgICAgICAgICZfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rLCAgICAvLyAgRm9ybWF0dGVyc1BsdWdpbiwKKyAgICAgICAgJl9jbXNUYWdUeXBlUGx1Z2luQ2h1bmssICAgICAgIC8vICBUYWdUeXBlUGx1Z2luLAorICAgICAgICAmX2Ntc1RhZ1BsdWdpbkNodW5rLCAgICAgICAgICAgLy8gIFRhZ1BsdWdpbiwKKyAgICAgICAgJl9jbXNJbnRlbnRzUGx1Z2luQ2h1bmssICAgICAgIC8vICBJbnRlbnRQbHVnaW4sCisgICAgICAgICZfY21zTVBFVHlwZVBsdWdpbkNodW5rLCAgICAgICAvLyAgTVBFUGx1Z2luLAorICAgICAgICAmX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rLCAgLy8gIE9wdGltaXphdGlvblBsdWdpbiwKKyAgICAgICAgJl9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVuaywgICAgIC8vICBUcmFuc2Zvcm1QbHVnaW4sCisgICAgICAgICZfY21zTXV0ZXhQbHVnaW5DaHVuayAgICAgICAgICAvLyAgTXV0ZXhQbHVnaW4KKyAgICB9LAorCisgICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0gLy8gVGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRvciBpcyBub3QgdXNlZCBmb3IgY29udGV4dCAwCit9OworCisKKy8vIFRoZSBjb250ZXh0IHBvb2wgKGxpbmtlZCBsaXN0IGhlYWQpCitzdGF0aWMgX2Ntc011dGV4IF9jbXNDb250ZXh0UG9vbEhlYWRNdXRleCA9IENNU19NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBfY21zQ29udGV4dFBvb2xIZWFkID0gTlVMTDsKKworLy8gSW50ZXJuYWwsIGdldCBhc3NvY2lhdGVkIHBvaW50ZXIsIHdpdGggZ3Vlc3NpbmcuIE5ldmVyIHJldHVybnMgTlVMTC4KK3N0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIF9jbXNHZXRDb250ZXh0KGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGlkID0gKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqKSBDb250ZXh0SUQ7CisgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4OworCisKKyAgICAvLyBPbiAwLCB1c2UgZ2xvYmFsIHNldHRpbmdzCisgICAgaWYgKGlkID09IE5VTEwpCisgICAgICAgIHJldHVybiAmZ2xvYmFsQ29udGV4dDsKKworICAgIC8vIFNlYXJjaAorICAgIGZvciAoY3R4ID0gX2Ntc0NvbnRleHRQb29sSGVhZDsKKyAgICAgICAgIGN0eCAhPSBOVUxMOworICAgICAgICAgY3R4ID0gY3R4IC0+TmV4dCkgeworCisgICAgICAgICAgICAvLyBGb3VuZCBpdD8KKyAgICAgICAgICAgIGlmIChpZCA9PSBjdHgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGN0eDsgLy8gTmV3LXN0eWxlIGNvbnRleHQsCisgICAgfQorCisgICAgcmV0dXJuICZnbG9iYWxDb250ZXh0OworfQorCisKKy8vIEludGVybmFsOiBnZXQgdGhlIG1lbW9yeSBhcmVhIGFzc29jaWFudGVkIHdpdGggZWFjaCBjb250ZXh0IGNsaWVudAorLy8gUmV0dXJucyB0aGUgYmxvY2sgYXNzaWduZWQgdG8gdGhlIHNwZWNpZmljIHpvbmUuCit2b2lkKiBfY21zQ29udGV4dEdldENsaWVudENodW5rKGNtc0NvbnRleHQgQ29udGV4dElELCBfY21zTWVtb3J5Q2xpZW50IG1jKQoreworICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eDsKKyAgICB2b2lkICpwdHI7CisKKyAgICBpZiAobWMgPCAwIHx8IG1jID49IE1lbW9yeUNsaWVudE1heCkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiQmFkIGNvbnRleHQgY2xpZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGN0eCA9IF9jbXNHZXRDb250ZXh0KENvbnRleHRJRCk7CisgICAgcHRyID0gY3R4IC0+Y2h1bmtzW21jXTsKKworICAgIGlmIChwdHIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHB0cjsKKworICAgIC8vIEEgbnVsbCBwdHIgbWVhbnMgbm8gc3BlY2lhbCBzZXR0aW5ncyBmb3IgdGhhdCBjb250ZXh0LCBhbmQgdGhpcworICAgIC8vIHJldmVydHMgdG8gQ29udGV4dDAgZ2xvYmFscworICAgIHJldHVybiBnbG9iYWxDb250ZXh0LmNodW5rc1ttY107Cit9CisKKworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBnaXZlbiBjb250ZXh0IGl0cyBkZWZhdWx0IHByaXN0aW5lIHN0YXRlLAorLy8gYXMgbm8gcGx1Zy1pbnMgd2VyZSBkZWNsYXJlZC4gVGhlcmUgaXMgbm8gd2F5IHRvIHVucmVnaXN0ZXIgYSBzaW5nbGUKKy8vIHBsdWctaW4sIGFzIGEgc2luZ2xlIGNhbGwgdG8gY21zUGx1Z2luVEhSKCkgZnVuY3Rpb24gbWF5IHJlZ2lzdGVyCisvLyBtYW55IGRpZmZlcmVudCBwbHVnLWlucyBzaW11bHRhbmVvdXNseSwgdGhlbiB0aGVyZSBpcyBubyB3YXkgdG8KKy8vIGlkZW50aWZ5IHdoaWNoIHBsdWctaW4gdG8gdW5yZWdpc3Rlci4KK3ZvaWQgQ01TRVhQT1JUIGNtc1VucmVnaXN0ZXJQbHVnaW5zVEhSKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKKyAgICBfY21zUmVnaXN0ZXJJbnRlcnBQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKKyAgICBfY21zUmVnaXN0ZXJUYWdUeXBlUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyRm9ybWF0dGVyc1BsdWdpbihDb250ZXh0SUQsIE5VTEwpOworICAgIF9jbXNSZWdpc3RlclJlbmRlcmluZ0ludGVudFBsdWdpbihDb250ZXh0SUQsIE5VTEwpOworICAgIF9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKKyAgICBfY21zUmVnaXN0ZXJNdWx0aVByb2Nlc3NFbGVtZW50UGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyT3B0aW1pemF0aW9uUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyVHJhbnNmb3JtUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyTXV0ZXhQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKK30KKworCisvLyBSZXR1cm5zIHRoZSBtZW1vcnkgbWFuYWdlciBwbHVnLWluLCBpZiBhbnksIGZyb20gdGhlIFBsdWctaW4gYnVuZGxlCitzdGF0aWMKK2Ntc1BsdWdpbk1lbUhhbmRsZXIqIF9jbXNGaW5kTWVtb3J5UGx1Z2luKHZvaWQqIFBsdWdpbkJ1bmRsZSkKK3sKKyAgICBjbXNQbHVnaW5CYXNlKiBQbHVnaW47CisKKyAgICBmb3IgKFBsdWdpbiA9IChjbXNQbHVnaW5CYXNlKikgUGx1Z2luQnVuZGxlOworICAgICAgICBQbHVnaW4gIT0gTlVMTDsKKyAgICAgICAgUGx1Z2luID0gUGx1Z2luIC0+IE5leHQpIHsKKworICAgICAgICAgICAgaWYgKFBsdWdpbiAtPiBNYWdpYyA9PSBjbXNQbHVnaW5NYWdpY051bWJlciAmJgorICAgICAgICAgICAgICAgIFBsdWdpbiAtPiBFeHBlY3RlZFZlcnNpb24gPD0gTENNU19WRVJTSU9OICYmCisgICAgICAgICAgICAgICAgUGx1Z2luIC0+IFR5cGUgPT0gY21zUGx1Z2luTWVtSGFuZGxlclNpZykgeworCisgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNtc1BsdWdpbk1lbUhhbmRsZXIqKSBQbHVnaW47CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm9wZSwgcmV2ZXJ0IHRvIGRlZmF1bHRzCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLy8gQ3JlYXRlcyBhIG5ldyBjb250ZXh0IHdpdGggb3B0aW9uYWwgYXNzb2NpYXRlZCBwbHVnLWlucy4gQ2FsbGVyIG1heSBhbHNvIHNwZWNpZnkgYW4gb3B0aW9uYWwgcG9pbnRlciB0byB1c2VyLWRlZmluZWQKKy8vIGRhdGEgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBwbHVnLWlucyBhbmQgbG9nZ2VyLgorY21zQ29udGV4dCBDTVNFWFBPUlQgY21zQ3JlYXRlQ29udGV4dCh2b2lkKiBQbHVnaW4sIHZvaWQqIFVzZXJEYXRhKQoreworICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eDsKKyAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0ICBmYWtlQ29udGV4dDsKKworICAgIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoX2Ntc0ZpbmRNZW1vcnlQbHVnaW4oUGx1Z2luKSwgJmZha2VDb250ZXh0LkRlZmF1bHRNZW1vcnlNYW5hZ2VyKTsKKworICAgIGZha2VDb250ZXh0LmNodW5rc1tVc2VyUHRyXSAgICAgPSBVc2VyRGF0YTsKKyAgICBmYWtlQ29udGV4dC5jaHVua3NbTWVtUGx1Z2luXSAgID0gJmZha2VDb250ZXh0LkRlZmF1bHRNZW1vcnlNYW5hZ2VyOworCisgICAgLy8gQ3JlYXRlIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4KKyAgICBjdHggPSAoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCopIF9jbXNNYWxsb2MoJmZha2VDb250ZXh0LCBzaXplb2Yoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAvLyBTb21ldGhpbmcgdmVyeSB3cm9uZyBoYXBwZW5lZCEKKworICAgIC8vIEluaXQgdGhlIHN0cnVjdHVyZSBhbmQgdGhlIG1lbW9yeSBtYW5hZ2VyCisgICAgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QpKTsKKworICAgIC8vIEtlZXAgbWVtb3J5IG1hbmFnZXIKKyAgICBtZW1jcHkoJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXIsICZmYWtlQ29udGV4dC5EZWZhdWx0TWVtb3J5TWFuYWdlciwgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVuaykpOworCisgICAgLy8gTWFpbnRhaW4gdGhlIGxpbmtlZCBsaXN0ICh3aXRoIHByb3BlciBsb2NraW5nKQorICAgIF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKKyAgICAgICBjdHggLT5OZXh0ID0gX2Ntc0NvbnRleHRQb29sSGVhZDsKKyAgICAgICBfY21zQ29udGV4dFBvb2xIZWFkID0gY3R4OworICAgIF9jbXNMZWF2ZUNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKKworICAgIGN0eCAtPmNodW5rc1tVc2VyUHRyXSAgICAgPSBVc2VyRGF0YTsKKyAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSAgID0gJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7CisKKyAgICAvLyBOb3cgd2UgY2FuIGFsbG9jYXRlIHRoZSBwb29sIGJ5IHVzaW5nIGRlZmF1bHQgbWVtb3J5IG1hbmFnZXIKKyAgICBjdHggLT5NZW1Qb29sID0gX2Ntc0NyZWF0ZVN1YkFsbG9jKGN0eCwgMjIgKiBzaXplb2Yodm9pZCopKTsgIC8vIGRlZmF1bHQgc2l6ZSBhYm91dCAzMiBwb2ludGVycworICAgIGlmIChjdHggLT5NZW1Qb29sID09IE5VTEwpIHsKKworICAgICAgICAgY21zRGVsZXRlQ29udGV4dChjdHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfY21zQWxsb2NMb2dFcnJvckNodW5rKGN0eCwgTlVMTCk7CisgICAgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKGN0eCwgTlVMTCk7CisgICAgX2Ntc0FsbG9jQWRhcHRhdGlvblN0YXRlQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NNZW1QbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY0ludGVycFBsdWdpbkNodW5rKGN0eCwgTlVMTCk7CisgICAgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NUYWdUeXBlUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NNUEVUeXBlUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NUYWdQbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY0ludGVudHNQbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY09wdGltaXphdGlvblBsdWdpbkNodW5rKGN0eCwgTlVMTCk7CisgICAgX2Ntc0FsbG9jVHJhbnNmb3JtUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKGN0eCwgTlVMTCk7CisKKyAgICAvLyBTZXR1cCB0aGUgcGx1Zy1pbnMKKyAgICBpZiAoIWNtc1BsdWdpblRIUihjdHgsIFBsdWdpbikpIHsKKworICAgICAgICBjbXNEZWxldGVDb250ZXh0KGN0eCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoY21zQ29udGV4dCkgY3R4OworfQorCisvLyBEdXBsaWNhdGVzIGEgY29udGV4dCB3aXRoIGFsbCBhc3NvY2lhdGVkIHBsdWctaW5zLgorLy8gQ2FsbGVyIG1heSBzcGVjaWZ5IGFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gdXNlci1kZWZpbmVkCisvLyBkYXRhIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gcGx1Zy1pbnMgYW5kIGxvZ2dlci4KK2Ntc0NvbnRleHQgQ01TRVhQT1JUIGNtc0R1cENvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIE5ld1VzZXJEYXRhKQoreworICAgIGludCBpOworICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eDsKKyAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMgPSBfY21zR2V0Q29udGV4dChDb250ZXh0SUQpOworCisgICAgdm9pZCogdXNlckRhdGEgPSAoTmV3VXNlckRhdGEgIT0gTlVMTCkgPyBOZXdVc2VyRGF0YSA6IHNyYyAtPiBjaHVua3NbVXNlclB0cl07CisKKworICAgIGN0eCA9IChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KikgX2Ntc01hbGxvYyhDb250ZXh0SUQsIHNpemVvZihzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KSk7CisgICAgaWYgKGN0eCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsgICAgIC8vIFNvbWV0aGluZyB2ZXJ5IHdyb25nIGhhcHBlbmVkCisKKyAgICAvLyBTZXR1cCBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0b3JzCisgICAgbWVtY3B5KCZjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyLCAmc3JjLT5EZWZhdWx0TWVtb3J5TWFuYWdlciwgc2l6ZW9mKGN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXIpKTsKKworICAgIC8vIE1haW50YWluIHRoZSBsaW5rZWQgbGlzdAorICAgIF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKKyAgICAgICBjdHggLT5OZXh0ID0gX2Ntc0NvbnRleHRQb29sSGVhZDsKKyAgICAgICBfY21zQ29udGV4dFBvb2xIZWFkID0gY3R4OworICAgIF9jbXNMZWF2ZUNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKKworICAgIGN0eCAtPmNodW5rc1tVc2VyUHRyXSAgICA9IHVzZXJEYXRhOworICAgIGN0eCAtPmNodW5rc1tNZW1QbHVnaW5dICA9ICZjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyOworCisgICAgY3R4IC0+TWVtUG9vbCA9IF9jbXNDcmVhdGVTdWJBbGxvYyhjdHgsIDIyICogc2l6ZW9mKHZvaWQqKSk7CisgICAgaWYgKGN0eCAtPk1lbVBvb2wgPT0gTlVMTCkgeworCisgICAgICAgICBjbXNEZWxldGVDb250ZXh0KGN0eCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGFsbCByZXF1aXJlZCBjaHVua3MuCisgICAgX2Ntc0FsbG9jTG9nRXJyb3JDaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NBZGFwdGF0aW9uU3RhdGVDaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jTWVtUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY0ludGVycFBsdWdpbkNodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NDdXJ2ZXNQbHVnaW5DaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jRm9ybWF0dGVyc1BsdWdpbkNodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NUYWdUeXBlUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY01QRVR5cGVQbHVnaW5DaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jVGFnUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY0ludGVudHNQbHVnaW5DaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY1RyYW5zZm9ybVBsdWdpbkNodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKGN0eCwgc3JjKTsKKworICAgIC8vIE1ha2Ugc3VyZSBubyBvbmUgZmFpbGVkCisgICAgZm9yIChpPUxvZ2dlcjsgaSA8IE1lbW9yeUNsaWVudE1heDsgaSsrKSB7CisKKyAgICAgICAgaWYgKHNyYyAtPmNodW5rc1tpXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBjbXNEZWxldGVDb250ZXh0KChjbXNDb250ZXh0KSBjdHgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKGNtc0NvbnRleHQpIGN0eDsKK30KKworCisKK3N0YXRpYworc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogRmluZFByZXYoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogaWQpCit7CisgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogcHJldjsKKworICAgIC8vIFNlYXJjaCBmb3IgcHJldmlvdXMKKyAgICBmb3IgKHByZXYgPSBfY21zQ29udGV4dFBvb2xIZWFkOworICAgICAgICAgICAgIHByZXYgIT0gTlVMTDsKKyAgICAgICAgICAgICBwcmV2ID0gcHJldiAtPk5leHQpCisgICAgeworICAgICAgICBpZiAocHJldiAtPk5leHQgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gcHJldjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsgIC8vIExpc3QgaXMgZW1wdHkgb3Igb25seSBvbmUgZWxlbWVudCEKK30KKworLy8gRnJlZXMgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbnRleHQsCisvLyBhbmQgZGVzdHJveXMgdGhlIGNvbnRleHQgcGxhY2Vob2xkZXIuCisvLyBUaGUgQ29udGV4dElEIGNhbiBubyBsb25nZXIgYmUgdXNlZCBpbiBhbnkgVEhSIG9wZXJhdGlvbi4KK3ZvaWQgQ01TRVhQT1JUIGNtc0RlbGV0ZUNvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgaWYgKENvbnRleHRJRCAhPSBOVUxMKSB7CisKKyAgICAgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4ID0gKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqKSBDb250ZXh0SUQ7CisgICAgICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QgIGZha2VDb250ZXh0OworICAgICAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBwcmV2OworCisgICAgICAgIG1lbWNweSgmZmFrZUNvbnRleHQuRGVmYXVsdE1lbW9yeU1hbmFnZXIsICZjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyLCBzaXplb2YoY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlcikpOworCisgICAgICAgIGZha2VDb250ZXh0LmNodW5rc1tVc2VyUHRyXSAgICAgPSBjdHggLT5jaHVua3NbVXNlclB0cl07CisgICAgICAgIGZha2VDb250ZXh0LmNodW5rc1tNZW1QbHVnaW5dICAgPSAmZmFrZUNvbnRleHQuRGVmYXVsdE1lbW9yeU1hbmFnZXI7CisKKyAgICAgICAgLy8gR2V0IHJpZCBvZiBwbHVnaW5zCisgICAgICAgIGNtc1VucmVnaXN0ZXJQbHVnaW5zVEhSKENvbnRleHRJRCk7CisKKyAgICAgICAgLy8gU2luY2UgYWxsIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gdGhlIHByaXZhdGUgcG9vbCwgYWxsIHdoYXQgd2UgbmVlZCB0byBkbyBpcyBkZXN0cm95IHRoZSBwb29sCisgICAgICAgIGlmIChjdHggLT4gTWVtUG9vbCAhPSBOVUxMKQorICAgICAgICAgICAgICBfY21zU3ViQWxsb2NEZXN0cm95KGN0eCAtPk1lbVBvb2wpOworICAgICAgICBjdHggLT4gTWVtUG9vbCA9IE5VTEw7CisKKyAgICAgICAgLy8gTWFpbnRhaW4gbGlzdAorICAgICAgICBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoJl9jbXNDb250ZXh0UG9vbEhlYWRNdXRleCk7CisgICAgICAgIGlmIChfY21zQ29udGV4dFBvb2xIZWFkID09IGN0eCkgeworCisgICAgICAgICAgICBfY21zQ29udGV4dFBvb2xIZWFkID0gY3R4LT5OZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHByZXZpb3VzCisgICAgICAgICAgICBmb3IgKHByZXYgPSBfY21zQ29udGV4dFBvb2xIZWFkOworICAgICAgICAgICAgICAgIHByZXYgIT0gTlVMTDsKKyAgICAgICAgICAgICAgICBwcmV2ID0gcHJldiAtPk5leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByZXYgLT4gTmV4dCA9PSBjdHgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldiAtPiBOZXh0ID0gY3R4IC0+TmV4dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9jbXNMZWF2ZUNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKKworICAgICAgICAvLyBmcmVlIHRoZSBtZW1vcnkgYmxvY2sgaXRzZWxmCisgICAgICAgIF9jbXNGcmVlKCZmYWtlQ29udGV4dCwgY3R4KTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgdGhlIHVzZXIgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBDb250ZXh0SUQsIG9yIE5VTEwgaWYgbm8gdXNlciBkYXRhIHdhcyBhdHRhY2hlZCBvbiBjb250ZXh0IGNyZWF0aW9uCit2b2lkKiBDTVNFWFBPUlQgY21zR2V0Q29udGV4dFVzZXJEYXRhKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIHJldHVybiBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgVXNlclB0cik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BzMi5jIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BzMi5jCmluZGV4IDJkYTVhMmIuLjIyMDg5ZDAgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwczIuYworKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcHMyLmMKQEAgLTk0Miw3ICs5NDIsNyBAQAogICAgICAgICAgICAgaWYgKERldmljZUxpbmsgPT0gTlVMTCkgcmV0dXJuIDA7CiAKICAgICAgICAgICAgIGR3RmxhZ3MgfD0gY21zRkxBR1NfRk9SQ0VfQ0xVVDsKLSAgICAgICAgICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKCZEZXZpY2VMaW5rLCBJbnRlbnQsICZJbnB1dEZvcm1hdCwgJk91dEZybSwgJmR3RmxhZ3MpOworICAgICAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUobS0+Q29udGV4dElELCAmRGV2aWNlTGluaywgSW50ZW50LCAmSW5wdXRGb3JtYXQsICZPdXRGcm0sICZkd0ZsYWdzKTsKIAogICAgICAgICAgICAgcmMgPSBFbWl0Q0lFQmFzZWRERUYobSwgRGV2aWNlTGluaywgSW50ZW50LCAmQmxhY2tQb2ludEFkYXB0ZWRUb0Q1MCk7CiAgICAgICAgICAgICBjbXNQaXBlbGluZUZyZWUoRGV2aWNlTGluayk7CkBAIC0xMzU5LDcgKzEzNTksNyBAQAogCiAgICAgLy8gV2UgbmVlZCBhIENMVVQKICAgICBkd0ZsYWdzIHw9IGNtc0ZMQUdTX0ZPUkNFX0NMVVQ7Ci0gICAgX2Ntc09wdGltaXplUGlwZWxpbmUoJkRldmljZUxpbmssIFJlbGF0aXZlRW5jb2RpbmdJbnRlbnQsICZJbkZybSwgJk91dHB1dEZvcm1hdCwgJmR3RmxhZ3MpOworICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKG0tPkNvbnRleHRJRCwgJkRldmljZUxpbmssIFJlbGF0aXZlRW5jb2RpbmdJbnRlbnQsICZJbkZybSwgJk91dHB1dEZvcm1hdCwgJmR3RmxhZ3MpOwogCiAgICAgX2Ntc0lPUHJpbnRmKG0sICI8PFxuIik7CiAgICAgX2Ntc0lPUHJpbnRmKG0sICIvQ29sb3JSZW5kZXJpbmdUeXBlIDFcbiIpOwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3R5cGVzLmMgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdHlwZXMuYwppbmRleCBmNDM0Y2ZkLi4wOGNhZDVlIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdHlwZXMuYworKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdHlwZXMuYwpAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC02MSw3ICs2MSw3IEBACiAvLyBhcmUgbm8gcHJvZmlsZXMgaG9sZGluZyB0aGVtLiBUaGUgcHJvZ3JhbW1lciBjYW4gYWxzbyBleHRlbmQgdGhpcyBsaXN0IGJ5IGRlZmluaW5nIGhpcyBvd24gdHlwZXMKIC8vIGJ5IHVzaW5nIHRoZSBhcHByb3BpYXRlIHBsdWctaW4uIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBwbHVnIGlucyByZWdhcmRpbmcgdGhhdC4gRmlyc3QgdHlwZQogLy8gYWxsb3dzIHRvIGRlZmluZSBuZXcgdGFncyB1c2luZyBhbnkgZXhpc3RpbmcgdHlwZS4gTmV4dCBwbHVnLWluIHR5cGUgYWxsb3dzIHRvIGRlZmluZSBuZXcgdHlwZXMKLS8vIGFuZCB0aGUgdGhpcmQgb25lIGlzIHZlcnkgc3BlY2lmaWM6IGFsbG93cyB0byBleHRlbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbXVsdGlwcm9maWxlCisvLyBhbmQgdGhlIHRoaXJkIG9uZSBpcyB2ZXJ5IHNwZWNpZmljOiBhbGxvd3MgdG8gZXh0ZW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG11bHRpcHJvY2Vzc2luZwogLy8gZWxlbWVudHMgc3BlY2lhbCB0eXBlLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC04OSw1NCArODksNDkgQEAKIC8vIEhlbHBlciBtYWNybyB0byBkZWZpbmUgYSBNUEUgaGFuZGxlci4gQ2FsbGJhY2tzIGRvIGhhdmUgYSBmaXhlZCBuYW1pbmcgY29udmVudGlvbgogI2RlZmluZSBUWVBFX01QRV9IQU5ETEVSKHQsIHgpICB7ICh0KSwgUkVBRF9GTih4KSwgV1JJVEVfRk4oeCksIEdlbmVyaWNNUEVkdXAsIEdlbmVyaWNNUEVmcmVlLCBOVUxMLCAwIH0KIAotLy8gUmVnaXN0ZXIgYSBuZXcgdHlwZSBoYW5kbGVyLiBUaGlzIHJvdXRpbmUgaXMgc2hhcmVkIGJldHdlZW4gbm9ybWFsIHR5cGVzIGFuZCBNUEUKKy8vIFJlZ2lzdGVyIGEgbmV3IHR5cGUgaGFuZGxlci4gVGhpcyByb3V0aW5lIGlzIHNoYXJlZCBiZXR3ZWVuIG5vcm1hbCB0eXBlcyBhbmQgTVBFLiBMaW5rZWRMaXN0IHBvaW50cyB0byB0aGUgb3B0aW9uYWwgbGlzdCBoZWFkCiBzdGF0aWMKLWNtc0Jvb2wgUmVnaXN0ZXJUeXBlc1BsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhLCBfY21zVGFnVHlwZUxpbmtlZExpc3QqIExpbmtlZExpc3QsIGNtc1VJbnQzMk51bWJlciBEZWZhdWx0TGlzdENvdW50KQorY21zQm9vbCBSZWdpc3RlclR5cGVzUGx1Z2luKGNtc0NvbnRleHQgaWQsIGNtc1BsdWdpbkJhc2UqIERhdGEsIF9jbXNNZW1vcnlDbGllbnQgcG9zKQogewogICAgIGNtc1BsdWdpblRhZ1R5cGUqIFBsdWdpbiA9IChjbXNQbHVnaW5UYWdUeXBlKikgRGF0YTsKLSAgICBfY21zVGFnVHlwZUxpbmtlZExpc3QgKnB0LCAqQW50ZXJpb3IgPSBOVUxMOworICAgIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhpZCwgcG9zKTsKKyAgICBfY21zVGFnVHlwZUxpbmtlZExpc3QgKnB0OwogCiAgICAgLy8gQ2FsbGluZyB0aGUgZnVuY3Rpb24gd2l0aCBOVUxMIGFzIHBsdWctaW4gd291bGQgdW5yZWdpc3RlciB0aGUgcGx1ZyBpbi4KICAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CiAKLSAgICAgICAgTGlua2VkTGlzdFtEZWZhdWx0TGlzdENvdW50LTFdLk5leHQgPSBOVUxMOworICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHNldCBmcmVlIHRoZSBtZW1vcnksIGFzIHBvb2wgaXMgZGVzdHJveWVkIGFzIGEgd2hvbGUuCisgICAgICAgIGN0eCAtPlRhZ1R5cGVzID0gTlVMTDsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgcHQgPSBBbnRlcmlvciA9IExpbmtlZExpc3Q7Ci0gICAgd2hpbGUgKHB0ICE9IE5VTEwpIHsKLQotICAgICAgICBpZiAoUGx1Z2luLT5IYW5kbGVyLlNpZ25hdHVyZSA9PSBwdCAtPiBIYW5kbGVyLlNpZ25hdHVyZSkgewotICAgICAgICAgICAgcHQgLT5IYW5kbGVyID0gUGx1Z2luIC0+SGFuZGxlcjsgICAgLy8gUmVwbGFjZSBvbGQgYmVoYXZpb3VyLgotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHNpbmNlIG5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQsIHVucmVnaXN0ZXIgZG9lcyBub3QKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoaXMgYWN0aW9uLgotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBBbnRlcmlvciA9IHB0OwotICAgICAgICBwdCA9IHB0IC0+TmV4dDsKLSAgICB9Ci0KLSAgICAvLyBSZWdpc3RlcmluZyBoYXBwZW5zIGluIHBsdWctaW4gbWVtb3J5IHBvb2wKKyAgICAvLyBSZWdpc3RlcmluZyBoYXBwZW5zIGluIHBsdWctaW4gbWVtb3J5IHBvb2wuCiAgICAgcHQgPSAoX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KikgX2Ntc1BsdWdpbk1hbGxvYyhpZCwgc2l6ZW9mKF9jbXNUYWdUeXBlTGlua2VkTGlzdCkpOwogICAgIGlmIChwdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKICAgICBwdCAtPkhhbmRsZXIgICA9IFBsdWdpbiAtPkhhbmRsZXI7Ci0gICAgcHQgLT5OZXh0ICAgICAgPSBOVUxMOworICAgIHB0IC0+TmV4dCAgICAgID0gY3R4IC0+VGFnVHlwZXM7CiAKLSAgICBpZiAoQW50ZXJpb3IpCi0gICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBwdDsKKyAgICBjdHggLT5UYWdUeXBlcyA9IHB0OwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vIFJldHVybiBoYW5kbGVyIGZvciBhIGdpdmVuIHR5cGUgb3IgTlVMTCBpZiBub3QgZm91bmQuIFNoYXJlZCBiZXR3ZWVuIG5vcm1hbCB0eXBlcyBhbmQgTVBFCisvLyBSZXR1cm4gaGFuZGxlciBmb3IgYSBnaXZlbiB0eXBlIG9yIE5VTEwgaWYgbm90IGZvdW5kLiBTaGFyZWQgYmV0d2VlbiBub3JtYWwgdHlwZXMgYW5kIE1QRS4gSXQgZmlyc3QgdHJpZXMgdGhlIGFkZGl0b25zCisvLyBtYWRlIGJ5IHBsdWctaW5zIGFuZCB0aGVuIHRoZSBidWlsdC1pbiBkZWZhdWx0cy4KIHN0YXRpYwotY21zVGFnVHlwZUhhbmRsZXIqIEdldEhhbmRsZXIoY21zVGFnVHlwZVNpZ25hdHVyZSBzaWcsIF9jbXNUYWdUeXBlTGlua2VkTGlzdCogTGlua2VkTGlzdCkKK2Ntc1RhZ1R5cGVIYW5kbGVyKiBHZXRIYW5kbGVyKGNtc1RhZ1R5cGVTaWduYXR1cmUgc2lnLCBfY21zVGFnVHlwZUxpbmtlZExpc3QqIFBsdWdpbkxpbmtlZExpc3QsIF9jbXNUYWdUeXBlTGlua2VkTGlzdCogRGVmYXVsdExpbmtlZExpc3QpCiB7CiAgICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KiBwdDsKIAotICAgIGZvciAocHQgPSBMaW5rZWRMaXN0OworICAgIGZvciAocHQgPSBQbHVnaW5MaW5rZWRMaXN0OworICAgICAgICAgcHQgIT0gTlVMTDsKKyAgICAgICAgIHB0ID0gcHQgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIGlmIChzaWcgPT0gcHQgLT4gSGFuZGxlci5TaWduYXR1cmUpIHJldHVybiAmcHQgLT5IYW5kbGVyOworICAgIH0KKworICAgIGZvciAocHQgPSBEZWZhdWx0TGlua2VkTGlzdDsKICAgICAgICAgIHB0ICE9IE5VTEw7CiAgICAgICAgICBwdCA9IHB0IC0+TmV4dCkgewogCkBAIC0xNjMsNiArMTU4LDcgQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAorLy8gQXV4aWxpYXIgdG8gcmVhZCBhbiBhcnJheSBvZiB3Y2hhcl90CiBzdGF0aWMKIGNtc0Jvb2wgX2Ntc1JlYWRXQ2hhckFycmF5KGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBuLCB3Y2hhcl90KiBBcnJheSkKIHsKQEAgLTc3Nyw2ICs3NzMsOCBAQAogCiAgICAgLy8gQ3JlYXRlIG1lbW9yeQogICAgIFRleHQgPSAoY2hhciopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgc2l6ZSk7CisgICAgaWYgKFRleHQgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCiAgICAgY21zTUxVZ2V0QVNDSUkobWx1LCBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksIFRleHQsIHNpemUpOwogCiAgICAgLy8gV3JpdGUgaXQsIGluY2x1ZGluZyBzZXBhcmF0b3IKQEAgLTE3ODMsNyArMTc4MSw2IEBACiAgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCBOVUxMKSkgZ290byBFcnJvcjsKIAogICAgIC8vIERvIHNvbWUgY2hlY2tpbmcKLQogICAgIGlmIChJbnB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpICBnb3RvIEVycm9yOwogICAgIGlmIChPdXRwdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSBnb3RvIEVycm9yOwogCkBAIC0xODI0LDkgKzE4MjEsMTYgQEAKICAgICAgICAgaWYgKFQgID09IE5VTEwpIGdvdG8gRXJyb3I7CiAKICAgICAgICAgVGVtcCA9IChjbXNVSW50OE51bWJlciopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgblRhYlNpemUpOwotICAgICAgICBpZiAoVGVtcCA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoVGVtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBUKTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KIAotICAgICAgICBpZiAoaW8gLT5SZWFkKGlvLCBUZW1wLCBuVGFiU2l6ZSwgMSkgIT0gMSkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgVGVtcCwgblRhYlNpemUsIDEpICE9IDEpIHsKKyAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFQpOworICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGVtcCk7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5UYWJTaXplOyBpKyspIHsKIApAQCAtMjM3MSwyNyArMjM3NSwzMCBAQAogICAgIC8vIFByZWNpc2lvbiBjYW4gYmUgMSBvciAyIGJ5dGVzCiAgICAgaWYgKFByZWNpc2lvbiA9PSAxKSB7CiAKLSAgICAgICBjbXNVSW50OE51bWJlciAgdjsKKyAgICAgICAgY21zVUludDhOdW1iZXIgIHY7CiAKICAgICAgICAgZm9yIChpPTA7IGkgPCBEYXRhIC0+bkVudHJpZXM7IGkrKykgewogCi0gICAgICAgICAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgJnYsIHNpemVvZihjbXNVSW50OE51bWJlciksIDEpICE9IDEpIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIERhdGEgLT5UYWIuVFtpXSA9IEZST01fOF9UT18xNih2KTsKKyAgICAgICAgICAgIGlmIChpbyAtPlJlYWQoaW8sICZ2LCBzaXplb2YoY21zVUludDhOdW1iZXIpLCAxKSAhPSAxKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIERhdGEgLT5UYWIuVFtpXSA9IEZST01fOF9UT18xNih2KTsKICAgICAgICAgfQogCiAgICAgfQogICAgIGVsc2UKICAgICAgICAgaWYgKFByZWNpc2lvbiA9PSAyKSB7CiAKLSAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgRGF0YS0+bkVudHJpZXMsIERhdGEgLT5UYWIuVCkpIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZiAtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbmtub3duIHByZWNpc2lvbiBvZiAnJWQnIiwgUHJlY2lzaW9uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCBEYXRhLT5uRW50cmllcywgRGF0YSAtPlRhYi5UKSkgeworICAgICAgICAgICAgICAgIGNtc1N0YWdlRnJlZShDTFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNtc1N0YWdlRnJlZShDTFVUKTsKKyAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBwcmVjaXNpb24gb2YgJyVkJyIsIFByZWNpc2lvbik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0KLSAgICByZXR1cm4gQ0xVVDsKKyAgICAgICAgcmV0dXJuIENMVVQ7CiB9CiAKIHN0YXRpYwpAQCAtNDM3NCw3ICs0MzgxLDcgQEAKIHtUWVBFX01QRV9IQU5ETEVSKChjbXNUYWdUeXBlU2lnbmF0dXJlKSBjbXNTaWdDTHV0RWxlbVR5cGUsICAgICAgICAgTVBFY2x1dCksICAgICAgICBOVUxMIH0sCiB9OwogCi0jZGVmaW5lIERFRkFVTFRfTVBFX1RZUEVfQ09VTlQgIChzaXplb2YoU3VwcG9ydGVkTVBFdHlwZXMpIC8gc2l6ZW9mKF9jbXNUYWdUeXBlTGlua2VkTGlzdCkpCitfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSBfY21zTVBFVHlwZVBsdWdpbkNodW5rID0geyBOVUxMIH07CiAKIHN0YXRpYwogY21zQm9vbCBSZWFkTVBFRWxlbShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCkBAIC00Mzg3LDYgKzQzOTQsOCBAQAogICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiBUeXBlSGFuZGxlcjsKICAgICBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zOwogICAgIGNtc1BpcGVsaW5lICpOZXdMVVQgPSAoY21zUGlwZWxpbmUgKikgQ2FyZ287CisgICAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqIE1QRVR5cGVQbHVnaW5DaHVuayAgPSAoIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhzZWxmLT5Db250ZXh0SUQsIE1QRVBsdWdpbik7CisKIAogICAgIC8vIFRha2Ugc2lnbmF0dXJlIGFuZCBjaGFubmVscyBmb3IgZWFjaCBlbGVtZW50LgogICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sIChjbXNVSW50MzJOdW1iZXIqKSAmRWxlbWVudFNpZykpIHJldHVybiBGQUxTRTsKQEAgLTQzOTUsNyArNDQwNCw3IEBACiAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgTlVMTCkpIHJldHVybiBGQUxTRTsKIAogICAgIC8vIFJlYWQgZGl2ZXJzZSBNUEUgdHlwZXMKLSAgICBUeXBlSGFuZGxlciA9IEdldEhhbmRsZXIoKGNtc1RhZ1R5cGVTaWduYXR1cmUpIEVsZW1lbnRTaWcsIFN1cHBvcnRlZE1QRXR5cGVzKTsKKyAgICBUeXBlSGFuZGxlciA9IEdldEhhbmRsZXIoKGNtc1RhZ1R5cGVTaWduYXR1cmUpIEVsZW1lbnRTaWcsIE1QRVR5cGVQbHVnaW5DaHVuayAtPlRhZ1R5cGVzLCBTdXBwb3J0ZWRNUEV0eXBlcyk7CiAgICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpICB7CiAKICAgICAgICAgY2hhciBTdHJpbmdbNV07CkBAIC00NDcyLDYgKzQ0ODEsNyBAQAogICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBQdHI7CiAgICAgY21zU3RhZ2UqIEVsZW0gPSBMdXQgLT5FbGVtZW50czsKICAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXI7CisgICAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqIE1QRVR5cGVQbHVnaW5DaHVuayAgPSAoIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhzZWxmLT5Db250ZXh0SUQsIE1QRVBsdWdpbik7CiAKICAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7CiAKQEAgLTQ1MDUsNyArNDUxNSw3IEBACiAKICAgICAgICAgRWxlbWVudFNpZyA9IEVsZW0gLT5UeXBlOwogCi0gICAgICAgIFR5cGVIYW5kbGVyID0gR2V0SGFuZGxlcigoY21zVGFnVHlwZVNpZ25hdHVyZSkgRWxlbWVudFNpZywgU3VwcG9ydGVkTVBFdHlwZXMpOworICAgICAgICBUeXBlSGFuZGxlciA9IEdldEhhbmRsZXIoKGNtc1RhZ1R5cGVTaWduYXR1cmUpIEVsZW1lbnRTaWcsIE1QRVR5cGVQbHVnaW5DaHVuay0+VGFnVHlwZXMsIFN1cHBvcnRlZE1QRXR5cGVzKTsKICAgICAgICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpICB7CiAKICAgICAgICAgICAgICAgICBjaGFyIFN0cmluZ1s1XTsKQEAgLTUxMjUsNyArNTEzNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAKLSAgICAgICAgcmMgPSBjbXNEaWN0QWRkRW50cnkoaERpY3QsIE5hbWVXQ1MsIFZhbHVlV0NTLCBEaXNwbGF5TmFtZU1MVSwgRGlzcGxheVZhbHVlTUxVKTsKKyAgICAgICAgICAgIHJjID0gY21zRGljdEFkZEVudHJ5KGhEaWN0LCBOYW1lV0NTLCBWYWx1ZVdDUywgRGlzcGxheU5hbWVNTFUsIERpc3BsYXlWYWx1ZU1MVSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoTmFtZVdDUyAhPSBOVUxMKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBOYW1lV0NTKTsKQEAgLTUyODIsMjQgKzUyOTIsOTUgQEAKIHtUWVBFX0hBTkRMRVIoY21zU2lnVmNndFR5cGUsICAgICAgICAgICAgICAgICAgdmNndCksICAgICAgICAgICAgICAgIE5VTEwgfQogfTsKIAotI2RlZmluZSBERUZBVUxUX1RBR19UWVBFX0NPVU5UICAoc2l6ZW9mKFN1cHBvcnRlZFRhZ1R5cGVzKSAvIHNpemVvZihfY21zVGFnVHlwZUxpbmtlZExpc3QpKQorCitfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSBfY21zVGFnVHlwZVBsdWdpbkNodW5rID0geyBOVUxMIH07CisKKworCisvLyBEdXBsaWNhdGVzIHRoZSB6b25lIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBwbHVnLWluIGluIHRoZSBuZXcgY29udGV4dAorc3RhdGljCit2b2lkIER1cFRhZ1R5cGVMaXN0KHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjLAorICAgICAgICAgICAgICAgICAgICBpbnQgbG9jKQoreworICAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgbmV3SGVhZCA9IHsgTlVMTCB9OworICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KiAgZW50cnk7CisgICBfY21zVGFnVHlwZUxpbmtlZExpc3QqICBBbnRlcmlvciA9IE5VTEw7CisgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW2xvY107CisKKyAgIC8vIFdhbGsgdGhlIGxpc3QgY29weWluZyBhbGwgbm9kZXMKKyAgIGZvciAoZW50cnkgPSBoZWFkLT5UYWdUeXBlczsKKyAgICAgICBlbnRyeSAhPSBOVUxMOworICAgICAgIGVudHJ5ID0gZW50cnkgLT5OZXh0KSB7CisKKyAgICAgICAgICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0ICpuZXdFbnRyeSA9ICggX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0ICopIF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBlbnRyeSwgc2l6ZW9mKF9jbXNUYWdUeXBlTGlua2VkTGlzdCkpOworCisgICAgICAgICAgIGlmIChuZXdFbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQorICAgICAgICAgICBuZXdFbnRyeSAtPiBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OworCisgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgaWYgKG5ld0hlYWQuVGFnVHlwZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgIG5ld0hlYWQuVGFnVHlwZXMgPSBuZXdFbnRyeTsKKyAgIH0KKworICAgY3R4IC0+Y2h1bmtzW2xvY10gPSBfY21zU3ViQWxsb2NEdXAoY3R4LT5NZW1Qb29sLCAmbmV3SGVhZCwgc2l6ZW9mKF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKSk7Cit9CisKKwordm9pZCBfY21zQWxsb2NUYWdUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIGlmIChzcmMgIT0gTlVMTCkgeworCisgICAgICAgIC8vIER1cGxpY2F0ZSB0aGUgTElTVAorICAgICAgICBEdXBUYWdUeXBlTGlzdChjdHgsIHNyYywgVGFnVHlwZVBsdWdpbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgVGFnVHlwZVBsdWdpbkNodW5rID0geyBOVUxMIH07CisgICAgICAgIGN0eCAtPmNodW5rc1tUYWdUeXBlUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmVGFnVHlwZVBsdWdpbkNodW5rLCBzaXplb2YoX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUpKTsKKyAgICB9Cit9CisKK3ZvaWQgX2Ntc0FsbG9jTVBFVHlwZVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gRHVwbGljYXRlIHRoZSBMSVNUCisgICAgICAgIER1cFRhZ1R5cGVMaXN0KGN0eCwgc3JjLCBNUEVQbHVnaW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RhdGljIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlIFRhZ1R5cGVQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworICAgICAgICBjdHggLT5jaHVua3NbTVBFUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmVGFnVHlwZVBsdWdpbkNodW5rLCBzaXplb2YoX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUpKTsKKyAgICB9CisKK30KKwogCiAvLyBCb3RoIGtpbmQgb2YgcGx1Zy1pbnMgc2hhcmUgc2FtZSBzdHJ1Y3R1cmUKIGNtc0Jvb2wgIF9jbXNSZWdpc3RlclRhZ1R5cGVQbHVnaW4oY21zQ29udGV4dCBpZCwgY21zUGx1Z2luQmFzZSogRGF0YSkKIHsKLSAgICByZXR1cm4gUmVnaXN0ZXJUeXBlc1BsdWdpbihpZCwgRGF0YSwgU3VwcG9ydGVkVGFnVHlwZXMsIERFRkFVTFRfVEFHX1RZUEVfQ09VTlQpOworICAgIHJldHVybiBSZWdpc3RlclR5cGVzUGx1Z2luKGlkLCBEYXRhLCBUYWdUeXBlUGx1Z2luKTsKIH0KIAogY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTXVsdGlQcm9jZXNzRWxlbWVudFBsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQogewotICAgIHJldHVybiBSZWdpc3RlclR5cGVzUGx1Z2luKGlkLCBEYXRhLCBTdXBwb3J0ZWRNUEV0eXBlcywgREVGQVVMVF9NUEVfVFlQRV9DT1VOVCk7CisgICAgcmV0dXJuIFJlZ2lzdGVyVHlwZXNQbHVnaW4oaWQsIERhdGEsTVBFUGx1Z2luKTsKIH0KIAogCiAvLyBXcmFwcGVyIGZvciB0YWcgdHlwZXMKLWNtc1RhZ1R5cGVIYW5kbGVyKiBfY21zR2V0VGFnVHlwZUhhbmRsZXIoY21zVGFnVHlwZVNpZ25hdHVyZSBzaWcpCitjbXNUYWdUeXBlSGFuZGxlciogX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZykKIHsKLSAgICByZXR1cm4gR2V0SGFuZGxlcihzaWcsIFN1cHBvcnRlZFRhZ1R5cGVzKTsKKyAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBUYWdUeXBlUGx1Z2luKTsKKworICAgIHJldHVybiBHZXRIYW5kbGVyKHNpZywgY3R4LT5UYWdUeXBlcywgU3VwcG9ydGVkVGFnVHlwZXMpOwogfQogCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTQxNCw0OCArNTQ5NSw5NCBAQAogICAgIGNtc1NpZ0RldmljZVNldHRpbmdzVGFnICAgPT0+IERlcHJlY2F0ZWQsIHVzZWxlc3MKICovCiAKLSNkZWZpbmUgREVGQVVMVF9UQUdfQ09VTlQgIChzaXplb2YoU3VwcG9ydGVkVGFncykgLyBzaXplb2YoX2Ntc1RhZ0xpbmtlZExpc3QpKQorCitfY21zVGFnUGx1Z2luQ2h1bmtUeXBlIF9jbXNUYWdQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworCisKKy8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CitzdGF0aWMKK3ZvaWQgRHVwVGFnTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUgbmV3SGVhZCA9IHsgTlVMTCB9OworICAgX2Ntc1RhZ0xpbmtlZExpc3QqICBlbnRyeTsKKyAgIF9jbXNUYWdMaW5rZWRMaXN0KiAgQW50ZXJpb3IgPSBOVUxMOworICAgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKikgc3JjLT5jaHVua3NbVGFnUGx1Z2luXTsKKworICAgLy8gV2FsayB0aGUgbGlzdCBjb3B5aW5nIGFsbCBub2RlcworICAgZm9yIChlbnRyeSA9IGhlYWQtPlRhZzsKKyAgICAgICBlbnRyeSAhPSBOVUxMOworICAgICAgIGVudHJ5ID0gZW50cnkgLT5OZXh0KSB7CisKKyAgICAgICAgICAgX2Ntc1RhZ0xpbmtlZExpc3QgKm5ld0VudHJ5ID0gKCBfY21zVGFnTGlua2VkTGlzdCAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zVGFnTGlua2VkTGlzdCkpOworCisgICAgICAgICAgIGlmIChuZXdFbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQorICAgICAgICAgICBuZXdFbnRyeSAtPiBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OworCisgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgaWYgKG5ld0hlYWQuVGFnID09IE5VTEwpCisgICAgICAgICAgICAgICBuZXdIZWFkLlRhZyA9IG5ld0VudHJ5OworICAgfQorCisgICBjdHggLT5jaHVua3NbVGFnUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSkpOworfQorCit2b2lkIF9jbXNBbGxvY1RhZ1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBpZiAoc3JjICE9IE5VTEwpIHsKKworICAgICAgICBEdXBUYWdMaXN0KGN0eCwgc3JjKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRpYyBfY21zVGFnUGx1Z2luQ2h1bmtUeXBlIFRhZ1BsdWdpbkNodW5rID0geyBOVUxMIH07CisgICAgICAgIGN0eCAtPmNodW5rc1tUYWdQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZUYWdQbHVnaW5DaHVuaywgc2l6ZW9mKF9jbXNUYWdQbHVnaW5DaHVua1R5cGUpKTsKKyAgICB9CisKK30KIAogY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKGNtc0NvbnRleHQgaWQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCiB7CiAgICAgY21zUGx1Z2luVGFnKiBQbHVnaW4gPSAoY21zUGx1Z2luVGFnKikgRGF0YTsKLSAgICBfY21zVGFnTGlua2VkTGlzdCAqcHQsICpBbnRlcmlvcjsKLQorICAgIF9jbXNUYWdMaW5rZWRMaXN0ICpwdDsKKyAgICBfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKiBUYWdQbHVnaW5DaHVuayA9ICggX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoaWQsIFRhZ1BsdWdpbik7CiAKICAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CiAKLSAgICAgICAgU3VwcG9ydGVkVGFnc1tERUZBVUxUX1RBR19DT1VOVC0xXS5OZXh0ID0gTlVMTDsKKyAgICAgICAgVGFnUGx1Z2luQ2h1bmstPlRhZyA9IE5VTEw7CiAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIAotICAgIHB0ID0gQW50ZXJpb3IgPSBTdXBwb3J0ZWRUYWdzOwotICAgIHdoaWxlIChwdCAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKFBsdWdpbi0+U2lnbmF0dXJlID09IHB0IC0+IFNpZ25hdHVyZSkgewotICAgICAgICAgICAgcHQgLT5EZXNjcmlwdG9yID0gUGx1Z2luIC0+RGVzY3JpcHRvcjsgIC8vIFJlcGxhY2Ugb2xkIGJlaGF2aW91cgotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBBbnRlcmlvciA9IHB0OwotICAgICAgICBwdCA9IHB0IC0+TmV4dDsKLSAgICB9Ci0KICAgICBwdCA9IChfY21zVGFnTGlua2VkTGlzdCopIF9jbXNQbHVnaW5NYWxsb2MoaWQsIHNpemVvZihfY21zVGFnTGlua2VkTGlzdCkpOwogICAgIGlmIChwdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKICAgICBwdCAtPlNpZ25hdHVyZSAgPSBQbHVnaW4gLT5TaWduYXR1cmU7CiAgICAgcHQgLT5EZXNjcmlwdG9yID0gUGx1Z2luIC0+RGVzY3JpcHRvcjsKLSAgICBwdCAtPk5leHQgICAgICAgPSBOVUxMOworICAgIHB0IC0+TmV4dCAgICAgICA9IFRhZ1BsdWdpbkNodW5rIC0+VGFnOwogCi0gICAgaWYgKEFudGVyaW9yICE9IE5VTEwpIEFudGVyaW9yIC0+IE5leHQgPSBwdDsKKyAgICBUYWdQbHVnaW5DaHVuayAtPlRhZyA9IHB0OwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vIFJldHVybiBhIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gdGFnIG9yIE5VTEwKLWNtc1RhZ0Rlc2NyaXB0b3IqIF9jbXNHZXRUYWdEZXNjcmlwdG9yKGNtc1RhZ1NpZ25hdHVyZSBzaWcpCitjbXNUYWdEZXNjcmlwdG9yKiBfY21zR2V0VGFnRGVzY3JpcHRvcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVGFnU2lnbmF0dXJlIHNpZykKIHsKICAgICBfY21zVGFnTGlua2VkTGlzdCogcHQ7CisgICAgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSogVGFnUGx1Z2luQ2h1bmsgPSAoIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgVGFnUGx1Z2luKTsKKworICAgIGZvciAocHQgPSBUYWdQbHVnaW5DaHVuay0+VGFnOworICAgICAgICAgICAgIHB0ICE9IE5VTEw7CisgICAgICAgICAgICAgcHQgPSBwdCAtPk5leHQpIHsKKworICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gcHQgLT4gU2lnbmF0dXJlKSByZXR1cm4gJnB0IC0+RGVzY3JpcHRvcjsKKyAgICB9CiAKICAgICBmb3IgKHB0ID0gU3VwcG9ydGVkVGFnczsKICAgICAgICAgICAgIHB0ICE9IE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdmlydC5jIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3ZpcnQuYwppbmRleCA2OTlhYmNjLi4zNTk4NzUxIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdmlydC5jCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN2aXJ0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDExIE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAogc3RhdGljIGNvbnN0IGNtc0FsbG93ZWRMVVQgQWxsb3dlZExVVFR5cGVzW10gPSB7CiAKLSAgICB7IEZBTFNFLCAwLCAgICAgICAgICAgICAgY21zU2lnTHV0MTZUeXBlLCAgICA0LCAgeyBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZX19LAorICAgIHsgRkFMU0UsIDAsICAgICAgICAgICAgICBjbXNTaWdMdXQxNlR5cGUsICAgIDQsICB7IGNtc1NpZ01hdHJpeEVsZW1UeXBlLCAgIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZX19LAogICAgIHsgRkFMU0UsIDAsICAgICAgICAgICAgICBjbXNTaWdMdXQxNlR5cGUsICAgIDMsICB7IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZX19LAogICAgIHsgRkFMU0UsIDAsICAgICAgICAgICAgICBjbXNTaWdMdXQxNlR5cGUsICAgIDIsICB7IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZX19LAogICAgIHsgVFJVRSAsIDAsICAgICAgICAgICAgICBjbXNTaWdMdXRBdG9CVHlwZSwgIDEsICB7IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfX0sCkBAIC0xMTUwLDcgKzExNTAsNyBAQAogICAgIGlmIChBbGxvd2VkTFVUID09IE5VTEwpIHsKIAogICAgICAgICAvLyBUcnkgdG8gb3B0aW1pemUKLSAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoJkxVVCwgeGZvcm0gLT5SZW5kZXJpbmdJbnRlbnQsICZGcm1JbiwgJkZybU91dCwgJmR3RmxhZ3MpOworICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZShDb250ZXh0SUQsICZMVVQsIHhmb3JtIC0+UmVuZGVyaW5nSW50ZW50LCAmRnJtSW4sICZGcm1PdXQsICZkd0ZsYWdzKTsKICAgICAgICAgQWxsb3dlZExVVCA9IEZpbmRDb21iaW5hdGlvbihMVVQsIFZlcnNpb24gPj0gNC4wLCBEZXN0aW5hdGlvblRhZyk7CiAKICAgICB9CkBAIC0xMTU5LDcgKzExNTksNyBAQAogICAgIGlmIChBbGxvd2VkTFVUID09IE5VTEwpIHsKIAogICAgICAgICBkd0ZsYWdzIHw9IGNtc0ZMQUdTX0ZPUkNFX0NMVVQ7Ci0gICAgICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKCZMVVQsIHhmb3JtIC0+UmVuZGVyaW5nSW50ZW50LCAmRnJtSW4sICZGcm1PdXQsICZkd0ZsYWdzKTsKKyAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoQ29udGV4dElELCAmTFVULCB4Zm9ybSAtPlJlbmRlcmluZ0ludGVudCwgJkZybUluLCAmRnJtT3V0LCAmZHdGbGFncyk7CiAKICAgICAgICAgLy8gUHV0IGlkZW50aXR5IGN1cnZlcyBpZiBuZWVkZWQKICAgICAgICAgaWYgKGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKExVVCkgLT5UeXBlICE9IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zd3RwbnQuYyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN3dHBudC5jCmluZGV4IDcxZmI3NjUuLjFlYjlhODcgMTAwNjQ0Ci0tLSBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN3dHBudC5jCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN3dHBudC5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKZGlmZiAtLWdpdCBhL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN4Zm9ybS5jIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3hmb3JtLmMKaW5kZXggODc5MDU2Zi4uM2UyNDRjMyAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3hmb3JtLmMKKysrIGIvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3hmb3JtLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDExIE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtNTgsNDQgKzU4LDEyMCBAQAogLy8gVHJhbnNmb3JtYXRpb25zIHN0dWZmCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBBbGFybSBjb2RlcyBmb3IgMTYtYml0IHRyYW5zZm9ybWF0aW9ucywgYmVjYXVzZSB0aGUgZml4ZWQgcmFuZ2Ugb2YgY29udGFpbmVycyB0aGVyZSBhcmUKLS8vIG5vIHZhbHVlcyBsZWZ0IHRvIG1hcmsgb3V0IG9mIGdhbXV0LiB2b2xhdGlsZSBpcyBDOTkgcGVyIDYuMi41Ci1zdGF0aWMgdm9sYXRpbGUgY21zVUludDE2TnVtYmVyIEFsYXJtW2Ntc01BWENIQU5ORUxTXSA9IHsgMHg3RjAwLCAweDdGMDAsIDB4N0YwMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci1zdGF0aWMgdm9sYXRpbGUgY21zRmxvYXQ2NE51bWJlciBHbG9iYWxBZGFwdGF0aW9uU3RhdGUgPSAxOworI2RlZmluZSBERUZBVUxUX09CU0VSVkVSX0FEQVBUQVRJT05fU1RBVEUgMS4wCisKKy8vIFRoZSBDb250ZXh0MCBvYnNlcnZlciBhZGFwdGF0aW9uIHN0YXRlLgorX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZSBfY21zQWRhcHRhdGlvblN0YXRlQ2h1bmsgPSB7IERFRkFVTFRfT0JTRVJWRVJfQURBUFRBVElPTl9TVEFURSB9OworCisvLyBJbml0IGFuZCBkdXBsaWNhdGUgb2JzZXJ2ZXIgYWRhcHRhdGlvbiBzdGF0ZQordm9pZCBfY21zQWxsb2NBZGFwdGF0aW9uU3RhdGVDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBzdGF0aWMgX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZSBBZGFwdGF0aW9uU3RhdGVDaHVuayA9IHsgREVGQVVMVF9PQlNFUlZFUl9BREFQVEFUSU9OX1NUQVRFIH07CisgICAgdm9pZCogZnJvbTsKKworICAgIGlmIChzcmMgIT0gTlVMTCkgeworICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW0FkYXB0YXRpb25TdGF0ZUNvbnRleHRdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICBmcm9tID0gJkFkYXB0YXRpb25TdGF0ZUNodW5rOworICAgIH0KKworICAgIGN0eCAtPmNodW5rc1tBZGFwdGF0aW9uU3RhdGVDb250ZXh0XSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZSkpOworfQorCisKKy8vIFNldHMgYWRhcHRhdGlvbiBzdGF0ZSBmb3IgYWJzb2x1dGUgY29sb3JpbWV0cmljIGludGVudCBpbiB0aGUgZ2l2ZW4gY29udGV4dC4gIEFkYXB0YXRpb24gc3RhdGUgYXBwbGllcyBvbiBhbGwKKy8vIGJ1dCBjbXNDcmVhdGVFeHRlbmRlZFRyYW5zZm9ybVRIUigpLiAgTGl0dGxlIENNUyBjYW4gaGFuZGxlIGluY29tcGxldGUgYWRhcHRhdGlvbiBzdGF0ZXMuCitjbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNTZXRBZGFwdGF0aW9uU3RhdGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0Zsb2F0NjROdW1iZXIgZCkKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHByZXY7CisgICAgX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZSogcHRyID0gKF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgQWRhcHRhdGlvblN0YXRlQ29udGV4dCk7CisKKyAgICAvLyBHZXQgcHJldmlvdXMgdmFsdWUgZm9yIHJldHVybgorICAgIHByZXYgPSBwdHIgLT5BZGFwdGF0aW9uU3RhdGU7CisKKyAgICAvLyBTZXQgdGhlIHZhbHVlIGlmIGQgaXMgcG9zaXRpdmUgb3IgemVybworICAgIGlmIChkID49IDAuMCkgeworCisgICAgICAgIHB0ciAtPkFkYXB0YXRpb25TdGF0ZSA9IGQ7CisgICAgfQorCisgICAgLy8gQWx3YXlzIHJldHVybiBwcmV2aW91cyB2YWx1ZQorICAgIHJldHVybiBwcmV2OworfQorCiAKIC8vIFRoZSBhZGFwdGF0aW9uIHN0YXRlIG1heSBiZSBkZWZhdWx0ZWQgYnkgdGhpcyBmdW5jdGlvbi4gSWYgeW91IGRvbid0IGxpa2UgaXQsIHVzZSB0aGUgZXh0ZW5kZWQgdHJhbnNmb3JtIHJvdXRpbmUKIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc1NldEFkYXB0YXRpb25TdGF0ZShjbXNGbG9hdDY0TnVtYmVyIGQpCiB7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBPbGRWYWwgPSBHbG9iYWxBZGFwdGF0aW9uU3RhdGU7Ci0KLSAgICBpZiAoZCA+PSAwKQotICAgICAgICBHbG9iYWxBZGFwdGF0aW9uU3RhdGUgPSBkOwotCi0gICAgcmV0dXJuIE9sZFZhbDsKKyAgICByZXR1cm4gY21zU2V0QWRhcHRhdGlvblN0YXRlVEhSKE5VTEwsIGQpOwogfQogCi0vLyBBbGFybSBjb2RlcyBhcmUgYWx3YXlzIGdsb2JhbAotdm9pZCBDTVNFWFBPUlQgY21zU2V0QWxhcm1Db2RlcyhjbXNVSW50MTZOdW1iZXIgTmV3QWxhcm1bY21zTUFYQ0hBTk5FTFNdKQotewotICAgIGludCBpOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLy8gQWxhcm0gY29kZXMgZm9yIDE2LWJpdCB0cmFuc2Zvcm1hdGlvbnMsIGJlY2F1c2UgdGhlIGZpeGVkIHJhbmdlIG9mIGNvbnRhaW5lcnMgdGhlcmUgYXJlCisvLyBubyB2YWx1ZXMgbGVmdCB0byBtYXJrIG91dCBvZiBnYW11dC4KKworI2RlZmluZSBERUZBVUxUX0FMQVJNX0NPREVTX1ZBTFVFIHsweDdGMDAsIDB4N0YwMCwgMHg3RjAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQorCitfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSBfY21zQWxhcm1Db2Rlc0NodW5rID0geyBERUZBVUxUX0FMQVJNX0NPREVTX1ZBTFVFIH07CisKKy8vIFNldHMgdGhlIGNvZGVzIHVzZWQgdG8gbWFyayBvdXQtb3V0LWdhbXV0IG9uIFByb29maW5nIHRyYW5zZm9ybXMgZm9yIGEgZ2l2ZW4gY29udGV4dC4gVmFsdWVzIGFyZSBtZWFudCB0byBiZQorLy8gZW5jb2RlZCBpbiAxNiBiaXRzLgordm9pZCBDTVNFWFBPUlQgY21zU2V0QWxhcm1Db2Rlc1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVUludDE2TnVtYmVyIEFsYXJtQ29kZXNQW2Ntc01BWENIQU5ORUxTXSkKK3sKKyAgICBfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSogQ29udGV4dEFsYXJtQ29kZXMgPSAoX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgQWxhcm1Db2Rlc0NvbnRleHQpOworCisgICAgX2Ntc0Fzc2VydChDb250ZXh0QWxhcm1Db2RlcyAhPSBOVUxMKTsgLy8gQ2FuJ3QgaGFwcGVuCisKKyAgICBtZW1jcHkoQ29udGV4dEFsYXJtQ29kZXMtPkFsYXJtQ29kZXMsIEFsYXJtQ29kZXNQLCBzaXplb2YoQ29udGV4dEFsYXJtQ29kZXMtPkFsYXJtQ29kZXMpKTsKK30KKworLy8gR2V0cyB0aGUgY3VycmVudCBjb2RlcyB1c2VkIHRvIG1hcmsgb3V0LW91dC1nYW11dCBvbiBQcm9vZmluZyB0cmFuc2Zvcm1zIGZvciB0aGUgZ2l2ZW4gY29udGV4dC4KKy8vIFZhbHVlcyBhcmUgbWVhbnQgdG8gYmUgZW5jb2RlZCBpbiAxNiBiaXRzLgordm9pZCBDTVNFWFBPUlQgY21zR2V0QWxhcm1Db2Rlc1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDE2TnVtYmVyIEFsYXJtQ29kZXNQW2Ntc01BWENIQU5ORUxTXSkKK3sKKyAgICBfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSogQ29udGV4dEFsYXJtQ29kZXMgPSAoX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgQWxhcm1Db2Rlc0NvbnRleHQpOworCisgICAgX2Ntc0Fzc2VydChDb250ZXh0QWxhcm1Db2RlcyAhPSBOVUxMKTsgLy8gQ2FuJ3QgaGFwcGVuCisKKyAgICBtZW1jcHkoQWxhcm1Db2Rlc1AsIENvbnRleHRBbGFybUNvZGVzLT5BbGFybUNvZGVzLCBzaXplb2YoQ29udGV4dEFsYXJtQ29kZXMtPkFsYXJtQ29kZXMpKTsKK30KKwordm9pZCBDTVNFWFBPUlQgY21zU2V0QWxhcm1Db2Rlcyhjb25zdCBjbXNVSW50MTZOdW1iZXIgTmV3QWxhcm1bY21zTUFYQ0hBTk5FTFNdKQorewogICAgIF9jbXNBc3NlcnQoTmV3QWxhcm0gIT0gTlVMTCk7CiAKLSAgICBmb3IgKGk9MDsgaSA8IGNtc01BWENIQU5ORUxTOyBpKyspCi0gICAgICAgIEFsYXJtW2ldID0gTmV3QWxhcm1baV07CisgICAgY21zU2V0QWxhcm1Db2Rlc1RIUihOVUxMLCBOZXdBbGFybSk7CiB9CiAKLS8vIFlvdSBjYW4gZ2V0IHRoZSBjb2RlcyBjYXMgd2VsbAogdm9pZCBDTVNFWFBPUlQgY21zR2V0QWxhcm1Db2RlcyhjbXNVSW50MTZOdW1iZXIgT2xkQWxhcm1bY21zTUFYQ0hBTk5FTFNdKQogewotICAgIGludCBpOwotCiAgICAgX2Ntc0Fzc2VydChPbGRBbGFybSAhPSBOVUxMKTsKLQotICAgIGZvciAoaT0wOyBpIDwgY21zTUFYQ0hBTk5FTFM7IGkrKykKLSAgICAgICAgT2xkQWxhcm1baV0gPSBBbGFybVtpXTsKKyAgICBjbXNHZXRBbGFybUNvZGVzVEhSKE5VTEwsIE9sZEFsYXJtKTsKIH0KIAorCisvLyBJbml0IGFuZCBkdXBsaWNhdGUgYWxhcm0gY29kZXMKK3ZvaWQgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBzdGF0aWMgX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUgQWxhcm1Db2Rlc0NodW5rID0geyBERUZBVUxUX0FMQVJNX0NPREVTX1ZBTFVFIH07CisgICAgdm9pZCogZnJvbTsKKworICAgIGlmIChzcmMgIT0gTlVMTCkgeworICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW0FsYXJtQ29kZXNDb250ZXh0XTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgZnJvbSA9ICZBbGFybUNvZGVzQ2h1bms7CisgICAgfQorCisgICAgY3R4IC0+Y2h1bmtzW0FsYXJtQ29kZXNDb250ZXh0XSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogLy8gR2V0IHJpZCBvZiB0cmFuc2Zvcm0gcmVzb3VyY2VzCiB2b2lkIENNU0VYUE9SVCBjbXNEZWxldGVUcmFuc2Zvcm0oY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKQogewpAQCAtMjAyLDYgKzI3OCwzMCBAQAogICAgIH0KIH0KIAorCitzdGF0aWMKK3ZvaWQgTnVsbEZsb2F0WEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUsCisgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgY21zVUludDhOdW1iZXIqIGFjY3VtOworICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7CisgICAgY21zRmxvYXQzMk51bWJlciBmSW5bY21zTUFYQ0hBTk5FTFNdOworICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOworCisgICAgYWNjdW0gID0gKGNtc1VJbnQ4TnVtYmVyKikgIGluOworICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopICBvdXQ7CisgICAgbiA9IFNpemU7CisKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgeworCisgICAgICAgIGFjY3VtICA9IHAgLT4gRnJvbUlucHV0RmxvYXQocCwgZkluLCBhY2N1bSwgU3RyaWRlKTsKKyAgICAgICAgb3V0cHV0ID0gcCAtPiBUb091dHB1dEZsb2F0KHAsIGZJbiwgb3V0cHV0LCBTdHJpZGUpOworICAgIH0KK30KKwogLy8gMTYgYml0IHByZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBOdWxsIHRyYW5zZm9ybWF0aW9uLCBvbmx5IGFwcGxpZXMgZm9ybWF0dGVycy4gTm8gY2FjaOkKQEAgLTI1Miw3ICszNTIsNyBAQAogfQogCiAKLS8vIEF1eGlsaWFyOiBIYW5kbGUgcHJlY2FsY3VsYXRlZCBnYW11dCBjaGVjaworLy8gQXV4aWxpYXI6IEhhbmRsZSBwcmVjYWxjdWxhdGVkIGdhbXV0IGNoZWNrLiBUaGUgcmV0cmlldmFsIG9mIGNvbnRleHQgbWF5IGJlIGFsaXR0bGUgYml0IHNsb3csIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjcml0aWNhbC4KIHN0YXRpYwogdm9pZCBUcmFuc2Zvcm1PbmVQaXhlbFdpdGhHYW11dENoZWNrKF9jbXNUUkFOU0ZPUk0qIHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyIHdJbltdLApAQCAtMjY0LDkgKzM2NCwxMiBAQAogICAgIGlmICh3T3V0T2ZHYW11dCA+PSAxKSB7CiAKICAgICAgICAgY21zVUludDE2TnVtYmVyIGk7CisgICAgICAgIF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlKiBDb250ZXh0QWxhcm1Db2RlcyA9IChfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsocC0+Q29udGV4dElELCBBbGFybUNvZGVzQ29udGV4dCk7CiAKLSAgICAgICAgZm9yIChpPTA7IGkgPCBwIC0+THV0LT5PdXRwdXRDaGFubmVsczsgaSsrKQotICAgICAgICAgICAgd091dFtpXSA9IEFsYXJtW2ldOworICAgICAgICBmb3IgKGk9MDsgaSA8IHAgLT5MdXQtPk91dHB1dENoYW5uZWxzOyBpKyspIHsKKworICAgICAgICAgICAgd091dFtpXSA9IENvbnRleHRBbGFybUNvZGVzIC0+QWxhcm1Db2Rlc1tpXTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgICAgIHAgLT5MdXQgLT5FdmFsMTZGbih3SW4sIHdPdXQsIHAgLT4gTHV0LT5EYXRhKTsKQEAgLTM5MywzNCArNDk2LDg2IEBACiB9IF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uOwogCiAvLyBUaGUgbGlua2VkIGxpc3QgaGVhZAotc3RhdGljIF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKiBUcmFuc2Zvcm1Db2xsZWN0aW9uID0gTlVMTDsKK19jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUgX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rID0geyBOVUxMIH07CisKKworLy8gRHVwbGljYXRlcyB0aGUgem9uZSBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcGx1Zy1pbiBpbiB0aGUgbmV3IGNvbnRleHQKK3N0YXRpYwordm9pZCBEdXBQbHVnaW5UcmFuc2Zvcm1MaXN0KHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSBuZXdIZWFkID0geyBOVUxMIH07CisgICBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiogIGVudHJ5OworICAgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24qICBBbnRlcmlvciA9IE5VTEw7CisgICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlKiBoZWFkID0gKF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tUcmFuc2Zvcm1QbHVnaW5dOworCisgICAgLy8gV2FsayB0aGUgbGlzdCBjb3B5aW5nIGFsbCBub2RlcworICAgZm9yIChlbnRyeSA9IGhlYWQtPlRyYW5zZm9ybUNvbGxlY3Rpb247CisgICAgICAgIGVudHJ5ICE9IE5VTEw7CisgICAgICAgIGVudHJ5ID0gZW50cnkgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uICpuZXdFbnRyeSA9ICggX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24gKikgX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGVudHJ5LCBzaXplb2YoX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24pKTsKKworICAgICAgICAgICAgaWYgKG5ld0VudHJ5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIGxpbmtlZCBsaXN0IG9yZGVyLCBzbyB0aGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kKKyAgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOworICAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBuZXdFbnRyeTsKKworICAgICAgICAgICAgQW50ZXJpb3IgPSBuZXdFbnRyeTsKKworICAgICAgICAgICAgaWYgKG5ld0hlYWQuVHJhbnNmb3JtQ29sbGVjdGlvbiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIG5ld0hlYWQuVHJhbnNmb3JtQ29sbGVjdGlvbiA9IG5ld0VudHJ5OworICAgIH0KKworICBjdHggLT5jaHVua3NbVHJhbnNmb3JtUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSkpOworfQorCit2b2lkIF9jbXNBbGxvY1RyYW5zZm9ybVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gQ29weSBhbGwgbGlua2VkIGxpc3QKKyAgICAgICAgRHVwUGx1Z2luVHJhbnNmb3JtTGlzdChjdHgsIHNyYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSBUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUgPSB7IE5VTEwgfTsKKyAgICAgICAgY3R4IC0+Y2h1bmtzW1RyYW5zZm9ybVBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgJlRyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSwgc2l6ZW9mKF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUpKTsKKyAgICB9Cit9CisKKwogCiAvLyBSZWdpc3RlciBuZXcgd2F5cyB0byB0cmFuc2Zvcm0KLWNtc0Jvb2wgIF9jbXNSZWdpc3RlclRyYW5zZm9ybVBsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVHJhbnNmb3JtUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBEYXRhKQogewogICAgIGNtc1BsdWdpblRyYW5zZm9ybSogUGx1Z2luID0gKGNtc1BsdWdpblRyYW5zZm9ybSopIERhdGE7CiAgICAgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24qIGZsOworICAgIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELFRyYW5zZm9ybVBsdWdpbik7CiAKLSAgICAgIGlmIChEYXRhID09IE5VTEwpIHsKKyAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CiAKICAgICAgICAgLy8gRnJlZSB0aGUgY2hhaW4uIE1lbW9yeSBpcyBzYWZlbHkgZnJlZWQgYXQgZXhpdAotICAgICAgICBUcmFuc2Zvcm1Db2xsZWN0aW9uID0gTlVMTDsKKyAgICAgICAgY3R4LT5UcmFuc2Zvcm1Db2xsZWN0aW9uID0gTlVMTDsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCiAgICAgLy8gRmFjdG9yeSBjYWxsYmFjayBpcyByZXF1aXJlZAotICAgaWYgKFBsdWdpbiAtPkZhY3RvcnkgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChQbHVnaW4gLT5GYWN0b3J5ID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogCi0gICAgZmwgPSAoX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24qKSBfY21zUGx1Z2luTWFsbG9jKGlkLCBzaXplb2YoX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24pKTsKKyAgICBmbCA9IChfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiopIF9jbXNQbHVnaW5NYWxsb2MoQ29udGV4dElELCBzaXplb2YoX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24pKTsKICAgICBpZiAoZmwgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogCi0gICAgICAvLyBDb3B5IHRoZSBwYXJhbWV0ZXJzCisgICAgLy8gQ29weSB0aGUgcGFyYW1ldGVycwogICAgIGZsIC0+RmFjdG9yeSA9IFBsdWdpbiAtPkZhY3Rvcnk7CiAKICAgICAvLyBLZWVwIGxpbmtlZCBsaXN0Ci0gICAgZmwgLT5OZXh0ID0gVHJhbnNmb3JtQ29sbGVjdGlvbjsKLSAgICBUcmFuc2Zvcm1Db2xsZWN0aW9uID0gZmw7CisgICAgZmwgLT5OZXh0ID0gY3R4LT5UcmFuc2Zvcm1Db2xsZWN0aW9uOworICAgIGN0eC0+VHJhbnNmb3JtQ29sbGVjdGlvbiA9IGZsOwogCiAgICAgLy8gQWxsIGlzIG9rCiAgICAgcmV0dXJuIFRSVUU7CkBAIC00NjMsNiArNjE4LDcgQEAKIF9jbXNUUkFOU0ZPUk0qIEFsbG9jRW1wdHlUcmFuc2Zvcm0oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BpcGVsaW5lKiBsdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpCiB7CisgICAgIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBUcmFuc2Zvcm1QbHVnaW4pOwogICAgICBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiogUGx1Z2luOwogCiAgICAgLy8gQWxsb2NhdGUgbmVlZGVkIG1lbW9yeQpAQCAtNDczLDcgKzYyOSw3IEBACiAgICAgcCAtPkx1dCA9IGx1dDsKIAogICAgIC8vIExldCdzIHNlZSBpZiBhbnkgcGx1Zy1pbiB3YW50IHRvIGRvIHRoZSB0cmFuc2Zvcm0gYnkgaXRzZWxmCi0gICAgZm9yIChQbHVnaW4gPSBUcmFuc2Zvcm1Db2xsZWN0aW9uOworICAgIGZvciAoUGx1Z2luID0gY3R4IC0+VHJhbnNmb3JtQ29sbGVjdGlvbjsKICAgICAgICAgUGx1Z2luICE9IE5VTEw7CiAgICAgICAgIFBsdWdpbiA9IFBsdWdpbiAtPk5leHQpIHsKIApAQCAtNDkzLDEwICs2NDksMTAgQEAKICAgICAgICAgICAgICAgICAvLyBGaWxsIHRoZSBmb3JtYXR0ZXJzIGp1c3QgaW4gY2FzZSB0aGUgb3B0aW1pemVkIHJvdXRpbmUgaXMgaW50ZXJlc3RlZC4KICAgICAgICAgICAgICAgICAvLyBObyBlcnJvciBpcyB0aHJvd24gaWYgdGhlIGZvcm1hdHRlciBkb2Vzbid0IGV4aXN0LiBJdCBpcyB1cCB0byB0aGUgb3B0aW1pemF0aW9uCiAgICAgICAgICAgICAgICAgLy8gZmFjdG9yeSB0byBkZWNpZGUgd2hhdCB0byBkbyBpbiB0aG9zZSBjYXNlcy4KLSAgICAgICAgICAgICAgICBwIC0+RnJvbUlucHV0ICAgICAgPSBfY21zR2V0Rm9ybWF0dGVyKCpJbnB1dEZvcm1hdCwgIGNtc0Zvcm1hdHRlcklucHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OwotICAgICAgICAgICAgICAgIHAgLT5Ub091dHB1dCAgICAgICA9IF9jbXNHZXRGb3JtYXR0ZXIoKk91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OwotICAgICAgICAgICAgICAgIHAgLT5Gcm9tSW5wdXRGbG9hdCA9IF9jbXNHZXRGb3JtYXR0ZXIoKklucHV0Rm9ybWF0LCAgY21zRm9ybWF0dGVySW5wdXQsIENNU19QQUNLX0ZMQUdTX0ZMT0FUKS5GbXRGbG9hdDsKLSAgICAgICAgICAgICAgICBwIC0+VG9PdXRwdXRGbG9hdCAgPSBfY21zR2V0Rm9ybWF0dGVyKCpPdXRwdXRGb3JtYXQsIGNtc0Zvcm1hdHRlck91dHB1dCwgQ01TX1BBQ0tfRkxBR1NfRkxPQVQpLkZtdEZsb2F0OworICAgICAgICAgICAgICAgIHAgLT5Gcm9tSW5wdXQgICAgICA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKKyAgICAgICAgICAgICAgICBwIC0+VG9PdXRwdXQgICAgICAgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKk91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OworICAgICAgICAgICAgICAgIHAgLT5Gcm9tSW5wdXRGbG9hdCA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfRkxPQVQpLkZtdEZsb2F0OworICAgICAgICAgICAgICAgIHAgLT5Ub091dHB1dEZsb2F0ICA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqT3V0cHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJPdXRwdXQsIENNU19QQUNLX0ZMQUdTX0ZMT0FUKS5GbXRGbG9hdDsKIAogICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICAgfQpAQCAtNTA0LDE0ICs2NjAsMTQgQEAKIAogICAgIC8vIE5vdCBzdWl0YWJsZSBmb3IgdGhlIHRyYW5zZm9ybSBwbHVnLWluLCBsZXQncyBjaGVjayAgdGhlIHBpcGVsaW5lIHBsdWctaW4KICAgICBpZiAocCAtPkx1dCAhPSBOVUxMKQotICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZSgmcC0+THV0LCBJbnRlbnQsIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQsIGR3RmxhZ3MpOworICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZShDb250ZXh0SUQsICZwLT5MdXQsIEludGVudCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncyk7CiAKICAgICAvLyBDaGVjayB3aGF0ZXZlciB0aGlzIGlzIGEgdHJ1ZSBmbG9hdGluZyBwb2ludCB0cmFuc2Zvcm0KICAgICBpZiAoX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKklucHV0Rm9ybWF0KSAmJiBfY21zRm9ybWF0dGVySXNGbG9hdCgqT3V0cHV0Rm9ybWF0KSkgewogCiAgICAgICAgIC8vIEdldCBmb3JtYXR0ZXIgZnVuY3Rpb24gYWx3YXlzIHJldHVybiBhIHZhbGlkIHVuaW9uLCBidXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdW5pb24gbWF5IGJlIE5VTEwuCi0gICAgICAgIHAgLT5Gcm9tSW5wdXRGbG9hdCA9IF9jbXNHZXRGb3JtYXR0ZXIoKklucHV0Rm9ybWF0LCAgY21zRm9ybWF0dGVySW5wdXQsIENNU19QQUNLX0ZMQUdTX0ZMT0FUKS5GbXRGbG9hdDsKLSAgICAgICAgcCAtPlRvT3V0cHV0RmxvYXQgID0gX2Ntc0dldEZvcm1hdHRlcigqT3V0cHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJPdXRwdXQsIENNU19QQUNLX0ZMQUdTX0ZMT0FUKS5GbXRGbG9hdDsKKyAgICAgICAgcCAtPkZyb21JbnB1dEZsb2F0ID0gX2Ntc0dldEZvcm1hdHRlcihDb250ZXh0SUQsICpJbnB1dEZvcm1hdCwgIGNtc0Zvcm1hdHRlcklucHV0LCBDTVNfUEFDS19GTEFHU19GTE9BVCkuRm10RmxvYXQ7CisgICAgICAgIHAgLT5Ub091dHB1dEZsb2F0ICA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqT3V0cHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJPdXRwdXQsIENNU19QQUNLX0ZMQUdTX0ZMT0FUKS5GbXRGbG9hdDsKICAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfQ0FOX0NIQU5HRV9GT1JNQVRURVI7CiAKICAgICAgICAgaWYgKHAgLT5Gcm9tSW5wdXRGbG9hdCA9PSBOVUxMIHx8IHAgLT5Ub091dHB1dEZsb2F0ID09IE5VTEwpIHsKQEAgLTUyMSw4ICs2NzcsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gRmxvYXQgdHJhbnNmb3JtcyBkb24ndCB1c2UgY2FjaOksIGFsd2F5cyBhcmUgbm9uLU5VTEwKLSAgICAgICAgcCAtPnhmb3JtID0gRmxvYXRYRk9STTsKKyAgICAgICAgaWYgKCpkd0ZsYWdzICYgY21zRkxBR1NfTlVMTFRSQU5TRk9STSkgeworCisgICAgICAgICAgICBwIC0+eGZvcm0gPSBOdWxsRmxvYXRYRk9STTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZsb2F0IHRyYW5zZm9ybXMgZG9uJ3QgdXNlIGNhY2jpLCBhbHdheXMgYXJlIG5vbi1OVUxMCisgICAgICAgICAgICBwIC0+eGZvcm0gPSBGbG9hdFhGT1JNOworICAgICAgICB9CisKICAgICB9CiAgICAgZWxzZSB7CiAKQEAgLTUzNCw4ICs2OTcsOCBAQAogCiAgICAgICAgICAgICBpbnQgQnl0ZXNQZXJQaXhlbElucHV0OwogCi0gICAgICAgICAgICBwIC0+RnJvbUlucHV0ID0gX2Ntc0dldEZvcm1hdHRlcigqSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKLSAgICAgICAgICAgIHAgLT5Ub091dHB1dCAgPSBfY21zR2V0Rm9ybWF0dGVyKCpPdXRwdXRGb3JtYXQsIGNtc0Zvcm1hdHRlck91dHB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKKyAgICAgICAgICAgIHAgLT5Gcm9tSW5wdXQgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKklucHV0Rm9ybWF0LCAgY21zRm9ybWF0dGVySW5wdXQsIENNU19QQUNLX0ZMQUdTXzE2QklUUykuRm10MTY7CisgICAgICAgICAgICBwIC0+VG9PdXRwdXQgID0gX2Ntc0dldEZvcm1hdHRlcihDb250ZXh0SUQsICpPdXRwdXRGb3JtYXQsIGNtc0Zvcm1hdHRlck91dHB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKIAogICAgICAgICAgICAgaWYgKHAgLT5Gcm9tSW5wdXQgPT0gTlVMTCB8fCBwIC0+VG9PdXRwdXQgPT0gTlVMTCkgewogCkBAIC03MjcsNiArODkwLDcgQEAKICAgICAvLyBDaGVjayBjaGFubmVsIGNvdW50CiAgICAgaWYgKChjbXNDaGFubmVsc09mKEVudHJ5Q29sb3JTcGFjZSkgIT0gY21zUGlwZWxpbmVJbnB1dENoYW5uZWxzKEx1dCkpIHx8CiAgICAgICAgIChjbXNDaGFubmVsc09mKEV4aXRDb2xvclNwYWNlKSAgIT0gY21zUGlwZWxpbmVPdXRwdXRDaGFubmVscyhMdXQpKSkgeworICAgICAgICBjbXNQaXBlbGluZUZyZWUoTHV0KTsKICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9OT1RfU1VJVEFCTEUsICJDaGFubmVsIGNvdW50IGRvZXNuJ3QgbWF0Y2guIFByb2ZpbGUgaXMgY29ycnVwdGVkIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTgyOSw3ICs5OTMsNyBAQAogICAgIGZvciAoaT0wOyBpIDwgblByb2ZpbGVzOyBpKyspIHsKICAgICAgICAgQlBDW2ldID0gZHdGbGFncyAmIGNtc0ZMQUdTX0JMQUNLUE9JTlRDT01QRU5TQVRJT04gPyBUUlVFIDogRkFMU0U7CiAgICAgICAgIEludGVudHNbaV0gPSBJbnRlbnQ7Ci0gICAgICAgIEFkYXB0YXRpb25TdGF0ZXNbaV0gPSBHbG9iYWxBZGFwdGF0aW9uU3RhdGU7CisgICAgICAgIEFkYXB0YXRpb25TdGF0ZXNbaV0gPSBjbXNTZXRBZGFwdGF0aW9uU3RhdGVUSFIoQ29udGV4dElELCAtMSk7CiAgICAgfQogCiAKQEAgLTkwOSw3ICsxMDczLDcgQEAKICAgICBJbnRlbnRzWzBdID0gbkludGVudDsgICAgICBJbnRlbnRzWzFdID0gbkludGVudDsgICAgICAgIEludGVudHNbMl0gPSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDOyAgSW50ZW50c1szXSA9IFByb29maW5nSW50ZW50OwogICAgIEJQQ1swXSAgICAgPSBEb0JQQzsgICAgICAgIEJQQ1sxXSA9IERvQlBDOyAgICAgICAgICAgICAgQlBDWzJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUENbM10gPSAwOwogCi0gICAgQWRhcHRhdGlvblswXSA9IEFkYXB0YXRpb25bMV0gPSBBZGFwdGF0aW9uWzJdID0gQWRhcHRhdGlvblszXSA9IEdsb2JhbEFkYXB0YXRpb25TdGF0ZTsKKyAgICBBZGFwdGF0aW9uWzBdID0gQWRhcHRhdGlvblsxXSA9IEFkYXB0YXRpb25bMl0gPSBBZGFwdGF0aW9uWzNdID0gY21zU2V0QWRhcHRhdGlvblN0YXRlVEhSKENvbnRleHRJRCwgLTEpOwogCiAgICAgaWYgKCEoZHdGbGFncyAmIChjbXNGTEFHU19TT0ZUUFJPT0ZJTkd8Y21zRkxBR1NfR0FNVVRDSEVDSykpKQogICAgICAgICByZXR1cm4gY21zQ3JlYXRlVHJhbnNmb3JtVEhSKENvbnRleHRJRCwgSW5wdXRQcm9maWxlLCBJbnB1dEZvcm1hdCwgT3V0cHV0UHJvZmlsZSwgT3V0cHV0Rm9ybWF0LCBuSW50ZW50LCBkd0ZsYWdzKTsKQEAgLTk4NCw4ICsxMTQ4LDggQEAKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIEZyb21JbnB1dCA9IF9jbXNHZXRGb3JtYXR0ZXIoSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKLSAgICBUb091dHB1dCAgPSBfY21zR2V0Rm9ybWF0dGVyKE91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OworICAgIEZyb21JbnB1dCA9IF9jbXNHZXRGb3JtYXR0ZXIoeGZvcm0tPkNvbnRleHRJRCwgSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKKyAgICBUb091dHB1dCAgPSBfY21zR2V0Rm9ybWF0dGVyKHhmb3JtLT5Db250ZXh0SUQsIE91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OwogCiAgICAgaWYgKEZyb21JbnB1dCA9PSBOVUxMIHx8IFRvT3V0cHV0ID09IE5VTEwpIHsKIApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyLmggYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczIuaAppbmRleCBjNmMzNWIxLi4yZmQyYjU2IDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczIuaAorKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczIuaApAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC01Miw3ICs1Miw3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCi0vLyBWZXJzaW9uIDIuNQorLy8gVmVyc2lvbiAyLjYKIC8vCiAKICNpZm5kZWYgX2xjbXMyX0gKQEAgLTg0LDYgKzg0LDkgQEAKIC8vIFVuY29tbWVudCB0byBnZXQgcmlkIG9mIHRoZSB0YWJsZXMgZm9yICJoYWxmIiBmbG9hdCBzdXBwb3J0CiAvLyAjZGVmaW5lIENNU19OT19IQUxGX1NVUFBPUlQgMQogCisvLyBVbmNvbW1lbnQgdG8gZ2V0IHJpZCBvZiBwdGhyZWFkcy93aW5kb3dzIGRlcGVuZGVuY3kKKy8vICNkZWZpbmUgQ01TX05PX1BUSFJFQURTICAxCisKIC8vICoqKioqKioqKiogRW5kIG9mIGNvbmZpZ3VyYXRpb24gdG9nZ2xlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogLy8gTmVlZGVkIGZvciBzdHJlYW1zCkBAIC0xMDEsNyArMTA0LDcgQEAKICNlbmRpZgogCiAvLyBWZXJzaW9uL3JlbGVhc2UKLSNkZWZpbmUgTENNU19WRVJTSU9OICAgICAgICAyMDUwCisjZGVmaW5lIExDTVNfVkVSU0lPTiAgICAgICAgMjA2MAogCiAvLyBJIHdpbGwgZ2l2ZSB0aGUgY2hhbmNlIG9mIHJlZGVmaW5pbmcgYmFzaWMgdHlwZXMgZm9yIGNvbXBpbGVycyB0aGF0IGFyZSBub3QgZnVsbHkgQzk5IGNvbXBsaWFudAogI2lmbmRlZiBDTVNfQkFTSUNfVFlQRVNfQUxSRUFEWV9ERUZJTkVECkBAIC0yMDIsMjggKzIwNSw0MiBAQAogLy8gVHJ5IHRvIGRldGVjdCBiaWcgZW5kaWFuIHBsYXRmb3Jtcy4gVGhpcyBsaXN0IGNhbiBiZSBlbmRsZXNzLCBzbyBvbmx5IHNvbWUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgb3ZlciBoZXJlLgogLy8geW91IGNhbiBwYXNzIHRoaXMgdG9nZ2xlIHRvIHRoZSBjb21waWxlciBieSB1c2luZyAtRENNU19VU0VfQklHX0VORElBTiBvciBzb21ldGhpbmcgc2ltaWxhcgogCisjaWYgZGVmaW5lZChfX3NnaV9fKSB8fCBkZWZpbmVkKF9fc2dpKSB8fCBkZWZpbmVkKHNwYXJjKQorIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAgICAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19zMzkweF9fKQorIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAxCisjZW5kaWYKKworIyAgaWZkZWYgVEFSR0VUX0NQVV9QUEMKKyMgICAgaWYgVEFSR0VUX0NQVV9QUEMKKyMgICAgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChUQVJHRVRfQ1BVX1BQQykKKyMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgMQorIyAgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjICAgICAgIGlmIF9fQllURV9PUkRFUiAgPT0gX19MSVRUTEVfRU5ESUFOCisvLyAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSBiaWcgZW5kaWFuIGZvciBQb3dlclBDIGxpdHRsZSBlbmRpYW4gbW9kZQorIyAgICAgICAgICAgICAgICB1bmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KKyMgICAgICAgZW5kaWYKKyMgICBlbmRpZgorI2VuZGlmCisKKy8vIFdPUkRTX0JJR0VORElBTiB0YWtlcyBwcmVjZWRlbmNlCiAjaWYgZGVmaW5lZChfSE9TVF9CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKF9fQklHX0VORElBTl9fKSB8fCBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKICMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgICAgMQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9fc2dpX18pIHx8IGRlZmluZWQoX19zZ2kpIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoc3BhcmMpCi0jICAgZGVmaW5lIENNU19VU0VfQklHX0VORElBTiAgICAgIDEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9fczM5MHhfXykKLSMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgMQotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfQ1BVX1BQQwotIyBpZiBUQVJHRVRfQ1BVX1BQQwotIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAxCi0jIGVuZGlmCi0jZW5kaWYKLQogI2lmZGVmIG1hY2ludG9zaAogIyBpZmRlZiBfX0JJR19FTkRJQU5fXwogIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAgICAxCiAjIGVuZGlmCisjIGlmZGVmIF9fTElUVExFX0VORElBTl9fCisjICAgdW5kZWYgQ01TX1VTRV9CSUdfRU5ESUFOCisjIGVuZGlmCiAjZW5kaWYKIAogLy8gQ2FsbGluZyBjb252ZW50aW9uIC0tIHRoaXMgaXMgaGFyZGx5IHBsYXRmb3JtIGFuZCBjb21waWxlciBkZXBlbmRlbnQKQEAgLTI0OSw2ICsyNjYsMTQgQEAKICMgZGVmaW5lIENNU0FQSQogI2VuZGlmCiAKKyNpZmRlZiBIYXNUSFJFQURTCisjIGlmIEhhc1RIUkVBRFMgPT0gMQorIyAgICB1bmRlZiBDTVNfTk9fUFRIUkVBRFMKKyMgZWxzZQorIyAgICBkZWZpbmUgQ01TX05PX1BUSFJFQURTIDEKKyMgZW5kaWYKKyNlbmRpZgorCiAvLyBTb21lIGNvbW1vbiBkZWZpbml0aW9ucwogI2RlZmluZSBjbXNNQVhfUEFUSCAgICAgMjU2CiAKQEAgLTY0Miw3ICs2NjcsNiBAQAogCiAvLyBMaXR0bGUgQ01TIHNwZWNpZmljIHR5cGVkZWZzCiAKLXR5cGVkZWYgdm9pZCogY21zQ29udGV4dDsgICAgICAgICAgICAgIC8vIENvbnRleHQgaWRlbnRpZmllciBmb3IgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudHMKIHR5cGVkZWYgdm9pZCogY21zSEFORExFIDsgICAgICAgICAgICAgIC8vIEdlbmVyaWMgaGFuZGxlCiB0eXBlZGVmIHZvaWQqIGNtc0hQUk9GSUxFOyAgICAgICAgICAgICAvLyBPcGFxdWUgdHlwZWRlZnMgdG8gaGlkZSBpbnRlcm5hbHMKIHR5cGVkZWYgdm9pZCogY21zSFRSQU5TRk9STTsKQEAgLTEwMTIsMTEgKzEwMzYsMjUgQEAKIENNU0FQSSBpbnQgICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zc3RyY2FzZWNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOwogQ01TQVBJIGxvbmcgaW50ICAgICAgICAgIENNU0VYUE9SVCBjbXNmaWxlbGVuZ3RoKEZJTEUqIGYpOwogCi0vLyBQbHVnLUluIHJlZ2lzdGVyaW5nICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29udGV4dCBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFYWNoIGNvbnRleHQgaG9sZHMgaXRzIG93bnMgZ2xvYmFscyBhbmQgaXRzIG93biBwbHVnLWlucy4gVGhlcmUgaXMgYSBnbG9iYWwgY29udGV4dCB3aXRoIHRoZSBpZCA9IDAgZm9yIGxlY2FjeSBjb21wYXRpYmlsaXR5CisvLyB0aG91Z2ggdXNpbmcgdGhlIGdsb2JhbCBjb250ZXh0IGlzIG5vdCByZWNvbWVuZGVkLiBQcm9wZXIgY29udGV4dCBoYW5kbGluZyBtYWtlcyBsY21zIG1vcmUgdGhyZWFkLXNhZmUuCisKK3R5cGVkZWYgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY21zQ29udGV4dDsKKworQ01TQVBJIGNtc0NvbnRleHQgICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUNvbnRleHQodm9pZCogUGx1Z2luLCB2b2lkKiBVc2VyRGF0YSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRGVsZXRlQ29udGV4dChjbXNDb250ZXh0IENvbnRleElEKTsKK0NNU0FQSSBjbXNDb250ZXh0ICAgICAgIENNU0VYUE9SVCBjbXNEdXBDb250ZXh0KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBOZXdVc2VyRGF0YSk7CitDTVNBUEkgdm9pZCogICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0Q29udGV4dFVzZXJEYXRhKGNtc0NvbnRleHQgQ29udGV4dElEKTsKKworLy8gUGx1Zy1JbiByZWdpc3RlcmluZyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNQbHVnaW4odm9pZCogUGx1Z2luKTsKIENNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zUGx1Z2luVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBQbHVnaW4pOwogQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNVbnJlZ2lzdGVyUGx1Z2lucyh2b2lkKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zVW5yZWdpc3RlclBsdWdpbnNUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOwogCiAvLyBFcnJvciBsb2dnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTA1Myw2ICsxMDkxLDcgQEAKIAogLy8gQWxsb3dzIHVzZXIgdG8gc2V0IGFueSBzcGVjaWZpYyBsb2dnZXIKIENNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0TG9nRXJyb3JIYW5kbGVyKGNtc0xvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIEZuKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0TG9nRXJyb3JIYW5kbGVyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBGbik7CiAKIC8vIENvbnZlcnNpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTE1MTQsNiArMTU1Myw3IEBACiBDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tTWVtKGNvbnN0IHZvaWQgKiBNZW1QdHIsIGNtc1VJbnQzMk51bWJlciBkd1NpemUpOwogQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbU1lbVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCAqIE1lbVB0ciwgY21zVUludDMyTnVtYmVyIGR3U2l6ZSk7CiBDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tSU9oYW5kbGVyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvKTsKK0NNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21JT2hhbmRsZXIyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNCb29sIHdyaXRlKTsKIENNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNDbG9zZVByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwogCiBDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zU2F2ZVByb2ZpbGVUb0ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IGNoYXIqIEZpbGVOYW1lKTsKQEAgLTE2MDQsNiArMTY0NCw3IEBACiAKIC8vIENhbGwgd2l0aCBOVUxMIGFzIHBhcmFtZXRlcnMgdG8gZ2V0IHRoZSBpbnRlbnQgY291bnQKIENNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzKGNtc1VJbnQzMk51bWJlciBuTWF4LCBjbXNVSW50MzJOdW1iZXIqIENvZGVzLCBjaGFyKiogRGVzY3JpcHRpb25zKTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbk1heCwgY21zVUludDMyTnVtYmVyKiBDb2RlcywgY2hhcioqIERlc2NyaXB0aW9ucyk7CiAKIC8vIEZsYWdzCiAKQEAgLTE3MTUsMTEgKzE3NTYsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKTsKIAogCi1DTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0QWxhcm1Db2RlcyhjbXNVSW50MTZOdW1iZXIgTmV3QWxhcm1bY21zTUFYQ0hBTk5FTFNdKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRBbGFybUNvZGVzKGNvbnN0IGNtc1VJbnQxNk51bWJlciBOZXdBbGFybVtjbXNNQVhDSEFOTkVMU10pOwogQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0dldEFsYXJtQ29kZXMoY21zVUludDE2TnVtYmVyIE5ld0FsYXJtW2Ntc01BWENIQU5ORUxTXSk7CiAKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEFsYXJtQ29kZXNUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyIEFsYXJtQ29kZXNbY21zTUFYQ0hBTk5FTFNdKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNHZXRBbGFybUNvZGVzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciBBbGFybUNvZGVzW2Ntc01BWENIQU5ORUxTXSk7CisKKworCiAvLyBBZGFwdGF0aW9uIHN0YXRlIGZvciBhYnNvbHV0ZSBjb2xvcmltZXRyaWMgaW50ZW50CiBDTVNBUEkgY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zU2V0QWRhcHRhdGlvblN0YXRlKGNtc0Zsb2F0NjROdW1iZXIgZCk7CitDTVNBUEkgY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zU2V0QWRhcHRhdGlvblN0YXRlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNGbG9hdDY0TnVtYmVyIGQpOworCisKIAogLy8gR3JhYiB0aGUgQ29udGV4dElEIGZyb20gYW4gb3BlbiB0cmFuc2Zvcm0uIFJldHVybnMgTlVMTCBpZiBhIE5VTEwgdHJhbnNmb3JtIGlzIHBhc3NlZAogQ01TQVBJIGNtc0NvbnRleHQgICAgICAgQ01TRVhQT1JUIGNtc0dldFRyYW5zZm9ybUNvbnRleHRJRChjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0pOwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyX2ludGVybmFsLmggYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczJfaW50ZXJuYWwuaAppbmRleCA2ZmJiYjk1Li43ZjI4ZjNkIDEwMDY0NAotLS0gYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczJfaW50ZXJuYWwuaAorKysgYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczJfaW50ZXJuYWwuaApAQCAtMzAsNyArMzAsNyBAQAogCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDExIE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMTkzLDE2ICsxOTMsMTcxIEBACiAgICAgcmV0dXJuIF9jbXNRdWlja0Zsb29yV29yZChkKTsKIH0KIAotLy8gUGx1Zy1JbiByZWdpc3RlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUHRocmVhZCBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIENNU19OT19QVEhSRUFEUworCisvLyBUaGlzIGlzIHRoZSB0aHJlYWRpbmcgc3VwcG9ydC4gVW5mb3J0dW5hdGVseSwgaXQgaGFzIHRvIGJlIHBsYXRmb3JtLWRlcGVuZGVudCBiZWNhdXNlCisvLyB3aW5kb3dzIGRvZXMgbm90IHN1cHBvcnQgcHRocmVhZHMuCisKKyNpZmRlZiBDTVNfSVNfV0lORE9XU18KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKworLy8gRnJvbTogaHR0cDovL2xvY2tsZXNzaW5jLmNvbS9hcnRpY2xlcy9wdGhyZWFkc19vbl93aW5kb3dzLworLy8gVGhlIHB0aHJlYWRzIEFQSSBoYXMgYW4gaW5pdGlhbGl6YXRpb24gbWFjcm8gdGhhdCBoYXMgbm8gY29ycmVzcG9uZGVuY2UgdG8gYW55dGhpbmcgaW4KKy8vIHRoZSB3aW5kb3dzIEFQSS4gQnkgaW52ZXN0aWdhdGluZyB0aGUgaW50ZXJuYWwgZGVmaW5pdGlvbiBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiB0eXBlLAorLy8gb25lIG1heSB3b3JrIG91dCBob3cgdG8gaW5pdGlhbGl6ZSBvbmUgd2l0aG91dCBjYWxsaW5nIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oKS4KKy8vIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigpIGlzIG5vdCBhbGxvd2VkIHRvIGZhaWwuIEl0IHRyaWVzCisvLyB0byBhbGxvY2F0ZSBhIGNyaXRpY2FsIHNlY3Rpb24gZGVidWcgb2JqZWN0LCBidXQgaWYgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSwgaXQgc2V0cworLy8gdGhlIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gKE9uZSB3b3VsZCBleHBlY3QgdGhhdCB2YWx1ZSB0byBiZSBOVUxMLCBidXQgaXQgaXMKKy8vIGFjdHVhbGx5ICh2b2lkICopLTEgZm9yIHNvbWUgcmVhc29uLikgVGh1cyB3ZSBjYW4gdXNlIHRoaXMgc3BlY2lhbCB2YWx1ZSBmb3IgdGhhdAorLy8gcG9pbnRlciwgYW5kIHRoZSBjcml0aWNhbCBzZWN0aW9uIGNvZGUgd2lsbCB3b3JrLgorCisvLyBUaGUgb3RoZXIgaW1wb3J0YW50IHBhcnQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdHlwZSB0byBpbml0aWFsaXplIGlzIHRoZSBudW1iZXIKKy8vIG9mIHdhaXRlcnMuIFRoaXMgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIG11dGV4IGlzIGxvY2tlZC4gRm9ydHVuYXRlbHksIHRoaXMKKy8vIHBhcnQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgdW5saWtlbHkgdG8gY2hhbmdlLiBBcHBhcmVudGx5LCBtYW55IHByb2dyYW1zCisvLyBhbHJlYWR5IHRlc3QgY3JpdGljYWwgc2VjdGlvbnMgdG8gc2VlIGlmIHRoZXkgYXJlIGxvY2tlZCB1c2luZyB0aGlzIHZhbHVlLCBzbworLy8gTWljcm9zb2Z0IGZlbHQgdGhhdCBpdCB3YXMgbmVjZXNzYXJ5IHRvIGtlZXAgaXQgc2V0IGF0IC0xIGZvciBhbiB1bmxvY2tlZCBjcml0aWNhbAorLy8gc2VjdGlvbiwgZXZlbiB3aGVuIHRoZXkgY2hhbmdlZCB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0gdG8gYmUgbW9yZSBzY2FsYWJsZS4KKy8vIFRoZSBmaW5hbCBwYXJ0cyBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBvYmplY3QgYXJlIHVuaW1wb3J0YW50LCBhbmQgY2FuIGJlIHNldAorLy8gdG8gemVybyBmb3IgdGhlaXIgZGVmYXVsdHMuIFRoaXMgeWllbGRzIGFuIGluaXRpYWxpemF0aW9uIG1hY3JvOgorCit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gX2Ntc011dGV4OworCisjZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiB7KHZvaWQqKSAtMSwtMSwwLDAsMCwwfQorCitjbXNJTkxJTkUgaW50IF9jbXNMb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24obSk7CisgICAgICAgIHJldHVybiAwOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNVbmxvY2tQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisgICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24obSk7CisgICAgICAgIHJldHVybiAwOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNEZXN0cm95TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24obSk7CisgICAgICAgIHJldHVybiAwOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKG0pOworICAgICAgICByZXR1cm4gMDsKK30KKworY21zSU5MSU5FIGludCBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKy8vIFJlc3Qgb2YgdGhlIHdpZGUgd29ybGQKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNkZWZpbmUgQ01TX01VVEVYX0lOSVRJQUxJWkVSIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9jbXNNdXRleDsKKworCitjbXNJTkxJTkUgaW50IF9jbXNMb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jayhtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG0pOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNJbml0TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgICAgICByZXR1cm4gcHRocmVhZF9tdXRleF9pbml0KG0sIE5VTEwpOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNEZXN0cm95TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgICAgICByZXR1cm4gcHRocmVhZF9tdXRleF9kZXN0cm95KG0pOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisgICAgICAgIHJldHVybiBwdGhyZWFkX211dGV4X2xvY2sobSk7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG0pOworfQorCisjZW5kaWYKKyNlbHNlCisKKyNkZWZpbmUgQ01TX01VVEVYX0lOSVRJQUxJWkVSIDAKK3R5cGVkZWYgaW50IF9jbXNNdXRleDsKKworCitjbXNJTkxJTkUgaW50IF9jbXNMb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zSW5pdE11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgICAgICByZXR1cm4gMDsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG0pOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNMZWF2ZUNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisgICAgICAgIHJldHVybiAwOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7Cit9CisjZW5kaWYKKworLy8gUGx1Zy1JbiByZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpYWxpemVkIGZ1bmN0aW9uIGZvciBwbHVnLWluIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBwYWlyaW5nIGZyZWUoKSBzaW5jZSB3aG9sZSBwb29sIGlzIGZyZWVkIGF0IG9uY2UuCiB2b2lkKiBfY21zUGx1Z2luTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7CiAKIC8vIE1lbW9yeSBtYW5hZ2VtZW50Ci1jbXNCb29sICAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworY21zQm9vbCAgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7CiAKIC8vIEludGVycG9sYXRpb24KLWNtc0Jvb2wgIF9jbXNSZWdpc3RlckludGVycFBsdWdpbihjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworY21zQm9vbCAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwogCiAvLyBQYXJhbWV0cmljIGN1cnZlcwogY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUGFyYW1ldHJpY0N1cnZlc1BsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKQEAgLTIyOCw5ICszODMsMTIgQEAKIC8vIFRyYW5zZm9ybQogY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVHJhbnNmb3JtUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwogCisvLyBNdXRleAorY21zQm9vbCBfY21zUmVnaXN0ZXJNdXRleFBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIFN1YmFsbG9jYXRvcnMuIFRob3NlIGFyZSBibG9ja3Mgb2YgbWVtb3J5IHRoYXQgaXMgZnJlZWQgYXQgdGhlIGVuZCBvbiB3aG9sZSBibG9jay4KKy8vIFN1YmFsbG9jYXRvcnMuCiB0eXBlZGVmIHN0cnVjdCBfY21zU3ViQWxsb2NhdG9yX2NodW5rX3N0IHsKIAogICAgIGNtc1VJbnQ4TnVtYmVyKiBCbG9jazsKQEAgLTI1Myw5ICs0MTEsMjY0IEBACiBfY21zU3ViQWxsb2NhdG9yKiBfY21zQ3JlYXRlU3ViQWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBJbml0aWFsKTsKIHZvaWQgICAgICAgICAgICAgIF9jbXNTdWJBbGxvY0Rlc3Ryb3koX2Ntc1N1YkFsbG9jYXRvciogcyk7CiB2b2lkKiAgICAgICAgICAgICBfY21zU3ViQWxsb2MoX2Ntc1N1YkFsbG9jYXRvciogcywgY21zVUludDMyTnVtYmVyIHNpemUpOwordm9pZCogICAgICAgICAgICAgX2Ntc1N1YkFsbG9jRHVwKF9jbXNTdWJBbGxvY2F0b3IqIHMsIGNvbnN0IHZvaWQgKnB0ciwgY21zVUludDMyTnVtYmVyIHNpemUpOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy8vIFRoZSBjb250ZXh0IGNsaWVudHMuCit0eXBlZGVmIGVudW0geworCisgICAgVXNlclB0ciwgICAgICAgICAgICAvLyBVc2VyLWRlZmluZWQgcG9pbnRlcgorICAgIExvZ2dlciwKKyAgICBBbGFybUNvZGVzQ29udGV4dCwKKyAgICBBZGFwdGF0aW9uU3RhdGVDb250ZXh0LAorICAgIE1lbVBsdWdpbiwKKyAgICBJbnRlcnBQbHVnaW4sCisgICAgQ3VydmVzUGx1Z2luLAorICAgIEZvcm1hdHRlcnNQbHVnaW4sCisgICAgVGFnVHlwZVBsdWdpbiwKKyAgICBUYWdQbHVnaW4sCisgICAgSW50ZW50UGx1Z2luLAorICAgIE1QRVBsdWdpbiwKKyAgICBPcHRpbWl6YXRpb25QbHVnaW4sCisgICAgVHJhbnNmb3JtUGx1Z2luLAorICAgIE11dGV4UGx1Z2luLAorCisgICAgLy8gTGFzdCBpbiBsaXN0CisgICAgTWVtb3J5Q2xpZW50TWF4CisKK30gX2Ntc01lbW9yeUNsaWVudDsKKworCisvLyBDb250YWluZXIgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHBsdWctaW4uCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBfY21zTWFsbG9jRm5QdHJUeXBlICAgICBNYWxsb2NQdHI7CisgICAgX2Ntc01hbGxvWmVyb2NGblB0clR5cGUgTWFsbG9jWmVyb1B0cjsKKyAgICBfY21zRnJlZUZuUHRyVHlwZSAgICAgICBGcmVlUHRyOworICAgIF9jbXNSZWFsbG9jRm5QdHJUeXBlICAgIFJlYWxsb2NQdHI7CisgICAgX2Ntc0NhbGxvY0ZuUHRyVHlwZSAgICAgQ2FsbG9jUHRyOworICAgIF9jbXNEdXBGblB0clR5cGUgICAgICAgIER1cFB0cjsKKworfSBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlOworCisvLyBDb3B5IG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gcGx1Zy1pbiB0byBjaHVuaywgdGFraW5nIGNhcmUgb2YgbWlzc2luZyByb3V0aW5lcwordm9pZCAgX2Ntc0luc3RhbGxBbGxvY0Z1bmN0aW9ucyhjbXNQbHVnaW5NZW1IYW5kbGVyKiBQbHVnaW4sIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqIHB0cik7CisKKy8vIEludGVybmFsIHN0cnVjdHVyZSBmb3IgY29udGV4dAorc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCB7CisKKyAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBOZXh0OyAgLy8gUG9pbnRzIHRvIG5leHQgY29udGV4dCBpbiB0aGUgbmV3IHN0eWxlCisgICAgX2Ntc1N1YkFsbG9jYXRvciogTWVtUG9vbDsgICAgICAgIC8vIFRoZSBtZW1vcnkgcG9vbCB0aGF0IHN0b3JlcyBjb250ZXh0IGRhdGEKKworICAgIHZvaWQqIGNodW5rc1tNZW1vcnlDbGllbnRNYXhdOyAgICAvLyBhcnJheSBvZiBwb2ludGVycyB0byBjbGllbnQgY2h1bmtzLiBNZW1vcnkgaXRzZWxmIGlzIGhvbGQgaW4gdGhlIHN1YmFsbG9jYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgTlVMTCwgdGhlbiBpdCByZXZlcnRzIHRvIGdsb2JhbCBDb250ZXh0MAorCisgICAgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSBEZWZhdWx0TWVtb3J5TWFuYWdlcjsgIC8vIFRoZSBhbGxvY2F0b3JzIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBjb250ZXh0IGl0c2VsZi4gQ2Fubm90IGJlIG92ZXJyaWRlbgorfTsKKworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSB2YWxpZCBjb250ZXh0IHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRoZSBnbG9iYWwgb25lIGlmIGlkIGlzIHplcm8uCisvLyBWZXJpZmllcyB0aGUgbWFnaWMgbnVtYmVyLgorc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogX2Ntc0dldENvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQpOworCisvLyBSZXR1cm5zIHRoZSBibG9jayBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWMgem9uZS4KK3ZvaWQqICAgICBfY21zQ29udGV4dEdldENsaWVudENodW5rKGNtc0NvbnRleHQgaWQsIF9jbXNNZW1vcnlDbGllbnQgbWMpOworCisKKy8vIENodW5rcyBvZiBjb250ZXh0IG1lbW9yeSBieSBwbHVnLWluIGNsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRob3NlIHN0cnVjdHVyZXMgZW5jYXBzdWxhdGVzIGFsbCB2YXJpYWJsZXMgbmVlZGVkIGJ5IHRoZSBzZXZlcmFsIGNvbnRleHQgY2xpZW50cyAobW9zdGx5IHBsdWctaW5zKQorCisvLyBDb250YWluZXIgZm9yIGVycm9yIGxvZ2dlciAtLSBub3QgYSBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBMb2dFcnJvckhhbmRsZXI7ICAvLyBTZXQgdG8gTlVMTCBmb3IgQ29udGV4dDAgZmFsbGJhY2sKKworfSBfY21zTG9nRXJyb3JDaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZXJyb3IgbG9nZ2VyCitleHRlcm4gIF9jbXNMb2dFcnJvckNodW5rVHlwZSAgX2Ntc0xvZ0Vycm9yQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGVycm9yIGxvZ2dlciBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY0xvZ0Vycm9yQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgYWxhcm0gY29kZXMgLS0gbm90IGEgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zVUludDE2TnVtYmVyIEFsYXJtQ29kZXNbY21zTUFYQ0hBTk5FTFNdOworCit9IF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlOworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIGFsYXJtIGNvZGVzCitleHRlcm4gIF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlIF9jbXNBbGFybUNvZGVzQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGFsYXJtIGNvZGVzIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIGFkYXB0YXRpb24gc3RhdGUgLS0gbm90IGEgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zRmxvYXQ2NE51bWJlciAgQWRhcHRhdGlvblN0YXRlOworCit9IF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgYWRhcHRhdGlvbiBzdGF0ZQorZXh0ZXJuICBfY21zQWRhcHRhdGlvblN0YXRlQ2h1bmtUeXBlICAgIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgYWRhcHRhdGlvbiBzdGF0ZSBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY0FkYXB0YXRpb25TdGF0ZUNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIG1lbW9yeSBtYW5hZ2VtZW50CitleHRlcm4gIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUgX2Ntc01lbVBsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBtZW1vcnkgbWFuYWdlbWVudCBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworLy8gQ29udGFpbmVyIGZvciBpbnRlcnBvbGF0aW9uIHBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIGNtc0ludGVycEZuRmFjdG9yeSBJbnRlcnBvbGF0b3JzOworCit9IF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgaW50ZXJwb2xhdGlvbiBwbHVnLWluCitleHRlcm4gIF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUgX2Ntc0ludGVycFBsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBpbnRlcnBvbGF0aW9uIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jSW50ZXJwUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIHBhcmFtZXRyaWMgY3VydmVzIHBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIHN0cnVjdCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb25fc3QqIFBhcmFtZXRyaWNDdXJ2ZXM7CisKK30gX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZTsKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciB0b25lIGN1cnZlcyBwbHVnLWluCitleHRlcm4gIF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUgX2Ntc0N1cnZlc1BsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBwYXJhbWV0cmljIGN1cnZlcyBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY0N1cnZlc1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgZm9ybWF0dGVycyBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBzdHJ1Y3QgX2Ntc19mb3JtYXR0ZXJzX2ZhY3RvcnlfbGlzdCogRmFjdG9yeUxpc3Q7CisKK30gX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZm9ybWF0dGVycyBwbHVnLWluCitleHRlcm4gIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGZvcm1hdHRlcnMgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIFRoaXMgY2h1bmsgdHlwZSBpcyBzaGFyZWQgYnkgVGFnVHlwZSBwbHVnLWluIGFuZCBNUEUgUGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNUYWdUeXBlTGlua2VkTGlzdF9zdCogVGFnVHlwZXM7CisKK30gX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGU7CisKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciB0YWcgdHlwZXMgcGx1Zy1pbgorZXh0ZXJuICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSAgICAgIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bms7CisKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBtdWx0IHByb2Nlc3MgZWxlbWVudHMgcGx1Zy1pbgorZXh0ZXJuICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSAgICAgIF9jbXNNUEVUeXBlUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IFRhZyB0eXBlcyBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY1RhZ1R5cGVQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBNUEUgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NNUEVUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworLy8gQ29udGFpbmVyIGZvciB0YWcgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNUYWdMaW5rZWRMaXN0X3N0KiBUYWc7CisKK30gX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZTsKKworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRhZyBwbHVnLWluCitleHRlcm4gIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUgX2Ntc1RhZ1BsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBUYWcgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NUYWdQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIGludGVudHMgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNfaW50ZW50c19saXN0KiBJbnRlbnRzOworCit9IF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlOworCisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgaW50ZW50cyBwbHVnLWluCitleHRlcm4gIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGludGVudHMgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NJbnRlbnRzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIG9wdGltaXphdGlvbiBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBzdHJ1Y3QgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb25fc3QqIE9wdGltaXphdGlvbkNvbGxlY3Rpb247CisKK30gX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZTsKKworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIG9wdGltaXplcnMgcGx1Zy1pbgorZXh0ZXJuICBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgb3B0aW1pemVycyBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY09wdGltaXphdGlvblBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworLy8gQ29udGFpbmVyIGZvciB0cmFuc2Zvcm0gcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uX3N0KiBUcmFuc2Zvcm1Db2xsZWN0aW9uOworCit9IF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZnVsbC10cmFuc2Zvcm0gcmVwbGFjZW1lbnQgcGx1Zy1pbgorZXh0ZXJuICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgdHJhbnNmb3JtIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jVHJhbnNmb3JtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgbXV0ZXggcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgX2Ntc0NyZWF0ZU11dGV4Rm5QdHJUeXBlICBDcmVhdGVNdXRleFB0cjsKKyAgICBfY21zRGVzdHJveU11dGV4Rm5QdHJUeXBlIERlc3Ryb3lNdXRleFB0cjsKKyAgICBfY21zTG9ja011dGV4Rm5QdHJUeXBlICAgIExvY2tNdXRleFB0cjsKKyAgICBfY21zVW5sb2NrTXV0ZXhGblB0clR5cGUgIFVubG9ja011dGV4UHRyOworCit9IF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZTsKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBtdXRleCBwbHVnLWluCitleHRlcm4gIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSBfY21zTXV0ZXhQbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgbXV0ZXggY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBNTFUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KIHR5cGVkZWYgc3RydWN0IHsKIApAQCAtMzQ3LDEwICs3NjAsMTQgQEAKICAgICBjbXNCb29sICAgICAgICAgICAgICAgICAgVGFnU2F2ZUFzUmF3W01BWF9UQUJMRV9UQUddOyAgICAgICAgLy8gVHJ1ZSB0byB3cml0ZSB1bmNvb2tlZAogICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBUYWdQdHJzW01BWF9UQUJMRV9UQUddOwogICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiAgICAgICBUYWdUeXBlSGFuZGxlcnNbTUFYX1RBQkxFX1RBR107ICAgICAvLyBTYW1lIHN0cnVjdHVyZSBtYXkgYmUgc2VyaWFsaXplZCBvbiBkaWZmZXJlbnQgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHByb2ZpbGUgdmVyc2lvbiwgc28gd2Uga2VlcCB0cmFjayBvZiB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBoYW5kbGVyIGZvciBlYWNoIHRhZyBpbiB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHByb2ZpbGUgdmVyc2lvbiwgc28gd2Uga2VlcCB0cmFjayBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBoYW5kbGVyIGZvciBlYWNoIHRhZyBpbiB0aGUgbGlzdC4KICAgICAvLyBTcGVjaWFsCiAgICAgY21zQm9vbCAgICAgICAgICAgICAgICAgIElzV3JpdGU7CiAKKyAgICAvLyBLZWVwIGEgbXV0ZXggZm9yIGNtc1JlYWRUYWcgLS0gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBpZiB0aGUgdXNlciBpbmNsdWRlcyBhIG11dGV4IHBsdWdpbgorICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBVc3JNdXRleDsKKwogfSBfY21zSUNDUFJPRklMRTsKIAogLy8gSU8gaGVscGVycyBmb3IgcHJvZmlsZXMKQEAgLTM1OSw5ICs3NzYsOSBAQAogaW50ICAgICAgICAgICAgICAgICAgX2Ntc1NlYXJjaFRhZyhfY21zSUNDUFJPRklMRSogSWNjLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjbXNCb29sIGxGb2xsb3dMaW5rcyk7CiAKIC8vIFRhZyB0eXBlcwotY21zVGFnVHlwZUhhbmRsZXIqICAgX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKGNtc1RhZ1R5cGVTaWduYXR1cmUgc2lnKTsKK2Ntc1RhZ1R5cGVIYW5kbGVyKiAgIF9jbXNHZXRUYWdUeXBlSGFuZGxlcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVGFnVHlwZVNpZ25hdHVyZSBzaWcpOwogY21zVGFnVHlwZVNpZ25hdHVyZSAgX2Ntc0dldFRhZ1RydWVUeXBlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnKTsKLWNtc1RhZ0Rlc2NyaXB0b3IqICAgIF9jbXNHZXRUYWdEZXNjcmlwdG9yKGNtc1RhZ1NpZ25hdHVyZSBzaWcpOworY21zVGFnRGVzY3JpcHRvciogICAgX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOwogCiAvLyBFcnJvciBsb2dnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zNzIsNyArNzg5LDcgQEAKIGNtc0ludGVycFBhcmFtcyogICAgIF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgblNhbXBsZXMsIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwogY21zSW50ZXJwUGFyYW1zKiAgICAgX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXNFeChjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVUludDMyTnVtYmVyIG5TYW1wbGVzW10sIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwogdm9pZCAgICAgICAgICAgICAgICAgX2Ntc0ZyZWVJbnRlcnBQYXJhbXMoY21zSW50ZXJwUGFyYW1zKiBwKTsKLWNtc0Jvb2wgICAgICAgICAgICAgIF9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShjbXNJbnRlcnBQYXJhbXMqIHApOworY21zQm9vbCAgICAgICAgICAgICAgX2Ntc1NldEludGVycG9sYXRpb25Sb3V0aW5lKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJbnRlcnBQYXJhbXMqIHApOwogCiAvLyBDdXJ2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC01MDMsNyArOTIwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyICoqQmxhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAqbk91dHB1dHMpOwogCi1jbXNCb29sICAgICAgICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKGNtc1BpcGVsaW5lKiogICAgTHV0LAorY21zQm9vbCAgICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZShjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zUGlwZWxpbmUqKiAgICBMdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgSW50ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIElucHV0Rm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCwKQEAgLTUyOCw3ICs5NDYsOCBAQAogY21zQm9vbCAgICAgICAgIF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KGNtc1VJbnQzMk51bWJlciBUeXBlKTsKIGNtc0Jvb2wgICAgICAgICBfY21zRm9ybWF0dGVySXM4Yml0KGNtc1VJbnQzMk51bWJlciBUeXBlKTsKIAotY21zRm9ybWF0dGVyICAgIF9jbXNHZXRGb3JtYXR0ZXIoY21zVUludDMyTnVtYmVyIFR5cGUsICAgICAgICAgIC8vIFNwZWNpZmljIHR5cGUsIGkuZS4gVFlQRV9SR0JfOAorY21zRm9ybWF0dGVyICAgIF9jbXNHZXRGb3JtYXR0ZXIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVHlwZSwgICAgICAgICAgLy8gU3BlY2lmaWMgdHlwZSwgaS5lLiBUWVBFX1JHQl84CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGb3JtYXR0ZXJEaXJlY3Rpb24gRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwogCmRpZmYgLS1naXQgYS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczJfcGx1Z2luLmggYi9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczJfcGx1Z2luLmgKaW5kZXggMWRmN2NmNy4uNzdmZjIyOCAxMDA2NDQKLS0tIGEvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyX3BsdWdpbi5oCisrKyBiL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9sY21zMl9wbHVnaW4uaApAQCAtMjMxLDYgKzIzMSw3IEBACiAjZGVmaW5lIGNtc1BsdWdpbk11bHRpUHJvY2Vzc0VsZW1lbnRTaWcgICAgICAweDZENzA2NTQ4ICAgICAvLyAnbXBlSCcKICNkZWZpbmUgY21zUGx1Z2luT3B0aW1pemF0aW9uU2lnICAgICAgICAgICAgIDB4NkY3MDc0NDggICAgIC8vICdvcHRIJwogI2RlZmluZSBjbXNQbHVnaW5UcmFuc2Zvcm1TaWcgICAgICAgICAgICAgICAgMHg3QTY2NkQ0OCAgICAgLy8gJ3hmbUgnCisjZGVmaW5lIGNtc1BsdWdpbk11dGV4U2lnICAgICAgICAgICAgICAgICAgICAweDZENzQ3QTQ4ICAgICAvLyAnbXR4SCcKIAogdHlwZWRlZiBzdHJ1Y3QgX2Ntc1BsdWdpbkJhc2VTdHJ1Y3QgewogCkBAIC0yNDcsMTkgKzI0OCwyOCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIE1lbW9yeSBoYW5kbGVyLiBFYWNoIG5ldyBwbHVnLWluIHR5cGUgcmVwbGFjZXMgY3VycmVudCBiZWhhdmlvdXIKKwordHlwZWRlZiB2b2lkKiAoKiBfY21zTWFsbG9jRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpOwordHlwZWRlZiB2b2lkICAoKiBfY21zRnJlZUZuUHRyVHlwZSkoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQgKlB0cik7Cit0eXBlZGVmIHZvaWQqICgqIF9jbXNSZWFsbG9jRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgTmV3U2l6ZSk7CisKK3R5cGVkZWYgdm9pZCogKCogX2Ntc01hbGxvWmVyb2NGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7Cit0eXBlZGVmIHZvaWQqICgqIF9jbXNDYWxsb2NGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbnVtLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7Cit0eXBlZGVmIHZvaWQqICgqIF9jbXNEdXBGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBPcmcsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKKwogdHlwZWRlZiBzdHJ1Y3QgewogCiAgICAgICAgIGNtc1BsdWdpbkJhc2UgYmFzZTsKIAogICAgICAgICAvLyBSZXF1aXJlZAotICAgICAgICB2b2lkICogKCogTWFsbG9jUHRyKShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpOwotICAgICAgICB2b2lkICAgKCogRnJlZVB0cikoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQgKlB0cik7Ci0gICAgICAgIHZvaWQgKiAoKiBSZWFsbG9jUHRyKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgTmV3U2l6ZSk7CisgICAgICAgIF9jbXNNYWxsb2NGblB0clR5cGUgIE1hbGxvY1B0cjsKKyAgICAgICAgX2Ntc0ZyZWVGblB0clR5cGUgICAgRnJlZVB0cjsKKyAgICAgICAgX2Ntc1JlYWxsb2NGblB0clR5cGUgUmVhbGxvY1B0cjsKIAogICAgICAgICAvLyBPcHRpb25hbAotICAgICAgICB2b2lkICogKCogTWFsbG9jWmVyb1B0cikoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKLSAgICAgICAgdm9pZCAqICgqIENhbGxvY1B0cikoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBudW0sIGNtc1VJbnQzMk51bWJlciBzaXplKTsKLSAgICAgICAgdm9pZCAqICgqIER1cFB0cikoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IHZvaWQqIE9yZywgY21zVUludDMyTnVtYmVyIHNpemUpOworICAgICAgIF9jbXNNYWxsb1plcm9jRm5QdHJUeXBlIE1hbGxvY1plcm9QdHI7CisgICAgICAgX2Ntc0NhbGxvY0ZuUHRyVHlwZSAgICAgQ2FsbG9jUHRyOworICAgICAgIF9jbXNEdXBGblB0clR5cGUgICAgICAgIER1cFB0cjsKIAogfSBjbXNQbHVnaW5NZW1IYW5kbGVyOwogCkBAIC02MjIsNiArNjMyLDI5IEBACiAKIH0gIGNtc1BsdWdpblRyYW5zZm9ybTsKIAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXRleAorCit0eXBlZGVmIHZvaWQqICAgICgqIF9jbXNDcmVhdGVNdXRleEZuUHRyVHlwZSkoY21zQ29udGV4dCBDb250ZXh0SUQpOwordHlwZWRlZiB2b2lkICAgICAoKiBfY21zRGVzdHJveU11dGV4Rm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KTsKK3R5cGVkZWYgY21zQm9vbCAgKCogX2Ntc0xvY2tNdXRleEZuUHRyVHlwZSkoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCk7Cit0eXBlZGVmIHZvaWQgICAgICgqIF9jbXNVbmxvY2tNdXRleEZuUHRyVHlwZSkoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgIGNtc1BsdWdpbkJhc2UgICAgIGJhc2U7CisKKyAgICAgX2Ntc0NyZWF0ZU11dGV4Rm5QdHJUeXBlICBDcmVhdGVNdXRleFB0cjsKKyAgICAgX2Ntc0Rlc3Ryb3lNdXRleEZuUHRyVHlwZSBEZXN0cm95TXV0ZXhQdHI7CisgICAgIF9jbXNMb2NrTXV0ZXhGblB0clR5cGUgICAgTG9ja011dGV4UHRyOworICAgICBfY21zVW5sb2NrTXV0ZXhGblB0clR5cGUgIFVubG9ja011dGV4UHRyOworCit9ICBjbXNQbHVnaW5NdXRleDsKKworQ01TQVBJIHZvaWQqICAgQ01TRVhQT1JUIF9jbXNDcmVhdGVNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCk7CitDTVNBUEkgdm9pZCAgICBDTVNFWFBPUlQgX2Ntc0Rlc3Ryb3lNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KTsKK0NNU0FQSSBjbXNCb29sIENNU0VYUE9SVCBfY21zTG9ja011dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpOworQ01TQVBJIHZvaWQgICAgQ01TRVhQT1JUIF9jbXNVbmxvY2tNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KTsKKwogCiAjaWZuZGVmIENNU19VU0VfQ1BQX0FQSQogIyAgIGlmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hUZXh0QXJlYVBlZXIuamF2YSBiL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFRleHRBcmVhUGVlci5qYXZhCmluZGV4IDdjN2IyZDEuLjQwOTJlODUgMTAwNjQ0Ci0tLSBhL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFRleHRBcmVhUGVlci5qYXZhCisrKyBiL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFRleHRBcmVhUGVlci5qYXZhCkBAIC0xMDI0LDcgKzEwMjQsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsTGlzdGVuZXJzKEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVuaW5zdGFsbExpc3RlbmVycyhKQ29tcG9uZW50IHNjcm9sbFBhbmUpIHsKICAgICAgICAgICAgIHN1cGVyLnVuaW5zdGFsbExpc3RlbmVycyhzY3JvbGxQYW5lKTsKICAgICAgICAgICAgIHNjcm9sbFBhbmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUhhbmRsZXIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hXaW5kb3cuamF2YSBiL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvdy5qYXZhCmluZGV4IGU1NWI4YjguLjE5Y2YyMjkgMTAwNjQ0Ci0tLSBhL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvdy5qYXZhCisrKyBiL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvdy5qYXZhCkBAIC01NSw3ICs1NSw2IEBACiAgICAqLwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBBV1RfTVVMVElDTElDS19TTVVER0UgPSA0OwogICAgIC8vIEJ1dHRvblhYWCBldmVudHMgc3R1ZmYKLSAgICBzdGF0aWMgaW50IHJidXR0b24gPSAwOwogICAgIHN0YXRpYyBpbnQgbGFzdFggPSAwLCBsYXN0WSA9IDA7CiAgICAgc3RhdGljIGxvbmcgbGFzdFRpbWUgPSAwOwogICAgIHN0YXRpYyBsb25nIGxhc3RCdXR0b24gPSAwOwpAQCAtNjMyLDIzICs2MzEsNiBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGV2ZW50IGlzIGRpc2FibGVkIGFuZCBzaG91bGRuJ3QgYmUgcGFzc2VkIHRvIEphdmEuCi0gICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlIGZvciBhbGwgZXZlbnRzLgotICAgICAqLwotICAgIHN0YXRpYyBpbnQgZ2V0UmlnaHRCdXR0b25OdW1iZXIoKSB7Ci0gICAgICAgIGlmIChyYnV0dG9uID09IDApIHsgLy8gbm90IGluaXRpYWxpemVkIHlldAotICAgICAgICAgICAgWFRvb2xraXQuYXd0TG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByYnV0dG9uID0gWGxpYldyYXBwZXIuWEdldFBvaW50ZXJNYXBwaW5nKFhUb29sa2l0LmdldERpc3BsYXkoKSwgWGxpYldyYXBwZXIuaWJ1ZmZlciwgMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBYVG9vbGtpdC5hd3RVbmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmJ1dHRvbjsKLSAgICB9Ci0KICAgICBzdGF0aWMgaW50IGdldE1vdXNlTW92ZW1lbnRTbXVkZ2UoKSB7CiAgICAgICAgIC8vVE9ETzogSXQncyBwb3NzaWJsZSB0byByZWFkIGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MKICAgICAgICAgcmV0dXJuIEFXVF9NVUxUSUNMSUNLX1NNVURHRTsKQEAgLTcxNiwxMSArNjk4LDcgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBDaGVjayBmb3IgcG9wdXAgdHJpZ2dlciAhIQogICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChsYnV0dG9uID09IGdldFJpZ2h0QnV0dG9uTnVtYmVyKCkgfHwgbGJ1dHRvbiA+IDIpIHsKLSAgICAgICAgICAgICAgICBwb3B1cFRyaWdnZXIgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwb3B1cFRyaWdnZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcHVwVHJpZ2dlciA9IChsYnV0dG9uID09IDMpOwogICAgICAgICB9CiAKICAgICAgICAgYnV0dG9uID0gWENvbnN0YW50cy5idXR0b25zW2xidXR0b24gLSAxXTsKZGlmZiAtLWdpdCBhL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9Ud29TdGFja3NQbGFpbkRhdGFncmFtU29ja2V0SW1wbC5jIGIvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L1R3b1N0YWNrc1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsLmMKaW5kZXggOTU4Y2Y1OS4uZWQ2ZWZkZiAxMDA2NDQKLS0tIGEvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L1R3b1N0YWNrc1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsLmMKKysrIGIvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L1R3b1N0YWNrc1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsLmMKQEAgLTQ4OSw2ICs0ODksOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5FVF9CaW5kVjYoKSBjbG9zZXMgYm90aCBzb2NrZXRzIHVwb24gYSBmYWlsdXJlICovCisgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgdGhpcywgcGRzaV9mZElELCBOVUxMKTsKKyAgICAgICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCB0aGlzLCBwZHNpX2ZkMUlELCBOVUxMKTsKICAgICAgICAgICAgIE5FVF9UaHJvd0N1cnJlbnQgKGVudiwgIkNhbm5vdCBiaW5kIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9Ud29TdGFja3NQbGFpblNvY2tldEltcGwuYyBiL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9Ud29TdGFja3NQbGFpblNvY2tldEltcGwuYwppbmRleCAzZmIyOGY4Li5lN2FhNDliIDEwMDY0NAotLS0gYS9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvVHdvU3RhY2tzUGxhaW5Tb2NrZXRJbXBsLmMKKysrIGIvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L1R3b1N0YWNrc1BsYWluU29ja2V0SW1wbC5jCkBAIC00NjcsNiArNDY3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICgqZW52KS0+U2V0SW50RmllbGQoZW52LCBmZDFPYmosIElPX2ZkX2ZkSUQsIGZkMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTkVUX0JpbmRWNigpIGNsb3NlcyBib3RoIHNvY2tldHMgdXBvbiBhIGZhaWx1cmUgKi8KKyAgICAgICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCB0aGlzLCBwc2lfZmRJRCwgTlVMTCk7CisgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgdGhpcywgcHNpX2ZkMUlELCBOVUxMKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHJ2ID0gTkVUX1dpbkJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmaGltLCBsZW4sIGV4Y2xCaW5kKTsKZGlmZiAtLWdpdCBhL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9uZXRfdXRpbF9tZC5jIGIvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L25ldF91dGlsX21kLmMKaW5kZXggYWU3MTczMy4uMjc0ZDkwOSAxMDA2NDQKLS0tIGEvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L25ldF91dGlsX21kLmMKKysrIGIvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L25ldF91dGlsX21kLmMKQEAgLTYyNyw3ICs2MjcsNyBAQAogICogYW5kIHJldHVybnMgU09DS0VUX0VSUk9SLiBVc2VkIGluIE5FVF9CaW5kVjYgb25seS4KICAqLwogCi0jZGVmaW5lIENMT1NFX1NPQ0tFVFNfQU5EX1JFVFVSTiB7ICAgICAgXAorI2RlZmluZSBDTE9TRV9TT0NLRVRTX0FORF9SRVRVUk4gZG8geyAgIFwKICAgICBpZiAoZmQgIT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNsb3Nlc29ja2V0IChmZCk7ICAgICAgICAgICAgICAgXAogICAgICAgICBmZCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTY0Niw3ICs2NDYsNyBAQAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBiLT5pcHY0X2ZkID0gYi0+aXB2Nl9mZCA9IC0xOyAgICAgICBcCiAgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsgICAgICAgICAgICAgICAgXAotfQorfSB3aGlsZSgwKQogCiAvKgogICogaWYgaXB2NiBpcyBhdmFpbGFibGUsIGNhbGwgTkVUX0JpbmRWNiB0byBiaW5kIHRvIHRoZSByZXF1aXJlZCBhZGRyZXNzL3BvcnQuCmRpZmYgLS1naXQgYS90ZXN0L1Byb2JsZW1MaXN0LnR4dCBiL3Rlc3QvUHJvYmxlbUxpc3QudHh0CmluZGV4IGZmY2ZkZmEuLmRiZjY1ZWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUHJvYmxlbUxpc3QudHh0CisrKyBiL3Rlc3QvUHJvYmxlbUxpc3QudHh0CkBAIC0yNjksNCArMjY5LDcgQEAKICMgRmlsZWQgNjc3MjAwOQogamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50TG9jay9DYW5jZWxsZWRMb2NrTG9vcHMuamF2YSBnZW5lcmljLWFsbAogCisjIDgwNTE2NDEKK3N1bi91dGlsL2NhbGVuZGFyL3ppL1Rlc3Rab25lSW5mbzMxMC5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYy1hbGwKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvdGVzdC9qYXZhL2xhbmcvaW52b2tlL0xhbWJkYUZvcm1UZXN0LmphdmEgYi90ZXN0L2phdmEvbGFuZy9pbnZva2UvTGFtYmRhRm9ybVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDc4MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9qYXZhL2xhbmcvaW52b2tlL0xhbWJkYUZvcm1UZXN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qIEB0ZXN0CisgKiBAc3VtbWFyeSB1bml0IHRlc3RzIGZvciBqYXZhLmxhbmcuaW52b2tlLkxhbWJkYUZvcm0KKyAqIEBydW4ganVuaXQvb3RoZXJ2bSB0ZXN0LmphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybVRlc3QKKyAqLworcGFja2FnZSB0ZXN0LmphdmEubGFuZy5pbnZva2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzIExhbWJkYUZvcm1UZXN0IHsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kIE1fc2hvcnRlblNpZ25hdHVyZTsKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gaW1wbCA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5pbnZva2UuTGFtYmRhRm9ybSIsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgIE1ldGhvZCBtID0gaW1wbC5nZXREZWNsYXJlZE1ldGhvZCgic2hvcnRlblNpZ25hdHVyZSIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBtLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICBNX3Nob3J0ZW5TaWduYXR1cmUgPSBtOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuU2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUpIHRocm93cyBSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpTV9zaG9ydGVuU2lnbmF0dXJlLmludm9rZShudWxsLCBzaWduYXR1cmUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNob3J0ZW5TaWduYXR1cmUoKSB0aHJvd3MgUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIHMgOiBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgIC8vIGludmFyaWFudCBzdHJpbmdzOgorICAgICAgICAgICAgICAgICJMIiwgIkxMIiwgIklMTCIsICJMSUwiLCAiTExJIiwgIklJTEwiLCAiSUxJTCIsICJJTExJIiwKKyAgICAgICAgICAgICAgICAvLyBhIGZldyBtYXBwaW5nczoKKyAgICAgICAgICAgICAgICAiTExMPUwzIiwgIkxMTEw9TDQiLCAiTExMTExMTExMTD1MMTAiLAorICAgICAgICAgICAgICAgICJJSUlEREQ9STNEMyIsICJJREREPUlEMyIsICJJSURERD1JSUQzIiwgIklJSUQ9STNEIiwgIklJSUREPUkzREQiCisgICAgICAgICAgICB9KSB7CisgICAgICAgICAgICBTdHJpbmcgczIgPSBzLnN1YnN0cmluZyhzLmluZGV4T2YoJz0nKSsxKTsKKyAgICAgICAgICAgIFN0cmluZyBzMSA9IHMuZXF1YWxzKHMyKSA/IHMgOiBzLnN1YnN0cmluZygwLCBzLmxlbmd0aCgpIC0gczIubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIC8vIG1peCB0aGUgYWJvdmUgY2FzZXMgd2l0aCBiZWZvcmUgYW5kIGFmdGVyIHJlcHMgb2YgWioKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAtMzsgayA8PSAzOyBrKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYmVnID0gKGsgPCAwID8gIlpaWloiLnN1YnN0cmluZygtaykgOiAiIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuZCA9IChrID4gMCA/ICJaWlpaIi5zdWJzdHJpbmcoK2spIDogIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBrczEgPSBiZWcrczErZW5kOworICAgICAgICAgICAgICAgIFN0cmluZyBrczIgPSBzaG9ydGVuU2lnbmF0dXJlKGJlZykrczIrc2hvcnRlblNpZ25hdHVyZShlbmQpOworICAgICAgICAgICAgICAgIFN0cmluZyBrczMgPSBzaG9ydGVuU2lnbmF0dXJlKGtzMSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtzMiwga3MzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgTGFtYmRhRm9ybVRlc3QgdGVzdCA9IG5ldyBMYW1iZGFGb3JtVGVzdCgpOworICAgICAgICB0ZXN0LnRlc3RTaG9ydGVuU2lnbmF0dXJlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXNUZXN0LmphdmEgYi90ZXN0L2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlc1Rlc3QuamF2YQppbmRleCBkNjA3ZTA2Li45OTNlYWVmIDEwMDY0NAotLS0gYS90ZXN0L2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlc1Rlc3QuamF2YQorKysgYi90ZXN0L2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlc1Rlc3QuamF2YQpAQCAtMjE2MCwxNSArMjE2MCwyMyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS5jaGFuZ2VQYXJhbWV0ZXJUeXBlKGosIGFyZ1R5cGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZS5hZGQodHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0SW52b2tlcnModHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0SW52b2tlcnNXaXRoQ2F0Y2godHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUgdnR5cGUgPSB0eXBlLmNoYW5nZVJldHVyblR5cGUodm9pZC5jbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lLmFkZCh2dHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0SW52b2tlcnModnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEludm9rZXJzV2l0aENhdGNoKHZ0eXBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlcnNXaXRoQ2F0Y2goTWV0aG9kVHlwZSB0eXBlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RJbnZva2Vycyh0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiB0ZXN0SW52b2tlcnMgb24gIit0eXBlKyIgPT4gIik7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgcHVibGljIHZvaWQgdGVzdEludm9rZXJzKE1ldGhvZFR5cGUgdHlwZSkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGlmICh2ZXJib3NpdHkgPj0gMykKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdCBpbnZva2VycyBmb3IgIit0eXBlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvamF2YS9sYW5nL2ludm9rZS9WYXJhcmdzQXJyYXlUZXN0LmphdmEgYi90ZXN0L2phdmEvbGFuZy9pbnZva2UvVmFyYXJnc0FycmF5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmYzNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2phdmEvbGFuZy9pbnZva2UvVmFyYXJnc0FycmF5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZhLmxhbmcuaW52b2tlOworCitpbXBvcnQgc3VuLmludm9rZS51dGlsLldyYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworLyogQHRlc3QKKyAqIEBzdW1tYXJ5IHVuaXQgdGVzdHMgZm9yIHZhcmFyZ3MgYXJyYXkgbWV0aG9kczogTWV0aG9kSGFuZGxlSW5mby52YXJhcmdzQXJyYXkoaW50KSwKKyAqICAgICAgICAgIE1ldGhvZEhhbmRsZUluZm8udmFyYXJnc0FycmF5KENsYXNzLGludCkgJiBNZXRob2RIYW5kbGVJbmZvLnZhcmFyZ3NMaXN0KGludCkKKyAqCisgKiBAcnVuIG1haW4vYm9vdGNsYXNzcGF0aCBqYXZhLmxhbmcuaW52b2tlLlZhcmFyZ3NBcnJheVRlc3QKKyAqIEBydW4gbWFpbi9ib290Y2xhc3NwYXRoIC1EVmFyYXJnc0FycmF5VGVzdC5NQVhfQVJJVFk9MjU1IC1EVmFyYXJnc0FycmF5VGVzdC5TVEFSVF9BUklUWT0yNTAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5pbnZva2UuVmFyYXJnc0FycmF5VGVzdAorICovCisKKy8qIFRoaXMgbWlnaHQgdGFrZSBhIHdoaWxlIGFuZCBidXJuIGxvdHMgb2YgbWV0YWRhdGE6CisgKiBAcnVuIG1haW4vYm9vdGNsYXNzcGF0aCAtRFZhcmFyZ3NBcnJheVRlc3QuTUFYX0FSSVRZPTI1NSAtRFZhcmFyZ3NBcnJheVRlc3QuRVhIQVVTVElWRT10cnVlIGphdmEubGFuZy5pbnZva2UuVmFyYXJnc0FycmF5VGVzdAorICovCitwdWJsaWMgY2xhc3MgVmFyYXJnc0FycmF5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQ0xBU1MgPSBWYXJhcmdzQXJyYXlUZXN0LmNsYXNzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVJJVFkgPSBJbnRlZ2VyLmdldEludGVnZXIoQ0xBU1MuZ2V0U2ltcGxlTmFtZSgpKyIuTUFYX0FSSVRZIiwgNDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9BUklUWSA9IEludGVnZXIuZ2V0SW50ZWdlcihDTEFTUy5nZXRTaW1wbGVOYW1lKCkrIi5TVEFSVF9BUklUWSIsIDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhIQVVTVElWRSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDTEFTUy5nZXRTaW1wbGVOYW1lKCkrIi5FWEhBVVNUSVZFIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdGVzdFZhcmFyZ3NBcnJheSgpOworICAgICAgICB0ZXN0VmFyYXJnc1JlZmVyZW5jZUFycmF5KCk7CisgICAgICAgIHRlc3RWYXJhcmdzUHJpbWl0aXZlQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFZhcmFyZ3NBcnJheSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBpbnQgTUlOID0gU1RBUlRfQVJJVFk7CisgICAgICAgIGZpbmFsIGludCBNQVggPSBNQVhfQVJJVFktMjsgIC8vIDI1MysxIHdvdWxkIGNhdXNlIHBhcmFtZXRlciBvdmVyZmxvdyB3aXRoICd0aGlzJyBhZGRlZAorICAgICAgICBmb3IgKGludCBuYXJncyA9IE1JTjsgbmFyZ3MgPD0gTUFYOyBuYXJncyA9IG5leHRBcmdDb3VudChuYXJncywgMTcsIE1BWCkpIHsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSB0YXJnZXQgPSBNZXRob2RIYW5kbGVJbXBsLnZhcmFyZ3NBcnJheShuYXJncyk7CisgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtuYXJnc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hcmdzOyBpKyspCisgICAgICAgICAgICAgICAgYXJnc1tpXSA9ICIjIitpOworICAgICAgICAgICAgT2JqZWN0IHJlcyA9IHRhcmdldC5pbnZva2VXaXRoQXJndW1lbnRzKGFyZ3MpOworICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoYXJncywgKE9iamVjdFtdKXJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFZhcmFyZ3NSZWZlcmVuY2VBcnJheSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0VHlwZWRWYXJhcmdzQXJyYXkoT2JqZWN0W10uY2xhc3MpOworICAgICAgICB0ZXN0VHlwZWRWYXJhcmdzQXJyYXkoU3RyaW5nW10uY2xhc3MpOworICAgICAgICB0ZXN0VHlwZWRWYXJhcmdzQXJyYXkoTnVtYmVyW10uY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0VmFyYXJnc1ByaW1pdGl2ZUFycmF5KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShpbnRbXS5jbGFzcyk7CisgICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShsb25nW10uY2xhc3MpOworICAgICAgICB0ZXN0VHlwZWRWYXJhcmdzQXJyYXkoYnl0ZVtdLmNsYXNzKTsKKyAgICAgICAgdGVzdFR5cGVkVmFyYXJnc0FycmF5KGJvb2xlYW5bXS5jbGFzcyk7CisgICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShzaG9ydFtdLmNsYXNzKTsKKyAgICAgICAgdGVzdFR5cGVkVmFyYXJnc0FycmF5KGNoYXJbXS5jbGFzcyk7CisgICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShmbG9hdFtdLmNsYXNzKTsKKyAgICAgICAgdGVzdFR5cGVkVmFyYXJnc0FycmF5KGRvdWJsZVtdLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dEFyZ0NvdW50KGludCBuYXJncywgaW50IGRlbnNpdHksIGludCBNQVgpIHsKKyAgICAgICAgaWYgKEVYSEFVU1RJVkUpICByZXR1cm4gbmFyZ3MgKyAxOworICAgICAgICBpZiAobmFyZ3MgPj0gTUFYKSAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBpbnQgQk9UID0gMjAsIFRPUCA9IE1BWC01OworICAgICAgICBpZiAoZGVuc2l0eSA8IDEwKSB7IEJPVCA9IDEwOyBNQVggPSBUT1AtMjsgfQorICAgICAgICBpZiAobmFyZ3MgPD0gQk9UIHx8IG5hcmdzID49IFRPUCkgeworICAgICAgICAgICAgKytuYXJnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBidW1wID0gTWF0aC5tYXgoMSwgMTAwIC8gZGVuc2l0eSk7CisgICAgICAgICAgICBuYXJncyArPSBidW1wOworICAgICAgICAgICAgaWYgKG5hcmdzID4gVE9QKSAgbmFyZ3MgPSBUT1A7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hcmdzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFR5cGVkVmFyYXJnc0FycmF5KENsYXNzPD8+IGFycmF5VHlwZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIENsYXNzPD8+IGVsZW1UeXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgaW50IE1JTiA9IFNUQVJUX0FSSVRZOworICAgICAgICBpbnQgTUFYID0gTUFYX0FSSVRZLTI7ICAvLyAyNTMrMSB3b3VsZCBjYXVzZSBwYXJhbWV0ZXIgb3ZlcmZsb3cgd2l0aCAndGhpcycgYWRkZWQKKyAgICAgICAgaW50IGRlbnNpdHkgPSAzOworICAgICAgICBpZiAoZWxlbVR5cGUgPT0gaW50LmNsYXNzIHx8IGVsZW1UeXBlID09IGxvbmcuY2xhc3MpICBkZW5zaXR5ID0gNzsKKyAgICAgICAgaWYgKGVsZW1UeXBlID09IGxvbmcuY2xhc3MgfHwgZWxlbVR5cGUgPT0gZG91YmxlLmNsYXNzKSB7IE1BWCAvPSAyOyBNSU4gLz0gMjsgfQorICAgICAgICBmb3IgKGludCBuYXJncyA9IE1JTjsgbmFyZ3MgPD0gTUFYOyBuYXJncyA9IG5leHRBcmdDb3VudChuYXJncywgZGVuc2l0eSwgTUFYKSkgeworICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG1ha2VUZXN0QXJyYXkoZWxlbVR5cGUsIG5hcmdzKTsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSB2YXJhcmdzQXJyYXkgPSBNZXRob2RIYW5kbGVJbXBsLnZhcmFyZ3NBcnJheShhcnJheVR5cGUsIG5hcmdzKTsKKyAgICAgICAgICAgIE1ldGhvZFR5cGUgdmFUeXBlID0gdmFyYXJnc0FycmF5LnR5cGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhcnJheVR5cGUsIHZhVHlwZS5yZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgaWYgKG5hcmdzICE9IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWxlbVR5cGUsIHZhVHlwZS5wYXJhbWV0ZXJUeXBlKDApKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWxlbVR5cGUsIHZhVHlwZS5wYXJhbWV0ZXJUeXBlKHZhVHlwZS5wYXJhbWV0ZXJDb3VudCgpLTEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZXRob2RUeXBlLm1ldGhvZFR5cGUoYXJyYXlUeXBlLCBDb2xsZWN0aW9ucy48Q2xhc3M8Pz4+bkNvcGllcyhuYXJncywgZWxlbVR5cGUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YVR5cGUpOworICAgICAgICAgICAgT2JqZWN0IHJlcyA9IHZhcmFyZ3NBcnJheS5pbnZva2VXaXRoQXJndW1lbnRzKGFyZ3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcy5nZXRDbGFzcygpLCBhcnJheVR5cGUpOworICAgICAgICAgICAgU3RyaW5nIHJlc1N0cmluZyA9IHRvQXJyYXlTdHJpbmcocmVzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoYXJncyksIHJlc1N0cmluZyk7CisKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBzcHJlYWRlciA9IHZhcmFyZ3NBcnJheS5hc1NwcmVhZGVyKGFycmF5VHlwZSwgbmFyZ3MpOworICAgICAgICAgICAgTWV0aG9kVHlwZSBzdHlwZSA9IHNwcmVhZGVyLnR5cGUoKTsKKyAgICAgICAgICAgIGFzc2VydChzdHlwZSA9PSBNZXRob2RUeXBlLm1ldGhvZFR5cGUoYXJyYXlUeXBlLCBhcnJheVR5cGUpKTsKKyAgICAgICAgICAgIGlmIChuYXJncyA8PSA1KSB7CisgICAgICAgICAgICAgICAgLy8gaW52b2tlIHRhcmdldCBhcyBhIHNwcmVhZGVyIGFsc286CisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQorICAgICAgICAgICAgICAgIE9iamVjdCByZXMyID0gc3ByZWFkZXIuaW52b2tlV2l0aEFyZ3VtZW50cygoT2JqZWN0KXJlcyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlczJTdHJpbmcgPSB0b0FycmF5U3RyaW5nKHJlczIpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoYXJncyksIHJlczJTdHJpbmcpOworICAgICAgICAgICAgICAgIC8vIGludm9rZSB0aGUgc3ByZWFkZXIgb24gYSBnZW5lcmljIE9iamVjdFtdIGFycmF5OyBjaGVjayBmb3IgZXJyb3IKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmVzMyA9IHNwcmVhZGVyLmludm9rZVdpdGhBcmd1bWVudHMoKE9iamVjdClhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlczNTdHJpbmcgPSB0b0FycmF5U3RyaW5nKHJlczMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFycmF5VHlwZS5nZXROYW1lKCksIGFycmF5VHlwZS5pc0Fzc2lnbmFibGVGcm9tKE9iamVjdFtdLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoYXJncyksIHJlczNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhcnJheVR5cGUuZ2V0TmFtZSgpLCBhcnJheVR5cGUuaXNBc3NpZ25hYmxlRnJvbShPYmplY3RbXS5jbGFzcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYXJncyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW52b2tlIHNwcmVhZGVyIG9uIG51bGwgYXJnbGlzdAorICAgICAgICAgICAgICAgIE9iamVjdCByZXMzID0gc3ByZWFkZXIuaW52b2tlV2l0aEFyZ3VtZW50cygoT2JqZWN0KW51bGwpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXMzU3RyaW5nID0gdG9BcnJheVN0cmluZyhyZXMzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLnRvU3RyaW5nKGFyZ3MpLCByZXMzU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIG1ha2VUZXN0QXJyYXkoQ2xhc3M8Pz4gZWxlbVR5cGUsIGludCBsZW4pIHsKKyAgICAgICAgV3JhcHBlciBlbGVtID0gbnVsbDsKKyAgICAgICAgaWYgKGVsZW1UeXBlLmlzUHJpbWl0aXZlKCkpCisgICAgICAgICAgICBlbGVtID0gV3JhcHBlci5mb3JQcmltaXRpdmVUeXBlKGVsZW1UeXBlKTsKKyAgICAgICAgZWxzZSBpZiAoV3JhcHBlci5pc1dyYXBwZXJUeXBlKGVsZW1UeXBlKSkKKyAgICAgICAgICAgIGVsZW0gPSBXcmFwcGVyLmZvcldyYXBwZXJUeXBlKGVsZW1UeXBlKTsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbbGVuXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IGFyZyA9IGkgKiAxMDA7CisgICAgICAgICAgICBpZiAoZWxlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1UeXBlID09IFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgYXJnID0gIiMiK2FyZzsKKyAgICAgICAgICAgICAgICBhcmcgPSBlbGVtVHlwZS5jYXN0KGFyZyk7ICAvLyBqdXN0IHRvIG1ha2Ugc3VyZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGVsZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCT09MRUFOOiBhcmcgPSAoaSAlIDMgPT0gMCk7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDSEFSOiAgICBhcmcgPSAnYScgKyBpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMT05HOiAgICBhcmcgPSAobG9uZylpICogMTAwMF8wMDBfMDAwOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTE9BVDogICBhcmcgPSAoZmxvYXQpaSAvIDEwMDsgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBET1VCTEU6ICBhcmcgPSAoZG91YmxlKWkgLyAxMDAwXzAwMDsgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJnID0gZWxlbS5jYXN0KGFyZywgZWxlbVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnc1tpXSA9IGFyZzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9BcnJheVN0cmluZyhPYmplY3QgYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgQ2xhc3M8Pz4gZWxlbVR5cGUgPSBhLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICBpZiAoZWxlbVR5cGUgPT0gbnVsbCkgIHJldHVybiBhLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChlbGVtVHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZShlbGVtVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOVDogICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChpbnRbXSlhKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJZVEU6ICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChieXRlW10pYSk7CisgICAgICAgICAgICAgICAgY2FzZSBCT09MRUFOOiAgcmV0dXJuIEFycmF5cy50b1N0cmluZygoYm9vbGVhbltdKWEpOworICAgICAgICAgICAgICAgIGNhc2UgU0hPUlQ6ICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKHNob3J0W10pYSk7CisgICAgICAgICAgICAgICAgY2FzZSBDSEFSOiAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZygoY2hhcltdKWEpOworICAgICAgICAgICAgICAgIGNhc2UgRkxPQVQ6ICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKGZsb2F0W10pYSk7CisgICAgICAgICAgICAgICAgY2FzZSBMT05HOiAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZygobG9uZ1tdKWEpOworICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOiAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKGRvdWJsZVtdKWEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKE9iamVjdFtdKWEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhPYmplY3RbXSBhcnIxLCBPYmplY3RbXSBhcnIyKSB7CisgICAgICAgIGlmIChhcnIxID09IG51bGwgJiYgYXJyMiA9PSBudWxsKSAgcmV0dXJuOworICAgICAgICBpZiAoYXJyMSAhPSBudWxsICYmIGFycjIgIT0gbnVsbCAmJiBhcnIxLmxlbmd0aCA9PSBhcnIyLmxlbmd0aCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycjFbaV0sIGFycjJbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihBcnJheXMuZGVlcFRvU3RyaW5nKGFycjEpICsgIiAhPSAiICsgQXJyYXlzLmRlZXBUb1N0cmluZyhhcnIyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICBpZiAobzEgPT0gbnVsbCAmJiBvMiA9PSBudWxsKSAgICByZXR1cm47CisgICAgICAgIGlmIChvMSAhPSBudWxsICYmIG8xLmVxdWFscyhvMikpIHJldHVybjsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG8xICsgIiAhPSAiICsgbzIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRUcnVlKFN0cmluZyBtc2csIGJvb2xlYW4gYikgeworICAgICAgICBpZiAoIWIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZhbHNlKFN0cmluZyBtc2csIGJvb2xlYW4gYikgeworICAgICAgICBhc3NlcnRUcnVlKG1zZywgIWIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvamF2YS9sYW5nL3JlZmxlY3QvYW5ub3RhdGlvblNoYXJpbmcvQW5ub3RhdGlvblNoYXJpbmcuamF2YSBiL3Rlc3QvamF2YS9sYW5nL3JlZmxlY3QvYW5ub3RhdGlvblNoYXJpbmcvQW5ub3RhdGlvblNoYXJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2Yjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9qYXZhL2xhbmcvcmVmbGVjdC9hbm5vdGF0aW9uU2hhcmluZy9Bbm5vdGF0aW9uU2hhcmluZy5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIEB0ZXN0CisgKiBAYnVnIDgwNTQ5ODcKKyAqIEBzdW1tYXJ5IFRlc3Qgc2hhcmluZyBvZiBhbm5vdGF0aW9ucyBiZXR3ZWVuIEV4ZWN1dGFibGUvRmllbGQgaW5zdGFuY2VzLgorICogICAgICAgICAgU2hhcmluZyBzaG91bGQgbm90IGJlIG5vdGljZWFibGUgd2hlbiBwZXJmb3JtaW5nIG11dGF0aW5nCisgKiAgICAgICAgICBvcGVyYXRpb25zLgorICogQHJ1biB0ZXN0bmcgQW5ub3RhdGlvblNoYXJpbmcKKyAqLworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblNoYXJpbmcgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyAuLi4gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kU2hhcmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXRob2RbXSBtMSA9IEFubm90YXRpb25TaGFyaW5nLmNsYXNzLmdldE1ldGhvZHMoKTsKKyAgICAgICAgTWV0aG9kW10gbTIgPSBBbm5vdGF0aW9uU2hhcmluZy5jbGFzcy5nZXRNZXRob2RzKCk7CisgICAgICAgIHZhbGlkYXRlU2hhcmluZ1NhZmVseU9ic2VydmFibGUobTEsIG0yKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZE1ldGhvZFNoYXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0aG9kW10gbTMgPSBBbm5vdGF0aW9uU2hhcmluZy5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgTWV0aG9kW10gbTQgPSBBbm5vdGF0aW9uU2hhcmluZy5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgdmFsaWRhdGVTaGFyaW5nU2FmZWx5T2JzZXJ2YWJsZShtMywgbTQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkU2hhcmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWVsZFtdIGYxID0gQW5ub3RhdGlvblNoYXJpbmcuY2xhc3MuZ2V0RmllbGRzKCk7CisgICAgICAgIEZpZWxkW10gZjIgPSBBbm5vdGF0aW9uU2hhcmluZy5jbGFzcy5nZXRGaWVsZHMoKTsKKyAgICAgICAgdmFsaWRhdGVTaGFyaW5nU2FmZWx5T2JzZXJ2YWJsZShmMSwgZjIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY2xhcmVkRmllbGRzU2hhcmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWVsZFtdIGYzID0gQW5ub3RhdGlvblNoYXJpbmcuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgRmllbGRbXSBmNCA9IEFubm90YXRpb25TaGFyaW5nLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIHZhbGlkYXRlU2hhcmluZ1NhZmVseU9ic2VydmFibGUoZjMsIGY0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RTaGFyaW5nT2NjdXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZCBtbTEgPSBBbm5vdGF0aW9uU2hhcmluZy5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgibSIsIChDbGFzczw/PltdKW51bGwpOworICAgICAgICBNZXRob2QgbW0yID0gQW5ub3RhdGlvblNoYXJpbmcuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm0iLCAoQ2xhc3M8Pz5bXSludWxsKTsKKyAgICAgICAgdmFsaWRhdGVBbm5vdGF0aW9uU2hhcmluZyhtbTEsIG1tMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kU2hhcmluZ0lzU2FmZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXRob2QgbW0xID0gQW5ub3RhdGlvblNoYXJpbmcuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm0iLCAoQ2xhc3M8Pz5bXSludWxsKTsKKyAgICAgICAgTWV0aG9kIG1tMiA9IEFubm90YXRpb25TaGFyaW5nLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJtIiwgKENsYXNzPD8+W10pbnVsbCk7CisgICAgICAgIHZhbGlkYXRlQW5ub3RhdGlvblNoYXJpbmdJc1NhZmUobW0xLCBtbTIpOworICAgICAgICB2YWxpZGF0ZUFycmF5VmFsdWVzKG1tMS5nZXRBbm5vdGF0aW9uKEJhei5jbGFzcyksIG1tMi5nZXRBbm5vdGF0aW9uKEJhei5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkU2hhcmluZ09jY3VycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWVsZCBmZjEgPSBBbm5vdGF0aW9uU2hhcmluZy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmIik7CisgICAgICAgIEZpZWxkIGZmMiA9IEFubm90YXRpb25TaGFyaW5nLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImYiKTsKKyAgICAgICAgdmFsaWRhdGVBbm5vdGF0aW9uU2hhcmluZyhmZjEsIGZmMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRTaGFyaW5nSXNTYWZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpZWxkIGZmMSA9IEFubm90YXRpb25TaGFyaW5nLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImYiKTsKKyAgICAgICAgRmllbGQgZmYyID0gQW5ub3RhdGlvblNoYXJpbmcuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiZiIpOworICAgICAgICB2YWxpZGF0ZUFubm90YXRpb25TaGFyaW5nSXNTYWZlKGZmMSwgZmYyKTsKKyAgICAgICAgdmFsaWRhdGVBcnJheVZhbHVlcyhmZjEuZ2V0QW5ub3RhdGlvbihCYXouY2xhc3MpLCBmZjIuZ2V0QW5ub3RhdGlvbihCYXouY2xhc3MpKTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IEFjY2Vzc2libGVPYmplY3QgaW5zdGFuY2VzIGFyZSBub3Qgc2hhcmVkCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVNoYXJpbmdTYWZlbHlPYnNlcnZhYmxlKEFjY2Vzc2libGVPYmplY3RbXSBtMSwgQWNjZXNzaWJsZU9iamVjdFtdIG0yKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBzZXRBY2Nlc3NpYmxlIHdvcmtzCisgICAgICAgIGZvciAoQWNjZXNzaWJsZU9iamVjdCBtIDogbTEpCisgICAgICAgICAgICBtLnNldEFjY2Vzc2libGUoZmFsc2UpOworCisgICAgICAgIGZvciAoQWNjZXNzaWJsZU9iamVjdCBtIDogbTIpCisgICAgICAgICAgICBtLnNldEFjY2Vzc2libGUodHJ1ZSk7CisKKyAgICAgICAgZm9yIChBY2Nlc3NpYmxlT2JqZWN0IG0gOiBtMSkKKyAgICAgICAgICAgIGlmIChtLmlzQWNjZXNzaWJsZSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG0gKyAiIHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZSIpOworCisgICAgICAgIGZvciAoQWNjZXNzaWJsZU9iamVjdCBtIDogbTIpCisgICAgICAgICAgICBpZiAoIW0uaXNBY2Nlc3NpYmxlKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obSArICIgc2hvdWxkIGJlIGFjY2Vzc2libGUiKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IG1ldGhvZHMgYXJlIHN0aWxsIGVxdWFsKCkKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtMS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmICghbTFbaV0uZXF1YWxzKG0yW2ldKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtMVtpXSArICIgYW5kICIgKyBtMltpXSArICIgc2hvdWxkIGJlIGVxdWFsKCkiKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBhcnJheXMgYXJlbid0IHNoYXJlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG0xLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgbTFbaV0gPSBudWxsOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTIubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAobTJbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRGV0ZWN0ZWQgc2hhcmluZyBvZiBBY2Nlc3NpYmxlT2JqZWN0IGFycmF5cyIpOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHRoYXQgYW5ub3RhdGlvbnMgYXJlIHNoYXJlZAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVBbm5vdGF0aW9uU2hhcmluZyhBY2Nlc3NpYmxlT2JqZWN0IG0xLCBBY2Nlc3NpYmxlT2JqZWN0IG0yKSB7CisgICAgICAgIEJhciBiMSA9IG0xLmdldEFubm90YXRpb24oQmFyLmNsYXNzKTsKKyAgICAgICAgQmFyIGIyID0gbTIuZ2V0QW5ub3RhdGlvbihCYXIuY2xhc3MpOworCisgICAgICAgIGlmIChiMSAhPSBiMikKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGIxICsgIiBhbmQgIiArIGIyICsgIiBzaG91bGQgYmUgPT0iKTsKKworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHRoYXQgTWV0aG9kIGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlIGFubm90YXRpb24gZWxlbWVudHMKKyAgICAvLyBiZWhhdmUgYXMgaW50ZW5kZWQKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlQW5ub3RhdGlvblNoYXJpbmdJc1NhZmUoQWNjZXNzaWJsZU9iamVjdCBtMSwgQWNjZXNzaWJsZU9iamVjdCBtMikKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCYXIgYjEgPSBtMS5nZXRBbm5vdGF0aW9uKEJhci5jbGFzcyk7CisgICAgICAgIEJhciBiMiA9IG0yLmdldEFubm90YXRpb24oQmFyLmNsYXNzKTsKKworICAgICAgICBNZXRob2QgbW0xID0gYjEuYW5ub3RhdGlvblR5cGUoKS5nZXRNZXRob2QoInZhbHVlIiwgKENsYXNzPD8+W10pIG51bGwpOworICAgICAgICBNZXRob2QgbW0yID0gYjIuYW5ub3RhdGlvblR5cGUoKS5nZXRNZXRob2QoInZhbHVlIiwgKENsYXNzPD8+W10pIG51bGwpOworICAgICAgICBpbm5lcihtbTEsIG1tMik7CisKKyAgICAgICAgbW0xID0gYjEuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInZhbHVlIiwgKENsYXNzPD8+W10pIG51bGwpOworICAgICAgICBtbTIgPSBiMi5nZXRDbGFzcygpLmdldE1ldGhvZCgidmFsdWUiLCAoQ2xhc3M8Pz5bXSkgbnVsbCk7CisgICAgICAgIGlubmVyKG1tMSwgbW0yKTsKKworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGlubmVyKE1ldGhvZCBtbTEsIE1ldGhvZCBtbTIpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtbTEuZXF1YWxzKG1tMikpCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtbTEgKyAiIGFuZCAiICsgbW0yICsgIiBzaG91bGQgYmUgZXF1YWwoKSIpOworCisgICAgICAgIG1tMS5zZXRBY2Nlc3NpYmxlKGZhbHNlKTsKKyAgICAgICAgbW0yLnNldEFjY2Vzc2libGUodHJ1ZSk7CisKKyAgICAgICAgaWYgKG1tMS5pc0FjY2Vzc2libGUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1tMSArICIgc2hvdWxkIG5vdCBiZSBhY2Nlc3NpYmxlIik7CisKKyAgICAgICAgaWYgKCFtbTIuaXNBY2Nlc3NpYmxlKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtbTIgKyAiIHNob3VsZCBiZSBhY2Nlc3NpYmxlIik7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhhdCBhcnJheSBlbGVtZW50IHZhbHVlcyBhcmUgbm90IHNoYXJlZAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVBcnJheVZhbHVlcyhCYXogYSwgQmF6IGIpIHsKKyAgICAgICAgU3RyaW5nW10gczEgPSBhLnZhbHVlKCk7CisgICAgICAgIFN0cmluZ1tdIHMyID0gYi52YWx1ZSgpOworCisgICAgICAgIHMxWzBdID0gIjIyIjsKKworICAgICAgICBpZiAoIXMyWzBdLmVxdWFscygiMSIpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk11dGF0aW9uIG9mIGFycmF5IGVsZW1lbnRzIHNob3VsZCBub3QgYmUgZGV0ZWN0YWJsZSIpOworICAgIH0KKworICAgIEBGb28gQEJhcigidmFsIikgQEJheih7IjEiLCAiMiJ9KQorICAgIHB1YmxpYyB2b2lkIG0oKSB7CisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgQEZvbyBAQmFyKCJzb21lVmFsdWUiKSBAQmF6KHsiMSIsICIyMiIsICIzMyJ9KQorICAgIHB1YmxpYyBPYmplY3QgZiA9IG5ldyBPYmplY3QoKTsKK30KKworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BpbnRlcmZhY2UgRm9vIHt9CisKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAaW50ZXJmYWNlIEJhciB7CisgICAgU3RyaW5nIHZhbHVlKCk7Cit9CisKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAaW50ZXJmYWNlIEJheiB7CisgICAgU3RyaW5nIFtdIHZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2phdmEvdGltZS90ZXN0L2phdmEvdGltZS9mb3JtYXQvVGVzdFpvbmVUZXh0UHJpbnRlclBhcnNlci5qYXZhIGIvdGVzdC9qYXZhL3RpbWUvdGVzdC9qYXZhL3RpbWUvZm9ybWF0L1Rlc3Rab25lVGV4dFByaW50ZXJQYXJzZXIuamF2YQppbmRleCA0MDIxYTE0Li4yOGNjYmZlIDEwMDY0NAotLS0gYS90ZXN0L2phdmEvdGltZS90ZXN0L2phdmEvdGltZS9mb3JtYXQvVGVzdFpvbmVUZXh0UHJpbnRlclBhcnNlci5qYXZhCisrKyBiL3Rlc3QvamF2YS90aW1lL3Rlc3QvamF2YS90aW1lL2Zvcm1hdC9UZXN0Wm9uZVRleHRQcmludGVyUGFyc2VyLmphdmEKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICAgICAgeyJBc2lhL1RhaXBlaSIsICAgICAgIkNoaW5hIFN0YW5kYXJkIFRpbWUiLCAgIHByZWZlcnJlZCwgTG9jYWxlLkVOR0xJU0gsIFRleHRTdHlsZS5GVUxMfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9DaGljYWdvIiwgICJDU1QiLCAgICAgICAgICAgICAgICAgICBub25lLCAgICAgIExvY2FsZS5FTkdMSVNILCBUZXh0U3R5bGUuU0hPUlR9LAogICAgICAgICAgICAgeyJBc2lhL1RhaXBlaSIsICAgICAgIkNTVCIsICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZCwgTG9jYWxlLkVOR0xJU0gsIFRleHRTdHlsZS5TSE9SVH0sCi0gICAgICAgICAgICB7IkF1c3RyYWxpYS9Tb3V0aCIsICAiQ1NUIiwgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkX3MsIExvY2FsZS5FTkdMSVNILCBUZXh0U3R5bGUuU0hPUlR9LAorICAgICAgICAgICAgeyJBdXN0cmFsaWEvU291dGgiLCAgIkFDU1QiLCAgICAgICAgICAgICAgICAgIHByZWZlcnJlZF9zLCBMb2NhbGUuRU5HTElTSCwgVGV4dFN0eWxlLlNIT1JUfSwKICAgICAgICAgICAgIHsiQW1lcmljYS9DaGljYWdvIiwgICJDRFQiLCAgICAgICAgICAgICAgICAgICBub25lLCAgICAgICAgTG9jYWxlLkVOR0xJU0gsIFRleHRTdHlsZS5TSE9SVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2hhbmdoYWkiLCAgICAiQ0RUIiwgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkX3MsIExvY2FsZS5FTkdMSVNILCBUZXh0U3R5bGUuU0hPUlR9LAogICAgICAgIH07CmRpZmYgLS1naXQgYS90ZXN0L2phdmEvdXRpbC9DdXJyZW5jeS90YWJsZWExLnR4dCBiL3Rlc3QvamF2YS91dGlsL0N1cnJlbmN5L3RhYmxlYTEudHh0CmluZGV4IDk0Yzg0OGEuLjI5ODg1NjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvamF2YS91dGlsL0N1cnJlbmN5L3RhYmxlYTEudHh0CisrKyBiL3Rlc3QvamF2YS91dGlsL0N1cnJlbmN5L3RhYmxlYTEudHh0CkBAIC0xLDEyICsxLDEyIEBACiAjCiAjCi0jIEFtZW5kbWVudHMgdXAgdW50aWwgSVNPIDQyMTcgQU1FTkRNRU5UIE5VTUJFUiAxNTYKLSMgICAoQXMgb2YgMjMgSnVseSAyMDEzKQorIyBBbWVuZG1lbnRzIHVwIHVudGlsIElTTyA0MjE3IEFNRU5ETUVOVCBOVU1CRVIgMTU5CisjICAgKEFzIG9mIDE1IEF1Z3VzdCAyMDE0KQogIwogCiAjIFZlcnNpb24KIEZJTEVWRVJTSU9OPTEKLURBVEFWRVJTSU9OPTE1NgorREFUQVZFUlNJT049MTU5CiAKICMgSVNPIDQyMTcgY3VycmVuY3kgZGF0YQogQUYJQUZOCTk3MQkyCkBAIC0xNDIsNyArMTQyLDcgQEAKIExSCUxSRAk0MzAJMgogTFkJTFlECTQzNAkzCiBMSQlDSEYJNzU2CTIKLUxUCUxUTAk0NDAJMgorTFQJTFRMCTQ0MAkyCTIwMTQtMTItMzEtMjItMDAtMDAJRVVSCTk3OAkyCiBMVQlFVVIJOTc4CTIKIE1PCU1PUAk0NDYJMgogTUsJTUtECTgwNwkyCmRpZmYgLS1naXQgYS90ZXN0L2phdmEvdXRpbC9sb2dnaW5nL0NoZWNrWm9tYmllTG9ja1Rlc3QuamF2YSBiL3Rlc3QvamF2YS91dGlsL2xvZ2dpbmcvQ2hlY2tab21iaWVMb2NrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjVhODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2phdmEvdXRpbC9sb2dnaW5nL0NoZWNrWm9tYmllTG9ja1Rlc3QuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyAgICAgODA0ODAyMAorICogQGF1dGhvciAgRGFuaWVsIEZ1Y2hzCisgKiBAc3VtbWFyeSBSZWdyZXNzaW9uIG9uIGphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLgorICogICAgIFRoZSBmaXggaXMgdG8gYXZvaWQgZmlsbGluZyB1cCB0aGUgZmlsZSBzeXN0ZW0gd2l0aCB6b21iaWUgbG9jayBmaWxlcy4KKyAqCisgKiBAcnVuICBtYWluL290aGVydm0gQ2hlY2tab21iaWVMb2NrVGVzdCBXUklUQUJMRSBDTE9TRSBDTEVBTlVQCisgKiBAcnVuICBtYWluL290aGVydm0gQ2hlY2tab21iaWVMb2NrVGVzdCBDTEVBTlVQCisgKiBAcnVuICBtYWluL290aGVydm0gQ2hlY2tab21iaWVMb2NrVGVzdCBXUklUQUJMRQorICogQHJ1biAgbWFpbi9vdGhlcnZtIENoZWNrWm9tYmllTG9ja1Rlc3QgQ1JFQVRFX0ZJUlNUCisgKiBAcnVuICBtYWluL290aGVydm0gQ2hlY2tab21iaWVMb2NrVGVzdCBDUkVBVEVfTkVYVAorICogQHJ1biAgbWFpbi9vdGhlcnZtIENoZWNrWm9tYmllTG9ja1Rlc3QgQ1JFQVRFX05FWFQKKyAqIEBydW4gIG1haW4vb3RoZXJ2bSBDaGVja1pvbWJpZUxvY2tUZXN0IENMRUFOVVAKKyAqIEBydW4gIG1haW4vb3RoZXJ2bSBDaGVja1pvbWJpZUxvY2tUZXN0IFJFVVNFCisgKiBAcnVuICBtYWluL290aGVydm0gQ2hlY2tab21iaWVMb2NrVGVzdCBDTEVBTlVQCisgKi8KK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworcHVibGljIGNsYXNzIENoZWNrWm9tYmllTG9ja1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRBQkxFX0RJUiA9ICJ3cml0YWJsZS1sb2NrZmlsZS1kaXIiOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gc3VwcG9ydHNMb2NraW5nID0gdHJ1ZTsKKworICAgIHN0YXRpYyBlbnVtIFRlc3RDYXNlIHsKKyAgICAgICAgV1JJVEFCTEUsICAvLyBqdXN0IHZlcmlmaWVzIHRoYXQgd2UgY2FuIGNyZWF0ZSBhIGZpbGUgaW4gb3VyICd3cml0YWJsZS1sb2NrZmlsZS1kaXInCisgICAgICAgIENMT1NFLCAvLyBjaGVja3MgdGhhdCBjbG9zaW5nIGEgRmlsZUhhbmRsZXIgcmVtb3ZlcyBpdHMgbG9jayBmaWxlCisgICAgICAgIENSRUFURV9GSVJTVCwgLy8gdmVyaWZpZXMgdGhhdCAnd3JpdGFibGUtbG9ja2ZpbGUtZGlyJyBjb250YWlucyBubyBsb2NrLCB0aGVuIGNyZWF0ZXMgYSBmaXJzdCBGaWxlSGFuZGxlci4KKyAgICAgICAgQ1JFQVRFX05FWFQsIC8vIHZlcmlmaWVzIHRoYXQgJ3dyaXRhYmxlLWxvY2tmaWxlLWRpcicgY29udGFpbnMgYSBzaW5nbGUgbG9jaywgdGhlbiBjcmVhdGVzIHRoZSBuZXh0IEZpbGVIYW5kbGVyCisgICAgICAgIFJFVVNFLCAvLyB2ZXJpZmllcyB0aGF0IHpvbWJpZSBsb2NrIGZpbGVzIGNhbiBiZSByZXVzZWQKKyAgICAgICAgQ0xFQU5VUCAvLyByZW1vdmVzICJ3cml0YWJsZS1sb2NrZmlsZS1kaXIiCisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyB3ZSdsbCBiYXNlIGFsbCBmaWxlIGNyZWF0aW9uIGF0dGVtcHRzIG9uIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnksCisgICAgICAgIC8vICV0CisgICAgICAgIEZpbGUgd3JpdGFibGVEaXIgPSBzZXR1cCgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRhYmxlIGRpciBpczogIiArIHdyaXRhYmxlRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgLy8gd2Ugbm93IGhhdmUgb25lIHdyaXRhYmxlIGRpcmVjdG9yeSB0byB3b3JrIHdpdGg6CisgICAgICAgIC8vICAgIHdyaXRhYmxlRGlyCisgICAgICAgIGlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgYXJncyA9IG5ldyBTdHJpbmdbXSB7ICJXUklUQUJMRSIsICJDTE9TRSIsICJDTEVBTlVQIiB9OworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBydW5UZXN0cyh3cml0YWJsZURpciwgYXJncyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiB8IEVycm9yIHgpIHsKKyAgICAgICAgICAgIC8vIHNvbWUgZXJyb3Igb2NjdXJlZDogY2xlYW51cAorICAgICAgICAgICAgZGVsZXRlKHdyaXRhYmxlRGlyKTsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd3JpdGFibGVEaXIgaW4gd2hpY2ggbG9nIGFuZCBsb2NrIGZpbGUgYXJlIGNyZWF0ZWQKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuVGVzdHMoRmlsZSB3cml0YWJsZURpciwgU3RyaW5nLi4uIGFyZ3MpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogYXJncykgeworICAgICAgICAgICAgc3dpdGNoKFRlc3RDYXNlLnZhbHVlT2YoYXJnKSkgeworICAgICAgICAgICAgICAgIC8vIFRlc3QgMTogbWFrZXMgc3VyZSB3ZSBjYW4gY3JlYXRlIEZpbGVIYW5kbGVyIGluIHdyaXRhYmxlIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGNhc2UgV1JJVEFCTEU6IGNoZWNrV3JpdGFibGUod3JpdGFibGVEaXIpOyBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBUZXN0IDI6IHZlcmlmaWVzIHRoYXQgRmlsZUhhbmRsZXIuY2xvc2UoKSBjbGVhbnMgdXAgaXRzIGxvY2sgZmlsZQorICAgICAgICAgICAgICAgIGNhc2UgQ0xPU0U6IHRlc3RGaWxlSGFuZGxlckNsb3NlKHdyaXRhYmxlRGlyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gVGVzdCAzOiBjcmVhdGVzIHRoZSBmaXJzdCBmaWxlIGhhbmRsZXIKKyAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9GSVJTVDogdGVzdEZpbGVIYW5kbGVyQ3JlYXRlKHdyaXRhYmxlRGlyLCB0cnVlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gVGVzdCA0LCA1LCAuLi4gY3JlYXRlcyB0aGUgbmV4dCBmaWxlIGhhbmRsZXIKKyAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9ORVhUOiB0ZXN0RmlsZUhhbmRsZXJDcmVhdGUod3JpdGFibGVEaXIsIGZhbHNlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2tzIHRoYXQgem9tYmllIGxvY2sgZmlsZXMgYXJlIHJldXNlZCBhcHByb3ByaWF0bHkKKyAgICAgICAgICAgICAgICBjYXNlIFJFVVNFOiB0ZXN0RmlsZUhhbmRsZXJSZXVzZSh3cml0YWJsZURpcik7IGJyZWFrOworICAgICAgICAgICAgICAgIC8vIFJlbW92ZXMgdGhlIHdyaXRhYmxlRGlyCisgICAgICAgICAgICAgICAgY2FzZSBDTEVBTlVQOiBkZWxldGUod3JpdGFibGVEaXIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gc3VjaCB0ZXN0IGNhc2U6ICIgKyBhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdyaXRhYmxlRGlyIGluIHdoaWNoIGxvZyBhbmQgbG9jayBmaWxlIGFyZSBjcmVhdGVkCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrV3JpdGFibGUoRmlsZSB3cml0YWJsZURpcikgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLAorICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IDE6IG1ha2Ugc3VyZSB3ZSBjYW4gY3JlYXRlL2RlbGV0ZSBmaWxlcyBpbiB0aGUgd3JpdGFibGUgZGlyLgorICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3cml0YWJsZURpciwgInRlc3QudHh0Iik7CisgICAgICAgIGlmICghY3JlYXRlRmlsZShmaWxlLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlICIgKyBmaWxlICsgIlxuXHRVbmFibGUgdG8gcnVuIHRlc3QiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZShmaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZUhhbmRsZXIgY3JlYXRlRmlsZUhhbmRsZXIoRmlsZSB3cml0YWJsZURpcikgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLAorICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUZXN0IDE6IG1ha2Ugc3VyZSB3ZSBjYW4gY3JlYXRlIEZpbGVIYW5kbGVyIGluIHdyaXRhYmxlIGRpcmVjdG9yeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBGaWxlSGFuZGxlcigiJXQvIiArIFdSSVRBQkxFX0RJUiArICIvbG9nLmxvZyIpOworICAgICAgICAgICAgaGFuZGxlci5wdWJsaXNoKG5ldyBMb2dSZWNvcmQoTGV2ZWwuSU5GTywgaGFuZGxlci50b1N0cmluZygpKSk7CisgICAgICAgICAgICBoYW5kbGVyLmZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IGZhaWxlZDogc2hvdWxkIGhhdmUgYmVlbiBhYmxlIgorICAgICAgICAgICAgICAgICAgICArICIgdG8gY3JlYXRlIEZpbGVIYW5kbGVyIGZvciAiICsgIiV0LyIgKyBXUklUQUJMRV9ESVIKKyAgICAgICAgICAgICAgICAgICAgKyAiL2xvZy5sb2cgaW4gd3JpdGFibGUgZGlyZWN0b3J5LiIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmlsZT4gbGlzdExvY2tzKEZpbGUgd3JpdGFibGVEaXIsIGJvb2xlYW4gcHJpbnQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMaXN0PEZpbGU+IGxvY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoRmlsZSBmIDogd3JpdGFibGVEaXIubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChwcmludCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgZmlsZTogIiArIGYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aCgiLmxjayIpKSB7CisgICAgICAgICAgICAgICAgbG9ja3MuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsb2NrczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RGaWxlSGFuZGxlckNsb3NlKEZpbGUgd3JpdGFibGVEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZmFrZUxvY2sgPSBuZXcgRmlsZSh3cml0YWJsZURpciwgImxvZy5sb2cubGNrIik7CisgICAgICAgIGlmICghY3JlYXRlRmlsZShmYWtlTG9jaywgZmFsc2UpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBmYWtlIGxvY2sgZmlsZTogIiArIGZha2VMb2NrKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlzdDxGaWxlPiBiZWZvcmUgPSBsaXN0TG9ja3Mod3JpdGFibGVEaXIsIHRydWUpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiZWZvcmU6ICIgKyBiZWZvcmUuc2l6ZSgpICsgIiBsb2NrcyBmb3VuZCIpOworICAgICAgICAgICAgRmlsZUhhbmRsZXIgaGFuZGxlciA9IGNyZWF0ZUZpbGVIYW5kbGVyKHdyaXRhYmxlRGlyKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaGFuZGxlciBjcmVhdGVkOiAiICsgaGFuZGxlcik7CisgICAgICAgICAgICBMaXN0PEZpbGU+IGFmdGVyID0gbGlzdExvY2tzKHdyaXRhYmxlRGlyLCB0cnVlKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgY3JlYXRpbmcgaGFuZGxlcjogIiArIGFmdGVyLnNpemUoKSArICIgbG9ja3MgZm91bmQiKTsKKyAgICAgICAgICAgIGhhbmRsZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaGFuZGxlciBjbG9zZWQ6ICIgKyBoYW5kbGVyKTsKKyAgICAgICAgICAgIExpc3Q8RmlsZT4gYWZ0ZXJDbG9zZSA9IGxpc3RMb2Nrcyh3cml0YWJsZURpciwgdHJ1ZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFmdGVyIGNsb3NpbmcgaGFuZGxlcjogIiArIGFmdGVyQ2xvc2Uuc2l6ZSgpICsgIiBsb2NrcyBmb3VuZCIpOworICAgICAgICAgICAgYWZ0ZXJDbG9zZS5yZW1vdmVBbGwoYmVmb3JlKTsKKyAgICAgICAgICAgIGlmICghYWZ0ZXJDbG9zZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiWm9tYmllIGxvY2sgZmlsZSBkZXRlY3RlZDogIiArIGFmdGVyQ2xvc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGZha2VMb2NrLmNhblJlYWQoKSkgZGVsZXRlKGZha2VMb2NrKTsKKyAgICAgICAgfQorICAgICAgICBMaXN0PEZpbGU+IGZpbmFsTG9ja3MgPSBsaXN0TG9ja3Mod3JpdGFibGVEaXIsIGZhbHNlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZnRlciBjbGVhbnVwOiAiICsgZmluYWxMb2Nrcy5zaXplKCkgKyAiIGxvY2tzIGZvdW5kIik7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RGaWxlSGFuZGxlclJldXNlKEZpbGUgd3JpdGFibGVEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8RmlsZT4gYmVmb3JlID0gbGlzdExvY2tzKHdyaXRhYmxlRGlyLCB0cnVlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiZWZvcmU6ICIgKyBiZWZvcmUuc2l6ZSgpICsgIiBsb2NrcyBmb3VuZCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFiZWZvcmUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIG5vIGxvY2sgZmlsZSEgRm91bmQ6ICIgKyBiZWZvcmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYmVmb3JlLnN0cmVhbSgpLmZvckVhY2goQ2hlY2tab21iaWVMb2NrVGVzdDo6ZGVsZXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVIYW5kbGVyIGhhbmRsZXIxID0gY3JlYXRlRmlsZUhhbmRsZXIod3JpdGFibGVEaXIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImhhbmRsZXIgY3JlYXRlZDogIiArIGhhbmRsZXIxKTsKKyAgICAgICAgTGlzdDxGaWxlPiBhZnRlciA9IGxpc3RMb2Nrcyh3cml0YWJsZURpciwgdHJ1ZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgY3JlYXRpbmcgaGFuZGxlcjogIiArIGFmdGVyLnNpemUoKSArICIgbG9ja3MgZm91bmQiKTsKKyAgICAgICAgaWYgKGFmdGVyLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBudW1iZXIgb2YgbG9jayBmaWxlcyBmb3VuZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXIxICsgIjogIiArIGFmdGVyKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBGaWxlIGxvY2sgPSBhZnRlci5nZXQoMCk7CisgICAgICAgIGFmdGVyLmNsZWFyKCk7CisgICAgICAgIGhhbmRsZXIxLmNsb3NlKCk7CisgICAgICAgIGFmdGVyID0gbGlzdExvY2tzKHdyaXRhYmxlRGlyLCB0cnVlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZnRlciBjbG9zaW5nIGhhbmRsZXI6ICIgKyBhZnRlci5zaXplKCkgKyAiIGxvY2tzIGZvdW5kIik7CisgICAgICAgIGlmICghYWZ0ZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBudW1iZXIgb2YgbG9jayBmaWxlcyBmb3VuZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXIxICsgIjogIiArIGFmdGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNyZWF0ZUZpbGUobG9jaywgZmFsc2UpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBmYWtlIGxvY2sgZmlsZTogIiArIGxvY2spOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiZWZvcmUgPSBsaXN0TG9ja3Mod3JpdGFibGVEaXIsIHRydWUpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiZWZvcmU6ICIgKyBiZWZvcmUuc2l6ZSgpICsgIiBsb2NrcyBmb3VuZCIpOworICAgICAgICAgICAgaWYgKGJlZm9yZS5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIG51bWJlciBvZiBsb2NrIGZpbGVzIGZvdW5kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGJlZm9yZSArICIgZXhwZWN0ZWQgWyIgKyBsb2NrICsgIl0uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlSGFuZGxlciBoYW5kbGVyMiA9IGNyZWF0ZUZpbGVIYW5kbGVyKHdyaXRhYmxlRGlyKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaGFuZGxlciBjcmVhdGVkOiAiICsgaGFuZGxlcjIpOworICAgICAgICAgICAgYWZ0ZXIgPSBsaXN0TG9ja3Mod3JpdGFibGVEaXIsIHRydWUpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZnRlciBjcmVhdGluZyBoYW5kbGVyOiAiICsgYWZ0ZXIuc2l6ZSgpICsgIiBsb2NrcyBmb3VuZCIpOworICAgICAgICAgICAgYWZ0ZXIucmVtb3ZlQWxsKGJlZm9yZSk7CisgICAgICAgICAgICBpZiAoIWFmdGVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGxvY2sgZmlsZSBmb3VuZDogIiArIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICArICJcblx0IiArIGxvY2sgKyAiIHNob3VsZCBoYXZlIGJlZW4gcmV1c2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVyMi5jbG9zZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJoYW5kbGVyIGNsb3NlZDogIiArIGhhbmRsZXIyKTsKKyAgICAgICAgICAgIExpc3Q8RmlsZT4gYWZ0ZXJDbG9zZSA9IGxpc3RMb2Nrcyh3cml0YWJsZURpciwgdHJ1ZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFmdGVyIGNsb3NpbmcgaGFuZGxlcjogIiArIGFmdGVyQ2xvc2Uuc2l6ZSgpICsgIiBsb2NrcyBmb3VuZCIpOworICAgICAgICAgICAgaWYgKCFhZnRlckNsb3NlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJab21iaWUgbG9jayBmaWxlIGRldGVjdGVkOiAiICsgYWZ0ZXJDbG9zZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdXBwb3J0c0xvY2tpbmcpIHsKKyAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCBmYyA9IEZpbGVDaGFubmVsLm9wZW4oUGF0aHMuZ2V0KGxvY2suZ2V0QWJzb2x1dGVQYXRoKCkpLAorICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE9wZW5PcHRpb24uQ1JFQVRFX05FVywgU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORCwKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRPcGVuT3B0aW9uLldSSVRFKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmMudHJ5TG9jaygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9ja2VkOiAiICsgbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyMiA9IGNyZWF0ZUZpbGVIYW5kbGVyKHdyaXRhYmxlRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaGFuZGxlciBjcmVhdGVkOiAiICsgaGFuZGxlcjIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBsaXN0TG9ja3Mod3JpdGFibGVEaXIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZnRlciBjcmVhdGluZyBoYW5kbGVyOiAiICsgYWZ0ZXIuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBsb2NrcyBmb3VuZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIucmVtb3ZlQWxsKGJlZm9yZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBsb2NrIGZpbGVzIGZvdW5kOiAiICsgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cdCIgKyBsb2NrICsgIiBzaG91bGQgbm90IGhhdmUgYmVlbiByZXVzZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9jazogIiArIGxvY2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlKGxvY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIExpc3Q8RmlsZT4gZmluYWxMb2NrcyA9IGxpc3RMb2Nrcyh3cml0YWJsZURpciwgZmFsc2UpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbmQ6ICIgKyBmaW5hbExvY2tzLnNpemUoKSArICIgbG9ja3MgZm91bmQiKTsKKyAgICAgICAgICAgIGRlbGV0ZSh3cml0YWJsZURpcik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEZpbGVIYW5kbGVyQ3JlYXRlKEZpbGUgd3JpdGFibGVEaXIsIGJvb2xlYW4gZmlyc3QpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMaXN0PEZpbGU+IGJlZm9yZSA9IGxpc3RMb2Nrcyh3cml0YWJsZURpciwgdHJ1ZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmVmb3JlOiAiICsgYmVmb3JlLnNpemUoKSArICIgbG9ja3MgZm91bmQiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaXJzdCAmJiAhYmVmb3JlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBubyBsb2NrIGZpbGUhIEZvdW5kOiAiICsgYmVmb3JlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpcnN0ICYmIGJlZm9yZS5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBhIHNpbmdsZSBsb2NrIGZpbGUhIEZvdW5kOiAiICsgYmVmb3JlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGJlZm9yZS5zdHJlYW0oKS5mb3JFYWNoKENoZWNrWm9tYmllTG9ja1Rlc3Q6OmRlbGV0ZSk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZUhhbmRsZXIgaGFuZGxlciA9IGNyZWF0ZUZpbGVIYW5kbGVyKHdyaXRhYmxlRGlyKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJoYW5kbGVyIGNyZWF0ZWQ6ICIgKyBoYW5kbGVyKTsKKyAgICAgICAgTGlzdDxGaWxlPiBhZnRlciA9IGxpc3RMb2Nrcyh3cml0YWJsZURpciwgdHJ1ZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgY3JlYXRpbmcgaGFuZGxlcjogIiArIGFmdGVyLnNpemUoKSArICIgbG9ja3MgZm91bmQiKTsKKyAgICAgICAgaWYgKGFmdGVyLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBudW1iZXIgb2YgbG9jayBmaWxlcyBmb3VuZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXIgKyAiOiAiICsgYWZ0ZXIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXR1cCBhbGwgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBuZWVkZWQgZm9yIHRoZSB0ZXN0cworICAgICAqCisgICAgICogQHJldHVybiB3cml0YWJsZSBkaXJlY3RvcnkgY3JlYXRlZCB0aGF0IG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2hlbiBkb25lCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBzZXR1cCgpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmlyc3QgZG8gc29tZSBzZXR1cCBpbiB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSAodXNpbmcgc2FtZSBsb2dpYyBhcworICAgICAgICAvLyBGaWxlSGFuZGxlciBmb3IgJXQgcGF0dGVybikKKyAgICAgICAgU3RyaW5nIHRtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsgLy8gaS5lLiAldAorICAgICAgICBpZiAodG1wRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSB0bXBPckhvbWVEaXIgPSBuZXcgRmlsZSh0bXBEaXIpOworICAgICAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBkaXJlY3RvcnkgaGVyZSAoJXQvd3JpdGFibGUtbG9ja2ZpbGUtZGlyKQorICAgICAgICBGaWxlIHdyaXRhYmxlRGlyID0gbmV3IEZpbGUodG1wT3JIb21lRGlyLCBXUklUQUJMRV9ESVIpOworICAgICAgICBpZiAoIWNyZWF0ZUZpbGUod3JpdGFibGVEaXIsIHRydWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBzZXR1cCBmYWlsZWQ6IHVuYWJsZSB0byBjcmVhdGUiCisgICAgICAgICAgICAgICAgICAgICsgIiB3cml0YWJsZSB3b3JraW5nIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICsgd3JpdGFibGVEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgd2hldGhlciBmaWxlIGxvY2tpbmcgaXMgc3VwcG9ydGVkCisgICAgICAgIGZpbmFsIFN0cmluZyB1bmlxdWVGaWxlTmFtZSA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkrIi5sY2siOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUNoYW5uZWwgZmMgPSBGaWxlQ2hhbm5lbC5vcGVuKFBhdGhzLmdldCh3cml0YWJsZURpci5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlRmlsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE9wZW5PcHRpb24uQ1JFQVRFX05FVywgU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORCwKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRPcGVuT3B0aW9uLkRFTEVURV9PTl9DTE9TRSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZjLnRyeUxvY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIHN1cHBvcnRzTG9ja2luZyA9IGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbgorICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBmaWxlICIgKyB1bmlxdWVGaWxlTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIgaW4gIiArIHdyaXRhYmxlRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IHNldHVwIGZhaWxlZDogdW5hYmxlIHRvIHJ1biB0ZXN0IiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdyaXRhYmxlRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuZXdGaWxlCisgICAgICogQHJldHVybiB0cnVlIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgb3IgY3JlYXRpb24gc3VjY2VlZGVkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjcmVhdGVGaWxlKEZpbGUgbmV3RmlsZSwgYm9vbGVhbiBtYWtlRGlyZWN0b3J5KSB7CisgICAgICAgIGlmIChuZXdGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFrZURpcmVjdG9yeSkgeworICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUubWtkaXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgeworICAgICAgICAgICAgICAgIGlvZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZWN1cnNpdmVseSBkZWxldGUgYWxsIGZpbGVzIHN0YXJ0aW5nIGF0IHNwZWNpZmllZCBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmKSB7CisgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBmb3IgKEZpbGUgYyA6IGYubGlzdEZpbGVzKCkpCisgICAgICAgICAgICAgICAgZGVsZXRlKGMpOworICAgICAgICB9CisgICAgICAgIGlmICghZi5kZWxldGUoKSkKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IHVuYWJsZSB0byBkZWxldGUvY2xlYW51cCB3cml0YWJsZSB0ZXN0IGRpcmVjdG9yeTogIgorICAgICAgICAgICAgICAgICAgICArIGYgKTsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvR29vZC5qYXZhIGIvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvR29vZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTg3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2phdmF4L3htbC9iaW5kL21hcnNoYWwvODAzNjk4MS9Hb29kLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgdGVzdGpheGJjb250ZXh0OworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIDxwPgorICogSmF2YSBjbGFzcyBmb3IgR29vZCBjb21wbGV4IHR5cGUuCisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbgorICogdGhpcyBjbGFzcy4KKyAqCisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9Ikdvb2QiPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2FueSBwcm9jZXNzQ29udGVudHM9J3NraXAnIG1heE9jY3Vycz0iNzAiLz4KKyAqICAgICAgICZsdDsvc2VxdWVuY2U+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIkdvb2QiLCBwcm9wT3JkZXIgPSB7CisgICAgImFueSIKK30pCitwdWJsaWMgY2xhc3MgR29vZCB7CisKKyAgICBAWG1sQW55RWxlbWVudAorICAgIHByb3RlY3RlZCBMaXN0PEVsZW1lbnQ+IGFueTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhCisgICAgICogc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwKKyAgICAgKiBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhCisgICAgICogPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRBbnkoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIG9yZy53M2MuZG9tLkVsZW1lbnQgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmFueTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvamF2YXgveG1sL2JpbmQvbWFyc2hhbC84MDM2OTgxL01haW4uamF2YSBiL3Rlc3QvamF2YXgveG1sL2JpbmQvbWFyc2hhbC84MDM2OTgxL01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkyNTkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSB0ZXN0amF4YmNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLio7CisKKy8qKgorICogPHA+CisgKiBKYXZhIGNsYXNzIGZvciBtYWluIGNvbXBsZXggdHlwZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluCisgKiB0aGlzIGNsYXNzLgorICoKKyAqIDxwcmU+CisgKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibWFpbiI+CisgKiAgICZsdDtjb21wbGV4Q29udGVudD4KKyAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgorICogICAgICAgJmx0O3NlcXVlbmNlPgorICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJSb290IiB0eXBlPSJ7fVJvb3QiLz4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iR29vZCIgdHlwZT0ie31Hb29kIi8+CisgKiAgICAgICAmbHQ7L3NlcXVlbmNlPgorICogICAgICZsdDsvcmVzdHJpY3Rpb24+CisgKiAgICZsdDsvY29tcGxleENvbnRlbnQ+CisgKiAmbHQ7L2NvbXBsZXhUeXBlPgorICogPC9wcmU+CisgKgorICoKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICJtYWluIiwgcHJvcE9yZGVyID0geworICAgICJyb290IiwKKyAgICAiZ29vZCIKK30pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBNYWluIHsKKworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiUm9vdCIsIHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgUm9vdCByb290OworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiR29vZCIsIHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgR29vZCBnb29kOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJvb3QgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUm9vdCB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgUm9vdCBnZXRSb290KCkgeworICAgICAgICByZXR1cm4gcm9vdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcm9vdCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUm9vdCB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb290KFJvb3QgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5yb290ID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdvb2QgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgR29vZCB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgR29vZCBnZXRHb29kKCkgeworICAgICAgICByZXR1cm4gZ29vZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ29vZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgR29vZCB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHb29kKEdvb2QgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5nb29kID0gdmFsdWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L2phdmF4L3htbC9iaW5kL21hcnNoYWwvODAzNjk4MS9PYmplY3RGYWN0b3J5LmphdmEgYi90ZXN0L2phdmF4L3htbC9iaW5kL21hcnNoYWwvODAzNjk4MS9PYmplY3RGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiMmRkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvamF2YXgveG1sL2JpbmQvbWFyc2hhbC84MDM2OTgxL09iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSB0ZXN0amF4YmNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OworCisvKioKKyAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhCisgKiBlbGVtZW50IGludGVyZmFjZSBnZW5lcmF0ZWQgaW4gdGhlIGdlbmVyYXRlZCBwYWNrYWdlLgorICogPHA+CisgKiBBbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5IGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZQorICogSmF2YSByZXByZXNlbnRhdGlvbiBmb3IgWE1MIGNvbnRlbnQuIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIFhNTCBjb250ZW50CisgKiBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHJlcHJlc2VudGluZyB0aGUgYmluZGluZworICogb2Ygc2NoZW1hIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbCBncm91cHMuIEZhY3RvcnkKKyAqIG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuCisgKgorICovCitAWG1sUmVnaXN0cnkKK3B1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2YKKyAgICAgKiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBnZW5lcmF0ZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUm9vdCB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgUm9vdCBjcmVhdGVSb290KCkgeworICAgICAgICByZXR1cm4gbmV3IFJvb3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEdvb2QgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIEdvb2QgY3JlYXRlR29vZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHb29kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBNYWluIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBNYWluIGNyZWF0ZU1haW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgTWFpbigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvUm9vdC5qYXZhIGIvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvUm9vdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmZmNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2phdmF4L3htbC9iaW5kL21hcnNoYWwvODAzNjk4MS9Sb290LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgdGVzdGpheGJjb250ZXh0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogPHA+CisgKiBKYXZhIGNsYXNzIGZvciBSb290IGNvbXBsZXggdHlwZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluCisgKiB0aGlzIGNsYXNzLgorICoKKyAqIDxwcmU+CisgKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iUm9vdCI+CisgKiAgICZsdDtjb21wbGV4Q29udGVudD4KKyAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgorICogICAgICAgJmx0O3NlcXVlbmNlPgorICogICAgICAgICAmbHQ7YW55IHByb2Nlc3NDb250ZW50cz0nc2tpcCcgbWF4T2NjdXJzPSI3MCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICoKKyAqCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiUm9vdCIsIHByb3BPcmRlciA9IHsKKyAgICAiY29udGVudCIKK30pCitwdWJsaWMgY2xhc3MgUm9vdCB7CisKKyAgICBAWG1sTWl4ZWQKKyAgICBAWG1sQW55RWxlbWVudAorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gY29udGVudDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBjb250ZW50IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYQorICAgICAqIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsCisgICAgICogYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYQorICAgICAqIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgY29udGVudCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldENvbnRlbnQoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0ICAgICAge0BsaW5rIG9yZy53M2MuZG9tLkVsZW1lbnQgfQorICAgICAqIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldENvbnRlbnQoKSB7CisgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvVGVzdC5qYXZhIGIvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZWRjZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2phdmF4L3htbC9iaW5kL21hcnNoYWwvODAzNjk4MS9UZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdCBUZXN0LmphdmEKKyAqIEBidWcgODAzNjk4MQorICogQHN1bW1hcnkgSkFYQiBub3QgcHJlc2VydmluZyBmb3JtYXR0aW5nIGR1cmluZyB1bm1hcnNoYWxsaW5nL21hcnNoYWxsaW5nCisgKiBAY29tcGlsZSBHb29kLmphdmEgTWFpbi5qYXZhIE9iamVjdEZhY3RvcnkuamF2YSBSb290LmphdmEKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFRlc3QKKyAqLworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCisvKioKKyAqIFRlc3QgZm9yIG1hcnNoYWxsaW5nIGFuZCB1bm1hcnNoYWxsaW5nIG1peGVkIGFuZCB1bm1peGVkIGNvbnRlbnQKKyAqLworcHVibGljIGNsYXNzIFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz48bWFpbj48Um9vdD5cbiIgKworICAgICAgICAgICAgIiAgICAgICAgPFNvbWVUYWc+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8QUNoaWxkVGFnPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIDxBbm90aGVyQ2hpbGRUYWcvPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIDxBbm90aGVyQ2hpbGRUYWcvPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPC9BQ2hpbGRUYWc+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgIDwvU29tZVRhZz5cbiIgKworICAgICAgICAgICAgIiAgICA8L1Jvb3Q+PEdvb2Q+PFZlcnlHb29kPjxUaGVCZXN0PjxNZWdhU3VwZXIvPjxNZWdhU3VwZXIvPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPC9UaGVCZXN0PlxuIiArCisgICAgICAgICAgICAiICAgICAgICA8L1ZlcnlHb29kPjwvR29vZD48L21haW4+IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBKQVhCQ29udGV4dCBqYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJ0ZXN0amF4YmNvbnRleHQiKTsKKyAgICAgICAgVW5tYXJzaGFsbGVyIHUgPSBqYy5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHUudW5tYXJzaGFsKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLiIpICsgIi90ZXN0LnhtbCIpKTsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBNYXJzaGFsbGVyIG0gPSBqYy5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgICAgIG0ubWFyc2hhbChyZXN1bHQsIHN3KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZDoiICsgRVhQRUNURUQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9ic2VydmVkOiIgKyBzdy50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKCFFWFBFQ1RFRC5lcXVhbHMoc3cudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVubWFyc2hhbC9NYXJzaGFsIGdlbmVyYXRlcyBkaWZmZXJlbnQgY29udGVudCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvdGVzdC54bWwgYi90ZXN0L2phdmF4L3htbC9iaW5kL21hcnNoYWwvODAzNjk4MS90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDAwMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9qYXZheC94bWwvYmluZC9tYXJzaGFsLzgwMzY5ODEvdGVzdC54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPG1haW4+CisgICAgPFJvb3Q+CisgICAgICAgIDxTb21lVGFnPgorICAgICAgICAgICAgPEFDaGlsZFRhZz4KKyAgICAgICAgICAgICAgICA8QW5vdGhlckNoaWxkVGFnLz4KKyAgICAgICAgICAgICAgICA8QW5vdGhlckNoaWxkVGFnLz4KKyAgICAgICAgICAgIDwvQUNoaWxkVGFnPgorICAgICAgICA8L1NvbWVUYWc+CisgICAgPC9Sb290PgorICAgIDxHb29kPgorICAgICAgICA8VmVyeUdvb2Q+CisgICAgICAgICAgICA8VGhlQmVzdD4KKyAgICAgICAgICAgICAgICA8TWVnYVN1cGVyLz4KKyAgICAgICAgICAgICAgICA8TWVnYVN1cGVyLz4KKyAgICAgICAgICAgIDwvVGhlQmVzdD4KKyAgICAgICAgPC9WZXJ5R29vZD4KKyAgICA8L0dvb2Q+Cis8L21haW4+CmRpZmYgLS1naXQgYS90ZXN0L3N1bi9pbnZva2UvdXRpbC9WYWx1ZUNvbnZlcnNpb25zVGVzdC5qYXZhIGIvdGVzdC9zdW4vaW52b2tlL3V0aWwvVmFsdWVDb252ZXJzaW9uc1Rlc3QuamF2YQppbmRleCA3MjZlOTBkLi40ODNhZmI3IDEwMDY0NAotLS0gYS90ZXN0L3N1bi9pbnZva2UvdXRpbC9WYWx1ZUNvbnZlcnNpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3Qvc3VuL2ludm9rZS91dGlsL1ZhbHVlQ29udmVyc2lvbnNUZXN0LmphdmEKQEAgLTI1LDExICsyNSwxMSBAQAogCiBpbXBvcnQgc3VuLmludm9rZS51dGlsLlZhbHVlQ29udmVyc2lvbnM7CiBpbXBvcnQgc3VuLmludm9rZS51dGlsLldyYXBwZXI7CitpbXBvcnQgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVzOwogaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kVHlwZTsKIGltcG9ydCBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZTsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogCkBAIC0zNywyNCArMzcsMTMgQEAKICAqIEBzdW1tYXJ5IHVuaXQgdGVzdHMgZm9yIHZhbHVlLXR5cGUgY29udmVyc2lvbiB1dGlsaXRpZXMKICAqIEBjb21waWxlIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSBWYWx1ZUNvbnZlcnNpb25zVGVzdC5qYXZhCiAgKiBAcnVuIGp1bml0L290aGVydm0gdGVzdC5zdW4uaW52b2tlLnV0aWwuVmFsdWVDb252ZXJzaW9uc1Rlc3QKLSAqIEBydW4ganVuaXQvb3RoZXJ2bQotICogICAgICAgICAgLURWYWx1ZUNvbnZlcnNpb25zVGVzdC5NQVhfQVJJVFk9MjU1IC1EVmFsdWVDb252ZXJzaW9uc1Rlc3QuU1RBUlRfQVJJVFk9MjUwCi0gKiAgICAgICAgICAgICAgdGVzdC5zdW4uaW52b2tlLnV0aWwuVmFsdWVDb252ZXJzaW9uc1Rlc3QKICAqLwogCi0vLyBUaGlzIG1pZ2h0IHRha2UgYSB3aGlsZSBhbmQgYnVybiBsb3RzIG9mIG1ldGFkYXRhOgotLy8gQHJ1biBqdW5pdC9vdGhlcnZtIC1EVmFsdWVDb252ZXJzaW9uc1Rlc3QuTUFYX0FSSVRZPTI1NSAtRFZhbHVlQ29udmVyc2lvbnNUZXN0LkVYSEFVU1RJVkU9dHJ1ZSB0ZXN0LnN1bi5pbnZva2UudXRpbC5WYWx1ZUNvbnZlcnNpb25zVGVzdAotCiAvKioKICAqCiAgKiBAYXV0aG9yIGpyb3NlCiAgKi8KIHB1YmxpYyBjbGFzcyBWYWx1ZUNvbnZlcnNpb25zVGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQ0xBU1MgPSBWYWx1ZUNvbnZlcnNpb25zVGVzdC5jbGFzczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FSSVRZID0gSW50ZWdlci5nZXRJbnRlZ2VyKENMQVNTLmdldFNpbXBsZU5hbWUoKSsiLk1BWF9BUklUWSIsIDQwKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfQVJJVFkgPSBJbnRlZ2VyLmdldEludGVnZXIoQ0xBU1MuZ2V0U2ltcGxlTmFtZSgpKyIuU1RBUlRfQVJJVFkiLCAwKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYSEFVU1RJVkUgPSBCb29sZWFuLmdldEJvb2xlYW4oQ0xBU1MuZ2V0U2ltcGxlTmFtZSgpKyIuRVhIQVVTVElWRSIpOwotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5ib3goKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgdGVzdFVuYm94KGZhbHNlKTsKQEAgLTY2LDkgKzU1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGVzdFVuYm94KGJvb2xlYW4gZG9DYXN0KSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInVuYm94Iik7CiAgICAgICAgIGZvciAoV3JhcHBlciBkc3QgOiBXcmFwcGVyLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihkc3QpOwogICAgICAgICAgICAgZm9yIChXcmFwcGVyIHNyYyA6IFdyYXBwZXIudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICB0ZXN0VW5ib3goZG9DYXN0LCBkc3QsIHNyYyk7CiAgICAgICAgICAgICB9CkBAIC03OCw2ICs2NSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RVbmJveChib29sZWFuIGRvQ2FzdCwgV3JhcHBlciBkc3QsIFdyYXBwZXIgc3JjKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgYm9vbGVhbiBleHBlY3RUaHJvdyA9ICFkb0Nhc3QgJiYgIWRzdC5pc0NvbnZlcnRpYmxlRnJvbShzcmMpOwogICAgICAgICBpZiAoZHN0ID09IFdyYXBwZXIuT0JKRUNUIHx8IHNyYyA9PSBXcmFwcGVyLk9CSkVDVCkgIHJldHVybjsgIC8vIG11c3QgaGF2ZSBwcmltcworICAgICAgICBpZiAoZHN0ID09IFdyYXBwZXIuVk9JRCAgIHx8IHNyYyA9PSBXcmFwcGVyLlZPSUQgICkgIHJldHVybjsgIC8vIG11c3QgaGF2ZSB2YWx1ZXMKICAgICAgICAgaWYgKGRzdCA9PSBXcmFwcGVyLk9CSkVDVCkKICAgICAgICAgICAgIGV4cGVjdFRocm93ID0gZmFsc2U7ICAvLyBldmVyeXRoaW5nIChldmVuIFZPSUQ9PW51bGwgaGVyZSkgY29udmVydHMgdG8gT0JKRUNUCiAgICAgICAgIHRyeSB7CkBAIC05MSw5ICs3OSw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIE1ldGhvZEhhbmRsZSB1bmJveGVyOwogICAgICAgICAgICAgICAgIGlmIChkb0Nhc3QpCi0gICAgICAgICAgICAgICAgICAgIHVuYm94ZXIgPSBWYWx1ZUNvbnZlcnNpb25zLnVuYm94Q2FzdChkc3QucHJpbWl0aXZlVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdW5ib3hlciA9IFZhbHVlQ29udmVyc2lvbnMudW5ib3hDYXN0KGRzdCk7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB1bmJveGVyID0gVmFsdWVDb252ZXJzaW9ucy51bmJveChkc3QucHJpbWl0aXZlVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdW5ib3hlciA9IFZhbHVlQ29udmVyc2lvbnMudW5ib3hXaWRlbihkc3QpOwogICAgICAgICAgICAgICAgIE9iamVjdCBleHBSZXN1bHQgPSAoYm94ID09IG51bGwpID8gZHN0Lnplcm8oKSA6IGRzdC53cmFwKGJveCk7CiAgICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChkc3QpIHsKQEAgLTEwNCw5ICs5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0hBUjogICAgcmVzdWx0ID0gKGNoYXIpICAgIHVuYm94ZXIuaW52b2tlRXhhY3QoYm94KTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQllURTogICAgcmVzdWx0ID0gKGJ5dGUpICAgIHVuYm94ZXIuaW52b2tlRXhhY3QoYm94KTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0hPUlQ6ICAgcmVzdWx0ID0gKHNob3J0KSAgIHVuYm94ZXIuaW52b2tlRXhhY3QoYm94KTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT0JKRUNUOiAgcmVzdWx0ID0gKE9iamVjdCkgIHVuYm94ZXIuaW52b2tlRXhhY3QoYm94KTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQk9PTEVBTjogcmVzdWx0ID0gKGJvb2xlYW4pIHVuYm94ZXIuaW52b2tlRXhhY3QoYm94KTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVk9JRDogICAgcmVzdWx0ID0gbnVsbDsgICAgIHVuYm94ZXIuaW52b2tlRXhhY3QoYm94KTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChleHBlY3RUaHJvdykgewogICAgICAgICAgICAgICAgICAgICBleHBSZXN1bHQgPSAiKG5lZWQgYW4gZXhjZXB0aW9uKSI7CkBAIC0xMjMsMjUgKzEwOSwyMyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qm94KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJib3giKTsKICAgICAgICAgZm9yIChXcmFwcGVyIHcgOiBXcmFwcGVyLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAodyA9PSBXcmFwcGVyLlZPSUQpICBjb250aW51ZTsgIC8vIHNraXAgdGhpczsgbm8gdW5ib3hlZCBmb3JtCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbih3KTsKKyAgICAgICAgICAgIGlmICh3ID09IFdyYXBwZXIuVk9JRCkgICAgY29udGludWU7ICAvLyBza2lwIHRoaXM7IG5vIHVuYm94ZWQgZm9ybQorICAgICAgICAgICAgaWYgKHcgPT0gV3JhcHBlci5PQkpFQ1QpICBjb250aW51ZTsgIC8vIHNraXAgdGhpczsgYWxyZWFkeSB1bmJveGVkCiAgICAgICAgICAgICBmb3IgKGludCBuID0gLTU7IG4gPCAxMDsgbisrKSB7CiAgICAgICAgICAgICAgICAgT2JqZWN0IGJveCA9IHcud3JhcChuKTsKLSAgICAgICAgICAgICAgICBNZXRob2RIYW5kbGUgYm94ZXIgPSBWYWx1ZUNvbnZlcnNpb25zLmJveCh3LnByaW1pdGl2ZVR5cGUoKSk7CisgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGJveGVyID0gVmFsdWVDb252ZXJzaW9ucy5ib3hFeGFjdCh3KTsKICAgICAgICAgICAgICAgICBPYmplY3QgZXhwUmVzdWx0ID0gYm94OwogICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwogICAgICAgICAgICAgICAgIHN3aXRjaCAodykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIElOVDogICAgIHJlc3VsdCA9IGJveGVyLmludm9rZUV4YWN0KC8qaW50Ki9uKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTE9ORzogICAgcmVzdWx0ID0gYm94ZXIuaW52b2tlRXhhY3QoKGxvbmcpbik7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZMT0FUOiAgIHJlc3VsdCA9IGJveGVyLmludm9rZUV4YWN0KChmbG9hdCluKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOiAgcmVzdWx0ID0gYm94ZXIuaW52b2tlRXhhY3QoKGRvdWJsZSluKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0hBUjogICAgcmVzdWx0ID0gYm94ZXIuaW52b2tlRXhhY3QoKGNoYXIpbik7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJZVEU6ICAgIHJlc3VsdCA9IGJveGVyLmludm9rZUV4YWN0KChieXRlKW4pOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTSE9SVDogICByZXN1bHQgPSBib3hlci5pbnZva2VFeGFjdCgoc2hvcnQpbik7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9CSkVDVDogIHJlc3VsdCA9IGJveGVyLmludm9rZUV4YWN0KChPYmplY3Qpbik7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46IHJlc3VsdCA9IGJveGVyLmludm9rZUV4YWN0KChuICYgMSkgIT0gMCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIElOVDogICAgIHJlc3VsdCA9IChJbnRlZ2VyKSBib3hlci5pbnZva2VFeGFjdCgvKmludCovbik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExPTkc6ICAgIHJlc3VsdCA9IChMb25nKSAgICBib3hlci5pbnZva2VFeGFjdCgobG9uZyluKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxPQVQ6ICAgcmVzdWx0ID0gKEZsb2F0KSAgIGJveGVyLmludm9rZUV4YWN0KChmbG9hdCluKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOiAgcmVzdWx0ID0gKERvdWJsZSkgIGJveGVyLmludm9rZUV4YWN0KChkb3VibGUpbik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENIQVI6ICAgIHJlc3VsdCA9IChDaGFyYWN0ZXIpIGJveGVyLmludm9rZUV4YWN0KChjaGFyKW4pOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCWVRFOiAgICByZXN1bHQgPSAoQnl0ZSkgICAgYm94ZXIuaW52b2tlRXhhY3QoKGJ5dGUpbik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNIT1JUOiAgIHJlc3VsdCA9IChTaG9ydCkgICBib3hlci5pbnZva2VFeGFjdCgoc2hvcnQpbik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46IHJlc3VsdCA9IChCb29sZWFuKSBib3hlci5pbnZva2VFeGFjdCgobiAmIDEpICE9IDApOyBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIoZHN0LHNyYyxuLGJveCk9IitBcnJheXMuYXNMaXN0KHcsdyxuLGJveCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cFJlc3VsdCwgcmVzdWx0KTsKQEAgLTE1MSwxNiArMTM1LDE0IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjYXN0Iik7CiAgICAgICAgIENsYXNzPD8+W10gdHlwZXMgPSB7IE9iamVjdC5jbGFzcywgU2VyaWFsaXphYmxlLmNsYXNzLCBTdHJpbmcuY2xhc3MsIE51bWJlci5jbGFzcywgSW50ZWdlci5jbGFzcyB9OwogICAgICAgICBPYmplY3RbXSBvYmplY3RzID0geyBuZXcgT2JqZWN0KCksIEJvb2xlYW4uRkFMU0UsICAgICAgImhlbGxvIiwgICAgICAoTG9uZykxMkwsICAgIChJbnRlZ2VyKTYgICAgfTsKICAgICAgICAgZm9yIChDbGFzczw/PiBkc3QgOiB0eXBlcykgewotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGNhc3RlciA9IFZhbHVlQ29udmVyc2lvbnMuY2FzdChkc3QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhc3Rlci50eXBlKCksIFZhbHVlQ29udmVyc2lvbnMuaWRlbnRpdHkoKS50eXBlKCkpOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGNhc3RlciA9IFZhbHVlQ29udmVyc2lvbnMuY2FzdCgpLmJpbmRUbyhkc3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhc3Rlci50eXBlKCksIE1ldGhvZEhhbmRsZXMuaWRlbnRpdHkoT2JqZWN0LmNsYXNzKS50eXBlKCkpOwogICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogb2JqZWN0cykgewogICAgICAgICAgICAgICAgIENsYXNzPD8+IHNyYyA9IG9iai5nZXRDbGFzcygpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FuQ2FzdCA9IGRzdC5pc0Fzc2lnbmFibGVGcm9tKHNyYyk7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm9iaj0iK29iaisiIDw6IGRzdD0iK2RzdCsoY2FuQ2FzdCA/ICIgKE9LKSIgOiAiICh3aWxsIGZhaWwpIikpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXN0ZXIuaW52b2tlRXhhY3Qob2JqKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkNhc3QpCkBAIC0xNzYsMjUgKzE1OCwxMiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElkZW50aXR5KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpZGVudGl0eSIpOwotICAgICAgICBNZXRob2RIYW5kbGUgaWQgPSBWYWx1ZUNvbnZlcnNpb25zLmlkZW50aXR5KCk7Ci0gICAgICAgIE9iamVjdCBleHBSZXN1bHQgPSAiZm9vIjsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGlkLmludm9rZUV4YWN0KGV4cFJlc3VsdCk7Ci0gICAgICAgIC8vIGNvbXBpbGVyIGJ1ZzogIFZhbHVlQ29udmVyc2lvbnMuaWRlbnRpdHkoKS5pbnZva2VFeGFjdCgiYmFyIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY29udmVydCIpOwogICAgICAgICBmb3IgKGxvbmcgdHZhbCA9IDAsIGN0ciA9IDA7OykgewogICAgICAgICAgICAgaWYgKCsrY3RyID4gOTk5OTkpICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoInRvbyBtYW55IHRlc3QgdmFsdWVzIik7Ci0gICAgICAgICAgICAvLyBuZXh0IHRlc3QgdmFsdWU6Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihMb25nLnRvSGV4U3RyaW5nKHR2YWwpKTsgLy8gcHJpbnRzIDM3NzYgdGVzdCBwYXR0ZXJucworICAgICAgICAgICAgLy8gcHJpbnRzIDM3NzYgdGVzdCBwYXR0ZXJucyAoMzc3NiA9IDgqNTkqOCkKICAgICAgICAgICAgIHR2YWwgPSBuZXh0VGVzdFZhbHVlKHR2YWwpOwogICAgICAgICAgICAgaWYgKHR2YWwgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0IHZhbHVlIGNvdW50ID0gIitjdHIpOyAgLy8gMzc3NiA9IDgqNTkqOAogICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gcmVwZWF0CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwNSwxNSArMTc0LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIHZvaWQgdGVzdENvbnZlcnQoV3JhcHBlciBzcmMsIFdyYXBwZXIgZHN0LCBsb25nIHR2YWwpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihzcmMrIiA9PiAiK2RzdCk7CisgICAgICAgIGlmIChkc3QgPT0gV3JhcHBlci5PQkpFQ1QgfHwgc3JjID09IFdyYXBwZXIuT0JKRUNUKSAgcmV0dXJuOyAgLy8gbXVzdCBoYXZlIHByaW1zCisgICAgICAgIGlmIChkc3QgPT0gV3JhcHBlci5WT0lEICAgfHwgc3JjID09IFdyYXBwZXIuVk9JRCAgKSAgcmV0dXJuOyAgLy8gbXVzdCBoYXZlIHZhbHVlcwogICAgICAgICBib29sZWFuIHRlc3RTaW5nbGVDYXNlID0gKHR2YWwgIT0gMCk7CiAgICAgICAgIGZpbmFsIGxvbmcgdHZhbEluaXQgPSB0dmFsOwogICAgICAgICBNZXRob2RIYW5kbGUgY29udiA9IFZhbHVlQ29udmVyc2lvbnMuY29udmVydFByaW1pdGl2ZShzcmMsIGRzdCk7Ci0gICAgICAgIE1ldGhvZFR5cGUgY29udlR5cGU7Ci0gICAgICAgIGlmIChzcmMgPT0gV3JhcHBlci5WT0lEKQotICAgICAgICAgICAgY29udlR5cGUgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUoZHN0LnByaW1pdGl2ZVR5cGUoKSAvKiAsIHZvaWQgKi8pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb252VHlwZSA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShkc3QucHJpbWl0aXZlVHlwZSgpLCBzcmMucHJpbWl0aXZlVHlwZSgpKTsKKyAgICAgICAgTWV0aG9kVHlwZSBjb252VHlwZSA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShkc3QucHJpbWl0aXZlVHlwZSgpLCBzcmMucHJpbWl0aXZlVHlwZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnZUeXBlLCBjb252LnR5cGUoKSk7CiAgICAgICAgIE1ldGhvZEhhbmRsZSBjb252ZXJ0ZXIgPSBjb252LmFzVHlwZShjb252LnR5cGUoKS5jaGFuZ2VSZXR1cm5UeXBlKE9iamVjdC5jbGFzcykpOwogICAgICAgICBmb3IgKDs7KSB7CkBAIC0yMjksOSArMTk1LDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIENIQVI6ICAgIHJlc3VsdCA9IGNvbnZlcnRlci5pbnZva2VFeGFjdCgoY2hhciluKTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBCWVRFOiAgICByZXN1bHQgPSBjb252ZXJ0ZXIuaW52b2tlRXhhY3QoKGJ5dGUpbik7IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0hPUlQ6ICAgcmVzdWx0ID0gY29udmVydGVyLmludm9rZUV4YWN0KChzaG9ydCluKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPQkpFQ1Q6ICByZXN1bHQgPSBjb252ZXJ0ZXIuaW52b2tlRXhhY3QoKE9iamVjdCluKTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBCT09MRUFOOiByZXN1bHQgPSBjb252ZXJ0ZXIuaW52b2tlRXhhY3QoKG4gJiAxKSAhPSAwKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWT0lEOiAgICByZXN1bHQgPSBjb252ZXJ0ZXIuaW52b2tlRXhhY3QoKTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDogIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIoc3JjLGRzdCxuLHRlc3RWYWx1ZSk9IitBcnJheXMuYXNMaXN0KHNyYyxkc3QsIjB4IitMb25nLnRvSGV4U3RyaW5nKG4pLHRlc3RWYWx1ZSksCkBAIC0yNjksMTY5ICsyMzMsNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0d2Vha1NpZ24odXgpOwogICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZhcmFyZ3NBcnJheSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigidmFyYXJnc0FycmF5Iik7Ci0gICAgICAgIGZpbmFsIGludCBNSU4gPSBTVEFSVF9BUklUWTsKLSAgICAgICAgZmluYWwgaW50IE1BWCA9IE1BWF9BUklUWS0yOyAgLy8gMjUzKzEgd291bGQgY2F1c2UgcGFyYW1ldGVyIG92ZXJmbG93IHdpdGggJ3RoaXMnIGFkZGVkCi0gICAgICAgIGZvciAoaW50IG5hcmdzID0gTUlOOyBuYXJncyA8PSBNQVg7IG5hcmdzID0gbmV4dEFyZ0NvdW50KG5hcmdzLCAxNywgTUFYKSkgewotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHRhcmdldCA9IFZhbHVlQ29udmVyc2lvbnMudmFyYXJnc0FycmF5KG5hcmdzKTsKLSAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W25hcmdzXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLSAgICAgICAgICAgICAgICBhcmdzW2ldID0gIiMiK2k7Ci0gICAgICAgICAgICBPYmplY3QgcmVzID0gdGFyZ2V0Lmludm9rZVdpdGhBcmd1bWVudHMoYXJncyk7Ci0gICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhhcmdzLCAoT2JqZWN0W10pcmVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZhcmFyZ3NSZWZlcmVuY2VBcnJheSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigidmFyYXJnc1JlZmVyZW5jZUFycmF5Iik7Ci0gICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShPYmplY3RbXS5jbGFzcyk7Ci0gICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShTdHJpbmdbXS5jbGFzcyk7Ci0gICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShOdW1iZXJbXS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyYXJnc1ByaW1pdGl2ZUFycmF5KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJ2YXJhcmdzUHJpbWl0aXZlQXJyYXkiKTsKLSAgICAgICAgdGVzdFR5cGVkVmFyYXJnc0FycmF5KGludFtdLmNsYXNzKTsKLSAgICAgICAgdGVzdFR5cGVkVmFyYXJnc0FycmF5KGxvbmdbXS5jbGFzcyk7Ci0gICAgICAgIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShieXRlW10uY2xhc3MpOwotICAgICAgICB0ZXN0VHlwZWRWYXJhcmdzQXJyYXkoYm9vbGVhbltdLmNsYXNzKTsKLSAgICAgICAgdGVzdFR5cGVkVmFyYXJnc0FycmF5KHNob3J0W10uY2xhc3MpOwotICAgICAgICB0ZXN0VHlwZWRWYXJhcmdzQXJyYXkoY2hhcltdLmNsYXNzKTsKLSAgICAgICAgdGVzdFR5cGVkVmFyYXJnc0FycmF5KGZsb2F0W10uY2xhc3MpOwotICAgICAgICB0ZXN0VHlwZWRWYXJhcmdzQXJyYXkoZG91YmxlW10uY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBuZXh0QXJnQ291bnQoaW50IG5hcmdzLCBpbnQgZGVuc2l0eSwgaW50IE1BWCkgewotICAgICAgICBpZiAoRVhIQVVTVElWRSkgIHJldHVybiBuYXJncyArIDE7Ci0gICAgICAgIGlmIChuYXJncyA+PSBNQVgpICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGludCBCT1QgPSAyMCwgVE9QID0gTUFYLTU7Ci0gICAgICAgIGlmIChkZW5zaXR5IDwgMTApIHsgQk9UID0gMTA7IE1BWCA9IFRPUC0yOyB9Ci0gICAgICAgIGlmIChuYXJncyA8PSBCT1QgfHwgbmFyZ3MgPj0gVE9QKSB7Ci0gICAgICAgICAgICArK25hcmdzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGJ1bXAgPSBNYXRoLm1heCgxLCAxMDAgLyBkZW5zaXR5KTsKLSAgICAgICAgICAgIG5hcmdzICs9IGJ1bXA7Ci0gICAgICAgICAgICBpZiAobmFyZ3MgPiBUT1ApICBuYXJncyA9IFRPUDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFyZ3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RUeXBlZFZhcmFyZ3NBcnJheShDbGFzczw/PiBhcnJheVR5cGUpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihhcnJheVR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgQ2xhc3M8Pz4gZWxlbVR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICBpbnQgTUlOID0gU1RBUlRfQVJJVFk7Ci0gICAgICAgIGludCBNQVggPSBNQVhfQVJJVFktMjsgIC8vIDI1MysxIHdvdWxkIGNhdXNlIHBhcmFtZXRlciBvdmVyZmxvdyB3aXRoICd0aGlzJyBhZGRlZAotICAgICAgICBpbnQgZGVuc2l0eSA9IDM7Ci0gICAgICAgIGlmIChlbGVtVHlwZSA9PSBpbnQuY2xhc3MgfHwgZWxlbVR5cGUgPT0gbG9uZy5jbGFzcykgIGRlbnNpdHkgPSA3OwotICAgICAgICBpZiAoZWxlbVR5cGUgPT0gbG9uZy5jbGFzcyB8fCBlbGVtVHlwZSA9PSBkb3VibGUuY2xhc3MpIHsgTUFYIC89IDI7IE1JTiAvPSAyOyB9Ci0gICAgICAgIGZvciAoaW50IG5hcmdzID0gTUlOOyBuYXJncyA8PSBNQVg7IG5hcmdzID0gbmV4dEFyZ0NvdW50KG5hcmdzLCBkZW5zaXR5LCBNQVgpKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbWFrZVRlc3RBcnJheShlbGVtVHlwZSwgbmFyZ3MpOwotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHZhcmFyZ3NBcnJheSA9IFZhbHVlQ29udmVyc2lvbnMudmFyYXJnc0FycmF5KGFycmF5VHlwZSwgbmFyZ3MpOwotICAgICAgICAgICAgTWV0aG9kVHlwZSB2YVR5cGUgPSB2YXJhcmdzQXJyYXkudHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5VHlwZSwgdmFUeXBlLnJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAobmFyZ3MgIT0gMCkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbGVtVHlwZSwgdmFUeXBlLnBhcmFtZXRlclR5cGUoMCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbGVtVHlwZSwgdmFUeXBlLnBhcmFtZXRlclR5cGUodmFUeXBlLnBhcmFtZXRlckNvdW50KCktMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1ldGhvZFR5cGUubWV0aG9kVHlwZShhcnJheVR5cGUsIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5uQ29waWVzKG5hcmdzLCBlbGVtVHlwZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhVHlwZSk7Ci0gICAgICAgICAgICBPYmplY3QgcmVzID0gdmFyYXJnc0FycmF5Lmludm9rZVdpdGhBcmd1bWVudHMoYXJncyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzU3RyaW5nID0gdG9BcnJheVN0cmluZyhyZXMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhhcmdzKSwgcmVzU3RyaW5nKTsKLQotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHNwcmVhZGVyID0gdmFyYXJnc0FycmF5LmFzU3ByZWFkZXIoYXJyYXlUeXBlLCBuYXJncyk7Ci0gICAgICAgICAgICBNZXRob2RUeXBlIHN0eXBlID0gc3ByZWFkZXIudHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0KHN0eXBlID09IE1ldGhvZFR5cGUubWV0aG9kVHlwZShhcnJheVR5cGUsIGFycmF5VHlwZSkpOwotICAgICAgICAgICAgaWYgKG5hcmdzIDw9IDUpIHsKLSAgICAgICAgICAgICAgICAvLyBpbnZva2UgdGFyZ2V0IGFzIGEgc3ByZWFkZXIgYWxzbzoKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCi0gICAgICAgICAgICAgICAgT2JqZWN0IHJlczIgPSBzcHJlYWRlci5pbnZva2VXaXRoQXJndW1lbnRzKChPYmplY3QpcmVzKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzMlN0cmluZyA9IHRvQXJyYXlTdHJpbmcocmVzMik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhhcmdzKSwgcmVzMlN0cmluZyk7Ci0gICAgICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBzcHJlYWRlciBvbiBhIGdlbmVyaWMgT2JqZWN0W10gYXJyYXk7IGNoZWNrIGZvciBlcnJvcgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXMzID0gc3ByZWFkZXIuaW52b2tlV2l0aEFyZ3VtZW50cygoT2JqZWN0KWFyZ3MpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzM1N0cmluZyA9IHRvQXJyYXlTdHJpbmcocmVzMyk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYXJyYXlUeXBlLmdldE5hbWUoKSwgYXJyYXlUeXBlLmlzQXNzaWduYWJsZUZyb20oT2JqZWN0W10uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy50b1N0cmluZyhhcmdzKSwgcmVzM1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFycmF5VHlwZS5nZXROYW1lKCksIGFycmF5VHlwZS5pc0Fzc2lnbmFibGVGcm9tKE9iamVjdFtdLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hcmdzID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpbnZva2Ugc3ByZWFkZXIgb24gbnVsbCBhcmdsaXN0Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlczMgPSBzcHJlYWRlci5pbnZva2VXaXRoQXJndW1lbnRzKChPYmplY3QpbnVsbCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlczNTdHJpbmcgPSB0b0FycmF5U3RyaW5nKHJlczMpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMudG9TdHJpbmcoYXJncyksIHJlczNTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gbWFrZVRlc3RBcnJheShDbGFzczw/PiBlbGVtVHlwZSwgaW50IGxlbikgewotICAgICAgICBXcmFwcGVyIGVsZW0gPSBudWxsOwotICAgICAgICBpZiAoZWxlbVR5cGUuaXNQcmltaXRpdmUoKSkKLSAgICAgICAgICAgIGVsZW0gPSBXcmFwcGVyLmZvclByaW1pdGl2ZVR5cGUoZWxlbVR5cGUpOwotICAgICAgICBlbHNlIGlmIChXcmFwcGVyLmlzV3JhcHBlclR5cGUoZWxlbVR5cGUpKQotICAgICAgICAgICAgZWxlbSA9IFdyYXBwZXIuZm9yV3JhcHBlclR5cGUoZWxlbVR5cGUpOwotICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtsZW5dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgYXJnID0gaSAqIDEwMDsKLSAgICAgICAgICAgIGlmIChlbGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbVR5cGUgPT0gU3RyaW5nLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICBhcmcgPSAiIyIrYXJnOwotICAgICAgICAgICAgICAgIGFyZyA9IGVsZW1UeXBlLmNhc3QoYXJnKTsgIC8vIGp1c3QgdG8gbWFrZSBzdXJlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoZWxlbSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46IGFyZyA9IChpICUgMyA9PSAwKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENIQVI6ICAgIGFyZyA9ICdhJyArIGk7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIExPTkc6ICAgIGFyZyA9IChsb25nKWkgKiAxMDAwXzAwMF8wMDA7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZMT0FUOiAgIGFyZyA9IChmbG9hdClpIC8gMTAwOyAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERPVUJMRTogIGFyZyA9IChkb3VibGUpaSAvIDEwMDBfMDAwOyAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcmcgPSBlbGVtLmNhc3QoYXJnLCBlbGVtVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzW2ldID0gYXJnOwotICAgICAgICB9Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGVsZW1UeXBlLmdldE5hbWUoKStBcnJheXMudG9TdHJpbmcoYXJncykpOwotICAgICAgICByZXR1cm4gYXJnczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9BcnJheVN0cmluZyhPYmplY3QgYSkgewotICAgICAgICBpZiAoYSA9PSBudWxsKSAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgQ2xhc3M8Pz4gZWxlbVR5cGUgPSBhLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICBpZiAoZWxlbVR5cGUgPT0gbnVsbCkgIHJldHVybiBhLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChlbGVtVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKFdyYXBwZXIuZm9yUHJpbWl0aXZlVHlwZShlbGVtVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIElOVDogICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChpbnRbXSlhKTsKLSAgICAgICAgICAgICAgICBjYXNlIEJZVEU6ICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChieXRlW10pYSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBCT09MRUFOOiAgcmV0dXJuIEFycmF5cy50b1N0cmluZygoYm9vbGVhbltdKWEpOwotICAgICAgICAgICAgICAgIGNhc2UgU0hPUlQ6ICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKHNob3J0W10pYSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBDSEFSOiAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZygoY2hhcltdKWEpOwotICAgICAgICAgICAgICAgIGNhc2UgRkxPQVQ6ICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKGZsb2F0W10pYSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBMT05HOiAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZygobG9uZ1tdKWEpOwotICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOiAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKGRvdWJsZVtdKWEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKE9iamVjdFtdKWEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZhcmFyZ3NMaXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJ2YXJhcmdzTGlzdCIpOwotICAgICAgICBmaW5hbCBpbnQgTUlOID0gU1RBUlRfQVJJVFk7Ci0gICAgICAgIGZpbmFsIGludCBNQVggPSBNQVhfQVJJVFktMjsgIC8vIDI1MysxIHdvdWxkIGNhdXNlIHBhcmFtZXRlciBvdmVyZmxvdyB3aXRoICd0aGlzJyBhZGRlZAotICAgICAgICBmb3IgKGludCBuYXJncyA9IE1JTjsgbmFyZ3MgPD0gTUFYOyBuYXJncyA9IG5leHRBcmdDb3VudChuYXJncywgNywgTUFYKSkgewotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHRhcmdldCA9IFZhbHVlQ29udmVyc2lvbnMudmFyYXJnc0xpc3QobmFyZ3MpOwotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbbmFyZ3NdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSAiIyIraTsKLSAgICAgICAgICAgIE9iamVjdCByZXMgPSB0YXJnZXQuaW52b2tlV2l0aEFyZ3VtZW50cyhhcmdzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KGFyZ3MpLCByZXMpOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YSBiL3Rlc3Qvc3VuL3RleHQvcmVzb3VyY2VzL0xvY2FsZURhdGEKaW5kZXggOTM2NTk4OS4uOWRjYTkzYiAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YQorKysgYi90ZXN0L3N1bi90ZXh0L3Jlc291cmNlcy9Mb2NhbGVEYXRhCkBAIC03Njk5LDMgKzc2OTksNiBAQAogIyBidWcgODAzNzM0MwogRm9ybWF0RGF0YS9lc19ETy9EYXRlUGF0dGVybnMvMj1kZC9NTS95eXl5CiBGb3JtYXREYXRhL2VzX0RPL0RhdGVQYXR0ZXJucy8zPWRkL01NL3l5CisKKyMgYnVnIDgwNTUyMjIKK0N1cnJlbmN5TmFtZXMvbHRfTFQvRVVSPVx1MjBBQwpkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YVRlc3QuamF2YSBiL3Rlc3Qvc3VuL3RleHQvcmVzb3VyY2VzL0xvY2FsZURhdGFUZXN0LmphdmEKaW5kZXggZTcyNDVlNi4uZTJjZWExYSAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YVRlc3QuamF2YQorKysgYi90ZXN0L3N1bi90ZXh0L3Jlc291cmNlcy9Mb2NhbGVEYXRhVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzYsNyArMzYsNyBAQAogICogICAgICA2OTE5NjI0IDY5OTgzOTEgNzAxOTI2NyA3MDIwOTYwIDcwMjU4MzcgNzAyMDU4MyA3MDM2OTA1IDcwNjYyMDMgNzEwMTQ5NQogICogICAgICA3MDAzMTI0IDcwODU3NTcgNzAyODA3MyA3MTcxMDI4IDcxODk2MTEgODAwMDk4MyA3MTk1NzU5IDgwMDQ0ODkgODAwNjUwOQogICogICAgICA3MTE0MDUzIDcwNzQ4ODIgNzA0MDU1NiA4MDEzODM2IDgwMjExMjEgNjE5MjQwNyA2OTMxNTY0IDgwMjc2OTUgNzA5MDgyNgotICogICAgICA4MDE3MTQyIDgwMzczNDMKKyAqICAgICAgODAxNzE0MiA4MDM3MzQzIDgwNTUyMjIKICAqIEBzdW1tYXJ5IFZlcmlmeSBsb2NhbGUgZGF0YQogICoKICAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdG9vbHMvanJ1bnNjcmlwdC9qcnVuc2NyaXB0VGVzdC5zaCBiL3Rlc3Qvc3VuL3Rvb2xzL2pydW5zY3JpcHQvanJ1bnNjcmlwdFRlc3Quc2gKaW5kZXggOTIxNTI0Yi4uYWI0Y2IxNiAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdG9vbHMvanJ1bnNjcmlwdC9qcnVuc2NyaXB0VGVzdC5zaAorKysgYi90ZXN0L3N1bi90b29scy9qcnVuc2NyaXB0L2pydW5zY3JpcHRUZXN0LnNoCkBAIC00Miw3ICs0Miw3IEBACiBybSAtZiBqcnVuc2NyaXB0VGVzdC5vdXQgMj4vZGV2L251bGwKICR7SlJVTlNDUklQVH0gLUotRGphdmEuYXd0LmhlYWRsZXNzPXRydWUgLWwgbmFzaG9ybiA+IGpydW5zY3JpcHRUZXN0Lm91dCAyPiYxIDw8RU9GCiB2ID0gMiArIDU7Ci12ICo9IDU7Cit2ICo9IDU7IHYuZG91YmxlVmFsdWUoKTsKIHYgPSB2ICsgIiBpcyB0aGUgdmFsdWUiOwogaWYgKHYgIT0gMCkgeyBwcmludGxuKCd5ZXMgdiAhPSAwJyk7IH0KIGphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oJ2hlbGxvIHdvcmxkIGZyb20gc2NyaXB0Jyk7CmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9WRVJTSU9OIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvVkVSU0lPTgppbmRleCBjNzM1YmU1Li41ZTkyNWFkIDEwMDY0NAotLS0gYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9WRVJTSU9OCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL1ZFUlNJT04KQEAgLTEsMjQgKzEsMjQgQEAKICMKICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotIyAgCisjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwogIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiAjIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotIyAgCisjCiAjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CiAjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jICAKKyMKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgogIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSMgIAorIwogIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLXR6ZGF0YTIwMTRjCit0emRhdGEyMDE0ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYWZyaWNhIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYWZyaWNhCmluZGV4IDZmMWExNDcuLmFhOTFmMzYgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2FmcmljYQorKysgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hZnJpY2EKQEAgLTIxLDEzICsyMSwxMyBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIFRoaXMgZmlsZSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAogIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KKyMgdHpAaWFuYS5vcmcgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLiAgRm9yIG1vcmUsIHBsZWFzZSBzZWUKKyMgdGhlIGZpbGUgQ09OVFJJQlVUSU5HIGluIHRoZSB0eiBkaXN0cmlidXRpb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0wMi0yMSk6CiAjCkBAIC00OSw4ICs0OSw4IEBACiAjIEkgZm91bmQgaW4gdGhlIFVDTEEgbGlicmFyeS4KICMKICMgRm9yIGRhdGEgY2lyY2EgMTg5OSwgYSBjb21tb24gc291cmNlIGlzOgotIyBNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQKLSMgPGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5Pi4KKyMgTWlsbmUgSi4gQ2l2aWwgdGltZS4gR2VvZ3IgSi4gMTg5OSBGZWI7MTMoMik6MTczLTk0LgorIyBodHRwOi8vd3d3LmpzdG9yLm9yZy9zdGFibGUvMTc3NDM1OQogIwogIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKICMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCkBAIC01OCwxMyArNTgsMTMgQEAKICMgUHJldmlvdXMgZWRpdGlvbnMgb2YgdGhpcyBkYXRhYmFzZSB1c2VkIFdBVCwgQ0FULCBTQVQsIGFuZCBFQVQKICMgZm9yICswOjAwIHRocm91Z2ggKzM6MDAsIHJlc3BlY3RpdmVseSwKICMgYnV0IE1hcmsgUiBWIE11cnJheSByZXBvcnRzIHRoYXQKLSMgYFNBU1QnIGlzIHRoZSBvZmZpY2lhbCBhYmJyZXZpYXRpb24gZm9yICsyOjAwIGluIHRoZSBjb3VudHJ5IG9mIFNvdXRoIEFmcmljYSwKLSMgYENBVCcgaXMgY29tbW9ubHkgdXNlZCBmb3IgKzI6MDAgaW4gY291bnRyaWVzIG5vcnRoIG9mIFNvdXRoIEFmcmljYSwgYW5kCi0jIGBXQVQnIGlzIHByb2JhYmx5IHRoZSBiZXN0IG5hbWUgZm9yICsxOjAwLCBhcyB0aGUgY29tbW9uIHBocmFzZSBmb3IKLSMgdGhlIGFyZWEgdGhhdCBpbmNsdWRlcyBOaWdlcmlhIGlzIGBgV2VzdCBBZnJpY2EnJy4KLSMgSGUgaGFzIGhlYXJkIG9mIGBgV2VzdGVybiBTYWhhcmEgVGltZScnIGZvciArMDowMCBidXQgY2FuIGZpbmQgbm8gcmVmZXJlbmNlLgorIyAnU0FTVCcgaXMgdGhlIG9mZmljaWFsIGFiYnJldmlhdGlvbiBmb3IgKzI6MDAgaW4gdGhlIGNvdW50cnkgb2YgU291dGggQWZyaWNhLAorIyAnQ0FUJyBpcyBjb21tb25seSB1c2VkIGZvciArMjowMCBpbiBjb3VudHJpZXMgbm9ydGggb2YgU291dGggQWZyaWNhLCBhbmQKKyMgJ1dBVCcgaXMgcHJvYmFibHkgdGhlIGJlc3QgbmFtZSBmb3IgKzE6MDAsIGFzIHRoZSBjb21tb24gcGhyYXNlIGZvcgorIyB0aGUgYXJlYSB0aGF0IGluY2x1ZGVzIE5pZ2VyaWEgaXMgIldlc3QgQWZyaWNhIi4KKyMgSGUgaGFzIGhlYXJkIG9mICJXZXN0ZXJuIFNhaGFyYSBUaW1lIiBmb3IgKzA6MDAgYnV0IGNhbiBmaW5kIG5vIHJlZmVyZW5jZS4KICMKLSMgVG8gbWFrZSB0aGluZ3MgY29uZnVzaW5nLCBgV0FUJyBzZWVtcyB0byBoYXZlIGJlZW4gdXNlZCBmb3IgLTE6MDAgbG9uZyBhZ287CisjIFRvIG1ha2UgdGhpbmdzIGNvbmZ1c2luZywgJ1dBVCcgc2VlbXMgdG8gaGF2ZSBiZWVuIHVzZWQgZm9yIC0xOjAwIGxvbmcgYWdvOwogIyBJJ2QgZ3Vlc3MgdGhhdCB0aGlzIHdhcyBiZWNhdXNlIHBlb3BsZSBuZWVkZWQgX3NvbWVfIG5hbWUgZm9yIC0xOjAwLAogIyBhbmQgYXQgdGhlIHRpbWUsIGZhciB3ZXN0IEFmcmljYSB3YXMgdGhlIG9ubHkgbWFqb3IgbGFuZCBhcmVhIGluIC0xOjAwLgogIyBUaGlzIHVzYWdlIGlzIG5vdyBvYnNvbGV0ZSwgYXMgdGhlIGxhc3QgdXNlIG9mIC0xOjAwIG9uIHRoZSBBZnJpY2FuCkBAIC03Nyw3ICs3Nyw3IEBACiAjCSAyOjAwCVNBU1QJU291dGggQWZyaWNhIFN0YW5kYXJkIFRpbWUKICMgYW5kIE11cnJheSBzdWdnZXN0cyB0aGUgZm9sbG93aW5nIGFiYnJldmlhdGlvbjoKICMJIDE6MDAJV0FUCVdlc3QgQWZyaWNhIFRpbWUKLSMgSSByZWFsaXplIHRoYXQgdGhpcyBsZWFkcyB0byBgV0FUJyBiZWluZyB1c2VkIGZvciBib3RoIC0xOjAwIGFuZCAxOjAwCisjIEkgcmVhbGl6ZSB0aGF0IHRoaXMgbGVhZHMgdG8gJ1dBVCcgYmVpbmcgdXNlZCBmb3IgYm90aCAtMTowMCBhbmQgMTowMAogIyBmb3IgdGltZXMgYmVmb3JlIDE5NzYsIGJ1dCB0aGlzIGlzIHRoZSBiZXN0IEkgY2FuIHRoaW5rIG9mCiAjIHVudGlsIHdlIGdldCBtb3JlIGluZm9ybWF0aW9uLgogIwpAQCAtMTE3LDkgKzExNyw5IEBACiAjIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDA6MDk6MjAgZm9yIFBhcmlzIE1lYW4gVGltZTsgZ28gd2l0aCBIb3dzZSdzCiAjIG1vcmUgcHJlY2lzZSAwOjA5OjIxLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQWxnaWVycwkwOjEyOjEyIC0JTE1UCTE4OTEgTWFyIDE1IDA6MDEKLQkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgICAgIyBQYXJpcyBNZWFuIFRpbWUKLQkJCTA6MDAJQWxnZXJpYQlXRSVzVAkxOTQwIEZlYiAyNSAyOjAwCitab25lCUFmcmljYS9BbGdpZXJzCTA6MTI6MTIgLQlMTVQJMTg5MSBNYXIgMTUgIDA6MDEKKwkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgIyBQYXJpcyBNZWFuIFRpbWUKKwkJCTA6MDAJQWxnZXJpYQlXRSVzVAkxOTQwIEZlYiAyNSAgMjowMAogCQkJMTowMAlBbGdlcmlhCUNFJXNUCTE5NDYgT2N0ICA3CiAJCQkwOjAwCS0JV0VUCTE5NTYgSmFuIDI5CiAJCQkxOjAwCS0JQ0VUCTE5NjMgQXByIDE0CkBAIC0xMjksMTggKzEyOSw4IEBACiAJCQkxOjAwCS0JQ0VUCiAKICMgQW5nb2xhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9MdWFuZGEJMDo1Mjo1NgktCUxNVAkxODkyCi0JCQkwOjUyOjA0CS0JQU9UCTE5MTEgTWF5IDI2ICMgQW5nb2xhIFRpbWUKLQkJCTE6MDAJLQlXQVQKLQogIyBCZW5pbgotIyBXaGl0bWFuIHNheXMgdGhleSBzd2l0Y2hlZCB0byAxOjAwIGluIDE5NDYsIG5vdCAxOTM0OwotIyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL1BvcnRvLU5vdm8JMDoxMDoyOAktCUxNVAkxOTEyCi0JCQkwOjAwCS0JR01UCTE5MzQgRmViIDI2Ci0JCQkxOjAwCS0JV0FUCisjIFNlZSBBZnJpY2EvTGFnb3MuCiAKICMgQm90c3dhbmEKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0wMi0yMSk6CkBAIC0xNDksMTQgKzEzOSwxMiBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBZnJpY2EvR2Fib3JvbmUJMTo0Mzo0MCAtCUxNVAkxODg1CiAJCQkxOjMwCS0JU0FTVAkxOTAzIE1hcgotCQkJMjowMAktCUNBVAkxOTQzIFNlcCAxOSAyOjAwCi0JCQkyOjAwCTE6MDAJQ0FTVAkxOTQ0IE1hciAxOSAyOjAwCisJCQkyOjAwCS0JQ0FUCTE5NDMgU2VwIDE5ICAyOjAwCisJCQkyOjAwCTE6MDAJQ0FTVAkxOTQ0IE1hciAxOSAgMjowMAogCQkJMjowMAktCUNBVAogCiAjIEJ1cmtpbmEgRmFzbwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvT3VhZ2Fkb3Vnb3UJLTA6MDY6MDQgLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQKKyMgU2VlIEFmcmljYS9BYmlkamFuLgogCiAjIEJ1cnVuZGkKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KQEAgLTE2NCw1MiArMTUyLDYwIEBACiAJCQkyOjAwCS0JQ0FUCiAKICMgQ2FtZXJvb24KLSMgV2hpdG1hbiBzYXlzIHRoZXkgc3dpdGNoZWQgdG8gMTowMCBpbiAxOTIwOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0RvdWFsYQkwOjM4OjQ4CS0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQKKyMgU2VlIEFmcmljYS9MYWdvcy4KIAogIyBDYXBlIFZlcmRlCisjCisjIFNoYW5rcyBnaXZlcyAxOTA3IGZvciB0aGUgdHJhbnNpdGlvbiB0byBDVlQuCisjIFBlcmhhcHMgdGhlIDE5MTEtMDUtMjYgUG9ydHVndWVzZSBkZWNyZWUKKyMgaHR0cDovL2RyZS5wdC9wZGYxc2RpcC8xOTExLzA1LzEyNTAwLzIzMTMyMzEzLnBkZgorIyBtZXJlbHkgbWFkZSBpdCBvZmZpY2lhbD8KKyMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvQ2FwZV9WZXJkZSAtMTozNDowNCAtCUxNVAkxOTA3CQkJIyBQcmFpYQorWm9uZSBBdGxhbnRpYy9DYXBlX1ZlcmRlIC0xOjM0OjA0IC0JTE1UCTE5MDcgICAgICAgICMgUHJhaWEKIAkJCS0yOjAwCS0JQ1ZUCTE5NDIgU2VwCiAJCQktMjowMAkxOjAwCUNWU1QJMTk0NSBPY3QgMTUKLQkJCS0yOjAwCS0JQ1ZUCTE5NzUgTm92IDI1IDI6MDAKKwkJCS0yOjAwCS0JQ1ZUCTE5NzUgTm92IDI1ICAyOjAwCiAJCQktMTowMAktCUNWVAogCiAjIENlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQmFuZ3VpCTE6MTQ6MjAJLQlMTVQJMTkxMgotCQkJMTowMAktCVdBVAorIyBTZWUgQWZyaWNhL0xhZ29zLgogCiAjIENoYWQKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL05kamFtZW5hCTE6MDA6MTIgLQlMTVQJMTkxMgorWm9uZQlBZnJpY2EvTmRqYW1lbmEJMTowMDoxMiAtCUxNVAkxOTEyICAgICAgICAjIE4nRGphbWVuYQogCQkJMTowMAktCVdBVAkxOTc5IE9jdCAxNAogCQkJMTowMAkxOjAwCVdBU1QJMTk4MCBNYXIgIDgKIAkJCTE6MDAJLQlXQVQKIAogIyBDb21vcm9zCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9Db21vcm8JMjo1MzowNCAtCUxNVAkxOTExIEp1bCAgICMgTW9yb25pLCBHcmFuIENvbW9ybworWm9uZQlJbmRpYW4vQ29tb3JvCTI6NTM6MDQgLQlMTVQJMTkxMSBKdWwgIyBNb3JvbmksIEdyYW4gQ29tb3JvCiAJCQkzOjAwCS0JRUFUCiAKLSMgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBDb25nbworIyBEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvS2luc2hhc2EJMTowMToxMiAtCUxNVAkxODk3IE5vdiA5Ci0JCQkxOjAwCS0JV0FUCiBab25lIEFmcmljYS9MdWJ1bWJhc2hpCTE6NDk6NTIgLQlMTVQJMTg5NyBOb3YgOQogCQkJMjowMAktCUNBVAorIyBUaGUgYWJvdmUgaXMgZm9yIHRoZSBlYXN0ZXJuIHBhcnQ7IHNlZSBBZnJpY2EvTGFnb3MgZm9yIHRoZSB3ZXN0ZXJuIHBhcnQuCiAKICMgUmVwdWJsaWMgb2YgdGhlIENvbmdvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9CcmF6emF2aWxsZQkxOjAxOjA4IC0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQKKyMgU2VlIEFmcmljYS9MYWdvcy4KIAotIyBDb3RlIEQnSXZvaXJlCisjIEPDtHRlIGQnSXZvaXJlIC8gSXZvcnkgQ29hc3QKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQWZyaWNhL0FiaWRqYW4JLTA6MTY6MDggLQlMTVQJMTkxMgogCQkJIDA6MDAJLQlHTVQKK0xpbmsgQWZyaWNhL0FiaWRqYW4gQWZyaWNhL0JhbWFrbwkjIE1hbGkKK0xpbmsgQWZyaWNhL0FiaWRqYW4gQWZyaWNhL0Jhbmp1bAkjIEdhbWJpYQorTGluayBBZnJpY2EvQWJpZGphbiBBZnJpY2EvQ29uYWtyeQkjIEd1aW5lYQorTGluayBBZnJpY2EvQWJpZGphbiBBZnJpY2EvRGFrYXIJIyBTZW5lZ2FsCitMaW5rIEFmcmljYS9BYmlkamFuIEFmcmljYS9GcmVldG93bgkjIFNpZXJyYSBMZW9uZQorTGluayBBZnJpY2EvQWJpZGphbiBBZnJpY2EvTG9tZQkJIyBUb2dvCitMaW5rIEFmcmljYS9BYmlkamFuIEFmcmljYS9Ob3Vha2Nob3R0CSMgTWF1cml0YW5pYQorTGluayBBZnJpY2EvQWJpZGphbiBBZnJpY2EvT3VhZ2Fkb3Vnb3UJIyBCdXJraW5hIEZhc28KK0xpbmsgQWZyaWNhL0FiaWRqYW4gQWZyaWNhL1Nhb19Ub21lCSMgU8OjbyBUb23DqSBhbmQgUHLDrW5jaXBlCitMaW5rIEFmcmljYS9BYmlkamFuIEF0bGFudGljL1N0X0hlbGVuYQkjIFN0IEhlbGVuYQogCiAjIERqaWJvdXRpCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC0yNTQsMzAgKzI1MCwyNiBAQAogIyBFZ3lwdGlhbnMgd291bGQgYXBwcm92ZSB0aGUgY2FuY2VsbGF0aW9uLiIKICMKICMgRWd5cHQgdG8gY2FuY2VsIGRheWxpZ2h0IHNhdmluZyB0aW1lCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWxtYXNyeWFseW91bS5jb20vZW4vbm9kZS80MDcxNjgiPgogIyBodHRwOi8vd3d3LmFsbWFzcnlhbHlvdW0uY29tL2VuL25vZGUvNDA3MTY4Ci0jIDwvYT4KICMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19lZ3lwdDA0Lmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2VneXB0MDQuaHRtbAotIyA8L2E+CiBSdWxlCUVneXB0CTE5OTUJMjAxMAktCUFwcglsYXN0RnJpCSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk5NQkyMDA1CS0JU2VwCWxhc3RUaHUJMjM6MDBzCTAJLQorUnVsZQlFZ3lwdAkxOTk1CTIwMDUJLQlTZXAJbGFzdFRodQkyNDowMAkwCS0KICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDYtMDktMTkpOgogIyBUaGUgRWd5cHRpYW4gR2F6ZXR0ZSwgaXNzdWUgNDEsMDkwICgyMDA2LTA5LTE4KSwgcGFnZSAxLCByZXBvcnRzOgogIyBFZ3lwdCB3aWxsIHR1cm4gYmFjayBjbG9ja3MgYnkgb25lIGhvdXIgYXQgdGhlIG1pZG5pZ2h0IG9mIFRodXJzZGF5CiAjIGFmdGVyIG9ic2VydmluZyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgc2luY2UgTWF5LgogIyBodHRwOi8vbmV3cy5nb20uY29tLmVnL2dhemV0dGUvcGRmLzIwMDYvMDkvMTgvMDEucGRmCi1SdWxlCUVneXB0CTIwMDYJb25seQktCVNlcAkyMQkyMzowMHMJMAktCitSdWxlCUVneXB0CTIwMDYJb25seQktCVNlcAkyMQkyNDowMAkwCS0KICMgRnJvbSBEaXJrIExvc2NoICgyMDA3LTA4LTE0KToKICMgSSByZWNlaXZlZCBhIG1haWwgZnJvbSBhbiBhaXJsaW5lIHdoaWNoIHNheXMgdGhhdCB0aGUgZGF5bGlnaHQKICMgc2F2aW5nIHRpbWUgaW4gRWd5cHQgd2lsbCBlbmQgaW4gdGhlIG5pZ2h0IG9mIDIwMDctMDktMDYgdG8gMjAwNy0wOS0wNy4KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDctMDgtMTUpOiBbVGhlIGZvbGxvd2luZyBhZ3JlZTpdCisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNy0wOC0xNSk6IFtUaGUgZm9sbG93aW5nIGFncmVlOl0KICMgaHR0cDovL3d3dy5uZW50amVzLmluZm8vQmlsbC9iaWxsNS5odG0KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jaXR5Lmh0bWw/bj01MwogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0wOS0wNCk6IFRoZSBvZmZpY2lhbCBpbmZvcm1hdGlvbi4uLjoKICMgaHR0cDovL3d3dy5zaXMuZ292LmVnL0VuL0VneXB0T25saW5lL01pc2NlbGxhbmVvdXMvMDAwMDAyLzAyMDcwMDAwMDAwMDAwMDAwMDE1ODAuaHRtCi1SdWxlCUVneXB0CTIwMDcJb25seQktCVNlcAlUaHU+PTEJMjM6MDBzCTAJLQorUnVsZQlFZ3lwdAkyMDA3CW9ubHkJLQlTZXAJVGh1Pj0xCTI0OjAwCTAJLQogIyBGcm9tIEFiZGVscmFobWFuIEhhc3NhbiAoMjAwNy0wOS0wNik6CiAjIER1ZSB0byB0aGUgSGlqcmkgKGx1bmFyIElzbGFtaWMgY2FsZW5kYXIpIHllYXIgYmVpbmcgMTEgZGF5cyBzaG9ydGVyCiAjIHRoYW4gdGhlIHllYXIgb2YgdGhlIEdyZWdvcmlhbiBjYWxlbmRhciwgUmFtYWRhbiBzaGlmdHMgZWFybGllciBlYWNoCkBAIC0zMTEsMTUgKzMwMyw5IEBACiAjCiAjIHRpbWVhbmRkYXRlWzJdIGFuZCBhbm90aGVyIHNpdGUgSSd2ZSBmb3VuZFszXSBhbHNvIHN1cHBvcnQgdGhhdC4KICMKLSMgWzFdIDxhIGhyZWY9Imh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDkyMjYzIj4KLSMgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD00OTIyNjMKLSMgPC9hPgotIyBbMl0gPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jbG9ja2NoYW5nZS5odG1sP249NTMiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL2Nsb2NrY2hhbmdlLmh0bWw/bj01MwotIyA8L2E+Ci0jIFszXSA8YSBocmVmPSJodHRwOi8vd3dwLmdyZWVud2ljaG1lYW50aW1lLmNvbS90aW1lLXpvbmUvYWZyaWNhL2VneXB0LyI+Ci0jIGh0dHA6Ly93d3AuZ3JlZW53aWNobWVhbnRpbWUuY29tL3RpbWUtem9uZS9hZnJpY2EvZWd5cHQvCi0jIDwvYT4KKyMgWzFdIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDkyMjYzCisjIFsyXSBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL2Nsb2NrY2hhbmdlLmh0bWw/bj01MworIyBbM10gaHR0cDovL3d3cC5ncmVlbndpY2htZWFudGltZS5jb20vdGltZS16b25lL2FmcmljYS9lZ3lwdC8KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOS0wNC0yMCk6CiAjIEluIDIwMDkgKGFuZCBmb3IgdGhlIG5leHQgc2V2ZXJhbCB5ZWFycyksIFJhbWFkYW4gZW5kcyBiZWZvcmUgdGhlIGZvdXJ0aApAQCAtMzI5LDE0ICszMTUsMTAgQEAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDgtMTEpOgogIyBXZSBoYXZlIGJlZW4gYWJsZSB0byBjb25maXJtIHRoZSBBdWd1c3QgY2hhbmdlIHdpdGggdGhlIEVneXB0aWFuIENhYmluZXQKICMgSW5mb3JtYXRpb24gYW5kIERlY2lzaW9uIFN1cHBvcnQgQ2VudGVyOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvZWd5cHQtZHN0LWVuZHMtMjAwOS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2VneXB0LWRzdC1lbmRzLTIwMDkuaHRtbAotIyA8L2E+CiAjCiAjIFRoZSBNaWRkbGUgRWFzdCBOZXdzIEFnZW5jeQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1lbmEub3JnLmVnL2luZGV4LmFzcHgiPgogIyBodHRwOi8vd3d3Lm1lbmEub3JnLmVnL2luZGV4LmFzcHgKLSMgPC9hPgogIyBhbHNvIHJlcG9ydHMgIkVneXB0IHN0YXJ0cyB3aW50ZXIgdGltZSBvbiBBdWd1c3QgMjEiCiAjIHRvZGF5IGluIGFydGljbGUgbnVtYmVyZWQgIjcxLCAxMS8wOC8yMDA5IDEyOjI1IEdNVC4iCiAjIE9ubHkgdGhlIHRpdGxlIGFib3ZlIGlzIGF2YWlsYWJsZSB3aXRob3V0IGEgc3Vic2NyaXB0aW9uIHRvIHRoZWlyIHNlcnZpY2UsCkBAIC0zNDQsMTkgKzMyNiwxNCBAQAogIyAoYXQgbGVhc3QgdG9kYXkpLgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTA3LTIwKToKLSMgQWNjb3JkaW5nIHRvIE5ld3MgZnJvbSBFZ3lwdCAtICBBbC1NYXNyeSBBbC1Zb3VtIEVneXB0J3MgY2FiaW5ldCBoYXMKKyMgQWNjb3JkaW5nIHRvIE5ld3MgZnJvbSBFZ3lwdCAtIEFsLU1hc3J5IEFsLVlvdW0gRWd5cHQncyBjYWJpbmV0IGhhcwogIyBkZWNpZGVkIHRoYXQgRGF5bGlnaHQgU2F2aW5nIFRpbWUgd2lsbCBub3QgYmUgdXNlZCBpbiBFZ3lwdCBkdXJpbmcKICMgUmFtYWRhbi4KICMKICMgQXJhYmljIHRyYW5zbGF0aW9uOgotIyAiQ2xvY2tzIHRvIGdvIGJhY2sgZHVyaW5nIFJhbWFkYW4tLWFuZCB0aGVuIGZvcndhcmQgYWdhaW4iCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWxtYXNyeWFseW91bS5jb20vZW4vbmV3cy9jbG9ja3MtZ28tYmFjay1kdXJpbmctcmFtYWRhbi1hbmQtdGhlbi1mb3J3YXJkLWFnYWluIj4KKyMgIkNsb2NrcyB0byBnbyBiYWNrIGR1cmluZyBSYW1hZGFuIC0gYW5kIHRoZW4gZm9yd2FyZCBhZ2FpbiIKICMgaHR0cDovL3d3dy5hbG1hc3J5YWx5b3VtLmNvbS9lbi9uZXdzL2Nsb2Nrcy1nby1iYWNrLWR1cmluZy1yYW1hZGFuLWFuZC10aGVuLWZvcndhcmQtYWdhaW4KLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2VneXB0MDIuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZWd5cHQwMi5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFobWFkIEVsLURhcmRpcnkgKDIwMTQtMDUtMDcpOgogIyBFZ3lwdCBpcyB0byBjaGFuZ2UgYmFjayB0byBEYXlsaWdodCBzeXN0ZW0gb24gTWF5IDE1CkBAIC0zNjUsNDYgKzM0Miw3NyBAQAogIyBGcm9tIEd1bnRoZXIgVmVybWllciAoMjAxNS0wNS0xMyk6CiAjIG91ciBFZ3lwdCBvZmZpY2UgY29uZmlybXMgdGhhdCB0aGUgY2hhbmdlIHdpbGwgYmUgYXQgMTUgTWF5ICJtaWRuaWdodCIgKDI0OjAwKQogCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDUtMTMpOgorIyBGcm9tIEltZWQgQ2hpaGkgKDIwMTQtMDYtMDQpOgorIyBXZSBoYXZlIGZpbmFsbHkgImxvY2F0ZWQiIGEgcHJlY2lzZSBvZmZpY2lhbCByZWZlcmVuY2UgYWJvdXQgdGhlIERTVCBjaGFuZ2VzCisjIGluIEVneXB0LiAgVGhlIE1pbmlzdGVycyBDYWJpbmV0IGRlY2lzaW9uIGlzIGV4cGxhaW5lZCBhdAorIyBodHRwOi8vd3d3LmNhYmluZXQuZ292LmVnL01lZGlhL0NhYmluZXRNZWV0aW5nc0RldGFpbHMuYXNweD9pZD0zNDcgLi4uCisjIFtUXWhpcyAoQXJhYmljKSBzaXRlIGlzIG5vdCBhY2Nlc3NpYmxlIG91dHNpZGUgRWd5cHQsIGJ1dCB0aGUgcGFnZSAuLi4KKyMgdHJhbnNsYXRlcyBpbnRvOiAiV2l0aCByZWdhcmQgdG8gZGF5bGlnaHQgc2F2aW5nIHRpbWUsIGl0IGlzIHNjaGVkdWxlZCB0bworIyB0YWtlIGVmZmVjdCBhdCBleGFjdGx5IHR3ZWx2ZSBvJ2Nsb2NrIHRoaXMgZXZlbmluZywgVGh1cnNkYXksIDE1IE1BWSAyMDE0LAorIyB0byBiZSBzdXNwZW5kZWQgYnkgdHdlbHZlIG8nY2xvY2sgb24gdGhlIGV2ZW5pbmcgb2YgVGh1cnNkYXksIDI2IEpVTiAyMDE0LAorIyBhbmQgcmUtZXN0YWJsaXNoZWQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGUgbW9udGggb2YgUmFtYWRhbiwgYXQgdHdlbHZlCisjIG8nY2xvY2sgb24gdGhlIGV2ZW5pbmcgb2YgVGh1cnNkYXksIDMxIEpVTCAyMDE0LiIgIFRoaXMgc3RhdGVtZW50IGhhcyBiZWVuCisjIHJlcHJvZHVjZWQgYnkgb3RoZXIgKG1vcmUgYWNjZXNzaWJsZSkgc2l0ZXNbLCBlLmcuLF0uLi4KKyMgaHR0cDovL2VsZ29ybmFsLm5ldC9uZXdzL25ld3MuYXNweD9pZD00Njk5MjU4CisKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0wNCk6CiAjIFNhcmFoIEVsIERlZWIgYW5kIExlZSBLZWF0aCBvZiBBUCByZXBvcnQgdGhhdCB0aGUgRWd5cHRpYW4gZ292ZXJubWVudCBzYXlzCiAjIHRoZSBjaGFuZ2UgaXMgYmVjYXVzZSBvZiBibGFja291dHMgaW4gQ2Fpcm8sIGV2ZW4gdGhvdWdoIEFocmFtIE9ubGluZSAoY2l0ZWQKLSMgYWJvdmUpIHNheXMgRFNUIGhhZCBubyBhZmZlY3Qgb24gZWxlY3RyaWNpdHkgY29uc3VtcHRpb24uICBUaGUgQVAgc3Rvcnkgc2F5cwotIyBEU1Qgd2lsbCBub3QgYmUgb2JzZXJ2ZWQgZHVyaW5nIFJhbWFkYW4uICBUaGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhYm91dCB3aGVuCi0jIERTVCB3aWxsIGVuZC4gIFNlZToKKyMgYWJvdmUpIHNheXMgRFNUIGhhZCBubyBhZmZlY3Qgb24gZWxlY3RyaWNpdHkgY29uc3VtcHRpb24uICBUaGVyZSBpcworIyBubyBpbmZvcm1hdGlvbiBhYm91dCB3aGVuIERTVCB3aWxsIGVuZCB0aGlzIGZhbGwuICBTZWU6CiAjIGh0dHA6Ly9hYmNuZXdzLmdvLmNvbS9JbnRlcm5hdGlvbmFsL3dpcmVTdG9yeS9lbC1zaXNzaS1wdXNoZXMtZWd5cHRpYW5zLWxpbmUtMjM2MTQ4MzMKICMKLSMgRm9yIG5vdywgZ3Vlc3MgdGhhdCBsYXRlciB0cmFuc2l0aW9ucyB3aWxsIHVzZSAyMDEwJ3MgcnVsZXMsIGFuZCB0aGF0Ci0jIEVneXB0IHdpbGwgYWdyZWUgd2l0aCBNb3JvY2NvIChzZWUgYmVsb3cpIGFib3V0IHRoZSBkYXRlIFJhbWFkYW4gc3RhcnRzIGFuZAotIyBlbmRzLCB0aG91Z2ggKHVubGlrZSBNb3JvY2NvKSBpdCB3aWxsIHN3aXRjaCBhdCAwMDowMCBzdGFuZGFyZCB0aW1lLiAgSW4KLSMgRWd5cHQgdGhlIHNwcmluZy1mb3J3YXJkIHRyYW5zaXRpb25zIGFyZSByZW1vdmVkIGZvciAyMDIwLTIwMjIsIHdoZW4gdGhlCi0jIGd1ZXNzZWQgc3ByaW5nLWZvcndhcmQgZGF0ZSBmYWxscyBkdXJpbmcgdGhlIGVzdGltYXRlZCBSYW1hZGFuLCBhbmQgYWxsCi0jIHRyYW5zaXRpb25zIHJlbW92ZWQgZm9yIDIwMjMtMjAzOCwgd2hlcmUgdGhlIGVzdGltYXRlZCBSYW1hZGFuIGZhbGxzIGVudGlyZWx5Ci0jIG91dHNpZGUgdGhlIGd1ZXNzZWQgZGF5bGlnaHQtc2F2aW5nIHRpbWUuICBSYW1hZGFuIGludHJ1ZGVzIG9uIHRoZSBndWVzc2VkCi0jIERTVCBzdGFydGluZyBpbiAyMDM5LCBidXQgdGhhdCdzIGJleW9uZCBvdXIgc29tZXdoYXQtYXJiaXRyYXJ5IGN1dG9mZi4KLQotUnVsZQlFZ3lwdAkyMDA4CW9ubHkJLQlBdWcJbGFzdFRodQkyMzowMHMJMAktCi1SdWxlCUVneXB0CTIwMDkJb25seQktCUF1ZwkyMAkyMzowMHMJMAktCi1SdWxlCUVneXB0CTIwMTAJb25seQktCUF1ZwkxMQkwOjAwCTAJLQotUnVsZQlFZ3lwdAkyMDEwCW9ubHkJLQlTZXAJMTAJMDowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAxMAlvbmx5CS0JU2VwCWxhc3RUaHUJMjM6MDBzCTAJLQorIyBGb3Igbm93LCBndWVzcyB0aGF0IGxhdGVyIHNwcmluZyBhbmQgZmFsbCB0cmFuc2l0aW9ucyB3aWxsIHVzZQorIyAyMDEwJ3MgcnVsZXMsIGFuZCBndWVzcyB0aGF0IEVneXB0IHdpbGwgc3dpdGNoIHRvIHN0YW5kYXJkIHRpbWUgYXQKKyMgMjQ6MDAgdGhlIGxhc3QgVGh1cnNkYXkgYmVmb3JlIFJhbWFkYW4sIGFuZCBiYWNrIHRvIERTVCBhdCAwMDowMCB0aGUKKyMgZmlyc3QgRnJpZGF5IGFmdGVyIFJhbWFkYW4uICBUbyBpbXBsZW1lbnQgdGhpcywKKyMgdHJhbnNpdGlvbiBkYXRlcyBmb3IgMjAxNSB0aHJvdWdoIDIwMzcgd2VyZSBkZXRlcm1pbmVkIGJ5IHJ1bm5pbmcKKyMgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHVuZGVyIEdOVSBFbWFjcyAyNC4zLCB3aXRoIHRoZSByZXN1bHRzIGludGVncmF0ZWQKKyMgYnkgaGFuZCBpbnRvIHRoZSB0YWJsZSBiZWxvdy4gIFJhbWFkYW4gYWdhaW4gaW50cnVkZXMgb24gdGhlIGd1ZXNzZWQKKyMgRFNUIHN0YXJ0aW5nIGluIDIwMzgsIGJ1dCB0aGF0J3MgYmV5b25kIG91ciBzb21ld2hhdC1hcmJpdHJhcnkgY3V0b2ZmLgorIyAobGV0ICgoaXNsYW1pYy15ZWFyIDE0MzYpKQorIyAgICh3aGlsZSAoPCBpc2xhbWljLXllYXIgMTQ2MCkKKyMgICAgIChsZXQgKChhIChjYWxlbmRhci1pc2xhbWljLXRvLWFic29sdXRlIChsaXN0IDkgMSBpc2xhbWljLXllYXIpKSkKKyMgICAgICAgICAgIChiIChjYWxlbmRhci1pc2xhbWljLXRvLWFic29sdXRlIChsaXN0IDEwIDEgaXNsYW1pYy15ZWFyKSkpCisjICAgICAgICAgICAoZnJpZGF5IDUpKQorIyAgICAgICAod2hpbGUgKC89IGZyaWRheSAobW9kIGEgNykpCisjICAgICAgICAgKHNldHEgYSAoMS0gYSkpKQorIyAgICAgICAod2hpbGUgKC89IGZyaWRheSAobW9kIGIgNykpCisjICAgICAgICAgKHNldHEgYiAoMSsgYikpKQorIyAgICAgICAoc2V0cSBhICgxLSBhKSkKKyMgICAgICAgKHNldHEgYiAoMS0gYikpCisjICAgICAgIChzZXRxIGEgKGNhbGVuZGFyLWdyZWdvcmlhbi1mcm9tLWFic29sdXRlIGEpKQorIyAgICAgICAoc2V0cSBiIChjYWxlbmRhci1ncmVnb3JpYW4tZnJvbS1hYnNvbHV0ZSBiKSkKKyMgICAgICAgKGluc2VydAorIyAgICAgICAgKGZvcm1hdAorIyAgICAgICAgIChjb25jYXQgIlJ1bGVcdEVneXB0XHQlZFx0b25seVx0LVx0JXNcdCUyZFx0MjQ6MDBcdDBcdC1cbiIKKyMgICAgICAgICAgICAgICAgICJSdWxlXHRFZ3lwdFx0JWRcdG9ubHlcdC1cdCVzXHQlMmRcdDI0OjAwXHQxOjAwXHRTXG4iKQorIyAgICAgICAgIChjYXIgKGNkciAoY2RyIGEpKSkgKGNhbGVuZGFyLW1vbnRoLW5hbWUgKGNhciBhKSB0KSAoY2FyIChjZHIgYSkpCisjICAgICAgICAgKGNhciAoY2RyIChjZHIgYikpKSAoY2FsZW5kYXItbW9udGgtbmFtZSAoY2FyIGIpIHQpIChjYXIgKGNkciBiKSkpKSkKKyMgICAgIChzZXRxIGlzbGFtaWMteWVhciAoKyAxIGlzbGFtaWMteWVhcikpKSkKK1J1bGUJRWd5cHQJMjAwOAlvbmx5CS0JQXVnCWxhc3RUaHUJMjQ6MDAJMAktCitSdWxlCUVneXB0CTIwMDkJb25seQktCUF1ZwkyMAkyNDowMAkwCS0KK1J1bGUJRWd5cHQJMjAxMAlvbmx5CS0JQXVnCTEwCTI0OjAwCTAJLQorUnVsZQlFZ3lwdAkyMDEwCW9ubHkJLQlTZXAJIDkJMjQ6MDAJMTowMAlTCitSdWxlCUVneXB0CTIwMTAJb25seQktCVNlcAlsYXN0VGh1CTI0OjAwCTAJLQogUnVsZQlFZ3lwdAkyMDE0CW9ubHkJLQlNYXkJMTUJMjQ6MDAJMTowMAlTCi1SdWxlCUVneXB0CTIwMTQJb25seQktCUp1bgkyOQkgMDowMHMJMAktCi1SdWxlCUVneXB0CTIwMTQJb25seQktCUp1bAkyOQkgMDowMHMJMTowMAlTCi1SdWxlCUVneXB0CTIwMTQJbWF4CS0JU2VwCWxhc3RUaHUJMjM6MDBzCTAJLQorUnVsZQlFZ3lwdAkyMDE0CW9ubHkJLQlKdW4JMjYJMjQ6MDAJMAktCitSdWxlCUVneXB0CTIwMTQJb25seQktCUp1bAkzMQkyNDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMjAxNAltYXgJLQlTZXAJbGFzdFRodQkyNDowMAkwCS0KIFJ1bGUJRWd5cHQJMjAxNQkyMDE5CS0JQXByCWxhc3RGcmkJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDE1CW9ubHkJLQlKdW4JMTgJIDA6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDE1CW9ubHkJLQlKdWwJMTgJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDE2CW9ubHkJLQlKdW4JIDcJIDA6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDE2CW9ubHkJLQlKdWwJIDcJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDE3CW9ubHkJLQlNYXkJMjcJIDA6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDE3CW9ubHkJLQlKdW4JMjYJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDE4CW9ubHkJLQlNYXkJMTYJIDA6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDE4CW9ubHkJLQlKdW4JMTUJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDE5CW9ubHkJLQlNYXkJIDYJIDA6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDE5CW9ubHkJLQlKdW4JIDUJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDIwCW9ubHkJLQlNYXkJMjQJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDIxCW9ubHkJLQlNYXkJMTMJIDA6MDBzCTE6MDAJUwotUnVsZQlFZ3lwdAkyMDIyCW9ubHkJLQlNYXkJIDMJIDA6MDBzCTE6MDAJUworUnVsZQlFZ3lwdAkyMDE1CW9ubHkJLQlKdW4JMTEJMjQ6MDAJMAktCitSdWxlCUVneXB0CTIwMTUJb25seQktCUp1bAkyMwkyNDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMjAxNglvbmx5CS0JSnVuCSAyCTI0OjAwCTAJLQorUnVsZQlFZ3lwdAkyMDE2CW9ubHkJLQlKdWwJIDcJMjQ6MDAJMTowMAlTCitSdWxlCUVneXB0CTIwMTcJb25seQktCU1heQkyNQkyNDowMAkwCS0KK1J1bGUJRWd5cHQJMjAxNwlvbmx5CS0JSnVuCTI5CTI0OjAwCTE6MDAJUworUnVsZQlFZ3lwdAkyMDE4CW9ubHkJLQlNYXkJMTAJMjQ6MDAJMAktCitSdWxlCUVneXB0CTIwMTgJb25seQktCUp1bgkxNAkyNDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMjAxOQlvbmx5CS0JTWF5CSAyCTI0OjAwCTAJLQorUnVsZQlFZ3lwdAkyMDE5CW9ubHkJLQlKdW4JIDYJMjQ6MDAJMTowMAlTCitSdWxlCUVneXB0CTIwMjAJb25seQktCU1heQkyOAkyNDowMAkxOjAwCVMKK1J1bGUJRWd5cHQJMjAyMQlvbmx5CS0JTWF5CTEzCTI0OjAwCTE6MDAJUworUnVsZQlFZ3lwdAkyMDIyCW9ubHkJLQlNYXkJIDUJMjQ6MDAJMTowMAlTCiBSdWxlCUVneXB0CTIwMjMJbWF4CS0JQXByCWxhc3RGcmkJIDA6MDBzCTE6MDAJUwogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC00MTIsNjAgKzQyMCw2MyBAQAogCQkJMjowMAlFZ3lwdAlFRSVzVAogCiAjIEVxdWF0b3JpYWwgR3VpbmVhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9NYWxhYm8JMDozNTowOCAtCUxNVAkxOTEyCi0JCQkwOjAwCS0JR01UCTE5NjMgRGVjIDE1Ci0JCQkxOjAwCS0JV0FUCisjIFNlZSBBZnJpY2EvTGFnb3MuCiAKICMgRXJpdHJlYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBZnJpY2EvQXNtYXJhCTI6MzU6MzIgLQlMTVQJMTg3MAotCQkJMjozNTozMgktCUFNVAkxODkwCSAgICAgICMgQXNtYXJhIE1lYW4gVGltZQotCQkJMjozNToyMAktCUFETVQJMTkzNiBNYXkgNSAgICAjIEFkaXMgRGVyYSBNVAorCQkJMjozNTozMgktCUFNVAkxODkwICAgICAgICAjIEFzbWFyYSBNZWFuIFRpbWUKKwkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5ICA1ICMgQWRpcyBEZXJhIE1UCiAJCQkzOjAwCS0JRUFUCiAKICMgRXRoaW9waWEKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IEV0aGlvcGlhIGhhZCBzaXggbmFycm93bHktc3BhY2VkIHRpbWUgem9uZXMKLSMgYmV0d2VlbiAxODcwIGFuZCAxODkwLCBhbmQgdGhhdCB0aGV5IG1lcmdlZCB0byAzOEU1MCAoMjozNToyMCkgaW4gMTg5MC4KLSMgV2UnbGwgZ3Vlc3MgdGhhdCAzOEU1MCBpcyBmb3IgQWRpcyBEZXJhLgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTMxKToKKyMgTGlrZSB0aGUgU3dhaGlsaSBvZiBLZW55YSBhbmQgVGFuemFuaWEsIG1hbnkgRXRoaW9waWFucyBrZWVwIGEKKyMgMTItaG91ciBjbG9jayBzdGFydGluZyBhdCBvdXIgMDY6MDAsIHNvIHRoZWlyICI4IG8nY2xvY2siIGlzIG91cgorIyAwMjowMCBvciAxNDowMC4gIEtlZXAgdGhpcyBpbiBtaW5kIHdoZW4geW91IGFzayB0aGUgdGltZSBpbiBBbWhhcmljLgorIworIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBFdGhpb3BpYSBoYWQgc2l4IG5hcnJvd2x5LXNwYWNlZCB0aW1lCisjIHpvbmVzIGJldHdlZW4gMTg3MCBhbmQgMTg5MCwgdGhhdCB0aGV5IG1lcmdlZCB0byAzOEU1MCAoMjozNToyMCkgaW4KKyMgMTg5MCwgYW5kIHRoYXQgdGhleSBzd2l0Y2hlZCB0byAzOjAwIG9uIDE5MzYtMDUtMDUuICBQZXJoYXBzIDM4RTUwCisjIHdhcyBmb3IgQWRpcyBEZXJhLiAgUXVpdGUgbGlrZWx5IHRoZSBTaGFua3MgZGF0YSBlbnRyaWVzIGFyZSB3cm9uZworIyBhbnl3YXkuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFmcmljYS9BZGRpc19BYmFiYQkyOjM0OjQ4IC0JTE1UCTE4NzAKLQkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKKwkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5ICA1ICMgQWRpcyBEZXJhIE1UCiAJCQkzOjAwCS0JRUFUCiAKICMgR2Fib24KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL0xpYnJldmlsbGUJMDozNzo0OCAtCUxNVAkxOTEyCi0JCQkxOjAwCS0JV0FUCisjIFNlZSBBZnJpY2EvTGFnb3MuCiAKICMgR2FtYmlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9CYW5qdWwJLTE6MDY6MzYgLQlMTVQJMTkxMgotCQkJLTE6MDY6MzYgLQlCTVQJMTkzNQkjIEJhbmp1bCBNZWFuIFRpbWUKLQkJCS0xOjAwCS0JV0FUCTE5NjQKLQkJCSAwOjAwCS0JR01UCisjIFNlZSBBZnJpY2EvQWJpZGphbi4KIAogIyBHaGFuYQogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgV2hpdG1hbiBzYXlzIERTVCB3YXMgb2JzZXJ2ZWQgZnJvbSAxOTMxIHRvIGBgdGhlIHByZXNlbnQnJzsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUdoYW5hCTE5MzYJMTk0MgktCVNlcAkgMQkwOjAwCTA6MjAJR0hTVAotUnVsZQlHaGFuYQkxOTM2CTE5NDIJLQlEZWMJMzEJMDowMAkwCUdNVAorIyBXaGl0bWFuIHNheXMgRFNUIHdhcyBvYnNlcnZlZCBmcm9tIDE5MzEgdG8gInRoZSBwcmVzZW50IjsKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSAxOTM2IHRvIDE5NDI7CisjIGFuZCBTZXB0ZW1iZXIgMSB0byBKYW51YXJ5IDEgaXMgZ2l2ZW4gYnk6CisjIFNjb3R0IEtlbHRpZSBKLCBFcHN0ZWluIE0gKGVkcyksIFRoZSBTdGF0ZXNtYW4ncyBZZWFyLUJvb2ssCisjIDU3dGggZWQuIE1hY21pbGxhbiwgTG9uZG9uICgxOTIwKSwgT0NMQyA2MDk0MDgwMTUsIHBwIHh4dmlpaS4KKyMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm8sIGFzc3VtZSBEU1Qgd2FzIG9ic2VydmVkIGZyb20gMTkyMCB0byAxOTQyLgorUnVsZQlHaGFuYQkxOTIwCTE5NDIJLQlTZXAJIDEJMDowMAkwOjIwCUdIU1QKK1J1bGUJR2hhbmEJMTkyMAkxOTQyCS0JRGVjCTMxCTA6MDAJMAlHTVQKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQWZyaWNhL0FjY3JhCS0wOjAwOjUyIC0JTE1UCTE5MTgKIAkJCSAwOjAwCUdoYW5hCSVzCiAKICMgR3VpbmVhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9Db25ha3J5CS0wOjU0OjUyIC0JTE1UCTE5MTIKLQkJCSAwOjAwCS0JR01UCTE5MzQgRmViIDI2Ci0JCQktMTowMAktCVdBVAkxOTYwCi0JCQkgMDowMAktCUdNVAorIyBTZWUgQWZyaWNhL0FiaWRqYW4uCiAKICMgR3VpbmVhLUJpc3NhdQorIworIyBTaGFua3MgZ2l2ZXMgMTkxMS0wNS0yNiBmb3IgdGhlIHRyYW5zaXRpb24gdG8gV0FULAorIyBldmlkZW50bHkgY29uZnVzaW5nIHRoZSBkYXRlIG9mIHRoZSBQb3J0dWd1ZXNlIGRlY3JlZQorIyBodHRwOi8vZHJlLnB0L3BkZjFzZGlwLzE5MTEvMDUvMTI1MDAvMjMxMzIzMTMucGRmCisjIHdpdGggdGhlIGRhdGUgdGhhdCBpdCB0b29rIGVmZmVjdCwgbmFtZWx5IDE5MTItMDEtMDEuCisjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9CaXNzYXUJLTE6MDI6MjAgLQlMTVQJMTkxMSBNYXkgMjYKK1pvbmUJQWZyaWNhL0Jpc3NhdQktMTowMjoyMCAtCUxNVAkxOTEyIEphbiAgMQogCQkJLTE6MDAJLQlXQVQJMTk3NQogCQkJIDA6MDAJLQlHTVQKIApAQCAtNDgwLDggKzQ5MSw4IEBACiAjIExlc290aG8KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQWZyaWNhL01hc2VydQkxOjUwOjAwIC0JTE1UCTE5MDMgTWFyCi0JCQkyOjAwCS0JU0FTVAkxOTQzIFNlcCAxOSAyOjAwCi0JCQkyOjAwCTE6MDAJU0FTVAkxOTQ0IE1hciAxOSAyOjAwCisJCQkyOjAwCS0JU0FTVAkxOTQzIFNlcCAxOSAgMjowMAorCQkJMjowMAkxOjAwCVNBU1QJMTk0NCBNYXIgMTkgIDI6MDAKIAkJCTI6MDAJLQlTQVNUCiAKICMgTGliZXJpYQpAQCAtNTQ5LDExICs1NjAsMTEgQEAKIAkJCTI6MDAJLQlFRVQJMTk4MgogCQkJMTowMAlMaWJ5YQlDRSVzVAkxOTkwIE1heSAgNAogIyBUaGUgMTk5NiBhbmQgMTk5NyBlbnRyaWVzIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjsKLSMgdGhlIElBVEEgU1NJTSBkYXRhIGNvbnRhaW4gc29tZSBvYnZpb3VzIGVycm9ycy4KKyMgdGhlIElBVEEgU1NJTSBkYXRhIGVudHJpZXMgY29udGFpbiBzb21lIG9idmlvdXMgZXJyb3JzLgogCQkJMjowMAktCUVFVAkxOTk2IFNlcCAzMAogCQkJMTowMAlMaWJ5YQlDRSVzVAkxOTk3IE9jdCAgNAotCQkJMjowMAktCUVFVAkyMDEyIE5vdiAxMCAyOjAwCi0JCQkxOjAwCUxpYnlhCUNFJXNUCTIwMTMgT2N0IDI1IDI6MDAKKwkJCTI6MDAJLQlFRVQJMjAxMiBOb3YgMTAgIDI6MDAKKwkJCTE6MDAJTGlieWEJQ0Ulc1QJMjAxMyBPY3QgMjUgIDI6MDAKIAkJCTI6MDAJLQlFRVQKIAogIyBNYWRhZ2FzY2FyCkBAIC01NjksMTggKzU4MCw4IEBACiAJCQkyOjAwCS0JQ0FUCiAKICMgTWFsaQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQmFtYWtvCS0wOjMyOjAwIC0JTE1UCTE5MTIKLQkJCSAwOjAwCS0JR01UCTE5MzQgRmViIDI2Ci0JCQktMTowMAktCVdBVAkxOTYwIEp1biAyMAotCQkJIDA6MDAJLQlHTVQKLQogIyBNYXVyaXRhbmlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9Ob3Vha2Nob3R0CS0xOjAzOjQ4IC0JTE1UCTE5MTIKLQkJCSAwOjAwCS0JR01UCTE5MzQgRmViIDI2Ci0JCQktMTowMAktCVdBVAkxOTYwIE5vdiAyOAotCQkJIDA6MDAJLQlHTVQKKyMgU2VlIEFmcmljYS9BYmlkamFuLgogCiAjIE1hdXJpdGl1cwogCkBAIC02MDQsOSArNjA1LDcgQEAKIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wNy0xMCk6CiAjIEFjY29yZGluZyB0bwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYiPgogIyBodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYKLSMgPC9hPgogIyAoaW4gRnJlbmNoKSwgTWF1cml0aXVzIHdpbGwgc3RhcnQgYW5kIGVuZCB0aGVpciBEU1QgYSBmZXcgZGF5cyBlYXJsaWVyCiAjIHRoYW4gcHJldmlvdXNseSBhbm5vdW5jZWQgKDIwMDgtMTEtMDEgdG8gMjAwOS0wMy0zMSkuICBUaGUgbmV3IHN0YXJ0CiAjIGRhdGUgaXMgMjAwOC0xMC0yNiBhdCAwMjowMCBhbmQgdGhlIG5ldyBlbmQgZGF0ZSBpcyAyMDA5LTAzLTI3IChubyB0aW1lCkBAIC02MjEsMjIgKzYyMCwxNyBAQAogCiAjIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNy0xMSk6CiAjIFNlZW1zIHRoYXQgRW5nbGlzaCBsYW5ndWFnZSBhcnRpY2xlICJUaGUgcmV2aXZhbCBvZiBkYXlsaWdodCBzYXZpbmcKLSMgdGltZTogIEVuZXJneSBjb25zZXJ2YXRpb24/Ii0jIE5vLiAxNjU3OCAoMDcvMTEvMjAwOCkgd2FzIG9yaWdpbmFsbHkKKyMgdGltZTogRW5lcmd5IGNvbnNlcnZhdGlvbj8iLSMgTm8uIDE2NTc4ICgwNy8xMS8yMDA4KSB3YXMgb3JpZ2luYWxseQogIyBwdWJsaXNoZWQgb24gTW9uZGF5LCBKdW5lIDMwLCAyMDA4Li4uCiAjCiAjIEkgZ3Vlc3MgdGhhdCBhcnRpY2xlIGluIEZyZW5jaCAiTGUgZ291dmVybmVtZW50IGF2YW5jZSBsJ2ludHJvZHVjdGlvbgotIyBkZSBsJ2hldXJlIGQnZXRlIiBzdGF0aW5nIHRoYXQgRFNUIGluIE1hdXJpdGl1cyBzdGFydGluZyBvbiBPY3RvYmVyIDI2Ci0jIGFuZCBlbmRpbmcgb24gTWFyY2ggMjcsIDIwMDkgaXMgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSMgLi4uCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfbWF1cml0aXVzMDIuaHRtbCI+CisjIGRlIGwnaGV1cmUgZCfDqXTDqSIgc3RhdGluZyB0aGF0IERTVCBpbiBNYXVyaXRpdXMgc3RhcnRpbmcgb24gT2N0b2JlciAyNgorIyBhbmQgZW5kaW5nIG9uIE1hcmNoIDI3LCAyMDA5IGlzIHRoZSBtb3N0IHJlY2VudCBvbmUuLi4uCiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfbWF1cml0aXVzMDIuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBSaWFkIE0uIEhvc3NlbiBBbGx5ICgyMDA4LTA4LTAzKToKICMgVGhlIEdvdmVybm1lbnQgb2YgTWF1cml0aXVzIHdlYmxpbmsKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb3YubXUvcG9ydGFsL3NpdGUvcG1vc2l0ZS9tZW51aXRlbS40Y2EwZWZkZWU0NzQ2MmU3NDQwYTYwMDI0OGE1MjFjYS8/Y29udGVudF9pZD00NzI4Y2E2OGIyYTViMTEwVmduVkNNMTAwMDAwMGEwNGE4YzBSQ1JEIj4KICMgaHR0cDovL3d3dy5nb3YubXUvcG9ydGFsL3NpdGUvcG1vc2l0ZS9tZW51aXRlbS40Y2EwZWZkZWU0NzQ2MmU3NDQwYTYwMDI0OGE1MjFjYS8/Y29udGVudF9pZD00NzI4Y2E2OGIyYTViMTEwVmduVkNNMTAwMDAwMGEwNGE4YzBSQ1JECi0jIDwvYT4KICMgQ2FiaW5ldCBEZWNpc2lvbiBvZiBKdWx5IDE4dGgsIDIwMDggc3RhdGVzIGFzIGZvbGxvd3M6CiAjCiAjIDQuIC4uLkNhYmluZXQgaGFzIGFncmVlZCB0byB0aGUgaW50cm9kdWN0aW9uIGludG8gdGhlIE5hdGlvbmFsIEFzc2VtYmx5CkBAIC02NDYsMzMgKzY0MCwyNSBAQAogIyBTdGF0ZXMgb2YgQW1lcmljYS4gSXQgd2lsbCBzdGFydCBhdCB0d28gbydjbG9jayBpbiB0aGUgbW9ybmluZyBvbiB0aGUKICMgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciBhbmQgd2lsbCBlbmQgYXQgdHdvIG8nY2xvY2sgaW4gdGhlIG1vcm5pbmcgb24KICMgdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIHRoZSBmb2xsb3dpbmcgeWVhci4gVGhlIHN1bW1lciB0aW1lIGZvciB0aGUKLSMgeWVhciAyMDA4IC0gMjAwOSB3aWxsLCB0aGVyZWZvcmUsIGJlIGVmZmVjdGl2ZSBhcyBmcm9tIDI2IE9jdG9iZXIgMjAwOAorIyB5ZWFyIDIwMDgtMjAwOSB3aWxsLCB0aGVyZWZvcmUsIGJlIGVmZmVjdGl2ZSBhcyBmcm9tIDI2IE9jdG9iZXIgMjAwOAogIyBhbmQgZW5kIG9uIDI5IE1hcmNoIDIwMDkuCiAKICMgRnJvbSBFZCBNYXN0ZSAoMjAwOC0xMC0wNyk6CiAjIFRIRSBUSU1FIEJJTEwgKE5vLiBYWFZJSSBvZiAyMDA4KSBFeHBsYW5hdG9yeSBNZW1vcmFuZHVtIHN0YXRlcyB0aGUKICMgYmVnaW5uaW5nIC8gZW5kaW5nIG9mIHN1bW1lciB0aW1lIGlzIDIgbydjbG9jayBzdGFuZGFyZCB0aW1lIGluIHRoZQogIyBtb3JuaW5nIG9mIHRoZSBsYXN0IFN1bmRheSBvZiBPY3RvYmVyIC8gbGFzdCBTdW5kYXkgb2YgTWFyY2guCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9nb2MvYXNzZW1ibHlzaXRlL2ZpbGUvYmlsbDI3MDgucGRmIj4KICMgaHR0cDovL3d3dy5nb3YubXUvcG9ydGFsL2dvYy9hc3NlbWJseXNpdGUvZmlsZS9iaWxsMjcwOC5wZGYKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA2LTA1KToKICMgQWNjb3JkaW5nIHRvIHNldmVyYWwgc291cmNlcywgTWF1cml0aXVzIHdpbGwgbm90IGNvbnRpbnVlIHRvIG9ic2VydmUKICMgRFNUIHRoZSBjb21pbmcgc3VtbWVyLi4uCiAjCiAjIFNvbWUgc291cmNlcywgaW4gRnJlbmNoOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRlZmltZWRpYS5pbmZvL25ld3MvOTQ2L1Jhc2hpZC1CZWViZWVqYXVuLTotJUMyJUFCLUwlRTIlODAlOTloZXVyZS1kJUUyJTgwJTk5JUMzJUE5dCVDMyVBOS1uZS1zZXJhLXBhcy1hcHBsaXF1JUMzJUE5ZS1jZXR0ZS1hbm4lQzMlQTllLSVDMiVCQiI+CiAjIGh0dHA6Ly93d3cuZGVmaW1lZGlhLmluZm8vbmV3cy85NDYvUmFzaGlkLUJlZWJlZWphdW4tOi0lQzIlQUItTCVFMiU4MCU5OWhldXJlLWQlRTIlODAlOTklQzMlQTl0JUMzJUE5LW5lLXNlcmEtcGFzLWFwcGxpcXUlQzMlQTllLWNldHRlLWFubiVDMyVBOWUtJUMyJUJCCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL2xleHByZXNzLm11L1N0b3J5LzMzOTh+QmVlYmVlamF1bi0tLUxlcy1vYmplY3RpZnMtZC0lQzMlQTljb25vbWllLWQtJUMzJUE5bmVyZ2llLWRlLWwtaGV1cmUtZC0lQzMlQTl0JUMzJUE5LW9udC0lQzMlQTl0JUMzJUE5LWF0dGVpbnRzLSI+CiAjIGh0dHA6Ly9sZXhwcmVzcy5tdS9TdG9yeS8zMzk4fkJlZWJlZWphdW4tLS1MZXMtb2JqZWN0aWZzLWQtJUMzJUE5Y29ub21pZS1kLSVDMyVBOW5lcmdpZS1kZS1sLWhldXJlLWQtJUMzJUE5dCVDMyVBOS1vbnQtJUMzJUE5dCVDMyVBOS1hdHRlaW50cy0KLSMgPC9hPgogIwogIyBPdXIgd3JhcC11cDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21hdXJpdGl1cy1kc3Qtd2lsbC1ub3QtcmVwZWF0Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbWF1cml0aXVzLWRzdC13aWxsLW5vdC1yZXBlYXQuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDctMTEpOgogIyBUaGUgIm1hdXJpdGl1cy1kc3Qtd2lsbC1ub3QtcmVwZWF0IiB3cmFwdXAgaW5jbHVkZXMgdGhpczoKQEAgLTY4NSwxOCArNjcxLDE4IEBACiBSdWxlIE1hdXJpdGl1cwkyMDA4CW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJUwogUnVsZSBNYXVyaXRpdXMJMjAwOQlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgSW5kaWFuL01hdXJpdGl1cwkzOjUwOjAwIC0JTE1UCTE5MDcJCSMgUG9ydCBMb3VpcworWm9uZSBJbmRpYW4vTWF1cml0aXVzCTM6NTA6MDAgLQlMTVQJMTkwNyAjIFBvcnQgTG91aXMKIAkJCTQ6MDAgTWF1cml0aXVzCU1VJXNUCSMgTWF1cml0aXVzIFRpbWUKICMgQWdhbGVnYSBJcywgUm9kcmlndWV6CiAjIG5vIGluZm9ybWF0aW9uOyBwcm9iYWJseSBsaWtlIEluZGlhbi9NYXVyaXRpdXMKIAogIyBNYXlvdHRlCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9NYXlvdHRlCTM6MDA6NTYgLQlMTVQJMTkxMSBKdWwJIyBNYW1vdXR6b3UKK1pvbmUJSW5kaWFuL01heW90dGUJMzowMDo1NiAtCUxNVAkxOTExIEp1bCAjIE1hbW91dHpvdQogCQkJMzowMAktCUVBVAogCiAjIE1vcm9jY28KLSMgU2VlIHRoZSBgZXVyb3BlJyBmaWxlIGZvciBTcGFuaXNoIE1vcm9jY28gKEFmcmljYS9DZXV0YSkuCisjIFNlZSB0aGUgJ2V1cm9wZScgZmlsZSBmb3IgU3BhbmlzaCBNb3JvY2NvIChBZnJpY2EvQ2V1dGEpLgogCiAjIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNS0wOSk6CiAjIEhlcmUgaXMgYW4gYXJ0aWNsZSB0aGF0IE1vcm9jY28gcGxhbiB0byBpbnRyb2R1Y2UgRGF5bGlnaHQgU2F2aW5nIFRpbWUgYmV0d2VlbgpAQCAtNzA0LDYwICs2OTAsNDQgQEAKICMKICMgIi4uLiBNb3JvY2NvIGlzIHRvIHNhdmUgZW5lcmd5IGJ5IGFkanVzdGluZyBpdHMgY2xvY2sgZHVyaW5nIHN1bW1lciBzbyBpdCB3aWxsCiAjIGJlIG9uZSBob3VyIGFoZWFkIG9mIEdNVCBiZXR3ZWVuIDEgSnVuZSBhbmQgMjcgU2VwdGVtYmVyLCBhY2NvcmRpbmcgdG8KLSMgQ29tbXVuaWNhdGlvbiBNaW5pc3RlciBhbmQgR292IGVybm1lbnQgU3Bva2VzbWFuLCBLaGFsaWQgTmFjaXJpLi4uLiIKKyMgQ29tbXVuaWNhdGlvbiBNaW5pc3RlciBhbmQgR292ZXJubWVudCBTcG9rZXNtYW4sIEtoYWxpZCBOYWNpcmkuLi4uIgogIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUubmV0L2RzdF9uZXdzL2RzdF9uZXdzX21vcm9jY28wMS5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDEuaHRtbAotIyA8L2E+Ci0jIE9SCi0jIDxhIGhyZWY9Imh0dHA6Ly9lbi5hZnJpay5jb20vbmV3czExODkyLmh0bWwiPgogIyBodHRwOi8vZW4uYWZyaWsuY29tL25ld3MxMTg5Mi5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDUtMDkpOgotIyBUaGUgTW9yb2NjbyB0aW1lIGNoYW5nZSBjYW4gYmUgY29uZmlybWVkIG9uIE1vcm9jY28gd2ViIHNpdGUgTWFnaHJlYiBBcmFiZSBQcmVzc2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFwLm1hL2VuZy9zZWN0aW9ucy9ib3gzL21vcm9jY29fc2hpZnRzX3RvX2RhL3ZpZXciPgorIyBUaGUgTW9yb2NjbyB0aW1lIGNoYW5nZSBjYW4gYmUgY29uZmlybWVkIG9uIE1vcm9jY28gd2ViIHNpdGUgTWFnaHJlYiBBcmFiZQorIyBQcmVzc2U6CiAjIGh0dHA6Ly93d3cubWFwLm1hL2VuZy9zZWN0aW9ucy9ib3gzL21vcm9jY29fc2hpZnRzX3RvX2RhL3ZpZXcKLSMgPC9hPgogIwogIyBNb3JvY2NvIHNoaWZ0cyB0byBkYXlsaWdodCB0aW1lIG9uIEp1bmUgMXN0IHRocm91Z2ggU2VwdGVtYmVyIDI3LCBHb3Z0LgogIyBzcG9rZXNtYW4uCiAKICMgRnJvbSBQYXRyaWNlIFNjYXR0b2xpbiAoMjAwOC0wNS0wOSk6CiAjIEFjY29yZGluZyB0byB0aGlzIGFydGljbGU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXZtYXJvYy5jb20vYWN0dWFsaXRlL2hldXJlLWRldGUtY29tbWVudC1hMTI3ODk2Lmh0bWwiPgogIyBodHRwOi8vd3d3LmF2bWFyb2MuY29tL2FjdHVhbGl0ZS9oZXVyZS1kZXRlLWNvbW1lbnQtYTEyNzg5Ni5odG1sCi0jIDwvYT4KLSMgKGFuZCByZXB1Ymxpc2hlZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFjdHUubWEvaGV1cmUtZGV0ZS1jb21tZW50X2kxMjc4OTZfMC5odG1sIj4KLSMgaHR0cDovL3d3dy5hY3R1Lm1hL2hldXJlLWRldGUtY29tbWVudF9pMTI3ODk2XzAuaHRtbAotIyA8L2E+Ci0jICkKLSMgdGhlIGNoYW5nZXMgb2NjdXJzIGF0IG1pZG5pZ2h0OgorIyAoYW5kIHJlcHVibGlzaGVkIGhlcmU6IDxodHRwOi8vd3d3LmFjdHUubWEvaGV1cmUtZGV0ZS1jb21tZW50X2kxMjc4OTZfMC5odG1sPikKKyMgdGhlIGNoYW5nZXMgb2NjdXIgYXQgbWlkbmlnaHQ6CiAjCi0jIHNhdHVyZGF5IG5pZ2h0IG1heSAzMXN0IGF0IG1pZG5pZ2h0ICh3aGljaCBpbiBmcmVuY2ggaXMgdG8gYmUKLSMgaW50cmVwcmV0ZWQgYXMgdGhlIG5pZ2h0IGJldHdlZW4gc2F0dXJkYXkgYW5kIHN1bmRheSkKLSMgc3VuZGF5IG5pZ2h0IHRoZSAyOHRoICBhdCBtaWRuaWdodAorIyBTYXR1cmRheSBuaWdodCBNYXkgMzFzdCBhdCBtaWRuaWdodCAod2hpY2ggaW4gRnJlbmNoIGlzIHRvIGJlCisjIGludGVycHJldGVkIGFzIHRoZSBuaWdodCBiZXR3ZWVuIFNhdHVyZGF5IGFuZCBTdW5kYXkpCisjIFN1bmRheSBuaWdodCB0aGUgMjh0aCBhdCBtaWRuaWdodAogIwotIyBTZWVpbmcgdGhhdCB0aGUgMjh0aCBpcyBtb25kYXksIEkgYW0gZ3Vlc3NpbmcgdGhhdCBzaGUgaW50ZW5kcyB0byBzYXkKLSMgdGhlIG1pZG5pZ2h0IG9mIHRoZSAyOHRoIHdoaWNoIGlzIHRoZSBtaWRuaWdodCBiZXR3ZWVuIHN1bmRheSBhbmQKLSMgbW9uZGF5LCB3aGljaCBqaXZlcyB3aXRoIG90aGVyIHNvdXJjZXMgdGhhdCBzYXkgdGhhdCBpdCdzIGluY2x1c2l2ZQotIyBqdW5lMXN0IHRvIHNlcHQgMjd0aC4KKyMgU2VlaW5nIHRoYXQgdGhlIDI4dGggaXMgTW9uZGF5LCBJIGFtIGd1ZXNzaW5nIHRoYXQgc2hlIGludGVuZHMgdG8gc2F5CisjIHRoZSBtaWRuaWdodCBvZiB0aGUgMjh0aCB3aGljaCBpcyB0aGUgbWlkbmlnaHQgYmV0d2VlbiBTdW5kYXkgYW5kCisjIE1vbmRheSwgd2hpY2ggaml2ZXMgd2l0aCBvdGhlciBzb3VyY2VzIHRoYXQgc2F5IHRoYXQgaXQncyBpbmNsdXNpdmUKKyMgSnVuZSAxc3QgdG8gU2VwdCAyN3RoLgogIwogIyBUaGUgZGVjaXNpb24gd2FzIHRha2VuIGJ5IGRlY3JlZSAqMi0wOC0yMjQgKmJ1dCBJIGNhbid0IGZpbmQgdGhlIGRlY3JlZQogIyBwdWJsaXNoZWQgb24gdGhlIHdlYi4KICMKICMgSXQncyBhbHNvIGNvbmZpcm1lZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcm9jLm1hL05SL2V4ZXJlcy9GQUNGMTQxRi1EOTEwLTQ0QjAtQjdGQS02RTAzNzMzNDI1RDEuaHRtIj4KICMgaHR0cDovL3d3dy5tYXJvYy5tYS9OUi9leGVyZXMvRkFDRjE0MUYtRDkxMC00NEIwLUI3RkEtNkUwMzczMzQyNUQxLmh0bQotIyA8L2E+Ci0jIG9uIGEgZ292ZXJubWVudCBwb3J0YWwgYXMgYmVpbmcgIGJldHdlZW4ganVuZSAxc3QgYW5kIHNlcHQgMjd0aCAobm90IHlldAotIyBwb3N0ZWQgaW4gZW5nbGlzaCkuCisjIG9uIGEgZ292ZXJubWVudCBwb3J0YWwgYXMgYmVpbmcgYmV0d2VlbiBKdW5lIDFzdCBhbmQgU2VwdCAyN3RoIChub3QgeWV0CisjIHBvc3RlZCBpbiBFbmdsaXNoKS4KICMKLSMgVGhlIGZvbGxvd2luZyBnb29nbGUgcXVlcnkgd2lsbCBnZW5lcmF0ZSBtYW55IHJlbGV2YW50IGhpdHM6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/aGw9ZW4mcT1Db25zZWlsK2RlK2dvdXZlcm5lbWVudCttYXJvYytoZXVyZSthdmFuY2UmYnRuRz1TZWFyY2giPgorIyBUaGUgZm9sbG93aW5nIEdvb2dsZSBxdWVyeSB3aWxsIGdlbmVyYXRlIG1hbnkgcmVsZXZhbnQgaGl0czoKICMgaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9obD1lbiZxPUNvbnNlaWwrZGUrZ291dmVybmVtZW50K21hcm9jK2hldXJlK2F2YW5jZSZidG5HPVNlYXJjaAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDgtMjcpOgogIyBNb3JvY2NvIHdpbGwgY2hhbmdlIHRoZSBjbG9ja3MgYmFjayBvbiB0aGUgbWlkbmlnaHQgYmV0d2VlbiBBdWd1c3QgMzEKQEAgLTc2NSw0NyArNzM1LDMyIEBACiAjIG9mIFNlcHRlbWJlcjoKICMKICMgT25lIGFydGljbGUgYWJvdXQgaXQgKGluIEZyZW5jaCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWVuYXJhLm1hL2ZyL0FjdHVhbGl0ZXMvTWFyb2MvU29jaWV0ZS9jaS5yZXRvdXJfYV9sX2hldXJlX2dtdF9hX3BhcnRpcl9kdV9kaW1hbmNoZV8zMV9hb3V0X2FfbWludWl0X29mZmljaWVsXy5kZWZhdWx0Ij4KICMgaHR0cDovL3d3dy5tZW5hcmEubWEvZnIvQWN0dWFsaXRlcy9NYXJvYy9Tb2NpZXRlL2NpLnJldG91cl9hX2xfaGV1cmVfZ210X2FfcGFydGlyX2R1X2RpbWFuY2hlXzMxX2FvdXRfYV9taW51aXRfb2ZmaWNpZWxfLmRlZmF1bHQKLSMgPC9hPgogIwogIyBXZSBoYXZlIHNvbWUgZnVydGhlciBkZXRhaWxzIHBvc3RlZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1lbmRzLWRzdC1lYXJseS0yMDA4Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1lbmRzLWRzdC1lYXJseS0yMDA4Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTE3KToKICMgTW9yb2NjbyB3aWxsIG9ic2VydmUgRFNUIGZyb20gMjAwOS0wNi0wMSAwMDowMCB0byAyMDA5LTA4LTIxIDAwOjAwIGFjY29yZGluZwogIyB0byBtYW55IHNvdXJjZXMsIHN1Y2ggYXMKLSMgPGEgaHJlZj0iaHR0cDovL25ld3MubWFyd2ViLmNvbS9tb3JvY2NvL2VudGVydGFpbm1lbnQvbW9yb2Njby1kYXlsaWdodC1zYXZpbmcuaHRtbCI+CiAjIGh0dHA6Ly9uZXdzLm1hcndlYi5jb20vbW9yb2Njby9lbnRlcnRhaW5tZW50L21vcm9jY28tZGF5bGlnaHQtc2F2aW5nLmh0bWwKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1lZGkxc2F0Lm1hL2ZyL2RlcGVjaGUuYXNweD9pZHA9MjMxMiI+CiAjIGh0dHA6Ly93d3cubWVkaTFzYXQubWEvZnIvZGVwZWNoZS5hc3B4P2lkcD0yMzEyCi0jIDwvYT4KICMgKEZyZW5jaCkKICMKICMgT3VyIHN1bW1hcnk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLXN0YXJ0cy1kc3QtMjAwOS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21vcm9jY28tc3RhcnRzLWRzdC0yMDA5Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTAzLTE3KToKICMgSGVyZSBpcyBhIGxpbmsgdG8gb2ZmaWNpYWwgZG9jdW1lbnQgZnJvbSBSb3lhdW1lIGR1IE1hcm9jIFByZW1pZXIgTWluaXN0cmUsCi0jIE1pbmlzdGVyZSBkZSBsYSBNb2Rlcm5pc2F0aW9uIGRlcyBTZWN0ZXVycyBQdWJsaWNzCisjIE1pbmlzdMOocmUgZGUgbGEgTW9kZXJuaXNhdGlvbiBkZXMgU2VjdGV1cnMgUHVibGljcwogIwogIyBVbmRlciBBcnRpY2xlIDEgb2YgUm95YWwgRGVjcmVlIE5vLiA0NTUtNjcgb2YgQWN0IDIzIHNhZmFyIDEzODcgKDIganVuZSAxOTY3KQogIyBjb25jZXJuaW5nIHRoZSBhbWVuZG1lbnQgb2YgdGhlIGxlZ2FsIHRpbWUsIHRoZSBNaW5pc3RyeSBvZiBNb2Rlcm5pemF0aW9uIG9mCiAjIFB1YmxpYyBTZWN0b3JzIGFubm91bmNlZCB0aGF0IHRoZSBvZmZpY2lhbCB0aW1lIGluIHRoZSBLaW5nZG9tIHdpbGwgYmUKICMgYWR2YW5jZWQgNjAgbWludXRlcyBmcm9tIFN1bmRheSAzMSBNYXkgMjAwOSBhdCBtaWRuaWdodC4KICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tbXNwLmdvdi5tYS9mcmFuY2Fpcy9BY3R1YWxpdGVzX2ZyL1BERl9BY3R1YWxpdGVzX0ZyL0hldXJlRXRlX0ZSLnBkZiI+CiAjIGh0dHA6Ly93d3cubW1zcC5nb3YubWEvZnJhbmNhaXMvQWN0dWFsaXRlc19mci9QREZfQWN0dWFsaXRlc19Gci9IZXVyZUV0ZV9GUi5wZGYKLSMgPC9hPgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21vcm9jY28wMy5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDMuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTAtMDQtMTMpOgogIyBTZXZlcmFsIG5ld3MgbWVkaWEgaW4gTW9yb2NjbyByZXBvcnQgdGhhdCB0aGUgTWluaXN0cnkgb2YgTW9kZXJuaXphdGlvbgpAQCAtODEzLDUxICs3NjgsMzMgQEAKICMgMjAxMC0wNS0wMiB0byAyMDEwLTA4LTA4LgogIwogIyBFeGFtcGxlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxhdmllZWNvLmNvbS9hY3R1YWxpdGVzLzQwOTktbGUtbWFyb2MtcGFzc2VyYS1hLWwtaGV1cmUtZC1ldGUtZ210MS1sZS0yLW1haS5odG1sIj4KICMgaHR0cDovL3d3dy5sYXZpZWVjby5jb20vYWN0dWFsaXRlcy80MDk5LWxlLW1hcm9jLXBhc3NlcmEtYS1sLWhldXJlLWQtZXRlLWdtdDEtbGUtMi1tYWkuaHRtbAotIyA8L2E+CiAjIChGcmVuY2gpCiAjIE91ciBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1zdGFydHMtZHN0LTIwMTAuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLXN0YXJ0cy1kc3QtMjAxMC5odG1sCi0jIDwvYT4KIAogIyBGcm9tIERhbiBBYml0b2wgKDIwMTEtMDMtMzApOgogIyAuLi5SdWxlcyBmb3IgQWZyaWNhL0Nhc2FibGFuY2EgYXJlIHRoZSBmb2xsb3dpbmcgKDI0aCBmb3JtYXQpCi0jIFRoZSAzcmQgYXByaWwgMjAxMSBhdCAwMDowMDowMCwgW2l0XSB3aWxsIGJlIDNyZCBhcHJpbCAxOjAwOjAwCi0jIFRoZSAzMXRoIGp1bHkgMjAxMSBhdCAwMDo1OTo1OSwgIFtpdF0gd2lsbCBiZSAzMXRoIEp1bHkgMDA6MDA6MDAKKyMgVGhlIDNyZCBBcHJpbCAyMDExIGF0IDAwOjAwOjAwLCBbaXRdIHdpbGwgYmUgM3JkIEFwcmlsIDAxOjAwOjAwCisjIFRoZSAzMXN0IEp1bHkgMjAxMSBhdCAwMDo1OTo1OSwgW2l0XSB3aWxsIGJlIDMxc3QgSnVseSAwMDowMDowMAogIyAuLi5PZmZpY2lhbCBsaW5rcyBvZiBjaGFuZ2UgaW4gbW9yb2NjbwogIyBUaGUgY2hhbmdlIHdhcyBicm9hZGNhc3Qgb24gdGhlIEZNIFJhZGlvCiAjIEkgdmUgY2FsbGVkIEFOUlQgKHRlbGVjb20gcmVndWxhdGlvbnMgaW4gTW9yb2NjbykgYXQKICMgKzIxMi41MzcuNzEuODQuMDAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbnJ0Lm5ldC5tYS9mci8iPgogIyBodHRwOi8vd3d3LmFucnQubmV0Lm1hL2ZyLwotIyA8L2E+CiAjIFRoZXkgc2FpZCB0aGF0Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFwLm1hL2ZyL3NlY3Rpb25zL2FjY3VlaWwvbF9oZXVyZV9sZWdhbGVfYXVfbWEvdmlldyI+CiAjIGh0dHA6Ly93d3cubWFwLm1hL2ZyL3NlY3Rpb25zL2FjY3VlaWwvbF9oZXVyZV9sZWdhbGVfYXVfbWEvdmlldwotIyA8L2E+CiAjIGlzIHRoZSBvZmZpY2lhbCBwdWJsaWNhdGlvbiB0byBsb29rIGF0LgogIyBUaGV5IHNhaWQgdGhhdCB0aGUgZGVjaXNpb24gd2FzIGFscmVhZHkgdGFrZW4uCiAjCiAjIE1vcmUgYXJ0aWNsZXMgaW4gdGhlIHByZXNzCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cueWFiaWxhZGkuY29tL2FydGljbGVzL2RldGFpbHMvNTA1OC9zZWNyZXQtbC1oZXVyZS1kLWV0ZS1tYXJvYy1sZXYiPgotIyBodHRwOi8vd3d3LnlhYmlsYWRpLmNvbS9hcnRpY2xlcy9kZXRhaWxzLzUwNTgvc2VjcmV0LWwtaGV1cmUtZC1ldGUtbWFyb2MtbGV2Ci0jIDwvYT4KLSMgZS5odG1sCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGVtYXRpbi5tYS9BY3R1YWxpdGUvRXhwcmVzcy9BcnRpY2xlLmFzcD9pZD0xNDg5MjMiPgorIyBodHRwOi8vd3d3LnlhYmlsYWRpLmNvbS9hcnRpY2xlcy9kZXRhaWxzLzUwNTgvc2VjcmV0LWwtaGV1cmUtZC1ldGUtbWFyb2MtbGV2ZS5odG1sCiAjIGh0dHA6Ly93d3cubGVtYXRpbi5tYS9BY3R1YWxpdGUvRXhwcmVzcy9BcnRpY2xlLmFzcD9pZD0xNDg5MjMKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxhdmllZWNvLmNvbS9hY3R1YWxpdGUvTGUtTWFyb2MtcGFzc2Utc3VyLUdNVCUyQjEtYS1wYXJ0aXItZGUtZGltIj4KICMgaHR0cDovL3d3dy5sYXZpZWVjby5jb20vYWN0dWFsaXRlL0xlLU1hcm9jLXBhc3NlLXN1ci1HTVQlMkIxLWEtcGFydGlyLWRlLWRpbQotIyBhbmNoZS1wcm9jaGFpbi01NTM4Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gUGV0ciBNYWNoYXRhICgyMDExLTAzLTMwKToKICMgVGhleSBoYXZlIGl0IHdyaXR0ZW4gaW4gRW5nbGlzaCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcC5tYS9lbmcvc2VjdGlvbnMvaG9tZS9tb3JvY2NvX3RvX3NwcmluZ19mby92aWV3Ij4KICMgaHR0cDovL3d3dy5tYXAubWEvZW5nL3NlY3Rpb25zL2hvbWUvbW9yb2Njb190b19zcHJpbmdfZm8vdmlldwotIyA8L2E+CiAjCiAjIEl0IHNheXMgdGhlcmUgdGhhdCAiTW9yb2NjbyB3aWxsIHJlc3VtZSBpdHMgc3RhbmRhcmQgdGltZSBvbiBKdWx5IDMxLAogIyAyMDExIGF0IG1pZG5pZ2h0LiIgTm93IHRoZXkgZG9uJ3Qgc2F5IHdoZXRoZXIgdGhleSBtZWFuIG1pZG5pZ2h0IG9mCkBAIC04NjUsMjAgKzgwMiwxNiBAQAogIyBhbHNvIGJlZW4gbGlrZSB0aGF0IGluIHRoZSBwYXN0LgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEyLTAzLTA5KToKLSMgQWNjb3JkaW5nIHRvIEluZm9tJmVhY3V0ZTtkaWFpcmUgd2ViIHNpdGUgZnJvbSBNb3JvY2NvIChpbmZvbWVkaWFpcmUubWEpLAotIyBvbiBNYXJjaCA5LCAyMDEyLCAoaW4gRnJlbmNoKSBIZXVyZSBsJmVhY3V0ZTtnYWxlOgotIyBMZSBNYXJvYyBhZG9wdGUgb2ZmaWNpZWxsZW1lbnQgbCdoZXVyZSBkJyZlYWN1dGU7dCZlYWN1dGU7Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb21lZGlhaXJlLm1hL25ld3MvbWFyb2MvaGV1cmUtbCVDMyVBOWdhbGUtbGUtbWFyb2MtYWRvcHRlLW9mZmljaWVsbGVtZW50LWxoZXVyZS1kJUMzJUE5dCVDMyVBOSI+CisjIEFjY29yZGluZyB0byBJbmZvbcOpZGlhaXJlIHdlYiBzaXRlIGZyb20gTW9yb2NjbyAoaW5mb21lZGlhaXJlLm1hKSwKKyMgb24gTWFyY2ggOSwgMjAxMiwgKGluIEZyZW5jaCkgSGV1cmUgbMOpZ2FsZToKKyMgTGUgTWFyb2MgYWRvcHRlIG9mZmljaWVsbGVtZW50IGwnaGV1cmUgZCfDqXTDqQogIyBodHRwOi8vd3d3LmluZm9tZWRpYWlyZS5tYS9uZXdzL21hcm9jL2hldXJlLWwlQzMlQTlnYWxlLWxlLW1hcm9jLWFkb3B0ZS1vZmZpY2llbGxlbWVudC1saGV1cmUtZCVDMyVBOXQlQzMlQTkKLSMgPC9hPgogIyBHb3Zlcm5pbmcgQ291bmNpbCBhZG9wdGVkIGRyYWZ0IGRlY3JlZSwgdGhhdCBNb3JvY2NvIERTVCBzdGFydHMgb24KICMgdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIChNYXJjaCAyNSwgMjAxMikgYW5kIGVuZHMgb24KICMgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyIChTZXB0ZW1iZXIgMzAsIDIwMTIpCiAjIGV4Y2VwdCB0aGUgbW9udGggb2YgUmFtYWRhbi4KICMgb3IgKGJyaWVmKQotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21vcm9jY28wNi5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDYuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTItMDMtMTApOgogIyBUaGUgaW5mb21lZGlhaXJlLm1hIHNvdXJjZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtIGlzIHRvIGJlIGluCkBAIC04ODksMTcgKzgyMiwxMyBAQAogCiAjIEZyb20gQ2hyaXN0b3BoZSBUcm9wYW1lciAoMjAxMi0wMy0xNik6CiAjIFNlZW4gTW9yb2NjbyBjaGFuZ2UgYWdhaW46Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGUydW1pbnV0ZXMuY29tL2FjdHVhbGl0ZS5waHAiPgogIyBodHRwOi8vd3d3LmxlMnVtaW51dGVzLmNvbS9hY3R1YWxpdGUucGhwCi0jIDwvYT4KLSMgIi4uLiZhZ3JhdmU7IHBhcnRpciBkdSBkZXJuaWVyIGRpbWFuY2UgZCdhdnJpbCBldCBub24gZmlucyBtYXJzLAotIyBjb21tZSBhbm5vbmMmZWFjdXRlOyBwciZlYWN1dGU7YyZlYWN1dGU7ZGVtbWVudC4iCisjICIuLi7DoCBwYXJ0aXIgZHUgZGVybmllciBkaW1hbmNoZSBkJ2F2cmlsIGV0IG5vbiBmaW5zIG1hcnMsCisjIGNvbW1lIGFubm9uY8OpIHByw6ljw6lkZW1tZW50LiIKIAogIyBGcm9tIE1pbGFtYmVyIFNwYWNlIE5ldHdvcmsgKDIwMTItMDctMTcpOgogIyBUaGUgb2ZmaWNpYWwgcmV0dXJuIHRvIEdNVCBpcyBhbm5vdW5jZWQgYnkgdGhlIE1vcm9jY2FuIGdvdmVybm1lbnQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1zcC5nb3YubWEvZnIvYWN0dWFsaXRlcy5hc3B4P2lkPTI4OCI+CiAjIGh0dHA6Ly93d3cubW1zcC5nb3YubWEvZnIvYWN0dWFsaXRlcy5hc3B4P2lkPTI4OCBbaW4gRnJlbmNoXQotIyA8L2E+CiAjCiAjIEdvb2dsZSB0cmFuc2xhdGlvbiwgbGlnaHRseSBlZGl0ZWQ6CiAjIEJhY2sgdG8gdGhlIHN0YW5kYXJkIHRpbWUgb2YgdGhlIEtpbmdkb20gKEdNVCkKQEAgLTkxNyw3ICs4NDYsNyBAQAogIyBhbm5vdW5jZWQgYSBiaXQgaW4gYWR2YW5jZS4gIE9uIDIwMTItMDctMTEgdGhlIE1vcm9jY2FuIGdvdmVybm1lbnQKICMgYW5ub3VuY2VkIHRoYXQgeWVhcidzIFJhbWFkYW4gZGF5bGlnaHQtc2F2aW5nIHRyYW5zaXRpb25zIHdvdWxkIGJlCiAjIDIwMTItMDctMjAgYW5kIDIwMTItMDgtMjA7IHNlZQotIyA8aHR0cDovL3d3dy5tbXNwLmdvdi5tYS9mci9hY3R1YWxpdGVzLmFzcHg/aWQ9Mjg4Pi4KKyMgaHR0cDovL3d3dy5tbXNwLmdvdi5tYS9mci9hY3R1YWxpdGVzLmFzcHg/aWQ9Mjg4CiAKICMgRnJvbSBBbmRyZXcgUGFwcm9ja2kgKDIwMTMtMDctMDIpOgogIyBNb3JvY2NvIGFubm91bmNlZCB0aGF0IHRoZSB5ZWFyJ3MgUmFtYWRhbiBkYXlsaWdodC1zYXZpbmdzCkBAIC05MzcsMzkgKzg2NiwzNiBAQAogIyBGcm9tIFNlYmFzdGllbiBXaWxsZW1pam5zICgyMDE0LTAzLTE4KToKICMgaHR0cDovL3d3dy5hZnJpcXVpbmZvcy5jb20vYXJ0aWNsZXMvMjAxNC8zLzE4L21hcm9jLWhldXJlLWRldGUtYXZhbmNlei10b3VzLWhvcmxvZ2VzLTI0Nzg5MS5hc3AKIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTAzLTE5KToKLSMgVG8gZXN0aW1hdGUgd2hhdCB0aGUgTW9yb2NjYW4gZ292ZXJubWVudCB3aWxsIGRvIGluIGZ1dHVyZSB5ZWFycywKLSMgdHJhbnNpdGlvbiBkYXRlcyBmb3IgMjAxNCB0aHJvdWdoIDIwMzggd2VyZSBkZXRlcm1pbmVkIGJ5IHJ1bm5pbmcKLSMgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHVuZGVyIEdOVSBFbWFjcyAyNC4zOgotIwotIyAobGV0ICgoaXNsYW1pYy15ZWFyIDE0MzUpKQotIyAgICh3aGlsZSAoPCBpc2xhbWljLXllYXIgMTQ2MSkKLSMgICAgIChsZXQgKChhCi0jCSAgICAgKGNhbGVuZGFyLWdyZWdvcmlhbi1mcm9tLWFic29sdXRlCi0jCSAgICAgIChjYWxlbmRhci1pc2xhbWljLXRvLWFic29sdXRlIChsaXN0IDkgMSBpc2xhbWljLXllYXIpKSkpCi0jCSAgICAoYgotIwkgICAgIChjYWxlbmRhci1ncmVnb3JpYW4tZnJvbS1hYnNvbHV0ZQotIwkgICAgICAoY2FsZW5kYXItaXNsYW1pYy10by1hYnNvbHV0ZSAobGlzdCAxMCAxIGlzbGFtaWMteWVhcikpKSkpCi0jCShpbnNlcnQKLSMJIChmb3JtYXQKLSMJICAoY29uY2F0ICJSdWxlXHRNb3JvY2NvXHQlZFx0b25seVx0LVx0JXNcdCAlMmRcdCAzOjAwXHQwXHQtXG4iCi0jCQkgICJSdWxlXHRNb3JvY2NvXHQlZFx0b25seVx0LVx0JXNcdCAlMmRcdCAyOjAwXHQxOjAwXHRTXG4iKQotIwkgIChjYXIgKGNkciAoY2RyIGEpKSkgKGNhbGVuZGFyLW1vbnRoLW5hbWUgKGNhciBhKSB0KSAoY2FyIChjZHIgYSkpCi0jCSAgKGNhciAoY2RyIChjZHIgYikpKSAoY2FsZW5kYXItbW9udGgtbmFtZSAoY2FyIGIpIHQpIChjYXIgKGNkciBiKSkpKSkKKyMgRnJvbSBNaWxhbWJlciBTcGFjZSBOZXR3b3JrICgyMDE0LTA2LTA1KToKKyMgVGhlIE1vcm9jY2FuIGdvdmVybm1lbnQgaGFzIHJlY2VudGx5IGFubm91bmNlZCB0aGF0IHRoZSBjb3VudHJ5IHdpbGwgcmV0dXJuCisjIHRvIHN0YW5kYXJkIHRpbWUgYXQgMDM6MDAgb24gU2F0dXJkYXksIEp1bmUgMjgsIDIwMTQgbG9jYWwgdGltZS4uLi4gIERTVAorIyB3aWxsIHJlc3VtZSBhZ2FpbiBhdCAwMjowMCBvbiBTYXR1cmRheSwgQXVndXN0IDIsIDIwMTQuLi4uCisjIGh0dHA6Ly93d3cubW1zcC5nb3YubWEvZnIvYWN0dWFsaXRlcy5hc3B4P2lkPTU4NgorCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDYtMDUpOgorIyBGb3Igbm93LCBndWVzcyB0aGF0IGxhdGVyIHNwcmluZyBhbmQgZmFsbCB0cmFuc2l0aW9ucyB3aWxsIHVzZSAyMDE0J3MgcnVsZXMsCisjIGFuZCBndWVzcyB0aGF0IE1vcm9jY28gd2lsbCBzd2l0Y2ggdG8gc3RhbmRhcmQgdGltZSBhdCAwMzowMCB0aGUgbGFzdAorIyBTYXR1cmRheSBiZWZvcmUgUmFtYWRhbiwgYW5kIGJhY2sgdG8gRFNUIGF0IDAyOjAwIHRoZSBmaXJzdCBTYXR1cmRheSBhZnRlcgorIyBSYW1hZGFuLiAgVG8gaW1wbGVtZW50IHRoaXMsIHRyYW5zaXRpb24gZGF0ZXMgZm9yIDIwMTUgdGhyb3VnaCAyMDM3IHdlcmUKKyMgZGV0ZXJtaW5lZCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSB1bmRlciBHTlUgRW1hY3MgMjQuMywgd2l0aCB0aGUKKyMgcmVzdWx0cyBpbnRlZ3JhdGVkIGJ5IGhhbmQgaW50byB0aGUgdGFibGUgYmVsb3cuCisjIChsZXQgKChpc2xhbWljLXllYXIgMTQzNikpCisjICAgKHdoaWxlICg8IGlzbGFtaWMteWVhciAxNDYwKQorIyAgICAgKGxldCAoKGEgKGNhbGVuZGFyLWlzbGFtaWMtdG8tYWJzb2x1dGUgKGxpc3QgOSAxIGlzbGFtaWMteWVhcikpKQorIyAgICAgICAgICAgKGIgKGNhbGVuZGFyLWlzbGFtaWMtdG8tYWJzb2x1dGUgKGxpc3QgMTAgMSBpc2xhbWljLXllYXIpKSkKKyMgICAgICAgICAgIChzYXR1cmRheSA2KSkKKyMgICAgICAgKHdoaWxlICgvPSBzYXR1cmRheSAobW9kIChzZXRxIGEgKDEtIGEpKSA3KSkpCisjICAgICAgICh3aGlsZSAoLz0gc2F0dXJkYXkgKG1vZCBiIDcpKQorIyAgICAgICAgIChzZXRxIGIgKDErIGIpKSkKKyMgICAgICAgKHNldHEgYSAoY2FsZW5kYXItZ3JlZ29yaWFuLWZyb20tYWJzb2x1dGUgYSkpCisjICAgICAgIChzZXRxIGIgKGNhbGVuZGFyLWdyZWdvcmlhbi1mcm9tLWFic29sdXRlIGIpKQorIyAgICAgICAoaW5zZXJ0CisjICAgICAgICAoZm9ybWF0CisjICAgICAgICAgKGNvbmNhdCAiUnVsZVx0TW9yb2Njb1x0JWRcdG9ubHlcdC1cdCVzXHQlMmRcdCAzOjAwXHQwXHQtXG4iCisjICAgICAgICAgICAgICAgICAiUnVsZVx0TW9yb2Njb1x0JWRcdG9ubHlcdC1cdCVzXHQlMmRcdCAyOjAwXHQxOjAwXHRTXG4iKQorIyAgICAgICAgIChjYXIgKGNkciAoY2RyIGEpKSkgKGNhbGVuZGFyLW1vbnRoLW5hbWUgKGNhciBhKSB0KSAoY2FyIChjZHIgYSkpCisjICAgICAgICAgKGNhciAoY2RyIChjZHIgYikpKSAoY2FsZW5kYXItbW9udGgtbmFtZSAoY2FyIGIpIHQpIChjYXIgKGNkciBiKSkpKSkKICMgICAgIChzZXRxIGlzbGFtaWMteWVhciAoKyAxIGlzbGFtaWMteWVhcikpKSkKLSMKLSMgd2l0aCBzcHJpbmctZm9yd2FyZCB0cmFuc2l0aW9ucyByZW1vdmVkIGZvciAyMDIzLTIwMjUsIHdoZW4gdGhlCi0jIG5vcm1hbCBzcHJpbmctZm9yd2FyZCBkYXRlIGZhbGxzIGR1cmluZyB0aGUgZXN0aW1hdGVkIFJhbWFkYW47IHdpdGgKLSMgYWxsIHRyYW5zaXRpb25zIHJlbW92ZWQgZm9yIDIwMjYtMjAzNSwgd2hlcmUgdGhlIGVzdGltYXRlZCBSYW1hZGFuCi0jIGZhbGxzIGVudGlyZWx5IG91dHNpZGUgZGF5bGlnaHQtc2F2aW5nIHRpbWU7IGFuZCB3aXRoIGZhbGwtYmFjawotIyB0cmFuc2l0aW9ucyByZW1vdmVkIGZvciAyMDM2LTIwMzcsIHdoZXJlIHRoZSBub3JtYWwgZmFsbC1iYWNrCi0jIGRhdGUgZmFsbHMgZHVyaW5nIHRoZSBlc3RpbWF0ZWQgUmFtYWRhbi4gIE5vcm1hbGx5LCB0aGUgdGFibGUgd291bGQKLSMgc3RvcCBhZnRlciAyMDM3IGJlY2F1c2UgMzItYml0IHRpbWVfdCB2YWx1ZXMgcm9sbCBhcm91bmQgZWFybHkgaW4gMjAzOCwKLSMgYnV0IHRoYXQgd291bGQgaW1wbHkgYSBwcmVkaWN0aW9uIG9mIHBlcnBldHVhbCBEU1QgYWZ0ZXIgTWFyY2ggMjAzOAotIyBkdWUgdG8gdGhlIHllYXItMjAzNyBnbGl0Y2hlcy4gIFNvLCB0aGlzIHRhYmxlIGluc3RlYWQgc3RvcHMgYWZ0ZXIKLSMgMjAzOCwgdGhlIGZpcnN0IG5vbi1nbGl0Y2h5IHllYXIgYWZ0ZXIgdGhlIDMyLWJpdCByb2xsb3Zlci4KLSMgQW4gYWR2YW50YWdlIG9mIHN0b3BwaW5nIGFmdGVyIDIwMzggaXMgdGhhdCBpdCBsZXRzIHppYyBndWVzcwotIyBUWj0nV0VUMFdFU1QsTTMuNS4wLE0xMC41LjAvMycgZm9yIHRpbWUgc3RhbXBzIGZhciBpbiB0aGUgZnV0dXJlLgogCiAjIFJVTEUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogCkBAIC05OTEsNDYgKzkxNyw0NCBAQAogUnVsZQlNb3JvY2NvCTIwMDgJb25seQktCUp1bgkgMQkgMDowMAkxOjAwCVMKIFJ1bGUJTW9yb2NjbwkyMDA4CW9ubHkJLQlTZXAJIDEJIDA6MDAJMAktCiBSdWxlCU1vcm9jY28JMjAwOQlvbmx5CS0JSnVuCSAxCSAwOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMDkJb25seQktCUF1ZwkgMjEJIDA6MDAJMAktCitSdWxlCU1vcm9jY28JMjAwOQlvbmx5CS0JQXVnCTIxCSAwOjAwCTAJLQogUnVsZQlNb3JvY2NvCTIwMTAJb25seQktCU1heQkgMgkgMDowMAkxOjAwCVMKIFJ1bGUJTW9yb2NjbwkyMDEwCW9ubHkJLQlBdWcJIDgJIDA6MDAJMAktCiBSdWxlCU1vcm9jY28JMjAxMQlvbmx5CS0JQXByCSAzCSAwOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTEJb25seQktCUp1bAkgMzEJIDAJMAktCi1SdWxlCU1vcm9jY28JMjAxMgkyMDEzCS0JQXByCSBsYXN0U3VuIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAxMglvbmx5CS0JU2VwCSAzMAkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDEyCW9ubHkJLQlKdWwJIDIwCSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMTIJb25seQktCUF1ZwkgMjAJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAxMwlvbmx5CS0JSnVsCSAgNwkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDEzCW9ubHkJLQlBdWcJIDEwCSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTMJMjAzNQktCU9jdAkgbGFzdFN1biAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMTQJMjAyMgktCU1hcgkgbGFzdFN1biAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTQJb25seQktCUp1bgkgMjkJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAxNAlvbmx5CS0JSnVsCSAyOQkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDE1CW9ubHkJLQlKdW4JIDE4CSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMTUJb25seQktCUp1bAkgMTgJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAxNglvbmx5CS0JSnVuCSAgNwkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDE2CW9ubHkJLQlKdWwJICA3CSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMTcJb25seQktCU1heQkgMjcJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAxNwlvbmx5CS0JSnVuCSAyNgkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDE4CW9ubHkJLQlNYXkJIDE2CSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMTgJb25seQktCUp1bgkgMTUJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAxOQlvbmx5CS0JTWF5CSAgNgkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDE5CW9ubHkJLQlKdW4JICA1CSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMjAJb25seQktCUFwcgkgMjQJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAyMAlvbmx5CS0JTWF5CSAyNAkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDIxCW9ubHkJLQlBcHIJIDEzCSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMjEJb25seQktCU1heQkgMTMJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAyMglvbmx5CS0JQXByCSAgMwkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDIyCW9ubHkJLQlNYXkJICAzCSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMjMJb25seQktCUFwcgkgMjIJIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAyNAlvbmx5CS0JQXByCSAxMAkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDI1CW9ubHkJLQlNYXIJIDMxCSAyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMjYJbWF4CS0JTWFyCSBsYXN0U3VuIDI6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAzNglvbmx5CS0JT2N0CSAyMQkgMzowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDM3CW9ubHkJLQlPY3QJIDExCSAzOjAwCTAJLQotUnVsZQlNb3JvY2NvCTIwMzgJb25seQktCVNlcAkgMzAJIDM6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAzOAlvbmx5CS0JT2N0CSAzMAkgMjowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkyMDM4CW1heAktCU9jdAkgbGFzdFN1biAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTEJb25seQktCUp1bAkzMQkgMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDEyCTIwMTMJLQlBcHIJbGFzdFN1bgkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDEyCW9ubHkJLQlTZXAJMzAJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAxMglvbmx5CS0JSnVsCTIwCSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTIJb25seQktCUF1ZwkyMAkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDEzCW9ubHkJLQlKdWwJIDcJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAxMwlvbmx5CS0JQXVnCTEwCSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMTMJbWF4CS0JT2N0CWxhc3RTdW4JIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAxNAkyMDIyCS0JTWFyCWxhc3RTdW4JIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAxNAlvbmx5CS0JSnVuCTI4CSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTQJb25seQktCUF1ZwkgMgkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDE1CW9ubHkJLQlKdW4JMTMJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAxNQlvbmx5CS0JSnVsCTE4CSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMTYJb25seQktCUp1bgkgNAkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDE2CW9ubHkJLQlKdWwJIDkJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAxNwlvbmx5CS0JTWF5CTIwCSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMTcJb25seQktCUp1bAkgMQkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDE4CW9ubHkJLQlNYXkJMTIJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAxOAlvbmx5CS0JSnVuCTE2CSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMTkJb25seQktCU1heQkgNAkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDE5CW9ubHkJLQlKdW4JIDgJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAyMAlvbmx5CS0JQXByCTE4CSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMjAJb25seQktCU1heQkzMAkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDIxCW9ubHkJLQlBcHIJMTAJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAyMQlvbmx5CS0JTWF5CTE1CSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMjIJb25seQktCUFwcgkgMgkgMzowMAkwCS0KK1J1bGUJTW9yb2NjbwkyMDIyCW9ubHkJLQlNYXkJIDcJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAyMwlvbmx5CS0JQXByCTIyCSAyOjAwCTE6MDAJUworUnVsZQlNb3JvY2NvCTIwMjQJb25seQktCUFwcgkxMwkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDI1CW9ubHkJLQlBcHIJIDUJIDI6MDAJMTowMAlTCitSdWxlCU1vcm9jY28JMjAyNgltYXgJLQlNYXIJbGFzdFN1bgkgMjowMAkxOjAwCVMKK1J1bGUJTW9yb2NjbwkyMDM1CW9ubHkJLQlPY3QJMjcJIDM6MDAJMAktCitSdWxlCU1vcm9jY28JMjAzNglvbmx5CS0JT2N0CTE4CSAzOjAwCTAJLQorUnVsZQlNb3JvY2NvCTIwMzcJb25seQktCU9jdAkxMAkgMzowMAkwCS0KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBZnJpY2EvQ2FzYWJsYW5jYQktMDozMDoyMCAtCUxNVAkxOTEzIE9jdCAyNgpAQCAtMTA0OSwxMSArOTczLDE3IEBACiAjIEFzc3VtZSB0aGF0IHRoaXMgaGFzIGJlZW4gdHJ1ZSBzaW5jZSBXZXN0ZXJuIFNhaGFyYSBzd2l0Y2hlZCB0byBHTVQsCiAjIHNpbmNlIG1vc3Qgb2YgaXQgd2FzIHRoZW4gY29udHJvbGxlZCBieSBNb3JvY2NvLgogCi1ab25lIEFmcmljYS9FbF9BYWl1bgktMDo1Mjo0OCAtCUxNVAkxOTM0IEphbgorWm9uZSBBZnJpY2EvRWxfQWFpdW4JLTA6NTI6NDggLQlMTVQJMTkzNCBKYW4gIyBFbCBBYWnDum4KIAkJCS0xOjAwCS0JV0FUCTE5NzYgQXByIDE0CiAJCQkgMDowMAlNb3JvY2NvCVdFJXNUCiAKICMgTW96YW1iaXF1ZQorIworIyBTaGFua3MgZ2l2ZXMgMTkwMy0wMy0wMSBmb3IgdGhlIHRyYW5zaXRpb24gdG8gQ0FULgorIyBQZXJoYXBzIHRoZSAxOTExLTA1LTI2IFBvcnR1Z3Vlc2UgZGVjcmVlCisjIGh0dHA6Ly9kcmUucHQvcGRmMXNkaXAvMTkxMS8wNS8xMjUwMC8yMzEzMjMxMy5wZGYKKyMgbWVyZWx5IG1hZGUgaXQgb2ZmaWNpYWw/CisjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFmcmljYS9NYXB1dG8JMjoxMDoyMCAtCUxNVAkxOTAzIE1hcgogCQkJMjowMAktCUNBVApAQCAtMTA2Miw4ICs5OTIsOCBAQAogIyBUaGUgMTk5NC0wNC0wMyB0cmFuc2l0aW9uIGlzIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLgogIyBTaGFua3MgJiBQb3R0ZW5nZXIgcmVwb3J0IG5vIERTVCBhZnRlciAxOTk4LTA0OyBnbyB3aXRoIElBVEEuCiAKLSMgRnJvbSBQZXRyb25lbGxhIFNpYmVlbmUgKDIwMDctMDMtMzApIGluCi0jIDxodHRwOi8vYWxsYWZyaWNhLmNvbS9zdG9yaWVzLzIwMDcwMzMwMDE3OC5odG1sPjoKKyMgRnJvbSBQZXRyb25lbGxhIFNpYmVlbmUgKDIwMDctMDMtMzApOgorIyBodHRwOi8vYWxsYWZyaWNhLmNvbS9zdG9yaWVzLzIwMDcwMzMwMDE3OC5odG1sCiAjIFdoaWxlIHRoZSBlbnRpcmUgY291bnRyeSBjaGFuZ2VzIGl0cyB0aW1lLCBLYXRpbWEgTXVsaWxvIGFuZCBvdGhlcgogIyBzZXR0bGVtZW50cyBpbiBDYXByaXZpIHVub2ZmaWNpYWxseSB3aWxsIG5vdCBiZWNhdXNlIHRoZSBzdW4gdGhlcmUKICMgcmlzZXMgYW5kIHNldHMgZWFybGllciBjb21wYXJlZCB0byBvdGhlciByZWdpb25zLiAgQ2hpZWYgb2YKQEAgLTEwODAsMzQgKzEwMTAsNDEgQEAKIFJ1bGUJTmFtaWJpYQkxOTk1CW1heAktCUFwcglTdW4+PTEJMjowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQWZyaWNhL1dpbmRob2VrCTE6MDg6MjQgLQlMTVQJMTg5MiBGZWIgOAotCQkJMTozMAktCVNXQVQJMTkwMyBNYXIJIyBTVyBBZnJpY2EgVGltZQotCQkJMjowMAktCVNBU1QJMTk0MiBTZXAgMjAgMjowMAotCQkJMjowMAkxOjAwCVNBU1QJMTk0MyBNYXIgMjEgMjowMAorCQkJMTozMAktCVNXQVQJMTkwMyBNYXIgICAgIyBTVyBBZnJpY2EgVGltZQorCQkJMjowMAktCVNBU1QJMTk0MiBTZXAgMjAgIDI6MDAKKwkJCTI6MDAJMTowMAlTQVNUCTE5NDMgTWFyIDIxICAyOjAwCiAJCQkyOjAwCS0JU0FTVAkxOTkwIE1hciAyMSAjIGluZGVwZW5kZW5jZQogCQkJMjowMAktCUNBVAkxOTk0IEFwciAgMwogCQkJMTowMAlOYW1pYmlhCVdBJXNUCiAKICMgTmlnZXIKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL05pYW1leQkgMDowODoyOCAtCUxNVAkxOTEyCi0JCQktMTowMAktCVdBVAkxOTM0IEZlYiAyNgotCQkJIDA6MDAJLQlHTVQJMTk2MAotCQkJIDE6MDAJLQlXQVQKKyMgU2VlIEFmcmljYS9MYWdvcy4KIAogIyBOaWdlcmlhCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFmcmljYS9MYWdvcwkwOjEzOjM2IC0JTE1UCTE5MTkgU2VwCiAJCQkxOjAwCS0JV0FUCitMaW5rIEFmcmljYS9MYWdvcyBBZnJpY2EvQmFuZ3VpCSAgICAgIyBDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMKK0xpbmsgQWZyaWNhL0xhZ29zIEFmcmljYS9CcmF6emF2aWxsZSAjIFJlcC4gb2YgdGhlIENvbmdvCitMaW5rIEFmcmljYS9MYWdvcyBBZnJpY2EvRG91YWxhCSAgICAgIyBDYW1lcm9vbgorTGluayBBZnJpY2EvTGFnb3MgQWZyaWNhL0tpbnNoYXNhICAgICMgRGVtLiBSZXAuIG9mIHRoZSBDb25nbyAod2VzdCkKK0xpbmsgQWZyaWNhL0xhZ29zIEFmcmljYS9MaWJyZXZpbGxlICAjIEdhYm9uCitMaW5rIEFmcmljYS9MYWdvcyBBZnJpY2EvTHVhbmRhCSAgICAgIyBBbmdvbGEKK0xpbmsgQWZyaWNhL0xhZ29zIEFmcmljYS9NYWxhYm8JICAgICAjIEVxdWF0b3JpYWwgR3VpbmVhCitMaW5rIEFmcmljYS9MYWdvcyBBZnJpY2EvTmlhbWV5CSAgICAgIyBOaWdlcgorTGluayBBZnJpY2EvTGFnb3MgQWZyaWNhL1BvcnRvLU5vdm8gICMgQmVuaW4KIAotIyBSZXVuaW9uCisjIFLDqXVuaW9uCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9SZXVuaW9uCTM6NDE6NTIgLQlMTVQJMTkxMSBKdW4JIyBTYWludC1EZW5pcwotCQkJNDowMAktCVJFVAkjIFJldW5pb24gVGltZQorWm9uZQlJbmRpYW4vUmV1bmlvbgkzOjQxOjUyIC0JTE1UCTE5MTEgSnVuICMgU2FpbnQtRGVuaXMKKwkJCTQ6MDAJLQlSRVQJIyBSw6l1bmlvbiBUaW1lCiAjCi0jIFNjYXR0ZXJlZCBJc2xhbmRzIChJbGVzIEVwYXJzZXMpIGFkbWluaXN0ZXJlZCBmcm9tIFJldW5pb24gYXJlIGFzIGZvbGxvd3MuCisjIENyb3pldCBJc2xhbmRzIGFsc28gb2JzZXJ2ZXMgUsOpdW5pb24gdGltZTsgc2VlIHRoZSAnYW50YXJjdGljYScgZmlsZS4KKyMKKyMgU2NhdHRlcmVkIElzbGFuZHMgKMOObGVzIMOJcGFyc2VzKSBhZG1pbmlzdGVyZWQgZnJvbSBSw6l1bmlvbiBhcmUgYXMgZm9sbG93cy4KICMgVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGVtIGlzIHRha2VuIGZyb20KLSMgSWxlcyBFcGFyc2VzICh3d3cub3V0cmUtbWVyLmdvdXYuZnIvZG9tdG9tL2lsZS5odG0sIDE5OTctMDctMjIsIGluIEZyZW5jaDsKLSMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBhcyBvZiAxOTk5LTA4LTE3KS4KKyMgw45sZXMgw4lwYXJzZXMgKDxodHRwOi8vd3d3Lm91dHJlLW1lci5nb3V2LmZyL2RvbXRvbS9pbGUuaHRtPiwgMTk5Ny0wNy0yMiwKKyMgaW4gRnJlbmNoOyBubyBsb25nZXIgYXZhaWxhYmxlIGFzIG9mIDE5OTktMDgtMTcpLgogIyBXZSBoYXZlIG5vIGluZm8gYWJvdXQgdGhlaXIgdGltZSB6b25lIGhpc3Rvcmllcy4KICMKICMgQmFzc2FzIGRhIEluZGlhIC0gdW5pbmhhYml0ZWQKQEAgLTExMjIsMzIgKzEwNTksMjEgQEAKIAkJCTI6MDAJLQlDQVQKIAogIyBTdCBIZWxlbmEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvU3RfSGVsZW5hCS0wOjIyOjQ4IC0JTE1UCTE4OTAJCSMgSmFtZXN0b3duCi0JCQktMDoyMjo0OCAtCUpNVAkxOTUxCSMgSmFtZXN0b3duIE1lYW4gVGltZQotCQkJIDA6MDAJLQlHTVQKKyMgU2VlIEFmcmljYS9BYmlkamFuLgogIyBUaGUgb3RoZXIgcGFydHMgb2YgdGhlIFN0IEhlbGVuYSB0ZXJyaXRvcnkgYXJlIHNpbWlsYXI6CiAjCVRyaXN0YW4gZGEgQ3VuaGE6IG9uIEdNVCwgc2F5IFdoaXRtYW4gYW5kIHRoZSBDSUEKLSMJQXNjZW5zaW9uOiBvbiBHTVQsIHNheXMgdXNubzE5OTUgYW5kIHRoZSBDSUEKKyMJQXNjZW5zaW9uOiBvbiBHTVQsIHNheSB0aGUgVVNOTyAoMTk5NS0xMi0yMSkgYW5kIHRoZSBDSUEKICMJR291Z2ggKHNjaWVudGlmaWMgc3RhdGlvbiBzaW5jZSAxOTU1OyBzZWFsZXJzIHdpbnRlcmVkIHByZXZpb3VzbHkpOgogIwkJb24gR01ULCBzYXlzIHRoZSBDSUEKLSMJSW5hY2Nlc3NpYmxlLCBOaWdodGluZ2FsZTogbm8gaW5mb3JtYXRpb24sIGJ1dCBwcm9iYWJseSBHTVQKKyMJSW5hY2Nlc3NpYmxlLCBOaWdodGluZ2FsZTogdW5pbmhhYml0ZWQKIAotIyBTYW8gVG9tZSBhbmQgUHJpbmNpcGUKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL1Nhb19Ub21lCSAwOjI2OjU2IC0JTE1UCTE4ODQKLQkJCS0wOjM2OjMyIC0JTE1UCTE5MTIJIyBMaXNib24gTWVhbiBUaW1lCi0JCQkgMDowMAktCUdNVAotCisjIFPDo28gVG9tw6kgYW5kIFByw61uY2lwZQogIyBTZW5lZ2FsCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9EYWthcgktMTowOTo0NCAtCUxNVAkxOTEyCi0JCQktMTowMAktCVdBVAkxOTQxIEp1bgotCQkJIDA6MDAJLQlHTVQKKyMgU2VlIEFmcmljYS9BYmlkamFuLgogCiAjIFNleWNoZWxsZXMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJSW5kaWFuL01haGUJMzo0MTo0OCAtCUxNVAkxOTA2IEp1bgkjIFZpY3RvcmlhCitab25lCUluZGlhbi9NYWhlCTM6NDE6NDggLQlMTVQJMTkwNiBKdW4gIyBWaWN0b3JpYQogCQkJNDowMAktCVNDVAkjIFNleWNoZWxsZXMgVGltZQogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA1LTMwKToKICMgQWxkYWJyYSwgRmFycXVoYXIsIGFuZCBEZXNyb2NoZXMsIG9yaWdpbmFsbHkgZGVwZW5kZW5jaWVzIG9mIHRoZQpAQCAtMTE1NywxNyArMTA4Myw3IEBACiAjIFBvc3NpYmx5IHRoZSBpc2xhbmRzIHdlcmUgdW5pbmhhYml0ZWQuCiAKICMgU2llcnJhIExlb25lCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBXaGl0bWFuIGdpdmVzIE1hciAzMSAtIEF1ZyAzMSBmb3IgMTkzMSBvbjsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVNMCTE5MzUJMTk0MgktCUp1bgkgMQkwOjAwCTA6NDAJU0xTVAotUnVsZQlTTAkxOTM1CTE5NDIJLQlPY3QJIDEJMDowMAkwCVdBVAotUnVsZQlTTAkxOTU3CTE5NjIJLQlKdW4JIDEJMDowMAkxOjAwCVNMU1QKLVJ1bGUJU0wJMTk1NwkxOTYyCS0JU2VwCSAxCTA6MDAJMAlHTVQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0ZyZWV0b3duCS0wOjUzOjAwIC0JTE1UCTE4ODIKLQkJCS0wOjUzOjAwIC0JRk1UCTE5MTMgSnVuICMgRnJlZXRvd24gTWVhbiBUaW1lCi0JCQktMTowMAlTTAklcwkxOTU3Ci0JCQkgMDowMAlTTAklcworIyBTZWUgQWZyaWNhL0FiaWRqYW4uCiAKICMgU29tYWxpYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQpAQCAtMTE5MCw5ICsxMTA2LDkgQEAKIAogIyBTdWRhbgogIwotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3VuYW5ld3MubmV0L3NuMTNqYW5lLmh0bWwiPgotIyBTdWRhbiBOZXdzIEFnZW5jeSAoMjAwMC0wMS0xMykKLSMgPC9hPiwgYWxzbyByZXBvcnRlZCBieSBNaWNoYWVsIERlIEJldWtlbGFlci1Eb3NzY2hlIHZpYSBTdGVmZmVuIFRob3JzZW46CisjIEZyb20gPGh0dHA6Ly93d3cuc3VuYW5ld3MubmV0L3NuMTNqYW5lLmh0bWw+CisjIFN1ZGFuIE5ld3MgQWdlbmN5ICgyMDAwLTAxLTEzKSwKKyMgYWxzbyByZXBvcnRlZCBieSBNaWNoYcOrbCBEZSBCZXVrZWxhZXItRG9zc2NoZSB2aWEgU3RlZmZlbiBUaG9yc2VuOgogIyBDbG9ja3Mgd2lsbCBiZSBtb3ZlZCBhaGVhZCBmb3IgNjAgbWludXRlcyBhbGwgb3ZlciB0aGUgU3VkYW4gYXMgb2Ygbm9vbgogIyBTYXR1cmRheS4uLi4gIFRoaXMgd2FzIGFubm91bmNlZCBUaHVyc2RheSBieSBDYXJldGFrZXIgU3RhdGUgTWluaXN0ZXIgZm9yCiAjIE1hbnBvd2VyIEFiZHVsLVJhaG1hbiBOdXItRWRkaW4uCkBAIC0xMjIzLDE0ICsxMTM5LDEyIEBACiAJCQkzOjAwCS0JRUFUCiAKICMgVG9nbwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTG9tZQkwOjA0OjUyIC0JTE1UCTE4OTMKLQkJCTA6MDAJLQlHTVQKKyMgU2VlIEFmcmljYS9BYmlkamFuLgogCiAjIFR1bmlzaWEKIAogIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA0LTMwKToKLSMgTXkgY29ycmVzcG9uZGVudCwgUmlzdG8gTnlrYW5lbiwgaGFzIGFsZXJ0ZWQgbWUgdG8gYW5vdGhlciBhZG9wdGlvbiBvZiBEU1QsCisjIE15IGNvcnJlc3BvbmRlbnQsIFJpc3RvIE55a8OkbmVuLCBoYXMgYWxlcnRlZCBtZSB0byBhbm90aGVyIGFkb3B0aW9uIG9mIERTVCwKICMgdGhpcyB0aW1lIGluIFR1bmlzaWEuICBBY2NvcmRpbmcgdG8gWWFob28gRnJhbmNlIE5ld3MKICMgPGh0dHA6Ly9mci5uZXdzLnlhaG9vLmNvbS8wNTA0MjYvNS80ZHVtay5odG1sPiwgaW4gYSBzdG9yeSBhdHRyaWJ1dGVkIHRvIEFQCiAjIGFuZCBkYXRlZCAyMDA1LTA0LTI2LCAiVHVuaXNpYSBoYXMgZGVjaWRlZCB0byBhZHZhbmNlIGl0cyBvZmZpY2lhbCB0aW1lIGJ5CkBAIC0xMjM5LDggKzExNTMsOCBAQAogIyBTYXR1cmRheS4iICAoTXkgdHJhbnNsYXRpb24pCiAjCiAjIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDUtMDUtMDIpOgotIyBMYVByZXNzZSwgdGhlIGZpcnN0IG5hdGlvbmFsIGRhaWx5IG5ld3NwYXBlciAuLi4KLSMgPGh0dHA6Ly93d3cubGFwcmVzc2UudG4vYXJjaGl2ZXMvYXJjaGl2ZXMyODA0MDUvYWN0dWFsaXRlcy9saGV1cmUuaHRtbD4KKyMgTGEgUHJlc3NlLCB0aGUgZmlyc3QgbmF0aW9uYWwgZGFpbHkgbmV3c3BhcGVyIC4uLgorIyBodHRwOi8vd3d3LmxhcHJlc3NlLnRuL2FyY2hpdmVzL2FyY2hpdmVzMjgwNDA1L2FjdHVhbGl0ZXMvbGhldXJlLmh0bWwKICMgLi4uIERTVCBmb3IgMjAwNTogb246IFN1biBNYXkgMSAwaCBzdGFuZGFyZCB0aW1lLCBvZmY6IEZyaSBTZXB0LiAzMCwKICMgMWggc3RhbmRhcmQgdGltZS4KICMKQEAgLTEyNTMsMTggKzExNjcsMTIgQEAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDMtMTYpOgogIyBBY2NvcmRpbmcgdG8gc2V2ZXJhbCBuZXdzIHNvdXJjZXMsIFR1bmlzaWEgd2lsbCBub3Qgb2JzZXJ2ZSBEU1QgdGhpcyB5ZWFyLgogIyAoQXJhYmljKQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmVsYmFzaGF5ZXIuY29tLz9wYWdlPXZpZXduJm5pZD00MjU0NiI+CiAjIGh0dHA6Ly93d3cuZWxiYXNoYXllci5jb20vP3BhZ2U9dmlld24mbmlkPTQyNTQ2Ci0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5iYWJuZXQubmV0L2tpd2lkZXRhaWwtMTUyOTUuYXNwIj4KICMgaHR0cDovL3d3dy5iYWJuZXQubmV0L2tpd2lkZXRhaWwtMTUyOTUuYXNwCi0jIDwvYT4KICMKICMgV2UgaGF2ZSBhbHNvIGNvbmZpcm1lZCB0aGlzIHdpdGggdGhlIFVTIGVtYmFzc3kgaW4gVHVuaXNpYS4KICMgV2UgaGF2ZSBhIHdyYXAtdXAgYWJvdXQgdGhpcyBvbiB0aGUgZm9sbG93aW5nIHBhZ2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS90dW5pc2lhLWNhbmNlbHMtZHN0LTIwMDkuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS90dW5pc2lhLWNhbmNlbHMtZHN0LTIwMDkuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDMtMTcpOgogIyBIZXJlIGlzIGEgbGluayB0byBUdW5pcyBBZnJpcXVlIFByZXNzZSBOZXdzIEFnZW5jeQpAQCAtMTI3MiwyMCArMTE4MCwxNyBAQAogIyBTdGFuZGFyZCB0aW1lIHRvIGJlIGtlcHQgdGhlIHdob2xlIHllYXIgbG9uZyAodGFwLmluZm8udG4pOgogIwogIyAoaW4gRW5nbGlzaCkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50YXAuaW5mby50bi9lbi9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0yNjgxMyZJdGVtaWQ9MTU3Ij4KICMgaHR0cDovL3d3dy50YXAuaW5mby50bi9lbi9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0yNjgxMyZJdGVtaWQ9MTU3Ci0jIDwvYT4KICMKICMgKGluIEFyYWJpYykKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50YXAuaW5mby50bi9hci9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD02MTI0MCZJdGVtaWQ9MSI+CiAjIGh0dHA6Ly93d3cudGFwLmluZm8udG4vYXIvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NjEyNDAmSXRlbWlkPTEKLSMgPC9hPgogCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LS0zLTE4KToKLSMgVGhlIFR1bmlzIEFmcmlxdWUgUHJlc3NlIE5ld3MgQWdlbmN5IG5vdGljZSBjb250YWlucyB0aGlzOiAiVGhpcyBtZWFzdXJlIGlzIGR1ZSB0byB0aGUgZmFjdAotIyB0aGF0IHRoZSBmYXN0aW5nIG1vbnRoIG9mIHJhbWFkYW4gY29pbmNpZGVzIHdpdGggdGhlIHBlcmlvZCBjb25jZXJuZWQgYnkgc3VtbWVyIHRpbWUuCi0jIFRoZXJlZm9yZSwgdGhlIHN0YW5kYXJkIHRpbWUgd2lsbCBiZSBrZXB0IHVuY2hhbmdlZCB0aGUgd2hvbGUgeWVhciBsb25nLiIKLSMgU28gZm9yZWdvaW5nIERTVCBzZWVtcyB0byBiZSBhbiBleGNlcHRpb24gKGFsYmVpdCBvbmUgdGhhdCBtYXkgYmUgcmVwZWF0ZWQgaW4gdGhlICBmdXR1cmUpLgorIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOS0wMy0xOCk6CisjIFRoZSBUdW5pcyBBZnJpcXVlIFByZXNzZSBOZXdzIEFnZW5jeSBub3RpY2UgY29udGFpbnMgdGhpczogIlRoaXMgbWVhc3VyZSBpcworIyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgZmFzdGluZyBtb250aCBvZiBSYW1hZGFuIGNvaW5jaWRlcyB3aXRoIHRoZSBwZXJpb2QKKyMgY29uY2VybmVkIGJ5IHN1bW1lciB0aW1lLiAgVGhlcmVmb3JlLCB0aGUgc3RhbmRhcmQgdGltZSB3aWxsIGJlIGtlcHQKKyMgdW5jaGFuZ2VkIHRoZSB3aG9sZSB5ZWFyIGxvbmcuIiAgU28gZm9yZWdvaW5nIERTVCBzZWVtcyB0byBiZSBhbiBleGNlcHRpb24KKyMgKGFsYmVpdCBvbmUgdGhhdCBtYXkgYmUgcmVwZWF0ZWQgaW4gdGhlIGZ1dHVyZSkuCiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTAtMDMtMjcpOgogIyBBY2NvcmRpbmcgdG8gc29tZSBuZXdzIHJlcG9ydHMgVHVuaXMgY29uZmlybWVkIG5vdCB0byB1c2UgRFNUIGluIDIwMTAKQEAgLTEyOTcsMTIgKzEyMDIsOCBAQAogIyBjb2luY2lkZWQgd2l0aCB0aGUgbW9udGggb2YgUmFtYWRhbi4uLiIKICMKICMgKGluIEFyYWJpYykKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2hlZXQuY29tL3Nob3dfbmV3cy5hc3B4P25pZD0zNTg4NjEmcGc9MSI+CiAjIGh0dHA6Ly93d3cubW9oZWV0LmNvbS9zaG93X25ld3MuYXNweD9uaWQ9MzU4ODYxJnBnPTEKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbG1hZGVuYWhuZXdzLmNvbS9uZXdzcy9uZXdzLnBocD9jPTExOCZpZD0zODAzNiI+CiAjIGh0dHA6Ly93d3cuYWxtYWRlbmFobmV3cy5jb20vbmV3c3MvbmV3cy5waHA/Yz0xMTgmaWQ9MzgwMzYKLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c190dW5pczAyLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3R1bmlzMDIuaHRtbAogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwpAQCAtMTMzNyw3ICsxMjM4LDcgQEAKICMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGUgMTkxMSBzd2l0Y2ggd2FzIG9uIE1hciA5OyBnbyB3aXRoIEhvd3NlJ3MgTWFyIDExLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBZnJpY2EvVHVuaXMJMDo0MDo0NCAtCUxNVAkxODgxIE1heSAxMgotCQkJMDowOToyMQktCVBNVAkxOTExIE1hciAxMSAgICAjIFBhcmlzIE1lYW4gVGltZQorCQkJMDowOToyMQktCVBNVAkxOTExIE1hciAxMSAjIFBhcmlzIE1lYW4gVGltZQogCQkJMTowMAlUdW5pc2lhCUNFJXNUCiAKICMgVWdhbmRhCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hbnRhcmN0aWNhIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYW50YXJjdGljYQppbmRleCBlMzFiYWRhLi4wY2RhYzI3IDEwMDY0NAotLS0gYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hbnRhcmN0aWNhCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2FudGFyY3RpY2EKQEAgLTIxLDE5ICsyMSwxNiBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0xMS0xNSk6CiAjIFRvIGtlZXAgdGhpbmdzIG1hbmFnZWFibGUsIHdlIGxpc3Qgb25seSBsb2NhdGlvbnMgb2NjdXBpZWQgeWVhci1yb3VuZDsgc2VlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY29tbmFwLmFxL2NvbW5hcC9jb21uYXAubnNmL1AvU3RhdGlvbnMvIj4KICMgQ09NTkFQIC0gU3RhdGlvbnMgYW5kIEJhc2VzCi0jIDwvYT4KKyMgaHR0cDovL3d3dy5jb21uYXAuYXEvY29tbmFwL2NvbW5hcC5uc2YvUC9TdGF0aW9ucy8KICMgYW5kCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3ByaS5jYW0uYWMudWsvYm9iL3BlcmlhbnQuaHRtIj4KICMgU3VtbWFyeSBvZiB0aGUgUGVyaS1BbnRhcmN0aWMgSXNsYW5kcyAoMTk5OC0wNy0yMykKLSMgPC9hPgorIyBodHRwOi8vd3d3LnNwcmkuY2FtLmFjLnVrL2JvYi9wZXJpYW50Lmh0bQogIyBmb3IgaW5mb3JtYXRpb24uCiAjIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB3ZSBoYXZlIG5vIHRpbWUgem9uZSBpbmZvcm1hdGlvbi4KICMKQEAgLTc4LDE5ICs3NSwxOSBAQAogCiAjIEFyZ2VudGluYSAtIHllYXItcm91bmQgYmFzZXMKICMgQmVsZ3Jhbm8gSUksIENvbmZpbiBDb2FzdCwgLTc3MDIyNy0wMzQzNzM3LCBzaW5jZSAxOTcyLTAyLTA1Ci0jIEVzcGVyYW56YSwgU2FuIE1hcnRpbiBMYW5kLCAtNjMyMy0wNTY1OSwgc2luY2UgMTk1Mi0xMi0xNwotIyBKdWJhbnksIFBvdHRlciBQZW5pbnN1bGEsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTY0MTQtMDYwMjMyMCwgc2luY2UgMTk4Mi0wMQotIyBNYXJhbWJpbywgU2V5bW91ciBJLCAtNjQxNC0wNTYzNywgc2luY2UgMTk2OS0xMC0yOQorIyBDYXJsaW5pLCBQb3R0ZXIgQ292ZSwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjQxNC0wNjAyMzIwLCBzaW5jZSAxOTgyLTAxCisjIEVzcGVyYW56YSwgSG9wZSBCYXksIC02MzIzLTA1NjU5LCBzaW5jZSAxOTUyLTEyLTE3CisjIE1hcmFtYmlvLCAtNjQxNC0wNTYzNywgc2luY2UgMTk2OS0xMC0yOQogIyBPcmNhZGFzLCBMYXVyaWUgSSwgLTYwMTYtMDQ0NDQsIHNpbmNlIDE5MDQtMDItMjIKLSMgU2FuIE1hcnRpbiwgRGViZW5oYW0gSSwgLTY4MDctMDY3MDgsIHNpbmNlIDE5NTEtMDMtMjEKKyMgU2FuIE1hcnTDrW4sIEJhcnJ5IEksIC02ODA4LTA2NzA2LCBzaW5jZSAxOTUxLTAzLTIxCiAjCShleGNlcHQgMTk2MC0wMyAvIDE5NzYtMDMtMjEpCiAKICMgQXVzdHJhbGlhIC0gdGVycml0b3JpZXMKICMgSGVhcmQgSXNsYW5kLCBNY0RvbmFsZCBJc2xhbmRzICh1bmluaGFiaXRlZCkKICMJcHJldmlvdXNseSBzZWFsZXJzIGFuZCBzY2llbnRpZmljIHBlcnNvbm5lbCB3aW50ZXJlZAotIwk8YSBocmVmPSJodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAyMTIwNDIyMjI0NS9odHRwOi8vd3d3LmRzdGMucXV0LmVkdS5hdS9EU1QvbWFyZy9kYXlsaWdodC5odG1sIj4KICMJTWFyZ2FyZXQgVHVybmVyIHJlcG9ydHMKLSMJPC9hPiAoMTk5OS0wOS0zMCkgdGhhdCB0aGV5J3JlIFVUQys1LCB3aXRoIG5vIERTVDsKKyMJaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwMjEyMDQyMjIyNDUvaHR0cDovL3d3dy5kc3RjLnF1dC5lZHUuYXUvRFNUL21hcmcvZGF5bGlnaHQuaHRtbAorIwkoMTk5OS0wOS0zMCkgdGhhdCB0aGV5J3JlIFVUQys1LCB3aXRoIG5vIERTVDsKICMJcHJlc3VtYWJseSB0aGlzIGlzIHdoZW4gdGhleSBoYXZlIHZpc2l0b3JzLgogIwogIyB5ZWFyLXJvdW5kIGJhc2VzCkBAIC0xMDcsMTQgKzEwNCwxMCBAQAogIyBUaGUgY2hhbmdlcyBvY2N1cnJlZCBvbiAyMDA5LTEwLTE4IGF0IDAyOjAwIChsb2NhbCB0aW1lcykuCiAjCiAjIEdvdmVybm1lbnQgc291cmNlOiAoQXVzdHJhbGlhbiBBbnRhcmN0aWMgRGl2aXNpb24pCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWFkLmdvdi5hdS9kZWZhdWx0LmFzcD9jYXNpZD0zNzA3OSI+CiAjIGh0dHA6Ly93d3cuYWFkLmdvdi5hdS9kZWZhdWx0LmFzcD9jYXNpZD0zNzA3OQotIyA8L2E+CiAjCiAjIFdlIGhhdmUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9hbnRhcmN0aWNhLW5ldy10aW1lcy5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2FudGFyY3RpY2EtbmV3LXRpbWVzLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTAzLTEwKToKICMgV2UgZ290IHRoZXNlIGNoYW5nZXMgZnJvbSB0aGUgQXVzdHJhbGlhbiBBbnRhcmN0aWMgRGl2aXNpb246IC4uLgpAQCAtMTI5LDUwICsxMjIsNDkgQEAKICMgLSBNYXdzb24gc3RhdGlvbiBzdGF5cyBvbiBVVEMrNS4KICMKICMgQmFja2dyb3VuZDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2FudGFydGljYS10aW1lLWNoYW5nZXMtMjAxMC5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2FudGFydGljYS10aW1lLWNoYW5nZXMtMjAxMC5odG1sCi0jIDwvYT4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbnRhcmN0aWNhL0Nhc2V5CTAJLQl6enoJMTk2OQotCQkJODowMAktCVdTVAkyMDA5IE9jdCAxOCAyOjAwCi0JCQkJCQkjIFdlc3Rlcm4gKEF1cykgU3RhbmRhcmQgVGltZQotCQkJMTE6MDAJLQlDQVNUCTIwMTAgTWFyIDUgMjowMAotCQkJCQkJIyBDYXNleSBUaW1lCi0JCQk4OjAwCS0JV1NUCTIwMTEgT2N0IDI4IDI6MDAKKwkJCTg6MDAJLQlBV1NUCTIwMDkgT2N0IDE4ICAyOjAwCisJCQkJCQkjIEF1c3RyYWxpYW4gV2VzdGVybiBTdGQgVGltZQorCQkJMTE6MDAJLQlDQVNUCTIwMTAgTWFyICA1ICAyOjAwICAjIENhc2V5IFRpbWUKKwkJCTg6MDAJLQlBV1NUCTIwMTEgT2N0IDI4ICAyOjAwCiAJCQkxMTowMAktCUNBU1QJMjAxMiBGZWIgMjEgMTc6MDB1Ci0JCQk4OjAwCS0JV1NUCisJCQk4OjAwCS0JQVdTVAogWm9uZSBBbnRhcmN0aWNhL0RhdmlzCTAJLQl6enoJMTk1NyBKYW4gMTMKLQkJCTc6MDAJLQlEQVZUCTE5NjQgTm92ICMgRGF2aXMgVGltZQorCQkJNzowMAktCURBVlQJMTk2NCBOb3YgICAgIyBEYXZpcyBUaW1lCiAJCQkwCS0Jenp6CTE5NjkgRmViCi0JCQk3OjAwCS0JREFWVAkyMDA5IE9jdCAxOCAyOjAwCisJCQk3OjAwCS0JREFWVAkyMDA5IE9jdCAxOCAgMjowMAogCQkJNTowMAktCURBVlQJMjAxMCBNYXIgMTAgMjA6MDB1Ci0JCQk3OjAwCS0JREFWVAkyMDExIE9jdCAyOCAyOjAwCisJCQk3OjAwCS0JREFWVAkyMDExIE9jdCAyOCAgMjowMAogCQkJNTowMAktCURBVlQJMjAxMiBGZWIgMjEgMjA6MDB1CiAJCQk3OjAwCS0JREFWVAogWm9uZSBBbnRhcmN0aWNhL01hd3NvbgkwCS0Jenp6CTE5NTQgRmViIDEzCi0JCQk2OjAwCS0JTUFXVAkyMDA5IE9jdCAxOCAyOjAwCi0JCQkJCQkjIE1hd3NvbiBUaW1lCisJCQk2OjAwCS0JTUFXVAkyMDA5IE9jdCAxOCAgMjowMCAjIE1hd3NvbiBUaW1lCiAJCQk1OjAwCS0JTUFXVAogIyBSZWZlcmVuY2VzOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2Nhc2V5L2Nhc2V5X2F3cy5odG1sIj4KICMgQ2FzZXkgV2VhdGhlciAoMTk5OC0wMi0yNikKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2RhdmlzL3ZpZGVvLmh0bWwiPgorIyBodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2Nhc2V5L2Nhc2V5X2F3cy5odG1sCiAjIERhdmlzIFN0YXRpb24sIEFudGFyY3RpY2EgKDE5OTgtMDItMjYpCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRkaXYuZ292LmF1L2FhZC9leG9wL3Nmby9tYXdzb24vdmlkZW8uaHRtbCI+CisjIGh0dHA6Ly93d3cuYW50ZGl2Lmdvdi5hdS9hYWQvZXhvcC9zZm8vZGF2aXMvdmlkZW8uaHRtbAogIyBNYXdzb24gU3RhdGlvbiwgQW50YXJjdGljYSAoMTk5OC0wMi0yNSkKLSMgPC9hPgorIyBodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL21hd3Nvbi92aWRlby5odG1sCisKKyMgQmVsZ2l1bSAtIHllYXItcm91bmQgYmFzZQorIyBQcmluY2VzcyBFbGlzYWJldGgsIFF1ZWVuIE1hdWQgTGFuZCwgLTcxMzQxMiswMjMxMjAwLCBzaW5jZSAyMDA3CiAKICMgQnJhemlsIC0geWVhci1yb3VuZCBiYXNlCi0jIENvbWFuZGFudGUgRmVycmF6LCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjA1KzA1ODI0LCBzaW5jZSAxOTgzLzQKKyMgRmVycmF6LCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjA1KzA1ODI0LCBzaW5jZSAxOTgzLzQKKworIyBCdWxnYXJpYSAtIHllYXItcm91bmQgYmFzZQorIyBTdC4gS2xpbWVudCBPaHJpZHNraSwgTGl2aW5nc3RvbiBJc2xhbmQsIC02MjM4MjktMDYwMjE1Mywgc2luY2UgMTk4OAogCiAjIENoaWxlIC0geWVhci1yb3VuZCBiYXNlcyBhbmQgdG93bnMKICMgRXNjdWRlcm8sIFNvdXRoIFNoZXRsYW5kIElzLCAtNjIxMTU3LTA1ODU3MzUsIHNpbmNlIDE5OTQKLSMgUHJlc2lkZW50ZSBFZHVhZHJvIEZyZWksIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTQtMDU4NDgsIHNpbmNlIDE5NjktMDMtMDcKLSMgR2VuZXJhbCBCZXJuYXJkbyBPJ0hpZ2dpbnMsIEFudGFyY3RpYyBQZW5pbnN1bGEsIC02MzE5LTA1NzA0LCBzaW5jZSAxOTQ4LTAyCi0jIENhcGl0YW4gQXJ0dXJvIFByYXQsIC02MjMwLTA1OTQxCisjIEZyZWkgTW9udGFsdmEsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTQtMDU4NDgsIHNpbmNlIDE5NjktMDMtMDcKKyMgTydIaWdnaW5zLCBBbnRhcmN0aWMgUGVuaW5zdWxhLCAtNjMxOS0wNTcwNCwgc2luY2UgMTk0OC0wMgorIyBQcmF0LCAtNjIzMC0wNTk0MQogIyBWaWxsYSBMYXMgRXN0cmVsbGFzIChhIHRvd24pLCBhcm91bmQgdGhlIEZyZWkgYmFzZSwgc2luY2UgMTk4NC0wNC0wOQogIyBUaGVzZSBsb2NhdGlvbnMgaGF2ZSBhbHdheXMgdXNlZCBTYW50aWFnbyB0aW1lOyB1c2UgVFo9J0FtZXJpY2EvU2FudGlhZ28nLgogCkBAIC0xODAsMzEgKzE3MiwzNSBAQAogIyBHcmVhdCBXYWxsLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjEzLTA1ODU4LCBzaW5jZSAxOTg1LTAyLTIwCiAjIFpob25nc2hhbiwgTGFyc2VtYW5uIEhpbGxzLCBQcnlkeiBCYXksIC02OTIyKzA3NjIzLCBzaW5jZSAxOTg5LTAyLTI2CiAKLSMgRnJhbmNlIC0geWVhci1yb3VuZCBiYXNlcworIyBGcmFuY2UgLSB5ZWFyLXJvdW5kIGJhc2VzIChhbHNvIHNlZSAiRnJhbmNlICYgSXRhbHkiKQogIwogIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5Ny0wMS0yMCk6Ci0jIFRpbWUgZGF0YSBhcmUgZnJvbSBOaWNvbGUgUGFpbGxlYXUgYXQgdGhlIElGUlRQCisjIFRpbWUgZGF0YSBlbnRyaWVzIGFyZSBmcm9tIE5pY29sZSBQYWlsbGVhdSBhdCB0aGUgSUZSVFAKICMgKEZyZW5jaCBJbnN0aXR1dGUgZm9yIFBvbGFyIFJlc2VhcmNoIGFuZCBUZWNobm9sb2d5KS4KLSMgU2hlIGNvbmZpcm1zIHRoYXQgRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIGFuZCBUZXJyZSBBZGVsaWUgYmFzZXMKLSMgZG9uJ3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgdGltZSwgZXZlbiBpZiBUZXJyZSBBZGVsaWUgc3VwcGxpZXMgY2FtZQorIyBTaGUgY29uZmlybXMgdGhhdCBGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMgYW5kIFRlcnJlIEFkw6lsaWUgYmFzZXMKKyMgZG9uJ3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgdGltZSwgZXZlbiBpZiBUZXJyZSBBZMOpbGllIHN1cHBsaWVzIGNhbWUKICMgZnJvbSBUYXNtYW5pYS4KICMKICMgRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIHdpdGggeWVhci1yb3VuZCBpbmhhYml0YW50cwogIwotIyBNYXJ0aW4tZGUtVml2aWVzIEJhc2UsIEFtc3RlcmRhbSBJc2xhbmQsIC0zNzQxMDUrMDc3MzE1NSwgc2luY2UgMTk1MAotIyBBbGZyZWQtRmF1cmUgQmFzZSwgQ3JvemV0IElzbGFuZHMsIC00NjI1NTErMDUxNTE1Miwgc2luY2UgMTk2NAotIyBQb3J0LWF1eC1GcmFuY2FpcywgS2VyZ3VlbGVuIElzbGFuZHMsIC00OTIxMTArMDcwMTMwMywgc2luY2UgMTk1MTsKKyMgQWxmcmVkIEZhdXJlLCBQb3NzZXNzaW9uIElzbGFuZCwgQ3JvemV0IElzbGFuZHMsIC00NjI1NTErMDUxNTE1Miwgc2luY2UgMTk2NDsKKyMJc2VhbGluZyAmIHdoYWxpbmcgc3RhdGlvbnMgb3BlcmF0ZWQgdmFyaW91c2x5IDE4MDIvMTkxMSs7CisjCXNlZSBJbmRpYW4vUmV1bmlvbi4KKyMKKyMgTWFydGluLWRlLVZpdmnDqHMsIEFtc3RlcmRhbSBJc2xhbmQsIC0zNzQxMDUrMDc3MzE1NSwgc2luY2UgMTk1MAorIyBQb3J0LWF1eC1GcmFuw6dhaXMsIEtlcmd1ZWxlbiBJc2xhbmRzLCAtNDkyMTEwKzA3MDEzMDMsIHNpbmNlIDE5NTE7CiAjCXdoYWxpbmcgJiBzZWFsaW5nIHN0YXRpb24gb3BlcmF0ZWQgMTkwOC8xOTE0LCAxOTIwLzE5MjksIGFuZCAxOTUxLzE5NTYKICMKICMgU3QgUGF1bCBJc2xhbmQgLSBuZWFyIEFtc3RlcmRhbSwgdW5pbmhhYml0ZWQKICMJZmlzaGluZyBzdGF0aW9ucyBvcGVyYXRlZCB2YXJpb3VzbHkgMTgxOS8xOTMxCiAjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEluZGlhbi9LZXJndWVsZW4JMAktCXp6egkxOTUwCSMgUG9ydC1hdXgtRnJhbmNhaXMKK1pvbmUgSW5kaWFuL0tlcmd1ZWxlbgkwCS0Jenp6CTE5NTAgIyBQb3J0LWF1eC1GcmFuw6dhaXMKIAkJCTU6MDAJLQlURlQJIyBJU08gY29kZSBURiBUaW1lCiAjCiAjIHllYXItcm91bmQgYmFzZSBpbiB0aGUgbWFpbiBjb250aW5lbnQKLSMgRHVtb250LWQnVXJ2aWxsZSwgSWxlIGRlcyBQZXRyZWxzLCAtNjY0MCsxNDAwMSwgc2luY2UgMTk1Ni0xMQorIyBEdW1vbnQgZCdVcnZpbGxlLCDDjmxlIGRlcyBQw6l0cmVscywgLTY2NDArMTQwMDEsIHNpbmNlIDE5NTYtMTEKKyMgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVtb250X2QnVXJ2aWxsZV9TdGF0aW9uPiAoMjAwNS0xMi0wNSkKICMKICMgQW5vdGhlciBiYXNlIGF0IFBvcnQtTWFydGluLCA1MGttIGVhc3QsIGJlZ2FuIG9wZXJhdGlvbiBpbiAxOTQ3LgogIyBJdCB3YXMgZGVzdHJveWVkIGJ5IGZpcmUgb24gMTk1Mi0wMS0xNC4KQEAgLTIxNCwyMCArMjEwLDIyIEBACiAJCQkxMDowMAktCVBNVAkxOTUyIEphbiAxNCAjIFBvcnQtTWFydGluIFRpbWUKIAkJCTAJLQl6enoJMTk1NiBOb3YKIAkJCTEwOjAwCS0JRERVVAkjIER1bW9udC1kJ1VydmlsbGUgVGltZQotIyBSZWZlcmVuY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVtb250X2QnVXJ2aWxsZV9TdGF0aW9uIj4KLSMgRHVtb250IGQnVXJ2aWxsZSBTdGF0aW9uICgyMDA1LTEyLTA1KQotIyA8L2E+CisKKyMgRnJhbmNlICYgSXRhbHkgLSB5ZWFyLXJvdW5kIGJhc2UKKyMgQ29uY29yZGlhLCAtNzUwNjAwKzEyMzIwMDAsIHNpbmNlIDIwMDUKIAogIyBHZXJtYW55IC0geWVhci1yb3VuZCBiYXNlCi0jIEdlb3JnIHZvbiBOZXVtYXllciwgLTcwMzktMDA4MTUKKyMgTmV1bWF5ZXIgSUlJLCAtNzA0MDgwLTAwODE2MDIsIHNpbmNlIDIwMDkKIAotIyBJbmRpYSAtIHllYXItcm91bmQgYmFzZQotIyBEYWtzaGluIEdhbmdvdHJpLCAtNzAwNSswMTIwMAorIyBJbmRpYSAtIHllYXItcm91bmQgYmFzZXMKKyMgQmhhcmF0aSwgLTY5MjQyOCswNzYxMTE0LCBzaW5jZSAyMDEyCisjIE1haXRyaSwgLTcwNDU1OCswMTE0MzU2LCBzaW5jZSAxOTg5CisKKyMgSXRhbHkgLSB5ZWFyLXJvdW5kIGJhc2UgKGFsc28gc2VlICJGcmFuY2UgJiBJdGFseSIpCisjIFp1Y2hlbGxpLCBUZXJyYSBOb3ZhIEJheSwgLTc0NDE0MCsxNjQwNjQ3LCBzaW5jZSAxOTg2CiAKICMgSmFwYW4gLSB5ZWFyLXJvdW5kIGJhc2VzCi0jIERvbWUgRnVqaSwgLTc3MTkrMDM5NDIKLSMgU3lvd2EsIC02OTAwMjIrMDM5MzUyNAorIyBTeW93YSAoYWxzbyBrbm93biBhcyBTaG93YSksIC02OTAwMjIrMDM5MzUyNCwgc2luY2UgMTk1NwogIwogIyBGcm9tIEhpZGV5dWtpIFN1enVraSAoMTk5OS0wMi0wNik6CiAjIEluIGFsbCBKYXBhbmVzZSBzdGF0aW9ucywgKzAzMDAgaXMgdXNlZCBhcyB0aGUgc3RhbmRhcmQgdGltZS4KQEAgLTIzOSwxMSArMjM3LDExIEBACiBab25lIEFudGFyY3RpY2EvU3lvd2EJMAktCXp6egkxOTU3IEphbiAyOQogCQkJMzowMAktCVNZT1QJIyBTeW93YSBUaW1lCiAjIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5uaXByLmFjLmpwL2VuZ2xpc2gvYXJhMDEuaHRtbCI+CiAjIE5JUFIgQW50YXJjdGljIFJlc2VhcmNoIEFjdGl2aXRpZXMgKDE5OTktMDgtMTcpCi0jIDwvYT4KKyMgaHR0cDovL3d3dy5uaXByLmFjLmpwL2VuZ2xpc2gvYXJhMDEuaHRtbAogCiAjIFMgS29yZWEgLSB5ZWFyLXJvdW5kIGJhc2UKKyMgSmFuZyBCb2dvLCBUZXJyYSBOb3ZhIEJheSwgLTc0MzcwMCsxNjQxMjA1IHNpbmNlIDIwMTQKICMgS2luZyBTZWpvbmcsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTMtMDU4NDcsIHNpbmNlIDE5ODgKIAogIyBOZXcgWmVhbGFuZCAtIGNsYWltcwpAQCAtMjg3LDExICsyODUsMTQgQEAKIFJ1bGUJVHJvbGwJMjAwNAltYXgJLQlPY3QJbGFzdFN1bgkxOjAwdQkwOjAwCVVUQwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbnRhcmN0aWNhL1Ryb2xsCTAJLQl6enoJMjAwNSBGZWIgMTIKLSAgICAgCQkJMDowMAlUcm9sbAklcworCQkJMDowMAlUcm9sbAklcwogCiAjIFBvbGFuZCAtIHllYXItcm91bmQgYmFzZQogIyBBcmN0b3dza2ksIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMDk0NS0wNTgyNzQ1LCBzaW5jZSAxOTc3CiAKKyMgUm9tYW5pYSAtIHllYXItYm91bmQgYmFzZQorIyBMYXctUmFjb3ZpyJvEgywgTGFyc2VtYW5uIEhpbGxzLCAtNjkyMzE5KzA3NjIyNTEsIHNpbmNlIDE5ODYKKwogIyBSdXNzaWEgLSB5ZWFyLXJvdW5kIGJhc2VzCiAjIEJlbGxpbmdzaGF1c2VuLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjExNTktMDU4NTMzNywgc2luY2UgMTk2OC0wMi0yMgogIyBNaXJueSwgRGF2aXMgY29hc3QsIC02NjMzKzA5MzAxLCBzaW5jZSAxOTU2LTAyCkBAIC0zMDEsOCArMzAyLDggQEAKICMJeWVhci1yb3VuZCBmcm9tIDE5NjAvNjEgdG8gMTk5MgogCiAjIFZvc3Rvaywgc2luY2UgMTk1Ny0xMi0xNiwgdGVtcG9yYXJpbHkgY2xvc2VkIDE5OTQtMDIvMTk5NC0xMQotIyA8YSBocmVmPSJodHRwOi8vcXVlc3QuYXJjLm5hc2EuZ292L2FudGFyY3RpY2EvUUEvY29tcHV0ZXJzL0RpcmVjdGlvbnMsVGltZSxaSVAiPgotIyBGcm9tIENyYWlnIE11bmRlbGwgKDE5OTQtMTItMTUpPC9hPjoKKyMgRnJvbSBDcmFpZyBNdW5kZWxsICgxOTk0LTEyLTE1KToKKyMgaHR0cDovL3F1ZXN0LmFyYy5uYXNhLmdvdi9hbnRhcmN0aWNhL1FBL2NvbXB1dGVycy9EaXJlY3Rpb25zLFRpbWUsWklQCiAjIFZvc3Rvaywgd2hpY2ggaXMgb25lIG9mIHRoZSBSdXNzaWFuIHN0YXRpb25zLCBpcyBzZXQgb24gdGhlIHNhbWUKICMgdGltZSBhcyBNb3Njb3csIFJ1c3NpYS4KICMKQEAgLTMxNyw3ICszMTgsNyBAQAogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA1LTA0KToKICMgVGhpcyBzZWVtcyB0byBiZSBob3BlbGVzc2x5IGNvbmZ1c2luZywgc28gSSBhc2tlZCBMZWUgSG90eiBhYm91dCBpdAotIyBpbiBwZXJzb24uICBIZSBzYWlkIHRoYXQgc29tZSBBbnRhcnRpYyBsb2NhdGlvbnMgc2V0IHRoZWlyIGxvY2FsCisjIGluIHBlcnNvbi4gIEhlIHNhaWQgdGhhdCBzb21lIEFudGFyY3RpYyBsb2NhdGlvbnMgc2V0IHRoZWlyIGxvY2FsCiAjIHRpbWUgc28gdGhhdCBub29uIGlzIHRoZSB3YXJtZXN0IHBhcnQgb2YgdGhlIGRheSwgYW5kIHRoYXQgdGhpcwogIyBjaGFuZ2VzIGR1cmluZyB0aGUgeWVhciBhbmQgZG9lcyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBtZWFuCiAjIHNvbGFyIG5vb24uICBTbyB0aGUgVm9zdG9rIHRpbWUgbWlnaHQgaGF2ZSBiZWVuIHdoYXRldmVyIHRoZSBjbG9ja3MKQEAgLTMyOSw5ICszMzAsMTIgQEAKIAogIyBTIEFmcmljYSAtIHllYXItcm91bmQgYmFzZXMKICMgTWFyaW9uIElzbGFuZCwgLTQ2NTMrMDM3NTIKLSMgU2FuYWUsIC03MTQxLTAwMjUwCisjIFNBTkFFIElWLCBWZXNsZXNrYXJ2ZXQsIFF1ZWVuIE1hdWQgTGFuZCwgLTcxNDAyMi0wMDI1MDI2LCBzaW5jZSAxOTk3CiAKLSMgVUsKKyMgVWtyYWluZSAtIHllYXItcm91bmQgYmFzZQorIyBWZXJuYWRza3kgKGZvcm1lcmx5IEZhcmFkYXkpLCBHYWxpbmRleiBJc2xhbmQsIC02NTE0NDUtMDY0MTUyNiwgc2luY2UgMTk1NAorCisjIFVuaXRlZCBLaW5nZG9tCiAjCiAjIEJyaXRpc2ggQW50YXJjdGljIFRlcnJpdG9yaWVzIChCQVQpIGNsYWltcwogIyBTb3V0aCBPcmtuZXkgSXNsYW5kcwpAQCAtMzg3LDcgKzM5MSw3IEBACiAjIGJ1dCB0aGF0IGhlIGZvdW5kIGl0IG1vcmUgY29udmVuaWVudCB0byBrZWVwIEdNVCsxMgogIyBhcyBzdXBwbGllcyBmb3IgdGhlIHN0YXRpb24gd2VyZSBjb21pbmcgZnJvbSBNY011cmRvIFNvdW5kLAogIyB3aGljaCB3YXMgb24gR01UKzEyIGJlY2F1c2UgTmV3IFplYWxhbmQgd2FzIG9uIEdNVCsxMiBhbGwgeWVhcgotIyBhdCB0aGF0IHRpbWUgKDE5NTcpLiAgKFNvdXJjZTogU2lwbGUncyBib29rIDkwIGRlZ3JlZXMgU09VVEguKQorIyBhdCB0aGF0IHRpbWUgKDE5NTcpLiAgKFNvdXJjZTogU2lwbGUncyBib29rIDkwIERlZ3JlZXMgU291dGguKQogIwogIyBGcm9tIFN1c2FuIFNtaXRoCiAjIGh0dHA6Ly93d3cuY3liZXJ0b3Vycy5jb20vd2hzL3BvbGUxMC5odG1sCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hc2lhIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYXNpYQppbmRleCA1OTVjOGVkLi45MDZjMGE5IDEwMDY0NAotLS0gYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hc2lhCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2FzaWEKQEAgLTIxLDEzICsyMSwxMyBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIFRoaXMgZmlsZSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAogIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KKyMgdHpAaWFuYS5vcmcgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLiAgRm9yIG1vcmUsIHBsZWFzZSBzZWUKKyMgdGhlIGZpbGUgQ09OVFJJQlVUSU5HIGluIHRoZSB0eiBkaXN0cmlidXRpb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0wOC0xMSk6CiAjCkBAIC00OSwxMyArNDksMTcgQEAKICMgSSBmb3VuZCBpbiB0aGUgVUNMQSBsaWJyYXJ5LgogIwogIyBGb3IgZGF0YSBjaXJjYSAxODk5LCBhIGNvbW1vbiBzb3VyY2UgaXM6Ci0jIE1pbG5lIEouIENpdmlsIHRpbWUuIEdlb2dyIEouIDE4OTkgRmViOzEzKDIpOjE3My05NAotIyA8aHR0cDovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzE3NzQzNTk+LgorIyBNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQuCisjIGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5CisjCisjIEZvciBSdXNzaWFuIGRhdGEgY2lyY2EgMTkxOSwgYSBzb3VyY2UgaXM6CisjIEJ5YWxva296IEVMLiBOZXcgQ291bnRpbmcgb2YgVGltZSBpbiBSdXNzaWEgc2luY2UgSnVseSAxLCAxOTE5LgorIyAoU2VlIHRoZSAnZXVyb3BlJyBmaWxlIGZvciBhIGZ1bGxlciBjaXRhdGlvbi4pCiAjCiAjIEEgcmVsaWFibGUgYW5kIGVudGVydGFpbmluZyBzb3VyY2UgYWJvdXQgdGltZSB6b25lcyBpcwogIyBEZXJlayBIb3dzZSwgR3JlZW53aWNoIHRpbWUgYW5kIGxvbmdpdHVkZSwgUGhpbGlwIFdpbHNvbiBQdWJsaXNoZXJzICgxOTk3KS4KICMKLSMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgYConIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7CisjIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkICcqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOwogIyB0aGUgcmVzdCBhcmUgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgZmlsZSwgb3IgZnJvbSBvdGhlciBzb3VyY2VzLgogIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKICMJICAgICBzdGQgIGRzdApAQCAtNzAsMTMgKzc0LDE0IEBACiAjCTc6MDAgV0lCCXdlc3QgSW5kb25lc2lhIChXYWt0dSBJbmRvbmVzaWEgQmFyYXQpCiAjCTg6MDAgV0lUQQljZW50cmFsIEluZG9uZXNpYSAoV2FrdHUgSW5kb25lc2lhIFRlbmdhaCkKICMJODowMCBDU1QJQ2hpbmEKLSMJOTowMCBDSlQJQ2VudHJhbCBKYXBhbmVzZSBUaW1lICgxODk2LzE5MzcpKgorIwk4OjAwIEpXU1QJV2VzdGVybiBTdGFuZGFyZCBUaW1lIChKYXBhbiwgMTg5Ni8xOTM3KSoKKyMJOTowMCBKQ1NUCUNlbnRyYWwgU3RhbmRhcmQgVGltZSAoSmFwYW4sIDE4OTYvMTkzNykKICMJOTowMCBXSVQJZWFzdCBJbmRvbmVzaWEgKFdha3R1IEluZG9uZXNpYSBUaW11cikKICMJOTowMCBKU1QgIEpEVAlKYXBhbgogIwk5OjAwIEtTVCAgS0RUCUtvcmVhCi0jCTk6MzAgQ1NUCShBdXN0cmFsaWFuKSBDZW50cmFsIFN0YW5kYXJkIFRpbWUKKyMJOTozMCBBQ1NUCUF1c3RyYWxpYW4gQ2VudHJhbCBTdGFuZGFyZCBUaW1lCiAjCi0jIFNlZSB0aGUgYGV1cm9wZScgZmlsZSBmb3IgUnVzc2lhIGFuZCBUdXJrZXkgaW4gQXNpYS4KKyMgU2VlIHRoZSAnZXVyb3BlJyBmaWxlIGZvciBSdXNzaWEgYW5kIFR1cmtleSBpbiBBc2lhLgogCiAjIEZyb20gR3V5IEhhcnJpczoKICMgSW5jb3Jwb3JhdGVzIGRhdGEgZm9yIFNpbmdhcG9yZSBmcm9tIFJvYmVydCBFbHonIGFzaWEgMS4xLCBhcyB3ZWxsIGFzCkBAIC04Niw3ICs5MSw3IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotIyBUaGVzZSBydWxlcyBhcmUgc3RvbGVuIGZyb20gdGhlIGBldXJvcGUnIGZpbGUuCisjIFRoZXNlIHJ1bGVzIGFyZSBzdG9sZW4gZnJvbSB0aGUgJ2V1cm9wZScgZmlsZS4KICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCUVVQXNpYQkxOTgxCW1heAktCU1hcglsYXN0U3VuCSAxOjAwdQkxOjAwCVMKIFJ1bGUJRVVBc2lhCTE5NzkJMTk5NQktCVNlcAlsYXN0U3VuCSAxOjAwdQkwCS0KQEAgLTEzOCwxMSArMTQzLDExIEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvWWVyZXZhbgkyOjU4OjAwIC0JTE1UCTE5MjQgTWF5ICAyCiAJCQkzOjAwCS0JWUVSVAkxOTU3IE1hciAgICAjIFllcmV2YW4gVGltZQotCQkJNDowMCBSdXNzaWFBc2lhIFlFUiVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJNDowMCBSdXNzaWFBc2lhIFlFUiVzVAkxOTkxIE1hciAzMSAgMjowMHMKIAkJCTM6MDAJMTowMAlZRVJTVAkxOTkxIFNlcCAyMyAjIGluZGVwZW5kZW5jZQotCQkJMzowMCBSdXNzaWFBc2lhCUFNJXNUCTE5OTUgU2VwIDI0IDI6MDBzCisJCQkzOjAwIFJ1c3NpYUFzaWEJQU0lc1QJMTk5NSBTZXAgMjQgIDI6MDBzCiAJCQk0OjAwCS0JQU1UCTE5OTcKLQkJCTQ6MDAgUnVzc2lhQXNpYQlBTSVzVAkyMDEyIE1hciAyNSAyOjAwcworCQkJNDowMCBSdXNzaWFBc2lhCUFNJXNUCTIwMTIgTWFyIDI1ICAyOjAwcwogCQkJNDowMAktCUFNVAogCiAjIEF6ZXJiYWlqYW4KQEAgLTE1NSwxNiArMTYwLDE2IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvQmFrdQkzOjE5OjI0IC0JTE1UCTE5MjQgTWF5ICAyCiAJCQkzOjAwCS0JQkFLVAkxOTU3IE1hciAgICAjIEJha3UgVGltZQotCQkJNDowMCBSdXNzaWFBc2lhIEJBSyVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJNDowMCBSdXNzaWFBc2lhIEJBSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKIAkJCTM6MDAJMTowMAlCQUtTVAkxOTkxIEF1ZyAzMCAjIGluZGVwZW5kZW5jZQogCQkJMzowMCBSdXNzaWFBc2lhCUFaJXNUCTE5OTIgU2VwIGxhc3RTYXQgMjM6MDAKLQkJCTQ6MDAJLQlBWlQJMTk5NiAjIEF6ZXJiYWlqYW4gdGltZQorCQkJNDowMAktCUFaVAkxOTk2ICAgICAjIEF6ZXJiYWlqYW4gVGltZQogCQkJNDowMAlFVUFzaWEJQVolc1QJMTk5NwogCQkJNDowMAlBemVyCUFaJXNUCiAKICMgQmFocmFpbgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0JhaHJhaW4JMzoyMjoyMCAtCUxNVAkxOTIwCQkjIEFsIE1hbmFtYWgKK1pvbmUJQXNpYS9CYWhyYWluCTM6MjI6MjAgLQlMTVQJMTkyMCAgICAgIyBNYW5hbWFoCiAJCQk0OjAwCS0JR1NUCTE5NzIgSnVuCiAJCQkzOjAwCS0JQVNUCiAKQEAgLTE3NCwxMyArMTc5LDggQEAKICMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgZnJvbSBKdW5lIDE2IHRvIFNlcHQgMzAKICMKICMgQmFuZ2xhZGVzaCB0byBpbnRyb2R1Y2UgZGF5bGlnaHQgc2F2aW5nIHRpbWUgbGlrZWx5IGZyb20gSnVuZSAxNgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzaWFudHJpYnVuZS5jb20vP3E9bm9kZS8xNzI4OCI+CiAjIGh0dHA6Ly93d3cuYXNpYW50cmlidW5lLmNvbS8/cT1ub2RlLzE3Mjg4Ci0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDIuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDAyLmh0bWwKLSMgPC9hPgogIwogIyAiLi4uIEJhbmdsYWRlc2ggZ292ZXJubWVudCBoYXMgZGVjaWRlZCB0byBzd2l0Y2ggZGF5bGlnaHQgc2F2aW5nIHRpbWUgZnJvbQogIyBKdW5lCkBAIC0xOTUsMTcgKzE5NSwxMSBAQAogIyB0aGUgMTl0aCBhbmQgMjB0aCwgYW5kIHRoZXkgaGF2ZSBub3Qgc2V0IHRoZSBlbmQgZGF0ZSB5ZXQuCiAjCiAjIFNvbWUgc291cmNlczoKLSMgPGEgaHJlZj0iaHR0cDovL2luLnJldXRlcnMuY29tL2FydGljbGUvc291dGhBc2lhTmV3cy9pZElOSW5kaWEtNDAwMTc2MjAwOTA2MDEiPgogIyBodHRwOi8vaW4ucmV1dGVycy5jb20vYXJ0aWNsZS9zb3V0aEFzaWFOZXdzL2lkSU5JbmRpYS00MDAxNzYyMDA5MDYwMQotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly9iZG5ld3MyNC5jb20vZGV0YWlscy5waHA/aWQ9ODU4ODkmY2lkPTIiPgogIyBodHRwOi8vYmRuZXdzMjQuY29tL2RldGFpbHMucGhwP2lkPTg1ODg5JmNpZD0yCi0jIDwvYT4KICMKICMgT3VyIHdyYXAtdXA6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9iYW5nbGFkZXNoLWRheWxpZ2h0LXNhdmluZy0yMDA5Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvYmFuZ2xhZGVzaC1kYXlsaWdodC1zYXZpbmctMjAwOS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEEuIE4uIE0uIEthbXJ1cyBTYWFkYXQgKDIwMDktMDYtMTUpOgogIyBGaW5hbGx5IHdlJ3ZlIGdvdCB0aGUgb2ZmaWNpYWwgbWFpbCByZWdhcmRpbmcgRFNUIHN0YXJ0IHRpbWUgd2hlcmUgRFNUIHN0YXJ0CkBAIC0yMjAsMTMgKzIxNCw4IEBACiAjCiAjIEZvbGxvd2luZyByZXBvcnQgYnkgc2FtZSBuZXdzcGFwZXItIlRoZSBEYWlseSBTdGFyIEZyaWRheSI6CiAjICJEU1QgY2hhbmdlIGF3YWl0cyBjYWJpbmV0IGRlY2lzaW9uLUNsb2NrIHdvbid0IGdvIGJhY2sgYnkgMS1ociBmcm9tIE9jdCAxIgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL25ld3MtZGV0YWlscy5waHA/bmlkPTEwNzAyMSI+CiAjIGh0dHA6Ly93d3cudGhlZGFpbHlzdGFyLm5ldC9uZXdEZXNpZ24vbmV3cy1kZXRhaWxzLnBocD9uaWQ9MTA3MDIxCi0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDQuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDA0Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTEwLTEzKToKICMgSUFOUyAoSW5kby1Bc2lhbiBOZXdzIFNlcnZpY2UpIG5vdyByZXBvcnRzOgpAQCAtMjM1LDIyICsyMjQsMTUgQEAKICMgImNvbnRpbnVlIGZvciBhbiBpbmRlZmluaXRlIHBlcmlvZC4iCiAjCiAjIE9uZSBvZiBtYW55IHBsYWNlcyB3aGVyZSBpdCBpcyBwdWJsaXNoZWQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhhaW5kaWFuLmNvbS9uZXdzcG9ydGFsL2J1c2luZXNzL2JhbmdsYWRlc2gtdG8tY29udGludWUtaW5kZWZpbml0ZWx5LXdpdGgtYWR2YW5jZWQtdGltZV8xMDAyNTk5ODcuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGhhaW5kaWFuLmNvbS9uZXdzcG9ydGFsL2J1c2luZXNzL2JhbmdsYWRlc2gtdG8tY29udGludWUtaW5kZWZpbml0ZWx5LXdpdGgtYWR2YW5jZWQtdGltZV8xMDAyNTk5ODcuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMTItMjQpOgogIyBBY2NvcmRpbmcgdG8gQmFuZ2xhZGVzaCBuZXdzcGFwZXIgIlRoZSBEYWlseSBTdGFyLCIKICMgQmFuZ2xhZGVzaCB3aWxsIGNoYW5nZSBpdHMgY2xvY2sgYmFjayB0byBTdGFuZGFyZCBUaW1lIG9uIERlYyAzMSwgMjAwOS4KICMKICMgQ2xvY2sgZ29lcyBiYWNrIDEtaHIgb24gRGVjIDMxIG5pZ2h0LgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL25ld3MtZGV0YWlscy5waHA/bmlkPTExOTIyOCI+CiAjIGh0dHA6Ly93d3cudGhlZGFpbHlzdGFyLm5ldC9uZXdEZXNpZ24vbmV3cy1kZXRhaWxzLnBocD9uaWQ9MTE5MjI4Ci0jIDwvYT4KLSMgYW5kCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDA1Lmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2JhbmdsYWRlc2gwNS5odG1sCi0jIDwvYT4KICMKICMgIi4uLlRoZSBnb3Zlcm5tZW50IHllc3RlcmRheSBkZWNpZGVkIHRvIHB1dCB0aGUgY2xvY2sgYmFjayBieSBvbmUgaG91cgogIyBvbiBEZWNlbWJlciAzMSBtaWRuaWdodCBhbmQgdGhlIG5ldyB0aW1lIHdpbGwgY29udGludWUgdW50aWwgTWFyY2ggMzEsCkBAIC0yNjAsMTcgKzI0MiwxMiBAQAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMC0wMy0yMik6CiAjIEFjY29yZGluZyB0byBCYW5nbGFkZXNoIG5ld3NwYXBlciAiVGhlIERhaWx5IFN0YXIsIgogIyBDYWJpbmV0IGNhbmNlbHMgRGF5bGlnaHQgU2F2aW5nIFRpbWUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGVkYWlseXN0YXIubmV0L25ld0Rlc2lnbi9sYXRlc3RfbmV3cy5waHA/bmlkPTIyODE3Ij4KICMgaHR0cDovL3d3dy50aGVkYWlseXN0YXIubmV0L25ld0Rlc2lnbi9sYXRlc3RfbmV3cy5waHA/bmlkPTIyODE3Ci0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDYuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDA2Lmh0bWwKLSMgPC9hPgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlEaGFrYQkyMDA5CW9ubHkJLQlKdW4JMTkJMjM6MDAJMTowMAlTCi1SdWxlCURoYWthCTIwMDkJb25seQktCURlYwkzMQkyMzo1OQkwCS0KK1J1bGUJRGhha2EJMjAwOQlvbmx5CS0JRGVjCTMxCTI0OjAwCTAJLQogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvRGhha2EJNjowMTo0MCAtCUxNVAkxODkwCkBAIC0zMDEsNyArMjc4LDcgQEAKIAogIyBCcnVuZWkKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9CcnVuZWkJNzozOTo0MCAtCUxNVAkxOTI2IE1hciAgICMgQmFuZGFyIFNlcmkgQmVnYXdhbgorWm9uZQlBc2lhL0JydW5laQk3OjM5OjQwIC0JTE1UCTE5MjYgTWFyICMgQmFuZGFyIFNlcmkgQmVnYXdhbgogCQkJNzozMAktCUJOVAkxOTMzCiAJCQk4OjAwCS0JQk5UCiAKQEAgLTMxMCwxNiArMjg3LDE2IEBACiAjIE1pbG5lIHNheXMgNjoyNDo0MCB3YXMgdGhlIG1lcmlkaWFuIG9mIHRoZSB0aW1lIGJhbGwgb2JzZXJ2YXRvcnkgYXQgUmFuZ29vbi4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1Jhbmdvb24JNjoyNDo0MCAtCUxNVAkxODgwCQkjIG9yIFlhbmdvbgotCQkJNjoyNDo0MAktCVJNVAkxOTIwCSAgICMgUmFuZ29vbiBNZWFuIFRpbWU/Ci0JCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAgICMgQnVybWEgVGltZQotCQkJOTowMAktCUpTVAkxOTQ1IE1heSAzCi0JCQk2OjMwCS0JTU1UCQkgICAjIE15YW5tYXIgVGltZQorWm9uZQlBc2lhL1Jhbmdvb24JNjoyNDo0MCAtCUxNVAkxODgwICAgICAgICAjIG9yIFlhbmdvbgorCQkJNjoyNDo0MAktCVJNVAkxOTIwICAgICAgICAjIFJhbmdvb24gTWVhbiBUaW1lPworCQkJNjozMAktCUJVUlQJMTk0MiBNYXkgICAgIyBCdXJtYSBUaW1lCisJCQk5OjAwCS0JSlNUCTE5NDUgTWF5ICAzCisJCQk2OjMwCS0JTU1UCSMgTXlhbm1hciBUaW1lCiAKICMgQ2FtYm9kaWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9QaG5vbV9QZW5oCTY6NTk6NDAgLQlMTVQJMTkwNiBKdW4gIDkKLQkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgMDowMSAjIFNhaWdvbiBNVD8KKwkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgIDA6MDEgIyBTYWlnb24gTVQ/CiAJCQk3OjAwCS0JSUNUCTE5MTIgTWF5CiAJCQk4OjAwCS0JSUNUCTE5MzEgTWF5CiAJCQk3OjAwCS0JSUNUCkBAIC0zMzIsMTIgKzMwOSwxMiBAQAogIyBGcm9tIEJvYiBEZXZpbmUgKDE5ODgtMDEtMjgpOgogIyBObyB0aGV5IGRvbid0LiAgU2VlIFRJTUUgbWFnLCAxOTg2LTAyLTE3IHAuNTIuICBFdmVuIHRob3VnaAogIyBDaGluYSBpcyBhY3Jvc3MgNCBwaHlzaWNhbCB0aW1lIHpvbmVzLCBiZWZvcmUgRmViIDEsIDE5ODYgb25seSB0aGUKLSMgUGVraW5nIChCZWppbmcpIHRpbWUgem9uZSB3YXMgcmVjb2duaXplZC4gIFNpbmNlIHRoYXQgZGF0ZSwgQ2hpbmEKLSMgaGFzIHR3byBvZiAnZW0gLS0gUGVraW5nJ3MgYW5kIFVydW1xaSAobmFtZWQgYWZ0ZXIgdGhlIGNhcGl0YWwgb2YKKyMgUGVraW5nIChCZWlqaW5nKSB0aW1lIHpvbmUgd2FzIHJlY29nbml6ZWQuICBTaW5jZSB0aGF0IGRhdGUsIENoaW5hCisjIGhhcyB0d28gb2YgJ2VtIC0gUGVraW5nJ3MgYW5kIMOccsO8bXFpIChuYW1lZCBhZnRlciB0aGUgY2FwaXRhbCBvZgogIyB0aGUgWGluamlhbmcgVXlnaHVyIEF1dG9ub21vdXMgUmVnaW9uKS4gIEkgZG9uJ3Qga25vdyBhYm91dCBEU1QgZm9yIGl0LgogIwogIyAuIC4gLkkganVzdCBkZWxldGVkIHRoZSBEU1QgdGFibGUgYW5kIHRoaXMgZWRpdG9yIG1ha2VzIGl0IHRvbwotIyBwYWluZnVsIHRvIHN1Y2sgaW4gYW5vdGhlciBjb3B5Li4gIFNvLCBoZXJlIGlzIHdoYXQgSSBoYXZlIGZvcgorIyBwYWluZnVsIHRvIHN1Y2sgaW4gYW5vdGhlciBjb3B5LiAgU28sIGhlcmUgaXMgd2hhdCBJIGhhdmUgZm9yCiAjIERTVCBzdGFydC9lbmQgZGF0ZXMgZm9yIFBla2luZydzIHRpbWUgem9uZSAoaW5mbyBmcm9tIEFQKToKICMKICMgICAgIDE5ODYgTWF5IDQgLSBTZXB0IDE0CkBAIC0zNDcsMTUgKzMyNCwxNiBAQAogIyBDSElOQSAgICAgICAgICAgICAgIDggSCAgQUhFQUQgT0YgVVRDICBBTEwgT0YgQ0hJTkEsIElOQ0wgVEFJV0FOCiAjIENISU5BICAgICAgICAgICAgICAgOSBIICBBSEVBRCBPRiBVVEMgIEFQUiAxNyAtIFNFUCAxMAogCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBDaGluYSAoZXhjZXB0IGZvciBIb25nIEtvbmcgYW5kIE1hY2F1KQotIyBoYXMgaGFkIGEgc2luZ2xlIHRpbWUgem9uZSBzaW5jZSAxOTgwIE1heSAxLCBvYnNlcnZpbmcgc3VtbWVyIERTVAotIyBmcm9tIDE5ODYgdGhyb3VnaCAxOTkxOyB0aGlzIGNvbnRyYWRpY3RzIERldmluZSdzCi0jIG5vdGUgYWJvdXQgVGltZSBtYWdhemluZSwgdGhvdWdoIGFwcGFyZW50bHkgX3NvbWV0aGluZ18gaGFwcGVuZWQgaW4gMTk4Ni4KLSMgR28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgZm9yIG5vdy4gIEkgbWFkZSB1cCBuYW1lcyBmb3IgdGhlIG90aGVyCi0jIHByZS0xOTgwIHRpbWUgem9uZXMuCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDItMTEpOgorIyBKaW0gTWFubiwgIkEgY2x1bXN5IGVtYnJhY2UgZm9yIGFub3RoZXIgd2VzdGVybiBjdXN0b206IENoaW5hIG9uIGRheWxpZ2h0CisjIHRpbWUgLSBzb3J0IG9mIiwgTG9zIEFuZ2VsZXMgVGltZXMsIDE5ODYtMDUtMDUgLi4uIFtzYXlzXSB0aGF0IENoaW5hIGJlZ2FuCisjIG9ic2VydmluZyBkYXlsaWdodCBzYXZpbmcgdGltZSBpbiAxOTg2LgogCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTMwKToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIGhhdmUgQ2hpbmEgc3dpdGNoaW5nIHRvIGEgc2luZ2xlIHRpbWUgem9uZSBpbiAxOTgwLCBidXQKKyMgdGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgY29ycmVjdC4gIFRoZXkgYWxzbyB3cml0ZSB0aGF0IENoaW5hIG9ic2VydmVkIHN1bW1lcgorIyBEU1QgZnJvbSAxOTg2IHRocm91Z2ggMTk5MSwgd2hpY2ggc2VlbXMgdG8gbWF0Y2ggdGhlIGFib3ZlIGNvbW1lbnRhcnksIHNvCisjIGdvIHdpdGggdGhlbSBmb3IgRFNUIHJ1bGVzIGFzIGZvbGxvd3M6CiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlTaGFuZwkxOTQwCW9ubHkJLQlKdW4JIDMJMDowMAkxOjAwCUQKIFJ1bGUJU2hhbmcJMTk0MAkxOTQxCS0JT2N0CSAxCTA6MDAJMAlTCkBAIC0zNjksNyArMzQ3LDcgQEAKICMgaGlzdG9yaWMgdGltZXpvbmVzIGZyb20gc29tZSBUYWl3YW4gd2Vic2l0ZXMuICBBbmQgeWVzLCB0aGVyZSBhcmUgb2ZmaWNpYWwKICMgQ2hpbmVzZSBuYW1lcyBmb3IgdGhlc2UgbG9jYWxlcyAoYmVmb3JlIDE5NDkpLgogIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wNy0xNCk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNi0wNy0xNCk6CiAjIEkgaGF2ZSBpbnZlc3RpZ2F0ZWQgdGhlIHRpbWV6b25lcyBhcm91bmQgMTk3MCBvbiB0aGUKICMgaHR0cDovL3d3dy5hc3Ryby5jb20vYXRsYXMgc2l0ZSBbd2l0aCBwcm92aW5jZXMgYW5kIGNvdW50eQogIyBib3VuZGFyaWVzIHN1bW1hcml6ZWQgYmVsb3ddLi4uLiAgQSBmZXcgb3RoZXIgZXhjZXB0aW9ucyB3ZXJlIHR3bwpAQCAtMzgwLDY1ICszNTgsOTcgQEAKICMgKGNvdWxkIGJlIHRydWUpLCBmb3IgdGhlIG1vbWVudCBJIGFtIGFzc3VtaW5nIHRoYXQgdGhvc2UgdHdvCiAjIGNvdW50aWVzIGFyZSBtaXN0YWtlcyBpbiB0aGUgYXN0cm8uY29tIGRhdGEuCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwOC0wMi0xMSk6Ci0jIEkganVzdCBub3cgY2hlY2tlZCBHb29nbGUgTmV3cyBmb3Igd2VzdGVybiBuZXdzIHNvdXJjZXMgdGhhdCB0YWxrCi0jIGFib3V0IENoaW5hJ3Mgc2luZ2xlIHRpbWUgem9uZSwgYW5kIGNvdWxkbid0IGZpbmQgYW55dGhpbmcgYmVmb3JlIDE5ODYKLSMgdGFsa2luZyBhYm91dCBDaGluYSBiZWluZyBpbiBvbmUgdGltZSB6b25lLiAgKFRoYXQgYXJ0aWNsZSB3YXM6IEppbQotIyBNYW5uLCAiQSBjbHVtc3kgZW1icmFjZSBmb3IgYW5vdGhlciB3ZXN0ZXJuIGN1c3RvbTogQ2hpbmEgb24gZGF5bGlnaHQKLSMgdGltZS0tc29ydCBvZiIsIExvcyBBbmdlbGVzIFRpbWVzLCAxOTg2LTA1LTA1LiAgQnkgdGhlIHdheSwgdGhpcwotIyBhcnRpY2xlIGNvbmZpcm1zIHRoZSB0eiBkYXRhYmFzZSdzIGRhdGEgY2xhaW1pbmcgdGhhdCBDaGluYSBiZWdhbgotIyBvYnNlcnZpbmcgZGF5bGlnaHQgc2F2aW5nIHRpbWUgaW4gMTk4Ni4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0zMCk6CisjIEFsb2lzIFRyZWluZGwga2luZGx5IHNlbnQgbWUgdHJhbnNsYXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHNvdXJjZXM6CiAjCi0jIEZyb20gVGhvbWFzIFMuIE11bGxhbmV5ICgyMDA4LTAyLTExKToKLSMgSSB0aGluayB5b3UncmUgY29tYmluaW5nIHR3byBzdWJqZWN0cyB0aGF0IG5lZWQgdG8gdHJlYXRlZAotIyBzZXBhcmF0ZWx5OiBkYXlsaWdodCBzYXZpbmdzICh3aGljaCwgeW91J3JlIGNvcnJlY3QsIHdhc24ndAotIyBpbXBsZW1lbnRlZCB1bnRpbCB0aGUgMTk4MHMpIGFuZCB0aGUgdW5pZmllZCB0aW1lIHpvbmUgY2VudGVyZWQgbmVhcgotIyBCZWlqaW5nICh3aGljaCB3YXMgaW1wbGVtZW50ZWQgaW4gMTk0OSkuIEJyaWVmbHksIHRoZXJlIHdhcyBhbHNvIGEKLSMgIkxoYXNhIFRpbWUiIGluIFRpYmV0IGFuZCAiVXJ1bXFpIFRpbWUiIGluIFhpbmppYW5nLiBUaGUgZmlyc3Qgd2FzCi0jIGNlYXNlZCwgYW5kIHRoZSBzZWNvbmQgZXZlbnR1YWxseSByZWNvZ25pemVkIChhZ2FpbiwgaW4gdGhlIDE5ODBzKS4KKyMgKDEpCisjIEd1byBRaW5nc2hlbmcgKE5hdGlvbmFsIFRpbWUtU2VydmljZSBDZW50ZXIsIENBUywgWGknYW4gNzEwNjAwLCBDaGluYSkKKyMgQmVpamluZyBUaW1lIGF0IHRoZSBCZWdpbm5pbmcgb2YgdGhlIFBSQworIyBDaGluYSBIaXN0b3JpY2FsIE1hdGVyaWFscyBvZiBTY2llbmNlIGFuZCBUZWNobm9sb2d5CisjIChaaG9uZ2d1byBrZSBqaSBzaGkgbGlhbywg5Lit5Zu956eR5oqA5Y+y5paZKSwgVm9sLiAyNCwgTm8uIDEgKDIwMDMpCisjIEl0IGdpdmVzIGV2aWRlbmNlIHRoYXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgUFJDLCBCZWlqaW5nIHRpbWUgd2FzCisjIG9mZmljaWFsbHkgYXBwYXJlbnQgc29sYXIgdGltZSEgIEhvd2V2ZXIsIEd1byBhbHNvIHNheXMgdGhhdCB0aGUKKyMgZXZpZGVuY2UgaXMgZHViaW91cywgYXMgdGhlIHJlbGV2YW50IGluc3RpdHV0ZSBvZiBhc3Ryb25vbXkgaGFkIG5vdAorIyBiZWVuIHRha2VuIG92ZXIgYnkgdGhlIFBSQyB5ZXQuICBJdCdzIHBsYXVzaWJsZSB0aGF0IGFwcGFyZW50IHNvbGFyCisjIHRpbWUgd2FzIGFubm91bmNlZCBidXQgbmV2ZXIgaW1wbGVtZW50ZWQsIGFuZCB0aGF0IHBlb3BsZSBjb250aW51ZWQKKyMgdG8gdXNlIFVUKzguICBBcyB0aGUgU2hhbmdoYWkgcmFkaW8gc3RhdGlvbiAoYW5kIEkgcHJlc3VtZSB0aGUKKyMgb2JzZXJ2YXRvcnkpIHdhcyBzdGlsbCB1bmRlciBjb250cm9sIG9mIEZyZW5jaCBtaXNzaW9uYXJpZXMsIGl0CisjIGNvdWxkIHdlbGwgaGF2ZSBpZ25vcmVkIGFueSBzdWNoIG1hbmRhdGUuCiAjCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDYtMzApOgotIyBUaGVyZSBzZWVtcyB0byBiZSBhIGdvb2QgY2hhbmNlIENoaW5hIHN3aXRjaGVkIHRvIGEgc2luZ2xlIHRpbWUgem9uZSBpbiAxOTQ5Ci0jIHJhdGhlciB0aGFuIGluIDE5ODAgYXMgU2hhbmtzICYgUG90dGVuZ2VyIGhhdmUgaXQsIGJ1dCB3ZSBkb24ndCBoYXZlIGEKLSMgcmVsaWFibGUgZG9jdW1lbnRhcnkgc291cmNlIHNheWluZyBzbyB5ZXQsIHNvIGZvciBub3cgd2Ugc3RpbGwgZ28gd2l0aAotIyBTaGFua3MgJiBQb3R0ZW5nZXIuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgQ2hhbmdiYWkgVGltZSAoIkxvbmctd2hpdGUgVGltZSIsIExvbmctd2hpdGUgPSBIZWlsb25namlhbmcgYXJlYSkKKyMgKDIpCisjIEd1byBRaW5nLXNoZW5nIChTaGFhbnhpIEFzdHJvbm9taWNhbCBPYnNlcnZhdG9yeSwgQ0FTLCBYaSdhbiA3MTA2MDAsIENoaW5hKQorIyBBIFN0dWR5IG9uIHRoZSBTdGFuZGFyZCBUaW1lIENoYW5nZXMgZm9yIHRoZSBQYXN0IDEwMCBZZWFycyBpbiBDaGluYQorIyBbdW5kYXRlZCBhbmQgdW5rbm93biBwdWJsaWNhdGlvbiBsb2NhdGlvbl0KKyMgSXQgc2F5cyBzZXZlcmFsIHRoaW5nczoKKyMgICAqIFRoZSBRaW5nIGR5bmFzdHkgdXNlZCBsb2NhbCBhcHBhcmVudCBzb2xhciB0aW1lIHRocm91Z2hvdXQgQ2hpbmEuCisjICAgKiBUaGUgUmVwdWJsaWMgb2YgQ2hpbmEgaW5zdGl0dXRlZCBCZWlqaW5nIG1lYW4gc29sYXIgdGltZSBlZmZlY3RpdmUKKyMgICAgIHRoZSBvZmZpY2lhbCBjYWxlbmRhciBib29rIG9mIDE5MTQuCisjICAgKiBUaGUgRnJlbmNoIENvbmNlc3Npb24gaW4gU2hhbmdoYWkgc2V0IHVwIHNpZ25hbCBzdGF0aW9ucyBpbgorIyAgICAgRnJlbmNoIGRvY2tzIGluIHRoZSAxODkwcywgY29udHJvbGxlZCBieSBYdWppYWh1aSAoWmlrYXdlaSkKKyMgICAgIE9ic2VydmF0b3J5IGFuZCBzZXQgdG8gbG9jYWwgbWVhbiB0aW1lLgorIyAgICogIkZyb20gdGhlIGVuZCBvZiB0aGUgMTl0aCBjZW50dXJ5IiBpdCBjaGFuZ2VkIHRvIFVUKzguCisjICAgKiBDaGluZXNlIEN1c3RvbXMgKGJ5IHRoZW4gcmVkdWNlZCB0byBhIHRvb2wgb2YgZm9yZWlnbiBwb3dlcnMpCisjICAgICBldmVudHVhbGx5IHN0YW5kYXJkaXplZCBvbiB0aGlzIHRpbWUgZm9yIGFsbCBwb3J0cywgYW5kIGl0CisjICAgICBiZWNhbWUgdXNlZCBieSByYWlsd2F5cyBhcyB3ZWxsLgorIyAgICogSW4gMTkxOCB0aGUgQ2VudHJhbCBPYnNlcnZhdG9yeSBwcm9wb3NlZCBkaXZpZGluZyBDaGluYSBpbnRvCisjICAgICBmaXZlIHRpbWUgem9uZXMgKHNlZSBiZWxvdyBmb3IgZGV0YWlscykuICBUaGlzIGNhdWdodCBvbgorIyAgICAgYXQgZmlyc3Qgb25seSBpbiBjb2FzdGFsIGFyZWFzIG9ic2VydmluZyBVVCs4LgorIyAgICogRHVyaW5nIFdXSUkgYWxsIG9mIENoaW5hIHdhcyBpbiB0aGVvcnkgd2FzIGF0IFVUKzcuICBJbiBwcmFjdGljZQorIyAgICAgdGhpcyB3YXMgaWdub3JlZCBpbiB0aGUgd2VzdCwgYW5kIEkgcHJlc3VtZSB3YXMgaWdub3JlZCBpbgorIyAgICAgSmFwYW5lc2Utb2NjdXBpZWQgdGVycml0b3J5LgorIyAgICogSmFwYW5lc2Utb2NjdXBpZWQgTWFuY2h1cmlhIHdhcyBhdCBVVCs5LCBpLmUuLCBKYXBhbiB0aW1lLgorIyAgICogVGhlIGZpdmUtem9uZSBwbGFuIHdhcyByZXN1cnJlY3RlZCBhZnRlciBXV0lJIGFuZCBvZmZpY2lhbGx5IHB1dCBpbnRvCisjICAgICBwbGFjZSAod2l0aCBzb21lIG1vZGlmaWNhdGlvbnMpIGluIE1hcmNoIDE5NDguICBJdCdzIG5vdCBjbGVhcgorIyAgICAgaG93IHdlbGwgaXQgd2FzIG9ic2VydmVkIGluIGFyZWFzIHVuZGVyIE5hdGlvbmFsaXN0IGNvbnRyb2wuCisjICAgKiBUaGUgUGVvcGxlJ3MgTGliZXJhdGlvbiBBcm15IHVzZWQgVVQrOCBkdXJpbmcgdGhlIGNpdmlsIHdhci4KKyMKKyMgQW4gQVAgYXJ0aWNsZSAiU2hhbmdoYWkgSW50ZXJuYXQnbCBBcmVhIExpdHRsZSBDaGFuZ2VkIiBpbiB0aGUKKyMgTGV3aXN0b24gKE1FKSBEYWlseSBTdW4gKDE5MzktMDUtMjkpLCBwIDE3LCBzYWlkICJFdmVuIHRoZSB0aW1lIGlzCisjIGRpZmZlcmVudCAtIHRoZSBvY2N1cGllZCBkaXN0cmljdHMgZ29pbmcgYnkgVG9reW8gdGltZSwgYW4gaG91cgorIyBhaGVhZCBvZiB0aGF0IHByZXZhaWxpbmcgaW4gdGhlIHJlc3Qgb2YgU2hhbmdoYWkuIiAgR3Vlc3MgdGhhdCB0aGUKKyMgWHVqaWFodWkgT2JzZXJ2YXRvcnkgd2FzIHVuZGVyIEZyZW5jaCBjb250cm9sIGFuZCBzdHVjayB3aXRoIFVUKzguCisjCisjIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBDaGluYSBoYWQgbWFueSBzZXBhcmF0ZSBab25lIGVudHJpZXMsIGJ1dAorIyB0aGlzIHdhcyBiYXNlZCBvbiB3aGF0IHdlcmUgYXBwYXJlbnRseSBpbmNvcnJlY3QgZGF0YSBpbiBTaGFua3MgJiBQb3R0ZW5nZXIuCisjIFRoaXMgaGFzIG5vdyBiZWVuIHNpbXBsaWZpZWQgdG8gdGhlIHR3byBlbnRyaWVzIEFzaWEvU2hhbmdoYWkgYW5kCisjIEFzaWEvVXJ1bXFpLCB3aXRoIHRoZSBvdGhlcnMgYmVpbmcgbGlua3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisjIFByb3Bvc2VkIGluIDE5MTggYW5kIHRoZW9yZXRpY2FsbHkgaW4gZWZmZWN0IHVudGlsIDE5NDkgKGFsdGhvdWdoIGluIHByYWN0aWNlCisjIG1haW5seSBvYnNlcnZlZCBpbiBjb2FzdGFsIGFyZWFzKSwgdGhlIGZpdmUgem9uZXMgd2VyZToKKyMKKyMgQ2hhbmdiYWkgVGltZSAoIkxvbmctd2hpdGUgVGltZSIsIExvbmctd2hpdGUgPSBIZWlsb25namlhbmcgYXJlYSkgVVQrOC41CisjIEFzaWEvSGFyYmluIChjdXJyZW50bHkgYSBsaW5rIHRvIEFzaWEvU2hhbmdoYWkpCiAjIEhlaWxvbmdqaWFuZyAoZXhjZXB0IE1vaGUgY291bnR5KSwgSmlsaW4KLVpvbmUJQXNpYS9IYXJiaW4JODoyNjo0NAktCUxNVAkxOTI4ICMgb3IgSGFlcmJpbgotCQkJODozMAktCUNIQVQJMTkzMiBNYXIgIyBDaGFuZ2JhaSBUaW1lCi0JCQk4OjAwCS0JQ1NUCTE5NDAKLQkJCTk6MDAJLQlDSEFUCTE5NjYgTWF5Ci0JCQk4OjMwCS0JQ0hBVAkxOTgwIE1heQotCQkJODowMAlQUkMJQyVzVAotIyBaaG9uZ3l1YW4gVGltZSAoIkNlbnRyYWwgcGxhaW4gVGltZSIpCisjCisjIFpob25neXVhbiBUaW1lICgiQ2VudHJhbCBwbGFpbiBUaW1lIikgVVQrOAorIyBBc2lhL1NoYW5naGFpCiAjIG1vc3Qgb2YgQ2hpbmEKLSMgTWlsbmUgZ2l2ZXMgODowNTo1Ni43OyByb3VuZCB0byBuZWFyZXN0LgotWm9uZQlBc2lhL1NoYW5naGFpCTg6MDU6NTcJLQlMTVQJMTkyOAotCQkJODowMAlTaGFuZwlDJXNUCTE5NDkKLQkJCTg6MDAJUFJDCUMlc1QKLSMgTG9uZy1zaHUgVGltZSAocHJvYmFibHkgZHVlIHRvIExvbmcgYW5kIFNodSBiZWluZyB0d28gbmFtZXMgb2YgdGhhdCBhcmVhKQorIyBUaGlzIGN1cnJlbnRseSByZXByZXNlbnRzIG1vc3Qgb3RoZXIgem9uZXMgYXMgd2VsbCwKKyMgYXMgYXBwYXJlbnRseSB0aGVzZSByZWdpb25zIGhhdmUgYmVlbiB0aGUgc2FtZSBzaW5jZSAxOTcwLgorIyBNaWxuZSBnaXZlcyA4OjA1OjQzLjIgZm9yIFh1amlhaHVpIE9ic2VydmF0b3J5IHRpbWU7IHJvdW5kIHRvIG5lYXJlc3QuCisjIEd1byBzYXlzIFNoYW5naGFpIHN3aXRjaGVkIHRvIFVUKzggImZyb20gdGhlIGVuZCBvZiB0aGUgMTl0aCBjZW50dXJ5Ii4KKyMKKyMgTG9uZy1zaHUgVGltZSAocHJvYmFibHkgZHVlIHRvIExvbmcgYW5kIFNodSBiZWluZyB0d28gbmFtZXMgb2YgdGhhdCBhcmVhKSBVVCs3CisjIEFzaWEvQ2hvbmdxaW5nIChjdXJyZW50bHkgYSBsaW5rIHRvIEFzaWEvU2hhbmdoYWkpCiAjIEd1YW5neGksIEd1aXpob3UsIEhhaW5hbiwgTmluZ3hpYSwgU2ljaHVhbiwgU2hhYW54aSwgYW5kIFl1bm5hbjsKICMgbW9zdCBvZiBHYW5zdTsgd2VzdCBJbm5lciBNb25nb2xpYTsgd2VzdCBRaW5naGFpOyBhbmQgdGhlIEd1YW5nZG9uZwogIyBjb3VudGllcyBEZXFpbmcsIEVucGluZywgS2FpcGluZywgTHVvZGluZywgVGFpc2hhbiwgWGlueGluZywKICMgWWFuZ2NodW4sIFlhbmdqaWFuZywgWXUnbmFuLCBhbmQgWXVuZnUuCi1ab25lCUFzaWEvQ2hvbmdxaW5nCTc6MDY6MjAJLQlMTVQJMTkyOCAjIG9yIENodW5na2luZwotCQkJNzowMAktCUxPTlQJMTk4MCBNYXkgIyBMb25nLXNodSBUaW1lCi0JCQk4OjAwCVBSQwlDJXNUCi0jIFhpbi16YW5nIFRpbWUgKCJYaW5qaWFuZy1UaWJldCBUaW1lIikKKyMKKyMgWGluLXphbmcgVGltZSAoIlhpbmppYW5nLVRpYmV0IFRpbWUiKSBVVCs2CisjIEFzaWEvVXJ1bXFpCisjIFRoaXMgY3VycmVudGx5IHJlcHJlc2VudHMgS3VubHVuIFRpbWUgYXMgd2VsbCwKKyMgYXMgYXBwYXJlbnRseSB0aGUgdHdvIHJlZ2lvbnMgaGF2ZSBiZWVuIHRoZSBzYW1lIHNpbmNlIDE5NzAuCiAjIFRoZSBHYW5zdSBjb3VudGllcyBBa3NheSwgQW54aSwgRHVuaHVhbmcsIFN1YmVpOyB3ZXN0IFFpbmdoYWk7CiAjIHRoZSBHdWFuZ2RvbmcgY291bnRpZXMgIFh1d2VuLCBIYWlrYW5nLCBTdWl4aSwgTGlhbmppYW5nLAogIyBaaGFuamlhbmcsIFd1Y2h1YW4sIEh1YXpob3UsIEdhb3pob3UsIE1hb21pbmcsIERpYW5iYWksIGFuZCBYaW55aTsKICMgZWFzdCBUaWJldCwgaW5jbHVkaW5nIExoYXNhLCBDaGFtZG8sIFNoaWdhaXNlLCBKaW1zYXIsIFNoYXdhbiBhbmQgSHV0dWJpOwotIyBlYXN0IFhpbmppYW5nLCBpbmNsdWRpbmcgVXJ1bXFpLCBUdXJwYW4sIEthcmFtYXksIEtvcmxhLCBNaW5mZW5nLCBKaW5naGUsCisjIGVhc3QgWGluamlhbmcsIGluY2x1ZGluZyDDnHLDvG1xaSwgVHVycGFuLCBLYXJhbWF5LCBLb3JsYSwgTWluZmVuZywgSmluZ2hlLAogIyBXdXN1LCBRaWVtbywgWGlueWFuLCBXdWxhbnd1c3UsIEppbmdoZSwgWXVtaW4sIFRhY2hlbmcsIFR1b2xpLCBFbWluLAogIyBTaGloZXppLCBDaGFuZ2ppLCBZYW5xaSwgSGVzaHVvLCBUdW9rZXh1biwgVHVsdWZhbiwgU2hhbnNoYW4sIEhhbWksCiAjIEZ1a2FuZywgS3VpdHVuLCBLdW11a3VsaSwgTWlxdWFuLCBRaXRhaSwgYW5kIFR1cmZhbi4KLVpvbmUJQXNpYS9VcnVtcWkJNTo1MDoyMAktCUxNVAkxOTI4ICMgb3IgVXJ1bWNoaQotCQkJNjowMAktCVVSVVQJMTk4MCBNYXkgIyBVcnVtcWkgVGltZQotCQkJODowMAlQUkMJQyVzVAotIyBLdW5sdW4gVGltZQorIworIyBLdW5sdW4gVGltZSBVVCs1LjUKKyMgQXNpYS9LYXNoZ2FyIChjdXJyZW50bHkgYSBsaW5rIHRvIEFzaWEvVXJ1bXFpKQogIyBXZXN0IFRpYmV0LCBpbmNsdWRpbmcgUHVsYW4sIEFoZXFpLCBTaHVmdSwgU2h1bGU7CiAjIFdlc3QgWGluamlhbmcsIGluY2x1ZGluZyBBa3N1LCBBdHVzaGksIFlpbmluZywgSGV0aWFuLCBDZWxlLCBMdW9wdSwgTmlsZWtlLAogIyBaaGFvc3UsIFRla2VzaSwgR29uZ2xpdSwgQ2hhYnVjaGFlciwgSHVvY2hlbmcsIEJvbGUsIFBpc2hhbiwgU3VpZGluZywKQEAgLTQ1NSw5ICs0NjUsOSBAQAogIyBwb3B1bGF0aW9uIG9mIFhpbmppYW5nLCB0eXBpY2FsbHkgdXNlICJYaW5qaWFuZyB0aW1lIiB3aGljaCBpcyB0d28KICMgaG91cnMgYmVoaW5kIEJlaWppbmcgdGltZSwgb3IgVVRDICswNjAwLiBUaGUgZ292ZXJubWVudCBvZiB0aGUgWGluamlhbmcKICMgVXlnaHVyIEF1dG9ub21vdXMgUmVnaW9uLCAoWEFVUiwgb3IganVzdCBYaW5qaWFuZyBmb3Igc2hvcnQpIGFzIHdlbGwgYXMKLSMgbG9jYWwgZ292ZXJubWVudHMgc3VjaCBhcyB0aGUgVXJ1bXFpIGNpdHkgZ292ZXJubWVudCB1c2UgYm90aCB0aW1lcyBpbgorIyBsb2NhbCBnb3Zlcm5tZW50cyBzdWNoIGFzIHRoZSDDnHLDvG1xaSBjaXR5IGdvdmVybm1lbnQgdXNlIGJvdGggdGltZXMgaW4KICMgcHVibGljYXRpb25zLCByZWZlcnJpbmcgdG8gd2hhdCBpcyBwb3B1bGFybHkgY2FsbGVkIFhpbmppYW5nIHRpbWUgYXMKLSMgIlVydW1xaSB0aW1lLiIgV2hlbiBVeWdodXJzIG1ha2UgYW4gYXBwb2ludG1lbnQgaW4gdGhlIFV5Z2h1ciBsYW5ndWFnZQorIyAiw5xyw7xtcWkgdGltZS4iIFdoZW4gVXlnaHVycyBtYWtlIGFuIGFwcG9pbnRtZW50IGluIHRoZSBVeWdodXIgbGFuZ3VhZ2UKICMgdGhleSBhbG1vc3QgaW52YXJpYWJseSB1c2UgWGluamlhbmcgdGltZS4KICMKICMgKFRoZWlyIGV0aG5pYyBIYW4gY29tcGF0cmlvdHMgd291bGQgdHlwaWNhbGx5IGhhdmUgbm8gY2x1ZSBvZiBpdHMKQEAgLTQ2OSwyMSArNDc5LDYgQEAKICMgdGhlIHByb3ZpbmNlIG5vdCBoYXZpbmcgZHVhbCB0aW1lcyBidXQgZm91ciB0aW1lcyBpbiB1c2UgYXQgdGhlIHNhbWUKICMgdGltZS4gU29tZSBhcmVhcyByZW1haW5lZCBvbiBzdGFuZGFyZCBYaW5qaWFuZyB0aW1lIG9yIEJlaWppbmcgdGltZSBhbmQKICMgb3RoZXJzIG1vdmluZyB0aGVpciBjbG9ja3MgYWhlYWQuKQotIwotIyAuLi5hbiBleGFtcGxlIG9mIGFuIG9mZmljaWFsIHdlYnNpdGUgdXNpbmcgb2YgVXJ1bXFpIHRpbWUuCi0jCi0jIFRoZSBmaXJzdCBmZXcgbGluZXMgb2YgdGhlIEdvb2dsZSB0cmFuc2xhdGlvbiBvZgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmZqeXNnbC5nb3YuY24vc2hvdy5hc3B4P2lkPTIzNzkmY2lkPTM5Ij4KLSMgaHR0cDovL3d3dy5manlzZ2wuZ292LmNuL3Nob3cuYXNweD9pZD0yMzc5JmNpZD0zOQotIyA8L2E+Ci0jIChyZXRyaWV2ZWQgMjAwOS0xMC0xMykKLSMgPiBVcnVtcWkgZmlyZSBzZXZlbiBwZW9wbGUgYXJlIG1pc3NpbmcgdGhlIGFsbGVnZWQgbG9zc2VzIG9mIGF0IGxlYXN0Ci0jID4gNTAwIG1pbGxpb24geXVhbgotIyA+Ci0jID4gKFJlcG9ydGVyIERvbmcgTGl1KSB0aGUgZGF5IGJlZm9yZSAyMDoyMCBvciBzbyAoVXJ1bXFpIFRpbWUgMTg6MjApLAotIyA+IFVydW1xaSBDaXR5IERlcGFydG1lbnQgb2YgSW50ZXJuYXRpb25hbCBQbGF6YSBMdXRoZXIgUWlhbnRhbmcgUml2ZXIKLSMgPiBidXJzdCBmaXJlLiBBcyBvZiB5ZXN0ZXJkYXksIDE4OjMwLCBVcnVtcWkgQ2l0eSBGaXJlIG9mZmljZXJzIGFuZCBtZW4KLSMgPiBoYXZlIHdvcmtlZCBjb250aW51b3VzbHkgZm9yIDIyIGhvdXJzLi4uCiAKICMgRnJvbSBMdXRoZXIgTWEgKDIwMDktMTEtMTkpOgogIyBXaXRoIHRoZSByaXNrIG9mIGJlaW5nIHJlZHVuZGFudCB0byBwcmV2aW91cyBhbnN3ZXJzIHRoZXNlIGFyZSB0aGUgbW9zdCBjb21tb24KQEAgLTQ5NCw3ICs0ODksNyBAQAogIyAzLiBVcnVtcWkuLi4KICMgNC4gS2FzaGdhci4uLgogIyAuLi4KLSMgNS4gSXQgc2VlbXMgdGhhdCBVeWdodXJzIGluIFVydW1xaSBoYXMgYmVlbiB1c2luZyBYaW5qaWFuZyBzaW5jZSBhdCBsZWFzdCB0aGUKKyMgNS4gSXQgc2VlbXMgdGhhdCBVeWdodXJzIGluIMOccsO8bXFpIGhhcyBiZWVuIHVzaW5nIFhpbmppYW5nIHNpbmNlIGF0IGxlYXN0IHRoZQogIyAxOTYwJ3MuIEkga25vdyBvZiBvbmUgSGFuLCBub3cgb3ZlciA1MCwgd2hvIGdyZXcgdXAgaW4gdGhlIHN1cnJvdW5kaW5nCiAjIGNvdW50cnlzaWRlIGFuZCB1c2VkIFhpbmppYW5nIHRpbWUgYXMgYSBjaGlsZC4KICMKQEAgLTUwNiwxMCArNTAxLDU1IEBACiAjIEF1dG9ub21vdXMgUmVnaW9uIHVuZGVyIHRoZSBQUkMuIChCZWZvcmUgdGhhdCBVeWdodXJzLCBvZiBjb3Vyc2UsIHdvdWxkIGFsc28KICMgbm90IGJlIHVzaW5nIEJlaWppbmcgdGltZSwgYnV0IHNvbWUgbG9jYWwgdGltZS4pCiAKLVpvbmUJQXNpYS9LYXNoZ2FyCTU6MDM6NTYJLQlMTVQJMTkyOCAjIG9yIEthc2hpIG9yIEtheGdhcgotCQkJNTozMAktCUtBU1QJMTk0MAkgIyBLYXNoZ2FyIFRpbWUKLQkJCTU6MDAJLQlLQVNUCTE5ODAgTWF5CisjIEZyb20gRGF2aWQgQ29jaHJhbmUgKDIwMTQtMDMtMjYpOgorIyBKdXN0IGEgY29uZmlybWF0aW9uIHRoYXQgw5xyw7xtcWkgdGltZSB3YXMgaW1wbGVtZW50ZWQgaW4gw5xyw7xtcWkgb24gMSBGZWIgMTk4NjoKKyMgaHR0cDovL2NvbnRlbnQudGltZS5jb20vdGltZS9tYWdhemluZS9hcnRpY2xlLzAsOTE3MSw5NjA2ODQsMDAuaHRtbAorCisjIEZyb20gTHV0aGVyIE1hICgyMDE0LTA0LTIyKToKKyMgSSBoYXZlIGludGVydmlld2VkIG51bWVyb3VzIHBlb3BsZSBvZiB2YXJpb3VzIG5hdGlvbmFsaXRpZXMgYW5kIGZyb20KKyMgZGlmZmVyZW50IGxvY2FsaXRpZXMgaW4gWGluamlhbmcgYW5kIGNhbiBjb25maXJtIHRoZSBpbmZvcm1hdGlvbiBpbiBHdW8ncworIyByZXBvcnQgcmVnYXJkaW5nIFhpbmppYW5nLCBhcyB3ZWxsIGFzIHRoZSBUaW1lIGFydGljbGUgcmVmZXJlbmNlIGJ5IERhdmlkCisjIENvY2hyYW5lLiAgV2hldGhlciBvZmZpY2lhbGx5IHJlY29nbml6ZWQgb3Igbm90IChhbmQgYm90aCBhcmUgb2ZmaWNpYWxseQorIyByZWNvZ25pemVkKSwgdHdvIHNlcGFyYXRlIHRpbWVzIGhhdmUgYmVlbiBpbiB1c2UgaW4gWGluamlhbmcgc2luY2UgYXQgbGVhc3QKKyMgdGhlIEN1bHR1cmFsIFJldm9sdXRpb246IFhpbmppYW5nIFRpbWUgKFhKVCksIGFrYSDDnHLDvG1xaSBUaW1lIG9yIGxvY2FsIHRpbWU7CisjIGFuZCBCZWlqaW5nIFRpbWUuICBUaGVyZSBpcyBubyBjb25mdXNpb24gaW4gWGluamlhbmcgYXMgdG8gd2hpY2ggbmFtZSByZWZlcnMKKyMgdG8gd2hpY2ggdGltZS4gQm90aCBhcmUgd2lkZWx5IHVzZWQgaW4gdGhlIHByb3ZpbmNlLCBhbHRob3VnaCBpbiBzb21lCisjIHBvcHVsYXRpb24gZ3JvdXBzIG1pZ2h0IGJlIHVzZSBvbmUgdG8gdGhlIGV4Y2x1c2lvbiBvZiB0aGUgb3RoZXIuICBUaGUgb25seQorIyBwcm9ibGVtIGlzIHRoYXQgY29tcHV0ZXJzIGFuZCBzbWFydCBwaG9uZXMgbGlzdCDDnHLDvG1xaSAob3IgS2FzaGdhcikgYXMKKyMgaGF2aW5nIHRoZSBzYW1lIHRpbWUgYXMgQmVpamluZy4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTMwKToKKyMgSW4gdGhlIGVhcmx5IGRheXMgb2YgdGhlIFBSQywgVGliZXQgd2FzIGdpdmVuIGl0cyBvd24gdGltZSB6b25lIChVVCs2KSBidXQKKyMgdGhpcyB3YXMgd2l0aGRyYXduIGluIDE5NTkgYW5kIG5ldmVyIHJlaW5zdGF0ZWQ7IHNlZSBUdWJ0ZW4gS2jDqXRzdW4sCisjIE1lbW9yaWVzIG9mIGxpZmUgaW4gTGhhc2EgdW5kZXIgQ2hpbmVzZSBSdWxlLCBDb2x1bWJpYSBVIFByZXNzLCBJU0JOCisjIDk3OC0wMjMxMTQyODYxICgyMDA4KSwgdHJhbnNsYXRvcidzIGludHJvZHVjdGlvbiBieSBNYXR0aGV3IEFrZXN0ZXIsIHAgeC4KKyMgQXMgdGhpcyBpcyBiZWZvcmUgb3VyIDE5NzAgY3V0b2ZmLCBUaWJldCBkb2Vzbid0IG5lZWQgYSBzZXBhcmF0ZSB6b25lLgorIworIyBYaW5qaWFuZyBUaW1lIGlzIHdlbGwtZG9jdW1lbnRlZCBhcyBiZWluZyBvZmZpY2lhbGx5IHJlY29nbml6ZWQuICBFLmcuLCBzZWUKKyMgIlRoZSBXb3JraW5nLUNhbGVuZGFyIGZvciBUaGUgWGluamlhbmcgVXlndXIgQXV0b25vbW91cyBSZWdpb24gR292ZXJubWVudCIKKyMgPGh0dHA6Ly93d3cuc2lua2lhbmcuZ292LmNuL3NlcnZpY2Uvb3Vyd29ya2luZy8+ICgyMDE0LTA0LTIyKS4KKyMgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSBubyBnb29kIHJlY29yZHMgb2YgdGltZSBpbiBYaW5qaWFuZyBiZWZvcmUgMTk4Ni4KKyMgRHVyaW5nIHRoZSAyMHRoIGNlbnR1cnkgcGFydHMgb2YgWGluamlhbmcgd2VyZSBydWxlZCBieSB0aGUgUWluZyBkeW5hc3R5LAorIyB0aGUgUmVwdWJsaWMgb2YgQ2hpbmEsIHZhcmlvdXMgd2FybG9yZHMsIHRoZSBGaXJzdCBhbmQgU2Vjb25kIEVhc3QgVHVya2VzdGFuCisjIFJlcHVibGljcywgdGhlIFNvdmlldCBVbmlvbiwgdGhlIEt1b21pbnRhbmcsIGFuZCB0aGUgUGVvcGxlJ3MgUmVwdWJsaWMgb2YKKyMgQ2hpbmEsIGFuZCB0cmFja2luZyBkb3duIGFsbCB0aGVzZSBvcmdhbml6YXRpb25zJyB0aW1la2VlcGluZyBydWxlcyB3b3VsZCBiZQorIyBxdWl0ZSBhIHRyaWNrLiAgQXBwcm94aW1hdGUgdGhpcyBsb3N0IGhpc3RvcnkgYnkgYSB0cmFuc2l0aW9uIGZyb20gTE1UIHRvCisjIFhKVCBhdCB0aGUgc3RhcnQgb2YgMTkyOCwgdGhlIHllYXIgb2YgYWNjZXNzaW9uIG9mIHRoZSB3YXJsb3JkIEppbiBTaHVyZW4sCisjIHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIGRhdGUgZ2l2ZW4gYnkgU2hhbmtzICYgUG90dGVuZ2VyIChubyBkb3VidCBhcyBhCisjIGd1ZXNzKSBhcyB0aGUgdHJhbnNpdGlvbiBmcm9tIExNVC4gIElnbm9yZSB0aGUgdXNhZ2Ugb2YgVVQrOCBiZWZvcmUKKyMgMTk4Ni0wMi0wMSB1bmRlciB0aGUgdGhlb3J5IHRoYXQgdGhlIHRyYW5zaXRpb24gZGF0ZSB0byBVVCs4IGlzIHVua25vd24gYW5kCisjIHRoYXQgdGhlIHNvcnQgb2YgdXNlcnMgd2hvIHByZWZlciBBc2lhL1VydW1xaSBub3cgdHlwaWNhbGx5IGlnbm9yZWQgdGhlCisjIFVUKzggbWFuZGF0ZSBiYWNrIHRoZW4uCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KKyMgQmVpamluZyB0aW1lLCB1c2VkIHRocm91Z2hvdXQgQ2hpbmE7IHJlcHJlc2VudGVkIGJ5IFNoYW5naGFpLgorWm9uZQlBc2lhL1NoYW5naGFpCTg6MDU6NDMJLQlMTVQJMTkwMQorCQkJODowMAlTaGFuZwlDJXNUCTE5NDkKIAkJCTg6MDAJUFJDCUMlc1QKKyMgWGluamlhbmcgdGltZSwgdXNlZCBieSBtYW55IGluIHdlc3Rlcm4gQ2hpbmE7IHJlcHJlc2VudGVkIGJ5IMOccsO8bXFpIC8gw5xyw7xtY2hpCisjIC8gV3VsdW11cWkuICAoUGxlYXNlIHVzZSBBc2lhL1NoYW5naGFpIGlmIHlvdSBwcmVmZXIgQmVpamluZyB0aW1lLikKK1pvbmUJQXNpYS9VcnVtcWkJNTo1MDoyMAktCUxNVAkxOTI4CisJCQk2OjAwCS0JWEpUCiAKIAogIyBIb25nIEtvbmcgKFhpYW5nZ2FuZykKQEAgLTUyNCwxNSArNTY0LDExIEBACiAjIGFuZCBpbmNvcnJlY3QgcnVsZXMuIEFsdGhvdWdoIHRoZSBleGFjdCBzd2l0Y2ggb3ZlciB0aW1lIGlzIG1pc3NpbmcsIEkKICMgdGhpbmsgMzozMCBpcyBjb3JyZWN0LiBUaGUgb2ZmaWNpYWwgRFNUIHJlY29yZCBmb3IgSG9uZyBLb25nIGNhbiBiZQogIyBvYnRhaW5lZCBmcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaGtvLmdvdi5oay9ndHMvdGltZS9TdW1tZXJ0aW1lLmh0bSI+CiAjIGh0dHA6Ly93d3cuaGtvLmdvdi5oay9ndHMvdGltZS9TdW1tZXJ0aW1lLmh0bQotIyA8L2E+LgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LTEwLTI4KToKICMgSGVyZSBhcmUgdGhlIGRhdGVzIGdpdmVuIGF0Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaGtvLmdvdi5oay9ndHMvdGltZS9TdW1tZXJ0aW1lLmh0bSI+CiAjIGh0dHA6Ly93d3cuaGtvLmdvdi5oay9ndHMvdGltZS9TdW1tZXJ0aW1lLmh0bQotIyA8L2E+CiAjIGFzIG9mIDIwMDktMTAtMjg6CiAjIFllYXIgICAgICAgIFBlcmlvZAogIyAxOTQxICAgICAgICAxIEFwciB0byAzMCBTZXAKQEAgLTYxMiwzNSArNjQ4LDExMyBAQAogCiAjIFRhaXdhbgogCi0jIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IFRhaXdhbiBvYnNlcnZlZCBEU1QgZHVyaW5nIDE5NDUsIHdoZW4gaXQKLSMgd2FzIHN0aWxsIGNvbnRyb2xsZWQgYnkgSmFwYW4uICBUaGlzIGlzIGhhcmQgdG8gYmVsaWV2ZSwgYnV0IHdlIGRvbid0Ci0jIGhhdmUgYW55IG90aGVyIGluZm9ybWF0aW9uLgotCiAjIEZyb20gc21hbGx1Zm8gKDIwMTAtMDQtMDMpOgotIyBBY2NvcmRpbmcgdG8gVGFpd2FuJ3MgQ1dCLAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmN3Yi5nb3YudHcvVjYvYXN0cm9ub215L2NkYXRhL3N1bW1lcnQuaHRtIj4KKyMgQWNjb3JkaW5nIHRvIFRhaXdhbidzIENXQiBbQ2VudHJhbCBXZWF0aGVyIEJ1cmVhdV0sCiAjIGh0dHA6Ly93d3cuY3diLmdvdi50dy9WNi9hc3Ryb25vbXkvY2RhdGEvc3VtbWVydC5odG0KLSMgPC9hPgogIyBUYWlwZWkgaGFzIERTVCBpbiAxOTc5IGJldHdlZW4gSnVseSAxc3QgYW5kIFNlcCAzMC4KIAotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMC0wNC0wNyk6Ci0jIEhlcmUncyBHb29nbGUncyB0cmFuc2xhdGlvbiBvZiB0aGUgdGFibGUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgInN1bW1lcnQuaHRtIiBwYWdlOgotIyBEZWNhZGUgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0IGFuZCBlbmQgZGF0ZQotIyBSZXB1YmxpYyBvZiBDaGluYSAzNCB5ZWFycyB0byA0MCB5ZWFycyAoQUQgMTk0NS0xOTUxIHllYXJzKSBTdW1tZXIgVGltZSAgICAgICAgICAgICAgIE1heSAxIHRvIFNlcHRlbWJlciAzMAotIyA0MSB5ZWFycyBvZiB0aGUgUmVwdWJsaWMgb2YgQ2hpbmEgKEFEIDE5NTIpICAgICAgICAgICAgICAgICBEYXlsaWdodCBTYXZpbmcgVGltZSAgICAgIE1hcmNoIDEgdG8gT2N0b2JlciAzMQotIyBSZXB1YmxpYyBvZiBDaGluYSA0MiB5ZWFycyB0byA0MyB5ZWFycyAoQUQgMTk1My0xOTU0IHllYXJzKSBEYXlsaWdodCBTYXZpbmcgVGltZSAgICAgIEFwcmlsIDEgdG8gT2N0b2JlciAzMQotIyBJbiB0aGUgNDQgeWVhcnMgdG8gNDUgeWVhcnMgKEFEIDE5NTUtMTk1NiB5ZWFycykgICAgICAgICAgICBEYXlsaWdodCBTYXZpbmcgVGltZSAgICAgIEFwcmlsIDEgdG8gU2VwdGVtYmVyIDMwCi0jIFJlcHVibGljIG9mIENoaW5hIDQ2IHllYXJzIHRvIDQ4IHllYXJzIChBRCAxOTU3LTE5NTkpICAgICAgIFN1bW1lciBUaW1lICAgICAgICAgICAgICAgQXByaWwgMSB0byBTZXB0ZW1iZXIgMzAKLSMgUmVwdWJsaWMgb2YgQ2hpbmEgNDkgeWVhcnMgdG8gNTAgeWVhcnMgKEFEIDE5NjAtMTk2MSkgICAgICAgU3VtbWVyIFRpbWUgICAgICAgICAgICAgICBKdW5lIDEgdG8gU2VwdGVtYmVyIDMwCi0jIFJlcHVibGljIG9mIENoaW5hIDUxIHllYXJzIHRvIDYyIHllYXJzIChBRCAxOTYyLTE5NzMgeWVhcnMpIFN0b3AgU3VtbWVyIFRpbWUKLSMgUmVwdWJsaWMgb2YgQ2hpbmEgNjMgeWVhcnMgdG8gNjQgeWVhcnMgKDE5NzQtMTk3NSBBRCkgICAgICAgRGF5bGlnaHQgU2F2aW5nIFRpbWUgICAgICBBcHJpbCAxIHRvIFNlcHRlbWJlciAzMAotIyBSZXB1YmxpYyBvZiBDaGluYSA2NSB5ZWFycyB0byA2NyB5ZWFycyAoMTk3Ni0xOTc4IEFEKSAgICAgICBTdG9wIERheWxpZ2h0IFNhdmluZyBUaW1lCi0jIFJlcHVibGljIG9mIENoaW5hIDY4IHllYXJzIChBRCAxOTc5KSAgICAgICAgICAgICAgICAgICAgICAgIERheWxpZ2h0IFNhdmluZyBUaW1lICAgICAgSnVseSAxIHRvIFNlcHRlbWJlciAzMAotIyBSZXB1YmxpYyBvZiBDaGluYSBzaW5jZSA2OSB5ZWFycyAoQUQgMTk4MCkgICAgICAgICAgICAgICAgICBTdG9wIERheWxpZ2h0IFNhdmluZyBUaW1lCisjIEZyb20gWXUtQ2hlbmcgQ2h1YW5nICgyMDEzLTA3LTEyKToKKyMgT24gRGVjIDI4LCAxODk1LCB0aGUgTWVpamkgRW1wZXJvciBhbm5vdW5jZWQgT3JkaW5hbmNlIE5vLiAxNjcgb2YKKyMgTWVpamkgWWVhciAyOCAiVGhlIGNsYXVzZSBhYm91dCBzdGFuZGFyZCB0aW1lIiwgbWVudGlvbmVkIHRoYXQKKyMgVGFpd2FuIGFuZCBQZW5naHUgSXNsYW5kcywgYXMgd2VsbCBhcyBZYWV5YW1hIGFuZCBNaXlha28gSXNsYW5kcworIyAoYm90aCBpbiBPa2luYXdhKSBhZG9wdCB0aGUgV2VzdGVybiBTdGFuZGFyZCBUaW1lIHdoaWNoIGlzIGJhc2VkIG9uCisjIDEyMEUuIFRoZSBhZG9wdGlvbiBiZWdhbiBmcm9tIEphbiAxLCAxODk2LiBUaGUgb3JpZ2luYWwgdGV4dCBjYW4gYmUKKyMgZm91bmQgb24gV2lraXNvdXJjZToKKyMgaHR0cDovL2phLndpa2lzb3VyY2Uub3JnL3dpa2kv5qiZ5rqW5pmC44OL6Zec44K544Or5Lu2XyjlhazluIPmmYIpCisjIC4uLiBUaGlzIGNvdWxkIGJlIHRoZSBmaXJzdCBhZG9wdGlvbiBvZiB0aW1lIHpvbmUgaW4gVGFpd2FuLCBiZWNhdXNlCisjIGR1cmluZyB0aGUgUWluZyBEeW5hc3R5LCBpdCBzZWVtcyB0aGF0IHRoZXJlIHdhcyBubyB0aW1lIHpvbmUKKyMgZGVjbGFyZWQgb2ZmaWNpYWxseS4KKyMKKyMgTGF0ZXIsIGluIHRoZSBiZWdpbm5pbmcgb2YgV29ybGQgV2FyIElJLCBvbiBTZXAgMjUsIDE5MzcsIHRoZSBTaG93YQorIyBFbXBlcm9yIGFubm91bmNlZCBPcmRpbmFuY2UgTm8uIDUyOSBvZiBTaG93YSBZZWFyIDEyICJUaGUgY2xhdXNlIG9mCisjIHJldmlzaW9uIGluIHRoZSBvcmRpbmFuY2UgTm8uIDE2NyBvZiBNZWlqaSB5ZWFyIDI4IGFib3V0IHN0YW5kYXJkCisjIHRpbWUiLCBpbiB3aGljaCBhYm9saXNoZWQgdGhlIGFkb3B0aW9uIG9mIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSBpbgorIyB3ZXN0ZXJuIGlzbGFuZHMgKGxpc3RlZCBhYm92ZSksIHdoaWNoIG1lYW5zIHRoZSB3aG9sZSBKYXBhbgorIyB0ZXJyaXRvcnksIGluY2x1ZGluZyBsYXRlciBvY2N1cGF0aW9ucywgYWRvcHQgSmFwYW4gQ2VudHJhbCBUaW1lCisjIChVVEMrOSkuIFRoZSBhZG9wdGlvbiBiZWdhbiBvbiBPY3QgMSwgMTkzNy4gVGhlIG9yaWdpbmFsIHRleHQgY2FuCisjIGJlIGZvdW5kIG9uIFdpa2lzb3VyY2U6CisjIGh0dHA6Ly9qYS53aWtpc291cmNlLm9yZy93aWtpL+aYjuayu+S6jOWNgeWFq+W5tOWLheS7pOesrOeZvuWFreWNgeS4g+iZn+aomea6luaZguODi+mXnOOCueODq+S7tuS4reaUueato+ODjuS7tgorIworIyBUaGF0IGlzLCB0aGUgdGltZSB6b25lIG9mIFRhaXBlaSBzd2l0Y2hlZCB0byBVVEMrOSBvbiBPY3QgMSwgMTkzNy4KKworIyBGcm9tIFl1LUNoZW5nIENodWFuZyAoMjAxNC0wNy0wMik6CisjIEkndmUgZm91bmQgbW9yZSBldmlkZW5jZSBhYm91dCB3aGVuIHRoZSB0aW1lIHpvbmUgd2FzIHN3aXRjaGVkIGZyb20gVVRDKzkKKyMgYmFjayB0byBVVEMrOCBhZnRlciBXVzIuICBJIGJlbGlldmUgaXQgd2FzIG9uIFNlcCAyMSwgMTk0NS4gIEluIGEgZG9jdW1lbnQKKyMgZHVyaW5nIEphcGFuZXNlIGVyYSBbMV0gaW4gd2hpY2ggdGhlIG9mZmljZXIgdG9sZCB0aGUgc3RhZmYgdG8gY2hhbmdlIHRpbWUKKyMgem9uZSBiYWNrIHRvIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSAoVVRDKzgpIG9uIFNlcCAyMS4gIEFuZCBpbiBhbm90aGVyCisjIGhpc3RvcnkgcGFnZSBvZiBOYXRpb25hbCBDaGVuZyBLdW5nIFVuaXZlcnNpdHkgWzJdLCBvbiBTZXAgMjEgdGhlcmUgaXMgYQorIyBub3RlICJmcm9tIHRvZGF5LCBzd2l0Y2ggYmFjayB0byBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLiAgRnJvbSB0aGVzZSB0d28KKyMgbWF0ZXJpYWxzLCBJIGJlbGlldmUgdGhhdCB0aGUgdGltZSB6b25lIGNoYW5nZSBoYXBwZW5lZCBvbiBTZXAgMjEuICBBbmQKKyMgdG9kYXkgSSBoYXZlIGZvdW5kIGFub3RoZXIgbW9udGhseSBqb3VybmFsIGNhbGxlZCAiVGhlIEFzdHJvbm9taWNhbCBIZXJhbGQiCisjIGZyb20gVGhlIEFzdHJvbm9taWNhbCBTb2NpZXR5IG9mIEphcGFuIFszXSBpbiB3aGljaCBpdCBtZW50aW9uZWQgdGhlIGZhY3QKKyMgdGhhdDoKKyMKKyMgMS4gU3RhbmRhcmQgVGltZSBvZiB0aGUgQ291bnRyeSAoSmFwYW4pIHdhcyBhZG9wdGVkIG9uIEphbiAxLCAxODg4LCB1c2luZworIyB0aGUgdGltZSBhdCAxMzVFIChHTVQrOSkKKyMKKyMgMi4gU3RhbmRhcmQgVGltZSBvZiB0aGUgQ291bnRyeSB3YXMgcmVuYW1lZCB0byBDZW50cmFsIFN0YW5kYXJkIFRpbWUsIG9uIEphbgorIyAxLCAxODk4LCBhbmQgb24gdGhlIHNhbWUgZGF5LCB0aGUgbmV3IHRlcnJpdG9yaWVzIFRhaXdhbiBhbmQgUGVuZ2h1IGlzbGFuZHMsCisjIGFzIHdlbGwgYXMgWWFleWFtYSBhbmQgTWl5YWtvIGlzbGFuZHMsIGFkb3B0ZWQgYSBuZXcgdGltZSB6b25lIGNhbGxlZAorIyBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUsIHdoaWNoIGlzIGluIEdNVCs4LgorIworIyAzLiBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUgd2FzIGRlcHJlY2F0ZWQgb24gU2VwIDMwLCAxOTM3LiBGcm9tIHRoZW4gYWxsIHRoZQorIyB0ZXJyaXRvcmllcyBvZiBKYXBhbiBhZG9wdGVkIHRoZSBzYW1lIHRpbWUgem9uZSwgd2hpY2ggaXMgQ2VudHJhbCBTdGFuZGFyZAorIyBUaW1lLgorIworIyBbMV0gQWNhZGVtaWNhIEhpc3RvcmljYSwgVGFpd2FuOgorIyBodHRwOi8vMTYzLjI5LjIwOC4yMjo4MDgwL2dvdnNhbGVTaG93SW1hZ2UvY29ubmVjdF9pbWcucGhwP3M9MDAxMDE3Mzg5MDAwOTAwMzYmZT0wMDEwMTczODkwMDA5MDAzNworIyBbMl0gTmF0J2wgQ2hlbmcgS3VuZyBVbml2ZXJzaXR5IDcwdGggQW5uaXZlcnNhcnkgU3BlY2lhbCBTaXRlOgorIyBodHRwOi8vd3d3Lm5ja3UuZWR1LnR3L35uY2t1NzAvbWVudS8wMDEvMDFfMDEuaHRtCisjIFszXSBZdWtpbyBOaWltaSwgVGhlIFN0YW5kYXJkIFRpbWUgaW4gSmFwYW4gKDE5OTcpLCBwLjQ3NToKKyMgaHR0cDovL3d3dy5hc2oub3IuanAvZ2VwcG91L2FyY2hpdmVfb3Blbi8xOTk3L3BkZi8xOTk3MTAwMWMucGRmCisKKyMgWXUtQ2hlbmcgQ2h1YW5nICgyMDE0LTA3LTAzKToKKyMgSSBmaW5hbGx5IGhhdmUgZm91bmQgdGhlIHJlYWwgb2ZmaWNpYWwgZ2F6ZXR0ZSBhYm91dCBjaGFuZ2luZyBiYWNrIHRvCisjIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSBvbiBTZXAgMjEgaW4gVGFpd2FuLiAgSXQncyBUYWl3YW4gR292ZXJub3ItR2VuZXJhbAorIyBCdWxsZXRpbiBOby4gMzg2IGluIFNob3dhIDIwIHllYXJzICgxOTQ1KSwgcHVibGlzaGVkIG9uIFNlcCAxOSwgMTk0NS4gWzFdIC4uLgorIyBbSXRdIGFib2xpc2hlcyBCdWxsZXRpbiBOby4gMjA3IGluIFNob3dhIDEyIHllYXJzICgxOTM3KSwgd2hpY2ggaXMgYSBsb2NhbAorIyBidWxsZXRpbiBpbiBUYWl3YW4gZm9yIHRoYXQgT3JkaW5hbmNlIE5vLiA1MjkuIEl0IGFsc28gbWVudGlvbmVkIHRoYXQgMWFtIG9uCisjIFNlcCAyMSwgMTk0NSB3aWxsIGJlIDEyYW0gb24gU2VwIDIxLiAgSSB0aGluayB0aGlzIGJ1bGxldGluIGlzIG11Y2ggbW9yZQorIyBvZmZpY2lhbCB0aGFuIHRoZSBvbmUgSSBtZW50aW9uZWQgaW4gbXkgZmlyc3QgbWFpbCwgYmVjYXVzZSBpdCdzIGZyb20gdGhlCisjIHRvcC1sZXZlbCBnb3Zlcm5tZW50IGluIFRhaXdhbi4gSWYgeW91J3JlIGdvaW5nIHRvIHF1b3RlIGFueSByZXNvdXJjZSwgdGhpcworIyB3b3VsZCBiZSBhIGdvb2Qgb25lLgorIyBbMV0gVGFpd2FuIEdvdmVybm9yLUdlbmVyYWwgR2F6ZXR0ZSwgTm8uIDEwMTgsIFNlcCAxOSwgMTk0NToKKyMgaHR0cDovL2RiMi50aC5nb3YudHcvZGIyL3ZpZXcvdmlld0ltZy5waHA/aW1nY29kZT0wMDcyMDMxMDE4YSZudW09MTkmYmduPTAxOSZlbmQ9MDE5Jm90aGVySW1nPSZ0eXBlPWdlbmVyCisKKyMgRnJvbSBZdS1DaGVuZyBDaHVhbmcgKDIwMTQtMDctMDIpOgorIyBJbiAxOTQ2LCBEU1QgaW4gVGFpd2FuIHdhcyBmcm9tIE1heSAxNSBhbmQgZW5kZWQgb24gU2VwIDMwLiBUaGUgaW5mbyBmcm9tCisjIENlbnRyYWwgV2VhdGhlciBCdXJlYXUgd2Vic2l0ZSB3YXMgbm90IGNvcnJlY3QuCisjCisjIE9yaWdpbmFsIEJ1bGxldGluOgorIyBodHRwOi8vc3VidHBnLnRwZy5nb3YudHcvb2cvaW1hZ2UyLmFzcD9mPTAzNTAyRjBBS00xQUYKKyMgaHR0cDovL3N1YnRwZy50cGcuZ292LnR3L29nL2ltYWdlMi5hc3A/Zj0wMzUwMzAwQUtNMUIwIChjb250LikKKyMKKyMgSW4gMTk0NywgRFNUIGluIFRhaXdhbiB3YXMgZXhwYW5kZWQgdG8gT2N0IDMxLiBUaGVyZSBpcyBhIGJhY2t1cCBvZiB0aGF0CisjIHRlbGVncmFtIGFubm91bmNlbWVudCBmcm9tIFRhaXdhbiBQcm92aW5jZSBHb3Zlcm5tZW50OgorIworIyBodHRwOi8vc3VidHBnLnRwZy5nb3YudHcvb2cvaW1hZ2UyLmFzcD9mPTAzNjAzMTBBS1o0MzEKKyMKKyMgSGVyZSBpcyBhIGJyaWVmIHRyYW5zbGF0aW9uOgorIworIyAgIFRoZSBTdW1tZXIgVGltZSB0aGlzIHllYXIgaXMgYWRvcHRlZCBmcm9tIG1pZG5pZ2h0IEFwciAxNSB1bnRpbCBTZXAgMjAKKyMgICBtaWRuaWdodC4gVG8gc2F2ZSAoZW5lcmd5PykgY29uc3VtcHRpb24sIHdlJ3JlIGV4cGFuZGluZyBTdW1tZXIgVGltZQorIyAgIGFkb3B0aW9uIHRpbGwgT2N0IDMxIG1pZG5pZ2h0LgorIworIyBUaGUgQ2VudHJhbCBXZWF0aGVyIEJ1cmVhdSB3ZWJzaXRlIGRpZG4ndCBtZW50aW9uIHRoYXQsIGhvd2V2ZXIgaXQgY2FuCisjIGJlIGZvdW5kIGZyb20gaGlzdG9yaWNhbCBnb3Zlcm5tZW50IGFubm91bmNlbWVudCBkYXRhYmFzZS4KKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTAzKToKKyMgQXMgcGVyIFl1LUNoZW5nIENodWFuZywgc2F5IHRoYXQgVGFpd2FuIHdhcyBhdCBVVCs5IGZyb20gMTkzNy0xMC0wMQorIyB1bnRpbCAxOTQ1LTA5LTIxIGF0IDAxOjAwLCBvdmVycmlkaW5nIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgTGlrZXdpc2UsIHVzZSBZdS1DaGVuZyBDaHVhbmcncyBkYXRhIGZvciBEU1QgaW4gVGFpd2FuLgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlUYWl3YW4JMTk0NQkxOTUxCS0JTWF5CTEJMDowMAkxOjAwCUQKLVJ1bGUJVGFpd2FuCTE5NDUJMTk1MQktCU9jdAkxCTA6MDAJMAlTCitSdWxlCVRhaXdhbgkxOTQ2CW9ubHkJLQlNYXkJMTUJMDowMAkxOjAwCUQKK1J1bGUJVGFpd2FuCTE5NDYJb25seQktCU9jdAkxCTA6MDAJMAlTCitSdWxlCVRhaXdhbgkxOTQ3CW9ubHkJLQlBcHIJMTUJMDowMAkxOjAwCUQKK1J1bGUJVGFpd2FuCTE5NDcJb25seQktCU5vdgkxCTA6MDAJMAlTCitSdWxlCVRhaXdhbgkxOTQ4CTE5NTEJLQlNYXkJMQkwOjAwCTE6MDAJRAorUnVsZQlUYWl3YW4JMTk0OAkxOTUxCS0JT2N0CTEJMDowMAkwCVMKIFJ1bGUJVGFpd2FuCTE5NTIJb25seQktCU1hcgkxCTA6MDAJMTowMAlECiBSdWxlCVRhaXdhbgkxOTUyCTE5NTQJLQlOb3YJMQkwOjAwCTAJUwogUnVsZQlUYWl3YW4JMTk1MwkxOTU5CS0JQXByCTEJMDowMAkxOjAwCUQKQEAgLTY0OCwxMSArNzYyLDE0IEBACiBSdWxlCVRhaXdhbgkxOTYwCTE5NjEJLQlKdW4JMQkwOjAwCTE6MDAJRAogUnVsZQlUYWl3YW4JMTk3NAkxOTc1CS0JQXByCTEJMDowMAkxOjAwCUQKIFJ1bGUJVGFpd2FuCTE5NzQJMTk3NQktCU9jdAkxCTA6MDAJMAlTCi1SdWxlCVRhaXdhbgkxOTc5CW9ubHkJLQlKdW4JMzAJMDowMAkxOjAwCUQKLVJ1bGUJVGFpd2FuCTE5NzkJb25seQktCVNlcAkzMAkwOjAwCTAJUworUnVsZQlUYWl3YW4JMTk3OQlvbmx5CS0JSnVsCTEJMDowMAkxOjAwCUQKK1J1bGUJVGFpd2FuCTE5NzkJb25seQktCU9jdAkxCTA6MDAJMAlTCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9UYWlwZWkJODowNjowMCAtCUxNVAkxODk2ICMgb3IgVGFpYmVpIG9yIFQnYWktcGVpCisjIFRhaXBlaSBvciBUYWliZWkgb3IgVCdhaS1wZWkKK1pvbmUJQXNpYS9UYWlwZWkJODowNjowMCAtCUxNVAkxODk2IEphbiAgMQorCQkJODowMAktCUpXU1QJMTkzNyBPY3QgIDEKKwkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMjEgIDE6MDAKIAkJCTg6MDAJVGFpd2FuCUMlc1QKIAogIyBNYWNhdSAoTWFjYW8sIEFvbWVuKQpAQCAtNjcyLDcgKzc4OSw3IEBACiBSdWxlCU1hY2F1CTE5NzgJMTk4MAktCUFwcglTdW4+PTE1CTA6MDAJMTowMAlTCiBSdWxlCU1hY2F1CTE5NzgJMTk4MAktCU9jdAlTdW4+PTE1CTA6MDAJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvTWFjYXUJNzozNDoyMCAtCUxNVAkxOTEyCitab25lCUFzaWEvTWFjYXUJNzozNDoyMCAtCUxNVAkxOTEyIEphbiAgMQogCQkJODowMAlNYWNhdQlNTyVzVAkxOTk5IERlYyAyMCAjIHJldHVybiB0byBDaGluYQogCQkJODowMAlQUkMJQyVzVAogCkBAIC03MjEsNyArODM4LDcgQEAKICMgcmVwdWJsaWMgaGFzIGNoYW5nZWQgaXRzIHRpbWUgem9uZSBiYWNrIHRvIHRoYXQgb2YgTW9zY293LiAgQXMgYSByZXN1bHQgaXQKICMgaXMgbm93IGp1c3QgZm91ciBob3VycyBhaGVhZCBvZiBHcmVlbndpY2ggTWVhbiBUaW1lLCByYXRoZXIgdGhhbiBmaXZlIGhvdXJzCiAjIGFoZWFkLiAgVGhlIHN3aXRjaCB3YXMgZGVjcmVlZCBieSB0aGUgcHJvLVdlc3Rlcm4gcHJlc2lkZW50IG9mIEdlb3JnaWEsCi0jIE1pa2hhaWwgU2Fha2FzaHZpbGksIHdobyBzYWlkIHRoZSBjaGFuZ2Ugd2FzIHBhcnRseSBwcm9tcHRlZCBieSB0aGUgcHJvY2VzcworIyBNaWtoZWlsIFNhYWthc2h2aWxpLCB3aG8gc2FpZCB0aGUgY2hhbmdlIHdhcyBwYXJ0bHkgcHJvbXB0ZWQgYnkgdGhlIHByb2Nlc3MKICMgb2YgaW50ZWdyYXRpb24gaW50byBFdXJvcGUuCiAKICMgRnJvbSBUZWltdXJheiBBYmFzaGlkemUgKDIwMDUtMTEtMDcpOgpAQCAtNzM0LDI5ICs4NTEsMzEgQEAKICMgSSBkb24ndCBrbm93IHdoYXQgY2FuIGJlIGRvbmUsIGVzcGVjaWFsbHkga25vd2luZyB0aGF0IHNvbWUgeWVhcnMgYWdvIG91cgogIyBEU1QgcnVsZXMgd2hlcmUgY2hhbmdlZCBUSFJFRSBUSU1FUyBkdXJpbmcgb25lIG1vbnRoLgogCisjIE1pbG5lIDE4OTkgc2F5cyBUYmlsaXNpIChUaWZsaXMpIHRpbWUgd2FzIDI6NTk6MDUuNy4KKyMgQnlhbG9rb3ogMTkxOSBzYXlzIEdlb3JnaWEgd2FzIDI6NTk6MTEuCisjIEdvIHdpdGggQnlhbG9rb3ouCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9UYmlsaXNpCTI6NTk6MTYgLQlMTVQJMTg4MAotCQkJMjo1OToxNgktCVRCTVQJMTkyNCBNYXkgIDIgIyBUYmlsaXNpIE1lYW4gVGltZQorWm9uZQlBc2lhL1RiaWxpc2kJMjo1OToxMSAtCUxNVAkxODgwCisJCQkyOjU5OjExCS0JVEJNVAkxOTI0IE1heSAgMiAjIFRiaWxpc2kgTWVhbiBUaW1lCiAJCQkzOjAwCS0JVEJJVAkxOTU3IE1hciAgICAjIFRiaWxpc2kgVGltZQotCQkJNDowMCBSdXNzaWFBc2lhIFRCSSVzVAkxOTkxIE1hciAzMSAyOjAwcworCQkJNDowMCBSdXNzaWFBc2lhIFRCSSVzVAkxOTkxIE1hciAzMSAgMjowMHMKIAkJCTM6MDAJMTowMAlUQklTVAkxOTkxIEFwciAgOSAjIGluZGVwZW5kZW5jZQotCQkJMzowMCBSdXNzaWFBc2lhIEdFJXNUCTE5OTIgIyBHZW9yZ2lhIFRpbWUKKwkJCTM6MDAgUnVzc2lhQXNpYSBHRSVzVAkxOTkyICAgICAgICAjIEdlb3JnaWEgVGltZQogCQkJMzowMCBFLUV1ckFzaWEJR0Ulc1QJMTk5NCBTZXAgbGFzdFN1bgogCQkJNDowMCBFLUV1ckFzaWEJR0Ulc1QJMTk5NiBPY3QgbGFzdFN1bgogCQkJNDowMAkxOjAwCUdFU1QJMTk5NyBNYXIgbGFzdFN1bgogCQkJNDowMCBFLUV1ckFzaWEJR0Ulc1QJMjAwNCBKdW4gMjcKLQkJCTM6MDAgUnVzc2lhQXNpYQlHRSVzVAkyMDA1IE1hciBsYXN0U3VuIDI6MDAKKwkJCTM6MDAgUnVzc2lhQXNpYQlHRSVzVAkyMDA1IE1hciBsYXN0U3VuICAyOjAwCiAJCQk0OjAwCS0JR0VUCiAKICMgRWFzdCBUaW1vcgogCiAjIFNlZSBJbmRvbmVzaWEgZm9yIHRoZSAxOTQ1IHRyYW5zaXRpb24uCiAKLSMgRnJvbSBKb2FvIENhcnJhc2NhbGFvLCBicm90aGVyIG9mIHRoZSBmb3JtZXIgZ292ZXJub3Igb2YgRWFzdCBUaW1vciwgaW4KLSMgPGEgaHJlZj0iaHR0cDovL2V0YW4ub3JnL2V0OTljL2RlY2VtYmVyLzI2LTMxLzMwRVRNQVkuaHRtIj4KKyMgRnJvbSBKb8OjbyBDYXJyYXNjYWzDo28sIGJyb3RoZXIgb2YgdGhlIGZvcm1lciBnb3Zlcm5vciBvZiBFYXN0IFRpbW9yLCBpbgogIyBFYXN0IFRpbW9yIG1heSBiZSBsYXRlIGZvciBpdHMgbWlsbGVubml1bQotIyA8L2E+ICgxOTk5LTEyLTI2LzMxKToKKyMgPGh0dHA6Ly9ldGFuLm9yZy9ldDk5Yy9kZWNlbWJlci8yNi0zMS8zMEVUTUFZLmh0bT4gKDE5OTktMTItMjYvMzEpOgogIyBQb3J0dWdhbCB0cmllZCB0byBjaGFuZ2UgdGhlIHRpbWUgZm9yd2FyZCBpbiAxOTc0IGJlY2F1c2UgdGhlIHN1bgogIyByaXNlcyB0b28gZWFybHkgYnV0IHRoZSBzdWdnZXN0aW9uIHJhaXNlZCBhIGxvdCBvZiBwcm9ibGVtcyB3aXRoIHRoZQogIyBUaW1vcmVzZSBhbmQgSSBzdGlsbCBkb24ndCB0aGluayBpdCB3b3VsZCB3b3JrIHRvZGF5IGJlY2F1c2UgaXQKQEAgLTc2NiwyNSArODg1LDI1IEBACiAjIFdlIGRvbid0IGhhdmUgYW55IHJlY29yZCBvZiB0aGUgYWJvdmUgYXR0ZW1wdC4KICMgTW9zdCBsaWtlbHkgb3VyIHJlY29yZHMgYXJlIGluY29tcGxldGUsIGJ1dCB3ZSBoYXZlIG5vIGJldHRlciBkYXRhLgogCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaHJpLm9yZy9uZXdzL3dvcmxkL3VuZGgvbGFzdC8wMC0wOC0xNi51bmRoLmh0bWwiPgogIyBGcm9tIE1hbm9lbCBkZSBBbG1laWRhIGUgU2lsdmEsIERlcHV0eSBTcG9rZXNtYW4gZm9yIHRoZSBVTiBTZWNyZXRhcnktR2VuZXJhbAotIyAoMjAwMC0wOC0xNik8L2E+OgorIyBodHRwOi8vd3d3LmhyaS5vcmcvbmV3cy93b3JsZC91bmRoLzIwMDAvMDAtMDgtMTYudW5kaC5odG1sCisjICgyMDAwLTA4LTE2KToKICMgVGhlIENhYmluZXQgb2YgdGhlIEVhc3QgVGltb3IgVHJhbnNpdGlvbiBBZG1pbmlzdHJhdGlvbiBkZWNpZGVkCiAjIHRvZGF5IHRvIGFkdmFuY2UgRWFzdCBUaW1vcidzIHRpbWUgYnkgb25lIGhvdXIuICBUaGUgdGltZSBjaGFuZ2UsCiAjIHdoaWNoIHdpbGwgYmUgcGVybWFuZW50LCB3aXRoIG5vIHNlYXNvbmFsIGFkanVzdG1lbnQsIHdpbGwgaGFwcGVuIGF0CiAjIG1pZG5pZ2h0IG9uIFNhdHVyZGF5LCBTZXB0ZW1iZXIgMTYuCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9EaWxpCTg6MjI6MjAgLQlMTVQJMTkxMgorWm9uZQlBc2lhL0RpbGkJODoyMjoyMCAtCUxNVAkxOTEyIEphbiAgMQogCQkJODowMAktCVRMVAkxOTQyIEZlYiAyMSAyMzowMCAjIEUgVGltb3IgVGltZQogCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAyMwogCQkJOTowMAktCVRMVAkxOTc2IE1heSAgMwotCQkJODowMAktCVdJVEEJMjAwMCBTZXAgMTcgMDA6MDAKKwkJCTg6MDAJLQlXSVRBCTIwMDAgU2VwIDE3ICAwOjAwCiAJCQk5OjAwCS0JVExUCiAKICMgSW5kaWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9Lb2xrYXRhCTU6NTM6MjggLQlMTVQJMTg4MAkjIEtvbGthdGEKK1pvbmUJQXNpYS9Lb2xrYXRhCTU6NTM6MjggLQlMTVQJMTg4MCAgICAgICAgIyBLb2xrYXRhCiAJCQk1OjUzOjIwCS0JSE1UCTE5NDEgT2N0ICAgICMgSG93cmFoIE1lYW4gVGltZT8KIAkJCTY6MzAJLQlCVVJUCTE5NDIgTWF5IDE1ICMgQnVybWEgVGltZQogCQkJNTozMAktCUlTVAkxOTQyIFNlcApAQCAtNzk4LDcgKzkxNyw3IEBACiAjIEluZG9uZXNpYQogIwogIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDAxLTA1LTI4KSwgb3ZlcnJpZGluZyBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jIDxodHRwOi8vd3d3LnN1bWF0ZXJhLWluYy5jb20vZ29fdG9faW52ZXN0L2Fib3V0X2luZG9uZXNpYS5hc3Ajc3RhbmR0aW1lPgorIyBodHRwOi8vd3d3LnN1bWF0ZXJhLWluYy5jb20vZ29fdG9faW52ZXN0L2Fib3V0X2luZG9uZXNpYS5hc3Ajc3RhbmR0aW1lCiAjIHNheXMgdGhhdCBJbmRvbmVzaWEncyB0aW1lIHpvbmVzIGNoYW5nZWQgb24gMTk4OC0wMS0wMS4gIExvb2tpbmcgYXQgc29tZQogIyB0aW1lIHpvbmUgbWFwcywgSSB0aGluayB0aGF0IG11c3QgcmVmZXIgdG8gV2VzdGVybiBCb3JuZW8gKEthbGltYW50YW4gQmFyYXQKICMgYW5kIEthbGltYW50YW4gVGVuZ2FoKSBzd2l0Y2hpbmcgZnJvbSBVVEMrOCB0byBVVEMrNy4KQEAgLTgxMCw3ICs5MjksNyBAQAogIyBvdGhlciBmb3JtYWwgc3VycmVuZGVyIGNlcmVtb25pZXMgd2VyZSBTZXB0ZW1iZXIgOSwgMTEsIGFuZCAxMywgcGx1cwogIyBTZXB0ZW1iZXIgMTIgZm9yIHRoZSByZWdpb25hbCBzdXJyZW5kZXIgdG8gTW91bnRiYXR0ZW4gaW4gU2luZ2Fwb3JlLgogIyBUaGVzZSB3b3VsZCBiZSB0aGUgZWFybGllc3QgcG9zc2libGUgdGltZXMgZm9yIGEgY2hhbmdlLgotIyBSZWdpbWVzIGhvcmFpcmVzIHBvdXIgbGUgbW9uZGUgZW50aWVyLCBieSBIZW5yaSBMZSBDb3JyZSwgKEVkaXRpb25zCisjIFLDqWdpbWVzIGhvcmFpcmVzIHBvdXIgbGUgbW9uZGUgZW50aWVyLCBieSBIZW5yaSBMZSBDb3JyZSwgKMOJZGl0aW9ucwogIyBUcmFkaXRpb25uZWxsZXMsIDE5ODcsIFBhcmlzKSBzYXlzIHRoYXQgSmF2YSBhbmQgTWFkdXJhIHN3aXRjaGVkCiAjIGZyb20gSlNUIHRvIFVUQyswNzozMCBvbiAxOTQ1LTA5LTIzLCBhbmQgZ2l2ZXMgMTk0NC0wOS0wMSBmb3IgSmF5YXB1cmEKICMgKEhvbGxhbmRpYSkuICBGb3Igbm93LCBhc3N1bWUgYWxsIEluZG9uZXNpYW4gbG9jYXRpb25zIG90aGVyIHRoYW4gSmF5YXB1cmEKQEAgLTgzNSw3ICs5NTQsNyBAQAogIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoZSBuZXh0IHRyYW5zaXRpb24gd2FzIGF0IDE5MjQgSmFuIDEgMDoxMywKICMgYnV0IHRoaXMgbXVzdCBiZSBhIHR5cG8uCiAJCQk3OjA3OjEyCS0JQk1UCTE5MjMgRGVjIDMxIDIzOjQ3OjEyICMgQmF0YXZpYQotCQkJNzoyMAktCUpBVlQJMTkzMiBOb3YJICMgSmF2YSBUaW1lCisJCQk3OjIwCS0JSkFWVAkxOTMyIE5vdiAgICAjIEphdmEgVGltZQogCQkJNzozMAktCVdJQgkxOTQyIE1hciAyMwogCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAyMwogCQkJNzozMAktCVdJQgkxOTQ4IE1heQpAQCAtODYxLDcgKzk4MCw3IEBACiAjIE1hbHVrdSBJc2xhbmRzLCBXZXN0IFBhcHVhLCBQYXB1YQogWm9uZSBBc2lhL0pheWFwdXJhCTk6MjI6NDggLQlMTVQJMTkzMiBOb3YKIAkJCTk6MDAJLQlXSVQJMTk0NCBTZXAgIDEKLQkJCTk6MzAJLQlDU1QJMTk2NAorCQkJOTozMAktCUFDU1QJMTk2NAogCQkJOTowMAktCVdJVAogCiAjIElyYW4KQEAgLTkyNyw3ICsxMDQ2LDcgQEAKICMgU2V2ZXJhbCBvZiBteSB1c2VycyBoYXZlIHJlcG9ydGVkIHRoYXQgSXJhbiB3aWxsIG5vdCBvYnNlcnZlIERTVCBhbnltb3JlOgogIyBodHRwOi8vd3d3LmlybmEuaXIvZW4vbmV3cy92aWV3L2xpbmUtMTcvMDYwMzE5MzgxMjE2NDk0OC5odG0KICMKLSMgRnJvbSBSZXV0ZXJzICgyMDA3LTA5LTE2KSwgd2l0aCBhIGhlYWRzLXVwIGZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuOgorIyBGcm9tIFJldXRlcnMgKDIwMDctMDktMTYpLCB3aXRoIGEgaGVhZHMtdXAgZnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuOgogIyAuLi4gdGhlIEd1YXJkaWFuIENvdW5jaWwgLi4uIGFwcHJvdmVkIGEgbGF3IG9uIFN1bmRheSB0byByZS1pbnRyb2R1Y2UKICMgZGF5bGlnaHQgc2F2aW5nIHRpbWUgLi4uCiAjIGh0dHA6Ly91ay5yZXV0ZXJzLmNvbS9hcnRpY2xlL29pbFJwdC9pZFVLQkxBNjUwNDg0MjAwNzA5MTYKQEAgLTk5Myw3ICsxMTEyLDcgQEAKIFJ1bGUJSXJhbgkyMDM2CTIwMzcJLQlTZXAJMjEJMDowMAkwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9UZWhyYW4JMzoyNTo0NAktCUxNVAkxOTE2Ci0JCQkzOjI1OjQ0CS0JVE1UCTE5NDYJIyBUZWhyYW4gTWVhbiBUaW1lCisJCQkzOjI1OjQ0CS0JVE1UCTE5NDYgICAgICMgVGVocmFuIE1lYW4gVGltZQogCQkJMzozMAktCUlSU1QJMTk3NyBOb3YKIAkJCTQ6MDAJSXJhbglJUiVzVAkxOTc5CiAJCQkzOjMwCUlyYW4JSVIlc1QKQEAgLTEwMTgsMTcgKzExMzcsMTEgQEAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDMtMTApOgogIyBUaGUgY2FiaW5ldCBpbiBJcmFxIGFib2xpc2hlZCBEU1QgbGFzdCB3ZWVrLCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZwogIyBuZXdzIHNvdXJjZXMgKGluIEFyYWJpYyk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWxqZWVyYW4ubmV0L3dlc2ltYV9hcnRpY2xlcy9uZXdzLTIwMDgwMzA1LTk4NjAyLmh0bWwiPgogIyBodHRwOi8vd3d3LmFsamVlcmFuLm5ldC93ZXNpbWFfYXJ0aWNsZXMvbmV3cy0yMDA4MDMwNS05ODYwMi5odG1sCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hc3dhdGFsaXJhcS5pbmZvL2xvb2svYXJ0aWNsZS50cGw/aWQ9MjA0NyZJZExhbmd1YWdlPTE3JklkUHVibGljYXRpb249NCZOckFydGljbGU9NzE3NDMmTnJJc3N1ZT0xJk5yU2VjdGlvbj0xMCI+CiAjIGh0dHA6Ly93d3cuYXN3YXRhbGlyYXEuaW5mby9sb29rL2FydGljbGUudHBsP2lkPTIwNDcmSWRMYW5ndWFnZT0xNyZJZFB1YmxpY2F0aW9uPTQmTnJBcnRpY2xlPTcxNzQzJk5ySXNzdWU9MSZOclNlY3Rpb249MTAKLSMgPC9hPgogIwogIyBXZSBoYXZlIHB1Ymxpc2hlZCBhIHNob3J0IGFydGljbGUgaW4gRW5nbGlzaCBhYm91dCB0aGUgY2hhbmdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvaXJhcS1kdW1wcy1kYXlsaWdodC1zYXZpbmcuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9pcmFxLWR1bXBzLWRheWxpZ2h0LXNhdmluZy5odG1sCi0jIDwvYT4KIAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIFJ1bGUJSXJhcQkxOTgyCW9ubHkJLQlNYXkJMQkwOjAwCTE6MDAJRApAQCAtMTAzNywxNCArMTE1MCwxNCBAQAogUnVsZQlJcmFxCTE5ODQJMTk4NQktCUFwcgkxCTA6MDAJMTowMAlECiBSdWxlCUlyYXEJMTk4NQkxOTkwCS0JU2VwCWxhc3RTdW4JMTowMHMJMAlTCiBSdWxlCUlyYXEJMTk4NgkxOTkwCS0JTWFyCWxhc3RTdW4JMTowMHMJMTowMAlECi0jIElBVEEgU1NJTSAoMTk5MS8xOTk2KSBzYXlzIEFwciAxIDEyOjAxYW0gVVRDOyBndWVzcyB0aGUgYDowMScgaXMgYSB0eXBvLgorIyBJQVRBIFNTSU0gKDE5OTEvMTk5Nikgc2F5cyBBcHIgMSAxMjowMWFtIFVUQzsgZ3Vlc3MgdGhlICc6MDEnIGlzIGEgdHlwby4KICMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBJcmFxIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgMTk5Mi8xOTk3OyBpZ25vcmUgdGhpcy4KICMKIFJ1bGUJSXJhcQkxOTkxCTIwMDcJLQlBcHIJIDEJMzowMHMJMTowMAlECiBSdWxlCUlyYXEJMTk5MQkyMDA3CS0JT2N0CSAxCTM6MDBzCTAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0JhZ2hkYWQJMjo1Nzo0MAktCUxNVAkxODkwCi0JCQkyOjU3OjM2CS0JQk1UCTE5MTgJICAgICMgQmFnaGRhZCBNZWFuIFRpbWU/CisJCQkyOjU3OjM2CS0JQk1UCTE5MTggICAgICMgQmFnaGRhZCBNZWFuIFRpbWU/CiAJCQkzOjAwCS0JQVNUCTE5ODIgTWF5CiAJCQkzOjAwCUlyYXEJQSVzVAogCkBAIC0xMjcyLDcgKzEzODUsNyBAQAogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvSmVydXNhbGVtCTI6MjA6NTQgLQlMTVQJMTg4MAotCQkJMjoyMDo0MAktCUpNVAkxOTE4CSMgSmVydXNhbGVtIE1lYW4gVGltZT8KKwkJCTI6MjA6NDAJLQlKTVQJMTkxOCAjIEplcnVzYWxlbSBNZWFuIFRpbWU/CiAJCQkyOjAwCVppb24JSSVzVAogCiAKQEAgLTEyODEsMTUgKzEzOTQsMTUgQEAKIAogIyBKYXBhbgogCi0jIGA5OjAwJyBhbmQgYEpTVCcgaXMgZnJvbSBHdXkgSGFycmlzLgorIyAnOTowMCcgYW5kICdKU1QnIGlzIGZyb20gR3V5IEhhcnJpcy4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk1LTAzLTA2KToKICMgVG9kYXkncyBfQXNhaGkgRXZlbmluZyBOZXdzXyAocGFnZSA0KSByZXBvcnRzIHRoYXQgSmFwYW4gaGFkCi0jIGRheWxpZ2h0IHNhdmluZyBiZXR3ZWVuIDE5NDggYW5kIDE5NTEsIGJ1dCBgYHRoZSBzeXN0ZW0gd2FzIGRpc2NvbnRpbnVlZAotIyBiZWNhdXNlIHRoZSBwdWJsaWMgYmVsaWV2ZWQgaXQgd291bGQgbGVhZCB0byBsb25nZXIgd29ya2luZyBob3Vycy4nJworIyBkYXlsaWdodCBzYXZpbmcgYmV0d2VlbiAxOTQ4IGFuZCAxOTUxLCBidXQgInRoZSBzeXN0ZW0gd2FzIGRpc2NvbnRpbnVlZAorIyBiZWNhdXNlIHRoZSBwdWJsaWMgYmVsaWV2ZWQgaXQgd291bGQgbGVhZCB0byBsb25nZXIgd29ya2luZyBob3Vycy4iCiAKLSMgRnJvbSBNYXl1bWkgTmVnaXNoaSBpbiB0aGUgMjAwNS0wOC0xMCBKYXBhbiBUaW1lcwotIyA8aHR0cDovL3d3dy5qYXBhbnRpbWVzLmNvLmpwL2NnaS1iaW4vZ2V0YXJ0aWNsZS5wbDU/bm4yMDA1MDgxMGYyLmh0bT46CisjIEZyb20gTWF5dW1pIE5lZ2lzaGkgaW4gdGhlIDIwMDUtMDgtMTAgSmFwYW4gVGltZXM6CisjIGh0dHA6Ly93d3cuamFwYW50aW1lcy5jby5qcC9jZ2ktYmluL2dldGFydGljbGUucGw1P25uMjAwNTA4MTBmMi5odG0KICMgT2NjdXBhdGlvbiBhdXRob3JpdGllcyBpbXBvc2VkIGRheWxpZ2h0LXNhdmluZyB0aW1lIG9uIEphcGFuIG9uCiAjIFsxOTQ4LTA1LTAxXS4uLi4gIEJ1dCBsYWNrIG9mIHByaW9yIGRlYmF0ZSBhbmQgdGhlIGV4ZWN1dGlvbiBvZgogIyBkYXlsaWdodC1zYXZpbmcgdGltZSBqdXN0IHRocmVlIGRheXMgYWZ0ZXIgdGhlIGJpbGwgd2FzIHBhc3NlZCBnZW5lcmF0ZWQKQEAgLTEzMTMsNyArMTQyNiw4IEBACiAKICMgRnJvbSBIaWRleXVraSBTdXp1a2kgKDE5OTgtMTEtMDkpOgogIyAnVG9reW8nIHVzdWFsbHkgc3RhbmRzIGZvciB0aGUgZm9ybWVyIGxvY2F0aW9uIG9mIFRva3lvIEFzdHJvbm9taWNhbAotIyBPYnNlcnZhdG9yeTogRSAxMzkgNDQnIDQwIi45MCAoOWggMThtIDU4cy43MjcpLCBOIDM1IDM5JyAxNiIuMC4KKyMgT2JzZXJ2YXRvcnk6IDEzOSBkZWdyZWVzIDQ0JyA0MC45MCIgRSAoOWggMThtIDU4LjcyN3MpLAorIyAzNSBkZWdyZWVzIDM5JyAxNi4wIiBOLgogIyBUaGlzIGRhdGEgaXMgZnJvbSAnUmlrYSBOZW5weW91IChDaHJvbm9sb2dpY2FsIFNjaWVudGlmaWMgVGFibGVzKSAxOTk2JwogIyBlZGl0ZWQgYnkgTmF0aW9uYWwgQXN0cm9ub21pY2FsIE9ic2VydmF0b3J5IG9mIEphcGFuLi4uLgogIyBKU1QgKEphcGFuIFN0YW5kYXJkIFRpbWUpIGhhcyBiZWVuIHVzZWQgc2luY2UgMTg4OC0wMS0wMSAwMDowMCAoSlNUKS4KQEAgLTEzMjEsMTAgKzE0MzUsMTAgQEAKIAogIyBGcm9tIEhpZGV5dWtpIFN1enVraSAoMTk5OC0xMS0xNik6CiAjIFRoZSBvcmRpbmFuY2UgTm8uIDUxICgxODg2KSBlc3RhYmxpc2hlZCAic3RhbmRhcmQgdGltZSIgaW4gSmFwYW4sCi0jIHdoaWNoIHN0YW5kcyBmb3IgdGhlIHRpbWUgb24gRSAxMzUgZGVncmVlLgorIyB3aGljaCBzdGFuZHMgZm9yIHRoZSB0aW1lIG9uIDEzNSBkZWdyZWVzIEUuCiAjIEluIHRoZSBvcmRpbmFuY2UgTm8uIDE2NyAoMTg5NSksICJzdGFuZGFyZCB0aW1lIiB3YXMgcmVuYW1lZCB0byAiY2VudHJhbAogIyBzdGFuZGFyZCB0aW1lIi4gIEFuZCB0aGUgc2FtZSBvcmRpbmFuY2UgYWxzbyBlc3RhYmxpc2hlZCAid2VzdGVybiBzdGFuZGFyZAotIyB0aW1lIiwgd2hpY2ggc3RhbmRzIGZvciB0aGUgdGltZSBvbiBFIDEyMCBkZWdyZWUuLi4uICBCdXQgIndlc3Rlcm4gc3RhbmRhcmQKKyMgdGltZSIsIHdoaWNoIHN0YW5kcyBmb3IgdGhlIHRpbWUgb24gMTIwIGRlZ3JlZXMgRS4uLi4gIEJ1dCAid2VzdGVybiBzdGFuZGFyZAogIyB0aW1lIiB3YXMgYWJvbGlzaGVkIGluIHRoZSBvcmRpbmFuY2UgTm8uIDUyOSAoMTkzNykuICBJbiB0aGUgb3JkaW5hbmNlIE5vLgogIyAxNjcsIHRoZXJlIGlzIG5vIG1lbnRpb24gcmVnYXJkaW5nIGZvciB3aGF0IHBsYWNlIHdlc3Rlcm4gc3RhbmRhcmQgdGltZSBpcwogIyBzdGFuZGFyZC4uLi4KQEAgLTEzMzIsMjcgKzE0NDYsMzMgQEAKICMgSSB3cm90ZSAib3JkaW5hbmNlIiBhYm92ZSwgYnV0IEkgZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNsYXRlLgogIyBJbiBKYXBhbmVzZSBpdCdzICJjaG9rdXJlaSIsIHdoaWNoIG1lYW5zIG9yZGluYW5jZSBmcm9tIGVtcGVyb3IuCiAKLSMgU2hhbmtzICYgUG90dGVuZ2VyIGNsYWltIEpTVCBpbiB1c2Ugc2luY2UgMTg5NiwgYW5kIHRoYXQgYSBmZXcKLSMgcGxhY2VzIChlLmcuIElzaGlnYWtpKSB1c2UgKzA4MDA7IGdvIHdpdGggU3V6dWtpLiAgR3Vlc3MgdGhhdCBhbGwKLSMgb3JkaW5hbmNlcyB0b29rIGVmZmVjdCBvbiBKYW4gMS4KKyMgRnJvbSBZdS1DaGVuZyBDaHVhbmcgKDIwMTMtMDctMTIpOgorIyAuLi50aGUgTWVpamkgRW1wZXJvciBhbm5vdW5jZWQgT3JkaW5hbmNlIE5vLiAxNjcgb2YgTWVpamkgWWVhciAyOCAiVGhlIGNsYXVzZQorIyBhYm91dCBzdGFuZGFyZCB0aW1lIiAuLi4gVGhlIGFkb3B0aW9uIGJlZ2FuIGZyb20gSmFuIDEsIDE4OTYuCisjIGh0dHA6Ly9qYS53aWtpc291cmNlLm9yZy93aWtpL+aomea6luaZguODi+mXnOOCueODq+S7tl8o5YWs5biD5pmCKQorIworIyAuLi50aGUgU2hvd2EgRW1wZXJvciBhbm5vdW5jZWQgT3JkaW5hbmNlIE5vLiA1Mjkgb2YgU2hvd2EgWWVhciAxMiAuLi4gd2hpY2gKKyMgbWVhbnMgdGhlIHdob2xlIEphcGFuIHRlcnJpdG9yeSwgaW5jbHVkaW5nIGxhdGVyIG9jY3VwYXRpb25zLCBhZG9wdCBKYXBhbgorIyBDZW50cmFsIFRpbWUgKFVUQys5KS4gVGhlIGFkb3B0aW9uIGJlZ2FuIG9uIE9jdCAxLCAxOTM3LgorIyBodHRwOi8vamEud2lraXNvdXJjZS5vcmcvd2lraS/mmI7msrvkuozljYHlhavlubTli4Xku6TnrKznmb7lha3ljYHkuIPomZ/mqJnmupbmmYLjg4vpl5zjgrnjg6vku7bkuK3mlLnmraPjg47ku7YKIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL1Rva3lvCTk6MTg6NTkJLQlMTVQJMTg4NyBEZWMgMzEgMTU6MDB1Ci0JCQk5OjAwCS0JSlNUCTE4OTYKLQkJCTk6MDAJLQlDSlQJMTkzOAorCQkJOTowMAktCUpTVAkxODk2IEphbiAgMQorCQkJOTowMAktCUpDU1QJMTkzNyBPY3QgIDEKIAkJCTk6MDAJSmFwYW4JSiVzVAogIyBTaW5jZSAxOTM4LCBhbGwgSmFwYW5lc2UgcG9zc2Vzc2lvbnMgaGF2ZSBiZWVuIGxpa2UgQXNpYS9Ub2t5by4KIAogIyBKb3JkYW4KICMKLSMgRnJvbSA8YSBocmVmPSJodHRwOi8vc3Rhci5hcmFiaWEuY29tLzk5MDcwMS9KTzkuaHRtbCI+Ci0jIEpvcmRhbiBXZWVrICgxOTk5LTA3LTAxKSA8L2E+IHZpYSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgorIyBGcm9tIDxodHRwOi8vc3Rhci5hcmFiaWEuY29tLzk5MDcwMS9KTzkuaHRtbD4KKyMgSm9yZGFuIFdlZWsgKDE5OTktMDctMDEpIHZpYSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgogIyBDbG9ja3MgaW4gSm9yZGFuIHdlcmUgZm9yd2FyZGVkIG9uZSBob3VyIG9uIFdlZG5lc2RheSBhdCBtaWRuaWdodCwKICMgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBnb3Zlcm5tZW50J3MgZGVjaXNpb24gdG8gaW1wbGVtZW50IHN1bW1lciB0aW1lCiAjIGFsbCB5ZWFyIHJvdW5kLgogIwotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly9zdGFyLmFyYWJpYS5jb20vOTkwOTMwL0pPOS5odG1sIj4KLSMgSm9yZGFuIFdlZWsgKDE5OTktMDktMzApIDwvYT4gdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0xMS0wOSk6CisjIEZyb20gPGh0dHA6Ly9zdGFyLmFyYWJpYS5jb20vOTkwOTMwL0pPOS5odG1sPgorIyBKb3JkYW4gV2VlayAoMTk5OS0wOS0zMCkgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0xMS0wOSk6CiAjIFdpbnRlciB0aW1lIHN0YXJ0cyB0b2RheSBUaHVyc2RheSwgMzAgU2VwdGVtYmVyLiBDbG9ja3Mgd2lsbCBiZSB0dXJuZWQgYmFjawogIyBieSBvbmUgaG91ci4gIFRoaXMgaXMgdGhlIGxhdGVzdCBnb3Zlcm5tZW50IGRlY2lzaW9uIGFuZCBpdCdzIGZpbmFsIQogIyBUaGUgZGVjaXNpb24gd2FzIHRha2VuIGJlY2F1c2Ugb2YgdGhlIGluY3JlYXNlIGluIHdvcmtpbmcgaG91cnMgaW4KQEAgLTEzNzIsOSArMTQ5Miw3IEBACiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDQtMDIpOgogIyBUaGlzIHNpbmdsZSBvbmUgbWlnaHQgYmUgZ29vZCBlbm91Z2gsICgyMDA5LTAzLTI0LCBBcmFiaWMpOgotIyA8YSBocmVmPSJodHRwOi8vcGV0cmEuZ292LmpvL0FydGljYWwuYXNweD9Mbmc9MiZTZWN0aW9uPTgmQXJ0aWNhbD05NTI3OSI+CiAjIGh0dHA6Ly9wZXRyYS5nb3Yuam8vQXJ0aWNhbC5hc3B4P0xuZz0yJlNlY3Rpb249OCZBcnRpY2FsPTk1Mjc5Ci0jIDwvYT4KICMKICMgR29vZ2xlJ3MgdHJhbnNsYXRpb246CiAjCkBAIC0xNDY1LDkgKzE1ODMsOCBAQAogIyAtIFF5enlsb3JkYSBzd2l0Y2hlZCBmcm9tICs1OjAwIHRvICs2OjAwIG9uIDE5OTItMDEtMTkgMDI6MDAuCiAjIC0gT3JhbCBzd2l0Y2hlZCBmcm9tICs1OjAwIHRvICs0OjAwIGluIHNwcmluZyAxOTg5LgogCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cua2F6c29jaWV0eS5vcmcudWsvbmV3cy8yMDA1LzAzLzMwLmh0bSI+Ci0jIEZyb20gS2F6YWtoc3RhbiBFbWJhc3N5J3MgTmV3cyBCdWxsZXRpbiAjMTEgKDIwMDUtMDMtMjEpOgotIyA8L2E+CisjIEZyb20gS2F6YWtoc3RhbiBFbWJhc3N5J3MgTmV3cyBCdWxsZXRpbiAjMTEKKyMgPGh0dHA6Ly93d3cua2F6c29jaWV0eS5vcmcudWsvbmV3cy8yMDA1LzAzLzMwLmh0bT4gKDIwMDUtMDMtMjEpOgogIyBUaGUgR292ZXJubWVudCBvZiBLYXpha2hzdGFuIHBhc3NlZCBhIHJlc29sdXRpb24gTWFyY2ggMTUgYWJvbGlzaGluZwogIyBkYXlsaWdodCBzYXZpbmcgdGltZSBjaXRpbmcgbGFjayBvZiBlY29ub21pYyBiZW5lZml0cyBhbmQgaGVhbHRoCiAjIGNvbXBsaWNhdGlvbnMgY291cGxlZCB3aXRoIGEgZGVjcmVhc2UgaW4gcHJvZHVjdGl2aXR5LgpAQCAtMTUwMCwxMCArMTYxNywxMCBAQAogCQkJNjowMAktCUtJWlQJMTk4MiBBcHIgIDEKIAkJCTU6MDAgUnVzc2lhQXNpYQlLSVolc1QJMTk5MQogCQkJNTowMAktCUtJWlQJMTk5MSBEZWMgMTYgIyBpbmRlcGVuZGVuY2UKLQkJCTU6MDAJLQlRWVpUCTE5OTIgSmFuIDE5IDI6MDAKKwkJCTU6MDAJLQlRWVpUCTE5OTIgSmFuIDE5ICAyOjAwCiAJCQk2OjAwIFJ1c3NpYUFzaWEJUVlaJXNUCTIwMDUgTWFyIDE1CiAJCQk2OjAwCS0JUVlaVAotIyBBcXRvYmUgKGFrYSBBa3RvYmUsIGZvcm1lcmx5IEFrdCd1Ymluc2spCisjIEFxdG9iZSAoYWthIEFrdG9iZSwgZm9ybWVybHkgQWt0eXViaW5zaykKIFpvbmUJQXNpYS9BcXRvYmUJMzo0ODo0MAktCUxNVAkxOTI0IE1heSAgMgogCQkJNDowMAktCUFLVFQJMTkzMCBKdW4gMjEgIyBBa3R5dWJpbnNrIFRpbWUKIAkJCTU6MDAJLQlBS1RUCTE5ODEgQXByICAxCkBAIC0xNTIzLDcgKzE2NDAsNyBAQAogCQkJNjowMAktCVNIRVQJMTk4MiBBcHIgIDEKIAkJCTU6MDAgUnVzc2lhQXNpYQlTSEUlc1QJMTk5MQogCQkJNTowMAktCVNIRVQJMTk5MSBEZWMgMTYgIyBpbmRlcGVuZGVuY2UKLQkJCTU6MDAgUnVzc2lhQXNpYQlBUVQlc1QJMTk5NSBNYXIgbGFzdFN1biAyOjAwICMgQXF0YXUgVGltZQorCQkJNTowMCBSdXNzaWFBc2lhCUFRVCVzVAkxOTk1IE1hciBsYXN0U3VuICAyOjAwICMgQXF0YXUgVGltZQogCQkJNDowMCBSdXNzaWFBc2lhCUFRVCVzVAkyMDA1IE1hciAxNQogCQkJNTowMAktCUFRVFQKICMgV2VzdCBLYXpha2hzdGFuCkBAIC0xNTMyLDcgKzE2NDksNyBAQAogCQkJNTowMAktCVVSQVQJMTk4MSBBcHIgIDEKIAkJCTU6MDAJMTowMAlVUkFTVAkxOTgxIE9jdCAgMQogCQkJNjowMAktCVVSQVQJMTk4MiBBcHIgIDEKLQkJCTU6MDAgUnVzc2lhQXNpYQlVUkElc1QJMTk4OSBNYXIgMjYgMjowMAorCQkJNTowMCBSdXNzaWFBc2lhCVVSQSVzVAkxOTg5IE1hciAyNiAgMjowMAogCQkJNDowMCBSdXNzaWFBc2lhCVVSQSVzVAkxOTkxCiAJCQk0OjAwCS0JVVJBVAkxOTkxIERlYyAxNiAjIGluZGVwZW5kZW5jZQogCQkJNDowMCBSdXNzaWFBc2lhCU9SQSVzVAkyMDA1IE1hciAxNSAjIE9yYWwgVGltZQpAQCAtMTU0Myw3ICsxNjYwLDcgQEAKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA4LTE1KToKICMgQWNjb3JkaW5nIHRvIGFuIGFydGljbGUgZGF0ZWQgdG9kYXkgaW4gdGhlIEt5cmd5enN0YW4gRGV2ZWxvcG1lbnQgR2F0ZXdheQotIyA8aHR0cDovL2VuZy5nYXRld2F5LmtnL2NnaS1iaW4vcGFnZS5wbD9pZD0xJnN0b3J5X25hbWU9ZG9jOTk3OS5zaHRtbD4KKyMgaHR0cDovL2VuZy5nYXRld2F5LmtnL2NnaS1iaW4vcGFnZS5wbD9pZD0xJnN0b3J5X25hbWU9ZG9jOTk3OS5zaHRtbAogIyBLeXJneXpzdGFuIGlzIGNhbmNlbGluZyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgc3lzdGVtLiAgSSB0YWtlIHRoZSBhcnRpY2xlCiAjIHRvIG1lYW4gdGhhdCB0aGV5IHdpbGwgbGVhdmUgdGhlaXIgY2xvY2tzIGF0IDYgaG91cnMgYWhlYWQgb2YgVVRDLgogIyBGcm9tIE1hbGlrIEFiZHVnYWxpZXYgKDIwMDUtMDktMjEpOgpAQCAtMTU1OCwxNyArMTY3NSwxNyBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0Jpc2hrZWsJNDo1ODoyNCAtCUxNVAkxOTI0IE1heSAgMgogCQkJNTowMAktCUZSVVQJMTkzMCBKdW4gMjEgIyBGcnVuemUgVGltZQotCQkJNjowMCBSdXNzaWFBc2lhIEZSVSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJNTowMAkxOjAwCUZSVVNUCTE5OTEgQXVnIDMxIDI6MDAgIyBpbmRlcGVuZGVuY2UKLQkJCTU6MDAJS3lyZ3l6CUtHJXNUCTIwMDUgQXVnIDEyICAgICMgS3lyZ3l6c3RhbiBUaW1lCisJCQk2OjAwIFJ1c3NpYUFzaWEgRlJVJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJNTowMAkxOjAwCUZSVVNUCTE5OTEgQXVnIDMxICAyOjAwICMgaW5kZXBlbmRlbmNlCisJCQk1OjAwCUt5cmd5eglLRyVzVAkyMDA1IEF1ZyAxMiAjIEt5cmd5enN0YW4gVGltZQogCQkJNjowMAktCUtHVAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgS29yZWEgKE5vcnRoIGFuZCBTb3V0aCkKIAotIyBGcm9tIEFubmllIEkuIEJhbmcgKDIwMDYtMDctMTApIGluCi0jIDxodHRwOi8vd3d3LmtvcmVhaGVyYWxkLmNvLmtyL1NJVEUvZGF0YS9odG1sX2Rpci8yMDA2LzA3LzEwLzIwMDYwNzEwMDAxMi5hc3A+OgorIyBGcm9tIEFubmllIEkuIEJhbmcgKDIwMDYtMDctMTApOgorIyBodHRwOi8vd3d3LmtvcmVhaGVyYWxkLmNvLmtyL1NJVEUvZGF0YS9odG1sX2Rpci8yMDA2LzA3LzEwLzIwMDYwNzEwMDAxMi5hc3AKICMgVGhlIE1pbmlzdHJ5IG9mIENvbW1lcmNlLCBJbmR1c3RyeSBhbmQgRW5lcmd5IGhhcyBhbHJlYWR5CiAjIGNvbW1pc3Npb25lZCBhIHJlc2VhcmNoIHByb2plY3QgW3RvIHJlaW50cm9kdWNlIERTVF0gYW5kIGhhcyBzYWlkCiAjIHRoZSBzeXN0ZW0gbWF5IGJlZ2luIGFzIGVhcmx5IGFzIDIwMDguLi4uICBLb3JlYSByYW4gYSBkYXlsaWdodApAQCAtMTU4MSwxOSArMTY5OCwyOSBAQAogUnVsZQlST0sJMTk4NwkxOTg4CS0JTWF5CVN1bj49OAkwOjAwCTE6MDAJRAogUnVsZQlST0sJMTk4NwkxOTg4CS0JT2N0CVN1bj49OAkwOjAwCTAJUwogCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMDEpOgorIyBUaGUgZm9sbG93aW5nIGVudHJpZXMgYXJlIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLCBleGNlcHQgdGhhdCBJCisjIGd1ZXNzZWQgdGhhdCB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyB0aHJvdWdoIDE5NDUgZm9sbG93ZWQgdGhlIHNhbWUKKyMgcnVsZXMgYXMgZGlzY3Vzc2VkIHVuZGVyIFRhaXdhbiwgd2l0aCBub21pbmFsIHN3aXRjaGVzIGZyb20gSlNUIHRvIEtTVAorIyB3aGVuIHRoZSByZXNwZWN0aXZlIGNpdGllcyB3ZXJlIHRha2VuIG92ZXIgYnkgdGhlIEFsbGllcyBhZnRlciBXV0lJLgorCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvU2VvdWwJODoyNzo1MgktCUxNVAkxODkwCiAJCQk4OjMwCS0JS1NUCTE5MDQgRGVjCi0JCQk5OjAwCS0JS1NUCTE5MjgKKwkJCTk6MDAJLQlKQ1NUCTE5MjgKIAkJCTg6MzAJLQlLU1QJMTkzMgorCQkJOTowMAktCUpDU1QJMTkzNyBPY3QgIDEKKwkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgIDgKIAkJCTk6MDAJLQlLU1QJMTk1NCBNYXIgMjEKIAkJCTg6MDAJUk9LCUslc1QJMTk2MSBBdWcgMTAKIAkJCTg6MzAJLQlLU1QJMTk2OCBPY3QKIAkJCTk6MDAJUk9LCUslc1QKIFpvbmUJQXNpYS9QeW9uZ3lhbmcJODoyMzowMCAtCUxNVAkxODkwCiAJCQk4OjMwCS0JS1NUCTE5MDQgRGVjCi0JCQk5OjAwCS0JS1NUCTE5MjgKKwkJCTk6MDAJLQlKQ1NUCTE5MjgKIAkJCTg6MzAJLQlLU1QJMTkzMgorCQkJOTowMAktCUpDU1QJMTkzNyBPY3QgIDEKKwkJCTk6MDAJLQlKU1QJMTk0NSBBdWcgMjQKIAkJCTk6MDAJLQlLU1QJMTk1NCBNYXIgMjEKIAkJCTg6MDAJLQlLU1QJMTk2MSBBdWcgMTAKIAkJCTk6MDAJLQlLU1QKQEAgLTE2MDIsMjEgKzE3MjksMTMgQEAKIAogIyBLdXdhaXQKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgRnJvbSB0aGUgQXJhYiBUaW1lcyAoMjAwNy0wMy0xNCk6Ci0jIFRoZSBDaXZpbCBTZXJ2aWNlIENvbW1pc3Npb24gKENTQykgaGFzIGFwcHJvdmVkIGEgcHJvcG9zYWwgZm9yd2FyZGVkCi0jIGJ5IE1QIEFobWFkIEJhcWVyIG9uIGltcGxlbWVudGluZyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgKERTVCkgaW4KLSMgS3V3YWl0IHN0YXJ0aW5nIGZyb20gQXByaWwgdW50aWwgdGhlIGVuZCBvZiBTZXB0IHRoaXMgeWVhciwgcmVwb3J0cyBBbC1BbmJhLgotIyA8aHR0cDovL3d3dy5hcmFidGltZXNvbmxpbmUuY29tL2FyYWJ0aW1lcy9rdXdhaXQvVmlld2RldC5hc3A/SUQ9OTk1MD4uCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDMtMjkpOgotIyBXZSBkb24ndCBrbm93IHRoZSBkZXRhaWxzLCBvciB3aGV0aGVyIHRoZSBhcHByb3ZhbCBtZWFucyBpdCdsbCBoYXBwZW4sCi0jIHNvIGZvciBub3cgd2UgYXNzdW1lIG5vIERTVC4KIFpvbmUJQXNpYS9LdXdhaXQJMzoxMTo1NiAtCUxNVAkxOTUwCiAJCQkzOjAwCS0JQVNUCiAKICMgTGFvcwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1ZpZW50aWFuZQk2OjUwOjI0IC0JTE1UCTE5MDYgSnVuICA5ICMgb3IgVmlhbmdjaGFuCi0JCQk3OjA2OjIwCS0JU01UCTE5MTEgTWFyIDExIDA6MDEgIyBTYWlnb24gTVQ/Citab25lCUFzaWEvVmllbnRpYW5lCTY6NTA6MjQgLQlMTVQJMTkwNiBKdW4gIDkgICAgICAgIyBvciBWaWFuZ2NoYW4KKwkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgIDA6MDEgIyBTYWlnb24gTVQ/CiAJCQk3OjAwCS0JSUNUCTE5MTIgTWF5CiAJCQk4OjAwCS0JSUNUCTE5MzEgTWF5CiAJCQk3OjAwCS0JSUNUCkBAIC0xNjU3LDggKzE3NzYsOCBAQAogUnVsZQlOQm9ybmVvCTE5MzUJMTk0MQktCURlYwkxNAkwOjAwCTAJLQogIwogIyBwZW5pbnN1bGFyIE1hbGF5c2lhCi0jIFRoZSBkYXRhIGhlcmUgYXJlIHRha2VuIGZyb20gTW9rIEx5IFluZyAoMjAwMy0xMC0zMCkKLSMgPGh0dHA6Ly93d3cubWF0aC5udXMuZWR1LnNnL2FzbGFrc2VuL3RlYWNoaW5nL3RpbWV6b25lLmh0bWw+LgorIyB0YWtlbiBmcm9tIE1vayBMeSBZbmcgKDIwMDMtMTAtMzApCisjIGh0dHA6Ly93d3cubWF0aC5udXMuZWR1LnNnL2FzbGFrc2VuL3RlYWNoaW5nL3RpbWV6b25lLmh0bWwKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQXNpYS9LdWFsYV9MdW1wdXIJNjo0Njo0NiAtCUxNVAkxOTAxIEphbiAgMQogCQkJNjo1NToyNQktCVNNVAkxOTA1IEp1biAgMSAjIFNpbmdhcG9yZSBNLlQuCkBAIC0xNjcwLDEyICsxNzg5LDEyIEBACiAJCQk3OjMwCS0JTUFMVAkxOTgyIEphbiAgMQogCQkJODowMAktCU1ZVAkjIE1hbGF5c2lhIFRpbWUKICMgU2FiYWggJiBTYXJhd2FrCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBUaGUgZGF0YSBoZXJlIGFyZSBtb3N0bHkgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIsIGJ1dCB0aGUgMTk0MiwgMTk0NSBhbmQgMTk4MgotIyB0cmFuc2l0aW9uIGRhdGVzIGFyZSBmcm9tIE1vayBMeSBZbmcuCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDgtMTIpOgorIyBUaGUgZGF0YSBlbnRyaWVzIGhlcmUgYXJlIG1vc3RseSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlciwgYnV0IHRoZSAxOTQyLCAxOTQ1CisjIGFuZCAxOTgyIHRyYW5zaXRpb24gZGF0ZXMgYXJlIGZyb20gTW9rIEx5IFluZy4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQXNpYS9LdWNoaW5nCTc6MjE6MjAJLQlMTVQJMTkyNiBNYXIKLQkJCTc6MzAJLQlCT1JUCTE5MzMJIyBCb3JuZW8gVGltZQorCQkJNzozMAktCUJPUlQJMTkzMyAgICAgICAgIyBCb3JuZW8gVGltZQogCQkJODowMAlOQm9ybmVvCUJPUiVzVAkxOTQyIEZlYiAxNgogCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAxMgogCQkJODowMAktCUJPUlQJMTk4MiBKYW4gIDEKQEAgLTE2ODMsMjIgKzE4MDIsMjEgQEAKIAogIyBNYWxkaXZlcwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlJbmRpYW4vTWFsZGl2ZXMJNDo1NDowMCAtCUxNVAkxODgwCSMgTWFsZQotCQkJNDo1NDowMAktCU1NVAkxOTYwCSMgTWFsZSBNZWFuIFRpbWUKLQkJCTU6MDAJLQlNVlQJCSMgTWFsZGl2ZXMgVGltZQorWm9uZQlJbmRpYW4vTWFsZGl2ZXMJNDo1NDowMCAtCUxNVAkxODgwICMgTWFsZQorCQkJNDo1NDowMAktCU1NVAkxOTYwICMgTWFsZSBNZWFuIFRpbWUKKwkJCTU6MDAJLQlNVlQJIyBNYWxkaXZlcyBUaW1lCiAKICMgTW9uZ29saWEKIAogIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgTW9uZ29saWEgaGFzIHRocmVlIHRpbWUgem9uZXMsIGJ1dAotIyB1c25vMTk5NSBhbmQgdGhlIENJQSBtYXAgU3RhbmRhcmQgVGltZSBab25lcyBvZiB0aGUgV29ybGQgKDIwMDUtMDMpCi0jIGJvdGggc2F5IHRoYXQgaXQgaGFzIGp1c3Qgb25lLgorIyBUaGUgVVNOTyAoMTk5NS0xMi0yMSkgYW5kIHRoZSBDSUEgbWFwIFN0YW5kYXJkIFRpbWUgWm9uZXMgb2YgdGhlIFdvcmxkCisjICgyMDA1LTAzKSBib3RoIHNheSB0aGF0IGl0IGhhcyBqdXN0IG9uZS4KIAogIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgxOTk5LTEyLTExKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tb25nb2xpYXRvdXJpc20uZ292Lm1uL2dlbmVyYWwuaHRtIj4KICMgR2VuZXJhbCBJbmZvcm1hdGlvbiBNb25nb2xpYQotIyA8L2E+ICgxOTk5LTA5KQorIyA8aHR0cDovL3d3dy5tb25nb2xpYXRvdXJpc20uZ292Lm1uL2dlbmVyYWwuaHRtPiAoMTk5OS0wOSkKICMgIlRpbWU6IE1vbmdvbGlhIGhhcyB0d28gdGltZSB6b25lcy4gVGhyZWUgd2VzdGVybm1vc3QgcHJvdmluY2VzIG9mCi0jIEJheWFuLVVsZ2lpLCBVdnMsIGFuZCBIb3ZkIGFyZSBvbmUgaG91ciBlYXJsaWVyIHRoYW4gdGhlIGNhcGl0YWwgY2l0eSwgYW5kCisjIEJheWFuLcOWbGdpaSwgVXZzLCBhbmQgSG92ZCBhcmUgb25lIGhvdXIgZWFybGllciB0aGFuIHRoZSBjYXBpdGFsIGNpdHksIGFuZAogIyB0aGUgcmVzdCBvZiB0aGUgY291bnRyeSBmb2xsb3dzIHRoZSBVbGFhbmJhYXRhciB0aW1lLCB3aGljaCBpcyBVVEMvR01UIHBsdXMKICMgZWlnaHQgaG91cnMuIgogCkBAIC0xNzA5LDcgKzE4MjcsNyBAQAogIyBvZiBpbXBsZW1lbnRhdGlvbiBtYXkgaGF2ZSBiZWVuIGRpZmZlcmVudC4uLi4KICMgU29tZSBtYXBzIGluIHRoZSBwYXN0IGhhdmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIGFuIGFkZGl0aW9uYWwgdGltZQogIyB6b25lIGluIHRoZSBlYXN0ZXJuIHBhcnQgb2YgTW9uZ29saWEsIGluY2x1ZGluZyB0aGUgcHJvdmluY2VzIG9mIERvcm5vZCwKLSMgU3VoYmFhdGFyLCBhbmQgcG9zc2libHkgS2hlbnRpai4KKyMgU8O8a2hiYWF0YXIsIGFuZCBwb3NzaWJseSBLaGVudGlpLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTItMTUpOgogIyBOYW1pbmcgYW5kIHNwZWxsaW5nIGlzIHRyaWNreSBpbiBNb25nb2xpYS4KQEAgLTE3MjMsMTAgKzE4NDEsMTAgQEAKICMgKGFkb3B0ZWQgRFNUIG9uIDIwMDEtMDQtMjcgMDI6MDAgbG9jYWwgdGltZSwgZW5kaW5nIDIwMDEtMDktMjgpLAogIyB0aGVyZSBhcmUgdGhyZWUgdGltZSB6b25lcy4KICMKLSMgUHJvdmluY2VzIFthdCA3OjAwXTogQmF5YW4tdWxnaWksIFV2cywgS2hvdmQsIFphdmtoYW4sIEdvdmktQWx0YWkKLSMgUHJvdmluY2VzIFthdCA4OjAwXTogS2hvdnNnb2wsIEJ1bGdhbiwgQXJraGFuZ2FpLCBLaGVudGlpLCBUb3YsCi0jCUJheWFua2hvbmdvciwgT3ZvcmtoYW5nYWksIER1bmRnb3ZpLCBEb3Jub2dvdmksIE9tbm9nb3ZpCi0jIFByb3ZpbmNlcyBbYXQgOTowMF06IERvcm5vZCwgU3VraGJhYXRhcgorIyBQcm92aW5jZXMgW2F0IDc6MDBdOiBCYXlhbi3DlmxnaWksIFV2cywgS2hvdmQsIFphdmtoYW4sIEdvdmktQWx0YWkKKyMgUHJvdmluY2VzIFthdCA4OjAwXTogS2jDtnZzZ8O2bCwgQnVsZ2FuLCBBcmtoYW5nYWksIEtoZW50aWksIFTDtnYsCisjCUJheWFua2hvbmdvciwgw5Z2w7Zya2hhbmdhaSwgRHVuZGdvdmksIERvcm5vZ292aSwgw5ZtbsO2Z292aQorIyBQcm92aW5jZXMgW2F0IDk6MDBdOiBEb3Jub2QsIFPDvGtoYmFhdGFyCiAjCiAjIFtUaGUgcHJvdmluY2Ugb2YgU2VsZW5nZSBpcyBvbWl0dGVkIGZyb20gdGhlIGFib3ZlIGxpc3RzLl0KIApAQCAtMTc0MywxNiArMTg2MSwxNiBAQAogIyBXZSBoYXZlIHdpbGRseSBjb25mbGljdGluZyBpbmZvcm1hdGlvbiBhYm91dCBNb25nb2xpYSdzIHRpbWUgem9uZXMuCiAjIEJpbGwgQm9ubmV0ICgyMDA1LTA1LTE5KSByZXBvcnRzIHRoYXQgdGhlIFVTIEVtYmFzc3kgaW4gVWxhYW5iYWF0YXIgc2F5cwogIyB0aGVyZSBpcyBvbmx5IG9uZSB0aW1lIHpvbmUgYW5kIHRoYXQgRFNUIGlzIG9ic2VydmVkLCBjaXRpbmcgTWljcm9zb2Z0Ci0jIFdpbmRvd3MgWFAgYXMgdGhlIHNvdXJjZS4gIFJpc3RvIE55a2FuZW4gKDIwMDUtMDUtMTYpIHJlcG9ydHMgdGhhdAorIyBXaW5kb3dzIFhQIGFzIHRoZSBzb3VyY2UuICBSaXN0byBOeWvDpG5lbiAoMjAwNS0wNS0xNikgcmVwb3J0cyB0aGF0CiAjIHRyYXZlbG1vbmdvbGlhLm9yZyBzYXlzIHRoZXJlIGFyZSB0d28gdGltZSB6b25lcyAoVVRDKzcsIFVUQys4KSB3aXRoIG5vIERTVC4KICMgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDUtMDUtMjApIHJlcG9ydHMgdGhhdCB0aGUgTW9uZ29saWFuIEVtYmFzc3kgaW4KICMgV2FzaGluZ3RvbiwgREMgc2F5cyB0aGVyZSBhcmUgdHdvIHRpbWUgem9uZXMsIHdpdGggRFNUIG9ic2VydmVkLgogIyBIZSBhbHNvIGZvdW5kCi0jIDxodHRwOi8vdWJwb3N0Lm1vbmdvbG5ld3MubW4vaW5kZXgucGhwP3N1YmFjdGlvbj1zaG93Y29tbWVudHMmaWQ9MTExMTYzNDg5NCZhcmNoaXZlPSZzdGFydF9mcm9tPSZ1Y2F0PTEmPgorIyBodHRwOi8vdWJwb3N0Lm1vbmdvbG5ld3MubW4vaW5kZXgucGhwP3N1YmFjdGlvbj1zaG93Y29tbWVudHMmaWQ9MTExMTYzNDg5NCZhcmNoaXZlPSZzdGFydF9mcm9tPSZ1Y2F0PTEmCiAjIHdoaWNoIGFsc28gc2F5cyB0aGF0IHRoZXJlIGlzIERTVCwgYW5kIHdoaWNoIGhhcyBhIGNvbW1lbnQgYnkgIlRvZGRpdXMiCiAjICgyMDA1LTAzLTMxIDA2OjA1ICswNzAwKSBzYXlpbmcgIk1vbmdvbGlhIGFjdHVhbGx5IGhhcyAzLjUgdGltZSB6b25lcy4KICMgVGhlIFdlc3QgKE9MR0lJKSBpcyArNyBHTVQsIG1vc3Qgb2YgdGhlIGNvdW50cnkgaXMgVUxBVCBpcyArOCBHTVQKLSMgYW5kIHNvbWUgRWFzdGVybiBwcm92aW5jZXMgYXJlICs5IEdNVCBidXQgU3VraGJhYXRhciBBaW1hZyBpcyBTVUhLICs4LjUgR01ULgorIyBhbmQgc29tZSBFYXN0ZXJuIHByb3ZpbmNlcyBhcmUgKzkgR01UIGJ1dCBTw7xraGJhYXRhciBBaW1hZyBpcyBTVUhLICs4LjUgR01ULgogIyBUaGUgU1VLSCB0aW1lem9uZSBpcyBuZXcgdGhpcyB5ZWFyLCBpdCBpcyBvbmUgb2YgdGhlIGZldyB0aGluZ3MgdGhlCiAjIHBhcmxpYW1lbnQgcGFzc2VkIGR1cmluZyB0aGUgdHVtdWx0dW91cyB3aW50ZXIgc2Vzc2lvbi4iCiAjIEZvciBub3csIGxldCdzIGlnbm9yZSB0aGlzIGluZm9ybWF0aW9uLCB1bnRpbCB3ZSBoYXZlIG1vcmUgY29uZmlybWF0aW9uLgpAQCAtMTc2OCwyOSArMTg4NiwyMyBAQAogIyArMDg6MDAgaW5zdGVhZC4gRGlmZmVyZW50IHNvdXJjZXMgYXBwZWFyIHRvIGRpc2FncmVlIHdpdGggdGhlIHR6CiAjIGRhdGFiYXNlIG9uIHRoaXMsIGUuZy46CiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249MTAyNiI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249MTAyNgotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lc2VydmVyLmNvbS9jdXJyZW50X3RpbWVfaW5fTU4uYXNweCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lc2VydmVyLmNvbS9jdXJyZW50X3RpbWVfaW5fTU4uYXNweAotIyA8L2E+CiAjCiAjIGJvdGggc2F5IEdNVCswODowMC4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wMy0zMSk6CiAjIGV6bmlzIGFpcndheXMsIHdoaWNoIG9wZXJhdGVzIHNldmVyYWwgZG9tZXN0aWMgZmxpZ2h0cywgaGFzIGEgZmxpZ2h0CiAjIHNjaGVkdWxlIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXpuaXMuY29tL0NvbnRhaW5lci5qc3A/aWQ9MTEyIj4KICMgaHR0cDovL3d3dy5lem5pcy5jb20vQ29udGFpbmVyLmpzcD9pZD0xMTIKLSMgPC9hPgogIyAoY2xpY2sgdGhlIEVuZ2xpc2ggZmxhZyBmb3IgRW5nbGlzaCkKICMKLSMgVGhlcmUgaXQgYXBwZWFycyB0aGF0IGZsaWdodHMgYmV0d2VlbiBDaG9pYmFsc2FuIGFuZCBVbGFhbmJhdGFyIGFycml2ZQorIyBUaGVyZSBpdCBhcHBlYXJzIHRoYXQgZmxpZ2h0cyBiZXR3ZWVuIENob2liYWxzYW4gYW5kIFVsYWFuYmFhdGFyIGFycml2ZQogIyBhYm91dCAxOjM1IC0gMTo1MCBob3VycyBsYXRlciBpbiBsb2NhbCBjbG9jayB0aW1lLCBubyBtYXR0ZXIgdGhlCi0jIGRpcmVjdGlvbiwgd2hpbGUgVWxhYW5iYWF0YXItS2h2b2QgdGFrZXMgMiBob3VycyBpbiB0aGUgRWFzdGVybgotIyBkaXJlY3Rpb24gYW5kIDM6MzUgYmFjaywgd2hpY2ggaW5kaWNhdGVzIHRoYXQgVWxhYW5iYXRhciBhbmQgS2h2b2QgYXJlCisjIGRpcmVjdGlvbiwgd2hpbGUgVWxhYW5iYWF0YXItS2hvdmQgdGFrZXMgMiBob3VycyBpbiB0aGUgRWFzdGVybgorIyBkaXJlY3Rpb24gYW5kIDM6MzUgYmFjaywgd2hpY2ggaW5kaWNhdGVzIHRoYXQgVWxhYW5iYWF0YXIgYW5kIEtob3ZkIGFyZQogIyBpbiBkaWZmZXJlbnQgdGltZSB6b25lcyAobGlrZSB3ZSBrbm93IGFib3V0KSwgd2hpbGUgQ2hvaWJhbHNhbiBhbmQKLSMgVWxhYW5iYXRhciBhcmUgaW4gdGhlIHNhbWUgdGltZSB6b25lIChjb3JyZWN0aW9uIG5lZWRlZCkuCisjIFVsYWFuYmFhdGFyIGFyZSBpbiB0aGUgc2FtZSB0aW1lIHpvbmUgKGNvcnJlY3Rpb24gbmVlZGVkKS4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wNS0xOSk6CiAjIEFzc3VtZSB0aGF0IENob2liYWxzYW4gaXMgaW5kZWVkIG9mZnNldCBieSA4OjAwLgpAQCAtMTgwNiw3ICsxOTE4LDcgQEAKICMgKDE5OTYtMDkpIHNheXMgMTk5Ni0xMC0yNS4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIHRocm91Z2ggMTk5OC4KICMKICMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0IHRoZSBTZXB0LiAxOTg0IHRocm91Z2ggU2VwdC4gMTk5MCBzd2l0Y2hlcwotIyBpbiBDaG9pYmFsc2FuIChtb3JlIHByZWNpc2VseSwgaW4gRG9ybm9kIGFuZCBTdWtoYmFhdGFyKSB0b29rIHBsYWNlCisjIGluIENob2liYWxzYW4gKG1vcmUgcHJlY2lzZWx5LCBpbiBEb3Jub2QgYW5kIFPDvGtoYmFhdGFyKSB0b29rIHBsYWNlCiAjIGF0IDAyOjAwIHN0YW5kYXJkIHRpbWUsIG5vdCBhdCAwMDowMCBsb2NhbCB0aW1lIGFzIGluIHRoZSByZXN0IG9mCiAjIHRoZSBjb3VudHJ5LiAgVGhhdCB3b3VsZCBiZSBvZGQsIGFuZCBwb3NzaWJseSBpcyBhIHJlc3VsdCBvZiB0aGVpcgogIyBjb3JyZWN0aW9uIG9mIDAyOjAwIChpbiB0aGUgcHJldmlvdXMgZWRpdGlvbikgbm90IGJlaW5nIGRvbmUgY29ycmVjdGx5CkBAIC0xODIyLDEzICsxOTM0LDEzIEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiAjIEhvdmQsIGEuay5hLiBDaG92ZCwgRHVuZC1VcywgRHpoYXJnYWxhbnQsIEtob3ZkLCBKaXJnYWxhbnRhCiBab25lCUFzaWEvSG92ZAk2OjA2OjM2IC0JTE1UCTE5MDUgQXVnCi0JCQk2OjAwCS0JSE9WVAkxOTc4CSMgSG92ZCBUaW1lCisJCQk2OjAwCS0JSE9WVAkxOTc4ICAgICAjIEhvdmQgVGltZQogCQkJNzowMAlNb25nb2wJSE9WJXNUCiAjIFVsYWFuYmFhdGFyLCBhLmsuYS4gVWxhbiBCYXRhYXIsIFVsYW4gQmF0b3IsIFVyZ2EKIFpvbmUJQXNpYS9VbGFhbmJhYXRhciA3OjA3OjMyIC0JTE1UCTE5MDUgQXVnCi0JCQk3OjAwCS0JVUxBVAkxOTc4CSMgVWxhYW5iYWF0YXIgVGltZQorCQkJNzowMAktCVVMQVQJMTk3OCAgICAgIyBVbGFhbmJhYXRhciBUaW1lCiAJCQk4OjAwCU1vbmdvbAlVTEElc1QKLSMgQ2hvaWJhbHNhbiwgYS5rLmEuIEJhamFuIFR1ZW1lbiwgQmFqYW4gVHVtZW4sIENob2piYWxzYW4sCisjIENob2liYWxzYW4sIGEuay5hLiBCYWphbiBUw7xtZW4sIEJhamFuIFR1bWVuLCBDaG9qYmFsc2FuLAogIyBDaG95YmFsc2FuLCBTYW5iZWpzZSwgVGNob2liYWxzYW4KIFpvbmUJQXNpYS9DaG9pYmFsc2FuCTc6Mzg6MDAgLQlMTVQJMTkwNSBBdWcKIAkJCTc6MDAJLQlVTEFUCTE5NzgKQEAgLTE4NjAsNyArMTk3Miw3IEBACiAjIDAwOjAxIHdhcyB0byBtYWtlIGl0IGNsZWFyIHdoaWNoIGRheSBpdCB3YXMgb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMi0wMy0xNSk6Ci0jIEplc3BlciBOb3JnYWFyZCBmb3VuZCB0aGlzIFVSTDoKKyMgSmVzcGVyIE7DuHJnYWFyZCBmb3VuZCB0aGlzIFVSTDoKICMgaHR0cDovL3d3dy5wYWsuZ292LnBrL3B1YmxpYy9uZXdzL2FwcC9hcHAwNl9kZWMuaHRtCiAjIChkYXRlZCAyMDAxLTEyLTA2KSB3aGljaCBzYXlzIHRoYXQgdGhlIENhYmluZXQgYWRvcHRlZCBhIHNjaGVtZSAidG8KICMgYWR2YW5jZSB0aGUgY2xvY2tzIGJ5IG9uZSBob3VyIG9uIHRoZSBuaWdodCBiZXR3ZWVuIHRoZSBmaXJzdApAQCAtMTg5Miw0MyArMjAwNCwzMCBAQAogIyBIZXJlIGlzIGFuIGFydGljbGUgdGhhdCBQYWtpc3RhbiBwbGFuIHRvIGludHJvZHVjZSBEYXlsaWdodCBTYXZpbmcgVGltZQogIyBvbiBKdW5lIDEsIDIwMDggZm9yIDMgbW9udGhzLgogIwotIyAiLi4uIFRoZSBmZWRlcmFsIGNhYmluZXQgb24gV2VkbmVzZGF5IGFubm91bmNlZCBhIG5ldyBjb25zZXJ2YXRpb24gcGxhbiB0byBoZWxwCi0jIHJlZHVjZSBsb2FkIHNoZWRkaW5nIGJ5IGFwcHJvdmluZyB0aGUgY2xvc3VyZSBvZiBjb21tZXJjaWFsIGNlbnRyZXMgYXQgOXBtIGFuZAotIyBtb3ZpbmcgY2xvY2tzIGZvcndhcmQgYnkgb25lIGhvdXIgZm9yIHRoZSBuZXh0IHRocmVlIG1vbnRocy4KLSMgLi4uLiIKKyMgIi4uLiBUaGUgZmVkZXJhbCBjYWJpbmV0IG9uIFdlZG5lc2RheSBhbm5vdW5jZWQgYSBuZXcgY29uc2VydmF0aW9uIHBsYW4gdG8KKyMgaGVscCByZWR1Y2UgbG9hZCBzaGVkZGluZyBieSBhcHByb3ZpbmcgdGhlIGNsb3N1cmUgb2YgY29tbWVyY2lhbCBjZW50cmVzIGF0CisjIDlwbSBhbmQgbW92aW5nIGNsb2NrcyBmb3J3YXJkIGJ5IG9uZSBob3VyIGZvciB0aGUgbmV4dCB0aHJlZSBtb250aHMuIC4uLi4iCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wMS5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjAxLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRhaWx5dGltZXMuY29tLnBrL2RlZmF1bHQuYXNwP3BhZ2U9MjAwOCU1QzA1JTVDMTUlNUNzdG9yeV8xNS01LTIwMDhfcGcxXzQiPgogIyBodHRwOi8vd3d3LmRhaWx5dGltZXMuY29tLnBrL2RlZmF1bHQuYXNwP3BhZ2U9MjAwOCU1QzA1JTVDMTUlNUNzdG9yeV8xNS01LTIwMDhfcGcxXzQKLSMgPC9hPgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA1LTE5KToKICMgWFhYLS1taWRuaWdodCB0cmFuc2l0aW9ucyBpcyBhIGd1ZXNzOyAyMDA4IG9ubHkgaXMgYSBndWVzcy4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOC0wOC0yOCk6CiAjIFBha2lzdGFuIGdvdmVybm1lbnQgaGFzIGRlY2lkZWQgdG8ga2VlcCB0aGUgd2F0Y2hlcyBvbmUtaG91ciBhZHZhbmNlZAotIyBmb3IgYW5vdGhlciAyIG1vbnRocy0tcGxhbiB0byByZXR1cm4gdG8gU3RhbmRhcmQgVGltZSBvbiBPY3RvYmVyIDMxCisjIGZvciBhbm90aGVyIDIgbW9udGhzIC0gcGxhbiB0byByZXR1cm4gdG8gU3RhbmRhcmQgVGltZSBvbiBPY3RvYmVyIDMxCiAjIGluc3RlYWQgb2YgQXVndXN0IDMxLgogIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDIuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wMi5odG1sCi0jIDwvYT4KLSMgT1IKLSMgPGEgaHJlZj0iaHR0cDovL2RhaWx5bWFpbG5ld3MuY29tLzIwMDgwOC8yOC9uZXdzL2RtYnJuMDMuaHRtbCI+CiAjIGh0dHA6Ly9kYWlseW1haWxuZXdzLmNvbS8yMDA4MDgvMjgvbmV3cy9kbWJybjAzLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTA0LTA4KToKICMgQmFzZWQgb24gcHJldmlvdXMgbWVkaWEgcmVwb3J0cyB0aGF0ICIuLi4gcHJvcG9zZWQgcGxhbiB0bwogIyBhZHZhbmNlIGNsb2NrcyBieSBvbmUgaG91ciBmcm9tIE1heSAxIHdpbGwgY2F1c2UgZGlzdHVyYmFuY2UKICMgdG8gdGhlIHdvcmtpbmcgc2NoZWR1bGVzIHJhdGhlciB0aGFuIGJyaW5naW5nIGRpc2NpcGxpbmUgaW4KICMgb2ZmaWNpYWwgd29ya2luZy4iCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvZGFpbHlfZGV0YWlsLmFzcD9pZD0xNzEyODAiPgogIyBodHRwOi8vd3d3LnRoZW5ld3MuY29tLnBrL2RhaWx5X2RldGFpbC5hc3A/aWQ9MTcxMjgwCi0jIDwvYT4KICMKICMgcmVjZW50IG5ld3MgdGhhdCBpbnN0ZWFkIG9mIE1heSAyMDA5IC0gUGFraXN0YW4gcGxhbiB0bwogIyBpbnRyb2R1Y2UgRFNUIGZyb20gQXByaWwgMTUsIDIwMDkKQEAgLTE5MzYsMTUgKzIwMzUsOCBAQAogIyBGWUk6IEFzc29jaWF0ZWQgUHJlc3MgT2YgUGFraXN0YW4KICMgQXByaWwgMDgsIDIwMDkKICMgQ2FiaW5ldCBva2F5cyBwcm9wb3NhbCB0byBhZHZhbmNlIGNsb2NrcyBieSBvbmUgaG91ciBmcm9tIEFwcmlsIDE1Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBwLmNvbS5way9lbl8vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NzMwNDMmSXRlbWlkPTEiPgogIyBodHRwOi8vd3d3LmFwcC5jb20ucGsvZW5fL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTczMDQzJkl0ZW1pZD0xCi0jIDwvYT4KLSMKLSMgb3IKLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjA1Lmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDUuaHRtbAotIyA8L2E+CiAjCiAjIC4uLi4KICMgVGhlIEZlZGVyYWwgQ2FiaW5ldCBvbiBXZWRuZXNkYXkgYXBwcm92ZWQgdGhlIHByb3Bvc2FsIHRvCkBAIC0xOTU3LDM0ICsyMDQ5LDIwIEBACiAjIGNsb2NrcyBiYWNrd2FyZCBieSBvbmUgaG91ciBmcm9tIE9jdG9iZXIgMS4gQSBmb3JtYWwgYW5ub3VuY2VtZW50IHRvCiAjIHRoaXMgZWZmZWN0IHdpbGwgYmUgbWFkZSBhZnRlciB0aGUgUHJpbWUgTWluaXN0ZXIgZ3JhbnRzIGFwcHJvdmFsIGluCiAjIHRoaXMgcmVnYXJkLiIKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGVuZXdzLmNvbS5way91cGRhdGVzLmFzcD9pZD04NzE2OCI+CiAjIGh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvdXBkYXRlcy5hc3A/aWQ9ODcxNjgKLSMgPC9hPgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTA5LTI4KToKICMgQWNjb3JkaW5nIHRvIEFzc29jaWF0ZWQgUHJlc3MgT2YgUGFraXN0YW4sIGl0IGlzIGNvbmZpcm1lZCB0aGF0Ci0jIFBha2lzdGFuIGNsb2NrcyBhY3Jvc3MgdGhlIGNvdW50cnkgd291bGQgYmUgdHVybmVkIGJhY2sgYnkgYW4gaG91ciBmcm9tIE9jdG9iZXIKLSMgMSwgMjAwOS4KKyMgUGFraXN0YW4gY2xvY2tzIGFjcm9zcyB0aGUgY291bnRyeSB3b3VsZCBiZSB0dXJuZWQgYmFjayBieSBhbiBob3VyIGZyb20KKyMgT2N0b2JlciAxLCAyMDA5LgogIwogIyAiQ2xvY2tzIHRvIGdvIGJhY2sgb25lIGhvdXIgZnJvbSAxIE9jdCIKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD04NjcxNSZJdGVtaWQ9MiI+CiAjIGh0dHA6Ly93d3cuYXBwLmNvbS5way9lbl8vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9ODY3MTUmSXRlbWlkPTIKLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDcuaHRtIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjA3Lmh0bQotIyA8L2E+Ci0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDktMjkpOgotIyBBbGV4YW5kZXIgS3JpdmVueXNoZXYgd3JvdGU6Ci0jID4gQWNjb3JkaW5nIHRvIEFzc29jaWF0ZWQgUHJlc3MgT2YgUGFraXN0YW4sIGl0IGlzIGNvbmZpcm1lZCB0aGF0Ci0jID4gUGFraXN0YW4gY2xvY2tzIGFjcm9zcyB0aGUgY291bnRyeSB3b3VsZCBiZSB0dXJuZWQgYmFjayBieSBhbiBob3VyIGZyb20gT2N0b2JlcgotIyA+IDEsIDIwMDkuCiAjCisjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA5LTI5KToKICMgTm93IHRoZXkgc2VlbSB0byBoYXZlIGNoYW5nZWQgdGhlaXIgbWluZCwgTm92ZW1iZXIgMSBpcyB0aGUgbmV3IGRhdGU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvdG9wX3N0b3J5X2RldGFpbC5hc3A/SWQ9MjQ3NDIiPgogIyBodHRwOi8vd3d3LnRoZW5ld3MuY29tLnBrL3RvcF9zdG9yeV9kZXRhaWwuYXNwP0lkPTI0NzQyCi0jIDwvYT4KICMgIlRoZSBjb3VudHJ5J3MgY2xvY2tzIHdpbGwgYmUgcmV2ZXJzZWQgYnkgb25lIGhvdXIgb24gTm92ZW1iZXIgMS4KICMgT2ZmaWNpYWxzIG9mIEZlZGVyYWwgTWluaXN0cnkgZm9yIEludGVyaW9yIHRvbGQgdGhpcyB0byBHZW8gTmV3cyBvbgogIyBNb25kYXkuIgpAQCAtMTk5NiwxMSArMjA3NCw5IEBACiAjCiAjIFdlIGhhdmUgY29uZmlybWVkIHRoaXMgeWVhcidzIGVuZCBkYXRlIHdpdGggYm90aCB3aXRoIHRoZSBNaW5pc3RyeSBvZgogIyBXYXRlciBhbmQgUG93ZXIgYW5kIHRoZSBQYWtpc3RhbiBFbGVjdHJpYyBQb3dlciBDb21wYW55OgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvcGFraXN0YW4tZW5kcy1kc3QwOS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3Bha2lzdGFuLWVuZHMtZHN0MDkuaHRtbAotIyA8L2E+CiAKLSMgRnJvbSBDaHJpc3RvcGggR29laHJlICgyMDA5LTEwLTAxKToKKyMgRnJvbSBDaHJpc3RvcGggR8O2aHJlICgyMDA5LTEwLTAxKToKICMgW1RdaGUgR2VybWFuIENvbnN1bGF0ZSBHZW5lcmFsIGluIEthcmFjaGkgcmVwb3J0ZWQgbWUgdG9kYXkgdGhhdCBQYWtpc3RhbgogIyB3aWxsIGdvIGJhY2sgdG8gc3RhbmRhcmQgdGltZSBvbiAxc3Qgb2YgTm92ZW1iZXIuCiAKQEAgLTIwMTYsMjIgKzIwOTIsMTcgQEAKICMgTm93LCBpdCBzZWVtcyB0aGF0IHRoZSBkZWNpc2lvbiB0byBub3Qgb2JzZXJ2ZSBEU1QgaW4gZmluYWw6CiAjCiAjICJHb3Z0IFdpdGhkcmF3cyBQbGFuIFRvIEFkdmFuY2UgQ2xvY2tzIgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWtpc3Rhbm5ld3MuY29tL2dvdnQtd2l0aGRyYXdzLXBsYW4tdG8tYWR2YW5jZS1jbG9ja3MtMTcyMDQxIj4KICMgaHR0cDovL3d3dy5hcGFraXN0YW5uZXdzLmNvbS9nb3Z0LXdpdGhkcmF3cy1wbGFuLXRvLWFkdmFuY2UtY2xvY2tzLTE3MjA0MQotIyA8L2E+CiAjCiAjICJQZW9wbGUgbGF1ZCBQTSdzIGFubm91bmNlbWVudCB0byBlbmQgRFNUIgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFwcC5jb20ucGsvZW5fL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTk5Mzc0Jkl0ZW1pZD0yIj4KICMgaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD05OTM3NCZJdGVtaWQ9MgotIyA8L2E+CiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlIFBha2lzdGFuCTIwMDIJb25seQktCUFwcglTdW4+PTIJMDowMQkxOjAwCVMKIFJ1bGUgUGFraXN0YW4JMjAwMglvbmx5CS0JT2N0CVN1bj49MgkwOjAxCTAJLQogUnVsZSBQYWtpc3RhbgkyMDA4CW9ubHkJLQlKdW4JMQkwOjAwCTE6MDAJUwotUnVsZSBQYWtpc3RhbgkyMDA4CW9ubHkJLQlOb3YJMQkwOjAwCTAJLQorUnVsZSBQYWtpc3RhbgkyMDA4CTIwMDkJLQlOb3YJMQkwOjAwCTAJLQogUnVsZSBQYWtpc3RhbgkyMDA5CW9ubHkJLQlBcHIJMTUJMDowMAkxOjAwCVMKLVJ1bGUgUGFraXN0YW4JMjAwOQlvbmx5CS0JTm92CTEJMDowMAkwCS0KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0thcmFjaGkJNDoyODoxMiAtCUxNVAkxOTA3CkBAIC0yMTA1LDEwICsyMTc2LDkgQEAKICMgdGhlIFBBIGhhcyBkZWNpZGVkIHRvIGltcGxlbWVudCBEU1QgaW4gQXByaWwuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6Ci0jIERhb3VkIEt1dHRhYiB3cml0ZXMgaW4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5qcG9zdC5jb20vY29tL0FyY2hpdmUvMjIuQXByLjE5OTkvT3Bpbmlvbi9BcnRpY2xlLTIuaHRtbCI+Ci0jIEhvbGlkYXkgaGF2b2MKLSMgPC9hPiAoSmVydXNhbGVtIFBvc3QsIDE5OTktMDQtMjIpIHRoYXQKKyMgRGFvdWQgS3V0dGFiIHdyaXRlcyBpbiBIb2xpZGF5IGhhdm9jCisjIGh0dHA6Ly93d3cuanBvc3QuY29tL2NvbS9BcmNoaXZlLzIyLkFwci4xOTk5L09waW5pb24vQXJ0aWNsZS0yLmh0bWwKKyMgKEplcnVzYWxlbSBQb3N0LCAxOTk5LTA0LTIyKSB0aGF0CiAjIHRoZSBQYWxlc3RpbmlhbiBOYXRpb25hbCBBdXRob3JpdHkgY2hhbmdlZCB0byBEU1Qgb24gMTk5OS0wNC0xNS4KICMgSSB2YWd1ZWx5IHJlY2FsbCB0aGF0IHRoZXkgc3dpdGNoIGJhY2sgaW4gT2N0b2JlciAoc29ycnksIGZvcmdvdCB0aGUgc291cmNlKS4KICMgRm9yIG5vdywgbGV0J3MgYXNzdW1lIHRoYXQgdGhlIHNwcmluZyBzd2l0Y2ggd2FzIGF0IDI0OjAwLApAQCAtMjEyMSw3ICsyMTkxLDcgQEAKICMgQSB1c2VyIGZyb20gR2F6YSByZXBvcnRlZCB0aGF0IEdhemEgbWFkZSB0aGUgY2hhbmdlIGVhcmx5IGJlY2F1c2Ugb2YKICMgdGhlIFJhbWFkYW4uICBOZXh0IHllYXIgUmFtYWRhbiB3aWxsIGJlIGV2ZW4gZWFybGllciwgc28gSSB0aGluawogIyB0aGVyZSBpcyBhIGdvb2QgY2hhbmNlIG5leHQgeWVhcidzIGVuZCBkYXRlIHdpbGwgYmUgYXJvdW5kIHR3byB3ZWVrcwotIyBlYXJsaWVyLS10aGUgc2FtZSBnb2VzIGZvciBKb3JkYW4uCisjIGVhcmxpZXIgLSB0aGUgc2FtZSBnb2VzIGZvciBKb3JkYW4uCiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDYtMDgtMTcpOgogIyBJIHdhcyBpbmZvcm1lZCBieSBhIHVzZXIgaW4gQmV0aGxlaGVtIHRoYXQgaW4gQmV0aGxlaGVtIGl0IHN0YXJ0ZWQgdGhlCkBAIC0yMTQwLDcgKzIyMTAsNyBAQAogIyBJIGd1ZXNzIGl0IGlzIGxpa2VseSB0aGF0IG5leHQgeWVhcidzIGRhdGUgd2lsbCBiZSBtb3ZlZCBhcyB3ZWxsLAogIyBiZWNhdXNlIG9mIHRoZSBSYW1hZGFuLgogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA3LTA5LTE4KToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA3LTA5LTE4KToKICMgQWNjb3JkaW5nIHRvIFN0ZWZmZW4gVGhvcnNlbidzIHdlYiBzaXRlIHRoZSBHYXphIFN0cmlwIGFuZCB0aGUgcmVzdCBvZiB0aGUKICMgUGFsZXN0aW5pYW4gdGVycml0b3JpZXMgbGVmdCBEU1QgZWFybHkgb24gMTMudGguIG9mIFNlcHRlbWJlciBhdCAyOjAwLgogCkBAIC0yMTU3LDE2ICsyMjI3LDkgQEAKICMgR2F6YSBTdHJpcCAoYXMgRWd5cHQpIGVuZGVkIERTVCBhdCBtaWRuaWdodCBUaHVyc2RheSAoQXVnIDI4LCAyMDA4KSwgd2hpbGUKICMgdGhlIFdlc3QgQmFuayB3aWxsIGVuZCBEYXlsaWdodCBTYXZpbmcgVGltZSBhdCBtaWRuaWdodCBTdW5kYXkgKEF1ZyAzMSwgMjAwOCkuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3VhcmRpYW4uY28udWsvd29ybGQvZmVlZGFydGljbGUvNzc1OTAwMSI+CiAjIGh0dHA6Ly93d3cuZ3VhcmRpYW4uY28udWsvd29ybGQvZmVlZGFydGljbGUvNzc1OTAwMQotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWJjbmV3cy5nby5jb20vSW50ZXJuYXRpb25hbC93aXJlU3Rvcnk/aWQ9NTY3NjA4NyI+CiAjIGh0dHA6Ly93d3cuYWJjbmV3cy5nby5jb20vSW50ZXJuYXRpb25hbC93aXJlU3Rvcnk/aWQ9NTY3NjA4NwotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDEuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDEuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDMtMjYpOgogIyBBY2NvcmRpbmcgdG8gdGhlIFBhbGVzdGluZSBOZXdzIE5ldHdvcmsgKGFyYWJpYy5wbm4ucHMpLCBQYWxlc3RpbmlhbgpAQCAtMjE3NCwyNCArMjIzNywxNyBAQAogIyAyNiBhbmQgY29udGludWUgdW50aWwgdGhlIG5pZ2h0IG9mIDI3IFNlcHRlbWJlciAyMDA5LgogIwogIyAoaW4gQXJhYmljKQotIyA8YSBocmVmPSJodHRwOi8vYXJhYmljLnBubi5wcy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD01MDg1MCI+CiAjIGh0dHA6Ly9hcmFiaWMucG5uLnBzL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTUwODUwCi0jIDwvYT4KICMKLSMgb3IKICMgKEVuZ2xpc2ggdHJhbnNsYXRpb24pCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3Nfd2VzdGJhbmswMS5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c193ZXN0YmFuazAxLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA4LTMxKToKICMgUGFsZXN0aW5lJ3MgQ291bmNpbCBvZiBNaW5pc3RlcnMgYW5ub3VuY2VkIHRoYXQgdGhleSB3aWxsIHJldmVydCBiYWNrIHRvCiAjIHdpbnRlciB0aW1lIG9uIEZyaWRheSwgMjAwOS0wOS0wNC4KICMKICMgT25lIG5ld3Mgc291cmNlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhZmEucHMvYXJhLz9hY3Rpb249c2hvd2RldGFpbCZzZWlkPTQxNTgiPgogIyBodHRwOi8vd3d3LnNhZmEucHMvYXJhLz9hY3Rpb249c2hvd2RldGFpbCZzZWlkPTQxNTgKLSMgPC9hPgogIyAoUGFsZXN0aW5pYW4gcHJlc3MgYWdlbmN5LCBBcmFiaWMpLAogIyBHb29nbGUgdHJhbnNsYXRlOiAiRGVjaWRlZCB0aGF0IHRoZSBQYWxlc3RpbmlhbiBnb3Zlcm5tZW50IGluIFJhbWFsbGFoCiAjIGhlYWRlZCBieSBTYWxhbSBGYXl5YWQsIHRoZSBzdGFydCBvZiB3b3JrIGluIHRpbWUgZm9yIHRoZSB3aW50ZXIgb2YKQEAgLTIyMDAsOSArMjI1Niw3IEBACiAjCiAjIFdlIGFyZSBub3Qgc3VyZSBpZiBHYXphIHdpbGwgZG8gdGhlIHNhbWUsIGxhc3QgeWVhciB0aGV5IGhhZCBhIGRpZmZlcmVudAogIyBlbmQgZGF0ZSwgd2Ugd2lsbCBrZWVwIHRoaXMgcGFnZSB1cGRhdGVkOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvd2VzdGJhbmstZ2F6YS1kc3QtMjAwOS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3dlc3RiYW5rLWdhemEtZHN0LTIwMDkuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDktMDIpOgogIyBTZWVtcyB0aGF0IEdhemEgU3RyaXAgd2lsbCBnbyBiYWNrIHRvIFdpbnRlciBUaW1lIHNhbWUgZGF0ZSBhcyBXZXN0IEJhbmsuCkBAIC0yMjEyLDUxICsyMjY2LDM1IEBACiAjCiAjICJXaW50ZXIgdGltZSB1bml0ZSB0aGUgV2VzdCBCYW5rIGFuZCBHYXphIgogIyAoZnJvbSBQYWxlc3RpbmlhbiBOYXRpb25hbCBBdXRob3JpdHkpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1vaS5nb3YucHMvZW4vP3BhZ2U9NjMzMTY3MzQzMjUwNTk0MDI1Jm5pZD0xMTUwNQogIyBodHRwOi8vd3d3Lm1vaS5nb3YucHMvZW4vP3BhZ2U9NjMzMTY3MzQzMjUwNTk0MDI1Jm5pZD0xMTUwNQotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDIuaHRtbD4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19nYXphc3RyaXAwMi5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMC0wMy0xOSk6CiAjIEFjY29yZGluZyB0byBWb2ljZSBvZiBQYWxlc3RpbmUgRFNUIHdpbGwgbGFzdCBmb3IgMTkxIGRheXMsIGZyb20gTWFyY2gKICMgMjYsIDIwMTAgdGlsbCAidGhlIGxhc3QgU3VuZGF5IGJlZm9yZSB0aGUgdGVudGggZGF5IG9mIFRpc2hyaQogIyAoT2N0b2JlciksIGVhY2ggeWVhciIgKE9jdG9iZXIgMDMsIDIwMTA/KQogIwotIyA8YSBocmVmPSJodHRwOi8vcGFsdm9pY2Uub3JnL2ZvcnVtcy9zaG93dGhyZWFkLnBocD90PTI0NTY5NyI+CiAjIGh0dHA6Ly9wYWx2b2ljZS5vcmcvZm9ydW1zL3Nob3d0aHJlYWQucGhwP3Q9MjQ1Njk3Ci0jIDwvYT4KICMgKGluIEFyYWJpYykKLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c193ZXN0YmFuazAzLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3dlc3RiYW5rMDMuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTAtMDMtMjQpOgogIyAuLi5NYSdhbiBOZXdzIEFnZW5jeSByZXBvcnRzIHRoYXQgSGFtYXMgY2FiaW5ldCBoYXMgZGVjaWRlZCBpdCB3aWxsCiAjIHN0YXJ0IG9uZSBkYXkgbGF0ZXIsIGF0IDEyOjAxYW0uIE5vdCBzdXJlIGlmIHRoZXkgcmVhbGx5IG1lYW4gMTI6MDFhbSBvcgogIyBub29uIHRob3VnaDoKICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tYWFubmV3cy5uZXQvZW5nL1ZpZXdEZXRhaWxzLmFzcHg/SUQ9MjcxMTc4Ij4KICMgaHR0cDovL3d3dy5tYWFubmV3cy5uZXQvZW5nL1ZpZXdEZXRhaWxzLmFzcHg/SUQ9MjcxMTc4Ci0jIDwvYT4KICMgKE1hJ2FuIE5ld3MgQWdlbmN5KQogIyAiQXQgMTI6MDFhbSBGcmlkYXksIGNsb2NrcyBpbiBJc3JhZWwgYW5kIHRoZSBXZXN0IEJhbmsgd2lsbCBjaGFuZ2UgdG8KICMgMTowMWFtLCB3aGlsZSBHYXphIGNsb2NrcyB3aWxsIGNoYW5nZSBhdCAxMjowMWFtIFNhdHVyZGF5IG1vcm5pbmcuIgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTA4LTExKToKICMgQWNjb3JkaW5nIHRvIHNldmVyYWwgc291cmNlcywgaW5jbHVkaW5nCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTMwNjc5NSI+CiAjIGh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTMwNjc5NQotIyA8L2E+CiAjIHRoZSBjbG9ja3Mgd2VyZSBzZXQgYmFjayBvbmUgaG91ciBhdCAyMDEwLTA4LTExIDAwOjAwOjAwIGxvY2FsIHRpbWUgaW4KICMgR2F6YSBhbmQgdGhlIFdlc3QgQmFuay4KICMgU29tZSBtb3JlIGJhY2tncm91bmQgaW5mbzoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3dlc3RiYW5rLWdhemEtZW5kLWRzdC0yMDEwLmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvd2VzdGJhbmstZ2F6YS1lbmQtZHN0LTIwMTAuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTEtMDgtMjYpOgogIyBHYXphIGFuZCB0aGUgV2VzdCBCYW5rIGRpZCBnbyBiYWNrIHRvIHN0YW5kYXJkIHRpbWUgaW4gdGhlIGJlZ2lubmluZyBvZgpAQCAtMjI2NCwxMyArMjMwMiw5IEBACiAjIDAwOjAwIChzbyB0d28gcGVyaW9kcyBvZiBEU1QgaW4gMjAxMSkuIFRoZSBwYXVzZSB3YXMgYmVjYXVzZSBvZgogIyBSYW1hZGFuLgogIwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hYW5uZXdzLm5ldC9lbmcvVmlld0RldGFpbHMuYXNweD9JRD00MTYyMTciPgogIyBodHRwOi8vd3d3Lm1hYW5uZXdzLm5ldC9lbmcvVmlld0RldGFpbHMuYXNweD9JRD00MTYyMTcKLSMgPC9hPgogIyBBZGRpdGlvbmFsIGluZm86Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9wYWxlc3RpbmUtZHN0LTIwMTEuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9wYWxlc3RpbmUtZHN0LTIwMTEuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTEtMDgtMjcpOgogIyBBY2NvcmRpbmcgdG8gdGhlIGFydGljbGUgaW4gVGhlIEplcnVzYWxlbSBQb3N0OgpAQCAtMjI4MCwxNCArMjMxNCw5IEBACiAjIFRoZSBIYW1hcyBnb3Zlcm5tZW50IHNhaWQgb24gU2F0dXJkYXkgdGhhdCBpdCB3b24ndCBvYnNlcnZlIHN1bW1lcnRpbWUgYWZ0ZXIKICMgdGhlIE11c2xpbSBmZWFzdCBvZiBJZCBhbC1GaXRyLCB3aGljaCBiZWdpbnMgb24gVHVlc2RheS4uLiIKICMgLi4uCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuanBvc3QuY29tL01pZGRsZUVhc3QvQXJ0aWNsZS5hc3B4P2lkPTIzNTY1MCI+CiAjIGh0dHA6Ly93d3cuanBvc3QuY29tL01pZGRsZUVhc3QvQXJ0aWNsZS5hc3B4P2lkPTIzNTY1MAotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDUuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDUuaHRtbAotIyA8L2E+Ci0jIFRoZSBydWxlcyBmb3IgRWd5cHQgYXJlIHN0b2xlbiBmcm9tIHRoZSBgYWZyaWNhJyBmaWxlLgorIyBUaGUgcnVsZXMgZm9yIEVneXB0IGFyZSBzdG9sZW4gZnJvbSB0aGUgJ2FmcmljYScgZmlsZS4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMS0wOS0zMCk6CiAjIFdlc3QgQmFuayBkaWQgZW5kIERheWxpZ2h0IFNhdmluZyBUaW1lIHRoaXMgbW9ybmluZy9taWRuaWdodCAoMjAxMS0wOS0zMApAQCAtMjI5NSwyNiArMjMyNCwxOCBAQAogIyBTbyBXZXN0IEJhbmsgYW5kIEdhemEgbm93IGhhdmUgdGhlIHNhbWUgdGltZSBhZ2Fpbi4KICMKICMgTWFueSBzb3VyY2VzLCBpbmNsdWRpbmc6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTQyNDgwOCI+CiAjIGh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTQyNDgwOAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTItMDMtMjYpOgogIyBQYWxlc3RpbmlhbiBuZXdzIHNvdXJjZXMgdGVsbCB0aGF0IGJvdGggR2F6YSBhbmQgV2VzdCBCYW5rIHdpbGwgc3RhcnQgRFNUCiAjIG9uIEZyaWRheSAoVGh1cnNkYXkgbWlkbmlnaHQsIDIwMTItMDMtMjkgMjQ6MDApLgogIyBTb21lIG9mIG1hbnkgc291cmNlcyBpbiBBcmFiaWM6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FtYW5ld3MuY29tL2luZGV4LnBocD9hY3Q9U2hvdyZpZD0xMjI2MzgiPgogIyBodHRwOi8vd3d3LnNhbWFuZXdzLmNvbS9pbmRleC5waHA/YWN0PVNob3cmaWQ9MTIyNjM4Ci0jIDwvYT4KICMKLSMgPGEgaHJlZj0iaHR0cDovL3NhZmEucHMvZGV0YWlscy9uZXdzLzc0MzUyLyVEOCVBOCVEOCVBRiVEOCVBMS0lRDglQTclRDklODQlRDglQUElRDklODglRDklODIlRDklOEElRDglQUEtJUQ4JUE3JUQ5JTg0JUQ4JUI1JUQ5JThBJUQ5JTgxJUQ5JThBLSVEOCVBOCVEOCVBNyVEOSU4NCVEOCVCNiVEOSU4MSVEOCVBOS0lRDklODglRDglQkElRDglQjIlRDglQTktJUQ5JTg0JUQ5JThBJUQ5JTg0JUQ4JUE5LSVEOCVBNyVEOSU4NCVEOCVBQyVEOSU4NSVEOCVCOSVEOCVBOS5odG1sIj4KICMgaHR0cDovL3NhZmEucHMvZGV0YWlscy9uZXdzLzc0MzUyLyVEOCVBOCVEOCVBRiVEOCVBMS0lRDglQTclRDklODQlRDglQUElRDklODglRDklODIlRDklOEElRDglQUEtJUQ4JUE3JUQ5JTg0JUQ4JUI1JUQ5JThBJUQ5JTgxJUQ5JThBLSVEOCVBOCVEOCVBNyVEOSU4NCVEOCVCNiVEOSU4MSVEOCVBOS0lRDklODglRDglQkElRDglQjIlRDglQTktJUQ5JTg0JUQ5JThBJUQ5JTg0JUQ4JUE5LSVEOCVBNyVEOSU4NCVEOCVBQyVEOSU4NSVEOCVCOSVEOCVBOS5odG1sCi0jIDwvYT4KICMKICMgT3VyIGJyaWVmIHN1bW1hcnk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9nYXphLXdlc3QtYmFuay1kc3QtMjAxMi5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2dhemEtd2VzdC1iYW5rLWRzdC0yMDEyLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEzLTAzLTI2KToKICMgVGhlIGZvbGxvd2luZyBuZXdzIHNvdXJjZXMgdGVsbHMgdGhhdCBQYWxlc3RpbmUgd2lsbCAic3RhcnQgZGF5bGlnaHQgc2F2aW5nCkBAIC0yMzc0LDEwICsyMzk1LDEwIEBACiAJCQkyOjAwIEVneXB0QXNpYQlFRSVzVAkxOTY3IEp1biAgNQogCQkJMjowMAlaaW9uCUklc1QJMTk5NgogCQkJMjowMAlKb3JkYW4JRUUlc1QJMTk5OQotCQkJMjowMCBQYWxlc3RpbmUJRUUlc1QJMjAwOCBBdWcgMjkgMDowMAorCQkJMjowMCBQYWxlc3RpbmUJRUUlc1QJMjAwOCBBdWcgMjkgIDA6MDAKIAkJCTI6MDAJLQlFRVQJMjAwOCBTZXAKIAkJCTI6MDAgUGFsZXN0aW5lCUVFJXNUCTIwMTAKLQkJCTI6MDAJLQlFRVQJMjAxMCBNYXIgMjcgMDowMQorCQkJMjowMAktCUVFVAkyMDEwIE1hciAyNyAgMDowMQogCQkJMjowMCBQYWxlc3RpbmUJRUUlc1QJMjAxMSBBdWcgIDEKIAkJCTI6MDAJLQlFRVQJMjAxMgogCQkJMjowMCBQYWxlc3RpbmUJRUUlc1QKQEAgLTIzOTMsMjUgKzI0MTQsMjcgQEAKICMgbm8gaW5mb3JtYXRpb24KIAogIyBQaGlsaXBwaW5lcwotIyBPbiAxODQ0LTA4LTE2LCBOYXJjaXNvIENsYXZlcmlhLCBnb3Zlcm5vci1nZW5lcmFsIG9mIHRoZQorIyBPbiAxODQ0LTA4LTE2LCBOYXJjaXNvIENsYXZlcsOtYSwgZ292ZXJub3ItZ2VuZXJhbCBvZiB0aGUKICMgUGhpbGlwcGluZXMsIGlzc3VlZCBhIHByb2NsYW1hdGlvbiBhbm5vdW5jaW5nIHRoYXQgMTg0NC0xMi0zMCB3YXMgdG8KLSMgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgMTg0NS0wMS0wMS4gIFJvYmVydCBILiB2YW4gR2VudCBoYXMgYQotIyB0cmFuc2NyaXB0IG9mIHRoZSBkZWNyZWUgaW4gPGh0dHA6Ly93d3cucGh5cy51dS5ubC9+dmdlbnQvaWRsL2lkbC5odG0+LgotIyBUaGUgcmVzdCBvZiB0aGUgZGF0YSBhcmUgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCisjIGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IDE4NDUtMDEtMDE7IHNlZSBSLkguIHZhbiBHZW50J3MKKyMgSGlzdG9yeSBvZiB0aGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUKKyMgaHR0cDovL3d3dy5zdGFmZi5zY2llbmNlLnV1Lm5sL35nZW50MDExMy9pZGwvaWRsX3BoaWxpcHBpbmVzLmh0bQorIyBUaGUgcmVzdCBvZiB0aGUgZGF0YSBlbnRyaWVzIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA0LTI1KToKLSMgVG9tb3Jyb3cncyBNYW5pbGEgU3RhbmRhcmQgcmVwb3J0cyB0aGF0IHRoZSBQaGlsaXBwaW5lcyBEZXBhcnRtZW50IG9mCi0jIFRyYWRlIGFuZCBJbmR1c3RyeSBpcyBjb25zaWRlcmluZyBhZG9wdGluZyBEU1QgdGhpcyBKdW5lIHdoZW4gdGhlCi0jIHJhaW55IHNlYXNvbiBiZWdpbnMuICBTZWUKLSMgPGh0dHA6Ly93d3cubWFuaWxhc3RhbmRhcmR0b2RheS5jb20vP3BhZ2U9cG9saXRpY3MwMl9hcHJpbDI2XzIwMDY+LgotIyBGb3Igbm93LCB3ZSdsbCBpZ25vcmUgdGhpcywgc2luY2UgaXQncyBub3QgZGVmaW5pdGUgYW5kIHdlIGxhY2sgZGV0YWlscy4KLSMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDQtMjYpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDQtMjYpOgogIyAuLi4gY2xhaW1zIHRoYXQgUGhpbGlwcGluZXMgaGFkIERTVCBsYXN0IHRpbWUgaW4gMTk5MDoKICMgaHR0cDovL3N0b3J5LnBoaWxpcHBpbmV0aW1lcy5jb20vcC54L2N0LzkvaWQvMTQ1YmUyMGNjNmIxMjFjMC9jaWQvM2U1YmJjY2M3MzBkMjU4Yy8KICMgW2Egc3RvcnkgZGF0ZWQgMjAwNi0wNC0yNSBieSBDcmlzIExhcmFubyBvZiBEb3cgSm9uZXMgTmV3c3dpcmVzLAogIyBidXQgbm8gZGV0YWlsc10KIAorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA4LTE0KToKKyMgVGhlIGZvbGxvd2luZyBzb3VyY2Ugc2F5cyBEU1QgbWF5IGJlIGluc3RpdHV0ZWQgTm92ZW1iZXItSmFudWFyeSBhbmQgYWdhaW4KKyMgTWFyY2gtSnVuZSwgYnV0IHRoaXMgaXMgbm90IGRlZmluaXRlLiAgSXQgYWxzbyBzYXlzIERTVCB3YXMgbGFzdCBwcm9jbGFpbWVkCisjIGR1cmluZyB0aGUgUmFtb3MgYWRtaW5pc3RyYXRpb24gKDE5OTItMTk5OCk7IGJ1dCBhZ2Fpbiwgbm8gZGV0YWlscy4KKyMgQ2FyY2FtbyBELiBQTm95IHVyZ2VkIHRvIGRlY2xhcmUgdXNlIG9mIGRheWxpZ2h0IHNhdmluZyB0aW1lLgorIyBQaGlsaXBwaW5lIFN0YXIgMjAxNC0wOC0wNQorIyBodHRwOi8vd3d3LnBoaWxzdGFyLmNvbS9oZWFkbGluZXMvMjAxNC8wOC8wNS8xMzU0MTUyL3Bub3ktdXJnZWQtZGVjbGFyZS11c2UtZGF5bGlnaHQtc2F2aW5nLXRpbWUKKwogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIFJ1bGUJUGhpbAkxOTM2CW9ubHkJLQlOb3YJMQkwOjAwCTE6MDAJUwogUnVsZQlQaGlsCTE5MzcJb25seQktCUZlYgkxCTA6MDAJMAktCkBAIC0yNDI4LDE4ICsyNDUxLDM5IEBACiAKICMgUWF0YXIKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9RYXRhcgkzOjI2OjA4IC0JTE1UCTE5MjAJIyBBbCBEYXdoYWggLyBEb2hhCitab25lCUFzaWEvUWF0YXIJMzoyNjowOCAtCUxNVAkxOTIwICAgICAjIEFsIERhd2hhaCAvIERvaGEKIAkJCTQ6MDAJLQlHU1QJMTk3MiBKdW4KIAkJCTM6MDAJLQlBU1QKIAogIyBTYXVkaSBBcmFiaWEKKyMKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0xNSk6CisjIFRpbWUgaW4gU2F1ZGkgQXJhYmlhIGFuZCBvdGhlciBjb3VudHJpZXMgaW4gdGhlIEFyYWJpYW4gcGVuaW5zdWxhIHdhcyBub3QKKyMgc3RhbmRhcmRpemVkIHVudGlsIHJlbGF0aXZlbHkgcmVjZW50bHk7IHdlIGRvbid0IGtub3cgd2hlbiwgYW5kIHBvc3NpYmx5IGl0CisjIGhhcyBuZXZlciBiZWVuIG1hZGUgb2ZmaWNpYWwuICBSaWNoYXJkIFAgSHVudCwgaW4gIklzbGFtIGNpdHkgeWllbGRpbmcgdG8KKyMgbW9kZXJuIHRpbWVzIiwgTmV3IFlvcmsgVGltZXMgKDE5NjEtMDQtMDkpLCBwIDIwLCB3cm90ZSB0aGF0IG9ubHkgYWlybGluZXMKKyMgb2JzZXJ2ZWQgc3RhbmRhcmQgdGltZSwgYW5kIHRoYXQgcGVvcGxlIGluIEplZGRhaCBtb3N0bHkgb2JzZXJ2ZWQgcXVhc2ktc29sYXIKKyMgdGltZSwgZG9pbmcgc28gYnkgc2V0dGluZyB0aGVpciB3YXRjaGVzIGF0IHN1bnJpc2UgdG8gNiBvJ2Nsb2NrIChvciB0byAxMgorIyBvJ2Nsb2NrIGZvciAiQXJhYiIgdGltZSkuCisjCisjIFRoZSBUWiBkYXRhYmFzZSBjYW5ub3QgcmVwcmVzZW50IHF1YXNpLXNvbGFyIHRpbWU7IGFpcmxpbmUgdGltZSBpcyB0aGUgYmVzdAorIyB3ZSBjYW4gZG8uICBUaGUgMTk0NiBmb3JlaWduIGFpciBuZXdzIGRpZ2VzdCBvZiB0aGUgVS5TLiBDaXZpbCBBZXJvbmF1dGljcworIyBCb2FyZCAoT0NMQyA0MjI5OTk5NSkgcmVwb3J0ZWQgdGhhdCB0aGUgIi4uLiBBcmFiaWFuIEdvdmVybm1lbnQsIGluYXVndXJhdGVkCisjIGEgd2Vla2x5IERoYWhyYW4tQ2Fpcm8gc2VydmljZSwgdmlhIHRoZSBTYXVkaSBBcmFiaWFuIGNpdGllcyBvZiBSaXlhZGggYW5kCisjIEppZGRhLCBvbiBNYXJjaCAxNCwgMTk0NyIuICBTaGFua3MgJiBQb3R0ZW5nZXIgZ3Vlc3NlZCAxOTUwOyBnbyB3aXRoIHRoZQorIyBlYXJsaWVyIGRhdGUuCisjCisjIFNoYW5rcyAmIFBvdHRlbmdlciBhbHNvIHN0YXRlIHRoYXQgdW50aWwgMTk2OC0wNS0wMSBTYXVkaSBBcmFiaWEgaGFkIHR3bworIyB0aW1lIHpvbmVzOyB0aGUgb3RoZXIgem9uZSwgYXQgVVRDKzQsIHdhcyBpbiB0aGUgZmFyIGVhc3Rlcm4gcGFydCBvZgorIyB0aGUgY291bnRyeS4gIElnbm9yZSB0aGlzLCBhcyBpdCdzIGJlZm9yZSBvdXIgMTk3MCBjdXRvZmYuCisjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvUml5YWRoCTM6MDY6NTIgLQlMTVQJMTk1MAorWm9uZQlBc2lhL1JpeWFkaAkzOjA2OjUyIC0JTE1UCTE5NDcgTWFyIDE0CiAJCQkzOjAwCS0JQVNUCiAKICMgU2luZ2Fwb3JlCi0jIFRoZSBkYXRhIGhlcmUgYXJlIHRha2VuIGZyb20gTW9rIEx5IFluZyAoMjAwMy0xMC0zMCkKLSMgPGh0dHA6Ly93d3cubWF0aC5udXMuZWR1LnNnL2FzbGFrc2VuL3RlYWNoaW5nL3RpbWV6b25lLmh0bWw+LgorIyB0YWtlbiBmcm9tIE1vayBMeSBZbmcgKDIwMDMtMTAtMzApCisjIGh0dHA6Ly93d3cubWF0aC5udXMuZWR1LnNnL2FzbGFrc2VuL3RlYWNoaW5nL3RpbWV6b25lLmh0bWwKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9TaW5nYXBvcmUJNjo1NToyNSAtCUxNVAkxOTAxIEphbiAgMQogCQkJNjo1NToyNQktCVNNVAkxOTA1IEp1biAgMSAjIFNpbmdhcG9yZSBNLlQuCkBAIC0yNDY1LDI2ICsyNTA5LDI0IEBACiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wOS0wMyk6CiAjICJTcmkgTGFua2EgYWR2YW5jZXMgY2xvY2sgYnkgYW4gaG91ciB0byBhdm9pZCBibGFja291dCIKLSMgKHd3dy52aXJ0dWFsLXBjLmNvbS9sYW5rYXdlYi9uZXdzL2l0ZW1zLzI0MDU5Ni0yLmh0bWwsIDE5OTYtMDUtMjQsCisjICg8aHR0cDovL3d3dy52aXJ0dWFsLXBjLmNvbS9sYW5rYXdlYi9uZXdzL2l0ZW1zLzI0MDU5Ni0yLmh0bWw+LCAxOTk2LTA1LTI0LAogIyBubyBsb25nZXIgYXZhaWxhYmxlIGFzIG9mIDE5OTktMDgtMTcpCi0jIHJlcG9ydGVkIGBgdGhlIGNvdW50cnkncyBzdGFuZGFyZCB0aW1lIHdpbGwgYmUgcHV0IGZvcndhcmQgYnkgb25lIGhvdXIgYXQKLSMgbWlkbmlnaHQgRnJpZGF5ICgxODMwIEdNVCkgYGluIHRoZSBsaWdodCBvZiB0aGUgcHJlc2VudCBwb3dlciBjcmlzaXMnLicnCisjIHJlcG9ydGVkICJ0aGUgY291bnRyeSdzIHN0YW5kYXJkIHRpbWUgd2lsbCBiZSBwdXQgZm9yd2FyZCBieSBvbmUgaG91ciBhdAorIyBtaWRuaWdodCBGcmlkYXkgKDE4MzAgR01UKSAnaW4gdGhlIGxpZ2h0IG9mIHRoZSBwcmVzZW50IHBvd2VyIGNyaXNpcycuIgogIwogIyBGcm9tIERoYXJtYXNpcmkgU2VuYW5heWFrZSwgU3JpIExhbmthIE1lZGlhIE1pbmlzdGVyICgxOTk2LTEwLTI0KSwgYXMgcXVvdGVkCi0jIGJ5IFNoYW1pbmRyYSBpbgotIyA8YSBocmVmPSJuZXdzOjU0cmthNSRtNWhAbXRpbnNjMDEtbWd0Lm9wcy53b3JsZG5ldC5hdHQubmV0Ij4KLSMgRGFpbHkgTmV3cyAtIEhvdCBOZXdzIFNlY3Rpb24gKDE5OTYtMTAtMjYpCi0jIDwvYT46CisjIGJ5IFNoYW1pbmRyYSBpbiBEYWlseSBOZXdzIC0gSG90IE5ld3MgU2VjdGlvbgorIyA8bmV3czo1NHJrYTUkbTVoQG10aW5zYzAxLW1ndC5vcHMud29ybGRuZXQuYXR0Lm5ldD4gKDE5OTYtMTAtMjYpOgogIyBXaXRoIGVmZmVjdCBmcm9tIDEyLjMwIGEubS4gb24gMjZ0aCBPY3RvYmVyIDE5OTYKICMgU3JpIExhbmthIHdpbGwgYmUgc2l4ICgwNikgaG91cnMgYWhlYWQgb2YgR01ULgogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA0LTE0KSwgcXVvdGluZyBTcmkgTGFua2EgTmV3cyBPbmxpbmUKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA2LTA0LTE0KSwgcXVvdGluZyBTcmkgTGFua2EgTmV3cyBPbmxpbmUKICMgPGh0dHA6Ly9uZXdzLnNpbmhhbGF5YS5jb20vd212aWV3LnBocD9BcnRJRD0xMTAwMj4gKDIwMDYtMDQtMTMpOgogIyAwMDMwIGhycyBvbiBBcHJpbCAxNSwgMjAwNiAobWlkbmlnaHQgb2YgQXByaWwgMTQsIDIwMDYgKzMwIG1pbnV0ZXMpCiAjIGF0IHByZXNlbnQsIGJlY29tZSAyNDAwIGhvdXJzIG9mIEFwcmlsIDE0LCAyMDA2IChtaWRuaWdodCBvZiBBcHJpbCAxNCwgMjAwNikuCiAKICMgRnJvbSBQZXRlciBBcHBzIGFuZCBSYW5nYSBTaXJpbGEgb2YgUmV1dGVycyAoMjAwNi0wNC0xMikgaW46Ci0jIDxodHRwOi8vdG9kYXkucmV1dGVycy5jby51ay9uZXdzL25ld3NBcnRpY2xlLmFzcHg/dHlwZT1zY2llbmNlTmV3cyZzdG9yeUlEPTIwMDYtMDQtMTJUMTcyMjI4Wl8wMV9DT0wyOTU3NjJfUlRSSURTVF8wX1NDSUVOQ0UtU1JJTEFOS0EtVElNRS1EQy5YTUw+CisjIGh0dHA6Ly90b2RheS5yZXV0ZXJzLmNvLnVrL25ld3MvbmV3c0FydGljbGUuYXNweD90eXBlPXNjaWVuY2VOZXdzJnN0b3J5SUQ9MjAwNi0wNC0xMlQxNzIyMjhaXzAxX0NPTDI5NTc2Ml9SVFJJRFNUXzBfU0NJRU5DRS1TUklMQU5LQS1USU1FLURDLlhNTAogIyBbVGhlIFRhbWlsIFRpZ2Vyc10gbmV2ZXIgYWNjZXB0ZWQgdGhlIG9yaWdpbmFsIDE5OTYgdGltZSBjaGFuZ2UgYW5kIHNpbXBseQogIyBrZXB0IHRoZWlyIGNsb2NrcyBzZXQgZml2ZSBhbmQgYSBoYWxmIGhvdXJzIGFoZWFkIG9mIEdyZWVud2ljaCBNZWFuCiAjIFRpbWUgKEdNVCksIGluIGxpbmUgd2l0aCBuZWlnaGJvciBJbmRpYS4KQEAgLTI0OTgsNyArMjU0MCw3IEBACiAjIHR3aWNlIGluIDE5OTYgYW5kIHByb2JhYmx5IFNMIEdvdmVybm1lbnQgb3IgaXRzIHN0YW5kYXJkaXphdGlvbgogIyBhZ2VuY2llcyBuZXZlciBkZWNsYXJlZCBhbiBhYmJyZXZpYXRpb24gYXMgYSBuYXRpb25hbCBzdGFuZGFyZC4KICMKLSMgSSByZWNvbGxlY3QgYmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlIHRoZSBnb3Zlcm5tZW50IGFubm91Y2VtbWVudHMKKyMgSSByZWNvbGxlY3QgYmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlIHRoZSBnb3Zlcm5tZW50IGFubm91bmNlbWVudHMKICMgbWVudGlvbmluZyBpdCBhcyBzaW1wbHkgY2hhbmdpbmcgU3JpIExhbmthIFN0YW5kYXJkIFRpbWUgb3IgU3JpIExhbmthCiAjIFRpbWUgYW5kIG5vIG1lbnRpb24gd2FzIG1hZGUgYWJvdXQgdGhlIGFiYnJldmlhdGlvbi4KICMKQEAgLTI1MDgsNyArMjU1MCw3IEBACiAjIGl0ZW0uLi4uCiAjCiAjIFdpdGhpbiBTcmkgTGFua2EgSSB0aGluayBMS1QgaXMgd2VsbCBrbm93biBhbW9uZyBjb21wdXRlciB1c2VycyBhbmQKLSMgYWRtaW5zaXRyYXRvcnMuICBJbiBteSBvcGluaW9uIFNMVCBtYXkgbm90IGJlIGEgZ29vZCBjaG9pY2UgYmVjYXVzZSB0aGUKKyMgYWRtaW5pc3RyYXRvcnMuICBJbiBteSBvcGluaW9uIFNMVCBtYXkgbm90IGJlIGEgZ29vZCBjaG9pY2UgYmVjYXVzZSB0aGUKICMgbmF0aW9uJ3MgbGFyZ2VzdCB0ZWxjb20gLyBpbnRlcm5ldCBvcGVyYXRvciBTcmkgTGFua2EgVGVsY29tIGlzIHdlbGwKICMga25vd24gYnkgdGhhdCBhYmJyZXZpYXRpb24gLSBzaW1wbHkgYXMgU0xUICh0aGVyZSBJUCBkb21haW5zIGFyZQogIyBzbHQubGsgYW5kIHNsdG5ldC5saykuCkBAIC0yNTIzLDEzICsyNTY1LDEzIEBACiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9Db2xvbWJvCTU6MTk6MjQgLQlMTVQJMTg4MAotCQkJNToxOTozMgktCU1NVAkxOTA2CSMgTW9yYXR1d2EgTWVhbiBUaW1lCisJCQk1OjE5OjMyCS0JTU1UCTE5MDYgICAgICAgICMgTW9yYXR1d2EgTWVhbiBUaW1lCiAJCQk1OjMwCS0JSVNUCTE5NDIgSmFuICA1CiAJCQk1OjMwCTA6MzAJSUhTVAkxOTQyIFNlcAotCQkJNTozMAkxOjAwCUlTVAkxOTQ1IE9jdCAxNiAyOjAwCi0JCQk1OjMwCS0JSVNUCTE5OTYgTWF5IDI1IDA6MDAKLQkJCTY6MzAJLQlMS1QJMTk5NiBPY3QgMjYgMDozMAotCQkJNjowMAktCUxLVAkyMDA2IEFwciAxNSAwOjMwCisJCQk1OjMwCTE6MDAJSVNUCTE5NDUgT2N0IDE2ICAyOjAwCisJCQk1OjMwCS0JSVNUCTE5OTYgTWF5IDI1ICAwOjAwCisJCQk2OjMwCS0JTEtUCTE5OTYgT2N0IDI2ICAwOjMwCisJCQk2OjAwCS0JTEtUCTIwMDYgQXByIDE1ICAwOjMwCiAJCQk1OjMwCS0JSVNUCiAKICMgU3lyaWEKQEAgLTI1ODAsNyArMjYyMiw3IEBACiAjIFRvZGF5IHRoZSBBUCByZXBvcnRlZCAiU3lyaWEgd2lsbCBzd2l0Y2ggdG8gc3VtbWVydGltZSBhdCBtaWRuaWdodCBUaHVyc2RheS4iCiAjIGh0dHA6Ly93d3cuaWh0LmNvbS9hcnRpY2xlcy9hcC8yMDA3LzAzLzI5L2FmcmljYS9NRS1HRU4tU3lyaWEtVGltZS1DaGFuZ2UucGhwCiBSdWxlCVN5cmlhCTIwMDcJb25seQktCU1hcglsYXN0RnJpCTA6MDAJMTowMAlTCi0jIEZyb20gSmVzcGVyIE5vcmdhcmQgKDIwMDctMTAtMjcpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgKDIwMDctMTAtMjcpOgogIyBUaGUgc2lzdGVyIGNlbnRlciBJQ0FSREEgb2YgbXkgd29yayBDSU1NWVQgaXMgY29uZmlybWluZyB0aGF0IFN5cmlhIERTVCB3aWxsCiAjIG5vdCB0YWtlIHBsYWNlIDFzdCBOb3ZlbWJlciBhdCAwOjAwIG8nY2xvY2sgYnV0IDFzdCBOb3ZlbWJlciBhdCAyNDowMCBvcgogIyByYXRoZXIgTWlkbmlnaHQgYmV0d2VlbiBUaHVyc2RheSBhbmQgRnJpZGF5LiBUaGlzIGRvZXMgbWFrZSBtb3JlIHNlbnNlIHRoYW4KQEAgLTI1ODksNyArMjYzMSw3IEBACiAjIGl0IGlzIGltcGxlbWVudGVkIGF0IG1pZG5pZ2h0IG9mIHRoZSBsYXN0IHdvcmtkYXkgYmVmb3JlIHdlZWtlbmQuLi4KICMKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMTAtMjcpOgotIyBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gd3JvdGU6CisjIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gd3JvdGU6CiAjCiAjID4gIldpbnRlciBsb2NhbCB0aW1lIGluIFN5cmlhIHdpbGwgYmUgb2JzZXJ2ZWQgYXQgbWlkbmlnaHQgb2YgVGh1cnNkYXkgMQogIyA+IE5vdmVtYmVyIDIwMDcsIGFuZCB0aGUgY2xvY2sgd2lsbCBiZSBwdXQgYmFjayAxIGhvdXIuIgpAQCAtMjYwNSw4ICsyNjQ3LDcgQEAKIAogIyBGcm9tIFN0ZXBoZW4gQ29sZWJvdXJuZSAoMjAwOC0wMy0xNyk6CiAjIEZvciBldmVyeW9uZSdzIGluZm8sIEkgc2F3IGFuIElBVEEgdGltZSB6b25lIGNoYW5nZSBmb3IgW1N5cmlhXSBmb3IKLSMgdGhpcyBtb250aCAoTWFyY2ggMjAwOCkgaW4gdGhlIGxhc3QgZGF5IG9yIHNvLi4uVGhpcyBpcyB0aGUgZGF0YSBJQVRBCi0jIGFyZSBub3cgdXNpbmc6CisjIHRoaXMgbW9udGggKE1hcmNoIDIwMDgpIGluIHRoZSBsYXN0IGRheSBvciBzby4uLi4KICMgQ291bnRyeSAgICAgVGltZSBTdGFuZGFyZCAgIC0tLSBEU1QgU3RhcnQgLS0tICAgLS0tIERTVCBFbmQgLS0tICBEU1QKICMgTmFtZSAgICAgICAgWm9uZSBWYXJpYXRpb24gICBUaW1lICAgIERhdGUgICAgICAgIFRpbWUgICAgRGF0ZQogIyBWYXJpYXRpb24KQEAgLTI2MTgsMTYgKzI2NTksMTUgQEAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDMtMTcpOgogIyBIZXJlJ3MgYSBsaW5rIHRvIEVuZ2xpc2gtbGFuZ3VhZ2UgY292ZXJhZ2UgYnkgdGhlIFN5cmlhbiBBcmFiIE5ld3MKICMgQWdlbmN5IChTQU5BKS4uLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmEuc3kvZW5nLzIxLzIwMDgvMDMvMTEvMTY1MTczLmh0bSI+CiAjIGh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOC8wMy8xMS8xNjUxNzMuaHRtCi0jIDwvYT4uLi53aGljaCByZWFkcyAoaW4gcGFydCkgIlRoZSBDYWJpbmV0IGFwcHJvdmVkIHRoZSBzdWdnZXN0aW9uIG9mIHRoZQorIyAuLi53aGljaCByZWFkcyAoaW4gcGFydCkgIlRoZSBDYWJpbmV0IGFwcHJvdmVkIHRoZSBzdWdnZXN0aW9uIG9mIHRoZQogIyBNaW5pc3RyeSBvZiBFbGVjdHJpY2l0eSB0byBiZWdpbiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgb24gRnJpZGF5IEFwcmlsCiAjIDR0aCwgYWR2YW5jaW5nIGNsb2NrcyBvbmUgaG91ciBhaGVhZCBvbiBtaWRuaWdodCBvZiBUaHVyc2RheSBBcHJpbCAzcmQuIgogIyBTaW5jZSBTeXJpYSBpcyB0d28gaG91cnMgZWFzdCBvZiBVVEMsIHRoZSAyMjAwIGFuZCAyMTAwIHRyYW5zaXRpb24gdGltZXMKICMgc2hvd24gYWJvdmUgbWF0Y2ggdXAgd2l0aCBtaWRuaWdodCBpbiBTeXJpYS4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0xOCk6Ci0jIE15IGJ1ZXN0IGd1ZXNzIGF0IGEgU3lyaWFuIHJ1bGUgaXMgInRoZSBGcmlkYXkgbmVhcmVzdCBBcHJpbCAxIjsKKyMgTXkgYmVzdCBndWVzcyBhdCBhIFN5cmlhbiBydWxlIGlzICJ0aGUgRnJpZGF5IG5lYXJlc3QgQXByaWwgMSI7CiAjIGNvZGluZyB0aGF0IGludm9sdmVzIGVpdGhlciB1c2luZyBhICJNYXIgRnJpPj0yOSIgY29uc3RydWN0IHRoYXQgb2xkIHRpbWUgem9uZQogIyBjb21waWxlcnMgY2FuJ3QgaGFuZGxlICBvciBoYXZpbmcgbXVsdGlwbGUgUnVsZXMgKGEgbGEgSXNyYWVsKS4KICMgRm9yIG5vdywgdXNlICJBcHIgRnJpPj0xIiwgYW5kIGdvIHdpdGggSUFUQSBvbiBhIHVuaWZvcm0gU2VwIDMwIGVuZC4KQEAgLTI2NDAsMzcgKzI2ODAsMjcgQEAKICMgd2ludGVyIHRpbWUgb24gMjAwOC0xMS0wMSBhdCAwMDowMCBsb2NhbCBkYXlsaWdodCB0aW1lIChkZWxheWluZy9zZXR0aW5nCiAjIGNsb2NrcyBiYWNrIDYwIG1pbnV0ZXMpLgogIwotIyA8YSBocmVmPSJodHRwOi8vc2FuYS5zeS9hcmEvMi8yMDA4LzEwLzA3LzE5NTQ1OS5odG0iPgogIyBodHRwOi8vc2FuYS5zeS9hcmEvMi8yMDA4LzEwLzA3LzE5NTQ1OS5odG0KLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTE5KToKICMgU3lyaWEgd2lsbCBzdGFydCBEU1Qgb24gMjAwOS0wMy0yNyAwMDowMCB0aGlzIHllYXIgYWNjb3JkaW5nIHRvIG1hbnkgc291cmNlcywKICMgdHdvIGV4YW1wbGVzOgogIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmEuc3kvZW5nLzIxLzIwMDkvMDMvMTcvMjE3NTYzLmh0bSI+CiAjIGh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOS8wMy8xNy8yMTc1NjMuaHRtCi0jIDwvYT4KICMgKEVuZ2xpc2gsIFN5cmlhbiBBcmFiIE5ld3MgIyBBZ2VuY3kpCi0jIDxhIGhyZWY9Imh0dHA6Ly90aGF3cmEuYWx3ZWhkYS5nb3Yuc3kvX1ZpZXdfbmV3czIuYXNwP0ZpbGVOYW1lPTk0NDU5MjU4NzIwMDkwMzE4MDEyMjA5Ij4KICMgaHR0cDovL3RoYXdyYS5hbHdlaGRhLmdvdi5zeS9fVmlld19uZXdzMi5hc3A/RmlsZU5hbWU9OTQ0NTkyNTg3MjAwOTAzMTgwMTIyMDkKLSMgPC9hPgogIyAoQXJhYmljLCBnb3Ytc2l0ZSkKICMKICMgV2UgaGF2ZSBub3QgZm91bmQgYW55IHNvdXJjZXMgc2F5aW5nIGFueXRoaW5nIGFib3V0IHdoZW4gRFNUIGVuZHMgdGhpcyB5ZWFyLgogIwogIyBPdXIgc3VtbWFyeQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc3lyaWEtZHN0LXN0YXJ0cy1tYXJjaC0yNy0yMDA5Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc3lyaWEtZHN0LXN0YXJ0cy1tYXJjaC0yNy0yMDA5Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTEwLTI3KToKICMgVGhlIFN5cmlhbiBBcmFiIE5ld3MgTmV0d29yayBvbiAyMDA5LTA5LTI5IHJlcG9ydGVkIHRoYXQgU3lyaWEgd2lsbAogIyByZXZlcnQgYmFjayB0byB3aW50ZXIgKHN0YW5kYXJkKSB0aW1lIG9uIG1pZG5pZ2h0IGJldHdlZW4gVGh1cnNkYXkKICMgMjAwOS0xMC0yOSBhbmQgRnJpZGF5IDIwMDktMTAtMzA6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FuYS5zeS9hcmEvMi8yMDA5LzA5LzI5LzI0NzAxMi5odG0iPgogIyBodHRwOi8vd3d3LnNhbmEuc3kvYXJhLzIvMjAwOS8wOS8yOS8yNDcwMTIuaHRtIChBcmFiaWMpCi0jIDwvYT4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOS0xMC0yOCk6CiAjIFdlJ2xsIHNlZSBpZiBmdXR1cmUgRFNUIHN3aXRjaGluZyB0aW1lcyB0dXJuIG91dCB0byBiZSBlbmQgb2YgdGhlIGxhc3QKQEAgLTI2ODEsMjMgKzI3MTEsMTcgQEAKICMgVGhlICJTeXJpYW4gTmV3cyBTdGF0aW9uIiByZXBvcnRlZCBvbiAyMDEwLTAzLTE2IHRoYXQgdGhlIENvdW5jaWwgb2YKICMgTWluaXN0ZXJzIGhhcyBkZWNpZGVkIHRoYXQgU3lyaWEgd2lsbCBzdGFydCBEU1Qgb24gbWlkbmlnaHQgVGh1cnNkYXkKICMgMjAxMC0wNC0wMTogKG1pZG5pZ2h0IGJldHdlZW4gVGh1cnNkYXkgYW5kIEZyaWRheSk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9zbnMuc3kvc25zLz9wYXRoPW5ld3MvcmVhZC8xMTQyMSI+CiAjIGh0dHA6Ly9zbnMuc3kvc25zLz9wYXRoPW5ld3MvcmVhZC8xMTQyMSAoQXJhYmljKQotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTItMDMtMjYpOgogIyBUb2RheSwgU3lyaWEncyBnb3Zlcm5tZW50IGFubm91bmNlZCB0aGF0IHRoZXkgd2lsbCBzdGFydCBEU1QgZWFybHkgb24gRnJpZGF5CiAjICgwMDowMCkuIFRoaXMgaXMgYSBiaXQgZWFybGllciB0aGFuIHRoZSBwYXN0IHR3byB5ZWFycy4KICMKICMgRnJvbSBTeXJpYW4gQXJhYiBOZXdzIEFnZW5jeSwgaW4gQXJhYmljOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmEuc3kvYXJhLzIvMjAxMi8wMy8yNi80MDgyMTUuaHRtIj4KICMgaHR0cDovL3d3dy5zYW5hLnN5L2FyYS8yLzIwMTIvMDMvMjYvNDA4MjE1Lmh0bQotIyA8L2E+CiAjCiAjIE91ciBicmllZiBzdW1tYXJ5OgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc3lyaWEtZHN0LTIwMTIuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zeXJpYS1kc3QtMjAxMi5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMi0wMy0yNyk6CiAjIEFzc3VtZSBsYXN0IEZyaWRheSBpbiBNYXJjaCBnb2luZyBmb3J3YXJkIFhYWC4KQEAgLTI3MTAsNyArMjczNCw3IEBACiBSdWxlCVN5cmlhCTIwMDkJbWF4CS0JT2N0CWxhc3RGcmkJMDowMAkwCS0KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0RhbWFzY3VzCTI6MjU6MTIgLQlMTVQJMTkyMAkjIERpbWFzaHEKK1pvbmUJQXNpYS9EYW1hc2N1cwkyOjI1OjEyIC0JTE1UCTE5MjAgIyBEaW1hc2hxCiAJCQkyOjAwCVN5cmlhCUVFJXNUCiAKICMgVGFqaWtpc3RhbgpAQCAtMjcxOCw5ICsyNzQyLDkgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9EdXNoYW5iZQk0OjM1OjEyIC0JTE1UCTE5MjQgTWF5ICAyCiAJCQk1OjAwCS0JRFVTVAkxOTMwIEp1biAyMSAjIER1c2hhbmJlIFRpbWUKLQkJCTY6MDAgUnVzc2lhQXNpYSBEVVMlc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTU6MDAJMTowMAlEVVNTVAkxOTkxIFNlcCAgOSAyOjAwcwotCQkJNTowMAktCVRKVAkJICAgICMgVGFqaWtpc3RhbiBUaW1lCisJCQk2OjAwIFJ1c3NpYUFzaWEgRFVTJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJNTowMAkxOjAwCURVU1NUCTE5OTEgU2VwICA5ICAyOjAwcworCQkJNTowMAktCVRKVAkjIFRhamlraXN0YW4gVGltZQogCiAjIFRoYWlsYW5kCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC0yNzMzLDkgKzI3NTcsOSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0FzaGdhYmF0CTM6NTM6MzIgLQlMTVQJMTkyNCBNYXkgIDIgIyBvciBBc2hraGFiYWQKIAkJCTQ6MDAJLQlBU0hUCTE5MzAgSnVuIDIxICMgQXNoa2hhYmFkIFRpbWUKLQkJCTU6MDAgUnVzc2lhQXNpYQlBU0glc1QJMTk5MSBNYXIgMzEgMjowMAorCQkJNTowMCBSdXNzaWFBc2lhCUFTSCVzVAkxOTkxIE1hciAzMSAgMjowMAogCQkJNDowMCBSdXNzaWFBc2lhCUFTSCVzVAkxOTkxIE9jdCAyNyAjIGluZGVwZW5kZW5jZQotCQkJNDowMCBSdXNzaWFBc2lhCVRNJXNUCTE5OTIgSmFuIDE5IDI6MDAKKwkJCTQ6MDAgUnVzc2lhQXNpYQlUTSVzVAkxOTkyIEphbiAxOSAgMjowMAogCQkJNTowMAktCVRNVAogCiAjIFVuaXRlZCBBcmFiIEVtaXJhdGVzCkBAIC0yNzQ0LDggKzI3NjgsOSBAQAogCQkJNDowMAktCUdTVAogCiAjIFV6YmVraXN0YW4KKyMgQnlhbG9rb3ogMTkxOSBzYXlzIFV6YmVraXN0YW4gd2FzIDQ6Mjc6NTMuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvU2FtYXJrYW5kCTQ6Mjc6MTIgLQlMTVQJMTkyNCBNYXkgIDIKK1pvbmUJQXNpYS9TYW1hcmthbmQJNDoyNzo1MyAtCUxNVAkxOTI0IE1heSAgMgogCQkJNDowMAktCVNBTVQJMTkzMCBKdW4gMjEgIyBTYW1hcmthbmQgVGltZQogCQkJNTowMAktCVNBTVQJMTk4MSBBcHIgIDEKIAkJCTU6MDAJMTowMAlTQU1TVAkxOTgxIE9jdCAgMQpAQCAtMjc1Myw5ICsyNzc4LDEwIEBACiAJCQk1OjAwIFJ1c3NpYUFzaWEJU0FNJXNUCTE5OTEgU2VwICAxICMgaW5kZXBlbmRlbmNlCiAJCQk1OjAwIFJ1c3NpYUFzaWEJVVolc1QJMTk5MgogCQkJNTowMAktCVVaVAotWm9uZQlBc2lhL1Rhc2hrZW50CTQ6Mzc6MTIgLQlMTVQJMTkyNCBNYXkgIDIKKyMgTWlsbmUgc2F5cyBUYXNoa2VudCB3YXMgNDozNzoxMC44OyByb3VuZCB0byBuZWFyZXN0LgorWm9uZQlBc2lhL1Rhc2hrZW50CTQ6Mzc6MTEgLQlMTVQJMTkyNCBNYXkgIDIKIAkJCTU6MDAJLQlUQVNUCTE5MzAgSnVuIDIxICMgVGFzaGtlbnQgVGltZQotCQkJNjowMCBSdXNzaWFBc2lhCVRBUyVzVAkxOTkxIE1hciAzMSAyOjAwCisJCQk2OjAwIFJ1c3NpYUFzaWEJVEFTJXNUCTE5OTEgTWFyIDMxICAyOjAwCiAJCQk1OjAwIFJ1c3NpYUFzaWEJVEFTJXNUCTE5OTEgU2VwICAxICMgaW5kZXBlbmRlbmNlCiAJCQk1OjAwIFJ1c3NpYUFzaWEJVVolc1QJMTk5MgogCQkJNTowMAktCVVaVApAQCAtMjc2OSwxMyArMjc5NSwxMyBAQAogIyBhbmQgUG90dGVuZ2VyLgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTE4KToKLSMgVGhlIEVuZ2xpc2gtbGFuZ3VhZ2UgbmFtZSBvZiBWaWV0bmFtJ3MgbW9zdCBwb3B1bG91cyBjaXR5IGlzICJIbyBDaGkgTWluIENpdHkiOwotIyB3ZSB1c2UgSG9fQ2hpX01pbmggYmVsb3cgdG8gYXZvaWQgYSBuYW1lIG9mIG1vcmUgdGhhbiAxNCBjaGFyYWN0ZXJzLgorIyBUaGUgRW5nbGlzaC1sYW5ndWFnZSBuYW1lIG9mIFZpZXRuYW0ncyBtb3N0IHBvcHVsb3VzIGNpdHkgaXMgIkhvIENoaSBNaW5oCisjIENpdHkiOyB1c2UgSG9fQ2hpX01pbmggYmVsb3cgdG8gYXZvaWQgYSBuYW1lIG9mIG1vcmUgdGhhbiAxNCBjaGFyYWN0ZXJzLgogCiAjIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0hvX0NoaV9NaW5oCTc6MDY6NDAgLQlMTVQJMTkwNiBKdW4gIDkKLQkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgMDowMSAjIFNhaWdvbiBNVD8KKwkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgIDA6MDEgIyBTYWlnb24gTVQ/CiAJCQk3OjAwCS0JSUNUCTE5MTIgTWF5CiAJCQk4OjAwCS0JSUNUCTE5MzEgTWF5CiAJCQk3OjAwCS0JSUNUCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hdXN0cmFsYXNpYSBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2F1c3RyYWxhc2lhCmluZGV4IDk0YzlhZGIuLjUyZDMyOTAgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2F1c3RyYWxhc2lhCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2F1c3RyYWxhc2lhCkBAIC0yMSw3ICsyMSw2IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIApAQCAtMzYsMTMgKzM1LDEzIEBACiAjIFBsZWFzZSBzZWUgdGhlIG5vdGVzIGJlbG93IGZvciB0aGUgY29udHJvdmVyc3kgYWJvdXQgIkVTVCIgdmVyc3VzICJBRVNUIiBldGMuCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUF1cwkxOTE3CW9ubHkJLQlKYW4JIDEJMDowMQkxOjAwCS0KLVJ1bGUJQXVzCTE5MTcJb25seQktCU1hcgkyNQkyOjAwCTAJLQotUnVsZQlBdXMJMTk0Mglvbmx5CS0JSmFuCSAxCTI6MDAJMTowMAktCi1SdWxlCUF1cwkxOTQyCW9ubHkJLQlNYXIJMjkJMjowMAkwCS0KLVJ1bGUJQXVzCTE5NDIJb25seQktCVNlcAkyNwkyOjAwCTE6MDAJLQotUnVsZQlBdXMJMTk0MwkxOTQ0CS0JTWFyCWxhc3RTdW4JMjowMAkwCS0KLVJ1bGUJQXVzCTE5NDMJb25seQktCU9jdAkgMwkyOjAwCTE6MDAJLQorUnVsZQlBdXMJMTkxNwlvbmx5CS0JSmFuCSAxCTA6MDEJMTowMAlECitSdWxlCUF1cwkxOTE3CW9ubHkJLQlNYXIJMjUJMjowMAkwCVMKK1J1bGUJQXVzCTE5NDIJb25seQktCUphbgkgMQkyOjAwCTE6MDAJRAorUnVsZQlBdXMJMTk0Mglvbmx5CS0JTWFyCTI5CTI6MDAJMAlTCitSdWxlCUF1cwkxOTQyCW9ubHkJLQlTZXAJMjcJMjowMAkxOjAwCUQKK1J1bGUJQXVzCTE5NDMJMTk0NAktCU1hcglsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUF1cwkxOTQzCW9ubHkJLQlPY3QJIDMJMjowMAkxOjAwCUQKICMgR28gd2l0aCBXaGl0bWFuIGFuZCB0aGUgQXVzdHJhbGlhbiBOYXRpb25hbCBTdGFuZGFyZHMgQ29tbWlzc2lvbiwgd2hpY2gKICMgc2F5cyBXIEF1c3RyYWxpYSBkaWRuJ3QgdXNlIERTVCBpbiAxOTQzLzE5NDQuICBJZ25vcmUgV2hpdG1hbidzIGNsYWltIHRoYXQKICMgMTk0NC8xOTQ1IHdhcyBqdXN0IGxpa2UgMTk0My8xOTQ0LgpAQCAtNTAsMjYgKzQ5LDI2IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiAjIE5vcnRoZXJuIFRlcnJpdG9yeQogWm9uZSBBdXN0cmFsaWEvRGFyd2luCSA4OjQzOjIwIC0JTE1UCTE4OTUgRmViCi0JCQkgOTowMAktCUNTVAkxODk5IE1heQotCQkJIDk6MzAJQXVzCUNTVAorCQkJIDk6MDAJLQlBQ1NUCTE4OTkgTWF5CisJCQkgOTozMAlBdXMJQUMlc1QKICMgV2VzdGVybiBBdXN0cmFsaWEKICMKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFXCTE5NzQJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVwkxOTc1CW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVwkxOTgzCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVcJMTk4NAlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVcJMTk5MQlvbmx5CS0JTm92CTE3CTI6MDBzCTE6MDAJLQotUnVsZQlBVwkxOTkyCW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVwkyMDA2CW9ubHkJLQlEZWMJIDMJMjowMHMJMTowMAktCi1SdWxlCUFXCTIwMDcJMjAwOQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVwkyMDA3CTIwMDgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KK1J1bGUJQVcJMTk3NAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFXCTE5NzUJb25seQktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFXCTE5ODMJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBVwkxOTg0CW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVwkxOTkxCW9ubHkJLQlOb3YJMTcJMjowMHMJMTowMAlECitSdWxlCUFXCTE5OTIJb25seQktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFXCTIwMDYJb25seQktCURlYwkgMwkyOjAwcwkxOjAwCUQKK1J1bGUJQVcJMjAwNwkyMDA5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFXCTIwMDcJMjAwOAktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAogWm9uZSBBdXN0cmFsaWEvUGVydGgJIDc6NDM6MjQgLQlMTVQJMTg5NSBEZWMKLQkJCSA4OjAwCUF1cwlXU1QJMTk0MyBKdWwKLQkJCSA4OjAwCUFXCVdTVAorCQkJIDg6MDAJQXVzCUFXJXNUCTE5NDMgSnVsCisJCQkgODowMAlBVwlBVyVzVAogWm9uZSBBdXN0cmFsaWEvRXVjbGEJIDg6MzU6MjggLQlMTVQJMTg5NSBEZWMKLQkJCSA4OjQ1CUF1cwlDV1NUCTE5NDMgSnVsCi0JCQkgODo0NQlBVwlDV1NUCisJCQkgODo0NQlBdXMJQUNXJXNUCTE5NDMgSnVsCisJCQkgODo0NQlBVwlBQ1clc1QKIAogIyBRdWVlbnNsYW5kCiAjCkBAIC04NSwxNTAgKzg0LDE1MCBAQAogIyBzbyB1c2UgTGluZGVtYW4uCiAjCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBUQkxOTcxCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVEJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFRCTE5ODkJMTk5MQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBUQkxOTkwCTE5OTIJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlIb2xpZGF5CTE5OTIJMTk5MwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlIb2xpZGF5CTE5OTMJMTk5NAktCU1hcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFRCTE5NzEJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBUQkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVEJMTk4OQkxOTkxCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFRCTE5OTAJMTk5MgktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUhvbGlkYXkJMTk5MgkxOTkzCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUhvbGlkYXkJMTk5MwkxOTk0CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKIFpvbmUgQXVzdHJhbGlhL0JyaXNiYW5lCTEwOjEyOjA4IC0JTE1UCTE4OTUKLQkJCTEwOjAwCUF1cwlFU1QJMTk3MQotCQkJMTA6MDAJQVEJRVNUCisJCQkxMDowMAlBdXMJQUUlc1QJMTk3MQorCQkJMTA6MDAJQVEJQUUlc1QKIFpvbmUgQXVzdHJhbGlhL0xpbmRlbWFuICA5OjU1OjU2IC0JTE1UCTE4OTUKLQkJCTEwOjAwCUF1cwlFU1QJMTk3MQotCQkJMTA6MDAJQVEJRVNUCTE5OTIgSnVsCi0JCQkxMDowMAlIb2xpZGF5CUVTVAorCQkJMTA6MDAJQXVzCUFFJXNUCTE5NzEKKwkJCTEwOjAwCUFRCUFFJXNUCTE5OTIgSnVsCisJCQkxMDowMAlIb2xpZGF5CUFFJXNUCiAKICMgU291dGggQXVzdHJhbGlhCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBUwkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVMJMTk4Nglvbmx5CS0JT2N0CTE5CTI6MDBzCTE6MDAJLQotUnVsZQlBUwkxOTg3CTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVMJMTk3Mglvbmx5CS0JRmViCTI3CTI6MDBzCTAJLQotUnVsZQlBUwkxOTczCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBUwkxOTg2CTE5OTAJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk5MQlvbmx5CS0JTWFyCTMJMjowMHMJMAktCi1SdWxlCUFTCTE5OTIJb25seQktCU1hcgkyMgkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk5Mwlvbmx5CS0JTWFyCTcJMjowMHMJMAktCi1SdWxlCUFTCTE5OTQJb25seQktCU1hcgkyMAkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk5NQkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFTCTIwMDYJb25seQktCUFwcgkyCTI6MDBzCTAJLQotUnVsZQlBUwkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVMJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBUwkyMDA4CW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCitSdWxlCUFTCTE5NzEJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBUwkxOTg2CW9ubHkJLQlPY3QJMTkJMjowMHMJMTowMAlECitSdWxlCUFTCTE5ODcJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBUwkxOTcyCW9ubHkJLQlGZWIJMjcJMjowMHMJMAlTCitSdWxlCUFTCTE5NzMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFTCTE5ODYJMTk5MAktCU1hcglTdW4+PTE1CTI6MDBzCTAJUworUnVsZQlBUwkxOTkxCW9ubHkJLQlNYXIJMwkyOjAwcwkwCVMKK1J1bGUJQVMJMTk5Mglvbmx5CS0JTWFyCTIyCTI6MDBzCTAJUworUnVsZQlBUwkxOTkzCW9ubHkJLQlNYXIJNwkyOjAwcwkwCVMKK1J1bGUJQVMJMTk5NAlvbmx5CS0JTWFyCTIwCTI6MDBzCTAJUworUnVsZQlBUwkxOTk1CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCVMKK1J1bGUJQVMJMjAwNglvbmx5CS0JQXByCTIJMjowMHMJMAlTCitSdWxlCUFTCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBUwkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFTCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCUQKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQXVzdHJhbGlhL0FkZWxhaWRlCTk6MTQ6MjAgLQlMTVQJMTg5NSBGZWIKLQkJCTk6MDAJLQlDU1QJMTg5OSBNYXkKLQkJCTk6MzAJQXVzCUNTVAkxOTcxCi0JCQk5OjMwCUFTCUNTVAorCQkJOTowMAktCUFDU1QJMTg5OSBNYXkKKwkJCTk6MzAJQXVzCUFDJXNUCTE5NzEKKwkJCTk6MzAJQVMJQUMlc1QKIAogIyBUYXNtYW5pYQogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA4LTE2KToKLSMgPGh0dHA6Ly93d3cuYm9tLmdvdi5hdS9jbGltYXRlL2F2ZXJhZ2VzL3RhYmxlcy9kc3RfdGltZXMuc2h0bWw+CisjIGh0dHA6Ly93d3cuYm9tLmdvdi5hdS9jbGltYXRlL2F2ZXJhZ2VzL3RhYmxlcy9kc3RfdGltZXMuc2h0bWwKICMgc2F5cyBLaW5nIElzbGFuZCBkaWRuJ3Qgb2JzZXJ2ZSBEU1QgZnJvbSBXV0lJIHVudGlsIGxhdGUgMTk3MS4KICMKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFUCTE5NjcJb25seQktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi1SdWxlCUFUCTE5NjgJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkxOTY4CTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk2OQkxOTcxCS0JTWFyCVN1bj49OAkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUCTE5NzMJMTk4MQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFUCTE5ODIJMTk4MwktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkxOTg0CTE5ODYJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVAkxOTg2CW9ubHkJLQlPY3QJU3VuPj0xNQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk4NwkxOTkwCS0JTWFyCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCUFUCTE5ODcJb25seQktCU9jdAlTdW4+PTIyCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkxOTg4CTE5OTAJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk5MQkxOTk5CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk5MQkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUCTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkyMDAxCW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi1SdWxlCUFUCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFUCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVAkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCitSdWxlCUFUCTE5NjcJb25seQktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECitSdWxlCUFUCTE5NjgJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVAkxOTY4CTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVQJMTk2OQkxOTcxCS0JTWFyCVN1bj49OAkyOjAwcwkwCVMKK1J1bGUJQVQJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFUCTE5NzMJMTk4MQktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFUCTE5ODIJMTk4MwktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVAkxOTg0CTE5ODYJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBVAkxOTg2CW9ubHkJLQlPY3QJU3VuPj0xNQkyOjAwcwkxOjAwCUQKK1J1bGUJQVQJMTk4NwkxOTkwCS0JTWFyCVN1bj49MTUJMjowMHMJMAlTCitSdWxlCUFUCTE5ODcJb25seQktCU9jdAlTdW4+PTIyCTI6MDBzCTE6MDAJRAorUnVsZQlBVAkxOTg4CTE5OTAJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVQJMTk5MQkxOTk5CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCUQKK1J1bGUJQVQJMTk5MQkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFUCTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBVAkyMDAxCW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECitSdWxlCUFUCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFUCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVAkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEF1c3RyYWxpYS9Ib2JhcnQJOTo0OToxNgktCUxNVAkxODk1IFNlcAotCQkJMTA6MDAJLQlFU1QJMTkxNiBPY3QgMSAyOjAwCi0JCQkxMDowMAkxOjAwCUVTVAkxOTE3IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTY3Ci0JCQkxMDowMAlBVAlFU1QKKwkJCTEwOjAwCS0JQUVTVAkxOTE2IE9jdCAgMSAgMjowMAorCQkJMTA6MDAJMTowMAlBRURUCTE5MTcgRmViCisJCQkxMDowMAlBdXMJQUUlc1QJMTk2NworCQkJMTA6MDAJQVQJQUUlc1QKIFpvbmUgQXVzdHJhbGlhL0N1cnJpZQk5OjM1OjI4CS0JTE1UCTE4OTUgU2VwCi0JCQkxMDowMAktCUVTVAkxOTE2IE9jdCAxIDI6MDAKLQkJCTEwOjAwCTE6MDAJRVNUCTE5MTcgRmViCi0JCQkxMDowMAlBdXMJRVNUCTE5NzEgSnVsCi0JCQkxMDowMAlBVAlFU1QKKwkJCTEwOjAwCS0JQUVTVAkxOTE2IE9jdCAgMSAgMjowMAorCQkJMTA6MDAJMTowMAlBRURUCTE5MTcgRmViCisJCQkxMDowMAlBdXMJQUUlc1QJMTk3MSBKdWwKKwkJCTEwOjAwCUFUCUFFJXNUCiAKICMgVmljdG9yaWEKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFWCTE5NzEJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVgkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVYJMTk3MwkxOTg1CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVYJMTk4NgkxOTkwCS0JTWFyCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCUFWCTE5ODYJMTk4NwktCU9jdAlTdW4+PTE1CTI6MDBzCTE6MDAJLQotUnVsZQlBVgkxOTg4CTE5OTkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMTk5MQkxOTk0CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVYJMTk5NQkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFWCTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVgkyMDAxCTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVYJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFWCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVYJMjAwOAltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQorUnVsZQlBVgkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVYJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFWCTE5NzMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFWCTE5ODYJMTk5MAktCU1hcglTdW4+PTE1CTI6MDBzCTAJUworUnVsZQlBVgkxOTg2CTE5ODcJLQlPY3QJU3VuPj0xNQkyOjAwcwkxOjAwCUQKK1J1bGUJQVYJMTk4OAkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFWCTE5OTEJMTk5NAktCU1hcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFWCTE5OTUJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQVYJMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAlECitSdWxlCUFWCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFWCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJUworUnVsZQlBVgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAlTCitSdWxlCUFWCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCUQKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQXVzdHJhbGlhL01lbGJvdXJuZSA5OjM5OjUyIC0JTE1UCTE4OTUgRmViCi0JCQkxMDowMAlBdXMJRVNUCTE5NzEKLQkJCTEwOjAwCUFWCUVTVAorCQkJMTA6MDAJQXVzCUFFJXNUCTE5NzEKKwkJCTEwOjAwCUFWCUFFJXNUCiAKICMgTmV3IFNvdXRoIFdhbGVzCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBTgkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQU4JMTk3Mglvbmx5CS0JRmViCTI3CTI6MDBzCTAJLQotUnVsZQlBTgkxOTczCTE5ODEJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBTgkxOTgyCW9ubHkJLQlBcHIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBTgkxOTgzCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBTgkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk4Nglvbmx5CS0JT2N0CTE5CTI6MDBzCTE6MDAJLQotUnVsZQlBTgkxOTg3CTE5OTkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQU4JMTk5MAkxOTk1CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk5NgkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFOCTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBTgkyMDAxCTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQU4JMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFOCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMjAwOAltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQorUnVsZQlBTgkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQU4JMTk3Mglvbmx5CS0JRmViCTI3CTI6MDBzCTAJUworUnVsZQlBTgkxOTczCTE5ODEJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBTgkxOTgyCW9ubHkJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBTgkxOTgzCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDBzCTAJUworUnVsZQlBTgkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCVMKK1J1bGUJQU4JMTk4Nglvbmx5CS0JT2N0CTE5CTI6MDBzCTE6MDAJRAorUnVsZQlBTgkxOTg3CTE5OTkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQU4JMTk5MAkxOTk1CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQU4JMTk5NgkyMDA1CS0JTWFyCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFOCTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDBzCTE6MDAJRAorUnVsZQlBTgkyMDAxCTIwMDcJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKK1J1bGUJQU4JMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQU4JMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAlTCitSdWxlCUFOCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCVMKK1J1bGUJQU4JMjAwOAltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJRAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBdXN0cmFsaWEvU3lkbmV5CTEwOjA0OjUyIC0JTE1UCTE4OTUgRmViCi0JCQkxMDowMAlBdXMJRVNUCTE5NzEKLQkJCTEwOjAwCUFOCUVTVAorCQkJMTA6MDAJQXVzCUFFJXNUCTE5NzEKKwkJCTEwOjAwCUFOCUFFJXNUCiBab25lIEF1c3RyYWxpYS9Ccm9rZW5fSGlsbCA5OjI1OjQ4IC0JTE1UCTE4OTUgRmViCi0JCQkxMDowMAktCUVTVAkxODk2IEF1ZyAyMwotCQkJOTowMAktCUNTVAkxODk5IE1heQotCQkJOTozMAlBdXMJQ1NUCTE5NzEKLQkJCTk6MzAJQU4JQ1NUCTIwMDAKLQkJCTk6MzAJQVMJQ1NUCisJCQkxMDowMAktCUFFU1QJMTg5NiBBdWcgMjMKKwkJCTk6MDAJLQlBQ1NUCTE4OTkgTWF5CisJCQk5OjMwCUF1cwlBQyVzVAkxOTcxCisJCQk5OjMwCUFOCUFDJXNUCTIwMDAKKwkJCTk6MzAJQVMJQUMlc1QKIAogIyBMb3JkIEhvd2UgSXNsYW5kCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlMSAkxOTgxCTE5ODQJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJLQotUnVsZQlMSAkxOTgyCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTE5ODUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAktCi1SdWxlCUxICTE5ODYJMTk4OQktCU1hcglTdW4+PTE1CTI6MDAJMAktCi1SdWxlCUxICTE5ODYJb25seQktCU9jdAkxOQkyOjAwCTA6MzAJLQotUnVsZQlMSAkxOTg3CTE5OTkJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkxOTkwCTE5OTUJLQlNYXIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDAJMAktCi1SdWxlCUxICTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDAJMDozMAktCi1SdWxlCUxICTIwMDEJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAktCi1SdWxlCUxICTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMAkwCS0KLVJ1bGUJTEgJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkwCS0KLVJ1bGUJTEgJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwCTA6MzAJLQorUnVsZQlMSAkxOTgxCTE5ODQJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAorUnVsZQlMSAkxOTgyCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDAJMAlTCitSdWxlCUxICTE5ODUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAlECitSdWxlCUxICTE5ODYJMTk4OQktCU1hcglTdW4+PTE1CTI6MDAJMAlTCitSdWxlCUxICTE5ODYJb25seQktCU9jdAkxOQkyOjAwCTA6MzAJRAorUnVsZQlMSAkxOTg3CTE5OTkJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJRAorUnVsZQlMSAkxOTkwCTE5OTUJLQlNYXIJU3VuPj0xCTI6MDAJMAlTCitSdWxlCUxICTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDAJMAlTCitSdWxlCUxICTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDAJMDozMAlECitSdWxlCUxICTIwMDEJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAlECitSdWxlCUxICTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMAkwCVMKK1J1bGUJTEgJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkwCVMKK1J1bGUJTEgJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMAlTCitSdWxlCUxICTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwCTA6MzAJRAogWm9uZSBBdXN0cmFsaWEvTG9yZF9Ib3dlIDEwOjM2OjIwIC0JTE1UCTE4OTUgRmViCi0JCQkxMDowMAktCUVTVAkxOTgxIE1hcgotCQkJMTA6MzAJTEgJTEhTVAorCQkJMTA6MDAJLQlBRVNUCTE5ODEgTWFyCisJCQkxMDozMAlMSAlMSCVzVAogCiAjIEF1c3RyYWxpYW4gbWlzY2VsbGFueQogIwpAQCAtMjQ0LDggKzI0Myw4IEBACiAjIFBlcm1hbmVudCBvY2N1cGF0aW9uIChzY2llbnRpZmljIHN0YXRpb24pIDE5MTEtMTkxNSBhbmQgc2luY2UgMjUgTWFyY2ggMTk0ODsKICMgc2VhbGluZyBhbmQgcGVuZ3VpbiBvaWwgc3RhdGlvbiBvcGVyYXRlZCBOb3YgMTg5OSB0byBBcHIgMTkxOS4gIFNlZSB0aGUKICMgVGFzbWFuaWEgUGFya3MgJiBXaWxkbGlmZSBTZXJ2aWNlIGhpc3Rvcnkgb2Ygc2VhbGluZyBhdCBNYWNxdWFyaWUgSXNsYW5kCi0jIDxodHRwOi8vd3d3LnBhcmtzLnRhcy5nb3YuYXUvaW5kZXguYXNweD9iYXNlPTE4Mjg+Ci0jIDxodHRwOi8vd3d3LnBhcmtzLnRhcy5nb3YuYXUvaW5kZXguYXNweD9iYXNlPTE4MzE+LgorIyBodHRwOi8vd3d3LnBhcmtzLnRhcy5nb3YuYXUvaW5kZXguYXNweD9iYXNlPTE4MjgKKyMgaHR0cDovL3d3dy5wYXJrcy50YXMuZ292LmF1L2luZGV4LmFzcHg/YmFzZT0xODMxCiAjIEd1ZXNzIHRoYXQgaXQgd2FzIGxpa2UgQXVzdHJhbGlhL0hvYmFydCB3aGlsZSBpbmhhYml0ZWQgYmVmb3JlIDIwMTAuCiAjCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTAzLTEwKToKQEAgLTI1NiwxNiArMjU1LDE2IEBACiAjCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDEzLTA1LTIzKToKICMgVGhlIDE5MTkgdHJhbnNpdGlvbiBpcyBvdmVyc3BlY2lmaWVkIGJlbG93IHNvIHByZS0yMDEzIHppY3MKLSMgd2lsbCBwcm9kdWNlIGEgYmluYXJ5IGZpbGUgd2l0aCBhbiBFU1QtdHlwZSBhcyB0aGUgZmlyc3QgMzItYml0IHR5cGU7CisjIHdpbGwgcHJvZHVjZSBhIGJpbmFyeSBmaWxlIHdpdGggYW4gW0FdRVNULXR5cGUgYXMgdGhlIGZpcnN0IDMyLWJpdCB0eXBlOwogIyB0aGlzIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIHRpbWVzIGJlZm9yZSAxOTE2IGJ5CiAjIHByZS0yMDEzIHZlcnNpb25zIG9mIGxvY2FsdGltZS4KIFpvbmUgQW50YXJjdGljYS9NYWNxdWFyaWUgMAktCXp6egkxODk5IE5vdgotCQkJMTA6MDAJLQlFU1QJMTkxNiBPY3QgMSAyOjAwCi0JCQkxMDowMAkxOjAwCUVTVAkxOTE3IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTE5IEFwciAxIDA6MDBzCisJCQkxMDowMAktCUFFU1QJMTkxNiBPY3QgIDEgIDI6MDAKKwkJCTEwOjAwCTE6MDAJQUVEVAkxOTE3IEZlYgorCQkJMTA6MDAJQXVzCUFFJXNUCTE5MTkgQXByICAxICAwOjAwcwogCQkJMAktCXp6egkxOTQ4IE1hciAyNQotCQkJMTA6MDAJQXVzCUVTVAkxOTY3Ci0JCQkxMDowMAlBVAlFU1QJMjAxMCBBcHIgNCAzOjAwCisJCQkxMDowMAlBdXMJQUUlc1QJMTk2NworCQkJMTA6MDAJQVQJQUUlc1QJMjAxMCBBcHIgIDQgIDM6MDAKIAkJCTExOjAwCS0JTUlTVAkjIE1hY3F1YXJpZSBJIFN0YW5kYXJkIFRpbWUKIAogIyBDaHJpc3RtYXMKQEAgLTI3MywyNCArMjcyLDE0IEBACiBab25lIEluZGlhbi9DaHJpc3RtYXMJNzowMjo1MiAtCUxNVAkxODk1IEZlYgogCQkJNzowMAktCUNYVAkjIENocmlzdG1hcyBJc2xhbmQgVGltZQogCi0jIENvb2sgSXMKLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlDb29rCTE5NzgJb25seQktCU5vdgkxMgkwOjAwCTA6MzAJSFMKLVJ1bGUJQ29vawkxOTc5CTE5OTEJLQlNYXIJU3VuPj0xCTA6MDAJMAktCi1SdWxlCUNvb2sJMTk3OQkxOTkwCS0JT2N0CWxhc3RTdW4JMDowMAkwOjMwCUhTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIFBhY2lmaWMvUmFyb3RvbmdhCS0xMDozOTowNCAtCUxNVAkxOTAxCQkjIEF2YXJ1YQotCQkJLTEwOjMwCS0JQ0tUCTE5NzggTm92IDEyCSMgQ29vayBJcyBUaW1lCi0JCQktMTA6MDAJQ29vawlDSyVzVAotCi0jIENvY29zCisjIENvY29zIChLZWVsaW5nKSBJcwogIyBUaGVzZSBpc2xhbmRzIHdlcmUgcnVsZWQgYnkgdGhlIFJvc3MgZmFtaWx5IGZyb20gYWJvdXQgMTgzMCB0byAxOTc4LgogIyBXZSBkb24ndCBrbm93IHdoZW4gc3RhbmRhcmQgdGltZSB3YXMgaW50cm9kdWNlZDsgZm9yIG5vdywgd2UgZ3Vlc3MgMTkwMC4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJSW5kaWFuL0NvY29zCTY6Mjc6NDAJLQlMTVQJMTkwMAogCQkJNjozMAktCUNDVAkjIENvY29zIElzbGFuZHMgVGltZQogCisKICMgRmlqaQogCiAjIE1pbG5lIGdpdmVzIDExOjU1OjQ0IGZvciBTdXZhLgpAQCAtMzAwLDIwICsyODksMTMgQEAKICMgZnJvbSBOb3ZlbWJlciAyOXRoIDIwMDkgIHRvIEFwcmlsIDI1dGggMjAxMC4KICMKICMgIkRheWxpZ2h0IHNhdmluZ3MgdG8gY29tbWVuY2UgdGhpcyBtb250aCIKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWRpb2ZpamkuY29tLmZqL2Z1bGxzdG9yeS5waHA/aWQ9MjM3MTkiPgogIyBodHRwOi8vd3d3LnJhZGlvZmlqaS5jb20uZmovZnVsbHN0b3J5LnBocD9pZD0yMzcxOQotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZmlqaTAxLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2ZpamkwMS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0xMS0xMCk6CiAjIFRoZSBGaWppIEdvdmVybm1lbnQgaGFzIHBvc3RlZCBzb21lIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgYXBwcm92ZWQKICMgYW1lbmRtZW50czoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5maWppLmdvdi5mai9wdWJsaXNoL3BhZ2VfMTYxOTguc2h0bWwiPgogIyBodHRwOi8vd3d3LmZpamkuZ292LmZqL3B1Ymxpc2gvcGFnZV8xNjE5OC5zaHRtbAotIyA8L2E+CiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTAtMDMtMDMpOgogIyBUaGUgQ2FiaW5ldCBpbiBGaWppIGhhcyBkZWNpZGVkIHRvIGVuZCBEU1QgYWJvdXQgYSBtb250aCBlYXJseSwgb24KQEAgLTMyMiwzNSArMzA0LDI0IEBACiAjIDIwMTEgKGxhc3QgU3VuZGF5IGEgZ29vZCBndWVzcz8pLgogIwogIyBPZmZpY2lhbCBzb3VyY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmlqaS5nb3YuZmovaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9MTA5NjozMzEwLWNhYmluZXQtYXBwcm92ZXMtY2hhbmdlLWluLWRheWxpZ2h0LXNhdmluZ3MtZGF0ZXMmY2F0aWQ9NDk6Y2FiaW5ldC1yZWxlYXNlcyZJdGVtaWQ9MTY2Ij4KICMgaHR0cDovL3d3dy5maWppLmdvdi5mai9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD0xMDk2OjMzMTAtY2FiaW5ldC1hcHByb3Zlcy1jaGFuZ2UtaW4tZGF5bGlnaHQtc2F2aW5ncy1kYXRlcyZjYXRpZD00OTpjYWJpbmV0LXJlbGVhc2VzJkl0ZW1pZD0xNjYKLSMgPC9hPgogIwogIyBBIGJpdCBtb3JlIGJhY2tncm91bmQgaW5mbyBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvZmlqaS1kc3QtZW5kcy1tYXJjaC0yMDEwLmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvZmlqaS1kc3QtZW5kcy1tYXJjaC0yMDEwLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTEwLTI0KToKICMgQWNjb3JkaW5nIHRvIFJhZGlvIEZpamkgYW5kIEZpamkgVGltZXMgb25saW5lLCBGaWppIHdpbGwgZW5kIERTVCAzCiAjIHdlZWtzIGVhcmxpZXIgdGhhbiBleHBlY3RlZCAtIG9uIE1hcmNoIDYsIDIwMTEsIG5vdCBNYXJjaCAyNywgMjAxMS4uLgogIyBIZXJlIGlzIGNvbmZpcm1hdGlvbiBmcm9tIEdvdmVybm1lbnQgb2YgdGhlIFJlcHVibGljIG9mIHRoZSBGaWppIElzbGFuZHMsCiAjIE1pbmlzdHJ5IG9mIEluZm9ybWF0aW9uIChmaWppLmdvdi5maikgd2ViIHNpdGU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmlqaS5nb3YuZmovaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9MjYwODpkYXlsaWdodC1zYXZpbmdzJmNhdGlkPTcxOnByZXNzLXJlbGVhc2VzJkl0ZW1pZD0xNTUiPgogIyBodHRwOi8vd3d3LmZpamkuZ292LmZqL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTI2MDg6ZGF5bGlnaHQtc2F2aW5ncyZjYXRpZD03MTpwcmVzcy1yZWxlYXNlcyZJdGVtaWQ9MTU1Ci0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19maWppMDQuaHRtbCI+CiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZmlqaTA0Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDExLTEwLTAzKToKICMgTm93IHRoZSBkYXRlcyBoYXZlIGJlZW4gY29uZmlybWVkLCBhbmQgYXQgbGVhc3Qgb3VyIHN0YXJ0IGRhdGUKICMgYXNzdW1wdGlvbiB3YXMgY29ycmVjdCAoZW5kIGRhdGUgd2FzIG9uZSB3ZWVrIHdyb25nKS4KICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5maWppLmdvdi5mai9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD00OTY2OmRheWxpZ2h0LXNhdmluZy1zdGFydHMtaW4tZmlqaSZjYXRpZD03MTpwcmVzcy1yZWxlYXNlcyZJdGVtaWQ9MTU1Ij4KLSMgd3d3LmZpamkuZ292LmZqL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTQ5NjY6ZGF5bGlnaHQtc2F2aW5nLXN0YXJ0cy1pbi1maWppJmNhdGlkPTcxOnByZXNzLXJlbGVhc2VzJkl0ZW1pZD0xNTUKLSMgPC9hPgorIyBodHRwOi8vd3d3LmZpamkuZ292LmZqL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTQ5NjY6ZGF5bGlnaHQtc2F2aW5nLXN0YXJ0cy1pbi1maWppJmNhdGlkPTcxOnByZXNzLXJlbGVhc2VzJkl0ZW1pZD0xNTUKICMgd2hpY2ggc2F5cwogIyBNZW1iZXJzIG9mIHRoZSBwdWJsaWMgYXJlIHJlbWluZGVkIHRvIGNoYW5nZSB0aGVpciB0aW1lIHRvIG9uZSBob3VyIGluCiAjIGFkdmFuY2UgYXQgMmFtIHRvIDNhbSBvbiBPY3RvYmVyIDIzLCAyMDExIGFuZCBvbmUgaG91ciBiYWNrIGF0IDNhbSB0bwpAQCAtMzYwLDkgKzMzMSw3IEBACiAjIEFub3RoZXIgY2hhbmdlIHRvIHRoZSBGaWppIERTVCBlbmQgZGF0ZS4gSW4gdGhlIFRaIGRhdGFiYXNlIHRoZSBlbmQgZGF0ZSBmb3IKICMgRmlqaSBEU1QgMjAxMiwgaXMgY3VycmVudGx5IEZlYiAyNi4gVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIHRvIEphbiAyMi4KICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5maWppLmdvdi5mai9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD01MDE3OmFtZW5kbWVudHMtdG8tZGF5bGlnaHQtc2F2aW5ncyZjYXRpZD03MTpwcmVzcy1yZWxlYXNlcyZJdGVtaWQ9MTU1Ij4KICMgaHR0cDovL3d3dy5maWppLmdvdi5mai9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD01MDE3OmFtZW5kbWVudHMtdG8tZGF5bGlnaHQtc2F2aW5ncyZjYXRpZD03MTpwcmVzcy1yZWxlYXNlcyZJdGVtaWQ9MTU1Ci0jIDwvYT4KICMgc3RhdGVzOgogIwogIyBUaGUgZW5kIG9mIGRheWxpZ2h0IHNhdmluZyBzY2hlZHVsZWQgaW5pdGlhbGx5IGZvciB0aGUgMjZ0aCBvZiBGZWJydWFyeSAyMDEyCkBAIC00MDAsMTYgKzM2OSwxNiBAQAogUnVsZQlGaWppCTIwMTIJMjAxMwktCUphbglTdW4+PTE4CTM6MDAJMAktCiBSdWxlCUZpamkJMjAxNAltYXgJLQlKYW4JU3VuPj0xOAkyOjAwCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL0ZpamkJMTE6NTU6NDQgLQlMTVQJMTkxNSBPY3QgMjYJIyBTdXZhCitab25lCVBhY2lmaWMvRmlqaQkxMTo1NTo0NCAtCUxNVAkxOTE1IE9jdCAyNiAjIFN1dmEKIAkJCTEyOjAwCUZpamkJRkolc1QJIyBGaWppIFRpbWUKIAogIyBGcmVuY2ggUG9seW5lc2lhCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvR2FtYmllcgkgLTg6NTk6NDggLQlMTVQJMTkxMiBPY3QJIyBSaWtpdGVhCitab25lCVBhY2lmaWMvR2FtYmllcgkgLTg6NTk6NDggLQlMTVQJMTkxMiBPY3QgIyBSaWtpdGVhCiAJCQkgLTk6MDAJLQlHQU1UCSMgR2FtYmllciBUaW1lCiBab25lCVBhY2lmaWMvTWFycXVlc2FzIC05OjE4OjAwIC0JTE1UCTE5MTIgT2N0CiAJCQkgLTk6MzAJLQlNQVJUCSMgTWFycXVlc2FzIFRpbWUKLVpvbmUJUGFjaWZpYy9UYWhpdGkJIC05OjU4OjE2IC0JTE1UCTE5MTIgT2N0CSMgUGFwZWV0ZQorWm9uZQlQYWNpZmljL1RhaGl0aQkgLTk6NTg6MTYgLQlMTVQJMTkxMiBPY3QgIyBQYXBlZXRlCiAJCQktMTA6MDAJLQlUQUhUCSMgVGFoaXRpIFRpbWUKICMgQ2xpcHBlcnRvbiAobmVhciBOb3J0aCBBbWVyaWNhKSBpcyBhZG1pbmlzdGVyZWQgZnJvbSBGcmVuY2ggUG9seW5lc2lhOwogIyBpdCBpcyB1bmluaGFiaXRlZC4KQEAgLTQxNywxNCArMzg2LDE0IEBACiAjIEd1YW0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJUGFjaWZpYy9HdWFtCS0xNDoyMTowMCAtCUxNVAkxODQ0IERlYyAzMQotCQkJIDk6Mzk6MDAgLQlMTVQJMTkwMQkJIyBBZ2FuYQotCQkJMTA6MDAJLQlHU1QJMjAwMCBEZWMgMjMJIyBHdWFtCisJCQkgOTozOTowMCAtCUxNVAkxOTAxICAgICAgICAjIEFnYW5hCisJCQkxMDowMAktCUdTVAkyMDAwIERlYyAyMyAjIEd1YW0KIAkJCTEwOjAwCS0JQ2hTVAkjIENoYW1vcnJvIFN0YW5kYXJkIFRpbWUKIAogIyBLaXJpYmF0aQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1RhcmF3YQkgMTE6MzI6MDQgLQlMTVQJMTkwMQkJIyBCYWlyaWtpCi0JCQkgMTI6MDAJLQlHSUxUCQkgIyBHaWxiZXJ0IElzIFRpbWUKK1pvbmUgUGFjaWZpYy9UYXJhd2EJIDExOjMyOjA0IC0JTE1UCTE5MDEgIyBCYWlyaWtpCisJCQkgMTI6MDAJLQlHSUxUCSMgR2lsYmVydCBJcyBUaW1lCiBab25lIFBhY2lmaWMvRW5kZXJidXJ5CS0xMToyNDoyMCAtCUxNVAkxOTAxCiAJCQktMTI6MDAJLQlQSE9UCTE5NzkgT2N0ICMgUGhvZW5peCBJcyBUaW1lCiAJCQktMTE6MDAJLQlQSE9UCTE5OTUKQEAgLTQzOCw3ICs0MDcsNyBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBQYWNpZmljL1NhaXBhbgktMTQ6MTc6MDAgLQlMTVQJMTg0NCBEZWMgMzEKIAkJCSA5OjQzOjAwIC0JTE1UCTE5MDEKLQkJCSA5OjAwCS0JTVBUCTE5NjkgT2N0ICMgTiBNYXJpYW5hIElzIFRpbWUKKwkJCSA5OjAwCS0JTVBUCTE5NjkgT2N0ICAgICMgTiBNYXJpYW5hIElzIFRpbWUKIAkJCTEwOjAwCS0JTVBUCTIwMDAgRGVjIDIzCiAJCQkxMDowMAktCUNoU1QJIyBDaGFtb3JybyBTdGFuZGFyZCBUaW1lCiAKQEAgLTQ0OSwyNCArNDE4LDI0IEBACiAJCQkxMjowMAktCU1IVAogWm9uZSBQYWNpZmljL0t3YWphbGVpbgkxMTowOToyMCAtCUxNVAkxOTAxCiAJCQkxMTowMAktCU1IVAkxOTY5IE9jdAotCQkJLTEyOjAwCS0JS1dBVAkxOTkzIEF1ZyAyMAkjIEt3YWphbGVpbiBUaW1lCisJCQktMTI6MDAJLQlLV0FUCTE5OTMgQXVnIDIwICMgS3dhamFsZWluIFRpbWUKIAkJCTEyOjAwCS0JTUhUCiAKICMgTWljcm9uZXNpYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBQYWNpZmljL0NodXVrCTEwOjA3OjA4IC0JTE1UCTE5MDEKLQkJCTEwOjAwCS0JQ0hVVAkJCSMgQ2h1dWsgVGltZQotWm9uZSBQYWNpZmljL1BvaG5wZWkJMTA6MzI6NTIgLQlMTVQJMTkwMQkJIyBLb2xvbmlhCi0JCQkxMTowMAktCVBPTlQJCQkjIFBvaG5wZWkgVGltZQorCQkJMTA6MDAJLQlDSFVUCSMgQ2h1dWsgVGltZQorWm9uZSBQYWNpZmljL1BvaG5wZWkJMTA6MzI6NTIgLQlMTVQJMTkwMSAjIEtvbG9uaWEKKwkJCTExOjAwCS0JUE9OVAkjIFBvaG5wZWkgVGltZQogWm9uZSBQYWNpZmljL0tvc3JhZQkxMDo1MTo1NiAtCUxNVAkxOTAxCi0JCQkxMTowMAktCUtPU1QJMTk2OSBPY3QJIyBLb3NyYWUgVGltZQorCQkJMTE6MDAJLQlLT1NUCTE5NjkgT2N0ICMgS29zcmFlIFRpbWUKIAkJCTEyOjAwCS0JS09TVAkxOTk5CiAJCQkxMTowMAktCUtPU1QKIAogIyBOYXVydQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL05hdXJ1CTExOjA3OjQwIC0JTE1UCTE5MjEgSmFuIDE1CSMgVWFvYmUKLQkJCTExOjMwCS0JTlJUCTE5NDIgTWFyIDE1CSMgTmF1cnUgVGltZQorWm9uZQlQYWNpZmljL05hdXJ1CTExOjA3OjQwIC0JTE1UCTE5MjEgSmFuIDE1ICMgVWFvYmUKKwkJCTExOjMwCS0JTlJUCTE5NDIgTWFyIDE1ICMgTmF1cnUgVGltZQogCQkJOTowMAktCUpTVAkxOTQ0IEF1ZyAxNQogCQkJMTE6MzAJLQlOUlQJMTk3OSBNYXkKIAkJCTEyOjAwCS0JTlJUCkBAIC00NzksNyArNDQ4LDcgQEAKICMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGUgZm9sbG93aW5nIHdhcyBhdCAyOjAwOyBnbyB3aXRoIElBVEEuCiBSdWxlCU5DCTE5OTcJb25seQktCU1hcgkgMgkyOjAwcwkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9Ob3VtZWEJMTE6MDU6NDggLQlMTVQJMTkxMiBKYW4gMTMKK1pvbmUJUGFjaWZpYy9Ob3VtZWEJMTE6MDU6NDggLQlMTVQJMTkxMiBKYW4gMTMgIyBOb3Vtw6lhCiAJCQkxMTowMAlOQwlOQyVzVAogCiAKQEAgLTQ5Niw3ICs0NjUsOCBAQAogUnVsZQlOWgkxOTM0CTE5NDAJLQlTZXAJbGFzdFN1bgkyOjAwCTA6MzAJUwogUnVsZQlOWgkxOTQ2CW9ubHkJLQlKYW4JIDEJMDowMAkwCVMKICMgU2luY2UgMTk1NyBDaGF0aGFtIGhhcyBiZWVuIDQ1IG1pbnV0ZXMgYWhlYWQgb2YgTlosIGJ1dCB0aGVyZSdzIG5vCi0jIGNvbnZlbmllbnQgbm90YXRpb24gZm9yIHRoaXMgc28gd2UgbXVzdCBkdXBsaWNhdGUgdGhlIFJ1bGUgbGluZXMuCisjIGNvbnZlbmllbnQgc2luZ2xlIG5vdGF0aW9uIGZvciB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGlzIHRyYW5zaXRpb24KKyMgc28gd2UgbXVzdCBkdXBsaWNhdGUgdGhlIFJ1bGUgbGluZXMuCiBSdWxlCU5aCTE5NzQJb25seQktCU5vdglTdW4+PTEJMjowMHMJMTowMAlECiBSdWxlCUNoYXRoYW0JMTk3NAlvbmx5CS0JTm92CVN1bj49MQkyOjQ1cwkxOjAwCUQKIFJ1bGUJTloJMTk3NQlvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAlTCkBAIC01MTksMTMgKzQ4OSwxNCBAQAogWm9uZSBQYWNpZmljL0F1Y2tsYW5kCTExOjM5OjA0IC0JTE1UCTE4NjggTm92ICAyCiAJCQkxMTozMAlOWglOWiVzVAkxOTQ2IEphbiAgMQogCQkJMTI6MDAJTloJTlolc1QKLVpvbmUgUGFjaWZpYy9DaGF0aGFtCTEyOjEzOjQ4IC0JTE1UCTE5NTcgSmFuICAxCitab25lIFBhY2lmaWMvQ2hhdGhhbQkxMjoxMzo0OCAtCUxNVAkxODY4IE5vdiAgMgorCQkJMTI6MTUJLQlDSEFTVAkxOTQ2IEphbiAgMQogCQkJMTI6NDUJQ2hhdGhhbQlDSEElc1QKIAogTGluayBQYWNpZmljL0F1Y2tsYW5kIEFudGFyY3RpY2EvTWNNdXJkbwogCiAjIEF1Y2tsYW5kIElzCi0jIHVuaW5oYWJpdGVkOyBNYW9yaSBhbmQgTW9yaW9yaSwgY29sb25pYWwgc2V0dGxlcnMsIHBhc3RvcmFsaXN0cywgc2VhbGVycywKKyMgdW5pbmhhYml0ZWQ7IE3EgW9yaSBhbmQgTW9yaW9yaSwgY29sb25pYWwgc2V0dGxlcnMsIHBhc3RvcmFsaXN0cywgc2VhbGVycywKICMgYW5kIHNjaWVudGlmaWMgcGVyc29ubmVsIGhhdmUgd2ludGVyZWQKIAogIyBDYW1wYmVsbCBJCkBAIC01MzQsNDggKzUwNSw1OCBAQAogIyBwcmV2aW91c2x5IHdoYWxlcnMsIHNlYWxlcnMsIHBhc3RvcmFsaXN0cywgYW5kIHNjaWVudGlmaWMgcGVyc29ubmVsIHdpbnRlcmVkCiAjIHdhcyBwcm9iYWJseSBsaWtlIFBhY2lmaWMvQXVja2xhbmQKIAorIyBDb29rIElzCisjIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgorIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJQ29vawkxOTc4CW9ubHkJLQlOb3YJMTIJMDowMAkwOjMwCUhTCitSdWxlCUNvb2sJMTk3OQkxOTkxCS0JTWFyCVN1bj49MQkwOjAwCTAJLQorUnVsZQlDb29rCTE5NzkJMTk5MAktCU9jdAlsYXN0U3VuCTA6MDAJMDozMAlIUworIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQorWm9uZSBQYWNpZmljL1Jhcm90b25nYQktMTA6Mzk6MDQgLQlMTVQJMTkwMSAgICAgICAgIyBBdmFydWEKKwkJCS0xMDozMAktCUNLVAkxOTc4IE5vdiAxMiAjIENvb2sgSXMgVGltZQorCQkJLTEwOjAwCUNvb2sJQ0slc1QKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAKICMgTml1ZQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL05pdWUJLTExOjE5OjQwIC0JTE1UCTE5MDEJCSMgQWxvZmkKLQkJCS0xMToyMAktCU5VVAkxOTUxCSMgTml1ZSBUaW1lCi0JCQktMTE6MzAJLQlOVVQJMTk3OCBPY3QgMQorWm9uZQlQYWNpZmljL05pdWUJLTExOjE5OjQwIC0JTE1UCTE5MDEgICAgICAgICMgQWxvZmkKKwkJCS0xMToyMAktCU5VVAkxOTUxICAgICAgICAjIE5pdWUgVGltZQorCQkJLTExOjMwCS0JTlVUCTE5NzggT2N0ICAxCiAJCQktMTE6MDAJLQlOVVQKIAogIyBOb3Jmb2xrCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTm9yZm9sawkxMToxMTo1MiAtCUxNVAkxOTAxCQkjIEtpbmdzdG9uCi0JCQkxMToxMgktCU5NVAkxOTUxCSMgTm9yZm9sayBNZWFuIFRpbWUKLQkJCTExOjMwCS0JTkZUCQkjIE5vcmZvbGsgVGltZQorWm9uZQlQYWNpZmljL05vcmZvbGsJMTE6MTE6NTIgLQlMTVQJMTkwMSAjIEtpbmdzdG9uCisJCQkxMToxMgktCU5NVAkxOTUxICMgTm9yZm9sayBNZWFuIFRpbWUKKwkJCTExOjMwCS0JTkZUCSMgTm9yZm9sayBUaW1lCiAKICMgUGFsYXUgKEJlbGF1KQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1BhbGF1CTg6NTc6NTYgLQlMTVQJMTkwMQkJIyBLb3JvcgorWm9uZSBQYWNpZmljL1BhbGF1CTg6NTc6NTYgLQlMTVQJMTkwMSAjIEtvcm9yCiAJCQk5OjAwCS0JUFdUCSMgUGFsYXUgVGltZQogCiAjIFBhcHVhIE5ldyBHdWluZWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgUGFjaWZpYy9Qb3J0X01vcmVzYnkgOTo0ODo0MCAtCUxNVAkxODgwCi0JCQk5OjQ4OjMyCS0JUE1NVAkxODk1CSMgUG9ydCBNb3Jlc2J5IE1lYW4gVGltZQotCQkJMTA6MDAJLQlQR1QJCSMgUGFwdWEgTmV3IEd1aW5lYSBUaW1lCisJCQk5OjQ4OjMyCS0JUE1NVAkxODk1ICMgUG9ydCBNb3Jlc2J5IE1lYW4gVGltZQorCQkJMTA6MDAJLQlQR1QJIyBQYXB1YSBOZXcgR3VpbmVhIFRpbWUKIAogIyBQaXRjYWlybgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1BpdGNhaXJuCS04OjQwOjIwIC0JTE1UCTE5MDEJCSMgQWRhbXN0b3duCi0JCQktODozMAktCVBOVAkxOTk4IEFwciAyNyAwMDowMAorWm9uZSBQYWNpZmljL1BpdGNhaXJuCS04OjQwOjIwIC0JTE1UCTE5MDEgICAgICAgICMgQWRhbXN0b3duCisJCQktODozMAktCVBOVAkxOTk4IEFwciAyNyAgMDowMAogCQkJLTg6MDAJLQlQU1QJIyBQaXRjYWlybiBTdGFuZGFyZCBUaW1lCiAKICMgQW1lcmljYW4gU2Ftb2EKIFpvbmUgUGFjaWZpYy9QYWdvX1BhZ28JIDEyOjM3OjEyIC0JTE1UCTE4NzkgSnVsICA1CiAJCQktMTE6MjI6NDggLQlMTVQJMTkxMQotCQkJLTExOjMwCS0JU0FNVAkxOTUwCQkjIFNhbW9hIFRpbWUKLQkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgkjIE49Tm9tZQotCQkJLTExOjAwCS0JQlNUCTE5ODMgTm92IDMwCSMgQj1CZXJpbmcKLQkJCS0xMTowMAktCVNTVAkJCSMgUz1TYW1vYQorCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByICAgICMgTj1Ob21lCisJCQktMTE6MDAJLQlCU1QJMTk4MyBOb3YgMzAgIyBCPUJlcmluZworCQkJLTExOjAwCS0JU1NUCSAgICAgICAgICAgICMgUz1TYW1vYQogCi0jIFNhbW9hCisjIFNhbW9hIChmb3JtZXJseSBhbmQgYWxzbyBrbm93biBhcyBXZXN0ZXJuIFNhbW9hKQogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTEwLTE2KToKICMgV2UgaGF2ZSBiZWVuIGluIGNvbnRhY3Qgd2l0aCB0aGUgZ292ZXJubWVudCBvZiBTYW1vYSBhZ2FpbiwgYW5kIHJlY2VpdmVkCkBAIC01ODYsMTQxICs1NjcsODAgQEAKICMgU3VuZGF5IG9mIEFwcmlsIDIwMTEuIgogIwogIyBCYWNrZ3JvdW5kIGluZm86Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zYW1vYS1kc3QtcGxhbi0yMDA5Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc2Ftb2EtZHN0LXBsYW4tMjAwOS5odG1sCi0jIDwvYT4KICMKICMgU2Ftb2EncyBEYXlsaWdodCBTYXZpbmcgVGltZSBBY3QgMjAwOSBpcyBhdmFpbGFibGUgaGVyZSwgYnV0IGRvZXMgbm90CiAjIGNvbnRhaW4gYW55IGRhdGVzOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBhcmxpYW1lbnQuZ292LndzL2RvY3VtZW50cy9hY3RzL0RheWxpZ2h0JTIwU2F2aW5nJTIwQWN0JTIwJTIwMjAwOSUyMCUyOEVuZ2xpc2glMjklMjAtJTIwRmluYWwlMjA3LTctMDkxLnBkZiI+CiAjIGh0dHA6Ly93d3cucGFybGlhbWVudC5nb3Yud3MvZG9jdW1lbnRzL2FjdHMvRGF5bGlnaHQlMjBTYXZpbmclMjBBY3QlMjAlMjAyMDA5JTIwJTI4RW5nbGlzaCUyOSUyMC0lMjBGaW5hbCUyMDctNy0wOTEucGRmCi0jIDwvYT4KIAogIyBGcm9tIExhdXB1ZSBSYXltb25kIEh1Z2hlcyAoMjAxMC0xMC0wNyk6CiAjIFBsZWFzZSBzZWUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tY2lsLmdvdi53cyI+CiAjIGh0dHA6Ly93d3cubWNpbC5nb3Yud3MKLSMgPC9hPiwKICMgdGhlIE1pbmlzdHJ5IG9mIENvbW1lcmNlLCBJbmR1c3RyeSBhbmQgTGFib3VyIChzaWRlZnJhbWUpICJMYXN0IFN1bmRheQogIyBTZXB0ZW1iZXIgMjAxMCAoMjYvMDkvMTApIC0gYWRqdXN0IGNsb2NrcyBmb3J3YXJkIGZyb20gMTI6MDAgbWlkbmlnaHQKICMgdG8gMDE6MDBhbSBhbmQgRmlyc3QgU3VuZGF5IEFwcmlsIDIwMTEgKDAzLzA0LzExKSAtIGFkanVzdCBjbG9ja3MKICMgYmFja3dhcmRzIGZyb20gMTowMGFtIHRvIDEyOjAwYW0iCiAKICMgRnJvbSBMYXVwdWUgUmF5bW9uZCBIdWdoZXMgKDIwMTEtMDMtMDcpOgotIyBJIGJlbGlldmUgdGhpcyB3aWxsIGJlIHBvc3RlZCBzaG9ydGx5IG9uIHRoZSB3ZWJzaXRlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWNpbC5nb3Yud3MiPgotIyB3d3cubWNpbC5nb3Yud3MKLSMgPC9hPgorIyBbaHR0cDovL3d3dy5tY2lsLmdvdi53cy9mdGNkL2RheWxpZ2h0X3NhdmluZ18yMDExLnBkZl0KICMKLSMgUFVCTElDIE5PVElDRSBPTiBEQVlMSUdIVCBTQVZJTkcgVElNRQotIwotIyBQdXJzdWFudCB0byB0aGUgRGF5bGlnaHQgU2F2aW5nIEFjdCAyMDA5IGFuZCBDYWJpbmV0cyBkZWNpc2lvbiwKLSMgYnVzaW5lc3NlcyBhbmQgdGhlIGdlbmVyYWwgcHVibGljIGFyZSBoZXJlYnkgYWR2aXNlZCB0aGF0IGRheWxpZ2h0Ci0jIHNhdmluZyB0aW1lIGlzIG9uIHRoZSBmaXJzdCBTYXR1cmRheSBvZiBBcHJpbCAyMDExICgwMi8wNC8xMSkuCi0jCi0jIFRoZSBwdWJsaWMgaXMgdGhlcmVmb3JlIGFkdmlzZWQgdGhhdCB3aGVuIHRoZSBzdGFuZGFyZCB0aW1lIHN0cmlrZXMKLSMgdGhlIGhvdXIgb2YgZm91ciBvY2xvY2sgKDQuMDBhbSBvciAwNDAwIEhvdXJzKSBvbiB0aGUgMm5kIEFwcmlsIDIwMTEsCi0jIHRoZW4gYWxsIGluc3RydW1lbnRzIHVzZWQgdG8gbWVhc3VyZSBzdGFuZGFyZCB0aW1lIGFyZSB0byBiZQotIyBhZGp1c3RlZC9jaGFuZ2VkIHRvIHRocmVlIG9jbG9jayAoMzowMGFtIG9yIDAzMDBIcnMpLgotIwotIyBNYXJnYXJldCBGcnVlYW4gQUNUSU5HIENISUVGIEVYRUNVVElWRSBPRkZJQ0VSIE1JTklTVFJZIE9GIENPTU1FUkNFLAotIyBJTkRVU1RSWSBBTkQgTEFCT1VSIDI4dGggRmVicnVhcnkgMjAxMQorIyAuLi4gd2hlbiB0aGUgc3RhbmRhcmQgdGltZSBzdHJpa2VzIHRoZSBob3VyIG9mIGZvdXIgbydjbG9jayAoNC4wMGFtCisjIG9yIDA0MDAgSG91cnMpIG9uIHRoZSAybmQgQXByaWwgMjAxMSwgdGhlbiBhbGwgaW5zdHJ1bWVudHMgdXNlZCB0bworIyBtZWFzdXJlIHN0YW5kYXJkIHRpbWUgYXJlIHRvIGJlIGFkanVzdGVkL2NoYW5nZWQgdG8gdGhyZWUgbydjbG9jaworIyAoMzowMGFtIG9yIDAzMDBIcnMpLgogCi0jIEZyb20gRGF2aWQgWnVlbGtlICgyMDExLTA1LTA5KToKKyMgRnJvbSBEYXZpZCBaw7xsa2UgKDIwMTEtMDUtMDkpOgogIyBTdWJqZWN0OiBTYW1vYSB0byBtb3ZlIHRpbWV6b25lIGZyb20gZWFzdCB0byB3ZXN0IG9mIGludGVybmF0aW9uYWwgZGF0ZSBsaW5lCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW9ybmluZ3N0YXIuY28udWsvdWsvbWFya2V0cy9uZXdzZmVlZGl0ZW0uYXNweD9pZD0xMzg1MDE5NTgzNDc5NjMiPgogIyBodHRwOi8vd3d3Lm1vcm5pbmdzdGFyLmNvLnVrL3VrL21hcmtldHMvbmV3c2ZlZWRpdGVtLmFzcHg/aWQ9MTM4NTAxOTU4MzQ3OTYzCi0jIDwvYT4KIAotIyBGcm9tIE1hcmsgU2ltLVNtaXRoICgyMDExLTA4LTE3KToKLSMgSSBoYXZlIGJlZW4gaW4gY29udGFjdCB3aXRoIExlaWxhbmkgVHVhbGEgV2FycmVuIGZyb20gdGhlIFNhbW9hIExhdwotIyBSZWZvcm0gQ29tbWlzc2lvbiwgYW5kIHNoZSBoYXMgc2VudCBtZSBhIGNvcHkgb2YgdGhlIEJpbGwgdGhhdCBzaGUKLSMgY29uZmlybWVkIGhhcyBiZWVuIHBhc3NlZC4uLk1vc3Qgb2YgdGhlIHNlY3Rpb25zIGFyZSBhYm91dCBtYXBzIHJhdGhlcgotIyB0aGFuIHRoZSB0aW1lIHpvbmUgY2hhbmdlLCBidXQgSSdsbCBwYXN0ZSB0aGUgcmVsZXZhbnQgYml0cyBiZWxvdy4gQnV0Ci0jIHRoZSBlc3NlbmNlIGlzIHRoYXQgYXQgbWlkbmlnaHQgMjkgRGVjIChVVEMtMTEgSSBzdXBwb3NlKSwgU2Ftb2EKLSMgY2hhbmdlcyBmcm9tIFVUQy0xMSB0byBVVEMrMTM6Ci0jCi0jIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIEJpbGwgMjAxMQotIwotIyBBTiBBQ1QgdG8gcHJvdmlkZSBmb3IgdGhlIGNoYW5nZSB0byBzdGFuZGFyZCB0aW1lIGluIFNhbW9hIGFuZCB0byBtYWtlCi0jIGNvbnNlcXVlbnRpYWwgYW1lbmRtZW50cyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIEludGVybmF0aW9uYWwgRGF0ZQotIyBMaW5lLCBhbmQgZm9yIHJlbGF0ZWQgcHVycG9zZXMuCi0jCi0jIEJFIElUIEVOQUNURUQgYnkgdGhlIExlZ2lzbGF0aXZlIEFzc2VtYmx5IG9mIFNhbW9hIGluIFBhcmxpYW1lbnQKLSMgYXNzZW1ibGVkIGFzIGZvbGxvd3M6Ci0jCi0jIDEuIFNob3J0IHRpdGxlIGFuZCBjb21tZW5jZW1lbnQtKDEpIFRoaXMgQWN0IG1heSBiZSBjaXRlZCBhcyB0aGUKLSMgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUgQWN0IDIwMTEuICgyKSBFeGNlcHQgZm9yIHNlY3Rpb24gNSgzKSB0aGlzIEFjdAotIyBjb21tZW5jZXMgYXQgMTIgbydjbG9jayBtaWRuaWdodCwgb24gVGh1cnNkYXkgMjl0aCBEZWNlbWJlciAyMDExLiAoMykKLSMgU2VjdGlvbiA1KDMpIGNvbW1lbmNlcyBvbiB0aGUgZGF0ZSBvZiBhc3NlbnQgYnkgdGhlIEhlYWQgb2YgU3RhdGUuCi0jCi0jIFtzbmlwXQotIwotIyAzLiBJbnRlcnByZXRhdGlvbiAtIFtzbmlwXSAiU2Ftb2Egc3RhbmRhcmQgdGltZSIgaW4gdGhpcyBBY3QgYW5kIGFueQotIyBvdGhlciBzdGF0dXRlIG9mIFNhbW9hIHdoaWNoIHJlZmVycyB0byAnU2Ftb2Egc3RhbmRhcmQgdGltZScgbWVhbnMgdGhlCi0jIHRpbWUgMTMgaG91cnMgaW4gYWR2YW5jZSBvZiBDby1vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUuCi0jCi0jIDQuIFNhbW9hIHN0YW5kYXJkIHRpbWUgLSAoMSkgVXBvbiB0aGUgY29tbWVuY2VtZW50IG9mIHRoaXMgQWN0LCBTYW1vYQotIyBzdGFuZGFyZCB0aW1lIHNoYWxsIGJlIHNldCBhdCAxMyBob3VycyBpbiBhZHZhbmNlIG9mIENvLW9yZGluYXRlZAotIyBVbml2ZXJzYWwgVGltZSBmb3IgdGhlIHdob2xlIG9mIFNhbW9hLiAoMikgQWxsIHJlZmVyZW5jZXMgdG8gU2Ftb2EncwotIyB0aW1lIHpvbmUgYW5kIHRvIFNhbW9hIHN0YW5kYXJkIHRpbWUgaW4gU2Ftb2EgaW4gYWxsIGxlZ2lzbGF0aW9uIGFuZAotIyBpbnN0cnVtZW50cyBhZnRlciB0aGUgY29tbWVuY2VtZW50IG9mIHRoaXMgQWN0IHNoYWxsIGJlIHJlZmVyZW5jZXMgdG8KLSMgU2Ftb2Egc3RhbmRhcmQgdGltZSBhcyBwcm92aWRlZCBmb3IgaW4gdGhpcyBBY3QuICgzKSBOb3RoaW5nIGluIHRoaXMKLSMgQWN0IGFmZmVjdHMgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIERheWxpZ2h0IFNhdmluZyBBY3QgMjAwOSwgZXhjZXB0IHRoYXQKLSMgaXQgZGVmaW5lcyBTYW1vYSBzdGFuZGFyZCB0aW1lLi4uLgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTI3KToKKyMgVGhlIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIEFjdCAyMDExCisjIGh0dHA6Ly93d3cucGFybGlhbWVudC5nb3Yud3MvaW1hZ2VzL0FDVFMvSW50ZXJuYXRpb25hbF9EYXRlX0xpbmVfQWN0X18yMDExXy1fRW5nLnBkZgorIyBjaGFuZ2VkIFNhbW9hIGZyb20gVVRDLTExIHRvIFVUQysxMywgZWZmZWN0aXZlICIxMiBvJ2Nsb2NrIG1pZG5pZ2h0LCBvbgorIyBUaHVyc2RheSAyOXRoIERlY2VtYmVyIDIwMTEiLiAgVGhlIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIHdhcyBhZGp1c3RlZAorIyBhY2NvcmRpbmdseS4KIAogIyBGcm9tIExhdXB1ZSBSYXltb25kIEh1Z2hlcyAoMjAxMS0wOS0wMik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWNpbC5nb3Yud3MvbWNpbF9wdWJsaWNhdGlvbnMuaHRtbCI+CiAjIGh0dHA6Ly93d3cubWNpbC5nb3Yud3MvbWNpbF9wdWJsaWNhdGlvbnMuaHRtbAotIyA8L2E+CiAjCiAjIGhlcmUgaXMgdGhlIG9mZmljaWFsIHdlYnNpdGUgcHVibGljYXRpb24gZm9yIFNhbW9hIERTVCBhbmQgZGF0ZWxpbmUgY2hhbmdlCiAjCiAjIERTVAotIyBZZWFyCUVuZAlUaW1lCVN0YXJ0CVRpbWUKLSMgMjAxMQktIC0gLQktIC0gLQkyNCBTZXB0ZW1iZXIJMzowMGFtIHRvIDQ6MDBhbQotIyAyMDEyCTAxIEFwcmlsCTQ6MDBhbSB0byAzOjAwYW0JLSAtIC0JLSAtIC0KKyMgWWVhciAgRW5kICAgICAgVGltZSAgICAgICAgICAgICAgU3RhcnQgICAgICAgIFRpbWUKKyMgMjAxMSAgLSAtIC0gICAgLSAtIC0gICAgICAgICAgICAgMjQgU2VwdGVtYmVyIDM6MDBhbSB0byA0OjAwYW0KKyMgMjAxMiAgMDEgQXByaWwgNDowMGFtIHRvIDM6MDBhbSAgLSAtIC0gICAgICAgIC0gLSAtCiAjCiAjIERhdGVsaW5lIENoYW5nZSBza2lwIEZyaWRheSAzMHRoIERlYyAyMDExCiAjIFRodXJzZGF5IDI5dGggRGVjZW1iZXIgMjAxMQkyMzo1OTo1OSBIb3VycwogIyBTYXR1cmRheSAzMXN0IERlY2VtYmVyIDIwMTEJMDA6MDA6MDAgSG91cnMKICMKLSMgQ2xhcmlmaWNhdGlvbiBieSBUaW0gUGFyZW50aSAoMjAxMi0wMS0wMyk6Ci0jIEFsdGhvdWdoIFNhbW9hIGhhcyB1c2VkIERheWxpZ2h0IFNhdmluZyBUaW1lIGluIHRoZSAyMDEwLTIwMTEgYW5kIDIwMTEtMjAxMgotIyBzZWFzb25zLCB0aGVyZSBpcyBub3QgeWV0IGFueSBpbmRpY2F0aW9uIHRoYXQgdGhpcyB0cmVuZCB3aWxsIGNvbnRpbnVlIG9uCi0jIGEgcmVndWxhciBiYXNpcy4gRm9yIG5vdywgd2UgaGF2ZSBleHBsaWNpdGx5IGxpc3RlZCB0aGUgdHJhbnNpdGlvbnMgYmVsb3cuCi0jCi0jIEZyb20gTmlja3kgKDIwMTItMDktMTApOgorIyBGcm9tIE5pY2hvbGFzIFBlcmVpcmEgKDIwMTItMDktMTApOgogIyBEYXlsaWdodCBTYXZpbmcgVGltZSBjb21tZW5jZXMgb24gU3VuZGF5IDMwdGggU2VwdGVtYmVyIDIwMTIgYW5kCi0jIGVuZHMgb24gU3VuZGF5IDd0aCBvZiBBcHJpbCAyMDEzLgotIwotIyBQbGVhc2UgZmluZCBsaW5rIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBlbmRzIG9uIFN1bmRheSA3dGggb2YgQXByaWwgMjAxMy4uLi4KICMgaHR0cDovL3d3dy5tY2lsLmdvdi53cy9tY2lsX3B1YmxpY2F0aW9ucy5odG1sCiAjCi0jIFRoYXQgcHVibGljYXRpb24gYWxzbyBpbmNsdWRlcyBkYXRlcyBmb3IgU3VtbWVyIG9mIDIwMTMvNCBhcyB3ZWxsCi0jIHdoaWNoIGdpdmUgdGhlIGltcHJlc3Npb24gb2YgYSBwYXR0ZXJuIGluIHNlbGVjdGluZyBkYXRlcyBmb3IgdGhlCi0jIGZ1dHVyZSwgc28gZm9yIG5vdywgd2Ugd2lsbCBndWVzcyB0aGlzIHdpbGwgY29udGludWUuCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMDgpOgorIyBUaGF0IHdlYiBwYWdlIGN1cnJlbnRseSBsaXN0cyB0cmFuc2l0aW9ucyBmb3IgMjAxMi8zIGFuZCAyMDEzLzQuCisjIEFzc3VtZSB0aGUgcGF0dGVybiBpbnN0aXR1dGVkIGluIDIwMTIgd2lsbCBjb250aW51ZSBpbmRlZmluaXRlbHkuCiAKLSMgV2VzdGVybiBTYW1vYQogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKK1J1bGUJV1MJMjAxMAlvbmx5CS0JU2VwCWxhc3RTdW4JMDowMAkxCUQKK1J1bGUJV1MJMjAxMQlvbmx5CS0JQXByCVNhdD49MQk0OjAwCTAJUworUnVsZQlXUwkyMDExCW9ubHkJLQlTZXAJbGFzdFNhdAkzOjAwCTEJRAorUnVsZQlXUwkyMDEyCW1heAktCUFwcglTdW4+PTEJNDowMAkwCVMKIFJ1bGUJV1MJMjAxMgltYXgJLQlTZXAJbGFzdFN1bgkzOjAwCTEJRAotUnVsZQlXUwkyMDEyCW1heAktCUFwcglTdW4+PTEJNDowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgUGFjaWZpYy9BcGlhCSAxMjozMzowNCAtCUxNVAkxODc5IEp1bCAgNQogCQkJLTExOjI2OjU2IC0JTE1UCTE5MTEKLQkJCS0xMTozMAktCVNBTVQJMTk1MAkJIyBTYW1vYSBUaW1lCi0JCQktMTE6MDAJLQlXU1QJMjAxMCBTZXAgMjYKLQkJCS0xMTowMAkxOjAwCVdTRFQJMjAxMSBBcHIgMiA0OjAwCi0JCQktMTE6MDAJLQlXU1QJMjAxMSBTZXAgMjQgMzowMAotCQkJLTExOjAwCTE6MDAJV1NEVAkyMDExIERlYyAzMAotCQkJIDEzOjAwCTE6MDAJV1NEVAkyMDEyIEFwciBTdW4+PTEgNDowMAorCQkJLTExOjMwCS0JV1NTVAkxOTUwCisJCQktMTE6MDAJV1MJUyVzVAkyMDExIERlYyAyOSAyNDowMCAjIFM9U2Ftb2EKIAkJCSAxMzowMAlXUwlXUyVzVAogCiAjIFNvbG9tb24gSXMKICMgZXhjbHVkZXMgQm91Z2FpbnZpbGxlLCBmb3Igd2hpY2ggc2VlIFBhcHVhIE5ldyBHdWluZWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9HdWFkYWxjYW5hbCAxMDozOTo0OCAtCUxNVAkxOTEyIE9jdAkjIEhvbmlhcmEKK1pvbmUgUGFjaWZpYy9HdWFkYWxjYW5hbCAxMDozOTo0OCAtCUxNVAkxOTEyIE9jdCAjIEhvbmlhcmEKIAkJCTExOjAwCS0JU0JUCSMgU29sb21vbiBJcyBUaW1lCiAKICMgVG9rZWxhdSBJcwpAQCAtNzQ0LDcgKzY2NCw3IEBACiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJUGFjaWZpYy9GYWthb2ZvCS0xMToyNDo1NiAtCUxNVAkxOTAxCi0JCQktMTE6MDAJLQlUS1QgMjAxMSBEZWMgMzAJIyBUb2tlbGF1IFRpbWUKKwkJCS0xMTowMAktCVRLVAkyMDExIERlYyAzMCAjIFRva2VsYXUgVGltZQogCQkJMTM6MDAJLQlUS1QKIAogIyBUb25nYQpAQCAtODA0LDggKzcyNCw4IEBACiAjIHRpbWUgZnJvbSBPcGVyYXRpb24gTmV3c3JlZWwgKEhhcmR0YWNrIEkvVGVhayBzaG90LCAxOTU4LTA4LTAxKSB0byB0aGUgbGFzdAogIyBPcGVyYXRpb24gRmlzaGJvd2wgc2hvdCAoVGlnaHRyb3BlLCAxOTYyLTExLTA0KS4uLi4gW1NlZV0gSGVybWFuIEhvZXJsaW4sCiAjICJUaGUgVW5pdGVkIFN0YXRlcyBIaWdoLUFsdGl0dWRlIFRlc3QgRXhwZXJpZW5jZTogQSBSZXZpZXcgRW1waGFzaXppbmcgdGhlCi0jIEltcGFjdCBvbiB0aGUgRW52aXJvbm1lbnQiLCBMb3MgQWxhbW9zIExBLTY0MDUsIE9jdCAxOTc2Ci0jIDxodHRwOi8vd3d3LmZhcy5vcmcvc2dwL290aGVyZ292L2RvZS9sYW5sL2RvY3MxLzAwMzIyOTk0LnBkZj4uCisjIEltcGFjdCBvbiB0aGUgRW52aXJvbm1lbnQiLCBMb3MgQWxhbW9zIExBLTY0MDUsIE9jdCAxOTc2LgorIyBodHRwOi8vd3d3LmZhcy5vcmcvc2dwL290aGVyZ292L2RvZS9sYW5sL2RvY3MxLzAwMzIyOTk0LnBkZgogIyBTZWUgdGhlIHRhYmxlIG9uIHBhZ2UgNCB3aGVyZSBoZSBsaXN0cyBHTVQgYW5kIGxvY2FsIHRpbWVzIGZvciB0aGUgdGVzdHM7IGEKICMgZm9vdG5vdGUgZm9yIHRoZSBKSSB0ZXN0cyByZWFkcyB0aGF0IGxvY2FsIHRpbWUgaXMgIkpJIHRpbWUgPSBIYXdhaWkgVGltZQogIyBNaW51cyBPbmUgSG91ciIuCkBAIC04MjAsNyArNzQwLDcgQEAKICMgRnJvbSBNYXJrIEJyYWRlciAoMjAwNS0wMS0yMyk6CiAjIFtGYWxsYWNpZXMgYW5kIEZhbnRhc2llcyBvZiBBaXIgVHJhbnNwb3J0IEhpc3RvcnksIGJ5IFIuRS5HLiBEYXZpZXMsCiAjIHB1Ymxpc2hlZCAxOTk0IGJ5IFBhbGFkd3IgUHJlc3MsIE1jTGVhbiwgVkEsIFVTQTsgSVNCTiAwLTk2MjY0ODMtNS0zXQotIyByZXByb2R1Y2VkIGEgUGFuIEFtZXJpY2FuIEFpcndheXMgdGltZWFibGVzIGZyb20gMTkzNiwgZm9yIHRoZWlyIHdlZWtseQorIyByZXByb2R1Y2VkIGEgUGFuIEFtZXJpY2FuIEFpcndheXMgdGltZXRhYmxlIGZyb20gMTkzNiwgZm9yIHRoZWlyIHdlZWtseQogIyAiT3JpZW50IEV4cHJlc3MiIGZsaWdodHMgYmV0d2VlbiBTYW4gRnJhbmNpc2NvIGFuZCBNYW5pbGEsIGFuZCBjb25uZWN0aW5nCiAjIGZsaWdodHMgdG8gQ2hpY2FnbyBhbmQgdGhlIFVTIEVhc3QgQ29hc3QuICBBcyBpdCB1c2VzIHNvbWUgdGltZSB6b25lCiAjIGRlc2lnbmF0aW9ucyB0aGF0IEkndmUgbmV2ZXIgc2VlbiBiZWZvcmU6Li4uLgpAQCAtODMwLDkgKzc1MCw5IEBACiBab25lIFBhY2lmaWMvTWlkd2F5CS0xMTo0OToyOCAtCUxNVAkxOTAxCiAJCQktMTE6MDAJLQlOU1QJMTk1NiBKdW4gIDMKIAkJCS0xMTowMAkxOjAwCU5EVAkxOTU2IFNlcCAgMgotCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByCSMgTj1Ob21lCi0JCQktMTE6MDAJLQlCU1QJMTk4MyBOb3YgMzAJIyBCPUJlcmluZwotCQkJLTExOjAwCS0JU1NUCQkJIyBTPVNhbW9hCisJCQktMTE6MDAJLQlOU1QJMTk2NyBBcHIgICAgIyBOPU5vbWUKKwkJCS0xMTowMAktCUJTVAkxOTgzIE5vdiAzMCAjIEI9QmVyaW5nCisJCQktMTE6MDAJLQlTU1QJICAgICAgICAgICAgIyBTPVNhbW9hCiAKICMgUGFsbXlyYQogIyB1bmluaGFiaXRlZCBzaW5jZSBXb3JsZCBXYXIgSUk7IHdhcyBwcm9iYWJseSBsaWtlIFBhY2lmaWMvS2lyaXRpbWF0aQpAQCAtODUyLDcgKzc3Miw3IEBACiBSdWxlCVZhbnVhdHUJMTk5MgkxOTkzCS0JSmFuCVN1bj49MjMJMDowMAkwCS0KIFJ1bGUJVmFudWF0dQkxOTkyCW9ubHkJLQlPY3QJU3VuPj0yMwkwOjAwCTE6MDAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL0VmYXRlCTExOjEzOjE2IC0JTE1UCTE5MTIgSmFuIDEzCQkjIFZpbGEKK1pvbmUJUGFjaWZpYy9FZmF0ZQkxMToxMzoxNiAtCUxNVAkxOTEyIEphbiAxMyAjIFZpbGEKIAkJCTExOjAwCVZhbnVhdHUJVlUlc1QJIyBWYW51YXR1IFRpbWUKIAogIyBXYWxsaXMgYW5kIEZ1dHVuYQpAQCAtODY0LDkgKzc4NCwxMCBAQAogCiAjIE5PVEVTCiAKLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIFRoaXMgZmlsZSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAogIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KKyMgdHpAaWFuYS5vcmcgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLiAgRm9yIG1vcmUsIHBsZWFzZSBzZWUKKyMgdGhlIGZpbGUgQ09OVFJJQlVUSU5HIGluIHRoZSB0eiBkaXN0cmlidXRpb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0wMi0yMSk6CiAjIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcwpAQCAtODg3LDE2NSArODA4LDE4OCBAQAogIyBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCiAjCiAjIEZvciBkYXRhIGNpcmNhIDE4OTksIGEgY29tbW9uIHNvdXJjZSBpczoKLSMgTWlsbmUgSi4gQ2l2aWwgdGltZS4gR2VvZ3IgSi4gMTg5OSBGZWI7MTMoMik6MTczLTk0Ci0jIDxodHRwOi8vd3d3LmpzdG9yLm9yZy9zdGFibGUvMTc3NDM1OT4uCisjIE1pbG5lIEouIENpdmlsIHRpbWUuIEdlb2dyIEouIDE4OTkgRmViOzEzKDIpOjE3My05NC4KKyMgaHR0cDovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzE3NzQzNTkKICMKICMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzIGlzCiAjIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgogIwotIyBJIGludmVudGVkIHRoZSBhYmJyZXZpYXRpb25zIG1hcmtlZCBgKicgaW4gdGhlIGZvbGxvd2luZyB0YWJsZTsKKyMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgJyonIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7CiAjIHRoZSByZXN0IGFyZSBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBvciBmcm9tIG90aGVyIHNvdXJjZXMuCiAjIENvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQotIwkJc3RkIGRzdAotIwkJTE1UCUxvY2FsIE1lYW4gVGltZQotIwkgIDg6MDAJV1NUIFdTVAlXZXN0ZXJuIEF1c3RyYWxpYQotIwkgIDg6NDUJQ1dTVCBDV1NUIENlbnRyYWwgV2VzdGVybiBBdXN0cmFsaWEqCi0jCSAgOTowMAlKU1QJSmFwYW4KLSMJICA5OjMwCUNTVCBDU1QJQ2VudHJhbCBBdXN0cmFsaWEKLSMJIDEwOjAwCUVTVCBFU1QJRWFzdGVybiBBdXN0cmFsaWEKLSMJIDEwOjAwCUNoU1QJQ2hhbW9ycm8KLSMJIDEwOjMwCUxIU1QgTEhTVCBMb3JkIEhvd2UqCi0jCSAxMTozMAlOWk1UIE5aU1QgTmV3IFplYWxhbmQgdGhyb3VnaCAxOTQ1Ci0jCSAxMjowMAlOWlNUIE5aRFQgTmV3IFplYWxhbmQgMTk0Ni1wcmVzZW50Ci0jCSAxMjo0NQlDSEFTVCBDSEFEVCBDaGF0aGFtKgotIwktMTE6MDAJU1NUCVNhbW9hCi0jCS0xMDowMAlIU1QJSGF3YWlpCi0jCS0gODowMAlQU1QJUGl0Y2Fpcm4qCisjCQlzdGQJZHN0CisjCQlMTVQJCUxvY2FsIE1lYW4gVGltZQorIwkgIDg6MDAJQVdTVAlBV0RUCVdlc3Rlcm4gQXVzdHJhbGlhCisjCSAgODo0NQlBQ1dTVAlBQ1dEVAlDZW50cmFsIFdlc3Rlcm4gQXVzdHJhbGlhKgorIwkgIDk6MDAJSlNUCQlKYXBhbgorIwkgIDk6MzAJQUNTVAlBQ0RUCUNlbnRyYWwgQXVzdHJhbGlhCisjCSAxMDowMAlBRVNUCUFFRFQJRWFzdGVybiBBdXN0cmFsaWEKKyMJIDEwOjAwCUNoU1QJCUNoYW1vcnJvCisjCSAxMDozMAlMSFNUCUxIRFQJTG9yZCBIb3dlKgorIwkgMTE6MzAJTlpNVAlOWlNUCU5ldyBaZWFsYW5kIHRocm91Z2ggMTk0NQorIwkgMTI6MDAJTlpTVAlOWkRUCU5ldyBaZWFsYW5kIDE5NDYtcHJlc2VudAorIwkgMTI6MTUJQ0hBU1QJCUNoYXRoYW0gdGhyb3VnaCAxOTQ1KgorIwkgMTI6NDUJQ0hBU1QJQ0hBRFQJQ2hhdGhhbSAxOTQ2LXByZXNlbnQqCisjCSAxMzowMAlXU1NUCVdTRFQJKHdlc3Rlcm4pIFNhbW9hIDIwMTEtcHJlc2VudCoKKyMJLTExOjMwCVdTU1QJCVdlc3Rlcm4gU2Ftb2EgdGhyb3VnaCAxOTUwKgorIwktMTE6MDAJU1NUCQlTYW1vYQorIwktMTA6MDAJSFNUCQlIYXdhaWkKKyMJLSA4OjAwCVBTVAkJUGl0Y2Fpcm4qCiAjCi0jIFNlZSB0aGUgYG5vcnRoYW1lcmljYScgZmlsZSBmb3IgSGF3YWlpLgotIyBTZWUgdGhlIGBzb3V0aGFtZXJpY2EnIGZpbGUgZm9yIEVhc3RlciBJIGFuZCB0aGUgR2FsYXBhZ29zIElzLgorIyBTZWUgdGhlICdub3J0aGFtZXJpY2EnIGZpbGUgZm9yIEhhd2FpaS4KKyMgU2VlIHRoZSAnc291dGhhbWVyaWNhJyBmaWxlIGZvciBFYXN0ZXIgSSBhbmQgdGhlIEdhbMOhcGFnb3MgSXMuCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBBdXN0cmFsaWEKIAorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTMwKToKKyMgRGF5bGlnaHQgc2F2aW5nIHRpbWUgaGFzIGxvbmcgYmVlbiBjb250cm92ZXJzaWFsIGluIEF1c3RyYWxpYSwgcGl0dGluZworIyByZWdpb24gYWdhaW5zdCByZWdpb24sIHJ1cmFsIGFnYWluc3QgdXJiYW4sIGFuZCBsb2NhbCBhZ2FpbnN0IGdsb2JhbC4KKyMgRm9yIGV4YW1wbGUsIGluIGhlciByZXZpZXcgb2YgR3JhZW1lIERhdmlzb24ncyBfVGhlIFVuZm9yZ2l2aW5nCisjIE1pbnV0ZTogaG93IEF1c3RyYWxpYW5zIGxlYXJuZWQgdG8gdGVsbCB0aGUgdGltZV8gKDE5OTMpLCBQZXJ0aCBuYXRpdmUKKyMgUGhpbGxpcGEgSiBNYXJ0eXIgd3JvdGUsICJUaGUgc2VjdGlvbiBlbnRpdGxlZCAnU2F2aW5nIERheWxpZ2h0JyB3YXMKKyMgdmVyeSBpbmZvcm1hdGl2ZSwgYnV0IHdhcyAoYXMgY2FuLCBzYWRseSwgb25seSBiZSBleHBlY3RlZCBmcm9tIGEKKyMgTWVsYm91cm5lLWJhc2VkIHN0dWR5KSByZXBsZXRlIHdpdGggdGhlIHVzdWFsIGNodWNrbGVoZWFkZWQKKyMgUXVlZW5zbGFuZGVycyBhbmQgc3RyYXctY2hld2luZyB5b2tlbHMgZnJvbSB0aGUgV2VzdCBwcmF0dGxpbmcgZmFibGVzCisjIGFib3V0IGZhZGluZyBjdXJ0YWlucyBhbmQgY3JhemVkIGZhcm0gYW5pbWFscy4iCisjIEVsZWN0cm9uaWMgSm91cm5hbCBvZiBBdXN0cmFsaWFuIGFuZCBOZXcgWmVhbGFuZCBIaXN0b3J5ICgxOTk3LTAzLTAzKQorIyBodHRwOi8vd3d3LmpjdS5lZHUuYXUvYWZmL2hpc3RvcnkvcmV2aWV3cy9kYXZpc29uLmh0bQorCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMTItMDgpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sIj4KICMgSW1wbGVtZW50YXRpb24gRGF0ZXMgb2YgRGF5bGlnaHQgU2F2aW5nIFRpbWUgd2l0aGluIEF1c3RyYWxpYQotIyA8L2E+IHN1bW1hcml6ZXMgZGF5bGlnaHQgc2F2aW5nIGlzc3VlcyBpbiBBdXN0cmFsaWEuCisjIGh0dHA6Ly93d3cuYm9tLmdvdi5hdS9jbGltYXRlL2F2ZXJhZ2VzL3RhYmxlcy9kc3RfdGltZXMuc2h0bWwKKyMgc3VtbWFyaXplcyBkYXlsaWdodCBzYXZpbmcgaXNzdWVzIGluIEF1c3RyYWxpYS4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwNS0xMi0xMik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGF3bGluay5uc3cuZ292LmF1L2xhd2xpbmsvQ29ycG9yYXRlL2xsX2FnZGluZm8ubnNmL3BhZ2VzL2NvbW11bml0eV9yZWxhdGlvbnNfZGF5bGlnaHRfc2F2aW5nIj4KICMgTGF3bGluayBOU1c6RGF5bGlnaHQgU2F2aW5nIGluIE5ldyBTb3V0aCBXYWxlcwotIyA8L2E+IGNvdmVycyBOZXcgU291dGggV2FsZXMgaW4gcGFydGljdWxhci4KKyMgaHR0cDovL3d3dy5sYXdsaW5rLm5zdy5nb3YuYXUvbGF3bGluay9Db3Jwb3JhdGUvbGxfYWdkaW5mby5uc2YvcGFnZXMvY29tbXVuaXR5X3JlbGF0aW9uc19kYXlsaWdodF9zYXZpbmcKKyMgY292ZXJzIE5ldyBTb3V0aCBXYWxlcyBpbiBwYXJ0aWN1bGFyLgogCiAjIEZyb20gSm9obiBNYWNraW4gKDE5OTEtMDMtMDYpOgotIyBXZSBpbiBBdXN0cmFsaWEgaGF2ZSBfbmV2ZXJfIHJlZmVycmVkIHRvIERTVCBhcyBgZGF5bGlnaHQnIHRpbWUuCi0jIEl0IGlzIGNhbGxlZCBgc3VtbWVyJyB0aW1lLiAgTm93IGJ5IGEgaGFwcHkgY29pbmNpZGVuY2UsIGBzdW1tZXInCi0jIGFuZCBgc3RhbmRhcmQnIGhhcHBlbiB0byBzdGFydCB3aXRoIHRoZSBzYW1lIGxldHRlcjsgaGVuY2UsIHRoZQorIyBXZSBpbiBBdXN0cmFsaWEgaGF2ZSBfbmV2ZXJfIHJlZmVycmVkIHRvIERTVCBhcyAnZGF5bGlnaHQnIHRpbWUuCisjIEl0IGlzIGNhbGxlZCAnc3VtbWVyJyB0aW1lLiAgTm93IGJ5IGEgaGFwcHkgY29pbmNpZGVuY2UsICdzdW1tZXInCisjIGFuZCAnc3RhbmRhcmQnIGhhcHBlbiB0byBzdGFydCB3aXRoIHRoZSBzYW1lIGxldHRlcjsgaGVuY2UsIHRoZQogIyBhYmJyZXZpYXRpb24gZG9lcyBfbm90XyBjaGFuZ2UuLi4KICMgVGhlIGxlZ2lzbGF0aW9uIGRvZXMgbm90IGFjdHVhbGx5IGRlZmluZSBhYmJyZXZpYXRpb25zLCBhdCBsZWFzdAogIyBpbiB0aGlzIFN0YXRlLCBidXQgdGhlIGFiYnJldmlhdGlvbiBpcyBqdXN0IGNvbW1vbmx5IHRha2VuIHRvIGJlIHRoZQogIyBpbml0aWFscyBvZiB0aGUgcGhyYXNlLCBhbmQgdGhlIGxlZ2lzbGF0aW9uIGhlcmUgdW5pZm9ybWx5IHVzZXMKLSMgdGhlIHBocmFzZSBgc3VtbWVyIHRpbWUnIGFuZCBkb2VzIG5vdCB1c2UgdGhlIHBocmFzZSBgZGF5bGlnaHQKKyMgdGhlIHBocmFzZSAnc3VtbWVyIHRpbWUnIGFuZCBkb2VzIG5vdCB1c2UgdGhlIHBocmFzZSAnZGF5bGlnaHQKICMgdGltZScuCiAjIEFubm91bmNlcnMgb24gdGhlIENvbW1vbndlYWx0aCByYWRpbyBuZXR3b3JrLCB0aGUgQUJDIChmb3IgQXVzdHJhbGlhbgotIyBCcm9hZGNhc3RpbmcgQ29tbWlzc2lvbiksIHVzZSB0aGUgcGhyYXNlcyBgRWFzdGVybiBTdGFuZGFyZCBUaW1lJwotIyBvciBgRWFzdGVybiBTdW1tZXIgVGltZScuICAoTm90ZSwgdGhvdWdoLCB0aGF0IGFzIEkgc2F5IGluIHRoZQorIyBCcm9hZGNhc3RpbmcgQ29tbWlzc2lvbiksIHVzZSB0aGUgcGhyYXNlcyAnRWFzdGVybiBTdGFuZGFyZCBUaW1lJworIyBvciAnRWFzdGVybiBTdW1tZXIgVGltZScuICAoTm90ZSwgdGhvdWdoLCB0aGF0IGFzIEkgc2F5IGluIHRoZQogIyBjdXJyZW50IGF1c3RyYWxhc2lhIGZpbGUsIHRoZXJlIGlzIHJlYWxseSBubyBzdWNoIHRoaW5nLikgIEFubm91bmNlcnMKICMgb24gaXRzIG92ZXJzZWFzIHNlcnZpY2UsIFJhZGlvIEF1c3RyYWxpYSwgdXNlIHRoZSBzYW1lIHBocmFzZXMKLSMgcHJlZml4ZWQgYnkgdGhlIHdvcmQgYEF1c3RyYWxpYW4nIHdoZW4gcmVmZXJyaW5nIHRvIGxvY2FsIHRpbWVzOworIyBwcmVmaXhlZCBieSB0aGUgd29yZCAnQXVzdHJhbGlhbicgd2hlbiByZWZlcnJpbmcgdG8gbG9jYWwgdGltZXM7CiAjIHRpbWUgYW5ub3VuY2VtZW50cyBvbiB0aGF0IHNlcnZpY2UsIG5hdHVyYWxseSBlbm91Z2gsIGFyZSBtYWRlIGluIFVUQy4KIAotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5Mi0wMy0wOCk6Ci0jIEdpdmVuIHRoZSBhYm92ZSwgd2hhdCdzIGNob3NlbiBmb3IgeWVhci1yb3VuZCB1c2UgaXM6Ci0jCUNTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiA5OjMwCi0jCVdTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiA4OjAwCi0jCUVTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiAxMDowMAotCi0jIEZyb20gQ2h1Y2sgU29wZXIgKDIwMDYtMDYtMDEpOgotIyBJIHJlY2VudGx5IGZvdW5kIHRoaXMgQXVzdHJhbGlhbiBnb3Zlcm5tZW50IHdlYiBwYWdlIG9uIHRpbWUgem9uZXM6Ci0jIDxodHRwOi8vd3d3LmF1c3RyYWxpYS5nb3YuYXUvYWJvdXQtYXVzdHJhbGlhLTEzdGltZT4KLSMgQW5kIHRoaXMgZ292ZXJubWVudCB3ZWIgcGFnZSBsaXN0cyB0aW1lIHpvbmUgbmFtZXMgYW5kIGFiYnJldmlhdGlvbnM6Ci0jIDxodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZGF5c2F2dG0uc2h0bWw+Ci0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNC0wNSksIHN1bW1hcml6aW5nIGEgbG9uZyBkaXNjdXNzaW9uIGFib3V0ICJFU1QiCi0jIHZlcnN1cyAiQUVTVCIgZXRjLjoKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0zMCk6CiAjCi0jIEkgc2VlIHRoZSBmb2xsb3dpbmcgcG9pbnRzIG9mIGRpc3B1dGU6CisjIEluc3BpcmVkIGJ5IE1hY2tpbidzIHJlbWFya3MgcXVvdGVkIGFib3ZlLCBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMKKyMgZmlsZSB1c2VkICJFU1QiIGZvciBib3RoIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSBhbmQgRWFzdGVybiBTdW1tZXIKKyMgVGltZSBpbiBBdXN0cmFsaWEsIGFuZCBzaW1pbGFybHkgZm9yICJDU1QiLCAiQ1dTVCIsIGFuZCAiV1NUIi4KKyMgSG93ZXZlciwgdGhlc2UgYWJicmV2aWF0aW9ucyB3ZXJlIGNvbmZ1c2luZyBhbmQgd2VyZSBub3QgY29tbW9uCisjIHByYWN0aWNlIGFtb25nIEF1c3RyYWxpYW5zLCBhbmQgdGhlcmUgd2VyZSBqdXN0aWZpYWJsZSBjb21wbGFpbnRzCisjIGFib3V0IHRoZW0sIHNvIEkgYXR0ZW1wdGVkIHRvIHN1cnZleSBjdXJyZW50IEF1c3RyYWxpYW4gdXNhZ2UuCisjIEZvciB0aGUgdHogZGF0YWJhc2UsIHRoZSBmdWxsIEVuZ2xpc2ggcGhyYXNlIGlzIG5vdCB0aGF0IGltcG9ydGFudDsKKyMgd2hhdCBtYXR0ZXJzIGlzIHRoZSBhYmJyZXZpYXRpb24uICBJdCdzIGRpZmZpY3VsdCB0byBzdXJ2ZXkgdGhlIHdlYgorIyBkaXJlY3RseSBmb3IgYWJicmV2aWF0aW9uIHVzYWdlLCBhcyB0aGVyZSBhcmUgc28gbWFueSBmYWxzZSBoaXRzIGZvcgorIyBzdHJpbmdzIGxpa2UgIkVTVCIgYW5kICJFRFQiLCBzbyBJIGxvb2tlZCBmb3IgcGFnZXMgdGhhdCBkZWZpbmVkIGFuCisjIGFiYnJldmlhdGlvbiBmb3IgZWFzdGVybiBvciBjZW50cmFsIERTVCBpbiBBdXN0cmFsaWEsIGFuZCBnb3QgdGhlCisjIGZvbGxvd2luZyBudW1iZXJzIG9mIHVuaXF1ZSBoaXRzIGZvciB0aGUgbGlzdGVkIEdvb2dsZSBxdWVyaWVzOgogIwotIyAqIEhvdyBpbXBvcnRhbnQgYXJlIHVuaXF1ZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucz8KKyMgICAxMCAiRWFzdGVybiBEYXlsaWdodCBUaW1lIEFFU1QiIHNpdGU6YXUgW3NvbWUgYXJlIGZhbHNlIGhpdHNdCisjICAgMTAgIkVhc3Rlcm4gU3VtbWVyIFRpbWUgQUVTVCIgc2l0ZTphdQorIyAgIDEwICJTdW1tZXIgVGltZSBBRURUIiBzaXRlOmF1CisjICAgMTMgIkVEU1QgRWFzdGVybiBEYXlsaWdodCBTYXZpbmcgVGltZSIgc2l0ZTphdQorIyAgIDE4ICJTdW1tZXIgVGltZSBFU1NUIiBzaXRlOmF1CisjICAgMjggIkVhc3Rlcm4gRGF5bGlnaHQgU2F2aW5nIFRpbWUgRURTVCIgc2l0ZTphdQorIyAgIDM5ICJFRFQgRWFzdGVybiBEYXlsaWdodCBUaW1lIiBzaXRlOmF1IFtzb21lIGFyZSBmYWxzZSBoaXRzXQorIyAgIDUzICJFYXN0ZXJuIERheWxpZ2h0IFRpbWUgRURUIiBzaXRlOmF1IFtzb21lIGFyZSBmYWxzZSBoaXRzXQorIyAgIDU0ICJBRURUIEF1c3RyYWxpYW4gRWFzdGVybiBEYXlsaWdodCBUaW1lIiBzaXRlOmF1CisjICAxODIgIkVhc3Rlcm4gRGF5bGlnaHQgVGltZSBBRURUIiBzaXRlOmF1CiAjCi0jICAgSGVyZSBJIHRlbmQgdG8gYWdyZWUgd2l0aCB0aGUgcG9pbnQgKG1vc3QgcmVjZW50bHkgbWFkZSBieSBDaHJpcwotIyAgIE5ld21hbikgdGhhdCB1bmlxdWUgYWJicmV2aWF0aW9ucyBzaG91bGQgbm90IGJlIGVzc2VudGlhbCBmb3IgcHJvcGVyCi0jICAgb3BlcmF0aW9uIG9mIHNvZnR3YXJlLiAgV2UgaGF2ZSBvdGhlciBpbnN0YW5jZXMgb2YgYW1iaWd1aXR5Ci0jICAgKGUuZy4gIklTVCIgZGVub3RpbmcgYm90aCAiSXNyYWVsIFN0YW5kYXJkIFRpbWUiIGFuZCAiSW5kaWFuCi0jICAgU3RhbmRhcmQgVGltZSIpLCBhbmQgdGhleSBhcmUgbm90IGxpa2VseSB0byBnbyBhd2F5IGFueSB0aW1lIHNvb24uCi0jICAgSW4gdGhlIG9sZCBkYXlzLCBzb21lIHNvZnR3YXJlIG1pc3Rha2VubHkgcmVsaWVkIG9uIHVuaXF1ZQotIyAgIGFiYnJldmlhdGlvbnMsIGJ1dCB0aGlzIGlzIGJlY29taW5nIGxlc3MgdHJ1ZSB3aXRoIHRpbWUsIGFuZCBJIGRvbid0Ci0jICAgdGhpbmsgaXQncyB0aGF0IGltcG9ydGFudCB0byBjYXRlciB0byBzdWNoIHNvZnR3YXJlIHRoZXNlIGRheXMuCisjICAgMTcgIkNlbnRyYWwgRGF5bGlnaHQgVGltZSBDRFQiIHNpdGU6YXUgW3NvbWUgYXJlIGZhbHNlIGhpdHNdCisjICAgNDYgIkNlbnRyYWwgRGF5bGlnaHQgVGltZSBBQ0RUIiBzaXRlOmF1CiAjCi0jICAgT24gdGhlIG90aGVyIGhhbmQsIHRoZXJlIGlzIGFub3RoZXIgbW90aXZhdGlvbiBmb3IgdW5hbWJpZ3VvdXMKLSMgICBhYmJyZXZpYXRpb25zOiBpdCBjdXRzIGRvd24gb24gaHVtYW4gY29uZnVzaW9uLiAgVGhpcyBpcwotIyAgIHBhcnRpY3VsYXJseSB0cnVlIGZvciBBdXN0cmFsaWEsIHdoZXJlICJFU1QiIGNhbiBtZWFuIG9uZSB0aGluZyBmb3IKLSMgICB0aW1lIFQgYW5kIGEgZGlmZmVyZW50IHRoaW5nIGZvciB0aW1lIFQgcGx1cyAxIHNlY29uZC4KKyMgSSB0cmllZCBzZXZlcmFsIG90aGVyIHZhcmlhbnRzIChlLmcuLCAiRWFzdGVybiBTdW1tZXIgVGltZSBFU1QiKSBidXQKKyMgdGhleSBhbGwgcmV0dXJuZWQgZmV3ZXIgdGhhbiAxMCB1bmlxdWUgaGl0cy4gIEkgYWxzbyBsb29rZWQgZm9yIHBhZ2VzCisjIG1lbnRpb25pbmcgYm90aCAid2VzdGVybiBzdGFuZGFyZCB0aW1lIiBhbmQgYW4gYWJicmV2aWF0aW9uLCBzaW5jZQorIyB0aGVyZSBpcyBubyBXU1QgaW4gdGhlIFVTIHRvIGdlbmVyYXRlIGZhbHNlIGhpdHMsIGFuZCBmb3VuZDoKICMKLSMgKiBEb2VzIHRoZSByZWxldmFudCBsZWdpc2xhdGlvbiBpbmRpY2F0ZSB3aGljaCBhYmJyZXZpYXRpb25zIHNob3VsZCBiZSB1c2VkPworIyAgMTU2ICJ3ZXN0ZXJuIHN0YW5kYXJkIHRpbWUiIEFXU1Qgc2l0ZTphdQorIyAgMjI2ICJ3ZXN0ZXJuIHN0YW5kYXJkIHRpbWUiIFdTVCBzaXRlOmF1CiAjCi0jICAgSGVyZSBJIHRlbmQgdG8gdGhpbmsgdGhhdCB0aGluZ3MgYXJlIGEgbWVzcywganVzdCBhcyB0aGV5IGFyZSBpbgotIyAgIG1hbnkgb3RoZXIgY291bnRyaWVzLiAgV2UgQW1lcmljYW5zIGFyZSBjdXJyZW50bHkgZGlzYWdyZWVpbmcgYWJvdXQKLSMgICB3aGljaCBhYmJyZXZpYXRpb24gdG8gdXNlIGZvciB0aGUgbmV3bHkgbGVnaXNsYXRlZCBDaGFtb3JybyBTdGFuZGFyZAotIyAgIFRpbWUsIGZvciBleGFtcGxlLgorIyBJIHRoZW4gc3VydmV5ZWQgdGhlIHRvcCB0ZW4gbmV3c3BhcGVycyBpbiBBdXN0cmFsaWEgYnkgY2lyY3VsYXRpb24gYXMKKyMgbGlzdGVkIGluIFdpa2lwZWRpYSwgdXNpbmcgR29vZ2xlIHF1ZXJpZXMgbGlrZSAiQUVEVCBzaXRlOmhlcmFsZHN1bi5jb20uYXUiCisjIGFuZCBvYnRhaW5pbmcgZXN0aW1hdGVkIGNvdW50cyBmcm9tIHRoZSBpbml0aWFsIHBhZ2Ugb2Ygc2VhcmNoIHJlc3VsdHMuCisjIEFsbCB0ZW4gcGFwZXJzIGdyZWF0bHkgcHJlZmVycmVkICJBRURUIiB0byAiRURUIi4gIFRoZSBwYXBlcnMKKyMgc3VydmV5ZWQgd2VyZSB0aGUgSGVyYWxkIFN1biwgVGhlIERhaWx5IFRlbGVncmFwaCwgVGhlIENvdXJpZXItTWFpbCwKKyMgVGhlIFN5ZG5leSBNb3JuaW5nIEhlcmFsZCwgVGhlIFdlc3QgQXVzdHJhbGlhbiwgVGhlIEFnZSwgVGhlIEFkdmVydGlzZXIsCisjIFRoZSBBdXN0cmFsaWFuLCBUaGUgRmluYW5jaWFsIFJldmlldywgYW5kIFRoZSBIZXJhbGQgKE5ld2Nhc3RsZSkuCiAjCi0jICAgUGVyc29uYWxseSwgSSB3b3VsZCBwcmVmZXIgdG8gdXNlIGNvbW1vbiBwcmFjdGljZTsgSSB3b3VsZCBsaWtlIHRvCi0jICAgcmVmZXIgdG8gbGVnaXNsYXRpb24gb25seSBmb3IgZXhhbXBsZXMgb2YgY29tbW9uIHByYWN0aWNlLCBvciBhcyBhCi0jICAgdGllYnJlYWtlci4KKyMgSSBhbHNvIHNlYXJjaGVkIGZvciBoaXN0b3JpY2FsIHVzYWdlLCB0byBzZWUgd2hldGhlciBhYmJyZXZpYXRpb25zCisjIGxpa2UgIkFFRFQiIGFyZSBuZXcuICBBIFRyb3ZlIHNlYXJjaCA8aHR0cDovL3Ryb3ZlLm5sYS5nb3YuYXUvPgorIyBmb3VuZCBvbmx5IG9uZSBuZXdzcGFwZXIgKFRoZSBDYW5iZXJyYSBUaW1lcykgd2l0aCBhIGhvdXNlIHN0eWxlCisjIGRhdGluZyBiYWNrIHRvIHRoZSAxOTcwcywgSSBleHBlY3QgYmVjYXVzZSBvdGhlciBuZXdzcGFwZXJzIHdlcmVuJ3QKKyMgZnVsbHkgaW5kZXhlZC4gIFRoZSBDYW5iZXJyYSBUaW1lcyBzdHJvbmdseSBwcmVmZXJyZWQgYWJicmV2aWF0aW9ucworIyBsaWtlICJBRURUIi4gIFRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICJBRURUIiB3YXMgYSBXb3JsZCBXZWF0aGVyCisjIGNvbHVtbiAoMTk3MS0xMS0xNywgcGFnZSAyNCksIGFuZCBvZiAiQUNEVCIgd2FzIGEgU2NvcmVib2FyZCBjb2x1bW4KKyMgKDE5OTMtMDEtMjQsIHAgMTYpLiAgVGhlIHN0eWxlIHdhcyB0aGUgdHlwaWNhbCB1c2FnZSBidXQgd2FzIG5vdAorIyBzdHJpY3RseSBlbmZvcmNlZDsgZm9yIGV4YW1wbGUsICJXZWxjb21lIHRvIHRoZSB0d2lsaWdodCB6b25lcyAuLi4iCisjICgxOTk0LTEwLTI5LCBwIDEpIHVzZXMgdGhlIGFiYnJldmlhdGlvbnMgQUVTVC9BRURULCBDU1QvQ0RULCBhbmQKKyMgV1NULCBhbmQgZ29lcyBvbiB0byBzYXksICJUaGUgY29uZnVzaW9uIGFuZCBmcnVzdHJhdGlvbiBzb21lIGZlZWwKKyMgYWJvdXQgdGhlIGxhY2sgb2YgdW5pZm9ybWl0eSBhbW9uZyBBdXN0cmFsaWEncyBzaXggc3RhdGVzIGFuZCB0d28KKyMgdGVycml0b3JpZXMgaGFzIHByb21wdGVkIG9uZSBncm91cCB0byBmb3JtIGl0cyB2ZXJ5IG93biBwb2xpdGljYWwKKyMgcGFydHkgLS0gdGhlIFN5ZG5leS1iYXNlZCBEYXlsaWdodCBTYXZpbmcgRXh0ZW5zaW9uIFBhcnR5LiIKICMKLSMgKiBEbyBBdXN0cmFsaWFucyBtb3JlIG9mdGVuIHVzZSAiRWFzdGVybiBEYXlsaWdodCBUaW1lIiBvciAiRWFzdGVybgotIyAgIFN1bW1lciBUaW1lIj8gIERvIHRoZXkgdHlwaWNhbGx5IHByZWZpeCB0aGUgdGltZSB6b25lIG5hbWVzIHdpdGgKLSMgICB0aGUgd29yZCAiQXVzdHJhbGlhbiI/CisjIEkgYWxzbyBzdXJ2ZXllZCBmZWRlcmFsIGdvdmVybm1lbnQgc291cmNlcy4gIFRoZXkgZGlkIG5vdCBhZ3JlZToKICMKLSMgICBNeSBvd24gaW1wcmVzc2lvbiBpcyB0aGF0IGJvdGggIkRheWxpZ2h0IFRpbWUiIGFuZCAiU3VtbWVyIFRpbWUiIGFyZQotIyAgIGNvbW1vbiBhbmQgYXJlIHdpZGVseSB1bmRlcnN0b29kLCBidXQgdGhhdCAiU3VtbWVyIFRpbWUiIGlzIG1vcmUKLSMgICBwb3B1bGFyOyBhbmQgdGhhdCB0aGUgbGVhZGluZyAiQSIgaXMgYWxzbyBjb21tb24gYnV0IGlzIG9taXR0ZWQgbW9yZQotIyAgIG9mdGVuIHRoYW4gbm90LiAgSSBqdXN0IHVzZWQgQWx0YVZpc3RhIGFkdmFuY2VkIHNlYXJjaCBhbmQgZ290IHRoZQotIyAgIGZvbGxvd2luZyBjb3VudCBvZiBwYWdlIGhpdHM6CisjICAgVGhlIEF1c3RyYWxpYW4gR292ZXJubWVudCAoMjAxNC0wMy0yNikKKyMgICBodHRwOi8vYXVzdHJhbGlhLmdvdi5hdS9hYm91dC1hdXN0cmFsaWEvb3VyLWNvdW50cnkvdGltZQorIyAgIChUaGlzIGRvY3VtZW50IHdhcyBwcm9kdWNlZCBieSB0aGUgRGVwYXJ0bWVudCBvZiBGaW5hbmNlLikKKyMgICBBRVNUIEFDU1QgQVdTVCBBRURUIEFDRFQKICMKLSMgICAgIDEsMTAzICJFYXN0ZXJuIFN1bW1lciBUaW1lIiBBTkQgZG9tYWluOmF1Ci0jICAgICAgIDk3MSAiQXVzdHJhbGlhbiBFYXN0ZXJuIFN1bW1lciBUaW1lIiBBTkQgZG9tYWluOmF1Ci0jICAgICAgIDYxMyAiRWFzdGVybiBEYXlsaWdodCBUaW1lIiBBTkQgZG9tYWluOmF1Ci0jICAgICAgIDEyNyAiQXVzdHJhbGlhbiBFYXN0ZXJuIERheWxpZ2h0IFRpbWUiIEFORCBkb21haW46YXUKKyMgICBCdXJlYXUgb2YgTWV0ZW9yb2xvZ3kgKDIwMTItMTEtMDgpCisjICAgaHR0cDovL3d3dy5ib20uZ292LmF1L2NsaW1hdGUvYXZlcmFnZXMvdGFibGVzL2RheXNhdnRtLnNodG1sCisjICAgRVNUIENTVCBXU1QgRURUIENEVAogIwotIyAgIEhlcmUgIlN1bW1lciIgc2VlbXMgcXVpdGUgYSBiaXQgbW9yZSBwb3B1bGFyIHRoYW4gIkRheWxpZ2h0IiwKLSMgICBwYXJ0aWN1bGFybHkgd2hlbiB3ZSBrbm93IHRoZSB0aW1lIHpvbmUgaXMgQXVzdHJhbGlhbiBhbmQgbm90IFVTLAotIyAgIHNheS4gIFRoZSAiQXVzdHJhbGlhbiIgcHJlZml4IHNlZW1zIHRvIGJlIHBvcHVsYXIgZm9yIEVhc3Rlcm4gU3VtbWVyCi0jICAgVGltZSwgYnV0IHVucG9wdWxhciBmb3IgRWFzdGVybiBEYXlsaWdodCBUaW1lLgorIyAgIENpdmlsIEF2aWF0aW9uIFNhZmV0eSBBdXRob3JpdHkgKHVuZGF0ZWQpCisjICAgaHR0cDovL3NlcnZpY2VzLmNhc2EuZ292LmF1L291dG5iYWNrL2luYy9wYWdlcy9lcGlzb2RlMy9lcGlzb2RlLTNfdGltZV96b25lcy5zaHRtbAorIyAgIEVTVCBDU1QgV1NUIChubyBhYmJyZXZpYXRpb25zIGdpdmVuIGZvciBEU1QpCiAjCi0jICAgRm9yIGFiYnJldmlhdGlvbnMsIHRvb2xzIGxpa2UgQWx0YVZpc3RhIGFyZSBsZXNzIHVzZWZ1bCBiZWNhdXNlIG9mCi0jICAgYW1iaWd1aXR5LiAgTWFueSBoaXRzIGFyZSBub3QgcmVhbGx5IHRpbWUgem9uZXMsIHVuZm9ydHVuYXRlbHksIGFuZAotIyAgIG1hbnkgaGl0cyBkZW5vdGUgVVMgdGltZSB6b25lcyBhbmQgbm90IEF1c3RyYWxpYW4gb25lcy4gIEJ1dCBoZXJlCi0jICAgYXJlIHRoZSBoaXQgY291bnRzIGFueXdheToKKyMgICBHZW9zY2llbmNlIEF1c3RyYWxpYSAoMjAxMS0xMS0yNCkKKyMgICBodHRwOi8vd3d3LmdhLmdvdi5hdS9nZW9kZXN5L2FzdHJvL3N1bnJpc2UuanNwCisjICAgQUVTVCBBQ1NUIEFXU1QgQUVEVCBBQ0RUCiAjCi0jICAgICAxNjEsMzA0ICJFU1QiIGFuZCBkb21haW46YXUKLSMgICAgICAyNSwxNTYgIkVEVCIgYW5kIGRvbWFpbjphdQotIyAgICAgIDE4LDI2MyAiQUVTVCIgYW5kIGRvbWFpbjphdQotIyAgICAgIDEwLDQxNiAiQUVEVCIgYW5kIGRvbWFpbjphdQorIyAgIFBhcmxpYW1lbnRhcnkgTGlicmFyeSAoMjAwOC0xMS0xMCkKKyMgICBodHRwOi8vd3d3LmFwaC5nb3YuYXUvYmluYXJpZXMvbGlicmFyeS9wdWJzL3JwLzIwMDgtMDkvMDlycDE0LnBkZgorIyAgIEVTVCBDU1QgV1NUIHByZWZlcnJlZCBmb3Igc3RhbmRhcmQgdGltZTsgQUVTVCBBRURUIEFDU1QgQUNEVCBhbHNvIHVzZWQKICMKLSMgICAgICAxNCw1MzggIkNTVCIgYW5kIGRvbWFpbjphdQotIyAgICAgICA1LDcyOCAiQ0RUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgICAgMTc2ICJBQ1NUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgICAgIDI5ICJBQ0RUIiBhbmQgZG9tYWluOmF1CisjICAgVGhlIFRyYW5zcG9ydCBTYWZldHkgQnVyZWF1IGhhcyBhbiBleHRlbnNpdmUgc2VyaWVzIG9mIGFjY2lkZW50IHJlcG9ydHMsCisjICAgYW5kIGludmVzdGlnYXRvcnMgc2VlbSB0byB1c2Ugd2hhdGV2ZXIgYWJicmV2aWF0aW9uIHRoZXkgbGlrZS4KKyMgICBHb29nbGluZyBzaXRlOmF0c2IuZ292LmF1IGZvdW5kIHRoZSBmb2xsb3dpbmcgbnVtYmVyIG9mIHVuaXF1ZSBoaXRzOgorIyAgIDMxMSAiRVN1VCIsIDE5NSAiRURUIiwgMjYgIkFFRFQiLCA4MyAiQ1N1VCIsIDQ2ICJDRFQiLgorIyAgICJfU3VUIiB0ZW5kZWQgdG8gYXBwZWFyIGluIG9sZGVyIHJlcG9ydHMsIGFuZCAiQV9EVCIgdGVuZGVkIHRvCisjICAgYXBwZWFyIGluIHJlcG9ydHMgb2YgZXZlbnRzIHdpdGggaW50ZXJuYXRpb25hbCBpbXBsaWNhdGlvbnMuCiAjCi0jICAgICAgIDcsNTM5ICJXU1QiIGFuZCBkb21haW46YXUKLSMgICAgICAgICAgNjggIkFXU1QiIGFuZCBkb21haW46YXUKLSMKLSMgICBUaGlzIGRhdGEgc3VnZ2VzdCB0aGF0IEF1c3RyYWxpYW5zIHRlbmQgdG8gb21pdCB0aGUgIkEiIHByZWZpeCBpbgotIyAgIHByYWN0aWNlLiAgVGhlIHNpdHVhdGlvbiBmb3IgIlNUIiB2ZXJzdXMgIkRUIiBpcyBsZXNzIGNsZWFyLCBnaXZlbgotIyAgIHRoZSBhbWJpZ3VpdGllcyBpbnZvbHZlZC4KLSMKLSMgKiBIb3cgZG8gQXVzdHJhbGlhbnMgZmVlbCBhYm91dCB0aGUgYWJicmV2aWF0aW9ucyBpbiB0aGUgdHogZGF0YWJhc2U/Ci0jCi0jICAgSWYgeW91IGp1c3QgY291bnQgQXVzdHJhbGlhbnMgb24gdGhpcyBsaXN0LCBJIGNvdW50IDIgaW4gZmF2b3IgYW5kIDMKLSMgICBhZ2FpbnN0LiAgT25lIG9mIHRoZSAiYWdhaW5zdCIgdm90ZXMgKERhdmlkIEtlZWdlbCkgY291bnNlbGVkIGRlbGF5LAotIyAgIHNheWluZyB0aGF0IGJvdGggQUVTVC9BRURUIGFuZCBFU1QvRVNUIGFyZSB3aWRlbHkgdXNlZCBhbmQKLSMgICB1bmRlcnN0b29kIGluIEF1c3RyYWxpYS4KKyMgRnJvbSB0aGUgYWJvdmUgaXQgYXBwZWFycyB0aGF0IHRoZXJlIGlzIGEgd29ya2luZyBjb25zZW5zdXMgaW4KKyMgQXVzdHJhbGlhIHRvIHVzZSB0cmFpbGluZyAiRFQiIGZvciBkYXlsaWdodCBzYXZpbmcgdGltZTsgYWx0aG91Z2gKKyMgc29tZSBzb3VyY2VzIHVzZSB0cmFpbGluZyAiU1NUIiBvciAiU1QiIG9yICJTdVQiIHRoZXkgYXJlIGJ5IGZhciBpbgorIyB0aGUgbWlub3JpdHkuICBUaGUgY2FzZSBmb3IgbGVhZGluZyAiQSIgaXMgd2Vha2VyLCBidXQgc2luY2UgaXQKKyMgc2VlbXMgdG8gYmUgcHJlZmVycmVkIGluIHRoZSBvdmVyYWxsIHdlYiBhbmQgaXMgcHJlZmVycmVkIGluIGFsbAorIyB0aGUgbGVhZGluZyBuZXdzcGFwZXIgd2Vic2l0ZXMgYW5kIGluIG1hbnkgZ292ZXJubWVudCBkZXBhcnRtZW50cywKKyMgaXQgaGFzIGEgc3Ryb25nZXIgY2FzZSB0aGFuIG9taXR0aW5nIHRoZSBsZWFkaW5nICJBIi4gIFRoZSBjdXJyZW50CisjIHZlcnNpb24gb2YgdGhlIGRhdGFiYXNlIHRoZXJlZm9yZSB1c2VzIGFiYnJldmlhdGlvbnMgbGlrZSAiQUVTVCIgYW5kCisjICJBRURUIiBmb3IgQXVzdHJhbGlhbiB0aW1lIHpvbmVzLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTUtMTItMTkpOgogIyBTaGFua3MgJiBQb3R0ZW5nZXIgcmVwb3J0IDI6MDAgZm9yIGFsbCBhdXR1bW4gY2hhbmdlcyBpbiBBdXN0cmFsaWEgYW5kIE5aLgogIyBNYXJrIFByaW9yIHdyaXRlcyB0aGF0IGhpcyBuZXdzcGFwZXIKICMgcmVwb3J0cyB0aGF0IE5TVydzIGZhbGwgMTk5NSBjaGFuZ2Ugd2lsbCBvY2N1ciBhdCAyOjAwLAogIyBidXQgUm9iZXJ0IEVseiBzYXlzIGl0J3MgYmVlbiAzOjAwIGluIFZpY3RvcmlhIHNpbmNlIDE5NzAKLSMgYW5kIHBlcmhhcHMgdGhlIG5ld3NwYXBlcidzIGAyOjAwJyBpcyByZWZlcnJpbmcgdG8gc3RhbmRhcmQgdGltZS4KKyMgYW5kIHBlcmhhcHMgdGhlIG5ld3NwYXBlcidzICcyOjAwJyBpcyByZWZlcnJpbmcgdG8gc3RhbmRhcmQgdGltZS4KICMgRm9yIG5vdyB3ZSdsbCBjb250aW51ZSB0byBhc3N1bWUgMjowMHMgZm9yIGNoYW5nZXMgc2luY2UgMTk2MC4KIAogIyBGcm9tIEVyaWMgVWxldmlrICgxOTk4LTAxLTA1KToKQEAgLTEwNTUsMTcgKzk5OSwxNCBAQAogIyByZWxldmFudCBlbnRyaWVzIGluIHRoaXMgZGF0YWJhc2UuCiAjCiAjIE5TVyAoaW5jbHVkaW5nIExISSBhbmQgQnJva2VuIEhpbGwpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL25zdy9jb25zb2xfYWN0L3N0YTE5ODcxMzcvaW5kZXguaHRtbCI+CiAjIFN0YW5kYXJkIFRpbWUgQWN0IDE5ODcgKHVwZGF0ZWQgMTk5NS0wNC0wNCkKLSMgPC9hPgorIyBodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL25zdy9jb25zb2xfYWN0L3N0YTE5ODcxMzcvaW5kZXguaHRtbAogIyBBQ1QKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hdXN0bGlpLmVkdS5hdS9hdS9sZWdpcy9hY3QvY29uc29sX2FjdC9zdGFzdGExOTcyMjc5L2luZGV4Lmh0bWwiPgogIyBTdGFuZGFyZCBUaW1lIGFuZCBTdW1tZXIgVGltZSBBY3QgMTk3MgotIyA8L2E+CisjIGh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvYXUvbGVnaXMvYWN0L2NvbnNvbF9hY3Qvc3Rhc3RhMTk3MjI3OS9pbmRleC5odG1sCiAjIFNBCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvYXUvbGVnaXMvc2EvY29uc29sX2FjdC9zdGExODk4MTM3L2luZGV4Lmh0bWwiPgogIyBTdGFuZGFyZCBUaW1lIEFjdCwgMTg5OAotIyA8L2E+CisjIGh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvYXUvbGVnaXMvc2EvY29uc29sX2FjdC9zdGExODk4MTM3L2luZGV4Lmh0bWwKIAogIyBGcm9tIERhdmlkIEdyb3N6ICgyMDA1LTA2LTEzKToKICMgSXQgd2FzIGFubm91bmNlZCBsYXN0IHdlZWsgdGhhdCBEYXlsaWdodCBTYXZpbmcgd291bGQgYmUgZXh0ZW5kZWQgYnkKQEAgLTEwODMsNyArMTAyNCw3IEBACiAjIFZpY3RvcmlhOiBJIHdhc24ndCBhYmxlIHRvIGZpbmQgYW55dGhpbmcgc2VwYXJhdGUsIGJ1dCB0aGUgb3RoZXIgYXJ0aWNsZXMKICMgYWxsdWRlIHRvIGl0LgogIyBCdXQgbm90IFF1ZWVuc2xhbmQKLSMgaHR0cDovL3d3dy5uZXdzLmNvbS5hdS9zdG9yeS8wLDEwMTE3LDE1NTY0MDMwLTEyNDgsMDAuaHRtbC4KKyMgaHR0cDovL3d3dy5uZXdzLmNvbS5hdS9zdG9yeS8wLDEwMTE3LDE1NTY0MDMwLTEyNDgsMDAuaHRtbAogCiAjIE5vcnRoZXJuIFRlcnJpdG9yeQogCkBAIC0xMTMwLDkgKzEwNzEsOSBAQAogIyBUaGUgMTk5MiBlbmRpbmcgZGF0ZSB1c2VkIGluIHRoZSBydWxlcyBpcyBhIGJlc3QgZ3Vlc3M7CiAjIGl0IG1hdGNoZXMgd2hhdCB3YXMgdXNlZCBpbiB0aGUgcGFzdC4KIAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJvbS5nb3YuYXUvZmFxL2ZhcWdlbi5odG0iPgogIyBUaGUgQXVzdHJhbGlhbiBCdXJlYXUgb2YgTWV0ZW9yb2xvZ3kgRkFRCi0jIDwvYT4gKDE5OTktMDktMjcpIHdyaXRlcyB0aGF0IEdpbGVzIE1ldGVvcm9sb2dpY2FsIFN0YXRpb24gdXNlcworIyBodHRwOi8vd3d3LmJvbS5nb3YuYXUvZmFxL2ZhcWdlbi5odG0KKyMgKDE5OTktMDktMjcpIHdyaXRlcyB0aGF0IEdpbGVzIE1ldGVvcm9sb2dpY2FsIFN0YXRpb24gdXNlcwogIyBTb3V0aCBBdXN0cmFsaWFuIHRpbWUgZXZlbiB0aG91Z2ggaXQncyBsb2NhdGVkIGluIFdlc3Rlcm4gQXVzdHJhbGlhLgogCiAjIFF1ZWVuc2xhbmQKQEAgLTExNzMsOSArMTExNCw5IEBACiAjIFRoZSBjaG9zZW4gcnVsZXMgdGhlIHVuaW9uIG9mIHRoZSAxOTcxLzE5NzIgY2hhbmdlIGFuZCB0aGUgMTk4OS0xOTkyIGNoYW5nZXMuCiAKICMgRnJvbSBDaHJpc3RvcGhlciBIdW50ICgyMDA2LTExLTIxKSwgYWZ0ZXIgYW4gYWR2YW5jZSB3YXJuaW5nCi0jIGZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTExLTAxKToKKyMgZnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA2LTExLTAxKToKICMgV0EgYXJlIHRyaWFsaW5nIERTVCBmb3IgdGhyZWUgeWVhcnMuCi0jIDxodHRwOi8vd3d3LnBhcmxpYW1lbnQud2EuZ292LmF1L3BhcmxpYW1lbnQvYmlsbHMubnNmLzlBMUIxODMxNDQ0MDNEQTU0ODI1NzIxMjAwMDg4REYxLyRGaWxlL0JpbGwxNzUtMUIucGRmPgorIyBodHRwOi8vd3d3LnBhcmxpYW1lbnQud2EuZ292LmF1L3BhcmxpYW1lbnQvYmlsbHMubnNmLzlBMUIxODMxNDQ0MDNEQTU0ODI1NzIxMjAwMDg4REYxLyRGaWxlL0JpbGwxNzUtMUIucGRmCiAKICMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMi0wNC0wOSk6CiAjIFRoZSBtb3N0IGludGVyZXN0aW5nIHJlZ2lvbiBJIGhhdmUgZm91bmQgY29uc2lzdHMgb2YgdGhyZWUgdG93bnMgb24gdGhlCkBAIC0xMTg5LDcgKzExMzAsNyBAQAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAyLTA0LTA5KToKICMgVGhpcyBpcyBjb25maXJtZWQgYnkgdGhlIHNlY3Rpb24gZW50aXRsZWQKICMgIldoYXQncyB0aGUgZGVhbCB3aXRoIHRpbWUgem9uZXM/Pz8iIGluCi0jIDxodHRwOi8vd3d3LmVhcnRoc2NpLnVuaW1lbGIuZWR1LmF1L35hd2F0a2lucy9udWxsLmh0bWw+LgorIyBodHRwOi8vd3d3LmVhcnRoc2NpLnVuaW1lbGIuZWR1LmF1L35hd2F0a2lucy9udWxsLmh0bWwKICMKICMgRnJvbSBBbGV4IExpdmluZ3N0b24gKDIwMDYtMTItMDcpOgogIyAuLi4gaXQgd2FzIGp1c3Qgb24gZm91ciB5ZWFycyBhZ28gdGhhdCBJIGRyb3ZlIGFsb25nIHRoZSBFeXJlIEhpZ2h3YXksCkBAIC0xMzM3LDcgKzEyNzgsNyBAQAogIyBCYXNlZCBvbiBsYXcgbGlicmFyeSByZXNlYXJjaCBieSBKb2huIE1hY2tpbiwKICMgd2hvIG5vdGVzOgogIwlJbiBBdXN0cmFsaWEsIHRpbWUgaXMgbm90IGxlZ2lzbGF0ZWQgZmVkZXJhbGx5LCBidXQgcmF0aGVyIGJ5IHRoZQotIwlpbmRpdmlkdWFsIHN0YXRlcy4gIFRodXMsIHdoaWxlIHN1Y2ggdGVybXMgYXMgYGBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUnJworIwlpbmRpdmlkdWFsIHN0YXRlcy4gIFRodXMsIHdoaWxlIHN1Y2ggdGVybXMgYXMgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIKICMJW0kgbWVhbiwgb2YgY291cnNlLCBBdXN0cmFsaWFuIEVTVCwgbm90IGFueSBvdGhlciBraW5kXSBhcmUgaW4gY29tbW9uCiAjCXVzZSwgX3RoZXkgaGF2ZSBOTyBSRUFMIE1FQU5JTkdfLCBhcyB0aGV5IGFyZSBub3QgZGVmaW5lZCBpbiB0aGUKICMJbGVnaXNsYXRpb24uICBUaGlzIGlzIHZlcnkgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQuCkBAIC0xMzQ1LDQ4ICsxMjg2LDQyIEBACiAKICMgRnJvbSBFcmljIFVsZXZpayAoMTk5OS0wNS0yNik6CiAjIERTVCB3aWxsIHN0YXJ0IGluIE5TVyBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgQXVndXN0LCByYXRoZXIgdGhhbiB0aGUgdXN1YWwKLSMgT2N0b2JlciBpbiAyMDAwLiAgW1NlZTogTWF0dGhldyBNb29yZSwKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zbWguY29tLmF1L25ld3MvOTkwNS8yNi9wYWdlb25lL3BhZ2VvbmU0Lmh0bWwiPgotIyBUd28gbW9udGhzIG1vcmUgZGF5bGlnaHQgc2F2aW5nCi0jIDwvYT4KLSMgU3lkbmV5IE1vcm5pbmcgSGVyYWxkICgxOTk5LTA1LTI2KS5dCisjIE9jdG9iZXIgaW4gMjAwMC4gIFNlZTogTWF0dGhldyBNb29yZSwKKyMgVHdvIG1vbnRocyBtb3JlIGRheWxpZ2h0IHNhdmluZywgU3lkbmV5IE1vcm5pbmcgSGVyYWxkICgxOTk5LTA1LTI2KS4KKyMgaHR0cDovL3d3dy5zbWguY29tLmF1L25ld3MvOTkwNS8yNi9wYWdlb25lL3BhZ2VvbmU0Lmh0bWwKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTA5LTI3KToKICMgU2VlIHRoZSBmb2xsb3dpbmcgb2ZmaWNpYWwgTlNXIHNvdXJjZToKLSMgPGEgaHJlZj0iaHR0cDovL2Rpci5naXMubnN3Lmdvdi5hdS9jZ2ktYmluL2dlbm9iamVjdC9kb2N1bWVudC9vdGhlci9kYXlsaWdodHNhdmluZy90aWdHbVoiPgogIyBEYXlsaWdodCBTYXZpbmcgaW4gTmV3IFNvdXRoIFdhbGVzLgotIyA8L2E+CisjIGh0dHA6Ly9kaXIuZ2lzLm5zdy5nb3YuYXUvY2dpLWJpbi9nZW5vYmplY3QvZG9jdW1lbnQvb3RoZXIvZGF5bGlnaHRzYXZpbmcvdGlnR21aCiAjCiAjIE5hcnJhYnJpIFNoaXJlIChOU1cpIGNvdW5jaWwgaGFzIGFubm91bmNlZCBpdCB3aWxsIGlnbm9yZSB0aGUgZXh0ZW5zaW9uIG9mCiAjIGRheWxpZ2h0IHNhdmluZyBuZXh0IHllYXIuICBTZWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hYmMubmV0LmF1L25ld3MvcmVnaW9uYWxzL25ld2VuZy9tb250aGx5L3JlZ2VuZy0yMmp1bDE5OTktMS5odG0iPgogIyBOYXJyYWJyaSBDb3VuY2lsIHRvIGlnbm9yZSBkYXlsaWdodCBzYXZpbmcKLSMgPC9hPiAoMTk5OS0wNy0yMikuICBGb3Igbm93LCB3ZSdsbCB3YWl0IHRvIHNlZSBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLgorIyBodHRwOi8vYWJjLm5ldC5hdS9uZXdzL3JlZ2lvbmFscy9uZXdlbmcvbW9udGhseS9yZWdlbmctMjJqdWwxOTk5LTEuaHRtCisjICgxOTk5LTA3LTIyKS4gIEZvciBub3csIHdlJ2xsIHdhaXQgdG8gc2VlIGlmIHRoaXMgcmVhbGx5IGhhcHBlbnMuCiAjCiAjIFZpY3RvcmlhIHdpbGwgZm9sbG93aW5nIE5TVy4gIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL2FiYy5uZXQuYXUvbG9jYWwvbmV3cy9vbHltcGljcy8xOTk5LzA3L2l0ZW0xOTk5MDcyODExMjMxNF8xLmh0bSI+Ci0jIFZpYyB0byBleHRlbmQgZGF5bGlnaHQgc2F2aW5nCi0jIDwvYT4gKDE5OTktMDctMjgpLgorIyBWaWMgdG8gZXh0ZW5kIGRheWxpZ2h0IHNhdmluZyAoMTk5OS0wNy0yOCkKKyMgaHR0cDovL2FiYy5uZXQuYXUvbG9jYWwvbmV3cy9vbHltcGljcy8xOTk5LzA3L2l0ZW0xOTk5MDcyODExMjMxNF8xLmh0bQogIwogIyBIb3dldmVyLCBTb3V0aCBBdXN0cmFsaWEgcmVqZWN0ZWQgdGhlIERTVCByZXF1ZXN0LiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL29seW1waWNzLzE5OTkvMDcvaXRlbTE5OTkwNzE5MTUxNzU0XzEuaHRtIj4KLSMgU291dGggQXVzdHJhbGlhIHJlamVjdHMgT2x5bXBpY3MgZGF5bGlnaHQgc2F2aW5ncyByZXF1ZXN0Ci0jIDwvYT4gKDE5OTktMDctMTkpLgorIyBTb3V0aCBBdXN0cmFsaWEgcmVqZWN0cyBPbHltcGljcyBkYXlsaWdodCBzYXZpbmdzIHJlcXVlc3QgKDE5OTktMDctMTkpCisjIGh0dHA6Ly9hYmMubmV0LmF1L25ld3Mvb2x5bXBpY3MvMTk5OS8wNy9pdGVtMTk5OTA3MTkxNTE3NTRfMS5odG0KICMKICMgUXVlZW5zbGFuZCBhbHNvIHdpbGwgbm90IG9ic2VydmUgRFNUIGZvciB0aGUgT2x5bXBpY3MuICBTZWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hYmMubmV0LmF1L25ld3Mvb2x5bXBpY3MvMTk5OS8wNi9pdGVtMTk5OTA2MDExMTQ2MDhfMS5odG0iPgogIyBRbGQgc2F5cyBubyB0byBkYXlsaWdodCBzYXZpbmdzIGZvciBPbHltcGljcwotIyA8L2E+ICgxOTk5LTA2LTAxKSwgd2hpY2ggcXVvdGVzIFF1ZWVuc2xhbmQgUHJlbWllciBQZXRlciBCZWF0dGllIGFzIHNheWluZwotIyBgYExvb2sgeW91J3ZlIGdvdCB0byByZW1lbWJlciBpbiBteSBmYW1pbHkgd2hlbiB0aGlzIGNhbWUgdXAgbGFzdCB0aW1lCisjIGh0dHA6Ly9hYmMubmV0LmF1L25ld3Mvb2x5bXBpY3MvMTk5OS8wNi9pdGVtMTk5OTA2MDExMTQ2MDhfMS5odG0KKyMgKDE5OTktMDYtMDEpLCB3aGljaCBxdW90ZXMgUXVlZW5zbGFuZCBQcmVtaWVyIFBldGVyIEJlYXR0aWUgYXMgc2F5aW5nCisjICJMb29rIHlvdSd2ZSBnb3QgdG8gcmVtZW1iZXIgaW4gbXkgZmFtaWx5IHdoZW4gdGhpcyBjYW1lIHVwIGxhc3QgdGltZQogIyBJIHZvdGVkIGZvciBpdCwgbXkgd2lmZSB2b3RlZCBhZ2FpbnN0IGl0IGFuZCBzaGUgc2FpZCB0byBtZSBpdCdzIGFsbCB2ZXJ5CiAjIHdlbGwgZm9yIHlvdSwgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZ2V0dGluZyB0aGUgY2hpbGRyZW4gb3V0IG9mCiAjIGJlZCwgZ2V0dGluZyB0aGVtIHRvIHNjaG9vbCwgZ2V0dGluZyB0aGVtIHRvIHNsZWVwIGF0IG5pZ2h0LgotIyBJJ3ZlIGJlZW4gdGhyb3VnaCBhbGwgdGhpcyBhcmd1bWVudCBkb21lc3RpY2FsbHkuLi5teSB3aWZlIHJ1bGVzLicnCisjIEkndmUgYmVlbiB0aHJvdWdoIGFsbCB0aGlzIGFyZ3VtZW50IGRvbWVzdGljYWxseS4uLm15IHdpZmUgcnVsZXMuIgogIwogIyBCcm9rZW4gSGlsbCB3aWxsIHN0aWNrIHdpdGggU291dGggQXVzdHJhbGlhbiB0aW1lIGluIDIwMDAuICBTZWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hYmMubmV0LmF1L25ld3MvcmVnaW9uYWxzL2Jyb2tlbmgvbW9udGhseS9yZWdicm9rLTIxanVsMTk5OS02Lmh0bSI+Ci0jIEJyb2tlbiBIaWxsIHRvIGJlIGJlaGluZCB0aGUgdGltZXMKLSMgPC9hPiAoMTk5OS0wNy0yMSkuCisjIEJyb2tlbiBIaWxsIHRvIGJlIGJlaGluZCB0aGUgdGltZXMgKDE5OTktMDctMjEpCisjIGh0dHA6Ly9hYmMubmV0LmF1L25ld3MvcmVnaW9uYWxzL2Jyb2tlbmgvbW9udGhseS9yZWdicm9rLTIxanVsMTk5OS02Lmh0bQogCiAjIElBVEEgU1NJTSAoMTk5OC0wOSkgc2F5cyB0aGF0IHRoZSBzcHJpbmcgMjAwMCBjaGFuZ2UgZm9yIEF1c3RyYWxpYW4KICMgQ2FwaXRhbCBUZXJyaXRvcnksIE5ldyBTb3V0aCBXYWxlcyBleGNlcHQgTG9yZCBIb3dlIElzbGFuZCBhbmQgQnJva2VuCkBAIC0xNDAyLDcgKzEzMzcsNyBAQAogIyBZYW5jb3dpbm5hCiAKICMgRnJvbSBKb2huIE1hY2tpbiAoMTk4OS0wMS0wNCk6Ci0jIGBCcm9rZW4gSGlsbCcgbWVhbnMgdGhlIENvdW50eSBvZiBZYW5jb3dpbm5hLgorIyAnQnJva2VuIEhpbGwnIG1lYW5zIHRoZSBDb3VudHkgb2YgWWFuY293aW5uYS4KIAogIyBGcm9tIEdlb3JnZSBTaGVwaGVyZCB2aWEgU2ltb24gV29vZGhlYWQgdmlhIFJvYmVydCBFbHogKDE5OTEtMDMtMDYpOgogIyAjIFlBTkNPV0lOTkEuLiAgWyBDb25maXJtYXRpb24gY291cnRlc3kgb2YgQnJva2VuIEhpbGwgUG9zdG1hc3RlciBdCkBAIC0xNDU5LDkgKzEzOTQsNyBAQAogIyBzdW1tZXIgKHNvdXRoZXJuIGhlbWlzcGhlcmUpLgogIwogIyBGcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FmZXdvcmsuc2EuZ292LmF1L3VwbG9hZGVkX2ZpbGVzL0RheWxpZ2h0RGF0ZXNTZXQucGRmIj4KICMgaHR0cDovL3d3dy5zYWZld29yay5zYS5nb3YuYXUvdXBsb2FkZWRfZmlsZXMvRGF5bGlnaHREYXRlc1NldC5wZGYKLSMgPC9hPgogIyBUaGUgZXh0ZW5kZWQgZGF5bGlnaHQgc2F2aW5nIHBlcmlvZCB0aGF0IFNvdXRoIEF1c3RyYWxpYSBoYXMgYmVlbiB0cmlhbGxpbmcKICMgZm9yIG92ZXIgdGhlIGxhc3QgeWVhciBpcyBub3cgc2V0IHRvIGJlIG9uZ29pbmcuCiAjIERheWxpZ2h0IHNhdmluZyB3aWxsIGNvbnRpbnVlIHRvIHN0YXJ0IG9uIHRoZSBmaXJzdCBTdW5kYXkgaW4gT2N0b2JlciBlYWNoCkBAIC0xNDcxLDkgKzE0MDQsNyBAQAogIyB0aGUgQUNUIGZvciBhbGwgNTIgd2Vla3Mgb2YgdGhlIHllYXIuLi4KICMKICMgV2UgaGF2ZSBhIHdyYXAtdXAgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3NvdXRoLWF1c3RyYWxpYS1leHRlbmRzLWRzdC5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3NvdXRoLWF1c3RyYWxpYS1leHRlbmRzLWRzdC5odG1sCi0jIDwvYT4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBOZXcgWmVhbGFuZApAQCAtMTQ4Miw3ICsxNDEzLDcgQEAKICMgdGhlIDE5ODkvOTAgeWVhciB3YXMgYSB0cmlhbCBvZiBhbiBleHRlbmRlZCAiZGF5bGlnaHQgc2F2aW5nIiBwZXJpb2QuCiAjIFRoaXMgdHJpYWwgd2FzIGRlZW1lZCBzdWNjZXNzZnVsIGFuZCB0aGUgZXh0ZW5kZWQgcGVyaW9kIGFkb3B0ZWQgZm9yCiAjIHN1YnNlcXVlbnQgeWVhcnMgKHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgZnVydGhlciB3ZWVrIGF0IHRoZSBzdGFydCkuCi0jIHNvdXJjZSAtLSBwaG9uZSBjYWxsIHRvIE1pbmlzdHJ5IG9mIEludGVybmFsIEFmZmFpcnMgSGVhZCBPZmZpY2UuCisjIHNvdXJjZSAtIHBob25lIGNhbGwgdG8gTWluaXN0cnkgb2YgSW50ZXJuYWwgQWZmYWlycyBIZWFkIE9mZmljZS4KIAogIyBGcm9tIEdlb3JnZSBTaGVwaGVyZCB2aWEgU2ltb24gV29vZGhlYWQgdmlhIFJvYmVydCBFbHogKDE5OTEtMDMtMDYpOgogIyAjIFRoZSBDb3VudHJ5IG9mIE5ldyBaZWFsYW5kICAgKEF1c3RyYWxpYSdzIGVhc3QgaXNsYW5kIC0pIEdlZSB0aGV5IGhhdGUgdGhhdCEKQEAgLTE1MjQsNiArMTQ1NSwxOSBAQAogIyB0aGF0IERTVCB3aWxsIGJlZ2luIG9uIDIwMDctMDktMzAgMjAwOC0wNC0wNi4KICMgaHR0cDovL3d3dy5kaWEuZ292dC5uei9kaWF3ZWJzaXRlLm5zZi93cGdfVVJML1NlcnZpY2VzLURheWxpZ2h0LVNhdmluZy1EYXlsaWdodC1zYXZpbmctdG8tYmUtZXh0ZW5kZWQKIAorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTE0KToKKyMgQ2hhdGhhbSBJc2xhbmQgdGltZSB3YXMgZm9ybWFsbHkgc3RhbmRhcmRpemVkIG9uIDE5NTctMDEtMDEgYnkKKyMgTmV3IFplYWxhbmQncyBTdGFuZGFyZCBUaW1lIEFtZW5kbWVudCBBY3QgMTk1NiAoMTk1Ni0xMC0yNikuCisjIGh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvbnovbGVnaXMvaGlzdF9hY3Qvc3RhYTE5NTYxOTU2bjEwMDI0NC5wZGYKKyMgQWNjb3JkaW5nIHRvIEdvb2dsZSBCb29rcyBzbmlwcGV0IHZpZXcsIGEgc3BlYWtlciBpbiB0aGUgTmV3IFplYWxhbmQKKyMgcGFybGlhbWVudGFyeSBkZWJhdGVzIGluIDE5NTYgc2FpZCAiQ2xhdXNlIDc4IG1ha2VzIHByb3Zpc2lvbiBmb3Igc3RhbmRhcmQKKyMgdGltZSBpbiB0aGUgQ2hhdGhhbSBJc2xhbmRzLiAgVGhlIHRpbWUgdGhlcmUgaXMgNDUgbWludXRlcyBpbiBhZHZhbmNlIG9mIE5ldworIyBaZWFsYW5kIHRpbWUuICBJIHVuZGVyc3RhbmQgdGhhdCBpcyB0aGUgdGltZSB0aGV5IGtlZXAgbG9jYWxseSwgYW55aG93LiIKKyMgRm9yIG5vdywgYXNzdW1lIHRoaXMgcHJhY3RpY2UgZ29lcyBiYWNrIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygc3RhbmRhcmQgdGltZQorIyBpbiBOZXcgWmVhbGFuZCwgYXMgdGhpcyB3b3VsZCBtYWtlIENoYXRoYW0gSXNsYW5kcyB0aW1lIGFsbW9zdCBleGFjdGx5IG1hdGNoCisjIExNVCBiYWNrIHdoZW4gTmV3IFplYWxhbmQgd2FzIGF0IFVUQysxMTozMDsgYWxzbywgYXNzdW1lIENoYXRoYW0gSXNsYW5kcyBkaWQKKyMgbm90IG9ic2VydmUgTmV3IFplYWxhbmQncyBwcmV3YXIgRFNULgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIApAQCAtMTU0Myw3ICsxNDg3LDcgQEAKIAogIyBGcm9tIHRoZSBCQkMgV29ybGQgU2VydmljZSBpbgogIyBodHRwOi8vbmV3cy5iYmMuY28udWsvMi9oaS9hc2lhLXBhY2lmaWMvMjA1MjI2LnN0bSAoMTk5OC0xMC0zMSAxNjowMyBVVEMpOgotIyBUaGUgRmlqaWlhbiBnb3Zlcm5tZW50IHNheXMgdGhlIG1haW4gcmVhc29ucyBmb3IgdGhlIHRpbWUgY2hhbmdlIGlzIHRvCisjIFRoZSBGaWppYW4gZ292ZXJubWVudCBzYXlzIHRoZSBtYWluIHJlYXNvbnMgZm9yIHRoZSB0aW1lIGNoYW5nZSBpcyB0bwogIyBpbXByb3ZlIHByb2R1Y3Rpdml0eSBhbmQgcmVkdWNlIHJvYWQgYWNjaWRlbnRzLi4uLiBbVF1oZSBtb3ZlIGlzIGFsc28KICMgaW50ZW5kZWQgdG8gYm9vc3QgRmlqaSdzIGFiaWxpdHkgdG8gYXR0cmFjdCB0b3VyaXN0cyB0byB3aXRuZXNzIHRoZSBkYXduaW5nCiAjIG9mIHRoZSBuZXcgbWlsbGVubml1bS4KQEAgLTE1NTEsMTYgKzE0OTUsMTIgQEAKICMgaHR0cDovL3d3dy5maWppLmdvdi5mai9wcmVzcy8yMDAwXzA5LzIwMDBfMDlfMTMtMDUuc2h0bWwgKDIwMDAtMDktMTMpCiAjIHJlcG9ydHMgdGhhdCBGaWppIGhhcyBkaXNjb250aW51ZWQgRFNULgogCi0jIEpvaG5zdG9uCi0KLSMgSm9obnN0b24gZGF0YSBpcyBmcm9tIHVzbm8xOTk1LgotCiAKICMgS2lyaWJhdGkKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTAxLTIyKToKICMgVG9kYXkncyBfV2FsbCBTdHJlZXQgSm91cm5hbF8gKHBhZ2UgMSkgcmVwb3J0cyB0aGF0IEtpcmliYXRpCi0jIGBgZGVjbGFyZWQgaXQgdGhlIHNhbWUgZGF5IFt0aHJvdWdob3V0XSB0aGUgY291bnRyeSBhcyBvZiBKYW4uIDEsIDE5OTUnJworIyAiZGVjbGFyZWQgaXQgdGhlIHNhbWUgZGF5IFt0aHJvdWdob3V0XSB0aGUgY291bnRyeSBhcyBvZiBKYW4uIDEsIDE5OTUiCiAjIGFzIHBhcnQgb2YgdGhlIGNvbXBldGl0aW9uIHRvIGJlIGZpcnN0IGludG8gdGhlIDIxc3QgY2VudHVyeS4KIAogCkBAIC0xNTc1LDggKzE1MTUsOCBAQAogCiAjIE4gTWFyaWFuYSBJcywgR3VhbQogCi0jIEhvd3NlIHdyaXRlcyAocCAxNTMpIGBgVGhlIFNwYW5pYXJkcywgb24gdGhlIG90aGVyIGhhbmQsIHJlYWNoZWQgdGhlCi0jIFBoaWxpcHBpbmVzIGFuZCB0aGUgTGFkcm9uZXMgZnJvbSBBbWVyaWNhLCcnIGFuZCBpbXBsaWVzIHRoYXQgdGhlIExhZHJvbmVzCisjIEhvd3NlIHdyaXRlcyAocCAxNTMpICJUaGUgU3BhbmlhcmRzLCBvbiB0aGUgb3RoZXIgaGFuZCwgcmVhY2hlZCB0aGUKKyMgUGhpbGlwcGluZXMgYW5kIHRoZSBMYWRyb25lcyBmcm9tIEFtZXJpY2EsIiBhbmQgaW1wbGllcyB0aGF0IHRoZSBMYWRyb25lcwogIyAobm93IGNhbGxlZCB0aGUgTWFyaWFuYXMpIGtlcHQgQW1lcmljYW4gZGF0ZSBmb3IgcXVpdGUgc29tZSB0aW1lLgogIyBGb3Igbm93LCB3ZSBhc3N1bWUgdGhlIExhZHJvbmVzIHN3aXRjaGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIFBoaWxpcHBpbmVzOwogIyBzZWUgQXNpYS9NYW5pbGEuCkBAIC0xNTkwLDE3ICsxNTMwLDE2IEBACiAjIE1pY3JvbmVzaWEKIAogIyBBbGFuIEV1Z2VuZSBEYXZpcyB3cml0ZXMgKDE5OTYtMDMtMTYpLAotIyBgYEkgYW0gY2VydGFpbiwgaGF2aW5nIGxpdmVkIHRoZXJlIGZvciB0aGUgcGFzdCBkZWNhZGUsIHRoYXQgIlRydWsiCi0jIChub3cgcHJvcGVybHkga25vd24gYXMgQ2h1dWspIC4uLiBpcyBpbiB0aGUgdGltZSB6b25lIEdNVCsxMC4nJworIyAiSSBhbSBjZXJ0YWluLCBoYXZpbmcgbGl2ZWQgdGhlcmUgZm9yIHRoZSBwYXN0IGRlY2FkZSwgdGhhdCAnVHJ1aycKKyMgKG5vdyBwcm9wZXJseSBrbm93biBhcyBDaHV1aykgLi4uIGlzIGluIHRoZSB0aW1lIHpvbmUgR01UKzEwLiIKICMKICMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgVHJ1ayBzd2l0Y2hlZCBmcm9tIFVUQysxMCB0byBVVEMrMTEKICMgb24gMTk3OC0xMC0wMTsgaWdub3JlIHRoaXMgZm9yIG5vdy4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTEwLTI5KToKICMgVGhlIEZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYSBWaXNpdG9ycyBCb2FyZCB3cml0ZXMgaW4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5mc21nb3Yub3JnL2luZm8vY2xvY2tzLmh0bWwiPgotIyBUaGUgRmVkZXJhdGVkIFN0YXRlcyBvZiBNaWNyb25lc2lhIC0gVmlzaXRvciBJbmZvcm1hdGlvbgotIyA8L2E+ICgxOTk5LTAxLTI2KQorIyBUaGUgRmVkZXJhdGVkIFN0YXRlcyBvZiBNaWNyb25lc2lhIC0gVmlzaXRvciBJbmZvcm1hdGlvbiAoMTk5OS0wMS0yNikKKyMgaHR0cDovL3d3dy5mc21nb3Yub3JnL2luZm8vY2xvY2tzLmh0bWwKICMgdGhhdCBUcnVrIGFuZCBZYXAgYXJlIFVUQysxMCwgYW5kIFBvbmFwZSBhbmQgS29zcmFlIGFyZSBVVEMrMTEuCiAjIFdlIGRvbid0IGtub3cgd2hlbiBLb3NyYWUgc3dpdGNoZWQgZnJvbSBVVEMrMTI7IGFzc3VtZSBKYW51YXJ5IDEgZm9yIG5vdy4KIApAQCAtMTY0NiwyNyArMTU4NSwzNCBAQAogIyBTYWNyYW1lbnRvIGJ1dCBpdCB3YXMgY2hhbmdlZCBhIGNvdXBsZSBvZiB5ZWFycyBhZ28uCiAKIAotIyBTYW1vYQorIyAoV2VzdGVybikgU2Ftb2EgYW5kIEFtZXJpY2FuIFNhbW9hCiAKICMgSG93c2Ugd3JpdGVzIChwIDE1MywgY2l0aW5nIHAgMTAgb2YgdGhlIDE4ODMtMTEtMTggTmV3IFlvcmsgSGVyYWxkKQogIyB0aGF0IGluIDE4NzkgdGhlIEtpbmcgb2YgU2Ftb2EgZGVjaWRlZCB0byBjaGFuZ2UKLSMgYGB0aGUgZGF0ZSBpbiBoaXMga2luZ2RvbSBmcm9tIHRoZSBBbnRpcG9kZWFuIHRvIHRoZSBBbWVyaWNhbiBzeXN0ZW0sCi0jIG9yZGFpbmluZyAtLSBieSBhIG1hc3RlcnBpZWNlIG9mIGRpcGxvbWF0aWMgZmxhdHRlcnkgLS0gdGhhdAotIyB0aGUgRm91cnRoIG9mIEp1bHkgc2hvdWxkIGJlIGNlbGVicmF0ZWQgdHdpY2UgaW4gdGhhdCB5ZWFyLicnCisjICJ0aGUgZGF0ZSBpbiBoaXMga2luZ2RvbSBmcm9tIHRoZSBBbnRpcG9kZWFuIHRvIHRoZSBBbWVyaWNhbiBzeXN0ZW0sCisjIG9yZGFpbmluZyAtIGJ5IGEgbWFzdGVycGllY2Ugb2YgZGlwbG9tYXRpYyBmbGF0dGVyeSAtIHRoYXQKKyMgdGhlIEZvdXJ0aCBvZiBKdWx5IHNob3VsZCBiZSBjZWxlYnJhdGVkIHR3aWNlIGluIHRoYXQgeWVhci4iCiAKKyMgQWx0aG91Z2ggU2hhbmtzICYgUG90dGVuZ2VyIHNheXMgdGhleSBib3RoIHN3aXRjaGVkIHRvIFVUQy0xMTozMAorIyBpbiAxOTExLCBhbmQgdG8gVVRDLTExIGluIDE5NTAuIG1hbnkgZWFybGllciBzb3VyY2VzIGdpdmUgVVRDLTExCisjIGZvciBBbWVyaWNhbiBTYW1vYSwgZS5nLiwgdGhlIFVTIE5hdGlvbmFsIEJ1cmVhdSBvZiBTdGFuZGFyZHMKKyMgY2lyY3VsYXIgIlN0YW5kYXJkIFRpbWUgVGhyb3VnaG91dCB0aGUgV29ybGQiLCAxOTMyLgorIyBBc3N1bWUgQW1lcmljYW4gU2Ftb2Egc3dpdGNoZWQgdG8gVVRDLTExIGluIDE5MTEsIG5vdCAxOTUwLAorIyBhbmQgdGhhdCBhZnRlciAxOTUwIHRoZXkgYWdyZWVkIHVudGlsICh3ZXN0ZXJuKSBTYW1vYSBza2lwcGVkIGEKKyMgZGF5IGluIDIwMTEuICBBc3N1bWUgYWxzbyB0aGF0IHRoZSBTYW1vYXMgZm9sbG93IHRoZSBVUyBhbmQgTmV3CisjIFplYWxhbmQncyAiU1QiLyJEVCIgc3R5bGUgb2YgZGF5bGlnaHQtc2F2aW5nIGFiYnJldmlhdGlvbnMuCiAKICMgVG9uZ2EKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTAxLTIyKToKLSMgVG9kYXkncyBfV2FsbCBTdHJlZXQgSm91cm5hbF8gKHAgMSkgcmVwb3J0cyB0aGF0IGBgVG9uZ2EgaGFzIGJlZW4gcGxvdHRpbmcKLSMgdG8gc25lYWsgYWhlYWQgb2YgW05ldyBaZWFsYW5kZXJzXSBieSBpbnRyb2R1Y2luZyBkYXlsaWdodC1zYXZpbmcgdGltZS4nJworIyBUb2RheSdzIF9XYWxsIFN0cmVldCBKb3VybmFsXyAocCAxKSByZXBvcnRzIHRoYXQgIlRvbmdhIGhhcyBiZWVuIHBsb3R0aW5nCisjIHRvIHNuZWFrIGFoZWFkIG9mIFtOZXcgWmVhbGFuZGVyc10gYnkgaW50cm9kdWNpbmcgZGF5bGlnaHQtc2F2aW5nIHRpbWUuIgogIyBTaW5jZSBLaXJpYmF0aSBoYXMgbW92ZWQgdGhlIERhdGUgTGluZSBpdCdzIG5vdCBjbGVhciB3aGF0IFRvbmdhIHdpbGwgZG8uCiAKICMgRG9uIE11bmRlbGwgd3JpdGVzIGluIHRoZSAxOTk3LTAyLTIwIFRvbmdhIENocm9uaWNsZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRvbmdhdGFwdS5uZXQudG8vdG9uZ2EvaG9tZWxhbmQvdGltZWJlZ2lucy5odG0iPgotIyBIb3cgVG9uZ2EgYmVjYW1lIGBUaGUgTGFuZCB3aGVyZSBUaW1lIEJlZ2lucycKLSMgPC9hPjoKLQorIyBIb3cgVG9uZ2EgYmVjYW1lICdUaGUgTGFuZCB3aGVyZSBUaW1lIEJlZ2lucyc6CisjIGh0dHA6Ly93d3cudG9uZ2F0YXB1Lm5ldC50by90b25nYS9ob21lbGFuZC90aW1lYmVnaW5zLmh0bQorIwogIyBVbnRpbCAxOTQxIFRvbmdhIG1haW50YWluZWQgYSBzdGFuZGFyZCB0aW1lIDUwIG1pbnV0ZXMgYWhlYWQgb2YgTlpTVAogIyAxMiBob3VycyBhbmQgMjAgbWludXRlcyBhaGVhZCBvZiBHTVQuICBXaGVuIE5ldyBaZWFsYW5kIGFkanVzdGVkIGl0cwogIyBzdGFuZGFyZCB0aW1lIGluIDE5NDBzLCBUb25nYSBoYWQgdGhlIGNob2ljZSBvZiBzdWJ0cmFjdGluZyBmcm9tIGl0cwpAQCAtMTY3NCw4ICsxNjIwLDggQEAKICMgYWR2YW5jaW5nIGl0cyB0aW1lIHRvIG1haW50YWluIHRoZSBkaWZmZXJlbnRpYWwgb2YgMTMgZGVncmVlcwogIyAoYXBwcm94aW1hdGVseSA1MCBtaW51dGVzIGFoZWFkIG9mIE5ldyBaZWFsYW5kIHRpbWUpLgogIwotIyBCZWNhdXNlIEhpcyBNYWplc3R5IEtpbmcgVGF1ZmEnYWhhdSBUdXBvdSBJViwgdGhlbiBDcm93biBQcmluY2UKLSMgVHVuZ2ksIHByZWZlcnJlZCB0byBlbnN1cmUgVG9uZ2EncyB0aXRsZSBhcyB0aGUgbGFuZCB3aGVyZSB0aW1lCisjIEJlY2F1c2UgSGlzIE1hamVzdHkgS2luZyBUxIF1ZmHKu8SBaGF1IFR1cG91IElWLCB0aGVuIENyb3duIFByaW5jZQorIyBUdW5nxKssIHByZWZlcnJlZCB0byBlbnN1cmUgVG9uZ2EncyB0aXRsZSBhcyB0aGUgbGFuZCB3aGVyZSB0aW1lCiAjIGJlZ2lucywgdGhlIExlZ2lzbGF0aXZlIEFzc2VtYmx5IGFwcHJvdmVkIHRoZSBsYXR0ZXIgY2hhbmdlLgogIwogIyBCdXQgc29tZSBvZiB0aGUgb2xkZXIsIG1vcmUgY29uc2VydmF0aXZlIG1lbWJlcnMgZnJvbSB0aGUgb3V0ZXIKQEAgLTE3MDEsOSArMTY0Nyw3IEBACiAjICogVG9uZ2Egd2lsbCBpbnRyb2R1Y2UgRFNUIGluIE5vdmVtYmVyCiAjCiAjIEkgd2FzIGdpdmVuIHRoaXMgbGluayBieSBKb2huIExldHRzOgotIyA8YSBocmVmPSJodHRwOi8vbmV3cy5iYmMuY28udWsvaGkvZW5nbGlzaC93b3JsZC9hc2lhLXBhY2lmaWMvbmV3c2lkXzQyNDAwMC80MjQ3NjQuc3RtIj4KICMgaHR0cDovL25ld3MuYmJjLmNvLnVrL2hpL2VuZ2xpc2gvd29ybGQvYXNpYS1wYWNpZmljL25ld3NpZF80MjQwMDAvNDI0NzY0LnN0bQotIyA8L2E+CiAjCiAjIEkgaGF2ZSBub3QgYmVlbiBhYmxlIHRvIGZpbmQgZXhhY3QgZGF0ZXMgZm9yIHRoZSB0cmFuc2l0aW9uIGluIE5vdmVtYmVyCiAjIHlldC4gQnkgcmVhZGluZyB0aGlzIGFydGljbGUgaXQgc2VlbXMgbGlrZSBGaWppIHdpbGwgYmUgMTQgaG91cnMgYWhlYWQKQEAgLTE3MTEsOSArMTY1NSw3IEBACiAjICgxMiArIDEgaG91ciBEU1QpLgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTk5LTA5LTIwKToKLSMgQWNjb3JkaW5nIHRvIDxhIGhyZWY9Imh0dHA6Ly93d3cudG9uZ2FvbmxpbmUuY29tL25ld3Mvc2VwdDE3OTkuaHRtbCI+Ci0jIGh0dHA6Ly93d3cudG9uZ2FvbmxpbmUuY29tL25ld3Mvc2VwdDE3OTkuaHRtbAotIyA8L2E+OgorIyBBY2NvcmRpbmcgdG8gPGh0dHA6Ly93d3cudG9uZ2FvbmxpbmUuY29tL25ld3Mvc2VwdDE3OTkuaHRtbD46CiAjICJEYXlsaWdodCBTYXZpbmdzIFRpbWUgd2lsbCB0YWtlIGVmZmVjdCBvbiBPY3QuIDIgdGhyb3VnaCBBcHJpbCAxNSwgMjAwMAogIyBhbmQgYW5udWFsbHkgdGhlcmVhZnRlciBmcm9tIHRoZSBmaXJzdCBTYXR1cmRheSBpbiBPY3RvYmVyIHRocm91Z2ggdGhlCiAjIHRoaXJkIFNhdHVyZGF5IG9mIEFwcmlsLiAgVW5kZXIgdGhlIHN5c3RlbSBhcHByb3ZlZCBieSBQcml2eSBDb3VuY2lsIG9uCkBAIC0xNzMxLDcgKzE2NzMsNyBAQAogIyBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCByZXBvcnRlZCBkYXRlIEFwcmlsIDE2LiBVbmZvcnR1bmF0ZWx5LCB0aGUgYXJ0aWNsZQogIyBpcyBubyBsb25nZXIgYXZhaWxhYmxlIG9uIHRoZSBzaXRlLCBhbmQgSSBkaWQgbm90IG1ha2UgYSBjb3B5IG9mIHRoZQogIyB0ZXh0LCBhbmQgSSBoYXZlIGZvcmdvdHRlbiB0byByZXBvcnQgaXQgaGVyZS4KLSMgKE9yaWdpbmFsIFVSTCB3YXM6IGh0dHA6Ly93d3cudG9uZ2FvbmxpbmUuY29tL25ld3MvbWFyY2gxNjIwMDAuaHRtICkKKyMgKE9yaWdpbmFsIFVSTCB3YXMgPGh0dHA6Ly93d3cudG9uZ2FvbmxpbmUuY29tL25ld3MvbWFyY2gxNjIwMDAuaHRtPikKIAogIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTEyLTAxKToKICMgVG9uZ2EgaXMgb2JzZXJ2aW5nIERTVCBhcyBvZiAyMDAwLTExLTA0IGFuZCB3aWxsIHN0b3Agb24gMjAwMS0wMS0yNy4KQEAgLTE3NTEsNyArMTY5Myw3IEBACiAjIEZyb20gVmVybmljZSBBbmRlcnNvbiwgUGVyc29uYWwgU2VjcmV0YXJ5IHRvIFBoaWxpcCBKZXNzdXAsCiAjIFVTIEFtYmFzc2Fkb3IgQXQgTGFyZ2UgKG9yYWwgaGlzdG9yeSBpbnRlcnZpZXcsIDE5NzEtMDItMDIpOgogIwotIyBTYXR1cmRheSwgdGhlIDE0dGggW29mIE9jdG9iZXIsIDE5NTBdIC0tIC4uLiAgVGhlIHRpbWUgd2FzIGFsbCB0aGUKKyMgU2F0dXJkYXksIHRoZSAxNHRoIFtvZiBPY3RvYmVyLCAxOTUwXSAtIC4uLiAgVGhlIHRpbWUgd2FzIGFsbCB0aGUKICMgbW9yZSBjb25mdXNpbmcgYXQgdGhhdCBwb2ludCwgYmVjYXVzZSB3ZSBoYWQgY3Jvc3NlZCB0aGUKICMgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUsIHRodXMgZ2V0dGluZyB0d28gU3VuZGF5cy4gIEZ1cnRoZXJtb3JlLCB3ZQogIyBkaXNjb3ZlcmVkIHRoYXQgV2FrZSBJc2xhbmQgaGFkIHR3byBob3VycyBvZiBkYXlsaWdodCBzYXZpbmcgdGltZQpAQCAtMTc5Niw3ICsxNzM4LDcgQEAKICMgb24gdGhlIGhpZ2ggc2Vhcy4gIFdoZW5ldmVyIGEgc2hpcCB3YXMgd2l0aGluIHRoZSB0ZXJyaXRvcmlhbCB3YXRlcnMgb2YgYW55CiAjIG5hdGlvbiBpdCB3b3VsZCB1c2UgdGhhdCBuYXRpb24ncyBzdGFuZGFyZCB0aW1lLiAgVGhlIGNhcHRhaW4gd2FzIHBlcm1pdHRlZAogIyB0byBjaGFuZ2UgaGlzIHNoaXAncyBjbG9ja3MgYXQgYSB0aW1lIG9mIGhpcyBjaG9pY2UgZm9sbG93aW5nIGhpcyBzaGlwJ3MKLSMgZW50cnkgaW50byBhbm90aGVyIHpvbmUgdGltZS0taGUgb2Z0ZW4gY2hvc2UgbWlkbmlnaHQuICBUaGVzZSB6b25lcyB3ZXJlCisjIGVudHJ5IGludG8gYW5vdGhlciB6b25lIHRpbWUgLSBoZSBvZnRlbiBjaG9zZSBtaWRuaWdodC4gIFRoZXNlIHpvbmVzIHdlcmUKICMgYWRvcHRlZCBieSBhbGwgbWFqb3IgZmxlZXRzIGJldHdlZW4gMTkyMCBhbmQgMTkyNSBidXQgbm90IGJ5IG1hbnkKICMgaW5kZXBlbmRlbnQgbWVyY2hhbnQgc2hpcHMgdW50aWwgV29ybGQgV2FyIElJLgogCkBAIC0xODA0LDYgKzE3NDYsNiBAQAogIyAoMjAwNS0wMy0yMCk6CiAjCiAjIFRoZSBBbWVyaWNhbiBQcmFjdGljYWwgTmF2aWdhdG9yICgyMDAyKQotIyA8aHR0cDovL3BvbGx1eC5uc3MubmltYS5taWwvcHVicy9wdWJzX2pfYXBuX3NlY3Rpb25zLmh0bWw/cmlkPTE4Nz4KKyMgaHR0cDovL3BvbGx1eC5uc3MubmltYS5taWwvcHVicy9wdWJzX2pfYXBuX3NlY3Rpb25zLmh0bWw/cmlkPTE4NwogIyB0YWxrcyBvbmx5IGFib3V0IHRoZSAxODAtZGVncmVlIG1lcmlkaWFuIHdpdGggcmVzcGVjdCB0byBzaGlwcyBpbgogIyBpbnRlcm5hdGlvbmFsIHdhdGVyczsgaXQgaWdub3JlcyB0aGUgaW50ZXJuYXRpb25hbCBkYXRlIGxpbmUuCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9iYWNrd2FyZCBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2JhY2t3YXJkCmluZGV4IDVhZmU5YTMuLmJhMDEyZjQgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2JhY2t3YXJkCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2JhY2t3YXJkCkBAIC0yMSwxNSArMjEsMTUgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCiAjIFRoaXMgZmlsZSBwcm92aWRlcyBsaW5rcyBiZXR3ZWVuIGN1cnJlbnQgbmFtZXMgZm9yIHRpbWUgem9uZXMKICMgYW5kIHRoZWlyIG9sZCBuYW1lcy4gIE1hbnkgbmFtZXMgY2hhbmdlZCBpbiBsYXRlIDE5OTMuCiAKKyMgTGluawlUQVJHRVQJCQlMSU5LLU5BTUUKIExpbmsJQWZyaWNhL0FzbWFyYQkJQWZyaWNhL0FzbWVyYQotTGluawlBZnJpY2EvQmFtYWtvCQlBZnJpY2EvVGltYnVrdHUKK0xpbmsJQWZyaWNhL0FiaWRqYW4JCUFmcmljYS9UaW1idWt0dQogTGluawlBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EJQW1lcmljYS9BcmdlbnRpbmEvQ29tb2RSaXZhZGF2aWEKIExpbmsJQW1lcmljYS9BZGFrCQlBbWVyaWNhL0F0a2EKIExpbmsJQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzCUFtZXJpY2EvQnVlbm9zX0FpcmVzCkBAIC01MCw4ICs1MCwxMSBAQAogTGluawlQYWNpZmljL0F1Y2tsYW5kCUFudGFyY3RpY2EvU291dGhfUG9sZQogTGluawlBc2lhL0FzaGdhYmF0CQlBc2lhL0FzaGtoYWJhZAogTGluawlBc2lhL0tvbGthdGEJCUFzaWEvQ2FsY3V0dGEKLUxpbmsJQXNpYS9DaG9uZ3FpbmcJCUFzaWEvQ2h1bmdraW5nCitMaW5rCUFzaWEvU2hhbmdoYWkJCUFzaWEvQ2hvbmdxaW5nCitMaW5rCUFzaWEvU2hhbmdoYWkJCUFzaWEvQ2h1bmdraW5nCiBMaW5rCUFzaWEvRGhha2EJCUFzaWEvRGFjY2EKK0xpbmsJQXNpYS9TaGFuZ2hhaQkJQXNpYS9IYXJiaW4KK0xpbmsJQXNpYS9VcnVtcWkJCUFzaWEvS2FzaGdhcgogTGluawlBc2lhL0thdGhtYW5kdQkJQXNpYS9LYXRtYW5kdQogTGluawlBc2lhL01hY2F1CQlBc2lhL01hY2FvCiBMaW5rCUFzaWEvSG9fQ2hpX01pbmgJQXNpYS9TYWlnb24KZGlmZiAtLWdpdCBhL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2V0Y2V0ZXJhIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZXRjZXRlcmEKaW5kZXggZWJhYTVmZC4uZDJmYjkxYyAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZXRjZXRlcmEKKysrIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZXRjZXRlcmEKQEAgLTIxLDcgKzIxLDYgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCkBAIC0zNyw3ICszNiw3IEBACiBab25lCUV0Yy9VQ1QJCTAJLQlVQ1QKIAogIyBUaGUgZm9sbG93aW5nIGxpbmsgdXNlcyBvbGRlciBuYW1pbmcgY29udmVudGlvbnMsCi0jIGJ1dCBpdCBiZWxvbmdzIGhlcmUsIG5vdCBpbiB0aGUgZmlsZSBgYmFja3dhcmQnLAorIyBidXQgaXQgYmVsb25ncyBoZXJlLCBub3QgaW4gdGhlIGZpbGUgJ2JhY2t3YXJkJywKICMgYXMgZnVuY3Rpb25zIGxpa2UgZ210aW1lIGxvYWQgdGhlICJHTVQiIGZpbGUgdG8gaGFuZGxlIGxlYXAgc2Vjb25kcyBwcm9wZXJseS4KICMgV2Ugd2FudCB0aGlzIHRvIHdvcmsgZXZlbiBvbiBpbnN0YWxsYXRpb25zIHRoYXQgb21pdCB0aGUgb3RoZXIgb2xkZXIgbmFtZXMuCiBMaW5rCUV0Yy9HTVQJCQkJR01UCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ldXJvcGUgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ldXJvcGUKaW5kZXggMjI2YzM5My4uMGM1ZjU2NiAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZXVyb3BlCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2V1cm9wZQpAQCAtMjEsMTUgKzIxLDE1IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIAotIyBUaGlzIGRhdGEgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKKyMgVGhpcyBmaWxlIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCiAjIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KLSMgdHpAaWFuYS5vcmcgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgorIyB0ekBpYW5hLm9yZyBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuICBGb3IgbW9yZSwgcGxlYXNlIHNlZQorIyB0aGUgZmlsZSBDT05UUklCVVRJTkcgaW4gdGhlIHR6IGRpc3RyaWJ1dGlvbi4KIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNS0zMSk6CiAjIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcwogIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCiAjIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCkBAIC00MCw2ICs0MCw5IEBACiAjIHB1Ymxpc2hlZCBzZW1pYW5udWFsbHkuICBMYXcgc2VudCBpbiBzZXZlcmFsIGhlbHBmdWwgc3VtbWFyaWVzCiAjIG9mIHRoZSBJQVRBJ3MgZGF0YSBhZnRlciAxOTkwLgogIworIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKKyMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCisjCiAjIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgogIyBlbnRyaWVzIHRocm91Z2ggMTk5MSwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCiAjCkBAIC00OSw5ICs1Miw5IEBACiAjCVdoaXRtYW4gUHVibGlzaGluZyBDbywgMiBOaWFnYXJhIEF2LCBFYWxpbmcsIExvbmRvbiAodW5kYXRlZCksCiAjCXdoaWNoIEkgZm91bmQgaW4gdGhlIFVDTEEgbGlicmFyeS4KICMKLSMJPGEgaHJlZj0iaHR0cDovL3d3dy5wZXR0c3dvb2R2aWxsYWdlLmNvLnVrL0RheWxpZ2h0X1NhdmluZ3NfV2lsbGlhbV9XaWxsZXR0LnBkZiI+CiAjCVdpbGxpYW0gV2lsbGV0dCwgVGhlIFdhc3RlIG9mIERheWxpZ2h0LCAxOXRoIGVkaXRpb24KLSMJPC9hPiAoMTkxNC0wMykKKyMJPGh0dHA6Ly9jcy51Y2xhLmVkdS9+ZWdnZXJ0L1RoZS1XYXN0ZS1vZi1EYXlsaWdodC0xOXRoLnBkZj4KKyMJW1BERl0gKDE5MTQtMDMpCiAjCiAjCU1pbG5lIEouIENpdmlsIHRpbWUuIEdlb2dyIEouIDE4OTkgRmViOzEzKDIpOjE3My05NAogIwk8aHR0cDovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzE3NzQzNTk+LiAgSGUgd3JpdGVzOgpAQCAtNTksMTAgKzYyLDIwIEBACiAjCW1heSBiZSBzZW50IHRvIE1yLiBKb2huIE1pbG5lLCBSb3lhbCBHZW9ncmFwaGljYWwgU29jaWV0eSwKICMJU2F2aWxlIFJvdywgTG9uZG9uLiIgIE5vd2FkYXlzIHBsZWFzZSBlbWFpbCB0aGVtIHRvIHR6QGlhbmEub3JnLgogIwotIwlCcmF6aWwncyBEZXBhcnRhbWVudG8gU2VydmljbyBkYSBIb3JhIChEU0gpLAotIwk8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9ISVNUSFYuaHRtIj4KKyMJQnlhbG9rb3ogRUwuIE5ldyBDb3VudGluZyBvZiBUaW1lIGluIFJ1c3NpYSBzaW5jZSBKdWx5IDEsIDE5MTkuCisjCVRoaXMgUnVzc2lhbi1sYW5ndWFnZSBzb3VyY2Ugd2FzIGNvbnN1bHRlZCBieSBWbGFkaW1pciBLYXJwaW5za3k7IHNlZQorIwlodHRwOi8vbW0uaWNhbm4ub3JnL3BpcGVybWFpbC90ei8yMDE0LUF1Z3VzdC8wMjEzMjAuaHRtbAorIwlUaGUgZnVsbCBSdXNzaWFuIGNpdGF0aW9uIGlzOgorIwnQkdGP0LvQvtC60L7Qtywg0JXQstCz0LXQvdC40Lkg0JvRjtC00LLQuNCz0L7QstC40YcuINCd0L7QstGL0Lkg0YHRh9C10YIg0LLRgNC10LzQtdC90Lgg0LIg0YLQtdGH0LXQvdC40Lgg0YHRg9GC0L7QugorIwnQstCy0LXQtNC10L3QvdGL0Lkg0LTQtdC60YDQtdGC0L7QvCDQodC+0LLQtdGC0LAg0L3QsNGA0L7QtNC90YvRhSDQutC+0LzQuNGB0YHQsNGA0L7QsiDQtNC70Y8g0LLRgdC10Lkg0KDQvtGB0YHQuNC4INGBIDEt0LPQvgorIwnQuNGO0LvRjyAxOTE5INCzLiAvINCY0LfQtC4gMi3QtSDQnNC10LbQtNGD0LLQtdC00L7QvNGB0YLQstC10L3QvdC+0Lkg0LrQvtC80LjRgdGB0LjQuC4gLSDQn9C10YLRgNC+0LPRgNCw0LQ6CisjCdCU0LXRgdGP0YLQsNGPINCz0L7RgS4g0YLQuNC/LiwgMTkxOS4KKyMJaHR0cDovL3Jlc29sdmVyLmdwbnRiLnJ1L3B1cmw/ZG9jdXNoYXJlL2Rzd2ViL0dldC9SZXNvdXJjZS0yMDExL0J5YWxva296X19FLkwuX19Ob3Z5eV9fc2NoZXRfX3ZyZW1lbmlfX3ZfX3RlY2hlbmllX19zdXRva19faXpkX18yKDEpLnBkZgorIworIwlCcmF6aWwncyBEaXZpc8OjbyBTZXJ2acOnbyBkYSBIb3JhIChEU0hPKSwKICMJSGlzdG9yeSBvZiBTdW1tZXIgVGltZQotIwk8L2E+ICgxOTk4LTA5LTIxLCBpbiBQb3J0dWd1ZXNlKQorIwk8aHR0cDovL3BjZHNoMDEub24uYnIvSElTVEhWLmh0bT4KKyMJKDE5OTgtMDktMjEsIGluIFBvcnR1Z3Vlc2UpCiAKICMKICMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgJyonIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7CkBAIC04MSwxMCArOTQsOCBAQAogIyAgICAgICAgMTowMCAgICAgICBDRVQgQ0VTVCBDRU1UIENlbnRyYWwgRXVyb3BlCiAjICAgICAgICAxOjAwOjE0ICAgIFNFVCAgICAgICAgICAgU3dlZGlzaCAoMTg3OS0xODk5KSoKICMgICAgICAgIDI6MDAgICAgICAgRUVUIEVFU1QgICAgICBFYXN0ZXJuIEV1cm9wZQotIyAgICAgICAgMzowMCAgICAgICBNU0sgTVNEICAgICAgIE1vc2NvdwotIwotIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMsIGVzcGVjaWFsbHkgaW4gQnJpdGFpbiwKLSMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCisjICAgICAgICAzOjAwICAgICAgIEZFVCAgICAgICAgICAgRnVydGhlci1lYXN0ZXJuIEV1cm9wZSoKKyMgICAgICAgIDM6MDAgICAgICAgTVNLIE1TRCAgTVNNKiBNb3Njb3cKIAogIyBGcm9tIFBldGVyIElsaWV2ZSAoMTk5NC0xMi0wNCksCiAjIFRoZSBvcmlnaW5hbCBzaXggW0VVIG1lbWJlcnNdOiBCZWxnaXVtLCBGcmFuY2UsIChXZXN0KSBHZXJtYW55LCBJdGFseSwKQEAgLTEyOCw3ICsxMzksNyBAQAogIyBhbG9uZyB0aGUgdG93cGF0aCB3aXRoaW4gYSBmZXcgeWFyZHMgb2YgaXQuJwogIwogIyBJIGhhdmUgYSBvbmUgaW5jaCB0byBvbmUgbWlsZSBtYXAgb2YgTG9uZG9uIGFuZCBteSBlc3RpbWF0ZSBvZiB0aGUgc3RvbmUncwotIyBwb3NpdGlvbiBpcyA1MSBkZWcuIDI4JyAzMCIgTiwgMCBkZWcuIDE4JyA0NSIgVy4gVGhlIGxvbmdpdHVkZSBzaG91bGQKKyMgcG9zaXRpb24gaXMgNTEgZGVncmVlcyAyOCcgMzAiIE4sIDAgZGVncmVlcyAxOCcgNDUiIFcuIFRoZSBsb25naXR1ZGUgc2hvdWxkCiAjIGJlIHdpdGhpbiBhYm91dCArLTIiLiBUaGUgT3JkbmFuY2UgU3VydmV5IGdyaWQgcmVmZXJlbmNlIGlzIFRRMTcyNzYxLgogIwogIyBbVGhpcyB5aWVsZHMgR01UT0ZGID0gLTA6MDE6MTUgZm9yIExvbmRvbiBMTVQgaW4gdGhlIDE4dGggY2VudHVyeS5dCkBAIC0xNjAsOCArMTcxLDIyIEBACiAjIHRyYW5zaXRpb24gZGF0ZSBmb3IgTG9uZG9uLCBuYW1lbHkgMTg0Ny0xMi0wMS4gIFdlIGRvbid0IGtub3cgYXMgbXVjaAogIyBhYm91dCBEdWJsaW4sIHNvIHdlIHVzZSAxODgwLTA4LTAyLCB0aGUgbGVnYWwgdHJhbnNpdGlvbiB0aW1lLgogCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDMtMDktMjcpOgotIyBTdW1tZXIgVGltZSB3YXMgZmlyc3Qgc2VyaW91c2x5IHByb3Bvc2VkIGJ5IFdpbGxpYW0gV2lsbGV0dCAoMTg1Ny0xOTE1KSwKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0xOSk6CisjIFRoZSBhbmNpZW50cyBoYWQgbm8gbmVlZCBmb3IgZGF5bGlnaHQgc2F2aW5nLCBhcyB0aGV5IGtlcHQgdGltZQorIyBpbmZvcm1hbGx5IG9yIHZpYSBob3VycyB3aG9zZSBsZW5ndGggZGVwZW5kZWQgb24gdGhlIHRpbWUgb2YgeWVhci4KKyMgRGF5bGlnaHQgc2F2aW5nIHRpbWUgaW4gaXRzIG1vZGVybiBzZW5zZSB3YXMgaW52ZW50ZWQgYnkgdGhlCisjIE5ldyBaZWFsYW5kIGVudG9tb2xvZ2lzdCBHZW9yZ2UgVmVybm9uIEh1ZHNvbiAoMTg2Ny0xOTQ2KSwKKyMgd2hvc2UgZGF5IGpvYiBhcyBhIHBvc3RhbCBjbGVyayBsZWQgaGltIHRvIHZhbHVlCisjIGFmdGVyLWhvdXJzIGRheWxpZ2h0IGluIHdoaWNoIHRvIHB1cnN1ZSBoaXMgcmVzZWFyY2guCisjIEluIDE4OTUgaGUgcHJlc2VudGVkIGEgcGFwZXIgdG8gdGhlIFdlbGxpbmd0b24gUGhpbG9zb3BoaWNhbCBTb2NpZXR5CisjIHRoYXQgcHJvcG9zZWQgYSB0d28taG91ciBkYXlsaWdodC1zYXZpbmcgc2hpZnQuICBTZWU6CisjIEh1ZHNvbiBHVi4gT24gc2Vhc29uYWwgdGltZS1hZGp1c3RtZW50IGluIGNvdW50cmllcyBzb3V0aCBvZiBsYXQuIDMwIGRlZy4KKyMgVHJhbnNhY3Rpb25zIGFuZCBQcm9jZWVkaW5ncyBvZiB0aGUgTmV3IFplYWxhbmQgSW5zdGl0dXRlLiAxODk1OzI4OjczNAorIyBodHRwOi8vcnNuei5uYXRsaWIuZ292dC5uei92b2x1bWUvcnNuel8yOC9yc256XzI4XzAwXzAwNjExMC5odG1sCisjIEFsdGhvdWdoIHNvbWUgaW50ZXJlc3Qgd2FzIGV4cHJlc3NlZCBpbiBOZXcgWmVhbGFuZCwgaGlzIHByb3Bvc2FsCisjIGRpZCBub3QgZmluZCBpdHMgd2F5IGludG8gbGF3IGFuZCBldmVudHVhbGx5IGl0IHdhcyBhbG1vc3QgZm9yZ290dGVuLgorIworIyBJbiBFbmdsYW5kLCBEU1Qgd2FzIGluZGVwZW5kZW50bHkgcmVpbnZlbnRlZCBieSBXaWxsaWFtIFdpbGxldHQgKDE4NTctMTkxNSksCiAjIGEgTG9uZG9uIGJ1aWxkZXIgYW5kIG1lbWJlciBvZiB0aGUgUm95YWwgQXN0cm9ub21pY2FsIFNvY2lldHkKICMgd2hvIGNpcmN1bGF0ZWQgYSBwYW1waGxldCAiVGhlIFdhc3RlIG9mIERheWxpZ2h0IiAoMTkwNykKICMgdGhhdCBwcm9wb3NlZCBhZHZhbmNpbmcgY2xvY2tzIDIwIG1pbnV0ZXMgb24gZWFjaCBvZiBmb3VyIFN1bmRheXMgaW4gQXByaWwsCkBAIC0xNzQsNyArMTk5LDcgQEAKICMgQSBtb251bWVudCB0byBXaWxsZXR0IHdhcyB1bnZlaWxlZCBvbiAxOTI3LTA1LTIxLCBpbiBhbiBvcGVuIHNwYWNlIGluCiAjIGEgNDUtYWNyZSB3b29kIG5lYXIgQ2hpc2xlaHVyc3QsIEtlbnQgdGhhdCB3YXMgcHVyY2hhc2VkIGJ5IHBvcHVsYXIKICMgc3Vic2NyaXB0aW9uIGFuZCBvcGVuIHRvIHRoZSBwdWJsaWMuICBPbiB0aGUgc291dGggZmFjZSBvZiB0aGUgbW9ub2xpdGgsCi0jIGRlc2lnbmVkIGJ5IEcuIFcuIE1pbGxlciwgaXMgdGhlLi4uV2lsbGlhbSBXaWxsZXR0IE1lbW9yaWFsIFN1bmRpYWwsCisjIGRlc2lnbmVkIGJ5IEcuIFcuIE1pbGxlciwgaXMgdGhlIFdpbGxpYW0gV2lsbGV0dCBNZW1vcmlhbCBTdW5kaWFsLAogIyB3aGljaCBpcyBwZXJtYW5lbnRseSBzZXQgdG8gU3VtbWVyIFRpbWUuCiAKICMgRnJvbSBXaW5zdG9uIENodXJjaGlsbCAoMTkzNC0wNC0yOCk6CkBAIC0xODMsOSArMjA4LDkgQEAKICMgYmV0d2VlbiAxNjAgYW5kIDE3MCBob3VycyBtb3JlIGRheWxpZ2h0IGxlaXN1cmUsIHRvIGEgd2FyIHdoaWNoCiAjIHBsdW5nZWQgRXVyb3BlIGludG8gZGFya25lc3MgZm9yIGZvdXIgeWVhcnMsIGFuZCBzaG9vayB0aGUKICMgZm91bmRhdGlvbnMgb2YgY2l2aWxpemF0aW9uIHRocm91Z2hvdXQgdGhlIHdvcmxkLgotIwktLSA8YSBocmVmPSJodHRwOi8vd3d3LndpbnN0b25jaHVyY2hpbGwub3JnL2ZoMTE0d2lsbGV0dC5odG0iPgotIwkiQSBTaWxlbnQgVG9hc3QgdG8gV2lsbGlhbSBXaWxsZXR0IiwgUGljdG9yaWFsIFdlZWtseQotIwk8L2E+CisjCS0tICJBIFNpbGVudCBUb2FzdCB0byBXaWxsaWFtIFdpbGxldHQiLCBQaWN0b3JpYWwgV2Vla2x5OworIwlyZXB1Ymxpc2hlZCBpbiBGaW5lc3QgSG91ciAoU3ByaW5nIDIwMDIpIDEoMTE0KToyNgorIwlodHRwOi8vd3d3LndpbnN0b25jaHVyY2hpbGwub3JnL2ltYWdlcy9maW5lc3Rob3VyL1ZvbC4wMSUyME5vLjExNC5wZGYKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA5LTAzKToKICMgVGhlIE9FRCBTdXBwbGVtZW50IHNheXMgdGhhdCB0aGUgRW5nbGlzaCBvcmlnaW5hbGx5IHNhaWQgIkRheWxpZ2h0IFNhdmluZyIKQEAgLTE5NCw3ICsyMTksNiBAQAogIyBwcm9wb25lbnRzICh3aG8gZXZlbnR1YWxseSB3b24gdGhlIGFyZ3VtZW50KSBhcmUgcXVvdGVkIGFzIHVzaW5nICJTdW1tZXIiLgogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTg5LTAxLTE5KToKLSMKICMgQSBzb3VyY2UgYXQgdGhlIEJyaXRpc2ggSW5mb3JtYXRpb24gT2ZmaWNlIGluIE5ldyBZb3JrIGF2ZXJzIHRoYXQgaXQncwogIyBrbm93biBhcyAiQnJpdGlzaCIgU3VtbWVyIFRpbWUgaW4gYWxsIHBhcnRzIG9mIHRoZSBVbml0ZWQgS2luZ2RvbS4KIApAQCAtMjIxLDggKzI0NSw4IEBACiAjIG9mZmljaWFsIGRlc2lnbmF0aW9uOyB0aGUgcmVwbHkgb2YgdGhlIDIxc3Qgd2FzIHRoYXQgdGhlcmUgd2Fzbid0CiAjIGJ1dCBoZSBjb3VsZG4ndCB0aGluayBvZiBhbnl0aGluZyBiZXR0ZXIgdGhhbiB0aGUgIkRvdWJsZSBCcml0aXNoCiAjIFN1bW1lciBUaW1lIiB0aGF0IHRoZSBCQkMgaGFkIGJlZW4gdXNpbmcgaW5mb3JtYWxseS4KLSMgaHR0cDovL3N0dWRlbnQuY3VzdS5jYW0uYWMudWsvfmpzbTI4L2JyaXRpc2gtdGltZS9iYmMtMTk0MTA0MTgucG5nCi0jIGh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvaG8tMTk0MTA0MjEucG5nCisjIGh0dHA6Ly93d3cucG9seW9taW5vLm9yZy51ay9icml0aXNoLXRpbWUvYmJjLTE5NDEwNDE4LnBuZworIyBodHRwOi8vd3d3LnBvbHlvbWluby5vcmcudWsvYnJpdGlzaC10aW1lL2hvLTE5NDEwNDIxLnBuZwogCiAjIEZyb20gU2lyIEFsZXhhbmRlciBNYXh3ZWxsIGluIHRoZSBhYm92ZS1tZW50aW9uZWQgbGV0dGVyICgxOTQxLTA0LTIxKToKICMgW05dbyBvZmZpY2lhbCBkZXNpZ25hdGlvbiBoYXMgYXMgZmFyIGFzIEkga25vdyBiZWVuIGFkb3B0ZWQgZm9yIHRoZSB0aW1lCkBAIC0yMzksMjMgKzI2MywxNCBAQAogIyB0aGUgaGlzdG9yeSBvZiBzdW1tZXIgdGltZSBsZWdpc2xhdGlvbiBpbiB0aGUgVW5pdGVkIEtpbmdkb20uCiAjIFNpbmNlIDE5OTggSm9zZXBoIFMuIE15ZXJzIGhhcyBiZWVuIHVwZGF0aW5nCiAjIGFuZCBleHRlbmRpbmcgdGhpcyBsaXN0LCB3aGljaCBjYW4gYmUgZm91bmQgaW4KLSMgaHR0cDovL3N0dWRlbnQuY3VzdS5jYW0uYWMudWsvfmpzbTI4L2JyaXRpc2gtdGltZS8KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wb2x5b21pbm8ub3JnLnVrL2JyaXRpc2gtdGltZS8iPgotIyBIaXN0b3J5IG9mIGxlZ2FsIHRpbWUgaW4gQnJpdGFpbgotIyA8L2E+Ci0jIFJvYiBDcm93dGhlciAoMjAxMi0wMS0wNCkgcmVwb3J0cyB0aGF0IHRoYXQgVVJMIG5vIGxvbmdlcgotIyBleGlzdHMsIGFuZCB0aGUgYXJ0aWNsZSBjYW4gbm93IGJlIGZvdW5kIGF0OgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBvbHlvbWluby5vcmcudWsvYnJpdGlzaC10aW1lLyI+CiAjIGh0dHA6Ly93d3cucG9seW9taW5vLm9yZy51ay9icml0aXNoLXRpbWUvCi0jIDwvYT4KIAogIyBGcm9tIEpvc2VwaCBTLiBNeWVycyAoMTk5OC0wMS0wNik6CiAjCiAjIFRoZSBsZWdhbCB0aW1lIGluIHRoZSBVSyBvdXRzaWRlIG9mIHN1bW1lciB0aW1lIGlzIGRlZmluaXRlbHkgR01ULCBub3QgVVRDOwogIyBzZWUgTG9yZCBUYW5sYXcncyBzcGVlY2gKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wYXJsaWFtZW50LnRoZS1zdGF0aW9uZXJ5LW9mZmljZS5jby51ay9wYS9sZDE5OTY5Ny9sZGhhbnNyZC9wZHZuL2xkczk3L3RleHQvNzA2MTEtMjAuaHRtIzcwNjExLTIwX2hlYWQwIj4KLSMgKExvcmRzIEhhbnNhcmQgMTEgSnVuZSAxOTk3IGNvbHVtbnMgOTY0IHRvIDk3NikKLSMgPC9hPi4KKyMgaHR0cDovL3d3dy5wdWJsaWNhdGlvbnMucGFybGlhbWVudC51ay9wYS9sZDE5OTc5OC9sZGhhbnNyZC92bzk3MDYxMS90ZXh0LzcwNjExLTEwLmh0bSM3MDYxMS0xMF9oZWFkMAorIyAoTG9yZHMgSGFuc2FyZCAxMSBKdW5lIDE5OTcgY29sdW1ucyA5NjQgdG8gOTc2KS4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKICMKQEAgLTI5NSw4ICszMTAsOCBAQAogIyAgIC0tIEphbWVzIEpveWNlLCBVbHlzc2VzCiAKICMgRnJvbSBKb3NlcGggUy4gTXllcnMgKDIwMDUtMDEtMjYpOgotIyBJcmlzaCBsYXdzIGFyZSBhdmFpbGFibGUgb25saW5lIGF0IHd3dy5pcmlzaHN0YXR1dGVib29rLmllLiAgVGhlc2UgaW5jbHVkZQotIyB2YXJpb3VzIHJlbGF0aW5nIHRvIGxlZ2FsIHRpbWUsIGZvciBleGFtcGxlOgorIyBJcmlzaCBsYXdzIGFyZSBhdmFpbGFibGUgb25saW5lIGF0IDxodHRwOi8vd3d3LmlyaXNoc3RhdHV0ZWJvb2suaWU+LgorIyBUaGVzZSBpbmNsdWRlIHZhcmlvdXMgcmVsYXRpbmcgdG8gbGVnYWwgdGltZSwgZm9yIGV4YW1wbGU6CiAjCiAjIFpaQTEzWTE5MjMuaHRtbCBaWkExMlkxOTI0Lmh0bWwgWlpBOFkxOTI1Lmh0bWwgWlpTSVYyMFBHMTI2Ny5odG1sCiAjCkBAIC00NTgsMjUgKzQ3MywyNyBAQAogIyBVc2UgRXVyb3BlL0xvbmRvbiBmb3IgSmVyc2V5LCBHdWVybnNleSwgYW5kIHRoZSBJc2xlIG9mIE1hbi4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvTG9uZG9uCS0wOjAxOjE1IC0JTE1UCTE4NDcgRGVjICAxIDA6MDBzCitab25lCUV1cm9wZS9Mb25kb24JLTA6MDE6MTUgLQlMTVQJMTg0NyBEZWMgIDEgIDA6MDBzCiAJCQkgMDowMAlHQi1FaXJlCSVzCTE5NjggT2N0IDI3Ci0JCQkgMTowMAktCUJTVAkxOTcxIE9jdCAzMSAyOjAwdQorCQkJIDE6MDAJLQlCU1QJMTk3MSBPY3QgMzEgIDI6MDB1CiAJCQkgMDowMAlHQi1FaXJlCSVzCTE5OTYKIAkJCSAwOjAwCUVVCUdNVC9CU1QKIExpbmsJRXVyb3BlL0xvbmRvbglFdXJvcGUvSmVyc2V5CiBMaW5rCUV1cm9wZS9Mb25kb24JRXVyb3BlL0d1ZXJuc2V5CiBMaW5rCUV1cm9wZS9Mb25kb24JRXVyb3BlL0lzbGVfb2ZfTWFuCisKKyMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL0R1YmxpbgktMDoyNTowMCAtCUxNVAkxODgwIEF1ZyAgMgotCQkJLTA6MjU6MjEgLQlETVQJMTkxNiBNYXkgMjEgMjowMAotCQkJLTA6MjU6MjEgMTowMAlJU1QJMTkxNiBPY3QgIDEgMjowMHMKKwkJCS0wOjI1OjIxIC0JRE1UCTE5MTYgTWF5IDIxICAyOjAwCisJCQktMDoyNToyMSAxOjAwCUlTVAkxOTE2IE9jdCAgMSAgMjowMHMKIAkJCSAwOjAwCUdCLUVpcmUJJXMJMTkyMSBEZWMgIDYgIyBpbmRlcGVuZGVuY2UKLQkJCSAwOjAwCUdCLUVpcmUJR01UL0lTVAkxOTQwIEZlYiAyNSAyOjAwCi0JCQkgMDowMAkxOjAwCUlTVAkxOTQ2IE9jdCAgNiAyOjAwCi0JCQkgMDowMAktCUdNVAkxOTQ3IE1hciAxNiAyOjAwCi0JCQkgMDowMAkxOjAwCUlTVAkxOTQ3IE5vdiAgMiAyOjAwCi0JCQkgMDowMAktCUdNVAkxOTQ4IEFwciAxOCAyOjAwCisJCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk0MCBGZWIgMjUgIDI6MDAKKwkJCSAwOjAwCTE6MDAJSVNUCTE5NDYgT2N0ICA2ICAyOjAwCisJCQkgMDowMAktCUdNVAkxOTQ3IE1hciAxNiAgMjowMAorCQkJIDA6MDAJMTowMAlJU1QJMTk0NyBOb3YgIDIgIDI6MDAKKwkJCSAwOjAwCS0JR01UCTE5NDggQXByIDE4ICAyOjAwCiAJCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk2OCBPY3QgMjcKLQkJCSAxOjAwCS0JSVNUCTE5NzEgT2N0IDMxIDI6MDB1CisJCQkgMTowMAktCUlTVAkxOTcxIE9jdCAzMSAgMjowMHUKIAkJCSAwOjAwCUdCLUVpcmUJR01UL0lTVAkxOTk2CiAJCQkgMDowMAlFVQlHTVQvSVNUCiAKQEAgLTQ5NSwxMCArNTEyLDkgQEAKIFJ1bGUJRVUJMTk4MQltYXgJLQlNYXIJbGFzdFN1bgkgMTowMHUJMTowMAlTCiBSdWxlCUVVCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDE6MDB1CTAJLQogIyBUaGUgbW9zdCByZWNlbnQgZGlyZWN0aXZlIGNvdmVycyB0aGUgeWVhcnMgc3RhcnRpbmcgaW4gMjAwMi4gIFNlZToKLSMgPGE9Imh0dHA6Ly9ldXItbGV4LmV1cm9wYS5ldS9MZXhVcmlTZXJ2L0xleFVyaVNlcnYuZG8/dXJpPUNFTEVYOjMyMDAwTDAwODQ6RU46Tk9UIj4KICMgRGlyZWN0aXZlIDIwMDAvODQvRUMgb2YgdGhlIEV1cm9wZWFuIFBhcmxpYW1lbnQgYW5kIG9mIHRoZSBDb3VuY2lsCiAjIG9mIDE5IEphbnVhcnkgMjAwMSBvbiBzdW1tZXItdGltZSBhcnJhbmdlbWVudHMuCi0jIDwvYT4KKyMgaHR0cDovL2V1ci1sZXguZXVyb3BhLmV1L0xleFVyaVNlcnYvTGV4VXJpU2Vydi5kbz91cmk9Q0VMRVg6MzIwMDBMMDA4NDpFTjpOT1QKIAogIyBXLUV1ciBkaWZmZXJzIGZyb20gRVUgb25seSBpbiB0aGF0IFctRXVyIHVzZXMgc3RhbmRhcmQgdGltZS4KIFJ1bGUJVy1FdXIJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkgMTowMHMJMTowMAlTCkBAIC01MjEsMTggKzUzNywxOCBAQAogUnVsZQlDLUV1cgkxOTQ0CTE5NDUJLQlBcHIJTW9uPj0xCSAyOjAwcwkxOjAwCVMKICMgV2hpdG1hbiBnaXZlcyAxOTQ0IE9jdCA3OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KIFJ1bGUJQy1FdXIJMTk0NAlvbmx5CS0JT2N0CSAyCSAyOjAwcwkwCS0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDctMTMpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDgtMDctMTMpOgogIwogIyBJIGZvdW5kIHdoYXQgaXMgcHJvYmFibHkgYSB0eXBvIG9mIDI6MDAgd2hpY2ggc2hvdWxkIHBlcmhhcHMgYmUgMjowMHMKICMgaW4gdGhlIEMtRXVyIHJ1bGUgZnJvbSB0eiBkYXRhYmFzZSB2ZXJzaW9uIDIwMDhkICh0aGlzIHBhcnQgd2FzCi0jIGNvcnJlY3RlZCBpbiB2ZXJzaW9uIDIwMDhkKS4gVGhlIGNpcmN1bXN0YW5jaWFsIGV2aWRlbmNlIGlzIHNpbXBseSB0aGUKKyMgY29ycmVjdGVkIGluIHZlcnNpb24gMjAwOGQpLiBUaGUgY2lyY3Vtc3RhbnRpYWwgZXZpZGVuY2UgaXMgc2ltcGx5IHRoZQogIyB0eiBkYXRhYmFzZSBpdHNlbGYsIGFzIHNlZW4gYmVsb3c6CiAjCiAjIFpvbmUgRXVyb3BlL1BhcmlzIDA6MDk6MjEgLSBMTVQgMTg5MSBNYXIgMTUgIDA6MDEKICMgICAgMDowMCBGcmFuY2UgV0Ulc1QgMTk0NSBTZXAgMTYgIDM6MDAKICMKICMgWm9uZSBFdXJvcGUvTW9uYWNvIDA6Mjk6MzIgLSBMTVQgMTg5MSBNYXIgMTUKLSMgICAgMDowMCBGcmFuY2UgV0Ulc1QgMTk0NSBTZXAgMTYgMzowMAorIyAgICAwOjAwIEZyYW5jZSBXRSVzVCAxOTQ1IFNlcCAxNiAgMzowMAogIwogIyBab25lIEV1cm9wZS9CZWxncmFkZSAxOjIyOjAwIC0gTE1UIDE4ODQKICMgICAgMTowMCAxOjAwIENFU1QgMTk0NSBTZXAgMTYgIDI6MDBzCkBAIC01NzYsMTYgKzU5MiwxNiBAQAogUnVsZQlFLUV1cgkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAwOjAwCTAJLQogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JSnVsCSAxCTIzOjAwCTE6MDAJTVNUCSMgTW9zY293IFN1bW1lciBUaW1lCi1SdWxlCVJ1c3NpYQkxOTE3CW9ubHkJLQlEZWMJMjgJIDA6MDAJMAlNTVQJIyBNb3Njb3cgTWVhbiBUaW1lCi1SdWxlCVJ1c3NpYQkxOTE4CW9ubHkJLQlNYXkJMzEJMjI6MDAJMjowMAlNRFNUCSMgTW9zY293IERvdWJsZSBTdW1tZXIgVGltZQorUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JSnVsCSAxCTIzOjAwCTE6MDAJTVNUICAjIE1vc2NvdyBTdW1tZXIgVGltZQorUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JRGVjCTI4CSAwOjAwCTAJTU1UICAjIE1vc2NvdyBNZWFuIFRpbWUKK1J1bGUJUnVzc2lhCTE5MTgJb25seQktCU1heQkzMQkyMjowMAkyOjAwCU1EU1QgIyBNb3Njb3cgRG91YmxlIFN1bW1lciBUaW1lCiBSdWxlCVJ1c3NpYQkxOTE4CW9ubHkJLQlTZXAJMTYJIDE6MDAJMTowMAlNU1QKIFJ1bGUJUnVzc2lhCTE5MTkJb25seQktCU1heQkzMQkyMzowMAkyOjAwCU1EU1QKLVJ1bGUJUnVzc2lhCTE5MTkJb25seQktCUp1bAkgMQkgMjowMAkxOjAwCVMKLVJ1bGUJUnVzc2lhCTE5MTkJb25seQktCUF1ZwkxNgkgMDowMAkwCS0KLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCUZlYgkxNAkyMzowMAkxOjAwCVMKLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCU1hcgkyMAkyMzowMAkyOjAwCU0gIyBNaWRzdW1tZXIKLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCVNlcAkgMQkgMDowMAkxOjAwCVMKK1J1bGUJUnVzc2lhCTE5MTkJb25seQktCUp1bAkgMQkgMjowMAkxOjAwCU1TRAorUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JQXVnCTE2CSAwOjAwCTAJTVNLCitSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlGZWIJMTQJMjM6MDAJMTowMAlNU0QKK1J1bGUJUnVzc2lhCTE5MjEJb25seQktCU1hcgkyMAkyMzowMAkyOjAwCU1TTSAgIyBNaWRzdW1tZXIKK1J1bGUJUnVzc2lhCTE5MjEJb25seQktCVNlcAkgMQkgMDowMAkxOjAwCU1TRAogUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQogIyBBY3QgTm8uOTI1IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiB0aGUgVVNTUiAoMTk4MC0xMC0yNCk6CiBSdWxlCVJ1c3NpYQkxOTgxCTE5ODQJLQlBcHIJIDEJIDA6MDAJMTowMAlTCkBAIC02MDcsMTQgKzYyMywxMCBAQAogIyBBY2NvcmRpbmcgdG8gdGhlIGxhdyBSdXNzaWEgaXMgYWJvbGlzaGluZyBkYXlsaWdodCBzYXZpbmcgdGltZS4KICMKICMgTWVkdmVkZXYgc2lnbmVkIGEgbGF3ICJPbiB0aGUgQ2FsY3VsYXRpb24gb2YgVGltZSIgKGluIHJ1c3NpYW4pOgotIyA8YSBocmVmPSJodHRwOi8vYm1vY2tiZS5ydS9ldmVudHMvP0lEPTc1ODMiPgogIyBodHRwOi8vYm1vY2tiZS5ydS9ldmVudHMvP0lEPTc1ODMKLSMgPC9hPgogIwogIyBNZWR2ZWRldiBzaWduZWQgYSBsYXcgb24gdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB0aW1lIChpbiBydXNzaWFuKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5yZWdudW0ucnUvbmV3cy9wb2xpdC8xNDEzOTA2Lmh0bWwiPgogIyBodHRwOi8vd3d3LnJlZ251bS5ydS9uZXdzL3BvbGl0LzE0MTM5MDYuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTEtMDYtMTUpOgogIyBUYWtlICJhYm9saXNoaW5nIGRheWxpZ2h0IHNhdmluZyB0aW1lIiB0byBtZWFuIHRoYXQgdGltZSBpcyBub3cgY29uc2lkZXJlZApAQCAtNjM0LDEwICs2NDYsMTAgQEAKICMgRnJvbSBNYXJrdXMgS3VobiAoMTk5Ni0wNy0xMik6CiAjIFRoZSBvZmZpY2lhbCBHZXJtYW4gbmFtZXMgLi4uIGFyZQogIwotIwlNaXR0ZWxldXJvcGFlaXNjaGUgWmVpdCAoTUVaKSAgICAgICAgID0gVVRDKzAxOjAwCi0jCU1pdHRlbGV1cm9wYWVpc2NoZSBTb21tZXJ6ZWl0IChNRVNaKSAgPSBVVEMrMDI6MDAKKyMJTWl0dGVsZXVyb3DDpGlzY2hlIFplaXQgKE1FWikgICAgICAgICA9IFVUQyswMTowMAorIwlNaXR0ZWxldXJvcMOkaXNjaGUgU29tbWVyemVpdCAoTUVTWikgID0gVVRDKzAyOjAwCiAjCi0jIGFzIGRlZmluZWQgaW4gdGhlIEdlcm1hbiBUaW1lIEFjdCAoR2VzZXR6IHVlYmVyIGRpZSBaZWl0YmVzdGltbXVuZyAoWmVpdEcpLAorIyBhcyBkZWZpbmVkIGluIHRoZSBHZXJtYW4gVGltZSBBY3QgKEdlc2V0eiDDvGJlciBkaWUgWmVpdGJlc3RpbW11bmcgKFplaXRHKSwKICMgMTk3OC0wNy0yNSwgQnVuZGVzZ2VzZXR6YmxhdHQsIEphaHJnYW5nIDE5NzgsIFRlaWwgSSwgUy4gMTExMC0xMTExKS4uLi4KICMgSSB3cm90ZSAuLi4gdG8gdGhlIEdlcm1hbiBGZWRlcmFsIFBoeXNpY2FsLVRlY2huaWNhbCBJbnN0aXR1dGlvbgogIwpAQCAtNjkyLDcgKzcwNCw3IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9BbmRvcnJhCTA6MDY6MDQgLQlMTVQJMTkwMQogCQkJMDowMAktCVdFVAkxOTQ2IFNlcCAzMAotCQkJMTowMAktCUNFVAkxOTg1IE1hciAzMSAyOjAwCisJCQkxOjAwCS0JQ0VUCTE5ODUgTWFyIDMxICAyOjAwCiAJCQkxOjAwCUVVCUNFJXNUCiAKICMgQXVzdHJpYQpAQCAtNzE4LDkgKzczMCw5IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9WaWVubmEJMTowNToyMSAtCUxNVAkxODkzIEFwcgogCQkJMTowMAlDLUV1cglDRSVzVAkxOTIwCi0JCQkxOjAwCUF1c3RyaWEJQ0Ulc1QJMTk0MCBBcHIgIDEgMjowMHMKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgMjowMHMKLQkJCTE6MDAJMTowMAlDRVNUCTE5NDUgQXByIDEyIDI6MDBzCisJCQkxOjAwCUF1c3RyaWEJQ0Ulc1QJMTk0MCBBcHIgIDEgIDI6MDBzCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyICAyOjAwcworCQkJMTowMAkxOjAwCUNFU1QJMTk0NSBBcHIgMTIgIDI6MDBzCiAJCQkxOjAwCS0JQ0VUCTE5NDYKIAkJCTE6MDAJQXVzdHJpYQlDRSVzVAkxOTgxCiAJCQkxOjAwCUVVCUNFJXNUCkBAIC03MzEsMzggKzc0MywyOSBAQAogIyBHTVQrMyB3aXRob3V0IERTVCAod2FzIEdNVCsyIHdpdGggRFNUKS4KICMKICMgU291cmNlcyAoUnVzc2lhbiBsYW5ndWFnZSk6Ci0jIDEuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmVsdGEuYnkvcnUvYWxsX25ld3Mvc29jaWV0eS9WLUJlbGFydXNpLW90bWVuamFldHNqYS1wZXJleG9kLW5hLXNlem9ubm9lLXZyZW1qYV9pXzU3Mjk1Mi5odG1sIj4KICMgaHR0cDovL3d3dy5iZWx0YS5ieS9ydS9hbGxfbmV3cy9zb2NpZXR5L1YtQmVsYXJ1c2ktb3RtZW5qYWV0c2phLXBlcmV4b2QtbmEtc2V6b25ub2UtdnJlbWphX2lfNTcyOTUyLmh0bWwKLSMgPC9hPgotIyAyLgotIyA8YSBocmVmPSJodHRwOi8vbmF2aW55LmJ5L3J1YnJpY3Mvc29jaWV0eS8yMDExLzA5LzE2L2ljX2FydGljbGVzXzExNl8xNzUxNDQvIj4KICMgaHR0cDovL25hdmlueS5ieS9ydWJyaWNzL3NvY2lldHkvMjAxMS8wOS8xNi9pY19hcnRpY2xlc18xMTZfMTc1MTQ0LwotIyA8L2E+Ci0jIDMuCi0jIDxhIGhyZWY9Imh0dHA6Ly9uZXdzLnR1dC5ieS9zb2NpZXR5LzI1MDU3OC5odG1sIj4KICMgaHR0cDovL25ld3MudHV0LmJ5L3NvY2lldHkvMjUwNTc4Lmh0bWwKLSMgPC9hPgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvTWluc2sJMTo1MDoxNiAtCUxNVAkxODgwCi0JCQkxOjUwCS0JTU1UCTE5MjQgTWF5IDIgIyBNaW5zayBNZWFuIFRpbWUKKwkJCTE6NTAJLQlNTVQJMTkyNCBNYXkgIDIgIyBNaW5zayBNZWFuIFRpbWUKIAkJCTI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKIAkJCTM6MDAJLQlNU0sJMTk0MSBKdW4gMjgKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBKdWwgIDMKIAkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAotCQkJMzowMAktCU1TSwkxOTkxIE1hciAzMSAyOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgMjowMHMKLQkJCTI6MDAJLQlFRVQJMTk5MiBNYXIgMjkgMDowMHMKLQkJCTI6MDAJMTowMAlFRVNUCTE5OTIgU2VwIDI3IDA6MDBzCi0JCQkyOjAwCVJ1c3NpYQlFRSVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJMzowMAktCUZFVCAjIEZ1cnRoZXItZWFzdGVybiBFdXJvcGVhbiBUaW1lCisJCQkzOjAwCS0JTVNLCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgIDI6MDBzCisJCQkyOjAwCS0JRUVUCTE5OTIgTWFyIDI5ICAwOjAwcworCQkJMjowMAkxOjAwCUVFU1QJMTk5MiBTZXAgMjcgIDA6MDBzCisJCQkyOjAwCVJ1c3NpYQlFRSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTM6MDAJLQlGRVQKIAogIyBCZWxnaXVtCiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTctMDctMDIpOgogIyBFbnRyaWVzIGZyb20gMTkxOCB0aHJvdWdoIDE5OTEgYXJlIHRha2VuIGZyb206CiAjCUFubnVhaXJlIGRlIEwnT2JzZXJ2YXRvaXJlIFJveWFsIGRlIEJlbGdpcXVlLAotIwlBdmVudWUgQ2lyY3VsYWlyZSwgMywgQi0xMTgwIEJSVVhFTExFUywgQ0xWSUllIGFubmVlLCAxOTkxCisjCUF2ZW51ZSBDaXJjdWxhaXJlLCAzLCBCLTExODAgQlJVWEVMTEVTLCBDTFZJSWUgYW5uw6llLCAxOTkxCiAjCShJbXByaW1lcmllIEhBWUVaLCBzLnAuci5sLiwgUnVlIEZpbiwgNCwgMTA4MCBCUlVYRUxMRVMsIE1DTVhDKSwKICMJcHAgOC05LgogIyBMTVQgYmVmb3JlIDE4OTIgd2FzIDA6MTc6MzAsIGFjY29yZGluZyB0byB0aGUgb2ZmaWNpYWwgam91cm5hbCBvZiBCZWxnaXVtOgpAQCAtODEyLDcgKzgxNSw3IEBACiBSdWxlCUJlbGdpdW0JMTk0Nglvbmx5CS0JT2N0CSA3CSAyOjAwcwkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL0JydXNzZWxzCTA6MTc6MzAgLQlMTVQJMTg4MAotCQkJMDoxNzozMAktCUJNVAkxODkyIE1heSAgMSAxMjowMCAjIEJydXNzZWxzIE1UCisJCQkwOjE3OjMwCS0JQk1UCTE4OTIgTWF5ICAxIDEyOjAwICAjIEJydXNzZWxzIE1UCiAJCQkwOjAwCS0JV0VUCTE5MTQgTm92ICA4CiAJCQkxOjAwCS0JQ0VUCTE5MTYgTWF5ICAxICAwOjAwCiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5MTggTm92IDExIDExOjAwdQpAQCAtODI4LDggKzgzMSw4IEBACiAjCiAjIEZyb20gUGxhbWVuIFNpbWVub3YgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0wOS0wOSk6CiAjIEEgZG9jdW1lbnQgb2YgR292ZXJubWVudCBvZiBCdWxnYXJpYSAoTm8uOTQvMTk5Nykgc2F5czoKLSMgRUVUIC0tPiBFRVREU1QgaXMgaW4gMDM6MDAgTG9jYWwgdGltZSBpbiBsYXN0IFN1bmRheSBvZiBNYXJjaCAuLi4KLSMgRUVURFNUIC0tPiBFRVQgaXMgaW4gMDQ6MDAgTG9jYWwgdGltZSBpbiBsYXN0IFN1bmRheSBvZiBPY3RvYmVyCisjIEVFVCAtPiBFRVREU1QgaXMgaW4gMDM6MDAgTG9jYWwgdGltZSBpbiBsYXN0IFN1bmRheSBvZiBNYXJjaCAuLi4KKyMgRUVURFNUIC0+IEVFVCBpcyBpbiAwNDowMCBMb2NhbCB0aW1lIGluIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIKICMKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCUJ1bGcJMTk3OQlvbmx5CS0JTWFyCTMxCTIzOjAwCTE6MDAJUwpAQCAtODQyLDcgKzg0NSw3IEBACiAJCQkxOjU2OjU2CS0JSU1UCTE4OTQgTm92IDMwICMgSXN0YW5idWwgTVQ/CiAJCQkyOjAwCS0JRUVUCTE5NDIgTm92ICAyICAzOjAwCiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUKLQkJCTE6MDAJLQlDRVQJMTk0NSBBcHIgMiAzOjAwCisJCQkxOjAwCS0JQ0VUCTE5NDUgQXByICAyICAzOjAwCiAJCQkyOjAwCS0JRUVUCTE5NzkgTWFyIDMxIDIzOjAwCiAJCQkyOjAwCUJ1bGcJRUUlc1QJMTk4MiBTZXAgMjYgIDI6MDAKIAkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5MQpAQCAtODY2LDE1ICs4NjksMTUgQEAKIFJ1bGUJQ3plY2gJMTk0OQlvbmx5CS0JQXByCSA5CTI6MDBzCTE6MDAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvUHJhZ3VlCTA6NTc6NDQgLQlMTVQJMTg1MAotCQkJMDo1Nzo0NAktCVBNVAkxODkxIE9jdCAgICAgIyBQcmFndWUgTWVhbiBUaW1lCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgU2VwIDE3IDI6MDBzCisJCQkwOjU3OjQ0CS0JUE1UCTE4OTEgT2N0ICAgICMgUHJhZ3VlIE1lYW4gVGltZQorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IFNlcCAxNyAgMjowMHMKIAkJCTE6MDAJQ3plY2gJQ0Ulc1QJMTk3OQogCQkJMTowMAlFVQlDRSVzVAogIyBVc2UgRXVyb3BlL1ByYWd1ZSBhbHNvIGZvciBTbG92YWtpYS4KIAogIyBEZW5tYXJrLCBGYXJvZSBJc2xhbmRzLCBhbmQgR3JlZW5sYW5kCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDUtMDQtMjYpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDUtMDQtMjYpOgogIyBodHRwOi8vd3d3Lmh1bS5hYXUuZGsvfnBvZS90aWQvdGluZS9EYW5za1RpZC5odG0gc2F5cyB0aGF0IHRoZSBsYXcKICMgW2ludHJvZHVjaW5nIHN0YW5kYXJkIHRpbWVdIHdhcyBpbiBlZmZlY3QgZnJvbSAxODk0LTAxLTAxLi4uLgogIyBUaGUgcGFnZSBodHRwOi8vd3d3LnJldHNpbmZvLmRrL19HRVRET0NJXy9BQ0NOL0ExODkzMDAwODMzMC1SRUdMCkBAIC04ODQsNyArODg3LDcgQEAKICMgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9BMTk3MjIxMTAwMzAtUkVHTAogIwogIyBUaGlzIHByb3Zva2VkIGEgbmV3IGxhdyBmcm9tIDE5NzQgdG8gbWFrZSBwb3NzaWJsZSBzdW1tZXIgdGltZSBjaGFuZ2VzCi0jIGluIHN1YnNlcXVlbmV0IGRlY3JlZXMgd2l0aCB0aGUgbGF3CisjIGluIHN1YnNlcXVlbnQgZGVjcmVlcyB3aXRoIHRoZSBsYXcKICMgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9BMTk3NDAwMjIzMzAtUkVHTAogIwogIyBJdCBzZWVtcyBob3dldmVyIHRoYXQgbm8gZGVjcmVlIHdhcyBzZXQgZm9yd2FyZCB1bnRpbCAxOTgwLiAgSSBoYXZlCkBAIC04OTksNyArOTAyLDcgQEAKICMgd2FzIHN1c3BlbmRlZCBvbiB0aGF0IG5pZ2h0KToKICMgaHR0cDovL3d3dy5yZXRzaW5mby5kay9fR0VURE9DSV8vQUNDTi9DMTk4MDExMjA1NTQtUkVHTAogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTA2LTExKToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA1LTA2LTExKToKICMgVGhlIEhlcm5pbmcgRm9sa2VibGFkICgxOTgwLTA5LTI2KSByZXBvcnRlZCB0aGF0IHRoZSBuaWdodCBiZXR3ZWVuCiAjIFNhdHVyZGF5IGFuZCBTdW5kYXkgdGhlIGNsb2NrIGlzIHNldCBiYWNrIGZyb20gdGhyZWUgdG8gdHdvLgogCkBAIC05MjMsMTEgKzkyNiwxMSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBFdXJvcGUvQ29wZW5oYWdlbgkgMDo1MDoyMCAtCUxNVAkxODkwCiAJCQkgMDo1MDoyMCAtCUNNVAkxODk0IEphbiAgMSAjIENvcGVuaGFnZW4gTVQKLQkJCSAxOjAwCURlbm1hcmsJQ0Ulc1QJMTk0MiBOb3YgIDIgMjowMHMKLQkJCSAxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyIDI6MDAKKwkJCSAxOjAwCURlbm1hcmsJQ0Ulc1QJMTk0MiBOb3YgIDIgIDI6MDBzCisJCQkgMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAgMjowMAogCQkJIDE6MDAJRGVubWFyawlDRSVzVAkxOTgwCiAJCQkgMTowMAlFVQlDRSVzVAotWm9uZSBBdGxhbnRpYy9GYXJvZQktMDoyNzowNCAtCUxNVAkxOTA4IEphbiAxMQkjIFRvcnNoYXZuCitab25lIEF0bGFudGljL0Zhcm9lCS0wOjI3OjA0IC0JTE1UCTE5MDggSmFuIDExICMgVMOzcnNoYXZuCiAJCQkgMDowMAktCVdFVAkxOTgxCiAJCQkgMDowMAlFVQlXRSVzVAogIwpAQCAtOTM5LDExICs5NDIsMTEgQEAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CiAjIEdyZWVubGFuZCBqb2luZWQgdGhlIEVVIGFzIHBhcnQgb2YgRGVubWFyaywgb2J0YWluZWQgaG9tZSBydWxlIG9uIDE5NzktMDUtMDEsCiAjIGFuZCBsZWZ0IHRoZSBFVSBvbiAxOTg1LTAyLTAxLiAgSXQgdGhlcmVmb3JlIHNob3VsZCBoYXZlIGJlZW4gdXNpbmcgRVUKLSMgcnVsZXMgYXQgbGVhc3QgdGhyb3VnaCAxOTg0LiAgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBTY29yZXNieXN1bmQgYW5kIEdvZHRoYWIKKyMgcnVsZXMgYXQgbGVhc3QgdGhyb3VnaCAxOTg0LiAgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBTY29yZXNieXN1bmQgYW5kIEdvZHRow6ViCiAjIHVzZWQgQy1FdXIgcnVsZXMgYWZ0ZXIgMTk4MCwgYnV0IElBVEEgU1NJTSAoMTk5MS8xOTk2KSBzYXlzIHRoZXkgdXNlIEVVCiAjIHJ1bGVzIHNpbmNlIGF0IGxlYXN0IDE5OTEuICBBc3N1bWUgRVUgcnVsZXMgc2luY2UgMTk4MC4KIAotIyBGcm9tIEd3aWxsaW4gTGF3ICgyMDAxLTA2LTA2KSwgY2l0aW5nCisjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDYtMDYpLCBjaXRpbmcKICMgPGh0dHA6Ly93d3cuc3RhdGthcnQubm8vZWZzL2Vmc2hlZnRlci8yMDAxL2VmczUtMjAwMS5wZGY+ICgyMDAxLTAzLTE1KSwKICMgYW5kIHdpdGggdHJhbnNsYXRpb25zIGNvcnJlY3RlZCBieSBTdGVmZmVuIFRob3JzZW46CiAjCkBAIC05NzgsMTYgKzk4MSwxNiBAQAogIyBEUEMgcmVzZWFyY2ggc3RhdGlvbiBhdCBaYWNrZW5iZXJnLgogIwogIyBTY29yZXNieXN1bmQgYW5kIHR3byBzbWFsbCB2aWxsYWdlcyBuZWFyYnkga2VlcCB0aW1lIFVUQy0xIGFuZCB1c2UKLSMgdGhlIHNhbWUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHBlcmlvZCBhcyBpbiBXZXN0IEdyZWVubGFuZCAoR29kdGhhYikuCisjIHRoZSBzYW1lIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QgYXMgaW4gV2VzdCBHcmVlbmxhbmQgKEdvZHRow6ViKS4KICMKLSMgVGhlIHJlc3Qgb2YgR3JlZW5sYW5kLCBpbmNsdWRpbmcgR29kdGhhYiAodGhpcyBhcmVhLCBhbHRob3VnaCBpdAorIyBUaGUgcmVzdCBvZiBHcmVlbmxhbmQsIGluY2x1ZGluZyBHb2R0aMOlYiAodGhpcyBhcmVhLCBhbHRob3VnaCBpdAogIyBpbmNsdWRlcyBjZW50cmFsIEdyZWVubGFuZCwgaXMga25vd24gYXMgd2VzdCBHcmVlbmxhbmQpLCBrZWVwcyB0aW1lCiAjIFVUQy0zLCB3aXRoIGRheWxpZ2h0IHNhdmluZ3MgbWV0aG9kcyBhY2NvcmRpbmcgdG8gRXVyb3BlYW4gcnVsZXMuCiAjCiAjIEl0IGlzIGNvbW1vbiBwcm9jZWR1cmUgdG8gdXNlIFVUQyAwIGluIHRoZSB3aWxkZXJuZXNzIG9mIEVhc3QgYW5kCiAjIE5vcnRoIEdyZWVubGFuZCwgYmVjYXVzZSBpdCBpcyBtYWlubHkgSWNlbGFuZGljIGFpcmNyYWZ0IG9wZXJhdG9ycwogIyBtYWludGFpbmluZyB0cmFmZmljIGluIHRoZXNlIGFyZWFzLiAgSG93ZXZlciwgdGhlIG9mZmljaWFsIHN0YXR1cyBvZgotIyB0aGlzIGFyZWEgaXMgdGhhdCBpdCBzdGlja3Mgd2l0aCBHb2R0aGFiIHRpbWUuICBUaGlzIGFyZWEgbWlnaHQgYmUKKyMgdGhpcyBhcmVhIGlzIHRoYXQgaXQgc3RpY2tzIHdpdGggR29kdGjDpWIgdGltZS4gIFRoaXMgYXJlYSBtaWdodCBiZQogIyBjb25zaWRlcmVkIGEgZHVhbCB0aW1lIHpvbmUgaW4gc29tZSByZXNwZWN0cyBiZWNhdXNlIG9mIHRoaXMuCiAKICMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMS0xMS0xOSk6CkBAIC05OTYsOCArOTk5LDggQEAKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKICMgRnJvbSAxOTk3IG9uIHRoZSBDSUEgbWFwIHNob3dzIERhbm1hcmtzaGF2biBvbiBHTVQ7Ci0jIHRoZSAxOTk1IG1hcCBhcyBsaWtlIEdvZHRoYWIuCi0jIEZvciBsYWNrIG9mIGJldHRlciBpbmZvLCBhc3N1bWUgdGhleSB3ZXJlIGxpa2UgR29kdGhhYiBiZWZvcmUgMTk5Ni4KKyMgdGhlIDE5OTUgbWFwIGFzIGxpa2UgR29kdGjDpWIuCisjIEZvciBsYWNrIG9mIGJldHRlciBpbmZvLCBhc3N1bWUgdGhleSB3ZXJlIGxpa2UgR29kdGjDpWIgYmVmb3JlIDE5OTYuCiAjIHN0YXJ0a2FydC5ubyBzYXlzIFRodWxlIGRvZXMgbm90IG9ic2VydmUgRFNULCBidXQgdGhpcyBpcyBjbGVhcmx5IGFuIGVycm9yLAogIyBzbyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciBmb3IgVGh1bGUgdHJhbnNpdGlvbnMgdW50aWwgdGhpcyB5ZWFyLgogIyBGb3IgMjAwNyBvbiBhc3N1bWUgVGh1bGUgd2lsbCBzdGF5IGluIHN5bmMgd2l0aCBVUyBEU1QgcnVsZXMuCkBAIC0xMDEyLDE1ICsxMDE1LDE1IEBACiAjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvRGFubWFya3NoYXZuIC0xOjE0OjQwIC0JTE1UCTE5MTYgSnVsIDI4Ci0JCQktMzowMAktCVdHVAkxOTgwIEFwciAgNiAyOjAwCisJCQktMzowMAktCVdHVAkxOTgwIEFwciAgNiAgMjowMAogCQkJLTM6MDAJRVUJV0clc1QJMTk5NgogCQkJMDowMAktCUdNVAogWm9uZSBBbWVyaWNhL1Njb3Jlc2J5c3VuZCAtMToyNzo1MiAtCUxNVAkxOTE2IEp1bCAyOCAjIEl0dG9xcW9ydG9vcm1paXQKLQkJCS0yOjAwCS0JQ0dUCTE5ODAgQXByICA2IDI6MDAKKwkJCS0yOjAwCS0JQ0dUCTE5ODAgQXByICA2ICAyOjAwCiAJCQktMjowMAlDLUV1cglDRyVzVAkxOTgxIE1hciAyOQogCQkJLTE6MDAJRVUJRUclc1QKIFpvbmUgQW1lcmljYS9Hb2R0aGFiCS0zOjI2OjU2IC0JTE1UCTE5MTYgSnVsIDI4ICMgTnV1awotCQkJLTM6MDAJLQlXR1QJMTk4MCBBcHIgIDYgMjowMAorCQkJLTM6MDAJLQlXR1QJMTk4MCBBcHIgIDYgIDI6MDAKIAkJCS0zOjAwCUVVCVdHJXNUCiBab25lIEFtZXJpY2EvVGh1bGUJLTQ6MzU6MDggLQlMTVQJMTkxNiBKdWwgMjggIyBQaXR1ZmZpayBhaXIgYmFzZQogCQkJLTQ6MDAJVGh1bGUJQSVzVApAQCAtMTA0MiwxNyArMTA0NSwxNiBAQAogIyBzdW1tZXIgdGltZSBuZXh0IHNwcmluZy4iCiAKICMgRnJvbSBQZXRlciBJbGlldmUgKDE5OTgtMTEtMDQpLCBoZWF2aWx5IGVkaXRlZDoKLSMgPGEgaHJlZj0iaHR0cDovL3RyaXAucmsuZWUvY2dpLWJpbi90aHc/JHtCQVNFfT1ha3QmJHtPT0hUTUx9PXJ0ZCZUQT0xOTk4JlRPPTEmQU49MTM5MCI+CiAjIFRoZSAxOTk4LTA5LTIyIEVzdG9uaWFuIHRpbWUgbGF3Ci0jIDwvYT4KKyMgaHR0cDovL3RyaXAucmsuZWUvY2dpLWJpbi90aHc/JHtCQVNFfT1ha3QmJHtPT0hUTUx9PXJ0ZCZUQT0xOTk4JlRPPTEmQU49MTM5MAogIyByZWZlcnMgdG8gdGhlIEVpZ2h0aCBEaXJlY3RpdmUgYW5kIGNpdGVzIHRoZSBhc3NvY2lhdGlvbiBhZ3JlZW1lbnQgYmV0d2VlbgotIyB0aGUgRVUgYW5kIEVzdG9uaWEsIHJhdGlmaWVkIGJ5IHRoZSBFc3RvbmlhbiBsYXcgKFJUIElJIDE5OTUsIDIyLS0yNywgMTIwKS4KKyMgdGhlIEVVIGFuZCBFc3RvbmlhLCByYXRpZmllZCBieSB0aGUgRXN0b25pYW4gbGF3IChSVCBJSSAxOTk1LCAyMi0yNywgMTIwKS4KICMKICMgSSBhbHNvIGFza2VkIFtteSByZWxhdGl2ZV0gd2hldGhlciB0aGV5IHVzZSBhbnkgc3RhbmRhcmQgYWJicmV2aWF0aW9uCiAjIGZvciB0aGVpciBzdGFuZGFyZCBhbmQgc3VtbWVyIHRpbWVzLiBIZSBzYXlzIG5vLCB0aGV5IHVzZSAic3V2ZWFlZyIKICMgKHN1bW1lciB0aW1lKSBhbmQgInRhbHZlYWVnIiAod2ludGVyIHRpbWUpLgogCi0jIEZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5iYWx0aWN0aW1lcy5jb20vIj5UaGUgQmFsdGljIFRpbWVzPC9hPiAoMTk5OS0wOS0wOSkKKyMgRnJvbSBUaGUgQmFsdGljIFRpbWVzIDxodHRwOi8vd3d3LmJhbHRpY3RpbWVzLmNvbS8+ICgxOTk5LTA5LTA5KQogIyB2aWEgU3RlZmZlbiBUaG9yc2VuOgogIyBUaGlzIHllYXIgd2lsbCBtYXJrIHRoZSBsYXN0IHRpbWUgRXN0b25pYSBzaGlmdHMgdG8gc3VtbWVyIHRpbWUsCiAjIGEgY291bmNpbCBvZiB0aGUgcnVsaW5nIGNvYWxpdGlvbiBhbm5vdW5jZWQgU2VwdC4gNi4uLi4KQEAgLTEwNzAsMTkgKzEwNzIsMTkgQEAKICMgVGhlIEVzdG9uaWFuIGdvdmVybm1lbnQgaGFzIGNoYW5nZWQgb25jZSBhZ2FpbiB0aW1lem9uZSBwb2xpdGljcy4KICMgTm93IHdlIGFyZSB1c2luZyBhZ2FpbiBFVSBydWxlcy4KICMKLSMgRnJvbSBVcm1ldCBKYWFuZXMgKDIwMDItMDMtMjgpOgorIyBGcm9tIFVybWV0IErDpG5lcyAoMjAwMi0wMy0yOCk6CiAjIFRoZSBsZWdpc2xhdGl2ZSByZWZlcmVuY2UgaXMgR292ZXJubWVudCBkZWNyZWUgTm8uIDg0IG9uIDIwMDItMDItMjEuCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL1RhbGxpbm4JMTozOTowMAktCUxNVAkxODgwCi0JCQkxOjM5OjAwCS0JVE1UCTE5MTggRmViICMgVGFsbGlubiBNZWFuIFRpbWUKKwkJCTE6Mzk6MDAJLQlUTVQJMTkxOCBGZWIgICAgIyBUYWxsaW5uIE1lYW4gVGltZQogCQkJMTowMAlDLUV1cglDRSVzVAkxOTE5IEp1bAogCQkJMTozOTowMAktCVRNVAkxOTIxIE1heQogCQkJMjowMAktCUVFVAkxOTQwIEF1ZyAgNgogCQkJMzowMAktCU1TSwkxOTQxIFNlcCAxNQogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IFNlcCAyMgotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTg5IE1hciAyNiAyOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk4OSBTZXAgMjQgMjowMHMKKwkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk4OSBNYXIgMjYgIDI6MDBzCisJCQkyOjAwCTE6MDAJRUVTVAkxOTg5IFNlcCAyNCAgMjowMHMKIAkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5OCBTZXAgMjIKIAkJCTI6MDAJRVUJRUUlc1QJMTk5OSBOb3YgIDEKIAkJCTI6MDAJLQlFRVQJMjAwMiBGZWIgMjEKQEAgLTExMDQsMzUgKzExMDYsNDUgQEAKICMgVGhpcyBpcyBkb2N1bWVudGVkIGluIEhlaWtraSBPamE6IEFpa2FraXJqYSAyMDA3LCBwdWJsaXNoZWQgYnkgVGhlIEFsbWFuYWMKICMgT2ZmaWNlIG9mIFVuaXZlcnNpdHkgb2YgSGVsc2lua2ksIElTQk4gOTUyLTEwLTMyMjEtOSwgYXZhaWxhYmxlIG9ubGluZSAoaW4KICMgRmlubmlzaCkgYXQKLSMKLSMgPGEgaHJlZj0iaHR0cDovL2FsbWFuYWtrYS5oZWxzaW5raS5maS9haWtha2lyamEvQWlrYWtpcmphMjAwN2tva29uYWFuLnBkZiI+CiAjIGh0dHA6Ly9hbG1hbmFra2EuaGVsc2lua2kuZmkvYWlrYWtpcmphL0Fpa2FraXJqYTIwMDdrb2tvbmFhbi5wZGYKLSMgPC9hPgogIwogIyBQYWdlIDEwNSAoNTYgaW4gUERGIHZlcnNpb24pIGhhcyBhIGhhbmR5IHRhYmxlIG9mIGFsbCBwYXN0IGRheWxpZ2h0IHNhdmluZ3MKICMgdHJhbnNpdGlvbnMuIEl0IGlzIGVhc3kgZW5vdWdoIHRvIGludGVycHJldCB3aXRob3V0IEZpbm5pc2ggc2tpbGxzLgogIwogIyBUaGlzIGlzIGFsc28gY29uZmlybWVkIGJ5IEZpbm5pc2ggQnJvYWRjYXN0aW5nIENvbXBhbnkncyBhcmNoaXZlIGF0OgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LnlsZS5maS9lbGF2YWFya2lzdG8vP3M9cyZnPTEmYWc9NSZ0PSZhPTM0MDEiPgogIyBodHRwOi8vd3d3LnlsZS5maS9lbGF2YWFya2lzdG8vP3M9cyZnPTEmYWc9NSZ0PSZhPTM0MDEKLSMgPC9hPgogIwogIyBUaGUgbmV3cyBjbGlwIGZyb20gMTk4MSBzYXlzIHRoYXQgInRoZSB0aW1lIGJldHdlZW4gMiBhbmQgMyBvJ2Nsb2NrIGRvZXMgbm90CiAjIGV4aXN0IHRvbmlnaHQuIgogCisjIEZyb20gS29uc3RhbnRpbiBIeXBww7ZuZW4gKDIwMTQtMDYtMTMpOgorIyBbSGVpa2tpIE9qYSdzIGJvb2sgQWlrYWtpcmphIDIwMTNdCisjIGh0dHA6Ly9hbG1hbmFra2EuaGVsc2lua2kuZmkvaW1hZ2VzL2Fpa2FraXJqYS9BaWtha2lyamEyMDEza29rb25hYW4ucGRmCisjIHBhZ2VzIDEwNC0xMDUsIGluY2x1ZGluZyBhIHNjYW4gZnJvbSBhIG5ld3NwYXBlciBwdWJsaXNoZWQgb24gQXByIDIgMTk0MgorIyBzYXkgdGhhdCAuLi4gW29dbiBBcHIgMiAxOTQyLCAyNCBvJ2Nsb2NrICh3aGljaCBtZWFucyBBcHIgMyAxOTQyLAorIyAwMDowMCksIGNsb2NrcyB3ZXJlIG1vdmVkIG9uZSBob3VyIGZvcndhcmQuIFRoZSBuZXdzcGFwZXIKKyMgbWVudGlvbnMgIm9uIHRoZSBuaWdodCBmcm9tIFRodXJzZGF5IHRvIEZyaWRheSIuLi4uCisjIE9uIE9jdCA0IDE5NDIsIGNsb2NrcyB3ZXJlIG1vdmVkIGF0IDE6MDAgb25lIGhvdXIgYmFja3dhcmRzLgorIworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTE0KToKKyMgR28gd2l0aCBPamEgb3ZlciBTaGFua3MuCisKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUZpbmxhbmQJMTk0Mglvbmx5CS0JQXByCTMJMDowMAkxOjAwCVMKLVJ1bGUJRmlubGFuZAkxOTQyCW9ubHkJLQlPY3QJMwkwOjAwCTAJLQorUnVsZQlGaW5sYW5kCTE5NDIJb25seQktCUFwcgkyCTI0OjAwCTE6MDAJUworUnVsZQlGaW5sYW5kCTE5NDIJb25seQktCU9jdAk0CTE6MDAJMAktCiBSdWxlCUZpbmxhbmQJMTk4MQkxOTgyCS0JTWFyCWxhc3RTdW4JMjowMAkxOjAwCVMKIFJ1bGUJRmlubGFuZAkxOTgxCTE5ODIJLQlTZXAJbGFzdFN1bgkzOjAwCTAJLQorCisjIE1pbG5lIHNheXMgSGVsc2lua2kgKEhlbHNpbmdmb3JzKSB0aW1lIHdhcyAxOjM5OjQ5LjIgKG9mZmljaWFsIGRvY3VtZW50KTsKKyMgcm91bmQgdG8gbmVhcmVzdC4KKwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvSGVsc2lua2kJMTozOTo1MiAtCUxNVAkxODc4IE1heSAzMQotCQkJMTozOTo1MgktCUhNVAkxOTIxIE1heSAgICAjIEhlbHNpbmtpIE1lYW4gVGltZQorWm9uZQlFdXJvcGUvSGVsc2lua2kJMTozOTo0OSAtCUxNVAkxODc4IE1heSAzMQorCQkJMTozOTo0OQktCUhNVAkxOTIxIE1heSAgICAjIEhlbHNpbmtpIE1lYW4gVGltZQogCQkJMjowMAlGaW5sYW5kCUVFJXNUCTE5ODMKIAkJCTI6MDAJRVUJRUUlc1QKIAotIyBBYWxhbmQgSXMKKyMgw4VsYW5kIElzCiBMaW5rCUV1cm9wZS9IZWxzaW5raQlFdXJvcGUvTWFyaWVoYW1uCiAKIApAQCAtMTE0MCwxNCArMTE1MiwxNCBAQAogCiAjIEZyb20gQ2lybyBEaXNjZXBvbG8gKDIwMDAtMTItMjApOgogIwotIyBIZW5yaSBMZSBDb3JyZSwgUmVnaW1lcyBIb3JhaXJlcyBwb3VyIGxlIG1vbmRlIGVudGllciwgRWRpdGlvbnMKKyMgSGVucmkgTGUgQ29ycmUsIFLDqWdpbWVzIGhvcmFpcmVzIHBvdXIgbGUgbW9uZGUgZW50aWVyLCDDiWRpdGlvbnMKICMgVHJhZGl0aW9ubmVsbGVzIC0gUGFyaXMgMiBib29rcywgMTk5MwogIwotIyBHYWJyaWVsLCBUcmFpdGUgZGUgbCdoZXVyZSBkYW5zIGxlIG1vbmRlLCBHdXkgVHJlZGFuaWVsIGVkaXRldXIsCisjIEdhYnJpZWwsIFRyYWl0w6kgZGUgbCdoZXVyZSBkYW5zIGxlIG1vbmRlLCBHdXkgVHLDqWRhbmllbCwKICMgUGFyaXMsIDE5OTEKICMKLSMgRnJhbmNvaXNlIEdhdXF1ZWxpbiwgUHJvYmxlbWVzIGRlIGwnaGV1cmUgcmVzb2x1cyBlbiBhc3Ryb2xvZ2llLAotIyBHdXkgdHJlZGFuaWVsLCBQYXJpcyAxOTg3CisjIEZyYW7Dp29pc2UgR2F1cXVlbGluLCBQcm9ibMOobWVzIGRlIGwnaGV1cmUgcsOpc29sdXMgZW4gYXN0cm9sb2dpZSwKKyMgR3V5IFRyw6lkYW5pZWwsIFBhcmlzIDE5ODcKIAogCiAjCkBAIC0xMTg4LDE2ICsxMjAwLDE2IEBACiBSdWxlCUZyYW5jZQkxOTQwCW9ubHkJLQlGZWIJMjUJIDI6MDAJMTowMAlTCiAjIFRoZSBGcmVuY2ggcnVsZXMgZm9yIDE5NDEtMTk0NCB3ZXJlIG5vdCB1c2VkIGluIFBhcmlzLCBidXQgU2hhbmtzICYgUG90dGVuZ2VyCiAjIHdyaXRlIHRoYXQgdGhleSB3ZXJlIHVzZWQgaW4gTW9uYWNvIGFuZCBpbiBtYW55IEZyZW5jaCBsb2NhdGlvbnMuCi0jIExlIENvcnJlIHdyaXRlcyB0aGF0IHRoZSB1cHBlciBsaW1pdCBvZiB0aGUgZnJlZSB6b25lIHdhcyBBcm5lZ3V5LCBPcnRoZXosCi0jIE1vbnQtZGUtTWFyc2FuLCBCYXphcywgTGFuZ29uLCBMYW1vdHRlLU1vbnRyYXZlbCwgTWFyb3VpbCwgTGEKLSMgUm9jaGVmb3VjYXVsdCwgQ2hhbXBhZ25lLU1vdXRvbiwgTGEgUm9jaGUtUG9zYXksIExhIEhheWUtRGVzY2FydGVzLAorIyBMZSBDb3JyZSB3cml0ZXMgdGhhdCB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIGZyZWUgem9uZSB3YXMgQXJuw6lndXksIE9ydGhleiwKKyMgTW9udC1kZS1NYXJzYW4sIEJhemFzLCBMYW5nb24sIExhbW90aGUtTW9udHJhdmVsLCBNYXLFk3VpbCwgTGEKKyMgUm9jaGVmb3VjYXVsZCwgQ2hhbXBhZ25lLU1vdXRvbiwgTGEgUm9jaGUtUG9zYXksIExhIEhheWUtRGVzY2FydGVzLAogIyBMb2NoZXMsIE1vbnRyaWNoYXJkLCBWaWVyem9uLCBCb3VyZ2VzLCBNb3VsaW5zLCBEaWdvaW4sCi0jIFBhcmF5LWxlLU1vbmlhbCwgTW9udGNlYXUtbGVzLU1pbmVzLCBDaGFsb25zLXN1ci1TYW9uZSwgQXJib2lzLAorIyBQYXJheS1sZS1Nb25pYWwsIE1vbnRjZWF1LWxlcy1NaW5lcywgQ2hhbG9uLXN1ci1TYcO0bmUsIEFyYm9pcywKICMgRG9sZSwgTW9yZXosIFN0LUNsYXVkZSwgYW5kIENvbGxvbmdlcyAoSGF1dGUtU2F2b2llKS4KIFJ1bGUJRnJhbmNlCTE5NDEJb25seQktCU1heQkgNQkgMDowMAkyOjAwCU0gIyBNaWRzdW1tZXIKICMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGlzIHRyYW5zaXRpb24gb2NjdXJyZWQgYXQgT2N0IDYgMTowMCwKICMgYnV0IGdvIHdpdGggRGVuaXMgRXhjb2ZmaWVyICgxOTk3LTEyLTEyKSwKLSMgd2hvIHF1b3RlcyB0aGUgRXBoZW1lcmlkZXMgQXN0cm9ub21pcXVlcyBmb3IgMTk5OCBmcm9tIEJ1cmVhdSBkZXMgTG9uZ2l0dWRlcworIyB3aG8gcXVvdGVzIHRoZSBFcGjDqW3DqXJpZGVzIGFzdHJvbm9taXF1ZXMgZm9yIDE5OTggZnJvbSBCdXJlYXUgZGVzIExvbmdpdHVkZXMKICMgYXMgc2F5aW5nIDUvMTAvNDEgMjJoVVQuCiBSdWxlCUZyYW5jZQkxOTQxCW9ubHkJLQlPY3QJIDYJIDA6MDAJMTowMAlTCiBSdWxlCUZyYW5jZQkxOTQyCW9ubHkJLQlNYXIJIDkJIDA6MDAJMjowMAlNCkBAIC0xMjE4LDcgKzEyMzAsNyBAQAogIyBvbiBQTVQtMDowOToyMSB1bnRpbCAxOTc4LTA4LTA5LCB3aGVuIHRoZSB0aW1lIGJhc2UgZmluYWxseSBzd2l0Y2hlZCB0byBVVEMuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9QYXJpcwkwOjA5OjIxIC0JTE1UCTE4OTEgTWFyIDE1ICAwOjAxCi0JCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAwOjAxICAjIFBhcmlzIE1UCisJCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAwOjAxICMgUGFyaXMgTVQKICMgU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMTk0MCBKdW4gMTQgMDowMDsgZ28gd2l0aCBFeGNvZmZpZXIgYW5kIExlIENvcnJlLgogCQkJMDowMAlGcmFuY2UJV0Ulc1QJMTk0MCBKdW4gMTQgMjM6MDAKICMgTGUgQ29ycmUgc2F5cyBQYXJpcyBzdHVjayB3aXRoIG9jY3VwaWVkLUZyYW5jZSB0aW1lIGFmdGVyIHRoZSBsaWJlcmF0aW9uOwpAQCAtMTIzNSwxNSArMTI0NywxMyBAQAogIyBCdW5kZXNhbnN0YWx0IGNvbnRhaW5zIERTVCBpbmZvcm1hdGlvbiBiYWNrIHRvIDE5MTYuCiAjIFtTZWUgdHotbGluay5odG0gZm9yIHRoZSBVUkwuXQogCi0jIEZyb20gSm9lcmcgU2NoaWxsaW5nICgyMDAyLTEwLTIzKToKKyMgRnJvbSBKw7ZyZyBTY2hpbGxpbmcgKDIwMDItMTAtMjMpOgogIyBJbiAxOTQ1LCBCZXJsaW4gd2FzIHN3aXRjaGVkIHRvIE1vc2NvdyBTdW1tZXIgdGltZSAoR01UKzQpIGJ5Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGhtLmRlL2xlbW8vaHRtbC9iaW9ncmFmaWVuL0JlcnNhcmluTmlrb2xhaS8iPgotIyBHZW5lcmFsIFtOaWtvbGFpXSBCZXJzYXJpbjwvYT4uCisjIGh0dHA6Ly93d3cuZGhtLmRlL2xlbW8vaHRtbC9iaW9ncmFmaWVuL0JlcnNhcmluTmlrb2xhaS8KKyMgR2VuZXJhbCBbTmlrb2xhaV0gQmVyc2FyaW4uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMy0wOCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucGFybGFtZW50LWJlcmxpbi5kZS9wZHMtZnJha3Rpb24ubnNmLzcyNzQ1OTEyN2M4YjY2ZWU4NTI1NjYyMzAwNDU5MDk5L2RlZmM3N2NiNzg0ZjE4MGFjMTI1NmMyYjAwMzAyNzRiLyRGSUxFL2JlcnNhcmludC5wZGYiPgogIyBodHRwOi8vd3d3LnBhcmxhbWVudC1iZXJsaW4uZGUvcGRzLWZyYWt0aW9uLm5zZi83Mjc0NTkxMjdjOGI2NmVlODUyNTY2MjMwMDQ1OTA5OS9kZWZjNzdjYjc4NGYxODBhYzEyNTZjMmIwMDMwMjc0Yi8kRklMRS9iZXJzYXJpbnQucGRmCi0jIDwvYT4KICMgc2F5cyB0aGF0IEJlcnNhcmluIGlzc3VlZCBhbiBvcmRlciB0byB1c2UgTW9zY293IHRpbWUgb24gTWF5IDIwLgogIyBIb3dldmVyLCBNb3Njb3cgZGlkIG5vdCBvYnNlcnZlIGRheWxpZ2h0IHNhdmluZyBpbiAxOTQ1LCBzbwogIyB0aGlzIHdhcyBlcXVpdmFsZW50IHRvIENFTVQgKEdNVCszKSwgbm90IEdNVCs0LgpAQCAtMTI2OCwyMyArMTI3OCwyMyBAQAogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9CZXJsaW4JMDo1MzoyOCAtCUxNVAkxODkzIEFwcgotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IE1heSAyNCAyOjAwCisJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgTWF5IDI0ICAyOjAwCiAJCQkxOjAwIFNvdmlldFpvbmUJQ0Ulc1QJMTk0NgogCQkJMTowMAlHZXJtYW55CUNFJXNUCTE5ODAKIAkJCTE6MDAJRVUJQ0Ulc1QKIAogIyBGcm9tIFRvYmlhcyBDb25yYWRpICgyMDExLTA5LTEyKToKLSMgQnVzaW5nZW4gPGh0dHA6Ly93d3cuYnVlc2luZ2VuLmRlPiwgc3Vycm91bmRlZCBieSB0aGUgU3dpc3MgY2FudG9uCisjIELDvHNpbmdlbiA8aHR0cDovL3d3dy5idWVzaW5nZW4uZGU+LCBzdXJyb3VuZGVkIGJ5IHRoZSBTd2lzcyBjYW50b24KICMgU2NoYWZmaGF1c2VuLCBkaWQgbm90IHN0YXJ0IG9ic2VydmluZyBEU1QgaW4gMTk4MCBhcyB0aGUgcmVzdCBvZiBERQogIyAoV2VzdCBHZXJtYW55IGF0IHRoYXQgdGltZSkgYW5kIEREIChFYXN0IEdlcm1hbnkgYXQgdGhhdCB0aW1lKSBkaWQuCiAjIEREIG1lcmdlZCBpbnRvIERFLCB0aGUgYXJlYSBpcyBjdXJyZW50bHkgY292ZXJlZCBieSBjb2RlIERFIGluIElTTyAzMTY2LTEsCiAjIHdoaWNoIGluIHR1cm4gaXMgY292ZXJlZCBieSB0aGUgem9uZSBFdXJvcGUvQmVybGluLgogIwotIyBTb3VyY2UgZm9yIHRoZSB0aW1lIGluIEJ1c2luZ2VuIDE5ODA6CisjIFNvdXJjZSBmb3IgdGhlIHRpbWUgaW4gQsO8c2luZ2VuIDE5ODA6CiAjIGh0dHA6Ly93d3cuc3JmLmNoL3BsYXllci92aWRlbz9pZD1jMDEyYzAyOS0wM2I3LTRjMmItOTE2NC1hYTU5MDJjZDU4ZDMKIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMi0wMy0wMyk6Ci0jIEJ1c2luZ2VuIGFuZCBadXJpY2ggaGF2ZSBzaGFyZWQgY2xvY2tzIHNpbmNlIDE5NzAuCisjIELDvHNpbmdlbiBhbmQgWnVyaWNoIGhhdmUgc2hhcmVkIGNsb2NrcyBzaW5jZSAxOTcwLgogCiBMaW5rCUV1cm9wZS9adXJpY2gJRXVyb3BlL0J1c2luZ2VuCiAKQEAgLTEyOTUsOCArMTMwNSw4IEBACiAKICMgR2licmFsdGFyCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEV1cm9wZS9HaWJyYWx0YXIJLTA6MjE6MjQgLQlMTVQJMTg4MCBBdWcgIDIgMDowMHMKLQkJCTA6MDAJR0ItRWlyZQklcwkxOTU3IEFwciAxNCAyOjAwCitab25lIEV1cm9wZS9HaWJyYWx0YXIJLTA6MjE6MjQgLQlMTVQJMTg4MCBBdWcgIDIgIDA6MDBzCisJCQkwOjAwCUdCLUVpcmUJJXMJMTk1NyBBcHIgMTQgIDI6MDAKIAkJCTE6MDAJLQlDRVQJMTk4MgogCQkJMTowMAlFVQlDRSVzVAogCkBAIC0xMzI3LDcgKzEzMzcsNyBAQAogUnVsZQlHcmVlY2UJMTk4MAlvbmx5CS0JU2VwCTI4CTA6MDAJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9BdGhlbnMJMTozNDo1MiAtCUxNVAkxODk1IFNlcCAxNAotCQkJMTozNDo1MgktCUFNVAkxOTE2IEp1bCAyOCAwOjAxICAgICAjIEF0aGVucyBNVAorCQkJMTozNDo1MgktCUFNVAkxOTE2IEp1bCAyOCAgMDowMSAjIEF0aGVucyBNVAogCQkJMjowMAlHcmVlY2UJRUUlc1QJMTk0MSBBcHIgMzAKIAkJCTE6MDAJR3JlZWNlCUNFJXNUCTE5NDQgQXByICA0CiAJCQkyOjAwCUdyZWVjZQlFRSVzVAkxOTgxCkBAIC0xMzM2LDE1ICsxMzQ2LDIwIEBACiAJCQkyOjAwCUVVCUVFJXNUCiAKICMgSHVuZ2FyeQorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTE1KToKKyMgRGF0ZXMgZm9yIDE5MTYtMTk0NSBhcmUgdGFrZW4gZnJvbToKKyMgT3Jvc3MgQS4gSmVsZW4gYSBtw7psdCBqw7Z2xZFqZTogYSBuecOhcmkgaWTFkXN6w6Ftw610w6FzIE1hZ3lhcm9yc3rDoWdvbiAxOTE2LTE5NDUuCisjIE5hdGlvbmFsIEFyY2hpdmVzIG9mIEh1bmdhcnkgKDIwMTItMTAtMjkpLgorIyBodHRwOi8vbW5sLmdvdi5odS9hX2hldF9kb2t1bWVudHVtYS9hX255YXJpX2lkb3N6YW1pdGFzX21hZ3lhcm9yc3phZ29uXzE5MTYxOTQ1Lmh0bWwKKyMgVGhpcyBzb3VyY2UgZG9lcyBub3QgYWx3YXlzIGdpdmUgdGltZXMsIHdoaWNoIGFyZSB0YWtlbiBmcm9tIFNoYW5rcworIyAmIFBvdHRlbmdlciAod2hpY2ggZGlzYWdyZWUgYWJvdXQgdGhlIGRhdGVzKS4KICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCUh1bmdhcnkJMTkxOAlvbmx5CS0JQXByCSAxCSAzOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5MTgJb25seQktCVNlcAkyOQkgMzowMAkwCS0KK1J1bGUJSHVuZ2FyeQkxOTE4CW9ubHkJLQlTZXAJMTYJIDM6MDAJMAktCiBSdWxlCUh1bmdhcnkJMTkxOQlvbmx5CS0JQXByCTE1CSAzOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5MTkJb25seQktCVNlcAkxNQkgMzowMAkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTIwCW9ubHkJLQlBcHIJIDUJIDM6MDAJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTkyMAlvbmx5CS0JU2VwCTMwCSAzOjAwCTAJLQorUnVsZQlIdW5nYXJ5CTE5MTkJb25seQktCU5vdgkyNAkgMzowMAkwCS0KIFJ1bGUJSHVuZ2FyeQkxOTQ1CW9ubHkJLQlNYXkJIDEJMjM6MDAJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTk0NQlvbmx5CS0JTm92CSAzCSAwOjAwCTAJLQorUnVsZQlIdW5nYXJ5CTE5NDUJb25seQktCU5vdgkgMQkgMDowMAkwCS0KIFJ1bGUJSHVuZ2FyeQkxOTQ2CW9ubHkJLQlNYXIJMzEJIDI6MDBzCTE6MDAJUwogUnVsZQlIdW5nYXJ5CTE5NDYJMTk0OQktCU9jdAlTdW4+PTEJIDI6MDBzCTAJLQogUnVsZQlIdW5nYXJ5CTE5NDcJMTk0OQktCUFwcglTdW4+PTQJIDI6MDBzCTE6MDAJUwpAQCAtMTM2MCw3ICsxMzc1LDcgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL0J1ZGFwZXN0CTE6MTY6MjAgLQlMTVQJMTg5MCBPY3QKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTkxOAotCQkJMTowMAlIdW5nYXJ5CUNFJXNUCTE5NDEgQXByICA2ICAyOjAwCisJCQkxOjAwCUh1bmdhcnkJQ0Ulc1QJMTk0MSBBcHIgIDgKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NQogCQkJMTowMAlIdW5nYXJ5CUNFJXNUCTE5ODAgU2VwIDI4ICAyOjAwcwogCQkJMTowMAlFVQlDRSVzVApAQCAtMTQyMyw3ICsxNDM4LDcgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQXRsYW50aWMvUmV5a2phdmlrCS0xOjI3OjI0IC0JTE1UCTE4MzcKIAkJCS0xOjI3OjQ4IC0JUk1UCTE5MDggIyBSZXlramF2aWsgTWVhbiBUaW1lPwotCQkJLTE6MDAJSWNlbGFuZAlJUyVzVAkxOTY4IEFwciA3IDE6MDBzCisJCQktMTowMAlJY2VsYW5kCUlTJXNUCTE5NjggQXByICA3ICAxOjAwcwogCQkJIDA6MDAJLQlHTVQKIAogIyBJdGFseQpAQCAtMTQzOCw5ICsxNDUzLDggQEAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CiAjIEZvciBJdGFsaWFuIERTVCB3ZSBoYXZlIHRocmVlIHNvdXJjZXM6IFNoYW5rcyAmIFBvdHRlbmdlciwgV2hpdG1hbiwgYW5kCiAjIEYuIFBvbGxhc3RyaQotIyA8YSBocmVmPSJodHRwOi8vdG9pLmlyaXRpLmNuci5pdC91ay9pZW5pdGx0Lmh0bWwiPgogIyBEYXktbGlnaHQgU2F2aW5nIFRpbWUgaW4gSXRhbHkgKDIwMDYtMDItMDMpCi0jIDwvYT4KKyMgaHR0cDovL3RvaS5pcml0aS5jbnIuaXQvdWsvaWVuaXRsdC5odG1sCiAjICgnRlAnIGJlbG93KSwgdGFrZW4gZnJvbSBhbiBJdGFsaWFuIE5hdGlvbmFsIEVsZWN0cm90ZWNobmljYWwgSW5zdGl0dXRlCiAjIHB1YmxpY2F0aW9uLiBXaGVuIHRoZSB0aHJlZSBzb3VyY2VzIGRpc2FncmVlLCBndWVzcyB3aG8ncyByaWdodCwgYXMgZm9sbG93czoKICMKQEAgLTE1MDAsOCArMTUxNCw4IEBACiBSdWxlCUl0YWx5CTE5NzkJb25seQktCVNlcAkzMAkwOjAwcwkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJRXVyb3BlL1JvbWUJMDo0OTo1NiAtCUxNVAkxODY2IFNlcCAyMgotCQkJMDo0OTo1NgktCVJNVAkxODkzIE5vdiAgMSAwOjAwcyAjIFJvbWUgTWVhbgotCQkJMTowMAlJdGFseQlDRSVzVAkxOTQyIE5vdiAgMiAyOjAwcworCQkJMDo0OTo1NgktCVJNVAkxODkzIE5vdiAgMSAgMDowMHMgIyBSb21lIE1lYW4KKwkJCTE6MDAJSXRhbHkJQ0Ulc1QJMTk0MiBOb3YgIDIgIDI6MDBzCiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgSnVsCiAJCQkxOjAwCUl0YWx5CUNFJXNUCTE5ODAKIAkJCTE6MDAJRVUJQ0Ulc1QKQEAgLTE1NDgsMTggKzE1NjIsMTggQEAKIAogIyBGcm9tIEFuZHJlaSBJdmFub3YgKDIwMDAtMDMtMDYpOgogIyBUaGlzIHllYXIgTGF0dmlhIHdpbGwgbm90IHN3aXRjaCB0byBEYXlsaWdodCBTYXZpbmdzIFRpbWUgKGFzIHNwZWNpZmllZCBpbgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmx2LWxhaWtzLmx2L3d3d3Jha3N0aS8yMDAwLzA3MTA3Mi92ZDQuaHRtIj4KICMgVGhlIFJlZ3VsYXRpb25zIG9mIHRoZSBDYWJpbmV0IG9mIE1pbmlzdGVycyBvZiB0aGUgUmVwLiBvZiBMYXR2aWEgb2YKLSMgMjktRmViLTIwMDAgKCM3OSk8L2E+LCBpbiBMYXR2aWFuIGZvciBzdWJzY3JpYmVycyBvbmx5KS4KKyMgMjktRmViLTIwMDAgKCM3OSkgPGh0dHA6Ly93d3cubHYtbGFpa3MubHYvd3d3cmFrc3RpLzIwMDAvMDcxMDcyL3ZkNC5odG0+LAorIyBpbiBMYXR2aWFuIGZvciBzdWJzY3JpYmVycyBvbmx5KS4KIAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJmZXJsLm9yZy9uZXdzbGluZS8yMDAxLzAxLzMtQ0VFL2NlZS0wMzAxMDEuaHRtbCI+Ci0jIEZyb20gUkZFL1JMIE5ld3NsaW5lICgyMDAxLTAxLTAzKSwgbm90ZWQgYWZ0ZXIgYSBoZWFkcy11cCBieSBSaXZlcyBNY0RvdzoKLSMgPC9hPgorIyBGcm9tIFJGRS9STCBOZXdzbGluZQorIyBodHRwOi8vd3d3LnJmZXJsLm9yZy9uZXdzbGluZS8yMDAxLzAxLzMtQ0VFL2NlZS0wMzAxMDEuaHRtbAorIyAoMjAwMS0wMS0wMyksIG5vdGVkIGFmdGVyIGEgaGVhZHMtdXAgYnkgUml2ZXMgTWNEb3c6CiAjIFRoZSBMYXR2aWFuIGdvdmVybm1lbnQgb24gMiBKYW51YXJ5IGRlY2lkZWQgdGhhdCB0aGUgY291bnRyeSB3aWxsCiAjIGluc3RpdHV0ZSBkYXlsaWdodC1zYXZpbmcgdGltZSB0aGlzIHNwcmluZywgTEVUQSByZXBvcnRlZC4KICMgTGFzdCBGZWJydWFyeSB0aGUgdGhyZWUgQmFsdGljIHN0YXRlcyBkZWNpZGVkIG5vdCB0byB0dXJuIGJhY2sgdGhlaXIKICMgY2xvY2tzIG9uZSBob3VyIGluIHRoZSBzcHJpbmcuLi4uCi0jIE1pbmlzdGVyIG9mIEVjb25vbXkgQWlnYXJzIEthbHZpdGlzIG5vdGVkIHRoYXQgTGF0dmlhIGhhZCB0b28gZmV3CisjIE1pbmlzdGVyIG9mIEVjb25vbXkgQWlnYXJzIEthbHbEq3RpcyBub3RlZCB0aGF0IExhdHZpYSBoYWQgdG9vIGZldwogIyBkYXlsaWdodCBob3VycyBhbmQgdGh1cyBkZWNpZGVkIHRvIGNvbXBseSB3aXRoIGEgZHJhZnQgRXVyb3BlYW4KICMgQ29tbWlzc2lvbiBkaXJlY3RpdmUgdGhhdCBwcm92aWRlcyBmb3IgaW5zdGl0dXRpbmcgZGF5bGlnaHQtc2F2aW5nCiAjIHRpbWUgaW4gRVUgY291bnRyaWVzIGJldHdlZW4gMjAwMiBhbmQgMjAwNi4gVGhlIExhdHZpYW4gZ292ZXJubWVudApAQCAtMTU2OSwxOCArMTU4MywyMyBAQAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIFJ1bGUJTGF0dmlhCTE5ODkJMTk5NgktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKIFJ1bGUJTGF0dmlhCTE5ODkJMTk5NgktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KKworIyBNaWxuZSAxODk5IHNheXMgUmlnYSB3YXMgMTozNjoyOCAoUG9seXRlY2huaXF1ZSBIb3VzZSB0aW1lKS4KKyMgQnlhbG9rb3ogMTkxOSBzYXlzIExhdHZpYSB3YXMgMTozNjozNC4KKyMgR28gd2l0aCBCeWFsb2tvei4KKwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvUmlnYQkxOjM2OjI0CS0JTE1UCTE4ODAKLQkJCTE6MzY6MjQJLQlSTVQJMTkxOCBBcHIgMTUgMjowMCAjUmlnYSBNZWFuIFRpbWUKLQkJCTE6MzY6MjQJMTowMAlMU1QJMTkxOCBTZXAgMTYgMzowMCAjTGF0dmlhbiBTdW1tZXIKLQkJCTE6MzY6MjQJLQlSTVQJMTkxOSBBcHIgIDEgMjowMAotCQkJMTozNjoyNAkxOjAwCUxTVAkxOTE5IE1heSAyMiAzOjAwCi0JCQkxOjM2OjI0CS0JUk1UCTE5MjYgTWF5IDExCitab25lCUV1cm9wZS9SaWdhCTE6MzY6MzQJLQlMTVQJMTg4MAorCQkJMTozNjozNAktCVJNVAkxOTE4IEFwciAxNSAgMjowMCAjIFJpZ2EgTVQKKwkJCTE6MzY6MzQJMTowMAlMU1QJMTkxOCBTZXAgMTYgIDM6MDAgIyBMYXR2aWFuIFNUCisJCQkxOjM2OjM0CS0JUk1UCTE5MTkgQXByICAxICAyOjAwCisJCQkxOjM2OjM0CTE6MDAJTFNUCTE5MTkgTWF5IDIyICAzOjAwCisJCQkxOjM2OjM0CS0JUk1UCTE5MjYgTWF5IDExCiAJCQkyOjAwCS0JRUVUCTE5NDAgQXVnICA1CiAJCQkzOjAwCS0JTVNLCTE5NDEgSnVsCiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgT2N0IDEzCi0JCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5ODkgTWFyIGxhc3RTdW4gMjowMHMKLQkJCTI6MDAJMTowMAlFRVNUCTE5ODkgU2VwIGxhc3RTdW4gMjowMHMKKwkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk4OSBNYXIgbGFzdFN1biAgMjowMHMKKwkJCTI6MDAJMTowMAlFRVNUCTE5ODkgU2VwIGxhc3RTdW4gIDI6MDBzCiAJCQkyOjAwCUxhdHZpYQlFRSVzVAkxOTk3IEphbiAyMQogCQkJMjowMAlFVQlFRSVzVAkyMDAwIEZlYiAyOQogCQkJMjowMAktCUVFVAkyMDAxIEphbiAgMgpAQCAtMTYxNCw3ICsxNjMzLDcgQEAKICMgSSB3b3VsZCBsaWtlIHRvIGluZm9ybSB0aGF0IGluIHRoaXMgeWVhciBMaXRodWFuaWFuIHRpbWUgem9uZQogIyAoRXVyb3BlL1ZpbG5pdXMpIHdhcyBjaGFuZ2VkLgogCi0jIEZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5lbHRhLmx0LyI+RUxUQTwvYT4gTm8uIDk3MiAoMjU4MikgKDE5OTktMDktMjkpLAorIyBGcm9tIEVMVEEgTm8uIDk3MiAoMjU4MikgKDE5OTktMDktMjkpIDxodHRwOi8vd3d3LmVsdGEubHQvPiwKICMgdmlhIFN0ZWZmZW4gVGhvcnNlbjoKICMgTGl0aHVhbmlhIGhhcyBzaGlmdGVkIGJhY2sgdG8gdGhlIHNlY29uZCB0aW1lIHpvbmUgKEdNVCBwbHVzIHR3byBob3VycykKICMgdG8gYmUgdmFsaWQgaGVyZSBzdGFydGluZyBmcm9tIE9jdG9iZXIgMzEsCkBAIC0xNjIzLDkgKzE2NDIsOSBAQAogIyBtb3Rpb24gdG8gZ2l2ZSB1cCBzaGlmdGluZyB0byBzdW1tZXIgdGltZSBpbiBzcHJpbmcsIGFzIGl0IHdhcwogIyBhbHJlYWR5IGRvbmUgYnkgRXN0b25pYS4KIAotIyBGcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdXJpc20ubHQvaW5mb3JtYS9mZi5odG0iPgotIyBGYWN0IEZpbGUsIExpdGh1YW5pYW4gU3RhdGUgRGVwYXJ0bWVudCBvZiBUb3VyaXNtCi0jIDwvYT4gKDIwMDAtMDMtMjcpOiBMb2NhbCB0aW1lIGlzIEdNVCsyIGhvdXJzIC4uLiwgbm8gZGF5bGlnaHQgc2F2aW5nLgorIyBGcm9tIHRoZSBGYWN0IEZpbGUsIExpdGh1YW5pYW4gU3RhdGUgRGVwYXJ0bWVudCBvZiBUb3VyaXNtCisjIDxodHRwOi8vd3d3LnRvdXJpc20ubHQvaW5mb3JtYS9mZi5odG0+ICgyMDAwLTAzLTI3KToKKyMgTG9jYWwgdGltZSBpcyBHTVQrMiBob3VycyAuLi4sIG5vIGRheWxpZ2h0IHNhdmluZy4KIAogIyBGcm9tIGEgdXNlciB2aWEgS2xhdXMgTWFydGVuICgyMDAzLTAyLTA3KToKICMgQXMgYSBjYW5kaWRhdGUgZm9yIG1lbWJlcnNoaXAgb2YgdGhlIEV1cm9wZWFuIFVuaW9uLCBMaXRodWFuaWEgd2lsbApAQCAtMTYzOCwxOCArMTY1NywxOCBAQAogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9WaWxuaXVzCTE6NDE6MTYJLQlMTVQJMTg4MAotCQkJMToyNDowMAktCVdNVAkxOTE3CSAgICAjIFdhcnNhdyBNZWFuIFRpbWUKKwkJCTE6MjQ6MDAJLQlXTVQJMTkxNyAgICAgICAgIyBXYXJzYXcgTWVhbiBUaW1lCiAJCQkxOjM1OjM2CS0JS01UCTE5MTkgT2N0IDEwICMgS2F1bmFzIE1lYW4gVGltZQogCQkJMTowMAktCUNFVAkxOTIwIEp1bCAxMgogCQkJMjowMAktCUVFVAkxOTIwIE9jdCAgOQogCQkJMTowMAktCUNFVAkxOTQwIEF1ZyAgMwogCQkJMzowMAktCU1TSwkxOTQxIEp1biAyNAogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEF1ZwotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgMjowMHMKKwkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkyOjAwCTE6MDAJRUVTVAkxOTkxIFNlcCAyOSAgMjowMHMKIAkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5OAotCQkJMjowMAktCUVFVAkxOTk4IE1hciAyOSAxOjAwdQotCQkJMTowMAlFVQlDRSVzVAkxOTk5IE9jdCAzMSAxOjAwdQorCQkJMjowMAktCUVFVAkxOTk4IE1hciAyOSAgMTowMHUKKwkJCTE6MDAJRVUJQ0Ulc1QJMTk5OSBPY3QgMzEgIDE6MDB1CiAJCQkyOjAwCS0JRUVUCTIwMDMgSmFuICAxCiAJCQkyOjAwCUVVCUVFJXNUCiAKQEAgLTE2ODMsOSArMTcwMiw5IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEV1cm9wZS9MdXhlbWJvdXJnCTA6MjQ6MzYgLQlMTVQJMTkwNCBKdW4KIAkJCTE6MDAJTHV4CUNFJXNUCTE5MTggTm92IDI1Ci0JCQkwOjAwCUx1eAlXRSVzVAkxOTI5IE9jdCAgNiAyOjAwcwotCQkJMDowMAlCZWxnaXVtCVdFJXNUCTE5NDAgTWF5IDE0IDM6MDAKLQkJCTE6MDAJQy1FdXIJV0Ulc1QJMTk0NCBTZXAgMTggMzowMAorCQkJMDowMAlMdXgJV0Ulc1QJMTkyOSBPY3QgIDYgIDI6MDBzCisJCQkwOjAwCUJlbGdpdW0JV0Ulc1QJMTk0MCBNYXkgMTQgIDM6MDAKKwkJCTE6MDAJQy1FdXIJV0Ulc1QJMTk0NCBTZXAgMTggIDM6MDAKIAkJCTE6MDAJQmVsZ2l1bQlDRSVzVAkxOTc3CiAJCQkxOjAwCUVVCUNFJXNUCiAKQEAgLTE3MDIsOSArMTcyMSw5IEBACiBSdWxlCU1hbHRhCTE5NzUJMTk4MAktCVNlcAlTdW4+PTE1CTI6MDAJMAktCiBSdWxlCU1hbHRhCTE5ODAJb25seQktCU1hcgkzMQkyOjAwCTE6MDAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvTWFsdGEJMDo1ODowNCAtCUxNVAkxODkzIE5vdiAgMiAwOjAwcyAjIFZhbGxldHRhCi0JCQkxOjAwCUl0YWx5CUNFJXNUCTE5NDIgTm92ICAyIDI6MDBzCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDUgQXByICAyIDI6MDBzCitab25lCUV1cm9wZS9NYWx0YQkwOjU4OjA0IC0JTE1UCTE4OTMgTm92ICAyICAwOjAwcyAjIFZhbGxldHRhCisJCQkxOjAwCUl0YWx5CUNFJXNUCTE5NDIgTm92ICAyICAyOjAwcworCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAgMjowMHMKIAkJCTE6MDAJSXRhbHkJQ0Ulc1QJMTk3MyBNYXIgMzEKIAkJCTE6MDAJTWFsdGEJQ0Ulc1QJMTk4MQogCQkJMTowMAlFVQlDRSVzVApAQCAtMTcxOSw3ICsxNzM4LDcgQEAKICMgSW4gZWFybHkgMTk5MiB0aGVyZSB3YXMgbGFyZ2Utc2NhbGUgaW50ZXJldGhuaWMgdmlvbGVuY2UgaW4gdGhlIGFyZWEKICMgYW5kIGl0J3MgcG9zc2libGUgdGhhdCBzb21lIFJ1c3NvcGhvbmVzIGNvbnRpbnVlZCB0byBvYnNlcnZlIE1vc2NvdyB0aW1lLgogIyBCdXQgW3R3byBwZW9wbGVdIHNlcGFyYXRlbHkgcmVwb3J0ZWQgdmlhCi0jIEplc3BlciBOb3JnYWFyZCB0aGF0IGFzIG9mIDIwMDEtMDEtMjQgVGlyYXNwb2wgd2FzIGxpa2UgQ2hpc2luYXUuCisjIEplc3BlciBOw7hyZ2FhcmQgdGhhdCBhcyBvZiAyMDAxLTAxLTI0IFRpcmFzcG9sIHdhcyBsaWtlIENoaXNpbmF1LgogIyBUaGUgVGlyYXNwb2wgZW50cnkgaGFzIHRoZXJlZm9yZSBiZWVuIHJlbW92ZWQgZm9yIG5vdy4KICMKICMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTEtMTAtMTcpOgpAQCAtMTcyOCwxMyArMTc0Nyw4IEBACiAjIHRvIHRoZSBXaW50ZXIgVGltZSkuCiAjCiAjIE5ld3MgKGluIFJ1c3NpYW4pOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmt5aXZwb3N0LnVhL3J1c3NpYS9uZXdzL3ByaWRuZXN0cm92ZS1vdGthemFsb3Mtb3QtcGVyZWhvZGEtbmEtemltbmVlLXZyZW15YS0zMDk1NC5odG1sIj4KICMgaHR0cDovL3d3dy5reWl2cG9zdC51YS9ydXNzaWEvbmV3cy9wcmlkbmVzdHJvdmUtb3RrYXphbG9zLW90LXBlcmVob2RhLW5hLXppbW5lZS12cmVteWEtMzA5NTQuaHRtbAotIyA8L2E+Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWxsbW9sZG92YS5jb20vbW9sZG92YS1uZXdzLzEyNDkwNjQxMTYuaHRtbCI+CiAjIGh0dHA6Ly93d3cuYWxsbW9sZG92YS5jb20vbW9sZG92YS1uZXdzLzEyNDkwNjQxMTYuaHRtbAotIyA8L2E+CiAjCiAjIFRoZSBzdWJzdGFuY2Ugb2YgdGhpcyBjaGFuZ2UgKHJlaW5zdGF0ZW1lbnQgb2YgdGhlIFRpcmFzcG9sIGVudHJ5KQogIyBpcyBmcm9tIGEgcGF0Y2ggZnJvbSBQZXRyIE1hY2hhdGEgKDIwMTEtMTAtMTcpCkBAIC0xNzUyLDkgKzE3NjYsNyBAQAogIyBGb2xsb3dpbmcgTW9sZG92YSBhbmQgbmVpZ2hib3JpbmcgVWtyYWluZS0gVHJhbnNuaXN0cmlhIChQcmlkbmVzdHJvdmllKS0KICMgVGlyYXNwb2wgd2lsbCBnbyBiYWNrIHRvIHdpbnRlciB0aW1lIG9uIE9jdG9iZXIgMzAsIDIwMTEuCiAjIE5ld3MgZnJvbSBNb2xkb3ZhIChpbiBydXNzaWFuKToKLSMgPGEgaHJlZj0iaHR0cDovL3J1LnB1Ymxpa2EubWQvbGlua18zMTcwNjEuaHRtbCI+CiAjIGh0dHA6Ly9ydS5wdWJsaWthLm1kL2xpbmtfMzE3MDYxLmh0bWwKLSMgPC9hPgogCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KQEAgLTE3NzcsOCArMTc4OSw4IEBACiAjIG1vcmUgcHJlY2lzZSAwOjA5OjIxLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvTW9uYWNvCTA6Mjk6MzIgLQlMTVQJMTg5MSBNYXIgMTUKLQkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgICAgIyBQYXJpcyBNZWFuIFRpbWUKLQkJCTA6MDAJRnJhbmNlCVdFJXNUCTE5NDUgU2VwIDE2IDM6MDAKKwkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgIyBQYXJpcyBNZWFuIFRpbWUKKwkJCTA6MDAJRnJhbmNlCVdFJXNUCTE5NDUgU2VwIDE2ICAzOjAwCiAJCQkxOjAwCUZyYW5jZQlDRSVzVAkxOTc3CiAJCQkxOjAwCUVVCUNFJXNUCiAKQEAgLTE4MjIsOCArMTgzNCw4IEBACiAjIHdhcyBub3QgdW50aWwgMTg2NiB3aGVuIHRoZXkgd2VyZSBhbGwgcmVxdWlyZWQgYnkgbGF3IHRvIG9ic2VydmUKICMgQW1zdGVyZGFtIG1lYW4gdGltZS4KIAotIyBUaGUgZGF0YSBiZWZvcmUgMTk0NSBhcmUgdGFrZW4gZnJvbQotIyA8aHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC93ZXR0aWpkL3dldHRpamQuaHRtPi4KKyMgVGhlIGRhdGEgZW50cmllcyBiZWZvcmUgMTk0NSBhcmUgdGFrZW4gZnJvbQorIyBodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L3dldHRpamQvd2V0dGlqZC5odG0KIAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKIFJ1bGUJTmV0aAkxOTE2CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCU5TVAkjIE5ldGhlcmxhbmRzIFN1bW1lciBUaW1lCkBAIC0xODU0LDggKzE4NjYsOCBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBFdXJvcGUvQW1zdGVyZGFtCTA6MTk6MzIgLQlMTVQJMTgzNQogCQkJMDoxOTozMglOZXRoCSVzCTE5MzcgSnVsICAxCi0JCQkwOjIwCU5ldGgJTkUlc1QJMTk0MCBNYXkgMTYgMDowMCAjIER1dGNoIFRpbWUKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgMjowMAorCQkJMDoyMAlOZXRoCU5FJXNUCTE5NDAgTWF5IDE2ICAwOjAwICMgRHV0Y2ggVGltZQorCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAgMjowMAogCQkJMTowMAlOZXRoCUNFJXNUCTE5NzcKIAkJCTE6MDAJRVUJQ0Ulc1QKIApAQCAtMTg4NSwxNCArMTg5NywxNCBAQAogIyB0aW1lIHRoZXkgd2VyZSBkZWNsYXJlZCBhcyBwYXJ0cyBvZiBOb3J3YXkuICBTdmFsYmFyZCB3YXMgZGVjbGFyZWQKICMgYXMgYSBwYXJ0IG9mIE5vcndheSBieSBsYXcgb2YgMTkyNS0wNy0xNyBubyAxMSwgc2VjdGlvbiA0IGFuZCBKYW4KICMgTWF5ZW4gYnkgbGF3IG9mIDE5MzAtMDItMjcgbm8gMiwgc2VjdGlvbiAyLiAoRnJvbQotIyBodHRwOi8vd3d3LmxvdmRhdGEubm8vYWxsL25sLTE5MjUwNzE3LTAxMS5odG1sIGFuZAotIyBodHRwOi8vd3d3LmxvdmRhdGEubm8vYWxsL25sLTE5MzAwMjI3LTAwMi5odG1sKS4gIFRoZSBsYXcvcmVndWxhdGlvbgorIyA8aHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xOTI1MDcxNy0wMTEuaHRtbD4gYW5kCisjIDxodHRwOi8vd3d3LmxvdmRhdGEubm8vYWxsL25sLTE5MzAwMjI3LTAwMi5odG1sPikuICBUaGUgbGF3L3JlZ3VsYXRpb24KICMgZm9yIG5vcm1hbC9zdGFuZGFyZCB0aW1lIGluIE5vcndheSBpcyBmcm9tIDE4OTQtMDYtMjkgbm8gMSAoY2FtZQogIyBpbnRvIG9wZXJhdGlvbiBvbiAxODk1LTAxLTAxKSBhbmQgU3ZhbGJhcmQvSmFuIE1heWVuIHNlZW0gdG8gYmUgYQogIyBwYXJ0IG9mIHRoaXMgbGF3IHNpbmNlIDE5MjUvMTkzMC4gKEZyb20KLSMgaHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xODk0MDYyOS0wMDEuaHRtbCApIEkgaGF2ZSBub3QgYmVlbgorIyA8aHR0cDovL3d3dy5sb3ZkYXRhLm5vL2FsbC9ubC0xODk0MDYyOS0wMDEuaHRtbD4pIEkgaGF2ZSBub3QgYmVlbgogIyBhYmxlIHRvIGZpbmQgaWYgSmFuIE1heWVuIHVzZWQgYSBkaWZmZXJlbnQgdGltZSB6b25lIChlLmcuIC0wMTAwKQotIyBiZWZvcmUgMTkzMC4gSmFuIE1heWVuIGhhcyBvbmx5IGJlZW4gImluaGFiaXRhdGVkIiBzaW5jZSAxOTIxIGJ5CisjIGJlZm9yZSAxOTMwLiBKYW4gTWF5ZW4gaGFzIG9ubHkgYmVlbiAiaW5oYWJpdGVkIiBzaW5jZSAxOTIxIGJ5CiAjIE5vcndlZ2lhbiBtZXRlb3JvbG9naXN0cyBhbmQgbWF5YmUgdXNlZCB0aGUgc2FtZSB0aW1lIGFzIE5vcndheSBldmVyCiAjIHNpbmNlIDE5MjEuICBTdmFsYmFyZCAoQXJjdGljL0xvbmd5ZWFyYnllbikgaGFzIGJlZW4gaW5oYWJpdGVkIHNpbmNlCiAjIGJlZm9yZSAxODk1LCBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IGNoYW5nZWQgdGhlIGxvY2FsIHRpbWUgc29tZXdoZXJlCkBAIC0xOTA3LDcgKzE5MTksNyBAQAogIyA8aHR0cDovL2hvbWUubm8ubmV0L2phbm1heWVuL2hpc3RvcnkuaHRtPiBzYXlzIHRoYXQgdGhlIG1ldGVvcm9sb2dpc3RzCiAjIGJ1cm5lZCBkb3duIHRoZWlyIHN0YXRpb24gaW4gMTk0MCBhbmQgbGVmdCB0aGUgaXNsYW5kLCBidXQgcmV0dXJuZWQgaW4KICMgMTk0MSB3aXRoIGEgc21hbGwgTm9yd2VnaWFuIGdhcnJpc29uIGFuZCBjb250aW51ZWQgb3BlcmF0aW9ucyBkZXNwaXRlCi0jIGZyZXF1ZW50IGFpciB0dGFja3MgZnJvbSBHZXJtYW5zLiAgSW4gMTk0MyB0aGUgQW1lcmljYW5zIGVzdGFibGlzaGVkIGEKKyMgZnJlcXVlbnQgYWlyIGF0dGFja3MgZnJvbSBHZXJtYW5zLiAgSW4gMTk0MyB0aGUgQW1lcmljYW5zIGVzdGFibGlzaGVkIGEKICMgcmFkaW9sb2NhdGluZyBzdGF0aW9uIG9uIHRoZSBpc2xhbmQsIGNhbGxlZCAiQXRsYW50aWMgQ2l0eSIuICBQb3NzaWJseQogIyB0aGUgVVQgb2Zmc2V0IGNoYW5nZWQgZHVyaW5nIHRoZSB3YXIsIGJ1dCBJIHRoaW5rIGl0IHVubGlrZWx5IHRoYXQKICMgSmFuIE1heWVuIHVzZWQgR2VybWFuIGRheWxpZ2h0LXNhdmluZyBydWxlcy4KQEAgLTE5MTgsNyArMTkzMCw3IEBACiAjIDxodHRwOi8vd3d3LnN2YWxiYXJkLmNvbS9TdmFsYmFyZEZBUS5odG1sPiBzYXlzIHRoYXQgdGhlIEdlcm1hbnMgd2VyZQogIyBleHBlbGxlZCBvbiAxOTQyLTA1LTE0LiAgSG93ZXZlciwgc21hbGwgcGFydGllcyBvZiBHZXJtYW5zIGRpZCByZXR1cm4sCiAjIGFuZCBhY2NvcmRpbmcgdG8gV2lsaGVsbSBEZWdlJ3MgYm9vayAiV2FyIE5vcnRoIG9mIDgwIiAoMTk1NCkKLSMgPGh0dHA6Ly93d3cudWNhbGdhcnkuY2EvVW9mQy9kZXBhcnRtZW50cy9VUC8xLTU1MjM4LzEtNTUyMzgtMTEwLTIuaHRtbD4KKyMgaHR0cDovL3d3dy51Y2FsZ2FyeS5jYS9Vb2ZDL2RlcGFydG1lbnRzL1VQLzEtNTUyMzgvMS01NTIzOC0xMTAtMi5odG1sCiAjIHRoZSBHZXJtYW4gYXJtZWQgZm9yY2VzIGF0IHRoZSBTdmFsYmFyZCB3ZWF0aGVyIHN0YXRpb24gY29kZS1uYW1lZAogIyBIYXVkZWdlbiBkaWQgbm90IHN1cnJlbmRlciB0byB0aGUgQWxsaWVzIHVudGlsIFNlcHRlbWJlciAxOTQ1LgogIwpAQCAtMTkyNyw2ICsxOTM5LDEwIEBACiBMaW5rCUV1cm9wZS9Pc2xvCUFyY3RpYy9Mb25neWVhcmJ5ZW4KIAogIyBQb2xhbmQKKworIyBUaGUgMTkxOSBkYXRlcyBhbmQgdGltZXMgY2FuIGJlIGZvdW5kIGluIFR5Z29kbmlrIFVyesSZZG93eSBuciAxICgxOTE5LTAzLTIwKSwKKyMgPGh0dHA6Ly93d3cud2JjLnBvem5hbi5wbC9wdWJsaWNhdGlvbi8zMjE1Nj4gcHAgMS0yLgorCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlQb2xhbmQJMTkxOAkxOTE5CS0JU2VwCTE2CTI6MDBzCTAJLQogUnVsZQlQb2xhbmQJMTkxOQlvbmx5CS0JQXByCTE1CTI6MDBzCTE6MDAJUwpAQCAtMTkzNyw5ICsxOTUzLDkgQEAKIFJ1bGUJUG9sYW5kCTE5NDUJb25seQktCUFwcgkyOQkwOjAwCTE6MDAJUwogUnVsZQlQb2xhbmQJMTk0NQlvbmx5CS0JTm92CSAxCTA6MDAJMAktCiAjIEZvciAxOTQ2IG9uIHRoZSBzb3VyY2UgaXMgS2F6aW1pZXJ6IEJvcmtvd3NraSwKLSMgVG9ydW4gQ2VudGVyIGZvciBBc3Ryb25vbXksIERlcHQuIG9mIFJhZGlvIEFzdHJvbm9teSwgTmljb2xhdXMgQ29wZXJuaWN1cyBVLiwKLSMgPGh0dHA6Ly93d3cuYXN0cm8udW5pLnRvcnVuLnBsL35rYi9BcnR5a3VseS9VLVBBL0N6YXMyLmh0bSN0dGhfdEFiMT4KLSMgVGhhbmtzIHRvIFByemVteXNsYXcgQXVndXN0eW5pYWsgKDIwMDUtMDUtMjgpIGZvciB0aGlzIHJlZmVyZW5jZS4KKyMgVG9ydcWEIENlbnRlciBmb3IgQXN0cm9ub215LCBEZXB0LiBvZiBSYWRpbyBBc3Ryb25vbXksIE5pY29sYXVzIENvcGVybmljdXMgVS4sCisjIGh0dHA6Ly93d3cuYXN0cm8udW5pLnRvcnVuLnBsL35rYi9BcnR5a3VseS9VLVBBL0N6YXMyLmh0bSN0dGhfdEFiMQorIyBUaGFua3MgdG8gUHJ6ZW15c8WCYXcgQXVndXN0eW5pYWsgKDIwMDUtMDUtMjgpIGZvciB0aGlzIHJlZmVyZW5jZS4KICMgSGUgYWxzbyBnaXZlcyB0aGVzZSBmdXJ0aGVyIHJlZmVyZW5jZXM6CiAjIE1vbiBQb2wgbnIgMTMsIHBveiAxNjIgKDE5OTUpIDxodHRwOi8vd3d3LmFiYy5jb20ucGwvc2Vyd2lzL21wLzE5OTUvMDE2Mi5odG0+CiAjIERydWsgbnIgMjE4MCAoMjAwMykgPGh0dHA6Ly93d3cuc2VuYXQuZ292LnBsL2s1L2Rvay9zZWptLzA1My8yMTgwLnBkZj4KQEAgLTE5NTksMTAgKzE5NzUsMTAgQEAKIFJ1bGUJUG9sYW5kCTE5NjIJMTk2NAktCVNlcAlsYXN0U3VuCTE6MDBzCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvV2Fyc2F3CTE6MjQ6MDAgLQlMTVQJMTg4MAotCQkJMToyNDowMAktCVdNVAkxOTE1IEF1ZyAgNSAgICMgV2Fyc2F3IE1lYW4gVGltZQotCQkJMTowMAlDLUV1cglDRSVzVAkxOTE4IFNlcCAxNiAzOjAwCisJCQkxOjI0OjAwCS0JV01UCTE5MTUgQXVnICA1ICMgV2Fyc2F3IE1lYW4gVGltZQorCQkJMTowMAlDLUV1cglDRSVzVAkxOTE4IFNlcCAxNiAgMzowMAogCQkJMjowMAlQb2xhbmQJRUUlc1QJMTkyMiBKdW4KLQkJCTE6MDAJUG9sYW5kCUNFJXNUCTE5NDAgSnVuIDIzIDI6MDAKKwkJCTE6MDAJUG9sYW5kCUNFJXNUCTE5NDAgSnVuIDIzICAyOjAwCiAJCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgT2N0CiAJCQkxOjAwCVBvbGFuZAlDRSVzVAkxOTc3CiAJCQkxOjAwCVctRXVyCUNFJXNUCTE5ODgKQEAgLTE5NzAsNiArMTk4NiwxNCBAQAogCiAjIFBvcnR1Z2FsCiAjCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDgtMTEpLCBhZnRlciBhIGhlYWRzLXVwIGZyb20gU3RlcGhlbiBDb2xlYm91cm5lOgorIyBBY2NvcmRpbmcgdG8gYSBQb3J0dWd1ZXNlIGRlY3JlZSAoMTkxMS0wNS0yNikKKyMgaHR0cDovL2RyZS5wdC9wZGYxc2RpcC8xOTExLzA1LzEyNTAwLzIzMTMyMzEzLnBkZgorIyBMaXNib24gd2FzIGF0IC0wOjM2OjQ0LjY4LCBidXQgc3dpdGNoZWQgdG8gR01UIG9uIDE5MTItMDEtMDEgYXQgMDA6MDAuCisjIFJvdW5kIHRoZSBvbGQgb2Zmc2V0IHRvIC0wOjM2OjQ1LiAgVGhpcyBhZ3JlZXMgd2l0aCBXaWxsZXR0IGJ1dCBkaXNhZ3JlZXMKKyMgd2l0aCBTaGFua3MsIHdobyBzYXlzIHRoZSB0cmFuc2l0aW9uIG9jY3VycmVkIG9uIDE5MTEtMDUtMjQgYXQgMDA6MDAgZm9yCisjIEV1cm9wZS9MaXNib24sIEF0bGFudGljL0F6b3JlcywgYW5kIEF0bGFudGljL01hZGVpcmEuCisjCiAjIEZyb20gUnVpIFBlZHJvIFNhbGd1ZWlybyAoMTk5Mi0xMS0xMik6CiAjIFBvcnR1Z2FsIGhhcyByZWNlbnRseSAoU2VwdGVtYmVyLCAyNykgY2hhbmdlZCB0aW1lem9uZQogIyAoZnJvbSBXRVQgdG8gTUVUIG9yIENFVCkgdG8gaGFybW9uaXplIHdpdGggRUVDLgpAQCAtMjA0OSwzNSArMjA3MywzNCBAQAogUnVsZQlQb3J0CTE5ODAJb25seQktCU1hcglsYXN0U3VuCSAwOjAwcwkxOjAwCVMKIFJ1bGUJUG9ydAkxOTgxCTE5ODIJLQlNYXIJbGFzdFN1bgkgMTowMHMJMTowMAlTCiBSdWxlCVBvcnQJMTk4Mwlvbmx5CS0JTWFyCWxhc3RTdW4JIDI6MDBzCTE6MDAJUworIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoZSB0cmFuc2l0aW9uIGZyb20gTE1UIHRvIFdFVCBvY2N1cnJlZCAxOTExLTA1LTI0OwotIyBXaWxsZXR0IHNheXMgMTkxMi0wMS0wMS4gIEdvIHdpdGggV2lsbGV0dC4KLVpvbmUJRXVyb3BlL0xpc2JvbgktMDozNjozMiAtCUxNVAkxODg0Ci0JCQktMDozNjozMiAtCUxNVAkxOTEyIEphbiAgMSAgIyBMaXNib24gTWVhbiBUaW1lCi0JCQkgMDowMAlQb3J0CVdFJXNUCTE5NjYgQXByICAzIDI6MDAKLQkJCSAxOjAwCS0JQ0VUCTE5NzYgU2VwIDI2IDE6MDAKLQkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk4MyBTZXAgMjUgMTowMHMKLQkJCSAwOjAwCVctRXVyCVdFJXNUCTE5OTIgU2VwIDI3IDE6MDBzCi0JCQkgMTowMAlFVQlDRSVzVAkxOTk2IE1hciAzMSAxOjAwdQorWm9uZQlFdXJvcGUvTGlzYm9uCS0wOjM2OjQ1IC0JTE1UCTE4ODQKKwkJCS0wOjM2OjQ1IC0JTE1UCTE5MTIgSmFuICAxICMgTGlzYm9uIE1lYW4gVGltZQorCQkJIDA6MDAJUG9ydAlXRSVzVAkxOTY2IEFwciAgMyAgMjowMAorCQkJIDE6MDAJLQlDRVQJMTk3NiBTZXAgMjYgIDE6MDAKKwkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk4MyBTZXAgMjUgIDE6MDBzCisJCQkgMDowMAlXLUV1cglXRSVzVAkxOTkyIFNlcCAyNyAgMTowMHMKKwkJCSAxOjAwCUVVCUNFJXNUCTE5OTYgTWFyIDMxICAxOjAwdQogCQkJIDA6MDAJRVUJV0Ulc1QKLVpvbmUgQXRsYW50aWMvQXpvcmVzCS0xOjQyOjQwIC0JTE1UCTE4ODQJCSMgUG9udGEgRGVsZ2FkYQotCQkJLTE6NTQ6MzIgLQlITVQJMTkxMSBNYXkgMjQgICMgSG9ydGEgTWVhbiBUaW1lCi0JCQktMjowMAlQb3J0CUFaTyVzVAkxOTY2IEFwciAgMyAyOjAwICMgQXpvcmVzIFRpbWUKLQkJCS0xOjAwCVBvcnQJQVpPJXNUCTE5ODMgU2VwIDI1IDE6MDBzCi0JCQktMTowMAlXLUV1cglBWk8lc1QJMTk5MiBTZXAgMjcgMTowMHMKLQkJCSAwOjAwCUVVCVdFJXNUCTE5OTMgTWFyIDI4IDE6MDB1Citab25lIEF0bGFudGljL0F6b3JlcwktMTo0Mjo0MCAtCUxNVAkxODg0ICAgICAgICAjIFBvbnRhIERlbGdhZGEKKwkJCS0xOjU0OjMyIC0JSE1UCTE5MTIgSmFuICAxICMgSG9ydGEgTWVhbiBUaW1lCisJCQktMjowMAlQb3J0CUFaTyVzVAkxOTY2IEFwciAgMyAgMjowMCAgIyBBem9yZXMgVGltZQorCQkJLTE6MDAJUG9ydAlBWk8lc1QJMTk4MyBTZXAgMjUgIDE6MDBzCisJCQktMTowMAlXLUV1cglBWk8lc1QJMTk5MiBTZXAgMjcgIDE6MDBzCisJCQkgMDowMAlFVQlXRSVzVAkxOTkzIE1hciAyOCAgMTowMHUKIAkJCS0xOjAwCUVVCUFaTyVzVAotWm9uZSBBdGxhbnRpYy9NYWRlaXJhCS0xOjA3OjM2IC0JTE1UCTE4ODQJCSMgRnVuY2hhbAotCQkJLTE6MDc6MzYgLQlGTVQJMTkxMSBNYXkgMjQgICMgRnVuY2hhbCBNZWFuIFRpbWUKLQkJCS0xOjAwCVBvcnQJTUFEJXNUCTE5NjYgQXByICAzIDI6MDAgIyBNYWRlaXJhIFRpbWUKLQkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk4MyBTZXAgMjUgMTowMHMKK1pvbmUgQXRsYW50aWMvTWFkZWlyYQktMTowNzozNiAtCUxNVAkxODg0ICAgICAgICAjIEZ1bmNoYWwKKwkJCS0xOjA3OjM2IC0JRk1UCTE5MTIgSmFuICAxICMgRnVuY2hhbCBNZWFuIFRpbWUKKwkJCS0xOjAwCVBvcnQJTUFEJXNUCTE5NjYgQXByICAzICAyOjAwICMgTWFkZWlyYSBUaW1lCisJCQkgMDowMAlQb3J0CVdFJXNUCTE5ODMgU2VwIDI1ICAxOjAwcwogCQkJIDA6MDAJRVUJV0Ulc1QKIAogIyBSb21hbmlhCiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTAtMDcpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5pbmVvY2xvY2sucm8vUE9MLzE3Nzhwb2wuaHRtbCI+Ci0jIE5pbmUgTydjbG9jazwvYT4gKDE5OTgtMTAtMjMpIHJlcG9ydHMgdGhhdCB0aGUgc3dpdGNoIG9jY3VycmVkIGF0CisjIE5pbmUgTydjbG9jayA8aHR0cDovL3d3dy5uaW5lb2Nsb2NrLnJvL1BPTC8xNzc4cG9sLmh0bWw+CisjICgxOTk4LTEwLTIzKSByZXBvcnRzIHRoYXQgdGhlIHN3aXRjaCBvY2N1cnJlZCBhdAogIyAwNDowMCBsb2NhbCB0aW1lIGluIGZhbGwgMTk5OC4gIEZvciBsYWNrIG9mIGJldHRlciBpbmZvLAogIyBhc3N1bWUgdGhhdCBSb21hbmlhIGFuZCBNb2xkb3ZhIHN3aXRjaGVkIHRvIEVVIHJ1bGVzIGluIDE5OTcsCiAjIHRoZSBzYW1lIHllYXIgYXMgQnVsZ2FyaWEuCkBAIC0yMDk0LDMyICsyMTE3LDI4IEBACiBSdWxlCVJvbWFuaWEJMTk5MQkxOTkzCS0JU2VwCWxhc3RTdW4JIDA6MDBzCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBFdXJvcGUvQnVjaGFyZXN0CTE6NDQ6MjQgLQlMTVQJMTg5MSBPY3QKLQkJCTE6NDQ6MjQJLQlCTVQJMTkzMSBKdWwgMjQJIyBCdWNoYXJlc3QgTVQKLQkJCTI6MDAJUm9tYW5pYQlFRSVzVAkxOTgxIE1hciAyOSAyOjAwcworCQkJMTo0NDoyNAktCUJNVAkxOTMxIEp1bCAyNCAjIEJ1Y2hhcmVzdCBNVAorCQkJMjowMAlSb21hbmlhCUVFJXNUCTE5ODEgTWFyIDI5ICAyOjAwcwogCQkJMjowMAlDLUV1cglFRSVzVAkxOTkxCiAJCQkyOjAwCVJvbWFuaWEJRUUlc1QJMTk5NAogCQkJMjowMAlFLUV1cglFRSVzVAkxOTk3CiAJCQkyOjAwCUVVCUVFJXNUCiAKKwogIyBSdXNzaWEKIAogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMS0wOS0xNSk6CiAjIEJhc2VkIG9uIGxhc3QgUnVzc2lhbiBHb3Zlcm5tZW50IERlY3JlZSAjIDcyNSBvbiBBdWd1c3QgMzEsIDIwMTEKICMgKEdvdmVybm1lbnQgZG9jdW1lbnQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb3Zlcm5tZW50LnJ1L2dvdi9yZXN1bHRzLzE2MzU1L3ByaW50LyI+CiAjIGh0dHA6Ly93d3cuZ292ZXJubWVudC5ydS9nb3YvcmVzdWx0cy8xNjM1NS9wcmludC8KLSMgPC9hPgogIyBpbiBSdXNzaWFuKQogIyB0aGVyZSBhcmUgZmV3IGNvcnJlY3Rpb25zIGhhdmUgdG8gYmUgbWFkZSBmb3Igc29tZSBSdXNzaWFuIHRpbWUgem9uZXMuLi4KICMgQWxsIHVwZGF0ZWQgUnVzc2lhbiBUaW1lIFpvbmVzIHdlcmUgcGxhY2VkIGluIHRhYmxlIGFuZCB0cmFuc2xhdGVkIHRvIEVuZ2xpc2gKICMgYnkgV29ybGRUaW1lWm9uZS5jb20gYXQgdGhlIGxpbmsgYmVsb3c6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcnVzc2lhMzYuaHRtIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19ydXNzaWEzNi5odG0KLSMgPC9hPgogCiAjIEZyb20gU2FuamVldiBHdXB0YSAoMjAxMS0wOS0yNyk6CiAjIFNjYW5zIG9mIFtEZWNyZWUgIzIzIG9mIEphbnVhcnkgOCwgMTk5Ml0gYXJlIGF2YWlsYWJsZSBhdDoKLSMgPGEgaHJlZj0iaHR0cDovL2dvdmVybm1lbnQuY29uc3VsdGFudC5ydS9wYWdlLmFzcHg/MTIyMzk2NiI+CiAjIGh0dHA6Ly9nb3Zlcm5tZW50LmNvbnN1bHRhbnQucnUvcGFnZS5hc3B4PzEyMjM5NjYKICMgVGhleSBhcmUgaW4gQ3lyaWxsaWMgbGV0dGVycyAocHJlc3VtYWJseSBSdXNzaWFuKS4KIApAQCAtMjEyOCwxNiArMjE0NywxMiBAQAogIyBjaGFuZ2VkIGluIFNlcHRlbWJlciAyMDExOgogIwogIyBPbmUgc291cmNlIGlzCi0jIDwgYSBocmVmPSJodHRwOi8vZ292ZXJubWVudC5ydS9nb3YvcmVzdWx0cy8xNjM1NS8+CiAjIGh0dHA6Ly9nb3Zlcm5tZW50LnJ1L2dvdi9yZXN1bHRzLzE2MzU1LwotIyA8L2E+CiAjIHdoaWNoLCBhY2NvcmRpbmcgdG8gdHJhbnNsYXRlLmdvb2dsZS5jb20sIGJlZ2lucyAiRGVjcmVlIG9mIEF1Z3VzdCAzMSwKICMgMjAxMSBObyA3MjUiIGFuZCBjb250YWlucyBubyBvdGhlciBkYXRlcyBvciAiZWZmZWN0aXZlIGRhdGUiIGluZm9ybWF0aW9uLgogIwogIyBBbm90aGVyIHNvdXJjZSBpcwotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJnLnJ1LzIwMTEvMDkvMDYvY2hhcy16b25hLWRvay5odG1sIj4KICMgaHR0cDovL3d3dy5yZy5ydS8yMDExLzA5LzA2L2NoYXMtem9uYS1kb2suaHRtbAotIyA8L2E+CiAjIHdoaWNoLCBhY2NvcmRpbmcgdG8gdHJhbnNsYXRlLmdvb2dsZS5jb20sIGJlZ2lucyAiUmVzb2x1dGlvbiBvZiB0aGUKICMgR292ZXJubWVudCBvZiB0aGUgUnVzc2lhbiBGZWRlcmF0aW9uIG9uIEF1Z3VzdCAzMSwgMjAxMSBOIDcyNSIgYW5kIGFsc28KICMgY29udGFpbnMgIkRhdGUgZmlyc3Qgb2ZmaWNpYWwgcHVibGljYXRpb246IFNlcHRlbWJlciA2LCAyMDExIFBvc3RlZCBvbjoKQEAgLTIxNDUsMjggKzIxNjAsNDUgQEAKICMgZG9lcyBub3QgY29udGFpbiBhbnkgImVmZmVjdGl2ZSBkYXRlIiBpbmZvcm1hdGlvbi4KICMKICMgQW5vdGhlciBzb3VyY2UgaXMKLSMgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PeW15YWtvbnNreV9EaXN0cmljdCNjaXRlX25vdGUtUnVUaW1lLTciPgogIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL095bXlha29uc2t5X0Rpc3RyaWN0I2NpdGVfbm90ZS1SdVRpbWUtNwotIyA8L2E+CiAjIHdoaWNoLCBpbiBub3RlIDgsIGNvbnRhaW5zICJSZXNvbHV0aW9uICM3MjUgb2YgQXVndXN0IDMxLCAyMDExLi4uCiAjIEVmZmVjdGl2ZSBhcyBvZiBhZnRlciA3IGRheXMgZm9sbG93aW5nIHRoZSBkYXkgb2YgdGhlIG9mZmljaWFsIHB1YmxpY2F0aW9uIgogIyBidXQgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhbnkgcmVmZXJlbmNlIHRvIFNlcHRlbWJlciA2LCAyMDExLgogIwogIyBUaGUgV2lraXBlZGlhIGFydGljbGUgcmVmZXJzIHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly9iYXNlLmNvbnN1bHRhbnQucnUvY29ucy9jZ2kvb25saW5lLmNnaT9yZXE9ZG9jO2Jhc2U9TEFXO249MTE4ODk2Ij4KICMgaHR0cDovL2Jhc2UuY29uc3VsdGFudC5ydS9jb25zL2NnaS9vbmxpbmUuY2dpP3JlcT1kb2M7YmFzZT1MQVc7bj0xMTg4OTYKLSMgPC9hPgogIyB3aGljaCBzZWVtcyB0byBjb3B5IHRoZSB0ZXh0IG9mIHRoZSBnb3Zlcm5tZW50LnJ1IHBhZ2UuCiAjCiAjIFRvYmlhcyBDb25yYWRpIGNvbWJpbmVzIFdpa2lwZWRpYSdzCiAjICJhcyBvZiBhZnRlciA3IGRheXMgZm9sbG93aW5nIHRoZSBkYXkgb2YgdGhlIG9mZmljaWFsIHB1YmxpY2F0aW9uIgotIyB3aXRoIHd3dy5yZy5ydSdzICJEYXRlIG9mIGZpcnN0IG9mZmljaWFsIHB1YmxpY2F0aW9uOiBTZXB0ZW1iZXIgNiwgMjAxMSIgdG8gZ2V0Ci0jIFNlcHRlbWJlciAxMywgMjAxMSBhcyB0aGUgY3V0b3ZlciBkYXRlICh1bnVzdWFsbHksIGEgVHVlc2RheSwgYXMgVG9iaWFzIENvbnJhZGkgbm90ZXMpLgorIyB3aXRoIHd3dy5yZy5ydSdzICJEYXRlIG9mIGZpcnN0IG9mZmljaWFsIHB1YmxpY2F0aW9uOiBTZXB0ZW1iZXIgNiwgMjAxMSIgdG8KKyMgZ2V0IFNlcHRlbWJlciAxMywgMjAxMSBhcyB0aGUgY3V0b3ZlciBkYXRlICh1bnVzdWFsbHksIGEgVHVlc2RheSwgYXMgVG9iaWFzCisjIENvbnJhZGkgbm90ZXMpLgogIwogIyBOb25lIG9mIHRoZSBzb3VyY2VzIGluZGljYXRlcyBhIHRpbWUgb2YgZGF5IGZvciBjaGFuZ2luZyBjbG9ja3MuCiAjCiAjIEdvIHdpdGggMjAxMS0wOS0xMyAwOjAwcy4KIAorIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxNC0wNy0wMSk6CisjIEFjY29yZGluZyB0byB0aGUgUnVzc2lhbiBuZXdzIChJVEFSLVRBU1MgTmV3cyBBZ2VuY3kpCisjIGh0dHA6Ly9lbi5pdGFyLXRhc3MuY29tL3J1c3NpYS83Mzg1NjIKKyMgdGhlIFN0YXRlIER1bWEgaGFzIGFwcHJvdmVkIC4uLiB0aGUgZHJhZnQgYmlsbCBvbiByZXR1cm5pbmcgdG8KKyMgd2ludGVyIHRpbWUgc3RhbmRhcmQgYW5kIHJldHVybiBSdXNzaWEgMTEgdGltZSB6b25lcy4gIFRoZSBuZXcKKyMgcmVndWxhdGlvbnMgd2lsbCBjb21lIGludG8gZWZmZWN0IG9uIE9jdG9iZXIgMjYsIDIwMTQgYXQgMDI6MDAgLi4uCisjIGh0dHA6Ly9hc296ZDIuZHVtYS5nb3YucnUvbWFpbi5uc2YvJTI4U3ByYXZrYSUyOT9PcGVuQWdlbnQmUk49NDMxOTg1LTYmMDIKKyMgSGVyZSBpcyBhIGxpbmsgd2hlcmUgd2UgcHV0IHRvZ2V0aGVyIHRhYmxlIChiYXNlZCBvbiBhcHByb3ZlZCBCaWxsIE4KKyMgNDMxOTg1LTYpIHdpdGggcHJvcG9zZWQgMTEgUnVzc2lhbiB0aW1lIHpvbmVzIGFuZCBjb3JyZXNwb25kaW5nCisjIGFyZWFzL2NpdGllcy9hZG1pbmlzdHJhdGl2ZSBjZW50ZXJzIGluIHRoZSBSdXNzaWFuIEZlZGVyYXRpb24gKGluIEVuZ2xpc2gpOgorIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3J1c3NpYTY1Lmh0bWwKKyMKKyMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTQtMDctMjIpOgorIyBQdXRpbiBzaWduZWQgdGhlIEZlZGVyYWwgTGF3IDQzMTk4NS02IC4uLiAoaW4gUnVzc2lhbikKKyMgaHR0cDovL2l0YXItdGFzcy5jb20vb2JzY2hlc3R2by8xMzMzNzExCisjIGh0dHA6Ly93d3cucHJhdm8uZ292LnJ1OjgwODAvcGFnZS5hc3B4PzExMTY2MAorIyBodHRwOi8vd3d3LmtyZW1saW4ucnUvYWN0cy80NjI3OQorIyBGcm9tIE9jdG9iZXIgMjYsIDIwMTQgdGhlIG5ldyBSdXNzaWFuIHRpbWUgem9uZSBtYXAgd2lsbCBsb29rcyBsaWtlIHRoaXM6CisjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcnVzc2lhLW1hcC0yMDE0LTA3Lmh0bWwKKwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKICMgRXhjZXB0IGZvciBNb3Njb3cgYWZ0ZXIgMTkxOS0wNy0wMSwgSSBpbnZlbnRlZCB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbnMuCiAjIE1vc2NvdyB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBhZnRlciAxOTE5LTA3LTAxLCBhbmQgTW9zY293IHJ1bGVzIGFmdGVyIDE5OTEsCkBAIC0yMTkzLDkgKzIyMjUsOSBAQAogIwogIyBGb3IgR3Jvem55LCBDaGVjaG55YSwgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHN0b3J5IGZyb20KICMgSm9obiBEYW5pc3pld3NraSwgIlNjYXZlbmdlcnMgaW4gdGhlIFJ1YmJsZSIsIExvcyBBbmdlbGVzIFRpbWVzICgyMDAxLTAyLTA3KToKLSMgTmV3cy0tb2Z0ZW4gZmFsc2UtLWlzIHNwcmVhZCBieSB3b3JkIG9mIG1vdXRoLiAgQSBydW1vciB0aGF0IGl0IHdhcworIyBOZXdzIC0gb2Z0ZW4gZmFsc2UgLSBpcyBzcHJlYWQgYnkgd29yZCBvZiBtb3V0aC4gIEEgcnVtb3IgdGhhdCBpdCB3YXMKICMgdGltZSB0byBtb3ZlIHRoZSBjbG9ja3MgYmFjayBwdXQgdGhpcyB3aG9sZSBjaXR5IG91dCBvZiBzeW5jIHdpdGgKLSMgdGhlIHJlc3Qgb2YgUnVzc2lhIGZvciB0d28gd2Vla3MtLWV2ZW4gc29sZGllcnMgc3RhdGlvbmVkIGhlcmUgYmVnYW4KKyMgdGhlIHJlc3Qgb2YgUnVzc2lhIGZvciB0d28gd2Vla3MgLSBldmVuIHNvbGRpZXJzIHN0YXRpb25lZCBoZXJlIGJlZ2FuCiAjIGVuZm9yY2luZyBjdXJmZXcgYXQgdGhlIHdyb25nIHRpbWUuCiAjCiAjIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDYtMDUpOgpAQCAtMjIwNiwxMDcgKzIyMzgsMjY1IEBACiAjIHNpbmNlIFNlcHRlbWJlciAxOTk3Li4uLiAgQWx0aG91Z2ggdGhlIEt1cmlsIElzbGFuZHMgYXJlCiAjIGFkbWluaXN0cmF0aXZlbHkgcGFydCBvZiBTYWtoYWxpbiBvYmxhc3QnLCB0aGV5IGFwcGVhciB0byBoYXZlCiAjIHJlbWFpbmVkIG9uIFVUQysxMSBhbG9uZyB3aXRoIE1hZ2FkYW4uCi0jCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNik6CisjIFRoZSBjb21tZW50cyBkZXRhaWxpbmcgdGhlIGNvdmVyYWdlIG9mIGVhY2ggUnVzc2lhbiB6b25lIGFyZSBtZWFudCB0byBhc3Npc3QKKyMgd2l0aCBtYWludGVuYW5jZSBvbmx5IGFuZCByZXByZXNlbnQgb3VyIGJlc3QgZ3Vlc3NlcyBhcyB0byB3aGljaCByZWdpb25zCisjIGFyZSBjb3ZlcmVkIGJ5IGVhY2ggem9uZS4gIFRoZXkgYXJlIG5vdCBtZWFudCB0byBiZSB0YWtlbiBhcyBhbiBhdXRob3JpdGF0aXZlCisjIGxpc3RpbmcuICBUaGUgcmVnaW9uIGNvZGVzIGxpc3RlZCBjb21lIGZyb20KKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvdy8/dGl0bGU9RmVkZXJhbF9zdWJqZWN0c19vZl9SdXNzaWEmb2xkaWQ9NjExODEwNDk4CisjIGFuZCBhcmUgdXNlZCBmb3IgY29udmVuaWVuY2Ugb25seTsgbm8gZ3VhcmFudGVlcyBhcmUgbWFkZSByZWdhcmRpbmcgdGhlaXIKKyMgZnV0dXJlIHN0YWJpbGl0eS4gIElTTyAzMTY2LTI6UlUgY29kZXMgYXJlIGFsc28gbGlzdGVkIGZvciBmaXJzdC1sZXZlbAorIyBkaXZpc2lvbnMgd2hlcmUgYXZhaWxhYmxlLgorCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi0jCi0jIEthbGluaW5ncmFkc2theWEgb2JsYXN0Jy4KKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgorIyBFdXJvcGUvS2FsaW5pbmdyYWQgY292ZXJzLi4uCisjIDM5CVJVLUtHRAlLYWxpbmluZ3JhZCBPYmxhc3QKKwogWm9uZSBFdXJvcGUvS2FsaW5pbmdyYWQJIDE6MjI6MDAgLQlMTVQJMTg5MyBBcHIKIAkJCSAxOjAwCUMtRXVyCUNFJXNUCTE5NDUKIAkJCSAyOjAwCVBvbGFuZAlDRSVzVAkxOTQ2Ci0JCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDI6MDAJUnVzc2lhCUVFJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgMzowMAktCUZFVCAjIEZ1cnRoZXItZWFzdGVybiBFdXJvcGVhbiBUaW1lCisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSAyOjAwCVJ1c3NpYQlFRSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSAzOjAwCS0JRkVUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDI6MDAJLQlFRVQKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOgorIyBFdXJvcGUvTW9zY293IGNvdmVycy4uLgorIyAwMQlSVS1BRAlBZHlnZWEsIFJlcHVibGljIG9mCisjIDA1CVJVLURBCURhZ2VzdGFuLCBSZXB1YmxpYyBvZgorIyAwNglSVS1JTglJbmd1c2hldGlhLCBSZXB1YmxpYyBvZgorIyAwNwlSVS1LQglLYWJhcmRpbm8tQmFsa2FyIFJlcHVibGljCisjIDA4CVJVLUtMCUthbG15a2lhLCBSZXB1YmxpYyBvZgorIyAwOQlSVS1LQwlLYXJhY2hheS1DaGVya2VzcyBSZXB1YmxpYworIyAxMAlSVS1LUglLYXJlbGlhLCBSZXB1YmxpYyBvZgorIyAxMQlSVS1LTwlLb21pIFJlcHVibGljCisjIDEyCVJVLU1FCU1hcmkgRWwgUmVwdWJsaWMKKyMgMTMJUlUtTU8JTW9yZG92aWEsIFJlcHVibGljIG9mCisjIDE1CVJVLVNFCU5vcnRoIE9zc2V0aWEtQWxhbmlhLCBSZXB1YmxpYyBvZgorIyAxNglSVS1UQQlUYXRhcnN0YW4sIFJlcHVibGljIG9mCisjIDIwCVJVLUNFCUNoZWNoZW4gUmVwdWJsaWMKKyMgMjEJUlUtQ1UJQ2h1dmFzaCBSZXB1YmxpYworIyAyMwlSVS1LREEJS3Jhc25vZGFyIEtyYWkKKyMgMjYJUlUtU1RBCVN0YXZyb3BvbCBLcmFpCisjIDI5CVJVLUFSSwlBcmtoYW5nZWxzayBPYmxhc3QKKyMgMzEJUlUtQkVMCUJlbGdvcm9kIE9ibGFzdAorIyAzMglSVS1CUlkJQnJ5YW5zayBPYmxhc3QKKyMgMzMJUlUtVkxBCVZsYWRpbWlyIE9ibGFzdAorIyAzNQlSVS1WTEcJVm9sb2dkYSBPYmxhc3QKKyMgMzYJUlUtVk9SCVZvcm9uZXpoIE9ibGFzdAorIyAzNwlSVS1JVkEJSXZhbm92byBPYmxhc3QKKyMgNDAJUlUtS0xVCUthbHVnYSBPYmxhc3QKKyMgNDQJUlUtS09TCUtvc3Ryb21hIE9ibGFzdAorIyA0NglSVS1LUlMJS3Vyc2sgT2JsYXN0CisjIDQ3CVJVLUxFTglMZW5pbmdyYWQgT2JsYXN0CisjIDQ4CVJVLUxJUAlMaXBldHNrIE9ibGFzdAorIyA1MAlSVS1NT1MJTW9zY293IE9ibGFzdAorIyA1MQlSVS1NVVIJTXVybWFuc2sgT2JsYXN0CisjIDUyCVJVLU5JWglOaXpobnkgTm92Z29yb2QgT2JsYXN0CisjIDUzCVJVLU5HUglOb3Znb3JvZCBPYmxhc3QKKyMgNTcJUlUtT1JMCU9yeW9sIE9ibGFzdAorIyA1OAlSVS1QTloJUGVuemEgT2JsYXN0CisjIDYwCVJVLVBTSwlQc2tvdiBPYmxhc3QKKyMgNjEJUlUtUk9TCVJvc3RvdiBPYmxhc3QKKyMgNjIJUlUtUllBCVJ5YXphbiBPYmxhc3QKKyMgNjcJUlUtU01PCVNtb2xlbnNrIE9ibGFzdAorIyA2OAlSVS1UQU0JVGFtYm92IE9ibGFzdAorIyA2OQlSVS1UVkUJVHZlciBPYmxhc3QKKyMgNzEJUlUtVFVMCVR1bGEgT2JsYXN0CisjIDczCVJVLVVMWQlVbHlhbm92c2sgT2JsYXN0CisjIDc2CVJVLVlBUglZYXJvc2xhdmwgT2JsYXN0CisjIDc3CVJVLU1PVwlNb3Njb3cKKyMgNzgJUlUtU1BFCVNhaW50IFBldGVyc2J1cmcKKyMgODMJUlUtTkVOCU5lbmV0cyBBdXRvbm9tb3VzIE9rcnVnCisKKyMgRnJvbSBWbGFkaW1pciBLYXJwaW5za3kgKDIwMTQtMDctMDgpOgorIyBMTVQgaW4gTW9zY293IChiZWZvcmUgSnVsIDMsIDE5MTYpIGlzIDI6MzA6MTcsIHRoYXQgd2FzIGRlZmluZWQgYnkgTW9zY293CisjIE9ic2VydmF0b3J5IChjb29yZGluYXRlczogNTUgZGVnLiA0NScyOS43MCIsIDM3IGRlZy4gMzQnMDUuMzAiKS4uLi4KKyMgTE1UIGluIE1vc2NvdyBzaW5jZSBKdWwgMywgMTkxNiBpcyAyOjMxOjAxIGFzIGEgcmVzdWx0IG9mIG5ldyBzdGFuZGFyZC4KKyMgKFRoZSBpbmZvIGlzIGZyb20gdGhlIGJvb2sgYnkgQnlhbG9rb3ogLi4uIHAuIDE4LikKKyMgVGhlIHRpbWUgaW4gU3QuIFBldGVyc2J1cmcgYXMgY2FwaXRhbCBvZiBSdXNzaWEgd2FzIGRlZmluZWQgYnkKKyMgUHVsa292IG9ic2VydmF0b3J5LCBuZWFyIFN0LiBQZXRlcnNidXJnLiAgSW4gMTkxNiBMTVQgTW9zY293CisjIHdhcyBzeW5jaHJvbml6ZWQgd2l0aCBMTVQgU3QuIFBldGVyc2J1cmcgKCszMCBtaW51dGVzKSwgKFB1bGtvdiBvYnNlcnZhdG9yeQorIyBjb29yZGluYXRlczogNTkgZGVnLiA0NicxOC43MCIsIDMwIGRlZy4gMTknNDAuNzAiKSBzbyAzMCBkZWcuIDE5JzQwLjcwIiA+CisjIDJoMDFtMTguN3MgPSAyOjAxOjE5LiAgTE1UIE1vc2NvdyA9IExNVCBTdC5QZXRlcnNidXJnICsgMzBtIDI6MDE6MTkgKyAwOjMwID0KKyMgMjozMToxOSAuLi4KICMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgUmVzcHVibGlrYSBBZHlnZXlhLCBBcmtoYW5nZWwnc2theWEgb2JsYXN0JywKLSMgQmVsZ29yb2Rza2F5YSBvYmxhc3QnLCBCcnlhbnNrYXlhIG9ibGFzdCcsIFZsYWRpbWlyc2theWEgb2JsYXN0JywKLSMgVm9sb2dvZHNrYXlhIG9ibGFzdCcsIFZvcm9uZXpoc2theWEgb2JsYXN0JywKLSMgUmVzcHVibGlrYSBEYWdlc3RhbiwgSXZhbm92c2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBJbmd1c2hldGl5YSwKLSMgS2FiYXJiaW5vLUJhbGthcnNrYXlhIFJlc3B1Ymxpa2EsIFJlc3B1Ymxpa2EgS2FsbXlraXlhLAotIyBLYWx5emhza2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIEthcmFjaGFldm8tQ2hlcmtlc3NpeWEsCi0jIFJlc3B1Ymxpa2EgS2FyZWxpeWEsIFJlc3B1Ymxpa2EgS29taSwKLSMgS29zdHJvbXNrYXlhIG9ibGFzdCcsIEtyYXNub2RhcnNraWoga3JhaiwgS3Vyc2theWEgb2JsYXN0JywKLSMgTGVuaW5ncmFkc2theWEgb2JsYXN0JywgTGlwZXRza2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIE1hcmlqIEVsLAotIyBSZXNwdWJsaWthIE1vcmRvdml5YSwgTW9za3ZhLCBNb3Nrb3Zza2F5YSBvYmxhc3QnLAotIyBNdXJtYW5za2F5YSBvYmxhc3QnLCBOZW5ldHNraWogYXZ0b25vbW55aiBva3J1ZywKLSMgTml6aGVnb3JvZHNrYXlhIG9ibGFzdCcsIE5vdmdvcm9kc2theWEgb2JsYXN0JywgT3Jsb3Zza2F5YSBvYmxhc3QnLAotIyBQZW56ZW5za2F5YSBvYmxhc3QnLCBQc2tvdnNrYXlhIG9ibGFzdCcsIFJvc3RvdnNrYXlhIG9ibGFzdCcsCi0jIFJ5YXphbnNrYXlhIG9ibGFzdCcsIFNhbmt0LVBldGVyYnVyZywKLSMgUmVzcHVibGlrYSBTZXZlcm5heWEgT3NldGl5YSwgU21vbGVuc2theWEgb2JsYXN0JywKLSMgU3RhdnJvcG9sJ3NraWoga3JhaiwgVGFtYm92c2theWEgb2JsYXN0JywgUmVzcHVibGlrYSBUYXRhcnN0YW4sCi0jIFR2ZXJza2F5YSBvYmxhc3QnLCBUeWwnc2theWEgb2JsYXN0JywgVWwneWFub3Zza2F5YSBvYmxhc3QnLAotIyBDaGVjaGVuc2theWEgUmVzcHVibGlrYSwgQ2h1dmFzaHNrYXlhIG9ibGFzdCcsCi0jIFlhcm9zbGF2c2theWEgb2JsYXN0JwotWm9uZSBFdXJvcGUvTW9zY293CSAyOjMwOjIwIC0JTE1UCTE4ODAKLQkJCSAyOjMwCS0JTU1UCTE5MTYgSnVsICAzICMgTW9zY293IE1lYW4gVGltZQotCQkJIDI6MzA6NDggUnVzc2lhCSVzCTE5MTkgSnVsICAxIDI6MDAKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0wOCk6CisjIE1pbG5lIGRvZXMgbm90IGxpc3QgTW9zY293LCBidXQgc3VnZ2VzdHMgdGhhdCBpdHMgdGltZSBtaWdodCBiZSBsaXN0ZWQgaW4KKyMgUsOpc3Vtw6lzIG1lbnN1ZWxzIGV0IGFubnVlbHMgZGVzIG9ic2VydmF0aW9ucyBtw6l0w6lvcm9sb2dpcXVlcyAoMTg5NSkuCisjIFByZXN1bWFibHkgdGhpcyBpcyBPQ0xDIDg1ODI1NzA0LCBhIGpvdXJuYWwgcHVibGlzaGVkIHdpdGggcGFyYWxsZWwgdGV4dCBpbgorIyBSdXNzaWFuIGFuZCBGcmVuY2guICBUaGlzIHNvdXJjZSBoYXMgbm90IGJlZW4gbG9jYXRlZDsgZ28gd2l0aCBLYXJwaW5za3kuCisKK1pvbmUgRXVyb3BlL01vc2NvdwkgMjozMDoxNyAtCUxNVAkxODgwCisJCQkgMjozMDoxNyAtCU1NVAkxOTE2IEp1bCAgMyAjIE1vc2NvdyBNZWFuIFRpbWUKKwkJCSAyOjMxOjE5IFJ1c3NpYQklcwkxOTE5IEp1bCAgMSAgMjowMAorCQkJIDM6MDAJUnVzc2lhCSVzCTE5MjEgT2N0CiAJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTIyIE9jdAogCQkJIDI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKLQkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgMjowMAlSdXNzaWEJRUUlc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgNDowMAktCU1TSworCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgMjowMAlSdXNzaWEJRUUlc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA0OjAwCS0JTVNLCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDM6MDAJLQlNU0sKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgorIyBFdXJvcGUvU2ltZmVyb3BvbCBjb3ZlcnMuLi4KKyMgKioJKioqKglDcmltZWEsIFJlcHVibGljIG9mCisjICoqCSoqKioJU2V2YXN0b3BvbAorCitab25lIEV1cm9wZS9TaW1mZXJvcG9sCSAyOjE2OjI0IC0JTE1UCTE4ODAKKwkJCSAyOjE2CS0JU01UCTE5MjQgTWF5ICAyICMgU2ltZmVyb3BvbCBNZWFuIFQKKwkJCSAyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCisJCQkgMzowMAktCU1TSwkxOTQxIE5vdgorCQkJIDE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBBcHIgMTMKKwkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAKKwkJCSAzOjAwCS0JTVNLCTE5OTAgSnVsICAxICAyOjAwCisJCQkgMjowMAktCUVFVAkxOTkyCisjIENlbnRyYWwgQ3JpbWVhIHVzZWQgTW9zY293IHRpbWUgMTk5NC8xOTk3LgogIwotIyBBc3RyYWtoYW5za2F5YSBvYmxhc3QnLCBLaXJvdnNrYXlhIG9ibGFzdCcsIFNhcmF0b3Zza2F5YSBvYmxhc3QnLAotIyBWb2xnb2dyYWRza2F5YSBvYmxhc3QnLiAgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBLaXJvdiBpcyBzdGlsbCBhdCArMDQwMAotIyBidXQgV2lraXBlZGlhICgyMDA2LTA1LTA5KSBzYXlzICswMzAwLiAgUGVyaGFwcyBpdCBzd2l0Y2hlZCBhZnRlciB0aGUKLSMgb3RoZXJzPyAgQnV0IHdlIGhhdmUgbm8gZGF0YS4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CisjIFRoZSBfRWNvbm9taXN0XyAoMTk5NC0wNS0yOCwgcCA0NSkgcmVwb3J0cyB0aGF0IGNlbnRyYWwgQ3JpbWVhIHN3aXRjaGVkCisjIGZyb20gS2lldiB0byBNb3Njb3cgdGltZSBzb21ldGltZSBhZnRlciB0aGUgSmFudWFyeSAxOTk0IGVsZWN0aW9ucy4KKyMgU2hhbmtzICgxOTk5KSBzYXlzICJkYXRlIG9mIGNoYW5nZSB1bmNlcnRhaW4iLCBidXQgaW1wbGllcyB0aGF0IGl0IGhhcHBlbmVkCisjIHNvbWV0aW1lIGJldHdlZW4gdGhlIDE5OTQgRFNUIHN3aXRjaGVzLiAgU2hhbmtzICYgUG90dGVuZ2VyIHNpbXBseSBzYXkKKyMgMTk5NC0wOS0yNSAwMzowMCwgYnV0IHRoYXQgY2FuJ3QgYmUgcmlnaHQuICBGb3Igbm93LCBndWVzcyBpdAorIyBjaGFuZ2VkIGluIE1heS4KKwkJCSAyOjAwCUUtRXVyCUVFJXNUCTE5OTQgTWF5CisjIEZyb20gSUFUQSBTU0lNICgxOTk0LzE5OTcpLCB3aGljaCBhbHNvIHNheXMgdGhhdCBLZXJjaCBpcyBzdGlsbCBsaWtlIEtpZXYuCisJCQkgMzowMAlFLUV1cglNU0svTVNECTE5OTYgTWFyIDMxICAzOjAwcworCQkJIDM6MDAJMTowMAlNU0QJMTk5NiBPY3QgMjcgIDM6MDBzCisjIElBVEEgU1NJTSAoMTk5Ny0wOSkgc2F5cyBDcmltZWEgc3dpdGNoZWQgdG8gRUVUL0VFU1QuCisjIEFzc3VtZSBpdCBoYXBwZW5lZCBpbiBNYXJjaCBieSBub3QgY2hhbmdpbmcgdGhlIGNsb2Nrcy4KKwkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTcKKwkJCSAzOjAwCS0JTVNLCTE5OTcgTWFyIGxhc3RTdW4gIDE6MDB1CisjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDE0LTAzLTE3KToKKyMgdGltZSBjaGFuZ2UgYXQgMjowMCAoMmFtKSBvbiBNYXJjaCAzMCwgMjAxNAorIyBodHRwOi8vdnoucnUvbmV3cy8yMDE0LzMvMTcvNjc3NDY0Lmh0bWwKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wMy0zMCk6CisjIFNpbWZlcm9wb2wgYW5kIFNldmFzdG9wb2wgcmVwb3J0ZWRseSBjaGFuZ2VkIHRoZWlyIGNlbnRyYWwgdG93biBjbG9ja3MKKyMgbGF0ZSB0aGUgcHJldmlvdXMgZGF5LCBidXQgdGhpcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiBjZXJlbW9uaWFsCisjIGFuZCB0aGUgZGlzY3JlcGFuY2llcyBhcmUgc21hbGwgZW5vdWdoIHRvIG5vdCB3b3JyeSBhYm91dC4KKwkJCSAyOjAwCUVVCUVFJXNUCTIwMTQgTWFyIDMwICAyOjAwCisJCQkgNDowMAktCU1TSwkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSAzOjAwCS0JTVNLCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKKyMgRXVyb3BlL1ZvbGdvZ3JhZCBjb3ZlcnMuLi4KKyMgMzAJUlUtQVNUCUFzdHJha2hhbiBPYmxhc3QKKyMgMzQJUlUtVkdHCVZvbGdvZ3JhZCBPYmxhc3QKKyMgNDMJUlUtS0lSCUtpcm92IE9ibGFzdAorIyA2NAlSVS1TQVIJU2FyYXRvdiBPYmxhc3QKKworIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA1LTA5KToKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBLaXJvdiBpcyBzdGlsbCBhdCArMDQwMCBidXQgV2lraXBlZGlhIHNheXMgKzAzMDAuCisjIFBlcmhhcHMgaXQgc3dpdGNoZWQgYWZ0ZXIgdGhlIG90aGVycz8gIEJ1dCB3ZSBoYXZlIG5vIGRhdGEuCisKIFpvbmUgRXVyb3BlL1ZvbGdvZ3JhZAkgMjo1Nzo0MCAtCUxNVAkxOTIwIEphbiAgMwogCQkJIDM6MDAJLQlUU0FUCTE5MjUgQXByICA2ICMgVHNhcml0c3luIFRpbWUKIAkJCSAzOjAwCS0JU1RBVAkxOTMwIEp1biAyMSAjIFN0YWxpbmdyYWQgVGltZQogCQkJIDQ6MDAJLQlTVEFUCTE5NjEgTm92IDExCi0JCQkgNDowMAlSdXNzaWEJVk9MJXNUCTE5ODkgTWFyIDI2IDI6MDBzICMgVm9sZ29ncmFkIFQKLQkJCSAzOjAwCVJ1c3NpYQlWT0wlc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA0OjAwCS0JVk9MVAkxOTkyIE1hciAyOSAyOjAwcwotCQkJIDM6MDAJUnVzc2lhCVZPTCVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJIDQ6MDAJLQlWT0xUCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFNhbWFyc2theWEgb2JsYXN0JywgVWRteXJ0c2theWEgcmVzcHVibGlrYQotWm9uZSBFdXJvcGUvU2FtYXJhCSAzOjIwOjM2IC0JTE1UCTE5MTkgSnVsICAxIDI6MDAKKwkJCSA0OjAwCVJ1c3NpYQlWT0wlc1QJMTk4OSBNYXIgMjYgIDI6MDBzICMgVm9sZ29ncmFkIFQKKwkJCSAzOjAwCVJ1c3NpYQlWT0wlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNDowMAktCVZPTFQJMTk5MiBNYXIgMjkgIDI6MDBzCisJCQkgMzowMAlSdXNzaWEJTVNLCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDQ6MDAJLQlNU0sJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgMzowMAktCU1TSworCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CisjIEV1cm9wZS9TYW1hcmEgY292ZXJzLi4uCisjIDE4CVJVLVVECVVkbXVydCBSZXB1YmxpYworIyA2MwlSVS1TQU0JU2FtYXJhIE9ibGFzdAorCisjIEJ5YWxva296IDE5MTkgc2F5cyBTYW1hcmEgd2FzIDM6MjA6MjAuCisKK1pvbmUgRXVyb3BlL1NhbWFyYQkgMzoyMDoyMCAtCUxNVAkxOTE5IEp1bCAgMSAgMjowMAogCQkJIDM6MDAJLQlTQU1UCTE5MzAgSnVuIDIxCiAJCQkgNDowMAktCVNBTVQJMTkzNSBKYW4gMjcKLQkJCSA0OjAwCVJ1c3NpYQlLVVklc1QJMTk4OSBNYXIgMjYgMjowMHMgIyBLdXlieXNoZXYKLQkJCSAzOjAwCVJ1c3NpYQlLVVklc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSAyOjAwCVJ1c3NpYQlLVVklc1QJMTk5MSBTZXAgMjkgMjowMHMKLQkJCSAzOjAwCS0JS1VZVAkxOTkxIE9jdCAyMCAzOjAwCi0JCQkgNDowMAlSdXNzaWEJU0FNJXNUCTIwMTAgTWFyIDI4IDI6MDBzICMgU2FtYXJhIFRpbWUKLQkJCSAzOjAwCVJ1c3NpYQlTQU0lc1QJMjAxMSBNYXIgMjcgMjowMHMKKwkJCSA0OjAwCVJ1c3NpYQlLVVklc1QJMTk4OSBNYXIgMjYgIDI6MDBzICMgS3V5YnlzaGV2CisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSAyOjAwCVJ1c3NpYQlFRSVzVAkxOTkxIFNlcCAyOSAgMjowMHMKKwkJCSAzOjAwCS0JS1VZVAkxOTkxIE9jdCAyMCAgMzowMAorCQkJIDQ6MDAJUnVzc2lhCVNBTSVzVAkyMDEwIE1hciAyOCAgMjowMHMgIyBTYW1hcmEgVGltZQorCQkJIDM6MDAJUnVzc2lhCVNBTSVzVAkyMDExIE1hciAyNyAgMjowMHMKIAkJCSA0OjAwCS0JU0FNVAogCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CisjIEFzaWEvWWVrYXRlcmluYnVyZyBjb3ZlcnMuLi4KKyMgMDIJUlUtQkEJQmFzaGtvcnRvc3RhbiwgUmVwdWJsaWMgb2YKKyMgOTAJUlUtUEVSCVBlcm0gS3JhaQorIyA0NQlSVS1LR04JS3VyZ2FuIE9ibGFzdAorIyA1NglSVS1PUkUJT3JlbmJ1cmcgT2JsYXN0CisjIDY2CVJVLVNWRQlTdmVyZGxvdnNrIE9ibGFzdAorIyA3MglSVS1UWVUJVHl1bWVuIE9ibGFzdAorIyA3NAlSVS1DSEUJQ2hlbHlhYmluc2sgT2JsYXN0CisjIDg2CVJVLUtITQlLaGFudHktTWFuc2kgQXV0b25vbW91cyBPa3J1ZyAtIFl1Z3JhCisjIDg5CVJVLVlBTglZYW1hbG8tTmVuZXRzIEF1dG9ub21vdXMgT2tydWcKICMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgUmVzcHVibGlrYSBCYXNoa29ydG9zdGFuLCBLb21pLVBlcm15YXRza2lqIGF2dG9ub21ueWogb2tydWcsCi0jIEt1cmdhbnNrYXlhIG9ibGFzdCcsIE9yZW5idXJnc2theWEgb2JsYXN0JywgUGVybXNrYXlhIG9ibGFzdCcsCi0jIFN2ZXJkbG92c2theWEgb2JsYXN0JywgVHl1bWVuc2theWEgb2JsYXN0JywKLSMgS2hhbnR5LU1hbnNraWpza2lqIGF2dG9ub21ueWogb2tydWcsIENoZWx5YWJpbnNrYXlhIG9ibGFzdCcsCi0jIFlhbWFsby1OZW5ldHNraWogYXZ0b25vbW55aiBva3J1Zy4KLVpvbmUgQXNpYS9ZZWthdGVyaW5idXJnCSA0OjAyOjI0IC0JTE1UCTE5MTkgSnVsIDE1IDQ6MDAKKyMgTm90ZTogRWZmZWN0aXZlIDIwMDUtMTItMDEsICg1OSkgUGVybSBPYmxhc3QgYW5kICg4MSkgS29taS1QZXJteWFrCisjIEF1dG9ub21vdXMgT2tydWcgbWVyZ2VkIHRvIGZvcm0gKDkwLCBSVS1QRVIpIFBlcm0gS3JhaS4KKworIyBNaWxuZSBzYXlzIFlla2F0ZXJpbmJ1cmcgd2FzIDQ6MDI6MzIuOTsgcm91bmQgdG8gbmVhcmVzdC4KKyMgQnlhbG9rb3ogMTkxOSBzYXlzIGl0cyBwcm92aW5jaWFsIHRpbWUgd2FzIGJhc2VkIG9uIFBlcm0sIGF0IDM6NDU6MDUuCisjIEFzc3VtZSBpdCBzd2l0Y2hlZCBvbiAxOTE2LTA3LTAzLCB0aGUgdGltZSBvZiB0aGUgbmV3IHN0YW5kYXJkLgorIyBUaGUgMTkxOSBhbmQgMTkzMCB0cmFuc2l0aW9ucyBhcmUgZnJvbSBTaGFua3MuCisKK1pvbmUgQXNpYS9ZZWthdGVyaW5idXJnCSA0OjAyOjMzIC0JTE1UCTE5MTYgSnVsICAzCisJCQkgMzo0NTowNSAtCVBNVAkxOTE5IEp1bCAxNSAgNDowMAogCQkJIDQ6MDAJLQlTVkVUCTE5MzAgSnVuIDIxICMgU3ZlcmRsb3ZzayBUaW1lCi0JCQkgNTowMAlSdXNzaWEJU1ZFJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNDowMAlSdXNzaWEJU1ZFJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgNTowMAlSdXNzaWEJWUVLJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgNjowMAktCVlFS1QJIyBZZWthdGVyaW5idXJnIFRpbWUKLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgUmVzcHVibGlrYSBBbHRhaiwgQWx0YWpza2lqIGtyYWosIE9tc2theWEgb2JsYXN0Jy4KLVpvbmUgQXNpYS9PbXNrCQkgNDo1MzozNiAtCUxNVAkxOTE5IE5vdiAxNAotCQkJIDU6MDAJLQlPTVNUCTE5MzAgSnVuIDIxICMgT21zayBUSW1lCi0JCQkgNjowMAlSdXNzaWEJT01TJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNTowMAlSdXNzaWEJT01TJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJT01TJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgNzowMAktCU9NU1QKLSMKKwkJCSA1OjAwCVJ1c3NpYQlTVkUlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNDowMAlSdXNzaWEJU1ZFJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDU6MDAJUnVzc2lhCVlFSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA2OjAwCS0JWUVLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA1OjAwCS0JWUVLVAorCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CisjIEFzaWEvT21zayBjb3ZlcnMuLi4KKyMgMDQJUlUtQUwJQWx0YWkgUmVwdWJsaWMKKyMgMjIJUlUtQUxUCUFsdGFpIEtyYWkKKyMgNTUJUlUtT01TCU9tc2sgT2JsYXN0CisKKyMgQnlhbG9rb3ogMTkxOSBzYXlzIE9tc2sgd2FzIDQ6NTM6MzAuCisKK1pvbmUgQXNpYS9PbXNrCQkgNDo1MzozMCAtCUxNVAkxOTE5IE5vdiAxNAorCQkJIDU6MDAJLQlPTVNUCTE5MzAgSnVuIDIxICMgT21zayBUaW1lCisJCQkgNjowMAlSdXNzaWEJT01TJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDU6MDAJUnVzc2lhCU9NUyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCSA2OjAwCVJ1c3NpYQlPTVMlc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgNzowMAktCU9NU1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgNjowMAktCU9NU1QKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgorIyBBc2lhL05vdm9zaWJpcnNrIGNvdmVycy4uLgorIyA1NAlSVS1OVlMJTm92b3NpYmlyc2sgT2JsYXN0CisjIDcwCVJVLVRPTQlUb21zayBPYmxhc3QKKwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA4LTE5KTogSSdtIGd1ZXNzaW5nIGFib3V0IFRvbXNrIGhlcmU7IGl0J3MKICMgbm90IGNsZWFyIHdoZW4gaXQgc3dpdGNoZWQgZnJvbSArNyB0byArNi4KLSMgTm92b3NpYmlyc2theWEgb2JsYXN0JywgVG9tc2theWEgb2JsYXN0Jy4KLVpvbmUgQXNpYS9Ob3Zvc2liaXJzawkgNTozMTo0MCAtCUxNVAkxOTE5IERlYyAxNCA2OjAwCisKK1pvbmUgQXNpYS9Ob3Zvc2liaXJzawkgNTozMTo0MCAtCUxNVAkxOTE5IERlYyAxNCAgNjowMAogCQkJIDY6MDAJLQlOT1ZUCTE5MzAgSnVuIDIxICMgTm92b3NpYmlyc2sgVGltZQotCQkJIDc6MDAJUnVzc2lhCU5PViVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCU5PViVzVAkxOTkyIEphbiAxOSAyOjAwcworCQkJIDc6MDAJUnVzc2lhCU5PViVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MiBKYW4gMTkgIDI6MDBzCiAJCQkgNzowMAlSdXNzaWEJTk9WJXNUCTE5OTMgTWF5IDIzICMgc2F5IFNoYW5rcyAmIFAuCi0JCQkgNjowMAlSdXNzaWEJTk9WJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgNzowMAktCU5PVlQKKwkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgNzowMAktCU5PVlQJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgNjowMAktCU5PVlQKKworCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgorIyBBc2lhL05vdm9rdXpuZXRzayBjb3ZlcnMuLi4KKyMgNDIJUlUtS0VNCUtlbWVyb3ZvIE9ibGFzdAogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTEwLTEzKToKICMgS2VtZXJvdm8gb2JsYXN0JyAoS2VtZXJvdm8gcmVnaW9uKSBpbiBSdXNzaWEgd2lsbCBjaGFuZ2UgY3VycmVudCB0aW1lIHpvbmUgb24KQEAgLTIzMTksMTQgKzI1MDksMTAgQEAKICMgdGltZSB6b25lLiIgKCJSdXNzaWEgWm9uZSA1IiBvciBvbGQgIlVTU1IgWm9uZSA1IiBpcyBHTVQgKzA2MDApCiAjCiAjIFJ1c3NpYW4gR292ZXJubWVudCB3ZWIgc2l0ZSAoUnVzc2lhbiBsYW5ndWFnZSkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb3Zlcm5tZW50LnJ1L2NvbnRlbnQvZ292ZXJubWVudGFjdGl2aXR5L3JmZ292ZXJubWVudGRlY2lzaW9ucy9hcmNoaXYiPgogIyBodHRwOi8vd3d3LmdvdmVybm1lbnQucnUvY29udGVudC9nb3Zlcm5tZW50YWN0aXZpdHkvcmZnb3Zlcm5tZW50ZGVjaXNpb25zL2FyY2hpdmUvMjAwOS8wOS8xNC85OTE2MzMuaHRtCi0jIDwvYT4KICMgb3IgUnVzc2lhbi1FbmdsaXNoIHRyYW5zbGF0aW9uIGJ5IFdvcmxkVGltZVpvbmUuY29tIHdpdGggcmVmZXJlbmNlCiAjIG1hcCB0byBsb2NhbCByZWdpb24gYW5kIG5ldyBSdXNzaWEgVGltZSBab25lIG1hcCBhZnRlciBNYXJjaCAyOCwgMjAxMAotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3J1c3NpYTAzLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3J1c3NpYTAzLmh0bWwKLSMgPC9hPgogIwogIyBUaHVzLCB3aGVuIFJ1c3NpYSB3aWxsIHN3aXRjaCB0byBEU1Qgb24gdGhlIG5pZ2h0IG9mIE1hcmNoIDI4LCAyMDEwCiAjIEtlbWVyb3ZvIHJlZ2lvbiAoS2VtZXJvdm8gb2JsYXN0Jykgd2lsbCBub3QgY2hhbmdlIHRoZSBjbG9jay4KQEAgLTIzMzQsMTUyICsyNTIwLDMxOSBAQAogIyBBcyBhIHJlc3VsdCwgS2VtZXJvdm8gb2JsYXN0JyB3aWxsIGJlIGluIHRoZSBzYW1lIHRpbWUgem9uZSBhcwogIyBOb3Zvc2liaXJzaywgT21zaywgVG9tc2ssIEJhcm5hdWwgYW5kIEFsdGFpIFJlcHVibGljLgogCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDIpLCBwZXIgQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDE0LTA3LTAyKToKKyMgVGhlIEtlbWVyb3ZvIHJlZ2lvbiB3aWxsIHJlbWFpbiBhdCBVVEMrNyB0aHJvdWdoIHRoZSAyMDE0LTEwLTI2IGNoYW5nZSwgdGh1cworIyByZWFsaWduaW5nIGl0c2VsZiB3aXRoIEtSQVQuCisKIFpvbmUgQXNpYS9Ob3Zva3V6bmV0c2sJIDU6NDg6NDggLQlOTVQJMTkyMCBKYW4gIDYKIAkJCSA2OjAwCS0JS1JBVAkxOTMwIEp1biAyMSAjIEtyYXNub3lhcnNrIFRpbWUKLQkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA2OjAwCVJ1c3NpYQlLUkElc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMjAxMCBNYXIgMjggMjowMHMKLQkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QJMjAxMSBNYXIgMjcgMjowMHMKLQkJCSA3OjAwCS0JTk9WVCAjIE5vdm9zaWJpcnNrL05vdm9rdXpuZXRzayBUaW1lCisJCQkgNzowMAlSdXNzaWEJS1JBJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDY6MDAJUnVzc2lhCUtSQSVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMjAxMCBNYXIgMjggIDI6MDBzCisJCQkgNjowMAlSdXNzaWEJTk9WJXNUCTIwMTEgTWFyIDI3ICAyOjAwcyAjIE5vdm9zaWJpcnNrCisJCQkgNzowMAktCU5PVlQJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgNzowMAktCUtSQVQJIyBLcmFzbm95YXJzayBUaW1lCiAKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KToKKyMgQXNpYS9LcmFzbm95YXJzayBjb3ZlcnMuLi4KKyMgMTcJUlUtVFkJVHV2YSBSZXB1YmxpYworIyAxOQlSVS1LSwlLaGFrYXNzaWEsIFJlcHVibGljIG9mCisjIDI0CVJVLUtZQQlLcmFzbm95YXJzayBLcmFpCiAjCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIEtyYXNub3lhcnNraWoga3JhaiwKLSMgVGFqbXlyc2tpaiAoRG9sZ2Fuby1OZW5ldHNraWopIGF2dG9ub21ueWogb2tydWcsCi0jIFJlc3B1Ymxpa2EgVHV2YSwgUmVzcHVibGlrYSBLaGFrYXNpeWEsIEV2ZW5raWpza2lqIGF2dG9ub21ueWogb2tydWcuCi1ab25lIEFzaWEvS3Jhc25veWFyc2sJIDY6MTE6MjAgLQlMTVQJMTkyMCBKYW4gIDYKKyMgTm90ZTogRWZmZWN0aXZlIDIwMDctMDEtMDEsICg4OCkgRXZlbmsgQXV0b25vbW91cyBPa3J1ZyBhbmQgKDg0KSBUYXlteXIKKyMgQXV0b25vbW91cyBPa3J1ZyB3ZXJlIG1lcmdlZCBpbnRvICgyNCwgUlUtS1lBKSBLcmFzbm95YXJzayBLcmFpLgorCisjIEJ5YWxva296IDE5MTkgc2F5cyBLcmFzbm95YXJzayB3YXMgNjoxMToyNi4KKworWm9uZSBBc2lhL0tyYXNub3lhcnNrCSA2OjExOjI2IC0JTE1UCTE5MjAgSmFuICA2CiAJCQkgNjowMAktCUtSQVQJMTkzMCBKdW4gMjEgIyBLcmFzbm95YXJzayBUaW1lCi0JCQkgNzowMAlSdXNzaWEJS1JBJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJS1JBJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgNzowMAlSdXNzaWEJS1JBJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgODowMAktCUtSQVQKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNjowMAlSdXNzaWEJS1JBJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA4OjAwCS0JS1JBVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA3OjAwCS0JS1JBVAorCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CisjIEFzaWEvSXJrdXRzayBjb3ZlcnMuLi4KKyMgMDMJUlUtQlUJQnVyeWF0aWEsIFJlcHVibGljIG9mCisjIDM4CVJVLUlSSwlJcmt1dHNrIE9ibGFzdAogIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBSZXNwdWJsaWthIEJ1cnlhdGl5YSwgSXJrdXRza2F5YSBvYmxhc3QnLAotIyBVc3QnLU9yZHluc2tpaiBCdXJ5YXRza2lqIGF2dG9ub21ueWogb2tydWcuCi1ab25lIEFzaWEvSXJrdXRzawkgNjo1NzoyMCAtCUxNVAkxODgwCi0JCQkgNjo1NzoyMCAtCUlNVAkxOTIwIEphbiAyNSAjIElya3V0c2sgTWVhbiBUaW1lCisjIE5vdGU6IEVmZmVjdGl2ZSAyMDA4LTAxLTAxLCAoODUpIFVzdC1PcmRhIEJ1cnlhdCBBdXRvbm9tb3VzIE9rcnVnIHdhcworIyBtZXJnZWQgaW50byAoMzgsIFJVLUlSSykgSXJrdXRzayBPYmxhc3QuCisKKyMgTWlsbmUgMTg5OSBzYXlzIElya3V0c2sgd2FzIDY6NTc6MTUuCisjIEJ5YWxva296IDE5MTkgc2F5cyBJcmt1dHNrIHdhcyA2OjU3OjA1LgorIyBHbyB3aXRoIEJ5YWxva296LgorCitab25lIEFzaWEvSXJrdXRzawkgNjo1NzowNSAtCUxNVAkxODgwCisJCQkgNjo1NzowNSAtCUlNVAkxOTIwIEphbiAyNSAjIElya3V0c2sgTWVhbiBUaW1lCiAJCQkgNzowMAktCUlSS1QJMTkzMCBKdW4gMjEgIyBJcmt1dHNrIFRpbWUKLQkJCSA4OjAwCVJ1c3NpYQlJUkslc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQlJUkslc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA4OjAwCVJ1c3NpYQlJUkslc1QJMjAxMSBNYXIgMjcgMjowMHMKLQkJCSA5OjAwCS0JSVJLVAorCQkJIDg6MDAJUnVzc2lhCUlSSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA3OjAwCVJ1c3NpYQlJUkslc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgODowMAlSdXNzaWEJSVJLJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDk6MDAJLQlJUktUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDg6MDAJLQlJUktUCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTA2KToKKyMgQXNpYS9DaGl0YSBjb3ZlcnMuLi4KKyMgOTIJUlUtWkFCCVphYmF5a2Fsc2t5IEtyYWkKICMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMy0xMC0xOCk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgQWdpbnNraWogQnVyeWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLCBBbXVyc2theWEgb2JsYXN0JywKLSMgW3BhcnRzIG9mXSBSZXNwdWJsaWthIFNha2hhIChZYWt1dGl5YSksIENoaXRpbnNrYXlhIG9ibGFzdCcuCisjIE5vdGU6IEVmZmVjdGl2ZSAyMDA4LTAzLTAxLCAoNzUpIENoaXRhIE9ibGFzdCBhbmQgKDgwKSBBZ2luLUJ1cnlhdAorIyBBdXRvbm9tb3VzIE9rcnVnIG1lcmdlZCB0byBmb3JtICg5MiwgUlUtWkFCKSBaYWJheWthbHNreSBLcmFpLgogCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDktMTEtMjkpOgotIyAuLi5zb21lIHJlZ2lvbnMgb2YgW1J1c3NpYV0gd2VyZSBtZXJnZWQgd2l0aCBvdGhlcnMgc2luY2UgMjAwNS4uLgotIyBTb21lIG5hbWVzIHdlcmUgY2hhbmdlZCwgbm8gYmlnIGRlYWwsIGV4Y2VwdCBmb3Igb25lIGluc3RhbmNlOiBhIG5ldyBuYW1lLgotIyBZQUsvWUFLU1Q6IFVUQys5IFphYmFqa2FsJ3NraWoga3Jhai4KLQotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKLSMgVGhlIFNha2hhIGRpc3RyaWN0cyBhcmU6IEFsZGFuc2tpaiwgQW1naW5za2lqLCBBbmFiYXJza2lqLAotIyBWZXJraG5ldmlseXVqc2tpaiwgVmlseXVqc2tpaiwgR29ybnlqLAotIyBaaGlnYW5za2lqLCBLb2J5YWpza2lqLCBMZW5za2lqLCBNZWdpbm8tS2FuZ2FsYXNza2lqLCBNaXJuaW5za2lqLAotIyBOYW1za2lqLCBOeXVyYmluc2tpaiwgT2xlbnlva3NraWosIE9seW9rbWluc2tpaiwKLSMgU3VudGFyc2tpaiwgVGF0dGluc2tpaiwgVXN0Jy1BbGRhbnNraWosIEtoYW5nYWxhc3NraWosCi0jIENodXJhcGNoaW5za2lqLCBFdmVuby1CeXRhbnRhanNraWogTmF0c2lvbmFsJ25pai4KLQotWm9uZSBBc2lhL1lha3V0c2sJIDg6Mzg6NDAgLQlMTVQJMTkxOSBEZWMgMTUKK1pvbmUgQXNpYS9DaGl0YQkgNzozMzo1MiAtCUxNVAkxOTE5IERlYyAxNQogCQkJIDg6MDAJLQlZQUtUCTE5MzAgSnVuIDIxICMgWWFrdXRzayBUaW1lCi0JCQkgOTowMAlSdXNzaWEJWUFLJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgODowMAlSdXNzaWEJWUFLJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgOTowMAlSdXNzaWEJWUFLJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkgMTA6MDAJLQlZQUtUCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDMtMTAtMTgpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIEV2cmVqc2theWEgYXZ0b25vbW5heWEgb2JsYXN0JywgS2hhYmFyb3Zza2lqIGtyYWosIFByaW1vcnNraWoga3JhaiwKLSMgW3BhcnRzIG9mXSBSZXNwdWJsaWthIFNha2hhIChZYWt1dGl5YSkuCisJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMDowMAktCVlBS1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgODowMAktCUlSS1QKIAotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKLSMgVGhlIFNha2hhIGRpc3RyaWN0cyBhcmU6IEJ1bHVuc2tpaiwgVmVya2hveWFuc2tpaiwgLi4uIFVzdCctWWFuc2tpai4KLVpvbmUgQXNpYS9WbGFkaXZvc3RvawkgODo0Nzo0NCAtCUxNVAkxOTIyIE5vdiAxNQorCisjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDktMTEtMjkpOgorIyBBc2lhL1lha3V0c2sgY292ZXJzLi4uCisjIDI4CVJVLUFNVQlBbXVyIE9ibGFzdAorIworIyAuLi5hbmQgcGFydHMgb2YgKDE0LCBSVS1TQSkgU2FraGEgKFlha3V0aWEpIFJlcHVibGljOgorIyAxNC0wMgkqKioqCUFsZGFuc2t5IERpc3RyaWN0CisjIDE0LTA0CSoqKioJQW1naW5za3kgRGlzdHJpY3QKKyMgMTQtMDUJKioqKglBbmFiYXJza3kgRGlzdHJpY3QKKyMgMTQtMDYJKioqKglCdWx1bnNreSBEaXN0cmljdAorIyAxNC0wNwkqKioqCVZlcmtobmV2aWx5dXlza3kgRGlzdHJpY3QKKyMgMTQtMTAJKioqKglWaWx5dXlza3kgRGlzdHJpY3QKKyMgMTQtMTEJKioqKglHb3JueSBEaXN0cmljdAorIyAxNC0xMgkqKioqCVpoaWdhbnNreSBEaXN0cmljdAorIyAxNC0xMwkqKioqCUtvYnlheXNreSBEaXN0cmljdAorIyAxNC0xNAkqKioqCUxlbnNreSBEaXN0cmljdAorIyAxNC0xNQkqKioqCU1lZ2luby1LYW5nYWxhc3NreSBEaXN0cmljdAorIyAxNC0xNgkqKioqCU1pcm5pbnNreSBEaXN0cmljdAorIyAxNC0xOAkqKioqCU5hbXNreSBEaXN0cmljdAorIyAxNC0xOQkqKioqCU5lcnl1bmdyaW5za3kgRGlzdHJpY3QKKyMgMTQtMjEJKioqKglOeXVyYmluc2t5IERpc3RyaWN0CisjIDE0LTIzCSoqKioJT2xlbnlva3NreSBEaXN0cmljdAorIyAxNC0yNAkqKioqCU9seW9rbWluc2t5IERpc3RyaWN0CisjIDE0LTI2CSoqKioJU3VudGFyc2t5IERpc3RyaWN0CisjIDE0LTI3CSoqKioJVGF0dGluc2t5IERpc3RyaWN0CisjIDE0LTI5CSoqKioJVXN0LUFsZGFuc2t5IERpc3RyaWN0CisjIDE0LTMyCSoqKioJS2hhbmdhbGFzc2t5IERpc3RyaWN0CisjIDE0LTMzCSoqKioJQ2h1cmFwY2hpbnNreSBEaXN0cmljdAorIyAxNC0zNAkqKioqCUV2ZW5vLUJ5dGFudGF5c2t5IE5hdGlvbmFsIERpc3RyaWN0CisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CisjIE91ciBjb21tZW50YXJ5IHNlZW1zIHRvIGhhdmUgbG9zdCBtZW50aW9uIG9mICgxNC0xOSkgTmVyeXVuZ3JpbnNreSBEaXN0cmljdC4KKyMgU2luY2UgdGhlIHN1cnJvdW5kaW5nIGRpc3RyaWN0cyBvZiBTYWtoYSBhcmUgYWxsIFlBS1QsIGFzc3VtZSB0aGlzIGlzLCB0b28uCisjIEFsc28gYXNzdW1lIGl0cyBoaXN0b3J5IGhhcyBiZWVuIHRoZSBzYW1lIGFzIHRoZSByZXN0IG9mIEFzaWEvWWFrdXRzay4KKworIyBCeWFsb2tveiAxOTE5IHNheXMgWWFrdXRzayB3YXMgODozODo1OC4KKworWm9uZSBBc2lhL1lha3V0c2sJIDg6Mzg6NTggLQlMTVQJMTkxOSBEZWMgMTUKKwkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQorCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA4OjAwCVJ1c3NpYQlZQUslc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTA6MDAJLQlZQUtUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDk6MDAJLQlZQUtUCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKKyMgQXNpYS9WbGFkaXZvc3RvayBjb3ZlcnMuLi4KKyMgMjUJUlUtUFJJCVByaW1vcnNreSBLcmFpCisjIDI3CVJVLUtIQQlLaGFiYXJvdnNrIEtyYWkKKyMgNzkJUlUtWUVWCUpld2lzaCBBdXRvbm9tb3VzIE9ibGFzdAorIworIyAuLi5hbmQgcGFydHMgb2YgKDE0LCBSVS1TQSkgU2FraGEgKFlha3V0aWEpIFJlcHVibGljOgorIyAxNC0wOQkqKioqCVZlcmtob3lhbnNreSBEaXN0cmljdAorIyAxNC0zMQkqKioqCVVzdC1ZYW5za3kgRGlzdHJpY3QKKworIyBNaWxuZSAxODk5IHNheXMgVmxhZGl2b3N0b2sgd2FzIDg6NDc6MzMuNS4KKyMgQnlhbG9rb3ogMTkxOSBzYXlzIFZsYWRpdm9zdG9rIHdhcyA4OjQ3OjMxLgorIyBHbyB3aXRoIEJ5YWxva296LgorCitab25lIEFzaWEvVmxhZGl2b3N0b2sJIDg6NDc6MzEgLQlMTVQJMTkyMiBOb3YgMTUKIAkJCSA5OjAwCS0JVkxBVAkxOTMwIEp1biAyMSAjIFZsYWRpdm9zdG9rIFRpbWUKLQkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA5OjAwCVJ1c3NpYQlWTEElc1NUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJVkxBJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkxMTowMAktCVZMQVQKKwkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgOTowMAlSdXNzaWEJVkxBJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTA6MDAJUnVzc2lhCVZMQSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTExOjAwCS0JVkxBVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTEwOjAwCS0JVkxBVAorCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CisjIEFzaWEvS2hhbmR5Z2EgY292ZXJzIHBhcnRzIG9mICgxNCwgUlUtU0EpIFNha2hhIChZYWt1dGlhKSBSZXB1YmxpYzoKKyMgMTQtMjgJKioqKglUb21wb25za3kgRGlzdHJpY3QKKyMgMTQtMzAJKioqKglVc3QtTWF5c2t5IERpc3RyaWN0CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTItMDUtMDkpOgogIyBUb21wb25za2lqIGFuZCBVc3QnLU1hanNraWogc3dpdGNoZWQgZnJvbSBWbGFkaXZvc3RvayB0aW1lIHRvIFlha3V0c2sgdGltZQogIyBpbiAyMDExLgotIworCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTItMTEtMjUpOgogIyBTaGFua3MgYW5kIFBvdHRlbmdlciAoMjAwMykgaGFzIEtoYW5keWdhIG9uIFlha3V0c2sgdGltZS4KICMgTWFrZSBhIHdpbGQgZ3Vlc3MgdGhhdCBpdCBzd2l0Y2hlZCB0byBWbGFkaXZvc3RvayB0aW1lIGluIDIwMDQuCiAjIFRoaXMgdHJhbnNpdGlvbiBpcyBubyBkb3VidCB3cm9uZywgYnV0IHdlIGhhdmUgbm8gYmV0dGVyIGluZm8uCi0jCisKIFpvbmUgQXNpYS9LaGFuZHlnYQkgOTowMjoxMyAtCUxNVAkxOTE5IERlYyAxNQogCQkJIDg6MDAJLQlZQUtUCTE5MzAgSnVuIDIxICMgWWFrdXRzayBUaW1lCi0JCQkgOTowMAlSdXNzaWEJWUFLJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgODowMAlSdXNzaWEJWUFLJXNUCTE5OTIgSmFuIDE5IDI6MDBzCisJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAgMjowMHMKIAkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMjAwNAotCQkJMTA6MDAJUnVzc2lhCVZMQSVzVAkyMDExIE1hciAyNyAyOjAwcwotCQkJMTE6MDAJLQlWTEFUCTIwMTEgU2VwIDEzIDA6MDBzICMgRGVjcmVlIDcyNT8KLQkJCTEwOjAwCS0JWUFLVAorCQkJMTA6MDAJUnVzc2lhCVZMQSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTExOjAwCS0JVkxBVAkyMDExIFNlcCAxMyAgMDowMHMgIyBEZWNyZWUgNzI1PworCQkJMTA6MDAJLQlZQUtUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDk6MDAJLQlZQUtUCiAKLSMKLSMgU2FraGFsaW5za2F5YSBvYmxhc3QnLgotIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBZdXpobm8tU2FraGFsaW5zaywgYnV0IHRoYXQncyB0b28gbG9uZy4KKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKKyMgQXNpYS9TYWtoYWxpbiBjb3ZlcnMuLi4KKyMgNjUJUlUtU0FLCVNha2hhbGluIE9ibGFzdAorIyAuLi53aXRoIHRoZSBleGNlcHRpb24gb2Y6CisjIDY1LTExCSoqKioJU2V2ZXJvLUt1cmlsc2t5IERpc3RyaWN0IChOb3J0aCBLdXJpbCBJc2xhbmRzKQorCisjIFRoZSBab25lIG5hbWUgc2hvdWxkIGJlIEFzaWEvWXV6aG5vLVNha2hhbGluc2ssIGJ1dCB0aGF0J3MgdG9vIGxvbmcuCiBab25lIEFzaWEvU2FraGFsaW4JIDk6MzA6NDggLQlMTVQJMTkwNSBBdWcgMjMKLQkJCSA5OjAwCS0JQ0pUCTE5MzgKKwkJCSA5OjAwCS0JSkNTVAkxOTM3IE9jdCAgMQogCQkJIDk6MDAJLQlKU1QJMTk0NSBBdWcgMjUKLQkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5MSBNYXIgMzEgMjowMHMgIyBTYWtoYWxpbiBULgotCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCVNBSyVzVAkxOTk3IE1hciBsYXN0U3VuIDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJU0FLJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkxMTowMAktCVNBS1QKLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMy0xMC0xOCk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgTWFnYWRhbnNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgU2FraGEgKFlha3V0aXlhKS4KLSMgUHJvYmFibHkgYWxzbzogS3VyaWwgSXNsYW5kcy4KKwkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5MSBNYXIgMzEgIDI6MDBzICMgU2FraGFsaW4gVAorCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5NyBNYXIgbGFzdFN1biAgMjowMHMKKwkJCTEwOjAwCVJ1c3NpYQlTQUslc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMTowMAktCVNBS1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkxMDowMAktCVNBS1QKIAotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKLSMgVGhlIFNha2hhIGRpc3RyaWN0cyBhcmU6IEFieWpza2lqLCBBbGxhaWtob3Zza2lqLCBWZXJraGhobmVrb2x5bXNraWosIE1vbXNraWosCi0jIE5pemhuZWtvbHltc2tpaiwgLi4uIFNyZWRuZWtvbHltc2tpai4KKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKKyMgQXNpYS9NYWdhZGFuIGNvdmVycy4uLgorIyA0OQlSVS1NQUcJTWFnYWRhbiBPYmxhc3QKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTA2KSwgcGVyIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxNC0wNy0wMik6CisjIE1hZ2FkYW4gT2JsYXN0IGlzIG1vdmluZyBmcm9tIFVUQysxMiB0byBVVEMrMTAgb24gMjAxNC0xMC0yNjsgaG93ZXZlciwKKyMgc2V2ZXJhbCBkaXN0cmljdHMgb2YgU2FraGEgUmVwdWJsaWMgYXMgd2VsbCBhcyBTZXZlcm8tS3VyaWxza3kgRGlzdHJpY3Qgb2YKKyMgdGhlIFNha2hhbGluIE9ibGFzdCAoYWxzbyBrbm93biBhcyB0aGUgTm9ydGggS3VyaWwgSXNsYW5kcyksIHJlcHJlc2VudGVkCisjIHVudGlsIG5vdyBieSBBc2lhL01hZ2FkYW4sIHdpbGwgaW5zdGVhZCBtb3ZlIHRvIFVUQysxMS4gIFRoZXNlIHJlZ2lvbnMgd2lsbAorIyBuZWVkIHRoZWlyIG93biB6b25lLgorCiBab25lIEFzaWEvTWFnYWRhbgkxMDowMzoxMiAtCUxNVAkxOTI0IE1heSAgMgogCQkJMTA6MDAJLQlNQUdUCTE5MzAgSnVuIDIxICMgTWFnYWRhbiBUaW1lCi0JCQkxMTowMAlSdXNzaWEJTUFHJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJTUFHJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJTUFHJXNUCTIwMTEgTWFyIDI3IDI6MDBzCi0JCQkxMjowMAktCU1BR1QKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMDowMAlSdXNzaWEJTUFHJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEyOjAwCS0JTUFHVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTEwOjAwCS0JTUFHVAorCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNik6CisjIEFzaWEvU3JlZG5la29seW1zayBjb3ZlcnMgcGFydHMgb2YgKDE0LCBSVS1TQSkgU2FraGEgKFlha3V0aWEpIFJlcHVibGljOgorIyAxNC0wMQkqKioqCUFieXlza3kgRGlzdHJpY3QKKyMgMTQtMDMJKioqKglBbGxhaWtob3Zza3kgRGlzdHJpY3QKKyMgMTQtMDgJKioqKglWZXJraG5la29seW1za3kgRGlzdHJpY3QKKyMgMTQtMTcJKioqKglNb21za3kgRGlzdHJpY3QKKyMgMTQtMjAJKioqKglOaXpobmVrb2x5bXNreSBEaXN0cmljdAorIyAxNC0yNQkqKioqCVNyZWRuZWtvbHltc2t5IERpc3RyaWN0CisjCisjIC4uLmFuZCBwYXJ0cyBvZiAoNjUsIFJVLVNBSykgU2FraGFsaW4gT2JsYXN0OgorIyA2NS0xMQkqKioqCVNldmVyby1LdXJpbHNreSBEaXN0cmljdCAoTm9ydGggS3VyaWwgSXNsYW5kcykKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAyKToKKyMgT3lteWFrb25za3kgRGlzdHJpY3Qgb2YgU2FraGEgUmVwdWJsaWMgKHJlcHJlc2VudGVkIGJ5IFVzdC1OZXJhKSwgYWxvbmcgd2l0aAorIyBtb3N0IG9mIFNha2hhbGluIE9ibGFzdCAocmVwcmVzZW50ZWQgYnkgU2FraGFsaW4pIHdpbGwgYmUgbW92aW5nIHRvIFVUQysxMCBvbgorIyAyMDE0LTEwLTI2IHRvIHN0YXkgYWxpZ25lZCB3aXRoIFZMQVQvU0FLVDsgaG93ZXZlciwgU2V2ZXJvLUt1cmlsc2t5IERpc3RyaWN0CisjIG9mIHRoZSBTYWtoYWxpbiBPYmxhc3QgKGFsc28ga25vd24gYXMgdGhlIE5vcnRoIEt1cmlsIElzbGFuZHMsIHJlcHJlc2VudGVkIGJ5CisjIFNldmVyby1LdXJpbHNrKSB3aWxsIHJlbWFpbiBvbiBVVEMrMTEuCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNik6CisjIEFzc3VtZSBOb3J0aCBLdXJpbCBJc2xhbmRzIGhhdmUgaGlzdG9yeSBsaWtlIE1hZ2FkYW4gYmVmb3JlIDIwMTEtMDMtMjcuCisjIFRoZXJlIGlzIGEgZGVjZW50IGNoYW5jZSB0aGlzIGlzIHdyb25nLCBpbiB3aGljaCBjYXNlIGEgbmV3IHpvbmUKKyMgQXNpYS9TZXZlcm8tS3VyaWxzayB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LgorIworIyBTcmVkbmVrb2x5bXNrIGFuZCBaeXJ5YW5rYSBhcmUgdGhlIG1vc3QgcG9wdWxvdXMgcGxhY2VzIGFtb25nc3QgdGhlc2UKKyMgZGlzdHJpY3RzLCBidXQgaGF2ZSB2ZXJ5IHNpbWlsYXIgcG9wdWxhdGlvbnMuICBJbiBmYWN0LCBXaWtpcGVkaWEgY3VycmVudGx5CisjIGxpc3RzIHRoZW0gYm90aCBhcyBoYXZpbmcgMzUyOCBwZW9wbGUsIGV4YWN0bHkgMTY2OCBtYWxlcyBhbmQgMTg2MCBmZW1hbGVzCisjIGVhY2ghICAoWWlrZXMhKQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93Lz90aXRsZT1TcmVkbmVrb2x5bXNreV9EaXN0cmljdCZvbGRpZD02MDM0MzUyNzYKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvdy8/dGl0bGU9VmVya2huZWtvbHltc2t5X0Rpc3RyaWN0Jm9sZGlkPTU5NDM3ODQ5MworIyBBc3N1bWUgdGhpcyBpcyBhIG1pc3Rha2UsIGFsYmVpdCBhbiBhbXVzaW5nIG9uZS4KKyMKKyMgTG9va2luZyBhdCBjZW5zdXNlcywgdGhlIHBvcHVsYXRpb25zIG9mIHRoZSB0d28gbXVuaWNpcGFsaXRpZXMgc2VlbSB0byBoYXZlCisjIGZsdWN0dWF0ZWQgcmVjZW50bHkuICBaeXJ5YW5rYSB3YXMgbW9yZSBwb3B1bG91cyB0aGFuIFNyZWRuZWtvbHltc2sgaW4gdGhlCisjIDE5ODkgYW5kIDIwMDIgY2Vuc3VzZXMsIGJ1dCBTcmVkbmVrb2x5bXNrIHdhcyBtb3JlIHBvcHVsb3VzIGluIHRoZSBtb3N0CisjIHJlY2VudCAoMjAxMCkgY2Vuc3VzLCAzNTI1IHRvIDMxNzAuICAoU2VlIHBhZ2VzIDE5NSBhbmQgMTk3IG9mCisjIGh0dHA6Ly93d3cuZ2tzLnJ1L2ZyZWVfZG9jL25ld19zaXRlL3BlcmVwaXMyMDEwL2Nyb2MvRG9jdW1lbnRzL1ZvbDEvcHViLTAxLTA1LnBkZgorIyBpbiBSdXNzaWFuLikgIEluIGFkZGl0aW9uLCBTcmVkbmVrb2x5bXNrIGFwcGVhcnMgdG8gYmUgYSBtdWNoIG9sZGVyCisjIHNldHRsZW1lbnQgYW5kIHRoZSBwb3B1bGF0aW9uIG9mIFp5cnlhbmthIHNlZW1zIHRvIGJlIGRlY2xpbmluZy4KKyMgR28gd2l0aCBTcmVkbmVrb2x5bXNrLgorIworIyBTaW5jZSBNYWdhZGFuIE9ibGFzdCBtb3ZlcyB0byBVVEMrMTAgb24gMjAxNC0xMC0yNiwgd2UgY2Fubm90IGtlZXAgdXNpbmcgTUFHVAorIyBhcyB0aGUgYWJicmV2aWF0aW9uLiAgVXNlIFNSRVQgaW5zdGVhZC4KKworWm9uZSBBc2lhL1NyZWRuZWtvbHltc2sJMTA6MTQ6NTIgLQlMTVQJMTkyNCBNYXkgIDIKKwkJCTEwOjAwCS0JTUFHVAkxOTMwIEp1biAyMSAjIE1hZ2FkYW4gVGltZQorCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTEwOjAwCVJ1c3NpYQlNQUclc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJTUFHJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTI6MDAJLQlNQUdUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJMTE6MDAJLQlTUkVUCSMgU3JlZG5la29seW1zayBUaW1lCisKKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKKyMgQXNpYS9Vc3QtTmVyYSBjb3ZlcnMgcGFydHMgb2YgKDE0LCBSVS1TQSkgU2FraGEgKFlha3V0aWEpIFJlcHVibGljOgorIyAxNC0yMgkqKioqCU95bXlha29uc2t5IERpc3RyaWN0CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTItMDUtMDkpOgotIyBPam15YWtvbnNraWogYW5kIHRoZSBLdXJpbCBJc2xhbmRzIHN3aXRjaGVkIGZyb20KKyMgT2pteWFrb25za2lqIFthbmQgdGhlIEt1cmlsIElzbGFuZHNdIHN3aXRjaGVkIGZyb20KICMgTWFnYWRhbiB0aW1lIHRvIFZsYWRpdm9zdG9rIHRpbWUgaW4gMjAxMS4KKyMKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNiksIHBlciBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTQtMDctMDIpOgorIyBJdCdzIHVubGlrZWx5IHRoYXQgYW55IG9mIHRoZSBLdXJpbCBJc2xhbmRzIHdlcmUgaW52b2x2ZWQgaW4gc3VjaCBhIHN3aXRjaCwKKyMgYXMgdGhlIFNvdXRoIGFuZCBNaWRkbGUgS3VyaWxzIGhhdmUgYmVlbiBvbiBVVEMrMTEgKFNBS1QpIHdpdGggdGhlIHJlc3Qgb2YKKyMgU2FraGFsaW4gT2JsYXN0IHNpbmNlIGF0IGxlYXN0IDIwMTEtMDksIGFuZCB0aGUgTm9ydGggS3VyaWxzIGhhdmUgYmVlbiBvbgorIyBVVEMrMTIgc2luY2UgYXQgbGVhc3QgdGhlbiwgdG9vLgorCiBab25lIEFzaWEvVXN0LU5lcmEJIDk6MzI6NTQgLQlMTVQJMTkxOSBEZWMgMTUKIAkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQogCQkJIDk6MDAJUnVzc2lhCVlBS1QJMTk4MSBBcHIgIDEKLQkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTEwOjAwCVJ1c3NpYQlNQUclc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMjAxMSBNYXIgMjcgMjowMHMKLQkJCTEyOjAwCS0JTUFHVAkyMDExIFNlcCAxMyAwOjAwcyAjIERlY3JlZSA3MjU/Ci0JCQkxMTowMAktCVZMQVQKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMDowMAlSdXNzaWEJTUFHJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEyOjAwCS0JTUFHVAkyMDExIFNlcCAxMyAgMDowMHMgIyBEZWNyZWUgNzI1PworCQkJMTE6MDAJLQlWTEFUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJMTA6MDAJLQlWTEFUCiAKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgS2FtY2hhdHNrYXlhIG9ibGFzdCcsIEtvcnlha3NraWogYXZ0b25vbW55aiBva3J1Zy4KKworIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KToKKyMgQXNpYS9LYW1jaGF0a2EgY292ZXJzLi4uCisjIDkxCVJVLUtBTQlLYW1jaGF0a2EgS3JhaQogIwotIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBBc2lhL1BldHJvcGF2bG92c2stS2FtY2hhdHNraSwgYnV0IHRoYXQncyB0b28gbG9uZy4KKyMgTm90ZTogRWZmZWN0aXZlIDIwMDctMDctMDEsICg0MSkgS2FtY2hhdGthIE9ibGFzdCBhbmQgKDgyKSBLb3J5YWsKKyMgQXV0b25vbW91cyBPa3J1ZyBtZXJnZWQgdG8gZm9ybSAoOTEsIFJVLUtBTSkgS2FtY2hhdGthIEtyYWkuCisKKyMgVGhlIFpvbmUgbmFtZSBzaG91bGQgYmUgQXNpYS9QZXRyb3BhdmxvdnNrLUthbWNoYXRza2kgb3IgcGVyaGFwcworIyBBc2lhL1BldHJvcGF2bG92c2stS2FtY2hhdHNreSwgYnV0IHRoZXNlIGFyZSB0b28gbG9uZy4KIFpvbmUgQXNpYS9LYW1jaGF0a2EJMTA6MzQ6MzYgLQlMTVQJMTkyMiBOb3YgMTAKIAkJCTExOjAwCS0JUEVUVAkxOTMwIEp1biAyMSAjIFAtSyBUaW1lCi0JCQkxMjowMAlSdXNzaWEJUEVUJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJUEVUJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkxMjowMAlSdXNzaWEJUEVUJXNUCTIwMTAgTWFyIDI4IDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJUEVUJXNUCTIwMTEgTWFyIDI3IDI6MDBzCisJCQkxMjowMAlSdXNzaWEJUEVUJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCVBFVCVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTEyOjAwCVJ1c3NpYQlQRVQlc1QJMjAxMCBNYXIgMjggIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJUEVUJXNUCTIwMTEgTWFyIDI3ICAyOjAwcwogCQkJMTI6MDAJLQlQRVRUCi0jCi0jIENodWtvdHNraWogYXZ0b25vbW55aiBva3J1ZworCisKKyMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CisjIEFzaWEvQW5hZHlyIGNvdmVycy4uLgorIyA4NwlSVS1DSFUJQ2h1a290a2EgQXV0b25vbW91cyBPa3J1ZworCiBab25lIEFzaWEvQW5hZHlyCTExOjQ5OjU2IC0JTE1UCTE5MjQgTWF5ICAyCiAJCQkxMjowMAktCUFOQVQJMTkzMCBKdW4gMjEgIyBBbmFkeXIgVGltZQotCQkJMTM6MDAJUnVzc2lhCUFOQSVzVAkxOTgyIEFwciAgMSAwOjAwcwotCQkJMTI6MDAJUnVzc2lhCUFOQSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCUFOQSVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTI6MDAJUnVzc2lhCUFOQSVzVAkyMDEwIE1hciAyOCAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCUFOQSVzVAkyMDExIE1hciAyNyAyOjAwcworCQkJMTM6MDAJUnVzc2lhCUFOQSVzVAkxOTgyIEFwciAgMSAgMDowMHMKKwkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJQU5BJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTI6MDAJUnVzc2lhCUFOQSVzVAkyMDEwIE1hciAyOCAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlBTkElc1QJMjAxMSBNYXIgMjcgIDI6MDBzCiAJCQkxMjowMAktCUFOQVQKIAorCiAjIFNhbiBNYXJpbm8KICMgU2VlIEV1cm9wZS9Sb21lLgogCkBAIC0yNDg4LDExICsyODQxLDExIEBACiBab25lCUV1cm9wZS9CZWxncmFkZQkxOjIyOjAwCS0JTE1UCTE4ODQKIAkJCTE6MDAJLQlDRVQJMTk0MSBBcHIgMTggMjM6MDAKIAkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NQotCQkJMTowMAktCUNFVAkxOTQ1IE1heSA4IDI6MDBzCisJCQkxOjAwCS0JQ0VUCTE5NDUgTWF5ICA4ICAyOjAwcwogCQkJMTowMAkxOjAwCUNFU1QJMTk0NSBTZXAgMTYgIDI6MDBzCi0jIE1ldG9kIEtvemVsaiByZXBvcnRzIHRoYXQgdGhlIGxlZ2FsIGRhdGUgb2YKKyMgTWV0b2QgS2/FvmVsaiByZXBvcnRzIHRoYXQgdGhlIGxlZ2FsIGRhdGUgb2YKICMgdHJhbnNpdGlvbiB0byBFVSBydWxlcyB3YXMgMTk4Mi0xMS0yNywgZm9yIGFsbCBvZiBZdWdvc2xhdmlhIGF0IHRoZSB0aW1lLgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZG9uJ3QgZ2l2ZSBhcyBtdWNoIGRldGFpbCwgc28gZ28gd2l0aCBLb3plbGouCisjIFNoYW5rcyAmIFBvdHRlbmdlciBkb24ndCBnaXZlIGFzIG11Y2ggZGV0YWlsLCBzbyBnbyB3aXRoIEtvxb5lbGouCiAJCQkxOjAwCS0JQ0VUCTE5ODIgTm92IDI3CiAJCQkxOjAwCUVVCUNFJXNUCiBMaW5rIEV1cm9wZS9CZWxncmFkZSBFdXJvcGUvTGp1YmxqYW5hCSMgU2xvdmVuaWEKQEAgLTI1NjgsMTMgKzI5MjEsMTMgQEAKIAkJCSAwOjAwCTE6MDAJV0VTVAkxOTE4IE9jdCAgNyAyMzowMAogCQkJIDA6MDAJLQlXRVQJMTkyNAogCQkJIDA6MDAJU3BhaW4JV0Ulc1QJMTkyOQotCQkJIDA6MDAgU3BhaW5BZnJpY2EgV0Ulc1QgMTk4NCBNYXIgMTYKKwkJCSAwOjAwIFNwYWluQWZyaWNhIFdFJXNUCTE5ODQgTWFyIDE2CiAJCQkgMTowMAktCUNFVAkxOTg2CiAJCQkgMTowMAlFVQlDRSVzVAogWm9uZQlBdGxhbnRpYy9DYW5hcnkJLTE6MDE6MzYgLQlMTVQJMTkyMiBNYXIgIyBMYXMgUGFsbWFzIGRlIEdyYW4gQy4KLQkJCS0xOjAwCS0JQ0FOVAkxOTQ2IFNlcCAzMCAxOjAwICMgQ2FuYXJpZXMgVGltZQotCQkJIDA6MDAJLQlXRVQJMTk4MCBBcHIgIDYgMDowMHMKLQkJCSAwOjAwCTE6MDAJV0VTVAkxOTgwIFNlcCAyOCAwOjAwcworCQkJLTE6MDAJLQlDQU5UCTE5NDYgU2VwIDMwICAxOjAwICMgQ2FuYXJpZXMgVAorCQkJIDA6MDAJLQlXRVQJMTk4MCBBcHIgIDYgIDA6MDBzCisJCQkgMDowMAkxOjAwCVdFU1QJMTk4MCBTZXAgMjggIDA6MDBzCiAJCQkgMDowMAlFVQlXRSVzVAogIyBJQVRBIFNTSU0gKDE5OTYtMDkpIHNheXMgdGhlIENhbmFyaWVzIHN3aXRjaCBhdCAyOjAwdSwgbm90IDE6MDB1LgogIyBJZ25vcmUgdGhpcyBmb3Igbm93LCBhcyB0aGUgQ2FuYXJpZXMgYXJlIHBhcnQgb2YgdGhlIEVVLgpAQCAtMjU4Myw3ICsyOTM2LDcgQEAKIAogIyBGcm9tIEl2YW4gTmlsc3NvbiAoMjAwMS0wNC0xMyksIHN1cGVyc2VkaW5nIFNoYW5rcyAmIFBvdHRlbmdlcjoKICMKLSMgVGhlIGxhdyAiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTg3OCwgbm8gMTQiIGFib3V0IHN0YW5kYXJkIHRpbWUgaW4gMTg3OToKKyMgVGhlIGxhdyAiU3ZlbnNrIGbDtnJmYXR0bmluZ3NzYW1saW5nIDE4NzgsIG5vIDE0IiBhYm91dCBzdGFuZGFyZCB0aW1lIGluIDE4Nzk6CiAjIEZyb20gdGhlIGJlZ2lubmluZyBvZiAxODc5ICh0aGF0IGlzIDAxLTAxIDAwOjAwKSB0aGUgdGltZSBmb3IgYWxsCiAjIHBsYWNlcyBpbiB0aGUgY291bnRyeSBpcyAidGhlIG1lYW4gc29sYXIgdGltZSBmb3IgdGhlIG1lcmlkaWFuIGF0CiAjIHRocmVlIGRlZ3JlZXMsIG9yIHR3ZWx2ZSBtaW51dGVzIG9mIHRpbWUsIHRvIHRoZSB3ZXN0IG9mIHRoZQpAQCAtMjU5NCw3ICsyOTQ3LDcgQEAKICMgbmF0aW9uYWwgc3RhbmRhcmQgdGltZSBhcyAwMTowMDoxNCBhaGVhZCBvZiBHTVQuLi4uCiAjCiAjIEFib3V0IHRoZSBiZWdpbm5pbmcgb2YgQ0VUIGluIFN3ZWRlbi4gVGhlIGxhd3RleHQgKCJTdmVuc2sKLSMgZm9yZmF0dG5pbmdzc2FtbGluZyAxODk5LCBubyA0NCIpIHN0YXRlcywgdGhhdCAiZnJvbSB0aGUgYmVnaW5uaW5nCisjIGbDtnJmYXR0bmluZ3NzYW1saW5nIDE4OTksIG5vIDQ0Iikgc3RhdGVzLCB0aGF0ICJmcm9tIHRoZSBiZWdpbm5pbmcKICMgb2YgMTkwMC4uLiAuLi4gdGhlIHNhbWUgYXMgdGhlIG1lYW4gc29sYXIgdGltZSBmb3IgdGhlIG1lcmlkaWFuIGF0CiAjIHRoZSBkaXN0YW5jZSBvZiBvbmUgaG91ciBvZiB0aW1lIGZyb20gdGhlIG1lcmlkaWFuIG9mIHRoZSBFbmdsaXNoCiAjIG9ic2VydmF0b3J5IGF0IEdyZWVud2ljaCwgb3IgYXQgMTIgbWludXRlcyAxNCBzZWNvbmRzIHRvIHRoZSB3ZXN0CkBAIC0yNjAyLDcgKzI5NTUsNyBAQAogIyAxODk5LTA2LTE2LiAgSW4gc2hvcnQ6IEF0IDE5MDAtMDEtMDEgMDA6MDA6MDAgdGhlIG5ldyBzdGFuZGFyZCB0aW1lCiAjIGluIFN3ZWRlbiBpcyAwMTowMDowMCBhaGVhZCBvZiBHTVQuCiAjCi0jIDE5MTY6IFRoZSBsYXd0ZXh0ICgiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTkxNiwgbm8gMTI0Iikgc3RhdGVzCisjIDE5MTY6IFRoZSBsYXd0ZXh0ICgiU3ZlbnNrIGbDtnJmYXR0bmluZ3NzYW1saW5nIDE5MTYsIG5vIDEyNCIpIHN0YXRlcwogIyB0aGF0ICIxOTE2LTA1LTE1IGlzIGNvbnNpZGVyZWQgdG8gYmVnaW4gb25lIGhvdXIgZWFybGllciIuIEl0IGlzCiAjIHByZXR0eSBvYnZpb3VzIHRoYXQgYXQgMDUtMTQgMjM6MDAgdGhlIGNsb2NrcyBhcmUgc2V0IHRvIDA1LTE1IDAwOjAwLi4uLgogIyBGdXJ0aGVyIHRoZSBsYXcgc2F5cywgdGhhdCAiMTkxNi0wOS0zMCBpcyBjb25zaWRlcmVkIHRvIGVuZCBvbmUgaG91ciBsYXRlciIuCkBAIC0yNjEyLDcgKzI5NjUsNyBAQAogIyBub3QgYXZhaWxhYmxlIG9uIHRoZSBzaXRlICh0byBteSBrbm93bGVkZ2UgdGhleSBhcmUgb25seSBhdmFpbGFibGUKICMgaW4gU3dlZGlzaCk6IDxodHRwOi8vd3d3LnJpa3NkYWdlbi5zZS9lbmdsaXNoL3dvcmsvc2ZzdC5hc3A+ICh0eXBlCiAjICJzb21tYXJ0aWQiIHdpdGhvdXQgdGhlIHF1b3RlcyBpbiB0aGUgZmllbGQgIkZyaXRleHQiIGFuZCB0aGVuIGNsaWNrCi0jIHRoZSBTb2stYnV0dG9uKS4KKyMgdGhlIFPDtmstYnV0dG9uKS4KICMKICMgKDIwMDEtMDUtMTMpOgogIwpAQCAtMjYyNyw5ICsyOTgwLDkgQEAKIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBFdXJvcGUvU3RvY2tob2xtCTE6MTI6MTIgLQlMTVQJMTg3OSBKYW4gIDEKLQkJCTE6MDA6MTQJLQlTRVQJMTkwMCBKYW4gIDEJIyBTd2VkaXNoIFRpbWUKKwkJCTE6MDA6MTQJLQlTRVQJMTkwMCBKYW4gIDEgIyBTd2VkaXNoIFRpbWUKIAkJCTE6MDAJLQlDRVQJMTkxNiBNYXkgMTQgMjM6MDAKLQkJCTE6MDAJMTowMAlDRVNUCTE5MTYgT2N0ICAxIDAxOjAwCisJCQkxOjAwCTE6MDAJQ0VTVAkxOTE2IE9jdCAgMSAgMTowMAogCQkJMTowMAktCUNFVAkxOTgwCiAJCQkxOjAwCUVVCUNFJXNUCiAKQEAgLTI2MzcsNyArMjk5MCw3IEBACiAjIEZyb20gSG93c2U6CiAjIEJ5IHRoZSBlbmQgb2YgdGhlIDE4dGggY2VudHVyeSBjbG9ja3MgYW5kIHdhdGNoZXMgYmVjYW1lIGNvbW1vbnBsYWNlCiAjIGFuZCB0aGVpciBwZXJmb3JtYW5jZSBpbXByb3ZlZCBlbm9ybW91c2x5LiAgQ29tbXVuaXRpZXMgYmVnYW4gdG8ga2VlcAotIyBtZWFuIHRpbWUgaW4gcHJlZmVyZW5jZSB0byBhcHBhcmVudCB0aW1lIC0tIEdlbmV2YSBmcm9tIDE3ODAgLi4uLgorIyBtZWFuIHRpbWUgaW4gcHJlZmVyZW5jZSB0byBhcHBhcmVudCB0aW1lIC0gR2VuZXZhIGZyb20gMTc4MCAuLi4uCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogIyBGcm9tIFdoaXRtYW4gKHdobyB3cml0ZXMgIk1pZG5pZ2h0PyIpOgogIyBSdWxlCVN3aXNzCTE5NDAJb25seQktCU5vdgkgMgkwOjAwCTE6MDAJUwpAQCAtMjY1Myw3ICszMDA2LDcgQEAKICMgdG8gYmUgd3JvbmcuIFRoaXMgaXMgbm93IHZlcmlmaWVkLgogIwogIyBJIGhhdmUgZm91bmQgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBydWxpbmcgYnkgdGhlIFN3aXNzIEZlZGVyYWwKLSMgZ292ZXJubWVudCwgaW4gJ0VpZGdlbltvXXNzaXNjaGUgR2VzZXR6ZXNzYW1tbHVuZyAxOTQxIGFuZCAxOTQyJyAoU3dpc3MKKyMgZ292ZXJubWVudCwgaW4gJ0VpZGdlbsO2c3Npc2NoZSBHZXNldHplc3NhbW1sdW5nIDE5NDEgYW5kIDE5NDInIChTd2lzcwogIyBmZWRlcmFsIGxhdyBjb2xsZWN0aW9uKS4uLgogIwogIyBEU1QgYmVnYW4gb24gTW9uZGF5IDUgTWF5IDE5NDEsIDE6MDAgYW0gYnkgc2hpZnRpbmcgdGhlIGNsb2NrcyB0byAyOjAwIGFtCkBAIC0yNjcyLDcgKzMwMjUsNyBAQAogIyBuaWdodCBhcyBhbiBhYnNvbHV0ZSBub3ZlbHR5LCBiZWNhdXNlIHRoaXMgd2FzIHRoZSBmaXJzdCB0aW1lIHRoYXQgc3VjaAogIyBhIHRoaW5nIGhhZCBoYXBwZW5lZCBpbiBTd2l0emVybGFuZC4KICMKLSMgSSBoYXZlIGFsc28gY2hlY2tlZCAxOTE2LCBiZWNhdXNlIG9uZSBib29rIHNvdXJjZSAoR2FicmllbCwgVHJhaXRlIGRlCisjIEkgaGF2ZSBhbHNvIGNoZWNrZWQgMTkxNiwgYmVjYXVzZSBvbmUgYm9vayBzb3VyY2UgKEdhYnJpZWwsIFRyYWl0w6kgZGUKICMgbCdoZXVyZSBkYW5zIGxlIG1vbmRlKSBjbGFpbXMgdGhhdCBTd2l0emVybGFuZCBoYWQgRFNUIGluIDE5MTYuIFRoaXMgaXMKICMgZmFsc2UsIG5vIG9mZmljaWFsIGRvY3VtZW50IGNvdWxkIGJlIGZvdW5kLiBQcm9iYWJseSBHYWJyaWVsIGdvdCBtaXNsZWQKICMgYnkgcmVmZXJlbmNlcyB0byBHZXJtYW55LCB3aGljaCBpbnRyb2R1Y2VkIERTVCBpbiAxOTE2IGZvciB0aGUgZmlyc3QgdGltZS4KQEAgLTI2ODYsMTkgKzMwMzksMTkgQEAKICMgT25lIGZ1cnRoZXIgZGV0YWlsIGZvciBTd2l0emVybGFuZCwgd2hpY2ggaXMgcHJvYmFibHkgb3V0IG9mIHNjb3BlIGZvcgogIyBtb3N0IHVzZXJzIG9mIHR6ZGF0YTogVGhlIFtFdXJvcGUvWnVyaWNoIHpvbmVdIC4uLgogIyBkZXNjcmliZXMgYWxsIG9mIFN3aXR6ZXJsYW5kIGNvcnJlY3RseSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi0jIHRoZSBDYW50b25lIEdlbmV2ZSAoR2VuZXZhLCBHZW5mKS4gQmV0d2VlbiAxODQ4IGFuZCAxODk0IEdlbmV2ZSBkaWQgbm90CisjIHRoZSBDYW50b24gZGUgR2Vuw6h2ZSAoR2VuZXZhLCBHZW5mKS4gQmV0d2VlbiAxODQ4IGFuZCAxODk0IEdlbmV2YSBkaWQgbm90CiAjIGZvbGxvdyBCZXJuIE1lYW4gVGltZSBidXQga2VwdCBpdHMgb3duIGxvY2FsIG1lYW4gdGltZS4KICMgVG8gcmVwcmVzZW50IHRoaXMsIGFuIGV4dHJhIHpvbmUgd291bGQgYmUgbmVlZGVkLgogIwogIyBGcm9tIEFsb2lzIFRyZWluZGwgKDIwMTMtMDktMTEpOgogIyBUaGUgRmVkZXJhbCByZWd1bGF0aW9ucyBzYXkKICMgaHR0cDovL3d3dy5hZG1pbi5jaC9vcGMvZGUvY2xhc3NpZmllZC1jb21waWxhdGlvbi8yMDA3MTA5Ni9pbmRleC5odG1sCi0jIC4uLiB0aGUgbWVyaWRpYW4gZm9yIEJlcm4gbWVhbiB0aW1lIC4uLiBpcyA3IGRlZ3JlZXMgMjYnMjIuNTAiLgorIyAuLi4gdGhlIG1lcmlkaWFuIGZvciBCZXJuIG1lYW4gdGltZSAuLi4gaXMgNyBkZWdyZWVzIDI2JyAyMi41MCIuCiAjIEV4cHJlc3NlZCBpbiB0aW1lLCBpdCBpcyAwaDI5bTQ1LjVzLgogCiAjIEZyb20gUGllcnJlLVl2ZXMgQmVyZ2VyICgyMDEzLTA5LTExKToKLSMgdGhlICJDaXJjdWxhaXJlIGR1IGNvbnNlaWwgZmVkZXJhbCIgKERlY2VtYmVyIDExIDE4OTMpCi0jIDxodHRwOi8vd3d3LmFtdHNkcnVja3NjaHJpZnRlbi5iYXIuYWRtaW4uY2gvdmlld09yaWdEb2MuZG8/aWQ9MTAwNzEzNTM+IC4uLgorIyB0aGUgIkNpcmN1bGFpcmUgZHUgY29uc2VpbCBmw6lkw6lyYWwiIChEZWNlbWJlciAxMSAxODkzKQorIyBodHRwOi8vd3d3LmFtdHNkcnVja3NjaHJpZnRlbi5iYXIuYWRtaW4uY2gvdmlld09yaWdEb2MuZG8/aWQ9MTAwNzEzNTMKICMgY2xlYXJseSBzdGF0ZXMgdGhhdCB0aGUgWzE4OTQtMDYtMDFdIGNoYW5nZSBzaG91bGQgYmUgZG9uZSBhdCBtaWRuaWdodAogIyBidXQgaWYgbm8gb25lIGlzIHByZXNlbnQgYWZ0ZXIgMTEgYXQgbmlnaHQsIGNvdWxkIGJlIHBvc3Rwb25lZCB1bnRpbCBvbmUKICMgaG91ciBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiBzZXJ2aWNlLgpAQCAtMjcwOSwxNCArMzA2MiwxNCBAQAogIyBXZSBjYW4gZmluZCBubyByZWxpYWJsZSBzb3VyY2UgZm9yIFNoYW5rcydzIGFzc2VydGlvbiB0aGF0IGFsbCBvZiBTd2l0emVybGFuZAogIyBleGNlcHQgR2VuZXZhIHN3aXRjaGVkIHRvIEJlcm4gTWVhbiBUaW1lIGF0IDAwOjAwIG9uIDE4NDgtMDktMTIuICBUaGlzIGJvb2s6CiAjCi0jCUpha29iIE1lc3NlcmxpLiBHbGVpY2htYXNzaWcsIHB1bmt0bGljaCwgc2NobmVsbDogWmVpdGVpbnRlaWx1bmcgdW5kCisjCUpha29iIE1lc3NlcmxpLiBHbGVpY2htw6Rzc2lnLCBww7xua3RsaWNoLCBzY2huZWxsLiBaZWl0ZWludGVpbHVuZyB1bmQKICMJWmVpdGdlYnJhdWNoIGluIGRlciBTY2h3ZWl6IGltIDE5LiBKYWhyaHVuZGVydC4gQ2hyb25vcywgWnVyaWNoIDE5OTUsCiAjCUlTQk4gMy05MDUzMTEtNjgtMiwgT0NMQyA3MTc1NzA3OTcuCiAjCiAjIHN1Z2dlc3RzIHRoYXQgdGhlIHRyYW5zaXRpb24gd2FzIG1vcmUgZ3JhZHVhbCwgYW5kIHRoYXQgdGhlIFN3aXNzIGRpZCBub3QKICMgYWdyZWUgYWJvdXQgY2l2aWwgdGltZSBkdXJpbmcgdGhlIHRyYW5zaXRpb24uICBUaGUgdGltZWtlZXBpbmcgaXQgZ2l2ZXMgdGhlCiAjIG1vc3QgZGV0YWlsIGZvciBpcyBwb3N0YWwgYW5kIHRlbGVncmFwaCB0aW1lOiBoZXJlLCBmZWRlcmFsIGxlZ2lzbGF0aW9uICh0aGUKLSMgIkJ1bmRlc2dlc2V0eiB1YmVyIGRpZSBFcnN0ZWxsdW5nIHZvbiBlbGVrdHJpc2NoZW4gVGVsZWdyYXBoZW4iKSBwYXNzZWQgb24KKyMgIkJ1bmRlc2dlc2V0eiDDvGJlciBkaWUgRXJzdGVsbHVuZyB2b24gZWxla3RyaXNjaGVuIFRlbGVncmFwaGVuIikgcGFzc2VkIG9uCiAjIDE4NTEtMTEtMjMsIGFuZCBhbiBvZmZpY2lhbCBpbXBsZW1lbnRhdGlvbiBub3RpY2Ugd2FzIHB1Ymxpc2hlZCAxODUzLTA3LTE2CiAjIChCdW5kZXNibGF0dCAxODUzLCBCZC4gSUksIFMuIDg1OSkuICBPbiBwIDcyIE1lc3NlcmxpIHdyaXRlcyB0aGF0IGluCiAjIHByYWN0aWNlIHNpbmNlIEp1bHkgMTg1MyBCZXJuZXNlIHRpbWUgd2FzIHVzZWQgaW4gImFsbCBwb3N0YWwgYW5kIHRlbGVncmFwaApAQCAtMjczMCw3ICszMDgzLDcgQEAKIFJ1bGUJU3dpc3MJMTk0MQkxOTQyCS0JT2N0CU1vbj49MQkyOjAwCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvWnVyaWNoCTA6MzQ6MDggLQlMTVQJMTg1MyBKdWwgMTYgIyBTZWUgYWJvdmUgY29tbWVudC4KLQkJCTA6Mjk6NDYJLQlCTVQJMTg5NCBKdW4gIyBCZXJuIE1lYW4gVGltZQorCQkJMDoyOTo0NgktCUJNVAkxODk0IEp1biAgICAjIEJlcm4gTWVhbiBUaW1lCiAJCQkxOjAwCVN3aXNzCUNFJXNUCTE5ODEKIAkJCTE6MDAJRVUJQ0Ulc1QKIApAQCAtMjczOCw3ICszMDkxLDcgQEAKIAogIyBGcm9tIEFtYXIgRGV2ZWdvd2RhICgyMDA3LTAxLTAzKToKICMgVGhlIHRpbWUgem9uZSBydWxlcyBmb3IgSXN0YW5idWwsIFR1cmtleSBoYXZlIG5vdCBiZWVuIGNoYW5nZWQgZm9yIHllYXJzIG5vdy4KLSMgLi4uIFRoZSBsYXRlc3QgcnVsZXMgYXJlIGF2YWlsYWJsZSBhdCAtCisjIC4uLiBUaGUgbGF0ZXN0IHJ1bGVzIGFyZSBhdmFpbGFibGUgYXQ6CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svdGltZXpvbmUuaHRtbD9uPTEwNwogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0wMS0wMyk6CiAjIEkgaGF2ZSBiZWVuIGFibGUgdG8gZmluZCBwcmVzcyByZWNvcmRzIGJhY2sgdG8gMTk5NiB3aGljaCBhbGwgc2F5IHRoYXQKQEAgLTI3NjMsOCArMzExNiw3IEBACiAjIChvbiBhIG5vbi1nb3Zlcm5tZW50IHNlcnZlciB0aG91Z2gpIGRlc2NyaWJpbmcgZGF0ZXMgYmV0d2VlbiAyMDAyIGFuZCAyMDA2OgogIyBodHRwOi8vd3d3LmFsb21hbGl5ZS5jb20vYmtrXzIwMDJfMzc2OS5odG0KIAotIyBGcm9tIEcmb3VtbDtrZGVuaXogS2FyYWRhJiN4MDExZjsgKDIwMTEtMDMtMTApOgotIworIyBGcm9tIEfDtmtkZW5peiBLYXJhZGHEnyAoMjAxMS0wMy0xMCk6CiAjIEFjY29yZGluZyB0byB0aGUgYXJ0aWNsZXMgbGlua2VkIGJlbG93LCBUdXJrZXkgd2lsbCBjaGFuZ2UgaW50byBzdW1tZXIKICMgdGltZSB6b25lIChHTVQrMykgb24gTWFyY2ggMjgsIDIwMTEgYXQgMzowMCBhLm0uIGluc3RlYWQgb2YgTWFyY2ggMjcuCiAjIFRoaXMgY2hhbmdlIGlzIGR1ZSB0byBhIG5hdGlvbndpZGUgZXhhbSBvbiAyN3RoLgpAQCAtMjc3Nyw5ICszMTI5LDE2IEBACiAjIFR1cmtpc2ggTG9jYWwgZWxlY3Rpb24uLi4uCiAjIGh0dHA6Ly93d3cuc2FiYWguY29tLnRyL0Vrb25vbWkvMjAxNC8wMi8xMi95YXotc2FhdGluZGUtb25lbWxpLWRlZ2lzaWtsaWsKICMgLi4uIHNvIFR1cmtleSB3aWxsIG1vdmUgY2xvY2tzIGZvcndhcmQgb25lIGhvdXIgb24gTWFyY2ggMzEgYXQgMzowMCBhLm0uCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDItMTcpOgotIyBIZXJlIGlzIGFuIEVuZ2xpc2gtbGFuZ3VhZ2Ugc291cmNlOgotIyBodHRwOi8vd3d3LndvcmxkYnVsbGV0aW4ubmV0L3R1cmtleS8xMjkwMTYvdHVya2V5LXN3aXRjaGVzLXRvLWRheWxpZ2h0LXNhdmluZy10aW1lLW1hcmNoLTMxCisjIEZyb20gUmFuZGFsIEwuIFNjaHdhcnR6ICgyMDE0LTA0LTE1KToKKyMgSGF2aW5nIGxhbmRlZCBvbiBhIGZsaWdodCBmcm9tIHRoZSBzdGF0ZXMgdG8gSXN0YW5idWwgKHZpYSBBTVMpIG9uIE1hcmNoIDMxLAorIyBJIGNhbiB0ZWxsIHlvdSB0aGF0IE5PQk9EWSAoZXZlbiB0aGUgYWlybGluZXMpIHJlc3BlY3RlZCB0aGlzIHRpbWV6b25lIERTVAorIyBjaGFuZ2UgZGVsYXkuICBNYXliZSB0aGUgd29yZCBqdXN0IGRpZG4ndCBnZXQgb3V0IGluIHRpbWUuCisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDYtMTUpOgorIyBUaGUgcHJlc3MgcmVwb3J0ZWQgbWFzc2l2ZSBjb25mdXNpb24sIGFzIGVsZWN0aW9uIG9mZmljaWFscyBvYmV5ZWQgdGhlIHJ1bGUKKyMgY2hhbmdlIGJ1dCBjZWxsIHBob25lcyAoYW5kIGFpcmxpbmUgYmFnZ2FnZSBzeXN0ZW1zKSBkaWQgbm90LiAgU2VlOgorIyBLb3N0aWRpcyBNLiBFdmVudGZ1bCBlbGVjdGlvbnMgaW4gVHVya2V5LiBCYWxrYW4gTmV3cyBBZ2VuY3kKKyMgaHR0cDovL3d3dy5iYWxrYW5ldS5jb20vZXZlbnRmdWwtZWxlY3Rpb25zLXR1cmtleS8gMjAxNC0wMy0zMC4KKyMgSSBndWVzcyB0aGUgYmVzdCB3ZSBjYW4gZG8gaXMgZG9jdW1lbnQgdGhlIG9mZmljaWFsIHRpbWUuCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCVR1cmtleQkxOTE2CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCVMKQEAgLTI4NDYsMTAgKzMyMDUsMTAgQEAKIAkJCTI6MDAJVHVya2V5CUVFJXNUCTE5NzggT2N0IDE1CiAJCQkzOjAwCVR1cmtleQlUUiVzVAkxOTg1IEFwciAyMCAjIFR1cmtleSBUaW1lCiAJCQkyOjAwCVR1cmtleQlFRSVzVAkyMDA3Ci0JCQkyOjAwCUVVCUVFJXNUCTIwMTEgTWFyIDI3IDE6MDB1Ci0JCQkyOjAwCS0JRUVUCTIwMTEgTWFyIDI4IDE6MDB1Ci0JCQkyOjAwCUVVCUVFJXNUCTIwMTQgTWFyIDMwIDE6MDB1Ci0JCQkyOjAwCS0JRUVUCTIwMTQgTWFyIDMxIDE6MDB1CisJCQkyOjAwCUVVCUVFJXNUCTIwMTEgTWFyIDI3ICAxOjAwdQorCQkJMjowMAktCUVFVAkyMDExIE1hciAyOCAgMTowMHUKKwkJCTI6MDAJRVUJRUUlc1QJMjAxNCBNYXIgMzAgIDE6MDB1CisJCQkyOjAwCS0JRUVUCTIwMTQgTWFyIDMxICAxOjAwdQogCQkJMjowMAlFVQlFRSVzVAogTGluawlFdXJvcGUvSXN0YW5idWwJQXNpYS9Jc3RhbmJ1bAkjIElzdGFuYnVsIGlzIGluIGJvdGggY29udGluZW50cy4KIApAQCAtMjg3MCw3ICszMjI5LDcgQEAKICMgQmlsbCBudW1iZXIgODMzMCBvZiBNUCBmcm9tIHRoZSBQYXJ0eSBvZiBSZWdpb25zIE9sZWcgTmFkb3NoaSBnb3QKICMgYXBwcm92YWwgZnJvbSAyNjYgZGVwdXRpZXMuCiAjCi0jIFVrcmFpbmUgYWJvbGlzaGVzIHRyYW5zdGVyIGJhY2sgdG8gdGhlIHdpbnRlciB0aW1lIChpbiBSdXNzaWFuKQorIyBVa3JhaW5lIGFib2xpc2hlcyB0cmFuc2ZlciBiYWNrIHRvIHRoZSB3aW50ZXIgdGltZSAoaW4gUnVzc2lhbikKICMgaHR0cDovL25ld3MubWFpbC5ydS9wb2xpdGljcy82ODYxNTYwLwogIwogIyBUaGUgVWtyYWluaWFucyB3aWxsIG5vIGxvbmdlciBjaGFuZ2UgdGhlIGNsb2NrIChpbiBSdXNzaWFuKQpAQCAtMjkzMSwxMiArMzI5MCwxMiBAQAogCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQogCQkJMzowMAktCU1TSwkxOTQxIFNlcCAyMAogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQzIE5vdiAgNgotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwIEp1bCAgMSAyOjAwCi0JCQkyOjAwCTE6MDAJRUVTVAkxOTkxIFNlcCAyOSAzOjAwCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAgSnVsICAxICAyOjAwCisJCQkyOjAwCTE6MDAJRUVTVAkxOTkxIFNlcCAyOSAgMzowMAogCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1CiAJCQkyOjAwCUVVCUVFJXNUCiAjIFJ1dGhlbmlhIHVzZWQgQ0VUIDE5OTAvMTk5MS4KLSMgIlV6aGhvcm9kIiBpcyB0aGUgdHJhbnNsaXRlcmF0aW9uIG9mIHRoZSBVa3JhaW5pYW4gbmFtZSwgYnV0CisjICJVemhob3JvZCIgaXMgdGhlIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGUgUnVzeW4vVWtyYWluaWFuIHByb251bmNpYXRpb24sIGJ1dAogIyAiVXpoZ29yb2QiIGlzIG1vcmUgY29tbW9uIGluIEVuZ2xpc2guCiBab25lIEV1cm9wZS9Vemhnb3JvZAkxOjI5OjEyIC0JTE1UCTE4OTAgT2N0CiAJCQkxOjAwCS0JQ0VUCTE5NDAKQEAgLTI5NDQsOCArMzMwMyw4IEBACiAJCQkxOjAwCTE6MDAJQ0VTVAkxOTQ0IE9jdCAyNgogCQkJMTowMAktCUNFVAkxOTQ1IEp1biAyOQogCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCi0JCQkzOjAwCS0JTVNLCTE5OTAgSnVsICAxIDI6MDAKLQkJCTE6MDAJLQlDRVQJMTk5MSBNYXIgMzEgMzowMAorCQkJMzowMAktCU1TSwkxOTkwIEp1bCAgMSAgMjowMAorCQkJMTowMAktCUNFVAkxOTkxIE1hciAzMSAgMzowMAogCQkJMjowMAktCUVFVAkxOTkyCiAJCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTUKIAkJCTI6MDAJRVUJRUUlc1QKQEAgLTI5NTksNDIgKzMzMTgsOSBAQAogCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQogCQkJMzowMAktCU1TSwkxOTQxIEF1ZyAyNQogCQkJMTowMAlDLUV1cglDRSVzVAkxOTQzIE9jdCAyNQotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwCisJCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTEgTWFyIDMxICAyOjAwCiAJCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTUKIAkJCTI6MDAJRVUJRUUlc1QKLSMgQ2VudHJhbCBDcmltZWEgdXNlZCBNb3Njb3cgdGltZSAxOTk0LzE5OTcuCi1ab25lIEV1cm9wZS9TaW1mZXJvcG9sCTI6MTY6MjQgLQlMTVQJMTg4MAotCQkJMjoxNgktCVNNVAkxOTI0IE1heSAgMiAjIFNpbWZlcm9wb2wgTWVhbiBUCi0JCQkyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCi0JCQkzOjAwCS0JTVNLCTE5NDEgTm92Ci0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgQXByIDEzCi0JCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAKLQkJCTM6MDAJLQlNU0sJMTk5MCBKdWwgIDEgMjowMAotCQkJMjowMAktCUVFVAkxOTkyCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBUaGUgX0Vjb25vbWlzdF8gKDE5OTQtMDUtMjgsIHAgNDUpIHJlcG9ydHMgdGhhdCBjZW50cmFsIENyaW1lYSBzd2l0Y2hlZAotIyBmcm9tIEtpZXYgdG8gTW9zY293IHRpbWUgc29tZXRpbWUgYWZ0ZXIgdGhlIEphbnVhcnkgMTk5NCBlbGVjdGlvbnMuCi0jIFNoYW5rcyAoMTk5OSkgc2F5cyAiZGF0ZSBvZiBjaGFuZ2UgdW5jZXJ0YWluIiwgYnV0IGltcGxpZXMgdGhhdCBpdCBoYXBwZW5lZAotIyBzb21ldGltZSBiZXR3ZWVuIHRoZSAxOTk0IERTVCBzd2l0Y2hlcy4gIFNoYW5rcyAmIFBvdHRlbmdlciBzaW1wbHkgc2F5Ci0jIDE5OTQtMDktMjUgMDM6MDAsIGJ1dCB0aGF0IGNhbid0IGJlIHJpZ2h0LiAgRm9yIG5vdywgZ3Vlc3MgaXQKLSMgY2hhbmdlZCBpbiBNYXkuCi0JCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTQgTWF5Ci0jIEZyb20gSUFUQSBTU0lNICgxOTk0LzE5OTcpLCB3aGljaCBhbHNvIHNheXMgdGhhdCBLZXJjaCBpcyBzdGlsbCBsaWtlIEtpZXYuCi0JCQkzOjAwCUUtRXVyCU1TSy9NU0QJMTk5NiBNYXIgMzEgMzowMHMKLQkJCTM6MDAJMTowMAlNU0QJMTk5NiBPY3QgMjcgMzowMHMKLSMgSUFUQSBTU0lNICgxOTk3LTA5KSBzYXlzIENyaW1lYSBzd2l0Y2hlZCB0byBFRVQvRUVTVC4KLSMgQXNzdW1lIGl0IGhhcHBlbmVkIGluIE1hcmNoIGJ5IG5vdCBjaGFuZ2luZyB0aGUgY2xvY2tzLgotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTk3Ci0JCQkzOjAwCS0JTVNLCTE5OTcgTWFyIGxhc3RTdW4gMTowMHUKLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTQtMDMtMTcpOgotIyB0aW1lIGNoYW5nZSBhdCAyOjAwICgyYW0pIG9uIE1hcmNoIDMwLCAyMDE0Ci0jIGh0dHA6Ly92ei5ydS9uZXdzLzIwMTQvMy8xNy82Nzc0NjQuaHRtbAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTAzLTMwKToKLSMgU2ltZmVyb3BvbCBhbmQgU2V2YXN0b3BvbCByZXBvcnRlZGx5IGNoYW5nZWQgdGhlaXIgY2VudHJhbCB0b3duIGNsb2NrcwotIyBsYXRlIHRoZSBwcmV2aW91cyBkYXksIGJ1dCB0aGlzIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGNlcmVtb25pYWwKLSMgYW5kIHRoZSBkaXNjcmVwYW5jaWVzIGFyZSBzbWFsbCBlbm91Z2ggdG8gbm90IHdvcnJ5IGFib3V0LgotCQkJMjowMAlFVQlFRSVzVAkyMDE0IE1hciAzMCAyOjAwCi0JCQk0OjAwCS0JTVNLCiAKICMgVmF0aWNhbiBDaXR5CiAjIFNlZSBFdXJvcGUvUm9tZS4KQEAgLTMwMTgsNyArMzM0NCw3IEBACiAjIC4uLgogIwogIyAuLi50aGUgRXVyb3BlYW4gdGltZSBydWxlcyBhcmUuLi5zdGFuZGFyZGl6ZWQgc2luY2UgMTk4MSwgd2hlbgotIyBtb3N0IEV1cm9wZWFuIGNvdW5bdHJdaWVzIHN0YXJ0ZWQgRFNULiAgQmVmb3JlIHRoYXQgeWVhciwgb25seQorIyBtb3N0IEV1cm9wZWFuIGNvdW50cmllcyBzdGFydGVkIERTVC4gIEJlZm9yZSB0aGF0IHllYXIsIG9ubHkKICMgYSBmZXcgY291bnRyaWVzIChVSywgRnJhbmNlLCBJdGFseSkgaGFkIERTVCwgZWFjaCBhY2NvcmRpbmcKICMgdG8gb3duIG5hdGlvbmFsIHJ1bGVzLiAgSW4gMTk4MSwgaG93ZXZlciwgRFNUIHN0YXJ0ZWQgb24KICMgJ0FwciBmaXJzdFN1bicsIGFuZCBub3Qgb24gJ01hciBsYXN0U3VuJyBhcyBpbiB0aGUgZm9sbG93aW5nCkBAIC0zMDI2LDcgKzMzNTIsNyBAQAogIyBCdXQgYWxzbyBzaW5jZSAxOTgxIHRoZXJlIGFyZSBzb21lIG1vcmUgbmF0aW9uYWwgZXhjZXB0aW9ucwogIyB0aGFuIGxpc3RlZCBpbiAnZXVyb3BlJzogU3dpdHplcmxhbmQsIGZvciBleGFtcGxlLCBqb2luZWQgRFNUCiAjIG9uZSB5ZWFyIGxhdGVyLCBEZW5tYXJrIGVuZGVkIERTVCBvbiAnT2N0IDEnIGluc3RlYWQgb2YgJ1NlcAotIyBsYXN0U3VuJyBpbiAxOTgxLS0tSSBkb24ndCBrbm93IGhvdyB0aGV5IGhhbmRsZSBub3cuCisjIGxhc3RTdW4nIGluIDE5ODEgLSBJIGRvbid0IGtub3cgaG93IHRoZXkgaGFuZGxlIG5vdy4KICMKICMgRmluYWxseSwgRFNUIGlzdCBhbHdheXMgZnJvbSAnQXByIDEnIHRvICdPY3QgMScgaW4gdGhlCiAjIFNvdmlldCBVbmlvbiAoYXMgZmFyIGFzIEkga25vdykuCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9mYWN0b3J5IGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZmFjdG9yeQppbmRleCA4MTNkOTlhLi4wYTYwNDFkIDEwMDY0NAotLS0gYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9mYWN0b3J5CisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2ZhY3RvcnkKQEAgLTIxLDcgKzIxLDYgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIDxwcmU+CiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCiAjIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgogCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9pc28zMTY2LnRhYiBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2lzbzMxNjYudGFiCmluZGV4IDI4ZmI2NGIuLjYzZWFkY2IgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2lzbzMxNjYudGFiCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2lzbzMxNjYudGFiCkBAIC0yNiwyMSArMjYsMjEgQEAKICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAjCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTMtMDUtMjcpOgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTE4KToKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgb2YgdHdvLWxldHRlciBjb3VudHJ5IGNvZGVzLiAgQ29sdW1ucyBhcmUKKyMgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHRhYi4gIExpbmVzIGJlZ2lubmluZyB3aXRoICcjJyBhcmUgY29tbWVudHMuCisjIEFsdGhvdWdoIGFsbCB0ZXh0IGN1cnJlbnRseSB1c2VzIEFTQ0lJIGVuY29kaW5nLCB0aGlzIGlzIHBsYW5uZWQgdG8KKyMgY2hhbmdlIHRvIFVURi04IHNvb24uICBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUgYXJlIGFzIGZvbGxvd3M6CiAjCi0jIFRoaXMgZmlsZSBjb250YWlucyBhIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBjb2x1bW5zOgogIyAxLiAgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSwgY3VycmVudCBhcyBvZgotIyAgICAgSVNPIDMxNjYtMSBOZXdzbGV0dGVyIFZJLTE1ICgyMDEzLTA1LTEwKS4gIFNlZTogVXBkYXRlcyBvbiBJU08gMzE2NgorIyAgICAgSVNPIDMxNjYtMSBOZXdzbGV0dGVyIFZJLTE2ICgyMDEzLTA3LTExKS4gIFNlZTogVXBkYXRlcyBvbiBJU08gMzE2NgogIyAgIGh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS9zdGFuZGFyZHMvY291bnRyeV9jb2Rlcy91cGRhdGVzX29uX2lzb18zMTY2Lmh0bQogIyAyLiAgVGhlIHVzdWFsIEVuZ2xpc2ggbmFtZSBmb3IgdGhlIGNvZGVkIHJlZ2lvbiwKICMgICAgIGNob3NlbiBzbyB0aGF0IGFscGhhYmV0aWMgc29ydGluZyBvZiBzdWJzZXRzIHByb2R1Y2VzIGhlbHBmdWwgbGlzdHMuCiAjICAgICBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgRW5nbGlzaCBuYW1lIGluIHRoZSBJU08gMzE2NiB0YWJsZXMuCiAjCi0jIENvbHVtbnMgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSB0YWIuCiAjIFRoZSB0YWJsZSBpcyBzb3J0ZWQgYnkgY291bnRyeSBjb2RlLgogIwotIyBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgIycgYXJlIGNvbW1lbnRzLgotIwogIyBUaGlzIHRhYmxlIGlzIGludGVuZGVkIGFzIGFuIGFpZCBmb3IgdXNlcnMsIHRvIGhlbHAgdGhlbSBzZWxlY3QgdGltZQogIyB6b25lIGRhdGEgYXBwcm9wcmlhdGUgZm9yIHRoZWlyIHByYWN0aWNhbCBuZWVkcy4gIEl0IGlzIG5vdCBpbnRlbmRlZAogIyB0byB0YWtlIG9yIGVuZG9yc2UgYW55IHBvc2l0aW9uIG9uIGxlZ2FsIG9yIHRlcnJpdG9yaWFsIGNsYWltcy4KZGlmZiAtLWdpdCBhL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2xlYXBzZWNvbmRzIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvbGVhcHNlY29uZHMKaW5kZXggYjQyMzEzNS4uZDM4YWJkNiAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvbGVhcHNlY29uZHMKKysrIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvbGVhcHNlY29uZHMKQEAgLTIxLDcgKzIxLDcgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi0jIEFsbG93YW5jZSBmb3IgbGVhcHNlY29uZHMgYWRkZWQgdG8gZWFjaCB0aW1lem9uZSBmaWxlLgorIyBBbGxvd2FuY2UgZm9yIGxlYXAgc2Vjb25kcyBhZGRlZCB0byBlYWNoIHRpbWUgem9uZSBmaWxlLgogCiAjIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KIApAQCAtMzEsNyArMzEsNyBAQAogIyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcGljayB1cCBsZWFwLXNlY29uZHMubGlzdCBmcm9tIGEgc2Vjb25kYXJ5IE5JU1Qgc2VydmVyLgogIyBGb3IgbW9yZSBhYm91dCBsZWFwLXNlY29uZHMubGlzdCwgcGxlYXNlIHNlZQogIyBUaGUgTlRQIFRpbWVzY2FsZSBhbmQgTGVhcCBTZWNvbmRzCi0jIDxodHRwOi8vd3d3LmVlY2lzLnVkZWwuZWR1L35taWxscy9sZWFwLmh0bWw+LgorIyBodHRwOi8vd3d3LmVlY2lzLnVkZWwuZWR1L35taWxscy9sZWFwLmh0bWwKIAogIyBUaGUgSW50ZXJuYXRpb25hbCBFYXJ0aCBSb3RhdGlvbiBTZXJ2aWNlIHBlcmlvZGljYWxseSB1c2VzIGxlYXAgc2Vjb25kcwogIyB0byBrZWVwIFVUQyB0byB3aXRoaW4gMC45IHMgb2YgVVQxCmRpZmYgLS1naXQgYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ub3J0aGFtZXJpY2EgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ub3J0aGFtZXJpY2EKaW5kZXggZGMwYzJlOS4uMGRjNzE0YSAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvbm9ydGhhbWVyaWNhCisrKyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL25vcnRoYW1lcmljYQpAQCAtMjEsMTUgKzIxLDE1IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIAogIyBhbHNvIGluY2x1ZGVzIENlbnRyYWwgQW1lcmljYSBhbmQgdGhlIENhcmliYmVhbgogCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAorIyBUaGlzIGZpbGUgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKICMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bwotIyB0ekBpYW5hLm9yZyBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCisjIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4gIEZvciBtb3JlLCBwbGVhc2Ugc2VlCisjIHRoZSBmaWxlIENPTlRSSUJVVElORyBpbiB0aGUgdHogZGlzdHJpYnV0aW9uLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMjIpOgogIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKQEAgLTc4LDEzICs3OCwxMyBAQAogIwl0byBwdXNoIHBlb3BsZSBpbnRvIGJlZCBlYXJsaWVyLCBhbmQgZ2V0IHRoZW0gdXAgZWFybGllciwgdG8gbWFrZQogIwl0aGVtIGhlYWx0aHksIHdlYWx0aHkgYW5kIHdpc2UgaW4gc3BpdGUgb2YgdGhlbXNlbHZlcy4KICMKLSMJLS0gUm9iZXJ0c29uIERhdmllcywgVGhlIGRpYXJ5IG9mIFNhbXVlbCBNYXJjaGJhbmtzLAorIwkgLS0gUm9iZXJ0c29uIERhdmllcywgVGhlIGRpYXJ5IG9mIFNhbXVlbCBNYXJjaGJhbmtzLAogIwkgICBDbGFya2UsIElyd2luICgxOTQ3KSwgWElYLCBTdW5kYXkKICMKICMgRm9yIG1vcmUgYWJvdXQgdGhlIGZpcnN0IHRlbiB5ZWFycyBvZiBEU1QgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIHNlZQotIyBSb2JlcnQgR2FybGFuZCdzIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xwZ2gub3JnL2V4aGliaXQvZHN0Lmh0bWwiPgotIyBUZW4geWVhcnMgb2YgZGF5bGlnaHQgc2F2aW5nIGZyb20gdGhlIFBpdHRzYnVyZ2ggc3RhbmRwb2ludAotIyAoQ2FybmVnaWUgTGlicmFyeSBvZiBQaXR0c2J1cmdoLCAxOTI3KTwvYT4uCisjIFJvYmVydCBHYXJsYW5kLCBUZW4geWVhcnMgb2YgZGF5bGlnaHQgc2F2aW5nIGZyb20gdGhlIFBpdHRzYnVyZ2ggc3RhbmRwb2ludAorIyAoQ2FybmVnaWUgTGlicmFyeSBvZiBQaXR0c2J1cmdoLCAxOTI3KS4KKyMgaHR0cDovL3d3dy5jbHBnaC5vcmcvZXhoaWJpdC9kc3QuaHRtbAogIwogIyBTaGFua3Mgc2F5cyB0aGF0IERTVCB3YXMgY2FsbGVkICJXYXIgVGltZSIgaW4gdGhlIFVTIGluIDE5MTggYW5kIDE5MTkuCiAjIEhvd2V2ZXIsIERTVCB3YXMgaW1wb3NlZCBieSB0aGUgU3RhbmRhcmQgVGltZSBBY3Qgb2YgMTkxOCwgd2hpY2gKQEAgLTEwMywxMSArMTAzLDExIEBACiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDAwLTA5LTI1KToKICMgTGFzdCBuaWdodCBJIGhlYXJkIHBhcnQgb2YgYSByZWJyb2FkY2FzdCBvZiBhIDE5NDUgQXJjaCBPYm9sZXIgcmFkaW8gZHJhbWEuCiAjIEluIHRoZSBpbnRyb2R1Y3Rpb24sIE9ib2xlciBzcG9rZSBvZiAiRWFzdGVybiBQZWFjZSBUaW1lLiIKLSMgQW4gQWx0YVZpc3RhIHNlYXJjaCB0dXJuZWQgdXAKLSMgPGEgaHJlZj0iaHR0cDovL3Jvd2F5dG9uLm9yZy9yaHMvaHN0YXVnNDUuaHRtbCI+OgorIyBBbiBBbHRhVmlzdGEgc2VhcmNoIHR1cm5lZCB1cDoKKyMgaHR0cDovL3Jvd2F5dG9uLm9yZy9yaHMvaHN0YXVnNDUuaHRtbAogIyAiV2hlbiB0aGUgdGltZSBpcyBhbm5vdW5jZWQgb3ZlciB0aGUgcmFkaW8gbm93LCBpdCBpcyAnRWFzdGVybiBQZWFjZQogIyBUaW1lJyBpbnN0ZWFkIG9mIHRoZSBvbGQgZmFtaWxpYXIgJ0Vhc3Rlcm4gV2FyIFRpbWUuJyAgUGVhY2UgaXMgd29uZGVyZnVsLiIKLSMgPC9hPiAoQXVndXN0IDE5NDUpIGJ5IHdheSBvZiBjb25maXJtYXRpb24uCisjIChBdWd1c3QgMTk0NSkgYnkgd2F5IG9mIGNvbmZpcm1hdGlvbi4KIAogIyBGcm9tIEpvc2VwaCBHYWxsYW50IGNpdGluZwogIyBHZW9yZ2UgSC4gRG91Z2xhcywgX1RoZSBFYXJseSBEYXlzIG9mIFJhZGlvIEJyb2FkY2FzdGluZ18gKDE5ODcpOgpAQCAtMjA1LDcgKzIwNSw3IEBACiAjIFVTQSAgQUxBU0tBIFNURCAgICA5IEggIEJFSElORCBVVEMgICAgTU9TVCBPRiBBTEFTS0EgICAgIChBS1NUKQogIyBVU0EgIEFMQVNLQSBTVEQgICAgOCBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwIChBS0RUKQogIyBVU0EgIEFMRVVUSUFOICAgICAxMCBIICBCRUhJTkQgVVRDICAgIElTTEFORFMgV0VTVCBPRiAxNzBXCi0jIFVTQSAgLSAiIC0gICAgICAgICA5IEggIEJFSElORCBVVEMgICAgQVBSIDMgLSBPQ1QgMzAKKyMgVVNBICAgICIgICAgICAgICAgIDkgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAogIyBVU0EgIEhBV0FJSSAgICAgICAxMCBIICBCRUhJTkQgVVRDCiAjIFVTQSAgQkVSSU5HICAgICAgIDExIEggIEJFSElORCBVVEMgICAgU0FNT0EsIE1JRFdBWQogCkBAIC0yNTgsMTkgKzI1OCwxOSBAQAogIyBUaGUgZm9sbG93aW5nIHdhcyBzaWduZWQgaW50byBsYXcgb24gMjAwNS0wOC0wOC4KICMKICMgSC5SLiA2LCBFbmVyZ3kgUG9saWN5IEFjdCBvZiAyMDA1LCBTRUMuIDExMC4gREFZTElHSFQgU0FWSU5HUy4KLSMgICAoYSkgQW1lbmRtZW50LSBTZWN0aW9uIDMoYSkgb2YgdGhlIFVuaWZvcm0gVGltZSBBY3Qgb2YgMTk2NiAoMTUKKyMgICAoYSkgQW1lbmRtZW50Li0tU2VjdGlvbiAzKGEpIG9mIHRoZSBVbmlmb3JtIFRpbWUgQWN0IG9mIDE5NjYgKDE1CiAjICAgVS5TLkMuIDI2MGEoYSkpIGlzIGFtZW5kZWQtLQotIyAgICAgKDEpIGJ5IHN0cmlraW5nICdmaXJzdCBTdW5kYXkgb2YgQXByaWwnIGFuZCBpbnNlcnRpbmcgJ3NlY29uZAotIyAgICAgU3VuZGF5IG9mIE1hcmNoJzsgYW5kCi0jICAgICAoMikgYnkgc3RyaWtpbmcgJ2xhc3QgU3VuZGF5IG9mIE9jdG9iZXInIGFuZCBpbnNlcnRpbmcgJ2ZpcnN0CisjICAgICAoMSkgYnkgc3RyaWtpbmcgImZpcnN0IFN1bmRheSBvZiBBcHJpbCIgYW5kIGluc2VydGluZyAic2Vjb25kCisjICAgICBTdW5kYXkgb2YgTWFyY2giOyBhbmQKKyMgICAgICgyKSBieSBzdHJpa2luZyAibGFzdCBTdW5kYXkgb2YgT2N0b2JlciIgYW5kIGluc2VydGluZyAiZmlyc3QKICMgICAgIFN1bmRheSBvZiBOb3ZlbWJlcicuCi0jICAgKGIpIEVmZmVjdGl2ZSBEYXRlLSBTdWJzZWN0aW9uIChhKSBzaGFsbCB0YWtlIGVmZmVjdCAxIHllYXIgYWZ0ZXIgdGhlCisjICAgKGIpIEVmZmVjdGl2ZSBEYXRlLi0tU3Vic2VjdGlvbiAoYSkgc2hhbGwgdGFrZSBlZmZlY3QgMSB5ZWFyIGFmdGVyIHRoZQogIyAgIGRhdGUgb2YgZW5hY3RtZW50IG9mIHRoaXMgQWN0IG9yIE1hcmNoIDEsIDIwMDcsIHdoaWNoZXZlciBpcyBsYXRlci4KLSMgICAoYykgUmVwb3J0IHRvIENvbmdyZXNzLSBOb3QgbGF0ZXIgdGhhbiA5IG1vbnRocyBhZnRlciB0aGUgZWZmZWN0aXZlCisjICAgKGMpIFJlcG9ydCB0byBDb25ncmVzcy4tLU5vdCBsYXRlciB0aGFuIDkgbW9udGhzIGFmdGVyIHRoZSBlZmZlY3RpdmUKICMgICBkYXRlIHN0YXRlZCBpbiBzdWJzZWN0aW9uIChiKSwgdGhlIFNlY3JldGFyeSBzaGFsbCByZXBvcnQgdG8gQ29uZ3Jlc3MKICMgICBvbiB0aGUgaW1wYWN0IG9mIHRoaXMgc2VjdGlvbiBvbiBlbmVyZ3kgY29uc3VtcHRpb24gaW4gdGhlIFVuaXRlZAogIyAgIFN0YXRlcy4KLSMgICAoZCkgUmlnaHQgdG8gUmV2ZXJ0LSBDb25ncmVzcyByZXRhaW5zIHRoZSByaWdodCB0byByZXZlcnQgdGhlCisjICAgKGQpIFJpZ2h0IHRvIFJldmVydC4tLUNvbmdyZXNzIHJldGFpbnMgdGhlIHJpZ2h0IHRvIHJldmVydCB0aGUKICMgICBEYXlsaWdodCBTYXZpbmcgVGltZSBiYWNrIHRvIHRoZSAyMDA1IHRpbWUgc2NoZWR1bGVzIG9uY2UgdGhlCiAjICAgRGVwYXJ0bWVudCBzdHVkeSBpcyBjb21wbGV0ZS4KIApAQCAtMjkyLDcgKzI5Miw3IEBACiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0yNik6CiAjIEFjY29yZGluZyB0byB0b2RheSdzIEh1bnRzdmlsbGUgVGltZXMKLSMgPGh0dHA6Ly93d3cuYWwuY29tL25ld3MvaHVudHN2aWxsZXRpbWVzL2luZGV4LnNzZj8vYmFzZS9uZXdzLzExMjUwNDc3ODMyMjgzMjAueG1sJmNvbGw9MT4KKyMgaHR0cDovL3d3dy5hbC5jb20vbmV3cy9odW50c3ZpbGxldGltZXMvaW5kZXguc3NmPy9iYXNlL25ld3MvMTEyNTA0Nzc4MzIyODMyMC54bWwmY29sbD0xCiAjIGEgZmV3IHRvd25zIG9uIEFsYWJhbWEncyAiZWFzdGVybiBib3JkZXIgd2l0aCBHZW9yZ2lhLCBzdWNoIGFzIFBoZW5peCBDaXR5CiAjIGluIFJ1c3NlbGwgQ291bnR5LCBMYW5ldHQgaW4gQ2hhbWJlcnMgQ291bnR5IGFuZCBzb21lIHRvd25zIGluIExlZSBDb3VudHksCiAjIHNldCB0aGVpciB3YXRjaGVzIGFuZCBjbG9ja3Mgb24gRWFzdGVybiB0aW1lLiIgIEl0IHF1b3RlcyBILkguICJCdWJiYSIKQEAgLTM0NywxNSArMzQ3LDE1IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvQ2hpY2FnbwktNTo1MDozNiAtCUxNVAkxODgzIE5vdiAxOCAxMjowOToyNAogCQkJLTY6MDAJVVMJQyVzVAkxOTIwCi0JCQktNjowMAlDaGljYWdvCUMlc1QJMTkzNiBNYXIgIDEgMjowMAotCQkJLTU6MDAJLQlFU1QJMTkzNiBOb3YgMTUgMjowMAorCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5MzYgTWFyICAxICAyOjAwCisJCQktNTowMAktCUVTVAkxOTM2IE5vdiAxNSAgMjowMAogCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5NDIKIAkJCS02OjAwCVVTCUMlc1QJMTk0NgogCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5NjcKIAkJCS02OjAwCVVTCUMlc1QKICMgT2xpdmVyIENvdW50eSwgTkQgc3dpdGNoZWQgZnJvbSBtb3VudGFpbiB0byBjZW50cmFsIHRpbWUgb24gMTk5Mi0xMC0yNS4KIFpvbmUgQW1lcmljYS9Ob3J0aF9EYWtvdGEvQ2VudGVyIC02OjQ1OjEyIC0gTE1UCTE4ODMgTm92IDE4IDEyOjE0OjQ4Ci0JCQktNzowMAlVUwlNJXNUCTE5OTIgT2N0IDI1IDAyOjAwCisJCQktNzowMAlVUwlNJXNUCTE5OTIgT2N0IDI1ICAyOjAwCiAJCQktNjowMAlVUwlDJXNUCiAjIE1vcnRvbiBDb3VudHksIE5ELCBzd2l0Y2hlZCBmcm9tIG1vdW50YWluIHRvIGNlbnRyYWwgdGltZSBvbgogIyAyMDAzLTEwLTI2LCBleGNlcHQgZm9yIHRoZSBhcmVhIGFyb3VuZCBNYW5kYW4gd2hpY2ggd2FzIGFscmVhZHkgY2VudHJhbCB0aW1lLgpAQCAtMzY0LDI5ICszNjQsMjYgQEAKICMgSm9uZXMsIE1lbGxldHRlLCBhbmQgVG9kZCBDb3VudGllcyBpbiBTb3V0aCBEYWtvdGE7CiAjIGJ1dCBpbiBwcmFjdGljZSB0aGVzZSBvdGhlciBjb3VudGllcyB3ZXJlIGFscmVhZHkgb2JzZXJ2aW5nIGNlbnRyYWwgdGltZS4KICMgU2VlIDxodHRwOi8vd3d3LmVwYS5nb3YvZmVkcmdzdHIvRVBBLUlNUEFDVC8yMDAzL09jdG9iZXIvRGF5LTI4L2kyNzA1Ni5odG0+LgotWm9uZSBBbWVyaWNhL05vcnRoX0Rha290YS9OZXdfU2FsZW0gLTY6NDU6MzkgLSBMTVQgMTg4MyBOb3YgMTggMTI6MTQ6MjEKLQkJCS03OjAwCVVTCU0lc1QJMjAwMyBPY3QgMjYgMDI6MDAKK1pvbmUgQW1lcmljYS9Ob3J0aF9EYWtvdGEvTmV3X1NhbGVtIC02OjQ1OjM5IC0gTE1UCTE4ODMgTm92IDE4IDEyOjE0OjIxCisJCQktNzowMAlVUwlNJXNUCTIwMDMgT2N0IDI2ICAyOjAwCiAJCQktNjowMAlVUwlDJXNUCiAKICMgRnJvbSBKb3NoIEZpbmRsZXkgKDIwMTEtMDEtMjEpOgogIyAuLi5pdCBhcHBlYXJzIHRoYXQgTWVyY2VyIENvdW50eSwgTm9ydGggRGFrb3RhLCBjaGFuZ2VkIGZyb20gdGhlCiAjIG1vdW50YWluIHRpbWUgem9uZSB0byB0aGUgY2VudHJhbCB0aW1lIHpvbmUgYXQgdGhlIGxhc3QgdHJhbnNpdGlvbiBmcm9tCiAjIGRheWxpZ2h0LXNhdmluZyB0byBzdGFuZGFyZCB0aW1lIChvbiBOb3YuIDcsIDIwMTApOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdwby5nb3YvZmRzeXMvcGtnL0ZSLTIwMTAtMDktMjkvaHRtbC8yMDEwLTI0Mzc2Lmh0bSI+CiAjIGh0dHA6Ly93d3cuZ3BvLmdvdi9mZHN5cy9wa2cvRlItMjAxMC0wOS0yOS9odG1sLzIwMTAtMjQzNzYuaHRtCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5iaXNtYXJja3RyaWJ1bmUuY29tL25ld3MvbG9jYWwvYXJ0aWNsZV8xZWIxYjU4OC1jNzU4LTExZGYtYjQ3Mi0wMDFjYzRjMDMyODYuaHRtbCI+CiAjIGh0dHA6Ly93d3cuYmlzbWFyY2t0cmlidW5lLmNvbS9uZXdzL2xvY2FsL2FydGljbGVfMWViMWI1ODgtYzc1OC0xMWRmLWI0NzItMDAxY2M0YzAzMjg2Lmh0bWwKLSMgPC9hPgogCiAjIEZyb20gQW5keSBMaXBzY29tYiAoMjAxMS0wMS0yNCk6CiAjIC4uLmFjY29yZGluZyB0byB0aGUgQ2Vuc3VzIEJ1cmVhdSwgdGhlIGxhcmdlc3QgY2l0eSBpcyBCZXVsYWggKGFsdGhvdWdoCiAjIGl0J3MgY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMgQmV1bGFoLUhhemVuLCB3aXRoIEhhemVuIGJlaW5nIHRoZSBuZXh0CiAjIGxhcmdlc3QgY2l0eSBpbiBNZXJjZXIgQ291bnR5KS4gIEdvb2dsZSBNYXBzIHBsYWNlcyBCZXVsYWgncyBjaXR5IGhhbGwKLSMgYXQgNDcxNSc1MSIgbm9ydGgsIDEwMTQ2JzQwIiB3ZXN0LCB3aGljaCB5aWVsZHMgYW4gb2Zmc2V0IG9mIDZoNDcnMDciLgorIyBhdCA0NyBkZWdyZWVzIDE1JyA1MSIgTiwgMTAxIGRlZ3JlZXMgNDYnIDQwIiBXLCB3aGljaCB5aWVsZHMgYW4gb2Zmc2V0CisjIG9mIDZoNDcnMDciLgogCi1ab25lIEFtZXJpY2EvTm9ydGhfRGFrb3RhL0JldWxhaCAtNjo0NzowNyAtIExNVCAxODgzIE5vdiAxOCAxMjoxMjo1MwotCQkJLTc6MDAJVVMJTSVzVAkyMDEwIE5vdiAgNyAyOjAwCitab25lIEFtZXJpY2EvTm9ydGhfRGFrb3RhL0JldWxhaCAtNjo0NzowNyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMjo1MworCQkJLTc6MDAJVVMJTSVzVAkyMDEwIE5vdiAgNyAgMjowMAogCQkJLTY6MDAJVVMJQyVzVAogCiAjIFVTIG1vdW50YWluIHRpbWUsIHJlcHJlc2VudGVkIGJ5IERlbnZlcgpAQCAtNDQ4LDE1ICs0NDUsMTggQEAKICMgd2FzIGRlc3Ryb3llZCBpbiAxODA1IGJ5IGEgWWFrdXRhdC1rb24gd2FyIHBhcnR5LikgIEhvd2V2ZXIsIHRoZXJlCiAjIHdlcmUgbmVhcmJ5IGluaGFiaXRhbnRzIGluIHNvbWUgY2FzZXMgYW5kIGZvciBvdXIgcHVycG9zZXMgcGVyaGFwcwogIyBpdCdzIGJlc3QgdG8gc2ltcGx5IHVzZSB0aGUgb2ZmaWNpYWwgdHJhbnNpdGlvbi4KLSMKIAotIyBGcm9tIFN0ZXZlIEZlcmd1c29uICgyMDExLTAxLTMxKToKLSMgVGhlIGF1dGhvciBsaXZlcyBpbiBBbGFza2EgYW5kIG1hbnkgb2YgdGhlIHJlZmVyZW5jZXMgbGlzdGVkIGFyZSBvbmx5Ci0jIGF2YWlsYWJsZSB0byBBbGFza2FuIHJlc2lkZW50cy4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNy0xOCk6CisjIE9uZSBvcGluaW9uIG9mIHRoZSBlYXJseS0xOTgwcyB0dXJtb2lsIGluIEFsYXNrYSBvdmVyIHRpbWUgem9uZXMgYW5kCisjIGRheWxpZ2h0IHNhdmluZyB0aW1lIGFwcGVhcmVkIGFzIGdyYWZmaXRpIG9uIGEgSnVuZWF1IGFpcnBvcnQgd2FsbDoKKyMgIldlbGNvbWUgdG8gSnVuZWF1LiAgUGxlYXNlIHR1cm4geW91ciB3YXRjaCBiYWNrIHRvIHRoZSAxOXRoIGNlbnR1cnkuIgorIyBTZWU6IFR1cm5lciBXLiBBbGFza2EncyBmb3VyIHRpbWUgem9uZXMgbm93IHR3by4gTlkgVGltZXMgMTk4My0xMS0wMS4KKyMgaHR0cDovL3d3dy5ueXRpbWVzLmNvbS8xOTgzLzExLzAxL3VzL2FsYXNrYS1zLWZvdXItdGltZS16b25lcy1ub3ctdHdvLmh0bWwKICMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hbGFza2FoaXN0b3JpY2Fsc29jaWV0eS5vcmcvaW5kZXguY2ZtP3NlY3Rpb249ZGlzY292ZXIlMjBhbGFza2EmcGFnZT1HbGltcHNlcyUyMG9mJTIwdGhlJTIwUGFzdCZ2aWV3cG9zdD0yJkNvbnRlbnRJZD05OCI+Ci0jIGh0dHA6Ly93d3cuYWxhc2thaGlzdG9yaWNhbHNvY2lldHkub3JnL2luZGV4LmNmbT9zZWN0aW9uPWRpc2NvdmVyJTIwYWxhc2thJnBhZ2U9R2xpbXBzZXMlMjBvZiUyMHRoZSUyMFBhc3Qmdmlld3Bvc3Q9MiZDb250ZW50SWQ9OTgKLSMgPC9hPgorIyBTdGV2ZSBGZXJndXNvbiAoMjAxMS0wMS0zMSkgcmVmZXJyZWQgdG8gdGhlIGZvbGxvd2luZyBzb3VyY2U6CisjIE5vcnJpcyBGLiBLZWVwaW5nIHRpbWUgaW4gQWxhc2thOiBuYXRpb25hbCBkaXJlY3RpdmVzLCBsb2NhbCByZXNwb25zZS4KKyMgQWxhc2thIEhpc3RvcnkgMjAwMTsxNigxLTIpLgorIyBodHRwOi8vYWxhc2thaGlzdG9yaWNhbHNvY2lldHkub3JnL2Rpc2NvdmVyLWFsYXNrYS9nbGltcHNlcy1vZi10aGUtcGFzdC9rZWVwaW5nLXRpbWUtaW4tYWxhc2thLwogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDExLTAyLTAxKToKICMgSGVyZSdzIGRhdGFiYXNlLXJlbGV2YW50IG1hdGVyaWFsIGZyb20gdGhlIDIwMDEgIkFsYXNrYSBIaXN0b3J5IiBhcnRpY2xlOgpAQCAtNDgyLDEyICs0ODIsMTAgQEAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTEtMDItMDkpOgogIyBJIGp1c3Qgc3Bva2UgYnkgcGhvbmUgd2l0aCBhIHN0YWZmIG1lbWJlciBhdCB0aGUgTWV0bGFrYXRsYSBJbmRpYW4KICMgQ29tbXVuaXR5IG9mZmljZSAodXNpbmcgY29udGFjdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jb21tZXJjZS5zdGF0ZS5hay51cy9kY2EvY29tbWRiL0NJUy5jZm0/Q29tbV9Cb3JvX25hbWU9TWV0bGFrYXRsYSI+CiAjIGh0dHA6Ly93d3cuY29tbWVyY2Uuc3RhdGUuYWsudXMvZGNhL2NvbW1kYi9DSVMuY2ZtP0NvbW1fQm9yb19uYW1lPU1ldGxha2F0bGEKLSMgPC9hPikuCiAjIEl0J3Mgc2hvcnRseSBhZnRlciAxOjAwIGhlcmUgb24gdGhlIGVhc3QgY29hc3Qgb2YgdGhlIFVuaXRlZCBTdGF0ZXM7CiAjIHRoZSBzdGFmZmVyIHNhaWQgaXQgd2FzIHNob3J0bHkgYWZ0ZXIgMTA6MDAgdGhlcmUuIFdoZW4gSSBhc2tlZCB3aGV0aGVyCi0jIHRoYXQgbWVhbnQgdGhleSB3ZXJlIG9uIFBhY2lmaWMgdGltZSwgdGhleSBzYWlkIG5vLS10aGV5IHdlcmUgb24gdGhlaXIKKyMgdGhhdCBtZWFudCB0aGV5IHdlcmUgb24gUGFjaWZpYyB0aW1lLCB0aGV5IHNhaWQgbm8gLSB0aGV5IHdlcmUgb24gdGhlaXIKICMgb3duIHRpbWUuIEkgYXNrZWQgYWJvdXQgZGF5bGlnaHQgc2F2aW5nOyB0aGV5IHNhaWQgaXQgd2Fzbid0IHVzZWQuIEkKICMgZGlkIG5vdCBpbnF1aXJlIGFib3V0IHByYWN0aWNlcyBpbiB0aGUgcGFzdC4KIApAQCAtNTAxLDkgKzQ5OSw5IEBACiAJCQkgLTg6MDAJLQlQU1QJMTk0MgogCQkJIC04OjAwCVVTCVAlc1QJMTk0NgogCQkJIC04OjAwCS0JUFNUCTE5NjkKLQkJCSAtODowMAlVUwlQJXNUCTE5ODAgQXByIDI3IDI6MDAKLQkJCSAtOTowMAlVUwlZJXNUCTE5ODAgT2N0IDI2IDI6MDAKLQkJCSAtODowMAlVUwlQJXNUCTE5ODMgT2N0IDMwIDI6MDAKKwkJCSAtODowMAlVUwlQJXNUCTE5ODAgQXByIDI3ICAyOjAwCisJCQkgLTk6MDAJVVMJWSVzVAkxOTgwIE9jdCAyNiAgMjowMAorCQkJIC04OjAwCVVTCVAlc1QJMTk4MyBPY3QgMzAgIDI6MDAKIAkJCSAtOTowMAlVUwlZJXNUCTE5ODMgTm92IDMwCiAJCQkgLTk6MDAJVVMJQUslc1QKIFpvbmUgQW1lcmljYS9TaXRrYQkgMTQ6NTg6NDcgLQlMTVQJMTg2NyBPY3QgMTgKQEAgLTUxMSw3ICs1MDksNyBAQAogCQkJIC04OjAwCS0JUFNUCTE5NDIKIAkJCSAtODowMAlVUwlQJXNUCTE5NDYKIAkJCSAtODowMAktCVBTVAkxOTY5Ci0JCQkgLTg6MDAJVVMJUCVzVAkxOTgzIE9jdCAzMCAyOjAwCisJCQkgLTg6MDAJVVMJUCVzVAkxOTgzIE9jdCAzMCAgMjowMAogCQkJIC05OjAwCVVTCVklc1QJMTk4MyBOb3YgMzAKIAkJCSAtOTowMAlVUwlBSyVzVAogWm9uZSBBbWVyaWNhL01ldGxha2F0bGEJIDE1OjEzOjQyIC0JTE1UCTE4NjcgT2N0IDE4CkBAIC01MTksOCArNTE3LDggQEAKIAkJCSAtODowMAktCVBTVAkxOTQyCiAJCQkgLTg6MDAJVVMJUCVzVAkxOTQ2CiAJCQkgLTg6MDAJLQlQU1QJMTk2OQotCQkJIC04OjAwCVVTCVAlc1QJMTk4MyBPY3QgMzAgMjowMAotCQkJIC04OjAwCS0JTWVTVAorCQkJIC04OjAwCVVTCVAlc1QJMTk4MyBPY3QgMzAgIDI6MDAKKwkJCSAtODowMAktCVBTVAogWm9uZSBBbWVyaWNhL1lha3V0YXQJIDE0OjQxOjA1IC0JTE1UCTE4NjcgT2N0IDE4CiAJCQkgLTk6MTg6NTUgLQlMTVQJMTkwMCBBdWcgMjAgMTI6MDAKIAkJCSAtOTowMAktCVlTVAkxOTQyCkBAIC01MzUsNyArNTMzLDcgQEAKIAkJCS0xMDowMAlVUwlDQVQvQ0FQVCAxOTQ2ICMgUGVhY2UKIAkJCS0xMDowMAktCUNBVAkxOTY3IEFwcgogCQkJLTEwOjAwCS0JQUhTVAkxOTY5Ci0JCQktMTA6MDAJVVMJQUglc1QJMTk4MyBPY3QgMzAgMjowMAorCQkJLTEwOjAwCVVTCUFIJXNUCTE5ODMgT2N0IDMwICAyOjAwCiAJCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAogCQkJIC05OjAwCVVTCUFLJXNUCiBab25lIEFtZXJpY2EvTm9tZQkgMTI6NTg6MjEgLQlMTVQJMTg2NyBPY3QgMTgKQEAgLTU0NCw3ICs1NDIsNyBAQAogCQkJLTExOjAwCVVTCU4lc1QJMTk0NgogCQkJLTExOjAwCS0JTlNUCTE5NjcgQXByCiAJCQktMTE6MDAJLQlCU1QJMTk2OQotCQkJLTExOjAwCVVTCUIlc1QJMTk4MyBPY3QgMzAgMjowMAorCQkJLTExOjAwCVVTCUIlc1QJMTk4MyBPY3QgMzAgIDI6MDAKIAkJCSAtOTowMAlVUwlZJXNUCTE5ODMgTm92IDMwCiAJCQkgLTk6MDAJVVMJQUslc1QKIFpvbmUgQW1lcmljYS9BZGFrCSAxMjoxMzoyMSAtCUxNVAkxODY3IE9jdCAxOApAQCAtNTUzLDcgKzU1MSw3IEBACiAJCQktMTE6MDAJVVMJTiVzVAkxOTQ2CiAJCQktMTE6MDAJLQlOU1QJMTk2NyBBcHIKIAkJCS0xMTowMAktCUJTVAkxOTY5Ci0JCQktMTE6MDAJVVMJQiVzVAkxOTgzIE9jdCAzMCAyOjAwCisJCQktMTE6MDAJVVMJQiVzVAkxOTgzIE9jdCAzMCAgMjowMAogCQkJLTEwOjAwCVVTCUFIJXNUCTE5ODMgTm92IDMwCiAJCQktMTA6MDAJVVMJSEElc1QKICMgVGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBkb24ndCBxdWl0ZSBtYWtlIG91ciAxOTcwIGN1dG9mZi4KQEAgLTU3MSw3ICs1NjksNyBAQAogIyAgTWludXRlcyBvZiB0aGUgVW5hbGFza2EgQ2l0eSBDb3VuY2lsIE1lZXRpbmcsIEphbnVhcnkgMTAsIDE5Njc6CiAjICAiRXhjZXB0IGZvciBTdC4gUGF1bCBhbmQgQWt1dGFuLCBVbmFsYXNrYSBpcyB0aGUgb25seSBpbXBvcnRhbnQKICMgIGxvY2F0aW9uIG5vdCBvbiBBbGFza2EgU3RhbmRhcmQgVGltZS4gIFRoZSBmb2xsb3dpbmcgcmVzb2x1dGlvbiB3YXMKLSMgIG1hZGUgYnkgV2lsbGlhbSBSb2JpbnNvbiBhbmQgc2Vjb25kZWQgYnkgSGVucnkgU3dhbnNvbjogIEJlIGl0CisjICBtYWRlIGJ5IFdpbGxpYW0gUm9iaW5zb24gYW5kIHNlY29uZGVkIGJ5IEhlbnJ5IFN3YW5zb246IEJlIGl0CiAjICByZXNvbHZlZCB0aGF0IHRoZSBDaXR5IG9mIFVuYWxhc2thIGhlcmVieSBnb2VzIHRvIEFsYXNrYSBTdGFuZGFyZAogIyAgVGltZSBhcyBvZiBtaWRuaWdodCBGcmlkYXksIEphbnVhcnkgMTMsIDE5NjcgKDEgQS5NLiBTYXR1cmRheSwKICMgIEphbnVhcnkgMTQsIEFsYXNrYSBTdGFuZGFyZCBUaW1lLikgIFRoaXMgcmVzb2x1dGlvbiB3YXMgcGFzc2VkIHdpdGgKQEAgLTU4Myw5ICs1ODEsNyBAQAogIyAiSGF3YWlpYW4gVGltZSIgYnkgUm9iZXJ0IEMuIFNjaG1pdHQgYW5kIERvYWsgQy4gQ294IGFwcGVhcnMgb24gcGFnZXMgMjA3LTIyNQogIyBvZiB2b2x1bWUgMjYgb2YgVGhlIEhhd2FpaWFuIEpvdXJuYWwgb2YgSGlzdG9yeSAoMTk5MikuIEFzIG9mIDIwMTAtMTItMDksCiAjIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBhdAotIyA8YSBocmVmPSJodHRwOi8vZXZvbHMubGlicmFyeS5tYW5vYS5oYXdhaWkuZWR1L2JpdHN0cmVhbS8xMDUyNC8yMzkvMi9KTDI2MjE1LnBkZiI+CiAjIGh0dHA6Ly9ldm9scy5saWJyYXJ5Lm1hbm9hLmhhd2FpaS5lZHUvYml0c3RyZWFtLzEwNTI0LzIzOS8yL0pMMjYyMTUucGRmCi0jIDwvYT4KICMgYW5kIGluZGljYXRlcyB0aGF0IHN0YW5kYXJkIHRpbWUgd2FzIGFkb3B0ZWQgZWZmZWN0aXZlIG5vb24sIEphbnVhcnkKICMgMTMsIDE4OTYgKHBhZ2UgMjE4KSwgdGhhdCBpbiAiMTkzMywgdGhlIExlZ2lzbGF0dXJlIGRlY3JlZWQgZGF5bGlnaHQKICMgc2F2aW5nIGZvciB0aGUgcGVyaW9kIGJldHdlZW4gdGhlIGxhc3QgU3VuZGF5IG9mIGVhY2ggQXByaWwgYW5kIHRoZQpAQCAtNjA2LDcgKzYwMiw3IEBACiAjIHllYXIsIHRoZSBzdGFuZGFyZCB0aW1lIG9mIHRoaXMgVGVycml0b3J5IHNoYWxsIGJlIGFkdmFuY2VkIG9uZQogIyBob3VyLi4uVGhpcyBBY3Qgc2hhbGwgdGFrZSBlZmZlY3QgdXBvbiBpdHMgYXBwcm92YWwuIEFwcHJvdmVkIHRoaXMgMjZ0aAogIyBkYXkgb2YgQXByaWwsIEEuIEQuIDE5MzMuIExBV1JFTkNFIE0gSlVERCwgR292ZXJub3Igb2YgdGhlIFRlcnJpdG9yeSBvZgotIyBIYXdhaWkuIiBQYWdlIDE3MjogICJBY3QgMTYzLi4uQWN0IDkwIG9mIHRoZSBTZXNzaW9uIExhd3Mgb2YgMTkzMyBpcworIyBIYXdhaWkuIiBQYWdlIDE3MjogIkFjdCAxNjMuLi5BY3QgOTAgb2YgdGhlIFNlc3Npb24gTGF3cyBvZiAxOTMzIGlzCiAjIGhlcmVieSByZXBlYWxlZC4uLlRoaXMgQWN0IHNoYWxsIHRha2UgZWZmZWN0IHVwb24gaXRzIGFwcHJvdmFsLCB1cG9uCiAjIHdoaWNoIGRhdGUgdGhlIHN0YW5kYXJkIHRpbWUgb2YgdGhpcyBUZXJyaXRvcnkgc2hhbGwgYmUgcmVzdG9yZWQgdG8KICMgdGhhdCBleGlzdGluZyBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgdGFraW5nIGVmZmVjdCBvZiBzYWlkIEFjdCA5MC4KQEAgLTYxNiwxNCArNjEyLDE0IEBACiAjIE5vdGUgdGhhdCAxOTMzLTA1LTIxIHdhcyBhIFN1bmRheS4KICMgV2UncmUgbGVmdCB0byBndWVzcyB0aGUgdGltZSBvZiBkYXkgd2hlbiBBY3QgMTYzIHdhcyBhcHByb3ZlZDsgZ3Vlc3Mgbm9vbi4KIAotWm9uZSBQYWNpZmljL0hvbm9sdWx1CS0xMDozMToyNiAtCUxNVAkxODk2IEphbiAxMyAxMjowMCAjU2NobWl0dCZDb3gKLQkJCS0xMDozMAktCUhTVAkxOTMzIEFwciAzMCAyOjAwICNMYXdzIDE5MzMKLQkJCS0xMDozMAkxOjAwCUhEVAkxOTMzIE1heSAyMSAxMjowMCAjTGF3cyAxOTMzKzEyCi0JCQktMTA6MzAJLQlIU1QJMTk0MiBGZWIgMDkgMjowMCAjU2NobWl0dCZDb3grMgotCQkJLTEwOjMwCTE6MDAJSERUCTE5NDUgU2VwIDMwIDI6MDAgI1NjaG1pdHQmQ294KzIKLQkJCS0xMDozMAktCUhTVAkxOTQ3IEp1biAgOCAyOjAwICNTY2htaXR0JkNveCsyCisjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCitab25lIFBhY2lmaWMvSG9ub2x1bHUJLTEwOjMxOjI2IC0JTE1UCTE4OTYgSmFuIDEzIDEyOjAwCisJCQktMTA6MzAJLQlIU1QJMTkzMyBBcHIgMzAgIDI6MDAKKwkJCS0xMDozMAkxOjAwCUhEVAkxOTMzIE1heSAyMSAxMjowMAorCQkJLTEwOjMwCS0JSFNUCTE5NDIgRmViICA5ICAyOjAwCisJCQktMTA6MzAJMTowMAlIRFQJMTk0NSBTZXAgMzAgIDI6MDAKKwkJCS0xMDozMAktCUhTVAkxOTQ3IEp1biAgOCAgMjowMAogCQkJLTEwOjAwCS0JSFNUCi0KIExpbmsgUGFjaWZpYy9Ib25vbHVsdSBQYWNpZmljL0pvaG5zdG9uCiAKICMgTm93IHdlIHR1cm4gdG8gVVMgYXJlYXMgdGhhdCBoYXZlIGRpdmVyZ2VkIGZyb20gdGhlIGNvbnNlbnN1cyBzaW5jZSAxOTcwLgpAQCAtNjMzLDkgKzYyOSw5IEBACiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMTAtMjApOgogIwogIyBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3Qgb2YgdGhpcyBwYXJhZ3JhcGggaXMgZGVyaXZlZCBmcm9tIHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRsYXByLmxpYi5hei51cy9saW5rcy9kYXlsaWdodC5odG0iPgotIyBEYXlsaWdodCBTYXZpbmcgVGltZSB3ZWIgcGFnZSAoMjAwMi0wMS0yMyk8L2E+IG1haW50YWluZWQgYnkgdGhlCi0jIEFyaXpvbmEgU3RhdGUgTGlicmFyeSwgQXJjaGl2ZXMgYW5kIFB1YmxpYyBSZWNvcmRzLgorIyBEYXlsaWdodCBTYXZpbmcgVGltZSB3ZWIgcGFnZQorIyA8aHR0cDovL3d3dy5kbGFwci5saWIuYXoudXMvbGlua3MvZGF5bGlnaHQuaHRtPiAoMjAwMi0wMS0yMykKKyMgbWFpbnRhaW5lZCBieSB0aGUgQXJpem9uYSBTdGF0ZSBMaWJyYXJ5LCBBcmNoaXZlcyBhbmQgUHVibGljIFJlY29yZHMuCiAjIEJldHdlZW4gMTk0NC0wMS0wMSBhbmQgMTk0NC0wNC0wMSB0aGUgU3RhdGUgb2YgQXJpem9uYSB1c2VkIHN0YW5kYXJkCiAjIHRpbWUsIGJ1dCBieSBmZWRlcmFsIGxhdyByYWlscm9hZHMsIGFpcmxpbmVzLCBidXMgbGluZXMsIG1pbGl0YXJ5CiAjIHBlcnNvbm5lbCwgYW5kIHNvbWUgZW5nYWdlZCBpbiBpbnRlcnN0YXRlIGNvbW1lcmNlIGNvbnRpbnVlZCB0bwpAQCAtNjQ5LDEwICs2NDUsMTEgQEAKICMgU2hhbmtzIHNheXMgdGhlIDE5NDQgZXhwZXJpbWVudCBjYW1lIHRvIGFuIGVuZCBvbiAxOTQ0LTAzLTE3LgogIyBHbyB3aXRoIHRoZSBBcml6b25hIFN0YXRlIExpYnJhcnkgaW5zdGVhZC4KIAorIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL1Bob2VuaXgJLTc6Mjg6MTggLQlMTVQJMTg4MyBOb3YgMTggMTE6MzE6NDIKLQkJCS03OjAwCVVTCU0lc1QJMTk0NCBKYW4gIDEgMDA6MDEKLQkJCS03OjAwCS0JTVNUCTE5NDQgQXByICAxIDAwOjAxCi0JCQktNzowMAlVUwlNJXNUCTE5NDQgT2N0ICAxIDAwOjAxCisJCQktNzowMAlVUwlNJXNUCTE5NDQgSmFuICAxICAwOjAxCisJCQktNzowMAktCU1TVAkxOTQ0IEFwciAgMSAgMDowMQorCQkJLTc6MDAJVVMJTSVzVAkxOTQ0IE9jdCAgMSAgMDowMQogCQkJLTc6MDAJLQlNU1QJMTk2NwogCQkJLTc6MDAJVVMJTSVzVAkxOTY4IE1hciAyMQogCQkJLTc6MDAJLQlNU1QKQEAgLTY3NiwyNCArNjczLDIyIEBACiAjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvQm9pc2UJLTc6NDQ6NDkgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTU6MTEKLQkJCS04OjAwCVVTCVAlc1QJMTkyMyBNYXkgMTMgMjowMAorCQkJLTg6MDAJVVMJUCVzVAkxOTIzIE1heSAxMyAgMjowMAogCQkJLTc6MDAJVVMJTSVzVAkxOTc0Ci0JCQktNzowMAktCU1TVAkxOTc0IEZlYiAgMyAyOjAwCisJCQktNzowMAktCU1TVAkxOTc0IEZlYiAgMyAgMjowMAogCQkJLTc6MDAJVVMJTSVzVAogCiAjIEluZGlhbmEKICMKICMgRm9yIGEgbWFwIG9mIEluZGlhbmEncyB0aW1lIHpvbmUgcmVnaW9ucywgc2VlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1jY3NjLmVkdS90aW1lLmh0bWwiPgotIyBXaGF0IHRpbWUgaXMgaXQgaW4gSW5kaWFuYT8KLSMgPC9hPiAoMjAwNi0wMy0wMSkKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UaW1lX2luX0luZGlhbmEKICMKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wOC0xNyk6CiAjIFNpbmNlIDE5NzAsIG1vc3Qgb2YgSW5kaWFuYSBoYXMgYmVlbiBsaWtlIEFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMsCiAjIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgogIwogIyAtIEdpYnNvbiwgSmFzcGVyLCBMYWtlLCBMYVBvcnRlLCBOZXd0b24sIFBvcnRlciwgUG9zZXksIFNwZW5jZXIsCi0jICAgVmFuZGVuYnVyZ2gsIGFuZCBXYXJyaWNrIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlIEFtZXJpY2EvQ2hpY2Fnby4KKyMgICBWYW5kZXJidXJnaCwgYW5kIFdhcnJpY2sgY291bnRpZXMgaGF2ZSBiZWVuIGxpa2UgQW1lcmljYS9DaGljYWdvLgogIwogIyAtIERlYXJib3JuIGFuZCBPaGlvIGNvdW50aWVzIGhhdmUgYmVlbiBsaWtlIEFtZXJpY2EvTmV3X1lvcmsuCiAjCkBAIC03MTIsMjIgKzcwNywxNiBAQAogIyB0aGF0IHRoZXkgd291bGQgYmUgYW1iaWd1b3VzIGlmIHdlIGxlZnQgdGhlbSBhdCB0aGUgJ0FtZXJpY2EnIGxldmVsLgogIyBTbyB3ZSByZWx1Y3RhbnRseSBwdXQgdGhlbSBhbGwgaW4gYSBzdWJkaXJlY3RvcnkgJ0FtZXJpY2EvSW5kaWFuYScuCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0xNik6Ci0jIGh0dHA6Ly93d3cubWNjc2MuZWR1L3RpbWUuaHRtbCBzYXlzIHRoYXQgSW5kaWFuYSB3aWxsIHVzZSBEU1Qgc3RhcnRpbmcgMjAwNi4KLQotIyBGcm9tIE5hdGhhbiBTdHJhdHRvbiBUcmVhZHdheSAoMjAwNi0wMy0zMCk6Ci0jIGh0dHA6Ly93d3cuZG90Lmdvdi9hZmZhaXJzL2RvdDA0MDYuaHRtIFszNzA1IEJdCi0jIEZyb20gRGVib3JhaCBHb2xkc21pdGggKDIwMDYtMDEtMTgpOgotIyBodHRwOi8vZG1zZXMuZG90Lmdvdi9kb2NpbWFnZXMvcGRmOTUvMzgyMzI5X3dlYi5wZGYgWzIuOSBNQl0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMS0yMCk6Ci0jIEl0IHNheXMgIkRPVCBpcyByZWxvY2F0aW5nIHRoZSB0aW1lIHpvbmUgYm91bmRhcnkgaW4gSW5kaWFuYSB0byBtb3ZlIFN0YXJrZSwKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0yNik6CisjIGh0dHBzOi8vd3d3LmZlZGVyYWxyZWdpc3Rlci5nb3YvYXJ0aWNsZXMvMjAwNi8wMS8yMC8wNi01NjMvc3RhbmRhcmQtdGltZS16b25lLWJvdW5kYXJ5LWluLXRoZS1zdGF0ZS1vZi1pbmRpYW5hCisjIHNheXMgIkRPVCBpcyByZWxvY2F0aW5nIHRoZSB0aW1lIHpvbmUgYm91bmRhcnkgaW4gSW5kaWFuYSB0byBtb3ZlIFN0YXJrZSwKICMgUHVsYXNraSwgS25veCwgRGF2aWVzcywgTWFydGluLCBQaWtlLCBEdWJvaXMsIGFuZCBQZXJyeSBDb3VudGllcyBmcm9tIHRoZQogIyBFYXN0ZXJuIFRpbWUgWm9uZSB0byB0aGUgQ2VudHJhbCBUaW1lIFpvbmUuLi4uIFRoZSBlZmZlY3RpdmUgZGF0ZSBvZgotIyB0aGlzIHJ1bGUgaXMgMjpPTyBhLm0uIEVTVCBTdW5kYXksIEFwcmlsIDIsIDIwMDYsIHdoaWNoIGlzIHRoZQorIyB0aGlzIHJ1bGUgaXMgMiBhLm0uIEVTVCBTdW5kYXksIEFwcmlsIDIsIDIwMDYsIHdoaWNoIGlzIHRoZQogIyBjaGFuZ2VvdmVyIGRhdGUgZnJvbSBzdGFuZGFyZCB0aW1lIHRvIERheWxpZ2h0IFNhdmluZyBUaW1lLiIKLSMgU3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgbWVhbnMgdGhlIGFmZmVjdGVkIGNvdW50aWVzIHdpbGwgY2hhbmdlIHRoZWlyCi0jIGNsb2NrcyB0d2ljZSB0aGF0IG5pZ2h0LCBidXQgdGhpcyBvYnZpb3VzbHkgaXMgaW4gZXJyb3IuICBUaGUgaW50ZW50Ci0jIGlzIHRoYXQgMDE6NTk6NTkgRVNUIGJlIGZvbGxvd2VkIGJ5IDAyOjAwOjAwIENEVC4KKyMgU3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgbWVhbnQgdGhlIGFmZmVjdGVkIGNvdW50aWVzIGNoYW5nZWQgdGhlaXIKKyMgY2xvY2tzIHR3aWNlIHRoYXQgbmlnaHQsIGJ1dCB0aGlzIG9idmlvdXNseSB3YXMgaW4gZXJyb3IuICBUaGUgaW50ZW50CisjIHdhcyB0aGF0IDAxOjU5OjU5IEVTVCBiZSBmb2xsb3dlZCBieSAwMjowMDowMCBDRFQuCiAKICMgRnJvbSBHd2lsbGltIExhdyAoMjAwNy0wMi0xMCk6CiAjIFRoZSBBc3NvY2lhdGVkIFByZXNzIGhhcyBiZWVuIHJlcG9ydGluZyB0aGF0IFB1bGFza2kgQ291bnR5LCBJbmRpYW5hIGlzCkBAIC03MzksMTMgKzcyOCwxMyBAQAogUnVsZSBJbmRpYW5hcG9saXMgMTk0MQkxOTU0CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKIFJ1bGUgSW5kaWFuYXBvbGlzIDE5NDYJMTk1NAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMgLTU6NDQ6MzggLSBMTVQgMTg4MyBOb3YgMTggMTI6MTU6MjIKK1pvbmUgQW1lcmljYS9JbmRpYW5hL0luZGlhbmFwb2xpcyAtNTo0NDozOCAtIExNVAkxODgzIE5vdiAxOCAxMjoxNToyMgogCQkJLTY6MDAJVVMJQyVzVAkxOTIwCiAJCQktNjowMCBJbmRpYW5hcG9saXMgQyVzVAkxOTQyCiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIEluZGlhbmFwb2xpcyBDJXNUCTE5NTUgQXByIDI0IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NTcgU2VwIDI5IDI6MDAKLQkJCS02OjAwCS0JQ1NUCTE5NTggQXByIDI3IDI6MDAKKwkJCS02OjAwIEluZGlhbmFwb2xpcyBDJXNUCTE5NTUgQXByIDI0ICAyOjAwCisJCQktNTowMAktCUVTVAkxOTU3IFNlcCAyOSAgMjowMAorCQkJLTY6MDAJLQlDU1QJMTk1OCBBcHIgMjcgIDI6MDAKIAkJCS01OjAwCS0JRVNUCTE5NjkKIAkJCS01OjAwCVVTCUUlc1QJMTk3MQogCQkJLTU6MDAJLQlFU1QJMjAwNgpAQCAtNzYxLDEwICs3NTAsMTAgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW1lcmljYS9JbmRpYW5hL01hcmVuZ28gLTU6NDU6MjMgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTQ6MzcKIAkJCS02OjAwCVVTCUMlc1QJMTk1MQotCQkJLTY6MDAJTWFyZW5nbwlDJXNUCTE5NjEgQXByIDMwIDI6MDAKKwkJCS02OjAwCU1hcmVuZ28JQyVzVAkxOTYxIEFwciAzMCAgMjowMAogCQkJLTU6MDAJLQlFU1QJMTk2OQotCQkJLTU6MDAJVVMJRSVzVAkxOTc0IEphbiAgNiAyOjAwCi0JCQktNjowMAkxOjAwCUNEVAkxOTc0IE9jdCAyNyAyOjAwCisJCQktNTowMAlVUwlFJXNUCTE5NzQgSmFuICA2ICAyOjAwCisJCQktNjowMAkxOjAwCUNEVAkxOTc0IE9jdCAyNyAgMjowMAogCQkJLTU6MDAJVVMJRSVzVAkxOTc2CiAJCQktNTowMAktCUVTVAkyMDA2CiAJCQktNTowMAlVUwlFJXNUCkBAIC03ODUsMTEgKzc3NCwxMSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvVmluY2VubmVzIC01OjUwOjA3IC0gTE1UCTE4ODMgTm92IDE4IDEyOjA5OjUzCiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIFZpbmNlbm5lcwlDJXNUCTE5NjQgQXByIDI2IDI6MDAKKwkJCS02OjAwIFZpbmNlbm5lcwlDJXNUCTE5NjQgQXByIDI2ICAyOjAwCiAJCQktNTowMAktCUVTVAkxOTY5CiAJCQktNTowMAlVUwlFJXNUCTE5NzEKLQkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QJMjAwNyBOb3YgIDQgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMjAwNyBOb3YgIDQgIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QKICMKICMgUGVycnkgQ291bnR5LCBJbmRpYW5hLCBzd2l0Y2hlZCBmcm9tIGVhc3Rlcm4gdG8gY2VudHJhbCB0aW1lIGluIEFwcmlsIDIwMDYuCkBAIC04MDYsMTAgKzc5NSwxMCBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvVGVsbF9DaXR5IC01OjQ3OjAzIC0gTE1UCTE4ODMgTm92IDE4IDEyOjEyOjU3CiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIFBlcnJ5CUMlc1QJMTk2NCBBcHIgMjYgMjowMAorCQkJLTY6MDAgUGVycnkJQyVzVAkxOTY0IEFwciAyNiAgMjowMAogCQkJLTU6MDAJLQlFU1QJMTk2OQogCQkJLTU6MDAJVVMJRSVzVAkxOTcxCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCisJCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAgMjowMAogCQkJLTY6MDAJVVMJQyVzVAogIwogIyBQaWtlIENvdW50eSwgSW5kaWFuYSBtb3ZlZCBmcm9tIGNlbnRyYWwgdG8gZWFzdGVybiB0aW1lIGluIDE5NzcsCkBAIC04MjIsMTEgKzgxMSwxMSBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvUGV0ZXJzYnVyZyAtNTo0OTowNyAtIExNVAkxODgzIE5vdiAxOCAxMjoxMDo1MwogCQkJLTY6MDAJVVMJQyVzVAkxOTU1Ci0JCQktNjowMAlQaWtlCUMlc1QJMTk2NSBBcHIgMjUgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2NiBPY3QgMzAgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkxOTc3IE9jdCAzMCAyOjAwCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCi0JCQktNjowMAlVUwlDJXNUCTIwMDcgTm92ICA0IDI6MDAKKwkJCS02OjAwCVBpa2UJQyVzVAkxOTY1IEFwciAyNSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2NiBPY3QgMzAgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMTk3NyBPY3QgMzAgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyICAyOjAwCisJCQktNjowMAlVUwlDJXNUCTIwMDcgTm92ICA0ICAyOjAwCiAJCQktNTowMAlVUwlFJXNUCiAjCiAjIFN0YXJrZSBDb3VudHksIEluZGlhbmEgbW92ZWQgZnJvbSBjZW50cmFsIHRvIGVhc3Rlcm4gdGltZSBpbiAxOTkxLApAQCAtODQ0LDEwICs4MzMsMTAgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW1lcmljYS9JbmRpYW5hL0tub3ggLTU6NDY6MzAgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTM6MzAKIAkJCS02OjAwCVVTCUMlc1QJMTk0NwotCQkJLTY6MDAJU3RhcmtlCUMlc1QJMTk2MiBBcHIgMjkgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2MyBPY3QgMjcgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkxOTkxIE9jdCAyNyAyOjAwCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCisJCQktNjowMAlTdGFya2UJQyVzVAkxOTYyIEFwciAyOSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk2MyBPY3QgMjcgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMTk5MSBPY3QgMjcgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyICAyOjAwCiAJCQktNjowMAlVUwlDJXNUCiAjCiAjIFB1bGFza2kgQ291bnR5LCBJbmRpYW5hLCBzd2l0Y2hlZCBmcm9tIGVhc3Rlcm4gdG8gY2VudHJhbCB0aW1lIGluCkBAIC04NjAsMTcgKzg0OSwxNyBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0luZGlhbmEvV2luYW1hYyAtNTo0NjoyNSAtIExNVAkxODgzIE5vdiAxOCAxMjoxMzozNQogCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMAlQdWxhc2tpCUMlc1QJMTk2MSBBcHIgMzAgMjowMAorCQkJLTY6MDAJUHVsYXNraQlDJXNUCTE5NjEgQXByIDMwICAyOjAwCiAJCQktNTowMAktCUVTVAkxOTY5CiAJCQktNTowMAlVUwlFJXNUCTE5NzEKLQkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QJMjAwNyBNYXIgMTEgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgIDI6MDAKKwkJCS02OjAwCVVTCUMlc1QJMjAwNyBNYXIgMTEgIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QKICMKICMgU3dpdHplcmxhbmQgQ291bnR5LCBJbmRpYW5hLCBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk3MyB0aHJvdWdoIDIwMDUuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvSW5kaWFuYS9WZXZheSAtNTo0MDoxNiAtCUxNVAkxODgzIE5vdiAxOCAxMjoxOTo0NAotCQkJLTY6MDAJVVMJQyVzVAkxOTU0IEFwciAyNSAyOjAwCisJCQktNjowMAlVUwlDJXNUCTE5NTQgQXByIDI1ICAyOjAwCiAJCQktNTowMAktCUVTVAkxOTY5CiAJCQktNTowMAlVUwlFJXNUCTE5NzMKIAkJCS01OjAwCS0JRVNUCTIwMDYKQEAgLTg5MSwxOCArODgwLDE3IEBACiAJCQktNjowMAlVUwlDJXNUCTE5MjEKIAkJCS02OjAwIExvdWlzdmlsbGUgQyVzVAkxOTQyCiAJCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIExvdWlzdmlsbGUgQyVzVAkxOTYxIEp1bCAyMyAyOjAwCisJCQktNjowMCBMb3Vpc3ZpbGxlIEMlc1QJMTk2MSBKdWwgMjMgIDI6MDAKIAkJCS01OjAwCS0JRVNUCTE5NjgKLQkJCS01OjAwCVVTCUUlc1QJMTk3NCBKYW4gIDYgMjowMAotCQkJLTY6MDAJMTowMAlDRFQJMTk3NCBPY3QgMjcgMjowMAorCQkJLTU6MDAJVVMJRSVzVAkxOTc0IEphbiAgNiAgMjowMAorCQkJLTY6MDAJMTowMAlDRFQJMTk3NCBPY3QgMjcgIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QKICMKICMgV2F5bmUgQ291bnR5LCBLZW50dWNreQogIwotIyBGcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFrZS1jdW1iZXJsYW5kLmNvbS9saWZlL2FyY2hpdmUvbmV3czk5MDEyOXRpbWUuc2h0bWwiPgotIyBMYWtlIEN1bWJlcmxhbmQgTElGRQotIyA8L2E+ICgxOTk5LTAxLTI5KSB2aWEgV0tZTS0xMDEuNzoKKyMgRnJvbSBMYWtlIEN1bWJlcmxhbmQgTElGRQorIyBodHRwOi8vd3d3Lmxha2UtY3VtYmVybGFuZC5jb20vbGlmZS9hcmNoaXZlL25ld3M5OTAxMjl0aW1lLnNodG1sCisjICgxOTk5LTAxLTI5KSB2aWEgV0tZTS0xMDEuNzoKICMgQ2xpbnRvbiBDb3VudHkgaGFzIGpvaW5lZCBXYXluZSBDb3VudHkgaW4gYXNraW5nIHRoZSBEb1QgdG8gY2hhbmdlIGZyb20KICMgdGhlIENlbnRyYWwgdG8gdGhlIEVhc3Rlcm4gdGltZSB6b25lLi4uLiAgVGhlIFdheW5lIENvdW50eSBnb3Zlcm5tZW50IG1hZGUKICMgdGhlIHNhbWUgcmVxdWVzdCBpbiBEZWNlbWJlci4gIEFuZCB3aGlsZSBSdXNzZWxsIENvdW50eSBvZmZpY2lhbHMgaGF2ZSBub3QKQEAgLTkxOSw5ICs5MDcsOCBAQAogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA3LTE2KToKICMgVGhlIGZpbmFsIHJ1bGUgd2FzIHB1Ymxpc2hlZCBpbiB0aGUKLSMgPGEgaHJlZj0iaHR0cDovL2Zyd2ViZ2F0ZS5hY2Nlc3MuZ3BvLmdvdi9jZ2ktYmluL2dldGRvYy5jZ2k/ZGJuYW1lPTIwMDBfcmVnaXN0ZXImZG9jaWQ9ZnIxN2F1MDAtMjIiPgotIyBGZWRlcmFsIFJlZ2lzdGVyIDY1LCAxNjAgKDIwMDAtMDgtMTcpLCBwYWdlIDUwMTU0LTUwMTU4LgotIyA8L2E+CisjIEZlZGVyYWwgUmVnaXN0ZXIgNjUsIDE2MCAoMjAwMC0wOC0xNyksIHBwIDUwMTU0LTUwMTU4LgorIyBodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MjAwMF9yZWdpc3RlciZkb2NpZD1mcjE3YXUwMC0yMgogIwogWm9uZSBBbWVyaWNhL0tlbnR1Y2t5L01vbnRpY2VsbG8gLTU6Mzk6MjQgLSBMTVQJMTg4MyBOb3YgMTggMTI6MjA6MzYKIAkJCS02OjAwCVVTCUMlc1QJMTk0NgpAQCAtOTQ2LDkgKzkzMyw4IEBACiAjIFNlZSBBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXIgZm9yIHRoZSBPbGl2ZXIgQ291bnR5LCBORCBjaGFuZ2UuCiAjIFdlc3QgV2VuZG92ZXIsIE5WIG9mZmljaWFsbHkgc3dpdGNoZWQgZnJvbSBQYWNpZmljIHRvIG1vdW50YWluIHRpbWUgb24KICMgMTk5OS0xMC0zMS4gIFNlZSB0aGUKLSMgPGEgaHJlZj0iaHR0cDovL2Zyd2ViZ2F0ZS5hY2Nlc3MuZ3BvLmdvdi9jZ2ktYmluL2dldGRvYy5jZ2k/ZGJuYW1lPTE5OTlfcmVnaXN0ZXImZG9jaWQ9ZnIyMW9jOTktMTUiPgotIyBGZWRlcmFsIFJlZ2lzdGVyIDY0LCAyMDMgKDE5OTktMTAtMjEpLCBwYWdlIDU2NzA1LTU2NzA3LgotIyA8L2E+CisjIEZlZGVyYWwgUmVnaXN0ZXIgNjQsIDIwMyAoMTk5OS0xMC0yMSksIHBwIDU2NzA1LTU2NzA3LgorIyBodHRwOi8vZnJ3ZWJnYXRlLmFjY2Vzcy5ncG8uZ292L2NnaS1iaW4vZ2V0ZG9jLmNnaT9kYm5hbWU9MTk5OV9yZWdpc3RlciZkb2NpZD1mcjIxb2M5OS0xNQogIyBIb3dldmVyLCB0aGUgRmVkZXJhbCBSZWdpc3RlciBzYXlzIHRoYXQgV2VzdCBXZW5kb3ZlciBhbHJlYWR5IG9wZXJhdGVkCiAjIG9uIG1vdW50YWluIHRpbWUsIGFuZCB0aGUgcnVsZSBtZXJlbHkgbWFkZSB0aGlzIG9mZmljaWFsOwogIyBoZW5jZSBhIHNlcGFyYXRlIHR6IGVudHJ5IGlzIG5vdCBuZWVkZWQuCkBAIC05ODYsMTIgKzk3MiwxMiBAQAogUnVsZQlEZXRyb2l0CTE5NjcJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvRGV0cm9pdAktNTozMjoxMSAtCUxNVAkxOTA1Ci0JCQktNjowMAktCUNTVAkxOTE1IE1heSAxNSAyOjAwCisJCQktNjowMAktCUNTVAkxOTE1IE1heSAxNSAgMjowMAogCQkJLTU6MDAJLQlFU1QJMTk0MgogCQkJLTU6MDAJVVMJRSVzVAkxOTQ2CiAJCQktNTowMAlEZXRyb2l0CUUlc1QJMTk3MwogCQkJLTU6MDAJVVMJRSVzVAkxOTc1Ci0JCQktNTowMAktCUVTVAkxOTc1IEFwciAyNyAyOjAwCisJCQktNTowMAktCUVTVAkxOTc1IEFwciAyNyAgMjowMAogCQkJLTU6MDAJVVMJRSVzVAogIwogIyBEaWNraW5zb24sIEdvZ2ViaWMsIElyb24sIGFuZCBNZW5vbWluZWUgQ291bnRpZXMsIE1pY2hpZ2FuLApAQCAtMTAwNCw4ICs5OTAsOCBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL01lbm9taW5lZQktNTo1MDoyNyAtCUxNVAkxODg1IFNlcCAxOCAxMjowMAogCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMCBNZW5vbWluZWUJQyVzVAkxOTY5IEFwciAyNyAyOjAwCi0JCQktNTowMAktCUVTVAkxOTczIEFwciAyOSAyOjAwCisJCQktNjowMCBNZW5vbWluZWUJQyVzVAkxOTY5IEFwciAyNyAgMjowMAorCQkJLTU6MDAJLQlFU1QJMTk3MyBBcHIgMjkgIDI6MDAKIAkJCS02OjAwCVVTCUMlc1QKIAogIyBOYXZhc3NhCkBAIC0xMDQyLDkgKzEwMjgsOSBAQAogIwlXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLAogIwl3aGljaCBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCiAjCi0jCTxhIGhyZWY9Imh0dHA6Ly93d3cucGV0dHN3b29kdmlsbGFnZS5jby51ay9EYXlsaWdodF9TYXZpbmdzX1dpbGxpYW1fV2lsbGV0dC5wZGYiPgogIwlXaWxsaWFtIFdpbGxldHQsIFRoZSBXYXN0ZSBvZiBEYXlsaWdodCwgMTl0aCBlZGl0aW9uCi0jCTwvYT4gKDE5MTQtMDMpCisjCTxodHRwOi8vY3MudWNsYS5lZHUvfmVnZ2VydC9UaGUtV2FzdGUtb2YtRGF5bGlnaHQtMTl0aC5wZGY+CisjCVtQREZdICgxOTE0LTAzKQogIwogIwlNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQKICMJPGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5Pi4KQEAgLTEwNTMsMTEgKzEwMzksMTEgQEAKIAogIyBDYW5hZGEKIAotIyBGcm9tIEFsYWluIExhQm9udDxlJz4gKDE5OTQtMTEtMTQpOgorIyBGcm9tIEFsYWluIExhQm9udMOpICgxOTk0LTExLTE0KToKICMgSSBwb3N0IGhlcmUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIHN0YW5kYXJkaXplZCBpbiBDYW5hZGEKICMgZm9yIGJvdGggRW5nbGlzaCBhbmQgRnJlbmNoIGluIHRoZSBDQU4vQ1NBLVoyMzQuNC04OSBzdGFuZGFyZC4uLi4KICMKLSMJVVRDCVN0YW5kYXJkIHRpbWUJRGF5bGlnaHQgc2F2aW5ncyB0aW1lCisjCVVUQwlTdGFuZGFyZCB0aW1lCURheWxpZ2h0IHNhdmluZyB0aW1lCiAjCW9mZnNldAlGcmVuY2gJRW5nbGlzaAlGcmVuY2gJRW5nbGlzaAogIwktMjozMAktCS0JSEFUCU5EVAogIwktMwktCS0JSEFBCUFEVApAQCAtMTA3MCw3ICsxMDU2LDcgQEAKICMJLTkJSE5ZCVlTVAktCS0KICMKICMJSE46IEhldXJlIE5vcm1hbGUJU1Q6IFN0YW5kYXJkIFRpbWUKLSMJSEE6IEhldXJlIEF2YW5jPGUnPmUJRFQ6IERheWxpZ2h0IHNhdmluZyBUaW1lCisjCUhBOiBIZXVyZSBBdmFuY8OpZQlEVDogRGF5bGlnaHQgc2F2aW5nIFRpbWUKICMKICMJQTogZGUgbCdBdGxhbnRpcXVlCUF0bGFudGljCiAjCUM6IGR1IENlbnRyZQkJQ2VudHJhbApAQCAtMTA4NSw3ICsxMDcxLDcgQEAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5NC0xMS0yMik6CiAjIEFsYXMsIHRoaXMgc29ydCBvZiB0aGluZyBtdXN0IGJlIGhhbmRsZWQgYnkgbG9jYWxpemF0aW9uIHNvZnR3YXJlLgogCi0jIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgZGF0YSBmb3IgQ2FuYWRhIGFyZSBhbGwgZnJvbSBTaGFua3MKKyMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZSBkYXRhIGVudHJpZXMgZm9yIENhbmFkYSBhcmUgYWxsIGZyb20gU2hhbmtzCiAjICYgUG90dGVuZ2VyLgogCiAjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA2LTA0LTAxLCAyMDA2LTA0LTI1LCAyMDA2LTA2LTI2LCAyMDA3LTAxLTMxLApAQCAtMTEzNCwxNSArMTEyMCwxNSBAQAogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMjUpOgogIyBILiBEYXZpZCBNYXR0aGV3cyBhbmQgTWFyeSBWaW5jZW50J3MgbWFwCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2FuYWRpYW5nZW9ncmFwaGljLmNhL01hZ2F6aW5lL1NPOTgvZ2VvbWFwLmFzcCI+CiAjICJJdCdzIGFib3V0IFRJTUUiLCBfQ2FuYWRpYW4gR2VvZ3JhcGhpY18gKFNlcHRlbWJlci1PY3RvYmVyIDE5OTgpCi0jIDwvYT4gY29udGFpbnMgZGV0YWlsZWQgYm91bmRhcmllcyBmb3IgcmVnaW9ucyBvYnNlcnZpbmcgbm9uc3RhbmRhcmQKKyMgaHR0cDovL3d3dy5jYW5hZGlhbmdlb2dyYXBoaWMuY2EvTWFnYXppbmUvU085OC9nZW9tYXAuYXNwCisjIGNvbnRhaW5zIGRldGFpbGVkIGJvdW5kYXJpZXMgZm9yIHJlZ2lvbnMgb2JzZXJ2aW5nIG5vbnN0YW5kYXJkCiAjIHRpbWUgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lIGFycmFuZ2VtZW50cyBpbiBDYW5hZGEgY2lyY2EgMTk5OC4KICMKLSMgSU5NUywgdGhlIEluc3RpdHV0ZSBmb3IgTmF0aW9uYWwgTWVhc3VyZW1lbnQgU3RhbmRhcmRzIGluIE90dGF3YSwgaGFzIDxhCi0jIGhyZWY9Imh0dHA6Ly9pbm1zLWllbm0ubnJjLWNucmMuZ2MuY2EvZW4vdGltZV9zZXJ2aWNlcy9kYXlsaWdodF9zYXZpbmdfZS5waHAiPgorIyBJTk1TLCB0aGUgSW5zdGl0dXRlIGZvciBOYXRpb25hbCBNZWFzdXJlbWVudCBTdGFuZGFyZHMgaW4gT3R0YXdhLCBoYXMKICMgaW5mb3JtYXRpb24gYWJvdXQgc3RhbmRhcmQgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lIHpvbmVzIGluIENhbmFkYS4KLSMgPC9hPiAodXBkYXRlZCBwZXJpb2RpY2FsbHkpLgorIyBodHRwOi8vaW5tcy1pZW5tLm5yYy1jbnJjLmdjLmNhL2VuL3RpbWVfc2VydmljZXMvZGF5bGlnaHRfc2F2aW5nX2UucGhwCisjICh1cGRhdGVkIHBlcmlvZGljYWxseSkuCiAjIEl0cyB1bm9mZmljaWFsIGluZm9ybWF0aW9uIGlzIG9mdGVuIHRha2VuIGZyb20gTWF0dGhld3MgYW5kIFZpbmNlbnQuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNi0yNyk6CkBAIC0xMTUxLDkgKzExMzcsNyBAQAogCiAjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDExLTEyLTAxKQogIyBJbiB0aGUgZmlyc3Qgb2YgVGFtbXkgSGFyZHdpY2sncyBhcnRpY2xlcwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmlsb3ZlY3Jlc3Rvbi5jb20vP3A9YXJ0aWNsZXMmdD1zcGVjJmFyPTI2MCI+CiAjIGh0dHA6Ly93d3cuaWxvdmVjcmVzdG9uLmNvbS8/cD1hcnRpY2xlcyZ0PXNwZWMmYXI9MjYwCi0jIDwvYT4KICMgc2hlIHF1b3RlcyB0aGUgRnJpZGF5IE5vdmVtYmVyIDEvMTkxOCBlZGl0aW9uIG9mIHRoZSBDcmVzdG9uIFJldmlldy4KICMgVGhlIHF1b3RlIGluY2x1ZGVzIHRoZXNlIHR3byBzdGF0ZW1lbnRzOgogIyAnU3VuZGF5IHRoZSBDUFIgd2VudCBiYWNrIHRvIHRoZSBvbGQgc3lzdGVtIG9mIHRpbWUuLi4nCkBAIC0xMjIxLDkgKzEyMDUsNyBAQAogIyBUaW1lIHRvIFN0YW5kYXJkIFRpbWUgYW5kIGZyb20gU3RhbmRhcmQgVGltZSB0byBEYXlsaWdodCBTYXZpbmdzIFRpbWUKICMgbm93IG9jY3VycyBhdCAyOjAwQU0uCiAjIC4uLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzc2VtYmx5Lm5sLmNhL2xlZ2lzbGF0aW9uL3NyL2FubnVhbHN0YXR1dGVzLzIwMTEvMTEwNi5jaHAuaHRtIj4KICMgaHR0cDovL3d3dy5hc3NlbWJseS5ubC5jYS9sZWdpc2xhdGlvbi9zci9hbm51YWxzdGF0dXRlcy8yMDExLzExMDYuY2hwLmh0bQotIyA8L2E+CiAjIC4uLgogIyBNSUNIQUVMIFBFTExFWSAgfCAgTWFuYWdlciBvZiBFbnRlcnByaXNlIEFyY2hpdGVjdHVyZSAtIFNvbHV0aW9uIERlbGl2ZXJ5CiAjIE9mZmljZSBvZiB0aGUgQ2hpZWYgSW5mb3JtYXRpb24gT2ZmaWNlcgpAQCAtMTI1OSw3ICsxMjQxLDcgQEAKIAkJCS0zOjMwCS0JTlNUCTE5MzYKIAkJCS0zOjMwCVN0Sm9obnMJTiVzVAkxOTQyIE1heSAxMQogCQkJLTM6MzAJQ2FuYWRhCU4lc1QJMTk0NgotCQkJLTM6MzAJU3RKb2hucwlOJXNUCTE5NjYgTWFyIDE1IDI6MDAKKwkJCS0zOjMwCVN0Sm9obnMJTiVzVAkxOTY2IE1hciAxNSAgMjowMAogCQkJLTQ6MDAJU3RKb2hucwlBJXNUCTIwMTEgTm92CiAJCQktNDowMAlDYW5hZGEJQSVzVAogCkBAIC0xMzIwLDcgKzEzMDIsNyBAQAogWm9uZSBBbWVyaWNhL0hhbGlmYXgJLTQ6MTQ6MjQgLQlMTVQJMTkwMiBKdW4gMTUKIAkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTE4CiAJCQktNDowMAlDYW5hZGEJQSVzVAkxOTE5Ci0JCQktNDowMAlIYWxpZmF4CUElc1QJMTk0MiBGZWIgIDkgMjowMHMKKwkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTQyIEZlYiAgOSAgMjowMHMKIAkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NDYKIAkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTc0CiAJCQktNDowMAlDYW5hZGEJQSVzVApAQCAtMTM3OSw3ICsxMzYxLDcgQEAKICMgbWVyaWRpYW4gaXMgc3VwcG9zZWQgdG8gb2JzZXJ2ZSBBU1QsIGJ1dCByZXNpZGVudHMgYXMgZmFyIGVhc3QgYXMKICMgTmF0YXNocXVhbiB1c2UgRVNUL0VEVCwgYW5kIHJlc2lkZW50cyBlYXN0IG9mIE5hdGFzaHF1YW4gdXNlIEFTVC4KICMgVGhlIFF1ZWJlYyBkZXBhcnRtZW50IG9mIGp1c3RpY2Ugd3JpdGVzIGluCi0jICJUaGUgc2l0dWF0aW9uIGluIE1pbmdhbmllIGFuZCBCYXNzZS1Db3RlLU5vcmQiCisjICJUaGUgc2l0dWF0aW9uIGluIE1pbmdhbmllIGFuZCBCYXNzZS1Dw7R0ZS1Ob3JkIgogIyBodHRwOi8vd3d3Lmp1c3RpY2UuZ291di5xYy5jYS9lbmdsaXNoL3B1YmxpY2F0aW9ucy9nZW5lcmFsZS90ZW1wcy1taW5nYW5pZS1hLmh0bQogIyB0aGF0IHRoZSBjb2FzdGFsIHN0cmlwIGZyb20ganVzdCBlYXN0IG9mIE5hdGFzaHF1YW4gdG8gQmxhbmMtU2FibG9uCiAjIG9ic2VydmVzIEF0bGFudGljIHN0YW5kYXJkIHRpbWUgYWxsIHllYXIgcm91bmQuCkBAIC0xMzg3LDcgKzEzNjksNiBAQAogIyBzYXlzIHRoaXMgY29tbW9uIHByYWN0aWNlIHdhcyBjb2RpZmllZCBpbnRvIGxhdyBhcyBvZiAyMDA3LgogIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgZ3Vlc3MgdGhpcyBwcmFjdGljZSBiZWdhbiBhcm91bmQgMTk3MCwgY29udHJhIHRvCiAjIFNoYW5rcyAmIFBvdHRlbmdlciB3aG8gaGF2ZSB0aGlzIHJlZ2lvbiBvYnNlcnZpbmcgQVNUL0FEVC4KLSMgZm9yIHBvc3QtMTk3MCBkYXRhIEFtZXJpY2EvUHVlcnRvX1JpY28uCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCU1vbnQJMTkxNwlvbmx5CS0JTWFyCTI1CTI6MDAJMTowMAlECkBAIC0xNDAxLDE4ICsxMzgyLDEwIEBACiBSdWxlCU1vbnQJMTkyNAlvbmx5CS0JTWF5CTE3CTI6MDAJMTowMAlECiBSdWxlCU1vbnQJMTkyNAkxOTI2CS0JU2VwCWxhc3RTdW4JMjozMAkwCVMKIFJ1bGUJTW9udAkxOTI1CTE5MjYJLQlNYXkJU3VuPj0xCTI6MDAJMTowMAlECi0jIFRoZSAxOTI3LXRvLTE5MzcgcnVsZXMgY2FuIGJlIGV4cHJlc3NlZCBtb3JlIHNpbXBseSBhcwotIyBSdWxlCU1vbnQJMTkyNwkxOTM3CS0JQXByCWxhc3RTYXQJMjQ6MDAJMTowMAlECi0jIFJ1bGUJTW9udAkxOTI3CTE5MzcJLQlTZXAJbGFzdFNhdAkyNDowMAkwCVMKLSMgVGhlIHJ1bGVzIGJlbG93IGF2b2lkIHVzZSBvZiAyNDowMAotIyAod2hpY2ggcHJlLTE5OTggdmVyc2lvbnMgb2YgemljIGNhbm5vdCBoYW5kbGUpLgotUnVsZQlNb250CTE5MjcJb25seQktCU1heQkxCTA6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkyNwkxOTMyCS0JU2VwCWxhc3RTdW4JMDowMAkwCVMKLVJ1bGUJTW9udAkxOTI4CTE5MzEJLQlBcHIJbGFzdFN1bgkwOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MzIJb25seQktCU1heQkxCTA6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkzMwkxOTQwCS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTMzCW9ubHkJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlNb250CTE5MzQJMTkzOQktCVNlcAlsYXN0U3VuCTA6MDAJMAlTCitSdWxlCU1vbnQJMTkyNwkxOTM3CS0JQXByCWxhc3RTYXQJMjQ6MDAJMTowMAlECitSdWxlCU1vbnQJMTkyNwkxOTM3CS0JU2VwCWxhc3RTYXQJMjQ6MDAJMAlTCitSdWxlCU1vbnQJMTkzOAkxOTQwCS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKK1J1bGUJTW9udAkxOTM4CTE5MzkJLQlTZXAJbGFzdFN1bgkwOjAwCTAJUwogUnVsZQlNb250CTE5NDYJMTk3MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECiBSdWxlCU1vbnQJMTk0NQkxOTQ4CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKIFJ1bGUJTW9udAkxOTQ5CTE5NTAJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwpAQCAtMTQyNiw3ICsxMzk5LDcgQEAKIFpvbmUgQW1lcmljYS9Nb250cmVhbAktNDo1NDoxNiAtCUxNVAkxODg0CiAJCQktNTowMAlNb250CUUlc1QJMTkxOAogCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTkxOQotCQkJLTU6MDAJTW9udAlFJXNUCTE5NDIgRmViICA5IDI6MDBzCisJCQktNTowMAlNb250CUUlc1QJMTk0MiBGZWIgIDkgIDI6MDBzCiAJCQktNTowMAlDYW5hZGEJRSVzVAkxOTQ2CiAJCQktNTowMAlNb250CUUlc1QJMTk3NAogCQkJLTU6MDAJQ2FuYWRhCUUlc1QKQEAgLTE0NDgsNyArMTQyMSw3IEBACiAjIGhhdmUgYWxyZWFkeSBkb25lIHNvLiAgSW4gT3JpbGxpYSBEU1Qgd2FzIHRvIHJ1biB1bnRpbCBTYXR1cmRheSwKICMgMTkxMi0wOC0zMSAobm8gdGltZSBtZW50aW9uZWQpLCBidXQgaXQgd2FzIG1ldCB3aXRoIGNvbnNpZGVyYWJsZQogIyBob3N0aWxpdHkgZnJvbSBjZXJ0YWluIHNlZ21lbnRzIG9mIHRoZSBwdWJsaWMsIGFuZCB3YXMgcmV2b2tlZCBhZnRlcgotIyBvbmx5IHR3byB3ZWVrcyAtLSBJIGNvcGllZCBpdCBhcyBTYXR1cmRheSwgMTkxMi0wNy0wNywgMjI6MDAsIGJ1dAorIyBvbmx5IHR3byB3ZWVrcyAtIEkgY29waWVkIGl0IGFzIFNhdHVyZGF5LCAxOTEyLTA3LTA3LCAyMjowMCwgYnV0CiAjIHByZXN1bWFibHkgdGhhdCBzaG91bGQgYmUgLTA3LTA2LiAgKDE5MTItMDYtMTksIC0wNy0xMjsgYWxzbyBsZXR0ZXJzCiAjIGVhcmxpZXIgaW4gSnVuZSkuCiAjCkBAIC0xNDU4LDEwICsxNDMxLDggQEAKICMgTWFyayBCcmFkZXIgd3JpdGVzIHRoYXQgYW4gYXJ0aWNsZSBpbiB0aGUgMTk5Ny0xMC0xNCBUb3JvbnRvIFN0YXIKICMgc2F5cyB0aGF0IEF0aWtva2FuLCBPbnRhcmlvIGN1cnJlbnRseSBkb2VzIG5vdCBvYnNlcnZlIERTVCwKICMgYnV0IHdpbGwgdm90ZSBvbiAxMS0xMCB3aGV0aGVyIHRvIHVzZSBFU1QvRURULgotIyBIZSBhbHNvIHdyaXRlcyB0aGF0IHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmdvdi5vbi5jYS9NQlMvZW5nbGlzaC9wdWJsaWNhdGlvbnMvc3RhdHJlZ3MvY29udHRleHQuaHRtbCI+Ci0jIE9udGFyaW8gVGltZSBBY3QgKDE5OTAsIENoYXB0ZXIgVC45KQotIyA8L2E+CisjIEhlIGFsc28gd3JpdGVzIHRoYXQgdGhlIE9udGFyaW8gVGltZSBBY3QgKDE5OTAsIENoYXB0ZXIgVC45KQorIyBodHRwOi8vd3d3Lmdvdi5vbi5jYS9NQlMvZW5nbGlzaC9wdWJsaWNhdGlvbnMvc3RhdHJlZ3MvY29udHRleHQuaHRtbAogIyBzYXlzIHRoYXQgT250YXJpbyBlYXN0IG9mIDkwVyB1c2VzIEVTVC9FRFQsIGFuZCB3ZXN0IG9mIDkwVyB1c2VzIENTVC9DRFQuCiAjIE9mZmljaWFsbHkgQXRpa29rYW4gaXMgdGhlcmVmb3JlIG9uIENTVC9DRFQsIGFuZCBtb3N0IGxpa2VseSB0aGlzIHJlcG9ydAogIyBjb25jZXJucyBhIG5vbi1vZmZpY2lhbCB0aW1lIG9ic2VydmVkIGFzIGEgbWF0dGVyIG9mIGxvY2FsIHByYWN0aWNlLgpAQCAtMTU0MCw5ICsxNTExLDcgQEAKICMgVGhlIEpvdXJuYWwgb2YgVGhlIFJveWFsIEFzdHJvbm9taWNhbCBTb2NpZXR5IG9mIENhbmFkYSwKICMgdm9sdW1lIDI2LCBudW1iZXIgMiAoRmVicnVhcnkgMTkzMikgYW5kLCBhcyBvZiAyMDEwLTA3LTE3LAogIyB3YXMgYXZhaWxhYmxlIGF0Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hZHNhYnMuaGFydmFyZC5lZHUvZnVsbC8xOTMySlJBU0MuLjI2Li4uNDlTIj4KICMgaHR0cDovL2Fkc2Ficy5oYXJ2YXJkLmVkdS9mdWxsLzE5MzJKUkFTQy4uMjYuLi40OVMKLSMgPC9hPgogIwogIyBJdCBpbmNsdWRlcyB0aGUgdGV4dCBiZWxvdyAoc3RhcnRpbmcgb24gcGFnZSA1Nyk6CiAjCkBAIC0xNTUzLDI2ICsxNTIyLDI2IEBACiAjIGluZyBpbiAxOTMwLiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm92aW5jZSBvZiBRdWViZWMgaXMgZGVmaW5pdGUsCiAjIGZvciB0aGUgb3RoZXIgcHJvdmluY2VzIG9ubHkgYXBwcm94aW1hdGU6CiAjCi0jIAlQcm92aW5jZQlEYXlsaWdodCBzYXZpbmcgdGltZSB1c2VkCisjCVByb3ZpbmNlCURheWxpZ2h0IHNhdmluZyB0aW1lIHVzZWQKICMgUHJpbmNlIEVkd2FyZCBJc2xhbmQJTm90IHVzZWQuCiAjIE5vdmEgU2NvdGlhCQlJbiBIYWxpZmF4IG9ubHkuCiAjIE5ldyBCcnVuc3dpY2sJCUluIFN0LiBKb2huIG9ubHkuCiAjIFF1ZWJlYwkJSW4gdGhlIGZvbGxvd2luZyBwbGFjZXM6Ci0jIAkJCU1vbnRyZWFsCUxhY2hpbmUKLSMgCQkJUXVlYmVjCQlNb250LVJveWFsCi0jIAkJCUxldmlzCQlJYmVydmlsbGUKLSMgCQkJU3QuIExhbWJlcnQJQ2FwIGRlIGxhIE1hZGVsZWluZQotIyAJCQlWZXJkdW4JCUxvcmV0dGV2aWxsZQotIyAJCQlXZXN0bW91bnQJUmljaG1vbmQKLSMgCQkJT3V0cmVtb250CVN0LiBKZXJvbWUKLSMgCQkJTG9uZ3VldWlsCUdyZWVuZmllbGQgUGFyawotIyAJCQlBcnZpZGEJCVdhdGVybG9vCi0jIAkJCUNoYW1ibHktQ2FudG9uCUJlYXVsaWV1Ci0jIAkJCU1lbGJvdXJuZQlMYSBUdXF1ZQotIyAJCQlTdC4gVGhlb3BoaWxlCUJ1Y2tpbmdoYW0KKyMJCQlNb250cmVhbAlMYWNoaW5lCisjCQkJUXVlYmVjCQlNb250LVJveWFsCisjCQkJTMOpdmlzCQlJYmVydmlsbGUKKyMJCQlTdC4gTGFtYmVydAlDYXAgZGUgbGEgTWFkZWzDqGluZQorIwkJCVZlcmR1bgkJTG9yZXR0ZXZpbGxlCisjCQkJV2VzdG1vdW50CVJpY2htb25kCisjCQkJT3V0cmVtb250CVN0LiBKw6lyw7RtZQorIwkJCUxvbmd1ZXVpbAlHcmVlbmZpZWxkIFBhcmsKKyMJCQlBcnZpZGEJCVdhdGVybG9vCisjCQkJQ2hhbWJseS1DYW50b24JQmVhdWxpZXUKKyMJCQlNZWxib3VybmUJTGEgVHVxdWUKKyMJCQlTdC4gVGjDqW9waGlsZQlCdWNraW5naGFtCiAjIE9udGFyaW8JCVVzZWQgZ2VuZXJhbGx5IGluIHRoZSBjaXRpZXMgYW5kIHRvd25zIGFsb25nCi0jIAkJCXRoZSBzb3V0aGVybHkgcGFydCBvZiB0aGUgcHJvdmluY2UuIE5vdAotIyAJCQl1c2VkIGluIHRoZSBub3J0aHdlc3RlcmxoeSBwYXJ0LgorIwkJCXRoZSBzb3V0aGVybHkgcGFydCBvZiB0aGUgcHJvdmluY2UuIE5vdAorIwkJCXVzZWQgaW4gdGhlIG5vcnRod2VzdGVybHkgcGFydC4KICMgTWFuaXRvYmEJCU5vdCB1c2VkLgogIyBTYXNrYXRjaGV3YW4JCUluIFJlZ2luYSBvbmx5LgogIyBBbGJlcnRhCQlOb3QgdXNlZC4KQEAgLTE2NDEsNyArMTYxMCw3IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvVG9yb250bwktNToxNzozMiAtCUxNVAkxODk1CiAJCQktNTowMAlDYW5hZGEJRSVzVAkxOTE5Ci0JCQktNTowMAlUb3JvbnRvCUUlc1QJMTk0MiBGZWIgIDkgMjowMHMKKwkJCS01OjAwCVRvcm9udG8JRSVzVAkxOTQyIEZlYiAgOSAgMjowMHMKIAkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDYKIAkJCS01OjAwCVRvcm9udG8JRSVzVAkxOTc0CiAJCQktNTowMAlDYW5hZGEJRSVzVApAQCAtMTY1NCwxNiArMTYyMywxNiBAQAogCQkJLTU6MDAJQ2FuYWRhCUUlc1QKIFpvbmUgQW1lcmljYS9OaXBpZ29uCS01OjUzOjA0IC0JTE1UCTE4OTUKIAkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDAgU2VwIDI5Ci0JCQktNTowMAkxOjAwCUVEVAkxOTQyIEZlYiAgOSAyOjAwcworCQkJLTU6MDAJMTowMAlFRFQJMTk0MiBGZWIgIDkgIDI6MDBzCiAJCQktNTowMAlDYW5hZGEJRSVzVAogWm9uZSBBbWVyaWNhL1JhaW55X1JpdmVyIC02OjE4OjE2IC0JTE1UCTE4OTUKIAkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDAgU2VwIDI5Ci0JCQktNjowMAkxOjAwCUNEVAkxOTQyIEZlYiAgOSAyOjAwcworCQkJLTY6MDAJMTowMAlDRFQJMTk0MiBGZWIgIDkgIDI6MDBzCiAJCQktNjowMAlDYW5hZGEJQyVzVAogWm9uZSBBbWVyaWNhL0F0aWtva2FuCS02OjA2OjI4IC0JTE1UCTE4OTUKIAkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDAgU2VwIDI5Ci0JCQktNjowMAkxOjAwCUNEVAkxOTQyIEZlYiAgOSAyOjAwcwotCQkJLTY6MDAJQ2FuYWRhCUMlc1QJMTk0NSBTZXAgMzAgMjowMAorCQkJLTY6MDAJMTowMAlDRFQJMTk0MiBGZWIgIDkgIDI6MDBzCisJCQktNjowMAlDYW5hZGEJQyVzVAkxOTQ1IFNlcCAzMCAgMjowMAogCQkJLTU6MDAJLQlFU1QKIAogCkBAIC0xNjc2LDcgKzE2NDUsNyBAQAogIyB0aGUgZmlyc3QgU3VuZGF5IG9mIEFwcmlsIG9mIGVhY2ggeWVhciBhbmQgdHdvIG8nY2xvY2sgQ2VudHJhbAogIyBTdGFuZGFyZCBUaW1lIGluIHRoZSBtb3JuaW5nIG9mIHRoZSBsYXN0IFN1bmRheSBvZiBPY3RvYmVyIG5leHQKICMgZm9sbG93aW5nLCBvbmUgaG91ciBpbiBhZHZhbmNlIG9mIENlbnRyYWwgU3RhbmRhcmQgVGltZS4iLi4uCi0jIEkgYmVsaWV2ZSB0aGF0IHRoZSBFbmdsaXNoIGxlZ2lzbGF0aW9uIFtvZiB0aGUgb2xkIHRpbWUgYWN0XSBoYWQgPQorIyBJIGJlbGlldmUgdGhhdCB0aGUgRW5nbGlzaCBsZWdpc2xhdGlvbiBbb2YgdGhlIG9sZCB0aW1lIGFjdF0gaGFkCiAjIGJlZW4gYXNzZW50ZWQgdG8gKE1hcmNoIDIyLCAxOTY3KS4uLi4KICMgQWxzbywgYXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZXJlIHdhcyBubyBvcmRlci1pbi1jb3VuY2lsIHZhcnlpbmcKICMgdGhlIHRpbWUgb2YgRGF5bGlnaHQgU2F2aW5nIFRpbWUgZm9yIDIwMDUgYW5kIHNvIHRoZSBwcm92aXNpb25zIG9mCkBAIC0xNzk5LDEyICsxNzY4LDEyIEBACiBSdWxlCVN3aWZ0CTE5NjAJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvUmVnaW5hCS02OjU4OjM2IC0JTE1UCTE5MDUgU2VwCi0JCQktNzowMAlSZWdpbmEJTSVzVAkxOTYwIEFwciBsYXN0U3VuIDI6MDAKKwkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NjAgQXByIGxhc3RTdW4gIDI6MDAKIAkJCS02OjAwCS0JQ1NUCiBab25lIEFtZXJpY2EvU3dpZnRfQ3VycmVudCAtNzoxMToyMCAtCUxNVAkxOTA1IFNlcAotCQkJLTc6MDAJQ2FuYWRhCU0lc1QJMTk0NiBBcHIgbGFzdFN1biAyOjAwCisJCQktNzowMAlDYW5hZGEJTSVzVAkxOTQ2IEFwciBsYXN0U3VuICAyOjAwCiAJCQktNzowMAlSZWdpbmEJTSVzVAkxOTUwCi0JCQktNzowMAlTd2lmdAlNJXNUCTE5NzIgQXByIGxhc3RTdW4gMjowMAorCQkJLTc6MDAJU3dpZnQJTSVzVAkxOTcyIEFwciBsYXN0U3VuICAyOjAwCiAJCQktNjowMAktCUNTVAogCiAKQEAgLTE4NTQsOSArMTgyMyw3IEBACiAjIEVhcmxpZXIgdGhpcyB5ZWFyIEkgc3R1bWJsZWQgYWNyb3NzIGEgZGV0YWlsZWQgYXJ0aWNsZSBhYm91dCB0aGUgdGltZQogIyBrZWVwaW5nIGhpc3Rvcnkgb2YgQ3Jlc3RvbjsgaXQgd2FzIHdyaXR0ZW4gYnkgVGFtbXkgSGFyZHdpY2sgd2hvIGlzIHRoZQogIyBtYW5hZ2VyIG9mIHRoZSBDcmVzdG9uICYgRGlzdHJpY3QgTXVzZXVtLiBUaGUgYXJ0aWNsZSB3YXMgd3JpdHRlbiBpbiBNYXkgMjAwOS4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5pbG92ZWNyZXN0b24uY29tLz9wPWFydGljbGVzJnQ9c3BlYyZhcj0yNjAiPgogIyBodHRwOi8vd3d3Lmlsb3ZlY3Jlc3Rvbi5jb20vP3A9YXJ0aWNsZXMmdD1zcGVjJmFyPTI2MAotIyA8L2E+CiAjIEFjY29yZGluZyB0byB0aGUgYXJ0aWNsZSwgQ3Jlc3RvbiBoYXMgbm90IGNoYW5nZWQgaXRzIGNsb2NrcyBzaW5jZSBKdW5lIDE5MTguCiAjIGkuZS4gQ3Jlc3RvbiBoYXMgYmVlbiBzdHVjayBvbiBVVEMtNyBmb3IgOTMgeWVhcnMuCiAjIERhd3NvbiBDcmVlaywgb24gdGhlIG90aGVyIGhhbmQsIGNoYW5nZWQgaXRzIGNsb2NrcyBhcyByZWNlbnRseSBhcyBBcHJpbCAxOTcyLgpAQCAtMTg2NCwxOCArMTgzMSwxNiBAQAogIyBVbmZvcnR1bmF0ZWx5IHRoZSBleGFjdCBkYXRlIGZvciB0aGUgdGltZSBjaGFuZ2UgaW4gSnVuZSAxOTE4IHJlbWFpbnMKICMgdW5rbm93biBhbmQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gYXNjZXJ0YWluLiAgSSBlLW1haWxlZCBUYW1teSBhIGZldyBtb250aHMKICMgYWdvIHRvIGFzayBpZiBTdW5kYXkgSnVuZSAyIHdhcyBhIHJlYXNvbmFibGUgZ3Vlc3MuICBTaGUgc2FpZCBpdCB3YXMganVzdAotIyBhcyBwbGF1c2libGUgYXMgYW55IG90aGVyIGRhdGUgKGluIEp1bmUpLiAgU2hlIGFsc28gc2FpZCB0aGF0IGFmdGVyIHdyaXRpbmcgdGhlCi0jIGFydGljbGUgc2hlIGhhZCBkaXNjb3ZlcmVkIGFub3RoZXIgdGltZSBjaGFuZ2UgaW4gMTkxNjsgdGhpcyBpcyB0aGUgc3ViamVjdAotIyBvZiBhbm90aGVyIGFydGljbGUgd2hpY2ggc2hlIHdyb3RlIGluIE9jdG9iZXIgMjAxMC4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jcmVzdG9uLm11c2V1bS5iYy5jYS9pbmRleC5waHA/bW9kdWxlPWNvbW1lbnRzJnVvcD12aWV3X2NvbW1lbnQmY20raWQ9NTYiPgorIyBhcyBwbGF1c2libGUgYXMgYW55IG90aGVyIGRhdGUgKGluIEp1bmUpLiAgU2hlIGFsc28gc2FpZCB0aGF0IGFmdGVyIHdyaXRpbmcKKyMgdGhlIGFydGljbGUgc2hlIGhhZCBkaXNjb3ZlcmVkIGFub3RoZXIgdGltZSBjaGFuZ2UgaW4gMTkxNjsgdGhpcyBpcyB0aGUKKyMgc3ViamVjdCBvZiBhbm90aGVyIGFydGljbGUgd2hpY2ggc2hlIHdyb3RlIGluIE9jdG9iZXIgMjAxMC4KICMgaHR0cDovL3d3dy5jcmVzdG9uLm11c2V1bS5iYy5jYS9pbmRleC5waHA/bW9kdWxlPWNvbW1lbnRzJnVvcD12aWV3X2NvbW1lbnQmY20raWQ9NTYKLSMgPC9hPgogCiAjIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSB0aHJlZSBjbG9jayBjaGFuZ2UgZXZlbnRzIGluIENyZXN0b24ncyBoaXN0b3J5OgogIyAxLiAxODg0IG9yIDE4ODU6IGFkb3B0aW9uIG9mIE1vdW50YWluIFN0YW5kYXJkIFRpbWUgKEdNVC03KQogIyBFeGFjdCBkYXRlIHVua25vd24KICMgMi4gT2N0IDE5MTY6IHN3aXRjaCB0byBQYWNpZmljIFN0YW5kYXJkIFRpbWUgKEdNVC04KQotIyBFeGFjdCBkYXRlIGluIE9jdG9iZXIgdW5rbm93bjsgIFN1bmRheSBPY3RvYmVyIDEgaXMgYSByZWFzb25hYmxlIGd1ZXNzLgorIyBFeGFjdCBkYXRlIGluIE9jdG9iZXIgdW5rbm93bjsgU3VuZGF5IE9jdG9iZXIgMSBpcyBhIHJlYXNvbmFibGUgZ3Vlc3MuCiAjIDMuIEp1bmUgMTkxODogc3dpdGNoIHRvIFBhY2lmaWMgRGF5bGlnaHQgVGltZSAoR01ULTcpCiAjIEV4YWN0IGRhdGUgaW4gSnVuZSB1bmtub3duOyBTdW5kYXkgSnVuZSAyIGlzIGEgcmVhc29uYWJsZSBndWVzcy4KICMgbm90ZSMxOgpAQCAtMTg4OCw5ICsxODUzLDcgQEAKICMgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgQ3Jlc3RvbiB3aWxsIHJlbWFpbiBvbiBNb3VudGFpbiBTdGFuZGFyZCBUaW1lCiAjIChVVEMtNykgZm9yZXZlci4KICMgVGhlIHN1YmplY3Qgd2FzIGRlYmF0ZWQgYXQgbGVhc3Qgb25jZSB0aGlzIHllYXIgYnkgdGhlIHRvd24gQ291bmNpbC4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5iY2xvY2FsbmV3cy5jb20va29vdGVuYXlfcm9ja2llcy9jcmVzdG9udmFsbGV5YWR2YW5jZS9uZXdzLzExNjc2MDgwOS5odG1sIj4KICMgaHR0cDovL3d3dy5iY2xvY2FsbmV3cy5jb20va29vdGVuYXlfcm9ja2llcy9jcmVzdG9udmFsbGV5YWR2YW5jZS9uZXdzLzExNjc2MDgwOS5odG1sCi0jIDwvYT4KIAogIyBEdXJpbmcgYSBwZXJpb2QgV1dJSSwgc3VtbWVyIHRpbWUgKERheWxpZ2h0IHNheWluZykgd2FzIG1hbmRhdG9yeSBpbiBDYW5hZGEuCiAjIEluIENyZXN0b24sIHRoYXQgd2FzIGhhbmRsZWQgYnkgc2hpZnRpbmcgdGhlIGFyZWEgdG8gUFNUICgtODowMCkgdGhlbiBhcHBseWluZwpAQCAtMTkxNyw3ICsxODgwLDcgQEAKIAkJCS04OjAwCUNhbmFkYQlQJXNUCiBab25lIEFtZXJpY2EvRGF3c29uX0NyZWVrIC04OjAwOjU2IC0JTE1UCTE4ODQKIAkJCS04OjAwCUNhbmFkYQlQJXNUCTE5NDcKLQkJCS04OjAwCVZhbmMJUCVzVAkxOTcyIEF1ZyAzMCAyOjAwCisJCQktODowMAlWYW5jCVAlc1QJMTk3MiBBdWcgMzAgIDI6MDAKIAkJCS03OjAwCS0JTVNUCiBab25lIEFtZXJpY2EvQ3Jlc3RvbgktNzo0NjowNCAtCUxNVAkxODg0CiAJCQktNzowMAktCU1TVAkxOTE2IE9jdCAxCkBAIC0xOTQ0LDE4ICsxOTA3LDE3IEBACiAKICMgRnJvbSBSaXZlcyBNY0RvdyAoMTk5OS0wOS0wNCk6CiAjIE51bmF2dXQgLi4uIG1vdmVkIC4uLiB0byBpbmNvcnBvcmF0ZSB0aGUgd2hvbGUgdGVycml0b3J5IGludG8gb25lIHRpbWUgem9uZS4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5udW5hdHNpYXEuY29tL251bmF2dXQvbnZ0OTA5MDNfMTMuaHRtbCI+CiAjIE51bmF2dXQgbW92ZXMgdG8gc2luZ2xlIHRpbWUgem9uZSBPY3QuIDMxCi0jIDwvYT4KKyMgaHR0cDovL3d3dy5udW5hdHNpYXEuY29tL251bmF2dXQvbnZ0OTA5MDNfMTMuaHRtbAogIwogIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5OS0wOS0wNik6CiAjIFdlIHRoZW4gbmVlZCB0byBjcmVhdGUgYSBuZXcgdGltZXpvbmUgZm9yIHRoZSBLaXRpa21lb3QgcmVnaW9uIG9mIE51bmF2dXQKICMgdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIHRoZSBZZWxsb3drbmlmZSByZWdpb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuYXZ1dC5jb20vYmFzaWNmYWN0cy9lbmdsaXNoL2Jhc2ljZmFjdHNfMXRlcnJpdG9yeS5odG1sIj4KICMgQmFzaWMgRmFjdHM6IFRoZSBOZXcgVGVycml0b3J5Ci0jIDwvYT4gKDE5OTkpIHJlcG9ydHMgdGhhdCBQYW5nbmlydHVuZyBvcGVyYXRlcyBvbiBlYXN0ZXJuIHRpbWUsCisjIGh0dHA6Ly93d3cubnVuYXZ1dC5jb20vYmFzaWNmYWN0cy9lbmdsaXNoL2Jhc2ljZmFjdHNfMXRlcnJpdG9yeS5odG1sCisjICgxOTk5KSByZXBvcnRzIHRoYXQgUGFuZ25pcnR1bmcgb3BlcmF0ZXMgb24gZWFzdGVybiB0aW1lLAogIyBhbmQgdGhhdCBDb3JhbCBIYXJib3VyIGRvZXMgbm90IG9ic2VydmUgRFNULiAgV2UgZG9uJ3Qga25vdyB3aGVuCiAjIFBhbmduaXJ0dW5nIHN3aXRjaGVkIHRvIGVhc3Rlcm4gdGltZTsgd2UnbGwgZ3Vlc3MgMTk5NS4KIApAQCAtMTk4Myw4ICsxOTQ1LDggQEAKICMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWZmYWlycy4KIAogIyBGcm9tIE1pY2hhZWxhIFJvZHJpZ3VlLCB3cml0aW5nIGluIHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vYXJjaGl2ZXMvbnVuYXZ1dDk5MTEzMC9udnQ5MTExOV8xNy5odG1sIj4KLSMgTnVuYXRzaWFxIE5ld3MgKDE5OTktMTEtMTkpPC9hPjoKKyMgTnVuYXRzaWFxIE5ld3MgKDE5OTktMTEtMTkpOgorIyBodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vYXJjaGl2ZXMvbnVuYXZ1dDk5MTEzMC9udnQ5MTExOV8xNy5odG1sCiAjIENseWRlIFJpdmVyLCBQYW5nbmlydHVuZyBhbmQgU2FuaWtpbHVhcSBub3cgb3BlcmF0ZSB3aXRoIHR3byB0aW1lIHpvbmVzLAogIyBjZW50cmFsIC0gb3IgTnVuYXZ1dCB0aW1lIC0gZm9yIGdvdmVybm1lbnQgb2ZmaWNlcywgYW5kIGVhc3Rlcm4gdGltZQogIyBmb3IgbXVuaWNpcGFsIG9mZmljZXMgYW5kIHNjaG9vbHMuLi4uICBJZ2xvb2xpayBbd2FzIHNpbWlsYXIgYnV0IHRoZW5dCkBAIC0yMDAyLDEwICsxOTY0LDggQEAKICMgQ2VudHJhbCBUaW1lIGFuZCBTb3V0aGFtcHRvbiBJc2xhbmQgW2luIHRoZSBDZW50cmFsIHpvbmVdIGlzIG5vdAogIyByZXF1aXJlZCB0byB1c2UgZGF5bGlnaHQgc2F2aW5ncy4KIAotIyBGcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuYXRzaWFxLmNvbS9hcmNoaXZlcy9udW5hdnV0MDAxMTMwL252dDIxMTEwXzAyLmh0bWwiPgotIyBOdW5hdnV0IG5vdyBoYXMgdHdvIHRpbWUgem9uZXMKLSMgPC9hPiAoMjAwMC0xMS0xMCk6CisjIEZyb20gPGh0dHA6Ly93d3cubnVuYXRzaWFxLmNvbS9hcmNoaXZlcy9udW5hdnV0MDAxMTMwL252dDIxMTEwXzAyLmh0bWw+CisjIE51bmF2dXQgbm93IGhhcyB0d28gdGltZSB6b25lcyAoMjAwMC0xMS0xMCk6CiAjIFRoZSBOdW5hdnV0IGdvdmVybm1lbnQgd291bGQgYWxsb3cgaXRzIGVtcGxveWVlcyBpbiBLdWdsdWt0dWsgYW5kCiAjIENhbWJyaWRnZSBCYXkgdG8gb3BlcmF0ZSBvbiBjZW50cmFsIHRpbWUgeWVhci1yb3VuZCwgcHV0dGluZyB0aGVtCiAjIG9uZSBob3VyIGJlaGluZCB0aGUgcmVzdCBvZiBOdW5hdnV0IGZvciBzaXggbW9udGhzIGR1cmluZyB0aGUgd2ludGVyLgpAQCAtMjA5Niw5ICsyMDU2LDcgQEAKICMgdXNlZCB0byBiZSB0aGUgbWF5b3Igb2YgUmVzb2x1dGUgQmF5IGFuZCBoZSBhcHBhcmVudGx5IG93bnMgaGFsZiB0aGUKICMgYnVzaW5lc3NlcyBpbmNsdWRpbmcgIlNvdXRoIENhbXAgSW5uLiIgVGhpcyB3ZWJzaXRlIGhhcyBzb21lIGluZm8gb24KICMgQXppejoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy51cGhlcmUuY2Evbm9kZS80OTMiPgogIyBodHRwOi8vd3d3LnVwaGVyZS5jYS9ub2RlLzQ5MwotIyA8L2E+CiAjCiAjIEkgc2VudCBBeml6IGFuIGUtbWFpbCBhc2tpbmcgd2hlbiBSZXNvbHV0ZSBCYXkgaGFkIHN0b3BwZWQgdXNpbmcKICMgRWFzdGVybiBTdGFuZGFyZCBUaW1lLgpAQCAtMjEzNiw0NyArMjA5NCw0NyBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogIyBha2EgUGFubmlxdHV1cQogWm9uZSBBbWVyaWNhL1BhbmduaXJ0dW5nIDAJLQl6enoJMTkyMSAjIHRyYWRpbmcgcG9zdCBlc3QuCi0JCQktNDowMAlOVF9ZSwlBJXNUCTE5OTUgQXByIFN1bj49MSAyOjAwCi0JCQktNTowMAlDYW5hZGEJRSVzVAkxOTk5IE9jdCAzMSAyOjAwCi0JCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAyOjAwCisJCQktNDowMAlOVF9ZSwlBJXNUCTE5OTUgQXByIFN1bj49MSAgMjowMAorCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk5OSBPY3QgMzEgIDI6MDAKKwkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5ICAyOjAwCiAJCQktNTowMAlDYW5hZGEJRSVzVAogIyBmb3JtZXJseSBGcm9iaXNoZXIgQmF5CiBab25lIEFtZXJpY2EvSXFhbHVpdAkwCS0Jenp6CTE5NDIgQXVnICMgRnJvYmlzaGVyIEJheSBlc3QuCi0JCQktNTowMAlOVF9ZSwlFJXNUCTE5OTkgT2N0IDMxIDI6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKKwkJCS01OjAwCU5UX1lLCUUlc1QJMTk5OSBPY3QgMzEgIDI6MDAKKwkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5ICAyOjAwCiAJCQktNTowMAlDYW5hZGEJRSVzVAogIyBha2EgUWF1c3VpdHR1cQogWm9uZSBBbWVyaWNhL1Jlc29sdXRlCTAJLQl6enoJMTk0NyBBdWcgMzEgIyBSZXNvbHV0ZSBmb3VuZGVkCi0JCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDYgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDcgTWFyIDExIDM6MDAKKwkJCS02OjAwCU5UX1lLCUMlc1QJMjAwMCBPY3QgMjkgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxICAzOjAwCisJCQktNjowMAlDYW5hZGEJQyVzVAkyMDA2IE9jdCAyOSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwNyBNYXIgMTEgIDM6MDAKIAkJCS02OjAwCUNhbmFkYQlDJXNUCiAjIGFrYSBLYW5naXFpbmlxCiBab25lIEFtZXJpY2EvUmFua2luX0lubGV0IDAJLQl6enoJMTk1NyAjIFJhbmtpbiBJbmxldCBmb3VuZGVkCi0JCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKKwkJCS02OjAwCU5UX1lLCUMlc1QJMjAwMCBPY3QgMjkgIDI6MDAKKwkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxICAzOjAwCiAJCQktNjowMAlDYW5hZGEJQyVzVAogIyBha2EgSXFhbHVrdHV1dHRpYXEKIFpvbmUgQW1lcmljYS9DYW1icmlkZ2VfQmF5IDAJLQl6enoJMTkyMCAjIHRyYWRpbmcgcG9zdCBlc3QuPwotCQkJLTc6MDAJTlRfWUsJTSVzVAkxOTk5IE9jdCAzMSAyOjAwCi0JCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAyOjAwCi0JCQktNTowMAktCUVTVAkyMDAwIE5vdiAgNSAwOjAwCi0JCQktNjowMAktCUNTVAkyMDAxIEFwciAgMSAzOjAwCisJCQktNzowMAlOVF9ZSwlNJXNUCTE5OTkgT2N0IDMxICAyOjAwCisJCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAgMjowMAorCQkJLTU6MDAJLQlFU1QJMjAwMCBOb3YgIDUgIDA6MDAKKwkJCS02OjAwCS0JQ1NUCTIwMDEgQXByICAxICAzOjAwCiAJCQktNzowMAlDYW5hZGEJTSVzVAogWm9uZSBBbWVyaWNhL1llbGxvd2tuaWZlIDAJLQl6enoJMTkzNSAjIFllbGxvd2tuaWZlIGZvdW5kZWQ/CiAJCQktNzowMAlOVF9ZSwlNJXNUCTE5ODAKIAkJCS03OjAwCUNhbmFkYQlNJXNUCiBab25lIEFtZXJpY2EvSW51dmlrCTAJLQl6enoJMTk1MyAjIEludXZpayBmb3VuZGVkCi0JCQktODowMAlOVF9ZSwlQJXNUCTE5NzkgQXByIGxhc3RTdW4gMjowMAorCQkJLTg6MDAJTlRfWUsJUCVzVAkxOTc5IEFwciBsYXN0U3VuICAyOjAwCiAJCQktNzowMAlOVF9ZSwlNJXNUCTE5ODAKIAkJCS03OjAwCUNhbmFkYQlNJXNUCiBab25lIEFtZXJpY2EvV2hpdGVob3JzZQktOTowMDoxMiAtCUxNVAkxOTAwIEF1ZyAyMAotCQkJLTk6MDAJTlRfWUsJWSVzVAkxOTY2IEp1bCAxIDI6MDAKKwkJCS05OjAwCU5UX1lLCVklc1QJMTk2NiBKdWwgIDEgIDI6MDAKIAkJCS04OjAwCU5UX1lLCVAlc1QJMTk4MAogCQkJLTg6MDAJQ2FuYWRhCVAlc1QKIFpvbmUgQW1lcmljYS9EYXdzb24JLTk6MTc6NDAgLQlMTVQJMTkwMCBBdWcgMjAKLQkJCS05OjAwCU5UX1lLCVklc1QJMTk3MyBPY3QgMjggMDowMAorCQkJLTk6MDAJTlRfWUsJWSVzVAkxOTczIE9jdCAyOCAgMDowMAogCQkJLTg6MDAJTlRfWUsJUCVzVAkxOTgwCiAJCQktODowMAlDYW5hZGEJUCVzVAogCkBAIC0yMTg4LDkgKzIxNDYsOCBAQAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA1KToKICMgVGhlIEludmVzdGlnYXRpb24gYW5kIEFuYWx5c2lzIFNlcnZpY2Ugb2YgdGhlCiAjIE1leGljYW4gTGlicmFyeSBvZiBDb25ncmVzcyAoTUxvQykgaGFzIHB1Ymxpc2hlZCBhCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2RkaGN1LmdvYi5teC9iaWJsaW90L3B1YmxpY2EvaW52ZXlhbmEvcG9saXNvYy9ob3J2ZXIvIj4KICMgaGlzdG9yeSBvZiBNZXhpY2FuIGxvY2FsIHRpbWUgKGluIFNwYW5pc2gpCi0jIDwvYT4uCisjIGh0dHA6Ly93d3cuY2RkaGN1LmdvYi5teC9iaWJsaW90L3B1YmxpY2EvaW52ZXlhbmEvcG9saXNvYy9ob3J2ZXIvCiAjCiAjIEhlcmUgYXJlIHRoZSBkaXNjcmVwYW5jaWVzIGJldHdlZW4gU2hhbmtzICYgUG90dGVuZ2VyIChTJlApIGFuZCB0aGUgTUxvQy4KICMgKEluIGFsbCBjYXNlcyB3ZSBnbyB3aXRoIHRoZSBNTG9DLikKQEAgLTIyMzUsOSArMjE5Miw4IEBACiAjIC0tLS0tLS0tLS0tLS0tIEVuZCBGb3J3YXJkZWQgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLQogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA2LTEyKToKICMgRm9yIGFuIEVuZ2xpc2ggdHJhbnNsYXRpb24gb2YgdGhlIGRlY3JlZSwgc2VlCi0jIDxhIGhyZWY9Imh0dHA6Ly9tZXhpY28tdHJhdmVsLmNvbS9leHRyYS90aW1lem9uZV9lbmcuaHRtbCI+CiAjICJEaWFyaW8gT2ZpY2lhbDogVGltZSBab25lIENoYW5nZW92ZXIiICgxOTk2LTAxLTA0KS4KLSMgPC9hPgorIyBodHRwOi8vbWV4aWNvLXRyYXZlbC5jb20vZXh0cmEvdGltZXpvbmVfZW5nLmh0bWwKIAogIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk4LTEwLTA4KToKICMgVGhlIFN0YXRlIG9mIFF1aW50YW5hIFJvbyBoYXMgcmV2ZXJ0ZWQgYmFjayB0byBjZW50cmFsIFNURCBhbmQgRFNUIHRpbWVzCkBAIC0yMjQ5LDcgKzIyMDUsNyBAQAogIyBzYXZpbmdzIHRpbWUgc28gYXMgdG8gc3RheSBvbiB0aGUgc2FtZSB0aW1lIHpvbmUgYXMgdGhlIHNvdXRoZXJuIHBhcnQgb2YKICMgQXJpem9uYSB5ZWFyIHJvdW5kLgogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkLCB0cmFuc2xhdGluZworIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQsIHRyYW5zbGF0aW5nCiAjIDxodHRwOi8vd3d3LnJlZm9ybWEuY29tL25hY2lvbmFsL2FydGljdWxvLzA2NDMyNy8+ICgyMDAxLTAxLTE3KToKICMgSW4gT2F4YWNhLCB0aGUgNTUuMDAwIHRlYWNoZXJzIGZyb20gdGhlIFNlY3Rpb24gMjIgb2YgdGhlIE5hdGlvbmFsCiAjIFN5bmRpY2F0ZSBvZiBFZHVjYXRpb24gV29ya2VycywgcmVmdXNlIHRvIGFwcGx5IGRheWxpZ2h0IHNhdmluZyBlYWNoCkBAIC0yMjYyLDcgKzIyMTgsNyBAQAogIyBKYW51YXJ5IDE3LCAyMDAwIC0gVGhlIEVuZXJneSBTZWNyZXRhcnksIEVybmVzdG8gTWFydGVucywgYW5ub3VuY2VkCiAjIHRoYXQgU3VtbWVyIFRpbWUgd2lsbCBiZSByZWR1Y2VkIGZyb20gc2V2ZW4gdG8gZml2ZSBtb250aHMsIHN0YXJ0aW5nCiAjIHRoaXMgeWVhci4uLi4KLSMgPGh0dHA6Ly93d3cucHVibGljby5jb20ubXgvc2NyaXB0cy90ZXh0bzMuYXNwP2FjdGlvbj1wYWdpbmEmcGFnPTIxJnBvcz1wJnNlY2M9bmFjaSZkYXRlPTAxLzE3LzIwMDE+CisjIGh0dHA6Ly93d3cucHVibGljby5jb20ubXgvc2NyaXB0cy90ZXh0bzMuYXNwP2FjdGlvbj1wYWdpbmEmcGFnPTIxJnBvcz1wJnNlY2M9bmFjaSZkYXRlPTAxLzE3LzIwMDEKICMgW3RyYW5zbGF0ZWRdLCBzYXlzICJzdW1tZXIgdGltZSB3aWxsIC4uLiB0YWtlIGVmZmVjdCBvbiB0aGUgZmlyc3QgU3VuZGF5CiAjIGluIE1heSwgYW5kIGVuZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyLgogCkBAIC0yMjcwLDIzICsyMjI2LDIyIEBACiAjIFRoZSAyMDAxLTAxLTI0IHRyYWRpdGlvbmFsIFdhc2hpbmd0b24gUG9zdCBjb250YWluZWQgdGhlIHBhZ2Ugb25lCiAjIHN0b3J5ICJUaW1lbHkgSXNzdWUgRGl2aWRlcyBNZXhpY2Fucy4iLi4uCiAjIGh0dHA6Ly93d3cud2FzaGluZ3RvbnBvc3QuY29tL3dwLWR5bi9hcnRpY2xlcy9BMzczODMtMjAwMUphbjIzLmh0bWwKLSMgLi4uIE1leGljbyBDaXR5IE1heW9yIExvcGV6IE9icmFkb3IgIi4uLmlzIHRocmVhdGVuaW5nIHRvIGtlZXAKKyMgLi4uIE1leGljbyBDaXR5IE1heW9yIEzDs3BleiBPYnJhZG9yICIuLi5pcyB0aHJlYXRlbmluZyB0byBrZWVwCiAjIE1leGljbyBDaXR5IGFuZCBpdHMgMjAgbWlsbGlvbiByZXNpZGVudHMgb24gYSBkaWZmZXJlbnQgdGltZSB0aGFuCi0jIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5Li4uIiBJbiBwYXJ0aWN1bGFyLCBMb3BleiBPYnJhZG9yIHdvdWxkIGFib2xpc2gKKyMgdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnkuLi4iIEluIHBhcnRpY3VsYXIsIEzDs3BleiBPYnJhZG9yIHdvdWxkIGFib2xpc2gKICMgb2JzZXJ2YXRpb24gb2YgRGF5bGlnaHQgU2F2aW5nIFRpbWUuCiAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jb25hZS5nb2IubXgvYWhvcnJvL2RlY3JldG9ob3J2ZXIyMDAxLmh0bWwjZGVjcmUiPgogIyBPZmZpY2lhbCBzdGF0dXRlIHB1Ymxpc2hlZCBieSB0aGUgRW5lcmd5IERlcGFydG1lbnQKLSMgPC9hPiAoMjAwMS0wMi0wMSkgc2hvd3MgQmFqYSBhbmQgQ2hpaGF1aHVhIGFzIHN0aWxsIHVzaW5nIFVTIERTVCBydWxlcywKLSMgYW5kIFNvbm9yYSB3aXRoIG5vIERTVC4gIFRoaXMgd2FzIHJlcG9ydGVkIGJ5IEplc3BlciBOb3JnYWFyZCAoMjAwMS0wMi0wMykuCisjIGh0dHA6Ly93d3cuY29uYWUuZ29iLm14L2Fob3Jyby9kZWNyZXRvaG9ydmVyMjAwMS5odG1sI2RlY3JlCisjICgyMDAxLTAyLTAxKSBzaG93cyBCYWphIGFuZCBDaGloYXVodWEgYXMgc3RpbGwgdXNpbmcgVVMgRFNUIHJ1bGVzLAorIyBhbmQgU29ub3JhIHdpdGggbm8gRFNULiAgVGhpcyB3YXMgcmVwb3J0ZWQgYnkgSmVzcGVyIE7DuHJnYWFyZCAoMjAwMS0wMi0wMykuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wMy0wMyk6CiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGF0aW1lcy5jb20vbmV3cy9uYXRpb24vMjAwMTAzMDMvdDAwMDAxODc2Ni5odG1sIj4KKyMgaHR0cDovL3d3dy5sYXRpbWVzLmNvbS9uZXdzL25hdGlvbi8yMDAxMDMwMy90MDAwMDE4NzY2Lmh0bWwKICMgSmFtZXMgRi4gU21pdGggd3JpdGVzIGluIHRvZGF5J3MgTEEgVGltZXMKLSMgPC9hPgogIyAqIFNvbm9yYSB3aWxsIGNvbnRpbnVlIHRvIG9ic2VydmUgc3RhbmRhcmQgdGltZS4KLSMgKiBMYXN0IHdlZWsgTWV4aWNvIENpdHkncyBtYXlvciBBbmRyZXMgTWFudWVsIExvcGV6IE9icmFkb3IgZGVjcmVlZCB0aGF0CisjICogTGFzdCB3ZWVrIE1leGljbyBDaXR5J3MgbWF5b3IgQW5kcsOpcyBNYW51ZWwgTMOzcGV6IE9icmFkb3IgZGVjcmVlZCB0aGF0CiAjICAgdGhlIEZlZGVyYWwgRGlzdHJpY3Qgd2lsbCBub3QgYWRvcHQgRFNULgogIyAqIDQgb2YgMTYgZGlzdHJpY3QgbGVhZGVycyBhbm5vdW5jZWQgdGhleSdsbCBpZ25vcmUgdGhlIGRlY3JlZS4KICMgKiBUaGUgZGVjcmVlIGRvZXMgbm90IGFmZmVjdCBmZWRlcmFsLWNvbnRyb2xsZWQgZmFjaWxpdGllcyBpbmNsdWRpbmcKQEAgLTIyOTQsNyArMjI0OSw3IEBACiAjCiAjIEZvciBub3cgd2UnbGwgYXNzdW1lIHRoYXQgdGhlIEZlZGVyYWwgRGlzdHJpY3Qgd2lsbCBib3cgdG8gZmVkZXJhbCBydWxlcy4KIAotIyBGcm9tIEplc3BlciBOb3JnYWFyZCAoMjAwMS0wNC0wMSk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCAoMjAwMS0wNC0wMSk6CiAjIEkgZm91bmQgc29tZSByZWZlcmVuY2VzIHRvIHRoZSBNZXhpY2FuIGFwcGxpY2F0aW9uIG9mIGRheWxpZ2h0CiAjIHNhdmluZywgd2hpY2ggbW9kaWZpZXMgd2hhdCBJIGhhZCBhbHJlYWR5IHNlbnQgeW91LCBzdGF0aW5nIGVhcmxpZXIKICMgdGhhdCBhIG51bWJlciBvZiBub3J0aGVybiBNZXhpY2FuIHN0YXRlcyB3b3VsZCBnbyBvbiBkYXlsaWdodApAQCAtMjMwMyw3ICsyMjU4LDcgQEAKICMgc2F2aW5nIGFsbCB5ZWFyKSB3aWxsIGZvbGxvdyB0aGUgb3JpZ2luYWwgZGVjcmVlIG9mIHByZXNpZGVudAogIyBWaWNlbnRlIEZveCwgc3RhcnRpbmcgZGF5bGlnaHQgc2F2aW5nIE1heSA2LCAyMDAxIGFuZCBlbmRpbmcKICMgU2VwdGVtYmVyIDMwLCAyMDAxLgotIyBSZWZlcmVuY2VzOiAiRGlhcmlvIGRlIE1vbnRlcnJleSIgPHd3dy5kaWFyaW9kZW1vbnRlcnJleS5jb20vaW5kZXguYXNwPgorIyBSZWZlcmVuY2VzOiAiRGlhcmlvIGRlIE1vbnRlcnJleSIgPGh0dHA6Ly93d3cuZGlhcmlvZGVtb250ZXJyZXkuY29tL2luZGV4LmFzcD4KICMgUGFsYWJyYSA8aHR0cDovL3BhbGFicmEuaW5mb3NlbC5jb20vMDEwMzMxL3ByaW1lcmEvcHByaTMxMDEucGRmPiAoMjAwMS0wMy0zMSkKIAogIyBGcm9tIFJldXRlcnMgKDIwMDEtMDktMDQpOgpAQCAtMjMxNSw3ICsyMjcwLDcgQEAKICMgc3RhbmRhcmQgdGltZS4gIlRoaXMgaXMgc28gcmVzaWRlbnRzIG9mIHRoZSBGZWRlcmFsIERpc3RyaWN0IGFyZSBub3QKICMgc3ViamVjdCB0byB1bmV4cGVjdGVkIHRpbWUgY2hhbmdlcywiIGEgc3RhdGVtZW50IGZyb20gdGhlIGNvdXJ0IHNhaWQuCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDItMDMtMTIpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDItMDMtMTIpOgogIyAuLi4gY29uc3VsdGluZyBteSBsb2NhbCBncm9jZXJ5IHN0b3JlKCEpIGFuZCBteSBjb3dvcmtlcnMsIHRoZXkgYWxsIGluc2lzdGVkCiAjIHRoYXQgYSBuZXcgZGVjaXNpb24gaGFkIGJlZW4gbWFkZSB0byByZWluc3RhdGUgVVMgc3R5bGUgRFNUIGluIE1leGljby4uLi4KICMgaHR0cDovL3d3dy5jb25hZS5nb2IubXgvYWhvcnJvL2hvcmF2ZXIyMDAxX20xXzIwMDIuaHRtbCAoMjAwMi0wMi0yMCkKQEAgLTIzMjksNDggKzIyODQsMzYgQEAKICMgPiB0aGUgVW5pdGVkIFN0YXRlcy4KICMgTm93IHRoaXMgaGFzIHBhc3NlZCBib3RoIHRoZSBDb25ncmVzcyBhbmQgdGhlIFNlbmF0ZSwgc28gc3RhcnRpbmcgZnJvbQogIyAyMDEwLCBzb21lIGJvcmRlciByZWdpb25zIHdpbGwgYmUgdGhlIHNhbWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2lnbm9uc2FuZGllZ28uY29tL25ld3MvMjAwOS9kZWMvMjgvY2xvY2tzLXdpbGwtbWF0Y2gtYm90aC1zaWRlcy1ib3JkZXIvIj4KICMgaHR0cDovL3d3dy5zaWdub25zYW5kaWVnby5jb20vbmV3cy8yMDA5L2RlYy8yOC9jbG9ja3Mtd2lsbC1tYXRjaC1ib3RoLXNpZGVzLWJvcmRlci8KLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmVsbWFuYW5hcmV5LmNvbS9kaWFyaW8vbm90aWNpYS9uYWNpb25hbC9ub3RpY2lhcy9lbXBhdGFuX2hvcmFyaW9fZGVfZnJvbnRlcmFfY29uX2V1LzYyMTkzOSI+CiAjIGh0dHA6Ly93d3cuZWxtYW5hbmFyZXkuY29tL2RpYXJpby9ub3RpY2lhL25hY2lvbmFsL25vdGljaWFzL2VtcGF0YW5faG9yYXJpb19kZV9mcm9udGVyYV9jb25fZXUvNjIxOTM5Ci0jIDwvYT4KICMgKFNwYW5pc2gpCiAjCiAjIENvdWxkIG5vdCBmaW5kIHRoZSBuZXcgbGF3IHRleHQsIGJ1dCB0aGUgcHJvcG9zZWQgbGF3IHRleHQgY2hhbmdlcyBhcmUgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL2dhY2V0YS5kaXB1dGFkb3MuZ29iLm14L0dhY2V0YS82MS8yMDA5L2RpYy8yMDA5MTIxMC1WLnBkZiI+CiAjIGh0dHA6Ly9nYWNldGEuZGlwdXRhZG9zLmdvYi5teC9HYWNldGEvNjEvMjAwOS9kaWMvMjAwOTEyMTAtVi5wZGYKLSMgPC9hPgogIyAoR2FjZXRhIFBhcmxhbWVudGFyaWEpCiAjCiAjIFRoZXJlIGlzIGFsc28gYSBsaXN0IG9mIHRoZSB2b3RlcyBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vZ2FjZXRhLmRpcHV0YWRvcy5nb2IubXgvR2FjZXRhLzYxLzIwMDkvZGljL1YyLTEwMTIwOS5odG1sIj4KICMgaHR0cDovL2dhY2V0YS5kaXB1dGFkb3MuZ29iLm14L0dhY2V0YS82MS8yMDA5L2RpYy9WMi0xMDEyMDkuaHRtbAotIyA8L2E+CiAjCiAjIE91ciBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbm9ydGgtbWV4aWNvLWRzdC1jaGFuZ2UuaHRtbCI+CiAjIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9ub3J0aC1tZXhpY28tZHN0LWNoYW5nZS5odG1sCi0jIDwvYT4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMC0wMS0yMCk6CiAjIFRoZSBwYWdlCi0jIDxhIGhyZWY9Imh0dHA6Ly9kb2YuZ29iLm14L25vdGFfZGV0YWxsZS5waHA/Y29kaWdvPTUxMjc0ODAmZmVjaGE9MDYvMDEvMjAxMCI+CiAjIGh0dHA6Ly9kb2YuZ29iLm14L25vdGFfZGV0YWxsZS5waHA/Y29kaWdvPTUxMjc0ODAmZmVjaGE9MDYvMDEvMjAxMAotIyA8L2E+CiAjIGluY2x1ZGVzIHRoaXMgdGV4dDoKICMgRW4gbG9zIG11bmljaXBpb3MgZnJvbnRlcml6b3MgZGUgVGlqdWFuYSB5IE1leGljYWxpIGVuIEJhamEgQ2FsaWZvcm5pYTsKLSMgSnUmYWFjdXRlO3JleiB5IE9qaW5hZ2EgZW4gQ2hpaHVhaHVhOyBBY3UmbnRpbGRlO2EgeSBQaWVkcmFzIE5lZ3JhcyBlbiBDb2FodWlsYTsKLSMgQW4mYWFjdXRlO2h1YWMgZW4gTnVldm8gTGUmb2FjdXRlO247IHkgTnVldm8gTGFyZWRvLCBSZXlub3NhIHkgTWF0YW1vcm9zIGVuCi0jIFRhbWF1bGlwYXMsIGxhIGFwbGljYWNpJm9hY3V0ZTtuIGRlIGVzdGUgaG9yYXJpbyBlc3RhY2lvbmFsIHN1cnRpciZhYWN1dGU7IGVmZWN0bwotIyBkZXNkZSBsYXMgZG9zIGhvcmFzIGRlbCBzZWd1bmRvIGRvbWluZ28gZGUgbWFyem8geSBjb25jbHVpciZhYWN1dGU7IGEgbGFzIGRvcworIyBKdcOhcmV6IHkgT2ppbmFnYSBlbiBDaGlodWFodWE7IEFjdcOxYSB5IFBpZWRyYXMgTmVncmFzIGVuIENvYWh1aWxhOworIyBBbsOhaHVhYyBlbiBOdWV2byBMZcOzbjsgeSBOdWV2byBMYXJlZG8sIFJleW5vc2EgeSBNYXRhbW9yb3MgZW4KKyMgVGFtYXVsaXBhcywgbGEgYXBsaWNhY2nDs24gZGUgZXN0ZSBob3JhcmlvIGVzdGFjaW9uYWwgc3VydGlyw6EgZWZlY3RvCisjIGRlc2RlIGxhcyBkb3MgaG9yYXMgZGVsIHNlZ3VuZG8gZG9taW5nbyBkZSBtYXJ6byB5IGNvbmNsdWlyw6EgYSBsYXMgZG9zCiAjIGhvcmFzIGRlbCBwcmltZXIgZG9taW5nbyBkZSBub3ZpZW1icmUuCiAjIEVuIGxvcyBtdW5pY2lwaW9zIGZyb250ZXJpem9zIHF1ZSBzZSBlbmN1ZW50cmVuIHViaWNhZG9zIGVuIGxhIGZyYW5qYQotIyBmcm9udGVyaXphIG5vcnRlIGVuIGVsIHRlcnJpdG9yaW8gY29tcHJlbmRpZG8gZW50cmUgbGEgbCZpYWN1dGU7bmVhCi0jIGludGVybmFjaW9uYWwgeSBsYSBsJmlhY3V0ZTtuZWEgcGFyYWxlbGEgdWJpY2FkYSBhIHVuYSBkaXN0YW5jaWEgZGUgdmVpbnRlCi0jIGtpbCZvYWN1dGU7bWV0cm9zLCBhcyZpYWN1dGU7IGNvbW8gbGEgQ2l1ZGFkIGRlIEVuc2VuYWRhLCBCYWphIENhbGlmb3JuaWEsIGhhY2lhIGVsCi0jIGludGVyaW9yIGRlbCBwYSZpYWN1dGU7cywgbGEgYXBsaWNhY2kmb2FjdXRlO24gZGUgZXN0ZSBob3JhcmlvIGVzdGFjaW9uYWwgc3VydGlyJmFhY3V0ZTsKLSMgZWZlY3RvIGRlc2RlIGxhcyBkb3MgaG9yYXMgZGVsIHNlZ3VuZG8gZG9taW5nbyBkZSBtYXJ6byB5IGNvbmNsdWlyJmFhY3V0ZTsgYQorIyBmcm9udGVyaXphIG5vcnRlIGVuIGVsIHRlcnJpdG9yaW8gY29tcHJlbmRpZG8gZW50cmUgbGEgbMOtbmVhCisjIGludGVybmFjaW9uYWwgeSBsYSBsw61uZWEgcGFyYWxlbGEgdWJpY2FkYSBhIHVuYSBkaXN0YW5jaWEgZGUgdmVpbnRlCisjIGtpbMOzbWV0cm9zLCBhc8OtIGNvbW8gbGEgQ2l1ZGFkIGRlIEVuc2VuYWRhLCBCYWphIENhbGlmb3JuaWEsIGhhY2lhIGVsCisjIGludGVyaW9yIGRlbCBwYcOtcywgbGEgYXBsaWNhY2nDs24gZGUgZXN0ZSBob3JhcmlvIGVzdGFjaW9uYWwgc3VydGlyw6EKKyMgZWZlY3RvIGRlc2RlIGxhcyBkb3MgaG9yYXMgZGVsIHNlZ3VuZG8gZG9taW5nbyBkZSBtYXJ6byB5IGNvbmNsdWlyw6EgYQogIyBsYXMgZG9zIGhvcmFzIGRlbCBwcmltZXIgZG9taW5nbyBkZSBub3ZpZW1icmUuCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCkBAIC0yMzg5LDM5ICsyMzMyLDM5IEBACiBSdWxlCU1leGljbwkyMDAyCW1heAktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKIFJ1bGUJTWV4aWNvCTIwMDIJbWF4CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgUXVpbnRhbmEgUm9vCisjIFF1aW50YW5hIFJvbzsgcmVwcmVzZW50ZWQgYnkgQ2FuY8O6bgogWm9uZSBBbWVyaWNhL0NhbmN1bgktNTo0NzowNCAtCUxNVAkxOTIyIEphbiAgMSAgMDoxMjo1NgogCQkJLTY6MDAJLQlDU1QJMTk4MSBEZWMgMjMKIAkJCS01OjAwCU1leGljbwlFJXNUCTE5OTggQXVnICAyICAyOjAwCiAJCQktNjowMAlNZXhpY28JQyVzVAotIyBDYW1wZWNoZSwgWXVjYXRhbgorIyBDYW1wZWNoZSwgWXVjYXTDoW47IHJlcHJlc2VudGVkIGJ5IE3DqXJpZGEKIFpvbmUgQW1lcmljYS9NZXJpZGEJLTU6NTg6MjggLQlMTVQJMTkyMiBKYW4gIDEgIDA6MDE6MzIKIAkJCS02OjAwCS0JQ1NUCTE5ODEgRGVjIDIzCiAJCQktNTowMAktCUVTVAkxOTgyIERlYyAgMgogCQkJLTY6MDAJTWV4aWNvCUMlc1QKLSMgQ29haHVpbGEsIER1cmFuZ28sIE51ZXZvIExlb24sIFRhbWF1bGlwYXMgKG5lYXIgVVMgYm9yZGVyKQorIyBDb2FodWlsYSwgRHVyYW5nbywgTnVldm8gTGXDs24sIFRhbWF1bGlwYXMgKG5lYXIgVVMgYm9yZGVyKQogWm9uZSBBbWVyaWNhL01hdGFtb3JvcwktNjo0MDowMCAtCUxNVAkxOTIxIERlYyAzMSAyMzoyMDowMAogCQkJLTY6MDAJLQlDU1QJMTk4OAogCQkJLTY6MDAJVVMJQyVzVAkxOTg5CiAJCQktNjowMAlNZXhpY28JQyVzVAkyMDEwCiAJCQktNjowMAlVUwlDJXNUCi0jIENvYWh1aWxhLCBEdXJhbmdvLCBOdWV2byBMZW9uLCBUYW1hdWxpcGFzIChhd2F5IGZyb20gVVMgYm9yZGVyKQorIyBDb2FodWlsYSwgRHVyYW5nbywgTnVldm8gTGXDs24sIFRhbWF1bGlwYXMgKGF3YXkgZnJvbSBVUyBib3JkZXIpCiBab25lIEFtZXJpY2EvTW9udGVycmV5CS02OjQxOjE2IC0JTE1UCTE5MjEgRGVjIDMxIDIzOjE4OjQ0CiAJCQktNjowMAktCUNTVAkxOTg4CiAJCQktNjowMAlVUwlDJXNUCTE5ODkKIAkJCS02OjAwCU1leGljbwlDJXNUCiAjIENlbnRyYWwgTWV4aWNvCi1ab25lIEFtZXJpY2EvTWV4aWNvX0NpdHkgLTY6MzY6MzYgLQlMTVQJMTkyMiBKYW4gIDEgMDoyMzoyNAorWm9uZSBBbWVyaWNhL01leGljb19DaXR5IC02OjM2OjM2IC0JTE1UCTE5MjIgSmFuICAxICAwOjIzOjI0CiAJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAogCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKIAkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCiAJCQktNjowMAktCUNTVAkxOTMxIE9jdAogCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCU1leGljbwlDJXNUCTIwMDEgU2VwIDMwIDAyOjAwCisJCQktNjowMAlNZXhpY28JQyVzVAkyMDAxIFNlcCAzMCAgMjowMAogCQkJLTY6MDAJLQlDU1QJMjAwMiBGZWIgMjAKIAkJCS02OjAwCU1leGljbwlDJXNUCiAjIENoaWh1YWh1YSAobmVhciBVUyBib3JkZXIpCi1ab25lIEFtZXJpY2EvT2ppbmFnYQktNjo1Nzo0MCAtCUxNVAkxOTIyIEphbiAxIDA6MDI6MjAKK1pvbmUgQW1lcmljYS9PamluYWdhCS02OjU3OjQwIC0JTE1UCTE5MjIgSmFuICAxICAwOjAyOjIwCiAJCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAogCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKIAkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCkBAIC0yNDI5LDcgKzIzNzIsNyBAQAogCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKIAkJCS02OjAwCS0JQ1NUCTE5OTYKIAkJCS02OjAwCU1leGljbwlDJXNUCTE5OTgKLQkJCS02OjAwCS0JQ1NUCTE5OTggQXByIFN1bj49MSAzOjAwCisJCQktNjowMAktCUNTVAkxOTk4IEFwciBTdW4+PTEgIDM6MDAKIAkJCS03OjAwCU1leGljbwlNJXNUCTIwMTAKIAkJCS03OjAwCVVTCU0lc1QKICMgQ2hpaHVhaHVhIChhd2F5IGZyb20gVVMgYm9yZGVyKQpAQCAtMjQ0MSw3ICsyMzg0LDcgQEAKIAkJCS03OjAwCS0JTVNUCTE5MzIgQXByICAxCiAJCQktNjowMAktCUNTVAkxOTk2CiAJCQktNjowMAlNZXhpY28JQyVzVAkxOTk4Ci0JCQktNjowMAktCUNTVAkxOTk4IEFwciBTdW4+PTEgMzowMAorCQkJLTY6MDAJLQlDU1QJMTk5OCBBcHIgU3VuPj0xICAzOjAwCiAJCQktNzowMAlNZXhpY28JTSVzVAogIyBTb25vcmEKIFpvbmUgQW1lcmljYS9IZXJtb3NpbGxvCS03OjIzOjUyIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjM2OjA4CkBAIC0yNDU3LDQyICsyNDAwLDMzIEBACiAJCQktNzowMAktCU1TVAogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTA0LTIxKToKLSMgQWNjb3JkaW5nIHRvIG5ld3MsIEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyAoTWV4aWNhbiBzdGF0ZSBvZiBOYXlhcml0KQorIyBBY2NvcmRpbmcgdG8gbmV3cywgQmFow61hIGRlIEJhbmRlcmFzIChNZXhpY2FuIHN0YXRlIG9mIE5heWFyaXQpCiAjIGNoYW5nZWQgdGltZSB6b25lIFVUQy03IHRvIG5ldyB0aW1lIHpvbmUgVVRDLTYgb24gQXByaWwgNCwgMjAxMCAodG8KICMgc2hhcmUgdGhlIHNhbWUgdGltZSB6b25lIGFzIG5lYXJieSBjaXR5IFB1ZXJ0byBWYWxsYXJ0YSwgSmFsaXNjbykuCiAjCiAjIChTcGFuaXNoKQotIyBCYWgmaWFjdXRlO2EgZGUgQmFuZGVyYXMgaG9tb2xvZ2Egc3UgaG9yYXJpbyBhbCBkZWwgY2VudHJvIGRlbAotIyBwYSZpYWN1dGU7cywgYSBwYXJ0aXIgZGUgZXN0ZSBkb21pbmdvCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubmF5YXJpdC5nb2IubXgvbm90ZXMuYXNwP2lkPTIwNzQ4Ij4KKyMgQmFow61hIGRlIEJhbmRlcmFzIGhvbW9sb2dhIHN1IGhvcmFyaW8gYWwgZGVsIGNlbnRybyBkZWwKKyMgcGHDrXMsIGEgcGFydGlyIGRlIGVzdGUgZG9taW5nbwogIyBodHRwOi8vd3d3Lm5heWFyaXQuZ29iLm14L25vdGVzLmFzcD9pZD0yMDc0OAotIyA8L2E+CiAjCi0jIEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyBob21vbG9nYSBzdSBob3JhcmlvIGNvbiBlbCBkZWwgQ2VudHJvIGRlbAotIyBQYSZpYWN1dGU7cwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJhaGlhZGViYW5kZXJhcy5nb2IubXgvcHJpbmNpcGFsL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTI2MTpiYWhpYS1kZS1iYW5kZXJhcy1ob21vbG9nYS1zdS1ob3JhcmlvLWNvbi1lbC1kZWwtY2VudHJvLWRlbC1wYWlzJmNhdGlkPTQyOmNvbXVuaWNhY2lvbi1zb2NpYWwmSXRlbWlkPTUwIj4KLSMgaHR0cDovL3d3dy5iYWhpYWRlYmFuZGVyYXMuZ29iLm14L3ByaW5jaXBhbC9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD0yNjE6YmFoaWEtZGUtYmFuZGVyYXMtaG9tb2xvZ2Etc3UtaG9yYXJpby1jb24tZWwtZGVsLWNlbnRyby1kZWwtcGFpcyZjYXRpZD00Mjpjb211bmljYWNpb24tc29jaWFsJkl0ZW1pZD01MCIKLSMgPC9hPgorIyBCYWjDrWEgZGUgQmFuZGVyYXMgaG9tb2xvZ2Egc3UgaG9yYXJpbyBjb24gZWwgZGVsIENlbnRybyBkZWwKKyMgUGHDrXMKKyMgaHR0cDovL3d3dy5iYWhpYWRlYmFuZGVyYXMuZ29iLm14L3ByaW5jaXBhbC9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD0yNjE6YmFoaWEtZGUtYmFuZGVyYXMtaG9tb2xvZ2Etc3UtaG9yYXJpby1jb24tZWwtZGVsLWNlbnRyby1kZWwtcGFpcyZjYXRpZD00Mjpjb211bmljYWNpb24tc29jaWFsJkl0ZW1pZD01MAogIwogIyAoRW5nbGlzaCkKLSMgUHVlcnRvIFZhbGxhcnRhIGFuZCBCYWgmaWFjdXRlO2EgZGUgQmFuZGVyYXM6IE9uZSBUaW1lIFpvbmUKLSMgPGEgaHJlZj0iaHR0cDovL3ZpcnR1YWx2YWxsYXJ0YS5jb20vcHVlcnRvdmFsbGFydGEvcHVlcnRvdmFsbGFydGEvbG9jYWxuZXdzLzIwMDktMTItMDMtUHVlcnRvLVZhbGxhcnRhLWFuZC1CYWhpYS1kZS1CYW5kZXJhcy1PbmUtVGltZS1ab25lLnNodG1sIj4KKyMgUHVlcnRvIFZhbGxhcnRhIGFuZCBCYWjDrWEgZGUgQmFuZGVyYXM6IE9uZSBUaW1lIFpvbmUKICMgaHR0cDovL3ZpcnR1YWx2YWxsYXJ0YS5jb20vcHVlcnRvdmFsbGFydGEvcHVlcnRvdmFsbGFydGEvbG9jYWxuZXdzLzIwMDktMTItMDMtUHVlcnRvLVZhbGxhcnRhLWFuZC1CYWhpYS1kZS1CYW5kZXJhcy1PbmUtVGltZS1ab25lLnNodG1sCi0jIDwvYT4KLSMKLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tZXhpY28wOC5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tZXhpY28wOC5odG1sCi0jIDwvYT4KICMKICMgIk1leGljbydzIFNlbmF0ZSBhcHByb3ZlZCB0aGUgYW1lbmRtZW50cyB0byB0aGUgTWV4aWNhbiBTY2hlZHVsZSBTeXN0ZW0gdGhhdAotIyB3aWxsIGFsbG93IEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyBhbmQgUHVlcnRvIFZhbGxhcnRhIHRvIHNoYXJlIHRoZSBzYW1lIHRpbWUKKyMgd2lsbCBhbGxvdyBCYWjDrWEgZGUgQmFuZGVyYXMgYW5kIFB1ZXJ0byBWYWxsYXJ0YSB0byBzaGFyZSB0aGUgc2FtZSB0aW1lCiAjIHpvbmUgLi4uIgogIyBCYWphIENhbGlmb3JuaWEgU3VyLCBOYXlhcml0LCBTaW5hbG9hCiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTAtMDUtMDEpOgogIyBVc2UgIkJhaGlhX0JhbmRlcmFzIiB0byBrZWVwIHRoZSBuYW1lIHRvIGZvdXJ0ZWVuIGNoYXJhY3RlcnMuCiAKKyMgTWF6YXRsw6FuCiBab25lIEFtZXJpY2EvTWF6YXRsYW4JLTc6MDU6NDAgLQlMTVQJMTkyMSBEZWMgMzEgMjM6NTQ6MjAKIAkJCS03OjAwCS0JTVNUCTE5MjcgSnVuIDEwIDIzOjAwCiAJCQktNjowMAktCUNTVAkxOTMwIE5vdiAxNQpAQCAtMjUwNCw2ICsyNDM4LDcgQEAKIAkJCS04OjAwCS0JUFNUCTE5NzAKIAkJCS03OjAwCU1leGljbwlNJXNUCiAKKyMgQmFow61hIGRlIEJhbmRlcmFzCiBab25lIEFtZXJpY2EvQmFoaWFfQmFuZGVyYXMJLTc6MDE6MDAgLQlMTVQJMTkyMSBEZWMgMzEgMjM6NTk6MDAKIAkJCS03OjAwCS0JTVNUCTE5MjcgSnVuIDEwIDIzOjAwCiAJCQktNjowMAktCUNTVAkxOTMwIE5vdiAxNQpAQCAtMjUxMyw3ICsyNDQ4LDcgQEAKIAkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0CiAJCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAogCQkJLTg6MDAJLQlQU1QJMTk3MAotCQkJLTc6MDAJTWV4aWNvCU0lc1QJMjAxMCBBcHIgNCAyOjAwCisJCQktNzowMAlNZXhpY28JTSVzVAkyMDEwIEFwciAgNCAgMjowMAogCQkJLTY6MDAJTWV4aWNvCUMlc1QKIAogIyBCYWphIENhbGlmb3JuaWEgKG5lYXIgVVMgYm9yZGVyKQpAQCAtMjU2MCw3ICsyNDk1LDcgQEAKICMgQW1lcmljYS9UaWp1YW5hIG9ubHkgaW4gdGhhdCBpdCBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk3NgogIyB0aHJvdWdoIDE5OTUuICBUaGlzIHdhcyBhcyBwZXIgU2hhbmtzICgxOTk5KS4gIEJ1dCBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5CiAjIEVuc2VuYWRhIGRpZCBub3Qgb2JzZXJ2ZSBEU1QgZnJvbSAxOTQ4IHRocm91Z2ggMTk3NS4gIEd1eSBIYXJyaXMgcmVwb3J0cwotIyB0aGF0IHRoZSAxOTg3IE9BRyBzYXlzICJPbmx5IEVuc2VuYWRhLCBNZXhpY2FsZSwgU2FuIEZlbGlwZSBhbmQKKyMgdGhhdCB0aGUgMTk4NyBPQUcgc2F5cyAiT25seSBFbnNlbmFkYSwgTWV4aWNhbGksIFNhbiBGZWxpcGUgYW5kCiAjIFRpanVhbmEgb2JzZXJ2ZSBEU1QsIiB3aGljaCBhZ3JlZXMgd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgYnV0IGltcGxpZXMgdGhhdAogIyBEU1Qtb2JzZXJ2YW5jZSB3YXMgYSB0b3duLWJ5LXRvd24gbWF0dGVyIGJhY2sgdGhlbi4gIFRoaXMgY29uY2VybnMKICMgZGF0YSBhZnRlciAxOTcwIHNvIG1vc3QgbGlrZWx5IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgWm9uZQpAQCAtMjU3Myw3ICsyNTA4LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBBbmd1aWxsYQotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCiAKICMgQW50aWd1YSBhbmQgQmFyYnVkYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQpAQCAtMjYwOSw4ICsyNTQ0LDggQEAKIFJ1bGUJQmFyYgkxOTc5CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKIFJ1bGUJQmFyYgkxOTgwCW9ubHkJLQlTZXAJMjUJMjowMAkwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9CYXJiYWRvcwktMzo1ODoyOSAtCUxNVAkxOTI0CQkjIEJyaWRnZXRvd24KLQkJCS0zOjU4OjI5IC0JQk1UCTE5MzIJICAjIEJyaWRnZXRvd24gTWVhbiBUaW1lCitab25lIEFtZXJpY2EvQmFyYmFkb3MJLTM6NTg6MjkgLQlMTVQJMTkyNCAjIEJyaWRnZXRvd24KKwkJCS0zOjU4OjI5IC0JQk1UCTE5MzIgIyBCcmlkZ2V0b3duIE1lYW4gVGltZQogCQkJLTQ6MDAJQmFyYglBJXNUCiAKICMgQmVsaXplCkBAIC0yNjQwLDIwICsyNTc1LDIwIEBACiAjIGh0dHA6Ly93d3cudGhlcm95YWxnYXpldHRlLmNvbS9hcHBzL3BiY3MuZGxsL2FydGljbGU/QUlEPS8yMDA2MDUyOS9ORVdTLzEwNTI5MDEzNQogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF0bGFudGljL0Jlcm11ZGEJLTQ6MTk6MTggLQlMTVQJMTkzMCBKYW4gIDEgMjowMCAgICAjIEhhbWlsdG9uCi0JCQktNDowMAktCUFTVAkxOTc0IEFwciAyOCAyOjAwCitab25lIEF0bGFudGljL0Jlcm11ZGEJLTQ6MTk6MTggLQlMTVQJMTkzMCBKYW4gIDEgIDI6MDAgIyBIYW1pbHRvbgorCQkJLTQ6MDAJLQlBU1QJMTk3NCBBcHIgMjggIDI6MDAKIAkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NzYKIAkJCS00OjAwCVVTCUElc1QKIAogIyBDYXltYW4gSXMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9DYXltYW4JLTU6MjU6MzIgLQlMTVQJMTg5MAkJIyBHZW9yZ2V0b3duCi0JCQktNTowNzoxMSAtCUtNVAkxOTEyIEZlYiAgICAjIEtpbmdzdG9uIE1lYW4gVGltZQorWm9uZQlBbWVyaWNhL0NheW1hbgktNToyNTozMiAtCUxNVAkxODkwICAgICAjIEdlb3JnZXRvd24KKwkJCS01OjA3OjExIC0JS01UCTE5MTIgRmViICMgS2luZ3N0b24gTWVhbiBUaW1lCiAJCQktNTowMAktCUVTVAogCiAjIENvc3RhIFJpY2EKIAotIyBNaWxuZSBnaXZlcyAtNTozNjoxMy4zIGFzIFNhbiBKb3NlIG1lYW4gdGltZTsgcm91bmQgdG8gbmVhcmVzdC4KKyMgTWlsbmUgZ2l2ZXMgLTU6MzY6MTMuMyBhcyBTYW4gSm9zw6kgbWVhbiB0aW1lOyByb3VuZCB0byBuZWFyZXN0LgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlDUgkxOTc5CTE5ODAJLQlGZWIJbGFzdFN1bgkwOjAwCTE6MDAJRApAQCAtMjY2MywxMCArMjU5OCwxMCBAQAogIyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KIFJ1bGUJQ1IJMTk5MQlvbmx5CS0JSnVsCSAxCTA6MDAJMAlTCiBSdWxlCUNSCTE5OTIJb25seQktCU1hcgkxNQkwOjAwCTAJUwotIyBUaGVyZSBhcmUgdG9vIG1hbnkgU2FuIEpvc2VzIGVsc2V3aGVyZSwgc28gd2UnbGwgdXNlICdDb3N0YSBSaWNhJy4KKyMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBKb3PDqXMgZWxzZXdoZXJlLCBzbyB3ZSdsbCB1c2UgJ0Nvc3RhIFJpY2EnLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0Nvc3RhX1JpY2EJLTU6MzY6MTMgLQlMTVQJMTg5MAkJIyBTYW4gSm9zZQotCQkJLTU6MzY6MTMgLQlTSk1UCTE5MjEgSmFuIDE1ICMgU2FuIEpvc2UgTWVhbiBUaW1lCitab25lIEFtZXJpY2EvQ29zdGFfUmljYQktNTozNjoxMyAtCUxNVAkxODkwICAgICAgICAjIFNhbiBKb3PDqQorCQkJLTU6MzY6MTMgLQlTSk1UCTE5MjEgSmFuIDE1ICMgU2FuIEpvc8OpIE1lYW4gVGltZQogCQkJLTY6MDAJQ1IJQyVzVAogIyBDb2NvCiAjIG5vIGluZm9ybWF0aW9uOyBwcm9iYWJseSBsaWtlIEFtZXJpY2EvQ29zdGFfUmljYQpAQCAtMjY4NSw4ICsyNjIwLDggQEAKICMgRHVyaW5nIHRoZSBnYW1lLCBwbGF5LWJ5LXBsYXkgYW5ub3VuY2VyIEppbSBIdW50ZXIgbm90ZWQgdGhhdAogIyAiV2UnbGwgYmUgbG9zaW5nIHR3byBob3VycyBvZiBzbGVlcC4uLkN1YmEgc3dpdGNoZWQgdG8gRGF5bGlnaHQgU2F2aW5nCiAjIFRpbWUgdG9kYXkuIiAgKFRoZSAidHdvIGhvdXIiIHJlbWFyayByZWZlcnJlZCB0byBsb3Npbmcgb25lIGhvdXIgb2YKLSMgc2xlZXAgb24gMTk5OS0wMy0yOC0td2hlbiB0aGUgYW5ub3VuY2VycyB3ZXJlIGluIEN1YmEgYXMgaXQgc3dpdGNoZWQKLSMgdG8gRFNULS1hbmQgb25lIG1vcmUgaG91ciBvbiAxOTk5LTA0LTA0LS13aGVuIHRoZSBhbm5vdW5jZXJzIHdpbGwgaGF2ZQorIyBzbGVlcCBvbiAxOTk5LTAzLTI4IC0gd2hlbiB0aGUgYW5ub3VuY2VycyB3ZXJlIGluIEN1YmEgYXMgaXQgc3dpdGNoZWQKKyMgdG8gRFNUIC0gYW5kIG9uZSBtb3JlIGhvdXIgb24gMTk5OS0wNC0wNCAtIHdoZW4gdGhlIGFubm91bmNlcnMgd2lsbCBoYXZlCiAjIHJldHVybmVkIHRvIEJhbHRpbW9yZSwgd2hpY2ggc3dpdGNoZXMgb24gdGhhdCBkYXRlLikKIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMy0xMS0xMSk6CkBAIC0yNzA4LDE2ICsyNjQzLDE2IEBACiAjIGFkanVzdG1lbnQgaW4gQ3ViYS4gIFdlIHdpbGwgc3RheSBpbiBkYXlsaWdodCBzYXZpbmcgdGltZToKICMgaHR0cDovL3d3dy5ncmFubWEuY3UvZXNwYW5vbC8yMDA1L25vdmllbWJyZS9taWVyOS9ob3JhcmlvLmh0bWwKIAotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0xMC0yMSk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNi0xMC0yMSk6CiAjIEFuIGFydGljbGUgaW4gR1JBTk1BIElOVEVSTkFDSU9OQUwgY2xhaW1zIHRoYXQgQ3ViYSB3aWxsIGVuZAogIyB0aGUgMyB5ZWFycyBvZiBwZXJtYW5lbnQgRFNUIG5leHQgd2Vla2VuZCwgc2VlCiAjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1L2luZ2xlcy8yMDA2L29jdHVicmUvbHVuMTYvNDNob3JhcmlvLmh0bWwKICMgIk9uIFNhdHVyZGF5IG5pZ2h0LCBPY3RvYmVyIDI4IGdvaW5nIGludG8gU3VuZGF5LCBPY3RvYmVyIDI5LCBhdCAwMTowMCwKLSMgd2F0Y2hlcyBzaG91bGQgYmUgc2V0IGJhY2sgb25lIGhvdXIgLS0gZ29pbmcgYmFjayB0byAwMDowMCBob3VycyAtLSByZXR1cm5pbmcKKyMgd2F0Y2hlcyBzaG91bGQgYmUgc2V0IGJhY2sgb25lIGhvdXIgLSBnb2luZyBiYWNrIHRvIDAwOjAwIGhvdXJzIC0gcmV0dXJuaW5nCiAjIHRvIHRoZSBub3JtYWwgc2NoZWR1bGUuLi4uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0wMik6Ci0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvZW5nbGlzaC9uZXdzL2FydDg5Lmh0bWwsIGRhdGVkIHllc3RlcmRheSwKKyMgPGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvZW5nbGlzaC9uZXdzL2FydDg5Lmh0bWw+LCBkYXRlZCB5ZXN0ZXJkYXksCiAjIHNheXMgQ3ViYW4gY2xvY2tzIHdpbGwgYWR2YW5jZSBhdCBtaWRuaWdodCBvbiBNYXJjaCAxMC4KICMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm9ybWF0aW9uLCBhc3N1bWUgQ3ViYSB3aWxsIHVzZSBVUyBydWxlcywKICMgZXhjZXB0IHRoYXQgaXQgc3dpdGNoZXMgYXQgbWlkbmlnaHQgc3RhbmRhcmQgdGltZSBhcyB1c3VhbC4KQEAgLTI3MzEsMTAgKzI2NjYsMTAgQEAKICMgaHR0cDovL3d3dy5wcmVuc2FsYXRpbmEuY29tLm14L2FydGljbGUuYXNwP0lEPSU3QjRDQzMyQzFCLUE5RjctNDJGQi04QTA3LTg2MzFBRkM5MjNBRiU3RCZsYW5ndWFnZT1FUwogIyBodHRwOi8vYWN0dWFsaWRhZC50ZXJyYS5lcy9zb2NpZWRhZC9hcnRpY3Vsby9jdWJhX2xsYW1hX2Fob3JyYXJfZW5lcmdpYV9jYW1iaW9fMTk1NzA0NC5odG0KICMKLSMgRnJvbSBBbGV4IEtyeXZlbmlzaGV2ICgyMDA3LTEwLTI1KToKKyMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA3LTEwLTI1KToKICMgSGVyZSBpcyBhbHNvIGFydGljbGUgZnJvbSBHcmFubWEgKEN1YmEpOgogIwotIyBbUmVnaXJhXSBlbCBIb3JhcmlvIE5vcm1hbCBkZXNkZSBlbCBbcHJveGltb10gZG9taW5nbyAyOCBkZSBvY3R1YnJlCisjIFJlZ2lyw6EgZWwgSG9yYXJpbyBOb3JtYWwgZGVzZGUgZWwgcHLDs3hpbW8gZG9taW5nbyAyOCBkZSBvY3R1YnJlCiAjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwNy8xMC8yNC9uYWNpb25hbC9hcnRpYzA3Lmh0bWwKICMKICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19jdWJhMDMuaHRtbApAQCAtMjc0MiwyMyArMjY3NywxOCBAQAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0wOSk6CiAjIEknbSBpbiBNYXJ5bGFuZCB3aGljaCBpcyBub3cgb2JzZXJ2aW5nIFVuaXRlZCBTdGF0ZXMgRWFzdGVybiBEYXlsaWdodAogIyBUaW1lLiBBdCA5OjQ0IGxvY2FsIHRpbWUgSSB1c2VkIFJlYWxQbGF5ZXIgdG8gbGlzdGVuIHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly9tZWRpYS5lbmV0LmN1L3JhZGlvcmVsb2oiPgogIyBodHRwOi8vbWVkaWEuZW5ldC5jdS9yYWRpb3JlbG9qCi0jIDwvYT4sIGEgQ3ViYW4gaW5mb3JtYXRpb24gc3RhdGlvbiwgYW5kIGhlYXJkCisjIGEgQ3ViYW4gaW5mb3JtYXRpb24gc3RhdGlvbiwgYW5kIGhlYXJkCiAjIHRoZSB0aW1lIGFubm91bmNlZCBhcyAib2NobyBjdWFyZW50YSB5IGN1YXRybyIgKCJlaWdodCBmb3J0eS1mb3VyIiksCiAjIGluZGljYXRpbmcgdGhhdCBDdWJhIGlzIHN0aWxsIG9uIHN0YW5kYXJkIHRpbWUuCiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDMtMTIpOgogIyBJdCBzZWVtcyB0aGF0IEN1YmEgd2lsbCBzdGFydCBEU1Qgb24gU3VuZGF5LCAyMDA3LTAzLTE2Li4uCiAjIEl0IHdhcyBhbm5vdW5jZWQgeWVzdGVyZGF5LCBhY2NvcmRpbmcgdG8gdGhpcyBzb3VyY2UgKGluIFNwYW5pc2gpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5uYy5jdWJhd2ViLmN1L21hcnpvLTIwMDgvY2llbi0xLTExLTMtMDguaHRtIj4KICMgaHR0cDovL3d3dy5ubmMuY3ViYXdlYi5jdS9tYXJ6by0yMDA4L2NpZW4tMS0xMS0zLTA4Lmh0bQotIyA8L2E+CiAjCiAjIFNvbWUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGlzIHBvc3RlZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwKLSMgPC9hPgogIwogIyBUaGUgYXJ0aWNsZSBhbHNvIHNheXMgdGhhdCBDdWJhIGhhcyBiZWVuIG9ic2VydmluZyBEU1Qgc2luY2UgMTk2MywKICMgd2hpbGUgU2hhbmtzIChhbmQgdHpkYXRhKSBoYXMgMTk2NSBhcyB0aGUgZmlyc3QgZGF0ZSAoZXhjZXB0IGluIHRoZQpAQCAtMjc2OCwxOCArMjY5OCwxNCBAQAogIyBjaGFuZ2Ugc29tZSBoaXN0b3JpYyByZWNvcmRzIGFzIHdlbGwuCiAjCiAjIE9uZSBleGFtcGxlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJhZGlvaGMuY3UvZXNwYW5vbC9ub3RpY2lhcy9tYXIwNy8xMW1hci9ob3IuaHRtIj4KICMgaHR0cDovL3d3dy5yYWRpb2hjLmN1L2VzcGFub2wvbm90aWNpYXMvbWFyMDcvMTFtYXIvaG9yLmh0bQotIyA8L2E+CiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDMtMTMpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDgtMDMtMTMpOgogIyBUaGUgQ3ViYW4gdGltZSBjaGFuZ2UgaGFzIGp1c3QgYmVlbiBjb25maXJtZWQgb24gdGhlIG1vc3QgYXV0aG9yaXRhdGl2ZQogIyB3ZWIgc2l0ZSwgdGhlIEdyYW5tYS4gIFBsZWFzZSBjaGVjayBvdXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS8yMDA4LzAzLzEzL25hY2lvbmFsL2FydGljMTAuaHRtbCI+CiAjIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwOC8wMy8xMy9uYWNpb25hbC9hcnRpYzEwLmh0bWwKLSMgPC9hPgogIwotIyBCYXNpY2FsbHkgYXMgZXhwZWN0ZWQgYWZ0ZXIgU3RlZmZlbiBUaG9yc2VucyBpbmZvcm1hdGlvbiwgdGhlIGNoYW5nZQorIyBCYXNpY2FsbHkgYXMgZXhwZWN0ZWQgYWZ0ZXIgU3RlZmZlbiBUaG9yc2VuJ3MgaW5mb3JtYXRpb24sIHRoZSBjaGFuZ2UKICMgd2lsbCB0YWtlIHBsYWNlIG1pZG5pZ2h0IGJldHdlZW4gU2F0dXJkYXkgYW5kIFN1bmRheS4KIAogIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0xMik6CkBAIC0yNzkwLDE4ICsyNzE2LDE0IEBACiAjIG1pZG5pZ2h0IGJldHdlZW4gU2F0dXJkYXksIE1hcmNoIDA3LCAyMDA5IGFuZCBTdW5kYXksIE1hcmNoIDA4LCAyMDA5LQogIyBub3Qgb24gbWlkbmlnaHQgTWFyY2ggMTQgLyBNYXJjaCAxNSBhcyBwcmV2aW91c2x5IHRob3VnaHQuCiAjCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfY3ViYTA1Lmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2N1YmEwNS5odG1sCiAjIChpbiBTcGFuaXNoKQotIyA8L2E+CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDMtMDkpCiAjIEkgbGlzdGVuZWQgb3ZlciB0aGUgSW50ZXJuZXQgdG8KLSMgPGEgaHJlZj0iaHR0cDovL21lZGlhLmVuZXQuY3UvcmVhZGlvcmVsb2oiPgogIyBodHRwOi8vbWVkaWEuZW5ldC5jdS9yZWFkaW9yZWxvagotIyA8L2E+CiAjIHRoaXMgbW9ybmluZzsgd2hlbiBpdCB3YXMgMTA6MDUgYS4gbS4gaGVyZSBpbiBCZXRoZXNkYSwgTWFyeWxhbmQgdGhlCi0jIHRoZSB0aW1lIHdhcyBhbm5vdW5jZWQgYXMgImRpZXogY2luY28iLS10aGUgc2FtZSB0aW1lIGFzIGhlcmUsIGluZGljYXRpbmcKKyMgdGhlIHRpbWUgd2FzIGFubm91bmNlZCBhcyAiZGlleiBjaW5jbyIgLSB0aGUgc2FtZSB0aW1lIGFzIGhlcmUsIGluZGljYXRpbmcKICMgdGhhdCBoYXMgaW5kZWVkIHN3aXRjaGVkIHRvIERTVC4gQXNzdW1lIHNlY29uZCBTdW5kYXkgZnJvbSAyMDA5IGZvcndhcmQuCiAKICMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTEtMDMtMDgpOgpAQCAtMjgxMCw0MiArMjczMiwzMCBAQAogIyBjaGFuZ2VkIGF0IGFsbCkuCiAjCiAjIFNvdXJjZToKLSMgPGEgaHJlZj0iaHR0cDovL2dyYW5tYS5jby5jdS8yMDExLzAzLzA4L25hY2lvbmFsL2FydGljMDEuaHRtbCI+CiAjIGh0dHA6Ly9ncmFubWEuY28uY3UvMjAxMS8wMy8wOC9uYWNpb25hbC9hcnRpYzAxLmh0bWwKLSMgPC9hPgogIwogIyBPdXIgaW5mbzoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2N1YmEtc3RhcnRzLWRzdC0yMDExLmh0bWwiPgogIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LTIwMTEuaHRtbAotIyA8L2E+CiAjCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDExLTEwLTMwKQogIyBDdWJhIHdpbGwgZW5kIERTVCB0d28gd2Vla3MgbGF0ZXIgdGhpcyB5ZWFyLiBJbnN0ZWFkIG9mIGdvaW5nIGJhY2sKICMgdG9uaWdodCwgaXQgaGFzIGJlZW4gZGVsYXllZCB0byAyMDExLTExLTEzIGF0IDAxOjAwLgogIwogIyBPbmUgc291cmNlIChTcGFuaXNoKQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJhZGlvYW5ndWxvLmN1L25vdGljaWFzL2N1YmEvMTcxMDUtY3ViYS1yZXN0YWJsZWNlcmEtZWwtaG9yYXJpby1kZWwtbWVyaWRpYW5vLWRlLWdyZWVud2ljaC5odG1sIj4KICMgaHR0cDovL3d3dy5yYWRpb2FuZ3Vsby5jdS9ub3RpY2lhcy9jdWJhLzE3MTA1LWN1YmEtcmVzdGFibGVjZXJhLWVsLWhvcmFyaW8tZGVsLW1lcmlkaWFuby1kZS1ncmVlbndpY2guaHRtbAotIyA8L2E+CiAjCiAjIE91ciBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS10aW1lLWNoYW5nZXMtMjAxMS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2N1YmEtdGltZS1jaGFuZ2VzLTIwMTEuaHRtbAotIyA8L2E+CiAjCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEyLTAzLTAxKQogIyBBY2NvcmRpbmcgdG8gUmFkaW8gUmVsb2osIEN1YmEgd2lsbCBzdGFydCBEU1Qgb24gTWlkbmlnaHQgYmV0d2VlbiBNYXJjaAogIyAzMSBhbmQgQXByaWwgMS4KICMKICMgUmFkaW8gUmVsb2ogaGFzIHRoZSBmb2xsb3dpbmcgaW5mbyAoU3BhbmlzaCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFkaW9yZWxvai5jdS9pbmRleC5waHAvbm90aWNpYXMtcmFkaW8tcmVsb2ovNzEtbWlzY2VsYW5lYXMvNzUyOS1jdWJhLWFwbGljYXJhLWVsLWhvcmFyaW8tZGUtdmVyYW5vLWRlc2RlLWVsLTEtZGUtYWJyaWwiPgogIyBodHRwOi8vd3d3LnJhZGlvcmVsb2ouY3UvaW5kZXgucGhwL25vdGljaWFzLXJhZGlvLXJlbG9qLzcxLW1pc2NlbGFuZWFzLzc1MjktY3ViYS1hcGxpY2FyYS1lbC1ob3JhcmlvLWRlLXZlcmFuby1kZXNkZS1lbC0xLWRlLWFicmlsCi0jIDwvYT4KICMKICMgT3VyIGluZm8gb24gaXQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9jdWJhLXN0YXJ0cy1kc3QtMjAxMi5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2N1YmEtc3RhcnRzLWRzdC0yMDEyLmh0bWwKLSMgPC9hPgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEyLTExLTAzKToKICMgUmFkaW8gUmVsb2ogYW5kIG1hbnkgb3RoZXIgc291cmNlcyByZXBvcnQgdGhhdCBDdWJhIGlzIGNoYW5naW5nIGJhY2sKQEAgLTI5MDEsNyArMjgxMSw3IEBACiAJCQktNTowMAlDdWJhCUMlc1QKIAogIyBEb21pbmljYQotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCiAKICMgRG9taW5pY2FuIFJlcHVibGljCiAKQEAgLTI5MzQsOCArMjg0NCw4IEBACiBab25lIEFtZXJpY2EvU2FudG9fRG9taW5nbyAtNDozOTozNiAtCUxNVAkxODkwCiAJCQktNDo0MAktCVNETVQJMTkzMyBBcHIgIDEgMTI6MDAgIyBTLiBEb20uIE1UCiAJCQktNTowMAlEUglFJXNUCTE5NzQgT2N0IDI3Ci0JCQktNDowMAktCUFTVAkyMDAwIE9jdCAyOSAwMjowMAotCQkJLTU6MDAJVVMJRSVzVAkyMDAwIERlYyAgMyAwMTowMAorCQkJLTQ6MDAJLQlBU1QJMjAwMCBPY3QgMjkgIDI6MDAKKwkJCS01OjAwCVVTCUUlc1QJMjAwMCBEZWMgIDMgIDE6MDAKIAkJCS00OjAwCS0JQVNUCiAKICMgRWwgU2FsdmFkb3IKQEAgLTI5NDYsMjAgKzI4NTYsMjAgQEAKICMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBTYWx2YWRvcnMgZWxzZXdoZXJlLCBzbyB1c2UgQW1lcmljYS9FbF9TYWx2YWRvcgogIyBpbnN0ZWFkIG9mIEFtZXJpY2EvU2FuX1NhbHZhZG9yLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0VsX1NhbHZhZG9yIC01OjU2OjQ4IC0JTE1UCTE5MjEJCSMgU2FuIFNhbHZhZG9yCitab25lIEFtZXJpY2EvRWxfU2FsdmFkb3IgLTU6NTY6NDggLQlMTVQJMTkyMSAjIFNhbiBTYWx2YWRvcgogCQkJLTY6MDAJU2FsdglDJXNUCiAKICMgR3JlbmFkYQogIyBHdWFkZWxvdXBlCi0jIFN0IEJhcnRoZWxlbXkKKyMgU3QgQmFydGjDqWxlbXkKICMgU3QgTWFydGluIChGcmVuY2ggcGFydCkKLSMgU2VlICdzb3V0aGFtZXJpY2EnLgorIyBTZWUgQW1lcmljYS9Qb3J0X29mX1NwYWluLgogCiAjIEd1YXRlbWFsYQogIwogIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA2LTA0LTIyKSwgYWZ0ZXIgYSBoZWFkcy11cCBmcm9tIE9zY2FyIHZhbiBWbGlqbWVuOgogIyBEaWFyaW8gQ28gTGF0aW5vLCBhdAotIyBodHRwOi8vd3d3LmRpYXJpb2NvbGF0aW5vLmNvbS9pbnRlcm5hY2lvbmFsZXMvZGV0YWxsZXMuYXNwP05ld3NJRD04MDc5LAorIyA8aHR0cDovL3d3dy5kaWFyaW9jb2xhdGluby5jb20vaW50ZXJuYWNpb25hbGVzL2RldGFsbGVzLmFzcD9OZXdzSUQ9ODA3OT4sCiAjIHNheXMgaW4gYW4gYXJ0aWNsZSBkYXRlZCAyMDA2LTA0LTE5IHRoYXQgdGhlIEd1YXRlbWFsYW4gZ292ZXJubWVudCBoYWQKICMgZGVjaWRlZCBvbiB0aGF0IGRhdGUgdG8gYWR2YW5jZSBvZmZpY2lhbCB0aW1lIGJ5IDYwIG1pbnV0ZXMsIHRvIGxlc3NlbiB0aGUKICMgaW1wYWN0IG9mIHRoZSBlbGV2YXRlZCBjb3N0IG9mIG9pbC4uLi4gIERheWxpZ2h0IHNhdmluZyB0aW1lIHdpbGwgbGFzdCBmcm9tCkBAIC0yOTY3LDcgKzI4NzcsNyBAQAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA2LTIyKToKICMgVGhlIE1pbmlzdHJ5IG9mIEVuZXJneSBhbmQgTWluZXMsIHByZXNzIHJlbGVhc2UgQ1AtMTUvMjAwNgogIyAoMjAwNi0wNC0xOSksIHNheXMgRFNUIGVuZHMgYXQgMjQ6MDAuICBTZWUKLSMgPGh0dHA6Ly93d3cuc2llY2Eub3JnLmd0L1NpdGlvX3B1YmxpY28vRW5lcmdldGljb3MvRG9jL01lZGlkYXMvQ2FtYmlvX0hvcmFyaW9fTmFjXzE5MDQwNi5wZGY+LgorIyBodHRwOi8vd3d3LnNpZWNhLm9yZy5ndC9TaXRpb19wdWJsaWNvL0VuZXJnZXRpY29zL0RvYy9NZWRpZGFzL0NhbWJpb19Ib3JhcmlvX05hY18xOTA0MDYucGRmCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCUd1YXQJMTk3Mwlvbmx5CS0JTm92CTI1CTA6MDAJMTowMAlECkBAIC0yOTg0LDExICsyODk0LDEwIEBACiAKICMgSGFpdGkKICMgRnJvbSBHd2lsbGltIExhdyAoMjAwNS0wNC0xNSk6Ci0jIFJpc3RvIE8uIE55a2FuZW4gd3JvdGUgbWUgdGhhdCBIYWl0aSBpcyBub3cgb24gRFNULgotIyBJIHNlYXJjaGVkIGZvciBjb25maXJtYXRpb24sIGFuZCBJIGZvdW5kIGEKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5oYWl0aWFuY29uc3VsYXRlLm9yZy90aW1lLmRvYyI+IHByZXNzIHJlbGVhc2UKKyMgUmlzdG8gTy4gTnlrw6RuZW4gd3JvdGUgbWUgdGhhdCBIYWl0aSBpcyBub3cgb24gRFNULgorIyBJIHNlYXJjaGVkIGZvciBjb25maXJtYXRpb24sIGFuZCBJIGZvdW5kIGEgcHJlc3MgcmVsZWFzZQogIyBvbiB0aGUgV2ViIHBhZ2Ugb2YgdGhlIEhhaXRpYW4gQ29uc3VsYXRlIGluIENoaWNhZ28gKDIwMDUtMDMtMzEpLAotIyA8L2E+LiAgVHJhbnNsYXRlZCBmcm9tIEZyZW5jaCwgaXQgc2F5czoKKyMgPGh0dHA6Ly93d3cuaGFpdGlhbmNvbnN1bGF0ZS5vcmcvdGltZS5kb2M+LiAgVHJhbnNsYXRlZCBmcm9tIEZyZW5jaCwgaXQgc2F5czoKICMKICMgICJUaGUgUHJpbWUgTWluaXN0ZXIncyBDb21tdW5pY2F0aW9uIE9mZmljZSBub3RpZmllcyB0aGUgcHVibGljIGluIGdlbmVyYWwKICMgICBhbmQgdGhlIHByZXNzIGluIHBhcnRpY3VsYXIgdGhhdCwgZm9sbG93aW5nIGEgZGVjaXNpb24gb2YgdGhlIEludGVyaW9yCkBAIC0zMDY1LDE0ICsyOTc0LDE0IEBACiAjIDxodHRwOi8vd3d3LmxhdHJpYnVuYS5obi85OTI5OS5odG1sPiB0aGF0IE1hbnVlbCBaZWxheWEsIHRoZSBwcmVzaWRlbnQKICMgb2YgSG9uZHVyYXMsIHJlZnVzZWQgdG8gYmFjayBkb3duIG9uIHRoaXMuCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDgtMDgpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDgtMDgpOgogIyBJdCBzZWVtcyB0aGF0IEhvbmR1cmFzIGhhcyByZXR1cm5lZCBmcm9tIERTVCB0byBzdGFuZGFyZCB0aW1lIHRoaXMgTW9uZGF5IGF0CiAjIDAwOjAwIGhvdXJzIChwcm9sb25naW5nIFN1bmRheSB0byAyNSBob3VycyBkdXJhdGlvbikuCiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfaG9uZHVyYXMwNC5odG1sCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wOC0wOCk6Ci0jIEFsc28gc2VlIERpYXJpbyBFbCBIZXJhbGRvLCBUaGUgY291bnRyeSByZXR1cm5zIHRvIHN0YW5kYXJkIHRpbWUgKDIwMDYtMDgtMDgpCi0jIDxodHRwOi8vd3d3LmVsaGVyYWxkby5obi9ub3RhLnBocD9uaWQ9NTQ5NDEmc2VjPTEyPi4KKyMgQWxzbyBzZWUgRGlhcmlvIEVsIEhlcmFsZG8sIFRoZSBjb3VudHJ5IHJldHVybnMgdG8gc3RhbmRhcmQgdGltZSAoMjAwNi0wOC0wOCkuCisjIGh0dHA6Ly93d3cuZWxoZXJhbGRvLmhuL25vdGEucGhwP25pZD01NDk0MSZzZWM9MTIKICMgSXQgbWVudGlvbnMgZXhlY3V0aXZlIGRlY3JlZSAxOC0yMDA2LgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTA4LTE3KToKQEAgLTMxMDAsMjIgKzMwMDksMjIgQEAKICMgdW5zcGVjaWZpZWQgb2ZmaWNpYWwgZG9jdW1lbnQsIGFuZCBzYXlzICJUaGlzIHRpbWUgaXMgdXNlZCB0aHJvdWdob3V0IHRoZQogIyBpc2xhbmQiLiAgR28gd2l0aCBNaWxuZS4gIFJvdW5kIHRvIHRoZSBuZWFyZXN0IHNlY29uZCBhcyByZXF1aXJlZCBieSB6aWMuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvSmFtYWljYQktNTowNzoxMSAtCUxNVAkxODkwCQkjIEtpbmdzdG9uCitab25lCUFtZXJpY2EvSmFtYWljYQktNTowNzoxMSAtCUxNVAkxODkwICAgICAgICAjIEtpbmdzdG9uCiAJCQktNTowNzoxMSAtCUtNVAkxOTEyIEZlYiAgICAjIEtpbmdzdG9uIE1lYW4gVGltZQotCQkJLTU6MDAJLQlFU1QJMTk3NCBBcHIgMjggMjowMAorCQkJLTU6MDAJLQlFU1QJMTk3NCBBcHIgMjggIDI6MDAKIAkJCS01OjAwCVVTCUUlc1QJMTk4NAogCQkJLTU6MDAJLQlFU1QKIAogIyBNYXJ0aW5pcXVlCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTWFydGluaXF1ZQktNDowNDoyMCAtICAgICAgTE1UCTE4OTAJCSMgRm9ydC1kZS1GcmFuY2UKLQkJCS00OjA0OjIwIC0JRkZNVAkxOTExIE1heSAgICAgIyBGb3J0LWRlLUZyYW5jZSBNVAorWm9uZSBBbWVyaWNhL01hcnRpbmlxdWUJLTQ6MDQ6MjAgLSAgICAgIExNVAkxODkwICAgICAgICAjIEZvcnQtZGUtRnJhbmNlCisJCQktNDowNDoyMCAtCUZGTVQJMTkxMSBNYXkgICAgIyBGb3J0LWRlLUZyYW5jZSBNVAogCQkJLTQ6MDAJLQlBU1QJMTk4MCBBcHIgIDYKIAkJCS00OjAwCTE6MDAJQURUCTE5ODAgU2VwIDI4CiAJCQktNDowMAktCUFTVAogCiAjIE1vbnRzZXJyYXQKLSMgU2VlICdzb3V0aGFtZXJpY2EnLgorIyBTZWUgQW1lcmljYS9Qb3J0X29mX1NwYWluLgogCiAjIE5pY2FyYWd1YQogIwpAQCAtMzEzOCwyNyArMzA0NywyNyBAQAogIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA0LTIxKToKICMgVGhlIEFzc29jaWF0ZWQgUHJlc3Mgc3Rvcnkgb24gdGhlIHRpbWUgY2hhbmdlLCB3aGljaCBjYW4gYmUgZm91bmQgYXQKICMgaHR0cDovL3d3dy5sYXBhbG1haW50ZXJhY3Rpdm8uY29tL2d1aWFzL2NvbnRlbnQvZ2VuL2FwL0FtZXJpY2FfTGF0aW5hL0FNQ19HRU5fTklDQVJBR1VBX0hPUkEuaHRtbAotIyBhbmQgZWxzZXdoZXJlLCBzYXlzIChmaWZ0aCBwYXJhZ3JhcGgsIHRyYW5zbGF0ZWQgZnJvbSBTcGFuaXNoKTogICJUaGUgbGFzdAorIyBhbmQgZWxzZXdoZXJlLCBzYXlzIChmaWZ0aCBwYXJhZ3JhcGgsIHRyYW5zbGF0ZWQgZnJvbSBTcGFuaXNoKTogIlRoZSBsYXN0CiAjIHRpbWUgdGhhdCBhIGNoYW5nZSBvZiBjbG9ja3Mgd2FzIGFwcGxpZWQgdG8gc2F2ZSBlbmVyZ3kgd2FzIGluIHRoZSB5ZWFyIDIwMDAKLSMgZHVyaW5nIHRoZSBBcm5vbGRvIEFsZW1hbiBhZG1pbmlzdHJhdGlvbi4iLi4uCisjIGR1cmluZyB0aGUgQXJub2xkbyBBbGVtw6FuIGFkbWluaXN0cmF0aW9uLiIuLi4KICMgVGhlIG5vcnRoYW1lcmljYSBmaWxlIHNheXMgdGhhdCBOaWNhcmFndWEgaGFzIGJlZW4gb24gVVRDLTYgY29udGludW91c2x5CiAjIHNpbmNlIERlY2VtYmVyIDE5OTguICBJIHdhc24ndCBhYmxlIHRvIGZpbmQgYW55IGRldGFpbHMgb2YgTmljYXJhZ3VhbiB0aW1lCiAjIGNoYW5nZXMgaW4gMjAwMC4gIFBlcmhhcHMgYSBub3RlIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBub3J0aGFtZXJpY2EgZmlsZSwgdG8KICMgdGhlIGVmZmVjdCB0aGF0IHdlIGhhdmUgaW5kaXJlY3QgZXZpZGVuY2UgdGhhdCBEU1Qgd2FzIG9ic2VydmVkIGluIDIwMDAuCiAjCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTExLTAyKToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA1LTExLTAyKToKICMgTmljYXJhZ3VhIGxlZnQgRFNUIHRoZSAyMDA1LTEwLTAyIGF0IDAwOjAwIChsb2NhbCB0aW1lKS4KICMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvcHJlc2lkZW5jaWEvZmlsZXNfaW5kZXgvc2VjcmV0YXJpYS9jb211bmljYWRvcy8yMDA1L3NlcHRpZW1icmUvMjZzZXB0aWVtYnJlLWNhbWJpby1ob3JhLmh0bQogIyAoMjAwNS0wOS0yNikKICMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDUtMDUpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDUtMDUpOgogIyBodHRwOi8vd3d3LmVsbnVldm9kaWFyaW8uY29tLm5pLzIwMDYvMDUvMDEvbmFjaW9uYWxlcy8xODQxMAogIyAobXkgaW5mb3JtYWwgdHJhbnNsYXRpb24pCi0jIEJ5IG9yZGVyIG9mIHRoZSBwcmVzaWRlbnQgb2YgdGhlIHJlcHVibGljLCBFbnJpcXVlIEJvbGFub3MsIE5pY2FyYWd1YQorIyBCeSBvcmRlciBvZiB0aGUgcHJlc2lkZW50IG9mIHRoZSByZXB1YmxpYywgRW5yaXF1ZSBCb2xhw7FvcywgTmljYXJhZ3VhCiAjIGFkdmFuY2VkIGJ5IHNpeHR5IG1pbnV0ZXMgdGhlaXIgb2ZmaWNpYWwgdGltZSwgeWVzdGVyZGF5IGF0IDIgaW4gdGhlCi0jIG1vcm5pbmcsIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkgdW50aWwgMzAudGguIG9mIHNlcHRlbWJlci4KKyMgbW9ybmluZywgYW5kIHdpbGwgc3RheSB0aGF0IHdheSB1bnRpbCAzMHRoIG9mIFNlcHRlbWJlci4KICMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDktMzApOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMDktMzApOgogIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5uaS9idXNjYWRvcl9nYWNldGEvQkQvREVDUkVUT1MvMjAwNi9ELTA2My0yMDA2UC1QUk4tQ2FtYmlvLUhvcmEucGRmCiAjIE15IGluZm9ybWFsIHRyYW5zbGF0aW9uIHJ1bnM6CiAjIFRoZSBuYXR1cmFsIHN1biB0aW1lIGlzIHJlc3RvcmVkIGluIGFsbCB0aGUgbmF0aW9uYWwgdGVycml0b3J5LCBpbiB0aGF0IHRoZQpAQCAtMzE3Niw3ICszMDg1LDcgQEAKIAkJCS01OjQ1OjEyIC0JTU1UCTE5MzQgSnVuIDIzICMgTWFuYWd1YSBNZWFuIFRpbWU/CiAJCQktNjowMAktCUNTVAkxOTczIE1heQogCQkJLTU6MDAJLQlFU1QJMTk3NSBGZWIgMTYKLQkJCS02OjAwCU5pYwlDJXNUCTE5OTIgSmFuICAxIDQ6MDAKKwkJCS02OjAwCU5pYwlDJXNUCTE5OTIgSmFuICAxICA0OjAwCiAJCQktNTowMAktCUVTVAkxOTkyIFNlcCAyNAogCQkJLTY6MDAJLQlDU1QJMTk5MwogCQkJLTU6MDAJLQlFU1QJMTk5NwpAQCAtMzE4NSwzNiArMzA5NCwzNiBAQAogIyBQYW5hbWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQW1lcmljYS9QYW5hbWEJLTU6MTg6MDggLQlMTVQJMTg5MAotCQkJLTU6MTk6MzYgLQlDTVQJMTkwOCBBcHIgMjIgICAjIENvbG9uIE1lYW4gVGltZQorCQkJLTU6MTk6MzYgLQlDTVQJMTkwOCBBcHIgMjIgIyBDb2zDs24gTWVhbiBUaW1lCiAJCQktNTowMAktCUVTVAogCiAjIFB1ZXJ0byBSaWNvCiAjIFRoZXJlIGFyZSB0b28gbWFueSBTYW4gSnVhbnMgZWxzZXdoZXJlLCBzbyB3ZSdsbCB1c2UgJ1B1ZXJ0b19SaWNvJy4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9QdWVydG9fUmljbyAtNDoyNDoyNSAtCUxNVAkxODk5IE1hciAyOCAxMjowMCAgICAjIFNhbiBKdWFuCitab25lIEFtZXJpY2EvUHVlcnRvX1JpY28gLTQ6MjQ6MjUgLQlMTVQJMTg5OSBNYXIgMjggMTI6MDAgIyBTYW4gSnVhbgogCQkJLTQ6MDAJLQlBU1QJMTk0MiBNYXkgIDMKIAkJCS00OjAwCVVTCUElc1QJMTk0NgogCQkJLTQ6MDAJLQlBU1QKIAogIyBTdCBLaXR0cy1OZXZpcwogIyBTdCBMdWNpYQotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCiAKICMgU3QgUGllcnJlIGFuZCBNaXF1ZWxvbgogIyBUaGVyZSBhcmUgdG9vIG1hbnkgU3QgUGllcnJlcyBlbHNld2hlcmUsIHNvIHdlJ2xsIHVzZSAnTWlxdWVsb24nLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL01pcXVlbG9uCS0zOjQ0OjQwIC0JTE1UCTE5MTEgTWF5IDE1CSMgU3QgUGllcnJlCitab25lIEFtZXJpY2EvTWlxdWVsb24JLTM6NDQ6NDAgLQlMTVQJMTkxMSBNYXkgMTUgIyBTdCBQaWVycmUKIAkJCS00OjAwCS0JQVNUCTE5ODAgTWF5CiAJCQktMzowMAktCVBNU1QJMTk4NyAjIFBpZXJyZSAmIE1pcXVlbG9uIFRpbWUKIAkJCS0zOjAwCUNhbmFkYQlQTSVzVAogCiAjIFN0IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzCi0jIFNlZSAnc291dGhhbWVyaWNhJy4KKyMgU2VlIEFtZXJpY2EvUG9ydF9vZl9TcGFpbi4KIAogIyBUdXJrcyBhbmQgQ2FpY29zCiAjCiAjIEZyb20gQ2hyaXMgRHVubiBpbgotIyA8aHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQxNTAwNz4KKyMgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQxNTAwNwogIyAoMjAwNy0wMy0xNSk6IEluIHRoZSBUdXJrcyAmIENhaWNvcyBJc2xhbmRzIChBbWVyaWNhL0dyYW5kX1R1cmspIHRoZQogIyBkYXlsaWdodCBzYXZpbmcgZGF0ZXMgZm9yIHRpbWUgY2hhbmdlcyBoYXZlIGJlZW4gYWRqdXN0ZWQgdG8gbWF0Y2gKICMgdGhlIHJlY2VudCBVLlMuIGNoYW5nZSBvZiBkYXRlcy4KQEAgLTMyMjcsMjEgKzMxMzYsMjMgQEAKICMgQ2xvY2tzIGFyZSBzZXQgYmFjayBvbmUgaG91ciBhdCAyOjAwIGEubS4gbG9jYWwgRGF5bGlnaHQgU2F2aW5nIFRpbWUiCiAjIGluZGljYXRpbmcgdGhhdCB0aGUgbm9ybWFsIEVUIHJ1bGVzIGFyZSBmb2xsb3dlZC4KICMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNS0wMSk6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhleSB1c2UgVVMgRFNUIHJ1bGVzLCBidXQgSUFUQSBTU0lNICgxOTkxLzE5OTgpCi0jIHNheXMgdGhleSBzd2l0Y2ggYXQgbWlkbmlnaHQuICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wOC0xOSk6CisjIFRoZSAyMDE0LTA4LTEzIENhYmluZXQgbWVldGluZyBkZWNpZGVkIHRvIHN0YXkgb24gVVRDLTQgeWVhci1yb3VuZC4gIFNlZToKKyMgaHR0cDovL3Rjd2Vla2x5bmV3cy5jb20vZGF5bGlnaHQtc2F2aW5ncy10aW1lLXRvLWJlLW1haW50YWluZWQtcDUzNTMtMTI3Lmh0bQorIyBNb2RlbCB0aGlzIGFzIGEgc3dpdGNoIGZyb20gRVNUL0VEVCB0byBBU1Qgb24gMjAxNC0xMS0wMiBhdCAwMjowMC4KICMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVRDCTE5NzkJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVRDCTE5NzkJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVRDCTE5ODcJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJVEMJMjAwNwltYXgJLQlNYXIJU3VuPj04CTI6MDAJMTowMAlECi1SdWxlCVRDCTIwMDcJbWF4CS0JTm92CVN1bj49MQkyOjAwCTAJUwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL0dyYW5kX1R1cmsJLTQ6NDQ6MzIgLQlMTVQJMTg5MAotCQkJLTU6MDc6MTEgLQlLTVQJMTkxMiBGZWIgICAgIyBLaW5nc3RvbiBNZWFuIFRpbWUKLQkJCS01OjAwCVRDCUUlc1QKKwkJCS01OjA3OjExIC0JS01UCTE5MTIgRmViICMgS2luZ3N0b24gTWVhbiBUaW1lCisJCQktNTowMAktCUVTVAkxOTc5CisJCQktNTowMAlVUwlFJXNUCTIwMTQgTm92ICAyICAyOjAwCisJCQktNDowMAktCUFTVAogCiAjIEJyaXRpc2ggVmlyZ2luIElzCiAjIFZpcmdpbiBJcwotIyBTZWUgJ3NvdXRoYW1lcmljYScuCisjIFNlZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4uCisKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIGNvZGluZzogdXRmLTgKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvcGFjaWZpY25ldyBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL3BhY2lmaWNuZXcKaW5kZXggMDkwMDBjMy4uOWI5MjU3YSAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvcGFjaWZpY25ldworKysgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9wYWNpZmljbmV3CkBAIC0yMSw3ICsyMSw2IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIApkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvc291dGhhbWVyaWNhIGIvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvc291dGhhbWVyaWNhCmluZGV4IDAyYmYzYmIuLjM5OGVjMGUgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL3NvdXRoYW1lcmljYQorKysgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9zb3V0aGFtZXJpY2EKQEAgLTIxLDEzICsyMSwxMyBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLSMgPHByZT4KICMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKICMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCiAKLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCisjIFRoaXMgZmlsZSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAogIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGlhbmEub3JnIGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KKyMgdHpAaWFuYS5vcmcgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLiAgRm9yIG1vcmUsIHBsZWFzZSBzZWUKKyMgdGhlIGZpbGUgQ09OVFJJQlVUSU5HIGluIHRoZSB0eiBkaXN0cmlidXRpb24uCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6CiAjIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcwpAQCAtMzUsOCArMzUsOCBAQAogIyBTYW4gRGllZ286IEFDUyBQdWJsaWNhdGlvbnMsIEluYy4gKDIwMDMpLgogIwogIyBGb3IgZGF0YSBjaXJjYSAxODk5LCBhIGNvbW1vbiBzb3VyY2UgaXM6Ci0jIE1pbG5lIEouIENpdmlsIHRpbWUuIEdlb2dyIEouIDE4OTkgRmViOzEzKDIpOjE3My05NAotIyA8aHR0cDovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzE3NzQzNTk+LgorIyBNaWxuZSBKLiBDaXZpbCB0aW1lLiBHZW9nciBKLiAxODk5IEZlYjsxMygyKToxNzMtOTQuCisjIGh0dHA6Ly93d3cuanN0b3Iub3JnL3N0YWJsZS8xNzc0MzU5CiAjCiAjIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKICMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0CkBAIC01MywyNCArNTMsMjQgQEAKICMJSSBzdWdnZXN0IHRoZSB1c2Ugb2YgX1N1bW1lciB0aW1lXyBpbnN0ZWFkIG9mIHRoZSBtb3JlIGN1bWJlcnNvbWUKICMJX2RheWxpZ2h0LXNhdmluZyB0aW1lXy4gIF9TdW1tZXIgdGltZV8gc2VlbXMgdG8gYmUgaW4gZ2VuZXJhbCB1c2UKICMJaW4gRXVyb3BlIGFuZCBTb3V0aCBBbWVyaWNhLgotIwktLSBFIE8gQ3V0bGVyLCBfTmV3IFlvcmsgVGltZXNfICgxOTM3LTAyLTE0KSwgcXVvdGVkIGluCisjCS0t4oCKRSBPIEN1dGxlciwgX05ldyBZb3JrIFRpbWVzXyAoMTkzNy0wMi0xNCksIHF1b3RlZCBpbgogIwlIIEwgTWVuY2tlbiwgX1RoZSBBbWVyaWNhbiBMYW5ndWFnZTogU3VwcGxlbWVudCBJXyAoMTk2MCksIHAgNDY2CiAjCiAjIEVhcmxpZXIgZWRpdGlvbnMgb2YgdGhlc2UgdGFibGVzIGFsc28gdXNlZCB0aGUgTm9ydGggQW1lcmljYW4gc3R5bGUKICMgZm9yIHRpbWUgem9uZXMgaW4gQnJhemlsLCBidXQgdGhpcyB3YXMgaW5jb3JyZWN0LCBhcyBCcmF6aWxpYW5zIHNheQotIyAic3VtbWVyIHRpbWUiLiAgUmVpbmFsZG8gR291bGFydCwgYSBTYW8gUGF1bG8gYnVzaW5lc3NtYW4gYWN0aXZlIGluCisjICJzdW1tZXIgdGltZSIuICBSZWluYWxkbyBHb3VsYXJ0LCBhIFPDo28gUGF1bG8gYnVzaW5lc3NtYW4gYWN0aXZlIGluCiAjIHRoZSByYWlscm9hZCBzZWN0b3IsIHdyaXRlcyAoMTk5OS0wNy0wNik6CiAjCVRoZSBzdWJqZWN0IG9mIHRpbWUgem9uZXMgaXMgY3VycmVudGx5IGEgbWF0dGVyIG9mIGRpc2N1c3Npb24vZGViYXRlIGluCi0jCUJyYXppbC4gIExldCdzIHNheSB0aGF0ICJ0aGUgQnJhc2lsaWEgdGltZSIgaXMgY29uc2lkZXJlZCB0aGUKLSMJIm9mZmljaWFsIHRpbWUiIGJlY2F1c2UgQnJhc2lsaWEgaXMgdGhlIGNhcGl0YWwgY2l0eS4KLSMJVGhlIG90aGVyIHRocmVlIHRpbWUgem9uZXMgYXJlIGNhbGxlZCAiQnJhc2lsaWEgdGltZSAibWludXMgb25lIiBvcgorIwlCcmF6aWwuICBMZXQncyBzYXkgdGhhdCAidGhlIEJyYXPDrWxpYSB0aW1lIiBpcyBjb25zaWRlcmVkIHRoZQorIwkib2ZmaWNpYWwgdGltZSIgYmVjYXVzZSBCcmFzw61saWEgaXMgdGhlIGNhcGl0YWwgY2l0eS4KKyMJVGhlIG90aGVyIHRocmVlIHRpbWUgem9uZXMgYXJlIGNhbGxlZCAiQnJhc8OtbGlhIHRpbWUgIm1pbnVzIG9uZSIgb3IKICMJInBsdXMgb25lIiBvciAicGx1cyB0d28iLiAgQXMgZmFyIGFzIEkga25vdyB0aGVyZSBpcyBubyBzdWNoCiAjCW5hbWUvZGVzaWduYXRpb24gYXMgIkVhc3Rlcm4gVGltZSIgb3IgIkNlbnRyYWwgVGltZSIuCiAjIFNvIEkgaW52ZW50ZWQgdGhlIGZvbGxvd2luZyAoRW5nbGlzaC1sYW5ndWFnZSkgYWJicmV2aWF0aW9ucyBmb3Igbm93LgogIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKICMJCXN0ZAlkc3QKICMJLTI6MDAJRk5UCUZOU1QJRmVybmFuZG8gZGUgTm9yb25oYQotIwktMzowMAlCUlQJQlJTVAlCcmFzaWxpYQorIwktMzowMAlCUlQJQlJTVAlCcmFzw61saWEKICMJLTQ6MDAJQU1UCUFNU1QJQW1hem9uCiAjCS01OjAwCUFDVAlBQ1NUCUFjcmUKIApAQCAtODQsNyArODQsNyBAQAogIyBBcmdlbnRpbmE6IGZpcnN0IFN1bmRheSBpbiBPY3RvYmVyIHRvIGZpcnN0IFN1bmRheSBpbiBBcHJpbCBzaW5jZSAxOTc2LgogIyBEb3VibGUgU3VtbWVyIHRpbWUgZnJvbSAxOTY5IHRvIDE5NzQuICBTd2l0Y2hlcyBhdCBtaWRuaWdodC4KIAotIyBGcm9tIFUuIFMuIE5hdmFsIE9ic2VydmF0b3J5ICgxOTg4LTAxLTE5OSk6CisjIEZyb20gVS4gUy4gTmF2YWwgT2JzZXJ2YXRvcnkgKDE5ODgtMDEtMTkpOgogIyBBUkdFTlRJTkEgICAgICAgICAgIDMgSCBCRUhJTkQgICBVVEMKIAogIyBGcm9tIEhlcm5hbiBHLiBPdGVybyAoMTk5NS0wNi0yNik6CkBAIC0xMTgsNyArMTE4LDcgQEAKICMgRnJvbSBIZXJuYW4gRy4gT3Rlcm8gKDE5OTUtMDYtMjYpOgogIyBUaGVzZSBjb3JyZWN0aW9ucyB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEludGVyU29mdCBBcmdlbnRpbmEgUy5BLiwKICMgb2J0YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlOgotIyBUYWxsZXJlcyBkZSBIaWRyb2dyYWZpYSBOYXZhbCBBcmdlbnRpbmEKKyMgVGFsbGVyZXMgZGUgSGlkcm9ncmFmw61hIE5hdmFsIEFyZ2VudGluYQogIyAoQXJnZW50aW5lIE5hdmFsIEh5ZHJvZ3JhcGh5IEluc3RpdHV0ZSkKIFJ1bGUJQXJnCTE5ODkJMTk5MwktCU1hcglTdW4+PTEJMDowMAkwCS0KIFJ1bGUJQXJnCTE5ODkJMTk5MgktCU9jdAlTdW4+PTE1CTA6MDAJMTowMAlTCkBAIC0xNDAsMTMgKzE0MCwxMyBAQAogUnVsZQlBcmcJMjAwMAlvbmx5CS0JTWFyCTMJMDowMAkwCS0KICMKICMgRnJvbSBQZXRlciBHcmFkZWxza2kgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMC0wMy0wMSk6Ci0jIFdlIGp1c3QgY2hlY2tlZCB3aXRoIG91ciBTYW8gUGF1bG8gb2ZmaWNlIGFuZCB0aGV5IHNheSB0aGUgZ292ZXJubWVudCBvZgorIyBXZSBqdXN0IGNoZWNrZWQgd2l0aCBvdXIgU8OjbyBQYXVsbyBvZmZpY2UgYW5kIHRoZXkgc2F5IHRoZSBnb3Zlcm5tZW50IG9mCiAjIEFyZ2VudGluYSBkZWNpZGVkIG5vdCB0byBiZWNvbWUgb25lIG9mIHRoZSBjb3VudHJpZXMgdGhhdCBnbyBvbiBvciBvZmYgRFNULgogIyBTbyBCdWVub3MgQWlyZXMgc2hvdWxkIGJlIC0zIGhvdXJzIGZyb20gR01UIGF0IGFsbCB0aW1lcy4KICMKLSMgRnJvbSBGYWJpYW4gTC4gQXJjZSBKb2ZyZSAoMjAwMC0wNC0wNCk6CisjIEZyb20gRmFiacOhbiBMLiBBcmNlIEpvZnLDqSAoMjAwMC0wNC0wNCk6CiAjIFRoZSBsYXcgdGhhdCBjbGFpbWVkIERTVCBmb3IgQXJnZW50aW5hIHdhcyBkZXJvZ2F0ZWQgYnkgUHJlc2lkZW50IEZlcm5hbmRvCi0jIGRlIGxhIFJ1YSBvbiBNYXJjaCAyLCAyMDAwLCBiZWNhdXNlIGl0IHdvdWxkIG1ha2UgcGVvcGxlIHNwZW5kIG1vcmUgZW5lcmd5CisjIGRlIGxhIFLDumEgb24gTWFyY2ggMiwgMjAwMCwgYmVjYXVzZSBpdCB3b3VsZCBtYWtlIHBlb3BsZSBzcGVuZCBtb3JlIGVuZXJneQogIyBpbiB0aGUgd2ludGVyIHRpbWUsIHJhdGhlciB0aGFuIGxlc3MuICBUaGUgY2hhbmdlIHRvb2sgZWZmZWN0IG9uIE1hcmNoIDMuCiAjCiAjIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDEtMDYtMDYpOgpAQCAtMTc5LDE1ICsxNzksMTMgQEAKICMgdGhhdCBBcmdlbnRpbmEgd2lsbCB1c2UgRFNUIG5leHQgeWVhciBhcyB3ZWxsLCBmcm9tIE9jdG9iZXIgdG8KICMgTWFyY2gsIGFsdGhvdWdoIGV4YWN0IHJ1bGVzIGFyZSBub3QgZ2l2ZW4uCiAjCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA3LTEyLTI2KQorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDctMTItMjYpCiAjIFRoZSBsYXN0IGh1cmRsZSBvZiBBcmdlbnRpbmEgRFNUIGlzIG92ZXIsIHRoZSBwcm9wb3NhbCB3YXMgYXBwcm92ZWQgaW4KLSMgdGhlIGxvd2VyIGNoYW1iZXIgdG9vIChEZXB1dGFkb3MpIHdpdGggYSB2b3RlIDE5MiBmb3IgYW5kIDIgYWdhaW5zdC4KKyMgdGhlIGxvd2VyIGNoYW1iZXIgdG9vIChEaXB1dGFkb3MpIHdpdGggYSB2b3RlIDE5MiBmb3IgYW5kIDIgYWdhaW5zdC4KICMgQnkgdGhlIHdheSB0aGFua3MgdG8gTWFyaWFubyBBYnNhdHogYW5kIERhbmllbCBNYXJpbyBWZWdhIGZvciB0aGUgbGluayB0bwogIyB0aGUgb3JpZ2luYWwgc2Nhbm5lZCBwcm9wb3NhbCwgd2hlcmUgdGhlIGRhdGVzIGFuZCB0aGUgemVybyBob3VycyBhcmUKICMgY2xlYXIgYW5kIHVuYW1iaWd1b3VzLi4uVGhpcyBpcyB0aGUgYXJ0aWNsZSBhYm91dCBmaW5hbCBhcHByb3ZhbDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvcG9saXRpY2Evbm90YS5hc3A/bm90YV9pZD05NzM5OTYiPgogIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci9wb2xpdGljYS9ub3RhLmFzcD9ub3RhX2lkPTk3Mzk5NgotIyA8L2E+CiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMTItMjIpOgogIyBGb3IgZGF0ZXMgYWZ0ZXIgbWlkLTIwMDgsIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIG15IGd1ZXNzZXMgYW5kCkBAIC0xOTcsMTMgKzE5NSw4IEBACiAjIEFzIHBlciBtZXNzYWdlIGZyb20gQ2FybG9zIEFsYmVydG8gRm9uc2VjYSBBcmF1eiAoTmljYXJhZ3VhKSwKICMgQXJnZW50aW5hIHdpbGwgc3RhcnQgRFNUIG9uIFN1bmRheSBPY3RvYmVyIDE5LCAyMDA4LgogIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2FyZ2VudGluYTAzLmh0bWwiPgogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2FyZ2VudGluYTAzLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmltcHVsc29iYWlyZXMuY29tLmFyL25vdGEucGhwP2lkPTU3ODMyIChpbiBzcGFuaXNoKSI+CiAjIGh0dHA6Ly93d3cuaW1wdWxzb2JhaXJlcy5jb20uYXIvbm90YS5waHA/aWQ9NTc4MzIgKGluIHNwYW5pc2gpCi0jIDwvYT4KIAogIyBGcm9tIFJvZHJpZ28gU2V2ZXJvICgyMDA4LTEwLTA2KToKICMgSGVyZSBpcyBzb21lIGluZm8gYXZhaWxhYmxlIGF0IGEgR2VudG9vIGJ1ZyByZWxhdGVkIHRvIFRaIG9uIEFyZ2VudGluYSdzIERTVDoKQEAgLTIxMiw0OCArMjA1LDM5IEBACiAjIEhpLCB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aW1lem9uZS1kYXRhLTIwMDhlIGFuZCBtYXliZSB3aXRoCiAjIHRpbWV6b25lLWRhdGEtMjAwOGYKICMgQXJnZW50aW5pYW4gbGF3IFtOdW1iZXJdIDI1LjE1NSBpcyBubyBsb25nZXIgdmFsaWQuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb2xlZy5nb3YuYXIvaW5mb2xlZ0ludGVybmV0L2FuZXhvcy82MDAwMC02NDk5OS82MDAzNi9ub3JtYS5odG0iPgogIyBodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvNjAwMDAtNjQ5OTkvNjAwMzYvbm9ybWEuaHRtCi0jIDwvYT4KICMgVGhlIG5ldyBvbmUgaXMgbGF3IFtOdW1iZXJdIDI2LjM1MAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvMTM1MDAwLTEzOTk5OS8xMzYxOTEvbm9ybWEuaHRtIj4KICMgaHR0cDovL3d3dy5pbmZvbGVnLmdvdi5hci9pbmZvbGVnSW50ZXJuZXQvYW5leG9zLzEzNTAwMC0xMzk5OTkvMTM2MTkxL25vcm1hLmh0bQotIyA8L2E+CiAjIFNvIHRoZXJlIGlzIG5vIHN1bW1lciB0aW1lIGluIEFyZ2VudGluYSBmb3Igbm93LgogCiAjIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDgtMTAtMjApOgotIyBEZWNyZWUgMTY5My8yMDA4IGFwcGxpZXMgTGF3IDI2LjM1MCBmb3IgdGhlIHN1bW1lciAyMDA4LzIwMDkgZXN0YWJsaXNoaW5nIERTVCBpbiBBcmdlbnRpbmEKLSMgRnJvbSAyMDA4LTEwLTE5IHVudGlsIDIwMDktMDMtMTUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE2MTAyMDA4JnBpPTMmcGY9NCZzPTAmc2VjPTAxIj4KKyMgRGVjcmVlIDE2OTMvMjAwOCBhcHBsaWVzIExhdyAyNi4zNTAgZm9yIHRoZSBzdW1tZXIgMjAwOC8yMDA5IGVzdGFibGlzaGluZyBEU1QKKyMgaW4gQXJnZW50aW5hIGZyb20gMjAwOC0xMC0xOSB1bnRpbCAyMDA5LTAzLTE1LgogIyBodHRwOi8vd3d3LmJvbGV0aW5vZmljaWFsLmdvdi5hci9Cb3JhLlBvcnRhbC9DdXN0b21Db250cm9scy9QZGZDb250ZW50LmFzcHg/ZnA9MTYxMDIwMDgmcGk9MyZwZj00JnM9MCZzZWM9MDEKLSMgPC9hPgogIwotIyBEZWNyZWUgMTcwNS8yMDA4IGV4Y2VwdGluZyAxMiBQcm92aW5jZXMgZnJvbSBhcHBseWluZyBEU1QgaW4gdGhlIHN1bW1lciAyMDA4LzIwMDk6Ci0jIENhdGFtYXJjYSwgTGEgUmlvamEsIE1lbmRvemEsIFNhbHRhLCBTYW4gSnVhbiwgU2FuIEx1aXMsIExhIFBhbXBhLCBOZXVxdWVuLCBSaW8gTmVncm8sIENodWJ1dCwgU2FudGEgQ3J1egotIyBhbmQgVGllcnJhIGRlbCBGdWVnbwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJvbGV0aW5vZmljaWFsLmdvdi5hci9Cb3JhLlBvcnRhbC9DdXN0b21Db250cm9scy9QZGZDb250ZW50LmFzcHg/ZnA9MTcxMDIwMDgmcGk9MSZwZj0xJnM9MCZzZWM9MDEiPgorCisjIERlY3JlZSAxNzA1LzIwMDggZXhjZXB0aW5nIDEyIFByb3ZpbmNlcyBmcm9tIGFwcGx5aW5nIERTVCBpbiB0aGUgc3VtbWVyCisjIDIwMDgvMjAwOTogQ2F0YW1hcmNhLCBMYSBSaW9qYSwgTWVuZG96YSwgU2FsdGEsIFNhbiBKdWFuLCBTYW4gTHVpcywgTGEKKyMgUGFtcGEsIE5ldXF1w6luLCBSaW8gTmVncm8sIENodWJ1dCwgU2FudGEgQ3J1eiBhbmQgVGllcnJhIGRlbCBGdWVnbwogIyBodHRwOi8vd3d3LmJvbGV0aW5vZmljaWFsLmdvdi5hci9Cb3JhLlBvcnRhbC9DdXN0b21Db250cm9scy9QZGZDb250ZW50LmFzcHg/ZnA9MTcxMDIwMDgmcGk9MSZwZj0xJnM9MCZzZWM9MDEKLSMgPC9hPgogIwotIyBQcmVzcyByZWxlYXNlIDIzNSBkYXRlZCBTYXR1cmRheSBPY3RvYmVyIDE4dGgsIGZyb20gdGhlIEdvdmVybm1lbnQgb2YgdGhlIFByb3ZpbmNlIG9mIEp1anV5IHNheWluZwotIyBpdCB3aWxsIG5vdCBhcHBseSBEU1QgZWl0aGVyIChldmVuIHdoZW4gaXQgd2FzIG5vdCBpbmNsdWRlZCBpbiBEZWNyZWUgMTcwNS8yMDA4KQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmp1anV5Lmdvdi5hci9pbmRleDIvcGFydGVzX3ByZW5zYS8xOF8xMF8wOC8yMzUtMTgxMDA4LmRvYyI+CisjIFByZXNzIHJlbGVhc2UgMjM1IGRhdGVkIFNhdHVyZGF5IE9jdG9iZXIgMTh0aCwgZnJvbSB0aGUgR292ZXJubWVudCBvZiB0aGUKKyMgUHJvdmluY2Ugb2YgSnVqdXkgc2F5aW5nIGl0IHdpbGwgbm90IGFwcGx5IERTVCBlaXRoZXIgKGV2ZW4gd2hlbiBpdCB3YXMgbm90CisjIGluY2x1ZGVkIGluIERlY3JlZSAxNzA1LzIwMDgpLgogIyBodHRwOi8vd3d3Lmp1anV5Lmdvdi5hci9pbmRleDIvcGFydGVzX3ByZW5zYS8xOF8xMF8wOC8yMzUtMTgxMDA4LmRvYwotIyA8L2E+CiAKICMgRnJvbSBmdWxsaW5ldCAoMjAwOS0xMC0xOCk6CiAjIEFzIGFubm91bmNlZCBpbgotIyA8YSBoZWY9Imh0dHA6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9hcmdlbnRpbmEvcG9ydGFsL3BhZ2luYXMuZGh0bWw/cGFnaW5hPTM1NiI+CiAjIGh0dHA6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9hcmdlbnRpbmEvcG9ydGFsL3BhZ2luYXMuZGh0bWw/cGFnaW5hPTM1NgotIyA8L2E+Ci0jIChhbiBvZmZpY2lhbCAuZ29iLmFyKSB1bmRlciB0aXRsZTogIlNpbiBDYW1iaW8gZGUgSG9yYSIgKGVuZ2xpc2g6ICJObyBob3VyIGNoYW5nZSIpCisjIChhbiBvZmZpY2lhbCAuZ29iLmFyKSB1bmRlciB0aXRsZTogIlNpbiBDYW1iaW8gZGUgSG9yYSIKKyMgKEVuZ2xpc2g6ICJObyBob3VyIGNoYW5nZSIpLgogIwotIyAiUG9yIGVsIG1vbWVudG8sIGVsIEdvYmllcm5vIE5hY2lvbmFsIHJlc29sdmlvIG5vIG1vZGlmaWNhciBsYSBob3JhCi0jIG9maWNpYWwsIGRlY2lzaW9uIHF1ZSBlc3RhYmEgZW4gZXN0dWRpbyBwYXJhIHN1IGltcGxlbWVudGFjaW9uIGVsCi0jIGRvbWluZ28gMTggZGUgb2N0dWJyZS4gRGVzZGUgZWwgTWluaXN0ZXJpbyBkZSBQbGFuaWZpY2FjaW9uIHNlIGFudW5jaW8KLSMgcXVlIGxhIEFyZ2VudGluYSBob3ksIGVuIGVzdGFzIGNvbmRpY2lvbmVzIG1ldGVvcm9sb2dpY2FzLCBubyBuZWNlc2l0YQotIyBsYSBtb2RpZmljYWNpb24gZGVsIGh1c28gaG9yYXJpbywgeWEgcXVlIDIwMDkgbm9zIGVuY3VlbnRyYSBjb24KLSMgY3JlY2ltaWVudG8gZW4gbGEgcHJvZHVjY2lvbiB5IGRpc3RyaWJ1Y2lvbiBlbmVyZ2V0aWNhLiIKKyMgIlBvciBlbCBtb21lbnRvLCBlbCBHb2JpZXJubyBOYWNpb25hbCByZXNvbHZpw7Mgbm8gbW9kaWZpY2FyIGxhIGhvcmEKKyMgb2ZpY2lhbCwgZGVjaXNpw7NuIHF1ZSBlc3RhYmEgZW4gZXN0dWRpbyBwYXJhIHN1IGltcGxlbWVudGFjacOzbiBlbAorIyBkb21pbmdvIDE4IGRlIG9jdHVicmUuIERlc2RlIGVsIE1pbmlzdGVyaW8gZGUgUGxhbmlmaWNhY2nDs24gc2UgYW51bmNpw7MKKyMgcXVlIGxhIEFyZ2VudGluYSBob3ksIGVuIGVzdGFzIGNvbmRpY2lvbmVzIG1ldGVvcm9sw7NnaWNhcywgbm8gbmVjZXNpdGEKKyMgbGEgbW9kaWZpY2FjacOzbiBkZWwgaHVzbyBob3JhcmlvLCB5YSBxdWUgMjAwOSBub3MgZW5jdWVudHJhIGNvbgorIyBjcmVjaW1pZW50byBlbiBsYSBwcm9kdWNjacOzbiB5IGRpc3RyaWJ1Y2nDs24gZW5lcmfDqXRpY2EuIgogCiBSdWxlCUFyZwkyMDA3CW9ubHkJLQlEZWMJMzAJMDowMAkxOjAwCVMKIFJ1bGUJQXJnCTIwMDgJMjAwOQktCU1hcglTdW4+PTE1CTA6MDAJMAktCkBAIC0yNjcsMTAgKzI1MSwxMCBAQAogIyBJdCdzIExhdyBOby4gNywyMTAuICBUaGlzIGNoYW5nZSBpcyBkdWUgdG8gYSBwdWJsaWMgcG93ZXIgZW1lcmdlbmN5LCBzbyBmb3IKICMgbm93IHdlJ2xsIGFzc3VtZSBpdCdzIGZvciB0aGlzIHllYXIgb25seS4KICMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3BpY2FzYy5uZXQvaG9ydmVyYS5odG1sIj4KLSMgSG9yYSBkZSB2ZXJhbm8gcGFyYSBsYSBSZXB1YmxpY2EgQXJnZW50aW5hICgyMDAzLTA2LTA4KQotIyA8L2E+IHNheXMgdGhhdCBzdGFuZGFyZCB0aW1lIGluIEFyZ2VudGluYSBmcm9tIDE4OTQtMTAtMzEKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wOC0wOSk6CisjIEhvcmEgZGUgdmVyYW5vIHBhcmEgbGEgUmVww7pibGljYSBBcmdlbnRpbmEKKyMgaHR0cDovL2J1ZW5hc2llbWJyYS5jb20uYXIvZXNvdGVyaXNtby9hc3Ryb2xvZ2lhL2hvcmEtZGUtdmVyYW5vLWRlLWxhLXJlcHVibGljYS1hcmdlbnRpbmEtMjcuaHRtbAorIyBzYXlzIHRoYXQgc3RhbmRhcmQgdGltZSBpbiBBcmdlbnRpbmEgZnJvbSAxODk0LTEwLTMxCiAjIHRvIDE5MjAtMDUtMDEgd2FzIC00OjE2OjQ4LjI1LiAgR28gd2l0aCB0aGlzIG1vcmUtcHJlY2lzZSB2YWx1ZQogIyBvdmVyIFNoYW5rcyAmIFBvdHRlbmdlci4KICMKQEAgLTI4NSwxMCArMjY5LDEwIEBACiAjIHRpbWUgaW4gT2N0b2JlciAxN3RoLgogIwogIyBDYXRhbWFyY2EsIENodWJ1dCwgTGEgUmlvamEsIFNhbiBKdWFuLCBTYW4gTHVpcywgU2FudGEgQ3J1eiwKLSMgVGllcnJhIGRlbCBGdWVnbywgVHVjdW1hbi4KKyMgVGllcnJhIGRlbCBGdWVnbywgVHVjdW3DoW4uCiAjCiAjIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDQtMDYtMTQpOgotIyAuLi4gdGhpcyB3ZWVrZW5kLCB0aGUgUHJvdmluY2Ugb2YgVHVjdW1hbiBkZWNpZGVkIGl0J2QgZ28gYmFjayB0byBVVEMtMDM6MDAKKyMgLi4uIHRoaXMgd2Vla2VuZCwgdGhlIFByb3ZpbmNlIG9mIFR1Y3Vtw6FuIGRlY2lkZWQgaXQnZCBnbyBiYWNrIHRvIFVUQy0wMzowMAogIyB5ZXN0ZXJkYXkgbWlkbmlnaHQgKHRoYXQgaXMsIGF0IDI0OjAwIFNhdHVyZGF5IDEydGgpLCBzaW5jZSB0aGUgcGVvcGxlJ3MKICMgYW5ub3lhbmNlIHdpdGggdGhlIGNoYW5nZSBpcyBtdWNoIGhpZ2hlciB0aGFuIHRoZSBwb3dlciBzYXZpbmdzIG9idGFpbmVkLi4uLgogIwpAQCAtMzIzLDQ5ICszMDcsMzggQEAKICMgSGVyZSBhcmUgYXJ0aWNsZXMgdGhhdCBBcmdlbnRpbmEgUHJvdmluY2UgU2FuIEx1aXMgaXMgcGxhbm5pbmcgdG8gZW5kIERTVAogIyBhcyBlYXJsaWVyIGFzIHVwY29taW5nIE1vbmRheSBKYW51YXJ5IDIxLCAyMDA4IG9yIEZlYnJ1YXJ5IDIwMDg6CiAjCi0jIFByb3ZpbmNpYSBhcmdlbnRpbmEgcmV0cmFzYSByZWxvaiB5IG1hcmNhIGRpZmVyZW5jaWEgY29uIHJlc3RvIGRlbCBwYWlzCisjIFByb3ZpbmNpYSBhcmdlbnRpbmEgcmV0cmFzYSByZWxvaiB5IG1hcmNhIGRpZmVyZW5jaWEgY29uIHJlc3RvIGRlbCBwYcOtcwogIyAoQXJnZW50aW5lIFByb3ZpbmNlIGRlbGF5ZWQgY2xvY2sgYW5kIG1hcmsgZGlmZmVyZW5jZSB3aXRoIHRoZSByZXN0IG9mIHRoZQogIyBjb3VudHJ5KQotIyA8YSBocmVmPSJodHRwOi8vY2wuaW52ZXJ0aWEuY29tL25vdGljaWFzL25vdGljaWEuYXNweD9pZE5vdGljaWE9MjAwODAxMTcxODQ5X0VGRV9FVDQzNzMmaWR0ZWwiPgogIyBodHRwOi8vY2wuaW52ZXJ0aWEuY29tL25vdGljaWFzL25vdGljaWEuYXNweD9pZE5vdGljaWE9MjAwODAxMTcxODQ5X0VGRV9FVDQzNzMmaWR0ZWwKLSMgPC9hPgogIwogIyBFcyBpbm1pbmVudGUgcXVlIGVuIFNhbiBMdWlzIGF0cmFzZW4gdW5hIGhvcmEgbG9zIHJlbG9qZXMKICMgKEl0IGlzIGltbWluZW50IGluIFNhbiBMdWlzIGNsb2NrcyBvbmUgaG91ciBkZWxheSkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYWdhY2V0YS5jb20uYXIvdmVybm90YWUuYXNwP2lkX25vdGE9MjUzNDE0Ij4KLSMgaHR0cDovL3d3dy5sYWdhY2V0YS5jb20uYXIvdmVybm90YWUuYXNwP2lkX25vdGE9MjUzNDE0Ci0jIDwvYT4KLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMi5odG1sIj4KKyMgaHR0cDovL3d3dy5sYWdhY2V0YS5jb20uYXIvbm90YS8yNTM0MTQvRWNvbm9taWEvRXMtaW5taW5lbnRlLXF1ZS1lbi1TYW4tTHVpcy1hdHJhc2VuLXVuYS1ob3JhLWxvcy1yZWxvamVzLmh0bWwKICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMi5odG1sCi0jIDwvYT4KIAotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwOC0wMS0xOCk6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwOC0wMS0xOCk6CiAjIFRoZSBwYWdlIG9mIHRoZSBTYW4gTHVpcyBwcm92aW5jaWFsIGdvdmVybm1lbnQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9ub3Rhcy5hc3A/aWRDYW5hbD0wJmlkPTIyODEyIj4KICMgaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9ub3Rhcy5hc3A/aWRDYW5hbD0wJmlkPTIyODEyCi0jIDwvYT4KICMgY29uZmlybXMgd2hhdCBBbGV4IEtyaXZlbnlzaGV2IGhhcyBlYXJsaWVyIHNlbnQgdG8gdGhlIHR6CiAjIGVtYWlsaW5nIGxpc3QgYWJvdXQgdGhhdCBTYW4gTHVpcyBwbGFucyB0byByZXR1cm4gdG8gc3RhbmRhcmQKICMgdGltZSBtdWNoIGVhcmxpZXIgdGhhbiB0aGUgcmVzdCBvZiB0aGUgY291bnRyeS4gSXQgYWxzbwogIyBjb25maXJtcyB0aGF0IHVwb24gcmVxdWVzdCB0aGUgcHJvdmluY2VzIFNhbiBKdWFuIGFuZCBNZW5kb3phCiAjIHJlZnVzZWQgdG8gZm9sbG93IFNhbiBMdWlzIGluIHRoaXMgY2hhbmdlLgogIwotIyBUaGUgY2hhbmdlIGlzIHN1cHBvc2VkIHRvIHRha2UgcGxhY2UgTW9uZGF5IHRoZSAyMS5zdCBhdCAwOjAwCisjIFRoZSBjaGFuZ2UgaXMgc3VwcG9zZWQgdG8gdGFrZSBwbGFjZSBNb25kYXkgdGhlIDIxc3QgYXQgMDowMAogIyBob3Vycy4gQXMgZmFyIGFzIEkgdW5kZXJzdGFuZCBpdCBpZiB0aGlzIGdvZXMgYWhlYWQsIHdlIG5lZWQKICMgYSBuZXcgdGltZXpvbmUgZm9yIFNhbiBMdWlzIChhbHRob3VnaCB0aGVyZSBhcmUgYWxzbyBkb2N1bWVudGVkCiAjIGluZGVwZW5kZW50IGNoYW5nZXMgaW4gdGhlIHNvdXRoYW1lcmljYSBmaWxlIG9mIFNhbiBMdWlzIGluCiAjIDE5OTAgYW5kIDE5OTEgd2hpY2ggaGFzIG5vdCBiZWVuIGNvbmZpcm1lZCkuCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMjUpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDgtMDEtMjUpOgogIyBVbmZvcnR1bmF0ZWx5IHRoZSBiZWxvdyBwYWdlIGhhcyBiZWNvbWUgZGVmdW5jdCwgYWJvdXQgdGhlIFNhbiBMdWlzCiAjIHRpbWUgY2hhbmdlLiBQZXJoYXBzIGJlY2F1c2UgaXQgbm93IGlzIHBhcnQgb2YgYSBncm91cCBvZiBwYWdlcyAiTW9zdAogIyBpbXBvcnRhbnQgcGFnZXMgb2YgMjAwOC4iCiAjCiAjIFlvdSBjYW4gdXNlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9ODE0MSZpZD0yMjgzNCI+CiAjIGh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIvbm90YXMuYXNwP2lkQ2FuYWw9ODE0MSZpZD0yMjgzNAotIyA8L2E+CiAjIGluc3RlYWQgaXQgc2VlbXMuIE9yIHVzZSAiQnVzY2Fkb3IiIGZyb20gdGhlIG1haW4gcGFnZSBvZiB0aGUgU2FuIEx1aXMKICMgZ292ZXJubWVudCwgYW5kIGZpbGwgaW4gImh1c28iIGFuZCBjbGljayBPSywgYW5kIHlvdSB3aWxsIGdldCAzIHBhZ2VzCiAjIGZyb20gd2hpY2ggdGhlIGZpcnN0IG9uZSBpcyBpZGVudGljYWwgdG8gdGhlIGFib3ZlLgpAQCAtMzg1LDkgKzM1OCw5IEBACiAjIGJhY2sgaW4gMjAwNCwgd2hlbiB0aGVzZSBwcm92aW5jZXMgY2hhbmdlZCB0byBVVEMtNCBmb3IgYSBmZXcgZGF5cywgSQogIyBtYWlsZWQgdGhlbSBwZXJzb25hbGx5IGFuZCBuZXZlciBnb3QgYW4gYW5zd2VyKS4KIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA4LTA2LTMwKToKLSMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGRhdGEgYXJlIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyIHRocm91Z2ggMTk5MiwKLSMgZnJvbSB0aGUgSUFUQSBvdGhlcndpc2UuICBBcyBub3RlZCBiZWxvdywgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDgtMTIpOgorIyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgZGF0YSBlbnRyaWVzIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlciB0aHJvdWdoCisjIDE5OTIsIGZyb20gdGhlIElBVEEgb3RoZXJ3aXNlLiAgQXMgbm90ZWQgYmVsb3csIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdAogIyBBbWVyaWNhL0NvcmRvYmEgc3BsaXQgaW50byA2IHN1YnJlZ2lvbnMgZHVyaW5nIDE5OTEvMTk5Miwgb25lIG9mIHdoaWNoCiAjIHdhcyBBbWVyaWNhL1Nhbl9MdWlzLCBidXQgd2UgaGF2ZW4ndCB2ZXJpZmllZCB0aGlzIHlldCBzbyBmb3Igbm93IHdlJ2xsCiAjIGtlZXAgQW1lcmljYS9Db3Jkb2JhIGEgc2luZ2xlIHJlZ2lvbiByYXRoZXIgdGhhbiBzcGxpdHRpbmcgaXQgaW50byB0aGUKQEAgLTM5OSwxNCArMzcyLDkgQEAKICMgdG8gdXRjLTA0OjAwIHVudGlsIHRoZSBzZWNvbmQgU2F0dXJkYXkgaW4gT2N0b2Jlci4uLgogIwogIyBUaGUgcHJlc3MgcmVsZWFzZSBpcyBhdAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmx1aXMuZ292LmFyL1NML1BhZ2luYXMvTm90aWNpYURldGFsbGUuYXNwP1RlbWFJZD0xJkluZm9QcmVuc2FJZD0zMTAyIj4KICMgaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9TTC9QYWdpbmFzL05vdGljaWFEZXRhbGxlLmFzcD9UZW1hSWQ9MSZJbmZvUHJlbnNhSWQ9MzEwMgotIyA8L2E+Ci0jIChJIGNvdWxkbid0IGZpbmQgdGhlIGRlY3JlZSwgYnV0Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIiPgotIyB3d3cuc2FubHVpcy5nb3YuYXIKLSMgPGEvPgotIyBpcyB0aGUgb2ZmaWNpYWwgcGFnZSBmb3IgdGhlIFByb3ZpbmNlIEdvdmVybm1lbnQpLgorIyAoSSBjb3VsZG4ndCBmaW5kIHRoZSBkZWNyZWUsIGJ1dCB3d3cuc2FubHVpcy5nb3YuYXIKKyMgaXMgdGhlIG9mZmljaWFsIHBhZ2UgZm9yIHRoZSBQcm92aW5jZSBHb3Zlcm5tZW50LikKICMKICMgVGhlcmUncyBhbHNvIGEgbm90ZSBpbiBvbmx5IG9uZSBvZiB0aGUgbWFqb3IgbmF0aW9uYWwgcGFwZXJzIC4uLgogIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci9ub3RhLmFzcD9ub3RhX2lkPTExMDc5MTIKQEAgLTQyMyw5ICszOTEsNyBAQAogIyAuLi50aGUgUHJvdmluY2Ugb2YgU2FuIEx1aXMgaXMgYSBjYXNlIGluIGl0c2VsZi4KICMKICMgVGhlIExhdyBhdAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRpcHV0YWRvc3Nhbmx1aXMuZ292LmFyL2RpcHV0YWRvc2FzcC9wYWdpbmFzL3Zlck5vcm1hLmFzcD9Ob3JtYUlEPTI3Nj4iCiAjIGh0dHA6Ly93d3cuZGlwdXRhZG9zc2FubHVpcy5nb3YuYXIvZGlwdXRhZG9zYXNwL3BhZ2luYXMvdmVyTm9ybWEuYXNwP05vcm1hSUQ9Mjc2Ci0jIDwvYT4KICMgaXMgYW1iaWd1b3VzIGJlY2F1c2UgZXN0YWJsaXNoZXMgYSBjYWxlbmRhciBmcm9tIHRoZSAybmQgU3VuZGF5IGluCiAjIE9jdG9iZXIgYXQgMDowMCB0aHJ1IHRoZSAybmQgU2F0dXJkYXkgaW4gTWFyY2ggYXQgMjQ6MDAgYW5kIHRoZQogIyBjb21wbGVtZW50IG9mIHRoYXQgc3RhcnRpbmcgb24gdGhlIDJuZCBTdW5kYXkgb2YgTWFyY2ggYXQgMDowMCBhbmQKQEAgLTQ1NCwxOSArNDIwLDE1IEBACiAjIC4uLgogCiAjIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTA0LTA5KToKLSMgQWNjb3JkaW5nIHRvIG5ld3MgcmVwb3J0cyBmcm9tIEVsIERpYXJpbyBkZSBsYSBSZXB1YmxpY2EgUHJvdmluY2UgU2FuCisjIEFjY29yZGluZyB0byBuZXdzIHJlcG9ydHMgZnJvbSBFbCBEaWFyaW8gZGUgbGEgUmVww7pibGljYSBQcm92aW5jZSBTYW4KICMgTHVpcywgQXJnZW50aW5hIChzdGFuZGFyZCB0aW1lIFVUQy0wNCkgd2lsbCBrZWVwIERheWxpZ2h0IFNhdmluZyBUaW1lCi0jIGFmdGVyIEFwcmlsIDExLCAyMDEwLS13aWxsIGNvbnRpbnVlIHRvIGhhdmUgc2FtZSB0aW1lIGFzIHJlc3Qgb2YKKyMgYWZ0ZXIgQXByaWwgMTEsIDIwMTAgLSB3aWxsIGNvbnRpbnVlIHRvIGhhdmUgc2FtZSB0aW1lIGFzIHJlc3Qgb2YKICMgQXJnZW50aW5hIChVVEMtMykgKG5vIERTVCkuCiAjCi0jIENvbmZpcm1hcm9uIGxhIHByJm9hY3V0ZTtycm9nYSBkZWwgaHVzbyBob3JhcmlvIGRlIHZlcmFubyAoU3BhbmlzaCkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5lbGRpYXJpb2RlbGFyZXB1YmxpY2EuY29tL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTI5MzgzJkl0ZW1pZD05Ij4KKyMgQ29uZmlybWFyb24gbGEgcHLDs3Jyb2dhIGRlbCBodXNvIGhvcmFyaW8gZGUgdmVyYW5vIChTcGFuaXNoKQogIyBodHRwOi8vd3d3LmVsZGlhcmlvZGVsYXJlcHVibGljYS5jb20vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MjkzODMmSXRlbWlkPTkKLSMgPC9hPgogIyBvciAoc29tZSBFbmdsaXNoIHRyYW5zbGF0aW9uKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwOC5odG1sIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwOC5odG1sCi0jIDwvYT4KIAogIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDEwLTA0LTEyKToKICMgeWVzLi4uSSBjYW4gY29uZmlybSB0aGlzLi4uYW5kIGdpdmVuIHRoYXQgU2FuIEx1aXMga2VlcHMgY2FsbGluZwpAQCAtNDc4LDcgKzQ0MCw3IEBACiAjIFBlcmhhcHMgU2FuIEx1aXMgb3BlcmF0ZXMgb24gdGhlIGxlZ2FsIGZpY3Rpb24gdGhhdCBpdCBpcyBhdCBVVEMtNAogIyB3aXRoIHBlcnBldHVhbCBzdW1tZXIgdGltZSwgYnV0IG9yZGluYXJ5IHVzYWdlIHR5cGljYWxseSBzZWVtcyB0bwogIyBqdXN0IHNheSBpdCdzIGF0IFVUQy0zOyBzZWUsIGZvciBleGFtcGxlLAotIyA8aHR0cDovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9Ib3JhX29maWNpYWxfYXJnZW50aW5hPi4KKyMgaHR0cDovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9Ib3JhX29maWNpYWxfYXJnZW50aW5hCiAjIFdlJ3ZlIGRvY3VtZW50ZWQgc2ltaWxhciBzaXR1YXRpb25zIGFzIGJlaW5nIHBsYWluIGNoYW5nZXMgdG8KICMgc3RhbmRhcmQgdGltZSwgc28gbGV0J3MgZG8gdGhhdCBoZXJlIHRvby4gIFRoaXMgZG9lcyBub3QgY2hhbmdlIFVUQwogIyBvZmZzZXRzLCBvbmx5IHRtX2lzZHN0IGFuZCB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbnMuICBPbmUgbWlub3IKQEAgLTQ4NiwyMCArNDQ4LDIwIEBACiAjIHNldHRpbmcgZm9yIHRpbWUgc3RhbXBzIHBhc3QgMjAzOC4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDEzLTAyLTIxKToKLSMgTWlsbmUgc2F5cyBDb3Jkb2JhIHRpbWUgd2FzIC00OjE2OjQ4LjIuICBSb3VuZCB0byB0aGUgbmVhcmVzdCBzZWNvbmQuCisjIE1pbG5lIHNheXMgQ8OzcmRvYmEgdGltZSB3YXMgLTQ6MTY6NDguMi4gIFJvdW5kIHRvIHRoZSBuZWFyZXN0IHNlY29uZC4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogIwogIyBCdWVub3MgQWlyZXMgKEJBKSwgQ2FwaXRhbCBGZWRlcmFsIChDRiksCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL0J1ZW5vc19BaXJlcyAtMzo1Mzo0OCAtIExNVCAxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkgIyBDb3Jkb2JhIE1lYW4gVGltZQorWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXMgLTM6NTM6NDggLSBMTVQJMTg5NCBPY3QgMzEKKwkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5ICAgICMgQ8OzcmRvYmEgTWVhbiBUaW1lCiAJCQktNDowMAktCUFSVAkxOTMwIERlYwogCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1CiAJCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKIAkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwogCQkJLTM6MDAJQXJnCUFSJXNUCiAjCi0jIENvcmRvYmEgKENCKSwgU2FudGEgRmUgKFNGKSwgRW50cmUgUmlvcyAoRVIpLCBDb3JyaWVudGVzIChDTiksIE1pc2lvbmVzIChNTiksCisjIEPDs3Jkb2JhIChDQiksIFNhbnRhIEZlIChTRiksIEVudHJlIFLDrW9zIChFUiksIENvcnJpZW50ZXMgKENOKSwgTWlzaW9uZXMgKE1OKSwKICMgQ2hhY28gKENDKSwgRm9ybW9zYSAoRk0pLCBTYW50aWFnbyBkZWwgRXN0ZXJvIChTRSkKICMKICMgU2hhbmtzICYgUG90dGVuZ2VyIGFsc28gbWFrZSB0aGUgZm9sbG93aW5nIGNsYWltcywgd2hpY2ggd2UgaGF2ZW4ndCB2ZXJpZmllZDoKQEAgLTUxOSw3ICs0ODEsNyBAQAogCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCiAJCQktMzowMAlBcmcJQVIlc1QKICMKLSMgU2FsdGEgKFNBKSwgTGEgUGFtcGEgKExQKSwgTmV1cXVlbiAoTlEpLCBSaW8gTmVncm8gKFJOKQorIyBTYWx0YSAoU0EpLCBMYSBQYW1wYSAoTFApLCBOZXVxdcOpbiAoTlEpLCBSaW8gTmVncm8gKFJOKQogWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9TYWx0YSAtNDoyMTo0MCAtIExNVAkxODk0IE9jdCAzMQogCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKIAkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCkBAIC01MzEsNyArNDkzLDcgQEAKIAkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAogCQkJLTM6MDAJLQlBUlQKICMKLSMgVHVjdW1hbiAoVE0pCisjIFR1Y3Vtw6FuIChUTSkKIFpvbmUgQW1lcmljYS9BcmdlbnRpbmEvVHVjdW1hbiAtNDoyMDo1MiAtIExNVAkxODk0IE9jdCAzMQogCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKIAkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCkBAIC02NDIsOCArNjA0LDggQEAKIAkJCS0zOjAwCS0JQVJUCiAjCiAjIFNhbnRhIENydXogKFNDKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9SaW9fR2FsbGVnb3MgLTQ6MzY6NTIgLSBMTVQgMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5ICMgQ29yZG9iYSBNZWFuIFRpbWUKK1pvbmUgQW1lcmljYS9BcmdlbnRpbmEvUmlvX0dhbGxlZ29zIC00OjM2OjUyIC0gTE1UCTE4OTQgT2N0IDMxCisJCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heSAgICAjIEPDs3Jkb2JhIE1lYW4gVGltZQogCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKIAkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQogCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCkBAIC02NTMsOSArNjE1LDkgQEAKIAkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAogCQkJLTM6MDAJLQlBUlQKICMKLSMgVGllcnJhIGRlbCBGdWVnbywgQW50YXJ0aWRhIGUgSXNsYXMgZGVsIEF0bGFudGljbyBTdXIgKFRGKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9Vc2h1YWlhIC00OjMzOjEyIC0gTE1UIDE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heSAjIENvcmRvYmEgTWVhbiBUaW1lCisjIFRpZXJyYSBkZWwgRnVlZ28sIEFudMOhcnRpZGEgZSBJc2xhcyBkZWwgQXRsw6FudGljbyBTdXIgKFRGKQorWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9Vc2h1YWlhIC00OjMzOjEyIC0gTE1UCTE4OTQgT2N0IDMxCisJCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heSAgICAjIEPDs3Jkb2JhIE1lYW4gVGltZQogCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKIAkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQogCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCkBAIC02ODYsMTMgKzY0OCwxMyBAQAogCiAjIEZyb20gSUFUQSBTU0lNICgxOTk2LTAyKToKICMgX09ubHlfIHRoZSBmb2xsb3dpbmcgc3RhdGVzIGluIEJSMSBvYnNlcnZlIERTVDogUmlvIEdyYW5kZSBkbyBTdWwgKFJTKSwKLSMgU2FudGEgQ2F0YXJpbmEgKFNDKSwgUGFyYW5hIChQUiksIFNhbyBQYXVsbyAoU1ApLCBSaW8gZGUgSmFuZWlybyAoUkopLAotIyBFc3Bpcml0byBTYW50byAoRVMpLCBNaW5hcyBHZXJhaXMgKE1HKSwgQmFoaWEgKEJBKSwgR29pYXMgKEdPKSwKKyMgU2FudGEgQ2F0YXJpbmEgKFNDKSwgUGFyYW7DoSAoUFIpLCBTw6NvIFBhdWxvIChTUCksIFJpbyBkZSBKYW5laXJvIChSSiksCisjIEVzcMOtcml0byBTYW50byAoRVMpLCBNaW5hcyBHZXJhaXMgKE1HKSwgQmFoaWEgKEJBKSwgR29pw6FzIChHTyksCiAjIERpc3RyaXRvIEZlZGVyYWwgKERGKSwgVG9jYW50aW5zIChUTyksIFNlcmdpcGUgW1NFXSBhbmQgQWxhZ29hcyBbQUxdLgogIyBbVGhlIGxhc3QgdGhyZWUgc3RhdGVzIGFyZSBuZXcgdG8gdGhpcyBpc3N1ZSBvZiB0aGUgSUFUQSBTU0lNLl0KIAogIyBGcm9tIEd3aWxsaW0gTGF3ICgxOTk2LTEwLTA3KToKLSMgR2VvZ3JhcGh5LCBoaXN0b3J5IChUb2NhbnRpbnMgd2FzIHBhcnQgb2YgR29pYXMgdW50aWwgMTk4OSksIGFuZCBvdGhlcgorIyBHZW9ncmFwaHksIGhpc3RvcnkgKFRvY2FudGlucyB3YXMgcGFydCBvZiBHb2nDoXMgdW50aWwgMTk4OSksIGFuZCBvdGhlcgogIyBzb3VyY2VzIG9mIHRpbWUgem9uZSBpbmZvcm1hdGlvbiBsZWFkIG1lIHRvIGJlbGlldmUgdGhhdCBBTCwgU0UsIGFuZCBUTyB3ZXJlCiAjIGFsd2F5cyBpbiBCUjEsIGFuZCBzbyB0aGUgb25seSBjaGFuZ2Ugd2FzIHdoZXRoZXIgb3Igbm90IHRoZXkgb2JzZXJ2ZWQgRFNULi4uLgogIyBUaGUgZWFybGllc3QgaXNzdWUgb2YgdGhlIFNTSU0gSSBoYXZlIGlzIDIvOTEuICBFYWNoIGlzc3VlIGZyb20gdGhlbiB1bnRpbApAQCAtNzA2LDE2ICs2NjgsMTQgQEAKICMgSG93ZXZlciwgc29tZSBjb25jbHVzaW9ucyBjYW4gYmUgZHJhd24gZnJvbSBhbm90aGVyIElBVEEgbWFudWFsOiB0aGUgQWlybGluZQogIyBDb2RpbmcgRGlyZWN0b3J5LCB3aGljaCBsaXN0cyBjbG9zZSB0byA0MDAgYWlycG9ydHMgaW4gQnJhemlsLiAgRm9yIGVhY2gKICMgYWlycG9ydCBpdCBnaXZlcyBhIHRpbWUgem9uZSB3aGljaCBpcyBjb2RlZCB0byB0aGUgU1NJTS4gIEZyb20gdGhhdAotIyBpbmZvcm1hdGlvbiwgSSdtIGxlZCB0byBjb25jbHVkZSB0aGF0IHRoZSBzdGF0ZXMgb2YgQW1hcGEgKEFQKSwgQ2VhcmEgKENFKSwKLSMgTWFyYW5oYW8gKE1BKSwgUGFyYWliYSAoUFIpLCBQZXJuYW1idWNvIChQRSksIFBpYXVpIChQSSksIGFuZCBSaW8gR3JhbmRlIGRvCi0jIE5vcnRlIChSTiksIGFuZCB0aGUgZWFzdGVybiBwYXJ0IG9mIFBhcmEgKFBBKSBhcmUgYWxsIGluIEJSMSB3aXRob3V0IERTVC4KKyMgaW5mb3JtYXRpb24sIEknbSBsZWQgdG8gY29uY2x1ZGUgdGhhdCB0aGUgc3RhdGVzIG9mIEFtYXDDoSAoQVApLCBDZWFyw6EgKENFKSwKKyMgTWFyYW5ow6NvIChNQSksIFBhcmHDrWJhIChQUiksIFBlcm5hbWJ1Y28gKFBFKSwgUGlhdcOtIChQSSksIGFuZCBSaW8gR3JhbmRlIGRvCisjIE5vcnRlIChSTiksIGFuZCB0aGUgZWFzdGVybiBwYXJ0IG9mIFBhcsOhIChQQSkgYXJlIGFsbCBpbiBCUjEgd2l0aG91dCBEU1QuCiAKICMgRnJvbSBNYXJjb3MgVGFkZXUgKDE5OTgtMDktMjcpOgotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici92ZXJhbzEuaHRtbCI+Ci0jIEJyYXppbGlhbiBvZmZpY2lhbCBwYWdlCi0jIDwvYT4KKyMgQnJhemlsaWFuIG9mZmljaWFsIHBhZ2UgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL3ZlcmFvMS5odG1sPgogCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkICgyMDAwLTExLTAzKToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkICgyMDAwLTExLTAzKToKICMgW0ZvciBhbiBvZmZpY2lhbCBsaXN0IG9mIHdoaWNoIHJlZ2lvbnMgaW4gQnJhemlsIHVzZSB3aGljaCB0aW1lIHpvbmVzLCBzZWU6XQogIyBodHRwOi8vcGNkc2gwMS5vbi5ici9GdXNici5odG0KICMgaHR0cDovL3BjZHNoMDEub24uYnIvRnVzYnJodi5odG0KQEAgLTc0OCwxMyArNzA4LDEzIEBACiAKICMgRnJvbSBQYXVsIFNjaHVsemUgKDIwMDgtMDYtMjQpOgogIyAuLi5ieSBsYXcgbnVtYmVyIDExLjY2MiBvZiBBcHJpbCAyNCwgMjAwOCAocHVibGlzaGVkIGluIHRoZSAiRGlhcmlvCi0jIE9maWNpYWwgZGEgVW5pYW8iLi4uKSBpbiBCcmF6aWwgdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIHRpbWV6b25lcywKKyMgT2ZpY2lhbCBkYSBVbmnDo28iLi4uKSBpbiBCcmF6aWwgdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIHRpbWV6b25lcywKICMgZWZmZWN0aXZlIHRvZGF5ICgwMDowMGFtIGF0IEp1bmUgMjQsIDIwMDgpIGFzIGZvbGxvd3M6CiAjCi0jIGEpIFRoZSB0aW1lem9uZSBVVEMrNSBpcyBlW3hddGluZ3Vpc2hlZCwgd2l0aCBhbGwgdGhlIEFjcmUgc3RhdGUgYW5kIHRoZQorIyBhKSBUaGUgdGltZXpvbmUgVVRDKzUgaXMgZXh0aW5ndWlzaGVkLCB3aXRoIGFsbCB0aGUgQWNyZSBzdGF0ZSBhbmQgdGhlCiAjIHBhcnQgb2YgdGhlIEFtYXpvbmFzIHN0YXRlIHRoYXQgaGFkIHRoaXMgdGltZXpvbmUgbm93IGJlaW5nIHB1dCB0byB0aGUKICMgdGltZXpvbmUgVVRDKzQKLSMgYikgVGhlIHdob2xlIFBhcmEgc3RhdGUgbm93IGlzIHB1dCBhdCB0aW1lem9uZSBVVEMrMywgaW5zdGVhZCBvZiBqdXN0CisjIGIpIFRoZSB3aG9sZSBQYXLDoSBzdGF0ZSBub3cgaXMgcHV0IGF0IHRpbWV6b25lIFVUQyszLCBpbnN0ZWFkIG9mIGp1c3QKICMgcGFydCBvZiBpdCwgYXMgd2FzIGJlZm9yZS4KICMKICMgVGhpcyBjaGFuZ2UgZm9sbG93cyBhIHByb3Bvc2FsIG9mIHNlbmF0b3IgVGlhbyBWaWFuYSBvZiBBY3JlIHN0YXRlLCB0aGF0CkBAIC03NjcsMTMgKzcyNywxMSBAQAogCiAjIEZyb20gUm9kcmlnbyBTZXZlcm8gKDIwMDgtMDYtMjQpOgogIyBKdXN0IGNvcnJlY3RpbmcgdGhlIFVSTDoKLSMgPGEgaHJlZj0iaHR0cHM6Ly93d3cuaW4uZ292LmJyL2ltcHJlbnNhL3Zpc3VhbGl6YS9pbmRleC5qc3A/am9ybmFsPWRvJnNlY2FvPTEmcGFnaW5hPTEmZGF0YT0yNS8wNC8yMDA4Ij4KICMgaHR0cHM6Ly93d3cuaW4uZ292LmJyL2ltcHJlbnNhL3Zpc3VhbGl6YS9pbmRleC5qc3A/am9ybmFsPWRvJnNlY2FvPTEmcGFnaW5hPTEmZGF0YT0yNS8wNC8yMDA4Ci0jIDwvYT4KICMKICMgQXMgYSByZXN1bHQgb2YgdGhlIGFib3ZlIERlY3JlZSBJIGJlbGlldmUgdGhlIEFtZXJpY2EvUmlvX0JyYW5jbwogIyB0aW1lem9uZSBzaGFsbCBiZSBtb2RpZmllZCBmcm9tIFVUQy01IHRvIFVUQy00IGFuZCBhIG5ldyB0aW1lem9uZSBzaGFsbAotIyBiZSBjcmVhdGVkIHRvIHJlcHJlc2VudCB0aGUuLi53ZXN0IHNpZGUgb2YgdGhlIFBhcmEgU3RhdGUuIEkKKyMgYmUgY3JlYXRlZCB0byByZXByZXNlbnQgdGhlLi4ud2VzdCBzaWRlIG9mIHRoZSBQYXLDoSBTdGF0ZS4gSQogIyBzdWdnZXN0IHRoaXMgbmV3IHRpbWV6b25lIGJlIGNhbGxlZCBTYW50YXJlbSBhcyB0aGUgbW9zdAogIyBpbXBvcnRhbnQvcG9wdWxhdGVkIGNpdHkgaW4gdGhlIGFmZmVjdGVkIGFyZWEuCiAjCkBAIC03ODIsMTkgKzc0MCwxNiBAQAogCiAjIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNi0yNCk6CiAjIFRoaXMgaXMgYSBxdWljayByZWZlcmVuY2UgcGFnZSBmb3IgTmV3IGFuZCBPbGQgQnJhemlsIFRpbWUgWm9uZXMgbWFwLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2JyYXppbC10aW1lLW5ldy1vbGQucGhwIj4KICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9icmF6aWwtdGltZS1uZXctb2xkLnBocAotIyA8L2E+CiAjCi0jIC0gNCB0aW1lIHpvbmVzIHJlcGxhY2VkIGJ5IDMgdGltZSB6b25lcy1lbGltaW5hdGluZyB0aW1lIHpvbmUgVVRDLSAwNQotIyAoc3RhdGUgQWNyZSBhbmQgdGhlIHBhcnQgb2YgdGhlIEFtYXpvbmFzIHdpbGwgYmUgVVRDL0dNVC0gMDQpIC0gd2VzdGVybgotIyBwYXJ0IG9mIFBhciBzdGF0ZSBpcyBtb3ZpbmcgdG8gb25lIHRpbWV6b25lIFVUQy0gMDMgKGZyb20gVVRDIC0wNCkuCisjIC0gNCB0aW1lIHpvbmVzIHJlcGxhY2VkIGJ5IDMgdGltZSB6b25lcyAtIGVsaW1pbmF0aW5nIHRpbWUgem9uZSBVVEMtMDUKKyMgKHN0YXRlIEFjcmUgYW5kIHRoZSBwYXJ0IG9mIHRoZSBBbWF6b25hcyB3aWxsIGJlIFVUQy9HTVQtMDQpIC0gd2VzdGVybgorIyBwYXJ0IG9mIFBhciBzdGF0ZSBpcyBtb3ZpbmcgdG8gb25lIHRpbWV6b25lIFVUQy0wMyAoZnJvbSBVVEMtMDQpLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMTAtMTApOgogIyBUaGUgb2ZmaWNpYWwgZGVjcmVlcyByZWZlcmVuY2VkIGJlbG93IGFyZSBtb3N0bHkgdGFrZW4gZnJvbQotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVi5odG1sIj4KLSMgRGVjcmV0b3Mgc29icmUgbyBIb3JhcmlvIGRlIFZlcmFvIG5vIEJyYXNpbAotIyA8L2E+LgorIyBEZWNyZXRvcyBzb2JyZSBvIEhvcsOhcmlvIGRlIFZlcsOjbyBubyBCcmFzaWwuCisjIGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWLmh0bWwKIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wOC0yOSk6CiAjIEFzIGFubm91bmNlZCBieSB0aGUgZ292ZXJubWVudCBhbmQgbWFueSBuZXdzcGFwZXJzIGluIEJyYXppbCBsYXRlCkBAIC04MDYsMjUgKzc2MSwxNyBAQAogIyBJdCBoYXMgbm90IHlldCBiZWVuIHBvc3RlZCB0byBodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVi5odG1sCiAjCiAjIEFuIG9mZmljaWFsIHBhZ2UgYWJvdXQgaXQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvP25ld3NJZD0xNjcyMiI+CiAjIGh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvP25ld3NJZD0xNjcyMgotIyA8L2E+CiAjIE5vdGUgdGhhdCB0aGlzIGxpbmsgZG9lcyBub3QgYWx3YXlzIHdvcmsgZGlyZWN0bHksIGJ1dCBtdXN0IGJlIGFjY2Vzc2VkCiAjIGJ5IGdvaW5nIHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1lLmdvdi5ici9maXJzdCI+CiAjIGh0dHA6Ly93d3cubW1lLmdvdi5ici9maXJzdAotIyA8L2E+CiAjCiAjIE9uZSBleGFtcGxlIGxpbmsgdGhhdCB3b3JrcyBkaXJlY3RseToKLSMgPGEgaHJlZj0iaHR0cDovL2pvcm5hbGUuY29tLmJyL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTEzNTMwJkl0ZW1pZD01NCI+CiAjIGh0dHA6Ly9qb3JuYWxlLmNvbS5ici9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0xMzUzMCZJdGVtaWQ9NTQKICMgKFBvcnR1Z3Vlc2UpCi0jIDwvYT4KICMKICMgV2UgaGF2ZSBhIHdyaXR0ZW4gYSBzaG9ydCBhcnRpY2xlIGFib3V0IGl0IGFzIHdlbGw6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9icmF6aWwtZHN0LTIwMDgtMjAwOS5odG1sIj4KICMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2JyYXppbC1kc3QtMjAwOC0yMDA5Lmh0bWwKLSMgPC9hPgogIwogIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMS0xMC0wNCk6CiAjIFN0YXRlIEJhaGlhIHdpbGwgcmV0dXJuIHRvIERheWxpZ2h0IHNhdmluZ3MgdGltZSB0aGlzIHllYXIgYWZ0ZXIgOCB5ZWFycyBvZmYuCkBAIC04MzIsMTcgKzc3OSwxMiBAQAogIyB0ZWxldmlzaW9uIHN0YXRpb24gaW4gU2FsdmFkb3IuCiAKICMgSW4gUG9ydHVndWVzZToKLSMgPGEgaHJlZj0iaHR0cDovL2cxLmdsb2JvLmNvbS9iYWhpYS9ub3RpY2lhLzIwMTEvMTAvZ292ZXJuYWRvci1qYXF1ZXMtd2FnbmVyLWNvbmZpcm1hLWhvcmFyaW8tZGUtdmVyYW8tbmEtYmFoaWEuaHRtbCI+CiAjIGh0dHA6Ly9nMS5nbG9iby5jb20vYmFoaWEvbm90aWNpYS8yMDExLzEwL2dvdmVybmFkb3ItamFxdWVzLXdhZ25lci1jb25maXJtYS1ob3JhcmlvLWRlLXZlcmFvLW5hLWJhaGlhLmh0bWwKLSMgPC9hPiBhbmQKLSMgPGEgaHJlZj0iaHR0cDovL25vdGljaWFzLnRlcnJhLmNvbS5ici9icmFzaWwvbm90aWNpYXMvMCwsT0k1MzkwODg3LUVJODEzOSwwMC1CYWhpYSt2b2x0YSthK3Rlcitob3JhcmlvK2RlK3ZlcmFvK2Fwb3Mrb2l0bythbm9zLmh0bWwiPgogIyBodHRwOi8vbm90aWNpYXMudGVycmEuY29tLmJyL2JyYXNpbC9ub3RpY2lhcy8wLCxPSTUzOTA4ODctRUk4MTM5LDAwLUJhaGlhK3ZvbHRhK2ErdGVyK2hvcmFyaW8rZGUrdmVyYW8rYXBvcytvaXRvK2Fub3MuaHRtbAotIyA8L2E+CiAKICMgRnJvbSBHdWlsaGVybWUgQmVybmFyZGVzIFJvZHJpZ3VlcyAoMjAxMS0xMC0wNyk6CiAjIFRoZXJlIGlzIG5ld3MgaW4gdGhlIG1lZGlhLCBob3dldmVyIHRoZXJlIGlzIHN0aWxsIG5vIGRlY3JlZSBhYm91dCBpdC4KLSMgSSBqdXN0IHNlbmQgYSBlLW1haWwgdG8gWnVsbWlyYSBCcmFuZGFvIGF0Ci0jIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyLyI+aHR0cDovL3BjZHNoMDEub24uYnIvPC9hPiB0aGUKKyMgSSBqdXN0IHNlbmQgYSBlLW1haWwgdG8gWnVsbWlyYSBCcmFuZGFvIGF0IGh0dHA6Ly9wY2RzaDAxLm9uLmJyLyB0aGUKICMgb2ZmaWNpYWwgYWdlbmN5IGFib3V0IHRpbWUgaW4gQnJhemlsLCBhbmQgc2hlIGNvbmZpcm1lZCB0aGF0IHRoZSBvbGQgcnVsZSBpcwogIyBzdGlsbCBpbiBmb3JjZS4KIApAQCAtODU0LDkgKzc5Niw3IEBACiAjCiAjIERFQ1JFVE8gTm8tIDcuNTg0LCBERSAxMyBERSBPVVRVQlJPIERFIDIwMTEKICMgTGluayA6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW4uZ292LmJyL3Zpc3VhbGl6YS9pbmRleC5qc3A/ZGF0YT0xMy8xMC8yMDExJmpvcm5hbD0xMDAwJnBhZ2luYT02JnRvdGFsQXJxdWl2b3M9NiI+CiAjIGh0dHA6Ly93d3cuaW4uZ292LmJyL3Zpc3VhbGl6YS9pbmRleC5qc3A/ZGF0YT0xMy8xMC8yMDExJmpvcm5hbD0xMDAwJnBhZ2luYT02JnRvdGFsQXJxdWl2b3M9NgotIyA8L2E+CiAKICMgRnJvbSBLZWxsZXkgQ29vayAoMjAxMi0xMC0xNik6CiAjIFRoZSBnb3Zlcm5vciBvZiBzdGF0ZSBvZiBCYWhpYSBpbiBCcmF6aWwgYW5ub3VuY2VkIG9uIFRodXJzZGF5IHRoYXQKQEAgLTg4NCw0MiArODI0LDQyIEBACiAjIEZvciBub3csIGFzc3VtZSB3ZXN0ZXJuIEFtYXpvbmFzIHdpbGwgY2hhbmdlIGFzIHdlbGwuCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIwNDY2Lmh0bSI+MjAsNDY2PC9hPiAoMTkzMS0xMC0wMSkKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjE4OTYuaHRtIj4yMSw4OTY8L2E+ICgxOTMyLTAxLTEwKQorIyBEZWNyZWUgMjAsNDY2IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIwNDY2Lmh0bT4gKDE5MzEtMTAtMDEpCisjIERlY3JlZSAyMSw4OTYgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjE4OTYuaHRtPiAoMTkzMi0wMS0xMCkKIFJ1bGUJQnJhemlsCTE5MzEJb25seQktCU9jdAkgMwkxMTowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5MzIJMTkzMwktCUFwcgkgMQkgMDowMAkwCS0KIFJ1bGUJQnJhemlsCTE5MzIJb25seQktCU9jdAkgMwkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjMxOTUuaHRtIj4yMywxOTU8L2E+ICgxOTMzLTEwLTEwKQorIyBEZWNyZWUgMjMsMTk1IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIzMTk1Lmh0bT4gKDE5MzMtMTAtMTApCiAjIHJldm9rZWQgRFNULgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyNzQ5Ni5odG0iPjI3LDQ5NjwvYT4gKDE5NDktMTEtMjQpCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjI3OTk4Lmh0bSI+MjcsOTk4PC9hPiAoMTk1MC0wNC0xMykKKyMgRGVjcmVlIDI3LDQ5NiA8aHR0cDovL3BjZHNoMDEub24uYnIvSFYyNzQ5Ni5odG0+ICgxOTQ5LTExLTI0KQorIyBEZWNyZWUgMjcsOTk4IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjI3OTk4Lmh0bT4gKDE5NTAtMDQtMTMpCiBSdWxlCUJyYXppbAkxOTQ5CTE5NTIJLQlEZWMJIDEJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTUwCW9ubHkJLQlBcHIJMTYJIDE6MDAJMAktCiBSdWxlCUJyYXppbAkxOTUxCTE5NTIJLQlBcHIJIDEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjMyMzA4Lmh0bSI+MzIsMzA4PC9hPiAoMTk1My0wMi0yNCkKKyMgRGVjcmVlIDMyLDMwOCA8aHR0cDovL3BjZHNoMDEub24uYnIvSFYzMjMwOC5odG0+ICgxOTUzLTAyLTI0KQogUnVsZQlCcmF6aWwJMTk1Mwlvbmx5CS0JTWFyCSAxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYzNDcyNC5odG0iPjM0LDcyNDwvYT4gKDE5NTMtMTEtMzApCisjIERlY3JlZSAzNCw3MjQgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMzQ3MjQuaHRtPiAoMTk1My0xMS0zMCkKICMgcmV2b2tlZCBEU1QuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjUyNzAwLmh0bSI+NTIsNzAwPC9hPiAoMTk2My0xMC0xOCkKKyMgRGVjcmVlIDUyLDcwMCA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY1MjcwMC5odG0+ICgxOTYzLTEwLTE4KQogIyBlc3RhYmxpc2hlZCBEU1QgZnJvbSAxOTYzLTEwLTIzIDAwOjAwIHRvIDE5NjQtMDItMjkgMDA6MDAKICMgaW4gU1AsIFJKLCBHQiwgTUcsIEVTLCBkdWUgdG8gdGhlIHByb2xvbmdhdGlvbiBvZiB0aGUgZHJvdWdodC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTMwNzEuaHRtIj41MywwNzE8L2E+ICgxOTYzLTEyLTAzKQorIyBEZWNyZWUgNTMsMDcxIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjUzMDcxLmh0bT4gKDE5NjMtMTItMDMpCiAjIGV4dGVuZGVkIHRoZSBhYm92ZSBkZWNyZWUgdG8gYWxsIG9mIHRoZSBuYXRpb25hbCB0ZXJyaXRvcnkgb24gMTItMDkuCiBSdWxlCUJyYXppbAkxOTYzCW9ubHkJLQlEZWMJIDkJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjUzNjA0Lmh0bSI+NTMsNjA0PC9hPiAoMTk2NC0wMi0yNSkKKyMgRGVjcmVlIDUzLDYwNCA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY1MzYwNC5odG0+ICgxOTY0LTAyLTI1KQogIyBleHRlbmRlZCBzdW1tZXIgdGltZSBieSBvbmUgZGF5IHRvIDE5NjQtMDMtMDEgMDA6MDAgKHN0YXJ0IG9mIHNjaG9vbCkuCiBSdWxlCUJyYXppbAkxOTY0CW9ubHkJLQlNYXIJIDEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjU1NjM5Lmh0bSI+NTUsNjM5PC9hPiAoMTk2NS0wMS0yNykKKyMgRGVjcmVlIDU1LDYzOSA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY1NTYzOS5odG0+ICgxOTY1LTAxLTI3KQogUnVsZQlCcmF6aWwJMTk2NQlvbmx5CS0JSmFuCTMxCSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk2NQlvbmx5CS0JTWFyCTMxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1NzMwMy5odG0iPjU3LDMwMzwvYT4gKDE5NjUtMTEtMjIpCisjIERlY3JlZSA1NywzMDMgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTczMDMuaHRtPiAoMTk2NS0xMS0yMikKIFJ1bGUJQnJhemlsCTE5NjUJb25seQktCURlYwkgMQkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTc4NDMuaHRtIj41Nyw4NDM8L2E+ICgxOTY2LTAyLTE4KQorIyBEZWNyZWUgNTcsODQzIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjU3ODQzLmh0bT4gKDE5NjYtMDItMTgpCiBSdWxlCUJyYXppbAkxOTY2CTE5NjgJLQlNYXIJIDEJIDA6MDAJMAktCiBSdWxlCUJyYXppbAkxOTY2CTE5NjcJLQlOb3YJIDEJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjYzNDI5Lmh0bSI+NjMsNDI5PC9hPiAoMTk2OC0xMC0xNSkKKyMgRGVjcmVlIDYzLDQyOSA8aHR0cDovL3BjZHNoMDEub24uYnIvSFY2MzQyOS5odG0+ICgxOTY4LTEwLTE1KQogIyByZXZva2VkIERTVC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTE2OTguaHRtIj45MSw2OTg8L2E+ICgxOTg1LTA5LTI3KQorIyBEZWNyZWUgOTEsNjk4IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjkxNjk4Lmh0bT4gKDE5ODUtMDktMjcpCiBSdWxlCUJyYXppbAkxOTg1CW9ubHkJLQlOb3YJIDIJIDA6MDAJMTowMAlTCiAjIERlY3JlZSA5MiwzMTAgKDE5ODYtMDEtMjEpCiAjIERlY3JlZSA5Miw0NjMgKDE5ODYtMDMtMTMpCkBAIC05MjcsNDIgKzg2Nyw0MiBAQAogIyBEZWNyZWUgOTMsMzE2ICgxOTg2LTEwLTAxKQogUnVsZQlCcmF6aWwJMTk4Nglvbmx5CS0JT2N0CTI1CSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk4Nwlvbmx5CS0JRmViCTE0CSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5NDkyMi5odG0iPjk0LDkyMjwvYT4gKDE5ODctMDktMjIpCisjIERlY3JlZSA5NCw5MjIgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTQ5MjIuaHRtPiAoMTk4Ny0wOS0yMikKIFJ1bGUJQnJhemlsCTE5ODcJb25seQktCU9jdAkyNQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5ODgJb25seQktCUZlYgkgNwkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTY2NzYuaHRtIj45Niw2NzY8L2E+ICgxOTg4LTA5LTEyKQorIyBEZWNyZWUgOTYsNjc2IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk2Njc2Lmh0bT4gKDE5ODgtMDktMTIpCiAjIGV4Y2VwdCBmb3IgdGhlIHN0YXRlcyBvZiBBQywgQU0sIFBBLCBSUiwgUk8sIGFuZCBBUCAodGhlbiBhIHRlcnJpdG9yeSkKIFJ1bGUJQnJhemlsCTE5ODgJb25seQktCU9jdAkxNgkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5ODkJb25seQktCUphbgkyOQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTgwNzcuaHRtIj45OCwwNzc8L2E+ICgxOTg5LTA4LTIxKQorIyBEZWNyZWUgOTgsMDc3IDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk4MDc3Lmh0bT4gKDE5ODktMDgtMjEpCiAjIHdpdGggdGhlIHNhbWUgZXhjZXB0aW9ucwogUnVsZQlCcmF6aWwJMTk4OQlvbmx5CS0JT2N0CTE1CSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk5MAlvbmx5CS0JRmViCTExCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5OTUzMC5odG0iPjk5LDUzMDwvYT4gKDE5OTAtMDktMTcpCisjIERlY3JlZSA5OSw1MzAgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTk1MzAuaHRtPiAoMTk5MC0wOS0xNykKICMgYWRvcHRlZCBieSBSUywgU0MsIFBSLCBTUCwgUkosIEVTLCBNRywgR08sIE1TLCBERi4KICMgRGVjcmVlIDk5LDYyOSAoMTk5MC0xMC0xOSkgYWRkcyBCQSwgTVQuCiBSdWxlCUJyYXppbAkxOTkwCW9ubHkJLQlPY3QJMjEJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTkxCW9ubHkJLQlGZWIJMTcJIDA6MDAJMAktCi0jIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTk5MS5odG0iPlVubnVtYmVyZWQgZGVjcmVlPC9hPiAoMTk5MS0wOS0yNSkKKyMgVW5udW1iZXJlZCBkZWNyZWUgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTk5MS5odG0+ICgxOTkxLTA5LTI1KQogIyBhZG9wdGVkIGJ5IFJTLCBTQywgUFIsIFNQLCBSSiwgRVMsIE1HLCBCQSwgR08sIE1ULCBNUywgREYuCiBSdWxlCUJyYXppbAkxOTkxCW9ubHkJLQlPY3QJMjAJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkxOTkyCW9ubHkJLQlGZWIJIDkJIDA6MDAJMAktCi0jIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTk5Mi5odG0iPlVubnVtYmVyZWQgZGVjcmVlPC9hPiAoMTk5Mi0xMC0xNikKKyMgVW5udW1iZXJlZCBkZWNyZWUgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTk5Mi5odG0+ICgxOTkyLTEwLTE2KQogIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLgogUnVsZQlCcmF6aWwJMTk5Mglvbmx5CS0JT2N0CTI1CSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk5Mwlvbmx5CS0JSmFuCTMxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5NDIuaHRtIj45NDI8L2E+ICgxOTkzLTA5LTI4KQorIyBEZWNyZWUgOTQyIDxodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk0Mi5odG0+ICgxOTkzLTA5LTI4KQogIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLCBwbHVzIEFNLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxMjUyLmh0bSI+MSwyNTI8L2E+ICgxOTk0LTA5LTIyOworIyBEZWNyZWUgMSwyNTIgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTI1Mi5odG0+ICgxOTk0LTA5LTIyOwogIyB3ZWIgcGFnZSBjb3JyZWN0ZWQgMjAwNC0wMS0wNykgYWRvcHRlZCBieSBzYW1lIHN0YXRlcywgbWludXMgQU0uCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE2MzYuaHRtIj4xLDYzNjwvYT4gKDE5OTUtMDktMTQpCisjIERlY3JlZSAxLDYzNiA8aHR0cDovL3BjZHNoMDEub24uYnIvSFYxNjM2Lmh0bT4gKDE5OTUtMDktMTQpCiAjIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIHBsdXMgTVQgYW5kIFRPLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxNjc0Lmh0bSI+MSw2NzQ8L2E+ICgxOTk1LTEwLTEzKQorIyBEZWNyZWUgMSw2NzQgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMTY3NC5odG0+ICgxOTk1LTEwLTEzKQogIyBhZGRzIEFMLCBTRS4KIFJ1bGUJQnJhemlsCTE5OTMJMTk5NQktCU9jdAlTdW4+PTExCSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMTk5NAkxOTk1CS0JRmViCVN1bj49MTUJIDA6MDAJMAktCiBSdWxlCUJyYXppbAkxOTk2CW9ubHkJLQlGZWIJMTEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIwMDAuaHRtIj4yLDAwMDwvYT4gKDE5OTYtMDktMDQpCisjIERlY3JlZSAyLDAwMCA8aHR0cDovL3BjZHNoMDEub24uYnIvSFYyMDAwLmh0bT4gKDE5OTYtMDktMDQpCiAjIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIG1pbnVzIEFMLCBTRS4KIFJ1bGUJQnJhemlsCTE5OTYJb25seQktCU9jdAkgNgkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5OTcJb25seQktCUZlYgkxNgkgMDowMAkwCS0KQEAgLTk3NSw1MyArOTE1LDUxIEBACiAjCiAjIERlY3JlZSAyLDMxNyAoMTk5Ny0wOS0wNCksIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMuCiBSdWxlCUJyYXppbAkxOTk3CW9ubHkJLQlPY3QJIDYJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMjQ5NS5KUEciPjIsNDk1PC9hPgorIyBEZWNyZWUgMiw0OTUgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSFYyNDk1LkpQRz4KICMgKDE5OTgtMDItMTApCiBSdWxlCUJyYXppbAkxOTk4CW9ubHkJLQlNYXIJIDEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0h2OTguanBnIj4yLDc4MDwvYT4gKDE5OTgtMDktMTEpCisjIERlY3JlZSAyLDc4MCA8aHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9Idjk4LmpwZz4gKDE5OTgtMDktMTEpCiAjIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KIFJ1bGUJQnJhemlsCTE5OTgJb25seQktCU9jdAkxMQkgMDowMAkxOjAwCVMKIFJ1bGUJQnJhemlsCTE5OTkJb25seQktCUZlYgkyMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSFYzMTUwLmdpZiI+MywxNTA8L2E+CisjIERlY3JlZSAzLDE1MCA8aHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjMxNTAuZ2lmPgogIyAoMTk5OS0wOC0yMykgYWRvcHRlZCBieSBzYW1lIHN0YXRlcy4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWOTkuZ2lmIj4zLDE4ODwvYT4gKDE5OTktMDktMzApCisjIERlY3JlZSAzLDE4OCA8aHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY5OS5naWY+ICgxOTk5LTA5LTMwKQogIyBhZGRzIFNFLCBBTCwgUEIsIFBFLCBSTiwgQ0UsIFBJLCBNQSBhbmQgUlIuCiBSdWxlCUJyYXppbAkxOTk5CW9ubHkJLQlPY3QJIDMJIDA6MDAJMTowMAlTCiBSdWxlCUJyYXppbAkyMDAwCW9ubHkJLQlGZWIJMjcJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9ERUMzNTkyLmh0bSI+Myw1OTI8L2E+ICgyMDAwLTA5LTA2KQorIyBEZWNyZWUgMyw1OTIgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RFQzM1OTIuaHRtPiAoMjAwMC0wOS0wNikKICMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjMzYzMC5qcGciPjMsNjMwPC9hPiAoMjAwMC0xMC0xMykKKyMgRGVjcmVlIDMsNjMwIDxodHRwOi8vcGNkc2gwMS5vbi5ici9EZWMzNjMwLmpwZz4gKDIwMDAtMTAtMTMpCiAjIHJlcGVhbHMgRFNUIGluIFBFIGFuZCBSUiwgZWZmZWN0aXZlIDIwMDAtMTAtMTUgMDA6MDAuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWMzNjMyLmpwZyI+Myw2MzI8L2E+ICgyMDAwLTEwLTE3KQorIyBEZWNyZWUgMyw2MzIgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlYzM2MzIuanBnPiAoMjAwMC0xMC0xNykKICMgcmVwZWFscyBEU1QgaW4gU0UsIEFMLCBQQiwgUk4sIENFLCBQSSBhbmQgTUEsIGVmZmVjdGl2ZSAyMDAwLTEwLTIyIDAwOjAwLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjM5MTYuZ2lmIj4zLDkxNjwvYT4KKyMgRGVjcmVlIDMsOTE2IDxodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMzkxNi5naWY+CiAjICgyMDAxLTA5LTEzKSByZWVzdGFibGlzaGVzIERTVCBpbiBBTCwgQ0UsIE1BLCBQQiwgUEUsIFBJLCBSTiwgU0UuCiBSdWxlCUJyYXppbAkyMDAwCTIwMDEJLQlPY3QJU3VuPj04CSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMjAwMQkyMDA2CS0JRmViCVN1bj49MTUJIDA6MDAJMAktCiAjIERlY3JlZSA0LDM5OSAoMjAwMi0xMC0wMSkgcmVwZWFscyBEU1QgaW4gQUwsIENFLCBNQSwgUEIsIFBFLCBQSSwgUk4sIFNFLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5ici9DQ0lWSUwvZGVjcmV0by8yMDAyL0Q0Mzk5Lmh0bSI+NCwzOTk8L2E+CisjIDQsMzk5IDxodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5ici9DQ0lWSUwvZGVjcmV0by8yMDAyL0Q0Mzk5Lmh0bT4KIFJ1bGUJQnJhemlsCTIwMDIJb25seQktCU5vdgkgMwkgMDowMAkxOjAwCVMKICMgRGVjcmVlIDQsODQ0ICgyMDAzLTA5LTI0OyBjb3JyZWN0ZWQgMjAwMy0wOS0yNikgcmVwZWFscyBEU1QgaW4gQkEsIE1ULCBUTy4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YuYnIvQ0NJVklML2RlY3JldG8vMjAwMy9ENDg0NC5odG0iPjQsODQ0PC9hPgorIyA0LDg0NCA8aHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YuYnIvQ0NJVklML2RlY3JldG8vMjAwMy9ENDg0NC5odG0+CiBSdWxlCUJyYXppbAkyMDAzCW9ubHkJLQlPY3QJMTkJIDA6MDAJMTowMAlTCiAjIERlY3JlZSA1LDIyMyAoMjAwNC0xMC0wMSkgcmVlc3RhYmxpc2hlcyBEU1QgaW4gTVQuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucGxhbmFsdG8uZ292LmJyL2NjaXZpbF8wMy9fQXRvMjAwNC0yMDA2LzIwMDQvRGVjcmV0by9ENTIyMy5odG0iPjUsMjIzPC9hPgorIyA1LDIyMyA8aHR0cDovL3d3dy5wbGFuYWx0by5nb3YuYnIvY2NpdmlsXzAzL19BdG8yMDA0LTIwMDYvMjAwNC9EZWNyZXRvL0Q1MjIzLmh0bT4KIFJ1bGUJQnJhemlsCTIwMDQJb25seQktCU5vdgkgMgkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNTUzOS5naWYiPjUsNTM5PC9hPiAoMjAwNS0wOS0xOSksCisjIERlY3JlZSA1LDUzOSA8aHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY1NTM5LmdpZj4gKDIwMDUtMDktMTkpLAogIyBhZG9wdGVkIGJ5IHRoZSBzYW1lIHN0YXRlcyBhcyBiZWZvcmUuCiBSdWxlCUJyYXppbAkyMDA1CW9ubHkJLQlPY3QJMTYJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVjU5MjAuZ2lmIj41LDkyMDwvYT4gKDIwMDYtMTAtMDMpLAorIyBEZWNyZWUgNSw5MjAgPGh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNTkyMC5naWY+ICgyMDA2LTEwLTAzKSwKICMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgogUnVsZQlCcmF6aWwJMjAwNglvbmx5CS0JTm92CSA1CSAwOjAwCTE6MDAJUwogUnVsZQlCcmF6aWwJMjAwNwlvbmx5CS0JRmViCTI1CSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjSFY2MjEyLmdpZiI+NiwyMTI8L2E+ICgyMDA3LTA5LTI2KSwKKyMgRGVjcmVlIDYsMjEyIDxodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVjYyMTIuZ2lmPiAoMjAwNy0wOS0yNiksCiAjIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KIFJ1bGUJQnJhemlsCTIwMDcJb25seQktCU9jdAlTdW4+PTgJIDA6MDAJMTowMAlTCiAjIEZyb20gRnJlZGVyaWNvIEEuIEMuIE5ldmVzICgyMDA4LTA5LTEwKToKICMgQWNjb3JkaW5nIHRvIHRoaXMgZGVjcmVlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucGxhbmFsdG8uZ292LmJyL2NjaXZpbF8wMy9fQXRvMjAwNy0yMDEwLzIwMDgvRGVjcmV0by9ENjU1OC5odG0iPgogIyBodHRwOi8vd3d3LnBsYW5hbHRvLmdvdi5ici9jY2l2aWxfMDMvX0F0bzIwMDctMjAxMC8yMDA4L0RlY3JldG8vRDY1NTguaHRtCi0jIDwvYT4KICMgW3RdaGUgRFNUIHBlcmlvZCBpbiBCcmF6aWwgbm93IG9uIHdpbGwgYmUgZnJvbSB0aGUgM3JkIE9jdCBTdW5kYXkgdG8gdGhlCiAjIDNyZCBGZWIgU3VuZGF5LiBUaGVyZSBpcyBhbiBleGNlcHRpb24gb24gdGhlIHJldHVybiBkYXRlIHdoZW4gdGhpcyBpcwogIyB0aGUgQ2Fybml2YWwgU3VuZGF5IHRoZW4gdGhlIHJldHVybiBkYXRlIHdpbGwgYmUgdGhlIG5leHQgU3VuZGF5Li4uCkBAIC0xMDU2LDI5ICs5OTQsMjkgQEAKIAkJCS0yOjAwCUJyYXppbAlGTiVzVAkyMDAyIE9jdCAgMQogCQkJLTI6MDAJLQlGTlQKICMgT3RoZXIgQXRsYW50aWMgaXNsYW5kcyBoYXZlIG5vIHBlcm1hbmVudCBzZXR0bGVtZW50LgotIyBUaGVzZSBpbmNsdWRlIFRyaW5kYWRlIGFuZCBNYXJ0aW4gVmF6IChhZG1pbmlzdHJhdGl2ZWx5IHBhcnQgb2YgRVMpLAotIyBBdG9sIGRhcyBSb2NhcyAoUk4pLCBhbmQgUGVuZWRvcyBkZSBTYW8gUGVkcm8gZSBTYW8gUGF1bG8gKFBFKS4KKyMgVGhlc2UgaW5jbHVkZSBUcmluZGFkZSBhbmQgTWFydGltIFZheiAoYWRtaW5pc3RyYXRpdmVseSBwYXJ0IG9mIEVTKSwKKyMgUm9jYXMgQXRvbGwgKFJOKSwgYW5kIHRoZSBTdCBQZXRlciBhbmQgU3QgUGF1bCBBcmNoaXBlbGFnbyAoUEUpLgogIyBGZXJuYW5kbyBkZSBOb3JvbmhhIHdhcyBhIHNlcGFyYXRlIHRlcnJpdG9yeSBmcm9tIDE5NDItMDktMDIgdG8gMTk4OS0wMS0wMTsKICMgaXQgYWxzbyBpbmNsdWRlZCB0aGUgUGVuZWRvcy4KICMKLSMgQW1hcGEgKEFQKSwgZWFzdCBQYXJhIChQQSkKLSMgRWFzdCBQYXJhIGluY2x1ZGVzIEJlbGVtLCBNYXJhYmEsIFNlcnJhIE5vcnRlLCBhbmQgU2FvIEZlbGl4IGRvIFhpbmd1LgotIyBUaGUgZGl2aXNpb24gYmV0d2VlbiBlYXN0IGFuZCB3ZXN0IFBhcmEgaXMgdGhlIHJpdmVyIFhpbmd1LgorIyBBbWFww6EgKEFQKSwgZWFzdCBQYXLDoSAoUEEpCisjIEVhc3QgUGFyw6EgaW5jbHVkZXMgQmVsw6ltLCBNYXJhYsOhLCBTZXJyYSBOb3J0ZSwgYW5kIFPDo28gRsOpbGl4IGRvIFhpbmd1LgorIyBUaGUgZGl2aXNpb24gYmV0d2VlbiBlYXN0IGFuZCB3ZXN0IFBhcsOhIGlzIHRoZSByaXZlciBYaW5ndS4KICMgSW4gdGhlIG5vcnRoIGEgdmVyeSBzbWFsbCBwYXJ0IGZyb20gdGhlIHJpdmVyIEphdmFyeSAobm93IEphcmkgSSBndWVzcywKLSMgdGhlIGJvcmRlciB3aXRoIEFtYXBhKSB0byB0aGUgQW1hem9uLCB0aGVuIHRvIHRoZSBYaW5ndS4KKyMgdGhlIGJvcmRlciB3aXRoIEFtYXDDoSkgdG8gdGhlIEFtYXpvbiwgdGhlbiB0byB0aGUgWGluZ3UuCiBab25lIEFtZXJpY2EvQmVsZW0JLTM6MTM6NTYgLQlMTVQJMTkxNAogCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5ODggU2VwIDEyCiAJCQktMzowMAktCUJSVAogIwotIyB3ZXN0IFBhcmEgKFBBKQotIyBXZXN0IFBhcmEgaW5jbHVkZXMgQWx0YW1pcmEsIE9yaWJpZG9zLCBQcmFpbmhhLCBPcml4aW1pbmEsIGFuZCBTYW50YXJlbS4KKyMgd2VzdCBQYXLDoSAoUEEpCisjIFdlc3QgUGFyw6EgaW5jbHVkZXMgQWx0YW1pcmEsIMOTYmlkb3MsIFByYWluaGEsIE9yaXhpbWluw6EsIGFuZCBTYW50YXLDqW0uCiBab25lIEFtZXJpY2EvU2FudGFyZW0JLTM6Mzg6NDggLQlMTVQJMTkxNAogCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTE5ODggU2VwIDEyCi0JCQktNDowMAktCUFNVAkyMDA4IEp1biAyNCAwMDowMAorCQkJLTQ6MDAJLQlBTVQJMjAwOCBKdW4gMjQgIDA6MDAKIAkJCS0zOjAwCS0JQlJUCiAjCi0jIE1hcmFuaGFvIChNQSksIFBpYXVpIChQSSksIENlYXJhIChDRSksIFJpbyBHcmFuZGUgZG8gTm9ydGUgKFJOKSwKLSMgUGFyYWliYSAoUEIpCisjIE1hcmFuaMOjbyAoTUEpLCBQaWF1w60gKFBJKSwgQ2VhcsOhIChDRSksIFJpbyBHcmFuZGUgZG8gTm9ydGUgKFJOKSwKKyMgUGFyYcOtYmEgKFBCKQogWm9uZSBBbWVyaWNhL0ZvcnRhbGV6YQktMjozNDowMCAtCUxNVAkxOTE0CiAJCQktMzowMAlCcmF6aWwJQlIlc1QJMTk5MCBTZXAgMTcKIAkJCS0zOjAwCS0JQlJUCTE5OTkgU2VwIDMwCkBAIC0xMTI1LDExICsxMDYzLDExIEBACiAJCQktMzowMAlCcmF6aWwJQlIlc1QJMjAxMiBPY3QgMjEKIAkJCS0zOjAwCS0JQlJUCiAjCi0jIEdvaWFzIChHTyksIERpc3RyaXRvIEZlZGVyYWwgKERGKSwgTWluYXMgR2VyYWlzIChNRyksCi0jIEVzcGlyaXRvIFNhbnRvIChFUyksIFJpbyBkZSBKYW5laXJvIChSSiksIFNhbyBQYXVsbyAoU1ApLCBQYXJhbmEgKFBSKSwKKyMgR29pw6FzIChHTyksIERpc3RyaXRvIEZlZGVyYWwgKERGKSwgTWluYXMgR2VyYWlzIChNRyksCisjIEVzcMOtcml0byBTYW50byAoRVMpLCBSaW8gZGUgSmFuZWlybyAoUkopLCBTw6NvIFBhdWxvIChTUCksIFBhcmFuw6EgKFBSKSwKICMgU2FudGEgQ2F0YXJpbmEgKFNDKSwgUmlvIEdyYW5kZSBkbyBTdWwgKFJTKQogWm9uZSBBbWVyaWNhL1Nhb19QYXVsbwktMzowNjoyOCAtCUxNVAkxOTE0Ci0JCQktMzowMAlCcmF6aWwJQlIlc1QJMTk2MyBPY3QgMjMgMDA6MDAKKwkJCS0zOjAwCUJyYXppbAlCUiVzVAkxOTYzIE9jdCAyMyAgMDowMAogCQkJLTM6MDAJMTowMAlCUlNUCTE5NjQKIAkJCS0zOjAwCUJyYXppbAlCUiVzVAogIwpAQCAtMTE0Myw3ICsxMDgxLDcgQEAKIAkJCS00OjAwCS0JQU1UCTIwMDQgT2N0ICAxCiAJCQktNDowMAlCcmF6aWwJQU0lc1QKICMKLSMgUm9uZG9uaWEgKFJPKQorIyBSb25kw7RuaWEgKFJPKQogWm9uZSBBbWVyaWNhL1BvcnRvX1ZlbGhvIC00OjE1OjM2IC0JTE1UCTE5MTQKIAkJCS00OjAwCUJyYXppbAlBTSVzVAkxOTg4IFNlcCAxMgogCQkJLTQ6MDAJLQlBTVQKQEAgLTExNTUsNyArMTA5Myw3IEBACiAJCQktNDowMAlCcmF6aWwJQU0lc1QJMjAwMCBPY3QgMTUKIAkJCS00OjAwCS0JQU1UCiAjCi0jIGVhc3QgQW1hem9uYXMgKEFNKTogQm9jYSBkbyBBY3JlLCBKdXRhaSwgTWFuYXVzLCBGbG9yaWFubyBQZWl4b3RvCisjIGVhc3QgQW1hem9uYXMgKEFNKTogQm9jYSBkbyBBY3JlLCBKdXRhw60sIE1hbmF1cywgRmxvcmlhbm8gUGVpeG90bwogIyBUaGUgZ3JlYXQgY2lyY2xlIGxpbmUgZnJvbSBUYWJhdGluZ2EgdG8gUG9ydG8gQWNyZSBkaXZpZGVzCiAjIGVhc3QgZnJvbSB3ZXN0IEFtYXpvbmFzLgogWm9uZSBBbWVyaWNhL01hbmF1cwktNDowMDowNCAtCUxNVAkxOTE0CkBAIC0xMTY1LDE5ICsxMTAzLDE5IEBACiAJCQktNDowMAktCUFNVAogIwogIyB3ZXN0IEFtYXpvbmFzIChBTSk6IEF0YWxhaWEgZG8gTm9ydGUsIEJvY2EgZG8gTWFvY28sIEJlbmphbWluIENvbnN0YW50LAotIwlFaXJ1bmVwZSwgRW52aXJhLCBJcGl4dW5hCisjCUVpcnVuZXDDqSwgRW52aXJhLCBJcGl4dW5hCiBab25lIEFtZXJpY2EvRWlydW5lcGUJLTQ6Mzk6MjggLQlMTVQJMTkxNAogCQkJLTU6MDAJQnJhemlsCUFDJXNUCTE5ODggU2VwIDEyCiAJCQktNTowMAktCUFDVAkxOTkzIFNlcCAyOAogCQkJLTU6MDAJQnJhemlsCUFDJXNUCTE5OTQgU2VwIDIyCi0JCQktNTowMAktCUFDVAkyMDA4IEp1biAyNCAwMDowMAorCQkJLTU6MDAJLQlBQ1QJMjAwOCBKdW4gMjQgIDA6MDAKIAkJCS00OjAwCS0JQU1UCTIwMTMgTm92IDEwCiAJCQktNTowMAktCUFDVAogIwogIyBBY3JlIChBQykKIFpvbmUgQW1lcmljYS9SaW9fQnJhbmNvCS00OjMxOjEyIC0JTE1UCTE5MTQKIAkJCS01OjAwCUJyYXppbAlBQyVzVAkxOTg4IFNlcCAxMgotCQkJLTU6MDAJLQlBQ1QJMjAwOCBKdW4gMjQgMDA6MDAKKwkJCS01OjAwCS0JQUNUCTIwMDggSnVuIDI0ICAwOjAwCiAJCQktNDowMAktCUFNVAkyMDEzIE5vdiAxMAogCQkJLTU6MDAJLQlBQ1QKIApAQCAtMTE5OCw2NiArMTEzNiw1NCBAQAogIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA2LTEwLTA4KToKICMgaHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9jYW1iaW8uaHRtCiAKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMTAtMDgpOgorIyBGcm9tIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMTAtMDgpOgogIyBJIHRoaW5rIHRoYXQgdGhlcmUgYXJlIHNvbWUgb2J2aW91cyBtaXN0YWtlcyBpbiB0aGUgc3VnZ2VzdGVkIGxpbmsKICMgZnJvbSBPc2NhciB2YW4gVmxpam1lbiwuLi4gZm9yIGluc3RhbmNlIGVudHJ5IDY2IHNheXMgdGhhdCBHTVQtNAogIyBlbmRlZCAxOTkwLTA5LTEyIHdoaWxlIGVudHJ5IDY3IG9ubHkgYmVnaW5zIEdNVC0zIGF0IDE5OTAtMDktMTUKICMgKHRoZXkgc2hvdWxkIGhhdmUgYmVlbiAxOTkwLTA5LTE1IGFuZCAxOTkwLTA5LTE2IHJlc3BlY3RpdmVseSksIGJ1dAogIyBhbnlob3cgaXQgY2xlYXJzIHVwIHNvbWUgZG91YnRzIHRvby4KIAotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTEyLTI3KToKLSMgVGhlIGZvbGxvd2luZyBkYXRhIGZvciBDaGlsZSBhbmQgQW1lcmljYS9TYW50aWFnbyBhcmUgZnJvbQorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA4LTEyKToKKyMgVGhlIGZvbGxvd2luZyBkYXRhIGVudHJpZXMgZm9yIENoaWxlIGFuZCBBbWVyaWNhL1NhbnRpYWdvIGFyZSBmcm9tCiAjIDxodHRwOi8vd3d3LmhvcmFvZmljaWFsLmNsL2hvcmFvZi5odG0+ICgyMDA2LTA5LTIwKSwgdHJhbnNjcmliZWQgYnkKLSMgSmVzcGVyIE5vcmdhYXJkIFdlbGVuLiAgVGhlIGRhdGEgZm9yIFBhY2lmaWMvRWFzdGVyIGFyZSBmcm9tIFNoYW5rcworIyBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuLiAgVGhlIGRhdGEgZW50cmllcyBmb3IgUGFjaWZpYy9FYXN0ZXIgYXJlIGZyb20gU2hhbmtzCiAjICYgUG90dGVuZ2VyLCBleGNlcHQgd2l0aCBEU1QgdHJhbnNpdGlvbnMgYWZ0ZXIgMTkzMiBjbG9uZWQgZnJvbQotIyBBbWVyaWNhL1NhbnRpYWdvLiAgVGhlIHByZS0xOTgwIFBhY2lmaWMvRWFzdGVyIGRhdGEgYXJlIGR1YmlvdXMsCisjIEFtZXJpY2EvU2FudGlhZ28uICBUaGUgcHJlLTE5ODAgUGFjaWZpYy9FYXN0ZXIgZGF0YSBlbnRyaWVzIGFyZSBkdWJpb3VzLAogIyBidXQgd2UgaGF2ZSBubyBvdGhlciBzb3VyY2UuCiAKLSMgRnJvbSBHZXJtYW4gUG9vLUNhYW1hbn5vICgyMDA4LTAzLTAzKToKKyMgRnJvbSBHZXJtw6FuIFBvby1DYWFtYcOxbyAoMjAwOC0wMy0wMyk6CiAjIER1ZSB0byBkcm91Z2h0LCBDaGlsZSBleHRlbmRzIERheWxpZ2h0IFRpbWUgaW4gdGhyZWUgd2Vla3MuICBUaGlzCiAjIGlzIG9uZS10aW1lIGNoYW5nZSAoU2F0dXJkYXkgMy8yOSBhdCAyNDowMCBmb3IgQW1lcmljYS9TYW50aWFnbwogIyBhbmQgU2F0dXJkYXkgMy8yOSBhdCAyMjowMCBmb3IgUGFjaWZpYy9FYXN0ZXIpCiAjIFRoZSBTdXByZW1lIERlY3JlZSBpcyBsb2NhdGVkIGF0Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2hvYS5jbC9zZXJ2aWNpb3Mvc3VwcmVtbzMxNi5wZGYiPgogIyBodHRwOi8vd3d3LnNob2EuY2wvc2VydmljaW9zL3N1cHJlbW8zMTYucGRmCi0jIDwvYT4KICMgYW5kIHRoZSBpbnN0cnVjdGlvbnMgZm9yIDIwMDggYXJlIGxvY2F0ZWQgaW46Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvY2FtYmlvLmh0bSI+CiAjIGh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvY2FtYmlvLmh0bQotIyA8L2E+LgogCi0jIEZyb20gSm9zZSBNaWd1ZWwgR2FycmlkbyAoMjAwOC0wMy0wNSk6CisjIEZyb20gSm9zw6kgTWlndWVsIEdhcnJpZG8gKDIwMDgtMDMtMDUpOgogIyAuLi4KICMgWW91IGNvdWxkIHNlZSB0aGUgYW5ub3VuY2VzIG9mIHRoZSBjaGFuZ2Ugb24KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zaG9hLmNsL25vdGljaWFzLzIwMDgvMDRob3JhL2hvcmEuaHRtIj4KICMgaHR0cDovL3d3dy5zaG9hLmNsL25vdGljaWFzLzIwMDgvMDRob3JhL2hvcmEuaHRtCi0jIDwvYT4uCiAKICMgRnJvbSBBbmdlbCBDaGlhbmcgKDIwMTAtMDMtMDQpOgogIyBTdWJqZWN0OiBEU1QgaW4gQ2hpbGUgZXhjZXB0aW9uYWxseSBleHRlbmRlZCB0byAzIEFwcmlsIGR1ZSB0byBlYXJ0aHF1YWtlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ29iaWVybm9kZWNoaWxlLmNsL3ZpZXdOb3RpY2lhLmFzcHg/aWRBcnRpY3Vsbz0zMDA5OCI+CiAjIGh0dHA6Ly93d3cuZ29iaWVybm9kZWNoaWxlLmNsL3ZpZXdOb3RpY2lhLmFzcHg/aWRBcnRpY3Vsbz0zMDA5OAotIyA8L2E+CiAjIChpbiBTcGFuaXNoLCBsYXN0IHBhcmFncmFwaCkuCiAjCiAjIFRoaXMgaXMgYnJlYWtpbmcgbmV3cy4gVGhlcmUgc2hvdWxkIGJlIG1vcmUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGxhdGVyLgogCi0jIEZyb20gQXJ0aHVyIERhaXZkIE9sc29uICgyMDEwLTAzLTA2KToKKyMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTAtMDMtMDYpOgogIyBBbmdlbCBDaGlhbmcncyBtZXNzYWdlIGNvbmZpcm1lZCBieSBKdWxpbyBQYWNoZWNvOyBKdWxpbyBwcm92aWRlZCBhIHBhdGNoLgogCi0jIEZyb20gR2xlbm4gRXljaGFuZXIgKDIwMTEtMDMtMDIpOiBbZ2V5Y2hhbmVyQG1hYy5jb21dCisjIEZyb20gR2xlbm4gRXljaGFuZXIgKDIwMTEtMDMtMDIpOgogIyBJdCBhcHBlYXJzIHRoYXQgdGhlIENoaWxlYW4gZ292ZXJubWVudCBoYXMgZGVjaWRlZCB0byBwb3N0cG9uZSB0aGUKICMgY2hhbmdlIGZyb20gc3VtbWVyIHRpbWUgdG8gd2ludGVyIHRpbWUgYWdhaW4sIGJ5IHRocmVlIHdlZWtzIHRvIEFwcmlsCiAjIDJuZDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5lbW9sLmNvbS9ub3RpY2lhcy9uYWNpb25hbC9kZXRhbGxlL2RldGFsbGVub3RpY2lhcy5hc3A/aWRub3RpY2lhPTQ2NzY1MSI+CiAjIGh0dHA6Ly93d3cuZW1vbC5jb20vbm90aWNpYXMvbmFjaW9uYWwvZGV0YWxsZS9kZXRhbGxlbm90aWNpYXMuYXNwP2lkbm90aWNpYT00Njc2NTEKLSMgPC9hPgogIwogIyBUaGlzIGlzIG5vdCB5ZXQgcmVmbGVjdGVkIGluIHRoZSBvZmZpY2lhbCAiY2FtYmlvIGRlIGhvcmEiIHNpdGUsIGJ1dAogIyBwcm9iYWJseSB3aWxsIGJlIHNvb246Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvY2FtYmlvLmh0bSI+CiAjIGh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvY2FtYmlvLmh0bQotIyA8L2E+CiAKICMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMTEtMDMtMDIpOgogIyBUaGUgZW1vbC5jb20gYXJ0aWNsZSBtZW50aW9ucyBhIHdhdGVyIHNob3J0YWdlIGFzIHRoZSBjYXVzZSBvZiB0aGUKQEAgLTEyNjUsOSArMTE5MSw3IEBACiAKICMgRnJvbSBHbGVubiBFeWNoYW5lciAoMjAxMS0wMy0yOCk6CiAjIFRoZSBhcnRpY2xlOgotIyA8YSBocmVmPSJodHRwOi8vZGlhcmlvLmVsbWVyY3VyaW8uY29tLzIwMTEvMDMvMjgvX3BvcnRhZGEvX3BvcnRhZGEvbm90aWNpYXMvNzU2NTg5N0EtQ0E4Ni00OUU2LTlFMDMtNjYwQjIxQTQ4ODNFLmh0bT9pZD0zRHs3NTY1ODk3QS1DQTg2LTQ5RTYtOUUwMy02NjBCMjFBNDg4M0V9Ij4KICMgaHR0cDovL2RpYXJpby5lbG1lcmN1cmlvLmNvbS8yMDExLzAzLzI4L19wb3J0YWRhL19wb3J0YWRhL25vdGljaWFzLzc1NjU4OTdBLUNBODYtNDlFNi05RTAzLTY2MEIyMUE0ODgzRS5odG0/aWQ9M0R7NzU2NTg5N0EtQ0E4Ni00OUU2LTlFMDMtNjYwQjIxQTQ4ODNFfQotIyA8L2E+CiAjCiAjIEluIEVuZ2xpc2g6CiAjIENoaWxlJ3MgY2xvY2tzIHdpbGwgZ28gYmFjayBhbiBob3VyIHRoaXMgeWVhciBvbiB0aGUgN3RoIG9mIE1heSBpbnN0ZWFkCkBAIC0xMjk4LDcgKzEyMjIsNyBAQAogIyBzdGFydCBkYXRlIGlzIDIwMTMtMDktMDggMDA6MDAuLi4uCiAjIGh0dHA6Ly93d3cuZ29iLmNsL2luZm9ybWEvMjAxMy8wMi8xNS9nb2JpZXJuby1hbnVuY2lhLWZlY2hhcy1kZS1jYW1iaW8tZGUtaG9yYS1wYXJhLWVsLWFuby0yMDEzLmh0bQogCi0jIEZyb20gSm9zZSBNaWd1ZWwgR2FycmlkbyAoMjAxNC0wMi0xOSk6CisjIEZyb20gSm9zw6kgTWlndWVsIEdhcnJpZG8gKDIwMTQtMDItMTkpOgogIyBUb2RheSBhcHBlYXJlZCBpbiB0aGUgRGlhcmlvIE9maWNpYWwgYSBkZWNyZWUgYW1lbmRpbmcgdGhlIHRpbWUgY2hhbmdlCiAjIGRhdGVzIHRvIDIwMTQuCiAjIERTVCBFbmQ6IGxhc3QgU2F0dXJkYXkgb2YgQXByaWwgMjAxNCAoU3VuIDI3IEFwciAyMDE0IDAzOjAwIFVUQykKQEAgLTEzNTIsNyArMTI3Niw3IEBACiAjICgxOTk2LTA5KSBzYXlzIDE5OTgtMDMtMDguICBJZ25vcmUgdGhlc2UuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvU2FudGlhZ28JLTQ6NDI6NDYgLQlMTVQJMTg5MAotCQkJLTQ6NDI6NDYgLQlTTVQJMTkxMCAJICAgICMgU2FudGlhZ28gTWVhbiBUaW1lCisJCQktNDo0Mjo0NiAtCVNNVAkxOTEwICAgICAgICAjIFNhbnRpYWdvIE1lYW4gVGltZQogCQkJLTU6MDAJLQlDTFQJMTkxNiBKdWwgIDEgIyBDaGlsZSBUaW1lCiAJCQktNDo0Mjo0NiAtCVNNVAkxOTE4IFNlcCAgMSAjIFNhbnRpYWdvIE1lYW4gVGltZQogCQkJLTQ6MDAJLQlDTFQJMTkxOSBKdWwgIDEgIyBDaGlsZSBUaW1lCkBAIC0xMzYxLDE2ICsxMjg1LDE2IEBACiAJCQktNDowMAlDaGlsZQlDTCVzVAogWm9uZSBQYWNpZmljL0Vhc3RlcgktNzoxNzo0NCAtCUxNVAkxODkwCiAJCQktNzoxNzoyOCAtCUVNVAkxOTMyIFNlcCAgICAjIEVhc3RlciBNZWFuIFRpbWUKLQkJCS03OjAwCUNoaWxlCUVBUyVzVAkxOTgyIE1hciAxMyAyMTowMCAjIEVhc3RlciBJIFRpbWUKKwkJCS03OjAwCUNoaWxlCUVBUyVzVAkxOTgyIE1hciAxMyAyMTowMCAjIEVhc3RlciBUaW1lCiAJCQktNjowMAlDaGlsZQlFQVMlc1QKICMKLSMgU2FsYSB5IEdvbWV6IElzbGFuZCBpcyBsaWtlIFBhY2lmaWMvRWFzdGVyLgotIyBPdGhlciBDaGlsZWFuIGxvY2F0aW9ucywgaW5jbHVkaW5nIEp1YW4gRmVybmFuZGV6IElzLCBTYW4gQW1icm9zaW8sCi0jIFNhbiBGZWxpeCwgYW5kIEFudGFyY3RpYyBiYXNlcywgYXJlIGxpa2UgQW1lcmljYS9TYW50aWFnby4KKyMgU2FsYXMgeSBHw7NtZXogSXNsYW5kIGlzIHVuaW5oYWJpdGVkLgorIyBPdGhlciBDaGlsZWFuIGxvY2F0aW9ucywgaW5jbHVkaW5nIEp1YW4gRmVybsOhbmRleiBJcywgRGVzdmVudHVyYWRhcyBJcywKKyMgYW5kIEFudGFyY3RpYyBiYXNlcywgYXJlIGxpa2UgQW1lcmljYS9TYW50aWFnby4KIAogIyBDb2xvbWJpYQogCi0jIE1pbG5lIGdpdmVzIDQ6NTY6MTYuNCBmb3IgQm9nb3RhIHRpbWUgaW4gMTg5OTsgcm91bmQgdG8gbmVhcmVzdC4gIEhlIHdyaXRlcywKKyMgTWlsbmUgZ2l2ZXMgNDo1NjoxNi40IGZvciBCb2dvdMOhIHRpbWUgaW4gMTg5OTsgcm91bmQgdG8gbmVhcmVzdC4gIEhlIHdyaXRlcywKICMgIkEgdmFyaWF0aW9uIG9mIGZpZnRlZW4gbWludXRlcyBpbiB0aGUgcHVibGljIGNsb2NrcyBvZiBCb2dvdGEgaXMgbm90IHJhcmUuIgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwpAQCAtMTM3OCwzNyArMTMwMiwzNyBAQAogUnVsZQlDTwkxOTkzCW9ubHkJLQlBcHIJIDQJMDowMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQW1lcmljYS9Cb2dvdGEJLTQ6NTY6MTYgLQlMTVQJMTg4NCBNYXIgMTMKLQkJCS00OjU2OjE2IC0JQk1UCTE5MTQgTm92IDIzICMgQm9nb3RhIE1lYW4gVGltZQorCQkJLTQ6NTY6MTYgLQlCTVQJMTkxNCBOb3YgMjMgIyBCb2dvdMOhIE1lYW4gVGltZQogCQkJLTU6MDAJQ08JQ08lc1QJIyBDb2xvbWJpYSBUaW1lCiAjIE1hbHBlbG8sIFByb3ZpZGVuY2lhLCBTYW4gQW5kcmVzCiAjIG5vIGluZm9ybWF0aW9uOyBwcm9iYWJseSBsaWtlIEFtZXJpY2EvQm9nb3RhCiAKLSMgQ3VyYWNhbworIyBDdXJhw6dhbwogCi0jIE1pbG5lIGdpdmVzIDQ6MzU6NDYuOSBmb3IgQ3VyYWNhbyBtZWFuIHRpbWU7IHJvdW5kIHRvIG5lYXJlc3QuCisjIE1pbG5lIGdpdmVzIDQ6MzU6NDYuOSBmb3IgQ3VyYcOnYW8gbWVhbiB0aW1lOyByb3VuZCB0byBuZWFyZXN0LgogIwogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKICMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0IFRoZSBCb3R0b20gYW5kIFBoaWxpcHNidXJnIGhhdmUgYmVlbiBhdAogIyAtNDowMCBzaW5jZSBzdGFuZGFyZCB0aW1lIHdhcyBpbnRyb2R1Y2VkIG9uIDE5MTItMDMtMDI7IGFuZCB0aGF0CiAjIEtyYWxlbmRpamsgYW5kIFJpbmNvbiB1c2VkIEtyYWxlbmRpamsgTWVhbiBUaW1lICgtNDozMzowOCkgZnJvbQogIyAxOTEyLTAyLTAyIHRvIDE5NjUtMDEtMDEuICBUaGUgZm9ybWVyIGlzIGR1YmlvdXMsIHNpbmNlIFMmUCBhbHNvIHNheQotIyBTYWJhIElzbGFuZCBoYXMgYmVlbiBsaWtlIEN1cmFjYW8uCisjIFNhYmEgSXNsYW5kIGhhcyBiZWVuIGxpa2UgQ3VyYcOnYW8uCiAjIFRoaXMgYWxsIHByZWRhdGVzIG91ciAxOTcwIGN1dG9mZiwgdGhvdWdoLgogIwotIyBCeSBKdWx5IDIwMDcgQ3VyYWNhbyBhbmQgU3QgTWFhcnRlbiBhcmUgcGxhbm5lZCB0byBiZWNvbWUKKyMgQnkgSnVseSAyMDA3IEN1cmHDp2FvIGFuZCBTdCBNYWFydGVuIGFyZSBwbGFubmVkIHRvIGJlY29tZQogIyBhc3NvY2lhdGVkIHN0YXRlcyB3aXRoaW4gdGhlIE5ldGhlcmxhbmRzLCBtdWNoIGxpa2UgQXJ1YmE7CiAjIEJvbmFpcmUsIFNhYmEgYW5kIFN0IEV1c3RhdGl1cyB3b3VsZCBiZWNvbWUgZGlyZWN0bHkgcGFydCBvZiB0aGUKICMgTmV0aGVybGFuZHMgYXMgS2luZ2RvbSBJc2xhbmRzLiAgVGhpcyB3b24ndCBhZmZlY3QgdGhlaXIgdGltZSB6b25lcwogIyB0aG91Z2gsIGFzIGZhciBhcyB3ZSBrbm93LgogIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0N1cmFjYW8JLTQ6MzU6NDcgLQlMTVQJMTkxMiBGZWIgMTIJIyBXaWxsZW1zdGFkCitab25lCUFtZXJpY2EvQ3VyYWNhbwktNDozNTo0NyAtCUxNVAkxOTEyIEZlYiAxMiAjIFdpbGxlbXN0YWQKIAkJCS00OjMwCS0JQU5UCTE5NjUgIyBOZXRoZXJsYW5kcyBBbnRpbGxlcyBUaW1lCiAJCQktNDowMAktCUFTVAogCiAjIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDExLTA2LTE1KToKICMgdXNlIGxpbmtzIGZvciBwbGFjZXMgd2l0aCBuZXcgaXNvMzE2NiBjb2Rlcy4KLSMgVGhlIG5hbWUgIkxvd2VyIFByaW5jZSdzIFF1YXJ0ZXIiIGlzIGJvdGggbG9uZ2VyIHRoYW4gZm91cnRlZW4gY2hhcmF0ZXJzCisjIFRoZSBuYW1lICJMb3dlciBQcmluY2UncyBRdWFydGVyIiBpcyBib3RoIGxvbmdlciB0aGFuIGZvdXJ0ZWVuIGNoYXJhY3RlcnMKICMgYW5kIGNvbnRhaW5zIGFuIGFwb3N0cm9waGU7IHVzZSAiTG93ZXJfUHJpbmNlcyIgYmVsb3cuCiAKIExpbmsJQW1lcmljYS9DdXJhY2FvCUFtZXJpY2EvTG93ZXJfUHJpbmNlcwkjIFNpbnQgTWFhcnRlbgpAQCAtMTQxNiw3ICsxMzQwLDcgQEAKIAogIyBFY3VhZG9yCiAjCi0jIE1pbG5lIHNheXMgdGhlIFNlbnRyYWwgYW5kIFNvdXRoIEFtZXJpY2FuIFRlbGVncmFwaCBDb21wYW55IHVzZWQgLTU6MjQ6MTUuCisjIE1pbG5lIHNheXMgdGhlIENlbnRyYWwgYW5kIFNvdXRoIEFtZXJpY2FuIFRlbGVncmFwaCBDb21wYW55IHVzZWQgLTU6MjQ6MTUuCiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDMtMDQpOgogIyBBcHBhcmVudGx5IEVjdWFkb3IgaGFkIGEgZmFpbGVkIGV4cGVyaW1lbnQgd2l0aCBEU1QgaW4gMTk5Mi4KQEAgLTE0MjcsMTAgKzEzNTEsMTAgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW1lcmljYS9HdWF5YXF1aWwJLTU6MTk6MjAgLQlMTVQJMTg5MAogCQkJLTU6MTQ6MDAgLQlRTVQJMTkzMSAjIFF1aXRvIE1lYW4gVGltZQotCQkJLTU6MDAJLQlFQ1QJICAgICAjIEVjdWFkb3IgVGltZQorCQkJLTU6MDAJLQlFQ1QJIyBFY3VhZG9yIFRpbWUKIFpvbmUgUGFjaWZpYy9HYWxhcGFnb3MJLTU6NTg6MjQgLQlMTVQJMTkzMSAjIFB1ZXJ0byBCYXF1ZXJpem8gTW9yZW5vCiAJCQktNTowMAktCUVDVAkxOTg2Ci0JCQktNjowMAktCUdBTFQJICAgICAjIEdhbGFwYWdvcyBUaW1lCisJCQktNjowMAktCUdBTFQJIyBHYWzDoXBhZ29zIFRpbWUKIAogIyBGYWxrbGFuZHMKIApAQCAtMTQzOSw3ICsxMzYzLDcgQEAKICMgdGhlIElBVEEgZ2l2ZXMgMTk5Ni0wOS0wOC4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgogCiAjIEZyb20gRmFsa2xhbmQgSXNsYW5kcyBHb3Zlcm5tZW50IE9mZmljZSwgTG9uZG9uICgyMDAxLTAxLTIyKQotIyB2aWEgSmVzcGVyIE5vcmdhYXJkOgorIyB2aWEgSmVzcGVyIE7DuHJnYWFyZDoKICMgLi4uIHRoZSBjbG9ja3MgcmV2ZXJ0IGJhY2sgdG8gTG9jYWwgTWVhbiBUaW1lIGF0IDIgYW0gb24gU3VuZGF5IDE1CiAjIEFwcmlsIDIwMDEgYW5kIGFkdmFuY2Ugb25lIGhvdXIgdG8gc3VtbWVyIHRpbWUgYXQgMiBhbSBvbiBTdW5kYXkgMgogIyBTZXB0ZW1iZXIuICBJdCBpcyBhbnRpY2lwYXRlZCB0aGF0IHRoZSBjbG9ja3Mgd2lsbCByZXZlcnQgYmFjayBhdCAyCkBAIC0xNDg4LDkgKzE0MTIsNyBAQAogIyBkYXlsaWdodCBzYXZpbmcgdGltZS4KICMKICMgT25lIHNvdXJjZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5mYWxrbGFuZG5ld3MuY29tL3B1YmxpYy9zdG9yeS5jZm0/Z2V0PTU5MTQmc291cmNlPTMiPgogIyBodHRwOi8vd3d3LmZhbGtsYW5kbmV3cy5jb20vcHVibGljL3N0b3J5LmNmbT9nZXQ9NTkxNCZzb3VyY2U9MwotIyA8L2E+CiAjCiAjIFdlIGhhdmUgZ290dGVuIHRoaXMgY29uZmlybWVkIGJ5IGEgY2xlcmsgb2YgdGhlIGxlZ2lzbGF0aXZlIGFzc2VtYmx5OgogIyBOb3JtYWxseSB0aGUgY2xvY2tzIHJldmVydCB0byBMb2NhbCBNZWFuIFRpbWUgKFVUQy9HTVQgLTQgaG91cnMpIG9uIHRoZQpAQCAtMTUzMSwxMCArMTQ1MywxMCBAQAogUnVsZQlGYWxrCTIwMDEJMjAxMAktCVNlcAlTdW4+PTEJMjowMAkxOjAwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQXRsYW50aWMvU3RhbmxleQktMzo1MToyNCAtCUxNVAkxODkwCi0JCQktMzo1MToyNCAtCVNNVAkxOTEyIE1hciAxMiAgIyBTdGFubGV5IE1lYW4gVGltZQotCQkJLTQ6MDAJRmFsawlGSyVzVAkxOTgzIE1heSAgICAgIyBGYWxrbGFuZCBJcyBUaW1lCisJCQktMzo1MToyNCAtCVNNVAkxOTEyIE1hciAxMiAjIFN0YW5sZXkgTWVhbiBUaW1lCisJCQktNDowMAlGYWxrCUZLJXNUCTE5ODMgTWF5ICAgICMgRmFsa2xhbmQgSXMgVGltZQogCQkJLTM6MDAJRmFsawlGSyVzVAkxOTg1IFNlcCAxNQotCQkJLTQ6MDAJRmFsawlGSyVzVAkyMDEwIFNlcCA1IDAyOjAwCisJCQktNDowMAlGYWxrCUZLJXNUCTIwMTAgU2VwICA1ICAyOjAwCiAJCQktMzowMAktCUZLU1QKIAogIyBGcmVuY2ggR3VpYW5hCkBAIC0xNTQ1LDcgKzE0NjcsNyBAQAogCiAjIEd1eWFuYQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0d1eWFuYQktMzo1Mjo0MCAtCUxNVAkxOTE1IE1hcgkjIEdlb3JnZXRvd24KK1pvbmUJQW1lcmljYS9HdXlhbmEJLTM6NTI6NDAgLQlMTVQJMTkxNSBNYXIgICAgIyBHZW9yZ2V0b3duCiAJCQktMzo0NQktCUdCR1QJMTk2NiBNYXkgMjYgIyBCciBHdWlhbmEgVGltZQogCQkJLTM6NDUJLQlHWVQJMTk3NSBKdWwgMzEgIyBHdXlhbmEgVGltZQogCQkJLTM6MDAJLQlHWVQJMTk5MQpAQCAtMTU1NSw4ICsxNDc3LDggQEAKICMgUGFyYWd1YXkKICMKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBzcHJpbmcgdHJhbnNpdGlvbnMgYXJlIGZyb20gMDE6MDAgLT4gMDI6MDAsCi0jIGFuZCBhdXR1bW4gdHJhbnNpdGlvbnMgYXJlIGZyb20gMDA6MDAgLT4gMjM6MDAuICBHbyB3aXRoIHByZS0xOTk5CisjIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBzcHJpbmcgdHJhbnNpdGlvbnMgYXJlIDAxOjAwIC0+IDAyOjAwLAorIyBhbmQgYXV0dW1uIHRyYW5zaXRpb25zIGFyZSAwMDowMCAtPiAyMzowMC4gIEdvIHdpdGggcHJlLTE5OTkKICMgZWRpdGlvbnMgb2YgU2hhbmtzLCBhbmQgd2l0aCB0aGUgSUFUQSwgd2hvIHNheSB0cmFuc2l0aW9ucyBvY2N1ciBhdCAwMDowMC4KICMKICMgRnJvbSBXYWxkZW1hciBWaWxsYW1heW9yLVZlbmlhbGJvICgyMDEzLTA5LTIwKToKQEAgLTE1ODIsOSArMTUwNCw4IEBACiAjICgxMC0wMSkuCiAjCiAjIFRyYW5zbGF0ZWQgYnkgR3dpbGxpbSBMYXcgKDIwMDEtMDItMjcpIGZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5kaWFyaW9ub3RpY2lhcy5jb20ucHkvMDExMDAwL25hY2lvbmFsL25hY2lvbmExLmh0bSI+Ci0jIE5vdGljaWFzLCBhIGRhaWx5IHBhcGVyIGluIEFzdW5jaW9uLCBQYXJhZ3VheSAoMjAwMC0xMC0wMSkKLSMgPC9hPjoKKyMgTm90aWNpYXMsIGEgZGFpbHkgcGFwZXIgaW4gQXN1bmNpw7NuLCBQYXJhZ3VheSAoMjAwMC0xMC0wMSk6CisjIGh0dHA6Ly93d3cuZGlhcmlvbm90aWNpYXMuY29tLnB5LzAxMTAwMC9uYWNpb25hbC9uYWNpb25hMS5odG0KICMgU3RhcnRpbmcgYXQgMDowMCB0b2RheSwgdGhlIGNsb2NrIHdpbGwgYmUgc2V0IGZvcndhcmQgNjAgbWludXRlcywgaW4KICMgZnVsZmlsbG1lbnQgb2YgRGVjcmVlIE5vLiA3LDI3MyBvZiB0aGUgRXhlY3V0aXZlIFBvd2VyLi4uLiAgVGhlIHRpbWUgY2hhbmdlCiAjIHN5c3RlbSBoYXMgYmVlbiBvcGVyYXRpbmcgZm9yIHNldmVyYWwgeWVhcnMuICBGb3JtZXJseSB0aGVyZSB3YXMgYSBzZXBhcmF0ZQpAQCAtMTYwNSwyMSArMTUyNiwxOCBAQAogUnVsZQlQYXJhCTIwMDIJMjAwNAktCUFwcglTdW4+PTEJMDowMAkwCS0KIFJ1bGUJUGFyYQkyMDAyCTIwMDMJLQlTZXAJU3VuPj0xCTA6MDAJMTowMAlTCiAjCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTAxLTAyKToKKyMgRnJvbSBKZXNwZXIgTsO4cmdhYXJkIFdlbGVuICgyMDA1LTAxLTAyKToKICMgVGhlcmUgYXJlIHNldmVyYWwgc291cmNlcyB0aGF0IGNsYWltIHRoYXQgUGFyYWd1YXkgbWFkZQogIyBhIHRpbWV6b25lIHJ1bGUgY2hhbmdlIGluIGF1dHVtbiAyMDA0LgogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNS0wMS0wNSk6CiAjIERlY3JlZSAxLDg2NyAoMjAwNC0wMy0wNSkKLSMgRnJvbSBDYXJsb3MgUmF1bCBQZXJhc3NvIHZpYSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMTAtMTMpCi0jIDxodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5weS9kZWNyZXRvcy9EMTg2Ny5wZGY+CisjIEZyb20gQ2FybG9zIFJhw7psIFBlcmFzc28gdmlhIEplc3BlciBOw7hyZ2FhcmQgV2VsZW4gKDIwMDYtMTAtMTMpCisjIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LnB5L2RlY3JldG9zL0QxODY3LnBkZgogUnVsZQlQYXJhCTIwMDQJMjAwOQktCU9jdAlTdW4+PTE1CTA6MDAJMTowMAlTCiBSdWxlCVBhcmEJMjAwNQkyMDA5CS0JTWFyCVN1bj49OAkwOjAwCTAJLQotIyBGcm9tIENhcmxvcyBSYXVsIFBlcmFzc28gKDIwMTAtMDItMTgpOgotIyBCeSBkZWNyZWUgbnVtYmVyIDM5NTggaXNzdWVkIHllc3RlcmRheSAoCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LnB5L3YxL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDEwLzAyL2RlY3JldG8zOTU4LnBkZiI+CisjIEZyb20gQ2FybG9zIFJhw7psIFBlcmFzc28gKDIwMTAtMDItMTgpOgorIyBCeSBkZWNyZWUgbnVtYmVyIDM5NTggaXNzdWVkIHllc3RlcmRheQogIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5weS92MS93cC1jb250ZW50L3VwbG9hZHMvMjAxMC8wMi9kZWNyZXRvMzk1OC5wZGYKLSMgPC9hPgotIyApCiAjIFBhcmFndWF5IGNoYW5nZXMgaXRzIERTVCBzY2hlZHVsZSwgcG9zdHBvbmluZyB0aGUgTWFyY2ggcnVsZSB0byBBcHJpbCBhbmQKICMgbW9kaWZ5aW5nIHRoZSBPY3RvYmVyIGRhdGUuIFRoZSBkZWNyZWUgcmVhZHM6CiAjIC4uLgpAQCAtMTYzNSwyNSArMTU1MywyNSBAQAogIyBQYXJhZ3VheSB3aWxsIGVuZCBEU1Qgb24gMjAxMy0wMy0yNCAwMDowMC4uLi4KICMgaHR0cDovL3d3dy5hbmRlLmdvdi5weS9pbnRlcm5hLnBocD9pZD0xMDc1CiAjCi0jIEZyb20gQ2FybG9zIFJhdWwgUGVyYXNzbyAoMjAxMy0wMy0xNSk6CisjIEZyb20gQ2FybG9zIFJhw7psIFBlcmFzc28gKDIwMTMtMDMtMTUpOgogIyBUaGUgY2hhbmdlIGluIFBhcmFndWF5IGlzIG5vdyBmaW5hbC4gIERlY3JlZSBudW1iZXIgMTA3ODAKICMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YucHkvdXBsb2Fkcy9wZGYvcHJlc2lkZW5jaWEtM2I4NmZmNGI2OTFjNzlkNGY1OTI3Y2E5NjQ5MjJlYzc0NzcyY2U4NTdjMDJjYTA1NGE1MmEzN2I0OWFmYzdmYi5wZGYKLSMgRnJvbSBDYXJsb3MgUmF1bCBQZXJhc3NvICgyMDE0LTAyLTI4KToKKyMgRnJvbSBDYXJsb3MgUmHDumwgUGVyYXNzbyAoMjAxNC0wMi0yOCk6CiAjIERlY3JlZSAxMjY0IGNhbiBiZSBmb3VuZCBhdDoKICMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YucHkvYXJjaGl2b3MvZG9jdW1lbnRvcy9ERUNSRVRPMTI2NF9leTlyOHphaS5wZGYKIFJ1bGUJUGFyYQkyMDEzCW1heAktCU1hcglTdW4+PTIyCTA6MDAJMAktCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW1lcmljYS9Bc3VuY2lvbgktMzo1MDo0MCAtCUxNVAkxODkwCi0JCQktMzo1MDo0MCAtCUFNVAkxOTMxIE9jdCAxMCAjIEFzdW5jaW9uIE1lYW4gVGltZQotCQkJLTQ6MDAJLQlQWVQJMTk3MiBPY3QgIyBQYXJhZ3VheSBUaW1lCisJCQktMzo1MDo0MCAtCUFNVAkxOTMxIE9jdCAxMCAjIEFzdW5jacOzbiBNZWFuIFRpbWUKKwkJCS00OjAwCS0JUFlUCTE5NzIgT2N0ICAgICMgUGFyYWd1YXkgVGltZQogCQkJLTM6MDAJLQlQWVQJMTk3NCBBcHIKIAkJCS00OjAwCVBhcmEJUFklc1QKIAogIyBQZXJ1CiAjCi0jIDxhIGhyZWY9Im5ld3M6eHJHbWIuMzk5MzUkZ0ExLjEzODk2MTEzQG5ld3M0LnNydi5oY3ZsbnkuY3YubmV0Ij4KLSMgRnJvbSBFdmVseW4gQy4gTGVlcGVyIHZpYSBNYXJrIEJyYWRlciAoMjAwMy0xMC0yNik6PC9hPgorIyBGcm9tIEV2ZWx5biBDLiBMZWVwZXIgdmlhIE1hcmsgQnJhZGVyICgyMDAzLTEwLTI2KQorIyA8bmV3czp4ckdtYi4zOTkzNSRnQTEuMTM4OTYxMTNAbmV3czQuc3J2LmhjdmxueS5jdi5uZXQ+OgogIyBXaGVuIHdlIHdlcmUgaW4gUGVydSBpbiAxOTg1LTE5ODYsIHRoZXkgYXBwYXJlbnRseSBzd2l0Y2hlZCBvdmVyCiAjIHNvbWV0aW1lIGJldHdlZW4gRGVjZW1iZXIgMjkgYW5kIEphbnVhcnkgMyB3aGlsZSB3ZSB3ZXJlIG9uIHRoZSBBbWF6b24uCiAjCkBAIC0xNjc5LDcgKzE1OTcsNyBAQAogCiAjIFNvdXRoIEdlb3JnaWEKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvU291dGhfR2VvcmdpYSAtMjoyNjowOCAtCUxNVAkxODkwCQkjIEdyeXR2aWtlbgorWm9uZSBBdGxhbnRpYy9Tb3V0aF9HZW9yZ2lhIC0yOjI2OjA4IC0JTE1UCTE4OTAgIyBHcnl0dmlrZW4KIAkJCS0yOjAwCS0JR1NUCSMgU291dGggR2VvcmdpYSBUaW1lCiAKICMgU291dGggU2FuZHdpY2ggSXMKQEAgLTE2ODksOSArMTYwNyw5IEBACiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFtZXJpY2EvUGFyYW1hcmlibwktMzo0MDo0MCAtCUxNVAkxOTExCiAJCQktMzo0MDo1MiAtCVBNVAkxOTM1ICAgICAjIFBhcmFtYXJpYm8gTWVhbiBUaW1lCi0JCQktMzo0MDozNiAtCVBNVAkxOTQ1IE9jdCAjIFRoZSBjYXBpdGFsIG1vdmVkPworCQkJLTM6NDA6MzYgLQlQTVQJMTk0NSBPY3QgICAgIyBUaGUgY2FwaXRhbCBtb3ZlZD8KIAkJCS0zOjMwCS0JTkVHVAkxOTc1IE5vdiAyMCAjIER1dGNoIEd1aWFuYSBUaW1lCi0JCQktMzozMAktCVNSVAkxOTg0IE9jdCAjIFN1cmluYW1lIFRpbWUKKwkJCS0zOjMwCS0JU1JUCTE5ODQgT2N0ICAgICMgU3VyaW5hbWUgVGltZQogCQkJLTM6MDAJLQlTUlQKIAogIyBUcmluaWRhZCBhbmQgVG9iYWdvCkBAIC0xNzA2LDcgKzE2MjQsNyBAQAogTGluayBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gQW1lcmljYS9HdWFkZWxvdXBlCiBMaW5rIEFtZXJpY2EvUG9ydF9vZl9TcGFpbiBBbWVyaWNhL01hcmlnb3QJIyBTdCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KQogTGluayBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gQW1lcmljYS9Nb250c2VycmF0Ci1MaW5rIEFtZXJpY2EvUG9ydF9vZl9TcGFpbiBBbWVyaWNhL1N0X0JhcnRoZWxlbXkKK0xpbmsgQW1lcmljYS9Qb3J0X29mX1NwYWluIEFtZXJpY2EvU3RfQmFydGhlbGVteSAjIFN0IEJhcnRow6lsZW15CiBMaW5rIEFtZXJpY2EvUG9ydF9vZl9TcGFpbiBBbWVyaWNhL1N0X0tpdHRzCSMgU3QgS2l0dHMgJiBOZXZpcwogTGluayBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gQW1lcmljYS9TdF9MdWNpYQogTGluayBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gQW1lcmljYS9TdF9UaG9tYXMJIyBWaXJnaW4gSXNsYW5kcyAoVVMpCkBAIC0xNzY1LDcgKzE2ODMsNyBAQAogUnVsZQlVcnVndWF5CTE5OTIJb25seQktCU9jdAkxOAkgMDowMAkxOjAwCVMKIFJ1bGUJVXJ1Z3VheQkxOTkzCW9ubHkJLQlGZWIJMjgJIDA6MDAJMAktCiAjIEZyb20gRWR1YXJkbyBDb3RhICgyMDA0LTA5LTIwKToKLSMgVGhlIHVydWd1YXlhbiBnb3Zlcm5tZW50IGhhcyBkZWNyZWVkIGEgY2hhbmdlIGluIHRoZSBsb2NhbCB0aW1lLi4uLgorIyBUaGUgVXJ1Z3VheWFuIGdvdmVybm1lbnQgaGFzIGRlY3JlZWQgYSBjaGFuZ2UgaW4gdGhlIGxvY2FsIHRpbWUuLi4uCiAjIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ3ViLnV5L2RlY3JldG9zLzIwMDQwOTE1MDIuaHRtCiBSdWxlCVVydWd1YXkJMjAwNAlvbmx5CS0JU2VwCTE5CSAwOjAwCTE6MDAJUwogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNS0wMy0xMSk6CkBAIC0xNzc5LDE0ICsxNjk3LDE0IEBACiAjIDAyOjAwIGxvY2FsIHRpbWUsIG9mZmljaWFsIHRpbWUgaW4gVXJ1Z3VheSB3aWxsIGJlIGF0IEdNVCAtMi4KIFJ1bGUJVXJ1Z3VheQkyMDA1CW9ubHkJLQlPY3QJIDkJIDI6MDAJMTowMAlTCiBSdWxlCVVydWd1YXkJMjAwNglvbmx5CS0JTWFyCTEyCSAyOjAwCTAJLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wOS0wNik6CisjIEZyb20gSmVzcGVyIE7DuHJnYWFyZCBXZWxlbiAoMjAwNi0wOS0wNik6CiAjIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ3ViLnV5L193ZWIvZGVjcmV0b3MvMjAwNi8wOS9DTSUyMDIxMF8wOCUyMDA2JTIwMjAwNl8wMDAwMS5QREYKIFJ1bGUJVXJ1Z3VheQkyMDA2CW1heAktCU9jdAlTdW4+PTEJIDI6MDAJMTowMAlTCiBSdWxlCVVydWd1YXkJMjAwNwltYXgJLQlNYXIJU3VuPj04CSAyOjAwCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbWVyaWNhL01vbnRldmlkZW8JLTM6NDQ6NDQgLQlMTVQJMTg5OCBKdW4gMjgKLQkJCS0zOjQ0OjQ0IC0JTU1UCTE5MjAgTWF5ICAxCSMgTW9udGV2aWRlbyBNVAotCQkJLTM6MzAJVXJ1Z3VheQlVWSVzVAkxOTQyIERlYyAxNAkjIFVydWd1YXkgVGltZQorCQkJLTM6NDQ6NDQgLQlNTVQJMTkyMCBNYXkgIDEgIyBNb250ZXZpZGVvIE1UCisJCQktMzozMAlVcnVndWF5CVVZJXNUCTE5NDIgRGVjIDE0ICMgVXJ1Z3VheSBUaW1lCiAJCQktMzowMAlVcnVndWF5CVVZJXNUCiAKICMgVmVuZXp1ZWxhCkBAIC0xNzk0LDE0ICsxNzEyLDE0IEBACiAjIEZyb20gSm9obiBTdGFpbmZvcnRoICgyMDA3LTExLTI4KToKICMgLi4uIHRoZSBjaGFuZ2UgZm9yIFZlbmV6dWVsYSBvcmlnaW5hbGx5IGV4cGVjdGVkIGZvciAyMDA3LTEyLTMxIGhhcwogIyBiZWVuIGJyb3VnaHQgZm9yd2FyZCB0byAyMDA3LTEyLTA5LiAgVGhlIG9mZmljaWFsIGFubm91bmNlbWVudCB3YXMKLSMgcHVibGlzaGVkIHRvZGF5IGluIHRoZSAiR2FjZXRhIE9maWNpYWwgZGUgbGEgUmVwdWJsaWNhIEJvbGl2YXJpYW5hCi0jIGRlIFZlbmV6dWVsYSwgbnVtZXJvIDM4LjgxOSIgKG9mZmljaWFsIGRvY3VtZW50IGZvciBhbGwgbGF3cyBvcgorIyBwdWJsaXNoZWQgdG9kYXkgaW4gdGhlICJHYWNldGEgT2ZpY2lhbCBkZSBsYSBSZXDDumJsaWNhIEJvbGl2YXJpYW5hCisjIGRlIFZlbmV6dWVsYSwgbsO6bWVybyAzOC44MTkiIChvZmZpY2lhbCBkb2N1bWVudCBmb3IgYWxsIGxhd3Mgb3IKICMgcmVzb2x1dGlvbiBwdWJsaWNhdGlvbikKICMgaHR0cDovL3d3dy5nbG9ib3Zpc2lvbi5jb20vbmV3cy5waHA/bmlkPTcyMjA4CiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQW1lcmljYS9DYXJhY2FzCS00OjI3OjQ0IC0JTE1UCTE4OTAKIAkJCS00OjI3OjQwIC0JQ01UCTE5MTIgRmViIDEyICMgQ2FyYWNhcyBNZWFuIFRpbWU/Ci0JCQktNDozMAktCVZFVAkxOTY1CSAgICAgIyBWZW5lenVlbGEgVGltZQotCQkJLTQ6MDAJLQlWRVQJMjAwNyBEZWMgIDkgMDM6MDAKKwkJCS00OjMwCS0JVkVUCTE5NjUgICAgICAgICMgVmVuZXp1ZWxhIFRpbWUKKwkJCS00OjAwCS0JVkVUCTIwMDcgRGVjICA5ICAzOjAwCiAJCQktNDozMAktCVZFVApkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvc3lzdGVtdiBiL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL3N5c3RlbXYKaW5kZXggZjkwOWY5Yy4uYzdiOWE4OCAxMDA2NDQKLS0tIGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvc3lzdGVtdgorKysgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9zeXN0ZW12CkBAIC0yMSw3ICsyMSw2IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyA8cHJlPgogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIApkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvem9uZS50YWIgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS96b25lLnRhYgppbmRleCA3Y2VjNjI3Li40NTM1MWNhIDEwMDY0NAotLS0gYS90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS96b25lLnRhYgorKysgYi90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS96b25lLnRhYgpAQCAtMjEsMzkgKzIxLDI3IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIyBUWiB6b25lIGRlc2NyaXB0aW9ucworIyB0eiB6b25lIGRlc2NyaXB0aW9ucyAoZGVwcmVjYXRlZCB2ZXJzaW9uKQogIwogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KICMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0wOC0xNCk6CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMzEpOgorIyBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgYXMgYSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IGFpZCBmb3Igb2xkZXIgcHJvZ3JhbXMuCisjIE5ldyBwcm9ncmFtcyBzaG91bGQgdXNlIHpvbmUxOTcwLnRhYi4gIFRoaXMgZmlsZSBpcyBsaWtlIHpvbmUxOTcwLnRhYiAoc2VlCisjIHpvbmUxOTcwLnRhYidzIGNvbW1lbnRzKSwgYnV0IHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uczoKICMKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgd2hlcmUgZWFjaCByb3cgc3RhbmRzIGZvciBhbiBhcmVhIHRoYXQgaXMKLSMgdGhlIGludGVyc2VjdGlvbiBvZiBhIHJlZ2lvbiBpZGVudGlmaWVkIGJ5IGEgY291bnRyeSBjb2RlIGFuZCBvZiBhCi0jIHpvbmUgd2hlcmUgY2l2aWwgY2xvY2tzIGhhdmUgYWdyZWVkIHNpbmNlIDE5NzAuICBUaGUgY29sdW1ucyBvZiB0aGUKLSMgdGFibGUgYXJlIGFzIGZvbGxvd3M6CisjIDEuICBUaGlzIGZpbGUgY29udGFpbnMgb25seSBBU0NJSSBjaGFyYWN0ZXJzLgorIyAyLiAgVGhlIGZpcnN0IGRhdGEgY29sdW1uIGNvbnRhaW5zIGV4YWN0bHkgb25lIGNvdW50cnkgY29kZS4KICMKLSMgMS4gIElTTyAzMTY2IDItY2hhcmFjdGVyIGNvdW50cnkgY29kZS4gIFNlZSB0aGUgZmlsZSAnaXNvMzE2Ni50YWInLgotIyAyLiAgTGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBvZiB0aGUgYXJlYSdzIHByaW5jaXBhbCBsb2NhdGlvbgotIyAgICAgaW4gSVNPIDY3MDkgc2lnbi1kZWdyZWVzLW1pbnV0ZXMtc2Vjb25kcyBmb3JtYXQsCi0jICAgICBlaXRoZXIgKy1ERE1NKy1ERERNTSBvciArLURETU1TUystRERETU1TUywKLSMgICAgIGZpcnN0IGxhdGl0dWRlICgrIGlzIG5vcnRoKSwgdGhlbiBsb25naXR1ZGUgKCsgaXMgZWFzdCkuCi0jIDMuICBab25lIG5hbWUgdXNlZCBpbiB2YWx1ZSBvZiBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSMgICAgIFBsZWFzZSBzZWUgdGhlICdUaGVvcnknIGZpbGUgZm9yIGhvdyB6b25lIG5hbWVzIGFyZSBjaG9zZW4uCi0jICAgICBJZiBtdWx0aXBsZSB6b25lcyBvdmVybGFwIGEgY291bnRyeSwgZWFjaCBoYXMgYSByb3cgaW4gdGhlCi0jICAgICB0YWJsZSwgd2l0aCBjb2x1bW4gMSBiZWluZyBkdXBsaWNhdGVkLgotIyA0LiAgQ29tbWVudHM7IHByZXNlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGNvdW50cnkgaGFzIG11bHRpcGxlIHJvd3MuCi0jCi0jIENvbHVtbnMgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSB0YWIuCi0jIFRoZSB0YWJsZSBpcyBzb3J0ZWQgZmlyc3QgYnkgY291bnRyeSwgdGhlbiBhbiBvcmRlciB3aXRoaW4gdGhlIGNvdW50cnkgdGhhdAotIyAoMSkgbWFrZXMgc29tZSBnZW9ncmFwaGljYWwgc2Vuc2UsIGFuZAotIyAoMikgcHV0cyB0aGUgbW9zdCBwb3B1bG91cyBhcmVhcyBmaXJzdCwgd2hlcmUgdGhhdCBkb2VzIG5vdCBjb250cmFkaWN0ICgxKS4KLSMKLSMgTGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIGFyZSBjb21tZW50cy4KKyMgQmVjYXVzZSBvZiAoMiksIGVhY2ggcm93IHN0YW5kcyBmb3IgYW4gYXJlYSB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24KKyMgb2YgYSByZWdpb24gaWRlbnRpZmllZCBieSBhIGNvdW50cnkgY29kZSBhbmQgb2YgYSB6b25lIHdoZXJlIGNpdmlsCisjIGNsb2NrcyBoYXZlIGFncmVlZCBzaW5jZSAxOTcwOyB0aGlzIGlzIGEgbmFycm93ZXIgZGVmaW5pdGlvbiB0aGFuCisjIHRoYXQgb2Ygem9uZTE5NzAudGFiLgogIwogIyBUaGlzIHRhYmxlIGlzIGludGVuZGVkIGFzIGFuIGFpZCBmb3IgdXNlcnMsIHRvIGhlbHAgdGhlbSBzZWxlY3QgdGltZQotIyB6b25lIGRhdGEgYXBwcm9wcmlhdGUgZm9yIHRoZWlyIHByYWN0aWNhbCBuZWVkcy4gIEl0IGlzIG5vdCBpbnRlbmRlZAotIyB0byB0YWtlIG9yIGVuZG9yc2UgYW55IHBvc2l0aW9uIG9uIGxlZ2FsIG9yIHRlcnJpdG9yaWFsIGNsYWltcy4KKyMgem9uZSBkYXRhIGVudHJpZXMgYXBwcm9wcmlhdGUgZm9yIHRoZWlyIHByYWN0aWNhbCBuZWVkcy4gIEl0IGlzIG5vdAorIyBpbnRlbmRlZCB0byB0YWtlIG9yIGVuZG9yc2UgYW55IHBvc2l0aW9uIG9uIGxlZ2FsIG9yIHRlcnJpdG9yaWFsIGNsYWltcy4KICMKICNjb3VudHJ5LQogI2NvZGUJY29vcmRpbmF0ZXMJVFoJCQljb21tZW50cwpAQCAtNzIsNyArNjAsNyBAQAogQVEJLTY4MzUrMDc3NTgJQW50YXJjdGljYS9EYXZpcwlEYXZpcyBTdGF0aW9uLCBWZXN0Zm9sZCBIaWxscwogQVEJLTY2MTcrMTEwMzEJQW50YXJjdGljYS9DYXNleQlDYXNleSBTdGF0aW9uLCBCYWlsZXkgUGVuaW5zdWxhCiBBUQktNzgyNCsxMDY1NAlBbnRhcmN0aWNhL1Zvc3RvawlWb3N0b2sgU3RhdGlvbiwgTGFrZSBWb3N0b2sKLUFRCS02NjQwKzE0MDAxCUFudGFyY3RpY2EvRHVtb250RFVydmlsbGUJRHVtb250LWQnVXJ2aWxsZSBTdGF0aW9uLCBUZXJyZSBBZGVsaWUKK0FRCS02NjQwKzE0MDAxCUFudGFyY3RpY2EvRHVtb250RFVydmlsbGUJRHVtb250LWQnVXJ2aWxsZSBTdGF0aW9uLCBBZGVsaWUgTGFuZAogQVEJLTY5MDAyMiswMzkzNTI0CUFudGFyY3RpY2EvU3lvd2EJU3lvd2EgU3RhdGlvbiwgRSBPbmd1bCBJCiBBUQktNzIwMDQxKzAwMjMyMDYJQW50YXJjdGljYS9Ucm9sbAlUcm9sbCBTdGF0aW9uLCBRdWVlbiBNYXVkIExhbmQKIEFSCS0zNDM2LTA1ODI3CUFtZXJpY2EvQXJnZW50aW5hL0J1ZW5vc19BaXJlcwlCdWVub3MgQWlyZXMgKEJBLCBDRikKQEAgLTE1MSw3ICsxMzksNyBAQAogQ0EJKzQ4MjMtMDg5MTUJQW1lcmljYS9UaHVuZGVyX0JheQlFYXN0ZXJuIFRpbWUgLSBUaHVuZGVyIEJheSwgT250YXJpbwogQ0EJKzYzNDQtMDY4MjgJQW1lcmljYS9JcWFsdWl0CUVhc3Rlcm4gVGltZSAtIGVhc3QgTnVuYXZ1dCAtIG1vc3QgbG9jYXRpb25zCiBDQQkrNjYwOC0wNjU0NAlBbWVyaWNhL1BhbmduaXJ0dW5nCUVhc3Rlcm4gVGltZSAtIFBhbmduaXJ0dW5nLCBOdW5hdnV0Ci1DQQkrNzQ0MTQ0LTA5NDQ5NDUJQW1lcmljYS9SZXNvbHV0ZQlDZW50cmFsIFN0YW5kYXJkIFRpbWUgLSBSZXNvbHV0ZSwgTnVuYXZ1dAorQ0EJKzc0NDE0NC0wOTQ0OTQ1CUFtZXJpY2EvUmVzb2x1dGUJQ2VudHJhbCBUaW1lIC0gUmVzb2x1dGUsIE51bmF2dXQKIENBCSs0ODQ1MzEtMDkxMzcxOAlBbWVyaWNhL0F0aWtva2FuCUVhc3Rlcm4gU3RhbmRhcmQgVGltZSAtIEF0aWtva2FuLCBPbnRhcmlvIGFuZCBTb3V0aGFtcHRvbiBJLCBOdW5hdnV0CiBDQQkrNjI0OTAwLTA5MjA0NTkJQW1lcmljYS9SYW5raW5fSW5sZXQJQ2VudHJhbCBUaW1lIC0gY2VudHJhbCBOdW5hdnV0CiBDQQkrNDk1My0wOTcwOQlBbWVyaWNhL1dpbm5pcGVnCUNlbnRyYWwgVGltZSAtIE1hbml0b2JhICYgd2VzdCBPbnRhcmlvCkBAIC0xNzYsMTMgKzE2NCwxMCBAQAogQ0kJKzA1MTktMDA0MDIJQWZyaWNhL0FiaWRqYW4KIENLCS0yMTE0LTE1OTQ2CVBhY2lmaWMvUmFyb3RvbmdhCiBDTAktMzMyNy0wNzA0MAlBbWVyaWNhL1NhbnRpYWdvCW1vc3QgbG9jYXRpb25zCi1DTAktMjcwOS0xMDkyNglQYWNpZmljL0Vhc3RlcglFYXN0ZXIgSXNsYW5kICYgU2FsYSB5IEdvbWV6CitDTAktMjcwOS0xMDkyNglQYWNpZmljL0Vhc3RlcglFYXN0ZXIgSXNsYW5kCiBDTQkrMDQwMyswMDk0MglBZnJpY2EvRG91YWxhCi1DTgkrMzExNCsxMjEyOAlBc2lhL1NoYW5naGFpCWVhc3QgQ2hpbmEgLSBCZWlqaW5nLCBHdWFuZ2RvbmcsIFNoYW5naGFpLCBldGMuCi1DTgkrNDU0NSsxMjY0MQlBc2lhL0hhcmJpbglIZWlsb25namlhbmcgKGV4Y2VwdCBNb2hlKSwgSmlsaW4KLUNOCSsyOTM0KzEwNjM1CUFzaWEvQ2hvbmdxaW5nCWNlbnRyYWwgQ2hpbmEgLSBTaWNodWFuLCBZdW5uYW4sIEd1YW5neGksIFNoYWFueGksIEd1aXpob3UsIGV0Yy4KLUNOCSs0MzQ4KzA4NzM1CUFzaWEvVXJ1bXFpCW1vc3Qgb2YgVGliZXQgJiBYaW5qaWFuZwotQ04JKzM5MjkrMDc1NTkJQXNpYS9LYXNoZ2FyCXdlc3QgVGliZXQgJiBYaW5qaWFuZworQ04JKzMxMTQrMTIxMjgJQXNpYS9TaGFuZ2hhaQlCZWlqaW5nIFRpbWUKK0NOCSs0MzQ4KzA4NzM1CUFzaWEvVXJ1bXFpCVhpbmppYW5nIFRpbWUKIENPCSswNDM2LTA3NDA1CUFtZXJpY2EvQm9nb3RhCiBDUgkrMDk1Ni0wODQwNQlBbWVyaWNhL0Nvc3RhX1JpY2EKIENVCSsyMzA4LTA4MjIyCUFtZXJpY2EvSGF2YW5hCkBAIC0zNjQsMjQgKzM0OSwyNiBAQAogUk8JKzQ0MjYrMDI2MDYJRXVyb3BlL0J1Y2hhcmVzdAogUlMJKzQ0NTArMDIwMzAJRXVyb3BlL0JlbGdyYWRlCiBSVQkrNTQ0MyswMjAzMAlFdXJvcGUvS2FsaW5pbmdyYWQJTW9zY293LTAxIC0gS2FsaW5pbmdyYWQKLVJVCSs1NTQ1KzAzNzM1CUV1cm9wZS9Nb3Njb3cJTW9zY293KzAwIC0gd2VzdCBSdXNzaWEKLVJVCSs0ODQ0KzA0NDI1CUV1cm9wZS9Wb2xnb2dyYWQJTW9zY293KzAwIC0gQ2FzcGlhbiBTZWEKLVJVCSs1MzEyKzA1MDA5CUV1cm9wZS9TYW1hcmEJTW9zY293KzAwIC0gU2FtYXJhLCBVZG11cnRpYQorUlUJKzU1NDUyMSswMzczNzA0CUV1cm9wZS9Nb3Njb3cJTW9zY293KzAwIC0gd2VzdCBSdXNzaWEKIFJVCSs0NDU3KzAzNDA2CUV1cm9wZS9TaW1mZXJvcG9sCU1vc2NvdyswMCAtIENyaW1lYQorUlUJKzQ4NDQrMDQ0MjUJRXVyb3BlL1ZvbGdvZ3JhZAlNb3Njb3crMDAgLSBDYXNwaWFuIFNlYQorUlUJKzUzMTIrMDUwMDkJRXVyb3BlL1NhbWFyYQlNb3Njb3crMDAgKE1vc2NvdyswMSBhZnRlciAyMDE0LTEwLTI2KSAtIFNhbWFyYSwgVWRtdXJ0aWEKIFJVCSs1NjUxKzA2MDM2CUFzaWEvWWVrYXRlcmluYnVyZwlNb3Njb3crMDIgLSBVcmFscwogUlUJKzU1MDArMDczMjQJQXNpYS9PbXNrCU1vc2NvdyswMyAtIHdlc3QgU2liZXJpYQogUlUJKzU1MDIrMDgyNTUJQXNpYS9Ob3Zvc2liaXJzawlNb3Njb3crMDMgLSBOb3Zvc2liaXJzawotUlUJKzUzNDUrMDg3MDcJQXNpYS9Ob3Zva3V6bmV0c2sJTW9zY293KzAzIC0gTm92b2t1em5ldHNrCitSVQkrNTM0NSswODcwNwlBc2lhL05vdm9rdXpuZXRzawlNb3Njb3crMDMgKE1vc2NvdyswNCBhZnRlciAyMDE0LTEwLTI2KSAtIEtlbWVyb3ZvCiBSVQkrNTYwMSswOTI1MAlBc2lhL0tyYXNub3lhcnNrCU1vc2NvdyswNCAtIFllbmlzZWkgUml2ZXIKIFJVCSs1MjE2KzEwNDIwCUFzaWEvSXJrdXRzawlNb3Njb3crMDUgLSBMYWtlIEJhaWthbAorUlUJKzUyMDMrMTEzMjgJQXNpYS9DaGl0YQlNb3Njb3crMDYgKE1vc2NvdyswNSBhZnRlciAyMDE0LTEwLTI2KSAtIFphYmF5a2Fsc2t5CiBSVQkrNjIwMCsxMjk0MAlBc2lhL1lha3V0c2sJTW9zY293KzA2IC0gTGVuYSBSaXZlcgogUlUJKzYyMzkyMysxMzUzMzE0CUFzaWEvS2hhbmR5Z2EJTW9zY293KzA2IC0gVG9tcG9uc2t5LCBVc3QtTWF5c2t5CiBSVQkrNDMxMCsxMzE1NglBc2lhL1ZsYWRpdm9zdG9rCU1vc2NvdyswNyAtIEFtdXIgUml2ZXIKIFJVCSs0NjU4KzE0MjQyCUFzaWEvU2FraGFsaW4JTW9zY293KzA3IC0gU2FraGFsaW4gSXNsYW5kCiBSVQkrNjQzMzM3KzE0MzEzMzYJQXNpYS9Vc3QtTmVyYQlNb3Njb3crMDcgLSBPeW15YWtvbnNreQotUlUJKzU5MzQrMTUwNDgJQXNpYS9NYWdhZGFuCU1vc2NvdyswOCAtIE1hZ2FkYW4KLVJVCSs1MzAxKzE1ODM5CUFzaWEvS2FtY2hhdGthCU1vc2NvdyswOCAtIEthbWNoYXRrYQotUlUJKzY0NDUrMTc3MjkJQXNpYS9BbmFkeXIJTW9zY293KzA4IC0gQmVyaW5nIFNlYQorUlUJKzU5MzQrMTUwNDgJQXNpYS9NYWdhZGFuCU1vc2NvdyswOCAoTW9zY293KzA3IGFmdGVyIDIwMTQtMTAtMjYpIC0gTWFnYWRhbgorUlUJKzY3MjgrMTUzNDMJQXNpYS9TcmVkbmVrb2x5bXNrCU1vc2NvdyswOCAtIEUgU2FraGEsIE4gS3VyaWwgSXMKK1JVCSs1MzAxKzE1ODM5CUFzaWEvS2FtY2hhdGthCU1vc2NvdyswOCAoTW9zY293KzA5IGFmdGVyIDIwMTQtMTAtMjYpIC0gS2FtY2hhdGthCitSVQkrNjQ0NSsxNzcyOQlBc2lhL0FuYWR5cglNb3Njb3crMDggKE1vc2NvdyswOSBhZnRlciAyMDE0LTEwLTI2KSAtIEJlcmluZyBTZWEKIFJXCS0wMTU3KzAzMDA0CUFmcmljYS9LaWdhbGkKIFNBCSsyNDM4KzA0NjQzCUFzaWEvUml5YWRoCiBTQgktMDkzMisxNjAxMglQYWNpZmljL0d1YWRhbGNhbmFsCkBAIC00NDgsMTMgKzQzNSwxMyBAQAogVVMJKzQzMzY0OS0xMTYxMjA5CUFtZXJpY2EvQm9pc2UJTW91bnRhaW4gVGltZSAtIHNvdXRoIElkYWhvICYgZWFzdCBPcmVnb24KIFVTCSszMzI2NTQtMTEyMDQyNAlBbWVyaWNhL1Bob2VuaXgJTW91bnRhaW4gU3RhbmRhcmQgVGltZSAtIEFyaXpvbmEgKGV4Y2VwdCBOYXZham8pCiBVUwkrMzQwMzA4LTExODE0MzQJQW1lcmljYS9Mb3NfQW5nZWxlcwlQYWNpZmljIFRpbWUKK1VTCSs1NTA3MzctMTMxMzQzNQlBbWVyaWNhL01ldGxha2F0bGEJUGFjaWZpYyBTdGFuZGFyZCBUaW1lIC0gQW5uZXR0ZSBJc2xhbmQsIEFsYXNrYQogVVMJKzYxMTMwNS0xNDk1NDAxCUFtZXJpY2EvQW5jaG9yYWdlCUFsYXNrYSBUaW1lCiBVUwkrNTgxODA3LTEzNDI1MTEJQW1lcmljYS9KdW5lYXUJQWxhc2thIFRpbWUgLSBBbGFza2EgcGFuaGFuZGxlCiBVUwkrNTcxMDM1LTEzNTE4MDcJQW1lcmljYS9TaXRrYQlBbGFza2EgVGltZSAtIHNvdXRoZWFzdCBBbGFza2EgcGFuaGFuZGxlCiBVUwkrNTkzMjQ5LTEzOTQzMzgJQW1lcmljYS9ZYWt1dGF0CUFsYXNrYSBUaW1lIC0gQWxhc2thIHBhbmhhbmRsZSBuZWNrCiBVUwkrNjQzMDA0LTE2NTI0MjMJQW1lcmljYS9Ob21lCUFsYXNrYSBUaW1lIC0gd2VzdCBBbGFza2EKIFVTCSs1MTUyNDgtMTc2MzkyOQlBbWVyaWNhL0FkYWsJQWxldXRpYW4gSXNsYW5kcwotVVMJKzU1MDczNy0xMzEzNDM1CUFtZXJpY2EvTWV0bGFrYXRsYQlNZXRsYWthdGxhIFRpbWUgLSBBbm5ldHRlIElzbGFuZAogVVMJKzIxMTgyNS0xNTc1MTMwCVBhY2lmaWMvSG9ub2x1bHUJSGF3YWlpCiBVWQktMzQ1My0wNTYxMQlBbWVyaWNhL01vbnRldmlkZW8KIFVaCSszOTQwKzA2NjQ4CUFzaWEvU2FtYXJrYW5kCXdlc3QgVXpiZWtpc3RhbgpkaWZmIC0tZ2l0IGEvdGVzdC9zdW4vdXRpbC9yZXNvdXJjZXMvVGltZVpvbmUvQnVnNjMxNzkyOS5qYXZhIGIvdGVzdC9zdW4vdXRpbC9yZXNvdXJjZXMvVGltZVpvbmUvQnVnNjMxNzkyOS5qYXZhCmluZGV4IDRiMDQ3YzUuLjFjNTk4OTYgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3VuL3V0aWwvcmVzb3VyY2VzL1RpbWVab25lL0J1ZzYzMTc5MjkuamF2YQorKysgYi90ZXN0L3N1bi91dGlsL3Jlc291cmNlcy9UaW1lWm9uZS9CdWc2MzE3OTI5LmphdmEKQEAgLTEyMiwxMSArMTIyLDExIEBACiAgICAgICAgIFRpbWVab25lIEN1cnJpZSA9IFRpbWVab25lLmdldFRpbWVab25lKCJBdXN0cmFsaWEvQ3VycmllIik7CiAgICAgICAgIHR6TG9jYWxlID0gbG9jYWxlczJUZXN0WzBdOwogICAgICAgICBpZiAoIUN1cnJpZS5nZXREaXNwbGF5TmFtZShmYWxzZSwgVGltZVpvbmUuTE9ORywgdHpMb2NhbGUpLmVxdWFscwotICAgICAgICAgICAoIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoTmV3IFNvdXRoIFdhbGVzKSIpKQorICAgICAgICAgICAoIkF1c3RyYWxpYW4gRWFzdGVybiBTdGFuZGFyZCBUaW1lIChOZXcgU291dGggV2FsZXMpIikpCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiXG4iICsgdHpMb2NhbGUgKyAiOiBMT05HLCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tZGF5bGlnaHQgc2F2aW5nIG5hbWUgZm9yICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1c3RyYWxpYS9DdXJyaWUgc2hvdWxkIGJlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiRWFzdGVybiBTdGFuZGFyZCBUaW1lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiQXVzdHJhbGlhbiBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE5ldyBTb3V0aCBXYWxlcylcIiIpOwogICAgICAgICB0ekxvY2FsZSA9IGxvY2FsZXMyVGVzdFsxXTsKICAgICAgICAgaWYgKCFDdXJyaWUuZ2V0RGlzcGxheU5hbWUoZmFsc2UsIFRpbWVab25lLkxPTkcsIHR6TG9jYWxlKS5lcXVhbHMK