ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMvcG9tLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMvcG9tLnhtbAppbmRleCBmOTZjMzdmLi5lNDI0Yzk2IDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzL3BvbS54bWwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy9wb20ueG1sCkBAIC0yNSw2ICsyNSwxNCBAQAogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CiAgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHljaG8tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8dGVzdENsYXNzPm9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLio8L3Rlc3RDbGFzcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDxwbHVnaW4+CiAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudHljaG88L2dyb3VwSWQ+CiAgICAgICAgPGFydGlmYWN0SWQ+dGFyZ2V0LXBsYXRmb3JtLWNvbmZpZ3VyYXRpb248L2FydGlmYWN0SWQ+CiAgICAgICAgPGNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2h0dHAvc2VydmxldC90ZXN0YmFzZS9CYXNlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9odHRwL3NlcnZsZXQvdGVzdGJhc2UvQmFzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc3ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9odHRwL3NlcnZsZXQvdGVzdGJhc2UvQmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDMyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNiBSYXltb25kIEF1Z+kuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBSYXltb25kIEF1Z+kgPHJheW1vbmQuYXVnZUBsaWZlcmF5LmNvbT4gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RiYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC5jb250ZXh0LkNvbnRleHRQYXRoQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy5idW5kbGUuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLmJ1bmRsZS5CdW5kbGVBZHZpc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLmJ1bmRsZS5CdW5kbGVJbnN0YWxsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMudXRpbC5TZXJ2bGV0UmVxdWVzdEFkdmlzb3I7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VGYWN0b3J5OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVnaXN0cmF0aW9uOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5IdHRwU2VydmljZTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmh0dHAuY29udGV4dC5TZXJ2bGV0Q29udGV4dEhlbHBlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIEJhc2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gUXVpZXQgbG9nZ2luZyBmb3IgdGVzdHMKKwkJU3lzdGVtLnNldFByb3BlcnR5KCIvLkxFVkVMIiwgIk9GRiIpOworCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5MRVZFTCIsICJPRkYiKTsKKwkJU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LkxFVkVMIiwgIk9GRiIpOworCisJCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLm9zZ2kuc2VydmljZS5odHRwLnBvcnQiLCAiODA5MCIpOworCQlCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQgPSBnZXRCdW5kbGVDb250ZXh0KCk7CisJCWluc3RhbGxlciA9IG5ldyBCdW5kbGVJbnN0YWxsZXIoVEVTVF9CVU5ETEVTX0JJTkFSWV9ESVJFQ1RPUlksIGJ1bmRsZUNvbnRleHQpOworCQlhZHZpc29yID0gbmV3IEJ1bmRsZUFkdmlzb3IoYnVuZGxlQ29udGV4dCk7CisJCVN0cmluZyBwb3J0ID0gZ2V0UG9ydCgpOworCQlTdHJpbmcgY29udGV4dFBhdGggPSBnZXRDb250ZXh0UGF0aCgpOworCQlyZXF1ZXN0QWR2aXNvciA9IG5ldyBTZXJ2bGV0UmVxdWVzdEFkdmlzb3IocG9ydCwgY29udGV4dFBhdGgpOworCQlzdGFydEJ1bmRsZXMoKTsKKwkJc3RvcEpldHR5KCk7CisJCXN0YXJ0SmV0dHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlmb3IgKFNlcnZpY2VSZWdpc3RyYXRpb248PyBleHRlbmRzIE9iamVjdD4gc2VydmljZVJlZ2lzdHJhdGlvbiA6IHJlZ2lzdHJhdGlvbnMpIHsKKwkJCXNlcnZpY2VSZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOworCQl9CisJCXN0b3BKZXR0eSgpOworCQlzdG9wQnVuZGxlcygpOworCQlyZXF1ZXN0QWR2aXNvciA9IG51bGw7CisJCWFkdmlzb3IgPSBudWxsOworCQlyZWdpc3RyYXRpb25zLmNsZWFyKCk7CisJCXRyeSB7CisJCQlpbnN0YWxsZXIuc2h1dGRvd24oKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWluc3RhbGxlciA9IG51bGw7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGRvUmVxdWVzdChTdHJpbmcgYWN0aW9uLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRvUmVxdWVzdEdldFJlc3BvbnNlKGFjdGlvbiwgcGFyYW1zKS5nZXQoInJlc3BvbnNlQm9keSIpLmdldCgwKTsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBkb1JlcXVlc3RHZXRSZXNwb25zZShTdHJpbmcgYWN0aW9uLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nQnVpbGRlciByZXF1ZXN0SW5mbyA9IG5ldyBTdHJpbmdCdWlsZGVyKFBST1RPVFlQRSk7CisJCXJlcXVlc3RJbmZvLmFwcGVuZChhY3Rpb24pOworCQlpZiAoIXBhcmFtcy5pc0VtcHR5KCkpIHsKKwkJCWJvb2xlYW4gZmlyc3RQYXJhbSA9IHRydWU7CisJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcGFyYW0gOiBwYXJhbXMuZW50cnlTZXQoKSkgeworCQkJCWlmIChmaXJzdFBhcmFtKSB7CisJCQkJCXJlcXVlc3RJbmZvLmFwcGVuZCgnPycpOworCQkJCQlmaXJzdFBhcmFtID0gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVxdWVzdEluZm8uYXBwZW5kKCcmJyk7CisJCQkJfQorCQkJCXJlcXVlc3RJbmZvLmFwcGVuZChwYXJhbS5nZXRLZXkoKSk7CisJCQkJcmVxdWVzdEluZm8uYXBwZW5kKCc9Jyk7CisJCQkJcmVxdWVzdEluZm8uYXBwZW5kKHBhcmFtLmdldFZhbHVlKCkpOworCQkJfQorCQl9CisJCXJldHVybiByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KHJlcXVlc3RJbmZvLnRvU3RyaW5nKCksIG51bGwpOworCX0KKworCXByb3RlY3RlZCBCdW5kbGVDb250ZXh0IGdldEJ1bmRsZUNvbnRleHQoKSB7CisJCXJldHVybiBBY3RpdmF0b3IuZ2V0QnVuZGxlQ29udGV4dCgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisJCXJldHVybiBnZXRKZXR0eVByb3BlcnR5KCJjb250ZXh0LnBhdGgiLCAiIik7CisJfQorCisJcHJvdGVjdGVkIEh0dHBTZXJ2aWNlIGdldEh0dHBTZXJ2aWNlKCkgeworCQlTZXJ2aWNlUmVmZXJlbmNlPEh0dHBTZXJ2aWNlPiBzZXJ2aWNlUmVmZXJlbmNlID0gZ2V0QnVuZGxlQ29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoSHR0cFNlcnZpY2UuY2xhc3MpOworCQlyZXR1cm4gZ2V0QnVuZGxlQ29udGV4dCgpLmdldFNlcnZpY2Uoc2VydmljZVJlZmVyZW5jZSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRKZXR0eVByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKwkJU3RyaW5nIHF1YWxpZmllZEtleSA9IEpFVFRZX1BST1BFUlRZX1BSRUZJWCArIGtleTsKKwkJU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkocXVhbGlmaWVkS2V5KTsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXZhbHVlID0gZGVmYXVsdFZhbHVlOworCQl9CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFBvcnQoKSB7CisJCVN0cmluZyBkZWZhdWx0UG9ydCA9IGdldFByb3BlcnR5KE9TR0lfSFRUUF9QT1JUX1BST1BFUlRZKTsKKwkJaWYgKGRlZmF1bHRQb3J0ID09IG51bGwpIHsKKwkJCWRlZmF1bHRQb3J0ID0gIjgwIjsKKwkJfQorCQlyZXR1cm4gZ2V0SmV0dHlQcm9wZXJ0eSgicG9ydCIsIGRlZmF1bHRQb3J0KTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKKwkJQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOworCQlTdHJpbmcgdmFsdWUgPSBidW5kbGVDb250ZXh0LmdldFByb3BlcnR5KGtleSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgQnVuZGxlIGluc3RhbGxCdW5kbGUoU3RyaW5nIGJ1bmRsZSkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7CisJCXJldHVybiBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZShidW5kbGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHN0YXJ0QnVuZGxlcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24geworCQlmb3IgKFN0cmluZyBidW5kbGUgOiBCVU5ETEVTKSB7CisJCQlhZHZpc29yLnN0YXJ0QnVuZGxlKGJ1bmRsZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzdGFydEpldHR5KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7CisJCWFkdmlzb3Iuc3RhcnRCdW5kbGUoRVFVSU5PWF9KRVRUWV9CVU5ETEUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHN0b3BCdW5kbGVzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7CisJCWZvciAoaW50IGkgPSBCVU5ETEVTLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlTdHJpbmcgYnVuZGxlID0gQlVORExFU1tpXTsKKwkJCWFkdmlzb3Iuc3RvcEJ1bmRsZShidW5kbGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc3RvcEpldHR5KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7CisJCWFkdmlzb3Iuc3RvcEJ1bmRsZShFUVVJTk9YX0pFVFRZX0JVTkRMRSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24geworCQlpbnN0YWxsZXIudW5pbnN0YWxsQnVuZGxlKGJ1bmRsZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJb3V0cHV0U3RyZWFtLndyaXRlKHN0cmluZy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9UWVBFID0gInByb3RvdHlwZS8iOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSRSA9ICJjb25maWd1cmUiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOUkVHSVNURVIgPSAidW5yZWdpc3RlciI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiZXJyb3IiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19QQVJBTSA9ICJzZXJ2bGV0LmluaXQuc3RhdHVzIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BST1RPVFlQRV9OQU1FID0gInRlc3QucHJvdG90eXBlLm5hbWUiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFUSF9DVVNUT01JWkVSX05BTUUgPSAidGVzdC5wYXRoLmN1c3RvbWl6ZXIubmFtZSI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FUlJPUl9DT0RFID0gInRlc3QuZXJyb3IuY29kZSI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVJTk9YX0RTX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmRzIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVJTk9YX0pFVFRZX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHkiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpFVFRZX1BST1BFUlRZX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHkuIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPU0dJX0hUVFBfUE9SVF9QUk9QRVJUWSA9ICJvcmcub3NnaS5zZXJ2aWNlLmh0dHAucG9ydCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX09LID0gIk9LIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JVTkRMRVNfQklOQVJZX0RJUkVDVE9SWSA9ICIvYnVuZGxlc19iaW4vIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JVTkRMRV8xID0gInRiMSI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJVTkRMRVMgPSBuZXcgU3RyaW5nW10geworCQlFUVVJTk9YX0RTX0JVTkRMRQorCX07CisKKwlwcm90ZWN0ZWQgQnVuZGxlSW5zdGFsbGVyIGluc3RhbGxlcjsKKwlwcm90ZWN0ZWQgQnVuZGxlQWR2aXNvciBhZHZpc29yOworCXByb3RlY3RlZCBTZXJ2bGV0UmVxdWVzdEFkdmlzb3IgcmVxdWVzdEFkdmlzb3I7CisJcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248U2VydmljZVJlZ2lzdHJhdGlvbjw/IGV4dGVuZHMgT2JqZWN0Pj4gcmVnaXN0cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZVJlZ2lzdHJhdGlvbjw/IGV4dGVuZHMgT2JqZWN0Pj4oKTsKKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisJCUF0b21pY0ludGVnZXIgY2FsbGVkID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKwkJcHVibGljIFRlc3RGaWx0ZXIoKSB7fQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwkJCS8vIG5vdGhpbmcKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKQorCQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisJCQljYWxsZWQuaW5jcmVtZW50QW5kR2V0KCk7CisJCQljaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKwkJCS8vIG5vdGhpbmcKKwkJfQorCisJCXB1YmxpYyB2b2lkIGNsZWFyKCkgeworCQkJY2FsbGVkLnNldCgwKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGdldENhbGxlZCgpIHsKKwkJCXJldHVybiBjYWxsZWQuZ2V0KCkgPj0gMTsKKwkJfQorCisJCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisJCQlyZXR1cm4gY2FsbGVkLmdldCgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0U2VydmxldENvbnRleHRIZWxwZXJGYWN0b3J5IGltcGxlbWVudHMgU2VydmljZUZhY3Rvcnk8U2VydmxldENvbnRleHRIZWxwZXI+IHsKKwkJc3RhdGljIGNsYXNzIFRlc3RTZXJ2bGV0Q29udGV4dEhlbHBlciBleHRlbmRzIFNlcnZsZXRDb250ZXh0SGVscGVyIHsKKwkJCXB1YmxpYyBUZXN0U2VydmxldENvbnRleHRIZWxwZXIoQnVuZGxlIGJ1bmRsZSkgeworCQkJCXN1cGVyKGJ1bmRsZSk7CisJCQl9fTsKKworCQlwdWJsaWMgVGVzdFNlcnZsZXRDb250ZXh0SGVscGVyRmFjdG9yeSgpIHt9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTZXJ2bGV0Q29udGV4dEhlbHBlciBnZXRTZXJ2aWNlKEJ1bmRsZSBidW5kbGUsIFNlcnZpY2VSZWdpc3RyYXRpb248U2VydmxldENvbnRleHRIZWxwZXI+IHJlZ2lzdHJhdGlvbikgeworCQkJcmV0dXJuIG5ldyBUZXN0U2VydmxldENvbnRleHRIZWxwZXIoYnVuZGxlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCB1bmdldFNlcnZpY2UoQnVuZGxlIGJ1bmRsZSwgU2VydmljZVJlZ2lzdHJhdGlvbjxTZXJ2bGV0Q29udGV4dEhlbHBlcj4gcmVnaXN0cmF0aW9uLAorCQkJCVNlcnZsZXRDb250ZXh0SGVscGVyIHNlcnZpY2UpIHsKKwkJCS8vIG5vdGhpbmcKKwkJfQorCisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0Q29udGV4dFBhdGhBZGFwdG9yIGV4dGVuZHMgQ29udGV4dFBhdGhDdXN0b21pemVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdEZpbHRlcjsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGV4dFByZWZpeDsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGVzdE5hbWU7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBkZWZhdWx0RmlsdGVyCisJCSAqIEBwYXJhbSBjb250ZXh0UHJlZml4CisJCSAqLworCQlwdWJsaWMgVGVzdENvbnRleHRQYXRoQWRhcHRvcihTdHJpbmcgZGVmYXVsdEZpbHRlciwgU3RyaW5nIGNvbnRleHRQcmVmaXgsIFN0cmluZyB0ZXN0TmFtZSkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuZGVmYXVsdEZpbHRlciA9IGRlZmF1bHRGaWx0ZXI7CisJCQl0aGlzLmNvbnRleHRQcmVmaXggPSBjb250ZXh0UHJlZml4OworCQkJdGhpcy50ZXN0TmFtZSA9IHRlc3ROYW1lOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHRTZWxlY3RGaWx0ZXIoU2VydmljZVJlZmVyZW5jZTw/PiBodHRwV2hpdGVCb2FyZFNlcnZpY2UpIHsKKwkJCWlmICh0ZXN0TmFtZS5lcXVhbHMoaHR0cFdoaXRlQm9hcmRTZXJ2aWNlLmdldFByb3BlcnR5KCJzZXJ2bGV0LmluaXQuIiArIFRFU1RfUEFUSF9DVVNUT01JWkVSX05BTUUpKSkgeworCQkJCXJldHVybiBkZWZhdWx0RmlsdGVyOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aFByZWZpeChTZXJ2aWNlUmVmZXJlbmNlPFNlcnZsZXRDb250ZXh0SGVscGVyPiBoZWxwZXIpIHsKKwkJCWlmICh0ZXN0TmFtZS5lcXVhbHMoaGVscGVyLmdldFByb3BlcnR5KFRFU1RfUEFUSF9DVVNUT01JWkVSX05BTUUpKSkgeworCQkJCXJldHVybiBjb250ZXh0UHJlZml4OworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRXJyb3JTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXR7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCQlwcml2YXRlIGZpbmFsIFN0cmluZyBlcnJvckNvZGU7CisKKwkJcHVibGljIEVycm9yU2VydmxldChTdHJpbmcgZXJyb3JDb2RlKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5lcnJvckNvZGUgPSBlcnJvckNvZGU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgc2VydmljZSgKKwkJCQlIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKwkJCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uICxJT0V4Y2VwdGlvbiB7CisKKwkJCWlmIChyZXNwb25zZS5pc0NvbW1pdHRlZCgpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtPyIpOworCisJCQkJcmV0dXJuOworCQkJfQorCisJCQlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworCQkJU3RyaW5nIHJlcXVlc3RVUkkgPSAoU3RyaW5nKXJlcXVlc3QuZ2V0QXR0cmlidXRlKFJlcXVlc3REaXNwYXRjaGVyLkVSUk9SX1JFUVVFU1RfVVJJKTsKKwkJCUludGVnZXIgc3RhdHVzID0gKEludGVnZXIpcmVxdWVzdC5nZXRBdHRyaWJ1dGUoUmVxdWVzdERpc3BhdGNoZXIuRVJST1JfU1RBVFVTX0NPREUpOworCisJCQl3cml0ZXIucHJpbnQoZXJyb3JDb2RlICsgIiA6ICIgKyBzdGF0dXMgKyAiIDogRVJST1IgOiAiICsgcmVxdWVzdFVSSSk7CisJCX0KKworCX07CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2h0dHAvc2VydmxldC90ZXN0cy9EaXNwYXRjaGluZ1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaHR0cC9zZXJ2bGV0L3Rlc3RzL0Rpc3BhdGNoaW5nVGVzdC5qYXZhCmluZGV4IDI0NzFiMTcuLjU5NjY5ODMgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaHR0cC9zZXJ2bGV0L3Rlc3RzL0Rpc3BhdGNoaW5nVGVzdC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaHR0cC9zZXJ2bGV0L3Rlc3RzL0Rpc3BhdGNoaW5nVGVzdC5qYXZhCkBAIC0xMiwxNyArMTIsMTAgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuRGlzcGF0Y2hlclR5cGU7CkBAIC0zNyw3MCArMzAsMTggQEAKIGltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC5jb250ZXh0LkNvbnRleHRQYXRoQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy5TZXJ2bGV0VGVzdC5UZXN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLmJ1bmRsZS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMuYnVuZGxlLkJ1bmRsZUFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMuYnVuZGxlLkJ1bmRsZUluc3RhbGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0YmFzZS5CYXNlVGVzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy51dGlsLkJhc2VTZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLnV0aWwuU2VydmxldFJlcXVlc3RBZHZpc29yOwotCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIAotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWdpc3RyYXRpb247CiBpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLkh0dHBDb250ZXh0OwogaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5IdHRwU2VydmljZTsKIGltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmh0dHAuY29udGV4dC5TZXJ2bGV0Q29udGV4dEhlbHBlcjsKIGltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmh0dHAud2hpdGVib2FyZC5IdHRwV2hpdGVib2FyZENvbnN0YW50czsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIERpc3BhdGNoaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFF1aWV0IGxvZ2dpbmcgZm9yIHRlc3RzCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiLy5MRVZFTCIsICJPRkYiKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuTEVWRUwiLCAiT0ZGIik7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5MRVZFTCIsICJPRkYiKTsKLQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5wb3J0IiwgIjgwOTAiKTsKLQkJQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlpbnN0YWxsZXIgPSBuZXcgQnVuZGxlSW5zdGFsbGVyKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFU19CSU5BUllfRElSRUNUT1JZLCBidW5kbGVDb250ZXh0KTsKLQkJYWR2aXNvciA9IG5ldyBCdW5kbGVBZHZpc29yKGJ1bmRsZUNvbnRleHQpOwotCQlTdHJpbmcgcG9ydCA9IGdldFBvcnQoKTsKLQkJU3RyaW5nIGNvbnRleHRQYXRoID0gZ2V0Q29udGV4dFBhdGgoKTsKLQkJcmVxdWVzdEFkdmlzb3IgPSBuZXcgU2VydmxldFJlcXVlc3RBZHZpc29yKHBvcnQsIGNvbnRleHRQYXRoKTsKLQkJc3RhcnRCdW5kbGVzKCk7Ci0JCXN0b3BKZXR0eSgpOwotCQlzdGFydEpldHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChTZXJ2aWNlUmVnaXN0cmF0aW9uPD8gZXh0ZW5kcyBPYmplY3Q+IHNlcnZpY2VSZWdpc3RyYXRpb24gOiByZWdpc3RyYXRpb25zKSB7Ci0JCQlzZXJ2aWNlUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJfQotCQlzdG9wSmV0dHkoKTsKLQkJc3RvcEJ1bmRsZXMoKTsKLQkJcmVxdWVzdEFkdmlzb3IgPSBudWxsOwotCQlhZHZpc29yID0gbnVsbDsKLQkJcmVnaXN0cmF0aW9ucy5jbGVhcigpOwotCQl0cnkgewotCQkJaW5zdGFsbGVyLnNodXRkb3duKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbnN0YWxsZXIgPSBudWxsOwotCQl9Ci0JfQorcHVibGljIGNsYXNzIERpc3BhdGNoaW5nVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKIAogCXB1YmxpYyB2b2lkIHRlc3RfZm9yd2FyZERlcHRoMSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTZXJ2bGV0IHNlcnZsZXQxID0gbmV3IEJhc2VTZXJ2bGV0KCkgewpAQCAtMTE0LDYgKzU1LDcgQEAKIAkJfTsKIAogCQlTZXJ2bGV0IHNlcnZsZXQyID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZSgKQEAgLTE3Nyw2ICsxMTksNyBAQAogCQl9OwogCiAJCVNlcnZsZXQgc2VydmxldDIgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKApAQCAtMjY0LDYgKzIwNyw3IEBACiAJCX07CiAKIAkJU2VydmxldCBzZXJ2bGV0MiA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoCkBAIC0zNjEsNiArMzA1LDcgQEAKIAkJfTsKIAogCQlTZXJ2bGV0IHNlcnZsZXQzID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZSgKQEAgLTQ0OSw2ICszOTQsNyBAQAogCQl9OwogCiAJCVNlcnZsZXQgc2VydmxldDQgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKApAQCAtNjk3LDYgKzY0Myw3IEBACiAJCX07CiAKIAkJU2VydmxldCBzZXJ2bGV0MiA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoCkBAIC03NjAsNiArNzA3LDcgQEAKIAkJfTsKIAogCQlTZXJ2bGV0IHNlcnZsZXQyID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZSgKQEAgLTg0Nyw2ICs3OTUsNyBAQAogCQl9OwogCiAJCVNlcnZsZXQgc2VydmxldDIgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKApAQCAtOTI0LDYgKzg3Myw3IEBACiAKIAlwdWJsaWMgdm9pZCB0ZXN0X2luY2x1ZGVCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewogCQlTZXJ2bGV0IHNlcnZsZXQ4ID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKQEAgLTkzOCw2ICs4ODgsNyBAQAogCQl9OwogCiAJCVNlcnZsZXQgc2VydmxldDhUYXJnZXQgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQpAQCAtOTcwLDYgKzkyMSw3IEBACiAJCX07CiAKIAkJU2VydmxldCBzZXJ2bGV0MiA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoCkBAIC0xMDMzLDYgKzk4NSw3IEBACiAJCX07CiAKIAkJU2VydmxldCBzZXJ2bGV0MiA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoCkBAIC0xMTIwLDYgKzEwNzMsNyBAQAogCQl9OwogCiAJCVNlcnZsZXQgc2VydmxldDIgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKApAQCAtMTIxNyw2ICsxMTcxLDcgQEAKIAkJfTsKIAogCQlTZXJ2bGV0IHNlcnZsZXQzID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZSgKQEAgLTEzMDUsNiArMTI2MCw3IEBACiAJCX07CiAKIAkJU2VydmxldCBzZXJ2bGV0NCA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoCkBAIC0xNTUzLDYgKzE1MDksNyBAQAogCQl9OwogCiAJCVNlcnZsZXQgc2VydmxldDIgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKApAQCAtMTYxNiw2ICsxNTczLDcgQEAKIAkJfTsKIAogCQlTZXJ2bGV0IHNlcnZsZXQyID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZSgKQEAgLTE3MDMsNiArMTY2MSw3IEBACiAJCX07CiAKIAkJU2VydmxldCBzZXJ2bGV0MiA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoCkBAIC0xODMxLDE5NSArMTc5MCw0IEBACiAJCUFzc2VydC5hc3NlcnRFcXVhbHMoInwvQnVnNDc5MTE1L2EiLCByZXN1bHQpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGRvUmVxdWVzdChTdHJpbmcgYWN0aW9uLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvUmVxdWVzdEdldFJlc3BvbnNlKGFjdGlvbiwgcGFyYW1zKS5nZXQoInJlc3BvbnNlQm9keSIpLmdldCgwKTsKLQl9Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZG9SZXF1ZXN0R2V0UmVzcG9uc2UoU3RyaW5nIGFjdGlvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1aWxkZXIgcmVxdWVzdEluZm8gPSBuZXcgU3RyaW5nQnVpbGRlcihTZXJ2bGV0VGVzdC5QUk9UT1RZUEUpOwotCQlyZXF1ZXN0SW5mby5hcHBlbmQoYWN0aW9uKTsKLQkJaWYgKCFwYXJhbXMuaXNFbXB0eSgpKSB7Ci0JCQlib29sZWFuIGZpcnN0UGFyYW0gPSB0cnVlOwotCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IHBhcmFtIDogcGFyYW1zLmVudHJ5U2V0KCkpIHsKLQkJCQlpZiAoZmlyc3RQYXJhbSkgewotCQkJCQlyZXF1ZXN0SW5mby5hcHBlbmQoJz8nKTsKLQkJCQkJZmlyc3RQYXJhbSA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlcXVlc3RJbmZvLmFwcGVuZCgnJicpOwotCQkJCX0KLQkJCQlyZXF1ZXN0SW5mby5hcHBlbmQocGFyYW0uZ2V0S2V5KCkpOwotCQkJCXJlcXVlc3RJbmZvLmFwcGVuZCgnPScpOwotCQkJCXJlcXVlc3RJbmZvLmFwcGVuZChwYXJhbS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVxdWVzdEFkdmlzb3IucmVxdWVzdChyZXF1ZXN0SW5mby50b1N0cmluZygpLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgZ2V0QnVuZGxlQ29udGV4dCgpIHsKLQkJcmV0dXJuIEFjdGl2YXRvci5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7Ci0JCXJldHVybiBnZXRKZXR0eVByb3BlcnR5KCJjb250ZXh0LnBhdGgiLCAiIik7Ci0JfQotCi0JcHJpdmF0ZSBIdHRwU2VydmljZSBnZXRIdHRwU2VydmljZSgpIHsKLQkJU2VydmljZVJlZmVyZW5jZTxIdHRwU2VydmljZT4gc2VydmljZVJlZmVyZW5jZSA9IGdldEJ1bmRsZUNvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKEh0dHBTZXJ2aWNlLmNsYXNzKTsKLQkJcmV0dXJuIGdldEJ1bmRsZUNvbnRleHQoKS5nZXRTZXJ2aWNlKHNlcnZpY2VSZWZlcmVuY2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEpldHR5UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgcXVhbGlmaWVkS2V5ID0gU2VydmxldFRlc3QuSkVUVFlfUFJPUEVSVFlfUFJFRklYICsga2V5OwotCQlTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eShxdWFsaWZpZWRLZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBvcnQoKSB7Ci0JCVN0cmluZyBkZWZhdWx0UG9ydCA9IGdldFByb3BlcnR5KFNlcnZsZXRUZXN0Lk9TR0lfSFRUUF9QT1JUX1BST1BFUlRZKTsKLQkJaWYgKGRlZmF1bHRQb3J0ID09IG51bGwpIHsKLQkJCWRlZmF1bHRQb3J0ID0gIjgwIjsKLQkJfQotCQlyZXR1cm4gZ2V0SmV0dHlQcm9wZXJ0eSgicG9ydCIsIGRlZmF1bHRQb3J0KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCUJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCA9IGdldEJ1bmRsZUNvbnRleHQoKTsKLQkJU3RyaW5nIHZhbHVlID0gYnVuZGxlQ29udGV4dC5nZXRQcm9wZXJ0eShrZXkpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGUgaW5zdGFsbEJ1bmRsZShTdHJpbmcgYnVuZGxlKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc3RhbGxlci5pbnN0YWxsQnVuZGxlKGJ1bmRsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0QnVuZGxlcygpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlmb3IgKFN0cmluZyBidW5kbGUgOiBTZXJ2bGV0VGVzdC5CVU5ETEVTKSB7Ci0JCQlhZHZpc29yLnN0YXJ0QnVuZGxlKGJ1bmRsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRKZXR0eSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlhZHZpc29yLnN0YXJ0QnVuZGxlKFNlcnZsZXRUZXN0LkVRVUlOT1hfSkVUVFlfQlVORExFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcEJ1bmRsZXMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IFNlcnZsZXRUZXN0LkJVTkRMRVMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVN0cmluZyBidW5kbGUgPSBTZXJ2bGV0VGVzdC5CVU5ETEVTW2ldOwotCQkJYWR2aXNvci5zdG9wQnVuZGxlKGJ1bmRsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcEpldHR5KCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWFkdmlzb3Iuc3RvcEJ1bmRsZShTZXJ2bGV0VGVzdC5FUVVJTk9YX0pFVFRZX0JVTkRMRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuaW5zdGFsbEJ1bmRsZShCdW5kbGUgYnVuZGxlKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJaW5zdGFsbGVyLnVuaW5zdGFsbEJ1bmRsZShidW5kbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXRwdXRTdHJlYW0ud3JpdGUoc3RyaW5nLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVSU5PWF9EU19CVU5ETEUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5kcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlOT1hfSkVUVFlfQlVORExFID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpFVFRZX1BST1BFUlRZX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHkuIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NHSV9IVFRQX1BPUlRfUFJPUEVSVFkgPSAib3JnLm9zZ2kuc2VydmljZS5odHRwLnBvcnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfT0sgPSAiT0siOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JVTkRMRVNfQklOQVJZX0RJUkVDVE9SWSA9ICIvYnVuZGxlc19iaW4vIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9CVU5ETEVfMSA9ICJ0YjEiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQlVORExFUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCVNlcnZsZXRUZXN0LkVRVUlOT1hfRFNfQlVORExFCi0JfTsKLQotCXByaXZhdGUgQnVuZGxlSW5zdGFsbGVyIGluc3RhbGxlcjsKLQlwcml2YXRlIEJ1bmRsZUFkdmlzb3IgYWR2aXNvcjsKLQlwcml2YXRlIFNlcnZsZXRSZXF1ZXN0QWR2aXNvciByZXF1ZXN0QWR2aXNvcjsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U2VydmljZVJlZ2lzdHJhdGlvbjw/IGV4dGVuZHMgT2JqZWN0Pj4gcmVnaXN0cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZVJlZ2lzdHJhdGlvbjw/IGV4dGVuZHMgT2JqZWN0Pj4oKTsKLQotCXN0YXRpYyBjbGFzcyBUZXN0U2VydmxldENvbnRleHRIZWxwZXJGYWN0b3J5IGltcGxlbWVudHMgU2VydmljZUZhY3Rvcnk8U2VydmxldENvbnRleHRIZWxwZXI+IHsKLQkJc3RhdGljIGNsYXNzIFRlc3RTZXJ2bGV0Q29udGV4dEhlbHBlciBleHRlbmRzIFNlcnZsZXRDb250ZXh0SGVscGVyIHsKLQkJCXB1YmxpYyBUZXN0U2VydmxldENvbnRleHRIZWxwZXIoQnVuZGxlIGJ1bmRsZSkgewotCQkJCXN1cGVyKGJ1bmRsZSk7Ci0JCQl9fTsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTZXJ2bGV0Q29udGV4dEhlbHBlciBnZXRTZXJ2aWNlKEJ1bmRsZSBidW5kbGUsIFNlcnZpY2VSZWdpc3RyYXRpb248U2VydmxldENvbnRleHRIZWxwZXI+IHJlZ2lzdHJhdGlvbikgewotCQkJcmV0dXJuIG5ldyBUZXN0U2VydmxldENvbnRleHRIZWxwZXIoYnVuZGxlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmdldFNlcnZpY2UoQnVuZGxlIGJ1bmRsZSwgU2VydmljZVJlZ2lzdHJhdGlvbjxTZXJ2bGV0Q29udGV4dEhlbHBlcj4gcmVnaXN0cmF0aW9uLAotCQkJCVNlcnZsZXRDb250ZXh0SGVscGVyIHNlcnZpY2UpIHsKLQkJCS8vIG5vdGhpbmcKLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb250ZXh0UGF0aEFkYXB0b3IgZXh0ZW5kcyBDb250ZXh0UGF0aEN1c3RvbWl6ZXIgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0RmlsdGVyOwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZXh0UHJlZml4OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyB0ZXN0TmFtZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGRlZmF1bHRGaWx0ZXIKLQkJICogQHBhcmFtIGNvbnRleHRQcmVmaXgKLQkJICovCi0JCXB1YmxpYyBUZXN0Q29udGV4dFBhdGhBZGFwdG9yKFN0cmluZyBkZWZhdWx0RmlsdGVyLCBTdHJpbmcgY29udGV4dFByZWZpeCwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWZhdWx0RmlsdGVyID0gZGVmYXVsdEZpbHRlcjsKLQkJCXRoaXMuY29udGV4dFByZWZpeCA9IGNvbnRleHRQcmVmaXg7Ci0JCQl0aGlzLnRlc3ROYW1lID0gdGVzdE5hbWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dFNlbGVjdEZpbHRlcihTZXJ2aWNlUmVmZXJlbmNlPD8+IGh0dHBXaGl0ZUJvYXJkU2VydmljZSkgewotCQkJaWYgKHRlc3ROYW1lLmVxdWFscyhodHRwV2hpdGVCb2FyZFNlcnZpY2UuZ2V0UHJvcGVydHkoInNlcnZsZXQuaW5pdC4iICsgU2VydmxldFRlc3QuVEVTVF9QQVRIX0NVU1RPTUlaRVJfTkFNRSkpKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRGaWx0ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoUHJlZml4KFNlcnZpY2VSZWZlcmVuY2U8U2VydmxldENvbnRleHRIZWxwZXI+IGhlbHBlcikgewotCQkJaWYgKHRlc3ROYW1lLmVxdWFscyhoZWxwZXIuZ2V0UHJvcGVydHkoU2VydmxldFRlc3QuVEVTVF9QQVRIX0NVU1RPTUlaRVJfTkFNRSkpKSB7Ci0JCQkJcmV0dXJuIGNvbnRleHRQcmVmaXg7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEVycm9yU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0ewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXJyb3JDb2RlOwotCi0JCXB1YmxpYyBFcnJvclNlcnZsZXQoU3RyaW5nIGVycm9yQ29kZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXJyb3JDb2RlID0gZXJyb3JDb2RlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoCi0JCQkJSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0JCQl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiAsSU9FeGNlcHRpb24gewotCi0JCQlpZiAocmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbT8iKTsKLQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7Ci0KLQkJCVN0cmluZyByZXF1ZXN0VVJJID0gKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZShSZXF1ZXN0RGlzcGF0Y2hlci5FUlJPUl9SRVFVRVNUX1VSSSk7Ci0JCQlJbnRlZ2VyIHN0YXR1cyA9IChJbnRlZ2VyKXJlcXVlc3QuZ2V0QXR0cmlidXRlKFJlcXVlc3REaXNwYXRjaGVyLkVSUk9SX1NUQVRVU19DT0RFKTsKLQotCQkJd3JpdGVyLnByaW50KGVycm9yQ29kZSArICIgOiAiICsgc3RhdHVzICsgIiA6IEVSUk9SIDogIiArIHJlcXVlc3RVUkkpOwotCQl9Ci0KLQl9OwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaHR0cC9zZXJ2bGV0L3Rlc3RzL1NlcnZsZXRUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2h0dHAvc2VydmxldC90ZXN0cy9TZXJ2bGV0VGVzdC5qYXZhCmluZGV4IGI4NDUwMWUuLjM0OTg3ODQgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaHR0cC9zZXJ2bGV0L3Rlc3RzL1NlcnZsZXRUZXN0LmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9odHRwL3NlcnZsZXQvdGVzdHMvU2VydmxldFRlc3QuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGphdmEubmV0LkNvb2tpZUhhbmRsZXI7CiBpbXBvcnQgamF2YS5uZXQuQ29va2llTWFuYWdlcjsKIGltcG9ydCBqYXZhLm5ldC5Db29raWVQb2xpY3k7Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFJldHJ5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0zNiw3ICszNSw2IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKQEAgLTY3LDEzICs2NSw5IEBACiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uTGlzdGVuZXI7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLlBhcnQ7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC5FeHRlbmRlZEh0dHBTZXJ2aWNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LmNvbnRleHQuQ29udGV4dFBhdGhDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLmJ1bmRsZS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMuYnVuZGxlLkJ1bmRsZUFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMuYnVuZGxlLkJ1bmRsZUluc3RhbGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0YmFzZS5CYXNlVGVzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy51dGlsLkJhc2VBc3luY1NlcnZsZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMudXRpbC5CYXNlQ2hhbmdlU2Vzc2lvbklkU2VydmxldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy51dGlsLkJhc2VIdHRwQ29udGV4dDsKQEAgLTg1LDE1ICs3OSwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLnV0aWwuQmFzZVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQudGVzdHMudXRpbC5CYXNlU2VydmxldFJlcXVlc3RMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy51dGlsLkJ1ZmZlcmVkU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldC50ZXN0cy51dGlsLlNlcnZsZXRSZXF1ZXN0QWR2aXNvcjsKLQogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiAKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwogaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWdpc3RyYXRpb247CiBpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLmhvb2tzLnNlcnZpY2UuRmluZEhvb2s7CkBAIC0xMDgsNDkgKzk4LDE0IEBACiBpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLnJ1bnRpbWUuZHRvLlNlcnZsZXREVE87CiBpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLndoaXRlYm9hcmQuSHR0cFdoaXRlYm9hcmRDb25zdGFudHM7CiAKLXB1YmxpYyBjbGFzcyBTZXJ2bGV0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFF1aWV0IGxvZ2dpbmcgZm9yIHRlc3RzCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiLy5MRVZFTCIsICJPRkYiKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuTEVWRUwiLCAiT0ZGIik7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5MRVZFTCIsICJPRkYiKTsKLQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5wb3J0IiwgIjgwOTAiKTsKLQkJQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlpbnN0YWxsZXIgPSBuZXcgQnVuZGxlSW5zdGFsbGVyKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFU19CSU5BUllfRElSRUNUT1JZLCBidW5kbGVDb250ZXh0KTsKLQkJYWR2aXNvciA9IG5ldyBCdW5kbGVBZHZpc29yKGJ1bmRsZUNvbnRleHQpOwotCQlTdHJpbmcgcG9ydCA9IGdldFBvcnQoKTsKLQkJU3RyaW5nIGNvbnRleHRQYXRoID0gZ2V0Q29udGV4dFBhdGgoKTsKLQkJcmVxdWVzdEFkdmlzb3IgPSBuZXcgU2VydmxldFJlcXVlc3RBZHZpc29yKHBvcnQsIGNvbnRleHRQYXRoKTsKLQkJc3RhcnRCdW5kbGVzKCk7Ci0JCXN0b3BKZXR0eSgpOwotCQlzdGFydEpldHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChTZXJ2aWNlUmVnaXN0cmF0aW9uPD8gZXh0ZW5kcyBPYmplY3Q+IHNlcnZpY2VSZWdpc3RyYXRpb24gOiByZWdpc3RyYXRpb25zKSB7Ci0JCQlzZXJ2aWNlUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJfQotCQlzdG9wSmV0dHkoKTsKLQkJc3RvcEJ1bmRsZXMoKTsKLQkJcmVxdWVzdEFkdmlzb3IgPSBudWxsOwotCQlhZHZpc29yID0gbnVsbDsKLQkJcmVnaXN0cmF0aW9ucy5jbGVhcigpOwotCQl0cnkgewotCQkJaW5zdGFsbGVyLnNodXRkb3duKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbnN0YWxsZXIgPSBudWxsOwotCQl9Ci0JfQorQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0VGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKIAogCXB1YmxpYyB2b2lkIHRlc3RfRXJyb3JQYWdlMSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiNDAzIEVSUk9SIDoiOwogCQlTdHJpbmcgYWN0dWFsID0gbnVsbDsKIAkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXNwb25zZSA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJcmVzcG9uc2UgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0RXJyb3JQYWdlMS9hIiwgbnVsbCk7CkBAIC0xNzAsNyArMTI1LDcgQEAKIAkJU3RyaW5nIGV4cGVjdGVkID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0LnRlc3RzLnRiMS5UZXN0RXJyb3JQYWdlMiRNeUV4Y2VwdGlvbiBFUlJPUiA6IjsKIAkJU3RyaW5nIGFjdHVhbCA9IG51bGw7CiAJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVzcG9uc2UgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCXJlc3BvbnNlID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdEVycm9yUGFnZTIvYSIsIG51bGwpOwpAQCAtMTkwLDcgKzE0NSw3IEBACiAJCVN0cmluZyBleHBlY3RlZCA9ICI0MDAgRVJST1IgOiI7CiAJCVN0cmluZyBhY3R1YWwgPSBudWxsOwogCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlc3BvbnNlID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlyZXNwb25zZSA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RFcnJvclBhZ2UzL2EiLCBudWxsKTsKQEAgLTIxMyw3ICsxNjgsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRXJyb3JQYWdlNCgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgYWN0dWFsID0gbnVsbDsKIAkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXNwb25zZSA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJcmVzcG9uc2UgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0RXJyb3JQYWdlNC9hIiwgbnVsbCk7CkBAIC00NTgsNyArNDEzLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X0ZpbHRlcjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImJhYiI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdEZpbHRlcjEvYmFiIik7CkBAIC00NzEsNyArNDI2LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X0ZpbHRlcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImNiYWJjIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0RmlsdGVyMi9jYmFiYyIpOwpAQCAtNDg0LDcgKzQzOSw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9GaWx0ZXIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJjYmRhZGJjIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0RmlsdGVyMy9jYmRhZGJjIik7CkBAIC00OTcsNyArNDUyLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X0ZpbHRlcjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImRjYmFiY2QiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RGaWx0ZXI0L2RjYmFiY2QiKTsKQEAgLTUxMCw3ICs0NjUsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyNSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiYmFiIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJzb21ldGhpbmcvYmFiLlRlc3RGaWx0ZXI1Iik7CkBAIC01MjMsNyArNDc4LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X0ZpbHRlcjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImNiYWJjIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJzb21ldGhpbmcvY2JhYmMuVGVzdEZpbHRlcjYiKTsKQEAgLTUzNiw3ICs0OTEsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyNygpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiY2JkYWRiYyI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgic29tZXRoaW5nL2NiZGFkYmMuVGVzdEZpbHRlcjciKTsKQEAgLTU0OSw3ICs1MDQsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyOCgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZGNiYWJjZCI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgic29tZXRoaW5nL2RjYmFiY2QuVGVzdEZpbHRlcjgiKTsKQEAgLTU2Miw3ICs1MTcsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyOSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiYmFiIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0RmlsdGVyOS9iYWIiKTsKQEAgLTU3NSw3ICs1MzAsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImNiYWJjIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0RmlsdGVyMTAvY2JhYmMiKTsKQEAgLTU4OCw3ICs1NDMsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImNiZGFkYmMiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RGaWx0ZXIxMS9jYmRhZGJjIik7CkBAIC02MDEsNyArNTU2LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X0ZpbHRlcjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJkY2JhYmNkIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0RmlsdGVyMTIvZGNiYWJjZCIpOwpAQCAtNjE0LDcgKzU2OSw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9GaWx0ZXIxMygpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiYmFiIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJzb21ldGhpbmcvYS5UZXN0RmlsdGVyMTMiKTsKQEAgLTYyNyw3ICs1ODIsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImNiYWJjIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJzb21ldGhpbmcvYS5UZXN0RmlsdGVyMTQiKTsKQEAgLTY0MCw3ICs1OTUsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfRmlsdGVyMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImNiZGFkYmMiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoInNvbWV0aGluZy9hLlRlc3RGaWx0ZXIxNSIpOwpAQCAtNjUzLDcgKzYwOCw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9GaWx0ZXIxNigpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZGNiYWJjZCI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgic29tZXRoaW5nL2EuVGVzdEZpbHRlcjE2Iik7CkBAIC02NjYsNyArNjIxLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X0ZpbHRlcjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJlYmNkYWRjYmUiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RGaWx0ZXIxNy9mb28vYmFyL2JheiIpOwpAQCAtNjc5LDcgKzYzNCw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9GaWx0ZXIxOCgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZGJjYWNiZCI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdEZpbHRlcjE4L2Zvby9iYXIvYmF6Iik7CkBAIC02OTIsNyArNjQ3LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X0ZpbHRlcjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJkZmJjYWNiZmQiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RGaWx0ZXIxOC9mb28vYmFyL2Jhei93aXRoL3BhdGgvaW5mbyIpOwpAQCAtNzAyLDM2ICs2NTcsNiBAQAogCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwogCX0KIAotCXN0YXRpYyBjbGFzcyBUZXN0RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKLQkJQXRvbWljSW50ZWdlciBjYWxsZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotCQkJLy8gbm90aGluZwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgRmlsdGVyQ2hhaW4gY2hhaW4pCi0JCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLQkJCWNhbGxlZC5pbmNyZW1lbnRBbmRHZXQoKTsKLQkJCWNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotCQkJLy8gbm90aGluZwotCQl9Ci0JCXZvaWQgY2xlYXIoKSB7Ci0JCQljYWxsZWQuc2V0KDApOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0Q2FsbGVkKCkgewotCQkJcmV0dXJuIGNhbGxlZC5nZXQoKSA+PSAxOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiBjYWxsZWQuZ2V0KCk7Ci0JCX0KLQl9CiAJcHVibGljIHZvaWQgdGVzdF9GaWx0ZXIyMCgpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBNYWtlIHN1cmUgbGVnYWN5IGZpbHRlciByZWdpc3RyYXRpb25zIG1hdGNoIGFnYWluc3QgYWxsIGNvbnRyb2xsZXJzIHRoYXQgYXJlIGZvciBsZWdhY3kgSHR0cENvbnRleHQKIAkJLy8gTWFrZSBzdXJlIGxlZ2FjeSBmaWx0ZXIgcmVnaXN0cmF0aW9ucyBtYXRjaCBhcyBpZiB0aGV5IGFyZSBwcmVmaXggbWF0Y2hpbmcgd2l0aCB3aWxkY2FyZHMKQEAgLTgwNiw2ICs3MzEsNyBAQAogCQl9OwogCiAJCVNlcnZsZXQgc2VydmxldDIgPSBuZXcgQmFzZVNlcnZsZXQoImEiKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKApAQCAtMTE1OCw3ICsxMDg0LDcgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0X1JlZ2lzdHJhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOwpAQCAtMTQ4OSw3ICsxNDE1LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X1Jlc291cmNlMSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiYSI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdFJlc291cmNlMS9yZXNvdXJjZTEudHh0Iik7CkBAIC0xNTAyLDcgKzE0MjgsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfUmVzb3VyY2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJjYmRhZGJjIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0UmVzb3VyY2UyL3Jlc291cmNlMS50eHQiKTsKQEAgLTE1MTUsNyArMTQ0MSw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9SZXNvdXJjZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gImEiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RSZXNvdXJjZTMvcmVzb3VyY2UxLnR4dCIpOwpAQCAtMTUyOCw3ICsxNDU0LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X1Jlc291cmNlNCgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZGNiYWJjZCI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdFJlc291cmNlNC9yZXNvdXJjZTEudHh0Iik7CkBAIC0xNTQxLDcgKzE0NjcsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfUmVzb3VyY2U1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJkY2JhYmNkIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0UmVzb3VyY2U1L3Jlc291cmNlMS50eHQiKTsKQEAgLTE1NTIsNyArMTQ3OCw3IEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdF9SdW50aW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCkBAIC0xNTc0LDkgKzE1MDAsOSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RfU2VydmxldDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGV4cGVjdGVkID0gU2VydmxldFRlc3QuU1RBVFVTX09LOworCQlTdHJpbmcgZXhwZWN0ZWQgPSBTVEFUVVNfT0s7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdFNlcnZsZXQxIik7CkBAIC0xNTg5LDcgKzE1MTUsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfU2VydmxldDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gIjMiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RTZXJ2bGV0MiIpOwpAQCAtMTYwMSw5ICsxNTI3LDkgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0X1NlcnZsZXQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBleHBlY3RlZCA9IFNlcnZsZXRUZXN0LlNUQVRVU19PSzsKKwkJU3RyaW5nIGV4cGVjdGVkID0gU1RBVFVTX09LOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RTZXJ2bGV0MyIpOwpAQCAtMTYxNCw5ICsxNTQwLDkgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0X1NlcnZsZXQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBleHBlY3RlZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTZXJ2bGV0VGVzdC5KRVRUWV9QUk9QRVJUWV9QUkVGSVggKyAiY29udGV4dC5wYXRoIiwgIiIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSkVUVFlfUFJPUEVSVFlfUFJFRklYICsgImNvbnRleHQucGF0aCIsICIiKTsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0U2VydmxldDQiKTsKQEAgLTE2MjksNyArMTU1NSw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9TZXJ2bGV0NSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiRXF1aW5veCBKZXR0eS1iYXNlZCBIdHRwIFNlcnZpY2UiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RTZXJ2bGV0NSIpOwpAQCAtMTY0Miw3ICsxNTY4LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X1NlcnZsZXQ2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJhIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJzb21ldGhpbmcvYS5UZXN0U2VydmxldDYiKTsKQEAgLTE2NTUsNyArMTU4MSw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9TZXJ2bGV0NygpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiYSI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdFNlcnZsZXQ3L2EiKTsKQEAgLTE2NjgsNyArMTU5NCw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9TZXJ2bGV0OSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiRXF1aW5veCBKZXR0eS1iYXNlZCBIdHRwIFNlcnZpY2UiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RTZXJ2bGV0OSIpOwpAQCAtMTY4MSw3ICsxNjA3LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X1NlcnZsZXQxMCgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiYSI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdFNlcnZsZXQxMCIpOwpAQCAtMTY5NCw3ICsxNjIwLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0X1NlcnZsZXQxMSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiYSI7CiAJCVN0cmluZyBhY3R1YWw7Ci0JCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFNlcnZsZXRUZXN0LlRFU1RfQlVORExFXzEpOworCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShURVNUX0JVTkRMRV8xKTsKIAkJdHJ5IHsKIAkJCWJ1bmRsZS5zdGFydCgpOwogCQkJYWN0dWFsID0gcmVxdWVzdEFkdmlzb3IucmVxdWVzdCgiVGVzdFNlcnZsZXQxMSIpOwpAQCAtMTcwNiw2ICsxNjMyLDcgQEAKIAogCXB1YmxpYyB2b2lkIHRlc3RfU2VydmxldDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVNlcnZsZXQgc0EgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQpAQCAtMTcxNyw2ICsxNjQ0LDcgQEAKIAkJfTsKIAogCQlTZXJ2bGV0IHNCID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKQEAgLTE3NjcsNiArMTY5NSw3IEBACiAKIAlwdWJsaWMgdm9pZCB0ZXN0X1NlcnZsZXRFeGFjdE1hdGNoUHJlY2lkZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTZXJ2bGV0IHNBID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKQEAgLTE3NzgsNiArMTcwNyw3IEBACiAJCX07CiAKIAkJU2VydmxldCBzQiA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCkBAIC0xOTA1LDcgKzE4MzUsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfU2VydmxldENvbnRleHQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICIvb3JnL2VjbGlwc2UvZXF1aW5veC9odHRwL3NlcnZsZXQvdGVzdHMvdGIxL3Jlc291cmNlMS50eHQiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIlRlc3RTZXJ2bGV0Q29udGV4dDEiKTsKQEAgLTE5MTksNyArMTg0OSw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9TZXJ2bGV0Q29udGV4dDFfMigpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiL29yZy9lY2xpcHNlL2VxdWlub3gvaHR0cC9zZXJ2bGV0L3Rlc3RzL3RiMS9yZXNvdXJjZTEudHh0IjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJUZXN0U2VydmxldENvbnRleHQxIik7CkBAIC0yMjI1LDcgKzIxNTUsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RfU2VydmxldENvbnRleHRIZWxwZXIxMCgpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgZXhwZWN0ZWQgPSAiY2FjIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJhL1Rlc3RTZXJ2bGV0Q29udGV4dEhlbHBlcjEwL2EiKTsKQEAgLTI3NzQsNyArMjcwNCw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9XQlNlcnZsZXQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJhIjsKIAkJU3RyaW5nIGFjdHVhbDsKLQkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoU2VydmxldFRlc3QuVEVTVF9CVU5ETEVfMSk7CisJCUJ1bmRsZSBidW5kbGUgPSBpbnN0YWxsQnVuZGxlKFRFU1RfQlVORExFXzEpOwogCQl0cnkgewogCQkJYnVuZGxlLnN0YXJ0KCk7CiAJCQlhY3R1YWwgPSByZXF1ZXN0QWR2aXNvci5yZXF1ZXN0KCJXQlNlcnZsZXQxL2EiKTsKQEAgLTI3ODcsNyArMjcxNyw3IEBACiAJcHVibGljIHZvaWQgdGVzdF9XQlNlcnZsZXQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICJiYWIiOwogCQlTdHJpbmcgYWN0dWFsOwotCQlCdW5kbGUgYnVuZGxlID0gaW5zdGFsbEJ1bmRsZShTZXJ2bGV0VGVzdC5URVNUX0JVTkRMRV8xKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGluc3RhbGxCdW5kbGUoVEVTVF9CVU5ETEVfMSk7CiAJCXRyeSB7CiAJCQlidW5kbGUuc3RhcnQoKTsKIAkJCWFjdHVhbCA9IHJlcXVlc3RBZHZpc29yLnJlcXVlc3QoIldCU2VydmxldDIvYSIpOwpAQCAtMjgxOCwxNCArMjc0OCw2IEBACiAJCX0KIAl9CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT1RZUEUgPSAicHJvdG90eXBlLyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJFID0gImNvbmZpZ3VyZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5SRUdJU1RFUiA9ICJ1bnJlZ2lzdGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJlcnJvciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX1BBUkFNID0gInNlcnZsZXQuaW5pdC5zdGF0dXMiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPVE9UWVBFX05BTUUgPSAidGVzdC5wcm90b3R5cGUubmFtZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQVRIX0NVU1RPTUlaRVJfTkFNRSA9ICJ0ZXN0LnBhdGguY3VzdG9taXplci5uYW1lIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VSUk9SX0NPREUgPSAidGVzdC5lcnJvci5jb2RlIjsKIAlwdWJsaWMgdm9pZCB0ZXN0V0JTZXJ2bGV0Q2hhbmdlSW5pdFBhcmFtcygpIHRocm93cyBFeGNlcHRpb257CiAJCQlTdHJpbmcgYWN0dWFsOwogCkBAIC0zMDQ2LDYgKzI5NjgsOCBAQAogCQkJfQogCQl9OwogCQlIdHRwU2VydmxldCB0ZXN0U2VydmxldCA9IG5ldyBIdHRwU2VydmxldCgpIHsKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKIAkJCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKQEAgLTMwNjIsMTkxICsyOTg2LDUgQEAKIAkJQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBkb1JlcXVlc3QoU3RyaW5nIGFjdGlvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBkb1JlcXVlc3RHZXRSZXNwb25zZShhY3Rpb24sIHBhcmFtcykuZ2V0KCJyZXNwb25zZUJvZHkiKS5nZXQoMCk7Ci0JfQogCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGRvUmVxdWVzdEdldFJlc3BvbnNlKFN0cmluZyBhY3Rpb24sIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWlsZGVyIHJlcXVlc3RJbmZvID0gbmV3IFN0cmluZ0J1aWxkZXIoUFJPVE9UWVBFKTsKLQkJcmVxdWVzdEluZm8uYXBwZW5kKGFjdGlvbik7Ci0JCWlmICghcGFyYW1zLmlzRW1wdHkoKSkgewotCQkJYm9vbGVhbiBmaXJzdFBhcmFtID0gdHJ1ZTsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBwYXJhbSA6IHBhcmFtcy5lbnRyeVNldCgpKSB7Ci0JCQkJaWYgKGZpcnN0UGFyYW0pIHsKLQkJCQkJcmVxdWVzdEluZm8uYXBwZW5kKCc/Jyk7Ci0JCQkJCWZpcnN0UGFyYW0gPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXF1ZXN0SW5mby5hcHBlbmQoJyYnKTsKLQkJCQl9Ci0JCQkJcmVxdWVzdEluZm8uYXBwZW5kKHBhcmFtLmdldEtleSgpKTsKLQkJCQlyZXF1ZXN0SW5mby5hcHBlbmQoJz0nKTsKLQkJCQlyZXF1ZXN0SW5mby5hcHBlbmQocGFyYW0uZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlcXVlc3RBZHZpc29yLnJlcXVlc3QocmVxdWVzdEluZm8udG9TdHJpbmcoKSwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGdldEJ1bmRsZUNvbnRleHQoKSB7Ci0JCXJldHVybiBBY3RpdmF0b3IuZ2V0QnVuZGxlQ29udGV4dCgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgewotCQlyZXR1cm4gZ2V0SmV0dHlQcm9wZXJ0eSgiY29udGV4dC5wYXRoIiwgIiIpOwotCX0KLQotCXByaXZhdGUgSHR0cFNlcnZpY2UgZ2V0SHR0cFNlcnZpY2UoKSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2U8SHR0cFNlcnZpY2U+IHNlcnZpY2VSZWZlcmVuY2UgPSBnZXRCdW5kbGVDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShIdHRwU2VydmljZS5jbGFzcyk7Ci0JCXJldHVybiBnZXRCdW5kbGVDb250ZXh0KCkuZ2V0U2VydmljZShzZXJ2aWNlUmVmZXJlbmNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRKZXR0eVByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHF1YWxpZmllZEtleSA9IFNlcnZsZXRUZXN0LkpFVFRZX1BST1BFUlRZX1BSRUZJWCArIGtleTsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkocXVhbGlmaWVkS2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQb3J0KCkgewotCQlTdHJpbmcgZGVmYXVsdFBvcnQgPSBnZXRQcm9wZXJ0eShTZXJ2bGV0VGVzdC5PU0dJX0hUVFBfUE9SVF9QUk9QRVJUWSk7Ci0JCWlmIChkZWZhdWx0UG9ydCA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0UG9ydCA9ICI4MCI7Ci0JCX0KLQkJcmV0dXJuIGdldEpldHR5UHJvcGVydHkoInBvcnQiLCBkZWZhdWx0UG9ydCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQgPSBnZXRCdW5kbGVDb250ZXh0KCk7Ci0JCVN0cmluZyB2YWx1ZSA9IGJ1bmRsZUNvbnRleHQuZ2V0UHJvcGVydHkoa2V5KTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXByaXZhdGUgQnVuZGxlIGluc3RhbGxCdW5kbGUoU3RyaW5nIGJ1bmRsZSkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnN0YWxsZXIuaW5zdGFsbEJ1bmRsZShidW5kbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydEJ1bmRsZXMoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJZm9yIChTdHJpbmcgYnVuZGxlIDogU2VydmxldFRlc3QuQlVORExFUykgewotCQkJYWR2aXNvci5zdGFydEJ1bmRsZShidW5kbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0SmV0dHkoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJYWR2aXNvci5zdGFydEJ1bmRsZShTZXJ2bGV0VGVzdC5FUVVJTk9YX0pFVFRZX0JVTkRMRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BCdW5kbGVzKCkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSBTZXJ2bGV0VGVzdC5CVU5ETEVTLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTdHJpbmcgYnVuZGxlID0gU2VydmxldFRlc3QuQlVORExFU1tpXTsKLQkJCWFkdmlzb3Iuc3RvcEJ1bmRsZShidW5kbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BKZXR0eSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlhZHZpc29yLnN0b3BCdW5kbGUoU2VydmxldFRlc3QuRVFVSU5PWF9KRVRUWV9CVU5ETEUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1bmluc3RhbGxCdW5kbGUoQnVuZGxlIGJ1bmRsZSkgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWluc3RhbGxlci51bmluc3RhbGxCdW5kbGUoYnVuZGxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVJTk9YX0RTX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmRzIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVJTk9YX0pFVFRZX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHkiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpFVFRZX1BST1BFUlRZX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHkuIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPU0dJX0hUVFBfUE9SVF9QUk9QRVJUWSA9ICJvcmcub3NnaS5zZXJ2aWNlLmh0dHAucG9ydCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX09LID0gIk9LIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JVTkRMRVNfQklOQVJZX0RJUkVDVE9SWSA9ICIvYnVuZGxlc19iaW4vIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JVTkRMRV8xID0gInRiMSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJVTkRMRVMgPSBuZXcgU3RyaW5nW10gewotCQlTZXJ2bGV0VGVzdC5FUVVJTk9YX0RTX0JVTkRMRQotCX07Ci0KLQlwcml2YXRlIEJ1bmRsZUluc3RhbGxlciBpbnN0YWxsZXI7Ci0JcHJpdmF0ZSBCdW5kbGVBZHZpc29yIGFkdmlzb3I7Ci0JcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdEFkdmlzb3IgcmVxdWVzdEFkdmlzb3I7Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFNlcnZpY2VSZWdpc3RyYXRpb248PyBleHRlbmRzIE9iamVjdD4+IHJlZ2lzdHJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VSZWdpc3RyYXRpb248PyBleHRlbmRzIE9iamVjdD4+KCk7Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdFNlcnZsZXRDb250ZXh0SGVscGVyRmFjdG9yeSBpbXBsZW1lbnRzIFNlcnZpY2VGYWN0b3J5PFNlcnZsZXRDb250ZXh0SGVscGVyPiB7Ci0JCXN0YXRpYyBjbGFzcyBUZXN0U2VydmxldENvbnRleHRIZWxwZXIgZXh0ZW5kcyBTZXJ2bGV0Q29udGV4dEhlbHBlciB7Ci0JCQlwdWJsaWMgVGVzdFNlcnZsZXRDb250ZXh0SGVscGVyKEJ1bmRsZSBidW5kbGUpIHsKLQkJCQlzdXBlcihidW5kbGUpOwotCQkJfX07Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU2VydmxldENvbnRleHRIZWxwZXIgZ2V0U2VydmljZShCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVnaXN0cmF0aW9uPFNlcnZsZXRDb250ZXh0SGVscGVyPiByZWdpc3RyYXRpb24pIHsKLQkJCXJldHVybiBuZXcgVGVzdFNlcnZsZXRDb250ZXh0SGVscGVyKGJ1bmRsZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdW5nZXRTZXJ2aWNlKEJ1bmRsZSBidW5kbGUsIFNlcnZpY2VSZWdpc3RyYXRpb248U2VydmxldENvbnRleHRIZWxwZXI+IHJlZ2lzdHJhdGlvbiwKLQkJCQlTZXJ2bGV0Q29udGV4dEhlbHBlciBzZXJ2aWNlKSB7Ci0JCQkvLyBub3RoaW5nCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29udGV4dFBhdGhBZGFwdG9yIGV4dGVuZHMgQ29udGV4dFBhdGhDdXN0b21pemVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdEZpbHRlcjsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGV4dFByZWZpeDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGVzdE5hbWU7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBkZWZhdWx0RmlsdGVyCi0JCSAqIEBwYXJhbSBjb250ZXh0UHJlZml4Ci0JCSAqLwotCQlwdWJsaWMgVGVzdENvbnRleHRQYXRoQWRhcHRvcihTdHJpbmcgZGVmYXVsdEZpbHRlciwgU3RyaW5nIGNvbnRleHRQcmVmaXgsIFN0cmluZyB0ZXN0TmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVmYXVsdEZpbHRlciA9IGRlZmF1bHRGaWx0ZXI7Ci0JCQl0aGlzLmNvbnRleHRQcmVmaXggPSBjb250ZXh0UHJlZml4OwotCQkJdGhpcy50ZXN0TmFtZSA9IHRlc3ROYW1lOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHRTZWxlY3RGaWx0ZXIoU2VydmljZVJlZmVyZW5jZTw/PiBodHRwV2hpdGVCb2FyZFNlcnZpY2UpIHsKLQkJCWlmICh0ZXN0TmFtZS5lcXVhbHMoaHR0cFdoaXRlQm9hcmRTZXJ2aWNlLmdldFByb3BlcnR5KCJzZXJ2bGV0LmluaXQuIiArIFRFU1RfUEFUSF9DVVNUT01JWkVSX05BTUUpKSkgewotCQkJCXJldHVybiBkZWZhdWx0RmlsdGVyOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aFByZWZpeChTZXJ2aWNlUmVmZXJlbmNlPFNlcnZsZXRDb250ZXh0SGVscGVyPiBoZWxwZXIpIHsKLQkJCWlmICh0ZXN0TmFtZS5lcXVhbHMoaGVscGVyLmdldFByb3BlcnR5KFRFU1RfUEFUSF9DVVNUT01JWkVSX05BTUUpKSkgewotCQkJCXJldHVybiBjb250ZXh0UHJlZml4OwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBFcnJvclNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGVycm9yQ29kZTsKLQotCQlwdWJsaWMgRXJyb3JTZXJ2bGV0KFN0cmluZyBlcnJvckNvZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKAotCQkJCUh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gLElPRXhjZXB0aW9uIHsKLQotCQkJaWYgKHJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0/Iik7Ci0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotCi0JCQlTdHJpbmcgcmVxdWVzdFVSSSA9IChTdHJpbmcpcmVxdWVzdC5nZXRBdHRyaWJ1dGUoUmVxdWVzdERpc3BhdGNoZXIuRVJST1JfUkVRVUVTVF9VUkkpOwotCQkJSW50ZWdlciBzdGF0dXMgPSAoSW50ZWdlcilyZXF1ZXN0LmdldEF0dHJpYnV0ZShSZXF1ZXN0RGlzcGF0Y2hlci5FUlJPUl9TVEFUVVNfQ09ERSk7Ci0KLQkJCXdyaXRlci5wcmludChlcnJvckNvZGUgKyAiIDogIiArIHN0YXR1cyArICIgOiBFUlJPUiA6ICIgKyByZXF1ZXN0VVJJKTsKLQkJfQotCi0JfTsKIH0K