ZGlmZiAtLWdpdCBhLy5iYXplbHJjIGIvLmJhemVscmMKaW5kZXggZTI0YmU4OC4uOGMzMjY2MSAxMDA2NDQKLS0tIGEvLmJhemVscmMKKysrIGIvLmJhemVscmMKQEAgLTMsOCArMywzMyBAQAogYnVpbGQgLS1leHBlcmltZW50YWxfc3RyaWN0X2FjdGlvbl9lbnYKIGJ1aWxkIC0tYWN0aW9uX2Vudj1QQVRICiBidWlsZCAtLWRpc2tfY2FjaGU9fi8uZ2Vycml0Y29kZXJldmlldy9iYXplbC1jYWNoZS9jYXMKLWJ1aWxkIC0tamF2YV90b29sY2hhaW4gLy90b29sczplcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW4KKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazExLCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZCAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKK2J1aWxkIC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTEKK2J1aWxkIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgYW5kIGV4ZWN1dGVzIG9uIFJCRSB1c2luZyByZW1vdGVqZGtfMTEKK2J1aWxkOnJlbW90ZSAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzExCitidWlsZDpyZW1vdGUgLS10b29sX2phdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazE3LCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZDpqYXZhMTcgLS1qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLWphdmFfcnVudGltZV92ZXJzaW9uPXJlbW90ZWpka18xNworYnVpbGQ6amF2YTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLXRvb2xfamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzE3CisKKyMgQnVpbGRzIGFuZCBleGVjdXRlcyBvbiBSQkUgdXNpbmcgcmVtb3RlamRrXzE3CitidWlsZDpyZW1vdGUxNyAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xNworYnVpbGQ6cmVtb3RlMTcgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKIAogdGVzdCAtLWJ1aWxkX3Rlc3RzX29ubHkKIHRlc3QgLS10ZXN0X291dHB1dD1lcnJvcnMKIAoraW1wb3J0ICV3b3Jrc3BhY2UlL3Rvb2xzL3JlbW90ZS1iYXplbHJjCisKZGlmZiAtLWdpdCBhLy5iYXplbHZlcnNpb24gYi8uYmF6ZWx2ZXJzaW9uCmluZGV4IGZjZGIyZTEuLjAwNjJhYzkgMTAwNjQ0Ci0tLSBhLy5iYXplbHZlcnNpb24KKysrIGIvLmJhemVsdmVyc2lvbgpAQCAtMSArMSBAQAotNC4wLjAKKzUuMC4wCmRpZmYgLS1naXQgYS8ubWFpbG1hcCBiLy5tYWlsbWFwCmluZGV4IGYwYmM5OTAuLmYwYWY0OWIgMTAwNjQ0Ci0tLSBhLy5tYWlsbWFwCisrKyBiLy5tYWlsbWFwCkBAIC0xMiw2ICsxMiw3IEBACiBTYcWhYSDFvWl2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc2EgWml2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYcWhYSDFvWl2a292IDx6aXZrb3ZAZ21haWwuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYXNhIFppdmtvdiA8eml2a292QGdtYWlsLmNvbT4KK1NlYmFzdGlhbiBTY2h1YmVydGggPHNzY2h1YmVydGhAZ21haWwuY29tPiAgICAgICAgICAgICAgICAgIFNlYmFzdGlhbiBTY2h1YmVydGggPHNlYmFzdGlhbi5zY2h1YmVydGhAYm9zY2guaW8+CiBTaGF3biBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+ICAgICAgICAgICAgICAgICAgICAgICAgICBTaGF3biBPLiBQZWFyY2UgPHNvcEBnb29nbGUuY29tPgogU2hhd24gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhd24gUGVhcmNlIDxzb3BAZ29vZ2xlLmNvbT4KIFNoYXduIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KZGlmZiAtLWdpdCBhL0RFUEVOREVOQ0lFUyBiL0RFUEVOREVOQ0lFUwppbmRleCBlYmJlNDgwLi45M2ZhODUwIDEwMDY0NAotLS0gYS9ERVBFTkRFTkNJRVMKKysrIGIvREVQRU5ERU5DSUVTCkBAIC0xLDY5ICsxLDY4IEBACiBtYXZlbi9tYXZlbmNlbnRyYWwvYXJnczRqL2FyZ3M0ai8yLjMzLCBNSVQsIGFwcHJvdmVkLCBDUTExMDY4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguNywgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKLW1hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CittYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguOSwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKK21hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTMsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tLmpjcmFmdC9qc2NoLzAuMS41NSwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgQ1ExOTQzNQogbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbS5qY3JhZnQvanpsaWIvMS4xLjEsIEJTRC0yLUNsYXVzZSwgYXBwcm92ZWQsIENRNjIxOAogbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbW1vbnMtY29kZWMvY29tbW9ucy1jb2RlYy8xLjExLCBBcGFjaGUtMi4wIEFORCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCBDUTE1OTcxCiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tbW9ucy1sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy8xLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEwMTYyCi1tYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS8zLjEuMCwgQXBhY2hlLTIuMCBBTkQgKENEREwtMS4xIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCksIGFwcHJvdmVkLCBDUTcyNDgKLW1hdmVuL21hdmVuY2VudHJhbC9qdW5pdC9qdW5pdC80LjEzLCAsIGFwcHJvdmVkLCBDUTIyNzk2Ci1tYXZlbi9tYXZlbmNlbnRyYWwvbG9nNGovbG9nNGovMS4yLjE1LCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1E3ODM3CittYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS80LjAuMCwgLCBhcHByb3ZlZCwgQ1ExNjEyNQorbWF2ZW4vbWF2ZW5jZW50cmFsL2p1bml0L2p1bml0LzQuMTMuMiwgRVBMLTIuMCwgYXBwcm92ZWQsIENRMjM2MzYKIG1hdmVuL21hdmVuY2VudHJhbC9uZXQuYnl0ZWJ1ZGR5L2J5dGUtYnVkZHktYWdlbnQvMS45LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAogbWF2ZW4vbWF2ZW5jZW50cmFsL25ldC5ieXRlYnVkZHkvYnl0ZS1idWRkeS8xLjkuMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCiBtYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmkycC5jcnlwdG8vZWRkc2EvMC4zLjAsIENDMC0xLjAsIGFwcHJvdmVkLCBDUTIyNTM3CittYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmphdmEuZGV2LmpuYS9qbmEtcGxhdGZvcm0vNS44LjAsIEFwYWNoZS0yLjAgT1IgTEdQTC0yLjEtb3ItbGF0ZXIsIGFwcHJvdmVkLCBDUTIzMjE4CittYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmphdmEuZGV2LmpuYS9qbmEvNS44LjAsIEFwYWNoZS0yLjAgT1IgTEdQTC0yLjEtb3ItbGF0ZXIsIGFwcHJvdmVkLCBDUTIzMjE3CiBtYXZlbi9tYXZlbmNlbnRyYWwvbmV0LnNmLmpvcHQtc2ltcGxlL2pvcHQtc2ltcGxlLzQuNiwgTUlULCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmFudC9hbnQtbGF1bmNoZXIvMS4xMC4xMCwgQXBhY2hlLTIuMCBBTkQgVzNDIEFORCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTE1NTYwCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5hbnQvYW50LzEuMTAuMTAsIEFwYWNoZS0yLjAgQU5EIFczQyBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1ExNTU2MAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuY29tbW9ucy9jb21tb25zLWNvbXByZXNzLzEuMjAsIEFwYWNoZS0yLjAgQU5EIEJTRC0zLUNsYXVzZSBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMTc3MQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuYW50L2FudC1sYXVuY2hlci8xLjEwLjEyLCBBcGFjaGUtMi4wIEFORCBXM0MgQU5EIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMTU1NjAKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmFudC9hbnQvMS4xMC4xMiwgQXBhY2hlLTIuMCBBTkQgVzNDIEFORCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTE1NTYwCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5jb21tb25zL2NvbW1vbnMtY29tcHJlc3MvMS4yMSwgQXBhY2hlLTIuMCBBTkQgQlNELTMtQ2xhdXNlIEFORCBiemlwMi0xLjAuNiBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMzcxMAogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuY29tbW9ucy9jb21tb25zLW1hdGgzLzMuMiwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy9odHRwY2xpZW50LzQuNS4xMywgQXBhY2hlLTIuMCBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMzUyNwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMvaHR0cGNvcmUvNC40LjE0LCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzUyOAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLWNvbW1vbi8yLjcuMCwgQXBhY2hlLTIuMCBhbmQgSVNDLCBhcHByb3ZlZCwgQ1EyMzQ2OQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLWNvcmUvMi43LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTIzNDY5Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5zc2hkL3NzaGQtb3NnaS8yLjcuMCwgQXBhY2hlLTIuMCBhbmQgSVNDLCBhcHByb3ZlZCwgQ1EyMzQ2OQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLXNmdHAvMi43LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTIzNDcwCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5zc2hkL3NzaGQtb3NnaS8yLjguMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM4OTIKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1zZnRwLzIuOC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzg5MwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hc3NlcnRqL2Fzc2VydGotY29yZS8zLjIwLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmNwZy1qZGsxNW9uLzEuNjksIE1JVCBhbmQgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0NzIKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGtpeC1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzMKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcHJvdi1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzEKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjdXRpbC1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzQKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1odHRwLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1pby85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VjdXJpdHkvOS40LjQzLnYyMDIxMDYyOSwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlcnZlci85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VydmxldC85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktdXRpbC1hamF4LzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS11dGlsLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFudC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQucGdtLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC51aS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmhhbWNyZXN0L2hhbWNyZXN0LWNvcmUvMS4zLCBCU0QtMi1DbGF1c2UsIGFwcHJvdmVkLCBDUTcwNjMKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuaGFtY3Jlc3QvaGFtY3Jlc3QvMi4yLCBCU0QtMi1DbGF1c2UsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5tb2NraXRvL21vY2tpdG8tY29yZS8yLjIzLjAsIE1JVCwgYXBwcm92ZWQsIENRMTc5NzYKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGctamRrMTVvbi8xLjcwLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgIzE3MTMKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGtpeC1qZGsxNW9uLzEuNzAsIE1JVCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmJvdW5jeWNhc3RsZS9iY3Byb3YtamRrMTVvbi8xLjcwLCBNSVQsIGFwcHJvdmVkLCAjMTcxMgorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmN1dGlsLWpkazE1b24vMS43MCwgTUlULCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS50b29sY2hhaW4vamV0dHktc2VydmxldC1hcGkvNC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktaHR0cC8xMC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktaW8vMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlY3VyaXR5LzEwLjAuNiwgRVBMLTIuMCBPUiBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgcnQuamV0dHkKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1zZXJ2ZXIvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlcnZsZXQvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXV0aWwvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFudC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20vNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQudGVzdC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnVpLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5oYW1jcmVzdC9oYW1jcmVzdC1jb3JlLzEuMywgQlNELTItQ2xhdXNlLCBhcHByb3ZlZCwgQ1ExMTQyOQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5tb2NraXRvL21vY2tpdG8tY29yZS8yLjIzLjAsIEFwYWNoZS0yLjAgQU5EIE1JVCwgYXBwcm92ZWQsICM5NTgKIG1hdmVuL21hdmVuY2VudHJhbC9vcmcub2JqZW5lc2lzL29iamVuZXNpcy8yLjYsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTE1NDc4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1jb3JlLzEuMzIsIEdQTC0yLjAsIGFwcHJvdmVkLCBDUTIzNDk5Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy8xLjMyLCBHUEwtMi4wLCBhcHByb3ZlZCwgQ1EyMzUwMAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5vc2dpL29yZy5vc2dpLmNvcmUvNC4zLjEsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEwMTExCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnNsZjRqL2pjbC1vdmVyLXNsZjRqLzEuNy4zMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMTI4NDMKK21hdmVuL21hdmVuY2VudHJhbC9vcmcub3Blbmpkay5qbWgvam1oLWNvcmUvMS4zMiwgR1BMLTIuMC1vbmx5IHdpdGggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAsIGFwcHJvdmVkLCAjOTU5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy8xLjMyLCBHUEwtMi4wLW9ubHkgd2l0aCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCwgYXBwcm92ZWQsICM5NjIKK21hdmVuL21hdmVuY2VudHJhbC9vcmcub3NnaS9vcmcub3NnaS5jb3JlLzYuMC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgIzE3OTQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovamNsLW92ZXItc2xmNGovMS43LjMyLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1ExMjg0MwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5zbGY0ai9zbGY0ai1hcGkvMS43LjMwLCBNSVQsIGFwcHJvdmVkLCBDUTEzMzY4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnNsZjRqL3NsZjRqLWxvZzRqMTIvMS43LjMwLCBNSVQsIGFwcHJvdmVkLCBDUTc2NjUKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovc2xmNGotc2ltcGxlLzEuNy4zMCwgTUlULCBhcHByb3ZlZCwgQ1E3OTUyCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnR1a2FhbmkveHovMS45LCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTIzNDk4CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1vcHRpb25zLm1kIGIvRG9jdW1lbnRhdGlvbi9jb25maWctb3B0aW9ucy5tZAppbmRleCA1ZDc2NDgzLi5lOTU0NjJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1vcHRpb25zLm1kCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLW9wdGlvbnMubWQKQEAgLTQ2LDcgKzQ2LDggQEAKIHwgYGNvcmUuc3RyZWFtRmlsZVRocmVzaG9sZGAgfCBgNTAgTWlCYCB8ICYjeDIwREU7IHwgVGhlIHNpemUgdGhyZXNob2xkIGJleW9uZCB3aGljaCBvYmplY3RzIG11c3QgYmUgc3RyZWFtZWQuIHwKIHwgYGNvcmUuc3VwcG9ydHNBdG9taWNGaWxlQ3JlYXRpb25gIHwgYHRydWVgIHwgJiN4MjBERTsgfCBXaGV0aGVyIHRoZSBmaWxlc3lzdGVtIHN1cHBvcnRzIGF0b21pYyBmaWxlIGNyZWF0aW9uLiB8CiB8IGBjb3JlLnN5bWxpbmtzYCB8IEF1dG8gZGV0ZWN0IGlmIGZpbGVzeXN0ZW0gc3VwcG9ydHMgc3ltbGlua3N8ICYjeDI3MDU7IHwgSWYgZmFsc2UsIHN5bWJvbGljIGxpbmtzIGFyZSBjaGVja2VkIG91dCBhcyBzbWFsbCBwbGFpbiBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIGxpbmsgdGV4dC4gfAotfCBgY29yZS50cnVzdEZvbGRlclN0YXRgIHwgYHRydWVgIHwgJiN4MjBERTsgfCBXaGV0aGVyIHRvIHRydXN0IHRoZSBwYWNrIGZvbGRlcidzIG1vZGlmaWNhdGlvbiB0aW1lLiBJZiBgZmFsc2VgIEpHaXQgd2lsbCBhbHdheXMgc2NhbiB0aGUgYC5naXQvb2JqZWN0cy9wYWNrYCBmb2xkZXIgdG8gY2hlY2sgZm9yIG5ldyBwYWNrIGZpbGVzLiBUaGlzIGNhbiBoZWxwIHRvIHdvcmthcm91bmQgY2FjaGluZyBpc3N1ZXMgb24gTkZTLCBidXQgcmVkdWNlcyBwZXJmb3JtYW5jZS4gSWYgc2V0IHRvIGB0cnVlYCBpdCB1c2VzIHRoZSBgbGFzdG1vZGlmaWVkYCBhdHRyaWJ1dGUgb2YgdGhlIGZvbGRlciBhbmQgYXNzdW1lcyB0aGF0IG5vIG5ldyBwYWNrIGZpbGVzIGNhbiBiZSBpbiB0aGlzIGZvbGRlciBpZiBpdHMgbW9kaWZpY2F0aW9uIHRpbWUgaGFzIG5vdCBjaGFuZ2VkLiB8Cit8IGBjb3JlLnRydXN0Rm9sZGVyU3RhdGAgfCBgdHJ1ZWAgfCAmI3gyMERFOyB8IFdoZXRoZXIgdG8gdHJ1c3QgdGhlIHBhY2sgZm9sZGVyJ3MsIHBhY2tlZC1yZWZzIGZpbGUncyBhbmQgbG9vc2Utb2JqZWN0cyBmb2xkZXIncyBmaWxlIGF0dHJpYnV0ZXMgKEphdmEgZXF1aXZhbGVudCBvZiBzdGF0IGNvbW1hbmQgb24gKm5peCkuIFdoZW4gbG9va2luZyBmb3IgcGFjayBmaWxlcywgaWYgYGZhbHNlYCBKR2l0IHdpbGwgYWx3YXlzIHNjYW4gdGhlIGAuZ2l0L29iamVjdHMvcGFja2AgZm9sZGVyIGFuZCBpZiBzZXQgdG8gYHRydWVgIGl0IGFzc3VtZXMgdGhhdCBwYWNrIGZpbGVzIGFyZSB1bmNoYW5nZWQgaWYgdGhlIGZpbGUgYXR0cmlidXRlcyBvZiB0aGUgcGFjayBmb2xkZXIgYXJlIHVuY2hhbmdlZC4gV2hlbiBnZXR0aW5nIHRoZSBsaXN0IG9mIHBhY2tlZCByZWZzLCBpZiBgZmFsc2VgIEpHaXQgd2lsbCBhbHdheXMgcmVhZCB0aGUgcGFja2VkLXJlZnMgZmlsZSBhbmQgaWYgc2V0IHRvIGB0cnVlYCBpdCB1c2VzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIHBhY2tlZC1yZWZzIGZpbGUgYW5kIHdpbGwgb25seSByZWFkIGl0IGlmIGEgZmlsZSBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQuIFdoZW4gbG9va2luZyBmb3IgbG9vc2Ugb2JqZWN0cywgaWYgYGZhbHNlYCBhbmQgaWYgYSBsb29zZSBvYmplY3QgaXMgbm90IGZvdW5kLCBKR2l0IHdpbGwgb3BlbiBhbmQgY2xvc2UgYSBzdHJlYW0gdG8gYC5naXQvb2JqZWN0c2AgZm9sZGVyICh3aGljaCBjYW4gcmVmcmVzaCBpdHMgZGlyZWN0b3J5IGxpc3RpbmcsIGF0IGxlYXN0IG9uIHNvbWUgTkZTIGNsaWVudHMpIGFuZCByZXRyeSBsb29raW5nIGZvciB0aGF0IGxvb3NlIG9iamVjdC4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIGNhbiBoZWxwIHRvIHdvcmthcm91bmQgY2FjaGluZyBpc3N1ZXMgb24gTkZTLCBidXQgcmVkdWNlcyBwZXJmb3JtYW5jZS4gfAorfCBgY29yZS50cnVzdFBhY2tlZFJlZnNTdGF0YCB8IGB1bnNldGAgfCAmI3gyMERFOyB8IFdoZXRoZXIgdG8gdHJ1c3QgdGhlIGZpbGUgYXR0cmlidXRlcyAoSmF2YSBlcXVpdmFsZW50IG9mIHN0YXQgY29tbWFuZCBvbiAqbml4KSBvZiB0aGUgcGFja2VkLXJlZnMgZmlsZS4gSWYgYG5ldmVyYCBKR2l0IHdpbGwgaWdub3JlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIHBhY2tlZC1yZWZzIGZpbGUgYW5kIGFsd2F5cyByZWFkIGl0LiBJZiBgYWx3YXlzYCBKR2l0IHdpbGwgdHJ1c3QgdGhlIGZpbGUgYXR0cmlidXRlcyBvZiB0aGUgcGFja2VkLXJlZnMgZmlsZSBhbmQgd2lsbCBvbmx5IHJlYWQgaXQgaWYgYSBmaWxlIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZC4gYGFmdGVyX29wZW5gIGJlaGF2ZXMgdGhlIHNhbWUgYXMgYGFsd2F5c2AsIGV4Y2VwdCB0aGF0IHRoZSBwYWNrZWQtcmVmcyBmaWxlIGlzIG9wZW5lZCBhbmQgY2xvc2VkIGJlZm9yZSBpdHMgZmlsZSBhdHRyaWJ1dGVzIGFyZSBjb25zaWRlcmVkLiBBbiBvcGVuL2Nsb3NlIG9mIHRoZSBwYWNrZWQtcmVmcyBmaWxlIGlzIGtub3duIHRvIHJlZnJlc2ggaXRzIGZpbGUgYXR0cmlidXRlcywgYXQgbGVhc3Qgb24gc29tZSBORlMgY2xpZW50cy4gSWYgYHVuc2V0YCwgSkdpdCB3aWxsIHVzZSB0aGUgYmVoYXZpb3IgZGVzY3JpYmVkIGluIGB0cnVzdEZvbGRlclN0YXRgLiB8CiB8IGBjb3JlLndvcmt0cmVlYCB8IFJvb3QgZGlyZWN0b3J5IG9mIHRoZSB3b3JraW5nIHRyZWUgaWYgaXQgaXMgbm90IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBgLmdpdGAgZGlyZWN0b3J5IHwgJiN4MjcwNTsgfCBUaGUgcGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgd29ya2luZyB0cmVlLiB8CiAKICMjIF9fZ2NfXyBvcHRpb25zCmRpZmYgLS1naXQgYS9XT1JLU1BBQ0UgYi9XT1JLU1BBQ0UKaW5kZXggNTFhODE1ZS4uMDQwNjE3ZSAxMDA2NDQKLS0tIGEvV09SS1NQQUNFCisrKyBiL1dPUktTUEFDRQpAQCAtMSwyMyArMSw2IEBACiB3b3Jrc3BhY2UobmFtZSA9ICJqZ2l0IikKIAogbG9hZCgiQGJhemVsX3Rvb2xzLy90b29scy9idWlsZF9kZWZzL3JlcG86aHR0cC5iemwiLCAiaHR0cF9hcmNoaXZlIikKLQotaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAiYmF6ZWxfc2t5bGliIiwKLSAgICBzaGEyNTYgPSAiMmVhOGE1ZWQyYjQ0OGJhZjRhNjg1NWQzY2UwNDljNGM0NTJhNjQ3MGIxZWZkMTUwNGZkYjdjMWMxMzRkMjIwYSIsCi0gICAgc3RyaXBfcHJlZml4ID0gImJhemVsLXNreWxpYi0wLjguMCIsCi0gICAgdXJscyA9IFsiaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwtc2t5bGliL2FyY2hpdmUvMC44LjAudGFyLmd6Il0sCi0pCi0KLSMgQ2hlY2sgQmF6ZWwgdmVyc2lvbiB3aGVuIGludm9rZWQgYnkgQmF6ZWwgZGlyZWN0bHkKLWxvYWQoIi8vdG9vbHM6YmF6ZWxpc2tfdmVyc2lvbi5iemwiLCAiYmF6ZWxpc2tfdmVyc2lvbiIpCi0KLWJhemVsaXNrX3ZlcnNpb24obmFtZSA9ICJiYXplbGlza192ZXJzaW9uIikKLQotbG9hZCgiQGJhemVsaXNrX3ZlcnNpb24vLzpjaGVjay5iemwiLCAiY2hlY2tfYmF6ZWxfdmVyc2lvbiIpCi0KLWNoZWNrX2JhemVsX3ZlcnNpb24oKQotCiBsb2FkKCIvL3Rvb2xzOmJhemxldHMuYnpsIiwgImxvYWRfYmF6bGV0cyIpCiAKIGxvYWRfYmF6bGV0cyhjb21taXQgPSAiZjMwYTk5MmRhOWZjODU1ZGNlODE5ODc1YWZiNTlmOWRkNmY4NjBjZCIpCkBAIC0yOCwzMiArMTEsMTggQEAKICkKIAogaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAib3BlbmpkazE1X2xpbnV4X2FyY2hpdmUiLAotICAgIGJ1aWxkX2ZpbGVfY29udGVudCA9ICIiIgotamF2YV9ydW50aW1lKG5hbWUgPSAncnVudGltZScsIHNyY3MgPSAgZ2xvYihbJyoqJ10pLCB2aXNpYmlsaXR5ID0gWycvL3Zpc2liaWxpdHk6cHVibGljJ10pCi1leHBvcnRzX2ZpbGVzKFsiV09SS1NQQUNFIl0sIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKLSIiIiwKLSAgICBzaGEyNTYgPSAiMGEzOGYxMTM4YzE1YTRmMjQzYjc1ZWI4MmY4ZWY0MDg1NWFmY2M0MDJlM2MyYTZkZTk3Y2U4MjM1MDExYjFhZCIsCi0gICAgc3RyaXBfcHJlZml4ID0gInp1bHUxNS4yNy4xNy1jYS1qZGsxNS4wLjAtbGludXhfeDY0IiwKKyAgICBuYW1lID0gInJiZV9qZGsxMSIsCisgICAgc2hhMjU2ID0gIjc2Njc5NmRlNzE5MTYxMThlNTI4YjlmNDMzNGMyOWM5YzliNGU5MjYyMjdiZjMyNjRkZWU1NTVlNmE0MzA2YzgiLAorICAgIHN0cmlwX3ByZWZpeCA9ICJyYmVfYXV0b2NvbmZpZy0yLjAuMCIsCiAgICAgdXJscyA9IFsKLSAgICAgICAgImh0dHBzOi8vbWlycm9yLmJhemVsLmJ1aWxkL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLWxpbnV4X3g2NC50YXIuZ3oiLAotICAgICAgICAiaHR0cHM6Ly9jZG4uYXp1bC5jb20venVsdS9iaW4venVsdTE1LjI3LjE3LWNhLWpkazE1LjAuMC1saW51eF94NjQudGFyLmd6IiwKKyAgICAgICAgImh0dHBzOi8vZ2Vycml0LWJhemVsLnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcmJlX2F1dG9jb25maWcvdjIuMC4wLnRhci5neiIsCisgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZGF2aWRvL3JiZV9hdXRvY29uZmlnL2FyY2hpdmUvdjIuMC4wLnRhci5neiIsCiAgICAgXSwKICkKIAotaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAib3BlbmpkazE1X2Rhcndpbl9hcmNoaXZlIiwKLSAgICBidWlsZF9maWxlX2NvbnRlbnQgPSAiIiIKLWphdmFfcnVudGltZShuYW1lID0gJ3J1bnRpbWUnLCBzcmNzID0gIGdsb2IoWycqKiddKSwgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddKQotZXhwb3J0c19maWxlcyhbIldPUktTUEFDRSJdLCB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCi0iIiIsCi0gICAgc2hhMjU2ID0gImY4MGIyZTA1MTJkOWQ4YTkyYmUyNDQ5NzMzNGM5NzRiZmVjYzhjODk4ZmMyMTVjZTBlNzY1OTRmMDA0Mzc0ODIiLAotICAgIHN0cmlwX3ByZWZpeCA9ICJ6dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLW1hY29zeF94NjQiLAotICAgIHVybHMgPSBbCi0gICAgICAgICJodHRwczovL21pcnJvci5iYXplbC5idWlsZC9jZG4uYXp1bC5jb20venVsdS9iaW4venVsdTE1LjI3LjE3LWNhLWpkazE1LjAuMC1tYWNvc3hfeDY0LnRhci5neiIsCi0gICAgICAgICJodHRwczovL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLW1hY29zeF94NjQudGFyLmd6IiwKLSAgICBdLAotKQorcmVnaXN0ZXJfdG9vbGNoYWlucygiLy90b29sczplcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW5famF2YTExX2RlZmluaXRpb24iKQorCityZWdpc3Rlcl90b29sY2hhaW5zKCIvL3Rvb2xzOmVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTdfZGVmaW5pdGlvbiIpCiAKIEpNSF9WRVJTID0gIjEuMzIiCiAKQEAgLTEyMywxNCArOTIsMTQgQEAKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAic3NoZC1vc2dpIiwKLSAgICBhcnRpZmFjdCA9ICJvcmcuYXBhY2hlLnNzaGQ6c3NoZC1vc2dpOjIuNy4wIiwKLSAgICBzaGExID0gImExMDFhYWQwZjc5YWQ0MjQ0OTgwOThmN2U5MWMzOWQzZDkyMTc3YzEiLAorICAgIGFydGlmYWN0ID0gIm9yZy5hcGFjaGUuc3NoZDpzc2hkLW9zZ2k6Mi44LjAiLAorICAgIHNoYTEgPSAiYjJhNTliNzNjMDQ1ZjQwZDU3MjJiOTE2MGQ0ZjkwOWE2NDZkODZjOSIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gInNzaGQtc2Z0cCIsCi0gICAgYXJ0aWZhY3QgPSAib3JnLmFwYWNoZS5zc2hkOnNzaGQtc2Z0cDoyLjcuMCIsCi0gICAgc2hhMSA9ICIwYzllZmY3MTQ1ZTIwYjMzOGMxZGQ2YWNhMzZiYTkzZWQ3YzAxNDdjIiwKKyAgICBhcnRpZmFjdCA9ICJvcmcuYXBhY2hlLnNzaGQ6c3NoZC1zZnRwOjIuOC4wIiwKKyAgICBzaGExID0gImQzY2Q5YmM4ZDMzNWIzZWQxYTg2ZDI5NjVkZWI0ZDIwMmRlMjc0NDIiLAogKQogCiBtYXZlbl9qYXIoCkBAIC0yMzksOCArMjA4LDggQEAKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAiZ3NvbiIsCi0gICAgYXJ0aWZhY3QgPSAiY29tLmdvb2dsZS5jb2RlLmdzb246Z3NvbjoyLjguOCIsCi0gICAgc2hhMSA9ICI0MzFmYzNjYmMwZmY4MWFiZGJmZGUwNzAwNjI3NDEwODljM2JhODc0IiwKKyAgICBhcnRpZmFjdCA9ICJjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuOC45IiwKKyAgICBzaGExID0gIjhhNDMyYzFkNjgyNTc4MWUyMWEwMmRiMmUyYzMzYzVmZGUyODMzYjkiLAogKQogCiBKRVRUWV9WRVIgPSAiMTAuMC42IgpAQCAtMjk0LDMyICsyNjMsMzIgQEAKICAgICBzcmNfc2hhMSA9ICJmMzVmNTUyNWE1ZDMwZGMxMjM3Yjg1NDU3ZDc1OGQ1NzhlM2NlOGQwIiwKICkKIAotQk9VTkNZQ0FTVExFX1ZFUiA9ICIxLjY5IgorQk9VTkNZQ0FTVExFX1ZFUiA9ICIxLjcwIgogCiBtYXZlbl9qYXIoCiAgICAgbmFtZSA9ICJiY3BnIiwKICAgICBhcnRpZmFjdCA9ICJvcmcuYm91bmN5Y2FzdGxlOmJjcGctamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gImQ5OWEwOGMzZjY1MWIyNmU4ZWI2NjhlOTQxYjBiYmQyYzA5ZWNlMDgiLAotICAgIHNyY19zaGExID0gImRlMWZjMjYxYjQ0YThlYjYwNTgzNDEzYTMxZmZjOThjZTNkY2UzOGIiLAorICAgIHNoYTEgPSAiMDYyZjcyZWMwNmYzMWE2YzMxYTNmMzM1NWZjZTAzODRiMjExMjZkNyIsCisgICAgc3JjX3NoYTEgPSAiOWRlZTczYWQ5MjY3NTJlZTNiNDIxYTdkYzQ1MzEyODcxNjZjY2YzNiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjcHJvdiIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3Byb3YtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gIjkxZTE2MjgyNTFjZjNjYTkwMDkzY2U5ZDBmZTY3ZTViN2RhYjM4NTAiLAotICAgIHNyY19zaGExID0gIjY3ZGM2NDc2ODQ1ZjZiMjljYjUyMGI1ZGY2MWRiNjVhZTU2NzE4ZTQiLAorICAgIHNoYTEgPSAiNDYzNmEwZDAxZjc0YWNhZjI4MDgyZmI2MmIzMTdmMTA4MDExODM3MSIsCisgICAgc3JjX3NoYTEgPSAiNjI0NWUxNWRkNDdlNWZjMzNjZmYyNzVkZjYxNjYyZTBhOGU1OTU4ZiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjdXRpbCIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3V0aWwtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gImMzZWRmOTNkMzQ2ZTk3ZjY0ZjA0MWU0NDhlNzQ1NWMzOWM3ZWZmNjQiLAotICAgIHNyY19zaGExID0gImRlZWIzZmJiZjM3M2UwNWUyYTIwOTQxZjlhOGNlOTBlOWFlYWIzZDIiLAorICAgIHNoYTEgPSAiNTQyODBlNzE5NWE3NDMwZDc5MTFkZWQ5M2ZjMDFlMDczMDBiOTUyNiIsCisgICAgc3JjX3NoYTEgPSAiNGFmNGE2YzkyYjhlYTA3ODg1YjI3ZDg1MzZiODFiODU1NDk3ZjRlYiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjcGtpeCIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3BraXgtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gIjQ1YzM2ZmI3MmZhZmIwYjY4OGM2YWY3OTVlNmNjODAzZjZmNzllZTUiLAotICAgIHNyY19zaGExID0gIjhiYzUyMTQ0MDE0NTliZDkxZWVhODE2YjUxNjA3OWRhMzgzNzRlOTAiLAorICAgIHNoYTEgPSAiZjgxZTVhZjQ5NTcxYTlkNWExMDlhODhmMjM5YTczY2U4NzA1NTQxNyIsCisgICAgc3JjX3NoYTEgPSAiNDJmOWRlNTNhOTFiMjBiYzA2ZTg4NDgyYzU3ZmQ5N2U1YTg0MjUwZCIsCiApCmRpZmYgLS1naXQgYS9saWIvQlVJTEQgYi9saWIvQlVJTEQKaW5kZXggOTQ0MjdmNi4uNmJlOWU1NyAxMDA2NDQKLS0tIGEvbGliL0JVSUxECisrKyBiL2xpYi9CVUlMRApAQCAtOTcsNyArOTcsNyBAQAogamF2YV9saWJyYXJ5KAogICAgIG5hbWUgPSAiam5hIiwKICAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ol9fcGtnX18iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCiAgICAgXSwKICAgICBleHBvcnRzID0gWyJAam5hLy9qYXIiXSwKICkKQEAgLTEwNSw3ICsxMDUsNyBAQAogamF2YV9saWJyYXJ5KAogICAgIG5hbWUgPSAiam5hLXBsYXRmb3JtIiwKICAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ol9fcGtnX18iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCiAgICAgXSwKICAgICBleHBvcnRzID0gWyJAam5hLXBsYXRmb3JtLy9qYXIiXSwKICkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDk0MzM2NTguLjA5OTc1NzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNSwxMyArNSwxMyBAQAogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDZhZDY0MTUuLmJhNDczZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAxMGJmYmQyLi42MDAzYTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMyArMywxMyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKKyAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFudDt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50O3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudCwKICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGMzZWJmYjMuLmQwZGM1YzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYW50O3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5hbnQ7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IDQ0NDhmMmUuLmE3ZjI1OGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtMTUsNyArMTUsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYW50PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDYyZmU1YTUuLjNmYzhkZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0xMywxNyArMTMsMTcgQEAKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMuYnppcDI7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMuZ3ppcDt2ZXJzaW9uPSJbMS40LDIuMCkiLAogIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5jb21wcmVzc29ycy54ejt2ZXJzaW9uPSJbMS40LDIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUuRm9ybWF0QWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCiAgICBvcmcub3NnaS5mcmFtZXdvcmsiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZQorIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggZGVhYjJmYS4uOGM3ZmQwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbAppbmRleCA0NWYxMWRhLi4xMmYzZTY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYmVuY2htYXJrcy9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKaW5kZXggNTVjODBjNi4uYWMxZDZiZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKQEAgLTE0LDcgKzE0LDcgQEAKICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+Ci0gIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzPC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmNvdmVyYWdlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmNvdmVyYWdlL3BvbS54bWwKaW5kZXggNjNlYWQyNy4uYWJjMzdlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5jb3ZlcmFnZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuY292ZXJhZ2UvcG9tLnhtbApAQCAtMTQsNyArMTQsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CiAKQEAgLTI3LDg4ICsyNyw4OCBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnBnbTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudWk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9CVUlMRCBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvQlVJTEQKaW5kZXggMzViMTI1Zi4uOWU1ODEzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9CVUlMRAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L0JVSUxECkBAIC0xMCw4ICsxMCw4IEBACiBqdW5pdF90ZXN0cygKICAgICBuYW1lID0gImJjIiwKICAgICBzcmNzID0gZ2xvYihbInRzdC8qKi8qLmphdmEiXSksCi0gICAgcmVzb3VyY2VfamFycyA9IFsiOnRzdF9yc3JjIl0sCiAgICAgdGFncyA9IFsiYmMiXSwKKyAgICBydW50aW1lX2RlcHMgPSBbIjp0c3RfcnNyYyJdLAogICAgIGRlcHMgPSBbCiAgICAgICAgICIvL2xpYjpiY3BnIiwKICAgICAgICAgIi8vbGliOmJjcHJvdiIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkNzAzNDMyLi5iYjliMzkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTEyLDkgKzEyLDkgQEAKICBvcmcuYm91bmN5Y2FzdGxlLm9wZW5wZ3Aub3BlcmF0b3I7dmVyc2lvbj0iWzEuNjUuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUub3BlbnBncC5vcGVyYXRvci5qY2FqY2U7dmVyc2lvbj0iWzEuNjUuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVyczt2ZXJzaW9uPSJbMS42NS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWwua2V5czt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbC5rZXlzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L3BvbS54bWwKaW5kZXggYWQ5NTViMC4uOTU2OGM2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDc0ZTMzMDUuLjUzNDU2OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEwICszLDEwIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYztzaW5nbGV0b246PXRydWUKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmpnaXQ7YnVuZGxlLXZlcnNpb249Ils2LjAuMSw2LjEuMCkiCitGcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5qZ2l0O2J1bmRsZS12ZXJzaW9uPSJbNi4xLjEsNi4yLjApIgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQogSW1wb3J0LVBhY2thZ2U6IG9yZy5ib3VuY3ljYXN0bGUuYXNuMTt2ZXJzaW9uPSJbMS42OS4wLDIuMC4wKSIsCiAgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNyeXB0bGliO3ZlcnNpb249IlsxLjY5LjAsMi4wLjApIiwKQEAgLTI5LDkgKzI5LDkgQEAKICBvcmcuYm91bmN5Y2FzdGxlLnV0aWw7dmVyc2lvbj0iWzEuNjkuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVyczt2ZXJzaW9uPSJbMS42OS4wLDIuMC4wKSIsCiAgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmlvO3ZlcnNpb249IlsxLjY5LjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYzt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmludGVybmFsLmtleXM7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmM7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbC5rZXlzO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0IgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGRlNDk2MmIuLjIwZTJkMDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmM7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9wb20ueG1sCmluZGV4IDRiZjgyYzYuLjEzOGY0ZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYzUxYTg3ZS4uYWZjYWE3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCkBAIC0yNSwxMSArMjUsMTEgQEAKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uO3ZlcnNpb249Ils0LjQuMCw1LjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXM7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLnNzbDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLmh0dHAuY2xpZW50LAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDlkNGY1ZjIuLjdiOGUxNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbAppbmRleCA2ZTVmMjYwLi5iZDM1NTg5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzMyYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5VcGxvYWRQYWNrRXJyb3JIYW5kbGVyIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMTIxMDA1NjcwNyI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjYuMS4xIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InN0YXR1c0NvZGVGb3JUaHJvd2FibGUoVGhyb3dhYmxlKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNTEwYzQzOS4uNGJmNjZhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEzICszLDEzIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWU7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cCIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCkBAIC0xOCwxNCArMTgsMTQgQEAKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0O3ZlcnNpb249IlsyLjUuMCw1LjAuMCkiLAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMi41LjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggNzQ1M2NiOC4uMmI0NzA1NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCmluZGV4IGIwMWM3OTEuLjZhNzg4ZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTbWFydEh0dHBUb29scy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTbWFydEh0dHBUb29scy5qYXZhCmluZGV4IDAxMmY5YTMuLmYxMTU1ZGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvR2l0U21hcnRIdHRwVG9vbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNtYXJ0SHR0cFRvb2xzLmphdmEKQEAgLTE1OCwxMSArMTU4LDExIEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJfQogCiAJCWlmIChpc0luZm9SZWZzKHJlcSkpIHsKLQkJCXNlbmRJbmZvUmVmc0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0KTsKKwkJCXNlbmRJbmZvUmVmc0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIGlmIChpc1VwbG9hZFBhY2socmVxKSkgewotCQkJc2VuZFVwbG9hZFBhY2tFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCk7CisJCQlzZW5kVXBsb2FkUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIGlmIChpc1JlY2VpdmVQYWNrKHJlcSkpIHsKLQkJCXNlbmRSZWNlaXZlUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0KTsKKwkJCXNlbmRSZWNlaXZlUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChodHRwU3RhdHVzIDwgNDAwKQogCQkJCVNlcnZsZXRVdGlscy5jb25zdW1lUmVxdWVzdEJvZHkocmVxKTsKQEAgLTE3MSwyOSArMTcxLDMyIEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRJbmZvUmVmc0Vycm9yKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0JCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRleHRGb3JHaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRleHRGb3JHaXQsIGludCBodHRwU3RhdHVzKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTI4KTsKIAkJUGFja2V0TGluZU91dCBwY2sgPSBuZXcgUGFja2V0TGluZU91dChidWYpOwogCQlTdHJpbmcgc3ZjID0gcmVxLmdldFBhcmFtZXRlcigic2VydmljZSIpOwogCQlwY2sud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgIlxuIik7CiAJCXBjay5lbmQoKTsKIAkJcGNrLndyaXRlU3RyaW5nKCJFUlIgIiArIHRleHRGb3JHaXQpOwotCQlzZW5kKHJlcSwgcmVzLCBpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSwgYnVmLnRvQnl0ZUFycmF5KCkpOworCQlzZW5kKHJlcSwgcmVzLCBpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSwgYnVmLnRvQnl0ZUFycmF5KCksIGh0dHBTdGF0dXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgc2VuZFVwbG9hZFBhY2tFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0LCBpbnQgaHR0cFN0YXR1cykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIERvIG5vdCB1c2Ugc2lkZWJhbmQuIFNpZGViYW5kIGlzIGFjY2VwdGFibGUgb25seSB3aGlsZSBwYWNrZmlsZSBpcwogCQkvLyBiZWluZyBzZW50LiBPdGhlciBwbGFjZXMsIGxpa2UgYWNrbm93bGVkZ2VtZW50IHNlY3Rpb24sIGRvIG5vdAogCQkvLyBzdXBwb3J0IHNpZGViYW5kLiBVc2UgYW4gZXJyb3IgcGFja2V0LgogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMjgpOwogCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KGJ1Zik7CiAJCXdyaXRlUGFja2V0KHBja091dCwgdGV4dEZvckdpdCk7Ci0JCXNlbmQocmVxLCByZXMsIFVQTE9BRF9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSk7CisJCXNlbmQocmVxLCByZXMsIFVQTE9BRF9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSwgaHR0cFN0YXR1cyk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kUmVjZWl2ZVBhY2tFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0LCBpbnQgaHR0cFN0YXR1cykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEyOCk7CiAJCVBhY2tldExpbmVPdXQgcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQoYnVmKTsKIApAQCAtMjEyLDcgKzIxNSw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZFJlY2VpdmVQYWNrRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJCXdyaXRlU2lkZUJhbmQoYnVmLCB0ZXh0Rm9yR2l0KTsKIAkJZWxzZQogCQkJd3JpdGVQYWNrZXQocGNrT3V0LCB0ZXh0Rm9yR2l0KTsKLQkJc2VuZChyZXEsIHJlcywgUkVDRUlWRV9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSk7CisJCXNlbmQocmVxLCByZXMsIFJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwgYnVmLnRvQnl0ZUFycmF5KCksIGh0dHBTdGF0dXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZWNlaXZlUGFja1NpZGVCYW5kKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKQEAgLTI0Niw5ICsyNDksOSBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUGFja2V0KFBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgdGV4dEZvckdpdCkKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCi0JCQlTdHJpbmcgdHlwZSwgYnl0ZVtdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCVN0cmluZyB0eXBlLCBieXRlW10gYnVmLCBpbnQgaHR0cFN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJU2VydmxldFV0aWxzLmNvbnN1bWVSZXF1ZXN0Qm9keShyZXEpOwotCQlyZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOworCQlyZXMuc2V0U3RhdHVzKGh0dHBTdGF0dXMpOwogCQlyZXMuc2V0Q29udGVudFR5cGUodHlwZSk7CiAJCXJlcy5zZXRDb250ZW50TGVuZ3RoKGJ1Zi5sZW5ndGgpOwogCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrRXJyb3JIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YQppbmRleCAwM2JlMDg3Li4yYWFkYmJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YQpAQCAtOSwxMyArOSwxOSBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7CiAKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX09LOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5QYWNrUHJvdG9jb2xFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CiAKIC8qKgogICogSGFuZGxlIGdpdC11cGxvYWQtcGFjayBlcnJvcnMuCkBAIC0zNSw2ICs0MSwyNCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFVwbG9hZFBhY2tFcnJvckhhbmRsZXIgewogCS8qKgorCSAqIE1hcHMgYSB0aHJvd24gZ2l0IHJlbGF0ZWQgRXhjZXB0aW9uIHRvIGFuIGFwcHJvcHJpYXRlIEhUVFAgc3RhdHVzIGNvZGUuCisJICoKKwkgKiBAcGFyYW0gZXJyb3IKKwkgKiAgICAgICAgICAgIFRoZSB0aHJvd24gRXhjZXB0aW9uLgorCSAqIEByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgYXMgYW4gaW50CisJICogQHNpbmNlIDYuMS4xCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgc3RhdHVzQ29kZUZvclRocm93YWJsZShUaHJvd2FibGUgZXJyb3IpIHsKKwkJaWYgKGVycm9yIGluc3RhbmNlb2YgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBTQ19GT1JCSURERU47CisJCX0KKwkJaWYgKGVycm9yIGluc3RhbmNlb2YgUGFja1Byb3RvY29sRXhjZXB0aW9uKSB7CisJCQkvLyBJbnRlcm5hbCBnaXQgZXJyb3JzIGFyZSBub3QgZXJyb3JzIGZyb20gYW4gSFRUUCBzdGFuZHBvaW50LgorCQkJcmV0dXJuIFNDX09LOworCQl9CisJCXJldHVybiBTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisJfQorCS8qKgogCSAqIEBwYXJhbSByZXEKIAkgKiAgICAgICAgICAgIFRoZSBIVFRQIHJlcXVlc3QKIAkgKiBAcGFyYW0gcnNwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKaW5kZXggYzRmODQ1ZS4uYjBhMDdmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQpAQCAtMTEsNyArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyOwogCiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTjsKLWltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQ7CiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuR2l0U21hcnRIdHRwVG9vbHMuVVBMT0FEX1BBQ0s7CkBAIC0yMiw2ICsyMSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzLmNvbnN1bWVSZXF1ZXN0Qm9keTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHMuZ2V0SW5wdXRTdHJlYW07CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuVXBsb2FkUGFja0Vycm9ySGFuZGxlci5zdGF0dXNDb2RlRm9yVGhyb3dhYmxlOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX1VTRVJfQUdFTlQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTY5LDYgKzE2OSw3IEBAIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkKIAogCQlVcGxvYWRQYWNrUnVubmFibGUgciA9ICgpIC0+IHsKIAkJCVVwbG9hZFBhY2sgdXAgPSAoVXBsb2FkUGFjaykgcmVxLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSEFORExFUik7CisJCQkvLyB0byBiZSBleHBsaWNpdGx5IGNsb3NlZCBieSBjYWxsZXIKIAkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCQlTbWFydE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgU21hcnRPdXRwdXRTdHJlYW0ocmVxLCByc3AsIGZhbHNlKSB7CiAJCQkJQE92ZXJyaWRlCkBAIC0yMTcsOSArMjE4LDEyIEBAIHByaXZhdGUgdm9pZCBkZWZhdWx0VXBsb2FkUGFja0hhbmRsZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJCWxvZyh1cC5nZXRSZXBvc2l0b3J5KCksIGUpOwogCQkJaWYgKCFyc3AuaXNDb21taXR0ZWQoKSkgewogCQkJCXJzcC5yZXNldCgpOwotCQkJCVN0cmluZyBtc2cgPSBlIGluc3RhbmNlb2YgUGFja1Byb3RvY29sRXhjZXB0aW9uID8gZS5nZXRNZXNzYWdlKCkKLQkJCQkJCTogbnVsbDsKLQkJCQlzZW5kRXJyb3IocmVxLCByc3AsIFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgbXNnKTsKKwkJCQlTdHJpbmcgbXNnID0gbnVsbDsKKwkJCQlpZiAoZSBpbnN0YW5jZW9mIFBhY2tQcm90b2NvbEV4Y2VwdGlvbgorCQkJCQkJfHwgZSBpbnN0YW5jZW9mIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uKSB7CisJCQkJCW1zZyA9IGUuZ2V0TWVzc2FnZSgpOworCQkJCX0KKwkJCQlzZW5kRXJyb3IocmVxLCByc3AsIHN0YXR1c0NvZGVGb3JUaHJvd2FibGUoZSksIG1zZyk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDNhNjUxN2MuLjQxNTBiZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTI2LDI2ICsyNiwyNiBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCmluZGV4IDc2OTRjNDQuLjMzNmY0M2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbApAQCAtMTgsNyArMTgsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0hvb2tNZXNzYWdlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0hvb2tNZXNzYWdlVGVzdC5qYXZhCmluZGV4IGRiOWYyYWUuLjIwZGUyNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Ib29rTWVzc2FnZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSG9va01lc3NhZ2VUZXN0LmphdmEKQEAgLTk3LDYgKzk3LDcgQEAgcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQlzZXJ2ZXIuc2V0VXAoKTsKIAogCQlyZW1vdGVSZXBvc2l0b3J5ID0gc3JjLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVtb3RlUmVwb3NpdG9yeSk7CiAJCXJlbW90ZVVSSSA9IHRvVVJJaXNoKGFwcCwgc3JjTmFtZSk7CiAKIAkJU3RvcmVkQ29uZmlnIGNmZyA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKaW5kZXggZGYwOTNjMS4uMzQzOGM1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwpAQCAtMzA4LDcgKzMwOSwxMCBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZV9TbWFydF9VcGxvYWRQYWNrRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlmYWlsKCJjb25uZWN0aW9uIG9wZW5lZCBldmVuIHRob3VnaCBzZXJ2aWNlIGRpc2FibGVkIik7CiAJCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZXJyKSB7CiAJCQkJU3RyaW5nIGV4cCA9IHNtYXJ0QXV0aE5vbmVVUkkgKyAiOiAiCi0JCQkJCQkrIEpHaXRUZXh0LmdldCgpLnNlcnZpY2VOb3RFbmFibGVkTm9OYW1lOworCQkJCQkJKyBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuc2VydmljZU5vdFBlcm1pdHRlZCwKKwkJCQkJCQkJc21hcnRBdXRoTm9uZVVSSS50b1N0cmluZygpICsgIi8iLAorCQkJCQkJCQkiZ2l0LXVwbG9hZC1wYWNrIik7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cCwgZXJyLmdldE1lc3NhZ2UoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9NZWFzdXJlUGFja1NpemVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvTWVhc3VyZVBhY2tTaXplVGVzdC5qYXZhCmluZGV4IDlmZmExOWUuLjAwMGVlY2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9NZWFzdXJlUGFja1NpemVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L01lYXN1cmVQYWNrU2l6ZVRlc3QuamF2YQpAQCAtOTAsNiArOTAsNyBAQCBwdWJsaWMgUmVjZWl2ZVBhY2sgY3JlYXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlcG9zaXRvcnkgZGIpCiAJCXNlcnZlci5zZXRVcCgpOwogCiAJCXJlbW90ZVJlcG9zaXRvcnkgPSBzcmMuZ2V0UmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShyZW1vdGVSZXBvc2l0b3J5KTsKIAkJcmVtb3RlVVJJID0gdG9VUklpc2goYXBwLCBzcmNOYW1lKTsKIAogCQlTdG9yZWRDb25maWcgY2ZnID0gcmVtb3RlUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TbWFydENsaWVudFNtYXJ0U2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKaW5kZXggODg3ZTk3MC4uYjliMTBiNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LlNlcnZsZXRIb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlRyYW5zcG9ydENvbmZpZ0NhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuR2l0U2VydmxldDsKQEAgLTQ5Niw4ICs0OTYsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZV9CYWROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQl0Lm9wZW5GZXRjaCgpOwogCQkJCWZhaWwoImZldGNoIGNvbm5lY3Rpb24gb3BlbmVkIik7Ci0JCQl9IGNhdGNoIChSZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uIG5vdEZvdW5kKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKHVyaSArICI6IEdpdCByZXBvc2l0b3J5IG5vdCBmb3VuZCIsCisJCQl9IGNhdGNoIChOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24gbm90Rm91bmQpIHsKKwkJCQlhc3NlcnRFcXVhbHModXJpICsgIjogIiArIHVyaQorCQkJCQkJKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayBub3QgZm91bmQ6IE5vdCBGb3VuZCIsCiAJCQkJCQlub3RGb3VuZC5nZXRNZXNzYWdlKCkpOwogCQkJfQogCQl9CkBAIC01MTAsNyArNTExLDcgQEAgcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdGVfQmFkTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGpvaW4odXJpLCAiaW5mby9yZWZzIiksIGluZm8uZ2V0UGF0aCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGluZm8uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CiAJCWFzc2VydEVxdWFscygiZ2l0LXVwbG9hZC1wYWNrIiwgaW5mby5nZXRQYXJhbWV0ZXIoInNlcnZpY2UiKSk7Ci0JCWFzc2VydEVxdWFscygyMDAsIGluZm8uZ2V0U3RhdHVzKCkpOworCQlhc3NlcnRFcXVhbHMoNDA0LCBpbmZvLmdldFN0YXR1cygpKTsKIAkJYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi94LWdpdC11cGxvYWQtcGFjay1hZHZlcnRpc2VtZW50IiwKIAkJCQlpbmZvLmdldFJlc3BvbnNlSGVhZGVyKEhEUl9DT05URU5UX1RZUEUpKTsKIAl9CkBAIC01MzgsNiArNTM5LDcgQEAgcHVibGljIHZvaWQgdGVzdEZldGNoQnlTSEExVW5yZWFjaGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoCiAJCQkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZUNvbW1pdC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKIAkJfQorCQlhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoMjAwKTsKIAl9CiAKIAlAVGVzdApAQCAtNTYwLDYgKzU2Miw3IEBAIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZWY+IGdldEFkdmVydGlzZWRSZWZzKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwKIAkJCWFzc2VydFRydWUoCiAJCQkJCWUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJ3YW50ICIgKyBBLm5hbWUoKSArICIgbm90IHZhbGlkIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgyMDApOwogCX0KIAogCUBUZXN0CkBAIC05MTYsNiArOTE5LDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDbG9uZV9SZWRpcmVjdE9uUG9zdEZvcmJpZGRlbigpIHRocm93cyBFeGNlcHRpb24gewogCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkgewogCQkJYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiMzAxIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgzMDEpOwogCX0KIAogCUBUZXN0CkBAIC05MzQsNiArOTM4LDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDbG9uZV9SZWRpcmVjdEZvcmJpZGRlbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZSgKIAkJCQkJZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImh0dHAuZm9sbG93UmVkaXJlY3RzIGlzIGZhbHNlIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgzMDEpOwogCX0KIAogCXByaXZhdGUgdm9pZCBhc3NlcnRGZXRjaFJlcXVlc3RzKExpc3Q8QWNjZXNzRXZlbnQ+IHJlcXVlc3RzLCBpbnQgaW5kZXgpIHsKQEAgLTE2MDcsNiArMTYxMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkV2FudCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZShlcnIuZ2V0TWVzc2FnZSgpCiAJCQkJCS5jb250YWlucygid2FudCAiICsgaWQubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CiAJCX0KKwkJYXNzZXJ0TGFzdFJlcXVlc3RTdGF0dXNDb2RlKDIwMCk7CiAJfQogCiAJQFRlc3QKQEAgLTE2NTAsNyArMTY1Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGZXRjaF9SZWZzVW5yZWFkYWJsZU9uVXBsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJZmFpbCgiU3VjY2Vzc2Z1bGx5IHNlcnZlZCByZWYgd2l0aCB2YWx1ZSAiICsgYy5nZXRSZWYobWFzdGVyKSk7CiAJCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZXJyKSB7CiAJCQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSAiICsgZXJyLmdldE1lc3NhZ2UoKSwKLQkJCQkJCWVyci5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkludGVybmFsIHNlcnZlciBlcnJvciIpKTsKKwkJCQkJCWVyci5nZXRNZXNzYWdlKCkuY29udGFpbnMoIlNlcnZlciBFcnJvciIpKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCW5vUmVmU2VydmVyLnRlYXJEb3duKCk7CkBAIC0xODIxLDYgKzE4MjcsMTEgQEAgcHVibGljIHZvaWQgdGVzdFB1c2hfQ2h1bmtlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJLmdldFJlc3BvbnNlSGVhZGVyKEhEUl9DT05URU5UX1RZUEUpKTsKIAl9CiAKKwlwcml2YXRlIHZvaWQgYXNzZXJ0TGFzdFJlcXVlc3RTdGF0dXNDb2RlKGludCBzdGF0dXNDb2RlKSB7CisJCUxpc3Q8QWNjZXNzRXZlbnQ+IHJlcXVlc3RzID0gZ2V0UmVxdWVzdHMoKTsKKwkJYXNzZXJ0RXF1YWxzKHN0YXR1c0NvZGUsIHJlcXVlc3RzLmdldChyZXF1ZXN0cy5zaXplKCkgLSAxKS5nZXRTdGF0dXMoKSk7CisJfQorCiAJcHJpdmF0ZSB2b2lkIGVuYWJsZVJlY2VpdmVQYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RvcmVkQ29uZmlnIGNmZyA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CiAJCWNmZy5zZXRCb29sZWFuKCJodHRwIiwgbnVsbCwgInJlY2VpdmVwYWNrIiwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYzIxZjgzNS4uZDAzNTA3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CkBAIC0yMSwxNyArMjEsMTcgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNzbDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuc2xmNGouaGVscGVyczt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI2LjAuMSI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIGphdmF4LnNlcnZsZXQuaHR0cCwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDk4ZmRlMDYuLjE5MTQyYzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKaW5kZXggYjY2OTkxZi4uZDg4M2UwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9IdHRwVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0h0dHBUZXN0Q2FzZS5qYXZhCmluZGV4IDNlN2M4NGYuLjg3N2I5MTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0h0dHBUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0h0dHBUZXN0Q2FzZS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldENvbnRleHRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkZpbGVSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CkBAIC04MCw3ICs4MSw5IEBAIHByb3RlY3RlZCBBcHBTZXJ2ZXIgY3JlYXRlU2VydmVyKCkgewogCSAqLwogCXByb3RlY3RlZCBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBjcmVhdGVUZXN0UmVwb3NpdG9yeSgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RSZXBvc2l0b3J5PD4oY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSk7CisJCWZpbmFsIEZpbGVSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShyZXBvc2l0b3J5KTsKKwkJcmV0dXJuIG5ldyBUZXN0UmVwb3NpdG9yeTw+KHJlcG9zaXRvcnkpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA4ZDYyOWVkLi42MDg1OGQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw0NiArMyw0NiBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5zc2hkLmNvbW1vbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZmlsZS52aXJ0dWFsZnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5oZWxwZXJzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaW87dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubG9nZ2luZzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnRocmVhZHM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLmdzczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGgua2V5Ym9hcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLnBhc3N3b3JkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuY29tbWFuZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnNlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5zaGVsbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnN1YnN5c3RlbTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zZXJ2ZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuc3NoZC5jb21tb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmZpbGUudmlydHVhbGZzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmlvO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmxvZ2dpbmc7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnNlY3VyaXR5O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC50aHJlYWRzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb3JlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aC5nc3M7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLmtleWJvYXJkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aC5wYXNzd29yZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmNvbW1hbmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5zZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc2hlbGw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5zdWJzeXN0ZW07dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHA7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHAuc2VydmVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLnNsZjRqO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iNi4wLjEiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iNi4xLjEiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggNzEzMmI1Yi4uNDEyNDZiYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL3BvbS54bWwKaW5kZXggNzZiZGNhMS4uMDdkMDIxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g8L2FydGlmYWN0SWQ+CkBAIC01NSw2ICs1NSwxNiBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zc2hkPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+c3NoZC1zZnRwPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHthcGFjaGUtc3NoZC12ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NoZC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NoZC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YTcyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxjb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQiIHZlcnNpb249IjIiPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UiPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzY2NTg0ODEiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjdXJyZW50VGVzdCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI2LjAuMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjdXJyZW50VGVzdCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMWYwMjFkYS4uN2EzYjIwMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDM1ICszLDM1IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcnM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVycy5tb2RlbDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLApAQCAtNDQsNCArNDQsNCBAQAogICAgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwsCiAgICBvcmcuanVuaXQucnVubmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWUiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI2LjAuMSI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lIgorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI2LjEuMSI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCAxNTZlNTlhLi4yNTg3NmM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0IC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKaW5kZXggZWYyYjk0Ni4uMmMyNjBlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbApAQCAtMTksNyArMTksNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQppbmRleCA0OTRkMmYzLi41OTY2MmNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKQEAgLTQ1LDYgKzQ1LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKIAogLyoqCiAgKiBKVW5pdCBUZXN0Q2FzZSB3aXRoIHNwZWNpYWxpemVkIHN1cHBvcnQgZm9yIHRlbXBvcmFyeSBsb2NhbCByZXBvc2l0b3J5LgpAQCAtODQsMTggKzg2LDM1IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UgewogCXByaXZhdGUgRmlsZSB0bXA7CiAKIAkvKioKKwkgKiBUaGUgY3VycmVudCB0ZXN0IG5hbWUuCisJICoKKwkgKiBAc2luY2UgNi4wLjEKKwkgKi8KKwlAUnVsZQorCXB1YmxpYyBUZXN0TmFtZSBjdXJyZW50VGVzdCA9IG5ldyBUZXN0TmFtZSgpOworCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7CisJCVN0cmluZyBuYW1lID0gY3VycmVudFRlc3QuZ2V0TWV0aG9kTmFtZSgpOworCQluYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJbXmEtekEtWjAtOV0iLCAiXyIpOworCQluYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJfXysiLCAiXyIpOworCQlpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIHsKKwkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKKwkJfQorCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKIAkgKiBTZXR1cCB0ZXN0CiAJICoKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwogCUBCZWZvcmUKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJqZ2l0X3Rlc3RfIiwgIl90bXAiKTsKKwkJdG1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiamdpdF8iICsgZ2V0VGVzdE5hbWUoKSArICdfJywgIl90bXAiKTsKIAkJQ2xlYW51cFRocmVhZC5kZWxldGVPblNodXRkb3duKHRtcCk7CiAJCWlmICghdG1wLmRlbGV0ZSgpIHx8ICF0bXAubWtkaXIoKSkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlICIgKyB0bXApOwogCQl9Ci0KIAkJbW9ja1N5c3RlbVJlYWRlciA9IG5ldyBNb2NrU3lzdGVtUmVhZGVyKCk7CiAJCVN5c3RlbVJlYWRlci5zZXRJbnN0YW5jZShtb2NrU3lzdGVtUmVhZGVyKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBiMmE4MmMyLi5jYmI4MTM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0yNiwyNCArMjYsMjQgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnRocmVhZDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCmluZGV4IGVmODc1MWUuLjFiYWI2MjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9QdXNoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9QdXNoVGVzdC5qYXZhCmluZGV4IDcwYzA0NjMuLjA2NzA4YjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvUHVzaFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1B1c2hUZXN0LmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CkBAIC0yOSw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5GaWxlUmVwb3NpdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmU3BlYzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2g7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5QYXRoRmlsdGVyOwpAQCAtMTI4LDQgKzEzMCwxOCBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCXNlcnZlci5nZXRSZXF1ZXN0cygpLnRvU3RyaW5nKCkpOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlbGV0ZUJyYW5jaCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnJhbmNoID0gIm5ldy1icmFuY2giOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZShicmFuY2gpLmNhbGwoKTsKKworCQlTdHJpbmcgZGVzdFJlZiA9IENvbnN0YW50cy5SX0hFQURTICsgYnJhbmNoOworCQlnaXQucHVzaCgpLnNldFJlZlNwZWNzKG5ldyBSZWZTcGVjKCkuc2V0U291cmNlKGJyYW5jaCkuc2V0RGVzdGluYXRpb24oZGVzdFJlZikpLmNhbGwoKTsKKworCQkvLyBTaG91bGQgbm90IGZhaWwgb24gcHVzaC4KKwkJZ2l0LmJyYW5jaERlbGV0ZSgpLnNldEJyYW5jaE5hbWVzKGJyYW5jaCkuc2V0Rm9yY2UodHJ1ZSkuY2FsbCgpOworCQlnaXQucHVzaCgpLnNldFJlZlNwZWNzKG5ldyBSZWZTcGVjKCkuc2V0U291cmNlKG51bGwpLnNldERlc3RpbmF0aW9uKGRlc3RSZWYpKS5jYWxsKCk7CisKKwkJYXNzZXJ0VHJ1ZShzZXJ2ZXIuZ2V0UmVxdWVzdHMoKS5pc0VtcHR5KCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAzYTQ0NDhiLi5jZDhiZGUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0iamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LAogICAgamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYiIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTI0LDE1ICsyNCwxNSBAQAogIGphdmF4LnNlcnZsZXQuYW5ub3RhdGlvbjt2ZXJzaW9uPSJbMy4xLjAsNS4wLjApIiwKICBqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0iWzMuMS4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwO3ZlcnNpb249Ils0LjMuMCw1LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggNTAxMWEyMi4uNWE1YjIzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAppbmRleCBjMmQ2NTk2Li5hZTI3MTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGI4NzA3OTQuLmUzYzBhZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywyNCArMywyNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvcmU7dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249IjYuMC4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdCIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbAppbmRleCBhODhjYTk0Li4xZDc4MmU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0NvbmZpZ0dpdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0NvbmZpZ0dpdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGEwNzEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzQ29uZmlnR2l0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBNYXR0aGlhcyBGcm9tbWUgPG1mcm9tbWVAZHNwYWNlLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5SZXNldENvbW1hbmQuUmVzZXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWwuTGZzQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBpZiB0aGUgbGZzIGNvbmZpZyBpcyB1c2VkIGluIHRoZSBjb3JyZWN0IHdheSBkdXJpbmcgY2hlY2tvdXQuCisgKgorICogVHdvIGxmcy1maWxlcyBhcmUgY3JlYXRlZCwgb25lIHRoYXQgY29tZXMgYmVmb3JlIC5naXRhdHRyaWJ1dGVzIGFuZAorICogLmxmc2NvbmZpZyBpbiBnaXQgb3JkZXIgKCIuYWFhLnR4dCIpIGFuZCBvbmUgdGhhdCBjb21lcyBhZnRlciAoInp6ei50eHQiKS4KKyAqCisgKiBEdXJpbmcgY2hlY2tvdXQvcmVzZXQgaXQgaXMgdGVzdGVkIGlmIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGxmcyBjb25maWcKKyAqIGlzIHVzZWQuCisgKgorICogVE9ETzogVGhlIGN1cnJlbnQgYmVoYXZpb3Igc2VlbXMgYSBsaXR0bGUgYml0IHN0cmFuZ2UvdW5pbnR1aXRpdmUuIFNvbWUgZmlsZXMKKyAqIGFyZSBjaGVja2VkIG91dCBiZWZvcmUgYW5kIHNvbWUgYWZ0ZXIgdGhlIGNvbmZpZyBmaWxlcy4gVGhpcyBsZWFkcyB0byB0aGUKKyAqIGJlaGF2aW9yLCB0aGF0IGR1cmluZyBhIHNpbmdsZSBjb21tYW5kIHRoZSBjb25maWcgY2hhbmdlcy4gU2luY2UgdGhpcyBzZWVtcworICogdG8gYmUgdGhlIHNhbWUgd2F5IGluIG5hdGl2ZSBnaXQsIHRoZSBiZWhhdmlvciBpcyBhY2NlcHRlZCBmb3Igbm93LgorICoKKyAqLworcHVibGljIGNsYXNzIExmc0NvbmZpZ0dpdFRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNVURHRV9OQU1FID0gb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkJVSUxUSU5fRklMVEVSX1BSRUZJWAorCQkJKyBDb25zdGFudHMuQVRUUl9GSUxURVJfRFJJVkVSX1BSRUZJWAorCQkJKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0U7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEZTX1NFUlZFUl9VUkkxID0gImh0dHBzOi8vbGZzLnNlcnZlcjEvdGVzdC91cmkiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1NFUlZFUl9VUkwxID0gTEZTX1NFUlZFUl9VUkkxCisJCQkrIFByb3RvY29sLk9CSkVDVFNfTEZTX0VORFBPSU5UOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExGU19TRVJWRVJfVVJJMiA9ICJodHRwczovL2xmcy5zZXJ2ZXIyL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9TRVJWRVJfVVJMMiA9IExGU19TRVJWRVJfVVJJMgorCQkJKyBQcm90b2NvbC5PQkpFQ1RTX0xGU19FTkRQT0lOVDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRlNfU0VSVkVSX1VSSTMgPSAiaHR0cHM6Ly9sZnMuc2VydmVyMy90ZXN0L3VyaSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfU0VSVkVSX1VSTDMgPSBMRlNfU0VSVkVSX1VSSTMKKwkJCSsgUHJvdG9jb2wuT0JKRUNUU19MRlNfRU5EUE9JTlQ7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFLRV9MRlNfUE9JTlRFUjEgPSAidmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxXG4iCisJCQkrICJvaWQgc2hhMjU2OjZjZTlmYWI1MmVlOWE2YzRjMDk3ZGVmNGUwNDljNmFjZGViYTQ0Yzk5ZDI2ZTgzYmE4MGFkZWMxNDczYzliMmRcbiIKKwkJCSsgInNpemUgMjUzOTUyXG4iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfTEZTX1BPSU5URVIyID0gInZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MVxuIgorCQkJKyAib2lkIHNoYTI1NjphNGI3MTFjZDk4OTg2M2FlMjAzODc1OGE2MjY3MjEzODM0N2FiYmJhZTQwNzZhN2FkM2E1NDVmZGE3ZDA4ZjgyXG4iCisJCQkrICJzaXplIDY3MDcyXG4iOworCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGNoZWNrb3V0VVJMcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJc3RhdGljIGNsYXNzIFNtdWRnZUZpbHRlck1vY2sgZXh0ZW5kcyBGaWx0ZXJDb21tYW5kIHsKKwkJcHVibGljIFNtdWRnZUZpbHRlck1vY2soUmVwb3NpdG9yeSBkYiwgSW5wdXRTdHJlYW0gaW4sCisJCQkJT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXN1cGVyKGluLCBvdXQpOworCQkJSHR0cENvbm5lY3Rpb24gbGZzU2VydmVyQ29ubiA9IExmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsCisJCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULCBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCQkJY2hlY2tvdXRVUkxzLmFkZChsZnNTZXJ2ZXJDb25uLmdldFVSTCgpLnRvU3RyaW5nKCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCS8vIFN0dXBpZCBubyBpbXBsCisJCQlpbi50cmFuc2ZlclRvKG91dCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbExmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKFNNVURHRV9OQU1FLCBTbXVkZ2VGaWx0ZXJNb2NrOjpuZXcpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnVucmVnaXN0ZXIoU01VREdFX05BTUUpOworCX0KKworCXByaXZhdGUgR2l0IGdpdDsKKworCUBPdmVycmlkZQorCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlnaXQgPSBuZXcgR2l0KGRiKTsKKwkJLy8gY29tbWl0IHNvbWV0aGluZworCQl3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCAiSGVsbG8gd29ybGQiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJUZXN0LnR4dCIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkluaXRpYWwgY29tbWl0IikuY2FsbCgpOworCQkvLyBwcmVwYXJlIHRoZSBjb25maWcgZm9yIExGUworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgImxmcyIsICJzbXVkZ2UiLCBTTVVER0VfTkFNRSk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYsICJmYWxzZSIpOworCQljb25maWcuc2F2ZSgpOworCisJCWZpbGVCZWZvcmUgPSBudWxsOworCQlmaWxlQWZ0ZXIgPSBudWxsOworCQljb25maWdGaWxlID0gbnVsbDsKKwkJZ2l0QXR0cmlidXRlc0ZpbGUgPSBudWxsOworCX0KKworCUZpbGUgZmlsZUJlZm9yZTsKKworCUZpbGUgZmlsZUFmdGVyOworCisJRmlsZSBjb25maWdGaWxlOworCisJRmlsZSBnaXRBdHRyaWJ1dGVzRmlsZTsKKworCXByaXZhdGUgdm9pZCBjcmVhdGVMZnNGaWxlcyhTdHJpbmcgbGZzUG9pbnRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8qCisJCSAqIEZpbGVOYW1lcyAiLmFhYS50eHQiIGFuZCAienp6LnR4dCIgc2VlbSB0byBiZSBzdWZmaWNpZW50IHRvIGdldCB0aGUKKwkJICogZGVzaXJlZCBjaGVja291dCBvcmRlciBiZWZvcmUgYW5kIGFmdGVyICIubGZzY29uZmlnIiwgYXQgbGVhc3QgaW4gYQorCQkgKiBudW1iZXIgb2YgbWFudWFsIHRyaWVzLiBTaW5jZSB0aGUgZmlsZXMgdG8gY2hlY2tvdXQgYXJlIGNvbnRhaW5lZCBpbgorCQkgKiBhIHNldCAoc2VlIERpckNhY2hlQ2hlY2tvdXQ6OmRvQ2hlY2tvdXQpIHRoZSBvcmRlciBjYW5ub3QgYmUKKwkJICogZ3VhcmFudGVlZC4KKwkJICovCisKKwkJLy9GaWxlIHRvIGJlIGNoZWNrZWQgb3V0IGJlZm9yZSBsZnMgY29uZmlnCisJCVN0cmluZyBmaWxlTmFtZUJlZm9yZSA9ICIuYWFhLnR4dCI7CisJCWZpbGVCZWZvcmUgPSB3cml0ZVRyYXNoRmlsZShmaWxlTmFtZUJlZm9yZSwgbGZzUG9pbnRlcik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihmaWxlTmFtZUJlZm9yZSkuY2FsbCgpOworCisJCS8vIEZpbGUgdG8gYmUgY2hlY2tlZCBvdXQgYWZ0ZXIgbGZzIGNvbmZpZworCQlTdHJpbmcgZmlsZU5hbWVBZnRlciA9ICJ6enoudHh0IjsKKwkJZmlsZUFmdGVyID0gd3JpdGVUcmFzaEZpbGUoZmlsZU5hbWVBZnRlciwgbGZzUG9pbnRlcik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihmaWxlTmFtZUFmdGVyKS5jYWxsKCk7CisKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkNvbW1pdCBMRlMgUG9pbnRlciBmaWxlcyIpLmNhbGwoKTsKKwl9CisKKworCXByaXZhdGUgU3RyaW5nIGFkZExmc0NvbmZpZ0ZpbGVzKFN0cmluZyBsZnNTZXJ2ZXJVcmwpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGQgY29uZmlnIGZpbGVzIHRvIHRoZSByZXBvCisJCVN0cmluZyBsZnNDb25maWcxID0gY3JlYXRlTGZzQ29uZmlnKGxmc1NlcnZlclVybCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJLy8gTW9kaWZ5IGdpdGF0dHJpYnV0ZXMgb24gc2Vjb25kIGNhbGwsIHRvIGZvcmNlIGNoZWNrb3V0IHRvby4KKwkJaWYgKGdpdEF0dHJpYnV0ZXNGaWxlID09IG51bGwpIHsKKwkJCWdpdEF0dHJpYnV0ZXNGaWxlID0gd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwKKwkJCQkiKi50eHQgZmlsdGVyPWxmcyIpOworCQl9IGVsc2UgeworCQkJZ2l0QXR0cmlidXRlc0ZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLAorCQkJCQkiKi50eHQgZmlsdGVyPWxmc1xuIik7CisJCX0KKworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi5naXRhdHRyaWJ1dGVzIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQ29tbWl0IGNvbmZpZyBmaWxlcyIpLmNhbGwoKTsKKwkJcmV0dXJuIGxmc0NvbmZpZzE7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTGZzQ29uZmlnKFN0cmluZyBsZnNTZXJ2ZXJVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBsZnNDb25maWcxID0gIltsZnNdXG4gICAgdXJsID0gIiArIGxmc1NlcnZlclVybDsKKwkJY29uZmlnRmlsZSA9IHdyaXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRywgbGZzQ29uZmlnMSk7CisJCXJldHVybiBsZnNDb25maWcxOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRMZnNPYmplY3RzX3Jlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUxmc0ZpbGVzKEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJU3RyaW5nIGxmc0NvbmZpZzEgPSBhZGRMZnNDb25maWdGaWxlcyhMRlNfU0VSVkVSX1VSSTEpOworCisJCS8vIERlbGV0ZSBmaWxlcyB0byBmb3JjZSBhY3Rpb24gb24gcmVzZXQKKwkJYXNzZXJ0VHJ1ZShjb25maWdGaWxlLmRlbGV0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShmaWxlQmVmb3JlLmRlbGV0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShmaWxlQWZ0ZXIuZGVsZXRlKCkpOworCisJCWFzc2VydFRydWUoZ2l0QXR0cmlidXRlc0ZpbGUuZGVsZXRlKCkpOworCisJCS8vIGNyZWF0ZSBjb25maWcgZmlsZSB3aXRoIGRpZmZlcmVudCB1cmwKKwkJY3JlYXRlTGZzQ29uZmlnKExGU19TRVJWRVJfVVJJMyk7CisKKwkJY2hlY2tvdXRVUkxzLmNsZWFyKCk7CisJCWdpdC5yZXNldCgpLnNldE1vZGUoUmVzZXRUeXBlLkhBUkQpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMSk7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMSk7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIxKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisJCS8vIFRPRE86IFNob3VsZCBtYXkgYmUgRVhQRUNURURfU0VSVlJfVVJMMQorCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDMsIGNoZWNrb3V0VVJMcy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDEsIGNoZWNrb3V0VVJMcy5nZXQoMSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRMZnNPYmplY3RzX0JyYW5jaFN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDcmVhdGUgYSBuZXcgYnJhbmNoICJVUkwxIiBhbmQgYWRkIGNvbmZpZyBmaWxlcworCQlnaXQuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0TmFtZSgiVVJMMSIpLmNhbGwoKTsKKworCQljcmVhdGVMZnNGaWxlcyhGQUtFX0xGU19QT0lOVEVSMSk7CisJCVN0cmluZyBsZnNDb25maWcxID0gYWRkTGZzQ29uZmlnRmlsZXMoTEZTX1NFUlZFUl9VUkkxKTsKKworCQkvLyBDcmVhdGUgYSBzZWNvbmQgbmV3IGJyYW5jaCAiVVJMMiIgYW5kIGFkZCBjb25maWcgZmlsZXMKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoIlVSTDIiKS5jYWxsKCk7CisKKwkJY3JlYXRlTGZzRmlsZXMoRkFLRV9MRlNfUE9JTlRFUjIpOworCQlTdHJpbmcgbGZzQ29uZmlnMiA9IGFkZExmc0NvbmZpZ0ZpbGVzKExGU19TRVJWRVJfVVJJMik7CisKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzIpOworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjIpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMik7CisKKwkJY2hlY2tvdXRVUkxzLmNsZWFyKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIlVSTDEiKS5jYWxsKCk7CisKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzEpOworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjEpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGNoZWNrb3V0VVJMcy5zaXplKCkpOworCQkvLyBUT0RPOiBTaG91bGQgbWF5IGJlIEVYUEVDVEVEX1NFUlZSX1VSTDEKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwyLCBjaGVja291dFVSTHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwxLCBjaGVja291dFVSTHMuZ2V0KDEpKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiVVJMMiIpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMik7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIyKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisJCS8vIFRPRE86IFNob3VsZCBtYXkgYmUgRVhQRUNURURfU0VSVlJfVVJMMgorCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDEsIGNoZWNrb3V0VVJMcy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDIsIGNoZWNrb3V0VVJMcy5nZXQoMSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRMZnNPYmplY3RzX0JyYW5jaFN3aXRjaF9Nb2RpZmllZExvY2FsKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCS8vIENyZWF0ZSBhIG5ldyBicmFuY2ggIlVSTDEiIGFuZCBhZGQgY29uZmlnIGZpbGVzCisJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXROYW1lKCJVUkwxIikuY2FsbCgpOworCisJCWNyZWF0ZUxmc0ZpbGVzKEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJYWRkTGZzQ29uZmlnRmlsZXMoTEZTX1NFUlZFUl9VUkkxKTsKKworCQkvLyBDcmVhdGUgYSBzZWNvbmQgbmV3IGJyYW5jaCAiVVJMMiIgYW5kIGFkZCBjb25maWcgZmlsZXMKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoIlVSTDIiKS5jYWxsKCk7CisKKwkJY3JlYXRlTGZzRmlsZXMoRkFLRV9MRlNfUE9JTlRFUjIpOworCQlhZGRMZnNDb25maWdGaWxlcyhMRlNfU0VSVkVSX1VSSTEpOworCisJCS8vIGNyZWF0ZSBjb25maWcgZmlsZSB3aXRoIGRpZmZlcmVudCB1cmwKKwkJYXNzZXJ0VHJ1ZShjb25maWdGaWxlLmRlbGV0ZSgpKTsKKwkJU3RyaW5nIGxmc0NvbmZpZzMgPSBjcmVhdGVMZnNDb25maWcoTEZTX1NFUlZFUl9VUkkzKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMyk7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIyKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiVVJMMSIpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjEpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMSk7CisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWczKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwzLCBjaGVja291dFVSTHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwzLCBjaGVja291dFVSTHMuZ2V0KDEpKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiVVJMMiIpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjIpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWczKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMywgY2hlY2tvdXRVUkxzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMywgY2hlY2tvdXRVUkxzLmdldCgxKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzR2l0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzR2l0VGVzdC5qYXZhCmluZGV4IDg5NjQzMTAuLjNlODNjOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0dpdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNHaXRUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC02OCw2ICs2OCwyNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJyYW5jaFN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiYWJyYW5jaCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYWJyYW5jaCIpLmNhbGwoKTsKKwkJRmlsZSBhRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJhLmJpbiIsICJhYWEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEuYmluIGZpbHRlcj1sZnMiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWNvbW1pdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiYmJyYW5jaCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYmJyYW5jaCIpLmNhbGwoKTsKKwkJRmlsZSBiRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJiLmJpbiIsICJiYmIiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImIuYmluIGZpbHRlcj1sZnMiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYmNvbW1pdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYWJyYW5jaCIpLmNhbGwoKTsKKwkJY2hlY2tGaWxlKGFGaWxlLCAiYWFhIik7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJicmFuY2giKS5jYWxsKCk7CisJCWNoZWNrRmlsZShiRmlsZSwgImJiYiIpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgY2hlY2tvdXROb25MZnNQb2ludGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBjb250ZW50ID0gInNpemVfdFxuc29tZV9mdW5jdGlvbih2b2lkKiBwdHIpO1xuIjsKIAkJRmlsZSBzbWFsbEZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCBjb250ZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkY2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIE5haWwgU2FtYXRvdiA8c2FuYWlsQHlhbmRleC5ydT4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5SZW1vdGVBZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuQ2xlYW5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuUHJvdG9jb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuU211ZGdlRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIExmc0Nvbm5lY3Rpb25GYWN0b3J5VGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01VREdFX05BTUUgPSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQlVJTFRJTl9GSUxURVJfUFJFRklYCisJCQkrIENvbnN0YW50cy5BVFRSX0ZJTFRFUl9EUklWRVJfUFJFRklYCisJCQkrIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTl9OQU1FID0gb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkJVSUxUSU5fRklMVEVSX1BSRUZJWAorCQkJKyBDb25zdGFudHMuQVRUUl9GSUxURVJfRFJJVkVSX1BSRUZJWAorCQkJKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9DTEVBTjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMRlNfU0VSVkVSX1VSTDEgPSAiaHR0cHM6Ly9sZnMuc2VydmVyMS90ZXN0L3VyaSI7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEZTX1NFUlZFUl9VUkwyID0gImh0dHBzOi8vbGZzLnNlcnZlcjIvdGVzdC91cmkiOworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9SSUdJTl9VUkwgPSAiaHR0cHM6Ly9naXQuc2VydmVyL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgR2l0IGdpdDsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsTGZzKCkgeworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoU01VREdFX05BTUUsIFNtdWRnZUZpbHRlci5GQUNUT1JZKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKENMRUFOX05BTUUsIENsZWFuRmlsdGVyLkZBQ1RPUlkpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnVucmVnaXN0ZXIoU01VREdFX05BTUUpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkudW5yZWdpc3RlcihDTEVBTl9OQU1FKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJZ2l0ID0gbmV3IEdpdChkYik7CisKKwkJLy8gSnVzdCB0byBoYXZlIGEgbm9uIGVtcHR5IHJlcG8KKwkJd3JpdGVUcmFzaEZpbGUoIlRlc3QudHh0IiwgIkhlbGxvIHdvcmxkIGZyb20gdGhlIExGUyBGYWN0b3J5IFRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJUZXN0LnR4dCIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkluaXRpYWwgY29tbWl0IikuY2FsbCgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGZzVXJsRnJvbVJlbW90ZVVybFdpdGhEb3RHaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkUmVtb3RlVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvLmdpdCIpOworCQljaGVja0xmc1VybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby5naXQvaW5mby9sZnMiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybEZyb21SZW1vdGVVcmxXaXRob3V0RG90R2l0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFkZFJlbW90ZVVybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwbyIpOworCQljaGVja0xmc1VybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby5naXQvaW5mby9sZnMiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybEZyb21Mb2NhbENvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworCQlhZGRSZW1vdGVVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8iKTsKKworCQlTdG9yZWRDb25maWcgY2ZnID0gKChSZXBvc2l0b3J5KSBkYikuZ2V0Q29uZmlnKCk7CisJCWNmZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywKKwkJCQludWxsLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCwKKwkJCQkiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby9sZnMiKTsKKwkJY2ZnLnNhdmUoKTsKKworCQljaGVja0xmc1VybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby9sZnMiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybEZyb21PcmlnaW5Db25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkUmVtb3RlVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvIik7CisKKwkJU3RvcmVkQ29uZmlnIGNmZyA9ICgoUmVwb3NpdG9yeSkgZGIpLmdldENvbmZpZygpOworCQljZmcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsCisJCQkJb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLAorCQkJCSJodHRwczovL2xvY2FsaG9zdC9yZXBvL2xmcyIpOworCQljZmcuc2F2ZSgpOworCisJCWNoZWNrTGZzVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvL2xmcyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGZzVXJsTm90Q29uZmlndXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRUaHJvd3MoTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiBMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLAorCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULCBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9sZnN1cmxfbGZzY29uZmlnRnJvbVdvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKCk7CisJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fbGZzdXJsX2xmc2NvbmZpZ0Zyb21JbmRleCgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcoKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRykuY2FsbCgpOworCQlkZWxldGVUcmFzaEZpbGUoQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKTsKKwkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9sZnN1cmxfbGZzY29uZmlnRnJvbUhFQUQoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkNvbW1pdCBMRlMgQ29uZmlnIikuY2FsbCgpOworCisJCS8qCisJCSAqIHJlYWRpbmcgLmxmc2NvbmZpZyBmcm9tIEhFQUQgc2VlbXMgb25seSB0ZXN0YWJsZSB1c2luZyBhIGJhcmUgcmVwbywKKwkJICogc2luY2Ugb3RoZXJ3aXNlIHdvcmtpbmcgdHJlZSBvciBpbmRleCBhcmUgdXNlZAorCQkgKi8KKwkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0QmFyZVJlcG8iKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGJhcmVSZXBvRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0QmFyZSh0cnVlKQorCQkJCS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpKSB7CisKKwkJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9yZW1vdGVfbGZzY29uZmlnRnJvbVdvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFkZFJlbW90ZVVybChPUklHSU5fVVJMKTsKKwkJd3JpdGVMZnNDb25maWcoTEZTX1NFUlZFUl9VUkwxLCAibGZzIiwgREVGQVVMVF9SRU1PVEVfTkFNRSwgInVybCIpOworCQljaGVja0xmc1VybChMRlNfU0VSVkVSX1VSTDEpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhlIGNvbmZpZyBmaWxlIHByZWNlZGVuY2UuCisJICoKKwkgKiBDaGVja2luZyBvbmx5IHdpdGggdGhlIGxvY2FsIHJlcG9zaXRvcnkgY29uZmlnIGlzIHN1ZmZpY2llbnQgc2luY2UgZnJvbQorCSAqIHRoYXQgcG9pbnQgdGhlICJub3JtYWwiIHByZWNlZGVuY2UgaXMgdXNlZC4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fQ29uZmlnRmlsZVByZWNlZGVuY2VfbGZzY29uZmlnRnJvbVdvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKCk7CisJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisKKwkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsIExGU19TRVJWRVJfVVJMMik7CisJCWNvbmZpZy5zYXZlKCk7CisKKwkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwyKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9JbnZhbGlkTGZzQ29uZmlnX1dvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlSW52YWxpZExmc0NvbmZpZygpOworCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbiA9IGFzc2VydFRocm93cygKKwkJCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQlMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLCBIdHRwU3VwcG9ydC5NRVRIT0RfUE9TVCwKKwkJCQkJUHJvdG9jb2wuT1BFUkFUSU9OX0RPV05MT0FEKTsKKwkJfSk7CisJCWFzc2VydFRydWUoZ2V0U3RhY2tUcmFjZShhY3R1YWxFeGNlcHRpb24pCisJCQkJLmNvbnRhaW5zKCJJbnZhbGlkIGxpbmUgaW4gY29uZmlnIGZpbGUiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fSW52YWxpZExmc0NvbmZpZ19JbmRleCgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVJbnZhbGlkTGZzQ29uZmlnKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJZGVsZXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRyk7CisJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24gYWN0dWFsRXhjZXB0aW9uID0gYXNzZXJ0VGhyb3dzKAorCQkJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uY2xhc3MsICgpIC0+IHsKKwkJCUxmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsIEh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULAorCQkJCQlQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCQl9KTsKKwkJYXNzZXJ0VHJ1ZShnZXRTdGFja1RyYWNlKGFjdHVhbEV4Y2VwdGlvbikKKwkJCQkuY29udGFpbnMoIkludmFsaWQgbGluZSBpbiBjb25maWcgZmlsZSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9JbnZhbGlkTGZzQ29uZmlnX0hFQUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVJbnZhbGlkTGZzQ29uZmlnKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkNvbW1pdCBMRlMgQ29uZmlnIikuY2FsbCgpOworCisJCS8qCisJCSAqIHJlYWRpbmcgLmxmc2NvbmZpZyBmcm9tIEhFQUQgc2VlbXMgb25seSB0ZXN0YWJsZSB1c2luZyBhIGJhcmUgcmVwbywKKwkJICogc2luY2Ugb3RoZXJ3aXNlIHdvcmtpbmcgdHJlZSBvciBpbmRleCBhcmUgdXNlZAorCQkgKi8KKwkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0QmFyZVJlcG8iKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGJhcmVSZXBvRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0QmFyZSh0cnVlKQorCQkJCS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbiA9IGFzc2VydFRocm93cygKKwkJCQkJTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4geworCQkJCQkJTGZzQ29ubmVjdGlvbkZhY3RvcnkuZ2V0TGZzQ29ubmVjdGlvbihkYiwKKwkJCQkJCQkJSHR0cFN1cHBvcnQuTUVUSE9EX1BPU1QsCisJCQkJCQkJCVByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCk7CisJCQkJCX0pOworCQkJYXNzZXJ0VHJ1ZShnZXRTdGFja1RyYWNlKGFjdHVhbEV4Y2VwdGlvbikKKwkJCQkJLmNvbnRhaW5zKCJJbnZhbGlkIGxpbmUgaW4gY29uZmlnIGZpbGUiKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkUmVtb3RlVXJsKFN0cmluZyByZW1vdFVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlbW90ZUFkZENvbW1hbmQgYWRkID0gZ2l0LnJlbW90ZUFkZCgpOworCQlhZGQuc2V0VXJpKG5ldyBVUklpc2gocmVtb3RVcmwpKTsKKwkJYWRkLnNldE5hbWUob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUpOworCQlhZGQuY2FsbCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBwcm92aWRlZCBleGNlcHRpb24gYXMgc3RyaW5nCisJICoKKwkgKiBAcGFyYW0gYWN0dWFsRXhjZXB0aW9uCisJICogQHJldHVybiBUaGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIGFzIHN0cmluZworCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFN0YWNrVHJhY2UoRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbikgeworCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKKwkJYWN0dWFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShwdyk7CisJCXJldHVybiBzdy50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUxmc0NvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKExGU19TRVJWRVJfVVJMMSwgImxmcyIsICJ1cmwiKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVMZnNDb25maWcoU3RyaW5nIGxmc1VybCwgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBuYW1lKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcobGZzVXJsLCBzZWN0aW9uLCBudWxsLCBuYW1lKTsKKwl9CisKKwkvKgorCSAqIFdyaXRlIHNpbXBsZSBsZnMgY29uZmlnIHdpdGggc2luZ2xlIGVudHJ5LiBEbyBub3QgdXNlIEZpbGVCYXNlZENvbmZpZyB0bworCSAqIGF2b2lkIGludHJvZHVjaW5nIG5ldyBkZXBlbmRlbmN5IChmb3Igbm93KS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgd3JpdGVMZnNDb25maWcoU3RyaW5nIGxmc1VybCwgU3RyaW5nIHNlY3Rpb24sCisJCQlTdHJpbmcgc3Vic2VjdGlvbiwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZ0J1aWxkZXIgY29uZmlnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJY29uZmlnLmFwcGVuZCgiWyIpOworCQljb25maWcuYXBwZW5kKHNlY3Rpb24pOworCQlpZiAoc3Vic2VjdGlvbiAhPSBudWxsKSB7CisJCQljb25maWcuYXBwZW5kKCIgXCIiKTsKKwkJCWNvbmZpZy5hcHBlbmQoc3Vic2VjdGlvbik7CisJCQljb25maWcuYXBwZW5kKCJcIiIpOworCQl9CisJCWNvbmZpZy5hcHBlbmQoIl1cbiIpOworCQljb25maWcuYXBwZW5kKCIgICAgIik7CisJCWNvbmZpZy5hcHBlbmQobmFtZSk7CisJCWNvbmZpZy5hcHBlbmQoIiA9ICIpOworCQljb25maWcuYXBwZW5kKGxmc1VybCk7CisJCXdyaXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRywgY29uZmlnLnRvU3RyaW5nKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUludmFsaWRMZnNDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZShDb25zdGFudHMuRE9UX0xGU19DT05GSUcsCisJCQkJIntsZnNdXG4gICAgdXJsID0gIiArIExGU19TRVJWRVJfVVJMMSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrTGZzVXJsKFN0cmluZyBsZnNVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUh0dHBDb25uZWN0aW9uIGxmc1NlcnZlckNvbm47CisJCWxmc1NlcnZlckNvbm4gPSBMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLAorCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULCBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCisJCWFzc2VydEVxdWFscyhsZnNVcmwgKyBQcm90b2NvbC5PQkpFQ1RTX0xGU19FTkRQT0lOVCwKKwkJCQlsZnNTZXJ2ZXJDb25uLmdldFVSTCgpLnRvU3RyaW5nKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZmJhNThmOC4uMDlmZmZmYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzEgKzMsMzMgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzLG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249IjYuMC4xIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mcyxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSI2LjEuMSIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlLmdzb247dmVyc2lvbj0iWzIuOC4yLDMuMC4wKSIsCiAgY29tLmdvb2dsZS5nc29uLnN0cmVhbTt2ZXJzaW9uPSJbMi44LjIsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGE3MTViZTYuLjdhMmE0NDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCmluZGV4IGViNTdkYjMuLjk0OWM1NjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LnByb3BlcnRpZXMKaW5kZXggMGUwMGYxNC4uNjQyYjgzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5wcm9wZXJ0aWVzCkBAIC0xLDE5ICsxLDE5IEBACiBjb3JydXB0TG9uZ09iamVjdD1UaGUgY29udGVudCBoYXNoICcnezB9Jycgb2YgdGhlIGxvbmcgb2JqZWN0ICcnezF9JycgZG9lc24nJ3QgbWF0Y2ggaXRzIGlkLCB0aGUgY29ycnVwdCBvYmplY3Qgd2lsbCBiZSBkZWxldGVkLgotaW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIPUluY29ycmVjdCBMT05HX09CSkVDVF9JRF9MRU5HVEguCi1pbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg9TWVkaWFmaWxlIHswfSBoYXMgdW5leHBlY3RlZCBsZW5ndGg7IGV4cGVjdGVkIHsxfSBidXQgZm91bmQgezJ9LgorZG90TGZzQ29uZmlnUmVhZEZhaWxlZD1SZWFkaW5nIC5sZnNjb25maWcgZmFpbGVkCiBpbmNvbnNpc3RlbnRDb250ZW50TGVuZ3RoPVVuZXhwZWN0ZWQgY29udGVudCBsZW5ndGggcmVwb3J0ZWQgYnkgTEZTIHNlcnZlciAoezB9KSwgZXhwZWN0ZWQgezF9IGJ1dCByZXBvcnRlZCB3YXMgezJ9CitpbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg9TWVkaWFmaWxlIHswfSBoYXMgdW5leHBlY3RlZCBsZW5ndGg7IGV4cGVjdGVkIHsxfSBidXQgZm91bmQgezJ9LgoraW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIPUluY29ycmVjdCBMT05HX09CSkVDVF9JRF9MRU5HVEguCiBpbnZhbGlkTG9uZ0lkPUludmFsaWQgaWQ6IHswfQogaW52YWxpZExvbmdJZExlbmd0aD1JbnZhbGlkIGlkIGxlbmd0aCB7MH07IHNob3VsZCBiZSB7MX0KLWxmc1VuYXZhaWxhYmxlPUxGUyBpcyBub3QgYXZhaWxhYmxlIGZvciByZXBvc2l0b3J5IHswfQotcHJvdG9jb2xFcnJvcj1MRlMgUHJvdG9jb2wgRXJyb3IgezB9OiB7MX0KLXJlcXVpcmVkSGFzaEZ1bmN0aW9uTm90QXZhaWxhYmxlPVJlcXVpcmVkIGhhc2ggZnVuY3Rpb24gezB9IG5vdCBhdmFpbGFibGUuCi1yZXBvc2l0b3J5Tm90Rm91bmQ9UmVwb3NpdG9yeSB7MH0gbm90IGZvdW5kCi1yZXBvc2l0b3J5UmVhZE9ubHk9UmVwb3NpdG9yeSB7MH0gaXMgcmVhZC1vbmx5Ci1sZnNVbmF2YWlsYWJsZT1MRlMgaXMgbm90IGF2YWlsYWJsZSBmb3IgcmVwb3NpdG9yeSB7MH0KLWxmc1VuYXRob3JpemVkPU5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gb3BlcmF0aW9uIHswfSBvbiByZXBvc2l0b3J5IHsxfQogbGZzRmFpbGVkVG9HZXRSZXBvc2l0b3J5PWZhaWxlZCB0byBnZXQgcmVwb3NpdG9yeSB7MH0KIGxmc05vRG93bmxvYWRVcmw9Ik5lZWQgdG8gZG93bmxvYWQgb2JqZWN0IGZyb20gTEZTIHNlcnZlciBidXQgY291bGRuJ3QgZGV0ZXJtaW5lIExGUyBzZXJ2ZXIgVVJMIgorbGZzVW5hdXRob3JpemVkPU5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gb3BlcmF0aW9uIHswfSBvbiByZXBvc2l0b3J5IHsxfQorbGZzVW5hdmFpbGFibGU9TEZTIGlzIG5vdCBhdmFpbGFibGUgZm9yIHJlcG9zaXRvcnkgezB9CittaXNzaW5nTG9jYWxPYmplY3Q9IkxvY2FsIE9iamVjdCB7MH0gaXMgbWlzc2luZyIKK3Byb3RvY29sRXJyb3I9TEZTIFByb3RvY29sIEVycm9yIHswfTogezF9CityZXBvc2l0b3J5Tm90Rm91bmQ9UmVwb3NpdG9yeSB7MH0gbm90IGZvdW5kCityZXBvc2l0b3J5UmVhZE9ubHk9UmVwb3NpdG9yeSB7MH0gaXMgcmVhZC1vbmx5CityZXF1aXJlZEhhc2hGdW5jdGlvbk5vdEF2YWlsYWJsZT1SZXF1aXJlZCBoYXNoIGZ1bmN0aW9uIHswfSBub3QgYXZhaWxhYmxlLgogc2VydmVyRmFpbHVyZT1XaGVuIHRyeWluZyB0byBvcGVuIGEgY29ubmVjdGlvbiB0byB7MH0gdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhbiBlcnJvciBjb2RlLiByYz17MX0KLXdyb25nQW1vdXRPZkRhdGFSZWNlaXZlZD1XaGlsZSBkb3dubG9hZGluZyBkYXRhIGZyb20gdGhlIGNvbnRlbnQgc2VydmVyIHswfSB7MX0gYnl0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdoaWxlIHsyfSBoYXZlIGJlZW4gZXhwZWN0ZWQKIHVzZXJDb25maWdJbnZhbGlkPSJVc2VyIGNvbmZpZyBmaWxlIHswfSBpbnZhbGlkIHsxfSIKLW1pc3NpbmdMb2NhbE9iamVjdD0iTG9jYWwgT2JqZWN0IHswfSBpcyBtaXNzaW5nIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3dyb25nQW1vdW50T2ZEYXRhUmVjZWl2ZWQ9V2hpbGUgZG93bmxvYWRpbmcgZGF0YSBmcm9tIHRoZSBjb250ZW50IHNlcnZlciB7MH0gezF9IGJ5dGVzIGhhdmUgYmVlbiByZWNlaXZlZCB3aGlsZSB7Mn0gaGF2ZSBiZWVuIGV4cGVjdGVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQppbmRleCBkNmNlODU1Li5lYmY0NmUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQpAQCAtMTEzLDYgKzExMyw5IEBAIHByaXZhdGUgU2V0PExmc1BvaW50ZXI+IGZpbmRPYmplY3RzVG9QdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uLAogCiAJCXRyeSAoT2JqZWN0V2FsayB3YWxrID0gbmV3IE9iamVjdFdhbGsoZ2V0UmVwb3NpdG9yeSgpKSkgewogCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdXAgOiByZWZzKSB7CisJCQkJaWYgKHVwLmlzRGVsZXRlKCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQogCQkJCXdhbGsuc2V0UmV3cml0ZVBhcmVudHMoZmFsc2UpOwogCQkJCWV4Y2x1ZGVSZW1vdGVSZWZzKHdhbGspOwogCQkJCXdhbGsubWFya1N0YXJ0KHdhbGsucGFyc2VDb21taXQodXAuZ2V0TmV3T2JqZWN0SWQoKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCmluZGV4IDM0MTE4ODcuLmMyNmExYmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKQEAgLTIwNSw3ICsyMDUsNyBAQCBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UGF0aD4gZG93bmxvYWRMZnNSZXNvdXJjZShMZnMgbGZzLCBSZXBvc2l0b3J5IGRiLAogCQkJCQlsb25nIGJ5dGVzQ29waWVkID0gRmlsZXMuY29weShjb250ZW50SW4sIHBhdGgpOwogCQkJCQlpZiAoYnl0ZXNDb3BpZWQgIT0gby5zaXplKSB7CiAJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJCUxmc1RleHQuZ2V0KCkud3JvbmdBbW91dE9mRGF0YVJlY2VpdmVkLAorCQkJCQkJCQlMZnNUZXh0LmdldCgpLndyb25nQW1vdW50T2ZEYXRhUmVjZWl2ZWQsCiAJCQkJCQkJCWNvbnRlbnRTZXJ2ZXJDb25uLmdldFVSTCgpLAogCQkJCQkJCQlMb25nLnZhbHVlT2YoYnl0ZXNDb3BpZWQpLAogCQkJCQkJCQlMb25nLnZhbHVlT2Yoby5zaXplKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNVbmF1dGhvcml6ZWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzVW5hdXRob3JpemVkLmphdmEKaW5kZXggMzY4ODlkYi4uMGRjNmFlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNVbmF1dGhvcml6ZWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc1VuYXV0aG9yaXplZC5qYXZhCkBAIC0zMSw3ICszMSw3IEBAIHB1YmxpYyBjbGFzcyBMZnNVbmF1dGhvcml6ZWQgZXh0ZW5kcyBMZnNFeGNlcHRpb24gewogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgbmFtZS4KIAkgKi8KIAlwdWJsaWMgTGZzVW5hdXRob3JpemVkKFN0cmluZyBvcGVyYXRpb24sIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkubGZzVW5hdGhvcml6ZWQsIG9wZXJhdGlvbiwKKwkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGZzVGV4dC5nZXQoKS5sZnNVbmF1dGhvcml6ZWQsIG9wZXJhdGlvbiwKIAkJCQluYW1lKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0NvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0NvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZDM5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29uZmlnLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIE1hdHRoaWFzIEZyb21tZSA8bWZyb21tZUBkc3BhY2UuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkJsb2JCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOworCisvKioKKyAqIEVuY2Fwc3VsYXRlIGFjY2VzcyB0byB0aGUgLmxmc2NvbmZpZy4KKyAqCisgKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50CisgKiBodHRwczovL2dpdGh1Yi5jb20vZ2l0LWxmcy9naXQtbGZzL2Jsb2IvbWFpbi9kb2NzL21hbi9naXQtbGZzLWNvbmZpZy41LnJvbm4KKyAqIHRoZSBvcmRlciB0byBmaW5kIHRoZSAubGZzY29uZmlnIGZpbGUgaXM6CisgKgorICogPHByZT4KKyAqICAgMS4gaW4gdGhlIHJvb3Qgb2YgdGhlIHdvcmtpbmcgdHJlZQorICogICAyLiBpbiB0aGUgaW5kZXgKKyAqICAgMy4gaW4gdGhlIEhFQUQsIGZvciBiYXJlIHJlcG9zaXRvcmllcyB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlCisgKiAgICAgIHRoYXQgaXMgc2VhcmNoZWQKKyAqIDwvcHJlPgorICoKKyAqIFZhbHVlcyBmcm9tIHRoZSAubGZzY29uZmlnIGFyZSB1c2VkIG9ubHkgaWYgbm90IHNwZWNpZmllZCBpbiBhbm90aGVyIGdpdAorICogY29uZmlnIGZpbGUgdG8gYWxsb3cgbG9jYWwgb3ZlcnJpZGUgd2l0aG91dCBtb2RpZmljdGlvbiBvZiBhIGNvbW1pdHRlZCBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgTGZzQ29uZmlnIHsKKwlwcml2YXRlIFJlcG9zaXRvcnkgZGI7CisJcHJpdmF0ZSBDb25maWcgZGVsZWdhdGU7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIExmc0NvbmZpZy4KKwkgKgorCSAqIEBwYXJhbSBkYgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgcmVwbworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTGZzQ29uZmlnKFJlcG9zaXRvcnkgZGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMuZGIgPSBkYjsKKwkJZGVsZWdhdGUgPSB0aGlzLmxvYWQoKTsKKwl9CisKKwkvKioKKwkgKiBSZWFkIHRoZSAubGZzY29uZmlnIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQorCSAqCisJICogQHJldHVybiBUaGUgbG9hZGVkIGxmcyBjb25maWcgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdAorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgQ29uZmlnIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAoIWRiLmlzQmFyZSgpKSB7CisJCQlyZXN1bHQgPSBsb2FkRnJvbVdvcmtpbmdUcmVlKCk7CisJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCQlyZXN1bHQgPSBsb2FkRnJvbUluZGV4KCk7CisJCQl9CisJCX0KKworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGxvYWRGcm9tSGVhZCgpOworCQl9CisKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXN1bHQgPSBlbXB0eUNvbmZpZygpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBUcnkgdG8gcmVhZCB0aGUgbGZzIGNvbmZpZyBmcm9tIGEgZmlsZSBjYWxsZWQgLmxmc2NvbmZpZyBhdCB0aGUgdG9wIGxldmVsCisJICogb2YgdGhlIHdvcmtpbmcgdHJlZS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmZpZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJQE51bGxhYmxlCisJcHJpdmF0ZSBDb25maWcgbG9hZEZyb21Xb3JraW5nVHJlZSgpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlIGxmc0NvbmZpZyA9IGRiLmdldEZTKCkucmVzb2x2ZShkYi5nZXRXb3JrVHJlZSgpLAorCQkJCUNvbnN0YW50cy5ET1RfTEZTX0NPTkZJRyk7CisJCWlmIChsZnNDb25maWcuZXhpc3RzKCkgJiYgbGZzQ29uZmlnLmlzRmlsZSgpKSB7CisJCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gbmV3IEZpbGVCYXNlZENvbmZpZyhsZnNDb25maWcsIGRiLmdldEZTKCkpOworCQkJdHJ5IHsKKwkJCQljb25maWcubG9hZCgpOworCQkJCXJldHVybiBjb25maWc7CisJCQl9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbigKKwkJCQkJCUxmc1RleHQuZ2V0KCkuZG90TGZzQ29uZmlnUmVhZEZhaWxlZCwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVHJ5IHRvIHJlYWQgdGhlIGxmcyBjb25maWcgZnJvbSBhbiBlbnRyeSBjYWxsZWQgLmxmc2NvbmZpZyBjb250YWluZWQgaW4KKwkgKiB0aGUgaW5kZXguCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb25maWcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlATnVsbGFibGUKKwlwcml2YXRlIENvbmZpZyBsb2FkRnJvbUluZGV4KCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlEaXJDYWNoZUVudHJ5IGVudHJ5ID0gZGIucmVhZERpckNhY2hlKCkKKwkJCQkJLmdldEVudHJ5KENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRyk7CisJCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgQmxvYkJhc2VkQ29uZmlnKG51bGwsIGRiLCBlbnRyeS5nZXRPYmplY3RJZCgpKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbigKKwkJCQkJTGZzVGV4dC5nZXQoKS5kb3RMZnNDb25maWdSZWFkRmFpbGVkLCBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUcnkgdG8gcmVhZCB0aGUgbGZzIGNvbmZpZyBmcm9tIGFuIGVudHJ5IGNhbGxlZCAubGZzY29uZmlnIGNvbnRhaW5lZCBpbgorCSAqIHRoZSBoZWFkIHJldmlzaW9uLgorCSAqCisJICogQHJldHVybiB0aGUgY29uZmlnLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlATnVsbGFibGUKKwlwcml2YXRlIENvbmZpZyBsb2FkRnJvbUhlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGRiKSkgeworCQkJT2JqZWN0SWQgaGVhZENvbW1pdElkID0gZGIucmVzb2x2ZShIRUFEKTsKKwkJCWlmIChoZWFkQ29tbWl0SWQgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHJldldhbGsucGFyc2VDb21taXQoaGVhZENvbW1pdElkKTsKKwkJCVJldlRyZWUgdHJlZSA9IGNvbW1pdC5nZXRUcmVlKCk7CisJCQlUcmVlV2FsayB0cmVld2FsayA9IFRyZWVXYWxrLmZvclBhdGgoZGIsIENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRywKKwkJCQkJdHJlZSk7CisJCQlpZiAodHJlZXdhbGsgIT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgQmxvYkJhc2VkQ29uZmlnKG51bGwsIGRiLCB0cmVld2Fsay5nZXRPYmplY3RJZCgwKSk7CisJCQl9CisJCX0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCUxmc1RleHQuZ2V0KCkuZG90TGZzQ29uZmlnUmVhZEZhaWxlZCwgZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIGVtcHR5IGNvbmZpZyBhcyBmYWxsYmFjayB0byBhdm9pZCBudWxsIHBvaW50ZXIgY2hlY2tzLgorCSAqCisJICogQHJldHVybiBhbiBlbXB0eSBjb25maWcKKwkgKi8KKwlwcml2YXRlIENvbmZpZyBlbXB0eUNvbmZpZygpIHsKKwkJcmV0dXJuIG5ldyBDb25maWcoKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgc3RyaW5nIHZhbHVlIG9yIG51bGwgaWYgbm90IGZvdW5kLgorCSAqCisJICogRmlyc3QgdHJpZXMgdG8gZmluZCB0aGUgdmFsdWUgaW4gdGhlIGdpdCBjb25maWcgZmlsZXMuIElmIG5vdCBmb3VuZCB0cmllcworCSAqIHRvIGZpbmQgZGF0YSBpbiAubGZzY29uZmlnLgorCSAqCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBzZWN0aW9uCisJICogQHBhcmFtIHN1YnNlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBzdWJzZWN0aW9uIGZvciB0aGUgdmFsdWUKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIGtleSBuYW1lCisJICogQHJldHVybiBhIFN0cmluZyB2YWx1ZSBmcm9tIHRoZSBjb25maWcsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGZpbmFsIFN0cmluZyBzZWN0aW9uLCBmaW5hbCBTdHJpbmcgc3Vic2VjdGlvbiwKKwkJCWZpbmFsIFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyByZXN1bHQgPSBkYi5nZXRDb25maWcoKS5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gZGVsZWdhdGUuZ2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQppbmRleCBlMjIxOTEzLi4xMmI2ODhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcsIE1hcmt1cyBEdWZ0IDxtYXJrdXMuZHVmdEBzc2ktc2NoYWVmZXIuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMjIgTWFya3VzIER1ZnQgPG1hcmt1cy5kdWZ0QHNzaS1zY2hhZWZlci5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTM5LDEyICszOSwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5Tc2hTdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBQcm92aWRlcyBtZWFucyB0byBnZXQgYSB2YWxpZCBMRlMgY29ubmVjdGlvbiBmb3IgYSBnaXZlbiByZXBvc2l0b3J5LgogICovCiBwdWJsaWMgY2xhc3MgTGZzQ29ubmVjdGlvbkZhY3RvcnkgewotCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNTSF9BVVRIX1RJTUVPVVRfU0VDT05EUyA9IDMwOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfSFRUUFMgPSAiaHR0cHMiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9TU0ggPSAic3NoIjsgLy8kTk9OLU5MUy0xJApAQCAtNjQsNyArNjQsNyBAQCBwdWJsaWMgY2xhc3MgTGZzQ29ubmVjdGlvbkZhY3RvcnkgewogCSAqICAgICAgICAgICAgYmUgdXNlZCBmb3IKIAkgKiBAcGFyYW0gcHVycG9zZQogCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiwgZS5nLiBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQKLQkgKiBAcmV0dXJuIHRoZSB1cmwgZm9yIHRoZSBsZnMgc2VydmVyLiBlLmcuCisJICogQHJldHVybiB0aGUgY29ubmVjdGlvbiBmb3IgdGhlIGxmcyBzZXJ2ZXIuIGUuZy4KIAkgKiAgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2dpdC1sZnMuZ2l0L2luZm8vbGZzIgogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KQEAgLTkyLDEzICs5MiwzMCBAQCBwdWJsaWMgc3RhdGljIEh0dHBDb25uZWN0aW9uIGdldExmc0Nvbm5lY3Rpb24oUmVwb3NpdG9yeSBkYiwgU3RyaW5nIG1ldGhvZCwKIAkJcmV0dXJuIGNvbm5lY3Rpb247CiAJfQogCisJLyoqCisJICogR2V0IExGUyBTZXJ2ZXIgVVJMLgorCSAqCisJICogQHBhcmFtIGRiCisJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0byB3b3JrIHdpdGgKKwkgKiBAcGFyYW0gcHVycG9zZQorCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiwgZS5nLiBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQKKwkgKiBAcGFyYW0gYWRkaXRpb25hbEhlYWRlcnMKKwkgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgaGVhZGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbm5lY3QgdG8gTEZTIHNlcnZlcgorCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgdGhlIExGUyBzZXJ2ZXIuIGUuZy4KKwkgKiAgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2dpdC1sZnMuZ2l0L2luZm8vbGZzIgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgTEZTIGNvbmZpZyBpcyBpbnZhbGlkIG9yIGNhbm5vdCBiZSBhY2Nlc3NlZAorCSAqIEBzZWUgPGEgaHJlZj0KKwkgKiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZ2l0LWxmcy9naXQtbGZzL2Jsb2IvbWFpbi9kb2NzL2FwaS9zZXJ2ZXItZGlzY292ZXJ5Lm1kIj4KKwkgKiAgICAgIFNlcnZlciBEaXNjb3ZlcnkgZG9jdW1lbnRhdGlvbjwvYT4KKwkgKi8KIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycykKLQkJCXRocm93cyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKLQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTGZzQ29uZmlnIGNvbmZpZyA9IG5ldyBMZnNDb25maWcoZGIpOwogCQlTdHJpbmcgbGZzVXJsID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAotCQkJCW51bGwsCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKTsKKwkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpOworCiAJCUV4Y2VwdGlvbiBleCA9IG51bGw7CiAJCWlmIChsZnNVcmwgPT0gbnVsbCkgewogCQkJU3RyaW5nIHJlbW90ZVVybCA9IG51bGw7CkBAIC0xMDYsNiArMTIzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExmc1VybChSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwKIAkJCQlsZnNVcmwgPSBjb25maWcuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsCiAJCQkJCQlyZW1vdGUsCiAJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpOworCiAJCQkJLy8gVGhpcyBjb3VsZCBiZSBkb25lIGJldHRlciAobW9yZSBwcmVjaXNlIGxvZ2ljKSwgYnV0IGFjY29yZGluZwogCQkJCS8vIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9naXQtbGZzL2dpdC1sZnMvaXNzdWVzLzE3NTkgZ2l0LWxmcwogCQkJCS8vIGdlbmVyYWxseSBvbmx5IHN1cHBvcnRzICdvcmlnaW4nIGluIGFuIGludGVncmF0ZWQgd29ya2Zsb3cuCkBAIC0xMjUsOCArMTQzLDYgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExmc1VybChSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwKIAkJCQkJCXwgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiBlKSB7CiAJCQkJCWV4ID0gZTsKIAkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxmc1VybCA9IGxmc1VybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCQkJfQogCQl9CiAJCWlmIChsZnNVcmwgPT0gbnVsbCkgewpAQCAtMTQ5LDcgKzE2NSw4IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBkaXNjb3Zlckxmc1VybChSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwKIAkJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dEFsbChhY3Rpb24uaGVhZGVyKTsKIAkJCXJldHVybiBhY3Rpb24uaHJlZjsKIAkJfQotCQlyZXR1cm4gcmVtb3RlVXJsICsgUHJvdG9jb2wuSU5GT19MRlNfRU5EUE9JTlQ7CisJCXJldHVybiBTdHJpbmdVdGlscy5uYW1lV2l0aERvdEdpdChyZW1vdGVVcmwpCisJCQkJKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBQcm90b2NvbC5FeHBpcmluZ0FjdGlvbiBnZXRTc2hBdXRoZW50aWNhdGlvbigKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5qYXZhCmluZGV4IDFjYTM3YTkuLjA2MjM0YzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQuamF2YQpAQCAtMjgsMjEgKzI4LDIyIEBAIHB1YmxpYyBzdGF0aWMgTGZzVGV4dCBnZXQoKSB7CiAKIAkvLyBAZm9ybWF0dGVyOm9mZgogCS8qKiovIHB1YmxpYyBTdHJpbmcgY29ycnVwdExvbmdPYmplY3Q7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBpbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg7CisJLyoqKi8gcHVibGljIFN0cmluZyBkb3RMZnNDb25maWdSZWFkRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5jb25zaXN0ZW50Q29udGVudExlbmd0aDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGluY29uc2lzdGVudE1lZGlhZmlsZUxlbmd0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGluY29ycmVjdExPTkdfT0JKRUNUX0lEX0xFTkdUSDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRMb25nSWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkTG9uZ0lkTGVuZ3RoOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgbGZzVW5hdmFpbGFibGU7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBwcm90b2NvbEVycm9yOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgcmVxdWlyZWRIYXNoRnVuY3Rpb25Ob3RBdmFpbGFibGU7Ci0JLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5Tm90Rm91bmQ7Ci0JLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5UmVhZE9ubHk7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF0aG9yaXplZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc0ZhaWxlZFRvR2V0UmVwb3NpdG9yeTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc05vRG93bmxvYWRVcmw7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBzZXJ2ZXJGYWlsdXJlOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgd3JvbmdBbW91dE9mRGF0YVJlY2VpdmVkOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgdXNlckNvbmZpZ0ludmFsaWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF1dGhvcml6ZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF2YWlsYWJsZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1pc3NpbmdMb2NhbE9iamVjdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHByb3RvY29sRXJyb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5Tm90Rm91bmQ7CisJLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5UmVhZE9ubHk7CisJLyoqKi8gcHVibGljIFN0cmluZyByZXF1aXJlZEhhc2hGdW5jdGlvbk5vdEF2YWlsYWJsZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNlcnZlckZhaWx1cmU7CisJLyoqKi8gcHVibGljIFN0cmluZyB1c2VyQ29uZmlnSW52YWxpZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHdyb25nQW1vdW50T2ZEYXRhUmVjZWl2ZWQ7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Db25zdGFudHMuamF2YQppbmRleCAzMjEyYTYzLi45YjQxZWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQ29uc3RhbnRzLmphdmEKQEAgLTgyLDYgKzgyLDEzIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRklMVEVSX0RSSVZFUl9QUkVGSVggPSAibGZzLyI7CiAKIAkvKioKKwkgKiBDb25maWcgZmlsZSBuYW1lIGZvciBsZnMgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9MRlNfQ09ORklHID0gIi5sZnNjb25maWciOworCisJLyoqCiAJICogQ3JlYXRlIGEgbmV3IGRpZ2VzdCBmdW5jdGlvbiBmb3Igb2JqZWN0cy4KIAkgKgogCSAqIEByZXR1cm4gYSBuZXcgZGlnZXN0IG9iamVjdC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBjYzFiZjg1Li5jZDIyZTI0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0IgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKaW5kZXggODc0YjI3NC4uNTRmZWI5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBiZTAyNjYyLi4yMDYxOTQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL3BvbS54bWwKaW5kZXggMjkwOWU4MC4uNzYwOTAzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCA4OTM3YTgzLi5lODk5YWQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCmluZGV4IDIyOTJjMmUuLmI3MjVkZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDZlZWU3Y2QuLjk5MDczZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMjQsNyArMjQsNyBAQAogCiAgICA8cmVxdWlyZXM+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmpjcmFmdC5qc2NoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCmluZGV4IGRjNDE1OWIuLjM1NjZkYmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZjBhNDg4NC4uYzA0MDUxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKaW5kZXggZTM0NGMxOS4uNTAzMzhhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGY1ODg5ZTUuLjM5MzlmNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5wZ20iCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMzUsOSArMzUsOSBAQAogICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdC5sZnMiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdC5sZnMiIHZlcnNpb249IjYuMS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUiIHZlcnNpb249IjYuMS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCmluZGV4IGFlOTU3MDQuLjRiMGUyNmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCmluZGV4IGUxMmU1OTkuLjljY2YzOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZDVkMTU1NC4uZDNlNjYyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggYTIwNjQ1ZS4uZDhiNWRlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KQEAgLTMwLDcgKzMwLDcgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggYWU2MmZhMC4uZTAzOTY0NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvcG9tLnhtbAppbmRleCA2ZjEyYWZhLi41OTFiNDQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZGY0MmU5My4uM2RmNGE5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5zc2guanNjaCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvcG9tLnhtbAppbmRleCAzN2FkYTVkLi5lNDYxYmZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZDMxY2QzNy4uNWQ2MWVlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNCArMiw0IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogSkdpdCBUYXJnZXQgUGxhdGZvcm0gQnVuZGxlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRhcmdldAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xNy50YXJnZXQKaW5kZXggOTEzNzBjYy4uNGU0MDIzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC4xNyIgc2VxdWVuY2VOdW1iZXI9IjE2NDEzOTM5NTQiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuMTciIHNlcXVlbmNlTnVtYmVyPSIxNjQ2MjU2NjUzIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpIiB2ZXJzaW9uPSI0LjAuMCIvPgpAQCAtMjMsOCArMjMsOCBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KQEAgLTUxLDIyICs1MSwyMiBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMjEzMTczODEzL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjAzMDIxNzIyMzMvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xNy50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudHBkCmluZGV4IGMyYjEzY2MuLmRiYjQ1MGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xNy50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjE3IiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQogCiBpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgotaW5jbHVkZSAib3JiaXQvUjIwMjExMjEzMTczODEzLTIwMjEtMTIudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkIgogCiBsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIwLTA5LyIgewogCW9yZy5lY2xpcHNlLm9zZ2kgbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50YXJnZXQKaW5kZXggMjgyMDRmNS4uMTYyODIxNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTgudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC4xOCIgc2VxdWVuY2VOdW1iZXI9IjE2NDEzOTQxMjIiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuMTgiIHNlcXVlbmNlTnVtYmVyPSIxNjQ2MjU2NjUzIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpIiB2ZXJzaW9uPSI0LjAuMCIvPgpAQCAtMjMsOCArMjMsOCBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KQEAgLTUxLDIyICs1MSwyMiBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMjEzMTczODEzL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjAzMDIxNzIyMzMvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTgudHBkCmluZGV4IGZmNjc0MWQuLjkxMWM2N2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjE4IiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQogCiBpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgotaW5jbHVkZSAib3JiaXQvUjIwMjExMjEzMTczODEzLTIwMjEtMTIudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkIgogCiBsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIwLTEyLyIgewogCW9yZy5lY2xpcHNlLm9zZ2kgbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50YXJnZXQKaW5kZXggMjBiMDUyOS4uYWIxOGY3YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC4xOS1zdGFnaW5nIiBzZXF1ZW5jZU51bWJlcj0iMTY0MTM5NDE0MSI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4xOS1zdGFnaW5nIiBzZXF1ZW5jZU51bWJlcj0iMTY0NjI1NjY1MyI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KQEAgLTIzLDggKzIzLDggQEAKICAgICAgIDxyZXBvc2l0b3J5IGlkPSJqZXR0eS0xMC4wLngiIGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvamV0dHkvMTAuMC42LyIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2guc291cmNlIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMS52MjAxMjA1MTAyMzA1Ii8+CkBAIC01MSwyMiArNTEsMjIgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0aiIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGouc291cmNlIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5zb3VyY2UiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHoiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHouc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgotICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIxMTIxMzE3MzgxMy9yZXBvc2l0b3J5Ii8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwMzAyMTcyMjMzL3JlcG9zaXRvcnkiLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRwZAppbmRleCA4ZmNhYTQ3Li5mZGI4YjExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50cGQKQEAgLTEsNyArMSw3IEBACiB0YXJnZXQgImpnaXQtNC4xOS1zdGFnaW5nIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQogCiBpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgotaW5jbHVkZSAib3JiaXQvUjIwMjExMjEzMTczODEzLTIwMjEtMTIudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkIgogCiBsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9zdGFnaW5nLzIwMjEtMDMvIiB7CiAJb3JnLmVjbGlwc2Uub3NnaSBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIwLnRhcmdldAppbmRleCAxNTMzMTRkLi40Yzg0MGRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjIwIiBzZXF1ZW5jZU51bWJlcj0iMTY0MTM5NDE1MiI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4yMCIgc2VxdWVuY2VOdW1iZXI9IjE2NDYyNTY2NTMiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICA8cmVwb3NpdG9yeSBpZD0iamV0dHktMTAuMC54IiBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2pldHR5LzEwLjAuNi8iLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaCIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoLnNvdXJjZSIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgpAQCAtNTEsMjIgKzUxLDIyIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGoiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqLnNvdXJjZSIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3Quc291cmNlIiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgpAQCAtODcsNyArODcsNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6IiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KLSAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMTEyMTMxNzM4MTMvcmVwb3NpdG9yeSIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDMwMjE3MjIzMy9yZXBvc2l0b3J5Ii8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5vc2dpIiB2ZXJzaW9uPSIwLjAuMCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIwLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50cGQKaW5kZXggMzNhZGI3Mi4uMTIwZWU2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIwLnRwZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudHBkCkBAIC0xLDcgKzEsNyBAQAogdGFyZ2V0ICJqZ2l0LTQuMjAiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjEtMDYvIiB7CiAJb3JnLmVjbGlwc2Uub3NnaSBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRhcmdldAppbmRleCAwN2RlMWFmLi43ZThjZDkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjIxIiBzZXF1ZW5jZU51bWJlcj0iMTY0MTM5NDE3MCI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4yMSIgc2VxdWVuY2VOdW1iZXI9IjE2NDYyNTY2NTMiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICA8cmVwb3NpdG9yeSBpZD0iamV0dHktMTAuMC54IiBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2pldHR5LzEwLjAuNi8iLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaCIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoLnNvdXJjZSIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgpAQCAtNTEsMjIgKzUxLDIyIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGoiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqLnNvdXJjZSIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3Quc291cmNlIiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgpAQCAtODcsNyArODcsNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6IiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KLSAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMTEyMTMxNzM4MTMvcmVwb3NpdG9yeSIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDMwMjE3MjIzMy9yZXBvc2l0b3J5Ii8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5vc2dpIiB2ZXJzaW9uPSIwLjAuMCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50cGQKaW5kZXggYWRmNjJkNS4uMGVjMmE1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRwZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudHBkCkBAIC0xLDcgKzEsNyBAQAogdGFyZ2V0ICJqZ2l0LTQuMjEiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjEtMDkvIiB7CiAJb3JnLmVjbGlwc2Uub3NnaSBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRhcmdldAppbmRleCA5N2I1ZmI2Li5iMjI5ZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjIyIiBzZXF1ZW5jZU51bWJlcj0iMTY0MTM5NDE3NyI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4yMiIgc2VxdWVuY2VOdW1iZXI9IjE2NDYyNTY2NTMiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICA8cmVwb3NpdG9yeSBpZD0iamV0dHktMTAuMC54IiBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2pldHR5LzEwLjAuNi8iLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaCIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoLnNvdXJjZSIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgpAQCAtNTEsMjIgKzUxLDIyIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGoiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqLnNvdXJjZSIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3Quc291cmNlIiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgpAQCAtODcsNyArODcsNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6IiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KLSAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMTEyMTMxNzM4MTMvcmVwb3NpdG9yeSIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDMwMjE3MjIzMy9yZXBvc2l0b3J5Ii8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5vc2dpIiB2ZXJzaW9uPSIwLjAuMCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50cGQKaW5kZXggMzdjOTNhNy4uZWIxNzIzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRwZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudHBkCkBAIC0xLDcgKzEsNyBAQAogdGFyZ2V0ICJqZ2l0LTQuMjIiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjEtMTIvIiB7CiAJb3JnLmVjbGlwc2Uub3NnaSBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmYzY4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZApAQCAtMCwwICsxLDY5IEBACit0YXJnZXQgIlIyMDIyMDMwMjE3MjIzMyIgd2l0aCBzb3VyY2UgY29uZmlndXJlUGhhc2UKKy8vIHNlZSBodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy8KKworbG9jYXRpb24gImh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDMwMjE3MjIzMy9yZXBvc2l0b3J5IiB7CisJY29tLmdvb2dsZS5nc29uIFsyLjguOS52MjAyMjAxMTEtMTQwOSwyLjguOS52MjAyMjAxMTEtMTQwOV0KKwljb20uZ29vZ2xlLmdzb24uc291cmNlIFsyLjguOS52MjAyMjAxMTEtMTQwOSwyLjguOS52MjAyMjAxMTEtMTQwOV0KKwljb20uamNyYWZ0LmpzY2ggWzAuMS41NS52MjAxOTA0MDQtMTkwMiwwLjEuNTUudjIwMTkwNDA0LTE5MDJdCisJY29tLmpjcmFmdC5qc2NoLnNvdXJjZSBbMC4xLjU1LnYyMDE5MDQwNC0xOTAyLDAuMS41NS52MjAxOTA0MDQtMTkwMl0KKwljb20uamNyYWZ0Lmp6bGliIFsxLjEuMS52MjAxMjA1MTAyMzA1LDEuMS4xLnYyMDEyMDUxMDIzMDVdCisJY29tLmpjcmFmdC5qemxpYi5zb3VyY2UgWzEuMS4xLnYyMDEyMDUxMDIzMDUsMS4xLjEudjIwMTIwNTEwMjMwNV0KKwljb20uc3VuLmpuYSBbNS44LjAudjIwMjEwNTAzLTAzNDMsNS44LjAudjIwMjEwNTAzLTAzNDNdCisJY29tLnN1bi5qbmEuc291cmNlIFs1LjguMC52MjAyMTA1MDMtMDM0Myw1LjguMC52MjAyMTA1MDMtMDM0M10KKwljb20uc3VuLmpuYS5wbGF0Zm9ybSBbNS44LjAudjIwMjEwNDA2LTEwMDQsNS44LjAudjIwMjEwNDA2LTEwMDRdCisJY29tLnN1bi5qbmEucGxhdGZvcm0uc291cmNlIFs1LjguMC52MjAyMTA0MDYtMTAwNCw1LjguMC52MjAyMTA0MDYtMTAwNF0KKwlqYXZhZXdhaCBbMS4xLjEzLnYyMDIxMTAyOS0wODM5LDEuMS4xMy52MjAyMTEwMjktMDgzOV0KKwlqYXZhZXdhaC5zb3VyY2UgWzEuMS4xMy52MjAyMTEwMjktMDgzOSwxLjEuMTMudjIwMjExMDI5LTA4MzldCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5IFsxLjkuMC52MjAxODExMDctMTQxMCwxLjkuMC52MjAxODExMDctMTQxMF0KKwluZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQgWzEuOS4wLnYyMDE4MTEwNi0xNTM0LDEuOS4wLnYyMDE4MTEwNi0xNTM0XQorCW5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudC5zb3VyY2UgWzEuOS4wLnYyMDE4MTEwNi0xNTM0LDEuOS4wLnYyMDE4MTEwNi0xNTM0XQorCW5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS5zb3VyY2UgWzEuOS4wLnYyMDE4MTEwNy0xNDEwLDEuOS4wLnYyMDE4MTEwNy0xNDEwXQorCW5ldC5pMnAuY3J5cHRvLmVkZHNhIFswLjMuMC52MjAyMTA5MjMtMTQwMSwwLjMuMC52MjAyMTA5MjMtMTQwMV0KKwluZXQuaTJwLmNyeXB0by5lZGRzYS5zb3VyY2UgWzAuMy4wLnYyMDIxMDkyMy0xNDAxLDAuMy4wLnYyMDIxMDkyMy0xNDAxXQorCW9yZy5hcGFjaGUuYW50IFsxLjEwLjEyLnYyMDIxMTEwMi0xNDUyLDEuMTAuMTIudjIwMjExMTAyLTE0NTJdCisJb3JnLmFwYWNoZS5hbnQuc291cmNlIFsxLjEwLjEyLnYyMDIxMTEwMi0xNDUyLDEuMTAuMTIudjIwMjExMTAyLTE0NTJdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjIFsxLjE0LjAudjIwMjAwODE4LTE0MjIsMS4xNC4wLnYyMDIwMDgxOC0xNDIyXQorCW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5zb3VyY2UgWzEuMTQuMC52MjAyMDA4MTgtMTQyMiwxLjE0LjAudjIwMjAwODE4LTE0MjJdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzIFsxLjIxLjAudjIwMjExMTAzLTIxMDAsMS4yMS4wLnYyMDIxMTEwMy0yMTAwXQorCW9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5zb3VyY2UgWzEuMjEuMC52MjAyMTExMDMtMjEwMCwxLjIxLjAudjIwMjExMTAzLTIxMDBdCisJb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcgWzEuMi4wLnYyMDE4MDQwOS0xNTAyLDEuMi4wLnYyMDE4MDQwOS0xNTAyXQorCW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSBbMS4yLjAudjIwMTgwNDA5LTE1MDIsMS4yLjAudjIwMTgwNDA5LTE1MDJdCisJb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IFs0LjUuMTMudjIwMjEwMTI4LTIyMjUsNC41LjEzLnYyMDIxMDEyOC0yMjI1XQorCW9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UgWzQuNS4xMy52MjAyMTAxMjgtMjIyNSw0LjUuMTMudjIwMjEwMTI4LTIyMjVdCisJb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSBbNC40LjE1LnYyMDIyMDIwOS0yMzQ1LDQuNC4xNS52MjAyMjAyMDktMjM0NV0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSBbNC40LjE1LnYyMDIyMDIwOS0yMzQ1LDQuNC4xNS52MjAyMjAyMDktMjM0NV0KKwlvcmcuYXBhY2hlLnNzaGQub3NnaSBbMi44LjAudjIwMjExMjI3LTE3NTAsMi44LjAudjIwMjExMjI3LTE3NTBdCisJb3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXBhY2hlLnNzaGQuc2Z0cCBbMi44LjAudjIwMjExMjI3LTE3NTAsMi44LjAudjIwMjExMjI3LTE3NTBdCisJb3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXNzZXJ0aiBbMy4yMC4yLnYyMDIxMDcwNi0xMTA0LDMuMjAuMi52MjAyMTA3MDYtMTEwNF0KKwlvcmcuYXNzZXJ0ai5zb3VyY2UgWzMuMjAuMi52MjAyMTA3MDYtMTEwNCwzLjIwLjIudjIwMjEwNzA2LTExMDRdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3BnIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3BraXggWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmhhbWNyZXN0IFsyLjIuMC52MjAyMTA3MTEtMDgyMSwyLjIuMC52MjAyMTA3MTEtMDgyMV0KKwlvcmcuaGFtY3Jlc3Quc291cmNlIFsyLjIuMC52MjAyMTA3MTEtMDgyMSwyLjIuMC52MjAyMTA3MTEtMDgyMV0KKwlvcmcuaGFtY3Jlc3QuY29yZSBbMS4zLjAudjIwMTgwNDIwLTE1MTksMS4zLjAudjIwMTgwNDIwLTE1MTldCisJb3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcuaGFtY3Jlc3QubGlicmFyeSBbMS4zLjAudjIwMTgwNTI0LTIyNDYsMS4zLjAudjIwMTgwNTI0LTIyNDZdCisJb3JnLmhhbWNyZXN0LmxpYnJhcnkuc291cmNlIFsxLjMuMC52MjAxODA1MjQtMjI0NiwxLjMuMC52MjAxODA1MjQtMjI0Nl0KKwlvcmcuanVuaXQgWzQuMTMuMi52MjAyMTEwMTgtMTk1Niw0LjEzLjIudjIwMjExMDE4LTE5NTZdCisJb3JnLmp1bml0LnNvdXJjZSBbNC4xMy4yLnYyMDIxMTAxOC0xOTU2LDQuMTMuMi52MjAyMTEwMTgtMTk1Nl0KKwlvcmcua29oc3VrZS5hcmdzNGogWzIuMzMuMC52MjAxNjAzMjMtMjIxOCwyLjMzLjAudjIwMTYwMzIzLTIyMThdCisJb3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KKwlvcmcubW9ja2l0byBbMi4yMy4wLnYyMDIwMDMxMC0xNjQyLDIuMjMuMC52MjAyMDAzMTAtMTY0Ml0KKwlvcmcubW9ja2l0by5zb3VyY2UgWzIuMjMuMC52MjAyMDAzMTAtMTY0MiwyLjIzLjAudjIwMjAwMzEwLTE2NDJdCisJb3JnLm9iamVuZXNpcyBbMi42LjAudjIwMTgwNDIwLTE1MTksMi42LjAudjIwMTgwNDIwLTE1MTldCisJb3JnLm9iamVuZXNpcy5zb3VyY2UgWzIuNi4wLnYyMDE4MDQyMC0xNTE5LDIuNi4wLnYyMDE4MDQyMC0xNTE5XQorCW9yZy5zbGY0ai5hcGkgWzEuNy4zMC52MjAyMDAyMDQtMjE1MCwxLjcuMzAudjIwMjAwMjA0LTIxNTBdCisJb3JnLnNsZjRqLmFwaS5zb3VyY2UgWzEuNy4zMC52MjAyMDAyMDQtMjE1MCwxLjcuMzAudjIwMjAwMjA0LTIxNTBdCisJb3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlIFsxLjcuMzAudjIwMjAwMjA0LTIxNTAsMS43LjMwLnYyMDIwMDIwNC0yMTUwXQorCW9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UgWzEuNy4zMC52MjAyMDAyMDQtMjE1MCwxLjcuMzAudjIwMjAwMjA0LTIxNTBdCisJb3JnLnR1a2FhbmkueHogWzEuOS4wLnYyMDIxMDYyNC0xMjU5LDEuOS4wLnYyMDIxMDYyNC0xMjU5XQorCW9yZy50dWthYW5pLnh6LnNvdXJjZSBbMS45LjAudjIwMjEwNjI0LTEyNTksMS45LjAudjIwMjEwNjI0LTEyNTldCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbAppbmRleCA4YmVlMWZjLi4yYTk1MDQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKQEAgLTE2LDcgKzE2LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCmluZGV4IDgwYTY0YmQuLmI2NTA1OTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbApAQCAtMTYsNyArMTYsNyBAQAogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CiAKICAgPG5hbWU+SkdpdCBUeWNobyBQYXJlbnQ8L25hbWU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBhZjAwYjBhLi5mNWM0ZGU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMjggKzMsMzAgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbAppbmRleCBjZDJiYjYzLi5jODI0Nzg4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmVUZXN0LmphdmEKaW5kZXggNGJhZDczYi4uYzc4NTQ0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmVUZXN0LmphdmEKQEAgLTg5LDYgKzg5LDMxIEBAIHB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbW1pdE1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVDb21taXRNYXRjaEFiYnJldigpIHRocm93cyBFeGNlcHRpb24geworCQlpbml0aWFsQ29tbWl0QW5kVGFnKCk7CisJCXNlY29uZENvbW1pdCgpOworCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyAidjEuMC0xLWc1NmY2Y2ViZGYzZjUiLCAiIiB9LAorCQkJCWV4ZWN1dGUoImdpdCBkZXNjcmliZSAtLWFiYnJldiAxMiAtLW1hdGNoIHYxLioiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVDb21taXRNYXRjaEFiYnJldk1pbigpIHRocm93cyBFeGNlcHRpb24geworCQlpbml0aWFsQ29tbWl0QW5kVGFnKCk7CisJCXNlY29uZENvbW1pdCgpOworCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyAidjEuMC0xLWc1NmY2IiwgIiIgfSwKKwkJCQlleGVjdXRlKCJnaXQgZGVzY3JpYmUgLS1hYmJyZXYgLTUgLS1tYXRjaCB2MS4qIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29tbWl0TWF0Y2hBYmJyZXZNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW5pdGlhbENvbW1pdEFuZFRhZygpOworCQlzZWNvbmRDb21taXQoKTsKKwkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsKKwkJCQkidjEuMC0xLWc1NmY2Y2ViZGYzZjVjZWVlY2Q4MDMzNjVhYmYwOTk2ZmIxZmEwMDZkIiwgIiIgfSwKKwkJCQlleGVjdXRlKCJnaXQgZGVzY3JpYmUgLS1hYmJyZXYgNTAgLS1tYXRjaCB2MS4qIikpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29tbWl0TWF0Y2gyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWluaXRpYWxDb21taXRBbmRUYWcoKTsKIAkJc2Vjb25kQ29tbWl0KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmY0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbFRlc3QuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkNvbW1hbmRMaW5lRGlmZlRvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ0xJUmVwb3NpdG9yeVRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5DbWRMaW5lUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5TdWJjb21tYW5kSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OworCisvKioKKyAqIFRlc3RpbmcgdGhlIHtAY29kZSBkaWZmdG9vbH0gY29tbWFuZC4KKyAqLworcHVibGljIGNsYXNzIERpZmZUb29sVGVzdCBleHRlbmRzIENMSVJlcG9zaXRvcnlUZXN0Q2FzZSB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBHaXRDbGlKR2l0V3JhcHBlclBhcnNlciB7CisJCUBBcmd1bWVudChpbmRleCA9IDAsIG1ldGFWYXIgPSAibWV0YVZhcl9jb21tYW5kIiwgcmVxdWlyZWQgPSB0cnVlLCBoYW5kbGVyID0gU3ViY29tbWFuZEhhbmRsZXIuY2xhc3MpCisJCVRleHRCdWlsdGluIHN1YmNvbW1hbmQ7CisKKwkJQEFyZ3VtZW50KGluZGV4ID0gMSwgbWV0YVZhciA9ICJtZXRhVmFyX2FyZyIpCisJCUxpc3Q8U3RyaW5nPiBhcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZ1tdIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoU3RyaW5nLi4uIGFyZ3MpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ0xJR2l0Q29tbWFuZC5SZXN1bHQgcmVzdWx0ID0gbmV3IENMSUdpdENvbW1hbmQuUmVzdWx0KCk7CisKKwkJR2l0Q2xpSkdpdFdyYXBwZXJQYXJzZXIgYmVhbiA9IG5ldyBHaXRDbGlKR2l0V3JhcHBlclBhcnNlcigpOworCQlDbWRMaW5lUGFyc2VyIGNscCA9IG5ldyBDbWRMaW5lUGFyc2VyKGJlYW4pOworCQljbHAucGFyc2VBcmd1bWVudChhcmdzKTsKKworCQlUZXh0QnVpbHRpbiBjbWQgPSBiZWFuLnN1YmNvbW1hbmQ7CisJCWNtZC5pbml0UmF3KGRiLCBudWxsLCBudWxsLCByZXN1bHQub3V0LCByZXN1bHQuZXJyKTsKKwkJY21kLmV4ZWN1dGUoYmVhbi5hcmd1bWVudHMudG9BcnJheShuZXcgU3RyaW5nW2JlYW4uYXJndW1lbnRzLnNpemUoKV0pKTsKKwkJaWYgKGNtZC5nZXRPdXRwdXRXcml0ZXIoKSAhPSBudWxsKSB7CisJCQljbWQuZ2V0T3V0cHV0V3JpdGVyKCkuZmx1c2goKTsKKwkJfQorCQlpZiAoY21kLmdldEVycm9yV3JpdGVyKCkgIT0gbnVsbCkgeworCQkJY21kLmdldEVycm9yV3JpdGVyKCkuZmx1c2goKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0Lm91dExpbmVzKCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKwl9CisKKwlwcml2YXRlIEdpdCBnaXQ7CisKKwlAT3ZlcnJpZGUKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJZ2l0ID0gbmV3IEdpdChkYik7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIGNvbW1pdCIpLmNhbGwoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKTsKKwkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhjb21taXQpOworCQlTdHJpbmdbXSBleHBlY3RlZE91dHB1dCA9IGdldEV4cGVjdGVkRGlmZlRvb2xPdXRwdXQoY2hhbmdlcyk7CisKKwkJU3RyaW5nW10gb3B0aW9ucyA9IHsKKwkJCQkiLS10b29sIiwKKwkJCQkiLXQiLAorCQl9OworCisJCWZvciAoU3RyaW5nIG9wdGlvbiA6IG9wdGlvbnMpIHsKKwkJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCQlleHBlY3RlZE91dHB1dCwKKwkJCQkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLCBvcHRpb24sCisJCQkJCQkJInNvbWVfdG9vbCIpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvb2xUcnVzdEV4aXRDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKTsKKwkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhjb21taXQpOworCQlTdHJpbmdbXSBleHBlY3RlZE91dHB1dCA9IGdldEV4cGVjdGVkRGlmZlRvb2xPdXRwdXQoY2hhbmdlcyk7CisKKwkJU3RyaW5nW10gb3B0aW9ucyA9IHsgIi0tdG9vbCIsICItdCIsIH07CisKKwkJZm9yIChTdHJpbmcgb3B0aW9uIDogb3B0aW9ucykgeworCQkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KCJkaWZmdG9vbCIsCisJCQkJCQkJIi0tdHJ1c3QtZXhpdC1jb2RlIiwgb3B0aW9uLCAic29tZV90b29sIikpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbE5vR3VpTm9Qcm9tcHROb1RydXN0RXhpdGNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpOworCQlMaXN0PERpZmZFbnRyeT4gY2hhbmdlcyA9IGdldFJlcG9zaXRvcnlDaGFuZ2VzKGNvbW1pdCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWREaWZmVG9vbE91dHB1dChjaGFuZ2VzKTsKKworCQlTdHJpbmdbXSBvcHRpb25zID0geyAiLS10b29sIiwgIi10IiwgfTsKKworCQlmb3IgKFN0cmluZyBvcHRpb24gOiBvcHRpb25zKSB7CisJCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQkJZXhwZWN0ZWRPdXRwdXQsIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoImRpZmZ0b29sIiwKKwkJCQkJCQkiLS1uby1ndWkiLCAiLS1uby1wcm9tcHQiLCAiLS1uby10cnVzdC1leGl0LWNvZGUiLAorCQkJCQkJCW9wdGlvbiwgInNvbWVfdG9vbCIpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvb2xDYWNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IGNyZWF0ZVN0YWdlZENoYW5nZXMoKTsKKwkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhjb21taXQpOworCQlTdHJpbmdbXSBleHBlY3RlZE91dHB1dCA9IGdldEV4cGVjdGVkRGlmZlRvb2xPdXRwdXQoY2hhbmdlcyk7CisKKwkJU3RyaW5nW10gb3B0aW9ucyA9IHsgIi0tY2FjaGVkIiwgIi0tc3RhZ2VkIiwgfTsKKworCQlmb3IgKFN0cmluZyBvcHRpb24gOiBvcHRpb25zKSB7CisJCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQkJZXhwZWN0ZWRPdXRwdXQsIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoImRpZmZ0b29sIiwKKwkJCQkJCQlvcHRpb24sICItLXRvb2wiLCAic29tZV90b29sIikpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbEhlbHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbWFuZExpbmVEaWZmVG9vbFtdIGRlZmF1bHRUb29scyA9IENvbW1hbmRMaW5lRGlmZlRvb2wudmFsdWVzKCk7CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZE91dHB1dCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlleHBlY3RlZE91dHB1dC5hZGQoImdpdCBkaWZmdG9vbCAtLXRvb2w9PHRvb2w+IG1heSBiZSBzZXQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Iik7CisJCWZvciAoQ29tbWFuZExpbmVEaWZmVG9vbCBkZWZhdWx0VG9vbCA6IGRlZmF1bHRUb29scykgeworCQkJU3RyaW5nIHRvb2xOYW1lID0gZGVmYXVsdFRvb2wubmFtZSgpOworCQkJZXhwZWN0ZWRPdXRwdXQuYWRkKHRvb2xOYW1lKTsKKwkJfQorCQlTdHJpbmdbXSB1c2VyRGVmaW5lZFRvb2xzSGVscCA9IHsKKwkJCQkidXNlci1kZWZpbmVkOiIsCisJCQkJIlRoZSBmb2xsb3dpbmcgdG9vbHMgYXJlIHZhbGlkLCBidXQgbm90IGN1cnJlbnRseSBhdmFpbGFibGU6IiwKKwkJCQkiU29tZSBvZiB0aGUgdG9vbHMgbGlzdGVkIGFib3ZlIG9ubHkgd29yayBpbiBhIHdpbmRvd2VkIiwKKwkJCQkiZW52aXJvbm1lbnQuIElmIHJ1biBpbiBhIHRlcm1pbmFsLW9ubHkgc2Vzc2lvbiwgdGhleSB3aWxsIGZhaWwuIiwKKwkJfTsKKwkJZXhwZWN0ZWRPdXRwdXQuYWRkQWxsKEFycmF5cy5hc0xpc3QodXNlckRlZmluZWRUb29sc0hlbHApKTsKKworCQlTdHJpbmcgb3B0aW9uID0gIi0tdG9vbC1oZWxwIjsKKwkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJZXhwZWN0ZWRPdXRwdXQudG9BcnJheShuZXcgU3RyaW5nWzBdKSwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLCBvcHRpb24pKTsKKwl9CisKKwlwcml2YXRlIFJldkNvbW1pdCBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoImEiLCAiSGVsbG8gd29ybGQgYSIpOworCQl3cml0ZVRyYXNoRmlsZSgiYiIsICJIZWxsbyB3b3JsZCBiIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJmaWxlcyBhICYgYiIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImEiLCAiTmV3IEhlbGxvIHdvcmxkIGEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIiLCAiTmV3IEhlbGxvIHdvcmxkIGIiKTsKKwkJcmV0dXJuIGNvbW1pdDsKKwl9CisKKwlwcml2YXRlIFJldkNvbW1pdCBjcmVhdGVTdGFnZWRDaGFuZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlyZXR1cm4gY29tbWl0OworCX0KKworCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGdldFJlcG9zaXRvcnlDaGFuZ2VzKFJldkNvbW1pdCBjb21taXQpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpOworCQl0dy5hZGRUcmVlKGNvbW1pdC5nZXRUcmVlKCkpOworCQlGaWxlVHJlZUl0ZXJhdG9yIG1vZGlmaWVkVHJlZSA9IG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKTsKKwkJdHcuYWRkVHJlZShtb2RpZmllZFRyZWUpOworCQlMaXN0PERpZmZFbnRyeT4gY2hhbmdlcyA9IERpZmZFbnRyeS5zY2FuKHR3KTsKKwkJcmV0dXJuIGNoYW5nZXM7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdbXSBnZXRFeHBlY3RlZERpZmZUb29sT3V0cHV0KExpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzKSB7CisJCVN0cmluZ1tdIGV4cGVjdGVkVG9vbE91dHB1dCA9IG5ldyBTdHJpbmdbY2hhbmdlcy5zaXplKCldOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMuc2l6ZSgpOyArK2kpIHsKKwkJCURpZmZFbnRyeSBjaGFuZ2UgPSBjaGFuZ2VzLmdldChpKTsKKwkJCVN0cmluZyBuZXdQYXRoID0gY2hhbmdlLmdldE5ld1BhdGgoKTsKKwkJCVN0cmluZyBvbGRQYXRoID0gY2hhbmdlLmdldE9sZFBhdGgoKTsKKwkJCVN0cmluZyBuZXdJZE5hbWUgPSBjaGFuZ2UuZ2V0TmV3SWQoKS5uYW1lKCk7CisJCQlTdHJpbmcgb2xkSWROYW1lID0gY2hhbmdlLmdldE9sZElkKCkubmFtZSgpOworCQkJU3RyaW5nIGV4cGVjdGVkTGluZSA9ICJNXHQiICsgbmV3UGF0aCArICIgKCIgKyBuZXdJZE5hbWUgKyAiKSIKKwkJCQkJKyAiXHQiICsgb2xkUGF0aCArICIgKCIgKyBvbGRJZE5hbWUgKyAiKSI7CisJCQlleHBlY3RlZFRvb2xPdXRwdXRbaV0gPSBleHBlY3RlZExpbmU7CisJCX0KKwkJcmV0dXJuIGV4cGVjdGVkVG9vbE91dHB1dDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5T2ZMaW5lc0VxdWFscyhTdHJpbmcgZmFpbE1lc3NhZ2UsCisJCQlTdHJpbmdbXSBleHBlY3RlZCwgU3RyaW5nW10gYWN0dWFsKSB7CisJCWFzc2VydEVxdWFscyhmYWlsTWVzc2FnZSwgdG9TdHJpbmcoZXhwZWN0ZWQpLCB0b1N0cmluZyhhY3R1YWwpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCmluZGV4IDU2NGJkNWYuLjFjNmI3ODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCkBAIC0zMyw2ICszMyw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIGNvbW1pdCIpLmNhbGwoKTsKIAogCQlSZXBvc2l0b3J5IHJlbW90ZVJlcG9zaXRvcnkgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShyZW1vdGVSZXBvc2l0b3J5KTsKIAkJcmVtb3RlR2l0ID0gbmV3IEdpdChyZW1vdGVSZXBvc2l0b3J5KTsKIAogCQkvLyBzZXR1cCB0aGUgZmlyc3QgcmVwb3NpdG9yeSB0byBmZXRjaCBmcm9tIHRoZSBzZWNvbmQgcmVwb3NpdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmZmFhZmMxLi5lZDk4MGI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20KIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0xNCw0NyArMTQsNDkgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0O3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuY29tcG9uZW50O3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2guanNjaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2guanNjaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcua29oc3VrZS5hcmdzNGo7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiLAogIG9yZy5rb2hzdWtlLmFyZ3M0ai5zcGk7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmNvbnNvbGU7dmVyc2lvbj0iNi4xLjEiOwogIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpLApAQCAtNjYsMTQgKzY4LDE0IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5hcGksCiAgICBqYXZheC5zd2luZyIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbywKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtLAogICAgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmtvaHN1a2UuYXJnczRqLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggMjYyNjlkNy4uMGE1ZGQ4OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvc2VydmljZXMvb3JnLmVjbGlwc2UuamdpdC5wZ20uVGV4dEJ1aWx0aW4gYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5UZXh0QnVpbHRpbgppbmRleCBlNjQ1MjU1Li44YzQ0NzY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5UZXh0QnVpbHRpbgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5UZXh0QnVpbHRpbgpAQCAtMTIsNiArMTIsNyBAQAogb3JnLmVjbGlwc2UuamdpdC5wZ20uRGFlbW9uCiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5EZXNjcmliZQogb3JnLmVjbGlwc2UuamdpdC5wZ20uRGlmZgorb3JnLmVjbGlwc2UuamdpdC5wZ20uRGlmZlRvb2wKIG9yZy5lY2xpcHNlLmpnaXQucGdtLkRpZmZUcmVlCiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5GZXRjaAogb3JnLmVjbGlwc2UuamdpdC5wZ20uR2MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCmluZGV4IDA1ZTBiY2MuLmMxODlkYzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKaW5kZXggOTc0NTAwMy4uZmRhMGJmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCkBAIC01OCw2ICs1OCw5IEBACiBkYXRlSW5mbz1EYXRlOiAgIHswfQogZGVsZXRlZEJyYW5jaD1EZWxldGVkIGJyYW5jaCB7MH0KIGRlbGV0ZWRSZW1vdGVCcmFuY2g9RGVsZXRlZCByZW1vdGUgYnJhbmNoIHswfQorZGlmZlRvb2xIZWxwU2V0VG9Gb2xsb3dpbmc9J2dpdCBkaWZmdG9vbCAtLXRvb2w9PHRvb2w+JyBtYXkgYmUgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuezB9XG5cdHVzZXItZGVmaW5lZDpcbnsxfVxuVGhlIGZvbGxvd2luZyB0b29scyBhcmUgdmFsaWQsIGJ1dCBub3QgY3VycmVudGx5IGF2YWlsYWJsZTpcbnsyfVxuU29tZSBvZiB0aGUgdG9vbHMgbGlzdGVkIGFib3ZlIG9ubHkgd29yayBpbiBhIHdpbmRvd2VkXG5lbnZpcm9ubWVudC4gSWYgcnVuIGluIGEgdGVybWluYWwtb25seSBzZXNzaW9uLCB0aGV5IHdpbGwgZmFpbC4KK2RpZmZUb29sTGF1bmNoPVZpZXdpbmcgKHswfS97MX0pOiAnezJ9J1xuTGF1bmNoICd7M30nIFtZL25dPworZGlmZlRvb2xEaWVkPWV4dGVybmFsIGRpZmYgZGllZCwgc3RvcHBpbmcgYXQgezB9CiBkb2VzTm90RXhpc3Q9ezB9IGRvZXMgbm90IGV4aXN0CiBkb250T3ZlcndyaXRlTG9jYWxDaGFuZ2VzPWVycm9yOiBZb3VyIGxvY2FsIGNoYW5nZXMgdG8gdGhlIGZvbGxvd2luZyBmaWxlIHdvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IG1lcmdlOgogZXZlcnl0aGluZ1VwVG9EYXRlPUV2ZXJ5dGhpbmcgdXAtdG8tZGF0ZQpAQCAtMTQ1LDYgKzE0OCw3IEBACiBtZXRhVmFyX3NlY29uZHM9U0VDT05EUwogbWV0YVZhcl9zZXJ2aWNlPVNFUlZJQ0UKIG1ldGFWYXJfdGFnTG9jYWxVc2VyPTxHUEcga2V5IElEPgorbWV0YVZhcl90b29sPVRPT0wKIG1ldGFWYXJfdHJlZWlzaD10cmVlLWlzaAogbWV0YVZhcl91cmlpc2g9dXJpLWlzaAogbWV0YVZhcl91cmw9VVJMCkBAIC0yMjUsNiArMjI5LDcgQEAKIHVuc3VwcG9ydGVkT3BlcmF0aW9uPVVuc3VwcG9ydGVkIG9wZXJhdGlvbjogezB9CiB1bnRyYWNrZWRGaWxlcz1VbnRyYWNrZWQgZmlsZXM6CiB1cGRhdGluZz1VcGRhdGluZyB7MH0uLnsxfQordXNhZ2VfQWJicmV2PUluc3RlYWQgb2YgdXNpbmcgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyAod2hpY2ggd2lsbCB2YXJ5IGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHJlcG9zaXRvcnkgd2l0aCBhIGRlZmF1bHQgb2YgNykgb2YgdGhlIGFiYnJldmlhdGVkIG9iamVjdCBuYW1lLCB1c2UgPG4+IGRpZ2l0cywgb3IgYXMgbWFueSBkaWdpdHMgYXMgbmVlZGVkIHRvIGZvcm0gYSB1bmlxdWUgb2JqZWN0IG5hbWUuIEFuIDxuPiBvZiAwIHdpbGwgc3VwcHJlc3MgbG9uZyBmb3JtYXQsIG9ubHkgc2hvd2luZyB0aGUgY2xvc2VzdCB0YWcuCiB1c2FnZV9BZ2dyZXNzaXZlPVRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgZ2MgdG8gbW9yZSBhZ2dyZXNzaXZlbHkgb3B0aW1pemUgdGhlIHJlcG9zaXRvcnkgYXQgdGhlIGV4cGVuc2Ugb2YgdGFraW5nIG11Y2ggbW9yZSB0aW1lCiB1c2FnZV9BbHdheXNGYWxsYmFjaz1TaG93IHVuaXF1ZWx5IGFiYnJldmlhdGVkIGNvbW1pdCBvYmplY3QgYXMgZmFsbGJhY2sKIHVzYWdlX2JhcmVDbG9uZT1NYWtlIGEgYmFyZSBHaXQgcmVwb3NpdG9yeS4gVGhhdCBpcywgaW5zdGVhZCBvZiBjcmVhdGluZyBbRElSRUNUT1JZXSBhbmQgcGxhY2luZyB0aGUgYWRtaW5pc3RyYXRpdmUgZmlsZXMgaW4gW0RJUkVDVE9SWV0vLmdpdCwgbWFrZSB0aGUgW0RJUkVDVE9SWV0gaXRzZWxmIHRoZSAkR0lUX0RJUi4KQEAgLTI0OSw2ICsyNTQsOCBAQAogdXNhZ2VfRGlzcGxheVRoZVZlcnNpb25PZkpnaXQ9RGlzcGxheSB0aGUgdmVyc2lvbiBvZiBqZ2l0CiB1c2FnZV9HYz1DbGVhbnVwIHVubmVjZXNzYXJ5IGZpbGVzIGFuZCBvcHRpbWl6ZSB0aGUgbG9jYWwgcmVwb3NpdG9yeQogdXNhZ2VfR2xvZz1WaWV3IGNvbW1pdCBoaXN0b3J5IGFzIGEgZ3JhcGgKK3VzYWdlX0RpZmZHdWlUb29sPVdoZW4gZ2l0LWRpZmZ0b29sIGlzIGludm9rZWQgd2l0aCB0aGUgLWcgb3IgLS1ndWkgb3B0aW9uIHRoZSBkZWZhdWx0IGRpZmYgdG9vbCB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgY29uZmlndXJlZCBkaWZmLmd1aXRvb2wgdmFyaWFibGUgaW5zdGVhZCBvZiBkaWZmLnRvb2wuCit1c2FnZV9ub0d1aT1UaGUgLS1uby1ndWkgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIC1nIG9yIC0tZ3VpIHNldHRpbmcuCiB1c2FnZV9JbmRleFBhY2s9QnVpbGQgcGFjayBpbmRleCBmaWxlIGZvciBhbiBleGlzdGluZyBwYWNrZWQgYXJjaGl2ZQogdXNhZ2VfTEZTRGlyZWN0b3J5PURpcmVjdG9yeSB0byBzdG9yZSBsYXJnZSBvYmplY3RzCiB1c2FnZV9MRlNQb3J0PVNlcnZlciBodHRwIHBvcnQKQEAgLTI5NSw2ICszMDIsNyBAQAogdXNhZ2VfU3RhdHVzPVNob3cgdGhlIHdvcmtpbmcgdHJlZSBzdGF0dXMKIHVzYWdlX1N0b3BUcmFja2luZ0FGaWxlPVN0b3AgdHJhY2tpbmcgYSBmaWxlCiB1c2FnZV9UZXh0SGFzaEZ1bmN0aW9ucz1TY2FuIHJlcG9zaXRvcnkgdG8gY29tcHV0ZSBtYXhpbXVtIG51bWJlciBvZiBjb2xsaXNpb25zIGZvciBoYXNoIGZ1bmN0aW9ucwordXNhZ2VfVG9vbEZvckRpZmY9VXNlIHRoZSBkaWZmIHRvb2wgc3BlY2lmaWVkIGJ5IDx0b29sPi4gUnVuIGdpdCBkaWZmdG9vbCAtLXRvb2wtaGVscCBmb3IgdGhlIGxpc3Qgb2YgdmFsaWQgPHRvb2w+IHNldHRpbmdzLlxuSWYgYSBkaWZmIHRvb2wgaXMgbm90IHNwZWNpZmllZCwgZ2l0IGRpZmZ0b29sIHdpbGwgdXNlIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGRpZmYudG9vbC4KIHVzYWdlX1VwZGF0ZVJlbW90ZVJlcG9zaXRvcnlGcm9tTG9jYWxSZWZzPVVwZGF0ZSByZW1vdGUgcmVwb3NpdG9yeSBmcm9tIGxvY2FsIHJlZnMKIHVzYWdlX1VzZUFsbD1Vc2UgYWxsIHJlZnMgZm91bmQgaW4gcmVmcy8KIHVzYWdlX1VzZVRhZ3M9VXNlIGFueSB0YWcgaW5jbHVkaW5nIGxpZ2h0d2VpZ2h0IHRhZ3MKQEAgLTM0MSw2ICszNDksNyBAQAogdXNhZ2VfZGF0ZT1kYXRlIGZvcm1hdCwgb25lIG9mIGRlZmF1bHQsIHJmYywgbG9jYWwsIGlzbywgc2hvcnQsIHJhdyAoYXMgZGVmaW5lZCBieSBnaXQtbG9nKDEpICksIGxvY2FsZSBvciBsb2NhbGVsb2NhbCAoamdpdCBleHRlbnNpb25zKQogdXNhZ2VfZGV0ZWN0UmVuYW1lcz1kZXRlY3QgcmVuYW1lZCBmaWxlcwogdXNhZ2VfZGlmZkFsZ29yaXRobT10aGUgZGlmZiBhbGdvcml0aG0gdG8gdXNlLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFyZTogJ215ZXJzJywgJ2hpc3RvZ3JhbScKK3VzYWdlX0RpZmZUb29sPWdpdCBkaWZmdG9vbCBpcyBhIEdpdCBjb21tYW5kIHRoYXQgYWxsb3dzIHlvdSB0byBjb21wYXJlIGFuZCBlZGl0IGZpbGVzIGJldHdlZW4gcmV2aXNpb25zIHVzaW5nIGNvbW1vbiBkaWZmIHRvb2xzLlxuZ2l0IGRpZmZ0b29sIGlzIGEgZnJvbnRlbmQgdG8gZ2l0IGRpZmYgYW5kIGFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhbmQgYXJndW1lbnRzLgogdXNhZ2VfZGlyZWN0b3JpZXNUb0V4cG9ydD1kaXJlY3RvcmllcyB0byBleHBvcnQKIHVzYWdlX2Rpc2FibGVUaGVTZXJ2aWNlSW5BbGxSZXBvc2l0b3JpZXM9ZGlzYWJsZSB0aGUgc2VydmljZSBpbiBhbGwgcmVwb3NpdG9yaWVzCiB1c2FnZV9kaXNwbGF5QUxpc3RPZkFsbFJlZ2lzdGVyZWRKZ2l0Q29tbWFuZHM9RGlzcGxheSBhIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgamdpdCBjb21tYW5kcwpAQCAtMzk1LDYgKzQwNCw4IEBACiB1c2FnZV9wZXJmb3JtRnNja1N0eWxlQ2hlY2tzT25SZWNlaXZlPXBlcmZvcm0gZnNjayBzdHlsZSBjaGVja3Mgb24gcmVjZWl2ZQogdXNhZ2VfcG9ydE51bWJlclRvTGlzdGVuT249cG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uCiB1c2FnZV9wcmludE9ubHlCcmFuY2hlc1RoYXRDb250YWluVGhlQ29tbWl0PXByaW50IG9ubHkgYnJhbmNoZXMgdGhhdCBjb250YWluIHRoZSBjb21taXQKK3VzYWdlX3Byb21wdD1Qcm9tcHQgYmVmb3JlIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgZGlmZiB0b29sLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91cjsgdGhlIG9wdGlvbiBpcyBwcm92aWRlZCB0byBvdmVycmlkZSBhbnkgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KK3VzYWdlX25vUHJvbXB0PURvIG5vdCBwcm9tcHQgYmVmb3JlIGxhdW5jaGluZyBhIGRpZmYgdG9vbC4KIHVzYWdlX3BydW5lU3RhbGVUcmFja2luZ1JlZnM9cHJ1bmUgc3RhbGUgdHJhY2tpbmcgcmVmcwogdXNhZ2VfcHVzaFVybHM9cHVzaCBVUkxzIGFyZSBtYW5pcHVsYXRlZAogdXNhZ2VfcXVpZXQ9ZG9uJ3Qgc2hvdyBwcm9ncmVzcyBtZXNzYWdlcwpAQCAtNDIyLDYgKzQzMyw4IEBACiB1c2FnZV9zc2hEcml2ZXI9U2VsZWN0cyB0aGUgYnVpbHQtaW4gc3NoIGxpYnJhcnkgdG8gdXNlLCBKU2NoIG9yIEFwYWNoZSBNSU5BIHNzaGQuCiB1c2FnZV9zeW1ib2xpY1ZlcnNpb25Gb3JUaGVQcm9qZWN0PVN5bWJvbGljIHZlcnNpb24gZm9yIHRoZSBwcm9qZWN0CiB1c2FnZV90YWdzPWZldGNoIGFsbCB0YWdzCit1c2FnZV90cnVzdEV4aXRDb2RlPWdpdC1kaWZmdG9vbCBpbnZva2VzIGEgZGlmZiB0b29sIGluZGl2aWR1YWxseSBvbiBlYWNoIGZpbGUuIEVycm9ycyByZXBvcnRlZCBieSB0aGUgZGlmZiB0b29sIGFyZSBpZ25vcmVkIGJ5IGRlZmF1bHQuIFVzZSAtLXRydXN0LWV4aXQtY29kZSB0byBtYWtlIGdpdC1kaWZmdG9vbCBleGl0IHdoZW4gYW4gaW52b2tlZCBkaWZmIHRvb2wgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgY29kZS5cbmdpdC1kaWZmdG9vbCB3aWxsIGZvcndhcmQgdGhlIGV4aXQgY29kZSBvZiB0aGUgaW52b2tlZCB0b29sIHdoZW4gLS10cnVzdC1leGl0LWNvZGUgaXMgdXNlZC4KK3VzYWdlX25vVHJ1c3RFeGl0Q29kZT1UaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSAtLXRydXN0LWV4aXQtY29kZSBzZXR0aW5nLgogdXNhZ2Vfbm90YWdzPWRvIG5vdCBmZXRjaCB0YWdzCiB1c2FnZV90YWdBbm5vdGF0ZWQ9Y3JlYXRlIGFuIGFubm90YXRlZCB0YWcsIHVuc2lnbmVkIHVubGVzcyAtcyBvciAtdSBhcmUgZ2l2ZW4sIG9yIGNvbmZpZyB0YWcuZ3BnU2lnbiBpcyB0cnVlCiB1c2FnZV90YWdEZWxldGU9ZGVsZXRlIHRhZwpAQCAtNDMwLDYgKzQ0Myw3IEBACiB1c2FnZV90YWdTaWduPWNyZWF0ZSBhIHNpZ25lZCBhbm5vdGF0ZWQgdGFnCiB1c2FnZV90YWdOb1NpZ249c3VwcHJlc3Mgc2lnbmluZyB0aGUgdGFnCiB1c2FnZV90YWdWZXJpZnk9VmVyaWZ5IHRoZSBHUEcgc2lnbmF0dXJlCit1c2FnZV90b29sSGVscD1QcmludCBhIGxpc3Qgb2YgZGlmZiB0b29scyB0aGF0IG1heSBiZSB1c2VkIHdpdGggLS10b29sLgogdXNhZ2VfdW50cmFja2VkRmlsZXNNb2RlPXNob3cgdW50cmFja2VkIGZpbGVzCiB1c2FnZV91cGRhdGVSZWY9cmVmZXJlbmNlIHRvIHVwZGF0ZQogdXNhZ2VfdXBkYXRlUmVtb3RlUmVmc0Zyb21Bbm90aGVyUmVwb3NpdG9yeT1VcGRhdGUgcmVtb3RlIHJlZnMgZnJvbSBhbm90aGVyIHJlcG9zaXRvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CbGFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JsYW1lLmphdmEKaW5kZXggMmI0OWNmNy4uMWEzYTJmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JsYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JsYW1lLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlci52YWx1ZU9mOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTG9uZy52YWx1ZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEg7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTE2LDcgKzExNyw4IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAogCQlib29sZWFuIGF1dG9BYmJyZXYgPSBhYmJyZXYgPT0gMDsKIAkJaWYgKGFiYnJldiA9PSAwKSB7Ci0JCQlhYmJyZXYgPSBkYi5nZXRDb25maWcoKS5nZXRJbnQoImNvcmUiLCAiYWJicmV2IiwgNyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJYWJicmV2ID0gZGIuZ2V0Q29uZmlnKCkuZ2V0SW50KCJjb3JlIiwgImFiYnJldiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpOwogCQl9CiAJCWlmICghc2hvd0JsYW5rQm91bmRhcnkpIHsKIAkJCXJvb3QgPSBkYi5nZXRDb25maWcoKS5nZXRCb29sZWFuKCJibGFtZSIsICJibGFua2JvdW5kYXJ5IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlLmphdmEKaW5kZXggOGFhMTE5YS4uMTE2ZGIwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlLmphdmEKQEAgLTQ0LDYgKzQ0LDkgQEAgY2xhc3MgRGVzY3JpYmUgZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CiAJQE9wdGlvbihuYW1lID0gIi0tbWF0Y2giLCB1c2FnZSA9ICJ1c2FnZV9NYXRjaCIsIG1ldGFWYXIgPSAibWV0YVZhcl9wYXR0ZXJuIikKIAlwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCisJQE9wdGlvbihuYW1lID0gIi0tYWJicmV2IiwgdXNhZ2UgPSAidXNhZ2VfQWJicmV2IikKKwlwcml2YXRlIEludGVnZXIgYWJicmV2OworCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CkBAIC01Nyw2ICs2MCw5IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAkJCWNtZC5zZXRUYWdzKHVzZVRhZ3MpOwogCQkJY21kLnNldEFsd2F5cyhhbHdheXMpOwogCQkJY21kLnNldE1hdGNoKHBhdHRlcm5zLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOworCQkJaWYgKGFiYnJldiAhPSBudWxsKSB7CisJCQkJY21kLnNldEFiYnJldihhYmJyZXYuaW50VmFsdWUoKSk7CisJCQl9CiAJCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKIAkJCXRyeSB7CiAJCQkJcmVzdWx0ID0gY21kLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ODgxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbC5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkFtYmlndW91c09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJldmlzaW9uU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbC5EaWZmVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkV4dGVybmFsRGlmZlRvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuVGV4dFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWwuQ0xJVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuUGF0aFRyZWVGaWx0ZXJIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQWJzdHJhY3RUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5DYW5vbmljYWxUcmVlUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5UcmVlRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworQENvbW1hbmQobmFtZSA9ICJkaWZmdG9vbCIsIGNvbW1vbiA9IHRydWUsIHVzYWdlID0gInVzYWdlX0RpZmZUb29sIikKK2NsYXNzIERpZmZUb29sIGV4dGVuZHMgVGV4dEJ1aWx0aW4geworCXByaXZhdGUgRGlmZkZvcm1hdHRlciBkaWZmRm10OworCisJcHJpdmF0ZSBEaWZmVG9vbHMgZGlmZlRvb2xzOworCisJQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJtZXRhVmFyX3RyZWVpc2giKQorCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb2xkVHJlZTsKKworCUBBcmd1bWVudChpbmRleCA9IDEsIG1ldGFWYXIgPSAibWV0YVZhcl90cmVlaXNoIikKKwlwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG5ld1RyZWU7CisKKwlAT3B0aW9uKG5hbWUgPSAiLS10b29sIiwgYWxpYXNlcyA9IHsKKwkJCSItdCIgfSwgbWV0YVZhciA9ICJtZXRhVmFyX3Rvb2wiLCB1c2FnZSA9ICJ1c2FnZV9Ub29sRm9yRGlmZiIpCisJcHJpdmF0ZSBTdHJpbmcgdG9vbE5hbWU7CisKKwlAT3B0aW9uKG5hbWUgPSAiLS1jYWNoZWQiLCBhbGlhc2VzID0geyAiLS1zdGFnZWQiIH0sIHVzYWdlID0gInVzYWdlX2NhY2hlZCIpCisJcHJpdmF0ZSBib29sZWFuIGNhY2hlZDsKKworCXByaXZhdGUgQm9vbGVhblRyaVN0YXRlIHByb21wdCA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKworCUBPcHRpb24obmFtZSA9ICItLXByb21wdCIsIHVzYWdlID0gInVzYWdlX3Byb21wdCIpCisJdm9pZCBzZXRQcm9tcHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKKwkJcHJvbXB0ID0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJfQorCisJQE9wdGlvbihuYW1lID0gIi0tbm8tcHJvbXB0IiwgYWxpYXNlcyA9IHsgIi15IiB9LCB1c2FnZSA9ICJ1c2FnZV9ub1Byb21wdCIpCisJdm9pZCBub1Byb21wdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgeworCQlwcm9tcHQgPSBCb29sZWFuVHJpU3RhdGUuRkFMU0U7CisJfQorCisJQE9wdGlvbihuYW1lID0gIi0tdG9vbC1oZWxwIiwgdXNhZ2UgPSAidXNhZ2VfdG9vbEhlbHAiKQorCXByaXZhdGUgYm9vbGVhbiB0b29sSGVscDsKKworCXByaXZhdGUgQm9vbGVhblRyaVN0YXRlIGd1aSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKworCUBPcHRpb24obmFtZSA9ICItLWd1aSIsIGFsaWFzZXMgPSB7ICItZyIgfSwgdXNhZ2UgPSAidXNhZ2VfRGlmZkd1aVRvb2wiKQorCXZvaWQgc2V0R3VpKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCWd1aSA9IEJvb2xlYW5UcmlTdGF0ZS5UUlVFOworCX0KKworCUBPcHRpb24obmFtZSA9ICItLW5vLWd1aSIsIHVzYWdlID0gInVzYWdlX25vR3VpIikKKwl2b2lkIG5vR3VpKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCWd1aSA9IEJvb2xlYW5UcmlTdGF0ZS5GQUxTRTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW5UcmlTdGF0ZSB0cnVzdEV4aXRDb2RlID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCisJQE9wdGlvbihuYW1lID0gIi0tdHJ1c3QtZXhpdC1jb2RlIiwgdXNhZ2UgPSAidXNhZ2VfdHJ1c3RFeGl0Q29kZSIpCisJdm9pZCBzZXRUcnVzdEV4aXRDb2RlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCXRydXN0RXhpdENvZGUgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwl9CisKKwlAT3B0aW9uKG5hbWUgPSAiLS1uby10cnVzdC1leGl0LWNvZGUiLCB1c2FnZSA9ICJ1c2FnZV9ub1RydXN0RXhpdENvZGUiKQorCXZvaWQgbm9UcnVzdEV4aXRDb2RlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCXRydXN0RXhpdENvZGUgPSBCb29sZWFuVHJpU3RhdGUuRkFMU0U7CisJfQorCisJQE9wdGlvbihuYW1lID0gIi0tIiwgbWV0YVZhciA9ICJtZXRhVmFyX3BhdGhzIiwgaGFuZGxlciA9IFBhdGhUcmVlRmlsdGVySGFuZGxlci5jbGFzcykKKwlwcml2YXRlIFRyZWVGaWx0ZXIgcGF0aEZpbHRlciA9IFRyZWVGaWx0ZXIuQUxMOworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKKwkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOworCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKKwkJZGlmZlRvb2xzID0gbmV3IERpZmZUb29scyhyZXBvc2l0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CisJCXRyeSB7CisJCQlpZiAodG9vbEhlbHApIHsKKwkJCQlzaG93VG9vbEhlbHAoKTsKKwkJCX0gZWxzZSB7CisJCQkJYm9vbGVhbiBzaG93UHJvbXB0ID0gZGlmZlRvb2xzLmlzSW50ZXJhY3RpdmUoKTsKKwkJCQlpZiAocHJvbXB0ICE9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVCkgeworCQkJCQlzaG93UHJvbXB0ID0gcHJvbXB0ID09IEJvb2xlYW5UcmlTdGF0ZS5UUlVFOworCQkJCX0KKwkJCQlTdHJpbmcgdG9vbE5hbWVQcm9tcHQgPSB0b29sTmFtZTsKKwkJCQlpZiAoc2hvd1Byb21wdCkgeworCQkJCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbCh0b29sTmFtZVByb21wdCkpIHsKKwkJCQkJCXRvb2xOYW1lUHJvbXB0ID0gZGlmZlRvb2xzLmdldERlZmF1bHRUb29sTmFtZShndWkpOworCQkJCQl9CisJCQkJfQorCQkJCS8vIGdldCB0aGUgY2hhbmdlZCBmaWxlcworCQkJCUxpc3Q8RGlmZkVudHJ5PiBmaWxlcyA9IGdldEZpbGVzKCk7CisJCQkJaWYgKGZpbGVzLnNpemUoKSA+IDApIHsKKwkJCQkJY29tcGFyZShmaWxlcywgc2hvd1Byb21wdCwgdG9vbE5hbWVQcm9tcHQpOworCQkJCX0KKwkJCX0KKwkJCW91dHcuZmx1c2goKTsKKwkJfSBjYXRjaCAoUmV2aXNpb25TeW50YXhFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBkaWUoZS5nZXRNZXNzYWdlKCksIGUpOworCQl9IGZpbmFsbHkgeworCQkJZGlmZkZtdC5jbG9zZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdDxEaWZmRW50cnk+IGZpbGVzLCBib29sZWFuIHNob3dQcm9tcHQsCisJCQlTdHJpbmcgdG9vbE5hbWVQcm9tcHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoaW50IGZpbGVJbmRleCA9IDA7IGZpbGVJbmRleCA8IGZpbGVzLnNpemUoKTsgZmlsZUluZGV4KyspIHsKKwkJCURpZmZFbnRyeSBlbnQgPSBmaWxlcy5nZXQoZmlsZUluZGV4KTsKKwkJCVN0cmluZyBtZXJnZWRGaWxlUGF0aCA9IGVudC5nZXROZXdQYXRoKCk7CisJCQlpZiAobWVyZ2VkRmlsZVBhdGguZXF1YWxzKERpZmZFbnRyeS5ERVZfTlVMTCkpIHsKKwkJCQltZXJnZWRGaWxlUGF0aCA9IGVudC5nZXRPbGRQYXRoKCk7CisJCQl9CisJCQkvLyBjaGVjayBpZiB1c2VyIHdhbnRzIHRvIGxhdW5jaCBjb21wYXJlCisJCQlib29sZWFuIGxhdW5jaENvbXBhcmUgPSB0cnVlOworCQkJaWYgKHNob3dQcm9tcHQpIHsKKwkJCQlsYXVuY2hDb21wYXJlID0gaXNMYXVuY2hDb21wYXJlKGZpbGVJbmRleCArIDEsIGZpbGVzLnNpemUoKSwKKwkJCQkJCW1lcmdlZEZpbGVQYXRoLCB0b29sTmFtZVByb21wdCk7CisJCQl9CisJCQlpZiAobGF1bmNoQ29tcGFyZSkgeworCQkJCXN3aXRjaCAoZW50LmdldENoYW5nZVR5cGUoKSkgeworCQkJCWNhc2UgTU9ESUZZOgorCQkJCQlvdXR3LnByaW50bG4oIk1cdCIgKyBlbnQuZ2V0TmV3UGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrICIgKCIgKyBlbnQuZ2V0TmV3SWQoKS5uYW1lKCkgKyAiKSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJKyAiXHQiICsgZW50LmdldE9sZFBhdGgoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJKyAiICgiICsgZW50LmdldE9sZElkKCkubmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCWludCByZXQgPSBkaWZmVG9vbHMuY29tcGFyZShlbnQuZ2V0TmV3UGF0aCgpLAorCQkJCQkJCWVudC5nZXRPbGRQYXRoKCksIGVudC5nZXROZXdJZCgpLm5hbWUoKSwKKwkJCQkJCQllbnQuZ2V0T2xkSWQoKS5uYW1lKCksIHRvb2xOYW1lLCBwcm9tcHQsIGd1aSwKKwkJCQkJCQl0cnVzdEV4aXRDb2RlKTsKKwkJCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJCQl0aHJvdyBkaWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJCUNMSVRleHQuZ2V0KCkuZGlmZlRvb2xEaWVkLCBtZXJnZWRGaWxlUGF0aCkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwcml2YXRlIGJvb2xlYW4gaXNMYXVuY2hDb21wYXJlKGludCBmaWxlSW5kZXgsIGludCBmaWxlQ291bnQsCisJCQlTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyB0b29sTmFtZVByb21wdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYm9vbGVhbiBsYXVuY2hDb21wYXJlID0gdHJ1ZTsKKwkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkuZGlmZlRvb2xMYXVuY2gsCisJCQkJZmlsZUluZGV4LCBmaWxlQ291bnQsIGZpbGVOYW1lLCB0b29sTmFtZVByb21wdCkpOworCQlvdXR3LmZsdXNoKCk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJU3RyaW5nIGxpbmUgPSBudWxsOworCQlpZiAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQlpZiAoIWxpbmUuZXF1YWxzSWdub3JlQ2FzZSgiWSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsYXVuY2hDb21wYXJlID0gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxhdW5jaENvbXBhcmU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNob3dUb29sSGVscCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZ0J1aWxkZXIgYXZhaWxhYmxlVG9vbE5hbWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IGRpZmZUb29scy5nZXRBdmFpbGFibGVUb29scygpLmtleVNldCgpKSB7CisJCQlhdmFpbGFibGVUb29sTmFtZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlx0XHQlc1xuIiwgbmFtZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJU3RyaW5nQnVpbGRlciBub3RBdmFpbGFibGVUb29sTmFtZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlmb3IgKFN0cmluZyBuYW1lIDogZGlmZlRvb2xzLmdldE5vdEF2YWlsYWJsZVRvb2xzKCkua2V5U2V0KCkpIHsKKwkJCW5vdEF2YWlsYWJsZVRvb2xOYW1lcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXHRcdCVzXG4iLCBuYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlTdHJpbmdCdWlsZGVyIHVzZXJUb29sTmFtZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiB1c2VyVG9vbHMgPSBkaWZmVG9vbHMKKwkJCQkuZ2V0VXNlckRlZmluZWRUb29scygpOworCQlmb3IgKFN0cmluZyBuYW1lIDogdXNlclRvb2xzLmtleVNldCgpKSB7CisJCQl1c2VyVG9vbE5hbWVzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcdFx0JXMuY21kICVzXG4iLCAvLyROT04tTkxTLTEkCisJCQkJCW5hbWUsIHVzZXJUb29scy5nZXQobmFtZSkuZ2V0Q29tbWFuZCgpKSk7CisJCX0KKwkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCUNMSVRleHQuZ2V0KCkuZGlmZlRvb2xIZWxwU2V0VG9Gb2xsb3dpbmcsIGF2YWlsYWJsZVRvb2xOYW1lcywKKwkJCQl1c2VyVG9vbE5hbWVzLCBub3RBdmFpbGFibGVUb29sTmFtZXMpKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBnZXRGaWxlcygpCisJCQl0aHJvd3MgUmV2aXNpb25TeW50YXhFeGNlcHRpb24sIEFtYmlndW91c09iamVjdEV4Y2VwdGlvbiwKKwkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJZGlmZkZtdC5zZXRSZXBvc2l0b3J5KGRiKTsKKwkJaWYgKGNhY2hlZCkgeworCQkJaWYgKG9sZFRyZWUgPT0gbnVsbCkgeworCQkJCU9iamVjdElkIGhlYWQgPSBkYi5yZXNvbHZlKEhFQUQgKyAiXnt0cmVlfSIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKGhlYWQgPT0gbnVsbCkgeworCQkJCQlkaWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5ub3RBVHJlZSwgSEVBRCkpOworCQkJCX0KKwkJCQlDYW5vbmljYWxUcmVlUGFyc2VyIHAgPSBuZXcgQ2Fub25pY2FsVHJlZVBhcnNlcigpOworCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRiLm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJCXAucmVzZXQocmVhZGVyLCBoZWFkKTsKKwkJCQl9CisJCQkJb2xkVHJlZSA9IHA7CisJCQl9CisJCQluZXdUcmVlID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGIucmVhZERpckNhY2hlKCkpOworCQl9IGVsc2UgaWYgKG9sZFRyZWUgPT0gbnVsbCkgeworCQkJb2xkVHJlZSA9IG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRiLnJlYWREaXJDYWNoZSgpKTsKKwkJCW5ld1RyZWUgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCX0gZWxzZSBpZiAobmV3VHJlZSA9PSBudWxsKSB7CisJCQluZXdUcmVlID0gbmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpOworCQl9CisKKwkJVGV4dFByb2dyZXNzTW9uaXRvciBwbSA9IG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKGVycncpOworCQlwbS5zZXREZWxheVN0YXJ0KDIsIFRpbWVVbml0LlNFQ09ORFMpOworCQlkaWZmRm10LnNldFByb2dyZXNzTW9uaXRvcihwbSk7CisJCWRpZmZGbXQuc2V0UGF0aEZpbHRlcihwYXRoRmlsdGVyKTsKKworCQlMaXN0PERpZmZFbnRyeT4gZmlsZXMgPSBkaWZmRm10LnNjYW4ob2xkVHJlZSwgbmV3VHJlZSk7CisJCXJldHVybiBmaWxlczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlLmphdmEKaW5kZXggY2E0ODc3Zi4uMjdhM2Q5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlLmphdmEKQEAgLTEwLDYgKzEwLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMTQ0LDggKzE0NiwxMCBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CiAJCQljYXNlIEZBU1RfRk9SV0FSRDoKIAkJCQlPYmplY3RJZCBvbGRIZWFkSWQgPSBvbGRIZWFkLmdldE9iamVjdElkKCk7CiAJCQkJaWYgKG9sZEhlYWRJZCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRJZCA9IG9sZEhlYWRJZC5hYmJyZXZpYXRlKDcpLm5hbWUoKTsKLQkJCQkJU3RyaW5nIG5ld0lkID0gcmVzdWx0LmdldE5ld0hlYWQoKS5hYmJyZXZpYXRlKDcpLm5hbWUoKTsKKwkJCQkJU3RyaW5nIG9sZElkID0gb2xkSGVhZElkCisJCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKS5uYW1lKCk7CisJCQkJCVN0cmluZyBuZXdJZCA9IHJlc3VsdC5nZXROZXdIZWFkKCkKKwkJCQkJCQkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpLm5hbWUoKTsKIAkJCQkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkudXBkYXRpbmcsCiAJCQkJCQkJb2xkSWQsIG5ld0lkKSk7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlZmxvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlZmxvZy5qYXZhCmluZGV4IDAzMDExOWUuLmM2MzUzMmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZWZsb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVmbG9nLmphdmEKQEAgLTksNiArOSw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKQEAgLTQ1LDcgKzQ3LDggQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgewogCiAJcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoUmVmbG9nRW50cnkgZW50cnksIGludCBpKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXMuYXBwZW5kKGVudHJ5LmdldE5ld0lkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCkpOworCQlzLmFwcGVuZChlbnRyeS5nZXROZXdJZCgpLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKQorCQkJCS5uYW1lKCkpOwogCQlzLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCiAJCXMuYXBwZW5kKHJlZiA9PSBudWxsID8gQ29uc3RhbnRzLkhFQUQgOiBSZXBvc2l0b3J5LnNob3J0ZW5SZWZOYW1lKHJlZikpOwogCQlzLmFwcGVuZCgiQHsiICsgaSArICJ9OiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5qYXZhCmluZGV4IDhlNDlhNzYuLjdmZTViMGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQuamF2YQpAQCAtMTM2LDYgKzEzNiw5IEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhdGFsRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRhdGVJbmZvOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVsZXRlZEJyYW5jaDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0ZWRSZW1vdGVCcmFuY2g7CisJLyoqKi8gcHVibGljIFN0cmluZyBkaWZmVG9vbEhlbHBTZXRUb0ZvbGxvd2luZzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRpZmZUb29sTGF1bmNoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlmZlRvb2xEaWVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZG9lc05vdEV4aXN0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZG9udE92ZXJ3cml0ZUxvY2FsQ2hhbmdlczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGV2ZXJ5dGhpbmdVcFRvRGF0ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9CVUlMRCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9CVUlMRAppbmRleCAwYzhjZjgzLi5mMmU0ZDU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvQlVJTEQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L0JVSUxECkBAIC0xNyw2ICsxNyw2IEBACiAgICAgICAgICIvL2xpYjpzbGY0ai1hcGkiLAogICAgICAgICAiLy9saWI6c3NoZC1vc2dpIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdDpqZ2l0IiwKLSAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlOnNzaC1hcGFjaGUiCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTpzc2gtYXBhY2hlIiwKICAgICBdLAogKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDNmZDBmNTIuLjFhNTc0NmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsMTUgKzIsMTUgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU7YnVuZGxlLXZlcnNpb249Ils2LjAuMSw2LjEuMCkiCitGcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU7YnVuZGxlLXZlcnNpb249Ils2LjEuMSw2LjIuMCkiCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIgorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiCiBSZXF1aXJlLUJ1bmRsZTogY29tLnN1bi5qbmE7YnVuZGxlLXZlcnNpb249Ils1LjguMCw2LjAuMCkiLAogIGNvbS5zdW4uam5hLnBsYXRmb3JtO2J1bmRsZS12ZXJzaW9uPSJbNS44LjAsNi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yO3ZlcnNpb249IjYuMC4xIjt4LWludGVybmFsOj10cnVlCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3I7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDgwOGRlNTMuLmQwNmU2YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjJhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsODIgQEAKKyMgSkdpdCBTU0ggYWdlbnQgdHJhbnNwb3J0IHN1cHBvcnQgZm9yIEFwYWNoZSBNSU5BIHNzaGQKKworVGhpcyBidW5kbGUgcHJvdmlkZXMgb3B0aW9uYWwgc3VwcG9ydCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGFuIFNTSCBhZ2VudAorZm9yIFNTSCBvciBTRlRQIGF1dGhlbnRpY2F0aW9uLiBJdCBpcyBhbiBPU0dpIGZyYWdtZW50IGZvciBidW5kbGUKK1tvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGVdKC4uL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9SRUFETUUubWQpLAorYW5kIGl0IHByb3ZpZGVzIHRyYW5zcG9ydHMgZm9yIGxvY2FsIGNvbW11bmljYXRpb24gd2l0aCBTU0ggYWdlbnRzLgorCisjIyBTdXBwb3J0ZWQgU1NIIGFnZW50IHRyYW5zcG9ydHMKKworIyMjIExpbnV4LCBPUyBYLCBCU0QKKworT24gTGludXgsIE9TIFgsIGFuZCBCU0QsIHRoZSBvbmx5IHRyYW5zcG9ydCBtZWNoYW5pc20gc3VwcG9ydGVkIGlzIHRoZSB1c3VhbAorY29tbXVuaWNhdGlvbiB2aWEgYSBVbml4IGRvbWFpbiBzb2NrZXQuIFRoaXMgaXMgdGhlIG9ubHkgcHJvdG9jb2wgdGhlIE9wZW5TU0gKK1NTSCBhZ2VudCBzdXBwb3J0cy4gQSBVbml4IGRvbWFpbiBzb2NrZXQgYXBwZWFycyBhcyBhIHNwZWNpYWwgZmlsZSBpbiB0aGUgZmlsZQorc3lzdGVtOyB0aGlzIGZpbGUgbmFtZSBpcyB0eXBpY2FsbHkgYXZhaWxhYmxlIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorYFNTSF9BVVRIX1NPQ0tgLgorCitUaGUgU1NIIGNvbmZpZyBgSWRlbnRpdHlBZ2VudGAgY2FuIGJlIHNldCB0byB0aGlzIHNvY2tldCBmaWxlbmFtZSB0byBzcGVjaWZ5CitleGFjdGx5IHdoaWNoIFVuaXggZG9tYWluIHNvY2tldCB0byB1c2UsIG9yIGl0IGNhbiBiZSBzZXQgdG8gYFNTSF9BVVRIX1NPQ0tgCit0byB1c2UgdGhlIHZhbHVlIGZyb20gdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gSWYgYElkZW50aXR5QWdlbnRgIGlzIG5vdCBzZXQKK2F0IGFsbCwgSkdpdCB1c2VzIGBTU0hfQVVUSF9TT0NLYCBieSBkZWZhdWx0LiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IHNldCwgbm8KK1NTSCBhZ2VudCB3aWxsIGJlIHVzZWQuIGBJZGVudGl0eUFnZW50YCBjYW4gYWxzbyBiZSBzZXQgdG8gYG5vbmVgIHRvIG5vdCB1c2UKK2FueSBTU0ggYWdlbnQuCisKKyMjIyBXaW5kb3dzCisKK09uIFdpbmRvd3MsIHR3byBkaWZmZXJlbnQgdHJhbnNwb3J0cyBhcmUgc3VwcG9ydGVkOgorCisqIEEgdHJhbnNwb3J0IG92ZXIgYSBXaW5kb3dzIG5hbWVkIHBpcGUuIFRoaXMgaXMgdXNlZCBieSBXaW4zMi1PcGVuU1NILCBhbmQgaXMgYXZhaWxhYmxlIGZvciBQYWdlYW50IHNpbmNlIHZlcnNpb24gMC43NS4KKyogQSBQYWdlYW50LXNwZWNpZmljIGxlZ2FjeSB0cmFuc3BvcnQgdmlhIHNoYXJlZCBtZW1vcnk7IHVzZWZ1bCBmb3IgUGFnZWFudCBhbmQgR1BHJ3MgZ3BnLWFnZW50LgorCitQb3NzaWJsZSBzZXR0aW5ncyBvZiBgSWRlbnRpdHlBZ2VudGAgdG8gc2VsZWN0IGEgcGFydGljdWxhciB0cmFuc3BvcnQgYXJlCisKKyogYC8vLi9waXBlL29wZW5zc2gtc3NoLWFnZW50YDogdGhlIFdpbmRvd3MgbmFtZWQgcGlwZSBvZiBXaW4zMi1PcGVuU1NILgorKiBgLy8uL3BhZ2VhbnRgOiB0aGUgc2hhcmVkLW1lbW9yeSBtZWNoYW5pc20gb2YgUGFnZWFudC4KKyogYG5vbmVgOiBkbyBub3QgdXNlIGFueSBTU0ggYWdlbnQuCisqIGAvLy4vcGlwZS8mbHQ7YW55X3ZhbGlkX3BpcGVfbmFtZT5gOiB1c2UgYSBzcGVjaWZpYyBXaW5kb3dzIG5hbWVkIHBpcGUuCisKK1RoZSBkZWZhdWx0IHRyYW5zcG9ydCBvbiBXaW5kb3dzIGlmIGBJZGVudGl0eUFnZW50YCBpcyBub3Qgc2V0IGF0IGFsbCBpcyB0aGUKK1BhZ2VhbnQgc2hhcmVkLW1lbW9yeSB0cmFuc3BvcnQuIEVudmlyb25tZW50IHZhcmlhYmxlIGBTU0hfQVVUSF9TT0NLYCBuZWVkcworbm90IGJlIHNldCBmb3IgUGFnZWFudCwgYW5kIF9tdXN0IG5vdF8gYmUgc2V0IGZvciBXaW4zMi1PcGVuU1NILgorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBhIG5hbWVkIHBpcGUgYXMgdHJhbnNwb3J0IGZvciBQYWdlYW50IChhcyBvZgordmVyc2lvbiAwLjc1KS4gVW5mb3J0dW5hdGVseSwgUGFnZWFudCB1bm5lY2Vzc2FyaWx5IGNyeXB0b2dyYXBoaWNhbGx5CitvYmZ1c2NhdGVzIHRoZSBwaXBlIG5hbWUsIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgSkdpdCB0byBkZXRlcm1pbmUgaXQKK2F1dG9tYXRpY2FsbHkuIFRoZSBwaXBlIG5hbWUgaXMgYHBhZ2VhbnQuPHVzZXIgbmFtZT4uPHNoYTI1Nj5gLCBmb3IgaW5zdGFuY2UKK2BwYWdlYW50Lm15c2VsZi5jNTY4NzczNmJhNzU1YTcwYjAwMDk1NWNiMTkxNjk4YWVkN2RiMjIxYzJiMDcxMDE5OWViMWY1Mjk4OTIyYWI1YC4KK0EgdXNlciBjYW4gbG9vayB1cCB0aGUgbmFtZSBieSBzdGFydGluZyBQYWdlYW50IGFuZCB0aGVuIHJ1bm5pbmcgdGhlCitjb21tYW5kIGBkaXIgXFwuXHBpcGVcXGAgaW4gYSBjb21tYW5kIHNoZWxsLiBPbmNlIHRoZSBuYW1lIGlzIGtub3duLCBzZXR0aW5nCitgSWRlbnRpdHlBZ2VudGAgdG8gdGhlIHBpcGUgbmFtZSBhcworYC8vLi9waXBlL3BhZ2VhbnQubXlzZWxmLmM1Njg3NzM2YmE3NTVhNzBiMDAwOTU1Y2IxOTE2OThhZWQ3ZGIyMjFjMmIwNzEwMTk5ZWIxZjUyOTg5MjJhYjVgCittYWtlcyBKR2l0IHVzZSB0aGlzIFdpbmRvd3MgbmFtZWQgcGlwZSBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIFBhZ2VhbnQuCisKKyhZb3UgY2FuIHVzZSBmb3J3YXJkIHNsYXNoZXMgaW4gdGhlIGB+Ly5zc2gvY29uZmlnYCBmaWxlLiBTU0ggY29uZmlnIGZpbGUKK3BhcnNpbmcgaGFzIGl0cyBvd24gcnVsZXMgYWJvdXQgYmFja3NsYXNoZXMgaW4gY29uZmlnIGZpbGVzOyB3aGljaCBhcmUKK3RyZWF0ZWQgYXMgZXNjYXBlIGNoYXJhY3RlcnMgaW4gc29tZSBjb250ZXh0cy4gV2l0aCBiYWNrc2xhc2hlcyBvbmUgd291bGQKK2hhdmUgdG8gd3JpdGUsIGUuZy4sIGBcXFxcLlxwaXBlXG9wZW5zc2gtc3NoLWFnZW50YC4pCisKK1dpdGggdGhlc2UgdHdvIHRyYW5zcG9ydCBtZWNoYW5pc21zLCBQYWdlYW50IGFuZCBXaW4zMi1PcGVuU1NIIGFyZSBzdXBwb3J0ZWQuCitBcyBmb3IgR1BHOiB0aGUgZ3BnLWFnZW50IGNhbiBiZSBjb25maWd1cmVkIHRvIGVtdWxhdGUgc3NoLWFnZW50IChwcmVzdW1hYmx5Cit2aWEgYSBXaW5Tb2NrZXRzMiAiVW5peCBkb21haW4gc29ja2V0IiBvbiBXaW5kb3dzKSBvciB0byBlbXVsYXRlIFBhZ2VhbnQKKyh1c2luZyB0aGUgc2hhcmVkIG1lbW9yeSBtZWNoYW5pc20pLiBSdW5uaW5nIGdwZy1hZ2VudCB3aXRoIHRoZQorYGVuYWJsZS1zc2gtc3VwcG9ydGAgb3B0aW9uIGlzCitbcmVwb3J0ZWQgbm90IHRvIHdvcmsgb24gV2luZG93c10oaHR0cHM6Ly9kZXYuZ251cGcub3JnL1QzODgzKSwgdGhvdWdoLiBCdXQKK3RoZSBQdVRUWSBlbXVsYXRpb24gaW4gZ3BnLWFnZW50IChvcHRpb24gYGVuYWJsZS1wdXR0eS1zdXBwb3J0YCkgX3Nob3VsZF8gd29yaywKK3NvIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgZ3BnLWFnZW50IGluc3RlYWQgb2YgUGFnZWFudC4KKworTmVpdGhlciBQYWdlYW50IChhcyBvZiB2ZXJzaW9uIDAuNzYpIG5vciBXaW4zMi1PcGVuU1NIIChhcyBvZiB2ZXJzaW9uIDguNikKK3N1cHBvcnQgdGhlIGBjb25maXJtYCBvciBsaWZldGltZSBjb25zdHJhaW50cyBmb3IgYEFkZEtleXNUb0FnZW50YC4gZ3BnLWFnZW50CithcHBhcmVudGx5IGRvZXMsIGV2ZW4gd2hlbiBjb21tdW5pY2F0aW5nIG92ZXIgdGhlIFBhZ2VhbnQgc2hhcmVkIG1lbW9yeQorbWVjaGFuaXNtLgorCitUaGUgc3NoLWFnZW50IGZyb20gZ2l0IGJhc2ggb24gV2luZG93cyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4gSXQgd291bGQKK25lZWQgYSBjb25uZWN0b3IgaGFuZGxpbmcgQ3lnd2luIHNvY2tldCBmaWxlcyBhbmQgdGhlIEN5Z3dpbiBoYW5kc2hha2Ugb3ZlcgorYSBUQ1Agc3RyZWFtIHNvY2tldCBib3VuZCB0byB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlLiBUaGUgQ3lnd2luIHNvY2tldCBmaWxlCitfaXNfIGV4cG9zZWQgaW4gdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0gYXQgJVRFTVAlXHNzaC1YWFhYWFhYWFhYXGFnZW50LiZsdDtudW1iZXI+LAorYnV0IGl0IGRvZXMgbm90IGhhdmUgYSBmaXhlZCBuYW1lICh0aGUgWCdzIGFuZCB0aGUgbnVtYmVyIGFyZSB2YXJpYWJsZSBhbmQKK2NoYW5nZSBlYWNoIHRpbWUgc3NoLWFnZW50IGlzIHN0YXJ0ZWQpLgorCisjIyBJbXBsZW1lbnRhdGlvbgorCitUaGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIHRyYW5zcG9ydHMgdXNlcyBKTkEuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcG9tLnhtbAppbmRleCAxYmQzZmFkLi43N2I5Yzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudDwvYXJ0aWZhY3RJZD4KQEAgLTEzMiw3ICsxMzIsNiBAQAogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KIAotICAgICAgPCEtLSBOZXcgaW4gNi4wOyB1bmNvbW1lbnQgaW4gNi4xCiAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuc2lvbTc5LmphcGljbXA8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+amFwaWNtcC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CkBAIC0xNTUsNiArMTU0LDkgQEAKICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuZWNsaXBzZS5qZ2l0Lio8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPiouaW50ZXJuYWwuKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICA8YWNjZXNzTW9kaWZpZXI+cHVibGljPC9hY2Nlc3NNb2RpZmllcj4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25Nb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25Nb2RpZmljYXRpb25zPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+CkBAIC0xNzQsMTEgKzE3Niw5IEBACiAgICAgICAgICAgPC9leGVjdXRpb24+CiAgICAgICAgIDwvZXhlY3V0aW9ucz4KICAgICAgIDwvcGx1Z2luPgotICAgICAgLS0+CiAgICAgPC9wbHVnaW5zPgogICA8L2J1aWxkPgogCi0gIDwhLS0gTmV3IGluIDYuMCwgdW5jb21tZW50IGluIDYuMQogICA8cmVwb3J0aW5nPgogICAgIDxwbHVnaW5zPgogICAgICAgPHBsdWdpbj4KQEAgLTIxMCw2ICsyMTAsOSBAQAogICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5lY2xpcHNlLmpnaXQuKjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Ki5pbnRlcm5hbC4qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KICAgICAgICAgICAgICAgICAgIDxhY2Nlc3NNb2RpZmllcj5wdWJsaWM8L2FjY2Vzc01vZGlmaWVyPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz4KQEAgLTIyMyw1ICsyMjYsNCBAQAogICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgogICA8L3JlcG9ydGluZz4KLSAgLS0+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLnByb3BlcnRpZXMKaW5kZXggNmZjZTA4My4uYTNiNGU5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMucHJvcGVydGllcwpAQCAtMiw5ICsyLDExIEBACiBlcnJMYXN0RXJyb3I9U3lzdGVtIG1lc3NhZ2UgZm9yIGVycm9yIHswfSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCBnb3QgezF9CiBlcnJSZWxlYXNlU2hhcmVkTWVtb3J5PUNhbm5vdCByZWxlYXNlIHNoYXJlZCBtZW1vcnk6IHswfSAtIHsxfQogZXJyVW5rbm93bj11bmtub3duIGVycm9yCitlcnJVbmtub3duSWRlbnRpdHlBZ2VudD1JZGVudGl0eUFnZW50ICcnezB9JycgdW5rbm93bgogbG9nRXJyb3JMb2FkTGlicmFyeT1DYW5ub3QgbG9hZCBzb2NrZXQgbGlicmFyeTsgU1NIIGFnZW50IHN1cHBvcnQgaXMgc3dpdGNoZWQgb2ZmCiBtc2dDbG9zZUZhaWxlZD1DYW5ub3QgY2xvc2UgU1NIIGFnZW50IHNvY2tldCB7MH0KIG1zZ0Nvbm5lY3RGYWlsZWQ9Q291bGQgbm90IGNvbm5lY3QgdG8gU1NIIGFnZW50IHZpYSBzb2NrZXQgJyd7MH0nJworbXNnQ29ubmVjdFBpcGVGYWlsZWQ9Q291bGQgbm90IGNvbm5lY3QgdG8gU1NIIGFnZW50IHZpYSBwaXBlICcnezB9JycKIG1zZ05vTWFwcGVkRmlsZT1Db3VsZCBub3QgY3JlYXRlIGZpbGUgbWFwcGluZzogezB9IC0gezF9CiBtc2dOb1NoYXJlZE1lbW9yeT1Db3VsZCBub3QgaW5pdGlhbGl6ZSBzaGFyZWQgbWVtb3J5OiB7MH0gLSB7MX0KIG1zZ1BhZ2VhbnRVbmF2YWlsYWJsZT1Db3VsZCBub3QgY29ubmVjdCB0byBQYWdlYW50CkBAIC0xNSwzICsxNyw0IEBACiBtc2dTaG9ydFJlYWQ9U2hvcnQgcmVhZCBmcm9tIFNTSCBhZ2VudCwgZXhwZWN0ZWQgezB9oGJ5dGVzLCBnb3QgezF9IGJ5dGVzOyBsYXN0IHJlYWQoKSByZXR1cm5lZCB7Mn0KIHBhZ2VhbnQ9UGFnZWFudAogdW5peERlZmF1bHRBZ2VudD1zc2gtYWdlbnQKK3dpbk9wZW5Tc2g9V2luMzIgT3BlblNTSApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0ZhY3RvcnkuamF2YQppbmRleCBkNzQwOWIwLi4xY2VlMWJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0ZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0ZhY3RvcnkuamF2YQpAQCAtMTEsMTEgKzExLDE1IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQ29ubmVjdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQ29ubmVjdG9yRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIAogLyoqCkBAIC0yOSw3ICszMywyMCBAQCBwdWJsaWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIENvbm5lY3RvckZhY3RvcnkgewogCXB1YmxpYyBDb25uZWN0b3IgY3JlYXRlKFN0cmluZyBpZGVudGl0eUFnZW50LCBGaWxlIGhvbWVEaXIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNXaW5kb3dzKCkpIHsKLQkJCXJldHVybiBuZXcgUGFnZWFudENvbm5lY3RvcigpOworCQkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoaWRlbnRpdHlBZ2VudCkpIHsKKwkJCQkvLyBEZWZhdWx0LgorCQkJCXJldHVybiBuZXcgUGFnZWFudENvbm5lY3RvcigpOworCQkJfQorCQkJU3RyaW5nIHdpblBhdGggPSBpZGVudGl0eUFnZW50LnJlcGxhY2UoJy8nLCAnXFwnKTsKKwkJCWlmIChQYWdlYW50Q29ubmVjdG9yLkRFU0NSSVBUT1IuZ2V0SWRlbnRpdHlBZ2VudCgpCisJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKHdpblBhdGgpKSB7CisJCQkJcmV0dXJuIG5ldyBQYWdlYW50Q29ubmVjdG9yKCk7CisJCQl9CisJCQlpZiAod2luUGF0aC50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCkuc3RhcnRzV2l0aCgiXFxcXC5cXHBpcGVcXCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gbmV3IFdpblBpcGVDb25uZWN0b3Iod2luUGF0aCk7CisJCQl9CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCVRleHRzLmdldCgpLmVyclVua25vd25JZGVudGl0eUFnZW50LCBpZGVudGl0eUFnZW50KSk7CiAJCX0KIAkJcmV0dXJuIG5ldyBVbml4RG9tYWluU29ja2V0Q29ubmVjdG9yKGlkZW50aXR5QWdlbnQpOwogCX0KQEAgLTU1LDcgKzcyLDExIEBAIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAkgKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbjxDb25uZWN0b3JEZXNjcmlwdG9yPiBnZXRTdXBwb3J0ZWRDb25uZWN0b3JzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKGdldERlZmF1bHRDb25uZWN0b3IoKSk7CisJCWlmIChTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc1dpbmRvd3MoKSkgeworCQkJcmV0dXJuIExpc3Qub2YoUGFnZWFudENvbm5lY3Rvci5ERVNDUklQVE9SLAorCQkJCQlXaW5QaXBlQ29ubmVjdG9yLkRFU0NSSVBUT1IpOworCQl9CisJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5ERVNDUklQVE9SKTsKIAl9CiAKIAlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvTGlicmFyeUhvbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9MaWJyYXJ5SG9sZGVyLmphdmEKaW5kZXggYjA5YjU1Zi4uMGE1OTJkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9MaWJyYXJ5SG9sZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9MaWJyYXJ5SG9sZGVyLmphdmEKQEAgLTUzLDYgKzUzLDEwIEBAIHByaXZhdGUgTGlicmFyeUhvbGRlcigpIHsKIAkJa2VybmVsID0gS2VybmVsMzIuSU5TVEFOQ0U7CiAJfQogCisJU3RyaW5nIHN5c3RlbUVycm9yKCkgeworCQlyZXR1cm4gc3lzdGVtRXJyb3IoIlt7MH1dIC0gezF9Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKIAlTdHJpbmcgc3lzdGVtRXJyb3IoU3RyaW5nIHBhdHRlcm4pIHsKIAkJaW50IGxhc3RFcnJvciA9IGtlcm5lbC5HZXRMYXN0RXJyb3IoKTsKIAkJU3RyaW5nIG1zZzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvUGFnZWFudENvbm5lY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9QYWdlYW50Q29ubmVjdG9yLmphdmEKaW5kZXggYjBlM2JjZS4uMTk2ODRlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9QYWdlYW50Q29ubmVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9QYWdlYW50Q29ubmVjdG9yLmphdmEKQEAgLTI2LDcgKzI2LDEwIEBAIHB1YmxpYyBjbGFzcyBQYWdlYW50Q29ubmVjdG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0b3IgewogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIGdldElkZW50aXR5QWdlbnQoKSB7Ci0JCQlyZXR1cm4gInBhZ2VhbnQiOyAvLyROT04tTkxTLTEkCisJCQkvLyBUaGlzIG11c3QgYmUgYW4gYWJzb2x1dGUgV2luZG93cyBwYXRoIG5hbWUgdG8gYXZvaWQgdGhhdAorCQkJLy8gT3BlblNzaENvbmZpZ0ZpbGUgdHJlYXRzIGl0IGFzIGEgcmVsYXRpdmUgcGF0aCBuYW1lLiBVc2UgYW4gVU5DCisJCQkvLyBuYW1lIG9uIGxvY2FsaG9zdCwgbGlrZSBmb3IgcGlwZXMuCisJCQlyZXR1cm4gIlxcXFwuXFxwYWdlYW50IjsgLy8kTk9OLU5MUy0xJAogCQl9CiAKIAkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1NvY2tldHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvU29ja2V0cy5qYXZhCmluZGV4IDNkOTViZGIuLjUyY2Y1ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvU29ja2V0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvU29ja2V0cy5qYXZhCkBAIC0yNCwxMSArMjQsNiBAQCBwcml2YXRlIFNvY2tldHMoKSB7CiAJfQogCiAJLyoqCi0JICogRGVmYXVsdCBTU0ggYWdlbnQgc29ja2V0IGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX1NTSF9BVVRIX1NPQ0sgPSAiU1NIX0FVVEhfU09DSyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgogCSAqIERvbWFpbiBmb3IgVW5peCBkb21haW4gc29ja2V0cy4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRl9VTklYID0gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMuamF2YQppbmRleCBmYjQ1YjMwLi5mMzg3Yzc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5qYXZhCkBAIC0zMSw5ICszMSwxMSBAQCBwdWJsaWMgc3RhdGljIFRleHRzIGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGVyckxhc3RFcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGVyclJlbGVhc2VTaGFyZWRNZW1vcnk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBlcnJVbmtub3duOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZXJyVW5rbm93bklkZW50aXR5QWdlbnQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBsb2dFcnJvckxvYWRMaWJyYXJ5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnQ2xvc2VGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtc2dDb25uZWN0RmFpbGVkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnQ29ubmVjdFBpcGVGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtc2dOb01hcHBlZEZpbGU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtc2dOb1NoYXJlZE1lbW9yeTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ1BhZ2VhbnRVbmF2YWlsYWJsZTsKQEAgLTQ0LDUgKzQ2LDYgQEAgcHVibGljIHN0YXRpYyBUZXh0cyBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtc2dTaG9ydFJlYWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwYWdlYW50OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5peERlZmF1bHRBZ2VudDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHdpbk9wZW5Tc2g7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Vbml4RG9tYWluU29ja2V0Q29ubmVjdG9yLmphdmEKaW5kZXggM2I3NWYzYS4uOTVhYzM0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Vbml4RG9tYWluU29ja2V0Q29ubmVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Vbml4RG9tYWluU29ja2V0Q29ubmVjdG9yLmphdmEKQEAgLTExLDEwICsxMSwxMCBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yLlNvY2tldHMuQUZfVU5JWDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuU29ja2V0cy5ERUZBVUxUX1BST1RPQ09MOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvci5Tb2NrZXRzLkVOVl9TU0hfQVVUSF9TT0NLOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvci5Tb2NrZXRzLlNPQ0tfU1RSRUFNOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvci5Vbml4U29ja2V0cy5GRF9DTE9FWEVDOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvci5Vbml4U29ja2V0cy5GX1NFVEZEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hDb25zdGFudHMuRU5WX1NTSF9BVVRIX1NPQ0tFVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwpAQCAtNDYsNyArNDYsNyBAQCBwdWJsaWMgY2xhc3MgVW5peERvbWFpblNvY2tldENvbm5lY3RvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdG9yIHsKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIFN0cmluZyBnZXRJZGVudGl0eUFnZW50KCkgewotCQkJcmV0dXJuIEVOVl9TU0hfQVVUSF9TT0NLOworCQkJcmV0dXJuIEVOVl9TU0hfQVVUSF9TT0NLRVQ7CiAJCX0KIAogCQlAT3ZlcnJpZGUKQEAgLTkxLDggKzkxLDkgQEAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFVuaXhTb2NrZXRzIGdldExpYnJhcnkoKSB7CiAJcHVibGljIFVuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IoU3RyaW5nIHNvY2tldEZpbGUpIHsKIAkJc3VwZXIoKTsKIAkJU3RyaW5nIGZpbGUgPSBzb2NrZXRGaWxlOwotCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChmaWxlKSkgewotCQkJZmlsZSA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldGVudihFTlZfU1NIX0FVVEhfU09DSyk7CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGZpbGUpCisJCQkJfHwgRU5WX1NTSF9BVVRIX1NPQ0tFVC5lcXVhbHMoZmlsZSkpIHsKKwkJCWZpbGUgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRlbnYoRU5WX1NTSF9BVVRIX1NPQ0tFVCk7CiAJCX0KIAkJdGhpcy5zb2NrZXRGaWxlID0gZmlsZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1dpblBpcGVDb25uZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvV2luUGlwZUNvbm5lY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYWQ5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1dpblBpcGVDb25uZWN0b3IuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5Tc2hFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5BYnN0cmFjdENvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvckZhY3RvcnkuQ29ubmVjdG9yRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CisKK2ltcG9ydCBjb20uc3VuLmpuYS5MYXN0RXJyb3JFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi5qbmEucGxhdGZvcm0ud2luMzIuV2luQmFzZTsKK2ltcG9ydCBjb20uc3VuLmpuYS5wbGF0Zm9ybS53aW4zMi5XaW5FcnJvcjsKK2ltcG9ydCBjb20uc3VuLmpuYS5wbGF0Zm9ybS53aW4zMi5XaW5OVDsKK2ltcG9ydCBjb20uc3VuLmpuYS5wbGF0Zm9ybS53aW4zMi5XaW5OVC5IQU5ETEU7CitpbXBvcnQgY29tLnN1bi5qbmEucHRyLkludEJ5UmVmZXJlbmNlOworCisvKioKKyAqIEEgY29ubmVjdG9yIGJhc2VkIG9uIEpOQSB1c2luZyBXaW5kb3dzJyBuYW1lZCBwaXBlcyB0byBjb21tdW5pY2F0ZSB3aXRoIGFuCisgKiBzc2ggYWdlbnQuIFRoaXMgaXMgdXNlZCBieSBNaWNyb3NvZnQncyBXaW4zMi1PcGVuU1NIIHBvcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBXaW5QaXBlQ29ubmVjdG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0b3IgeworCisJLy8gUGlwZSBuYW1lcyBhcmUsIGxpa2Ugb3RoZXIgZmlsZSBuYW1lcywgY2FzZS1pbnNlbnNpdGl2ZSBvbiBXaW5kb3dzLgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5PTklDQUxfUElQRV9OQU1FID0gIlxcXFwuXFxwaXBlXFxvcGVuc3NoLXNzaC1hZ2VudCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIHtAbGluayBDb25uZWN0b3JEZXNjcmlwdG9yfSBmb3IgdGhlIHtAbGluayBQYWdlYW50Q29ubmVjdG9yfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbm5lY3RvckRlc2NyaXB0b3IgREVTQ1JJUFRPUiA9IG5ldyBDb25uZWN0b3JEZXNjcmlwdG9yKCkgeworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldElkZW50aXR5QWdlbnQoKSB7CisJCQlyZXR1cm4gQ0FOT05JQ0FMX1BJUEVfTkFNRTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworCQkJcmV0dXJuIFRleHRzLmdldCgpLndpbk9wZW5Tc2g7CisJCX0KKwl9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfU0hBUkVfTk9ORSA9IDA7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9BVFRSSUJVVEVfTk9ORSA9IDA7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBwaXBlTmFtZTsKKworCXByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBjb25uZWN0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbigpOworCisJLy8gSXQncyBhIGJ5dGUgcGlwZSwgc28gdGhlIG5vcm1hbCBXaW5kb3dzIGZpbGUgbWVjaGFuaXNtcyBjYW4gYmUgdXNlZC4KKwkvLyBXb3VsZCBvbmUgb2YgdGhlIHN0YW5kYXJkIEphdmEgRmlsZSBJL08gYWJzdHJhY3Rpb25zIHdvcms/CisJcHJpdmF0ZSB2b2xhdGlsZSBIQU5ETEUgZmlsZUhhbmRsZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSB7QGxpbmsgV2luUGlwZUNvbm5lY3Rvcn0gZm9yIHRoZSBnaXZlbiBuYW1lZCBwaXBlLgorCSAqCisJICogQHBhcmFtIHBpcGVOYW1lCisJICogICAgICAgICAgICB0byBjb25uZWN0IHRvCisJICovCisJcHVibGljIFdpblBpcGVDb25uZWN0b3IoU3RyaW5nIHBpcGVOYW1lKSB7CisJCXRoaXMucGlwZU5hbWUgPSBwaXBlTmFtZS5yZXBsYWNlKCcvJywgJ1xcJyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHBpcGVOYW1lKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUhBTkRMRSBmaWxlID0gZmlsZUhhbmRsZTsKKwkJc3luY2hyb25pemVkICh0aGlzKSB7CisJCQlpZiAoY29ubmVjdGVkLmdldCgpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlMaWJyYXJ5SG9sZGVyIGxpYnMgPSBMaWJyYXJ5SG9sZGVyLmdldExpYnJhcnkoKTsKKwkJCWlmIChsaWJzID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlmaWxlID0gbGlicy5rZXJuZWwuQ3JlYXRlRmlsZShwaXBlTmFtZSwKKwkJCQkJV2luTlQuR0VORVJJQ19SRUFEIHwgV2luTlQuR0VORVJJQ19XUklURSwgRklMRV9TSEFSRV9OT05FLAorCQkJCQludWxsLCBXaW5OVC5PUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT05FLCBudWxsKTsKKwkJCWlmIChmaWxlID09IG51bGwgfHwgZmlsZSA9PSBXaW5CYXNlLklOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCQkJaW50IGVycm9yQ29kZSA9IGxpYnMua2VybmVsLkdldExhc3RFcnJvcigpOworCQkJCWlmIChlcnJvckNvZGUgPT0gV2luRXJyb3IuRVJST1JfRklMRV9OT1RfRk9VTkQKKwkJCQkJCSYmIENBTk9OSUNBTF9QSVBFX05BTUUuZXF1YWxzSWdub3JlQ2FzZShwaXBlTmFtZSkpIHsKKwkJCQkJLy8gT3BlblNTSCBhZ2VudCBub3QgcnVubmluZy4gRG9uJ3QgdGhyb3cuCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJTGFzdEVycm9yRXhjZXB0aW9uIGNhdXNlID0gbmV3IExhc3RFcnJvckV4Y2VwdGlvbigKKwkJCQkJCWxpYnMuc3lzdGVtRXJyb3IoKSk7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoVGV4dHMuZ2V0KCkubXNnQ29ubmVjdFBpcGVGYWlsZWQsIHBpcGVOYW1lKSwKKwkJCQkJCWNhdXNlKTsKKwkJCX0KKwkJCWNvbm5lY3RlZC5zZXQodHJ1ZSk7CisJCX0KKwkJZmlsZUhhbmRsZSA9IGZpbGU7CisJCXJldHVybiBjb25uZWN0ZWQuZ2V0KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSEFORExFIGZpbGUgPSBmaWxlSGFuZGxlOworCQlpZiAoY29ubmVjdGVkLmdldEFuZFNldChmYWxzZSkgJiYgZmlsZUhhbmRsZSAhPSBudWxsKSB7CisJCQlmaWxlSGFuZGxlID0gbnVsbDsKKwkJCUxpYnJhcnlIb2xkZXIgbGlicyA9IExpYnJhcnlIb2xkZXIuZ2V0TGlicmFyeSgpOworCQkJYm9vbGVhbiBzdWNjZXNzID0gbGlicy5rZXJuZWwuQ2xvc2VIYW5kbGUoZmlsZSk7CisJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQlMYXN0RXJyb3JFeGNlcHRpb24gY2F1c2UgPSBuZXcgTGFzdEVycm9yRXhjZXB0aW9uKAorCQkJCQkJbGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJLmZvcm1hdChUZXh0cy5nZXQoKS5tc2dDbG9zZUZhaWxlZCwgcGlwZU5hbWUpLCBjYXVzZSk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYnl0ZVtdIHJwYyhieXRlIGNvbW1hbmQsIGJ5dGVbXSBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwcmVwYXJlTWVzc2FnZShjb21tYW5kLCBtZXNzYWdlKTsKKwkJSEFORExFIGZpbGUgPSBmaWxlSGFuZGxlOworCQlpZiAoIWNvbm5lY3RlZC5nZXQoKSB8fCBmaWxlID09IG51bGwpIHsKKwkJCS8vIE5vIHRyYW5zbGF0aW9uLCBpbnRlcm5hbCBlcnJvcgorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IGNvbm5lY3RlZCB0byBTU0ggYWdlbnQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCUxpYnJhcnlIb2xkZXIgbGlicyA9IExpYnJhcnlIb2xkZXIuZ2V0TGlicmFyeSgpOworCQl3cml0ZUZ1bGx5KGxpYnMsIGZpbGUsIG1lc3NhZ2UpOworCQkvLyBOb3cgcmVjZWl2ZSB0aGUgcmVwbHkKKwkJYnl0ZVtdIGxlbmd0aEJ1ZiA9IG5ldyBieXRlWzRdOworCQlyZWFkRnVsbHkobGlicywgZmlsZSwgbGVuZ3RoQnVmKTsKKwkJaW50IGxlbmd0aCA9IHRvTGVuZ3RoKGNvbW1hbmQsIGxlbmd0aEJ1Zik7CisJCWJ5dGVbXSBwYXlsb2FkID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJcmVhZEZ1bGx5KGxpYnMsIGZpbGUsIHBheWxvYWQpOworCQlyZXR1cm4gcGF5bG9hZDsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVGdWxseShMaWJyYXJ5SG9sZGVyIGxpYnMsIEhBTkRMRSBmaWxlLCBieXRlW10gbWVzc2FnZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWJ5dGVbXSBidWYgPSBtZXNzYWdlOworCQlpbnQgdG9Xcml0ZSA9IGJ1Zi5sZW5ndGg7CisJCXRyeSB7CisJCQl3aGlsZSAodG9Xcml0ZSA+IDApIHsKKwkJCQlJbnRCeVJlZmVyZW5jZSB3cml0dGVuID0gbmV3IEludEJ5UmVmZXJlbmNlKCk7CisJCQkJYm9vbGVhbiBzdWNjZXNzID0gbGlicy5rZXJuZWwuV3JpdGVGaWxlKGZpbGUsIGJ1ZiwgYnVmLmxlbmd0aCwKKwkJCQkJCXdyaXR0ZW4sIG51bGwpOworCQkJCWlmICghc3VjY2VzcykgeworCQkJCQl0aHJvdyBuZXcgTGFzdEVycm9yRXhjZXB0aW9uKGxpYnMuc3lzdGVtRXJyb3IoKSk7CisJCQkJfQorCQkJCWludCBhY3R1YWxseVdyaXR0ZW4gPSB3cml0dGVuLmdldFZhbHVlKCk7CisJCQkJdG9Xcml0ZSAtPSBhY3R1YWxseVdyaXR0ZW47CisJCQkJaWYgKGFjdHVhbGx5V3JpdHRlbiA+IDAgJiYgdG9Xcml0ZSA+IDApIHsKKwkJCQkJYnVmID0gQXJyYXlzLmNvcHlPZlJhbmdlKGJ1ZiwgYWN0dWFsbHlXcml0dGVuLCBidWYubGVuZ3RoKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKExhc3RFcnJvckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCVRleHRzLmdldCgpLm1zZ1NlbmRGYWlsZWQsIEludGVnZXIudG9TdHJpbmcobWVzc2FnZS5sZW5ndGgpLAorCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHRvV3JpdGUpKSwgZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVhZEZ1bGx5KExpYnJhcnlIb2xkZXIgbGlicywgSEFORExFIGZpbGUsIGJ5dGVbXSBkYXRhKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IG4gPSAwOworCQlpbnQgb2Zmc2V0ID0gMDsKKwkJd2hpbGUgKG9mZnNldCA8IGRhdGEubGVuZ3RoICYmIChuID0gcmVhZChsaWJzLCBmaWxlLCBkYXRhLCBvZmZzZXQsCisJCQkJZGF0YS5sZW5ndGggLSBvZmZzZXQpKSA+IDApIHsKKwkJCW9mZnNldCArPSBuOworCQl9CisJCWlmIChvZmZzZXQgPCBkYXRhLmxlbmd0aCkgeworCQkJdGhyb3cgbmV3IFNzaEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJVGV4dHMuZ2V0KCkubXNnU2hvcnRSZWFkLCBJbnRlZ2VyLnRvU3RyaW5nKGRhdGEubGVuZ3RoKSwKKwkJCQkJSW50ZWdlci50b1N0cmluZyhvZmZzZXQpLCBJbnRlZ2VyLnRvU3RyaW5nKG4pKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGludCByZWFkKExpYnJhcnlIb2xkZXIgbGlicywgSEFORExFIGZpbGUsIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsCisJCQlpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJaW50IHRvUmVhZCA9IGxlbmd0aDsKKwkJCUludEJ5UmVmZXJlbmNlIHJlYWQgPSBuZXcgSW50QnlSZWZlcmVuY2UoKTsKKwkJCWlmIChvZmZzZXQgPT0gMCkgeworCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGxpYnMua2VybmVsLlJlYWRGaWxlKGZpbGUsIGJ1ZmZlciwgdG9SZWFkLAorCQkJCQkJcmVhZCwgbnVsbCk7CisJCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJCXRocm93IG5ldyBMYXN0RXJyb3JFeGNlcHRpb24obGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCQl9CisJCQkJcmV0dXJuIHJlYWQuZ2V0VmFsdWUoKTsKKwkJCX0KKwkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9IGxpYnMua2VybmVsLlJlYWRGaWxlKGZpbGUsIGJ1ZmZlciwgdG9SZWFkLCByZWFkLAorCQkJCQludWxsKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCXRocm93IG5ldyBMYXN0RXJyb3JFeGNlcHRpb24obGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCX0KKwkJCWludCBhY3R1YWxseVJlYWQgPSByZWFkLmdldFZhbHVlKCk7CisJCQlpZiAoYWN0dWFsbHlSZWFkID4gMCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgYnVmZmVyLCBvZmZzZXQsIGFjdHVhbGx5UmVhZCk7CisJCQl9CisJCQlyZXR1cm4gYWN0dWFsbHlSZWFkOworCQl9IGNhdGNoIChMYXN0RXJyb3JFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlUZXh0cy5nZXQoKS5tc2dSZWFkRmFpbGVkLCBJbnRlZ2VyLnRvU3RyaW5nKGxlbmd0aCkpLCBlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggOGZmOTczNS4uNDExZDQzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzQgKzMsMzQgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmF1dGg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5czt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLm5ldDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmZvcndhcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQucHJveHk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5hdXRoO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5oZWxwZXJzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5uZXQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnNlY3VyaXR5O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb3JlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5mb3J3YXJkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLnByb3h5O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3Q7dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllczt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3BvbS54bWwKaW5kZXggYTg4ZGRhZi4uM2U5OGUzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9BcGFjaGVTc2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9BcGFjaGVTc2hUZXN0LmphdmEKaW5kZXggY2NhZjk4Yy4uM2Q3Yzc2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvQXBhY2hlU3NoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL0FwYWNoZVNzaFRlc3QuamF2YQpAQCAtMTA3LDYgKzEwNywzMiBAQCBwdWJsaWMgdm9pZCB0ZXN0RWQyNTUxOUhvc3RLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkiSWRlbnRpdHlGaWxlICIgKyBwcml2YXRlS2V5MS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAJfQogCisJLyoqCisJICogVGVzdCBmb3IgU1NIRC0xMjMxLiBJZiBhdXRoZW50aWNhdGlvbiBpcyBhdHRlbXB0ZWQgZmlyc3Qgd2l0aCBhbiBSU0Ega2V5LAorCSAqIHdoaWNoIGlzIHJlamVjdGVkLCBhbmQgdGhlbiB3aXRoIHNvbWUgb3RoZXIga2V5IHR5cGUgKGhlcmUgZWQyNTUxOSksCisJICogYXV0aGVudGljYXRpb24gZmFpbHMgaW4gYnVnIFNTSEQtMTIzMS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICogICAgICAgICAgICAgb24gZXJyb3JzCisJICogQHNlZSA8YSBocmVmPQorCSAqICAgICAgImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvU1NIRC0xMjMxIj5TU0hELTEyMzE8L2E+CisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0V3JvbmdLZXlGaXJzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIHVzZXJLZXkgPSBuZXcgRmlsZShnZXRUZW1wb3JhcnlEaXJlY3RvcnkoKSwgInVzZXJrZXkiKTsKKwkJY29weVRlc3RSZXNvdXJjZSgiaWRfZWQyNTUxOSIsIHVzZXJLZXkpOworCQlGaWxlIHB1YmxpY0tleSA9IG5ldyBGaWxlKGdldFRlbXBvcmFyeURpcmVjdG9yeSgpLCAidXNlcmtleS5wdWIiKTsKKwkJY29weVRlc3RSZXNvdXJjZSgiaWRfZWQyNTUxOS5wdWIiLCBwdWJsaWNLZXkpOworCQlzZXJ2ZXIuc2V0VGVzdFVzZXJQdWJsaWNLZXkocHVibGljS2V5LnRvUGF0aCgpKTsKKwkJY2xvbmVXaXRoKCJzc2g6Ly9naXQvZG9lc250bWF0dGVyIiwgZGVmYXVsdENsb25lRGlyLCBudWxsLCAvLworCQkJCSJIb3N0IGdpdCIsIC8vCisJCQkJIkhvc3ROYW1lIGxvY2FsaG9zdCIsIC8vCisJCQkJIlBvcnQgIiArIHRlc3RQb3J0LCAvLworCQkJCSJVc2VyICIgKyBURVNUX1VTRVIsIC8vCisJCQkJIklkZW50aXR5RmlsZSAiICsgcHJpdmF0ZUtleTEuZ2V0QWJzb2x1dGVQYXRoKCksIC8vIFJTQQorCQkJCSJJZGVudGl0eUZpbGUgIiArIHVzZXJLZXkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEhhc2hlZEtub3duSG9zdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGRlbGV0ZSBrbm93bl9ob3N0cyIsIGtub3duSG9zdHMuZGVsZXRlKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDgxZTAxY2MuLjczZmVhZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTYsOSArNiw5IEBACiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iNi4wLjEiO3gtaW50ZXJuYWw6PXRydWU7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZTsKICAgdXNlczo9Im9yZy5hcGFjaGUuc3NoZC5jbGllbnQsCiAgICBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgsCiAgICBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgua2V5Ym9hcmQsCkBAIC0yMyw3MiArMjMsNzUgQEAKICAgIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlLAogICAgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50O3ZlcnNpb249IjYuMC4xIjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYXV0aDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLnByb3h5O3ZlcnNpb249IjYuMC4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudDt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmF1dGg7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5wcm94eTt2ZXJzaW9uPSI2LjEuMSI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0cywKICAgIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24sCiAgICBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmtleXZlcmlmaWVyIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50O3ZlcnNpb249IjYuMC4xIgorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQ7dmVyc2lvbj0iNi4xLjEiCiBJbXBvcnQtUGFja2FnZTogbmV0LmkycC5jcnlwdG8uZWRkc2E7dmVyc2lvbj0iWzAuMy4wLDAuNC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmFnZW50O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5rZXlib2FyZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucGFzc3dvcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNoYW5uZWw7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcua2V5czt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmZ1dHVyZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmtleXZlcmlmaWVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24uZm9yd2FyZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uYXV0aDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNoYW5uZWw7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb21wcmVzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMubG9hZGVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMubG9hZGVyLm9wZW5zc2gua2RmO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZGlnZXN0O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZm9yd2FyZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmZ1dHVyZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5pbzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uLnBhcnNlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ubWFjO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ucmFuZG9tO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uaGVscGVyczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWw7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuY2xvc2VhYmxlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pbzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8uZnVuY3RvcnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLnJlc291cmNlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5sb2dnaW5nO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5uZXQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnNlY3VyaXR5O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb3JlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5jbGllbnQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNmdHAuY29tbW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmFnZW50O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5rZXlib2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucGFzc3dvcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNoYW5uZWw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcua2V5czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmZ1dHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmtleXZlcmlmaWVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24uZm9yd2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNoYW5uZWw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb21wcmVzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMubG9hZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMubG9hZGVyLm9wZW5zc2gua2RmO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMudTJmO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZGlnZXN0O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZm9yd2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmZ1dHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5pbzt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uLnBhcnNlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ubWFjO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ucmFuZG9tO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uaGVscGVyczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLmtleXM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmNsb3NlYWJsZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW87dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLmRlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8uZnVuY3RvcnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLnJlc291cmNlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5sb2dnaW5nO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5uZXQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnNlY3VyaXR5O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb3JlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2Z0cDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5jbGllbnQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHAuY29tbW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLnNsZjRqO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCBiNzcwYjkwLi45ZmVmYTZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlO3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZAppbmRleCBjYmE4N2FjLi5mMDZiMmY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvUkVBRE1FLm1kCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9SRUFETUUubWQKQEAgLTQzLDYgKzQzLDUzIEBACiAgIC5jYWxsKCk7CiBgYGAKIAorIyMgU3VwcG9ydCBmb3IgU1NIIGFnZW50cworCitUaGVyZSBleGlzdCB0d28gSUVURiBkcmFmdCBSRkNzIGZvciBjb21tdW5pY2F0aW9uIHdpdGggYW4gU1NIIGFnZW50OgorCisqIGFuIG9sZGVyIFtTU0gxIHByb3RvY29sXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1zZWNzaC1hZ2VudC0wMikgdGhhdCBjYW4gZGVhbCBvbmx5IHdpdGggRFNBIGFuZCBSU0Ega2V5cywgYW5kCisqIGEgbmV3ZXIgW1NTSDIgcHJvdG9jb2xdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1taWxsZXItc3NoLWFnZW50LTA0KSAoZnJvbSBPcGVuU1NIKS4KKworSkdpdCBvbmx5IHN1cHBvcnRzIHRoZSBuZXdlciBPcGVuU1NIIHByb3RvY29sLgorCitDb21tdW5pY2F0aW9uIHdpdGggYW4gU1NIIGFnZW50IGNhbiBvY2N1ciBvdmVyIGFueSB0cmFuc3BvcnQgcHJvdG9jb2wsIGFuZCBkaWZmZXJlbnQKK1NTSCBhZ2VudHMgbWF5IHVzZSBkaWZmZXJlbnQgdHJhbnNwb3J0cyBmb3IgbG9jYWwgY29tbXVuaWNhdGlvbi4gSkdpdCBwcm92aWRlcyBzb21lCit0cmFuc3BvcnRzIHZpYSB0aGUgW29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudF0oLi4vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L1JFQURNRS5tZCkKK2ZyYWdtZW50LCB3aGljaCBhcmUgZGlzY292ZXJlZCBmcm9tIGBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGVgIGFsc28gdmlhIHRoZSBgU2VydmljZUxvYWRlcmAgbWVjaGFuaXNtOwordGhlIFNQSSAoc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UpIGlzIGBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvckZhY3RvcnlgLgorCitJZiBzdWNoIGEgYENvbm5lY3RvckZhY3RvcnlgIGltcGxlbWVudGF0aW9uIGlzIGZvdW5kLCBKR2l0IG1heSB1c2UgYW4gU1NIIGFnZW50LiBJZiBub25lCitpcyBhdmFpbGFibGUsIEpHaXQgY2Fubm90IGNvbW11bmljYXRlIHdpdGggYW4gU1NIIGFnZW50LCBhbmQgd2lsbCBub3QgYXR0ZW1wdCB0byB1c2Ugb25lLgorCisjIyMgU1NIIGNvbmZpZ3VyYXRpb25zIGZvciBTU0ggYWdlbnRzCisKK1RoZXJlIGFyZSBzZXZlcmFsIFNTSCBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIGB+Ly5zc2gvY29uZmlnYCBmaWxlIHRvIGNvbmZpZ3VyZQordGhlIHVzZSBvZiBhbiBTU0ggYWdlbnQuIEZvciB0aGUgZGV0YWlscywgc2VlIHRoZSBbT3BlbkJTRCBzc2gtY29uZmlnIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbWFuLm9wZW5ic2Qub3JnL3NzaF9jb25maWcuNSkuCisKKyogKipBZGRLZXlzVG9BZ2VudCoqIGNhbiBiZSBzZXQgdG8gYG5vYCwgYHllc2AsIG9yIGBhc2tgLiBJZiBzZXQgdG8gYHllc2AsIGtleXMgd2lsbCBiZSBhZGRlZAorICB0byB0aGUgYWdlbnQgaWYgdGhleSdyZSBub3QgeWV0IGluIHRoZSBhZ2VudC4gSWYgc2V0IHRvIGBhc2tgLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkCisgIGJlZm9yZSBkb2luZyBzbywgYW5kIGNhbiBvcHQgb3V0IG9mIGFkZGluZyB0aGUga2V5LiBKR2l0IGFsc28gc3VwcG9ydHMgdGhlIGFkZGl0aW9uYWwKKyAgc2V0dGluZ3MgYGNvbmZpcm1gIGFuZCBrZXkgbGlmZXRpbWVzLgorKiAqKklkZW50aXR5QWdlbnQqKiBjYW4gYmUgc2V0IHRvIGNob29zZSB3aGljaCBTU0ggYWdlbnQgdG8gdXNlLCBpZiB0aGVyZSBhcmUgc2V2ZXJhbCBydW5uaW5nLgorICBJdCBjYW4gYWxzbyBiZSBzZXQgdG8gYG5vbmVgIHRvIGV4cGxpY2l0bHkgc3dpdGNoIG9mZiB1c2luZyBhbiBTU0ggYWdlbnQgYXQgYWxsLgorKiAqKklkZW50aXRpZXNPbmx5KiogaWYgc2V0IHRvIGB5ZXNgIGFuZCBhbiBTU0ggYWdlbnQgaXMgdXNlZCwgb25seSBrZXlzIGZyb20gdGhlIGFnZW50IHRoYXQgYXJlCisgIGFsc28gbGlzdGVkIGluIGFuIGBJZGVudGl0eUZpbGVgIHByb3BlcnR5IHdpbGwgYmUgY29uc2lkZXJlZC4gKEl0J2xsIGFsc28gc3dpdGNoIG9mZiB0cnlpbmcKKyAgZGVmYXVsdCBrZXkgbmFtZXMsIHN1Y2ggYXMgYH4vLnNzaC9pZF9yc2FgIG9yIGB+Ly5zc2gvaWRfZWQyNTUxOWA7IG9ubHkga2V5cyBsaXN0ZWQgZXhwbGljaXRseQorICB3aWxsIGJlIHVzZWQuKQorCisjIyMgTGltaXRhdGlvbnMKKworQXMgbWVudGlvbmVkIGFib3ZlIEpHaXQgb25seSBpbXBsZW1lbnRzIHRoZSBuZXdlciBPcGVuU1NIIHByb3RvY29sLiBPcGVuU1NIIGZ1bGx5IGltcGxlbWVudHMgdGhpcywKK2J1dCBzb21lIG90aGVyIFNTSCBhZ2VudHMgb25seSBvZmZlciBwYXJ0aWFsIGltcGxlbWVudGF0aW9ucy4gSW4gcGFydGljdWxhciBvbiBXaW5kb3dzLCBuZWl0aGVyCitQYWdlYW50IG5vciBXaW4zMi1PcGVuU1NIIGltcGxlbWVudCB0aGUgYGNvbmZpcm1gIG9yIGxpZmV0aW1lIGNvbnN0cmFpbnRzIGZvciBgQWRkS2V5c1RvQWdlbnRgLiBXaXRoCitzdWNoIFNTSCBhZ2VudHMsIHRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgdXNlZCBpbiBgfi8uc3NoL2NvbmZpZ2AuIEdQRydzIGdwZy1hZ2VudCBjYW4gYmUgcnVuCit3aXRoIG9wdGlvbiBgZW5hYmxlX3B1dHR5X3N1cHBvcnRgIGFuZCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgUGFnZWFudCByZXBsYWNlbWVudC4gZ3BnLWFnZW50IGFwcGVhcnMKK3RvIHN1cHBvcnQgdGhlc2Uga2V5IGNvbnN0cmFpbnRzLgorCitPcGVuU1NIIGRvZXMgbm90IGltcGxlbWVudCBlZDQ0OCBrZXlzLCBhbmQgbmVpdGhlciBkb2VzIEFwYWNoZSBNSU5BIHNzaGQsIGFuZCBoZW5jZSBzdWNoIGtleXMgYXJlCitub3Qgc3VwcG9ydGVkIGluIEpHaXQgaWYgaXRzIGJ1aWx0LWluIFNTSCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLiBlZDQ0OCBvciBvdGhlciB1bnN1cHBvcnRlZCBrZXlzCitwcm92aWRlZCBieSBhbiBTU0ggYWdlbnQgYXJlIGlnbm9yZWQuCisKICMjIFVzaW5nIGEgZGlmZmVyZW50IFNTSCBpbXBsZW1lbnRhdGlvbgogCiBUbyB1c2UgYSBkaWZmZXJlbnQgU1NIIGltcGxlbWVudGF0aW9uOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcG9tLnhtbAppbmRleCAzNDBjY2ExLi42NzRjN2E0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTwvYXJ0aWZhY3RJZD4KQEAgLTUwLDYgKzUwLDE2IEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5zc2hkLXNmdHA8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj4ke2FwYWNoZS1zc2hkLXZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zc2hkPC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zc2hkLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zc2hkPC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zc2hkLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KQEAgLTE1NCw2ICsxNjQsOSBAQAogICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5lY2xpcHNlLmpnaXQuKjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Ki5pbnRlcm5hbC4qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KICAgICAgICAgICAgICAgICAgIDxhY2Nlc3NNb2RpZmllcj5wdWJsaWM8L2FjY2Vzc01vZGlmaWVyPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz4KQEAgLTIwNyw2ICsyMjAsOSBAQAogICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5lY2xpcHNlLmpnaXQuKjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Ki5pbnRlcm5hbC4qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KICAgICAgICAgICAgICAgICAgIDxhY2Nlc3NNb2RpZmllcj5wdWJsaWM8L2FjY2Vzc01vZGlmaWVyPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LnByb3BlcnRpZXMKaW5kZXggMmJiYTczNi4uNGY3MzViYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LnByb3BlcnRpZXMKQEAgLTEsNSArMSw2IEBACiBhdXRoZW50aWNhdGlvbkNhbmNlbGVkPVNTSCBhdXRoZW50aWNhdGlvbiBjYW5jZWxlZDogbm8gcGFzc3dvcmQgZ2l2ZW4KIGF1dGhlbnRpY2F0aW9uT25DbG9zZWRTZXNzaW9uPUF1dGhlbnRpY2F0aW9uIGNhbmNlbGVkOiBzZXNzaW9uIGlzIGFscmVhZHkgY2xvc2luZyBvciBjbG9zZWQKK2Nhbm5vdFJlYWRQdWJsaWNLZXk9Q2Fubm90IHJlYWQgcHVibGljIGtleSBmcm9tIGZpbGUgezB9CiBjbG9zZUxpc3RlbmVyRmFpbGVkPVNzaCBzZXNzaW9uIGNsb3NlIGxpc3RlbmVyIGZhaWxlZAogY29uZmlnSW52YWxpZFBhdGg9SW52YWxpZCBwYXRoIGluIHNzaCBjb25maWcga2V5IHswfTogezF9CiBjb25maWdJbnZhbGlkUGF0dGVybj1JbnZhbGlkIHBhdHRlcm4gaW4gc3NoIGNvbmZpZyBrZXkgezB9OiB7MX0KQEAgLTc3LDYgKzc4LDggQEAKIHByb3h5U29ja3NVbmV4cGVjdGVkTWVzc2FnZT1VbmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBTT0NLUzUgcHJveHkgezB9OyBjbGllbnQgc3RhdGUgezF9OiB7Mn0KIHByb3h5U29ja3NVbmV4cGVjdGVkVmVyc2lvbj1FeHBlY3RlZCBTT0NLUyB2ZXJzaW9uIDUsIGdvdCB7MH0KIHByb3h5U29ja3NVc2VybmFtZVRvb0xvbmc9VXNlciBuYW1lIGZvciBwcm94eSB7MH0gbXVzdCBiZSBhdCBtb3N0IDI1NSBieXRlcyBsb25nLCBpcyB7MX0gYnl0ZXM6IHsyfQorcHVia2V5QXV0aEFkZEtleVRvQWdlbnRFcnJvcj1Db3VsZCBub3QgYWRkIHswfSBrZXkgd2l0aCBmaW5nZXJwcmludCB7MX0gdG8gdGhlIFNTSCBhZ2VudAorcHVia2V5QXV0aEFkZEtleVRvQWdlbnRRdWVzdGlvbj1BZGQgdGhlIHswfSBrZXkgd2l0aCBmaW5nZXJwcmludCB7MX0gdG8gdGhlIFNTSCBhZ2VudD8KIHB1YmtleUF1dGhXcm9uZ0NvbW1hbmQ9UHVibGljIGtleSBhdXRoZW50aWNhdGlvbiByZWNlaXZlZCB1bmtub3duIFNTSCBjb21tYW5kIHswfSBmcm9tIHsxfSAoezJ9KQogcHVia2V5QXV0aFdyb25nS2V5PVB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gcmVjZWl2ZWQgd3Jvbmcga2V5OyBzZW50IHswfSwgZ290IGJhY2sgezF9IGZyb20gezJ9ICh7M30pCiBwdWJrZXlBdXRoV3JvbmdTaWduYXR1cmVBbGdvcml0aG09UHVibGljIGtleSBhdXRoZW50aWNhdGlvbiByZXF1ZXN0ZWQgc2lnbmF0dXJlIHR5cGUgezB9IGJ1dCBnb3QgYmFjayB7MX0gZnJvbSB7Mn0gKHszfSkKQEAgLTg1LDkgKzg4LDEzIEBACiBzZXJ2ZXJJZFdpdGhOdWw9U2VydmVyIGlkZW50aWZpY2F0aW9uIGNvbnRhaW5zIGEgTlVMIGNoYXJhY3RlcjogezB9CiBzZXNzaW9uQ2xvc2VGYWlsZWQ9Q2xvc2luZyB0aGUgc2Vzc2lvbiBmYWlsZWQKIHNlc3Npb25XaXRob3V0VXNlcm5hbWU9U1NIIHNlc3Npb24gY3JlYXRlZCB3aXRob3V0IHVzZXIgbmFtZTsgY2Fubm90IGF1dGhlbnRpY2F0ZQorc3NoQWdlbnRFZERTQUZvcm1hdEVycm9yPUNhbm5vdCBhZGQgZWQyNTUxOSBrZXkgdG8gdGhlIFNTSCBhZ2VudCBiZWNhdXNlIGl0IGlzIGVuY29kZWQgYXMgezB9IGluc3RlYWQgb2YgUEtDUyM4Citzc2hBZ2VudFBheWxvYWRMZW5ndGhFcnJvcj1FeHBlY3RlZCB7MCxjaG9pY2UsMCNubyBieXRlc3wxI29uZSBieXRlfDE8ezB9IGJ5dGVzfSBidXQgZ290IHsxfQogc3NoQWdlbnRSZXBseUxlbmd0aEVycm9yPUludmFsaWQgU1NIIGFnZW50IHJlcGx5IG1lc3NhZ2UgbGVuZ3RoIHswfSBhZnRlciBjb21tYW5kIHsxfQogc3NoQWdlbnRSZXBseVVuZXhwZWN0ZWQ9VW5leHBlY3RlZCByZXBseSBmcm9tIHNzaC1hZ2VudDogezB9CiBzc2hBZ2VudFNob3J0UmVhZEJ1ZmZlcj1TaG9ydCByZWFkIGZyb20gU1NIIGFnZW50Citzc2hBZ2VudFVua25vd25LZXk9U1NIIGFnZW50IGRlbGl2ZXJlZCBhIGtleSB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkCitzc2hBZ2VudFdyb25nS2V5TGVuZ3RoPVNTSCBhZ2VudCBkZWxpdmVyZWQgaWxsb2dpY2FsIGtleSBsZW5ndGggezB9IGF0IG9mZnNldCB7MX0gaW4gYnVmZmVyIG9mIGxlbmd0aCB7Mn0KIHNzaEFnZW50V3JvbmdOdW1iZXJPZktleXM9SW52YWxpZCBudW1iZXIgb2YgU1NIIGFnZW50IGtleXM6IHswfQogc3NoQ2xvc2luZ0Rvd249QXBhY2hlIE1JTkEgc3NoZCBzZXNzaW9uIGZhY3RvcnkgaXMgY2xvc2luZyBkb3duOyBjYW5ub3QgY3JlYXRlIG5ldyBzc2ggc2Vzc2lvbnMgb24gdGhpcyBmYWN0b3J5CiBzc2hDb21tYW5kVGltZW91dD17MH0gdGltZWQgb3V0IGFmdGVyIHsxfSBzZWNvbmRzIHdoaWxlIG9wZW5pbmcgdGhlIGNoYW5uZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0Q2xpZW50U2Vzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRDbGllbnRTZXNzaW9uLmphdmEKaW5kZXggZTJkYmI0Yy4uNTEwMGJjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRDbGllbnRTZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRDbGllbnRTZXNzaW9uLmphdmEKQEAgLTQyLDcgKzQyLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmlvLklvV3JpdGVGdXR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguQnVpbHRpbkRIRmFjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LkRIRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5LZXhQcm9wb3NhbE9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5LZXlFeGNoYW5nZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uLktleEV4dGVuc2lvbkhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uLktleEV4dGVuc2lvbkhhbmRsZXIuQXZhaWxhYmlsaXR5UGhhc2U7CkBAIC0xOTksMjQgKzE5OCw2IEBAIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChSZWFkYWJsZSBidWZmZXIpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcDxLZXhQcm9wb3NhbE9wdGlvbiwgU3RyaW5nPiBzZXROZWdvdGlhdGlvblJlc3VsdCgKLQkJCU1hcDxLZXhQcm9wb3NhbE9wdGlvbiwgU3RyaW5nPiBndWVzcykgewotCQlNYXA8S2V4UHJvcG9zYWxPcHRpb24sIFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuc2V0TmVnb3RpYXRpb25SZXN1bHQoCi0JCQkJZ3Vlc3MpOwotCQkvLyBUaGlzIHNob3VsZCBiZSBkb2FibGUgd2l0aCBhIFNlc3Npb25MaXN0ZW5lciwgdG9vLCBidXQgSSBkb24ndCBzZWUKLQkJLy8gaG93IHRvIGFkZCBhIGxpc3RlbmVyIGluIHRpbWUgdG8gY2F0Y2ggdGhlIG5lZ290aWF0aW9uIGVuZCBmb3Igc3VyZQotCQkvLyBnaXZlbiB0aGF0IHRoZSBzdXBlci1jb25zdHJ1Y3RvciBhbHJlYWR5IHN0YXJ0cyBLRVguCi0JCS8vCi0JCS8vIFRPRE86IFRoaXMgb3ZlcnJpZGUgY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSB1c2Ugc3NoZCAyLjguMC4KLQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQlyZXN1bHQuZm9yRWFjaCgob3B0aW9uLCB2YWx1ZSkgLT4gbG9nLmRlYnVnKAotCQkJCQkic2V0TmVnb3RpYXRpb25SZXN1bHQoe30pIEtleDoge30gPSB7fSIsIHRoaXMsIC8vJE5PTi1OTFMtMSQKLQkJCQkJb3B0aW9uLmdldERlc2NyaXB0aW9uKCksIHZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KIAlTZXQ8U3RyaW5nPiBnZXRBbGxBdmFpbGFibGVTaWduYXR1cmVBbGdvcml0aG1zKCkgewogCQlTZXQ8U3RyaW5nPiBhbGxBdmFpbGFibGUgPSBuZXcgSGFzaFNldDw+KCk7CiAJCUJ1aWx0aW5TaWduYXR1cmVzLlZBTFVFUy5mb3JFYWNoKHMgLT4gYWxsQXZhaWxhYmxlLmFkZChzLmdldE5hbWUoKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbi5qYXZhCmluZGV4IGMwODJhOWEuLjk2ZGEwY2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0UHVibGljS2V5QXV0aGVudGljYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uLmphdmEKQEAgLTEyLDI1ICsxMiw2OCBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaENvbnN0YW50cy5QVUJLRVlfQUNDRVBURURfQUxHT1JJVEhNUzsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5JbnZhbGlkUGF0aEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRLZXlDb25zdHJhaW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXkuS2V5QWdlbnRJZGVudGl0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5LlB1YmxpY0tleUlkZW50aXR5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXkuVXNlckF1dGhQdWJsaWNLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleS5Vc2VyQXV0aFB1YmxpY0tleUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzLkhvc3RDb25maWdFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24uQ2xpZW50U2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLkZhY3RvcnlNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uTmFtZWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMuQXV0aG9yaXplZEtleUVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMuS2V5VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5QdWJsaWNLZXlFbnRyeVJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMudTJmLlNlY3VyaXR5S2V5UHVibGljS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZS5TaWduYXR1cmVGYWN0b3JpZXNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaC5PcGVuU3NoQ29uZmlnRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5DcmVkZW50aWFsSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5DcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2g7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIEN1c3RvbSB7QGxpbmsgVXNlckF1dGhQdWJsaWNLZXl9IGltcGxlbWVudGF0aW9uIGZvciBoYW5kbGluZyBTU0ggY29uZmlnCi0gKiBQdWJrZXlBY2NlcHRlZEFsZ29yaXRobXMuCisgKiBQdWJrZXlBY2NlcHRlZEFsZ29yaXRobXMgYW5kIGludGVyYWN0aW9uIHdpdGggdGhlIFNTSCBhZ2VudC4KICAqLwogcHVibGljIGNsYXNzIEpHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbiBleHRlbmRzIFVzZXJBdXRoUHVibGljS2V5IHsKIAorCXByaXZhdGUgU3NoQWdlbnQgYWdlbnQ7CisKKwlwcml2YXRlIEhvc3RDb25maWdFbnRyeSBob3N0Q29uZmlnOworCisJcHJpdmF0ZSBib29sZWFuIGFkZEtleXNUb0FnZW50OworCisJcHJpdmF0ZSBib29sZWFuIGFza0JlZm9yZUFkZGluZzsKKworCXByaXZhdGUgU3RyaW5nIHNrUHJvdmlkZXI7CisKKwlwcml2YXRlIFNzaEFnZW50S2V5Q29uc3RyYWludFtdIGNvbnN0cmFpbnRzOworCiAJSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uKExpc3Q8TmFtZWRGYWN0b3J5PFNpZ25hdHVyZT4+IGZhY3RvcmllcykgewogCQlzdXBlcihmYWN0b3JpZXMpOwogCX0KQEAgLTQzLDcgKzg2LDcgQEAgcHVibGljIHZvaWQgaW5pdChDbGllbnRTZXNzaW9uIHJhd1Nlc3Npb24sIFN0cmluZyBzZXJ2aWNlKQogCQkJCQkrIHJhd1Nlc3Npb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwogCQl9CiAJCUpHaXRDbGllbnRTZXNzaW9uIHNlc3Npb24gPSAoSkdpdENsaWVudFNlc3Npb24pIHJhd1Nlc3Npb247Ci0JCUhvc3RDb25maWdFbnRyeSBob3N0Q29uZmlnID0gc2Vzc2lvbi5nZXRIb3N0Q29uZmlnRW50cnkoKTsKKwkJaG9zdENvbmZpZyA9IHNlc3Npb24uZ2V0SG9zdENvbmZpZ0VudHJ5KCk7CiAJCS8vIFNldCBzaWduYXR1cmUgYWxnb3JpdGhtcyBmb3IgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbgogCQlTdHJpbmcgcHVia2V5QWxnb3MgPSBob3N0Q29uZmlnLmdldFByb3BlcnR5KFBVQktFWV9BQ0NFUFRFRF9BTEdPUklUSE1TKTsKIAkJaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHB1YmtleUFsZ29zKSkgewpAQCAtNjQsNDYgKzEwNywyOTEgQEAgcHVibGljIHZvaWQgaW5pdChDbGllbnRTZXNzaW9uIHJhd1Nlc3Npb24sIFN0cmluZyBzZXJ2aWNlKQogCQkvLyBJZiB3ZSBkb24ndCBzZXQgc2lnbmF0dXJlIGZhY3RvcmllcyBoZXJlLCB0aGUgZGVmYXVsdCBvbmVzIGZyb20gdGhlCiAJCS8vIHNlc3Npb24gd2lsbCBiZSB1c2VkLgogCQlzdXBlci5pbml0KHNlc3Npb24sIHNlcnZpY2UpOwotCQkvLyBJbiBzc2hkIDIuNy4wLCB3ZSBlbmQgdXAgbm93IHdpdGggYSBrZXkgaXRlcmF0b3IgdGhhdCB1c2VzIGtleXMKLQkJLy8gcHJvdmlkZWQgYnkgYW4gc3NoLWFnZW50IGV2ZW4gaWYgSWRlbnRpdGllc09ubHkgaXMgdHJ1ZS4gU28gaWYKLQkJLy8gbmVlZGVkLCBmaWx0ZXIgb3V0IGFueSBLZXlBZ2VudElkZW50aXR5LgotCQlpZiAoaG9zdENvbmZpZy5pc0lkZW50aXRpZXNPbmx5KCkpIHsKLQkJCUl0ZXJhdG9yPFB1YmxpY0tleUlkZW50aXR5PiBvcmlnaW5hbCA9IGtleXM7Ci0JCQkvLyBUaGUgb3JpZ2luYWwgaXRlcmF0b3Igd2lsbCBhbHJlYWR5IGhhdmUgZ290dGVuIHRoZSBpZGVudGl0aWVzCi0JCQkvLyBmcm9tIHRoZSBhZ2VudC4gVW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0Ci0JCQkvLyB0aGF0OyBpdCdsbCBoYXZlIHRvIGJlIGZpeGVkIHVwc3RyZWFtLiAoQXMgd2lsbCwgdWx0aW1hdGVseSwKLQkJCS8vIHJlc3BlY3RpbmcgaXNJZGVudGl0aWVzT25seSgpLikgQXQgbGVhc3Qgd2UgY2FuIHNpbXBseSBub3QKLQkJCS8vIHVzZSB0aGUga2V5cyB0aGUgYWdlbnQgcHJvdmlkZWQuCi0JCQkvLwotCQkJLy8gU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvU1NIRC0xMjE4Ci0JCQlrZXlzID0gbmV3IEl0ZXJhdG9yPD4oKSB7CisJfQogCi0JCQkJcHJpdmF0ZSBQdWJsaWNLZXlJZGVudGl0eSB2YWx1ZTsKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8UHVibGljS2V5SWRlbnRpdHk+IGNyZWF0ZVB1YmxpY0tleUl0ZXJhdG9yKAorCQkJQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLCBTaWduYXR1cmVGYWN0b3JpZXNNYW5hZ2VyIG1hbmFnZXIpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWdlbnQgPSBnZXRBZ2VudChzZXNzaW9uKTsKKwkJaWYgKGFnZW50ICE9IG51bGwpIHsKKwkJCXBhcnNlQWRkS2V5cyhob3N0Q29uZmlnKTsKKwkJCWlmIChhZGRLZXlzVG9BZ2VudCkgeworCQkJCXNrUHJvdmlkZXIgPSBob3N0Q29uZmlnLmdldFByb3BlcnR5KFNzaENvbnN0YW50cy5TRUNVUklUWV9LRVlfUFJPVklERVIpOworCQkJfQorCQl9CisJCXJldHVybiBuZXcgS2V5SXRlcmF0b3Ioc2Vzc2lvbiwgbWFuYWdlcik7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFB1YmxpY0tleUlkZW50aXR5IHJlc29sdmVBdHRlbXB0ZWRQdWJsaWNLZXlJZGVudGl0eSgKKwkJCUNsaWVudFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24geworCQlQdWJsaWNLZXlJZGVudGl0eSByZXN1bHQgPSBnZXROZXh0S2V5KHNlc3Npb24sIHNlcnZpY2UpOworCQkvLyBUaGlzIGZpeGVzIFNTSEQtMTIzMS4gQ2FuIGJlIHJlbW92ZWQgb25jZSB3ZSdyZSB1c2luZyBBcGFjaGUgTUlOQQorCQkvLyBzc2hkID4gMi44LjAuCisJCS8vCisJCS8vIFNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1NTSEQtMTIzMQorCQljdXJyZW50QWxnb3JpdGhtcy5jbGVhcigpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgUHVibGljS2V5SWRlbnRpdHkgZ2V0TmV4dEtleShDbGllbnRTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXJ2aWNlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1YmxpY0tleUlkZW50aXR5IGlkID0gc3VwZXIucmVzb2x2ZUF0dGVtcHRlZFB1YmxpY0tleUlkZW50aXR5KHNlc3Npb24sCisJCQkJc2VydmljZSk7CisJCWlmIChhZGRLZXlzVG9BZ2VudCAmJiBpZCAhPSBudWxsICYmICEoaWQgaW5zdGFuY2VvZiBLZXlBZ2VudElkZW50aXR5KSkgeworCQkJS2V5UGFpciBrZXkgPSBpZC5nZXRLZXlJZGVudGl0eSgpOworCQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5nZXRQdWJsaWMoKSAhPSBudWxsCisJCQkJCSYmIGtleS5nZXRQcml2YXRlKCkgIT0gbnVsbCkgeworCQkJCS8vIFdlJ3ZlIGp1c3Qgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhIGtleSB0aGF0IHdhc24ndCBpbiB0aGUKKwkJCQkvLyBhZ2VudC4gQWRkIGl0IHRvIHRoZSBhZ2VudC4KKwkJCQkvLworCQkJCS8vIEtleXMgYXJlIGFkZGVkIGFmdGVyIGxvYWRpbmcsIGFzIGluIE9wZW5TU0guIFRoZSBhbHRlcm5hdGl2ZQorCQkJCS8vIG1pZ2h0IGJlIHRvIGFkZCBhIGtleSBvbmx5IGFmdGVyIChwYXJ0aWFsbHkpIHN1Y2Nlc3NmdWwKKwkJCQkvLyBhdXRoZW50aWNhdGlvbj8KKwkJCQlQdWJsaWNLZXkgcGsgPSBrZXkuZ2V0UHVibGljKCk7CisJCQkJU3RyaW5nIGZpbmdlcnByaW50ID0gS2V5VXRpbHMuZ2V0RmluZ2VyUHJpbnQocGspOworCQkJCVN0cmluZyBrZXlUeXBlID0gS2V5VXRpbHMuZ2V0S2V5VHlwZShrZXkpOworCQkJCXRyeSB7CisJCQkJCS8vIENoZWNrIHRoYXQgdGhlIGtleSBpcyBub3QgaW4gdGhlIGFnZW50IGFscmVhZHkuCisJCQkJCWlmIChhZ2VudEhhc0tleShwaykpIHsKKwkJCQkJCXJldHVybiBpZDsKKwkJCQkJfQorCQkJCQlpZiAoYXNrQmVmb3JlQWRkaW5nCisJCQkJCQkJJiYgKHNlc3Npb24gaW5zdGFuY2VvZiBKR2l0Q2xpZW50U2Vzc2lvbikpIHsKKwkJCQkJCUNyZWRlbnRpYWxzUHJvdmlkZXIgcHJvdmlkZXIgPSAoKEpHaXRDbGllbnRTZXNzaW9uKSBzZXNzaW9uKQorCQkJCQkJCQkuZ2V0Q3JlZGVudGlhbHNQcm92aWRlcigpOworCQkJCQkJQ3JlZGVudGlhbEl0ZW0uWWVzTm9UeXBlIHF1ZXN0aW9uID0gbmV3IENyZWRlbnRpYWxJdGVtLlllc05vVHlwZSgKKwkJCQkJCQkJZm9ybWF0KFNzaGRUZXh0CisJCQkJCQkJCQkJLmdldCgpLnB1YmtleUF1dGhBZGRLZXlUb0FnZW50UXVlc3Rpb24sCisJCQkJCQkJCQkJa2V5VHlwZSwgZmluZ2VycHJpbnQpKTsKKwkJCQkJCWJvb2xlYW4gcmVzdWx0ID0gcHJvdmlkZXIgIT0gbnVsbAorCQkJCQkJCQkmJiBwcm92aWRlci5zdXBwb3J0cyhxdWVzdGlvbikKKwkJCQkJCQkJJiYgcHJvdmlkZXIuZ2V0KGdldFVyaSgpLCBxdWVzdGlvbik7CisJCQkJCQlpZiAoIXJlc3VsdCB8fCAhcXVlc3Rpb24uZ2V0VmFsdWUoKSkgeworCQkJCQkJCS8vIERvbid0IGFkZCB0aGUga2V5LgorCQkJCQkJCXJldHVybiBpZDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlTc2hBZ2VudEtleUNvbnN0cmFpbnRbXSBydWxlcyA9IGNvbnN0cmFpbnRzOworCQkJCQlpZiAocGsgaW5zdGFuY2VvZiBTZWN1cml0eUtleVB1YmxpY0tleSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChza1Byb3ZpZGVyKSkgeworCQkJCQkJcnVsZXMgPSBBcnJheXMuY29weU9mKHJ1bGVzLCBydWxlcy5sZW5ndGggKyAxKTsKKwkJCQkJCXJ1bGVzW3J1bGVzLmxlbmd0aCAtIDFdID0KKwkJCQkJCQkJbmV3IFNzaEFnZW50S2V5Q29uc3RyYWludC5GaWRvUHJvdmlkZXJFeHRlbnNpb24oc2tQcm92aWRlcik7CisJCQkJCX0KKwkJCQkJLy8gVW5mb3J0dW5hdGVseSBhIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgaXMgbG9zdAorCQkJCQkvLyBieSBBcGFjaGUgTUlOQSBzc2hkLCBhbmQgdGhlcmUgaXMgYWxzbyBubyB3YXkgdG8gZ2V0IHRoZQorCQkJCQkvLyBvcmlnaW5hbCBmaWxlIG5hbWUgZm9yIGtleXMgbG9hZGVkIGZyb20gYSBmaWxlLiBTbyBhZGQgaXQKKwkJCQkJLy8gd2l0aG91dCBjb21tZW50LgorCQkJCQlhZ2VudC5hZGRJZGVudGl0eShrZXksIG51bGwsIHJ1bGVzKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIERvIG5vdCByZS10aHJvdzogd2UgZG9uJ3Qgd2FudCBhdXRoZW50aWNhdGlvbiB0byBmYWlsIGlmCisJCQkJCS8vIHdlIGNhbm5vdCBhZGQgdGhlIGtleSB0byB0aGUgYWdlbnQuCisJCQkJCWxvZy5lcnJvcigKKwkJCQkJCQlmb3JtYXQoU3NoZFRleHQuZ2V0KCkucHVia2V5QXV0aEFkZEtleVRvQWdlbnRFcnJvciwKKwkJCQkJCQkJCWtleVR5cGUsIGZpbmdlcnByaW50KSwKKwkJCQkJCQllKTsKKwkJCQkJLy8gTm90ZSB0aGF0IGFzIG9mIFdpbjMyLU9wZW5TU0ggOC42IGFuZCBQYWdlYW50IDAuNzYsCisJCQkJCS8vIG5laXRoZXIgY2FuIGhhbmRsZSBrZXkgY29uc3RyYWludHMuIFBhZ2VhbnQgZmFpbHMKKwkJCQkJLy8gZ3JhY2VmdWxseSwgbm90IGFkZGluZyB0aGUga2V5IGFuZCByZXR1cm5pbmcKKwkJCQkJLy8gU1NIX0FHRU5UX0ZBSUxVUkUuIFdpbjMyLU9wZW5TU0ggY2xvc2VzIHRoZSBjb25uZWN0aW9uCisJCQkJCS8vIHdpdGhvdXQgZXZlbiByZXR1cm5pbmcgYSBmYWlsdXJlIG1lc3NhZ2UsIHdoaWNoIHZpb2xhdGVzCisJCQkJCS8vIHRoZSBTU0ggYWdlbnQgcHJvdG9jb2wgYW5kIG1ha2VzIGFsbCBzdWJzZXF1ZW50IHJlcXVlc3RzCisJCQkJCS8vIHRvIHRoZSBhZ2VudCBmYWlsLgorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gaWQ7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGFnZW50SGFzS2V5KFB1YmxpY0tleSBwaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSXRlcmFibGU8PyBleHRlbmRzIE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4+IGlkcyA9IGFnZW50CisJCQkJLmdldElkZW50aXRpZXMoKTsKKwkJaWYgKGlkcyA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJSXRlcmF0b3I8PyBleHRlbmRzIE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4+IGl0ZXIgPSBpZHMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlpZiAoS2V5VXRpbHMuY29tcGFyZUtleXMoaXRlci5uZXh0KCkuZ2V0S2V5KCksIHBrKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIFVSSWlzaCBnZXRVcmkoKSB7CisJCVN0cmluZyB1cmkgPSBTc2hDb25zdGFudHMuU1NIX1NDSEVNRSArICI6Ly8iOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyB1c2VyTmFtZSA9IGhvc3RDb25maWcuZ2V0VXNlcm5hbWUoKTsKKwkJaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHVzZXJOYW1lKSkgeworCQkJdXJpICs9IHVzZXJOYW1lICsgJ0AnOworCQl9CisJCXVyaSArPSBob3N0Q29uZmlnLmdldEhvc3QoKTsKKwkJaW50IHBvcnQgPSBob3N0Q29uZmlnLmdldFBvcnQoKTsKKwkJaWYgKHBvcnQgPiAwICYmIHBvcnQgIT0gU3NoQ29uc3RhbnRzLlNTSF9ERUZBVUxUX1BPUlQpIHsKKwkJCXVyaSArPSAiOiIgKyBwb3J0OyAvLyROT04tTkxTLTEkCisJCX0KKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgVVJJaXNoKHVyaSk7CisJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOworCQl9CisJCXJldHVybiBuZXcgVVJJaXNoKCk7CisJfQorCisJcHJpdmF0ZSBTc2hBZ2VudCBnZXRBZ2VudChDbGllbnRTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCQlGYWN0b3J5TWFuYWdlciBtYW5hZ2VyID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCgKKwkJCQlzZXNzaW9uLmdldEZhY3RvcnlNYW5hZ2VyKCksICJObyBzZXNzaW9uIGZhY3RvcnkgbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCisJCVNzaEFnZW50RmFjdG9yeSBmYWN0b3J5ID0gbWFuYWdlci5nZXRBZ2VudEZhY3RvcnkoKTsKKwkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQ2xpZW50KHNlc3Npb24sIG1hbmFnZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBwYXJzZUFkZEtleXMoSG9zdENvbmZpZ0VudHJ5IGNvbmZpZykgeworCQlTdHJpbmcgdmFsdWUgPSBjb25maWcuZ2V0UHJvcGVydHkoU3NoQ29uc3RhbnRzLkFERF9LRVlTX1RPX0FHRU5UKTsKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodmFsdWUpKSB7CisJCQlhZGRLZXlzVG9BZ2VudCA9IGZhbHNlOworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZ1tdIHZhbHVlcyA9IHZhbHVlLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJTGlzdDxTc2hBZ2VudEtleUNvbnN0cmFpbnQ+IHJ1bGVzID0gbmV3IEFycmF5TGlzdDw+KDIpOworCQlzd2l0Y2ggKHZhbHVlc1swXSkgeworCQljYXNlICJ5ZXMiOiAvLyROT04tTkxTLTEkCisJCQlhZGRLZXlzVG9BZ2VudCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAibm8iOiAvLyROT04tTkxTLTEkCisJCQlhZGRLZXlzVG9BZ2VudCA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgImFzayI6IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEtleXNUb0FnZW50ID0gdHJ1ZTsKKwkJCWFza0JlZm9yZUFkZGluZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAiY29uZmlybSI6IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEtleXNUb0FnZW50ID0gdHJ1ZTsKKwkJCXJ1bGVzLmFkZChTc2hBZ2VudEtleUNvbnN0cmFpbnQuQ09ORklSTSk7CisJCQlpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKKwkJCQlpbnQgc2Vjb25kcyA9IE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKHZhbHVlc1sxXSk7CisJCQkJaWYgKHNlY29uZHMgPiAwKSB7CisJCQkJCXJ1bGVzLmFkZChuZXcgU3NoQWdlbnRLZXlDb25zdHJhaW50LkxpZmVUaW1lKHNlY29uZHMpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWludCBzZWNvbmRzID0gT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWModmFsdWVzWzBdKTsKKwkJCWlmIChzZWNvbmRzID4gMCkgeworCQkJCWFkZEtleXNUb0FnZW50ID0gdHJ1ZTsKKwkJCQlydWxlcy5hZGQobmV3IFNzaEFnZW50S2V5Q29uc3RyYWludC5MaWZlVGltZShzZWNvbmRzKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljb25zdHJhaW50cyA9IHJ1bGVzLnRvQXJyYXkobmV3IFNzaEFnZW50S2V5Q29uc3RyYWludFswXSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcmVsZWFzZUtleXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlhZGRLZXlzVG9BZ2VudCA9IGZhbHNlOworCQlhc2tCZWZvcmVBZGRpbmcgPSBmYWxzZTsKKwkJc2tQcm92aWRlciA9IG51bGw7CisJCWNvbnN0cmFpbnRzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmIChhZ2VudCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJYWdlbnQuY2xvc2UoKTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlhZ2VudCA9IG51bGw7CisJCQkJfQorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJc3VwZXIucmVsZWFzZUtleXMoKTsKKwkJfQorCX0KKworCXByaXZhdGUgY2xhc3MgS2V5SXRlcmF0b3IgZXh0ZW5kcyBVc2VyQXV0aFB1YmxpY0tleUl0ZXJhdG9yIHsKKworCQlwcml2YXRlIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBhZ2VudEtleXM7CisKKwkJLy8gSWYgbm9uLW51bGwsIGFsbCB0aGUgcHVibGljIGtleXMgZnJvbSBleHBsaWNpdGx5IGdpdmVuIGtleSBmaWxlcy4gQW55CisJCS8vIGFnZW50IGtleSBub3QgbWF0Y2hpbmcgb25lIG9mIHRoZXNlIHB1YmxpYyBrZXlzIHdpbGwgYmUgaWdub3JlZCBpbgorCQkvLyBnZXRJZGVudGl0aWVzKCkuCisJCXByaXZhdGUgQ29sbGVjdGlvbjxQdWJsaWNLZXk+IGlkZW50aXR5RmlsZXM7CisKKwkJcHVibGljIEtleUl0ZXJhdG9yKENsaWVudFNlc3Npb24gc2Vzc2lvbiwKKwkJCQlTaWduYXR1cmVGYWN0b3JpZXNNYW5hZ2VyIG1hbmFnZXIpCisJCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlzdXBlcihzZXNzaW9uLCBtYW5hZ2VyKTsKKwkJfQorCisJCXByaXZhdGUgTGlzdDxQdWJsaWNLZXk+IGdldEV4cGxpY2l0S2V5cygKKwkJCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhwbGljaXRGaWxlcykgeworCQkJaWYgKGV4cGxpY2l0RmlsZXMgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmV0dXJuIGV4cGxpY2l0RmlsZXMuc3RyZWFtKCkubWFwKHMgLT4geworCQkJCXRyeSB7CisJCQkJCVBhdGggcCA9IFBhdGhzLmdldChzICsgIi5wdWIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoRmlsZXMuaXNSZWd1bGFyRmlsZShwLCBMaW5rT3B0aW9uLk5PRk9MTE9XX0xJTktTKSkgeworCQkJCQkJcmV0dXJuIEF1dGhvcml6ZWRLZXlFbnRyeS5yZWFkQXV0aG9yaXplZEtleXMocCkuZ2V0KDApCisJCQkJCQkJCS5yZXNvbHZlUHVibGljS2V5KG51bGwsCisJCQkJCQkJCQkJUHVibGljS2V5RW50cnlSZXNvbHZlci5JR05PUklORyk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChJbnZhbGlkUGF0aEV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uCisJCQkJCQl8IEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy53YXJuKGZvcm1hdChTc2hkVGV4dC5nZXQoKS5jYW5ub3RSZWFkUHVibGljS2V5LCBzKSwgZSk7CisJCQkJfQorCQkJCXJldHVybiBudWxsOworCQkJfSkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEl0ZXJhYmxlPEtleUFnZW50SWRlbnRpdHk+IGluaXRpYWxpemVBZ2VudElkZW50aXRpZXMoCisJCQkJQ2xpZW50U2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJaWYgKGFnZW50ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWFnZW50S2V5cyA9IGFnZW50LmdldElkZW50aXRpZXMoKTsKKwkJCWlmIChob3N0Q29uZmlnICE9IG51bGwgJiYgaG9zdENvbmZpZy5pc0lkZW50aXRpZXNPbmx5KCkpIHsKKwkJCQlpZGVudGl0eUZpbGVzID0gZ2V0RXhwbGljaXRLZXlzKGhvc3RDb25maWcuZ2V0SWRlbnRpdGllcygpKTsKKwkJCX0KKwkJCXJldHVybiAoKSAtPiBuZXcgSXRlcmF0b3I8PigpIHsKKworCQkJCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4+IGl0ZXIgPSBhZ2VudEtleXMKKwkJCQkJCS5pdGVyYXRvcigpOworCisJCQkJcHJpdmF0ZSBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+IG5leHQ7CiAKIAkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJUHVibGljS2V5SWRlbnRpdHkgbmV4dCA9IG51bGw7Ci0JCQkJCXdoaWxlIChvcmlnaW5hbC5oYXNOZXh0KCkpIHsKLQkJCQkJCW5leHQgPSBvcmlnaW5hbC5uZXh0KCk7Ci0JCQkJCQlpZiAoIShuZXh0IGluc3RhbmNlb2YgS2V5QWdlbnRJZGVudGl0eSkpIHsKLQkJCQkJCQl2YWx1ZSA9IG5leHQ7CisJCQkJCXdoaWxlIChuZXh0ID09IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJCU1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4gdmFsID0gaXRlci5uZXh0KCk7CisJCQkJCQlQdWJsaWNLZXkgcGsgPSB2YWwuZ2V0S2V5KCk7CisJCQkJCQkvLyBUaGlzIGNoZWNrcyBhZ2FpbnN0IGFsbCBleHBsaWNpdCBrZXlzIGZvciBhbnkgYWdlbnQKKwkJCQkJCS8vIGtleSwgYnV0IHNpbmNlIGlkZW50aXR5RmlsZXMuc2l6ZSgpIGlzIHR5cGljYWxseSAxLAorCQkJCQkJLy8gaXQgc2hvdWxkIGJlIGZpbmUuCisJCQkJCQlpZiAoaWRlbnRpdHlGaWxlcyA9PSBudWxsIHx8IGlkZW50aXR5RmlsZXMuc3RyZWFtKCkKKwkJCQkJCQkJLmFueU1hdGNoKGsgLT4gS2V5VXRpbHMuY29tcGFyZUtleXMoaywgcGspKSkgeworCQkJCQkJCW5leHQgPSB2YWw7CiAJCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCQl9CisJCQkJCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCQkJCQlsb2cudHJhY2UoCisJCQkJCQkJCQkiSWdub3JpbmcgU1NIIGFnZW50IHt9IGtleSBub3QgaW4gZXhwbGljaXQgSWRlbnRpdHlGaWxlIGluIFNTSCBjb25maWc6IHt9IiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJS2V5VXRpbHMuZ2V0S2V5VHlwZShwayksCisJCQkJCQkJCQlLZXlVdGlscy5nZXRGaW5nZXJQcmludChwaykpOworCQkJCQkJfQogCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJcmV0dXJuIG5leHQgIT0gbnVsbDsKIAkJCQl9CiAKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgUHVibGljS2V5SWRlbnRpdHkgbmV4dCgpIHsKLQkJCQkJaWYgKGhhc05leHQoKSkgewotCQkJCQkJUHVibGljS2V5SWRlbnRpdHkgcmVzdWx0ID0gdmFsdWU7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCXB1YmxpYyBLZXlBZ2VudElkZW50aXR5IG5leHQoKSB7CisJCQkJCWlmICghaGFzTmV4dCgpKSB7CisJCQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogCQkJCQl9Ci0JCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisJCQkJCUtleUFnZW50SWRlbnRpdHkgcmVzdWx0ID0gbmV3IEtleUFnZW50SWRlbnRpdHkoYWdlbnQsCisJCQkJCQkJbmV4dC5nZXRLZXkoKSwgbmV4dC5nZXRWYWx1ZSgpKTsKKwkJCQkJbmV4dCA9IG51bGw7CisJCQkJCXJldHVybiByZXN1bHQ7CiAJCQkJfQogCQkJfTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQuamF2YQppbmRleCAwMGVlNjJkLi4xOWFkODVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQuamF2YQpAQCAtMzAsNiArMzAsNyBAQCBwdWJsaWMgc3RhdGljIFNzaGRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhlbnRpY2F0aW9uQ2FuY2VsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoZW50aWNhdGlvbk9uQ2xvc2VkU2Vzc2lvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNsb3NlTGlzdGVuZXJGYWlsZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBjYW5ub3RSZWFkUHVibGljS2V5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY29uZmlnSW52YWxpZFBhdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBjb25maWdJbnZhbGlkUGF0dGVybjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvbmZpZ0ludmFsaWRQb3NpdGl2ZTsKQEAgLTk4LDYgKzk5LDggQEAgcHVibGljIHN0YXRpYyBTc2hkVGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwcm94eVNvY2tzVW5leHBlY3RlZE1lc3NhZ2U7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwcm94eVNvY2tzVW5leHBlY3RlZFZlcnNpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBwcm94eVNvY2tzVXNlcm5hbWVUb29Mb25nOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVia2V5QXV0aEFkZEtleVRvQWdlbnRFcnJvcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhBZGRLZXlUb0FnZW50UXVlc3Rpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdWJrZXlBdXRoV3JvbmdDb21tYW5kOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVia2V5QXV0aFdyb25nS2V5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVia2V5QXV0aFdyb25nU2lnbmF0dXJlQWxnb3JpdGhtOwpAQCAtMTA2LDkgKzEwOSwxMyBAQCBwdWJsaWMgc3RhdGljIFNzaGRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNlcnZlcklkV2l0aE51bDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNlc3Npb25DbG9zZUZhaWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNlc3Npb25XaXRob3V0VXNlcm5hbWU7CisJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudEVkRFNBRm9ybWF0RXJyb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFBheWxvYWRMZW5ndGhFcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50UmVwbHlMZW5ndGhFcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50UmVwbHlVbmV4cGVjdGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRTaG9ydFJlYWRCdWZmZXI7CisJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFVua25vd25LZXk7CisJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFdyb25nS2V5TGVuZ3RoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRXcm9uZ051bWJlck9mS2V5czsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaENsb3NpbmdEb3duOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQ29tbWFuZFRpbWVvdXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvSkdpdFNzaEFnZW50RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L0pHaXRTc2hBZ2VudEZhY3RvcnkuamF2YQppbmRleCAxZWQyYWI5Li5hMGZmZDU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvSkdpdFNzaEFnZW50RmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9KR2l0U3NoQWdlbnRGYWN0b3J5LmphdmEKQEAgLTE3LDEwICsxNywxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0cy5Ib3N0Q29uZmlnRW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5GYWN0b3J5TWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNoYW5uZWwuQ2hhbm5lbEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uLkNvbm5lY3Rpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5TZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLkpHaXRDbGllbnRTZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvckZhY3Rvcnk7CiAKIC8qKgpAQCAtNDksMTggKzUzLDI0IEBAIHB1YmxpYyBKR2l0U3NoQWdlbnRGYWN0b3J5KEBOb25OdWxsIENvbm5lY3RvckZhY3RvcnkgZmFjdG9yeSwKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdDxDaGFubmVsRmFjdG9yeT4gZ2V0Q2hhbm5lbEZvcndhcmRpbmdGYWN0b3JpZXMoCiAJCQlGYWN0b3J5TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCS8vIE5vIGFnZW50IGZvcndhcmRpbmcgc3VwcG9ydGVkIHlldC4KKwkJLy8gTm8gYWdlbnQgZm9yd2FyZGluZyBzdXBwb3J0ZWQuCiAJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3NoQWdlbnQgY3JlYXRlQ2xpZW50KEZhY3RvcnlNYW5hZ2VyIG1hbmFnZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHNzaGQgMi44LjAgd2lsbCBwYXNzIHVzIHRoZSBzZXNzaW9uIGhlcmUuIEF0IHRoYXQgcG9pbnQsIHdlIGNhbiBnZXQKLQkJLy8gdGhlIEhvc3RDb25maWdFbnRyeSBhbmQgZXh0cmFjdCBhbmQgaGFuZGxlIHRoZSBJZGVudGl0eUFnZW50IHNldHRpbmcuCi0JCS8vIEZvciBub3csIHBhc3MgbnVsbCB0byBsZXQgdGhlIENvbm5lY3RvckZhY3RvcnkgZG8gaXRzIGRlZmF1bHQKLQkJLy8gYmVoYXZpb3IgKFBhZ2VhbnQgb24gV2luZG93cywgU1NIX0FVVEhfU09DSyBvbiBVbml4ZXMgd2l0aCB0aGUKLQkJLy8gamdpdC1idWlsdGluIGZhY3RvcnkpLgotCQlyZXR1cm4gbmV3IFNzaEFnZW50Q2xpZW50KGZhY3RvcnkuY3JlYXRlKG51bGwsIGhvbWVEaXIpKTsKKwlwdWJsaWMgU3NoQWdlbnQgY3JlYXRlQ2xpZW50KFNlc3Npb24gc2Vzc2lvbiwgRmFjdG9yeU1hbmFnZXIgbWFuYWdlcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBpZGVudGl0eUFnZW50ID0gbnVsbDsKKwkJaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBKR2l0Q2xpZW50U2Vzc2lvbikgeworCQkJSG9zdENvbmZpZ0VudHJ5IGhvc3RDb25maWcgPSAoKEpHaXRDbGllbnRTZXNzaW9uKSBzZXNzaW9uKQorCQkJCQkuZ2V0SG9zdENvbmZpZ0VudHJ5KCk7CisJCQlpZGVudGl0eUFnZW50ID0gaG9zdENvbmZpZy5nZXRQcm9wZXJ0eShTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQsCisJCQkJCW51bGwpOworCQl9CisJCWlmIChTc2hDb25zdGFudHMuTk9ORS5lcXVhbHMoaWRlbnRpdHlBZ2VudCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBuZXcgU3NoQWdlbnRDbGllbnQoZmFjdG9yeS5jcmVhdGUoaWRlbnRpdHlBZ2VudCwgaG9tZURpcikpOwogCX0KIAogCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L1NzaEFnZW50Q2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvU3NoQWdlbnRDbGllbnQuamF2YQppbmRleCAwODQ4M2U0Li5jYmNiNGQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvU3NoQWdlbnRDbGllbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvU3NoQWdlbnRDbGllbnQuamF2YQpAQCAtMTEsMTAgKzExLDEyIEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTIyLDIxICsyNCwyNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudENvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRLZXlDb25zdHJhaW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uU3NoRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMuS2V5VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlci5LZXlQYWlyUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uLlNlc3Npb25Db250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIuQnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIuQnVmZmVyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIuQnVmZmVyVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlci5CeXRlQXJyYXlCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlci5rZXlzLkJ1ZmZlclB1YmxpY0tleVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8uZGVyLkRFUlBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLlNzaGRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQ29ubmVjdG9yOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIC8qKgotICogQSBjbGllbnQgZm9yIGFuIFNTSDIgYWdlbnQuIFRoaXMgY2xpZW50IHN1cHBvcnRzIG9ubHkgcXVlcnlpbmcgaWRlbnRpdGllcyBhbmQKLSAqIHNpZ25hdHVyZSByZXF1ZXN0cy4KKyAqIEEgY2xpZW50IGZvciBhbiBTU0gyIGFnZW50LiBUaGlzIGNsaWVudCBzdXBwb3J0cyBxdWVyeWluZyBpZGVudGl0aWVzLAorICogc2lnbmF0dXJlIHJlcXVlc3RzLCBhbmQgYWRkaW5nIGtleXMgdG8gYW4gYWdlbnQgKHdpdGggb3Igd2l0aG91dAorICogY29uc3RyYWludHMpLiBSZW1vdmluZyBrZXlzIGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCB0aGUgb2xkZXIgU1NIMSBwcm90b2NvbCBpcworICogbm90IHN1cHBvcnRlZC4KICAqCiAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1taWxsZXItc3NoLWFnZW50LTA0Ij5TU0gKICAqICAgICAgQWdlbnQgUHJvdG9jb2wsIFJGQyBkcmFmdDwvYT4KQEAgLTcyLDExICs4MCwxOCBAQCBwcml2YXRlIGJvb2xlYW4gb3Blbihib29sZWFuIGRlYnVnZ2luZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCX0KIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlib29sZWFuIGNvbm5lY3RlZCA9IGNvbm5lY3RvciAhPSBudWxsICYmIGNvbm5lY3Rvci5jb25uZWN0KCk7Ci0JCWlmICghY29ubmVjdGVkKSB7Ci0JCQlpZiAoZGVidWdnaW5nKSB7Ci0JCQkJTE9HLmRlYnVnKCJObyBTU0ggYWdlbnQgKFNTSF9BVVRIX1NPQ0sgbm90IHNldCkiKTsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIGNvbm5lY3RlZDsKKwkJdHJ5IHsKKwkJCWNvbm5lY3RlZCA9IGNvbm5lY3RvciAhPSBudWxsICYmIGNvbm5lY3Rvci5jb25uZWN0KCk7CisJCQlpZiAoIWNvbm5lY3RlZCAmJiBkZWJ1Z2dpbmcpIHsKKwkJCQlMT0cuZGVidWcoIk5vIFNTSCBhZ2VudCIpOyAvLyROT04tTkxTLTEkCiAJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIEFnZW50IG5vdCBydW5uaW5nPworCQkJaWYgKGRlYnVnZ2luZykgeworCQkJCUxPRy5kZWJ1ZygiTm8gU1NIIGFnZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXRocm93IGU7CiAJCX0KIAkJcmV0dXJuIGNvbm5lY3RlZDsKIAl9CkBAIC0xMjcsMTQgKzE0MiwxNyBAQCBwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIE1hcC5FbnRyeTxQdWJsaWNLZXksIFN0cmluZz4+IGdldElkZW50aXRpZXMoKQogCQkJTGlzdDxNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KAogCQkJCQludW1iZXJPZktleXMpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZktleXM7IGkrKykgewotCQkJCVB1YmxpY0tleSBrZXkgPSByZXBseS5nZXRQdWJsaWNLZXkoKTsKKwkJCQlQdWJsaWNLZXkga2V5ID0gcmVhZEtleShyZXBseSk7CiAJCQkJU3RyaW5nIGNvbW1lbnQgPSByZXBseS5nZXRTdHJpbmcoKTsKLQkJCQlpZiAodHJhY2luZykgewotCQkJCQlMT0cudHJhY2UoIkdvdCBTU0ggYWdlbnQge30ga2V5OiB7fSB7fSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlLZXlVdGlscy5nZXRLZXlUeXBlKGtleSksCi0JCQkJCQkJS2V5VXRpbHMuZ2V0RmluZ2VyUHJpbnQoa2V5KSwgY29tbWVudCk7CisJCQkJaWYgKGtleSAhPSBudWxsKSB7CisJCQkJCWlmICh0cmFjaW5nKSB7CisJCQkJCQlMT0cudHJhY2UoIkdvdCBTU0ggYWdlbnQge30ga2V5OiB7fSB7fSIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJS2V5VXRpbHMuZ2V0S2V5VHlwZShrZXkpLAorCQkJCQkJCQlLZXlVdGlscy5nZXRGaW5nZXJQcmludChrZXkpLCBjb21tZW50KTsKKwkJCQkJfQorCQkJCQlrZXlzLmFkZChuZXcgQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnk8PihrZXksCisJCQkJCQkJY29tbWVudCkpOwogCQkJCX0KLQkJCQlrZXlzLmFkZChuZXcgQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnk8PihrZXksIGNvbW1lbnQpKTsKIAkJCX0KIAkJCXJldHVybiBrZXlzOwogCQl9IGNhdGNoIChCdWZmZXJFeGNlcHRpb24gZSkgewpAQCAtMjE2LDYgKzIzNCwyMjIgQEAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBnZXRJZGVudGl0aWVzKCkKIAkJfQogCX0KIAorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZElkZW50aXR5KEtleVBhaXIga2V5LCBTdHJpbmcgY29tbWVudCwKKwkJCVNzaEFnZW50S2V5Q29uc3RyYWludC4uLiBjb25zdHJhaW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYm9vbGVhbiBkZWJ1Z2dpbmcgPSBMT0cuaXNEZWJ1Z0VuYWJsZWQoKTsKKwkJaWYgKCFvcGVuKGRlYnVnZ2luZykpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIE5laXRoZXIgUGFnZWFudCAwLjc2IG5vciBXaW4zMi1PcGVuU1NIIDguNiBzdXBwb3J0IGNvbW1hbmQKKwkJLy8gU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVELiBBZGRpbmcgYSBrZXkgd2l0aCBjb25zdHJhaW50cyB3aWxsCisJCS8vIGZhaWwuIFRoZSBvbmx5IHdvcmstYXJvdW5kIGZvciB1c2VycyBpcyBub3QgdG8gdXNlICJjb25maXJtIiBvciAidGltZQorCQkvLyBzcGVjIiB3aXRoIEFkZEtleXNUb0FnZW50LCBhbmQgbm90IHRvIHVzZSBzay0qIGtleXMuCisJCS8vCisJCS8vIFdpdGggYSB0cnVlIE9wZW5TU0ggU1NIIGFnZW50LCBrZXkgY29uc3RyYWludHMgd29yay4KKwkJYnl0ZSBjbWQgPSAoY29uc3RyYWludHMgIT0gbnVsbCAmJiBjb25zdHJhaW50cy5sZW5ndGggPiAwKQorCQkJCT8gU3NoQWdlbnRDb25zdGFudHMuU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVECisJCQkJOiBTc2hBZ2VudENvbnN0YW50cy5TU0gyX0FHRU5UQ19BRERfSURFTlRJVFk7CisJCWJ5dGVbXSBtZXNzYWdlID0gbnVsbDsKKwkJQnl0ZUFycmF5QnVmZmVyIG1zZyA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKKwkJdHJ5IHsKKwkJCW1zZy5wdXRJbnQoMCk7CisJCQltc2cucHV0Qnl0ZShjbWQpOworCQkJU3RyaW5nIGtleVR5cGUgPSBLZXlVdGlscy5nZXRLZXlUeXBlKGtleSk7CisJCQlpZiAoS2V5UGFpclByb3ZpZGVyLlNTSF9FRDI1NTE5LmVxdWFscyhrZXlUeXBlKSkgeworCQkJCS8vIEFwYWNoZSBNSU5BIHNzaGQgMi44LjAgbGFja3Mgc3VwcG9ydCBmb3Igd3JpdGluZyBlZDI1NTE5CisJCQkJLy8gcHJpdmF0ZSBrZXlzIHRvIGEgYnVmZmVyLgorCQkJCXB1dEVkMjU1MTlLZXkobXNnLCBrZXkpOworCQkJfSBlbHNlIHsKKwkJCQltc2cucHV0S2V5UGFpcihrZXkpOworCQkJfQorCQkJbXNnLnB1dFN0cmluZyhjb21tZW50ID09IG51bGwgPyAiIiA6IGNvbW1lbnQpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoY29uc3RyYWludHMgIT0gbnVsbCkgeworCQkJCWZvciAoU3NoQWdlbnRLZXlDb25zdHJhaW50IGNvbnN0cmFpbnQgOiBjb25zdHJhaW50cykgeworCQkJCQljb25zdHJhaW50LnB1dChtc2cpOworCQkJCX0KKwkJCX0KKwkJCWlmIChkZWJ1Z2dpbmcpIHsKKwkJCQlMT0cuZGVidWcoCisJCQkJCQkiYWRkSWRlbnRpdHk6IGFkZGluZyB7fSBrZXkge30gdG8gU1NIIGFnZW50OyBjb21tZW50IHt9IiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJa2V5VHlwZSwgS2V5VXRpbHMuZ2V0RmluZ2VyUHJpbnQoa2V5LmdldFB1YmxpYygpKSwKKwkJCQkJCWNvbW1lbnQpOworCQkJfQorCQkJbWVzc2FnZSA9IG1zZy5nZXRDb21wYWN0RGF0YSgpOworCQl9IGZpbmFsbHkgeworCQkJLy8gVGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIHByaXZhdGUga2V5IGRhdGEsIHNvIGNsZWFyIGludGVybWVkaWFyeQorCQkJLy8gZGF0YSBBU0FQLgorCQkJbXNnLmNsZWFyKCk7CisJCX0KKwkJQnVmZmVyIHJlcGx5OworCQl0cnkgeworCQkJcmVwbHkgPSBycGMoY21kLCBtZXNzYWdlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCUFycmF5cy5maWxsKG1lc3NhZ2UsIChieXRlKSAwKTsKKwkJfQorCQlpbnQgcmVwbHlMZW5ndGggPSByZXBseS5hdmFpbGFibGUoKTsKKwkJaWYgKHJlcGx5TGVuZ3RoICE9IDEpIHsKKwkJCXRocm93IG5ldyBTc2hFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCVNzaGRUZXh0LmdldCgpLnNzaEFnZW50UmVwbHlVbmV4cGVjdGVkLAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFBheWxvYWRMZW5ndGhFcnJvciwKKwkJCQkJCQlJbnRlZ2VyLnZhbHVlT2YoMSksIEludGVnZXIudmFsdWVPZihyZXBseUxlbmd0aCkpKSk7CisKKwkJfQorCQljbWQgPSByZXBseS5nZXRCeXRlKCk7CisJCWlmIChjbWQgIT0gU3NoQWdlbnRDb25zdGFudHMuU1NIX0FHRU5UX1NVQ0NFU1MpIHsKKwkJCXRocm93IG5ldyBTc2hFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNzaGRUZXh0LmdldCgpLnNzaEFnZW50UmVwbHlVbmV4cGVjdGVkLAorCQkJCQkJCVNzaEFnZW50Q29uc3RhbnRzLmdldENvbW1hbmRNZXNzYWdlTmFtZShjbWQpKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBXcml0ZXMgYW4gZWQyNTUxOSB7QGxpbmsgS2V5UGFpcn0gdG8gYSB7QGxpbmsgQnVmZmVyfS4gT3BlblNTSCBzcGVjaWZpZXMKKwkgKiB0aGF0IGl0IGV4cGVjdHMgdGhlIDMyIHB1YmxpYyBrZXkgYnl0ZXMsIGZvbGxvd2VkIGJ5IDY0IGJ5dGVzIGZvcm1lZCBieQorCSAqIGNvbmNhdGVuYXRpbmcgdGhlIDMyIHByaXZhdGUga2V5IGJ5dGVzIHdpdGggdGhlIDMyIHB1YmxpYyBrZXkgYnl0ZXMuCisJICoKKwkgKiBAcGFyYW0gbXNnCisJICogICAgICAgICAgICB7QGxpbmsgQnVmZmVyfSB0byB3cml0ZSB0bworCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHtAbGluayBLZXlQYWlyfSB0byB3cml0ZQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgcHJpdmF0ZSBrZXkgY2Fubm90IGJlIHdyaXR0ZW4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHB1dEVkMjU1MTlLZXkoQnVmZmVyIG1zZywgS2V5UGFpciBrZXkpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlCdWZmZXIgdG1wID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigzNik7CisJCXRtcC5wdXRSYXdQdWJsaWNLZXlCeXRlcyhrZXkuZ2V0UHVibGljKCkpOworCQlieXRlW10gcHVibGljQnl0ZXMgPSB0bXAuZ2V0Qnl0ZXMoKTsKKwkJbXNnLnB1dFN0cmluZyhLZXlQYWlyUHJvdmlkZXIuU1NIX0VEMjU1MTkpOworCQltc2cucHV0Qnl0ZXMocHVibGljQnl0ZXMpOworCQkvLyBOZXh0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSAzMiBieXRlIHByaXZhdGUga2V5IHZhbHVlIHdpdGggdGhlCisJCS8vIDMyIGJ5dGVzIG9mIHRoZSBwdWJsaWMga2V5LgorCQlQcml2YXRlS2V5IHBrID0ga2V5LmdldFByaXZhdGUoKTsKKwkJU3RyaW5nIGZvcm1hdCA9IHBrLmdldEZvcm1hdCgpOworCQlpZiAoISJQS0NTIzgiLmVxdWFsc0lnbm9yZUNhc2UoZm9ybWF0KSkgeyAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KFNzaGRUZXh0LmdldCgpLnNzaEFnZW50RWREU0FGb3JtYXRFcnJvciwgZm9ybWF0KSk7CisJCX0KKwkJYnl0ZVtdIHByaXZhdGVCeXRlcyA9IG51bGw7CisJCWJ5dGVbXSBlbmNvZGVkID0gcGsuZ2V0RW5jb2RlZCgpOworCQl0cnkgeworCQkJcHJpdmF0ZUJ5dGVzID0gYXNuMVBhcnNlKGVuY29kZWQsIDMyKTsKKwkJCWJ5dGVbXSBjb21iaW5lZCA9IEFycmF5cy5jb3B5T2YocHJpdmF0ZUJ5dGVzLCA2NCk7CisJCQlBcnJheXMuZmlsbChwcml2YXRlQnl0ZXMsIChieXRlKSAwKTsKKwkJCXByaXZhdGVCeXRlcyA9IGNvbWJpbmVkOworCQkJU3lzdGVtLmFycmF5Y29weShwdWJsaWNCeXRlcywgMCwgcHJpdmF0ZUJ5dGVzLCAzMiwgMzIpOworCQkJbXNnLnB1dEJ5dGVzKHByaXZhdGVCeXRlcyk7CisJCX0gZmluYWxseSB7CisJCQlpZiAocHJpdmF0ZUJ5dGVzICE9IG51bGwpIHsKKwkJCQlBcnJheXMuZmlsbChwcml2YXRlQnl0ZXMsIChieXRlKSAwKTsKKwkJCX0KKwkJCUFycmF5cy5maWxsKGVuY29kZWQsIChieXRlKSAwKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEV4dHJhY3RzIHRoZSBwcml2YXRlIGtleSBieXRlcyBmcm9tIGFuIGVuY29kZWQgZWQyNTUxOSBwcml2YXRlIGtleSBieQorCSAqIHBhcnNpbmcgdGhlIGJ5dGVzIGFzIEFTTi4xIGFjY29yZGluZyB0byBSRkMgNTk1OCAoUEtDUyAjOCBlbmNvZGluZyk6CisJICoKKwkgKiA8cHJlPgorCSAqIE9uZUFzeW1tZXRyaWNLZXkgOjo9IFNFUVVFTkNFIHsKKwkgKiAgIHZlcnNpb24gVmVyc2lvbiwKKwkgKiAgIHByaXZhdGVLZXlBbGdvcml0aG0gUHJpdmF0ZUtleUFsZ29yaXRobUlkZW50aWZpZXIsCisJICogICBwcml2YXRlS2V5IFByaXZhdGVLZXksCisJICogICAuLi4KKwkgKiB9CisJICoKKwkgKiBWZXJzaW9uIDo6PSBJTlRFR0VSCisJICogUHJpdmF0ZUtleUFsZ29yaXRobUlkZW50aWZpZXIgOjo9IEFsZ29yaXRobUlkZW50aWZpZXIKKwkgKiBQcml2YXRlS2V5IDo6PSBPQ1RFVCBTVFJJTkcKKwkgKgorCSAqIEFsZ29yaXRobUlkZW50aWZpZXIgIDo6PSAgU0VRVUVOQ0UgIHsKKwkgKiAgIGFsZ29yaXRobSAgIE9CSkVDVCBJREVOVElGSUVSLAorCSAqICAgcGFyYW1ldGVycyAgQU5ZIERFRklORUQgQlkgYWxnb3JpdGhtIE9QVElPTkFMCisJICogfQorCSAqIDwvcHJlPgorCSAqIDxwPgorCSAqIGFuZCBSRkMgODQxMDogIi4uLiB3aGVuIGVuY29kaW5nIGEgT25lQXN5bW1ldHJpY0tleSBvYmplY3QsIHRoZSBwcml2YXRlCisJICoga2V5IGlzIHdyYXBwZWQgaW4gYSBDdXJ2ZVByaXZhdGVLZXkgb2JqZWN0IGFuZCB3cmFwcGVkIGJ5IHRoZSBPQ1RFVAorCSAqIFNUUklORyBvZiB0aGUgJ3ByaXZhdGVLZXknIGZpZWxkLiIKKwkgKiA8L3A+CisJICoKKwkgKiA8cHJlPgorCSAqIEN1cnZlUHJpdmF0ZUtleSA6Oj0gT0NURVQgU1RSSU5HCisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gZW5jb2RlZAorCSAqICAgICAgICAgICAgZW5jb2RlZCBwcml2YXRlIGtleSB0byBleHRyYWN0IHRoZSBwcml2YXRlIGtleSBieXRlcyBmcm9tCisJICogQHBhcmFtIG4KKwkgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBleHBlY3RlZAorCSAqIEByZXR1cm4gdGhlIGV4dHJhY3RlZCBwcml2YXRlIGtleSBieXRlczsgb2YgbGVuZ3RoIHtAY29kZSBufQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgcHJpdmF0ZSBrZXkgY2Fubm90IGJlIGV4dHJhY3RlZAorCSAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU5NTgiPlJGQyA1OTU4PC9hPgorCSAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzg0MTAiPlJGQyA4NDEwPC9hPgorCSAqLworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBhc24xUGFyc2UoYnl0ZVtdIGVuY29kZWQsIGludCBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlieXRlW10gcHJpdmF0ZUtleSA9IG51bGw7CisJCXRyeSAoREVSUGFyc2VyIGJ5dGVQYXJzZXIgPSBuZXcgREVSUGFyc2VyKGVuY29kZWQpOworCQkJCURFUlBhcnNlciBvbmVBc3ltbWV0cmljS2V5ID0gYnl0ZVBhcnNlci5yZWFkT2JqZWN0KCkKKwkJCQkJCS5jcmVhdGVQYXJzZXIoKSkgeworCQkJb25lQXN5bW1ldHJpY0tleS5yZWFkT2JqZWN0KCk7IC8vIHNraXAgdmVyc2lvbgorCQkJb25lQXN5bW1ldHJpY0tleS5yZWFkT2JqZWN0KCk7IC8vIHNraXAgYWxnb3JpdGhtIGlkZW50aWZpZXIKKwkJCXByaXZhdGVLZXkgPSBvbmVBc3ltbWV0cmljS2V5LnJlYWRPYmplY3QoKS5nZXRWYWx1ZSgpOworCQkJLy8gVGhlIGxhc3QgbiBieXRlcyBvZiB0aGlzIG11c3QgYmUgdGhlIHByaXZhdGUga2V5IGJ5dGVzCisJCQlyZXR1cm4gQXJyYXlzLmNvcHlPZlJhbmdlKHByaXZhdGVLZXksCisJCQkJCXByaXZhdGVLZXkubGVuZ3RoIC0gbiwgcHJpdmF0ZUtleS5sZW5ndGgpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHByaXZhdGVLZXkgIT0gbnVsbCkgeworCQkJCUFycmF5cy5maWxsKHByaXZhdGVLZXksIChieXRlKSAwKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEEgc2FmZSB2ZXJzaW9uIG9mIHtAbGluayBCdWZmZXIjZ2V0UHVibGljS2V5KCl9LiBVcG9uIHJldHVybiB0aGUKKwkgKiBidWZmZXJzJ3MgcmVhZCBwb3NpdGlvbiBpcyBhbHdheXMgYWZ0ZXIgdGhlIGtleSBibG9iOyBhbnkgZXhjZXB0aW9ucworCSAqIHRocm93biBieSB0cnlpbmcgdG8gcmVhZCB0aGUga2V5IGFyZSBsb2dnZWQgYW5kIDxlbT5ub3Q8L2VtPiBwcm9wYWdhdGVkLgorCSAqIDxwPgorCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYW4gU1NIIGFnZW50IG1pZ2h0IGNvbnRhaW4gYW5kIGRlbGl2ZXIga2V5cyB0aGF0CisJICogd2UgY2Fubm90IGhhbmRsZSAoZm9yIGluc3RhbmNlIGVkNDQ4IGtleXMpLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBidWZmZXIKKwkgKiAgICAgICAgICAgIHRvIHJlYWQgdGhlIGtleSBmcm9tCisJICogQHJldHVybiB0aGUge0BsaW5rIFB1YmxpY0tleX0sIG9yIHtAY29kZSBudWxsfSBpZiB0aGUga2V5IGNvdWxkIG5vdCBiZQorCSAqICAgICAgICAgcmVhZAorCSAqIEB0aHJvd3MgQnVmZmVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGJsb2IgY2Fubm90IGJlIHJlYWQgb3IgaXMgY29ycnVwdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgUHVibGljS2V5IHJlYWRLZXkoQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIEJ1ZmZlckV4Y2VwdGlvbiB7CisJCWludCBlbmRPZkJ1ZmZlciA9IGJ1ZmZlci53cG9zKCk7CisJCWludCBrZXlMZW5ndGggPSBidWZmZXIuZ2V0SW50KCk7CisJCWludCBhZnRlcktleSA9IGJ1ZmZlci5ycG9zKCkgKyBrZXlMZW5ndGg7CisJCWlmIChrZXlMZW5ndGggPD0gMCB8fCBhZnRlcktleSA+IGVuZE9mQnVmZmVyKSB7CisJCQl0aHJvdyBuZXcgQnVmZmVyRXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFdyb25nS2V5TGVuZ3RoLAorCQkJCQkJCUludGVnZXIudG9TdHJpbmcoa2V5TGVuZ3RoKSwKKwkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGJ1ZmZlci5ycG9zKCkpLAorCQkJCQkJCUludGVnZXIudG9TdHJpbmcoZW5kT2ZCdWZmZXIpKSk7CisJCX0KKwkJLy8gTGltaXQgc3Vic2VxdWVudCByZWFkcyB0byB0aGUgcHVibGljIGtleSBibG9iCisJCWJ1ZmZlci53cG9zKGFmdGVyS2V5KTsKKwkJdHJ5IHsKKwkJCXJldHVybiBidWZmZXIuZ2V0UmF3UHVibGljS2V5KEJ1ZmZlclB1YmxpY0tleVBhcnNlci5ERUZBVUxUKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPRy53YXJuKFNzaGRUZXh0LmdldCgpLnNzaEFnZW50VW5rbm93bktleSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIFJlc3RvcmUgcmVhbCBidWZmZXIgZW5kCisJCQlidWZmZXIud3BvcyhlbmRPZkJ1ZmZlcik7CisJCQkvLyBTZXQgdGhlIHJlYWQgcG9zaXRpb24gdG8gYWZ0ZXIgdGhpcyBrZXksIGV2ZW4gaWYgZmFpbGVkCisJCQlidWZmZXIucnBvcyhhZnRlcktleSk7CisJCX0KKwl9CisKIAlwcml2YXRlIEJ1ZmZlciBycGMoYnl0ZSBjb21tYW5kLCBieXRlW10gbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBCeXRlQXJyYXlCdWZmZXIoY29ubmVjdG9yLnJwYyhjb21tYW5kLCBtZXNzYWdlKSk7CiAJfQpAQCAtMjMwLDExICs0NjQsNiBAQCBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkSWRlbnRpdHkoS2V5UGFpciBrZXksIFN0cmluZyBjb21tZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCByZW1vdmVJZGVudGl0eShQdWJsaWNLZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9Tc2hkU2Vzc2lvbi5qYXZhCmluZGV4IGMyNzBiNDQuLmI3NDJmNWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9Tc2hkU2Vzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9Tc2hkU2Vzc2lvbi5qYXZhCkBAIC01MSw2ICs1MSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNmdHAuY29tbW9uLlNmdHBFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2guT3BlblNzaENvbmZpZ0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5KR2l0U3NoQ2xpZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuU3NoZFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuRnRwQ2hhbm5lbDsKQEAgLTEzOCw3ICsxMzksMTEgQEAgcHJpdmF0ZSBDbGllbnRTZXNzaW9uIGNvbm5lY3QoVVJJaXNoIHRhcmdldCwgTGlzdDxVUklpc2g+IGp1bXBzLAogCQkJCQkJSkdpdFNzaENsaWVudC5MT0NBTF9GT1JXQVJEX0FERFJFU1MsCiAJCQkJCQlwb3J0Rm9yd2FyZC5nZXRCb3VuZEFkZHJlc3MoKSk7CiAJCQl9Ci0JCQlyZXN1bHRTZXNzaW9uID0gY29ubmVjdChob3N0Q29uZmlnLCBjb250ZXh0LCB0aW1lb3V0KTsKKwkJCWludCB0aW1lb3V0SW5TZWMgPSBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygKKwkJCQkJaG9zdENvbmZpZy5nZXRQcm9wZXJ0eShTc2hDb25zdGFudHMuQ09OTkVDVF9USU1FT1VUKSk7CisJCQlyZXN1bHRTZXNzaW9uID0gY29ubmVjdChob3N0Q29uZmlnLCBjb250ZXh0LAorCQkJCQl0aW1lb3V0SW5TZWMgPiAwID8gRHVyYXRpb24ub2ZTZWNvbmRzKHRpbWVvdXRJblNlYykKKwkJCQkJCQk6IHRpbWVvdXQpOwogCQkJaWYgKHByb3h5U2Vzc2lvbiAhPSBudWxsKSB7CiAJCQkJZmluYWwgUG9ydEZvcndhcmRpbmdUcmFja2VyIHRyYWNrZXIgPSBwb3J0Rm9yd2FyZDsKIAkJCQlmaW5hbCBDbGllbnRTZXNzaW9uIHBTZXNzaW9uID0gcHJveHlTZXNzaW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDUyZTY5YmQuLjRhMDg5NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTggKzMsMTggQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBjb20uamNyYWZ0LmpzY2g7dmVyc2lvbj0iWzAuMS41NCwwLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoLmpzY2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoLmpzY2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9wb20ueG1sCmluZGV4IDZmMTk5ZTYuLmNhMWU3NDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZWQ5OTdmYi4uMzMyZDk4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2g7c2luZ2xldG9uOj10cnVlCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5qZ2l0O2J1bmRsZS12ZXJzaW9uPSJbNi4wLjEsNi4xLjApIgorRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuamdpdDtidW5kbGUtdmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoLmpzY2g7dmVyc2lvbj0iNi4wLjEiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoLmpzY2g7dmVyc2lvbj0iNi4xLjEiCiBJbXBvcnQtUGFja2FnZTogY29tLmpjcmFmdC5qc2NoO3ZlcnNpb249IlswLjEuMzcsMC4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLnNsZjRqO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDNjM2YyYjEuLmI1NmJiN2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2ggLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaDt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2g7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvcG9tLnhtbAppbmRleCAyYTVmOWI4Li4zYjZkNjZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5zc2guanNjaDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9CVUlMRCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9CVUlMRAppbmRleCA5ZTc4N2ZlLi42ZjZjODhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvQlVJTEQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L0JVSUxECkBAIC0xMyw2ICsxMyw3IEBACiApICsgW1BLRyArIGMgZm9yIGMgaW4gWwogICAgICJhcGkvQWJzdHJhY3RSZW1vdGVDb21tYW5kVGVzdC5qYXZhIiwKICAgICAiZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhIiwKKyAgICAiaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0Q2FzZS5qYXZhIiwKICAgICAiaW50ZXJuYWwvcmV2d2Fsay9PYmplY3RSZWFjaGFiaWxpdHlUZXN0Q2FzZS5qYXZhIiwKICAgICAiaW50ZXJuYWwvcmV2d2Fsay9SZWFjaGFiaWxpdHlDaGVja2VyVGVzdENhc2UuamF2YSIsCiAgICAgImludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDA0NjkxMTMuLjU4MTM5NWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0xNiw2MCArMTYsNjEgQEAKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMuZ3ppcDt2ZXJzaW9uPSJbMS4xNS4wLDIuMCkiLAogIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5jb21wcmVzc29ycy54ejt2ZXJzaW9uPSJbMS4xNS4wLDIuMCkiLAogIG9yZy5hc3NlcnRqLmNvcmUuYXBpO3ZlcnNpb249IlszLjE0LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmZzY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5jb25uZWN0aXZpdHk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5wYXJzZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC50aW1lO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubG9nZ2luZzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wYXRjaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LmNvbm5lY3Rpdml0eTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnBhcnNlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sb2dnaW5nO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3Q7dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvbGxlY3Rpb247dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCmluZGV4IDNjYWIzNjIuLjZiNjY5MTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCkBAIC0xOSw3ICsxOSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQppbmRleCA4NjczMTBiLi41ODRkMTQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtNDAyLDcgKzQwMyw5IEBAIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlXKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEFkZE0xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoIk0xIiwgZmFsc2UsIHRydWUpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKS5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydFRydWUoRlMuREVURUNURUQuY2FuRXhlY3V0ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKSk7CisJCX0KIAkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJNMSIpLAogCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOwogCX0KQEAgLTQxMSw3ICs0MTQsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0QWRkTTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gaW5pdCgiTTIiLCB0cnVlLCB0cnVlKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkuY2FuRXhlY3V0ZSgpKTsKKwkJaWYgKEZTLkRFVEVDVEVELnN1cHBvcnRzRXhlY3V0ZSgpKSB7CisJCQlhc3NlcnRUcnVlKEZTLkRFVEVDVEVELmNhbkV4ZWN1dGUocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSkpOworCQl9CiAJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiTTIiKSwKIAkJCQliLmdldFN0cmluZygwLCBiLnNpemUoKSwgZmFsc2UpKTsKIAl9CkBAIC00MjAsNyArNDI1LDEwIEBAIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNMigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNMygpIHRocm93cyBFeGNlcHRpb24gewogCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJNMyIsIHRydWUsIHRydWUpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkuY2FuRXhlY3V0ZSgpKTsKKwkJaWYgKEZTLkRFVEVDVEVELnN1cHBvcnRzRXhlY3V0ZSgpKSB7CisJCQlhc3NlcnRGYWxzZSgKKwkJCQkJRlMuREVURUNURUQuY2FuRXhlY3V0ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKSk7CisJCX0KIAkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJNMyIpLAogCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQppbmRleCBlN2VkMTAyLi44N2JlODEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCkBAIC03MSw2ICs3MSw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIEdpdCBzZXRVcFJlcG9XaXRoUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJlcG9zaXRvcnkgcmVtb3RlUmVwb3NpdG9yeSA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKHJlbW90ZVJlcG9zaXRvcnkpOwogCQl0cnkgKEdpdCByZW1vdGVHaXQgPSBuZXcgR2l0KHJlbW90ZVJlcG9zaXRvcnkpKSB7CiAJCQkvLyBjb21taXQgc29tZXRoaW5nCiAJCQl3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCAiSGVsbG8gd29ybGQiKTsKQEAgLTg1LDYgKzg2LDcgQEAgcHJpdmF0ZSBHaXQgc2V0VXBSZXBvV2l0aFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJcnVwLmZvcmNlVXBkYXRlKCk7CiAKIAkJCVJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJCWFkZFJlcG9Ub0Nsb3NlKGxvY2FsUmVwb3NpdG9yeSk7CiAJCQlHaXQgbG9jYWxHaXQgPSBuZXcgR2l0KGxvY2FsUmVwb3NpdG9yeSk7CiAJCQlTdG9yZWRDb25maWcgY29uZmlnID0gbG9jYWxSZXBvc2l0b3J5LmdldENvbmZpZygpOwogCQkJUmVtb3RlQ29uZmlnIHJjID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJvcmlnaW4iKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlY2tvdXRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEKaW5kZXggZTUyMDczMi4uYWIwMTg0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEKQEAgLTI5Miw2ICsyOTIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRBbm5vdGF0ZWRUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDaGVja291dFJlbW90ZVRyYWNraW5nV2l0aFVwc3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlUmVwb3NpdG9yeVdpdGhSZW1vdGUoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAogCQlHaXQud3JhcChkYjIpLmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoInRlc3QiKQogCQkJCS5zZXRTdGFydFBvaW50KCJvcmlnaW4vdGVzdCIpCkBAIC0zMTEsNiArMzEyLDcgQEAgcHVibGljIHZvaWQgdGVzdENoZWNrb3V0UmVtb3RlVHJhY2tpbmdXaXRoVXBzdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDaGVja291dFJlbW90ZVRyYWNraW5nV2l0aG91dExvY2FsQnJhbmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlUmVwb3NpdG9yeVdpdGhSZW1vdGUoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAogCQkvLyBjaGVja291dCByZW1vdGUgdHJhY2tpbmcgYnJhbmNoIGluIHNlY29uZCByZXBvc2l0b3J5CiAJCS8vIChubyBsb2NhbCBicmFuY2hlcyBleGlzdCB5ZXQgaW4gc2Vjb25kIHJlcG9zaXRvcnkpCkBAIC04NjgsNyArODcwLDcgQEAgcHVibGljIHZvaWQgdGVzdE5vbkRlbGV0YWJsZUZpbGVzT25XaW5kb3dzKCkKIAkJCWNvQ29tbWFuZC5zZXROYW1lKGNydWRDb21taXQuZ2V0TmFtZSgpKS5jYWxsKCk7CiAJCQlDaGVja291dFJlc3VsdCByZXN1bHQgPSBjb0NvbW1hbmQuZ2V0UmVzdWx0KCk7CiAJCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk5PTkRFTEVURUQsIHJlc3VsdC5nZXRTdGF0dXMoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIltUZXN0LnR4dCwgdG9CZURlbGV0ZWQudHh0XSIsCisJCQlhc3NlcnRFcXVhbHMoIlt0b0JlRGVsZXRlZC50eHRdIiwKIAkJCQkJcmVzdWx0LmdldFJlbW92ZWRMaXN0KCkudG9TdHJpbmcoKSk7CiAJCQlhc3NlcnRFcXVhbHMoIlt0b0JlQ3JlYXRlZC50eHQsIHRvQmVNb2RpZmllZC50eHRdIiwKIAkJCQkJcmVzdWx0LmdldE1vZGlmaWVkTGlzdCgpLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKaW5kZXggZjRmMGVjZC4uMGQzODE5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCkBAIC0xNzUsNyArMTc1LDggQEAgcHVibGljIHZvaWQgdGVzdENoZXJyeVBpY2tDb25mbGljdFJlc29sdXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQkJYXNzZXJ0RXF1YWxzKENoZXJyeVBpY2tTdGF0dXMuQ09ORkxJQ1RJTkcsIHJlc3VsdC5nZXRTdGF0dXMoKSk7CiAJCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuTUVSR0VfTVNHKS5leGlzdHMoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoInNpZGVcblxuQ29uZmxpY3RzOlxuXHRhXG4iLCBkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisJCQlhc3NlcnRFcXVhbHMoInNpZGVcblxuIyBDb25mbGljdHM6XG4jXHRhXG4iLAorCQkJCQlkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CiAJCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuQ0hFUlJZX1BJQ0tfSEVBRCkKIAkJCQkJLmV4aXN0cygpKTsKIAkJCWFzc2VydEVxdWFscyhzaWRlQ29tbWl0LmdldElkKCksIGRiLnJlYWRDaGVycnlQaWNrSGVhZCgpKTsKQEAgLTIwNyw3ICsyMDgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlcnJ5UGlja0NvbmZsaWN0UmVzb2x1dGlvbk5vQ29tbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICI8PDw8PDw8IG1hc3RlclxuYShtYXN0ZXIpXG49PT09PT09XG5hKHNpZGUpXG4+Pj4+Pj4+IDUyNzQ2MGEgc2lkZVxuIjsKIAkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZWFkKCJhIikpOwogCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuTUVSR0VfTVNHKS5leGlzdHMoKSk7Ci0JCWFzc2VydEVxdWFscygic2lkZVxuXG5Db25mbGljdHM6XG5cdGFcbiIsIGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzaWRlXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQlhc3NlcnRGYWxzZShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLkNIRVJSWV9QSUNLX0hFQUQpCiAJCQkJLmV4aXN0cygpKTsKIAkJYXNzZXJ0RXF1YWxzKFJlcG9zaXRvcnlTdGF0ZS5TQUZFLCBkYi5nZXRSZXBvc2l0b3J5U3RhdGUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKaW5kZXggODA4NDUwNS4uMzVkZTczZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZmxvZ0VudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZS5TdWJtb2R1bGVXYWxrOwpAQCAtNTE1LDYgKzUxNiw2MiBAQCBwdWJsaWMgdm9pZCBjb21taXRBbWVuZFdpdGhBdXRob3JTaG91bGRVc2VJdCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgY29tbWl0TWVzc2FnZVZlcmJhdGltKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTEiLCAiZmlsZTEiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZTEiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0dGVkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIiNpbml0aWFsIGNvbW1pdCIpCisJCQkJCS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygiI2luaXRpYWwgY29tbWl0IiwgY29tbWl0dGVkLmdldEZ1bGxNZXNzYWdlKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21taXRNZXNzYWdlU3RyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmaWxlMSIsICJmaWxlMSIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXR0ZWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgKKwkJCQkJIiNDb21tZW50XG5pbml0aWFsIGNvbW1pdFx0XG5cbiBjb21taXQgYm9keSBcbiBcdCNhbm90aGVyIGNvbW1lbnQiKQorCQkJCQkuc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUuU1RSSVApLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJpbml0aWFsIGNvbW1pdFxuXG4gY29tbWl0IGJvZHkiLAorCQkJCQljb21taXR0ZWQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbW1pdE1lc3NhZ2VEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTEiLCAiZmlsZTEiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZTEiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0dGVkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoCisJCQkJCSIjQ29tbWVudFxuaW5pdGlhbCBjb21taXRcdFxuXG4gY29tbWl0IGJvZHkgXG5cblxuIFx0I2Fub3RoZXIgY29tbWVudCAgIikKKwkJCQkJLnNldENsZWFudXBNb2RlKENsZWFudXBNb2RlLkRFRkFVTFQpLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJpbml0aWFsIGNvbW1pdFxuXG4gY29tbWl0IGJvZHkiLAorCQkJCQljb21taXR0ZWQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbW1pdE1lc3NhZ2VEZWZhdWx0V2hpdGVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJd3JpdGVUcmFzaEZpbGUoImZpbGUxIiwgImZpbGUxIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUxIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdHRlZCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKAorCQkJCQkiI0NvbW1lbnRcbmluaXRpYWwgY29tbWl0XHRcblxuIGNvbW1pdCBib2R5IFxuXG5cbiBcdCNhbm90aGVyIGNvbW1lbnQgICIpCisJCQkJCS5zZXRDbGVhbnVwTW9kZShDbGVhbnVwTW9kZS5ERUZBVUxUKS5zZXREZWZhdWx0Q2xlYW4oZmFsc2UpCisJCQkJCS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIiNDb21tZW50XG5pbml0aWFsIGNvbW1pdFxuXG4gY29tbWl0IGJvZHlcblxuIFx0I2Fub3RoZXIgY29tbWVudCIsCisJCQkJCWNvbW1pdHRlZC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJfQorCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgY29tbWl0RW1wdHlDb21taXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggYjQ2MGUzZi4uYWI4N2ZhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKQEAgLTEwLDkgKzEwLDEwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CkBAIC0xMDAsNiArMTAxLDEyIEBAIHB1YmxpYyB2b2lkIHRlc3REZXNjcmliZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0yLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhbGljZSoiKSk7CiAJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOwogCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYSoiLCAiYioiLCAiYyoiKSk7CisKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAwKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAxKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAtMTApKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzU1OTI3OTA1ZjIxZTNiYzdjMDBhM2Q4M2EzMWJmNGVkM2EiLAorCQkJCQlkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDUwKSk7CiAJCX0gZWxzZSB7CiAJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKIAkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMykpOwpAQCAtMTA4LDYgKzExNSwxOCBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydEVxdWFscygiMzc0N2RiMyIsIGRlc2NyaWJlKGMyLCBmYWxzZSwgdHJ1ZSkpOwogCQkJYXNzZXJ0RXF1YWxzKCI0NDU3OWViIiwgZGVzY3JpYmUoYzMsIGZhbHNlLCB0cnVlKSk7CiAJCQlhc3NlcnRFcXVhbHMoIjNlNTYzYzUiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUpKTsKKworCQkJYXNzZXJ0RXF1YWxzKCIzNzQ3ZGIzMjY3IiwgZGVzY3JpYmUoYzIsIGZhbHNlLCB0cnVlLCAxMCkpOworCQkJYXNzZXJ0RXF1YWxzKCI0NDU3OWViZTdmIiwgZGVzY3JpYmUoYzMsIGZhbHNlLCB0cnVlLCAxMCkpOworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2M2M1NTkyIiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAxMCkpOworCisJCQlhc3NlcnRFcXVhbHMoIjNlNTYiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIC0xMCkpOworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAwKSk7CisJCQlhc3NlcnRFcXVhbHMoIjNlNTYiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDIpKTsKKwkJCWFzc2VydEVxdWFscygiM2U1NjNjNTU5Mjc5MDVmMjFlM2JjN2MwMGEzZDgzYTMxYmY0ZWQzYSIsCisJCQkJCWRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgNDApKTsKKwkJCWFzc2VydEVxdWFscygiM2U1NjNjNTU5Mjc5MDVmMjFlM2JjN2MwMGEzZDgzYTMxYmY0ZWQzYSIsCisJCQkJCWRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgNDIpKTsKIAkJfQogCiAJCS8vIHRlc3QgZGVmYXVsdCB0YXJnZXQKQEAgLTQ3NCwxMCArNDkzLDE1IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgdG91Y2goRmlsZSBmLCBTdHJpbmcgY29udGVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIGJvb2xlYW4gbG9uZ0Rlc2MsIGJvb2xlYW4gYWx3YXlzLAorCQkJaW50IGFiYnJldikgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRUYWdzKGRlc2NyaWJlVXNlQWxsVGFncykKKwkJCQkuc2V0TG9uZyhsb25nRGVzYykuc2V0QWx3YXlzKGFsd2F5cykuc2V0QWJicmV2KGFiYnJldikuY2FsbCgpOworCX0KKwogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBib29sZWFuIGxvbmdEZXNjLCBib29sZWFuIGFsd2F5cykKIAkJCXRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0VGFncyhkZXNjcmliZVVzZUFsbFRhZ3MpCi0JCQkJLnNldExvbmcobG9uZ0Rlc2MpLnNldEFsd2F5cyhhbHdheXMpLmNhbGwoKTsKKwkJcmV0dXJuIGRlc2NyaWJlKGMxLCBsb25nRGVzYywgYWx3YXlzLCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpOwogCX0KIAogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFJlcG9zaXRvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFJlcG9zaXRvcnlUZXN0LmphdmEKaW5kZXggZDBkZmQxYS4uYjkzN2IxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xSZXBvc2l0b3J5VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sUmVwb3NpdG9yeVRlc3QuamF2YQpAQCAtMSw0MCArMSwxMSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgSXZhbiBNb3RzY2ggPGl2YW4ubW90c2NoQGJzaWFnLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNSwgMjAyMiBJdmFuIE1vdHNjaCA8aXZhbi5tb3RzY2hAYnNpYWcuY29tPiBhbmQgb3RoZXJzCiAgKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCiAgKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIApAQCAtMTczLDE1ICsxNDQsMjIgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWN0dWFsRW50cnkgewogCiAJcHJpdmF0ZSBEaXJDYWNoZSBkaXJDYWNoZTsKIAorCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRDckxmKCkgeworCQlTdHJpbmcgZW9sID0gbW9ja1N5c3RlbVJlYWRlci5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKwkJcmV0dXJuICJcclxuIi5lcXVhbHMoZW9sKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gZm9yIEVPTCB0byB3b3JrLCB0aGUgdGV4dCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQKIAkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChudWxsLCBudWxsLCBudWxsLCBudWxsLCAiKiB0ZXh0PWF1dG8iKTsKIAkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoInRleHQ9YXV0byIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKKwkJLy8gZW9sPW5hdGl2ZSBpcyB0aGUgZGVmYXVsdCEKKwkJU3RyaW5nIGV4cGVjdGVkID0gaXNEZWZhdWx0Q3JMZigpID8gQ09OVEVOVF9DUkxGIDogQ09OVEVOVF9MRjsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOwogCX0KIAogCXB1YmxpYyB2b2lkIGNoZWNrRW50cnlDb250ZW50KEFjdHVhbEVudHJ5IGVudHJ5LCBTdHJpbmcgZmlsZUNvbnRlbnQsCkBAIC0xOTksOSArMTc3LDExIEBAIHB1YmxpYyB2b2lkIHRlc3RfQ29uZmlnQXV0b0NSTEZfZmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChBdXRvQ1JMRi5GQUxTRSwgbnVsbCwgbnVsbCwgbnVsbCwgIiogdGV4dD1hdXRvIik7CiAJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ0ZXh0PWF1dG8iLCBlbnRyeUNSTEYuYXR0cnMpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCS8vIGVvbD1uYXRpdmUgaXMgdGhlIGRlZmF1bHQhCisJCVN0cmluZyBleHBlY3RlZCA9IGlzRGVmYXVsdENyTGYoKSA/IENPTlRFTlRfQ1JMRiA6IENPTlRFTlRfTEY7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdApAQCAtMjUwLDM0ICsyMzAsMjQgQEAgcHVibGljIHZvaWQgdGVzdF9Db25maWdFT0xfY3JsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0X0NvbmZpZ0VPTF9uYXRpdmVfd2luZG93cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb3JpZ0xpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXHJcbiIpOwotCQl0cnkgewotCQkJLy8gZm9yIEVPTCB0byB3b3JrLCB0aGUgdGV4dCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQKLQkJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQobnVsbCwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKLQkJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKLQkJCWFzc2VydEVxdWFscygidGV4dCIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCX0gZmluYWxseSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgb3JpZ0xpbmVTZXBhcmF0b3IpOwotCQl9CisJCW1vY2tTeXN0ZW1SZWFkZXIuc2V0V2luZG93cygpOworCQkvLyBmb3IgRU9MIHRvIHdvcmssIHRoZSB0ZXh0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldAorCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KG51bGwsIEVPTC5OQVRJVkUsICIqLnR4dCB0ZXh0IiwgbnVsbCwgbnVsbCk7CisJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0NSTEYsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0NSTEYsIENPTlRFTlRfTEYpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdF9Db25maWdFT0xfbmF0aXZlX3huaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG9yaWdMaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0JCXRyeSB7Ci0JCQkvLyBmb3IgRU9MIHRvIHdvcmssIHRoZSB0ZXh0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldAotCQkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChudWxsLCBFT0wuTkFUSVZFLCAiKi50eHQgdGV4dCIsIG51bGwsIG51bGwpOwotCQkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKLQkJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCBvcmlnTGluZVNlcGFyYXRvcik7Ci0JCX0KKwkJbW9ja1N5c3RlbVJlYWRlci5zZXRVbml4KCk7CisJCS8vIGZvciBFT0wgdG8gd29yaywgdGhlIHRleHQgYXR0cmlidXRlIG11c3QgYmUgc2V0CisJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQobnVsbCwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKKwkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdApAQCAtMjk3LDkgKzI2NywxMCBAQCBwdWJsaWMgdm9pZCB0ZXN0X0NvbmZpZ0F1dG9DUkxGX2ZhbHNlX0NvbmZpZ0VPTF9uYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChBdXRvQ1JMRi5GQUxTRSwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKIAkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCVN0cmluZyBleHBlY3RlZCA9IGlzRGVmYXVsdENyTGYoKSA/IENPTlRFTlRfQ1JMRiA6IENPTlRFTlRfTEY7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdApAQCAtNTI0LDkgKzQ5NSwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0X0dsb2JhbEVPTF9sZl9JbmZvRU9MX3Vuc3BlY19Sb290RU9MX2NybGYoKQogCQkvLyBpbmZvIG92ZXJyaWRlcyBhbGwKIAkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCS8vICFlb2wgbWVhbnMgdW5zcGVjaWZpZWQsIHNvIHVzZSB0aGUgZGVmYXVsdCBvZiBjb3JlLmVvbCwgd2hpY2ggaXMKKwkJLy8gbmF0aXZlLgorCQlTdHJpbmcgZXhwZWN0ZWQgPSBpc0RlZmF1bHRDckxmKCkgPyBDT05URU5UX0NSTEYgOiBDT05URU5UX0xGOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hBbmRQdWxsQ29tbWFuZHNSZWN1cnNlU3VibW9kdWxlc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hBbmRQdWxsQ29tbWFuZHNSZWN1cnNlU3VibW9kdWxlc1Rlc3QuamF2YQppbmRleCAzNmJhN2NlLi45ZWE2NGVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQW5kUHVsbENvbW1hbmRzUmVjdXJzZVN1Ym1vZHVsZXNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaEFuZFB1bGxDb21tYW5kc1JlY3Vyc2VTdWJtb2R1bGVzVGVzdC5qYXZhCkBAIC0yNTksNyArMjU5LDggQEAgcHJpdmF0ZSBSZXZDb21taXQgdXBkYXRlU3VibW9kdWxlUmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gdGhlIGNvbW1pdCB0aGF0IHdhcyBjcmVhdGVkCiAJCXRyeSAoU3VibW9kdWxlV2FsayB3ID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChnaXQuZ2V0UmVwb3NpdG9yeSgpKSkgewogCQkJYXNzZXJ0VHJ1ZSh3Lm5leHQoKSk7Ci0JCQl0cnkgKEdpdCBnID0gbmV3IEdpdCh3LmdldFJlcG9zaXRvcnkoKSkpIHsKKwkJCXRyeSAoUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gdy5nZXRSZXBvc2l0b3J5KCk7CisJCQkJCUdpdCBnID0gbmV3IEdpdChyZXBvc2l0b3J5KSkgewogCQkJCWcuZmV0Y2goKS5zZXRSZW1vdGUoUkVNT1RFKS5zZXRSZWZTcGVjcyhSRUZTUEVDKS5jYWxsKCk7CiAJCQkJZy5yZXNldCgpLnNldE1vZGUoUmVzZXRUeXBlLkhBUkQpLnNldFJlZihjb21taXQxLm5hbWUoKSkuY2FsbCgpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQppbmRleCBiYzRlOTQwLi42NDQ3NWY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQpAQCAtNTU0LDcgKzU1NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWdpdC5tZXJnZSgpLmluY2x1ZGUoc2lkZUJyYW5jaCkKIAkJCQkJLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkuY2FsbCgpOwogCi0JCQlhc3NlcnRFcXVhbHMoIk1lcmdlIGJyYW5jaCAnc2lkZSdcblxuQ29uZmxpY3RzOlxuXHRhXG4iLAorCQkJYXNzZXJ0RXF1YWxzKCJNZXJnZSBicmFuY2ggJ3NpZGUnXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwKIAkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQl9CiAKQEAgLTE3ODcsNyArMTc4Nyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTcXVhc2hNZXJnZUNvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJCQkJKyBkYXRlRm9ybWF0dGVyLmZvcm1hdERhdGUodGhpcmQKIAkJCQkJCQkJCS5nZXRBdXRob3JJZGVudCgpKSArICJcblxuXHR0aGlyZCBjb21taXRcbiIsCiAJCQkJCWRiLnJlYWRTcXVhc2hDb21taXRNc2coKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlxuQ29uZmxpY3RzOlxuXHRmaWxlMlxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJcbiMgQ29uZmxpY3RzOlxuI1x0ZmlsZTJcbiIsIGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKIAogCQkJU3RhdHVzIHN0YXQgPSBnaXQuc3RhdHVzKCkuY2FsbCgpOwogCQkJYXNzZXJ0RXF1YWxzKFNldHMub2YoImZpbGUyIiksIHN0YXQuZ2V0Q29uZmxpY3RpbmcoKSk7CkBAIC0xODgxLDYgKzE4ODEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RmFzdEZvcndhcmRPbmx5Tm90UG9zc2libGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXJnZVdpdGhDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGRiX3QgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwogCQkJUmV2Q29tbWl0IG0wID0gbWFzdGVyLmNvbW1pdCgpCiAJCQkJCS5hZGQoImYiLCAiMVxuMlxuM1xuNFxuNVxuNlxuN1xuOFxuOVxuIikubWVzc2FnZSgibTAiKQpAQCAtMjAxMiw3ICsyMDEzLDcgQEAgcHVibGljIHZvaWQgdGVzdE1lcmdlQ29uZmxpY3RXaXRoTWVzc2FnZU9wdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCiAJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5jYWxsKCk7CiAKLQkJCWFzc2VydEVxdWFscygidXNlciBtZXNzYWdlXG5cbkNvbmZsaWN0czpcblx0YVxuIiwKKwkJCWFzc2VydEVxdWFscygidXNlciBtZXNzYWdlXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwKIAkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKaW5kZXggOWFmNzdhYS4uNmE4NGYwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCkBAIC01NjcsNiArNTY3LDcgQEAgcHJpdmF0ZSB2b2lkIGRvVGVzdFB1bGxXaXRoUmViYXNlKENhbGxhYmxlPFB1bGxSZXN1bHQ+IHB1bGxTZXR1cCwKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOwogCQlkYlRhcmdldCA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiVGFyZ2V0KTsKIAkJc291cmNlID0gbmV3IEdpdChkYik7CiAJCXRhcmdldCA9IG5ldyBHaXQoZGJUYXJnZXQpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhCmluZGV4IGNjZTA0ZjQuLmUyZDc5MjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhCkBAIC0zMjMsNiArMzIzLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZGJUYXJnZXQgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOwogCQlzb3VyY2UgPSBuZXcgR2l0KGRiKTsKIAkJdGFyZ2V0ID0gbmV3IEdpdChkYlRhcmdldCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiVGFyZ2V0KTsKIAogCQkvLyBwdXQgc29tZSBmaWxlIGluIHRoZSBzb3VyY2UgcmVwbwogCQlzb3VyY2VGaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIlNvbWVGaWxlLnR4dCIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKaW5kZXggYTc4NjA2NS4uNmY3YWE2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCkBAIC0xMCw3ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMTksMTAgKzIxLDEzIEBACiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkRldGFjaGVkSGVhZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ob29rcy5QcmVQdXNoSG9vazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkpHaXRUZXN0VXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKQEAgLTMyLDYgKzM3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaERlZmF1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaFJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZMZWFzZVNwZWM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmU3BlYzsKQEAgLTUwLDYgKzU2LDcgQEAgcHVibGljIHZvaWQgdGVzdFB1c2goKSB0aHJvd3MgSkdpdEludGVybmFsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKIAogCQkvLyBjcmVhdGUgb3RoZXIgcmVwb3NpdG9yeQogCQlSZXBvc2l0b3J5IGRiMiA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiMik7CiAJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcyID0gZGIyLmdldENvbmZpZygpOwogCiAJCS8vIHRoaXMgdGVzdHMgdGhhdCB0aGlzIGNvbmZpZyBjYW4gYmUgcGFyc2VkIHByb3Blcmx5CkBAIC0yODksNiArMjk2LDc3MCBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaFdpdGhvdXRQdXNoUmVmU3BlYygpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaGluZyBmcm9tIGEgZGV0YWNoZWQgSEVBRCB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGEKKwkgKiBEZXRhY2hlZEhlYWRFeGNlcHRpb24uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0RGV0YWNoZWRIZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJZmluYWwgU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZShjb21taXQuZ2V0TmFtZSgpKS5jYWxsKCk7CisJCQlTdHJpbmcgaGVhZCA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0RnVsbEJyYW5jaCgpOworCQkJYXNzZXJ0VHJ1ZShPYmplY3RJZC5pc0lkKGhlYWQpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0TmFtZSgpLCBoZWFkKTsKKwkJCWFzc2VydFRocm93cyhEZXRhY2hlZEhlYWRFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PW5vdGhpbmcgd2l0aG91dCByZWZzcGVjIHRocm93cyBhbgorCSAqIEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdE5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5OT1RISU5HKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9bWF0Y2hpbmcgd2l0aG91dCByZWZzcGVjIHB1c2hlcyBhbGwgbWF0Y2hpbmcKKwkgKiBicmFuY2hlcy4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRNYXRjaGluZygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCS8vIHB1c2ggbWFzdGVyIGFuZCBicmFuY2h0b3B1c2gKKwkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UmVmU3BlY3MoCisJCQkJCW5ldyBSZWZTcGVjKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciIpLAorCQkJCQluZXcgUmVmU3BlYygKKwkJCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2g6cmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSkKKwkJCQkJLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCS8vIENyZWF0ZSB0d28gZGlmZmVyZW50IGNvbW1pdHMgb24gdGhlc2UgdHdvIGJyYW5jaGVzCisJCQl3cml0ZVRyYXNoRmlsZSgiYiIsICJvbiBicmFuY2h0b3B1c2giKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBiQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm9uIGJyYW5jaHRvcHVzaCIpCisJCQkJCS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgibSIsICJvbiBtYXN0ZXIiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigibSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBtQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm9uIG1hc3RlciIpLmNhbGwoKTsKKwkJCS8vIE5vdyBwdXNoIHdpdGggbW9kZSAibWF0Y2hpbmciOiBzaG91bGQgcHVzaCBib3RoIGJyYW5jaGVzLgorCQkJSXRlcmFibGU8UHVzaFJlc3VsdD4gcmVzdWx0ID0gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuTUFUQ0hJTkcpCisJCQkJCS5jYWxsKCk7CisJCQlpbnQgbiA9IDA7CisJCQlmb3IgKFB1c2hSZXN1bHQgciA6IHJlc3VsdCkgeworCQkJCW4rKzsKKwkJCQlhc3NlcnRFcXVhbHMoMSwgbik7CisJCQkJYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0UmVtb3RlVXBkYXRlcygpLnNpemUoKSk7CisJCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdXBkYXRlIDogci5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKKwkJCQkJYXNzZXJ0RmFsc2UodXBkYXRlLmlzTWF0Y2hpbmcoKSk7CisJCQkJCWFzc2VydFRydWUodXBkYXRlLmdldFNyY1JlZigpCisJCQkJCQkJLmVxdWFscygicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKQorCQkJCQkJCXx8IHVwZGF0ZS5nZXRTcmNSZWYoKS5lcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJCQlhc3NlcnRFcXVhbHMoUmVtb3RlUmVmVXBkYXRlLlN0YXR1cy5PSywgdXBkYXRlLmdldFN0YXR1cygpKTsKKwkJCQl9CisJCQl9CisJCQlhc3NlcnRFcXVhbHMoYkNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobUNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhiQ29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhtQ29tbWl0LmdldElkKCksCisJCQkJCWdpdC5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD11cHN0cmVhbSB3aXRob3V0IHJlZnNwZWMgcHVzaGVzIG9ubHkgdGhlIGN1cnJlbnQKKwkgKiBicmFuY2ggdG8gdGhlIGNvbmZpZ3VyZWQgdXBzdHJlYW0uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0VXBzdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9dXBzdHJlYW0gd2l0aG91dCByZWZzcGVjIHRocm93cyBhbgorCSAqIEludmFsaWRSZWZOYW1lRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBoYXMgbm8gdXBzdHJlYW0uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0VXBzdHJlYW1Ob1RyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD11cHN0cmVhbSB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGFuCisJICogSW52YWxpZFJlZk5hbWVFeGNlcHRpb24gaWYgdGhlIHB1c2ggcmVtb3RlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZmV0Y2gKKwkgKiByZW1vdGUuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0VXBzdHJlYW1Ucmlhbmd1bGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQkvLyBEb24ndCBjb25maWd1cmUgYSByZW1vdGU7IGl0J2xsIGRlZmF1bHQgdG8gIm9yaWdpbiIuCisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInVwc3RyZWFtYnJhbmNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD1zaW1wbGUgd2l0aG91dCByZWZzcGVjIHB1c2hlcyBvbmx5IHRoZSBjdXJyZW50CisJICogYnJhbmNoIHRvIHRoZSBjb25maWd1cmVkIHVwc3RyZWFtIG5hbWUuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuU0lNUExFKQorCQkJCQkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9c2ltcGxlIHdpdGhvdXQgcmVmc3BlYyBwdXNoZXMgb25seSB0aGUgY3VycmVudAorCSAqIGJyYW5jaCB0byBhIGJyYW5jaCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gYSB0cmlhbmd1bGFyIHdvcmtmbG93LgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFNpbXBsZVRyaWFuZ3VsYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQkvLyBEb24ndCBzZXQgcmVtb3RlLCBpdCdsbCBkZWZhdWx0IHRvICJvcmlnaW4iLiBDb25maWd1cmUgYQorCQkJLy8gZGlmZmVyZW50IGJyYW5jaCBuYW1lOyBzaG91bGQgYmUgaWdub3JlZC4KKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5TSU1QTEUpCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXNpbXBsZSB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGFuCisJICogSW52YWxpZFJlZk5hbWVFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGhhcyBubyB1cHN0cmVhbS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRTaW1wbGVOb1RyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuU0lNUExFKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9c2ltcGxlIHdpdGhvdXQgcmVmc3BlYyB0aHJvd3MgYW4KKwkgKiBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBicmFuY2ggaGFzIGFuIHVwc3RyZWFtIHdpdGggYQorCSAqIGRpZmZlcmVudCBuYW1lLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFNpbXBsZURpZmZlcmVudFRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5TSU1QTEUpLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGlmIG5vIFB1c2hEZWZhdWx0IGlzIHNldCwgdGhlIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgZ2l0CisJICogY29uZmlnLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdEZyb21Db25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNldFN0cmluZygicHVzaCIsIG51bGwsICJkZWZhdWx0IiwgInVwc3RyZWFtIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJUHVzaENvbW1hbmQgY21kID0gZ2l0LnB1c2goKTsKKwkJCWNtZC5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChudWxsKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuVVBTVFJFQU0sIGNtZC5nZXRQdXNoRGVmYXVsdCgpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGlmIG5vIFB1c2hEZWZhdWx0IGlzIHNldCBhbmQgbm9uZSBpcyBzZXQgaW4gdGhlIGdpdCBjb25maWcsIGl0CisJICogZGVmYXVsdHMgdG8gInNpbXBsZSIuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0RnJvbUNvbmZpZ0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJUHVzaENvbW1hbmQgY21kID0gZ2l0LnB1c2goKTsKKwkJCWNtZC5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChudWxsKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuU0lNUExFLCBjbWQuZ2V0UHVzaERlZmF1bHQoKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGJyYW5jaC48bmFtZT4ucHVzaFJlbW90ZSBvdmVycmlkZXMgYW55dGhpbmcgZWxzZS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoUHVzaFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2V0U3RyaW5nKCJyZW1vdGUiLCBudWxsLCAicHVzaERlZmF1bHQiLCAidGVzdCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicHVzaHJlbW90ZSIsICJvcmlnaW4iKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gZ2l0LnB1c2goKQorCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHJlbW90ZS5wdXNoRGVmYXVsdCBvdmVycmlkZXMgYnJhbmNoLjxuYW1lPi5yZW1vdGUKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3RlUHVzaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNldFN0cmluZygicmVtb3RlIiwgbnVsbCwgInB1c2hEZWZhdWx0IiwgIm9yaWdpbiIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gZ2l0LnB1c2goKQorCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHVsdGltYXRlbHkgd2UgZmFsbCBiYWNrIHRvICJvcmlnaW4iLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlQdXNoQ29tbWFuZCBjbWQgPSBnaXQucHVzaCgpLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlVQU1RSRUFNKTsKKwkJCVRyYW5zcG9ydEV4Y2VwdGlvbiBlID0gYXNzZXJ0VGhyb3dzKFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gY21kLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMoTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmNsYXNzLAorCQkJCQllLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisJCQlhc3NlcnRFcXVhbHMoIm9yaWdpbiIsIGNtZC5nZXRSZW1vdGUoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGEgcHVzaCB3aXRob3V0IHNwZWNpZnlpbmcgYSByZW1vdGUgb3IgbW9kZSBvciBhbnl0aGluZyBjYW4KKwkgKiBzdWNjZWVkIGlmIHRoZSBnaXQgY29uZmlnIGlzIGNvcnJlY3QuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRQdXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCS8vIFNob3VsZCB1c2UgcmVtb3RlICJ0ZXN0IiwgcHVzaC5kZWZhdWx0PWN1cnJlbnQKKwkJCVB1c2hDb21tYW5kIGNtZCA9IGdpdC5wdXNoKCk7CisJCQljbWQuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgY21kLmdldFJlbW90ZSgpKTsKKwkJCWFzc2VydEVxdWFscyhQdXNoRGVmYXVsdC5DVVJSRU5ULCBjbWQuZ2V0UHVzaERlZmF1bHQoKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKIAkgKiBDaGVjayB0aGF0IG1pc3NpbmcgcmVmcyBkb24ndCBjYXVzZSBlcnJvcnMgZHVyaW5nIHB1c2gKIAkgKgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCkBAIC0yOTcsNiArMTA2OCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoV2l0aG91dFB1c2hSZWZTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFB1c2hBZnRlckdDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSBvdGhlciByZXBvc2l0b3J5CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAogCQkvLyBzZXR1cCB0aGUgZmlyc3QgcmVwb3NpdG9yeQogCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CkBAIC0zNjAsNiArMTEzMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoV2l0aExlYXNlKCkgdGhyb3dzIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCiAKIAkJLy8gY3JlYXRlIG90aGVyIHJlcG9zaXRvcnkKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCiAJCS8vIHNldHVwIHRoZSBmaXJzdCByZXBvc2l0b3J5CiAJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQppbmRleCA4NjIzOTAyLi5jNjRmZjBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCkBAIC0yOTI3LDggKzI5MjcsOCBAQCBwdWJsaWMgU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIGNvbW1pdCkgewogCQl9CiAJfQogCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhCbGFua0xpbmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHNpbXBsZUZpeHVwKFN0cmluZyBmaXJzdE1lc3NhZ2UsIFN0cmluZyBzZWNvbmRNZXNzYWdlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSBmaWxlMSBvbiBtYXN0ZXIKIAkJd3JpdGVUcmFzaEZpbGUoRklMRTEsIEZJTEUxKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKEZJTEUxKS5jYWxsKCk7CkBAIC0yOTM4LDEzICsyOTM4LDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gY3JlYXRlIGZpbGUyIG9uIG1hc3RlcgogCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTIiLCAiZmlsZTIiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMiIpLmNhbGwoKTsKLQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkFkZCBmaWxlMiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoZmlyc3RNZXNzYWdlKS5jYWxsKCk7CiAJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZpbGUyIikuZXhpc3RzKCkpOwogCiAJCS8vIHVwZGF0ZSBGSUxFMSBvbiBtYXN0ZXIKIAkJd3JpdGVUcmFzaEZpbGUoRklMRTEsICJibGFoIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihGSUxFMSkuY2FsbCgpOwotCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgidXBkYXRlZCBmaWxlMSBvbiBtYXN0ZXJcblxuc29tZSB0ZXh0IikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShzZWNvbmRNZXNzYWdlKS5jYWxsKCk7CiAKIAkJZ2l0LnJlYmFzZSgpLnNldFVwc3RyZWFtKCJIRUFEfjIiKQogCQkJCS5ydW5JbnRlcmFjdGl2ZWx5KG5ldyBJbnRlcmFjdGl2ZUhhbmRsZXIoKSB7CkBAIC0yOTY4LDkgKzI5NjgsMzEgQEAgcHVibGljIFN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBjb21taXQpIHsKIAkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhkYikpIHsKIAkJCU9iamVjdElkIGhlYWRJZCA9IGRiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwogCQkJUmV2Q29tbWl0IGhlYWRDb21taXQgPSB3YWxrLnBhcnNlQ29tbWl0KGhlYWRJZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkFkZCBmaWxlMiIsCi0JCQkJCWhlYWRDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCQlhc3NlcnRFcXVhbHMoZmlyc3RNZXNzYWdlLCBoZWFkQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpOwogCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2ltcGxlRml4dXAoIkFkZCBmaWxlMiIsICJ1cGRhdGVkIGZpbGUxIG9uIG1hc3RlclxuXG5zb21lIHRleHQiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNpbXBsZUZpeHVwKCJBZGQgZmlsZTJcblxuQm9keVxuIiwKKwkJCQkidXBkYXRlZCBmaWxlMSBvbiBtYXN0ZXJcblxuc29tZSB0ZXh0Iik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhIYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNpbXBsZUZpeHVwKCIjQWRkIGZpbGUyIiwgInVwZGF0ZWQgZmlsZTEgb24gbWFzdGVyIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhIYXNoMigpIHRocm93cyBFeGNlcHRpb24geworCQlzaW1wbGVGaXh1cCgiI0FkZCBmaWxlMlxuXG5IZWFkZXIgaGFzIGhhc2hcbiIsCisJCQkJIiN1cGRhdGVkIGZpbGUxIG9uIG1hc3RlciIpOwogCX0KIAogCUBUZXN0KGV4cGVjdGVkID0gSW52YWxpZFJlYmFzZVN0ZXBFeGNlcHRpb24uY2xhc3MpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKaW5kZXggY2ZhODQ4Ni4uMWM3YjhkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTY2LDcgKzE2Nyw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnRNdWx0aXBsZVdpdGhGYWlsKCkgdGhyb3dzIElPRXhjZXB0aW9uLAogCiAJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImEiKSwgImZpcnN0XG4iCiAJCQkJCSsgIjw8PDw8PDwgbWFzdGVyXG4iICsgInNlY29uZFxuIiArICJ0aGlyZFxuIiArICI9PT09PT09XG4iCi0JCQkJCSsgIj4+Pj4+Pj4gIiArIHNlY29uZENvbW1pdC5nZXRJZCgpLmFiYnJldmlhdGUoNykubmFtZSgpCisJCQkJCSsgIj4+Pj4+Pj4gIgorCQkJCQkrIHNlY29uZENvbW1pdC5nZXRJZCgpCisJCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKS5uYW1lKCkKIAkJCQkJKyAiIGFkZCBzZWNvbmRcbiIpOwogCQkJSXRlcmF0b3I8UmV2Q29tbWl0PiBoaXN0b3J5ID0gZ2l0LmxvZygpLmNhbGwoKS5pdGVyYXRvcigpOwogCQkJUmV2Q29tbWl0IHJldmVydENvbW1pdCA9IGhpc3RvcnkubmV4dCgpOwpAQCAtMjMyLDcgKzIzNSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnRDb25mbGljdFJlc29sdXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5NRVJHRV9NU0cpLmV4aXN0cygpKTsKIAkJCWFzc2VydEVxdWFscygiUmV2ZXJ0IFwiIiArIHNpZGVDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCkKIAkJCQkJKyAiXCJcblxuVGhpcyByZXZlcnRzIGNvbW1pdCAiICsgc2lkZUNvbW1pdC5nZXRJZCgpLmdldE5hbWUoKQotCQkJCQkrICIuXG5cbkNvbmZsaWN0czpcblx0YVxuIiwKKwkJCQkJKyAiLlxuXG4jIENvbmZsaWN0czpcbiNcdGFcbiIsCiAJCQkJCWRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5SRVZFUlRfSEVBRCkKIAkJCQkJLmV4aXN0cygpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3RhdHVzQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3RhdHVzQ29tbWFuZFRlc3QuamF2YQppbmRleCA1MzExZWRiLi4xOTI4MWY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXR1c0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGF0dXNDb21tYW5kVGVzdC5qYXZhCkBAIC0yMSw4ICsyMSwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Ob0ZpbGVwYXR0ZXJuRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vV29ya1RyZWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TZXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5GaWxlUmVwb3NpdG9yeUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0xODEsNCArMTgzLDMxIEBAIHB1YmxpYyB2b2lkIHRlc3RGb2xkZXJQcmVmaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbW1pdHRlZEdpdFJlcG9BbmRQYXRoRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbW1pdEZpbGUoImZpbGUudHh0IiwgImZpbGUiLCAibWFzdGVyIik7CisJCXRyeSAoUmVwb3NpdG9yeSBpbm5lciA9IG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQorCQkJCS5zZXRXb3JrVHJlZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAic3ViZ2l0IikpLmJ1aWxkKCkpIHsKKwkJCWlubmVyLmNyZWF0ZSgpOworCQkJd3JpdGVUcmFzaEZpbGUoInN1YmdpdC9zdWIudHh0IiwgInN1YiIpOworCQkJdHJ5IChHaXQgb3V0ZXJHaXQgPSBuZXcgR2l0KGRiKTsgR2l0IGlubmVyR2l0ID0gbmV3IEdpdChpbm5lcikpIHsKKwkJCQlpbm5lckdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigic3ViLnR4dCIpLmNhbGwoKTsKKwkJCQlpbm5lckdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJJbm5lciBjb21taXQiKS5jYWxsKCk7CisJCQkJb3V0ZXJHaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oInN1YmdpdCIpLmNhbGwoKTsKKwkJCQlvdXRlckdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPdXRlciBjb21taXQiKS5jYWxsKCk7CisJCQkJYXNzZXJ0VHJ1ZShpbm5lckdpdC5zdGF0dXMoKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRUcnVlKG91dGVyR2l0LnN0YXR1cygpLmNhbGwoKS5pc0NsZWFuKCkpOworCQkJCXdyaXRlVHJhc2hGaWxlKCJzdWJnaXQvc3ViLnR4dCIsICJzdWIyIik7CisJCQkJYXNzZXJ0RmFsc2UoaW5uZXJHaXQuc3RhdHVzKCkuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0RmFsc2Uob3V0ZXJHaXQuc3RhdHVzKCkuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCW91dGVyR2l0LnN0YXR1cygpLmFkZFBhdGgoImZpbGUudHh0IikuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0VHJ1ZShvdXRlckdpdC5zdGF0dXMoKS5hZGRQYXRoKCJkb2VzbnRleGlzdCIpLmNhbGwoKQorCQkJCQkJLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0RmFsc2UoCisJCQkJCQlvdXRlckdpdC5zdGF0dXMoKS5hZGRQYXRoKCJzdWJnaXQiKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCX0KKwkJfQorCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiOTM4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNJbkFueU9yZGVyOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uQmFyZVN1cGVycHJvamVjdFdyaXRlci5CYXJlV3JpdGVyQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5SZW1vdGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIEJhcmVTdXBlcnByb2plY3RXcml0ZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSEExX0EgPSAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSI7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgd3JpdGVfc2V0R2l0TW9kdWxlc0NvbnRlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoUmVwb3NpdG9yeSBiYXJlUmVwbyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpIHsKKwkJCVJlcG9Qcm9qZWN0IHJlcG9Qcm9qZWN0ID0gbmV3IFJlcG9Qcm9qZWN0KCJzdWJwcm9qZWN0WCIsICJwYXRoL3RvIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNoLXgiLCAicmVtb3RlIiwgIiIpOworCQkJcmVwb1Byb2plY3Quc2V0VXJsKCJodHRwOi8vZXhhbXBsZS5jb20vYSIpOworCisJCQlSZW1vdGVSZWFkZXIgbW9ja1JlbW90ZVJlYWRlciA9IG1vY2soUmVtb3RlUmVhZGVyLmNsYXNzKTsKKwkJCXdoZW4obW9ja1JlbW90ZVJlYWRlci5zaGExKCJodHRwOi8vZXhhbXBsZS5jb20vYSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaC14IikpCisJCQkJCQkJLnRoZW5SZXR1cm4oT2JqZWN0SWQuZnJvbVN0cmluZyhTSEExX0EpKTsKKworCQkJQmFyZVN1cGVycHJvamVjdFdyaXRlciB3ID0gbmV3IEJhcmVTdXBlcnByb2plY3RXcml0ZXIoYmFyZVJlcG8sCisJCQkJCW51bGwsICJyZWZzL2hlYWRzL21hc3RlciIsIGF1dGhvciwgbW9ja1JlbW90ZVJlYWRlciwKKwkJCQkJQmFyZVdyaXRlckNvbmZpZy5nZXREZWZhdWx0KCksIExpc3Qub2YoKSk7CisKKwkJCVJldkNvbW1pdCBjb21taXQgPSB3LndyaXRlKEFycmF5cy5hc0xpc3QocmVwb1Byb2plY3QpKTsKKworCQkJU3RyaW5nIGNvbnRlbnRzID0gcmVhZENvbnRlbnRzKGJhcmVSZXBvLCBjb21taXQsICIuZ2l0bW9kdWxlcyIpOworCQkJTGlzdDxTdHJpbmc+IGNvbnRlbnRMaW5lcyA9IEFycmF5cworCQkJCQkuYXNMaXN0KGNvbnRlbnRzLnNwbGl0KCJcbiIpKTsKKwkJCWFzc2VydFRoYXQoY29udGVudExpbmVzLmdldCgwKSwKKwkJCQkJaXMoIltzdWJtb2R1bGUgXCJzdWJwcm9qZWN0WFwiXSIpKTsKKwkJCWFzc2VydFRoYXQoY29udGVudExpbmVzLnN1Ykxpc3QoMSwgY29udGVudExpbmVzLnNpemUoKSksCisJCQkJCWNvbnRhaW5zSW5BbnlPcmRlcihpcygiXHRicmFuY2ggPSByZWZzL2hlYWRzL2JyYW5jaC14IiksCisJCQkJCQkJaXMoIlx0cGF0aCA9IHBhdGgvdG8iKSwKKwkJCQkJCQlpcygiXHR1cmwgPSBodHRwOi8vZXhhbXBsZS5jb20vYSIpKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHdyaXRlX3NldEV4dHJhQ29udGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChSZXBvc2l0b3J5IGJhcmVSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkgeworCQkJUmVwb1Byb2plY3QgcmVwb1Byb2plY3QgPSBuZXcgUmVwb1Byb2plY3QoInN1YnByb2plY3RYIiwgInBhdGgvdG8iLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2gteCIsICJyZW1vdGUiLCAiIik7CisJCQlyZXBvUHJvamVjdC5zZXRVcmwoImh0dHA6Ly9leGFtcGxlLmNvbS9hIik7CisKKwkJCVJlbW90ZVJlYWRlciBtb2NrUmVtb3RlUmVhZGVyID0gbW9jayhSZW1vdGVSZWFkZXIuY2xhc3MpOworCQkJd2hlbihtb2NrUmVtb3RlUmVhZGVyLnNoYTEoImh0dHA6Ly9leGFtcGxlLmNvbS9hIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNoLXgiKSkKKwkJCQkJCQkudGhlblJldHVybihPYmplY3RJZC5mcm9tU3RyaW5nKFNIQTFfQSkpOworCisJCQlCYXJlU3VwZXJwcm9qZWN0V3JpdGVyIHcgPSBuZXcgQmFyZVN1cGVycHJvamVjdFdyaXRlcihiYXJlUmVwbywKKwkJCQkJbnVsbCwgInJlZnMvaGVhZHMvbWFzdGVyIiwgYXV0aG9yLCBtb2NrUmVtb3RlUmVhZGVyLAorCQkJCQlCYXJlV3JpdGVyQ29uZmlnLmdldERlZmF1bHQoKSwKKwkJCQkJTGlzdC5vZihuZXcgQmFyZVN1cGVycHJvamVjdFdyaXRlci5FeHRyYUNvbnRlbnQoIngiLAorCQkJCQkJCSJleHRyYS1jb250ZW50IikpKTsKKworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHcud3JpdGUoQXJyYXlzLmFzTGlzdChyZXBvUHJvamVjdCkpOworCisJCQlTdHJpbmcgY29udGVudHMgPSByZWFkQ29udGVudHMoYmFyZVJlcG8sIGNvbW1pdCwgIngiKTsKKwkJCWFzc2VydFRoYXQoY29udGVudHMsIGlzKCJleHRyYS1jb250ZW50IikpOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcmVhZENvbnRlbnRzKFJlcG9zaXRvcnkgcmVwbywgUmV2Q29tbWl0IGNvbW1pdCwKKwkJCVN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgcGF0aDsKKwkJT2JqZWN0SWQgbW9kSWQgPSByZXBvLnJlc29sdmUoaWRTdHIpOworCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSByZXBvLm5ld09iamVjdFJlYWRlcigpKSB7CisJCQlyZXR1cm4gbmV3IFN0cmluZygKKwkJCQkJcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKSwKKwkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKaW5kZXggNTA5YWRjMi4uM2U2ZDEzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwpAQCAtNTQ2LDI0ICs1NDcsMjkgQEAgcHVibGljIHZvaWQgdGVzdFJlcG9NYW5pZmVzdENvcHlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdAogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwogCQlhc3NlcnRUcnVlKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgbm90IGJlIGV4ZWN1dGFibGUiLAotCQkJCWhlbGxvLmNhbkV4ZWN1dGUoKSk7CisJCWlmIChGUy5ERVRFQ1RFRC5zdXBwb3J0c0V4ZWN1dGUoKSkgeworCQkJYXNzZXJ0RmFsc2UoIlRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBub3QgYmUgZXhlY3V0YWJsZSIsCisJCQkJCUZTLkRFVEVDVEVELmNhbkV4ZWN1dGUoaGVsbG8pKTsKKwkJfQogCQlhc3NlcnRDb250ZW50cyhoZWxsby50b1BhdGgoKSwgIm1hc3RlciB3b3JsZCIpOwogCQkvLyBUaGUgZGVzdCBmaWxlIHNob3VsZCBhbHNvIGV4aXN0CiAJCWhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIG5vdCBiZSBleGVjdXRhYmxlIiwKLQkJCQloZWxsby5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydEZhbHNlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgbm90IGJlIGV4ZWN1dGFibGUiLAorCQkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKGhlbGxvKSk7CisJCX0KIAkJYXNzZXJ0Q29udGVudHMoaGVsbG8udG9QYXRoKCksICJtYXN0ZXIgd29ybGQiKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZV9leGVjdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc3VtZVRydWUoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpOwogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRlZmF1bHREYikpIHsKIAkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKIAkJCUZpbGUgZiA9IEpHaXRUZXN0VXRpbC53cml0ZVRyYXNoRmlsZShkZWZhdWx0RGIsICJoZWxsby5zaCIsCiAJCQkJCSJjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIGZpbGUiKTsKLQkJCWYuc2V0RXhlY3V0YWJsZSh0cnVlKTsKKwkJCUZTLkRFVEVDVEVELnNldEV4ZWN1dGUoZiwgdHJ1ZSk7CiAJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImhlbGxvLnNoIikuY2FsbCgpOwogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkFkZCBiaW5hcnkgZmlsZSIpLmNhbGwoKTsKIAkJfQpAQCAtNTg4LDcgKzU5NCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZV9leGVjdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdCBhbmQgYmUgYW4gZXhlY3V0YWJsZQogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnNoIik7CiAJCWFzc2VydFRydWUoIlRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlIiwgaGVsbG8uY2FuRXhlY3V0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlIiwKKwkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKGhlbGxvKSk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIoaGVsbG8udG9QYXRoKCksCiAJCQkJVVRGXzgpKSB7CiAJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwpAQCAtNjAwLDcgKzYwNyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZV9leGVjdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiY29weS1oZWxsby5zaCIpOwogCQlhc3NlcnRUcnVlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7CiAJCWFzc2VydFRydWUoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZSIsCi0JCQkJaGVsbG8uY2FuRXhlY3V0ZSgpKTsKKwkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKGhlbGxvKSk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIoaGVsbG8udG9QYXRoKCksCiAJCQkJVVRGXzgpKSB7CiAJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllYmVjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2xUZXN0LmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0RJRkZUT09MX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfR1VJVE9PTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUEFUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFJPTVBUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0aW5nIGV4dGVybmFsIGRpZmYgdG9vbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERpZmZUb29sVGVzdCBleHRlbmRzIEV4dGVybmFsVG9vbFRlc3RDYXNlIHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvb2xOYW1lcygpIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJU2V0PFN0cmluZz4gYWN0dWFsVG9vbE5hbWVzID0gbWFuYWdlci5nZXRUb29sTmFtZXMoKTsKKwkJU2V0PFN0cmluZz4gZXhwZWN0ZWRUb29sTmFtZXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2YgZXh0ZXJuYWwgZGlmZiB0b29sIG5hbWVzIiwKKwkJCQlleHBlY3RlZFRvb2xOYW1lcywgYWN0dWFsVG9vbE5hbWVzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbGxUb29scygpIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJU2V0PFN0cmluZz4gYWN0dWFsVG9vbE5hbWVzID0gbWFuYWdlci5nZXRBdmFpbGFibGVUb29scygpLmtleVNldCgpOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFRvb2xOYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKwkJQ29tbWFuZExpbmVEaWZmVG9vbFtdIGRlZmF1bHRUb29scyA9IENvbW1hbmRMaW5lRGlmZlRvb2wudmFsdWVzKCk7CisJCWZvciAoQ29tbWFuZExpbmVEaWZmVG9vbCBkZWZhdWx0VG9vbCA6IGRlZmF1bHRUb29scykgeworCQkJU3RyaW5nIHRvb2xOYW1lID0gZGVmYXVsdFRvb2wubmFtZSgpOworCQkJZXhwZWN0ZWRUb29sTmFtZXMuYWRkKHRvb2xOYW1lKTsKKwkJfQorCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2YgZXh0ZXJuYWwgZGlmZiB0b29scyIsIGV4cGVjdGVkVG9vbE5hbWVzLAorCQkJCWFjdHVhbFRvb2xOYW1lcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVQcmVkZWZpbmVkVG9vbFBhdGgoKSB7CisJCVN0cmluZyB0b29sTmFtZSA9IENvbW1hbmRMaW5lRGlmZlRvb2wuZ3VpZmZ5Lm5hbWUoKTsKKwkJU3RyaW5nIGN1c3RvbVRvb2xQYXRoID0gIi91c3IvYmluL2VjaG8iOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfQ01ELAorCQkJCSJlY2hvIik7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX1BBVEgsCisJCQkJY3VzdG9tVG9vbFBhdGgpOworCisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHRvb2xzID0gbWFuYWdlci5nZXRVc2VyRGVmaW5lZFRvb2xzKCk7CisJCUV4dGVybmFsRGlmZlRvb2wgZGlmZlRvb2wgPSB0b29scy5nZXQodG9vbE5hbWUpOworCQlhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCB0b29sIFwiIiArIHRvb2xOYW1lICsgIlwiIHRvIGJlIHVzZXIgZGVmaW5lZCIsCisJCQkJZGlmZlRvb2wpOworCisJCVN0cmluZyB0b29sUGF0aCA9IGRpZmZUb29sLmdldFBhdGgoKTsKKwkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBleHRlcm5hbCBkaWZmIHRvb2wgdG8gaGF2ZSBhbiBvdmVycmlkZW4gcGF0aCIsCisJCQkJY3VzdG9tVG9vbFBhdGgsIHRvb2xQYXRoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFRvb2xzKCkgeworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBjdXN0b21Ub29sbmFtZSA9ICJjdXN0b21Ub29sIjsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCisJCQkJQ09ORklHX0tFWV9DTUQsICJlY2hvIik7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIGN1c3RvbVRvb2xuYW1lLAorCQkJCUNPTkZJR19LRVlfUEFUSCwgIi91c3IvYmluL2VjaG8iKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCisJCQkJQ09ORklHX0tFWV9QUk9NUFQsICItLW5vLXByb21wdCIpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX0dVSVRPT0wsICItLW5vLWd1aSIpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERSwgIi0tbm8tdHJ1c3QtZXhpdC1jb2RlIik7CisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCVNldDxTdHJpbmc+IGFjdHVhbFRvb2xOYW1lcyA9IG1hbmFnZXIuZ2V0VXNlckRlZmluZWRUb29scygpLmtleVNldCgpOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFRvb2xOYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKwkJZXhwZWN0ZWRUb29sTmFtZXMuYWRkKGN1c3RvbVRvb2xuYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2V0IG9mIGV4dGVybmFsIGRpZmYgdG9vbHMiLCBleHBlY3RlZFRvb2xOYW1lcywKKwkJCQlhY3R1YWxUb29sTmFtZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5vdEF2YWlsYWJsZVRvb2xzKCkgeworCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldE5vdEF2YWlsYWJsZVRvb2xzKCkua2V5U2V0KCk7CisJCVNldDxTdHJpbmc+IGV4cGVjdGVkVG9vbE5hbWVzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2V0IG9mIG5vdCBhdmFpbGFibGUgZXh0ZXJuYWwgZGlmZiB0b29scyIsCisJCQkJZXhwZWN0ZWRUb29sTmFtZXMsIGFjdHVhbFRvb2xOYW1lcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKworCQlTdHJpbmcgbmV3UGF0aCA9ICIiOworCQlTdHJpbmcgb2xkUGF0aCA9ICIiOworCQlTdHJpbmcgbmV3SWQgPSAiIjsKKwkJU3RyaW5nIG9sZElkID0gIiI7CisJCVN0cmluZyB0b29sTmFtZSA9ICIiOworCQlCb29sZWFuVHJpU3RhdGUgcHJvbXB0ID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQlCb29sZWFuVHJpU3RhdGUgZ3VpID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQlCb29sZWFuVHJpU3RhdGUgdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKworCQlpbnQgZXhwZWN0ZWRDb21wYXJlUmVzdWx0ID0gMDsKKwkJaW50IGNvbXBhcmVSZXN1bHQgPSBtYW5hZ2VyLmNvbXBhcmUobmV3UGF0aCwgb2xkUGF0aCwgbmV3SWQsIG9sZElkLAorCQkJCXRvb2xOYW1lLCBwcm9tcHQsIGd1aSwgdHJ1c3RFeGl0Q29kZSk7CisJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNvbXBhcmUgcmVzdWx0IGZvciBleHRlcm5hbCBkaWZmIHRvb2wiLAorCQkJCWV4cGVjdGVkQ29tcGFyZVJlc3VsdCwgY29tcGFyZVJlc3VsdCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQkvLyB0aGUgZGVmYXVsdCBkaWZmIHRvb2wgaXMgY29uZmlndXJlZCB3aXRob3V0IGEgc3Vic2VjdGlvbgorCQlTdHJpbmcgc3Vic2VjdGlvbiA9IG51bGw7CisJCWNvbmZpZy5zZXRTdHJpbmcoImRpZmYiLCBzdWJzZWN0aW9uLCAidG9vbCIsICJjdXN0b21Ub29sIik7CisKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJQm9vbGVhblRyaVN0YXRlIGd1aSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKwkJU3RyaW5nIGRlZmF1bHRUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBkaWZmdG9vbCB0byBiZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBkaWZmIHRvb2wiLAorCQkJCSJteV9kZWZhdWx0X3Rvb2xuYW1lIiwgZGVmYXVsdFRvb2xOYW1lKTsKKworCQlndWkgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwkJU3RyaW5nIGRlZmF1bHRHdWlUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBkaWZmdG9vbCB0byBiZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBkaWZmIHRvb2wiLAorCQkJCSJteV9ndWlfdG9vbCIsIGRlZmF1bHRHdWlUb29sTmFtZSk7CisKKwkJY29uZmlnLnNldFN0cmluZygiZGlmZiIsIHN1YnNlY3Rpb24sICJndWl0b29sIiwgImN1c3RvbUd1aVRvb2wiKTsKKwkJbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlkZWZhdWx0R3VpVG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJIkV4cGVjdGVkIGNvbmZpZ3VyZWQgZGlmZnRvb2wgdG8gYmUgdGhlIGRlZmF1bHQgZXh0ZXJuYWwgZGlmZiBndWl0b29sIiwKKwkJCQkibXlfZ3VpX3Rvb2wiLCBkZWZhdWx0R3VpVG9vbE5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsVG9vbFRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GU19QT1NJWDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCisvKioKKyAqIEJhc2UgdGVzdCBjYXNlIGZvciBleHRlcm5hbCBtZXJnZSBhbmQgZGlmZiB0b29sIHRlc3RzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxUb29sVGVzdENhc2UgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UID0gImxpbmUxIjsKKworCXByb3RlY3RlZCBGaWxlIGxvY2FsRmlsZTsKKworCXByb3RlY3RlZCBGaWxlIHJlbW90ZUZpbGU7CisKKwlwcm90ZWN0ZWQgRmlsZSBtZXJnZWRGaWxlOworCisJcHJvdGVjdGVkIEZpbGUgYmFzZUZpbGU7CisKKwlwcm90ZWN0ZWQgRmlsZSBjb21tYW5kUmVzdWx0OworCisJQEJlZm9yZQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisKKwkJbG9jYWxGaWxlID0gd3JpdGVUcmFzaEZpbGUoImxvY2FsRmlsZS50eHQiLCBERUZBVUxUX0NPTlRFTlQgKyAiXG4iKTsKKwkJbG9jYWxGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQlyZW1vdGVGaWxlID0gd3JpdGVUcmFzaEZpbGUoInJlbW90ZUZpbGUudHh0IiwgREVGQVVMVF9DT05URU5UICsgIlxuIik7CisJCXJlbW90ZUZpbGUuZGVsZXRlT25FeGl0KCk7CisJCW1lcmdlZEZpbGUgPSB3cml0ZVRyYXNoRmlsZSgibWVyZ2VkRmlsZS50eHQiLCAiIik7CisJCW1lcmdlZEZpbGUuZGVsZXRlT25FeGl0KCk7CisJCWJhc2VGaWxlID0gd3JpdGVUcmFzaEZpbGUoImJhc2VGaWxlLnR4dCIsICIiKTsKKwkJYmFzZUZpbGUuZGVsZXRlT25FeGl0KCk7CisJCWNvbW1hbmRSZXN1bHQgPSB3cml0ZVRyYXNoRmlsZSgiY29tbWFuZFJlc3VsdC50eHQiLCAiIik7CisJCWNvbW1hbmRSZXN1bHQuZGVsZXRlT25FeGl0KCk7CisJfQorCisJQEFmdGVyCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZXMuZGVsZXRlKGxvY2FsRmlsZS50b1BhdGgoKSk7CisJCUZpbGVzLmRlbGV0ZShyZW1vdGVGaWxlLnRvUGF0aCgpKTsKKwkJRmlsZXMuZGVsZXRlKG1lcmdlZEZpbGUudG9QYXRoKCkpOworCQlGaWxlcy5kZWxldGUoYmFzZUZpbGUudG9QYXRoKCkpOworCQlGaWxlcy5kZWxldGUoY29tbWFuZFJlc3VsdC50b1BhdGgoKSk7CisKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3N1bWVQb3NpeFBsYXRmb3JtKCkgeworCQlBc3N1bWUuYXNzdW1lVHJ1ZSgKKwkJCQkiVGhpcyB0ZXN0IGNhbiBydW4gb25seSBpbiBMaW51eCB0ZXN0cyIsCisJCQkJRlMuREVURUNURUQgaW5zdGFuY2VvZiBGU19QT1NJWCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZVRlc3QuamF2YQppbmRleCA0ZjEzMTQwLi5hYjU4OGNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZVRlc3QuamF2YQpAQCAtMTUsMTYgKzE1LDE5IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkxvbmdTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzQmxvY2tDYWNoZUNvbmZpZy5JbmRleEV2ZW50Q29uc3VtZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja0V4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJuZzsKQEAgLTE1NCw2ICsxNTcsMTE5IEBAIHB1YmxpYyB2b2lkIGhhc0NhY2hlSG90TWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCUBUZXN0CisJcHVibGljIHZvaWQgaGFzSW5kZXhFdmVudENvbnN1bWVyT25seUxvYWRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlBdG9taWNJbnRlZ2VyIGxvYWRlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisJCUluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXIgPSBuZXcgSW5kZXhFdmVudENvbnN1bWVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXF1ZXN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgYm9vbGVhbiBjYWNoZUhpdCwKKwkJCQkJbG9uZyBsb2FkTWljcm9zLCBsb25nIGJ5dGVzLAorCQkJCQlEdXJhdGlvbiBsYXN0RXZpY3Rpb25EdXJhdGlvbikgeworCQkJCWFzc2VydEVxdWFscyhQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCksIHBhY2tFeHRQb3MpOworCQkJCWFzc2VydFRydWUoY2FjaGVIaXQpOworCQkJCWFzc2VydFRydWUobGFzdEV2aWN0aW9uRHVyYXRpb24uaXNaZXJvKCkpOworCQkJCWxvYWRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKwkJCX0KKwkJfTsKKworCQlEZnNCbG9ja0NhY2hlLnJlY29uZmlndXJlKG5ldyBEZnNCbG9ja0NhY2hlQ29uZmlnKCkuc2V0QmxvY2tTaXplKDUxMikKKwkJCQkuc2V0QmxvY2tMaW1pdCg1MTIgKiA0KQorCQkJCS5zZXRJbmRleEV2ZW50Q29uc3VtZXIoaW5kZXhFdmVudENvbnN1bWVyKSk7CisJCWNhY2hlID0gRGZzQmxvY2tDYWNoZS5nZXRJbnN0YW5jZSgpOworCisJCURmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbiByZXBvID0gbmV3IERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbigidGVzdCIpOworCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KHJlcG8pOworCQlieXRlW10gY29udGVudCA9IHJuZy5uZXh0Qnl0ZXMoNDI0MjQyKTsKKwkJT2JqZWN0SWQgaWQ7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgaW5zID0gcjEubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgeworCQkJaWQgPSBpbnMuaW5zZXJ0KE9CSl9CTE9CLCBjb250ZW50KTsKKwkJCWlucy5mbHVzaCgpOworCQl9CisKKwkJdHJ5IChPYmplY3RSZWFkZXIgcmRyID0gcjEubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCWJ5dGVbXSBhY3R1YWwgPSByZHIub3BlbihpZCwgT0JKX0JMT0IpLmdldEJ5dGVzKCk7CisJCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY29udGVudCwgYWN0dWFsKSk7CisJCX0KKwkJLy8gQWxsIGNhY2hlIGVudHJpZXMgYXJlIGhvdCBhbmQgY2FjaGUgaXMgYXQgY2FwYWNpdHkuCisJCWFzc2VydFRydWUoTG9uZ1N0cmVhbS5vZihjYWNoZS5nZXRIaXRDb3VudCgpKS5zdW0oKSA+IDApOworCQlhc3NlcnRFcXVhbHMoOTksIGNhY2hlLmdldEZpbGxQZXJjZW50YWdlKCkpOworCisJCUluTWVtb3J5UmVwb3NpdG9yeSByMiA9IG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkocmVwbyk7CisJCWNvbnRlbnQgPSBybmcubmV4dEJ5dGVzKDQyNDI0Mik7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgaW5zID0gcjIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgeworCQkJaW5zLmluc2VydChPQkpfQkxPQiwgY29udGVudCk7CisJCQlpbnMuZmx1c2goKTsKKwkJfQorCQlhc3NlcnRUcnVlKGNhY2hlLmdldEV2aWN0aW9ucygpW1BhY2tFeHQuUEFDSy5nZXRQb3NpdGlvbigpXSA+IDApOworCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0RXZpY3Rpb25zKClbUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpXSk7CisJCWFzc2VydEVxdWFscygxLCBsb2FkZWQuZ2V0KCkpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBoYXNJbmRleEV2ZW50Q29uc3VtZXJMb2FkZWRBbmRFdmljdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUF0b21pY0ludGVnZXIgbG9hZGVkID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwkJQXRvbWljSW50ZWdlciBldmljdGVkID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwkJSW5kZXhFdmVudENvbnN1bWVyIGluZGV4RXZlbnRDb25zdW1lciA9IG5ldyBJbmRleEV2ZW50Q29uc3VtZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlcXVlc3RlZEV2ZW50KGludCBwYWNrRXh0UG9zLCBib29sZWFuIGNhY2hlSGl0LAorCQkJCQlsb25nIGxvYWRNaWNyb3MsIGxvbmcgYnl0ZXMsCisJCQkJCUR1cmF0aW9uIGxhc3RFdmljdGlvbkR1cmF0aW9uKSB7CisJCQkJYXNzZXJ0RXF1YWxzKFBhY2tFeHQuSU5ERVguZ2V0UG9zaXRpb24oKSwgcGFja0V4dFBvcyk7CisJCQkJYXNzZXJ0VHJ1ZShjYWNoZUhpdCk7CisJCQkJYXNzZXJ0VHJ1ZShsYXN0RXZpY3Rpb25EdXJhdGlvbi5pc1plcm8oKSk7CisJCQkJbG9hZGVkLmluY3JlbWVudEFuZEdldCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEV2aWN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgbG9uZyBieXRlcywKKwkJCQkJaW50IHRvdGFsQ2FjaGVIaXRDb3VudCwgRHVyYXRpb24gbGFzdEV2aWN0aW9uRHVyYXRpb24pIHsKKwkJCQlhc3NlcnRFcXVhbHMoUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpLCBwYWNrRXh0UG9zKTsKKwkJCQlhc3NlcnRUcnVlKHRvdGFsQ2FjaGVIaXRDb3VudCA+IDApOworCQkJCWFzc2VydFRydWUobGFzdEV2aWN0aW9uRHVyYXRpb24uaXNaZXJvKCkpOworCQkJCWV2aWN0ZWQuaW5jcmVtZW50QW5kR2V0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gc2hvdWxkUmVwb3J0RXZpY3RlZEV2ZW50KCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCisJCURmc0Jsb2NrQ2FjaGUucmVjb25maWd1cmUobmV3IERmc0Jsb2NrQ2FjaGVDb25maWcoKS5zZXRCbG9ja1NpemUoNTEyKQorCQkJCS5zZXRCbG9ja0xpbWl0KDUxMiAqIDQpCisJCQkJLnNldEluZGV4RXZlbnRDb25zdW1lcihpbmRleEV2ZW50Q29uc3VtZXIpKTsKKwkJY2FjaGUgPSBEZnNCbG9ja0NhY2hlLmdldEluc3RhbmNlKCk7CisKKwkJRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uIHJlcG8gPSBuZXcgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uKCJ0ZXN0Iik7CisJCUluTWVtb3J5UmVwb3NpdG9yeSByMSA9IG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkocmVwbyk7CisJCWJ5dGVbXSBjb250ZW50ID0gcm5nLm5leHRCeXRlcyg0MjQyNDIpOworCQlPYmplY3RJZCBpZDsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSByMS5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCQlpZCA9IGlucy5pbnNlcnQoT0JKX0JMT0IsIGNvbnRlbnQpOworCQkJaW5zLmZsdXNoKCk7CisJCX0KKworCQl0cnkgKE9iamVjdFJlYWRlciByZHIgPSByMS5uZXdPYmplY3RSZWFkZXIoKSkgeworCQkJYnl0ZVtdIGFjdHVhbCA9IHJkci5vcGVuKGlkLCBPQkpfQkxPQikuZ2V0Qnl0ZXMoKTsKKwkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjb250ZW50LCBhY3R1YWwpKTsKKwkJfQorCQkvLyBBbGwgY2FjaGUgZW50cmllcyBhcmUgaG90IGFuZCBjYWNoZSBpcyBhdCBjYXBhY2l0eS4KKwkJYXNzZXJ0VHJ1ZShMb25nU3RyZWFtLm9mKGNhY2hlLmdldEhpdENvdW50KCkpLnN1bSgpID4gMCk7CisJCWFzc2VydEVxdWFscyg5OSwgY2FjaGUuZ2V0RmlsbFBlcmNlbnRhZ2UoKSk7CisKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHIyID0gbmV3IEluTWVtb3J5UmVwb3NpdG9yeShyZXBvKTsKKwkJY29udGVudCA9IHJuZy5uZXh0Qnl0ZXMoNDI0MjQyKTsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSByMi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCQlpbnMuaW5zZXJ0KE9CSl9CTE9CLCBjb250ZW50KTsKKwkJCWlucy5mbHVzaCgpOworCQl9CisJCWFzc2VydFRydWUoY2FjaGUuZ2V0RXZpY3Rpb25zKClbUGFja0V4dC5QQUNLLmdldFBvc2l0aW9uKCldID4gMCk7CisJCWFzc2VydEVxdWFscygxLCBjYWNoZS5nZXRFdmljdGlvbnMoKVtQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCldKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGxvYWRlZC5nZXQoKSk7CisJCWFzc2VydEVxdWFscygxLCBldmljdGVkLmdldCgpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIG5vQ29uY3VycmVuY3lTZXJpYWxpemVkUmVhZHNfb25lUmVwbygpIHRocm93cyBFeGNlcHRpb24gewogCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBjcmVhdGVSZXBvV2l0aEJpdG1hcCgidGVzdCIpOwogCQkvLyBSZXNldCBjYWNoZSB3aXRoIGNvbmN1cnJlbmN5IExldmVsIGF0IDEgaS5lLiBubyBjb25jdXJyZW5jeS4KQEAgLTI2Nyw3ICszODMsNiBAQCBwdWJsaWMgdm9pZCBsb3dDb25jdXJyZW5jeVBhcmFsbGVsUmVhZHNfdHdvUmVwb3NBbmRJbmRleCgpCiAJCWFzc2VydEVxdWFscygyLCBjYWNoZS5nZXRNaXNzQ291bnQoKVswXSk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKIAlAVGVzdAogCXB1YmxpYyB2b2lkIGhpZ2hDb25jdXJyZW5jeVBhcmFsbGVsUmVhZHNfb25lUmVwbygpIHRocm93cyBFeGNlcHRpb24gewogCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBjcmVhdGVSZXBvV2l0aEJpdG1hcCgidGVzdCIpOwpAQCAtMjkwLDYgKzQwNSwzMCBAQCBwdWJsaWMgdm9pZCBoaWdoQ29uY3VycmVuY3lQYXJhbGxlbFJlYWRzX29uZVJlcG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKDEsIGNhY2hlLmdldE1pc3NDb3VudCgpWzBdKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGhpZ2hDb25jdXJyZW5jeVBhcmFsbGVsUmVhZHNfb25lUmVwb1BhcmFsbGVsUmV2ZXJzZUluZGV4KCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBjcmVhdGVSZXBvV2l0aEJpdG1hcCgidGVzdCIpOworCQlyZXNldENhY2hlKCk7CisKKwkJRGZzUmVhZGVyIHJlYWRlciA9IChEZnNSZWFkZXIpIHIxLm5ld09iamVjdFJlYWRlcigpOworCQlyZWFkZXIuZ2V0T3B0aW9ucygpLnNldExvYWRSZXZJbmRleEluUGFyYWxsZWwodHJ1ZSk7CisJCWZvciAoRGZzUGFja0ZpbGUgcGFjayA6IHIxLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgeworCQkJLy8gT25seSBsb2FkIG5vbi1nYXJiYWdlIHBhY2sgd2l0aCBiaXRtYXAuCisJCQlpZiAocGFjay5pc0dhcmJhZ2UoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYXN5bmNSdW4oKCkgLT4gcGFjay5nZXRCaXRtYXBJbmRleChyZWFkZXIpKTsKKwkJCWFzeW5jUnVuKCgpIC0+IHBhY2suZ2V0UGFja0luZGV4KHJlYWRlcikpOworCQkJYXN5bmNSdW4oKCkgLT4gcGFjay5nZXRCaXRtYXBJbmRleChyZWFkZXIpKTsKKwkJfQorCQl3YWl0Rm9yRXhlY3V0b3JQb29sVGVybWluYXRpb24oKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0TWlzc0NvdW50KClbUGFja0V4dC5CSVRNQVBfSU5ERVgub3JkaW5hbCgpXSk7CisJCWFzc2VydEVxdWFscygxLCBjYWNoZS5nZXRNaXNzQ291bnQoKVtQYWNrRXh0LklOREVYLm9yZGluYWwoKV0pOworCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0TWlzc0NvdW50KClbMF0pOworCX0KKwogCXByaXZhdGUgdm9pZCByZXNldENhY2hlKCkgewogCQlyZXNldENhY2hlKDMyKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JhdGNoUmVmVXBkYXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CYXRjaFJlZlVwZGF0ZVRlc3QuamF2YQppbmRleCA2MzU3YTBiLi5kYWY0MzgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JhdGNoUmVmVXBkYXRlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQmF0Y2hSZWZVcGRhdGVUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMuTGlzdGVuZXJIYW5kbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMuUmVmc0NoYW5nZWRMaXN0ZW5lcjsKQEAgLTEyNyw2ICsxMjksNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAKIAkJZGlza1JlcG8gPSBmaWxlUmVwbzsKKwkJYWRkUmVwb1RvQ2xvc2UoZGlza1JlcG8pOwogCQlzZXRMb2dBbGxSZWZVcGRhdGVzKHRydWUpOwogCiAJCWlmICghdXNlUmVmdGFibGUpIHsKQEAgLTExOTAsNyArMTE5Myw4IEBAIHByaXZhdGUgdm9pZCBhc3NlcnRSZWZzKE9iamVjdC4uLiBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGlza1JlcG8uZ2V0UmVmRGF0YWJhc2UoKQotCQkJCS5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCk7CisJCQkJLmdldFJlZnNCeVByZWZpeChSZWZEYXRhYmFzZS5BTEwpLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChSZWY6OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKIAkJUmVmIGFjdHVhbEhlYWQgPSByZWZzLnJlbW92ZShDb25zdGFudHMuSEVBRCk7CiAJCWlmIChhY3R1YWxIZWFkICE9IG51bGwpIHsKIAkJCVN0cmluZyBhY3R1YWxMZWFmTmFtZSA9IGFjdHVhbEhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrVGVzdC5qYXZhCmluZGV4IDZjNzRmMDAuLjZjNzk5MjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFja1Rlc3QuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTMyLDEwICszMywxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKKwogcHVibGljIGNsYXNzIEZpbGVSZWZ0YWJsZVN0YWNrVGVzdCB7CiAKIAlwcml2YXRlIHN0YXRpYyBSZWYgbmV3UmVmKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCkgewpAQCAtMTE1LDkgKzExOCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdGlvbjEwMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGVzdENvbXBhY3Rpb24oMTAyNCk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAidW51c2VkIiB9KQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBtaXNzaW5nUmVmdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ2FuJ3QgZGVsZXRlIGluLXVzZSBmaWxlcyBvbiBXaW5kb3dzLgorCQlhc3N1bWVGYWxzZShTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc1dpbmRvd3MoKSk7CisKIAkJdHJ5IChGaWxlUmVmdGFibGVTdGFjayBzdGFjayA9IG5ldyBGaWxlUmVmdGFibGVTdGFjaygKIAkJCQluZXcgRmlsZShyZWZ0YWJsZURpciwgInJlZnMiKSwgcmVmdGFibGVEaXIsIG51bGwsCiAJCQkJKCkgLT4gbmV3IENvbmZpZygpKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeUJ1aWxkZXJBZnRlck9wZW5Db25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5QnVpbGRlckFmdGVyT3BlbkNvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBiZDMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeUJ1aWxkZXJBZnRlck9wZW5Db25maWdUZXN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAyMyBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLgorICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCitwdWJsaWMgY2xhc3MgRmlsZVJlcG9zaXRvcnlCdWlsZGVyQWZ0ZXJPcGVuQ29uZmlnVGVzdCBleHRlbmRzIEZpbGVSZXBvc2l0b3J5QnVpbGRlclRlc3QgeworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQEJlZm9yZQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCVN0b3JlZENvbmZpZyB1c2VyQ29uZmlnID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0VXNlckNvbmZpZygpOworCQl1c2VyQ29uZmlnLnNldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RfUEFDS0VEX1JFRlNfU1RBVCwKKwkJCQlDb3JlQ29uZmlnLlRydXN0UGFja2VkUmVmc1N0YXQuQUZURVJfT1BFTik7CisJCXVzZXJDb25maWcuc2F2ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEKaW5kZXggYmZiMjMzZi4uNDhmNmUwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAT3ZlcnJpZGUKIAlAQWZ0ZXIKIAlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQl0ci5jbG9zZSgpOwogCQlzdXBlci50ZWFyRG93bigpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCmluZGV4IDFmZjIyNjQuLjNmZThmNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKQEAgLTcyMiw2ICs3MjIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbFBhY2tGaWxlc1NjYW5XaGVuRG9pbmdTZWFyY2hGb3JSZXVzZVRpbWVvdXRDaGVjaygpCiAJICovCiAJcHJpdmF0ZSBGaWxlUmVwb3NpdG9yeSBzZXRVcFJlcG9XaXRoTXVsdGlwbGVQYWNrZmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJRmlsZVJlcG9zaXRvcnkgZmlsZVJlcG9zaXRvcnkgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShmaWxlUmVwb3NpdG9yeSk7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZmlsZVJlcG9zaXRvcnkpKSB7CiAJCQkvLyBDcmVhdGVzIDIgb2JqZWN0cyAoQzEgPSBjb21taXQsIFQxID0gdHJlZSkKIAkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJGaXJzdCBjb21taXQiKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeUFmdGVyT3BlbkNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5QWZ0ZXJPcGVuQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzA0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeUFmdGVyT3BlbkNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDIzIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuCisgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOworCitwdWJsaWMgY2xhc3MgUmVmRGlyZWN0b3J5QWZ0ZXJPcGVuQ29uZmlnVGVzdCBleHRlbmRzIFJlZkRpcmVjdG9yeVRlc3QgeworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVmRGlyZWN0b3J5U2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RvcmVkQ29uZmlnIHVzZXJDb25maWcgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyQ29uZmlnKCk7CisJCXVzZXJDb25maWcuc2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVF9QQUNLRURfUkVGU19TVEFULAorCQkJCUNvcmVDb25maWcuVHJ1c3RQYWNrZWRSZWZzU3RhdC5BRlRFUl9PUEVOKTsKKwkJdXNlckNvbmZpZy5zYXZlKCk7CisJCXN1cGVyLnJlZkRpcmVjdG9yeVNldHVwKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQppbmRleCAzOGM1NDVlLi40YjgwZjE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQpAQCAtNzIsNyArNzIsMTAgQEAgcHVibGljIGNsYXNzIFJlZkRpcmVjdG9yeVRlc3QgZXh0ZW5kcyBMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UgewogCUBCZWZvcmUKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOworCQlyZWZEaXJlY3RvcnlTZXR1cCgpOworCX0KIAorCXB1YmxpYyB2b2lkIHJlZkRpcmVjdG9yeVNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWRpc2tSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKIAkJcmVmZGlyID0gKFJlZkRpcmVjdG9yeSkgZGlza1JlcG8uZ2V0UmVmRGF0YWJhc2UoKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9pby9DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRlbmNlbnQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW8uQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0uQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbVRlc3QgeworCXByaXZhdGUgc3RhdGljIGNsYXNzIENhbmNlbGxlZFRlc3RNb25pdG9yIGltcGxlbWVudHMgUHJvZ3Jlc3NNb25pdG9yIHsKKworCQlwcml2YXRlIGJvb2xlYW4gY2FuY2VsbGVkID0gZmFsc2U7CisKKwkJcHVibGljIHZvaWQgc2V0Q2FuY2VsbGVkKGJvb2xlYW4gY2FuY2VsbGVkKSB7CisJCQl0aGlzLmNhbmNlbGxlZCA9IGNhbmNlbGxlZDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdGFydChpbnQgdG90YWxUYXNrcykgeworCQkJLy8gbm90IGltcGxlbWVudGVkCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyB0aXRsZSwgaW50IHRvdGFsV29yaykgeworCQkJLy8gbm90IGltcGxlbWVudGVkCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgdXBkYXRlKGludCBjb21wbGV0ZWQpIHsKKwkJCS8vIG5vdCBpbXBsZW1lbnRlZAorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGVuZFRhc2soKSB7CisJCQkvLyBub3QgaW1wbGVtZW50ZWQKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKwkJCXJldHVybiBjYW5jZWxsZWQ7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDYW5jZWxJblByb2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2FuY2VsbGVkVGVzdE1vbml0b3IgbSA9IG5ldyBDYW5jZWxsZWRUZXN0TW9uaXRvcigpOworCQl0cnkgKENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSgKKwkJCQltLCBOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFKSkgeworCQkJYnl0ZVtdIEtCID0gbmV3IGJ5dGVbMTAyNF07CisJCQlpbnQgdHJpZ2dlckNhbmNlbFdyaXRlQ250ID0gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSworCQkJCQkvIEtCLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJpZ2dlckNhbmNlbFdyaXRlQ250ICsgMTsgaSsrKSB7CisJCQkJb3V0LndyaXRlKEtCKTsKKwkJCX0KKwkJCWFzc2VydFRydWUob3V0Lmxlbmd0aCgpID4gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7CisJCQltLnNldENhbmNlbGxlZCh0cnVlKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmlnZ2VyQ2FuY2VsV3JpdGVDbnQgLSAxOyBpKyspIHsKKwkJCQlvdXQud3JpdGUoS0IpOworCQkJfQorCisJCQlsb25nIGxhc3RMZW5ndGggPSBvdXQubGVuZ3RoKCk7CisJCQlhc3NlcnRUaHJvd3MoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworCQkJCW91dC53cml0ZSgxKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKGxhc3RMZW5ndGgsIG91dC5sZW5ndGgoKSk7CisKKwkJCWFzc2VydFRocm93cyhJbnRlcnJ1cHRlZElPRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQkJb3V0LndyaXRlKG5ldyBieXRlWzFdKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKGxhc3RMZW5ndGgsIG91dC5sZW5ndGgoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyQ2hlY2tBZnRlclNpbmdsZUJ5dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNhbmNlbGxlZFRlc3RNb25pdG9yIG0gPSBuZXcgQ2FuY2VsbGVkVGVzdE1vbml0b3IoKTsKKwkJdHJ5IChDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0oCisJCQkJbSwgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpIHsKKworCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyArIDFdOworCQkJbS5zZXRDYW5jZWxsZWQodHJ1ZSk7CisKKwkJCWFzc2VydFRocm93cyhJbnRlcnJ1cHRlZElPRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQkJb3V0LndyaXRlKGJ5dGVzKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0ssIG91dC5sZW5ndGgoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCmluZGV4IDExNzQxYjQuLmQwNjUyODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCkBAIC0zNjksMjAgKzM2OSwyMSBAQCBwdWJsaWMgdm9pZCB0ZXN0SG9zdENhc2VJbnNlbnNpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGlzdFZhbHVlU2luZ2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBvcmN6XG5Vc2VyS25vd25Ib3N0c0ZpbGUgL2Zvby9iYXJcbiIpOworCQljb25maWcoIkhvc3Qgb3JjelxuVXNlcktub3duSG9zdHNGaWxlIH4vZm9vL2JhclxuIik7CiAJCWZpbmFsIEhvc3RDb25maWcgYyA9IGxvb2t1cCgib3JjeiIpOwogCQlhc3NlcnROb3ROdWxsKGMpOwotCQlhc3NlcnRFcXVhbHMoIi9mb28vYmFyIiwgYy5nZXRWYWx1ZSgiVXNlcktub3duSG9zdHNGaWxlIikpOworCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCksCisJCQkJYy5nZXRWYWx1ZSgiVXNlcktub3duSG9zdHNGaWxlIikpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdExpc3RWYWx1ZU11bHRpcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRpbGRlIGV4cGFuc2lvbiBvY2N1cnMgd2l0aGluIHRoZSBwYXJzZXIKLQkJY29uZmlnKCJIb3N0IG9yY3pcblVzZXJLbm93bkhvc3RzRmlsZSBcIn4vZm9vL2JhIHpcIiAvZm9vL2JhciBcbiIpOworCQljb25maWcoIkhvc3Qgb3JjelxuVXNlcktub3duSG9zdHNGaWxlIFwifi9mb28vYmEgelwiIH4vZm9vL2JhciBcbiIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGMgPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChjKTsKIAkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvby9iYSB6IikuZ2V0UGF0aCgpLAotCQkJCSIvZm9vL2JhciIgfSwKKwkJCQluZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSB9LAogCQkJCWMuZ2V0VmFsdWVzKCJVc2VyS25vd25Ib3N0c0ZpbGUiKS50b0FycmF5KCkpOwogCX0KIApAQCAtNDAzLDIyICs0MDQsMjMgQEAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkTG9va3Vwc1dpdGhNb2RpZmljYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdElkZW50aXR5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIFwifi9mb28vYmEgelwiXG5JZGVudGl0eUZpbGUgL2Zvby9iYXIiKTsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5RmlsZSBcIn4vZm9vL2JhIHpcIlxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhciIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGggPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJLy8gRG9lcyB0aWxkZSByZXBsYWNlbWVudAogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhIHoiKS5nZXRQYXRoKCksCi0JCQkJIi9mb28vYmFyIiB9LAorCQkJCW5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpIH0sCiAJCQkJaC5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlJZGVudGl0eUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnKCJJZGVudGl0eUZpbGUgXCJ+L2Zvby9iYSB6XCJcbkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIC9mb28vYmFyXG5IT1NUICpcbklkZW50aXR5RmlsZSAvZm9vL2JheiIpOworCQljb25maWcoIklkZW50aXR5RmlsZSBcIn4vZm9vL2JhIHpcIlxuSG9zdCBvcmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICpcbklkZW50aXR5RmlsZSB+L2Zvby9iYXoiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28vYmEgeiIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXIiLCAiL2Zvby9iYXoiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCksCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXoiKS5nZXRQYXRoKCkgfSwKIAkJCQloLmdldFZhbHVlcyhTc2hDb25zdGFudHMuSURFTlRJVFlfRklMRSkudG9BcnJheSgpKTsKIAl9CiAKQEAgLTQzNCwyMyArNDM2LDIzIEBAIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGVkUGF0dGVybigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybigpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3QgcmVwby5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhclxuSE9TVCAqLm9yLmN6XG5JZGVudGl0eUZpbGUgL2Zvby9iYXoiKTsKKwkJY29uZmlnKCJIb3N0IHJlcG8ub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXJcbkhPU1QgKi5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JheiIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGggPSBsb29rdXAoInJlcG8ub3IuY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJYXNzZXJ0SWRlbnRpdHkobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKSwgaCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpLAotCQkJCSIvZm9vL2JheiIgfSwKKwkJCQluZXcgRmlsZShob21lLCAiZm9vL2JheiIpLmdldFBhdGgoKSB9LAogCQkJCWguZ2V0VmFsdWVzKFNzaENvbnN0YW50cy5JREVOVElUWV9GSUxFKS50b0FycmF5KCkpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE11bHRpSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjeiAqLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICoub3IuY3pcbklkZW50aXR5RmlsZSAvZm9vL2JheiIpOworCQljb25maWcoIkhvc3Qgb3JjeiAqLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICoub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXoiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoMSA9IGxvb2t1cCgicmVwby5vci5jeiIpOwogCQlhc3NlcnROb3ROdWxsKGgxKTsKIAkJYXNzZXJ0SWRlbnRpdHkobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKSwgaDEpOwogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXoiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXoiKS5nZXRQYXRoKCkgfSwKIAkJCQloMS5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJCWZpbmFsIEhvc3RDb25maWcgaDIgPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoMik7CkBAIC01NDcsMTggKzU0OSwzNiBAQCBwdWJsaWMgdm9pZCB0ZXN0RW9sQ29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEVuVmFyU3Vic3RpdHV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBvcmN6XG5JZGVudGl0eUZpbGUgL3RtcC8ke1RTVF9WQVJ9XG4iCi0JCQkJKyAiQ2VydGlmaWNhdGVGaWxlIC90bXAvJHt9L2Zvb1xuVXNlciAke1RTVF9WQVJ9XG5JZGVudGl0eUFnZW50IC90bXAvJHtUU1RfVkFSL2JhciIpOworCQljb25maWcoIkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIH4vdG1wLyR7VFNUX1ZBUn1cbiIKKwkJCQkrICJDZXJ0aWZpY2F0ZUZpbGUgfi90bXAvJHt9L2Zvb1xuVXNlciAke1RTVF9WQVJ9XG5JZGVudGl0eUFnZW50IH4vdG1wLyR7VFNUX1ZBUi9iYXIiKTsKIAkJSG9zdENvbmZpZyBoID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7Ci0JCWFzc2VydEVxdWFscygiL3RtcC9URVNUIiwKKwkJRmlsZSB0bXAgPSBuZXcgRmlsZShob21lLCAidG1wIik7CisJCWFzc2VydEVxdWFscyhuZXcgRmlsZSh0bXAsICJURVNUIikuZ2V0UGF0aCgpLAogCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpKTsKIAkJLy8gTm8gdmFyaWFibGUgbmFtZQotCQlhc3NlcnRFcXVhbHMoIi90bXAvJHt9L2ZvbyIsIGguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLkNFUlRJRklDQVRFX0ZJTEUpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKG5ldyBGaWxlKHRtcCwgIiR7fSIpLCAiZm9vIikuZ2V0UGF0aCgpLAorCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLkNFUlRJRklDQVRFX0ZJTEUpKTsKIAkJLy8gVXNlciBkb2Vzbid0IGdldCBlbnYgdmFyIHN1YnN0aXR1dGlvbjoKIAkJYXNzZXJ0VXNlcigiJHtUU1RfVkFSfSIsIGgpOwogCQkvLyBVbnRlcm1pbmF0ZWQ6Ci0JCWFzc2VydEVxdWFscygiL3RtcC8ke1RTVF9WQVIvYmFyIiwKKwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKG5ldyBGaWxlKHRtcCwgIiR7VFNUX1ZBUiIpLCAiYmFyIikuZ2V0UGF0aCgpLAorCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlBZ2VudE5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5QWdlbnQgbm9uZVxuIik7CisJCUhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOworCQlhc3NlcnRFcXVhbHMoU3NoQ29uc3RhbnRzLk5PTkUsCisJCQkJaC5nZXRWYWx1ZShTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUFnZW50U3NoQXV0aFNvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5QWdlbnQgU1NIX0FVVEhfU09DS1xuIik7CisJCUhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOworCQlhc3NlcnRFcXVhbHMoU3NoQ29uc3RhbnRzLkVOVl9TU0hfQVVUSF9TT0NLRVQsCiAJCQkJaC5nZXRWYWx1ZShTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQpKTsKIAl9CiAKQEAgLTYwNywxMyArNjI3LDE2IEBAIHB1YmxpYyB2b2lkIHRlc3ROb01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBmb28uYmFyXG5Qb3J0IDI5NDE4XG5JZGVudGl0eUZpbGUgL2Zvb1xuXG4iCi0JCQkJKyAiSG9zdCAqLmJhclxuUG9ydCAyMlxuSWRlbnRpdHlGaWxlIC9iYXJcbiIKLQkJCQkrICJIb3N0IGZvby5iYXJcblBvcnQgNDdcbklkZW50aXR5RmlsZSAvYmF6XG4iKTsKKwkJY29uZmlnKCJIb3N0IGZvby5iYXJcblBvcnQgMjk0MThcbklkZW50aXR5RmlsZSB+L2Zvb1xuXG4iCisJCQkJKyAiSG9zdCAqLmJhclxuUG9ydCAyMlxuSWRlbnRpdHlGaWxlIH4vYmFyXG4iCisJCQkJKyAiSG9zdCBmb28uYmFyXG5Qb3J0IDQ3XG5JZGVudGl0eUZpbGUgfi9iYXpcbiIpOwogCQlIb3N0Q29uZmlnIGggPSBsb29rdXAoImZvby5iYXIiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJYXNzZXJ0UG9ydCgyOTQxOCwgaCk7Ci0JCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7ICIvZm9vIiwgIi9iYXIiLCAiL2JheiIgfSwKKwkJYXNzZXJ0QXJyYXlFcXVhbHMoCisJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvbyIpLmdldFBhdGgoKSwKKwkJCQkJCW5ldyBGaWxlKGhvbWUsICJiYXIiKS5nZXRQYXRoKCksCisJCQkJCQluZXcgRmlsZShob21lLCAiYmF6IikuZ2V0UGF0aCgpIH0sCiAJCQkJaC5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJfQogCkBAIC02MzMsNCArNjU2LDYxIEBAIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydFBvcnQoMjIsIGgpOwogCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRpbWVTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMobnVsbCkpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCJzIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgIHMiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiArcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiIC1zIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxbXMiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDAiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDBzIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDBzIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDBzICAiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCJcdDYwMHMiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgXHQ2MDAgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDAgcyAgIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDAgcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaDMwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCAzMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWggXHQzMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWgrMzBtIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoICszMG0iKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoICsgMzBtIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCAtMzBtIikpOworCQlhc3NlcnRFcXVhbHMoMzYzMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoMzBzIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjMwbSAxaCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIzMG0gMzBtIikpOworCQlhc3NlcnRFcXVhbHMoNjAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIzMCAzMCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIwIikpOworCQlhc3NlcnRFcXVhbHMoMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEiKSk7CisJCWFzc2VydEVxdWFscygxLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMVMiKSk7CisJCWFzc2VydEVxdWFscygxLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXMiKSk7CisJCWFzc2VydEVxdWFscyg2MCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFNIikpOworCQlhc3NlcnRFcXVhbHMoNjAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxSCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDg2NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMUQiKSk7CisJCWFzc2VydEVxdWFscyg4NjQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFkIikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMVciKSk7CisJCWFzc2VydEVxdWFscyg2MDQ4MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxdyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDE3MjgwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjJkIikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXciKSk7CisJCWFzc2VydEVxdWFscyg2MDQ4MDAgKyAxNzI4MDAgKyAzICogMzYwMCArIDMwICogNjAgKyAxMCwKKwkJCQlPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXcyZDNoMzBtMTBzIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCItNyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiLTlkIikpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci5NQVhfVkFMVUUsIE9wZW5Tc2hDb25maWdGaWxlCisJCQkJLnRpbWVTcGVjKEludGVnZXIudG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUpKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUKKwkJCQkudGltZVNwZWMoTG9uZy50b1N0cmluZyhJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKSkpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlCisJCQkJLnRpbWVTcGVjKEludGVnZXIudG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUgLyA2MCArIDEpICsgJ00nKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDB3IikpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhY2UwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBNYXR0aGlhcyBTb2huIDxtYXR0aGlhcy5zb2huQHNhcC5jb20+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQWJicmV2Q29uZmlnVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg3LCB0ZXN0Q29yZUFiYnJldihudWxsKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QXV0bygpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoNywgdGVzdENvcmVBYmJyZXYoImF1dG8iKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKDQwLCB0ZXN0Q29yZUFiYnJldigibm8iKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKDQsIHRlc3RDb3JlQWJicmV2KCI0IikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygyMiwgdGVzdENvcmVBYmJyZXYoIjIyIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg0MCwgdGVzdENvcmVBYmJyZXYoIjQwIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWQoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiZm9vIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWQyKCkgeworCQlhc3NlcnRUaHJvd3MoSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gdGVzdENvcmVBYmJyZXYoIjJrIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWROZWdhdGl2ZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCItMTAwMCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQmVsb3dSYW5nZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCIzIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWRCZWxvd1JhbmdlMigpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCItMSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWJvdmVSYW5nZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCI0MSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWJvdmVSYW5nZTIoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiMTAwMDAwIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nTm8oKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygiNDAiLCBzZXRDb3JlQWJicmV2KCJubyIpLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkKKwkJCXRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIjciLCBzZXRDb3JlQWJicmV2KCJhdXRvIikudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcxMigpCisJCQl0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKCIxMiIsIHNldENvcmVBYmJyZXYoIjEyIikudG9TdHJpbmcoKSk7CisJfQorCisJcHJpdmF0ZSBpbnQgdGVzdENvcmVBYmJyZXYoU3RyaW5nIHZhbHVlKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBzZXRDb3JlQWJicmV2KHZhbHVlKS5nZXQoKTsKKwl9CisKKwlwcml2YXRlIEFiYnJldkNvbmZpZyBzZXRDb3JlQWJicmV2KFN0cmluZyB2YWx1ZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQUJCUkVWLCB2YWx1ZSk7CisJCWNvbmZpZy5zYXZlKCk7CisJCXJldHVybiBBYmJyZXZDb25maWcucGFyc2VGcm9tQ29uZmlnKGRiKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZDc4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIENvbW1pdENvbmZpZ1Rlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNsZWFuLXVwIG1vZGUiLCBDbGVhbnVwTW9kZS5ERUZBVUxULAorCQkJCWNmZy5nZXRDbGVhbnVwTW9kZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21taXRDbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHsgInN0cmlwIiwgIndoaXRlc3BhY2UiLCAidmVyYmF0aW0iLCAic2Npc3NvcnMiLAorCQkJCSJkZWZhdWx0IiB9OworCQlDbGVhbnVwTW9kZVtdIGV4cGVjdGVkID0geyBDbGVhbnVwTW9kZS5TVFJJUCwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwKKwkJCQlDbGVhbnVwTW9kZS5WRVJCQVRJTSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsCisJCQkJQ2xlYW51cE1vZGUuREVGQVVMVCB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCJbY29tbWl0XVxuXHRjbGVhbnVwID0gIiArIHZhbHVlc1tpXSk7CisJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsIGV4cGVjdGVkW2ldLAorCQkJCQljZmcuZ2V0Q2xlYW51cE1vZGUoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHsgInN0cmlwIiwgIndoaXRlc3BhY2UiLCAidmVyYmF0aW0iLCAic2Npc3NvcnMiLAorCQkJCSJkZWZhdWx0IiB9OworCQlDbGVhbnVwTW9kZVtdIGV4cGVjdGVkID0geyBDbGVhbnVwTW9kZS5TVFJJUCwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwKKwkJCQlDbGVhbnVwTW9kZS5WRVJCQVRJTSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsCisJCQkJQ2xlYW51cE1vZGUuREVGQVVMVCB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCJbY29tbWl0XVxuXHRjbGVhbnVwID0gIiArIHZhbHVlc1tpXSk7CisJCQlmb3IgKENsZWFudXBNb2RlIG1vZGUgOiBDbGVhbnVwTW9kZS52YWx1ZXMoKSkgeworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJCUNsZWFudXBNb2RlIHJlc29sdmVkID0gY2ZnLnJlc29sdmUobW9kZSwgaiA9PSAwKTsKKwkJCQkJaWYgKG1vZGUgIT0gQ2xlYW51cE1vZGUuREVGQVVMVCkgeworCQkJCQkJYXNzZXJ0RXF1YWxzKCJDbGVhbi11cCBtb2RlIHNob3VsZCBiZSB1bmNoYW5nZWQiLCBtb2RlLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0gZWxzZSBpZiAoaSArIDEgPCB2YWx1ZXMubGVuZ3RoKSB7CisJCQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsIGV4cGVjdGVkW2ldLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsCisJCQkJCQkJCWogPT0gMCA/IENsZWFudXBNb2RlLlNUUklQCisJCQkJCQkJCQkJOiBDbGVhbnVwTW9kZS5XSElURVNQQUNFLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhbkRlZmF1bHRUaHJvd3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gQ29tbWl0Q29uZmlnCisJCQkJLmNsZWFuVGV4dCgiV2hhdGV2ZXIiLCBDbGVhbnVwTW9kZS5ERUZBVUxULCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblZlcmJhdGltKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXHQgXG5cblxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlZFUkJBVElNLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhbldoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgQSBjb21tZW50XG5cbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwgJyMnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5TdHJpcCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJcbiAgXG5XaGF0ZXZlciAgXG5cblxuIyBBIGNvbW1lbnRcblxuTW9yZVx0IFxuXG5cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsICJXaGF0ZXZlclxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU1RSSVAsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU3RyaXBDdXN0b21DaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsCisJCQkJIldoYXRldmVyXG5cbiMgTm90IGEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU1RSSVAsICc8JykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXHQgXG5cblxuIgorCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsCisJCQkJIldoYXRldmVyXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNDdXN0b21DaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiIKKwkJCQkrICI8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJCQkrICJNb3JlXG5Nb3JlXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnPCcpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzQXRUb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXHQgXG5cblxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsICIiLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNOb1NjaXNzb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgQSBjb21tZW50XG5cbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNOb1NjaXNzb3IyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlRleHRcbiIKKwkJCQkrICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiTW9yZVxuTW9yZVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzTm9TY2lzc29yMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJUZXh0XG4iCisJCQkJLy8gV3JvbmcgbnVtYmVyIG9mIGRhc2hlcworCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiTW9yZVxuTW9yZVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzQXRFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiVGV4dFxuIgorCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgIlRleHRcbiIsCisJCQkJQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBDbGVhbnVwTW9kZS5TQ0lTU09SUywgJyMnKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQ29tbWl0Q29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KQorCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworCQlDb25maWcgYyA9IG5ldyBDb25maWcoKTsKKwkJYy5mcm9tVGV4dChjb250ZW50KTsKKwkJcmV0dXJuIGMuZ2V0KENvbW1pdENvbmZpZy5LRVkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0VGVtcGxhdGVDb25maWdUZXN0LmphdmEKaW5kZXggNmRiZTMwYS4uNDJiYWZiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdFRlbXBsYXRlQ29uZmlnVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBTQVAgU0UgYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFNBUCBTRSBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC00Nyw4ICs0Nyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVBhdGhJbkhvbWVEaXJlY29yeSgpCiAJCQkJIi50bXAiLCBuZXcgRmlsZShob21lRGlyKSk7CiAJCXRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LmRlbGV0ZU9uRXhpdCgpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUodGVtcEZpbGVJbkhvbWVEaXJlY3RvcnksIHRlbXBsYXRlQ29udGVudCk7Ci0JCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9IHRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LmdldFBhdGgoKQotCQkJCS5yZXBsYWNlKGhvbWVEaXIsICJ+Iik7CisJCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9ICJ+LyIgKyB0ZW1wRmlsZUluSG9tZURpcmVjdG9yeS5nZXROYW1lKCk7CiAJCWNvbmZpZyA9IENvbmZpZ1Rlc3QKIAkJCQkucGFyc2UoIltjb21taXRdXG5cdHRlbXBsYXRlID0gIiArIGV4cGVjdGVkVGVtcGxhdGVQYXRoICsgIlxuIik7CiAJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSBjb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCmluZGV4IDliODJjMmEuLmE4NWE0ZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCkBAIC0xNDg4LDcgKzE0ODgsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0VGVtcGxhdGVDb25maWcoKQogCQlTdHJpbmcgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggPSB0ZW1wRmlsZS5nZXRQYXRoKCk7CiAKIAkJQ29uZmlnIGNvbmZpZyA9IHBhcnNlKAotCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOworCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkJCSsgQ29uZmlnLmVzY2FwZVZhbHVlKGV4cGVjdGVkVGVtcGxhdGVQYXRoKSArICJcbiIpOwogCiAJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSBjb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpCiAJCQkJLmdldENvbW1pdFRlbXBsYXRlUGF0aCgpOwpAQCAtMTUzNyw3ICsxNTM4LDggQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlRW5jb2RpbmcoKQogCQlKR2l0VGVzdFV0aWwud3JpdGUodGVtcEZpbGUsIHRlbXBsYXRlQ29udGVudCk7CiAJCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9IHRlbXBGaWxlLmdldFBhdGgoKTsKIAkJY29uZmlnID0gcGFyc2UoIltpMThuXVxuXHRjb21taXRFbmNvZGluZyA9IHV0Zi04XG4iCi0JCQkJKyAiW2NvbW1pdF1cblx0dGVtcGxhdGUgPSAiICsgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZShleHBlY3RlZFRlbXBsYXRlUGF0aCkgKyAiXG4iKTsKIAkJYXNzZXJ0RXF1YWxzKHRlbXBsYXRlQ29udGVudCwKIAkJCQljb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpLmdldENvbW1pdFRlbXBsYXRlQ29udGVudChyZXBvKSk7CiAJCVN0cmluZyBjb21taXRFbmNvZGluZyA9IGNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkKQEAgLTE1NTYsNyArMTU1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVdpdGhJbnZhbGlkRW5jb2RpbmcoKQogCQlTdHJpbmcgdGVtcGxhdGVDb250ZW50ID0gImNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlIjsKIAkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlLCB0ZW1wbGF0ZUNvbnRlbnQpOwogCQljb25maWcgPSBwYXJzZSgiW2kxOG5dXG5cdGNvbW1pdEVuY29kaW5nID0gaW52YWxpZEVjb2RpbmdcbiIKLQkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyB0ZW1wRmlsZS5nZXRQYXRoKCkgKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZSh0ZW1wRmlsZS5nZXRQYXRoKCkpICsgIlxuIik7CiAJCWNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkuZ2V0Q29tbWl0VGVtcGxhdGVDb250ZW50KHJlcG8pOwogCX0KIApAQCAtMTU3MCw3ICsxNTczLDcgQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlV2l0aEludmFsaWRQYXRoKCkKIAkJU3RyaW5nIHRlbXBsYXRlQ29udGVudCA9ICJjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSI7CiAJCUpHaXRUZXN0VXRpbC53cml0ZSh0ZW1wRmlsZSwgdGVtcGxhdGVDb250ZW50KTsKIAkJLy8gY29tbWl0IG1lc3NhZ2UgZW5jb2RpbmcKLQkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIi9ub25FeGlzdGluZ1RlbXBsYXRlIjsKKwkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIn4vbm9uRXhpc3RpbmdUZW1wbGF0ZSI7CiAJCWNvbmZpZyA9IHBhcnNlKCJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOwogCQlTdHJpbmcgdGVtcGxhdGVQYXRoID0gY29uZmlnLmdldChDb21taXRDb25maWcuS0VZKQogCQkJCS5nZXRDb21taXRUZW1wbGF0ZVBhdGgoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQppbmRleCBhZjhhNThmLi4wZmFmY2Q2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCkBAIC0yLDcgKzIsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3LCBEYXZlIFdhdHNvbiA8ZHdhdHNvbkBtaW12aXN0YS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjAgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjIgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yNDIsNiArMjQyLDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDaGVja291dCgpIHRocm93cyBFeGNlcHRpb24gewogCQlMaXN0ZW5lckhhbmRsZSBoYW5kbGUgPSBudWxsOwogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKIAkJCQlUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBkYl90ID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQloYW5kbGUgPSBkYi5nZXRMaXN0ZW5lckxpc3QoKQogCQkJCQkuYWRkV29ya2luZ1RyZWVNb2RpZmllZExpc3RlbmVyKHJlY29yZGVyKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwpAQCAtMjYxLDYgKzI2Miw3IEBAIHByaXZhdGUgdm9pZCBjaGVja291dExpbmVFbmRpbmdzKFN0cmluZyBpbkluZGV4LCBTdHJpbmcgZXhwZWN0ZWQsCiAJCQlTdHJpbmcgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOwogCQkJCVRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGRiX3QgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwogCQkJbWFzdGVyLmNvbW1pdCgpLmFkZCgiZiIsIGluSW5kZXgpLm1lc3NhZ2UoIm0wIikuY3JlYXRlKCk7CiAJCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYXR0cmlidXRlcykpIHsKQEAgLTMxMyw4ICszMTUsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aExGQXV0bygpIHRocm93cyBFeGNlcHRpb24gewotCQljaGVja291dExpbmVFbmRpbmdzKCJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIiwKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmIHRleHQ9YXV0byIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSBTdHJpbmcuZm9ybWF0KCJmaXJzdCBsaW5lJW5zZWNvbmQgbGluZSVuIik7CisJCWNoZWNrb3V0TGluZUVuZGluZ3MoImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKKwkJCQkiZiB0ZXh0PWF1dG8iKTsKIAl9CiAKIAlAVGVzdApAQCAtMzI1LDkgKzMyOCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dFdpdGhMRkF1dG9Fb2xMZigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEZBdXRvRW9sTmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBleHBlY3RlZCA9IFN0cmluZy5mb3JtYXQoImZpcnN0IGxpbmUlbnNlY29uZCBsaW5lJW4iKTsKIAkJY2hlY2tvdXRMaW5lRW5kaW5ncygKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIgotCQkJCQkJLnJlcGxhY2VBbGwoIlxuIiwgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSksCisJCQkJImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKIAkJCQkiZiB0ZXh0PWF1dG8gZW9sPW5hdGl2ZSIpOwogCX0KIApAQCAtMjA2NCw2ICsyMDY3LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlc2V0V2l0aENoYW5nZUluR2l0aWdub3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aEVtcHR5SW5kZXhEb2VzbnRPdmVyd3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CiAJCQkJVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gZGJfdCA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJLy8gcHJlcGFyZSB0aGUgY29tbWl0cwogCQkJQnJhbmNoQnVpbGRlciBtYXN0ZXIgPSBkYl90LmJyYW5jaCgibWFzdGVyIik7CiAJCQlSZXZDb21taXQgbWVyZ2VDb21taXQgPSBtYXN0ZXIuY29tbWl0KCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnRUZXN0LmphdmEKaW5kZXggZTliYWI3Yy4uOTdkYTE3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UMDAwMV9QZXJzb25JZGVudFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCkBAIC0xMywxMiArMTMsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBUMDAwMV9QZXJzb25JZGVudFRlc3QgeworcHVibGljIGNsYXNzIFBlcnNvbklkZW50VGVzdCB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDFfTmV3SWRlbnQoKSB7CkBAIC00Miw2ICs0NCwzNCBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAyX05ld0lkZW50KCkgewogCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROZXdJZGVudEluc3RhbnQoKSB7CisJCVBlcnNvbklkZW50IHAgPSBuZXcgUGVyc29uSWRlbnQoIkEgVSBUaG9yIiwgImF1dGhvckBleGFtcGxlLmNvbSIsCisJCQkJSW5zdGFudC5vZkVwb2NoTWlsbGkoMTE0Mjg3ODUwMTAwMEwpLAorCQkJCVpvbmVJZC5vZigiQW1lcmljYS9OZXdfWW9yayIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJBIFUgVGhvciIsIHAuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhdXRob3JAZXhhbXBsZS5jb20iLCBwLmdldEVtYWlsQWRkcmVzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEluc3RhbnQub2ZFcG9jaE1pbGxpKDExNDI4Nzg1MDEwMDBMKSwKKwkJCQlwLmdldFdoZW5Bc0luc3RhbnQoKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4gMTE0Mjg3ODUwMSAtMDUwMCIsCisJCQkJcC50b0V4dGVybmFsU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoWm9uZUlkLm9mKCJHTVQtMDU6MDAiKSwgcC5nZXRab25lSWQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmV3SWRlbnRJbnN0YW50MigpIHsKKwkJZmluYWwgUGVyc29uSWRlbnQgcCA9IG5ldyBQZXJzb25JZGVudCgiQSBVIFRob3IiLCAiYXV0aG9yQGV4YW1wbGUuY29tIiwKKwkJCQlJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJWm9uZUlkLm9mKCJBc2lhL0tvbGthdGEiKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IiLCBwLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYXV0aG9yQGV4YW1wbGUuY29tIiwgcC5nZXRFbWFpbEFkZHJlc3MoKSk7CisJCWFzc2VydEVxdWFscyhJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJcC5nZXRXaGVuQXNJbnN0YW50KCkpOworCQlhc3NlcnRFcXVhbHMoIkEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+IDExNDI4Nzg1MDEgKzA1MzAiLAorCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKFpvbmVJZC5vZigiR01UKzA1OjMwIiksIHAuZ2V0Wm9uZUlkKCkpOworCX0KKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogCXB1YmxpYyB2b2lkIG51bGxGb3JOYW1lU2hvdWxkVGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlclRlc3QuamF2YQppbmRleCBkZWRiNTZjLi5hMjU3NmNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwpAQCAtMTU3LDggKzE1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RJbnRvU3ltYm9saWNSZWZIZWFkUG9pbnRpbmdUb01hc3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuIjsKIAkJU3RyaW5nIG1lc3NhZ2UgPSBmb3JtYXR0ZXIuZm9ybWF0V2l0aENvbmZsaWN0cyhvcmlnaW5hbE1lc3NhZ2UsCi0JCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAicGF0aDEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5Db25mbGljdHM6XG5cdHBhdGgxXG4iLAorCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CisJCWFzc2VydEVxdWFscygiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuIyBDb25mbGljdHM6XG4jXHRwYXRoMVxuIiwKIAkJCQltZXNzYWdlKTsKIAl9CiAKQEAgLTE2Niw4ICsxNjcsMTcgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c05vRm9vdGVyTm9MaW5lQnJlYWsoKSB7CiAJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOwotCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbkNvbmZsaWN0czpcblx0cGF0aDFcbiIsCisJCQkJTGlzdC5vZigicGF0aDEiKSwgJyMnKTsKKwkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG4jIENvbmZsaWN0czpcbiNcdHBhdGgxXG4iLAorCQkJCW1lc3NhZ2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNDdXN0b21DaGFyYWN0ZXIoKSB7CisJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOworCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKKwkJCQlMaXN0Lm9mKCJwYXRoMSIpLCAnOycpOworCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbjsgQ29uZmxpY3RzOlxuO1x0cGF0aDFcbiIsCiAJCQkJbWVzc2FnZSk7CiAJfQogCkBAIC0xNzYsOSArMTg2LDkgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNXaXRoRm9vdGVycygpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KQEAgLTE4OCw5ICsxOTgsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c1dpdGhGb290ZXJsaWtlTGluZUluQm9keSgpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuQnVnOjEyMzQ1Njdcbk1vcmUgQm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcbkJ1ZzoxMjM0NTY3XG5Nb3JlIEJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5CdWc6MTIzNDU2N1xuTW9yZSBCb2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCmluZGV4IGRkODU3M2QuLmNiYWNhZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpAQCAtMTgxMCw2ICsxODEwLDcgQEAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpY2F0aW9uVGltZVN0YW1wT3JkZXIoU3RyaW5nLi4uIHBhdGhlcykgewogCXByaXZhdGUgU3RyaW5nIHJlYWRCbG9iKE9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTw/PiB0ciA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKTsKIAkJCQlSZXZXYWxrIHJ3ID0gdHIuZ2V0UmV2V2FsaygpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZUcmVlIHRyZWUgPSBydy5wYXJzZVRyZWUodHJlZWlzaCk7CiAJCQlSZXZPYmplY3Qgb2JqID0gdHIuZ2V0KHRyZWUsIHBhdGgpOwogCQkJaWYgKG9iaiA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGtUZXN0LmphdmEKaW5kZXggZWE5OTRmMC4uZjQ0NmQwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsa1Rlc3QuamF2YQpAQCAtMjE3LDcgKzIxNyw2IEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQkJYXNzZXJ0RXF1YWxzRmlsZShtb2R1bGVzR2l0RGlyLCBzdWJSZXBvLmdldERpcmVjdG9yeSgpKTsKIAkJCQlhc3NlcnRFcXVhbHNGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksIHBhdGgpLAogCQkJCQkJc3ViUmVwby5nZXRXb3JrVHJlZSgpKTsKLQkJCQlzdWJSZXBvLmNsb3NlKCk7CiAJCQkJYXNzZXJ0RmFsc2UoZ2VuLm5leHQoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggMDU0ZWI5Yy4uYmI2MmEwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKQEAgLTgwLDYgKzgwLDcgQEAgcHVibGljIHZvaWQgdGVzdFdyaXRlU2luZ2xlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZW4gd2UgY2xvbmUgYSBuZXcgcmVwbyBmcm9tIHRoYXQgYnVuZGxlIGFuZCBkbyBhIHNpbXBsZSB0ZXN0LiBUaGlzCiAJCS8vIG1ha2VzIHN1cmUgd2UgY291bGQgcmVhZCB0aGUgYnVuZGxlIHdlIGNyZWF0ZWQuCiAJCVJlcG9zaXRvcnkgbmV3UmVwbyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKG5ld1JlcG8pOwogCQlGZXRjaFJlc3VsdCBmZXRjaFJlc3VsdCA9IGZldGNoRnJvbUJ1bmRsZShuZXdSZXBvLCBidW5kbGUpOwogCQlSZWYgYWR2ZXJ0aXNlZFJlZiA9IGZldGNoUmVzdWx0CiAJCQkJLmdldEFkdmVydGlzZWRSZWYoInJlZnMvaGVhZHMvZmlyc3Rjb21taXQiKTsKQEAgLTExNiw2ICsxMTcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50YWxCdW5kbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gbWFrZXMgc3VyZQogCQkvLyB3ZSBjb3VsZCByZWFkIHRoZSBidW5kbGUgd2UgY3JlYXRlZC4KIAkJUmVwb3NpdG9yeSBuZXdSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UobmV3UmVwbyk7CiAJCUZldGNoUmVzdWx0IGZldGNoUmVzdWx0ID0gZmV0Y2hGcm9tQnVuZGxlKG5ld1JlcG8sIGJ1bmRsZSk7CiAJCVJlZiBhZHZlcnRpc2VkUmVmID0gZmV0Y2hSZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZigicmVmcy9oZWFkcy9hYSIpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggNjBiODA5OC4uOTNiZWRiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQpAQCAtMTEwLDYgKzExMCw3IEBAIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0xMzIsNiArMTMzLDcgQEAgcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5YWJjZGVmZyIpOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWFzc2VydFRydWUoZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5oYXMoZC5ibG9iKGRhdGEpKSk7CiAJCX0KIApAQCAtMTUxLDYgKzE1Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFja1dpdGhUcmFpbGluZ0dhcmJhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCJhIik7CiAJCX0KIApAQCAtMTgwLDYgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aFRyYWlsaW5nR2FyYmFnZSgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRnVsbEJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5Iik7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWQuYmxvYihkYXRhKTsKIAkJfQogCkBAIC0yMTMsNiArMjE3LDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVGdWxsQmxvYigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0yNDYsNiArMjUxLDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YUJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YVJlc3VsdFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCIwMTIzNDU2Nzg5Iik7CiAJCX0KIApAQCAtMjc4LDYgKzI4NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFSZXN1bHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE5vbk1hcmtpbmdJbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0zMTgsNiArMzI1LDcgQEAgcHVibGljIHZvaWQgbWFyayhpbnQgbWF4bGVuZ3RoKSB7CiAJcHVibGljIHZvaWQgdGVzdERhdGFBZnRlclBhY2tGb290ZXJTaW5nbGVSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJldkJsb2IgYTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeSBkID0gbmV3IFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQl9CiAKQEAgLTM3OSw2ICszODcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGF0YUFmdGVyUGFja0Zvb3RlclNwbGl0SGVhZGVyUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gZGF0YSA9IENvbnN0YW50cy5lbmNvZGUoImEiKTsKIAkJUmV2QmxvYiBiOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQliID0gZC5ibG9iKGRhdGEpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YQppbmRleCA2MTA5ZDZjLi5jYmMxZDU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTAgKzE0LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnLlB1c2hEZWZhdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFB1c2hDb25maWdUZXN0IHsKKwogCUBUZXN0CiAJcHVibGljIHZvaWQgcHVzaFJlY3Vyc2VTdWJtb2R1bGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRUcnVlKFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUuQ0hFQ0subWF0Y2hDb25maWdWYWx1ZSgiY2hlY2siKSk7CkBAIC01Miw0ICs1NSw1OSBAQCBwdWJsaWMgdm9pZCBwdXNoUmVjdXJzZVN1Ym1vZHVsZVRvQ29uZmlnVmFsdWUoKSB7CiAJCWFzc2VydEVxdWFscygiY2hlY2siLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLkNIRUNLLnRvQ29uZmlnVmFsdWUoKSk7CiAJCWFzc2VydEVxdWFscygiZmFsc2UiLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLk5PLnRvQ29uZmlnVmFsdWUoKSk7CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXNoRGVmYXVsdE1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuTk9USElORy5tYXRjaENvbmZpZ1ZhbHVlKCJub3RoaW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0Lk5PVEhJTkcubWF0Y2hDb25maWdWYWx1ZSgiTk9USElORyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5DVVJSRU5ULm1hdGNoQ29uZmlnVmFsdWUoImN1cnJlbnQiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuQ1VSUkVOVC5tYXRjaENvbmZpZ1ZhbHVlKCJDVVJSRU5UIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInVwc3RyZWFtIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlVQU1RSRUFNIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInRyYWNraW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlRSQUNLSU5HIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlNJTVBMRS5tYXRjaENvbmZpZ1ZhbHVlKCJzaW1wbGUiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuU0lNUExFLm1hdGNoQ29uZmlnVmFsdWUoIlNJTVBMRSIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJtYXRjaGluZyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJNQVRDSElORyIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0Tm9NYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5OT1RISU5HLm1hdGNoQ29uZmlnVmFsdWUoIm4iKSk7CisJCWFzc2VydEZhbHNlKFB1c2hEZWZhdWx0LkNVUlJFTlQubWF0Y2hDb25maWdWYWx1ZSgiIikpOworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5VUFNUUkVBTS5tYXRjaENvbmZpZ1ZhbHVlKCJ0cmFjayIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0VG9Db25maWdWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmciLCBQdXNoRGVmYXVsdC5OT1RISU5HLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY3VycmVudCIsIFB1c2hEZWZhdWx0LkNVUlJFTlQudG9Db25maWdWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1cHN0cmVhbSIsIFB1c2hEZWZhdWx0LlVQU1RSRUFNLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygic2ltcGxlIiwgUHVzaERlZmF1bHQuU0lNUExFLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibWF0Y2hpbmciLCBQdXNoRGVmYXVsdC5NQVRDSElORy50b0NvbmZpZ1ZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEVtcHR5Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoIiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5OTywgY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuU0lNUExFLCBjZmcuZ2V0UHVzaERlZmF1bHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoCisJCQkJIltwdXNoXVxuXHRkZWZhdWx0ID0gdHJhY2tpbmdcblx0cmVjdXJzZVN1Ym1vZHVsZXMgPSBvbi1kZW1hbmRcbiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5PTl9ERU1BTkQsCisJCQkJY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuVVBTVFJFQU0sIGNmZy5nZXRQdXNoRGVmYXVsdCgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBQdXNoQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGMgPSBuZXcgQ29uZmlnKCk7CisJCWMuZnJvbVRleHQoY29udGVudCk7CisJCXJldHVybiBjLmdldChQdXNoQ29uZmlnOjpuZXcpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKaW5kZXggNjkyODg1OS4uMmU4YjMwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCkBAIC0xNCwxNCArMTQsMTkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuUHJlUHVzaEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWRSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMzEsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50ZXN0LnJlc291cmNlcy5TYW1wbGVEYXRhUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVJlZlVwZGF0ZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtMjIwLDcgKzIyNiwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5leHBlY3RlZFJlbW90ZVZzRm9yY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJLmZyb21TdHJpbmcoIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiKSk7CiAJCWZpbmFsIFJlZiByZWYgPSBuZXcgT2JqZWN0SWRSZWYuVW5wZWVsZWQoUmVmLlN0b3JhZ2UuTE9PU0UsICJyZWZzL2hlYWRzL21hc3RlciIsCiAJCQkJT2JqZWN0SWQuZnJvbVN0cmluZygiYWM3ZTdlNDRjMTg4NWVmYjQ3MmFkNTRhNzgzMjdkNjZiZmM0ZWNlZiIpKTsKLQkJdGVzdE9uZVVwZGF0ZVN0YXR1cyhycnUsIHJlZiwgU3RhdHVzLlJFSkVDVEVEX1JFTU9URV9DSEFOR0VELCBudWxsKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCXRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCByZWYsIFN0YXR1cy5SRUpFQ1RFRF9SRU1PVEVfQ0hBTkdFRCwgbnVsbCwKKwkJCQkJaG9vayk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygiIiwgcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMjU2LDEwICsyNzIsMjIgQEAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1peGVkQ2FzZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZWZVcGRhdGVzLmFkZChycnVPayk7CiAJCXJlZlVwZGF0ZXMuYWRkKHJydVJlamVjdCk7CiAJCWFkdmVydGlzZWRSZWZzLmFkZChyZWZUb0NoYW5nZSk7Ci0JCWV4ZWN1dGVQdXNoKCk7Ci0JCWFzc2VydEVxdWFscyhTdGF0dXMuT0ssIHJydU9rLmdldFN0YXR1cygpKTsKLQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOwotCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk5PTl9FWElTVElORywgcnJ1UmVqZWN0LmdldFN0YXR1cygpKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCWV4ZWN1dGVQdXNoKGhvb2spOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSywgcnJ1T2suZ2V0U3RhdHVzKCkpOworCQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5OT05fRVhJU1RJTkcsIHJydVJlamVjdC5nZXRTdGF0dXMoKSk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIm51bGwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAiCisJCQkJCQkJKyAicmVmcy9oZWFkcy9tYXN0ZXIgMmMzNDkzMzViN2Y3OTcwNzJjZjcyOWM0ZjNiYjA5MTRlY2I2ZGVjOVxuIiwKKwkJCQkJcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMzQ2LDEwICszNzQsMTggQEAgcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKIAkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCiAJCQlCb29sZWFuIGZhc3RGb3J3YXJkKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLAogCQkJVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCBhZHZlcnRpc2VkUmVmLCBleHBlY3RlZFN0YXR1cywKKwkJCQlmYXN0Rm9yd2FyZCwgbnVsbCk7CisJfQorCisJcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKKwkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCisJCQlCb29sZWFuIGZhc3RGb3J3YXJkLCBQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmVmVXBkYXRlcy5hZGQocnJ1KTsKIAkJaWYgKGFkdmVydGlzZWRSZWYgIT0gbnVsbCkKIAkJCWFkdmVydGlzZWRSZWZzLmFkZChhZHZlcnRpc2VkUmVmKTsKLQkJZmluYWwgUHVzaFJlc3VsdCByZXN1bHQgPSBleGVjdXRlUHVzaCgpOworCQlmaW5hbCBQdXNoUmVzdWx0IHJlc3VsdCA9IGV4ZWN1dGVQdXNoKGhvb2spOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGF0dXMsIHJydS5nZXRTdGF0dXMoKSk7CiAJCWlmIChmYXN0Rm9yd2FyZCAhPSBudWxsKQogCQkJYXNzZXJ0RXF1YWxzKGZhc3RGb3J3YXJkLCBCb29sZWFuLnZhbHVlT2YocnJ1LmlzRmFzdEZvcndhcmQoKSkpOwpAQCAtMzU4LDcgKzM5NCwxMiBAQCBwcml2YXRlIFB1c2hSZXN1bHQgdGVzdE9uZVVwZGF0ZVN0YXR1cyhmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1LAogCiAJcHJpdmF0ZSBQdXNoUmVzdWx0IGV4ZWN1dGVQdXNoKCkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwKIAkJCVRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCXByb2Nlc3MgPSBuZXcgUHVzaFByb2Nlc3ModHJhbnNwb3J0LCByZWZVcGRhdGVzKTsKKwkJcmV0dXJuIGV4ZWN1dGVQdXNoKG51bGwpOworCX0KKworCXByaXZhdGUgUHVzaFJlc3VsdCBleGVjdXRlUHVzaChQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcHJvY2VzcyA9IG5ldyBQdXNoUHJvY2Vzcyh0cmFuc3BvcnQsIHJlZlVwZGF0ZXMsIGhvb2spOwogCQlyZXR1cm4gcHJvY2Vzcy5leGVjdXRlKG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCX0KIApAQCAtNDE2LDQgKzQ1NywyMCBAQCBwdWJsaWMgdm9pZCBwdXNoKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJfQogCQl9CiAJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1ByZVB1c2hIb29rIGV4dGVuZHMgUHJlUHVzaEhvb2sgeworCisJCXByaXZhdGUgZmluYWwgUHJpbnRTdHJlYW0gb3V0cHV0OworCisJCXB1YmxpYyBNb2NrUHJlUHVzaEhvb2soUmVwb3NpdG9yeSByZXBvLCBQcmludFN0cmVhbSBvdXQsCisJCQkJUHJpbnRTdHJlYW0gZXJyKSB7CisJCQlzdXBlcihyZXBvLCBvdXQsIGVycik7CisJCQlvdXRwdXQgPSBvdXQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB0aHJvd3MgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkJb3V0cHV0LnByaW50KGdldFN0ZGluQXJncygpKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQppbmRleCBkMWU1NDQ2Li5hOTFiYzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCkBAIC03MywxMSArNzMsMTQgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2V0VXAoKTsKIAogCQlzcmMgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShzcmMpOwogCQlkc3QgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkc3QpOwogCiAJCS8vIEZpbGwgZHN0IHdpdGggYSBzb21lIGNvbW1vbiBoaXN0b3J5LgogCQkvLwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8Pihkc3QpKSB7CisJCQlkc3QuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQkJQSA9IGQuY29tbWl0KGQudHJlZShkLmZpbGUoImEiLCBhKSkpOwogCQkJQiA9IGQuY29tbWl0KCkucGFyZW50KEEpLmNyZWF0ZSgpOwpAQCAtMTA2LDkgKzEwOSw2IEBAIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIaWRlc1ByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgSGlkZVByaXZhdGVIb29rKCkpOwogCQkJCXJldHVybiBycDsKQEAgLTEzNiw4ICsxMzYsNiBAQCBwdWJsaWMgdm9pZCByZXNldHNIYXZlcygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWRzdC5nZXREaXJlY3RvcnkoKSkgewogCQkJQE92ZXJyaWRlCiAJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCVJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgQWR2ZXJ0aXNlUmVmc0hvb2soKSB7CiAJCQkJCUBPdmVycmlkZQpAQCAtMTczLDkgKzE3MSw2IEBAIHByaXZhdGUgVHJhbnNwb3J0TG9jYWwgbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpCiAJCXJldHVybiBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKIAkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwpAQCAtMjExLDYgKzIwNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIE5vdyB1c2UgYiBidXQgaW4gYSBkaWZmZXJlbnQgY29tbWl0IHRoYW4gd2hhdCBpcyBoaWRkZW4uCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZDb21taXQgTiA9IHMuY29tbWl0KCkucGFyZW50KEIpLmFkZCgicSIsIGIpLmNyZWF0ZSgpOwogCQkJcy51cGRhdGUoUl9NQVNURVIsIE4pOwogCkBAIC0yMjgsNyArMjI0LDYgQEAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXRyeSAoVHJhbnNwb3J0TG9jYWwgdCA9IG5ld1RyYW5zcG9ydExvY2FsV2l0aFN0cmljdFZhbGlkYXRpb24oKSkgewogCQkJCXQuc2V0UHVzaFRoaW4odHJ1ZSk7CiAJCQkJciA9IHQucHVzaChQTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHUpKTsKLQkJCQlkc3QuY2xvc2UoKTsKIAkJCX0KIAogCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSByZXN1bHQiLCByKTsKQEAgLTI5MCw2ICsyODUsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHJlY2VpdmUoZmluYWwgUmVjZWl2ZVBhY2sgcnAsCiAJcHVibGljIHZvaWQgdGVzdFVzaW5nSGlkZGVuRGVsdGFCYXNlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGRlbHRhID0geyAweDEsIDB4MSwgMHgxLCAnYycgfTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikKIAkJCQkJLmFkZCgicSIsCiAJCQkJCQkJcy5ibG9iKEJpbmFyeURlbHRhLmFwcGx5KApAQCAtMzQ4LDYgKzM0NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RVc2luZ0hpZGRlbkNvbW1vbkJsb2JGYWlscygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUcnkgdG8gdXNlIHRoZSAnYicgYmxvYiB0aGF0IGlzIGhpZGRlbi4KIAkJLy8KIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJiIikpLmNyZWF0ZSgpOwogCiAJCQkvLyBCdXQgZG9uJ3QgaW5jbHVkZSBpdCBpbiB0aGUgcGFjay4KQEAgLTQwMSw2ICszOTgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdVbmtub3duQmxvYkZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRyeSB0byB1c2UgdGhlICduJyBibG9iIHRoYXQgaXMgbm90IG9uIHRoZSBzZXJ2ZXIuCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZCbG9iIG4gPSBzLmJsb2IoIm4iKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgbikuY3JlYXRlKCk7CiAKQEAgLTQ5MSw2ICs0ODksNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAkJCQkudG9TdHJpbmcoKTsKIAogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IHMgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihzcmMpKSB7CisJCQlzcmMuaW5jcmVtZW50T3BlbigpOwogCQkJUmV2QmxvYiBibG9iID0gcy5ibG9iKGZha2VHaXRtb2R1bGVzKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCIuZ2l0bW9kdWxlcyIsIGJsb2IpCiAJCQkJCS5jcmVhdGUoKTsKQEAgLTUxNyw2ICs1MTYsNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVc2luZ1Vua25vd25UcmVlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJhIikpLmNyZWF0ZSgpOwogCQkJUmV2VHJlZSB0ID0gcy5wYXJzZUJvZHkoTikuZ2V0VHJlZSgpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEKaW5kZXggNTU2OWJjYS4uYjU2MzA4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlY1Rlc3QuamF2YQpAQCAtNDY2LDQgKzQ2NiwxOCBAQCBwdWJsaWMgdm9pZCBvbmx5V2lsZENhcmQoKSB7CiAJCWFzc2VydFRydWUoYS5tYXRjaFNvdXJjZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CiAJCWFzc2VydE51bGwoYS5nZXREZXN0aW5hdGlvbigpKTsKIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1hdGNoaW5nKCkgeworCQlSZWZTcGVjIGEgPSBuZXcgUmVmU3BlYygiOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0RmFsc2UoYS5pc0ZvcmNlVXBkYXRlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWF0Y2hpbmdGb3JjZWQoKSB7CisJCVJlZlNwZWMgYSA9IG5ldyBSZWZTcGVjKCIrOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0VHJ1ZShhLmlzRm9yY2VVcGRhdGUoKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsdGVyQ29tbWFuZHNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQppbmRleCAzNmY5NGZiLi44OWQzMWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYsIENocmlzdGlhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE2LCAyMDIyIENocmlzdGlhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTIgKzEwLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5NZXJnZVJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kRmFjdG9yeTsKQEAgLTg2LDYgKzkxLDE0IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNlY29uZENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJTZWNvbmQgY29tbWl0IikuY2FsbCgpOwogCX0KIAorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNldDxTdHJpbmc+IGV4aXN0aW5nRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oCisJCQkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRGaWx0ZXJDb21tYW5kcygpKTsKKwkJZXhpc3RpbmdGaWx0ZXJzLmZvckVhY2goRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5Ojp1bnJlZ2lzdGVyKTsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RCdWlsdGluQ2xlYW5GaWx0ZXIoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewpAQCAtMjE3LDQgKzIzMCwxMzMgQEAgcHVibGljIHZvaWQgdGVzdEJ1aWx0aW5DbGVhbkFuZFNtdWRnZUZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW8KIAkJY29uZmlnLnNhdmUoKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCcmFuY2hTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWx0aW5Db21tYW5kUHJlZml4ID0gImpnaXQ6Ly9idWlsdGluL3Rlc3QvIjsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIsCisJCQkJbmV3IFRlc3RDb21tYW5kRmFjdG9yeSgncycpKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdjJykpOworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAic211ZGdlIiwKKwkJCQlidWlsdGluQ29tbWFuZFByZWZpeCArICJzbXVkZ2UiKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAiY2xlYW4iLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIik7CisJCWNvbmZpZy5zYXZlKCk7CisJCS8vIFdlJ3JlIG9uIHRoZSB0ZXN0IGJyYW5jaAorCQlGaWxlIGFGaWxlID0gd3JpdGVUcmFzaEZpbGUoImEudHh0IiwgImEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEudHh0IGZpbHRlcj10ZXN0Iik7CisJCUZpbGUgY0ZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiY2MvYy50eHQiLCAiQyIpOworCQl3cml0ZVRyYXNoRmlsZSgiY2MvLmdpdGF0dHJpYnV0ZXMiLCAiYy50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoInRlc3QiKS5jYWxsKCk7CisJCWNoZWNrRmlsZShhRmlsZSwgInNjc2EiKTsKKwkJY2hlY2tGaWxlKGNGaWxlLCAic2NzQyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0U2luZ2xlRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQlGaWxlIGF0dHJpYnV0ZXMgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoYUZpbGUuZXhpc3RzKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmV4aXN0cygpKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0U3RhcnRQb2ludCgidGVzdCIpLmFkZFBhdGgoImEudHh0IikuY2FsbCgpOworCQljaGVja0ZpbGUoYUZpbGUsICJzY3NhIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRTaW5nbGVGaWxlMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQlGaWxlIGF0dHJpYnV0ZXMgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoYUZpbGUuZXhpc3RzKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmV4aXN0cygpKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgIiIpOworCQlnaXQuY2hlY2tvdXQoKS5zZXRTdGFydFBvaW50KCJ0ZXN0IikuYWRkUGF0aCgiYS50eHQiKS5jYWxsKCk7CisJCWNoZWNrRmlsZShhRmlsZSwgInNjc2EiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoLiBTZXQgdXAgdHdvIGJyYW5jaGVzIHRoYXQgYXJlIGV4cGVjdGVkIHRvCisJCS8vIG1lcmdlIGNsZWFubHkuCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlSZXZDb21taXQgYUNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPbiB0ZXN0IikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCWFzc2VydEZhbHNlKGFGaWxlLmV4aXN0cygpKTsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJvdGhlciIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIvYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiYi8uZ2l0YXR0cmlidXRlcyIsICJiLnR4dCBmaWx0ZXI9dGVzdCIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPbiBvdGhlciIpLmNhbGwoKTsKKwkJTWVyZ2VSZXN1bHQgcmVzdWx0ID0gZ2l0Lm1lcmdlKCkuaW5jbHVkZShhQ29tbWl0KS5jYWxsKCk7CisJCWFzc2VydEVxdWFscyhNZXJnZVJlc3VsdC5NZXJnZVN0YXR1cy5NRVJHRUQsIHJlc3VsdC5nZXRNZXJnZVN0YXR1cygpKTsKKwkJY2hlY2tGaWxlKGFGaWxlLCAic2NzYSIpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNTdhOGJlZS4uN2JhYTIxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC00LDE0ICs0LDE0IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSI2LjAuMSIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iNi4xLjEiCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggMzM1YzE1Ny4uNzVmM2QyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC51aSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnVpO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC51aTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCmluZGV4IGM0YTNlMmEuLjEyNWUxMjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnVpPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCmluZGV4IGZkOTE0MzEuLjc5YjYwNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKQEAgLTUzLDYgKzUzLDI4IEBACiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlNIQTFfSU1QTEVNRU5UQVRJT04iLz4KICAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGlkPSIxMTQyOTQ3ODQzIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNi4xLjEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iQ09ORklHX0tFWV9UUlVTVF9QQUNLRURfUkVGU19TVEFUIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnJFRydXN0UGFja2VkUmVmc1N0YXQiPgorICAgICAgICA8ZmlsdGVyIGlkPSIxMTQyOTQ3ODQzIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNi4xLjEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iVHJ1c3RQYWNrZWRSZWZzU3RhdCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdERhdGFiYXNlIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM2Njk1MzM3Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0RGF0YWJhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KICAgICA8L3Jlc291cmNlPgogICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5Ij4KICAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+CkBAIC02Miw3ICs4NCw0NyBAQAogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+CiAgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQubGliLlR5cGVkQ29uZmlnR2V0dGVyIj4KKyAgICAgICAgPGZpbHRlciBpZD0iNDAzNzY3MzM2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuVHlwZWRDb25maWdHZXR0ZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iVU5TRVRfSU5UIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBpZD0iNDAzODA0MjA0Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuVHlwZWRDb25maWdHZXR0ZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0SW50SW5SYW5nZShDb25maWcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGludCwgaW50LCBpbnQpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjMzODc5MjU0NiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJhZGRDaGVja291dE1ldGFkYXRhKFN0cmluZywgQXR0cmlidXRlcykiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzg3OTI1NDYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlJlc29sdmVNZXJnZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iYWRkVG9DaGVja291dChTdHJpbmcsIERpckNhY2hlRW50cnksIEF0dHJpYnV0ZXMpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM4NzkyNTQ2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5tZXJnZS5SZXNvbHZlTWVyZ2VyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyLCBDYW5vbmljYWxUcmVlUGFyc2VyLCBDYW5vbmljYWxUcmVlUGFyc2VyLCBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IsIFdvcmtpbmdUcmVlSXRlcmF0b3IsIGJvb2xlYW4sIEF0dHJpYnV0ZXMpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgogICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL3BhY2svUGFja0NvbmZpZy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjay5QYWNrQ29uZmlnIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM2NjU4NDgxIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2suUGFja0NvbmZpZyIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJERUZBVUxUX0JJVE1BUF9FWENMVURFRF9SRUZTX1BSRUZJWEVTIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KICAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+CiAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMiIvPgpAQCAtOTAsNiArMTUyLDIyIEBACiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KICAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5CYXNlUGFja1B1c2hDb25uZWN0aW9uIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM4NzkyNTQ2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJub1JlcG9zaXRvcnkoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWcuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaENvbmZpZyI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjMzODcyMjkwNyI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWciLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iUHVzaENvbmZpZygpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgogICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0h0dHBTdXBwb3J0LmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydCI+CiAgICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgogICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgpAQCAtOTgsNiArMTc2LDY3IEBACiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KICAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL3NoYTEvU0hBMS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMS5TSEExIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM3NzY0NDE4Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTEuU0hBMSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjQyMTY1MDU0OSI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExLlNIQTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZGlnZXN0KCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGlkPSI0MjE2NTA1NDkiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMS5TSEExIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImRpZ2VzdChNdXRhYmxlT2JqZWN0SWQpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBpZD0iNDIxNjUwNTQ5Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTEuU0hBMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJoYXNDb2xsaXNpb24oKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjQyMTY1MDU0OSI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExLlNIQTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0icmVzZXQoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjQyMTY1MDU0OSI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExLlNIQTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ic2V0RGV0ZWN0Q29sbGlzaW9uKGJvb2xlYW4pIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBpZD0iNDIxNjUwNTQ5Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTEuU0hBMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJ0b09iamVjdElkKCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGlkPSI0MjE2NTA1NDkiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMS5TSEExIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InVwZGF0ZShieXRlKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjQyMTY1MDU0OSI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExLlNIQTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0idXBkYXRlKGJ5dGVbXSkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGlkPSI0MjE2NTA1NDkiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMS5TSEExIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InVwZGF0ZShieXRlW10sIGludCwgaW50KSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KICAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTEuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTEuU0hBMSRTaGExSW1wbGVtZW50YXRpb24iPgogICAgICAgICA8ZmlsdGVyIGlkPSIxMTQyOTQ3ODQzIj4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDg3YjU4ZTEuLjgwOGQ1ZDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMiArMywxMiBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBFY2xpcHNlLUV4dGVuc2libGVBUEk6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSI2LjAuMSI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKQEAgLTIzLDE4ICsyMywxOCBAQAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC00Miw0NCArNDIsNDggQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50cywKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2siLAotIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy54bWwuc2F4LmhlbHBlcnMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLnhtbC5zYXgiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249IjYuMC4xIjt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iNi4xLjEiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sO3ZlcnNpb249IjYuMS4xIjsKKyAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAorICAgb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdCwKKyAgIG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmZzY2s7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwucmV2d2Fsazt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5yZXZ3YWxrO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cCwKQEAgLTg4LDMyICs5MiwzMiBAQAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN1Ym1vZHVsZTt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5jb25uZWN0aXZpdHk7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3VibW9kdWxlO3ZlcnNpb249IjYuMS4xIjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LmNvbm5lY3Rpdml0eTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5wYXJzZXI7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKQEAgLTEyNywxMCArMTMxLDExIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5sb2dnaW5nO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSI2LjEuMSI7CisgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCwKKyAgIG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxvZ2dpbmc7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLApAQCAtMTM5LDQwICsxNDQsNDAgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpLAogICAgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5tZXJnZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wYXRjaDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5wYXRjaDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9ImphdmF4LmNyeXB0bywKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbywKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLApAQCAtMTg1LDIxICsxOTAsMjEgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2ssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycyIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJqYXZheC5uZXQuc3NsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5ob29rcywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKQEAgLTIxMiwxMiArMjE3LDEyIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgamF2YXgubmV0LnNzbCwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSI2LjAuMSIKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iNi4xLjEiCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCiBJbXBvcnQtUGFja2FnZTogY29tLmdvb2dsZWNvZGUuamF2YWV3YWg7dmVyc2lvbj0iWzEuMS42LDIuMC4wKSIsCiAgamF2YXguY3J5cHRvLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCAzMDJjNDU0Li4zM2U2MTU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0IC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQ7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0O3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKaW5kZXggZTc4MjI3Mi4uZjBlOTJiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbApAQCAtMjAsNyArMjAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKaW5kZXggYzg4N2M2ZC4uNTUzNGEwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcwpAQCAtMzU5LDYgKzM1OSw4IEBACiBpbk1lbW9yeUJ1ZmZlckxpbWl0RXhjZWVkZWQ9SW4tbWVtb3J5IGJ1ZmZlciBsaW1pdCBleGNlZWRlZAogaW5wdXREaWRudE1hdGNoTGVuZ3RoPUlucHV0IGRpZCBub3QgbWF0Y2ggc3VwcGxpZWQgbGVuZ3RoLiB7MH0gYnl0ZXMgYXJlIG1pc3NpbmcuCiBpbnB1dFN0cmVhbU11c3RTdXBwb3J0TWFyaz1JbnB1dFN0cmVhbSBtdXN0IHN1cHBvcnQgbWFyaygpCitpbnRlZ2VyVmFsdWVOb3RJblJhbmdlPUludGVnZXIgdmFsdWUgezB9LnsxfSA9IHsyfSBub3QgaW4gcmFuZ2UgezN9Li57NH0KK2ludGVnZXJWYWx1ZU5vdEluUmFuZ2VTdWJTZWN0aW9uPUludGVnZXIgdmFsdWUgezB9LnsxfS57Mn0gPSB7M30gbm90IGluIHJhbmdlIHs0fS4uezV9CiBpbnRlZ2VyVmFsdWVPdXRPZlJhbmdlPUludGVnZXIgdmFsdWUgezB9LnsxfSBvdXQgb2YgcmFuZ2UKIGludGVybmFsUmV2aXNpb25FcnJvcj1pbnRlcm5hbCByZXZpc2lvbiBlcnJvcgogaW50ZXJuYWxTZXJ2ZXJFcnJvcj1pbnRlcm5hbCBzZXJ2ZXIgZXJyb3IKQEAgLTM3MCw2ICszNzIsNyBAQAogaW52YWxpZEJvb2xlYW5WYWx1ZT1JbnZhbGlkIGJvb2xlYW4gdmFsdWU6IHswfS57MX09ezJ9CiBpbnZhbGlkQ2hhbm5lbD1JbnZhbGlkIGNoYW5uZWwgezB9CiBpbnZhbGlkQ29tbWl0UGFyZW50TnVtYmVyPUludmFsaWQgY29tbWl0IHBhcmVudCBudW1iZXIKK2ludmFsaWRDb3JlQWJicmV2PUludmFsaWQgdmFsdWUgezB9IG9mIG9wdGlvbiBjb3JlLmFiYnJldgogaW52YWxpZERlcHRoPUludmFsaWQgZGVwdGg6IHswfQogaW52YWxpZEVuY29kaW5nPUludmFsaWQgZW5jb2RpbmcgZnJvbSBnaXQgY29uZmlnIGkxOG4uY29tbWl0RW5jb2Rpbmc6IHswfQogaW52YWxpZEVuY3J5cHRpb249SW52YWxpZCBlbmNyeXB0aW9uCkBAIC01NzEsNiArNTc0LDExIEBACiBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkRmllbGRWYWx1ZT1QdXNoIGNlcnRpZmljYXRlIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgdmFsdWUgZm9yIHswfTogezF9CiBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkSGVhZGVyPVB1c2ggY2VydGlmaWNhdGUgaGFzIGludmFsaWQgaGVhZGVyIGZvcm1hdAogcHVzaENlcnRpZmljYXRlSW52YWxpZFNpZ25hdHVyZT1QdXNoIGNlcnRpZmljYXRlIGhhcyBpbnZhbGlkIHNpZ25hdHVyZSBmb3JtYXQKK3B1c2hEZWZhdWx0Tm90aGluZz1ObyByZWZzcGVjIGdpdmVuIGFuZCBwdXNoLmRlZmF1bHQ9bm90aGluZzsgbm8gdXBzdHJlYW0gYnJhbmNoIGNhbiBiZSBkZXRlcm1pbmVkCitwdXNoRGVmYXVsdE5vVXBzdHJlYW09Tm8gdXBzdHJlYW0gYnJhbmNoIGZvdW5kIGZvciBsb2NhbCBicmFuY2ggJyd7MH0nJworcHVzaERlZmF1bHRTaW1wbGU9cHVzaC5kZWZhdWx0PXNpbXBsZSByZXF1aXJlcyBsb2NhbCBicmFuY2ggbmFtZSAnJ3swfScnIHRvIGJlIGVxdWFsIHRvIHVwc3RyZWFtIHRyYWNrZWQgYnJhbmNoIG5hbWUgJyd7MX0nJworcHVzaERlZmF1bHRUcmlhbmd1bGFyVXBzdHJlYW09cHVzaC5kZWZhdWx0PXVwc3RyZWFtIGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIHB1c2ggcmVtb3RlICcnezB9JycgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZldGNoIHJlbW90ZSAnJ3sxfScnCitwdXNoRGVmYXVsdFVua25vd249VW5rbm93biBwdXNoLmRlZmF1bHQ9ezB9OyBjYW5ub3QgcHVzaAogcHVzaElzTm90U3VwcG9ydGVkRm9yQnVuZGxlVHJhbnNwb3J0PVB1c2ggaXMgbm90IHN1cHBvcnRlZCBmb3IgYnVuZGxlIHRyYW5zcG9ydAogcHVzaE5vdFBlcm1pdHRlZD1wdXNoIG5vdCBwZXJtaXR0ZWQKIHB1c2hPcHRpb25zTm90U3VwcG9ydGVkPVB1c2ggb3B0aW9ucyBub3Qgc3VwcG9ydGVkOyByZWNlaXZlZCB7MH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCmluZGV4IDc5MjJmOWUuLmY4ODE3OWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQpAQCAtOSw2ICs5LDggQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKQEAgLTEyNCw3ICsxMjYsNyBAQCBwdWJsaWMgQ2hlcnJ5UGlja1Jlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9NZXNzYWdlRXhjZXB0aW9uLAogCQkJCWZpbmFsIFJldkNvbW1pdCBzcmNQYXJlbnQgPSBnZXRQYXJlbnRDb21taXQoc3JjQ29tbWl0LCByZXZXYWxrKTsKIAogCQkJCVN0cmluZyBvdXJOYW1lID0gY2FsY3VsYXRlT3VyTmFtZShoZWFkUmVmKTsKLQkJCQlTdHJpbmcgY2hlcnJ5UGlja05hbWUgPSBzcmNDb21taXQuZ2V0SWQoKS5hYmJyZXZpYXRlKDcpLm5hbWUoKQorCQkJCVN0cmluZyBjaGVycnlQaWNrTmFtZSA9IHNyY0NvbW1pdC5nZXRJZCgpLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKS5uYW1lKCkKIAkJCQkJCSsgIiAiICsgc3JjQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCiAKIAkJCQlNZXJnZXIgbWVyZ2VyID0gc3RyYXRlZ3kubmV3TWVyZ2VyKHJlcG8pOwpAQCAtMTgzLDcgKzE4NSw3IEBAIHB1YmxpYyBDaGVycnlQaWNrUmVzdWx0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBOb01lc3NhZ2VFeGNlcHRpb24sCiAJCQkJCWlmICh1bm1lcmdlZFBhdGhzICE9IG51bGwpIHsKIAkJCQkJCW1lc3NhZ2UgPSBuZXcgTWVyZ2VNZXNzYWdlRm9ybWF0dGVyKCkKIAkJCQkJCQkuZm9ybWF0V2l0aENvbmZsaWN0cyhzcmNDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSwKLQkJCQkJCQkJCQl1bm1lcmdlZFBhdGhzKTsKKwkJCQkJCQkJCQl1bm1lcmdlZFBhdGhzLCAnIycpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJbWVzc2FnZSA9IHNyY0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpOwogCQkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKaW5kZXggMzdmMWQ0OC4uN2E1OTFhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5BYm9ydGVkQnlIb29rRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5DYW5jZWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbjsKQEAgLTQ2LDYgKzQ3LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzLlByZUNvbW1pdEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWcuQ2xlYW51cE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkdwZ0NvbmZpZzsKQEAgLTEzMyw2ICsxMzYsMTIgQEAgcHVibGljIGNsYXNzIENvbW1pdENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFJldkNvbW1pdD4gewogCiAJcHJpdmF0ZSBDcmVkZW50aWFsc1Byb3ZpZGVyIGNyZWRlbnRpYWxzUHJvdmlkZXI7CiAKKwlwcml2YXRlIEBOb25OdWxsIENsZWFudXBNb2RlIGNsZWFudXBNb2RlID0gQ2xlYW51cE1vZGUuVkVSQkFUSU07CisKKwlwcml2YXRlIGJvb2xlYW4gY2xlYW5EZWZhdWx0SXNTdHJpcCA9IHRydWU7CisKKwlwcml2YXRlIENoYXJhY3RlciBjb21tZW50Q2hhcjsKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBDb21taXRDb21tYW5kCiAJICoKQEAgLTIwMCw3ICsyMDksNyBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBBYm9ydGVkQnlIb29rRXhjZXB0aW9uLAogCQkJCXRocm93IG5ldyBXcm9uZ1JlcG9zaXRvcnlTdGF0ZUV4Y2VwdGlvbigKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmNvbW1pdEFtZW5kT25Jbml0aWFsTm90UG9zc2libGUpOwogCi0JCQlpZiAoaGVhZElkICE9IG51bGwpCisJCQlpZiAoaGVhZElkICE9IG51bGwpIHsKIAkJCQlpZiAoYW1lbmQpIHsKIAkJCQkJUmV2Q29tbWl0IHByZXZpb3VzQ29tbWl0ID0gcncucGFyc2VDb21taXQoaGVhZElkKTsKIAkJCQkJZm9yIChSZXZDb21taXQgcCA6IHByZXZpb3VzQ29tbWl0LmdldFBhcmVudHMoKSkKQEAgLTIxMCw3ICsyMTksNyBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBBYm9ydGVkQnlIb29rRXhjZXB0aW9uLAogCQkJCX0gZWxzZSB7CiAJCQkJCXBhcmVudHMuYWRkKDAsIGhlYWRJZCk7CiAJCQkJfQotCisJCQl9CiAJCQlpZiAoIW5vVmVyaWZ5KSB7CiAJCQkJbWVzc2FnZSA9IEhvb2tzCiAJCQkJCQkuY29tbWl0TXNnKHJlcG8sCkBAIC0yMTksNiArMjI4LDE5IEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIEFib3J0ZWRCeUhvb2tFeGNlcHRpb24sCiAJCQkJCQkuc2V0Q29tbWl0TWVzc2FnZShtZXNzYWdlKS5jYWxsKCk7CiAJCQl9CiAKKwkJCUNvbW1pdENvbmZpZyBjb25maWcgPSBudWxsOworCQkJaWYgKENsZWFudXBNb2RlLkRFRkFVTFQuZXF1YWxzKGNsZWFudXBNb2RlKSkgeworCQkJCWNvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCkuZ2V0KENvbW1pdENvbmZpZy5LRVkpOworCQkJCWNsZWFudXBNb2RlID0gY29uZmlnLnJlc29sdmUoY2xlYW51cE1vZGUsIGNsZWFuRGVmYXVsdElzU3RyaXApOworCQkJfQorCQkJY2hhciBjb21tZW50czsKKwkJCWlmIChjb21tZW50Q2hhciA9PSBudWxsKSB7CisJCQkJY29tbWVudHMgPSAnIyc7IC8vIFRPRE8gdXNlIGdpdCBjb25maWcgY29yZS5jb21tZW50Q2hhcgorCQkJfSBlbHNlIHsKKwkJCQljb21tZW50cyA9IGNvbW1lbnRDaGFyLmNoYXJWYWx1ZSgpOworCQkJfQorCQkJbWVzc2FnZSA9IENvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgY2xlYW51cE1vZGUsIGNvbW1lbnRzKTsKKwogCQkJUmV2Q29tbWl0IHJldkNvbW1pdDsKIAkJCURpckNhY2hlIGluZGV4ID0gcmVwby5sb2NrRGlyQ2FjaGUoKTsKIAkJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgb2RpID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpKSB7CkBAIC02NTgsNiArNjgwLDU3IEBAIHB1YmxpYyBDb21taXRDb21tYW5kIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAl9CiAKIAkvKioKKwkgKiBTZXRzIHRoZSB7QGxpbmsgQ2xlYW51cE1vZGV9IHRvIGFwcGx5IHRvIHRoZSBjb21taXQgbWVzc2FnZS4gSWYgbm90CisJICogY2FsbGVkLCB7QGxpbmsgQ29tbWl0Q29tbWFuZH0gYXBwbGllcyB7QGxpbmsgQ2xlYW51cE1vZGUjVkVSQkFUSU19LgorCSAqCisJICogQHBhcmFtIG1vZGUKKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gc2V0CisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIENvbW1pdENvbW1hbmQgc2V0Q2xlYW51cE1vZGUoQE5vbk51bGwgQ2xlYW51cE1vZGUgbW9kZSkgeworCQljaGVja0NhbGxhYmxlKCk7CisJCXRoaXMuY2xlYW51cE1vZGUgPSBtb2RlOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBkZWZhdWx0IGNsZWFuIG1vZGUgaWYge0BsaW5rICNzZXRDbGVhbnVwTW9kZShDbGVhbnVwTW9kZSkKKwkgKiBzZXRDbGVhbnVwTW9kZShDbGVhbnVwTW9kZS5ERUZBVUxUKX0gaXMgc2V0IGFuZCBnaXQgY29uZmlnCisJICoge0Bjb2RlIGNvbW1pdC5jbGVhbnVwID0gZGVmYXVsdH0gb3IgaXMgbm90IHNldC4KKwkgKgorCSAqIEBwYXJhbSBzdHJpcAorCSAqICAgICAgICAgICAgaWYge0Bjb2RlIHRydWV9LCBkZWZhdWx0IHRvIHtAbGluayBDbGVhbnVwTW9kZSNTVFJJUH07CisJICogICAgICAgICAgICBvdGhlcndpc2UgZGVmYXVsdCB0byB7QGxpbmsgQ2xlYW51cE1vZGUjV0hJVEVTUEFDRX0KKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgQ29tbWl0Q29tbWFuZCBzZXREZWZhdWx0Q2xlYW4oYm9vbGVhbiBzdHJpcCkgeworCQljaGVja0NhbGxhYmxlKCk7CisJCXRoaXMuY2xlYW5EZWZhdWx0SXNTdHJpcCA9IHN0cmlwOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjb21tZW50IGNoYXJhY3RlciB0byBhcHBseSB3aGVuIGNsZWFuaW5nIGEgY29tbWl0IG1lc3NhZ2UuIElmCisJICoge0Bjb2RlIG51bGx9ICh0aGUgZGVmYXVsdCkgYW5kIHRoZSB7QGxpbmsgI3NldENsZWFudXBNb2RlKENsZWFudXBNb2RlKQorCSAqIGNsZWFuLXVwIG1vZGV9IGlzIHtAbGluayBDbGVhbnVwTW9kZSNTVFJJUH0gb3IKKwkgKiB7QGxpbmsgQ2xlYW51cE1vZGUjU0NJU1NPUlN9LCB0aGUgdmFsdWUgb2YgZ2l0IGNvbmZpZworCSAqIHtAY29kZSBjb3JlLmNvbW1lbnRDaGFyfSB3aWxsIGJlIHVzZWQuCisJICoKKwkgKiBAcGFyYW0gY29tbWVudENoYXIKKwkgKiAgICAgICAgICAgIHRoZSBjb21tZW50IGNoYXJhY3Rlciwgb3Ige0Bjb2RlIG51bGx9IHRvIHVzZSB0aGUgdmFsdWUgZnJvbQorCSAqICAgICAgICAgICAgdGhlIGdpdCBjb25maWcKKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgQ29tbWl0Q29tbWFuZCBzZXRDb21tZW50Q2hhcmFjdGVyKENoYXJhY3RlciBjb21tZW50Q2hhcikgeworCQljaGVja0NhbGxhYmxlKCk7CisJCXRoaXMuY29tbWVudENoYXIgPSBjb21tZW50Q2hhcjsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCiAJICogU2V0IHdoZXRoZXIgdG8gYWxsb3cgdG8gY3JlYXRlIGFuIGVtcHR5IGNvbW1pdAogCSAqCiAJICogQHBhcmFtIGFsbG93RW1wdHkKQEAgLTgwNiw3ICs4NzksNyBAQCBwdWJsaWMgQ29tbWl0Q29tbWFuZCBzZXRBbGwoYm9vbGVhbiBhbGwpIHsKIAkgKiBjb21tYW5kIGxpbmUuCiAJICoKIAkgKiBAcGFyYW0gYW1lbmQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gYW1tZW5kIHRoZSB0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoCisJICogICAgICAgICAgICB3aGV0aGVyIHRvIGFtZW5kIHRoZSB0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KIAlwdWJsaWMgQ29tbWl0Q29tbWFuZCBzZXRBbWVuZChib29sZWFuIGFtZW5kKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhCmluZGV4IDFlNTI0ZmEuLjgwNWE4ODYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfUkVGUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuVHlwZWRDb25maWdHZXR0ZXIuVU5TRVRfSU5UOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTMzLDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaC5GaWxlTmFtZU1hdGNoZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKQEAgLTg5LDYgKzkxLDExIEBAIHB1YmxpYyBjbGFzcyBEZXNjcmliZUNvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFN0cmluZz4gewogCXByaXZhdGUgYm9vbGVhbiBhbHdheXM7CiAKIAkvKioKKwkgKiBUaGUgcHJlZml4IGxlbmd0aCB0byB1c2Ugd2hlbiBhYmJyZXZpYXRpbmcgYSBjb21taXQgaGFzaC4KKwkgKi8KKwlwcml2YXRlIGludCBhYmJyZXYgPSBVTlNFVF9JTlQ7CisKKwkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgRGVzY3JpYmVDb21tYW5kLgogCSAqCiAJICogQHBhcmFtIHJlcG8KQEAgLTIwNSwxMiArMjEyLDMzIEBAIHB1YmxpYyBEZXNjcmliZUNvbW1hbmQgc2V0QWx3YXlzKGJvb2xlYW4gYWx3YXlzKSB7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCS8qKgorCSAqIFNldHMgdGhlIHByZWZpeCBsZW5ndGggdG8gdXNlIHdoZW4gYWJicmV2aWF0aW5nIGFuIG9iamVjdCBTSEEtMS4KKwkgKgorCSAqIEBwYXJhbSBhYmJyZXYKKwkgKiAgICAgICAgICAgIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBhYmJyZXZpYXRlZCBzdHJpbmcuIE11c3QgYmUgaW4gdGhlIHJhbmdlCisJICogICAgICAgICAgICBbe0B2YWx1ZSBBYmJyZXZDb25maWcjTUlOX0FCQlJFVn0sCisJICogICAgICAgICAgICB7QHZhbHVlIENvbnN0YW50cyNPQkpFQ1RfSURfU1RSSU5HX0xFTkdUSH1dLgorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBEZXNjcmliZUNvbW1hbmQgc2V0QWJicmV2KGludCBhYmJyZXYpIHsKKwkJaWYgKGFiYnJldiA9PSAwKSB7CisJCQl0aGlzLmFiYnJldiA9IDA7CisJCX0gZWxzZSB7CisJCQl0aGlzLmFiYnJldiA9IEFiYnJldkNvbmZpZy5jYXBBYmJyZXYoYWJicmV2KTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisKIAlwcml2YXRlIFN0cmluZyBsb25nRGVzY3JpcHRpb24oUmVmIHRhZywgaW50IGRlcHRoLCBPYmplY3RJZCB0aXApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgKLQkJCQkiJXMtJWQtZyVzIiwgZm9ybWF0UmVmTmFtZSh0YWcuZ2V0TmFtZSgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCUludGVnZXIudmFsdWVPZihkZXB0aCksIHcuZ2V0T2JqZWN0UmVhZGVyKCkuYWJicmV2aWF0ZSh0aXApCi0JCQkJCQkubmFtZSgpKTsKKwkJaWYgKGFiYnJldiA9PSAwKSB7CisJCQlyZXR1cm4gZm9ybWF0UmVmTmFtZSh0YWcuZ2V0TmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMtJWQtZyVzIiwgZm9ybWF0UmVmTmFtZSh0YWcuZ2V0TmFtZSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCUludGVnZXIudmFsdWVPZihkZXB0aCksCisJCQkJdy5nZXRPYmplY3RSZWFkZXIoKS5hYmJyZXZpYXRlKHRpcCwgYWJicmV2KS5uYW1lKCkpOwogCX0KIAogCS8qKgpAQCAtMzAyLDYgKzMzMCw5IEBAIHB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQkJaWYgKHRhcmdldCA9PSBudWxsKSB7CiAJCQkJc2V0VGFyZ2V0KENvbnN0YW50cy5IRUFEKTsKIAkJCX0KKwkJCWlmIChhYmJyZXYgPT0gVU5TRVRfSU5UKSB7CisJCQkJYWJicmV2ID0gQWJicmV2Q29uZmlnLnBhcnNlRnJvbUNvbmZpZyhyZXBvKS5nZXQoKTsKKwkJCX0KIAogCQkJQ29sbGVjdGlvbjxSZWY+IHRhZ0xpc3QgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkKIAkJCQkJLmdldFJlZnNCeVByZWZpeCh1c2VBbGwgPyBSX1JFRlMgOiBSX1RBR1MpOwpAQCAtNDEzLDcgKzQ0NCwxMiBAQCBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgdGlwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCQkvLyBpZiBhbGwgdGhlIG5vZGVzIGFyZSBkb21pbmF0ZWQgYnkgYWxsIHRoZSB0YWdzLCB0aGUgd2FsayBzdG9wcwogCQkJaWYgKGNhbmRpZGF0ZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIGFsd2F5cyA/IHcuZ2V0T2JqZWN0UmVhZGVyKCkuYWJicmV2aWF0ZSh0YXJnZXQpLm5hbWUoKSA6IG51bGw7CisJCQkJcmV0dXJuIGFsd2F5cworCQkJCQkJPyB3LmdldE9iamVjdFJlYWRlcigpCisJCQkJCQkJCS5hYmJyZXZpYXRlKHRhcmdldCwKKwkJCQkJCQkJCQlBYmJyZXZDb25maWcuY2FwQWJicmV2KGFiYnJldikpCisJCQkJCQkJCS5uYW1lKCkKKwkJCQkJCTogbnVsbDsKIAkJCX0KIAogCQkJQ2FuZGlkYXRlIGJlc3QgPSBDb2xsZWN0aW9ucy5taW4oY2FuZGlkYXRlcywKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKaW5kZXggZWY1NmQ4MC4uY2UwNjhiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKQEAgLTQwNSw3ICs0MDUsNyBAQCBwdWJsaWMgTWVyZ2VSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vSGVhZEV4Y2VwdGlvbiwKIAkJCQkJCQlmYWlsaW5nUGF0aHMsIG51bGwpOwogCQkJCX0KIAkJCQlTdHJpbmcgbWVyZ2VNZXNzYWdlV2l0aENvbmZsaWN0cyA9IG5ldyBNZXJnZU1lc3NhZ2VGb3JtYXR0ZXIoKQotCQkJCQkJLmZvcm1hdFdpdGhDb25mbGljdHMobWVyZ2VNZXNzYWdlLCB1bm1lcmdlZFBhdGhzKTsKKwkJCQkJCS5mb3JtYXRXaXRoQ29uZmxpY3RzKG1lcmdlTWVzc2FnZSwgdW5tZXJnZWRQYXRocywgJyMnKTsKIAkJCQlyZXBvLndyaXRlTWVyZ2VDb21taXRNc2cobWVyZ2VNZXNzYWdlV2l0aENvbmZsaWN0cyk7CiAJCQkJcmV0dXJuIG5ldyBNZXJnZVJlc3VsdChudWxsLCBtZXJnZXIuZ2V0QmFzZUNvbW1pdElkKCksCiAJCQkJCQluZXcgT2JqZWN0SWRbXSB7IGhlYWRDb21taXQuZ2V0SWQoKSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCmluZGV4IGFhNWE2MzQuLjA4MzUzZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIENocmlzIEFuaXN6Y3p5ayA8Y2FuaXN6Y3p5a0BnbWFpbC5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAyMiBDaHJpcyBBbmlzemN6eWsgPGNhbmlzemN6eWtAZ21haWwuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw5IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5EZXRhY2hlZEhlYWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZFJlZk5hbWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRSZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CkBAIC0yOSwxMSArMzEsMTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ub29MYXJnZVBhY2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQnJhbmNoQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaENvbmZpZy5QdXNoRGVmYXVsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkxlYXNlU3BlYzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZTcGVjOwpAQCAtNTIsNyArNTksNyBAQAogcHVibGljIGNsYXNzIFB1c2hDb21tYW5kIGV4dGVuZHMKIAkJVHJhbnNwb3J0Q29tbWFuZDxQdXNoQ29tbWFuZCwgSXRlcmFibGU8UHVzaFJlc3VsdD4+IHsKIAotCXByaXZhdGUgU3RyaW5nIHJlbW90ZSA9IENvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworCXByaXZhdGUgU3RyaW5nIHJlbW90ZTsKIAogCXByaXZhdGUgZmluYWwgTGlzdDxSZWZTcGVjPiByZWZTcGVjczsKIApAQCAtNzEsNiArNzgsMTAgQEAgcHVibGljIGNsYXNzIFB1c2hDb21tYW5kIGV4dGVuZHMKIAogCXByaXZhdGUgTGlzdDxTdHJpbmc+IHB1c2hPcHRpb25zOwogCisJLy8gTGVnYWN5IGJlaGF2aW9yIGFzIGRlZmF1bHQuIFVzZSBzZXRQdXNoRGVmYXVsdChudWxsKSB0byBkZXRlcm1pbmUgdGhlCisJLy8gdmFsdWUgZnJvbSB0aGUgZ2l0IGNvbmZpZy4KKwlwcml2YXRlIFB1c2hEZWZhdWx0IHB1c2hEZWZhdWx0ID0gUHVzaERlZmF1bHQuQ1VSUkVOVDsKKwogCS8qKgogCSAqIDxwPgogCSAqIENvbnN0cnVjdG9yIGZvciBQdXNoQ29tbWFuZC4KQEAgLTk4LDE5ICsxMDksMjAgQEAgcHVibGljIEl0ZXJhYmxlPFB1c2hSZXN1bHQ+IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAogCQkJSW52YWxpZFJlbW90ZUV4Y2VwdGlvbiwKIAkJCW9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb24gewogCQljaGVja0NhbGxhYmxlKCk7CisJCXNldENhbGxhYmxlKGZhbHNlKTsKIAogCQlBcnJheUxpc3Q8UHVzaFJlc3VsdD4gcHVzaFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4oMyk7CiAKIAkJdHJ5IHsKKwkJCUNvbmZpZyBjb25maWcgPSByZXBvLmdldENvbmZpZygpOworCQkJcmVtb3RlID0gZGV0ZXJtaW5lUmVtb3RlKGNvbmZpZywgcmVtb3RlKTsKIAkJCWlmIChyZWZTcGVjcy5pc0VtcHR5KCkpIHsKLQkJCQlSZW1vdGVDb25maWcgY29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhyZXBvLmdldENvbmZpZygpLAorCQkJCVJlbW90ZUNvbmZpZyByYyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLAogCQkJCQkJZ2V0UmVtb3RlKCkpOwotCQkJCXJlZlNwZWNzLmFkZEFsbChjb25maWcuZ2V0UHVzaFJlZlNwZWNzKCkpOwotCQkJfQotCQkJaWYgKHJlZlNwZWNzLmlzRW1wdHkoKSkgewotCQkJCVJlZiBoZWFkID0gcmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7Ci0JCQkJaWYgKGhlYWQgIT0gbnVsbCAmJiBoZWFkLmlzU3ltYm9saWMoKSkKLQkJCQkJcmVmU3BlY3MuYWRkKG5ldyBSZWZTcGVjKGhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKSkpOworCQkJCXJlZlNwZWNzLmFkZEFsbChyYy5nZXRQdXNoUmVmU3BlY3MoKSk7CisJCQkJaWYgKHJlZlNwZWNzLmlzRW1wdHkoKSkgeworCQkJCQlkZXRlcm1pbmVEZWZhdWx0UmVmU3BlY3MoY29uZmlnKTsKKwkJCQl9CiAJCQl9CiAKIAkJCWlmIChmb3JjZSkgewpAQCAtMTE4LDggKzEzMCw4IEBAIHB1YmxpYyBJdGVyYWJsZTxQdXNoUmVzdWx0PiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwKIAkJCQkJcmVmU3BlY3Muc2V0KGksIHJlZlNwZWNzLmdldChpKS5zZXRGb3JjZVVwZGF0ZSh0cnVlKSk7CiAJCQl9CiAKLQkJCWZpbmFsIExpc3Q8VHJhbnNwb3J0PiB0cmFuc3BvcnRzOwotCQkJdHJhbnNwb3J0cyA9IFRyYW5zcG9ydC5vcGVuQWxsKHJlcG8sIHJlbW90ZSwgVHJhbnNwb3J0Lk9wZXJhdGlvbi5QVVNIKTsKKwkJCUxpc3Q8VHJhbnNwb3J0PiB0cmFuc3BvcnRzID0gVHJhbnNwb3J0Lm9wZW5BbGwocmVwbywgcmVtb3RlLAorCQkJCQlUcmFuc3BvcnQuT3BlcmF0aW9uLlBVU0gpOwogCQkJZm9yIChAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBFeHBsaWNpdGx5IGNsb3NlZCBpbiBmaW5hbGx5CiAJCQkJCWZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQgOiB0cmFuc3BvcnRzKSB7CiAJCQkJdHJhbnNwb3J0LnNldFB1c2hUaGluKHRoaW4pOwpAQCAtMTcxLDYgKzE4MywxMDIgQEAgcHVibGljIEl0ZXJhYmxlPFB1c2hSZXN1bHQ+IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAogCQlyZXR1cm4gcHVzaFJlc3VsdHM7CiAJfQogCisJcHJpdmF0ZSBTdHJpbmcgZGV0ZXJtaW5lUmVtb3RlKENvbmZpZyBjb25maWcsIFN0cmluZyByZW1vdGVOYW1lKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHJlbW90ZU5hbWUgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlbW90ZU5hbWU7CisJCX0KKwkJUmVmIGhlYWQgPSByZXBvLmV4YWN0UmVmKENvbnN0YW50cy5IRUFEKTsKKwkJU3RyaW5nIGVmZmVjdGl2ZVJlbW90ZSA9IG51bGw7CisJCUJyYW5jaENvbmZpZyBicmFuY2hDZmcgPSBudWxsOworCQlpZiAoaGVhZCAhPSBudWxsICYmIGhlYWQuaXNTeW1ib2xpYygpKSB7CisJCQlTdHJpbmcgY3VycmVudEJyYW5jaCA9IGhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKTsKKwkJCWJyYW5jaENmZyA9IG5ldyBCcmFuY2hDb25maWcoY29uZmlnLAorCQkJCQlSZXBvc2l0b3J5LnNob3J0ZW5SZWZOYW1lKGN1cnJlbnRCcmFuY2gpKTsKKwkJCWVmZmVjdGl2ZVJlbW90ZSA9IGJyYW5jaENmZy5nZXRQdXNoUmVtb3RlKCk7CisJCX0KKwkJaWYgKGVmZmVjdGl2ZVJlbW90ZSA9PSBudWxsKSB7CisJCQllZmZlY3RpdmVSZW1vdGUgPSBjb25maWcuZ2V0U3RyaW5nKAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLCBudWxsLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QVVNIX0RFRkFVTFQpOworCQkJaWYgKGVmZmVjdGl2ZVJlbW90ZSA9PSBudWxsICYmIGJyYW5jaENmZyAhPSBudWxsKSB7CisJCQkJZWZmZWN0aXZlUmVtb3RlID0gYnJhbmNoQ2ZnLmdldFJlbW90ZSgpOworCQkJfQorCQl9CisJCWlmIChlZmZlY3RpdmVSZW1vdGUgPT0gbnVsbCkgeworCQkJZWZmZWN0aXZlUmVtb3RlID0gQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CisJCX0KKwkJcmV0dXJuIGVmZmVjdGl2ZVJlbW90ZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50QnJhbmNoKCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgRGV0YWNoZWRIZWFkRXhjZXB0aW9uIHsKKwkJUmVmIGhlYWQgPSByZXBvLmV4YWN0UmVmKENvbnN0YW50cy5IRUFEKTsKKwkJaWYgKGhlYWQgIT0gbnVsbCAmJiBoZWFkLmlzU3ltYm9saWMoKSkgeworCQkJcmV0dXJuIGhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKTsKKwkJfQorCQl0aHJvdyBuZXcgRGV0YWNoZWRIZWFkRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRldGVybWluZURlZmF1bHRSZWZTcGVjcyhDb25maWcgY29uZmlnKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQlpZiAocHVzaERlZmF1bHQgPT0gbnVsbCkgeworCQkJcHVzaERlZmF1bHQgPSBjb25maWcuZ2V0KFB1c2hDb25maWc6Om5ldykuZ2V0UHVzaERlZmF1bHQoKTsKKwkJfQorCQlzd2l0Y2ggKHB1c2hEZWZhdWx0KSB7CisJCWNhc2UgQ1VSUkVOVDoKKwkJCXJlZlNwZWNzLmFkZChuZXcgUmVmU3BlYyhnZXRDdXJyZW50QnJhbmNoKCkpKTsKKwkJCWJyZWFrOworCQljYXNlIE1BVENISU5HOgorCQkJcmVmU3BlY3MuYWRkKG5ldyBSZWZTcGVjKCI6IikpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBOT1RISU5HOgorCQkJdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uKAorCQkJCQlKR2l0VGV4dC5nZXQoKS5wdXNoRGVmYXVsdE5vdGhpbmcpOworCQljYXNlIFNJTVBMRToKKwkJY2FzZSBVUFNUUkVBTToKKwkJCVN0cmluZyBjdXJyZW50QnJhbmNoID0gZ2V0Q3VycmVudEJyYW5jaCgpOworCQkJQnJhbmNoQ29uZmlnIGJyYW5jaENmZyA9IG5ldyBCcmFuY2hDb25maWcoY29uZmlnLAorCQkJCQlSZXBvc2l0b3J5LnNob3J0ZW5SZWZOYW1lKGN1cnJlbnRCcmFuY2gpKTsKKwkJCVN0cmluZyBmZXRjaFJlbW90ZSA9IGJyYW5jaENmZy5nZXRSZW1vdGUoKTsKKwkJCWlmIChmZXRjaFJlbW90ZSA9PSBudWxsKSB7CisJCQkJZmV0Y2hSZW1vdGUgPSBDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKKwkJCX0KKwkJCWJvb2xlYW4gaXNUcmlhbmd1bGFyID0gIWZldGNoUmVtb3RlLmVxdWFscyhyZW1vdGUpOworCQkJaWYgKGlzVHJpYW5ndWxhcikgeworCQkJCWlmIChQdXNoRGVmYXVsdC5VUFNUUkVBTS5lcXVhbHMocHVzaERlZmF1bHQpKSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5wdXNoRGVmYXVsdFRyaWFuZ3VsYXJVcHN0cmVhbSwKKwkJCQkJCQlyZW1vdGUsIGZldGNoUmVtb3RlKSk7CisJCQkJfQorCQkJCS8vIFN0cmFuZ2UsIGJ1dCBjb25zaXN0ZW50IHdpdGggQyBnaXQ6ICJzaW1wbGUiIGRvZXNuJ3QgZXZlbgorCQkJCS8vIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBjb25maWd1cmVkIHVwc3RyZWFtLCBhbmQgaWYgc28sIHRoYXQKKwkJCQkvLyBpdCBpcyBlcXVhbCB0byB0aGUgbG9jYWwgYnJhbmNoIG5hbWUuIEl0IGp1c3QgYmVjb21lcworCQkJCS8vICJjdXJyZW50Ii4KKwkJCQlyZWZTcGVjcy5hZGQobmV3IFJlZlNwZWMoY3VycmVudEJyYW5jaCkpOworCQkJfSBlbHNlIHsKKwkJCQlTdHJpbmcgdHJhY2tlZEJyYW5jaCA9IGJyYW5jaENmZy5nZXRNZXJnZSgpOworCQkJCWlmIChicmFuY2hDZmcuaXNSZW1vdGVMb2NhbCgpIHx8IHRyYWNrZWRCcmFuY2ggPT0gbnVsbAorCQkJCQkJfHwgIXRyYWNrZWRCcmFuY2guc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpIHsKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLnB1c2hEZWZhdWx0Tm9VcHN0cmVhbSwKKwkJCQkJCQljdXJyZW50QnJhbmNoKSk7CisJCQkJfQorCQkJCWlmIChQdXNoRGVmYXVsdC5TSU1QTEUuZXF1YWxzKHB1c2hEZWZhdWx0KQorCQkJCQkJJiYgIXRyYWNrZWRCcmFuY2guZXF1YWxzKGN1cnJlbnRCcmFuY2gpKSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5wdXNoRGVmYXVsdFNpbXBsZSwgY3VycmVudEJyYW5jaCwKKwkJCQkJCQl0cmFja2VkQnJhbmNoKSk7CisJCQkJfQorCQkJCXJlZlNwZWNzLmFkZChuZXcgUmVmU3BlYyhjdXJyZW50QnJhbmNoICsgJzonICsgdHJhY2tlZEJyYW5jaCkpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnB1c2hEZWZhdWx0VW5rbm93biwgcHVzaERlZmF1bHQpKTsKKwkJfQorCX0KKwogCS8qKgogCSAqIFRoZSByZW1vdGUgKHVyaSBvciBuYW1lKSB1c2VkIGZvciB0aGUgcHVzaCBvcGVyYXRpb24uIElmIG5vIHJlbW90ZSBpcwogCSAqIHNldCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgPGNvZGU+Q29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU8L2NvZGU+IHdpbGwKQEAgLTMzNiw5ICs0NDQsMzcgQEAgcHVibGljIFB1c2hDb21tYW5kIHNldFJlZlNwZWNzKExpc3Q8UmVmU3BlYz4gc3BlY3MpIHsKIAl9CiAKIAkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayBQdXNoRGVmYXVsdH0gY3VycmVudGx5IHNldC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBQdXNoRGVmYXVsdH0sIG9yIHtAY29kZSBudWxsfSBpZiBub3Qgc2V0CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQdXNoRGVmYXVsdCBnZXRQdXNoRGVmYXVsdCgpIHsKKwkJcmV0dXJuIHB1c2hEZWZhdWx0OworCX0KKworCS8qKgorCSAqIFNldHMgYW4gZXhwbGljaXQge0BsaW5rIFB1c2hEZWZhdWx0fS4gVGhlIGRlZmF1bHQgdXNlZCBpZiB0aGlzIGlzIG5vdAorCSAqIGNhbGxlZCBpcyB7QGxpbmsgUHVzaERlZmF1bHQjQ1VSUkVOVH0gZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3aXRoCisJICogZWFybGllciBKR2l0IHZlcnNpb25zLgorCSAqCisJICogQHBhcmFtIHB1c2hEZWZhdWx0CisJICogICAgICAgICAgICB7QGxpbmsgUHVzaERlZmF1bHR9IHRvIHNldDsgaWYge0Bjb2RlIG51bGx9IHRoZSB2YWx1ZSBkZWZpbmVkCisJICogICAgICAgICAgICBpbiB0aGUgZ2l0IGNvbmZpZyB3aWxsIGJlIHVzZWQuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUHVzaENvbW1hbmQgc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQgcHVzaERlZmF1bHQpIHsKKwkJY2hlY2tDYWxsYWJsZSgpOworCQl0aGlzLnB1c2hEZWZhdWx0ID0gcHVzaERlZmF1bHQ7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgogCSAqIFB1c2ggYWxsIGJyYW5jaGVzIHVuZGVyIHJlZnMvaGVhZHMvKi4KIAkgKgotCSAqIEByZXR1cm4ge2NvZGUgdGhpc30KKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwogCXB1YmxpYyBQdXNoQ29tbWFuZCBzZXRQdXNoQWxsKCkgewogCQlyZWZTcGVjcy5hZGQoVHJhbnNwb3J0LlJFRlNQRUNfUFVTSF9BTEwpOwpAQCAtMzQ4LDcgKzQ4NCw3IEBAIHB1YmxpYyBQdXNoQ29tbWFuZCBzZXRQdXNoQWxsKCkgewogCS8qKgogCSAqIFB1c2ggYWxsIHRhZ3MgdW5kZXIgcmVmcy90YWdzLyouCiAJICoKLQkgKiBAcmV0dXJuIHtjb2RlIHRoaXN9CisJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KIAlwdWJsaWMgUHVzaENvbW1hbmQgc2V0UHVzaFRhZ3MoKSB7CiAJCXJlZlNwZWNzLmFkZChUcmFuc3BvcnQuUkVGU1BFQ19UQUdTKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQppbmRleCBhMjZmZmMyLi4yYjBkOGNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuUmViYXNlUmVzdWx0LlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5SZXNldENvbW1hbmQuUmVzZXRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5DaGVja291dENvbmZsaWN0RXhjZXB0aW9uOwpAQCAtNTIsNiArNTMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQWJicmV2aWF0ZWRPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuTnVsbFByb2dyZXNzTW9uaXRvcjsKQEAgLTIwNSw2ICsyMDgsOCBAQCBwdWJsaWMgZW51bSBPcGVyYXRpb24gewogCiAJcHJpdmF0ZSBJbnRlcmFjdGl2ZUhhbmRsZXIgaW50ZXJhY3RpdmVIYW5kbGVyOwogCisJcHJpdmF0ZSBDb21taXRDb25maWcgY29tbWl0Q29uZmlnOworCiAJcHJpdmF0ZSBib29sZWFuIHN0b3BBZnRlckluaXRpYWxpemF0aW9uID0gZmFsc2U7CiAKIAlwcml2YXRlIFJldkNvbW1pdCBuZXdIZWFkOwpAQCAtMjQ2LDYgKzI1MSw3IEBAIHB1YmxpYyBSZWJhc2VSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vSGVhZEV4Y2VwdGlvbiwKIAkJbGFzdFN0ZXBXYXNGb3J3YXJkID0gZmFsc2U7CiAJCWNoZWNrQ2FsbGFibGUoKTsKIAkJY2hlY2tQYXJhbWV0ZXJzKCk7CisJCWNvbW1pdENvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCkuZ2V0KENvbW1pdENvbmZpZy5LRVkpOwogCQl0cnkgewogCQkJc3dpdGNoIChvcGVyYXRpb24pIHsKIAkJCWNhc2UgQUJPUlQ6CkBAIC00NDEsMTEgKzQ0NywxNiBAQCBwcml2YXRlIFJlYmFzZVJlc3VsdCBwcm9jZXNzU3RlcChSZWJhc2VUb2RvTGluZSBzdGVwLCBib29sZWFuIHNob3VsZFBpY2spCiAJCQlyZXR1cm4gbnVsbDsgLy8gY29udGludWUgcmViYXNlIHByb2Nlc3Mgb24gcGljayBjb21tYW5kCiAJCWNhc2UgUkVXT1JEOgogCQkJU3RyaW5nIG9sZE1lc3NhZ2UgPSBjb21taXRUb1BpY2suZ2V0RnVsbE1lc3NhZ2UoKTsKLQkJCVN0cmluZyBuZXdNZXNzYWdlID0gaW50ZXJhY3RpdmVIYW5kbGVyCi0JCQkJCS5tb2RpZnlDb21taXRNZXNzYWdlKG9sZE1lc3NhZ2UpOworCQkJQ2xlYW51cE1vZGUgbW9kZSA9IGNvbW1pdENvbmZpZy5yZXNvbHZlKENsZWFudXBNb2RlLkRFRkFVTFQsIHRydWUpOworCQkJYm9vbGVhbltdIGRvQ2hhbmdlSWQgPSB7IGZhbHNlIH07CisJCQlTdHJpbmcgbmV3TWVzc2FnZSA9IGVkaXRDb21taXRNZXNzYWdlKGRvQ2hhbmdlSWQsIG9sZE1lc3NhZ2UsIG1vZGUpOwogCQkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChyZXBvKSkgewotCQkJCW5ld0hlYWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuZXdNZXNzYWdlKS5zZXRBbWVuZCh0cnVlKQotCQkJCQkJLnNldE5vVmVyaWZ5KHRydWUpLmNhbGwoKTsKKwkJCQluZXdIZWFkID0gZ2l0LmNvbW1pdCgpCisJCQkJCQkuc2V0TWVzc2FnZShuZXdNZXNzYWdlKQorCQkJCQkJLnNldEFtZW5kKHRydWUpCisJCQkJCQkuc2V0Tm9WZXJpZnkodHJ1ZSkKKwkJCQkJCS5zZXRJbnNlcnRDaGFuZ2VJZChkb0NoYW5nZUlkWzBdKQorCQkJCQkJLmNhbGwoKTsKIAkJCX0KIAkJCXJldHVybiBudWxsOwogCQljYXNlIEVESVQ6CkBAIC00NjAsMTcgKzQ3MSw0OSBAQCBwcml2YXRlIFJlYmFzZVJlc3VsdCBwcm9jZXNzU3RlcChSZWJhc2VUb2RvTGluZSBzdGVwLCBib29sZWFuIHNob3VsZFBpY2spCiAJCQlyZXNldFNvZnRUb1BhcmVudCgpOwogCQkJTGlzdDxSZWJhc2VUb2RvTGluZT4gc3RlcHMgPSByZXBvLnJlYWRSZWJhc2VUb2RvKAogCQkJCQlyZWJhc2VTdGF0ZS5nZXRQYXRoKEdJVF9SRUJBU0VfVE9ETyksIGZhbHNlKTsKLQkJCVJlYmFzZVRvZG9MaW5lIG5leHRTdGVwID0gc3RlcHMuaXNFbXB0eSgpID8gbnVsbCA6IHN0ZXBzLmdldCgwKTsKKwkJCWJvb2xlYW4gaXNMYXN0ID0gc3RlcHMuaXNFbXB0eSgpOworCQkJaWYgKCFpc0xhc3QpIHsKKwkJCQlzd2l0Y2ggKHN0ZXBzLmdldCgwKS5nZXRBY3Rpb24oKSkgeworCQkJCWNhc2UgRklYVVA6CisJCQkJY2FzZSBTUVVBU0g6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWlzTGFzdCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KIAkJCUZpbGUgbWVzc2FnZUZpeHVwRmlsZSA9IHJlYmFzZVN0YXRlLmdldEZpbGUoTUVTU0FHRV9GSVhVUCk7CiAJCQlGaWxlIG1lc3NhZ2VTcXVhc2hGaWxlID0gcmViYXNlU3RhdGUuZ2V0RmlsZShNRVNTQUdFX1NRVUFTSCk7Ci0JCQlpZiAoaXNTcXVhc2ggJiYgbWVzc2FnZUZpeHVwRmlsZS5leGlzdHMoKSkKKwkJCWlmIChpc1NxdWFzaCAmJiBtZXNzYWdlRml4dXBGaWxlLmV4aXN0cygpKSB7CiAJCQkJbWVzc2FnZUZpeHVwRmlsZS5kZWxldGUoKTsKLQkJCW5ld0hlYWQgPSBkb1NxdWFzaEZpeHVwKGlzU3F1YXNoLCBjb21taXRUb1BpY2ssIG5leHRTdGVwLAorCQkJfQorCQkJbmV3SGVhZCA9IGRvU3F1YXNoRml4dXAoaXNTcXVhc2gsIGNvbW1pdFRvUGljaywgaXNMYXN0LAogCQkJCQltZXNzYWdlRml4dXBGaWxlLCBtZXNzYWdlU3F1YXNoRmlsZSk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCisJcHJpdmF0ZSBTdHJpbmcgZWRpdENvbW1pdE1lc3NhZ2UoYm9vbGVhbltdIGRvQ2hhbmdlSWQsIFN0cmluZyBtZXNzYWdlLAorCQkJQE5vbk51bGwgQ2xlYW51cE1vZGUgbW9kZSkgeworCQlTdHJpbmcgbmV3TWVzc2FnZTsKKwkJQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlIGNsZWFudXA7CisJCWlmIChpbnRlcmFjdGl2ZUhhbmRsZXIgaW5zdGFuY2VvZiBJbnRlcmFjdGl2ZUhhbmRsZXIyKSB7CisJCQlJbnRlcmFjdGl2ZUhhbmRsZXIyLk1vZGlmeVJlc3VsdCBtb2RpZmljYXRpb24gPSAoKEludGVyYWN0aXZlSGFuZGxlcjIpIGludGVyYWN0aXZlSGFuZGxlcikKKwkJCQkJLmVkaXRDb21taXRNZXNzYWdlKG1lc3NhZ2UsIG1vZGUsICcjJyk7CisJCQluZXdNZXNzYWdlID0gbW9kaWZpY2F0aW9uLmdldE1lc3NhZ2UoKTsKKwkJCWNsZWFudXAgPSBtb2RpZmljYXRpb24uZ2V0Q2xlYW51cE1vZGUoKTsKKwkJCWlmIChDbGVhbnVwTW9kZS5ERUZBVUxULmVxdWFscyhjbGVhbnVwKSkgeworCQkJCWNsZWFudXAgPSBtb2RlOworCQkJfQorCQkJZG9DaGFuZ2VJZFswXSA9IG1vZGlmaWNhdGlvbi5zaG91bGRBZGRDaGFuZ2VJZCgpOworCQl9IGVsc2UgeworCQkJbmV3TWVzc2FnZSA9IGludGVyYWN0aXZlSGFuZGxlci5tb2RpZnlDb21taXRNZXNzYWdlKG1lc3NhZ2UpOworCQkJY2xlYW51cCA9IENvbW1pdENvbmZpZy5DbGVhbnVwTW9kZS5TVFJJUDsKKwkJCWRvQ2hhbmdlSWRbMF0gPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChuZXdNZXNzYWdlLCBjbGVhbnVwLCAnIycpOworCX0KKwogCXByaXZhdGUgUmViYXNlUmVzdWx0IGNoZXJyeVBpY2tDb21taXQoUmV2Q29tbWl0IGNvbW1pdFRvUGljaykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uLCBOb01lc3NhZ2VFeGNlcHRpb24sCiAJCQlVbm1lcmdlZFBhdGhzRXhjZXB0aW9uLCBDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uLApAQCAtNzA3LDcgKzc1MCw3IEBAIHByaXZhdGUgdm9pZCBjaGVja1N0ZXBzKExpc3Q8UmViYXNlVG9kb0xpbmU+IHN0ZXBzKQogCX0KIAogCXByaXZhdGUgUmV2Q29tbWl0IGRvU3F1YXNoRml4dXAoYm9vbGVhbiBpc1NxdWFzaCwgUmV2Q29tbWl0IGNvbW1pdFRvUGljaywKLQkJCVJlYmFzZVRvZG9MaW5lIG5leHRTdGVwLCBGaWxlIG1lc3NhZ2VGaXh1cCwgRmlsZSBtZXNzYWdlU3F1YXNoKQorCQkJYm9vbGVhbiBpc0xhc3QsIEZpbGUgbWVzc2FnZUZpeHVwLCBGaWxlIG1lc3NhZ2VTcXVhc2gpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiB7CiAKIAkJaWYgKCFtZXNzYWdlU3F1YXNoLmV4aXN0cygpKSB7CkBAIC03MTcsMjQgKzc2MCwyMCBAQCBwcml2YXRlIFJldkNvbW1pdCBkb1NxdWFzaEZpeHVwKGJvb2xlYW4gaXNTcXVhc2gsIFJldkNvbW1pdCBjb21taXRUb1BpY2ssCiAKIAkJCWluaXRpYWxpemVTcXVhc2hGaXh1cEZpbGUoTUVTU0FHRV9TUVVBU0gsCiAJCQkJCXByZXZpb3VzQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpOwotCQkJaWYgKCFpc1NxdWFzaCkKLQkJCQlpbml0aWFsaXplU3F1YXNoRml4dXBGaWxlKE1FU1NBR0VfRklYVVAsCi0JCQkJCXByZXZpb3VzQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpOworCQkJaWYgKCFpc1NxdWFzaCkgeworCQkJCXJlYmFzZVN0YXRlLmNyZWF0ZUZpbGUoTUVTU0FHRV9GSVhVUCwKKwkJCQkJCXByZXZpb3VzQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpOworCQkJfQogCQl9Ci0JCVN0cmluZyBjdXJyU3F1YXNoTWVzc2FnZSA9IHJlYmFzZVN0YXRlCi0JCQkJLnJlYWRGaWxlKE1FU1NBR0VfU1FVQVNIKTsKKwkJU3RyaW5nIGN1cnJTcXVhc2hNZXNzYWdlID0gcmViYXNlU3RhdGUucmVhZEZpbGUoTUVTU0FHRV9TUVVBU0gpOwogCiAJCWludCBjb3VudCA9IHBhcnNlU3F1YXNoRml4dXBTZXF1ZW5jZUNvdW50KGN1cnJTcXVhc2hNZXNzYWdlKSArIDE7CiAKIAkJU3RyaW5nIGNvbnRlbnQgPSBjb21wb3NlU3F1YXNoTWVzc2FnZShpc1NxdWFzaCwKIAkJCQljb21taXRUb1BpY2ssIGN1cnJTcXVhc2hNZXNzYWdlLCBjb3VudCk7CiAJCXJlYmFzZVN0YXRlLmNyZWF0ZUZpbGUoTUVTU0FHRV9TUVVBU0gsIGNvbnRlbnQpOwotCQlpZiAobWVzc2FnZUZpeHVwLmV4aXN0cygpKQotCQkJcmViYXNlU3RhdGUuY3JlYXRlRmlsZShNRVNTQUdFX0ZJWFVQLCBjb250ZW50KTsKIAotCQlyZXR1cm4gc3F1YXNoSW50b1ByZXZpb3VzKAotCQkJCSFtZXNzYWdlRml4dXAuZXhpc3RzKCksCi0JCQkJbmV4dFN0ZXApOworCQlyZXR1cm4gc3F1YXNoSW50b1ByZXZpb3VzKCFtZXNzYWdlRml4dXAuZXhpc3RzKCksIGlzTGFzdCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHJlc2V0U29mdFRvUGFyZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLApAQCAtNzU2LDI2ICs3OTUsMzAgQEAgcHJpdmF0ZSB2b2lkIHJlc2V0U29mdFRvUGFyZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLAogCX0KIAogCXByaXZhdGUgUmV2Q29tbWl0IHNxdWFzaEludG9QcmV2aW91cyhib29sZWFuIHNlcXVlbmNlQ29udGFpbnNTcXVhc2gsCi0JCQlSZWJhc2VUb2RvTGluZSBuZXh0U3RlcCkKKwkJCWJvb2xlYW4gaXNMYXN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewogCQlSZXZDb21taXQgcmV0TmV3SGVhZDsKLQkJU3RyaW5nIGNvbW1pdE1lc3NhZ2UgPSByZWJhc2VTdGF0ZQotCQkJCS5yZWFkRmlsZShNRVNTQUdFX1NRVUFTSCk7Ci0KKwkJU3RyaW5nIGNvbW1pdE1lc3NhZ2U7CisJCWlmICghaXNMYXN0IHx8IHNlcXVlbmNlQ29udGFpbnNTcXVhc2gpIHsKKwkJCWNvbW1pdE1lc3NhZ2UgPSByZWJhc2VTdGF0ZS5yZWFkRmlsZShNRVNTQUdFX1NRVUFTSCk7CisJCX0gZWxzZSB7CisJCQljb21taXRNZXNzYWdlID0gcmViYXNlU3RhdGUucmVhZEZpbGUoTUVTU0FHRV9GSVhVUCk7CisJCX0KIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChyZXBvKSkgewotCQkJaWYgKG5leHRTdGVwID09IG51bGwgfHwgKChuZXh0U3RlcC5nZXRBY3Rpb24oKSAhPSBBY3Rpb24uRklYVVApCi0JCQkJCSYmIChuZXh0U3RlcC5nZXRBY3Rpb24oKSAhPSBBY3Rpb24uU1FVQVNIKSkpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBsYXN0IHN0ZXAgaW4gdGhpcyBzZXF1ZW5jZQorCQkJaWYgKGlzTGFzdCkgeworCQkJCWJvb2xlYW5bXSBkb0NoYW5nZUlkID0geyBmYWxzZSB9OwogCQkJCWlmIChzZXF1ZW5jZUNvbnRhaW5zU3F1YXNoKSB7Ci0JCQkJCWNvbW1pdE1lc3NhZ2UgPSBpbnRlcmFjdGl2ZUhhbmRsZXIKLQkJCQkJCQkubW9kaWZ5Q29tbWl0TWVzc2FnZShjb21taXRNZXNzYWdlKTsKKwkJCQkJY29tbWl0TWVzc2FnZSA9IGVkaXRDb21taXRNZXNzYWdlKGRvQ2hhbmdlSWQsIGNvbW1pdE1lc3NhZ2UsCisJCQkJCQkJQ2xlYW51cE1vZGUuU1RSSVApOwogCQkJCX0KIAkJCQlyZXROZXdIZWFkID0gZ2l0LmNvbW1pdCgpCi0JCQkJCQkuc2V0TWVzc2FnZShzdHJpcENvbW1lbnRMaW5lcyhjb21taXRNZXNzYWdlKSkKLQkJCQkJCS5zZXRBbWVuZCh0cnVlKS5zZXROb1ZlcmlmeSh0cnVlKS5jYWxsKCk7CisJCQkJCQkuc2V0TWVzc2FnZShjb21taXRNZXNzYWdlKQorCQkJCQkJLnNldEFtZW5kKHRydWUpCisJCQkJCQkuc2V0Tm9WZXJpZnkodHJ1ZSkKKwkJCQkJCS5zZXRJbnNlcnRDaGFuZ2VJZChkb0NoYW5nZUlkWzBdKQorCQkJCQkJLmNhbGwoKTsKIAkJCQlyZWJhc2VTdGF0ZS5nZXRGaWxlKE1FU1NBR0VfU1FVQVNIKS5kZWxldGUoKTsKIAkJCQlyZWJhc2VTdGF0ZS5nZXRGaWxlKE1FU1NBR0VfRklYVVApLmRlbGV0ZSgpOwotCiAJCQl9IGVsc2UgewogCQkJCS8vIE5leHQgc3RlcCBpcyBlaXRoZXIgU3F1YXNoIG9yIEZpeHVwCiAJCQkJcmV0TmV3SGVhZCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKGNvbW1pdE1lc3NhZ2UpCkBAIC03ODUsMjEgKzgyOCw2IEBAIHByaXZhdGUgUmV2Q29tbWl0IHNxdWFzaEludG9QcmV2aW91cyhib29sZWFuIHNlcXVlbmNlQ29udGFpbnNTcXVhc2gsCiAJCXJldHVybiByZXROZXdIZWFkOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpcENvbW1lbnRMaW5lcyhTdHJpbmcgY29tbWl0TWVzc2FnZSkgewotCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoU3RyaW5nIGxpbmUgOiBjb21taXRNZXNzYWdlLnNwbGl0KCJcbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghbGluZS50cmltKCkuc3RhcnRzV2l0aCgiIyIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChsaW5lKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWNvbW1pdE1lc3NhZ2UuZW5kc1dpdGgoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGJ1ZmZlclNpemUgPSByZXN1bHQubGVuZ3RoKCk7Ci0JCQlpZiAoYnVmZmVyU2l6ZSA+IDAgJiYgcmVzdWx0LmNoYXJBdChidWZmZXJTaXplIC0gMSkgPT0gJ1xuJykgewotCQkJCXJlc3VsdC5kZWxldGVDaGFyQXQoYnVmZmVyU2l6ZSAtIDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KIAlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29tcG9zZVNxdWFzaE1lc3NhZ2UoYm9vbGVhbiBpc1NxdWFzaCwKIAkJCVJldkNvbW1pdCBjb21taXRUb1BpY2ssIFN0cmluZyBjdXJyU3F1YXNoTWVzc2FnZSwgaW50IGNvdW50KSB7CkBAIC0xNjI1LDI2ICsxNjUzLDEwNiBAQCBwdWJsaWMgUmViYXNlQ29tbWFuZCBzZXRQcmVzZXJ2ZU1lcmdlcyhib29sZWFuIHByZXNlcnZlKSB7CiAJfQogCiAJLyoqCi0JICogQWxsb3dzIGNvbmZpZ3VyZSByZWJhc2UgaW50ZXJhY3RpdmUgcHJvY2VzcyBhbmQgbW9kaWZ5IGNvbW1pdCBtZXNzYWdlCisJICogQWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJhY3RpdmUgcmViYXNlIHByb2Nlc3Mgc3RlcHMgYW5kIHRvIG1vZGlmeQorCSAqIGNvbW1pdCBtZXNzYWdlcy4KIAkgKi8KIAlwdWJsaWMgaW50ZXJmYWNlIEludGVyYWN0aXZlSGFuZGxlciB7CisKIAkJLyoqCi0JCSAqIEdpdmVuIGxpc3Qgb2Yge0Bjb2RlIHN0ZXBzfSBzaG91bGQgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHVzZXIKLQkJICogcmViYXNlIGNvbmZpZ3VyYXRpb24KKwkJICogQ2FsbGJhY2sgQVBJIHRvIG1vZGlmeSB0aGUgaW5pdGlhbCBsaXN0IG9mIGludGVyYWN0aXZlIHJlYmFzZSBzdGVwcy4KKwkJICoKIAkJICogQHBhcmFtIHN0ZXBzCi0JCSAqICAgICAgICAgICAgaW5pdGlhbCBjb25maWd1cmF0aW9uIG9mIHJlYmFzZSBpbnRlcmFjdGl2ZQorCQkgKiAgICAgICAgICAgIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSByZWJhc2UKIAkJICovCiAJCXZvaWQgcHJlcGFyZVN0ZXBzKExpc3Q8UmViYXNlVG9kb0xpbmU+IHN0ZXBzKTsKIAogCQkvKioKLQkJICogVXNlZCBmb3IgZWRpdGluZyBjb21taXQgbWVzc2FnZSBvbiBSRVdPUkQKKwkJICogVXNlZCBmb3IgZWRpdGluZyBjb21taXQgbWVzc2FnZSBvbiBSRVdPUkQgb3IgU1FVQVNILgogCQkgKgotCQkgKiBAcGFyYW0gY29tbWl0CisJCSAqIEBwYXJhbSBtZXNzYWdlCisJCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG1lc3NhZ2UKIAkJICogQHJldHVybiBuZXcgY29tbWl0IG1lc3NhZ2UKIAkJICovCi0JCVN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBjb21taXQpOworCQlTdHJpbmcgbW9kaWZ5Q29tbWl0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7CiAJfQogCisJLyoqCisJICogRXh0ZW5kcyB7QGxpbmsgSW50ZXJhY3RpdmVIYW5kbGVyfSB3aXRoIGFuIGVuaGFuY2VkIGNhbGxiYWNrIGZvciBlZGl0aW5nCisJICogY29tbWl0IG1lc3NhZ2VzLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJhY3RpdmVIYW5kbGVyMiBleHRlbmRzIEludGVyYWN0aXZlSGFuZGxlciB7CisKKwkJLyoqCisJCSAqIENhbGxiYWNrIEFQSSBmb3IgZWRpdGluZyBhIGNvbW1pdCBtZXNzYWdlIG9uIFJFV09SRCBvciBTUVVBU0guCisJCSAqIDxwPgorCQkgKiBUaGUgY2FsbGJhY2sgZ2V0cyB0aGUgY29tbWVudCBjaGFyYWN0ZXIgY3VycmVudGx5IHNldCwgYW5kIHRoZQorCQkgKiBjbGVhbi11cCBtb2RlLiBJdCBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBwcmVzZW50aW5nIHRoZQorCQkgKiBtZXNzYWdlIHRvIHRoZSB1c2VyLCBhbmQgaXQgYWxzbyBoYXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNsZWFuIHRoZQorCQkgKiBtZXNzYWdlIGl0c2VsZiAoaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuZWQge0BsaW5rIE1vZGlmeVJlc3VsdH0KKwkJICogc2hvdWxkIGhhdmUge0BsaW5rIENsZWFudXBNb2RlI1ZFUkJBVElNfSBzZXQgbGVzdCBKR2l0IGNsZWFucyB0aGUKKwkJICogbWVzc2FnZSBhZ2FpbikuIEl0IGNhbiBhbHNvIG92ZXJyaWRlIHRoZSBpbml0aWFsIGNsZWFuLXVwIG1vZGUgYnkKKwkJICogcmV0dXJuaW5nIGNsZWFuLXVwIG1vZGUgb3RoZXIgdGhhbiB7QGxpbmsgQ2xlYW51cE1vZGUjREVGQVVMVH0uIElmIGl0CisJCSAqIGRvZXMgcmV0dXJuIHtAY29kZSBERUZBVUxUfSwgdGhlIHBhc3NlZC1pbiB7QGNvZGUgbW9kZX0gd2lsbCBiZQorCQkgKiBhcHBsaWVkLgorCQkgKiA8L3A+CisJCSAqCisJCSAqIEBwYXJhbSBtZXNzYWdlCisJCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG1lc3NhZ2UKKwkJICogQHBhcmFtIG1vZGUKKwkJICogICAgICAgICAgICB7QGxpbmsgQ2xlYW51cE1vZGV9IGN1cnJlbnRseSBzZXQKKwkJICogQHBhcmFtIGNvbW1lbnRDaGFyCisJCSAqICAgICAgICAgICAgY29tbWVudCBjaGFyYWN0ZXIgdXNlZAorCQkgKiBAcmV0dXJuIGEge0BsaW5rIE1vZGlmeVJlc3VsdH0KKwkJICovCisJCUBOb25OdWxsCisJCU1vZGlmeVJlc3VsdCBlZGl0Q29tbWl0TWVzc2FnZShATm9uTnVsbCBTdHJpbmcgbWVzc2FnZSwKKwkJCQlATm9uTnVsbCBDbGVhbnVwTW9kZSBtb2RlLCBjaGFyIGNvbW1lbnRDaGFyKTsKKworCQlAT3ZlcnJpZGUKKwkJZGVmYXVsdCBTdHJpbmcgbW9kaWZ5Q29tbWl0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQkJLy8gU2hvdWxkIGFjdHVhbGx5IG5vdCBiZSBjYWxsZWQ7IGJ1dCBkbyBzb21ldGhpbmcgcmVhc29uYWJsZSBhbnl3YXkKKwkJCU1vZGlmeVJlc3VsdCByZXN1bHQgPSBlZGl0Q29tbWl0TWVzc2FnZSgKKwkJCQkJbWVzc2FnZSA9PSBudWxsID8gIiIgOiBtZXNzYWdlLCBDbGVhbnVwTW9kZS5TVFJJUCwgLy8kTk9OLU5MUy0xJAorCQkJCQknIycpOworCQkJcmV0dXJuIHJlc3VsdC5nZXRNZXNzYWdlKCk7CisJCX0KKworCQkvKioKKwkJICogRGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgZWRpdGluZyBhIGNvbW1pdCBtZXNzYWdlOiB0aGUgbmV3IG1lc3NhZ2UsCisJCSAqIGFuZCBob3cgaXQgc2hvdWxkIGJlIGNsZWFuZWQuCisJCSAqLworCQlpbnRlcmZhY2UgTW9kaWZ5UmVzdWx0IHsKKworCQkJLyoqCisJCQkgKiBSZXRyaWV2ZXMgdGhlIG5ldyBjb21taXQgbWVzc2FnZS4KKwkJCSAqCisJCQkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlCisJCQkgKi8KKwkJCUBOb25OdWxsCisJCQlTdHJpbmcgZ2V0TWVzc2FnZSgpOworCisJCQkvKioKKwkJCSAqIFRlbGxzIGhvdyB0aGUgbWVzc2FnZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gc2hvdWxkIGJlCisJCQkgKiBjbGVhbmVkLgorCQkJICoKKwkJCSAqIEByZXR1cm4gdGhlIHtAbGluayBDbGVhbnVwTW9kZX0KKwkJCSAqLworCQkJQE5vbk51bGwKKwkJCUNsZWFudXBNb2RlIGdldENsZWFudXBNb2RlKCk7CisKKwkJCS8qKgorCQkJICogVGVsbHMgd2hldGhlciBhIEdlcnJpdCBDaGFuZ2UtSWQgc2hvdWxkIGJlIGNvbXB1dGVkIGFuZCBhZGRlZCB0bworCQkJICogdGhlIGNvbW1pdCBtZXNzYWdlLCBhcyB3aXRoCisJCQkgKiB7QGxpbmsgQ29tbWl0Q29tbWFuZCNzZXRJbnNlcnRDaGFuZ2VJZChib29sZWFuKX0uCisJCQkgKgorCQkJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSBDaGFuZ2UtSWQgc2hvdWxkIGJlIGhhbmRsZWQsCisJCQkgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisJCQkgKi8KKwkJCWJvb2xlYW4gc2hvdWxkQWRkQ2hhbmdlSWQoKTsKKwkJfQorCX0KIAogCVBlcnNvbklkZW50IHBhcnNlQXV0aG9yKGJ5dGVbXSByYXcpIHsKIAkJaWYgKHJhdy5sZW5ndGggPT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmQuamF2YQppbmRleCAyMmVmNGQwLi5kYjg4YWQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZC5qYXZhCkBAIC05LDYgKzksOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwpAQCAtMTI4LDggKzEzMCw5IEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBOb01lc3NhZ2VFeGNlcHRpb24sIFVubWVyZ2VkUGF0aHNFeGNlcHRpb24sCiAJCQkJcmV2V2Fsay5wYXJzZUhlYWRlcnMoc3JjUGFyZW50KTsKIAogCQkJCVN0cmluZyBvdXJOYW1lID0gY2FsY3VsYXRlT3VyTmFtZShoZWFkUmVmKTsKLQkJCQlTdHJpbmcgcmV2ZXJ0TmFtZSA9IHNyY0NvbW1pdC5nZXRJZCgpLmFiYnJldmlhdGUoNykubmFtZSgpCi0JCQkJCQkrICIgIiArIHNyY0NvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyByZXZlcnROYW1lID0gc3JjQ29tbWl0LmdldElkKCkKKwkJCQkJCS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkubmFtZSgpICsgIiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgc3JjQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpOwogCiAJCQkJUmVzb2x2ZU1lcmdlciBtZXJnZXIgPSAoUmVzb2x2ZU1lcmdlcikgc3RyYXRlZ3kubmV3TWVyZ2VyKHJlcG8pOwogCQkJCW1lcmdlci5zZXRXb3JraW5nVHJlZUl0ZXJhdG9yKG5ldyBGaWxlVHJlZUl0ZXJhdG9yKHJlcG8pKTsKQEAgLTE4Myw4ICsxODYsOCBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgTm9NZXNzYWdlRXhjZXB0aW9uLCBVbm1lcmdlZFBhdGhzRXhjZXB0aW9uLAogCQkJCQkJCQltZXJnZXIuZ2V0TWVyZ2VSZXN1bHRzKCksIGZhaWxpbmdQYXRocywgbnVsbCk7CiAJCQkJCWlmICghbWVyZ2VyLmZhaWxlZCgpICYmICF1bm1lcmdlZFBhdGhzLmlzRW1wdHkoKSkgewogCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBuZXcgTWVyZ2VNZXNzYWdlRm9ybWF0dGVyKCkKLQkJCQkJCS5mb3JtYXRXaXRoQ29uZmxpY3RzKG5ld01lc3NhZ2UsCi0JCQkJCQkJCW1lcmdlci5nZXRVbm1lcmdlZFBhdGhzKCkpOworCQkJCQkJCQkuZm9ybWF0V2l0aENvbmZsaWN0cyhuZXdNZXNzYWdlLAorCQkJCQkJCQkJCW1lcmdlci5nZXRVbm1lcmdlZFBhdGhzKCksICcjJyk7CiAJCQkJCQlyZXBvLndyaXRlUmV2ZXJ0SGVhZChzcmNDb21taXQuZ2V0SWQoKSk7CiAJCQkJCQlyZXBvLndyaXRlTWVyZ2VDb21taXRNc2cobWVzc2FnZSk7CiAJCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKaW5kZXggMzVmZDg5OS4uZjdhMWY0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKQEAgLTksNiArOSw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0zMDIsNyArMzA0LDggQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCQlidWlsZGVyLnNldFBhcmVudElkKGhlYWRDb21taXQpOwogCQkJCWJ1aWxkZXIuc2V0VHJlZUlkKGNhY2hlLndyaXRlVHJlZShpbnNlcnRlcikpOwogCQkJCWJ1aWxkZXIuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChpbmRleE1lc3NhZ2UsIGJyYW5jaCwKLQkJCQkJCWhlYWRDb21taXQuYWJicmV2aWF0ZSg3KS5uYW1lKCksCisJCQkJCQloZWFkQ29tbWl0LmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKQorCQkJCQkJCQkubmFtZSgpLAogCQkJCQkJaGVhZENvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKSkpOwogCQkJCU9iamVjdElkIGluZGV4Q29tbWl0ID0gaW5zZXJ0ZXIuaW5zZXJ0KGJ1aWxkZXIpOwogCkBAIC0zMTksNyArMzIyLDEwIEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQkJCWJ1aWxkZXIuc2V0UGFyZW50SWRzKG5ldyBPYmplY3RJZFswXSk7CiAJCQkJCWJ1aWxkZXIuc2V0VHJlZUlkKHVudHJhY2tlZERpckNhY2hlLndyaXRlVHJlZShpbnNlcnRlcikpOwogCQkJCQlidWlsZGVyLnNldE1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoTVNHX1VOVFJBQ0tFRCwKLQkJCQkJCQlicmFuY2gsIGhlYWRDb21taXQuYWJicmV2aWF0ZSg3KS5uYW1lKCksCisJCQkJCQkJYnJhbmNoLAorCQkJCQkJCWhlYWRDb21taXQKKwkJCQkJCQkJCS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkJCQkJCS5uYW1lKCksCiAJCQkJCQkJaGVhZENvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKSkpOwogCQkJCQl1bnRyYWNrZWRDb21taXQgPSBpbnNlcnRlci5pbnNlcnQoYnVpbGRlcik7CiAJCQkJfQpAQCAtMzM5LDcgKzM0NSw4IEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQkJCWJ1aWxkZXIuYWRkUGFyZW50SWQodW50cmFja2VkQ29tbWl0KTsKIAkJCQlidWlsZGVyLnNldE1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQl3b3JraW5nRGlyZWN0b3J5TWVzc2FnZSwgYnJhbmNoLAotCQkJCQkJaGVhZENvbW1pdC5hYmJyZXZpYXRlKDcpLm5hbWUoKSwKKwkJCQkJCWhlYWRDb21taXQuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJCQkJCS5uYW1lKCksCiAJCQkJCQloZWFkQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpKSk7CiAJCQkJYnVpbGRlci5zZXRUcmVlSWQoY2FjaGUud3JpdGVUcmVlKGluc2VydGVyKSk7CiAJCQkJY29tbWl0SWQgPSBpbnNlcnRlci5pbnNlcnQoYnVpbGRlcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F0dHJpYnV0ZXMvQXR0cmlidXRlc0hhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXR0cmlidXRlcy9BdHRyaWJ1dGVzSGFuZGxlci5qYXZhCmluZGV4IDYzOGRkODIuLjdlYzc4NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXR0cmlidXRlcy9BdHRyaWJ1dGVzSGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXR0cmlidXRlcy9BdHRyaWJ1dGVzSGFuZGxlci5qYXZhCkBAIC0xLDQzICsxLDExIEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBJdmFuIE1vdHNjaCA8aXZhbi5tb3RzY2hAYnNpYWcuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE1LCAyMDIyIEl2YW4gTW90c2NoIDxpdmFuLm1vdHNjaEBic2lhZy5jb20+IGFuZCBvdGhlcnMKICAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KICAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczsKIApAQCAtNDYsNiArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5BdHRyaWJ1dGUuU3RhdGU7CkBAIC04NCw2ICs1Myw4IEBAIHB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzSGFuZGxlciB7CiAKIAlwcml2YXRlIGZpbmFsIFRyZWVXYWxrIHRyZWVXYWxrOwogCisJcHJpdmF0ZSBmaW5hbCBTdXBwbGllcjxDYW5vbmljYWxUcmVlUGFyc2VyPiBhdHRyaWJ1dGVzVHJlZTsKKwogCXByaXZhdGUgZmluYWwgQXR0cmlidXRlc05vZGUgZ2xvYmFsTm9kZTsKIAogCXByaXZhdGUgZmluYWwgQXR0cmlidXRlc05vZGUgaW5mb05vZGU7CkBAIC05OCwyMiArNjksNDEgQEAgcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNIYW5kbGVyIHsKIAkgKiBAcGFyYW0gdHJlZVdhbGsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogQGRlcHJlY2F0ZWQgc2luY2UgNi4xLCB1c2Uge0BsaW5rICNBdHRyaWJ1dGVzSGFuZGxlcihUcmVlV2FsaywgU3VwcGxpZXIpfQorCSAqICAgICAgICAgICAgIGluc3RlYWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBBdHRyaWJ1dGVzSGFuZGxlcihUcmVlV2FsayB0cmVlV2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdGhpcyh0cmVlV2FsaywgKCkgLT4gdHJlZVdhbGsuZ2V0VHJlZShDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuQXR0cmlidXRlc0hhbmRsZXJ9IHdpdGgKKwkgKiBkZWZhdWx0IHJ1bGVzIGFzIHdlbGwgYXMgbWVyZ2VkIHJ1bGVzIGZyb20gZ2xvYmFsLCBpbmZvIGFuZCB3b3JrdHJlZSByb290CisJICogYXR0cmlidXRlcworCSAqCisJICogQHBhcmFtIHRyZWVXYWxrCisJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrfQorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzVHJlZQorCSAqICAgICAgICAgICAgdGhlIHRyZWUgdG8gcmVhZCAuZ2l0YXR0cmlidXRlcyBmcm9tCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBBdHRyaWJ1dGVzSGFuZGxlcihUcmVlV2FsayB0cmVlV2FsaywKKwkJCVN1cHBsaWVyPENhbm9uaWNhbFRyZWVQYXJzZXI+IGF0dHJpYnV0ZXNUcmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzLnRyZWVXYWxrID0gdHJlZVdhbGs7Ci0JCUF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgYXR0cmlidXRlc05vZGVQcm92aWRlciA9dHJlZVdhbGsuZ2V0QXR0cmlidXRlc05vZGVQcm92aWRlcigpOworCQl0aGlzLmF0dHJpYnV0ZXNUcmVlID0gYXR0cmlidXRlc1RyZWU7CisJCUF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgYXR0cmlidXRlc05vZGVQcm92aWRlciA9IHRyZWVXYWxrCisJCQkJLmdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKTsKIAkJdGhpcy5nbG9iYWxOb2RlID0gYXR0cmlidXRlc05vZGVQcm92aWRlciAhPSBudWxsCiAJCQkJPyBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyLmdldEdsb2JhbEF0dHJpYnV0ZXNOb2RlKCkgOiBudWxsOwogCQl0aGlzLmluZm9Ob2RlID0gYXR0cmlidXRlc05vZGVQcm92aWRlciAhPSBudWxsCiAJCQkJPyBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyLmdldEluZm9BdHRyaWJ1dGVzTm9kZSgpIDogbnVsbDsKIAogCQlBdHRyaWJ1dGVzTm9kZSByb290Tm9kZSA9IGF0dHJpYnV0ZXNOb2RlKHRyZWVXYWxrLAotCQkJCXJvb3RPZigKLQkJCQkJCXRyZWVXYWxrLmdldFRyZWUoV29ya2luZ1RyZWVJdGVyYXRvci5jbGFzcykpLAotCQkJCXJvb3RPZigKLQkJCQkJCXRyZWVXYWxrLmdldFRyZWUoRGlyQ2FjaGVJdGVyYXRvci5jbGFzcykpLAotCQkJCXJvb3RPZih0cmVlV2FsawotCQkJCQkJLmdldFRyZWUoQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcykpKTsKKwkJCQlyb290T2YodHJlZVdhbGsuZ2V0VHJlZShXb3JraW5nVHJlZUl0ZXJhdG9yLmNsYXNzKSksCisJCQkJcm9vdE9mKHRyZWVXYWxrLmdldFRyZWUoRGlyQ2FjaGVJdGVyYXRvci5jbGFzcykpLAorCQkJCXJvb3RPZihhdHRyaWJ1dGVzVHJlZS5nZXQoKSkpOwogCiAJCWV4cGFuc2lvbnMucHV0KEJJTkFSWV9SVUxFX0tFWSwgQklOQVJZX1JVTEVfQVRUUklCVVRFUyk7CiAJCWZvciAoQXR0cmlidXRlc05vZGUgbm9kZSA6IG5ldyBBdHRyaWJ1dGVzTm9kZVtdIHsgZ2xvYmFsTm9kZSwgcm9vdE5vZGUsCkBAIC0xNTIsNyArMTQyLDcgQEAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJaXNEaXJlY3RvcnksCiAJCQkJdHJlZVdhbGsuZ2V0VHJlZShXb3JraW5nVHJlZUl0ZXJhdG9yLmNsYXNzKSwKIAkJCQl0cmVlV2Fsay5nZXRUcmVlKERpckNhY2hlSXRlcmF0b3IuY2xhc3MpLAotCQkJCXRyZWVXYWxrLmdldFRyZWUoQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcyksCisJCQkJYXR0cmlidXRlc1RyZWUuZ2V0KCksCiAJCQkJYXR0cmlidXRlcyk7CiAKIAkJLy8gR2V0cyB0aGUgYXR0cmlidXRlcyBsb2NhdGVkIGluIHRoZSBnbG9iYWwgYXR0cmlidXRlIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCmluZGV4IDQ5ZGE5NWMuLjFhNWY3NGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LkNoYW5nZVR5cGUuUkVOQU1FOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LlNpZGUuTkVXOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LlNpZGUuT0xEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuZW5jb2RlOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuZW5jb2RlQVNDSUk7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlLkdJVExJTks7CkBAIC05MCw3ICs5MSw3IEBAIHB1YmxpYyBjbGFzcyBEaWZmRm9ybWF0dGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CiAKIAlwcml2YXRlIGludCBjb250ZXh0ID0gMzsKIAotCXByaXZhdGUgaW50IGFiYnJldmlhdGlvbkxlbmd0aCA9IDc7CisJcHJpdmF0ZSBpbnQgYWJicmV2aWF0aW9uTGVuZ3RoID0gT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOwogCiAJcHJpdmF0ZSBEaWZmQWxnb3JpdGhtIGRpZmZBbGdvcml0aG07CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUNoZWNrb3V0LmphdmEKaW5kZXggYzkwNGE3OC4uM2Q1MGE4MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUNoZWNrb3V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUNoZWNrb3V0LmphdmEKQEAgLTQsNyArNCw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFJvZ2VyIEMuIFNvYXJlcyA8cm9nZXJzb2FyZXNAaW50ZWxpbmV0LmNvbS5icj4KICAqIENvcHlyaWdodCAoQykgMjAwNiwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpc2lhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIwLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE5LCAyMDIwLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE3LCAyMDIyLCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMjk5LDcgKzMwMCw3IEBAIHB1YmxpYyB2b2lkIHByZVNjYW5Ud29UcmVlcygpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXdhbGsgPSBuZXcgTmFtZUNvbmZsaWN0VHJlZVdhbGsocmVwbyk7CiAJCWJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAKLQkJYWRkVHJlZSh3YWxrLCBoZWFkQ29tbWl0VHJlZSk7CisJCXdhbGsuc2V0SGVhZChhZGRUcmVlKHdhbGssIGhlYWRDb21taXRUcmVlKSk7CiAJCWFkZFRyZWUod2FsaywgbWVyZ2VDb21taXRUcmVlKTsKIAkJaW50IGRjaVBvcyA9IHdhbGsuYWRkVHJlZShuZXcgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yKGJ1aWxkZXIpKTsKIAkJd2Fsay5hZGRUcmVlKHdvcmtpbmdUcmVlKTsKQEAgLTMxNSwxMyArMzE2LDYgQEAgcHVibGljIHZvaWQgcHJlU2NhblR3b1RyZWVzKCkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRUcmVlKFRyZWVXYWxrIHR3LCBPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0dy5hZGRUcmVlKG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpKTsKLQkJZWxzZQotCQkJdHcuYWRkVHJlZShpZCk7Ci0JfQotCiAJLyoqCiAJICogU2NhbiBpbmRleCBhbmQgbWVyZ2UgdHJlZSAobm8gSEVBRCkuIFVzZWQgZS5nLiBmb3IgaW5pdGlhbCBjaGVja291dCB3aGVuCiAJICogdGhlcmUgaXMgbm8gaGVhZCB5ZXQuCkBAIC0zNDEsNyArMzM1LDcgQEAgcHVibGljIHZvaWQgcHJlc2Nhbk9uZVRyZWUoKQogCQlidWlsZGVyID0gZGMuYnVpbGRlcigpOwogCiAJCXdhbGsgPSBuZXcgTmFtZUNvbmZsaWN0VHJlZVdhbGsocmVwbyk7Ci0JCWFkZFRyZWUod2FsaywgbWVyZ2VDb21taXRUcmVlKTsKKwkJd2Fsay5zZXRIZWFkKGFkZFRyZWUod2FsaywgbWVyZ2VDb21taXRUcmVlKSk7CiAJCWludCBkY2lQb3MgPSB3YWxrLmFkZFRyZWUobmV3IERpckNhY2hlQnVpbGRJdGVyYXRvcihidWlsZGVyKSk7CiAJCXdhbGsuYWRkVHJlZSh3b3JraW5nVHJlZSk7CiAJCXdvcmtpbmdUcmVlLnNldERpckNhY2hlSXRlcmF0b3Iod2FsaywgZGNpUG9zKTsKQEAgLTM1Niw2ICszNTAsMTQgQEAgcHVibGljIHZvaWQgcHJlc2Nhbk9uZVRyZWUoKQogCQljb25mbGljdHMucmVtb3ZlQWxsKHJlbW92ZWQpOwogCX0KIAorCXByaXZhdGUgaW50IGFkZFRyZWUoVHJlZVdhbGsgdHcsIE9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJaWYgKGlkID09IG51bGwpIHsKKwkJCXJldHVybiB0dy5hZGRUcmVlKG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpKTsKKwkJfQorCQlyZXR1cm4gdHcuYWRkVHJlZShpZCk7CisJfQorCiAJLyoqCiAJICogUHJvY2Vzc2luZyBhbiBlbnRyeSBpbiB0aGUgY29udGV4dCBvZiB7QGxpbmsgI3ByZXNjYW5PbmVUcmVlKCl9IHdoZW4gb25seQogCSAqIG9uZSB0cmVlIGlzIGdpdmVuCkBAIC0zODIsMTcgKzM4NCwxNCBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIG0sIERpckNhY2hlQnVpbGRJdGVyYXRvciBpLAogCQkJCQkJLy8gZmFpbE9uQ29uZmxpY3QgaXMgZmFsc2UuIFB1dHRpbmcgc29tZXRoaW5nIHRvIGNvbmZsaWN0cwogCQkJCQkJLy8gd291bGQgbWVhbiB3ZSBkZWxldGUgaXQuIEluc3RlYWQgd2Ugd2FudCB0aGUgbWVyZ2VDb21taXQKIAkJCQkJCS8vIGNvbnRlbnQgdG8gYmUgY2hlY2tlZCBvdXQuCi0JCQkJCQl1cGRhdGUobS5nZXRFbnRyeVBhdGhTdHJpbmcoKSwgbS5nZXRFbnRyeU9iamVjdElkKCksCi0JCQkJCQkJCW0uZ2V0RW50cnlGaWxlTW9kZSgpKTsKKwkJCQkJCXVwZGF0ZShtKTsKIAkJCQkJfQogCQkJCX0gZWxzZQotCQkJCQl1cGRhdGUobS5nZXRFbnRyeVBhdGhTdHJpbmcoKSwgbS5nZXRFbnRyeU9iamVjdElkKCksCi0JCQkJCQltLmdldEVudHJ5RmlsZU1vZGUoKSk7CisJCQkJCXVwZGF0ZShtKTsKIAkJCX0gZWxzZSBpZiAoZiA9PSBudWxsIHx8ICFtLmlkRXF1YWwoaSkpIHsKIAkJCQkvLyBUaGUgd29ya2luZyB0cmVlIGZpbGUgaXMgbWlzc2luZyBvciB0aGUgbWVyZ2UgY29udGVudCBkaWZmZXJzCiAJCQkJLy8gZnJvbSBpbmRleCBjb250ZW50Ci0JCQkJdXBkYXRlKG0uZ2V0RW50cnlQYXRoU3RyaW5nKCksIG0uZ2V0RW50cnlPYmplY3RJZCgpLAotCQkJCQkJbS5nZXRFbnRyeUZpbGVNb2RlKCkpOworCQkJCXVwZGF0ZShtKTsKIAkJCX0gZWxzZSBpZiAoaS5nZXREaXJDYWNoZUVudHJ5KCkgIT0gbnVsbCkgewogCQkJCS8vIFRoZSBpbmRleCBjb250YWlucyBhIGZpbGUgKGFuZCBub3QgYSBmb2xkZXIpCiAJCQkJaWYgKGYuaXNNb2RpZmllZChpLmdldERpckNhY2hlRW50cnkoKSwgdHJ1ZSwKQEAgLTQwMCw4ICszOTksNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIG0sIERpckNhY2hlQnVpbGRJdGVyYXRvciBpLAogCQkJCQkJfHwgaS5nZXREaXJDYWNoZUVudHJ5KCkuZ2V0U3RhZ2UoKSAhPSAwKQogCQkJCQkvLyBUaGUgd29ya2luZyB0cmVlIGZpbGUgaXMgZGlydHkgb3IgdGhlIGluZGV4IGNvbnRhaW5zIGEKIAkJCQkJLy8gY29uZmxpY3QKLQkJCQkJdXBkYXRlKG0uZ2V0RW50cnlQYXRoU3RyaW5nKCksIG0uZ2V0RW50cnlPYmplY3RJZCgpLAotCQkJCQkJCW0uZ2V0RW50cnlGaWxlTW9kZSgpKTsKKwkJCQkJdXBkYXRlKG0pOwogCQkJCWVsc2UgewogCQkJCQkvLyB1cGRhdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5kZXggd2l0aCB0aGUgb25lIGZyb20gdGhlCiAJCQkJCS8vIGZpbGUgaWYgbm90IHNldCwgYXMgd2UgYXJlIHN1cmUgdG8gYmUgaW4gc3luYyBoZXJlLgpAQCAtODAyLDcgKzgwMCw3IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgaCwgQ2Fub25pY2FsVHJlZVBhcnNlciBtLAogCQkJCWlmIChmICE9IG51bGwgJiYgaXNNb2RpZmllZFN1YnRyZWVfSW5kZXhXb3JraW5ndHJlZShuYW1lKSkgewogCQkJCQljb25mbGljdChuYW1lLCBkY2UsIGgsIG0pOyAvLyAxCiAJCQkJfSBlbHNlIHsKLQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOyAvLyAyCisJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsgLy8gMgogCQkJCX0KIAogCQkJCWJyZWFrOwpAQCAtODI4LDcgKzgyNiw3IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgaCwgQ2Fub25pY2FsVHJlZVBhcnNlciBtLAogCQkJCS8vIGFyZSBmb3VuZCBsYXRlcgogCQkJCWJyZWFrOwogCQkJY2FzZSAweEQwRjogLy8gMTkKLQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7CisJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAweERGMDogLy8gY29uZmxpY3Qgd2l0aG91dCBhIHJ1bGUKIAkJCWNhc2UgMHgwRkQ6IC8vIDE1CkBAIC04MzksNyArODM3LDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJCWlmIChpc01vZGlmaWVkU3VidHJlZV9JbmRleFdvcmtpbmd0cmVlKG5hbWUpKQogCQkJCQkJY29uZmxpY3QobmFtZSwgZGNlLCBoLCBtKTsgLy8gOAogCQkJCQllbHNlCi0JCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7IC8vIDcKKwkJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsgLy8gNwogCQkJCX0gZWxzZQogCQkJCQljb25mbGljdChuYW1lLCBkY2UsIGgsIG0pOyAvLyA5CiAJCQkJYnJlYWs7CkBAIC04NTksNyArODU3LDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4MERGOiAvLyAxNiAxNwogCQkJCWlmICghaXNNb2RpZmllZFN1YnRyZWVfSW5kZXhXb3JraW5ndHJlZShuYW1lKSkKLQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOworCQkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7CiAJCQkJZWxzZQogCQkJCQljb25mbGljdChuYW1lLCBkY2UsIGgsIG0pOwogCQkJCWJyZWFrOwpAQCAtOTI5LDcgKzkyNyw3IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgaCwgQ2Fub25pY2FsVHJlZVBhcnNlciBtLAogCQkJCS8vIEF0IGxlYXN0IG9uZSBvZiBIZWFkLCBJbmRleCwgTWVyZ2UgaXMgbm90IGVtcHR5CiAJCQkJLy8gLT4gb25seSBNZXJnZSBjb250YWlucyBzb21ldGhpbmcgZm9yIHRoaXMgcGF0aC4gVXNlIGl0IQogCQkJCS8vIFBvdGVudGlhbGx5IHVwZGF0ZSB0aGUgZmlsZQotCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsgLy8gMQorCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsgLy8gMQogCQkJZWxzZSBpZiAobSA9PSBudWxsKQogCQkJCS8vIE5vdGhpbmcgaW4gTWVyZ2UKIAkJCQkvLyBTb21ldGhpbmcgaW4gSGVhZApAQCAtOTQ3LDcgKzk0NSw3IEBAIGVsc2UgaWYgKG0gPT0gbnVsbCkKIAkJCQkvLyBmaW5kIGluIE1lcmdlLiBQb3RlbnRpYWxseSB1cGRhdGVzIHRoZSBmaWxlLgogCQkJCWlmIChlcXVhbElkQW5kTW9kZShoSWQsIGhNb2RlLCBtSWQsIG1Nb2RlKSkgewogCQkJCQlpZiAoaW5pdGlhbENoZWNrb3V0IHx8IGZvcmNlKSB7Ci0JCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7CisJCQkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlrZWVwKG5hbWUsIGRjZSwgZik7CiAJCQkJCX0KQEAgLTExMzEsNyArMTEyOSw3IEBAICYmIGlzTW9kaWZpZWRfSW5kZXhUcmVlKG5hbWUsIGlJZCwgaU1vZGUsIG1JZCwgbU1vZGUsCiAKIAkJCQkJCS8vIFRPRE8gY2hlY2sgdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgc29tZSB1bnNhdmVkCiAJCQkJCQkvLyBmaWxlIGNvbnRlbnQKLQkJCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsKKwkJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsKIAkJCQkJfSBlbHNlIGlmIChkY2UgIT0gbnVsbAogCQkJCQkJCSYmIChmICE9IG51bGwgJiYgZi5pc01vZGlmaWVkKGRjZSwgdHJ1ZSwKIAkJCQkJCQkJCXRoaXMud2Fsay5nZXRPYmplY3RSZWFkZXIoKSkpKSB7CkBAIC0xMTUwLDcgKzExNDgsNyBAQCAmJiBpc01vZGlmaWVkX0luZGV4VHJlZShuYW1lLCBpSWQsIGlNb2RlLCBtSWQsIG1Nb2RlLAogCQkJCQkJLy8gLT4gU3RhbmRhcmQgY2FzZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGJyYW5jaGVzOgogCQkJCQkJLy8gTm90aGluZyBuZXcgaW4gaW5kZXggYnV0IHNvbWV0aGluZyBkaWZmZXJlbnQgaW4KIAkJCQkJCS8vIE1lcmdlLiBVcGRhdGUgaW5kZXggYW5kIGZpbGUKLQkJCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsKKwkJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCS8vIEhlYWQgZGlmZmVycyBmcm9tIGluZGV4IG9yIG1lcmdlIGlzIHNhbWUgYXMgaW5kZXgKQEAgLTEyMzcsMTIgKzEyMzUsMTcgQEAgcHJpdmF0ZSB2b2lkIHJlbW92ZShTdHJpbmcgcGF0aCkgewogCQlyZW1vdmVkLmFkZChwYXRoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlKFN0cmluZyBwYXRoLCBPYmplY3RJZCBtSWQsIEZpbGVNb2RlIG1vZGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB1cGRhdGUoQ2Fub25pY2FsVHJlZVBhcnNlciB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl1cGRhdGUoMCwgdHJlZS5nZXRFbnRyeVBhdGhTdHJpbmcoKSwgdHJlZS5nZXRFbnRyeU9iamVjdElkKCksCisJCQkJdHJlZS5nZXRFbnRyeUZpbGVNb2RlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGUoaW50IGluZGV4LCBTdHJpbmcgcGF0aCwgT2JqZWN0SWQgbUlkLAorCQkJRmlsZU1vZGUgbW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCFGaWxlTW9kZS5UUkVFLmVxdWFscyhtb2RlKSkgewogCQkJdXBkYXRlZC5wdXQocGF0aCwgbmV3IENoZWNrb3V0TWV0YWRhdGEoCi0JCQkJCXdhbGsuZ2V0RW9sU3RyZWFtVHlwZShDSEVDS09VVF9PUCksCi0JCQkJCXdhbGsuZ2V0RmlsdGVyQ29tbWFuZChDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0UpKSk7CisJCQkJCXdhbGsuZ2V0Q2hlY2tvdXRFb2xTdHJlYW1UeXBlKGluZGV4KSwKKwkJCQkJd2Fsay5nZXRTbXVkZ2VDb21tYW5kKGluZGV4KSkpOwogCiAJCQlEaXJDYWNoZUVudHJ5IGVudHJ5ID0gbmV3IERpckNhY2hlRW50cnkocGF0aCwgRGlyQ2FjaGVFbnRyeS5TVEFHRV8wKTsKIAkJCWVudHJ5LnNldE9iamVjdElkKG1JZCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYyNmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXIuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOworCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5NYW5pZmVzdEVycm9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5SZW1vdGVGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5SZW1vdGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLlJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5Db3B5RmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuTGlua0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsLlJlcG9UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGUuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFdyaXRlcyAuZ2l0bW9kdWxlcyBhbmQgZ2l0bGlua3Mgb2YgcGFyc2VkIG1hbmlmZXN0IHByb2plY3RzIGludG8gYSBiYXJlCisgKiByZXBvc2l0b3J5LgorICoKKyAqIFRvIHdyaXRlIG9uIGEgcmVndWxhciByZXBvc2l0b3J5LCBzZWUge0BsaW5rIFJlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXJ9LgorICovCitjbGFzcyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01BWF9SRVRSSUVTID0gNTsKKworCS8vIFJldHJ5IGV4cG9uZW50aWFsbHkgd2l0aCBkZWxheXMgaW4gdGhpcyByYW5nZQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUlOX1JFVFJZX0RFTEFZX01JTExJUyA9IDUwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NQVhfUkVUUllfREVMQVlfTUlMTElTID0gNTAwMDsKKworCXByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOworCisJcHJpdmF0ZSBmaW5hbCBVUkkgdGFyZ2V0VXJpOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0QnJhbmNoOworCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVSZWFkZXIgY2FsbGJhY2s7CisKKwlwcml2YXRlIGZpbmFsIEJhcmVXcml0ZXJDb25maWcgY29uZmlnOworCisJcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBhdXRob3I7CisKKwlwcml2YXRlIExpc3Q8RXh0cmFDb250ZW50PiBleHRyYUNvbnRlbnRzOworCisJc3RhdGljIGNsYXNzIEJhcmVXcml0ZXJDb25maWcgeworCQlib29sZWFuIGlnbm9yZVJlbW90ZUZhaWx1cmVzID0gZmFsc2U7CisKKwkJYm9vbGVhbiByZWNvcmRSZW1vdGVCcmFuY2ggPSB0cnVlOworCisJCWJvb2xlYW4gcmVjb3JkU3VibW9kdWxlTGFiZWxzID0gdHJ1ZTsKKworCQlib29sZWFuIHJlY29yZFNoYWxsb3dTdWJtb2R1bGVzID0gdHJ1ZTsKKworCQlzdGF0aWMgQmFyZVdyaXRlckNvbmZpZyBnZXREZWZhdWx0KCkgeworCQkJcmV0dXJuIG5ldyBCYXJlV3JpdGVyQ29uZmlnKCk7CisJCX0KKworCQlwcml2YXRlIEJhcmVXcml0ZXJDb25maWcoKSB7CisJCX0KKwl9CisKKwlzdGF0aWMgY2xhc3MgRXh0cmFDb250ZW50IHsKKwkJZmluYWwgU3RyaW5nIHBhdGg7CisKKwkJZmluYWwgU3RyaW5nIGNvbnRlbnQ7CisKKwkJRXh0cmFDb250ZW50KFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgeworCQkJdGhpcy5wYXRoID0gcGF0aDsKKwkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7CisJCX0KKwl9CisKKwlCYXJlU3VwZXJwcm9qZWN0V3JpdGVyKFJlcG9zaXRvcnkgcmVwbywgVVJJIHRhcmdldFVyaSwKKwkJCVN0cmluZyB0YXJnZXRCcmFuY2gsCisJCQlQZXJzb25JZGVudCBhdXRob3IsIFJlbW90ZVJlYWRlciBjYWxsYmFjaywKKwkJCUJhcmVXcml0ZXJDb25maWcgY29uZmlnLAorCQkJTGlzdDxFeHRyYUNvbnRlbnQ+IGV4dHJhQ29udGVudHMpIHsKKwkJYXNzZXJ0IChyZXBvLmlzQmFyZSgpKTsKKwkJdGhpcy5yZXBvID0gcmVwbzsKKwkJdGhpcy50YXJnZXRVcmkgPSB0YXJnZXRVcmk7CisJCXRoaXMudGFyZ2V0QnJhbmNoID0gdGFyZ2V0QnJhbmNoOworCQl0aGlzLmF1dGhvciA9IGF1dGhvcjsKKwkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKwkJdGhpcy5leHRyYUNvbnRlbnRzID0gZXh0cmFDb250ZW50czsKKwl9CisKKwlSZXZDb21taXQgd3JpdGUoTGlzdDxSZXBvUHJvamVjdD4gcmVwb1Byb2plY3RzKQorCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CisJCURpckNhY2hlIGluZGV4ID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CisJCU9iamVjdEluc2VydGVyIGluc2VydGVyID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOworCisJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7CisJCQlwcmVwYXJlSW5kZXgocmVwb1Byb2plY3RzLCBpbmRleCwgaW5zZXJ0ZXIpOworCQkJT2JqZWN0SWQgdHJlZUlkID0gaW5kZXgud3JpdGVUcmVlKGluc2VydGVyKTsKKwkJCWxvbmcgcHJldkRlbGF5ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgTE9DS19GQUlMVVJFX01BWF9SRVRSSUVTIC0gMTsgaSsrKSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoaW5zZXJ0ZXIsIHJ3LCB0cmVlSWQpOworCQkJCX0gY2F0Y2ggKENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gZSkgeworCQkJCQlwcmV2RGVsYXkgPSBGaWxlVXRpbHMuZGVsYXkocHJldkRlbGF5LAorCQkJCQkJCUxPQ0tfRkFJTFVSRV9NSU5fUkVUUllfREVMQVlfTUlMTElTLAorCQkJCQkJCUxPQ0tfRkFJTFVSRV9NQVhfUkVUUllfREVMQVlfTUlMTElTKTsKKwkJCQkJVGhyZWFkLnNsZWVwKHByZXZEZWxheSk7CisJCQkJCXJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5yZWZyZXNoKCk7CisJCQkJfQorCQkJfQorCQkJLy8gSW4gdGhlIGxhc3QgdHJ5LCBqdXN0IHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9ucworCQkJcmV0dXJuIGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoaW5zZXJ0ZXIsIHJ3LCB0cmVlSWQpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByZXBhcmVJbmRleChMaXN0PFJlcG9Qcm9qZWN0PiBwcm9qZWN0cywgRGlyQ2FjaGUgaW5kZXgsCisJCQlPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQlDb25maWcgY2ZnID0gbmV3IENvbmZpZygpOworCQlTdHJpbmdCdWlsZGVyIGF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlEaXJDYWNoZUJ1aWxkZXIgYnVpbGRlciA9IGluZGV4LmJ1aWxkZXIoKTsKKwkJZm9yIChSZXBvUHJvamVjdCBwcm9qIDogcHJvamVjdHMpIHsKKwkJCVN0cmluZyBuYW1lID0gcHJvai5nZXROYW1lKCk7CisJCQlTdHJpbmcgcGF0aCA9IHByb2ouZ2V0UGF0aCgpOworCQkJU3RyaW5nIHVybCA9IHByb2ouZ2V0VXJsKCk7CisJCQlPYmplY3RJZCBvYmplY3RJZDsKKwkJCWlmIChPYmplY3RJZC5pc0lkKHByb2ouZ2V0UmV2aXNpb24oKSkpIHsKKwkJCQlvYmplY3RJZCA9IE9iamVjdElkLmZyb21TdHJpbmcocHJvai5nZXRSZXZpc2lvbigpKTsKKwkJCX0gZWxzZSB7CisJCQkJb2JqZWN0SWQgPSBjYWxsYmFjay5zaGExKHVybCwgcHJvai5nZXRSZXZpc2lvbigpKTsKKwkJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCAmJiAhY29uZmlnLmlnbm9yZVJlbW90ZUZhaWx1cmVzKSB7CisJCQkJCXRocm93IG5ldyBSZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbih1cmwpOworCQkJCX0KKwkJCQlpZiAoY29uZmlnLnJlY29yZFJlbW90ZUJyYW5jaCkgeworCQkJCQkvLyAiYnJhbmNoIiBmaWVsZCBpcyBvbmx5IGZvciBub24tdGFnIHJlZmVyZW5jZXMuCisJCQkJCS8vIEtlZXAgdGFncyBpbiAicmVmIiBmaWVsZCBhcyBoaW50IGZvciBvdGhlciB0b29scy4KKwkJCQkJU3RyaW5nIGZpZWxkID0gcHJvai5nZXRSZXZpc2lvbigpLnN0YXJ0c1dpdGgoUl9UQUdTKSA/ICJyZWYiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQk6ICJicmFuY2giOyAvLyROT04tTkxTLTEkCisJCQkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsIGZpZWxkLCAvLyROT04tTkxTLTEkCisJCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpKTsKKwkJCQl9CisKKwkJCQlpZiAoY29uZmlnLnJlY29yZFNoYWxsb3dTdWJtb2R1bGVzCisJCQkJCQkmJiBwcm9qLmdldFJlY29tbWVuZFNoYWxsb3coKSAhPSBudWxsKSB7CisJCQkJCS8vIFRoZSBzaGFsbG93IHJlY29tbWVuZGF0aW9uIGlzIGxvc2luZyBpbmZvcm1hdGlvbi4KKwkJCQkJLy8gQXMgdGhlIHJlcG8gbWFuaWZlc3RzIHN0b3JlcyB0aGUgcmVjb21tZW5kZWQKKwkJCQkJLy8gZGVwdGggaW4gdGhlICdjbG9uZS1kZXB0aCcgZmllbGQsIHdoaWxlCisJCQkJCS8vIGdpdCBjb3JlIG9ubHkgdXNlcyBhIGJpbmFyeSAnc2hhbGxvdyA9IHRydWUvZmFsc2UnCisJCQkJCS8vIGhpbnQsIHdlJ2xsIG1hcCBhbnkgZGVwdGggdG8gJ3NoYWxsb3cgPSB0cnVlJworCQkJCQljZmcuc2V0Qm9vbGVhbigic3VibW9kdWxlIiwgbmFtZSwgInNoYWxsb3ciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQl0cnVlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoY29uZmlnLnJlY29yZFN1Ym1vZHVsZUxhYmVscykgeworCQkJCVN0cmluZ0J1aWxkZXIgcmVjID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQlyZWMuYXBwZW5kKCIvIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZWMuYXBwZW5kKHBhdGgpOworCQkJCWZvciAoU3RyaW5nIGdyb3VwIDogcHJvai5nZXRHcm91cHMoKSkgeworCQkJCQlyZWMuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmVjLmFwcGVuZChncm91cCk7CisJCQkJfQorCQkJCXJlYy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlhdHRyaWJ1dGVzLmFwcGVuZChyZWMudG9TdHJpbmcoKSk7CisJCQl9CisKKwkJCVVSSSBzdWJtb2RVcmwgPSBVUkkuY3JlYXRlKHVybCk7CisJCQlpZiAodGFyZ2V0VXJpICE9IG51bGwpIHsKKwkJCQlzdWJtb2RVcmwgPSBSZXBvQ29tbWFuZC5yZWxhdGl2aXplKHRhcmdldFVyaSwgc3VibW9kVXJsKTsKKwkJCX0KKwkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsICJwYXRoIiwgcGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgInVybCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlzdWJtb2RVcmwudG9TdHJpbmcoKSk7CisKKwkJCS8vIGNyZWF0ZSBnaXRsaW5rCisJCQlpZiAob2JqZWN0SWQgIT0gbnVsbCkgeworCQkJCURpckNhY2hlRW50cnkgZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KHBhdGgpOworCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOworCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuR0lUTElOSyk7CisJCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7CisKKwkJCQlmb3IgKENvcHlGaWxlIGNvcHlmaWxlIDogcHJvai5nZXRDb3B5RmlsZXMoKSkgeworCQkJCQlSZW1vdGVGaWxlIHJmID0gY2FsbGJhY2sucmVhZEZpbGVXaXRoTW9kZSh1cmwsCisJCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpLCBjb3B5ZmlsZS5zcmMpOworCQkJCQlvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJCQkJcmYuZ2V0Q29udGVudHMoKSk7CisJCQkJCWRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShjb3B5ZmlsZS5kZXN0KTsKKwkJCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7CisJCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUocmYuZ2V0RmlsZU1vZGUoKSk7CisJCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOworCQkJCX0KKwkJCQlmb3IgKExpbmtGaWxlIGxpbmtmaWxlIDogcHJvai5nZXRMaW5rRmlsZXMoKSkgeworCQkJCQlTdHJpbmcgbGluazsKKwkJCQkJaWYgKGxpbmtmaWxlLmRlc3QuY29udGFpbnMoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlsaW5rID0gRmlsZVV0aWxzLnJlbGF0aXZpemVHaXRQYXRoKAorCQkJCQkJCQlsaW5rZmlsZS5kZXN0LnN1YnN0cmluZygwLAorCQkJCQkJCQkJCWxpbmtmaWxlLmRlc3QubGFzdEluZGV4T2YoJy8nKSksCisJCQkJCQkJCXByb2ouZ2V0UGF0aCgpICsgIi8iICsgbGlua2ZpbGUuc3JjKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJbGluayA9IHByb2ouZ2V0UGF0aCgpICsgIi8iICsgbGlua2ZpbGUuc3JjOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKworCQkJCQlvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJCQkJbGluay5nZXRCeXRlcyhVVEZfOCkpOworCQkJCQlkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkobGlua2ZpbGUuZGVzdCk7CisJCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOworCQkJCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLlNZTUxJTkspOworCQkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJU3RyaW5nIGNvbnRlbnQgPSBjZmcudG9UZXh0KCk7CisKKwkJLy8gY3JlYXRlIGEgbmV3IERpckNhY2hlRW50cnkgZm9yIC5naXRtb2R1bGVzIGZpbGUuCisJCURpckNhY2hlRW50cnkgZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KAorCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQlPYmplY3RJZCBvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKKwkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOworCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKKworCQlpZiAoY29uZmlnLnJlY29yZFN1Ym1vZHVsZUxhYmVscykgeworCQkJLy8gY3JlYXRlIGEgbmV3IERpckNhY2hlRW50cnkgZm9yIC5naXRhdHRyaWJ1dGVzIGZpbGUuCisJCQlEaXJDYWNoZUVudHJ5IGRjRW50cnlBdHRyID0gbmV3IERpckNhY2hlRW50cnkoCisJCQkJCUNvbnN0YW50cy5ET1RfR0lUX0FUVFJJQlVURVMpOworCQkJT2JqZWN0SWQgYXR0cklkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKKwkJCQkJYXR0cmlidXRlcy50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCQlkY0VudHJ5QXR0ci5zZXRPYmplY3RJZChhdHRySWQpOworCQkJZGNFbnRyeUF0dHIuc2V0RmlsZU1vZGUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKTsKKwkJCWJ1aWxkZXIuYWRkKGRjRW50cnlBdHRyKTsKKwkJfQorCisJCWZvciAoRXh0cmFDb250ZW50IGVjIDogZXh0cmFDb250ZW50cykgeworCQkJRGlyQ2FjaGVFbnRyeSBleHRyYURjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShlYy5wYXRoKTsKKworCQkJT2JqZWN0SWQgb2lkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKKwkJCQkJZWMuY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCQkJZXh0cmFEY0VudHJ5LnNldE9iamVjdElkKG9pZCk7CisJCQlleHRyYURjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKTsKKwkJCWJ1aWxkZXIuYWRkKGV4dHJhRGNFbnRyeSk7CisJCX0KKworCQlidWlsZGVyLmZpbmlzaCgpOworCX0KKworCXByaXZhdGUgUmV2Q29tbWl0IGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCisJCQlSZXZXYWxrIHJ3LCBPYmplY3RJZCB0cmVlSWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24geworCQlPYmplY3RJZCBoZWFkSWQgPSByZXBvLnJlc29sdmUodGFyZ2V0QnJhbmNoICsgIl57Y29tbWl0fSIpOyAvLyROT04tTkxTLTEkCisJCWlmIChoZWFkSWQgIT0gbnVsbAorCQkJCSYmIHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCkuZ2V0VHJlZSgpLmdldElkKCkuZXF1YWxzKHRyZWVJZCkpIHsKKwkJCS8vIE5vIGNoYW5nZS4gRG8gbm90aGluZy4KKwkJCXJldHVybiBydy5wYXJzZUNvbW1pdChoZWFkSWQpOworCQl9CisKKwkJQ29tbWl0QnVpbGRlciBjb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOworCQljb21taXQuc2V0VHJlZUlkKHRyZWVJZCk7CisJCWlmIChoZWFkSWQgIT0gbnVsbCkgeworCQkJY29tbWl0LnNldFBhcmVudElkcyhoZWFkSWQpOworCQl9CisJCWNvbW1pdC5zZXRBdXRob3IoYXV0aG9yKTsKKwkJY29tbWl0LnNldENvbW1pdHRlcihhdXRob3IpOworCQljb21taXQuc2V0TWVzc2FnZShSZXBvVGV4dC5nZXQoKS5yZXBvQ29tbWl0TWVzc2FnZSk7CisKKwkJT2JqZWN0SWQgY29tbWl0SWQgPSBpbnNlcnRlci5pbnNlcnQoY29tbWl0KTsKKwkJaW5zZXJ0ZXIuZmx1c2goKTsKKworCQlSZWZVcGRhdGUgcnUgPSByZXBvLnVwZGF0ZVJlZih0YXJnZXRCcmFuY2gpOworCQlydS5zZXROZXdPYmplY3RJZChjb21taXRJZCk7CisJCXJ1LnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoaGVhZElkICE9IG51bGwgPyBoZWFkSWQgOiBPYmplY3RJZC56ZXJvSWQoKSk7CisJCVJlc3VsdCByYyA9IHJ1LnVwZGF0ZShydyk7CisJCXN3aXRjaCAocmMpIHsKKwkJY2FzZSBORVc6CisJCWNhc2UgRk9SQ0VEOgorCQljYXNlIEZBU1RfRk9SV0FSRDoKKwkJCS8vIFN1Y2Nlc3NmdWwuIERvIG5vdGhpbmcuCisJCQlicmVhazsKKwkJY2FzZSBSRUpFQ1RFRDoKKwkJY2FzZSBMT0NLX0ZBSUxVUkU6CisJCQl0aHJvdyBuZXcgQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJSkdpdFRleHQuZ2V0KCkuY2Fubm90TG9jaywgdGFyZ2V0QnJhbmNoKSwgcnUuZ2V0UmVmKCksIHJjKTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVwZGF0aW5nUmVmRmFpbGVkLAorCQkJCQkJCXRhcmdldEJyYW5jaCwgY29tbWl0SWQubmFtZSgpLCByYykpOworCQl9CisKKwkJcmV0dXJuIHJ3LnBhcnNlQ29tbWl0KGNvbW1pdElkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVndWxhclN1cGVycHJvamVjdFdyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFiOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9SRU1PVEVTOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5TdWJtb2R1bGVBZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLk1hbmlmZXN0RXJyb3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkNvcHlGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5MaW5rRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWwuUmVwb1RleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKKworLyoqCisgKiBXcml0ZXMgLmdpdG1vZHVsZXMgYW5kIGdpdGxpbmtzIG9mIHBhcnNlZCBtYW5pZmVzdCBwcm9qZWN0cyBpbnRvIGEgcmVndWxhcgorICogcmVwb3NpdG9yeSAodXNpbmcgZ2l0IHN1Ym1vZHVsZSBjb21tYW5kcykKKyAqCisgKiBUbyB3cml0ZSBvbiBhIGJhcmUgcmVwb3NpdG9yeSwgdXNlIHtAbGluayBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyfQorICovCitjbGFzcyBSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyIHsKKworCXByaXZhdGUgUmVwb3NpdG9yeSByZXBvOworCisJcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKKworCVJlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIoUmVwb3NpdG9yeSByZXBvLCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0aGlzLnJlcG8gPSByZXBvOworCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCX0KKworCVJldkNvbW1pdCB3cml0ZShMaXN0PFJlcG9Qcm9qZWN0PiByZXBvUHJvamVjdHMpCisJCQl0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChyZXBvKSkgeworCQkJZm9yIChSZXBvUHJvamVjdCBwcm9qIDogcmVwb1Byb2plY3RzKSB7CisJCQkJYWRkU3VibW9kdWxlKHByb2ouZ2V0TmFtZSgpLCBwcm9qLmdldFVybCgpLCBwcm9qLmdldFBhdGgoKSwKKwkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSwgcHJvai5nZXRDb3B5RmlsZXMoKSwKKwkJCQkJCXByb2ouZ2V0TGlua0ZpbGVzKCksIGdpdCk7CisJCQl9CisJCQlyZXR1cm4gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoUmVwb1RleHQuZ2V0KCkucmVwb0NvbW1pdE1lc3NhZ2UpCisJCQkJCS5jYWxsKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFN1Ym1vZHVsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHVybCwgU3RyaW5nIHBhdGgsCisJCQlTdHJpbmcgcmV2aXNpb24sIExpc3Q8Q29weUZpbGU+IGNvcHlmaWxlcywgTGlzdDxMaW5rRmlsZT4gbGlua2ZpbGVzLAorCQkJR2l0IGdpdCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlhc3NlcnQgKCFyZXBvLmlzQmFyZSgpKTsKKwkJYXNzZXJ0IChnaXQgIT0gbnVsbCk7CisJCWlmICghbGlua2ZpbGVzLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorCQkJCQlKR2l0VGV4dC5nZXQoKS5ub25CYXJlTGlua0ZpbGVzTm90U3VwcG9ydGVkKTsKKwkJfQorCisJCVN1Ym1vZHVsZUFkZENvbW1hbmQgYWRkID0gZ2l0LnN1Ym1vZHVsZUFkZCgpLnNldE5hbWUobmFtZSkuc2V0UGF0aChwYXRoKQorCQkJCS5zZXRVUkkodXJsKTsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJYWRkLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKKwkJfQorCisJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGFkZC5jYWxsKCk7CisJCWlmIChyZXZpc2lvbiAhPSBudWxsKSB7CisJCQl0cnkgKEdpdCBzdWIgPSBuZXcgR2l0KHN1YlJlcG8pKSB7CisJCQkJc3ViLmNoZWNrb3V0KCkuc2V0TmFtZShmaW5kUmVmKHJldmlzaW9uLCBzdWJSZXBvKSkuY2FsbCgpOworCQkJfQorCQkJc3ViUmVwby5jbG9zZSgpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKHBhdGgpLmNhbGwoKTsKKwkJfQorCQlmb3IgKENvcHlGaWxlIGNvcHlmaWxlIDogY29weWZpbGVzKSB7CisJCQljb3B5ZmlsZS5jb3B5KCk7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oY29weWZpbGUuZGVzdCkuY2FsbCgpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRSZWYoU3RyaW5nIHJlZiwgUmVwb3NpdG9yeSByZXBvKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFPYmplY3RJZC5pc0lkKHJlZikpIHsKKwkJCVJlZiByID0gcmVwby5leGFjdFJlZihSX1JFTU9URVMgKyBERUZBVUxUX1JFTU9URV9OQU1FICsgIi8iICsgcmVmKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHIgIT0gbnVsbCkgeworCQkJCXJldHVybiByLmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKaW5kZXggZTBhODIyNC4uNmU5NDNlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKQEAgLTksMTEgKzksNiBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9SRU1PVEVTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9UQUdTOwotCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMSwzNCArMjYsMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlN1Ym1vZHVsZUFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZFJlZk5hbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uQmFyZVN1cGVycHJvamVjdFdyaXRlci5FeHRyYUNvbnRlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLk1hbmlmZXN0UGFyc2VyLkluY2x1ZGVkRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuQ29weUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkxpbmtGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbC5SZXBvVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGUuUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CiAKQEAgLTgwLDEyICs2Miw3IEBACiAgKiBAc2luY2UgMy40CiAgKi8KIHB1YmxpYyBjbGFzcyBSZXBvQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8UmV2Q29tbWl0PiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NQVhfUkVUUklFUyA9IDU7CiAKLQkvLyBSZXRyeSBleHBvbmVudGlhbGx5IHdpdGggZGVsYXlzIGluIHRoaXMgcmFuZ2UKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01JTl9SRVRSWV9ERUxBWV9NSUxMSVMgPSA1MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJZX0RFTEFZX01JTExJUyA9IDUwMDA7CiAKIAlwcml2YXRlIFN0cmluZyBtYW5pZmVzdFBhdGg7CiAJcHJpdmF0ZSBTdHJpbmcgYmFzZVVyaTsKQEAgLTkzLDE3ICs3MCwxOCBAQCBwdWJsaWMgY2xhc3MgUmVwb0NvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFJldkNvbW1pdD4gewogCXByaXZhdGUgU3RyaW5nIGdyb3Vwc1BhcmFtOwogCXByaXZhdGUgU3RyaW5nIGJyYW5jaDsKIAlwcml2YXRlIFN0cmluZyB0YXJnZXRCcmFuY2ggPSBDb25zdGFudHMuSEVBRDsKLQlwcml2YXRlIGJvb2xlYW4gcmVjb3JkUmVtb3RlQnJhbmNoID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVjb3JkU3VibW9kdWxlTGFiZWxzID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMgPSB0cnVlOwogCXByaXZhdGUgUGVyc29uSWRlbnQgYXV0aG9yOwogCXByaXZhdGUgUmVtb3RlUmVhZGVyIGNhbGxiYWNrOwogCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CiAJcHJpdmF0ZSBJbmNsdWRlZEZpbGVSZWFkZXIgaW5jbHVkZWRSZWFkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZVJlbW90ZUZhaWx1cmVzID0gZmFsc2U7CisKKwlwcml2YXRlIEJhcmVTdXBlcnByb2plY3RXcml0ZXIuQmFyZVdyaXRlckNvbmZpZyBiYXJlV3JpdGVyQ29uZmlnID0gQmFyZVN1cGVycHJvamVjdFdyaXRlci5CYXJlV3JpdGVyQ29uZmlnCisJCQkuZ2V0RGVmYXVsdCgpOwogCiAJcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKIAorCXByaXZhdGUgZmluYWwgTGlzdDxFeHRyYUNvbnRlbnQ+IGV4dHJhQ29udGVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwogCS8qKgogCSAqIEEgY2FsbGJhY2sgdG8gZ2V0IHJlZiBzaGExIG9mIGEgcmVwb3NpdG9yeSBmcm9tIGl0cyB1cmkuCiAJICoKQEAgLTI2OSwxNCArMjQ3LDE0IEBAIHB1YmxpYyBSZW1vdGVGaWxlIHJlYWRGaWxlV2l0aE1vZGUoU3RyaW5nIHVyaSwgU3RyaW5nIHJlZiwgU3RyaW5nIHBhdGgpCiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7CisJc3RhdGljIGNsYXNzIE1hbmlmZXN0RXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBHaXRBUElFeGNlcHRpb24gewogCQlNYW5pZmVzdEVycm9yRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogCQkJc3VwZXIoUmVwb1RleHQuZ2V0KCkuaW52YWxpZE1hbmlmZXN0LCBjYXVzZSk7CiAJCX0KIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7CisJc3RhdGljIGNsYXNzIFJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKIAkJUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIHVyaSkgewogCQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVwb1RleHQuZ2V0KCkuZXJyb3JSZW1vdGVVbmF2YWlsYWJsZSwgdXJpKSk7CiAJCX0KQEAgLTQyMSw3ICszOTksNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0VGFyZ2V0QnJhbmNoKFN0cmluZyBicmFuY2gpIHsKIAkgKiBAc2luY2UgNC4yCiAJICovCiAJcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29yZFJlbW90ZUJyYW5jaChib29sZWFuIGVuYWJsZSkgewotCQl0aGlzLnJlY29yZFJlbW90ZUJyYW5jaCA9IGVuYWJsZTsKKwkJdGhpcy5iYXJlV3JpdGVyQ29uZmlnLnJlY29yZFJlbW90ZUJyYW5jaCA9IGVuYWJsZTsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCkBAIC00MzYsNyArNDE0LDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29yZFJlbW90ZUJyYW5jaChib29sZWFuIGVuYWJsZSkgewogCSAqIEBzaW5jZSA0LjQKIAkgKi8KIAlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXRoaXMucmVjb3JkU3VibW9kdWxlTGFiZWxzID0gZW5hYmxlOworCQl0aGlzLmJhcmVXcml0ZXJDb25maWcucmVjb3JkU3VibW9kdWxlTGFiZWxzID0gZW5hYmxlOwogCQlyZXR1cm4gdGhpczsKIAl9CiAKQEAgLTQ1MSw3ICs0MjksNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKGJvb2xlYW4gZW5hYmxlKSB7CiAJICogQHNpbmNlIDQuNAogCSAqLwogCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZWNvbW1lbmRTaGFsbG93KGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXRoaXMucmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMgPSBlbmFibGU7CisJCXRoaXMuYmFyZVdyaXRlckNvbmZpZy5yZWNvcmRTaGFsbG93U3VibW9kdWxlcyA9IGVuYWJsZTsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCkBAIC00ODUsNyArNDYzLDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFByb2dyZXNzTW9uaXRvcihQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCSAqIEBzaW5jZSA0LjMKIAkgKi8KIAlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0SWdub3JlUmVtb3RlRmFpbHVyZXMoYm9vbGVhbiBpZ25vcmUpIHsKLQkJdGhpcy5pZ25vcmVSZW1vdGVGYWlsdXJlcyA9IGlnbm9yZTsKKwkJdGhpcy5iYXJlV3JpdGVyQ29uZmlnLmlnbm9yZVJlbW90ZUZhaWx1cmVzID0gaWdub3JlOwogCQlyZXR1cm4gdGhpczsKIAl9CiAKQEAgLTUzNCw2ICs1MTIsMjIgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldEluY2x1ZGVkRmlsZVJlYWRlcihJbmNsdWRlZEZpbGVSZWFkZXIgcmVhZGVyKSB7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCS8qKgorCSAqIENyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudCBpbiB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeQorCSAqCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHdoZXJlIHRvIGNyZWF0ZSB0aGUgZmlsZSBpbiB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeQorCSAqIEBwYXJhbSBjb250ZW50cworCSAqICAgICAgICAgICAgY29udGVudCBmb3IgdGhlIGNyZWF0ZSBmaWxlCisJICogQHJldHVybiB0aGlzIGNvbW1hbmQKKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUmVwb0NvbW1hbmQgYWRkVG9EZXN0aW5hdGlvbihTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnRzKSB7CisJCXRoaXMuZXh0cmFDb250ZW50cy5hZGQobmV3IEV4dHJhQ29udGVudChwYXRoLCBjb250ZW50cykpOworCQlyZXR1cm4gdGhpczsKKwl9CisKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewpAQCAtNTcwLDI0MCArNTY0LDE4IEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQl9CiAKIAkJaWYgKHJlcG8uaXNCYXJlKCkpIHsKLQkJCWlmIChhdXRob3IgPT0gbnVsbCkKLQkJCQlhdXRob3IgPSBuZXcgUGVyc29uSWRlbnQocmVwbyk7Ci0JCQlpZiAoY2FsbGJhY2sgPT0gbnVsbCkKLQkJCQljYWxsYmFjayA9IG5ldyBEZWZhdWx0UmVtb3RlUmVhZGVyKCk7CiAJCQlMaXN0PFJlcG9Qcm9qZWN0PiByZW5hbWVkUHJvamVjdHMgPSByZW5hbWVQcm9qZWN0cyhmaWx0ZXJlZFByb2plY3RzKTsKLQotCQkJRGlyQ2FjaGUgaW5kZXggPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKLQkJCU9iamVjdEluc2VydGVyIGluc2VydGVyID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOwotCi0JCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZXBvKSkgewotCQkJCXByZXBhcmVJbmRleChyZW5hbWVkUHJvamVjdHMsIGluZGV4LCBpbnNlcnRlcik7Ci0JCQkJT2JqZWN0SWQgdHJlZUlkID0gaW5kZXgud3JpdGVUcmVlKGluc2VydGVyKTsKLQkJCQlsb25nIHByZXZEZWxheSA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJJRVMgLSAxOyBpKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBjb21taXRUcmVlT25DdXJyZW50VGlwKAotCQkJCQkJCWluc2VydGVyLCBydywgdHJlZUlkKTsKLQkJCQkJfSBjYXRjaCAoQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwcmV2RGVsYXkgPSBGaWxlVXRpbHMuZGVsYXkocHJldkRlbGF5LAotCQkJCQkJCQlMT0NLX0ZBSUxVUkVfTUlOX1JFVFJZX0RFTEFZX01JTExJUywKLQkJCQkJCQkJTE9DS19GQUlMVVJFX01BWF9SRVRSWV9ERUxBWV9NSUxMSVMpOwotCQkJCQkJVGhyZWFkLnNsZWVwKHByZXZEZWxheSk7Ci0JCQkJCQlyZXBvLmdldFJlZkRhdGFiYXNlKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEluIHRoZSBsYXN0IHRyeSwganVzdCBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbnMKLQkJCQlyZXR1cm4gY29tbWl0VHJlZU9uQ3VycmVudFRpcChpbnNlcnRlciwgcncsIHRyZWVJZCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KHJlcG8pKSB7Ci0JCQlmb3IgKFJlcG9Qcm9qZWN0IHByb2ogOiBmaWx0ZXJlZFByb2plY3RzKSB7Ci0JCQkJYWRkU3VibW9kdWxlKHByb2ouZ2V0TmFtZSgpLCBwcm9qLmdldFVybCgpLCBwcm9qLmdldFBhdGgoKSwKLQkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSwgcHJvai5nZXRDb3B5RmlsZXMoKSwKLQkJCQkJCXByb2ouZ2V0TGlua0ZpbGVzKCksIGdpdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoUmVwb1RleHQuZ2V0KCkucmVwb0NvbW1pdE1lc3NhZ2UpCi0JCQkJCS5jYWxsKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVJbmRleChMaXN0PFJlcG9Qcm9qZWN0PiBwcm9qZWN0cywgRGlyQ2FjaGUgaW5kZXgsCi0JCQlPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewotCQlDb25maWcgY2ZnID0gbmV3IENvbmZpZygpOwotCQlTdHJpbmdCdWlsZGVyIGF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlEaXJDYWNoZUJ1aWxkZXIgYnVpbGRlciA9IGluZGV4LmJ1aWxkZXIoKTsKLQkJZm9yIChSZXBvUHJvamVjdCBwcm9qIDogcHJvamVjdHMpIHsKLQkJCVN0cmluZyBuYW1lID0gcHJvai5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IHByb2ouZ2V0UGF0aCgpOwotCQkJU3RyaW5nIHVybCA9IHByb2ouZ2V0VXJsKCk7Ci0JCQlPYmplY3RJZCBvYmplY3RJZDsKLQkJCWlmIChPYmplY3RJZC5pc0lkKHByb2ouZ2V0UmV2aXNpb24oKSkpIHsKLQkJCQlvYmplY3RJZCA9IE9iamVjdElkLmZyb21TdHJpbmcocHJvai5nZXRSZXZpc2lvbigpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2JqZWN0SWQgPSBjYWxsYmFjay5zaGExKHVybCwgcHJvai5nZXRSZXZpc2lvbigpKTsKLQkJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCAmJiAhaWdub3JlUmVtb3RlRmFpbHVyZXMpIHsKLQkJCQkJdGhyb3cgbmV3IFJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uKHVybCk7Ci0JCQkJfQotCQkJCWlmIChyZWNvcmRSZW1vdGVCcmFuY2gpIHsKLQkJCQkJLy8gImJyYW5jaCIgZmllbGQgaXMgb25seSBmb3Igbm9uLXRhZyByZWZlcmVuY2VzLgotCQkJCQkvLyBLZWVwIHRhZ3MgaW4gInJlZiIgZmllbGQgYXMgaGludCBmb3Igb3RoZXIgdG9vbHMuCi0JCQkJCVN0cmluZyBmaWVsZCA9IHByb2ouZ2V0UmV2aXNpb24oKS5zdGFydHNXaXRoKFJfVEFHUykgPyAicmVmIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJOiAiYnJhbmNoIjsgLy8kTk9OLU5MUy0xJAotCQkJCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCBmaWVsZCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSk7Ci0JCQkJfQotCi0JCQkJaWYgKHJlY29yZFNoYWxsb3dTdWJtb2R1bGVzCi0JCQkJCQkmJiBwcm9qLmdldFJlY29tbWVuZFNoYWxsb3coKSAhPSBudWxsKSB7Ci0JCQkJCS8vIFRoZSBzaGFsbG93IHJlY29tbWVuZGF0aW9uIGlzIGxvc2luZyBpbmZvcm1hdGlvbi4KLQkJCQkJLy8gQXMgdGhlIHJlcG8gbWFuaWZlc3RzIHN0b3JlcyB0aGUgcmVjb21tZW5kZWQKLQkJCQkJLy8gZGVwdGggaW4gdGhlICdjbG9uZS1kZXB0aCcgZmllbGQsIHdoaWxlCi0JCQkJCS8vIGdpdCBjb3JlIG9ubHkgdXNlcyBhIGJpbmFyeSAnc2hhbGxvdyA9IHRydWUvZmFsc2UnCi0JCQkJCS8vIGhpbnQsIHdlJ2xsIG1hcCBhbnkgZGVwdGggdG8gJ3NoYWxsb3cgPSB0cnVlJwotCQkJCQljZmcuc2V0Qm9vbGVhbigic3VibW9kdWxlIiwgbmFtZSwgInNoYWxsb3ciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVjb3JkU3VibW9kdWxlTGFiZWxzKSB7Ci0JCQkJU3RyaW5nQnVpbGRlciByZWMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJCXJlYy5hcHBlbmQoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlYy5hcHBlbmQocGF0aCk7Ci0JCQkJZm9yIChTdHJpbmcgZ3JvdXAgOiBwcm9qLmdldEdyb3VwcygpKSB7Ci0JCQkJCXJlYy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZWMuYXBwZW5kKGdyb3VwKTsKLQkJCQl9Ci0JCQkJcmVjLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWF0dHJpYnV0ZXMuYXBwZW5kKHJlYy50b1N0cmluZygpKTsKLQkJCX0KLQotCQkJVVJJIHN1Ym1vZFVybCA9IFVSSS5jcmVhdGUodXJsKTsKLQkJCWlmICh0YXJnZXRVcmkgIT0gbnVsbCkgewotCQkJCXN1Ym1vZFVybCA9IHJlbGF0aXZpemUodGFyZ2V0VXJpLCBzdWJtb2RVcmwpOwotCQkJfQotCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgInBhdGgiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCAidXJsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXN1Ym1vZFVybC50b1N0cmluZygpKTsKLQotCQkJLy8gY3JlYXRlIGdpdGxpbmsKLQkJCWlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0JCQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkocGF0aCk7Ci0JCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7Ci0JCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5HSVRMSU5LKTsKLQkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKLQotCQkJCWZvciAoQ29weUZpbGUgY29weWZpbGUgOiBwcm9qLmdldENvcHlGaWxlcygpKSB7Ci0JCQkJCVJlbW90ZUZpbGUgcmYgPSBjYWxsYmFjay5yZWFkRmlsZVdpdGhNb2RlKHVybCwKLQkJCQkJCQlwcm9qLmdldFJldmlzaW9uKCksIGNvcHlmaWxlLnNyYyk7Ci0JCQkJCW9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQkJCQlyZi5nZXRDb250ZW50cygpKTsKLQkJCQkJZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KGNvcHlmaWxlLmRlc3QpOwotCQkJCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKLQkJCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShyZi5nZXRGaWxlTW9kZSgpKTsKLQkJCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7Ci0JCQkJfQotCQkJCWZvciAoTGlua0ZpbGUgbGlua2ZpbGUgOiBwcm9qLmdldExpbmtGaWxlcygpKSB7Ci0JCQkJCVN0cmluZyBsaW5rOwotCQkJCQlpZiAobGlua2ZpbGUuZGVzdC5jb250YWlucygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxpbmsgPSBGaWxlVXRpbHMucmVsYXRpdml6ZUdpdFBhdGgoCi0JCQkJCQkJCWxpbmtmaWxlLmRlc3Quc3Vic3RyaW5nKDAsCi0JCQkJCQkJCQkJbGlua2ZpbGUuZGVzdC5sYXN0SW5kZXhPZignLycpKSwKLQkJCQkJCQkJcHJvai5nZXRQYXRoKCkgKyAiLyIgKyBsaW5rZmlsZS5zcmMpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaW5rID0gcHJvai5nZXRQYXRoKCkgKyAiLyIgKyBsaW5rZmlsZS5zcmM7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCW9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQkJCQlsaW5rLmdldEJ5dGVzKFVURl84KSk7Ci0JCQkJCWRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShsaW5rZmlsZS5kZXN0KTsKLQkJCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7Ci0JCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuU1lNTElOSyk7Ci0JCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgY29udGVudCA9IGNmZy50b1RleHQoKTsKLQotCQkvLyBjcmVhdGUgYSBuZXcgRGlyQ2FjaGVFbnRyeSBmb3IgLmdpdG1vZHVsZXMgZmlsZS4KLQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkoCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVRfTU9EVUxFUyk7Ci0JCU9iamVjdElkIG9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQljb250ZW50LmdldEJ5dGVzKFVURl84KSk7Ci0JCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOwotCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7Ci0JCWJ1aWxkZXIuYWRkKGRjRW50cnkpOwotCi0JCWlmIChyZWNvcmRTdWJtb2R1bGVMYWJlbHMpIHsKLQkJCS8vIGNyZWF0ZSBhIG5ldyBEaXJDYWNoZUVudHJ5IGZvciAuZ2l0YXR0cmlidXRlcyBmaWxlLgotCQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5QXR0ciA9IG5ldyBEaXJDYWNoZUVudHJ5KAotCQkJCQlDb25zdGFudHMuRE9UX0dJVF9BVFRSSUJVVEVTKTsKLQkJCU9iamVjdElkIGF0dHJJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJCWF0dHJpYnV0ZXMudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOwotCQkJZGNFbnRyeUF0dHIuc2V0T2JqZWN0SWQoYXR0cklkKTsKLQkJCWRjRW50cnlBdHRyLnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7Ci0JCQlidWlsZGVyLmFkZChkY0VudHJ5QXR0cik7CisJCQlCYXJlU3VwZXJwcm9qZWN0V3JpdGVyIHdyaXRlciA9IG5ldyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyKHJlcG8sIHRhcmdldFVyaSwKKwkJCQkJdGFyZ2V0QnJhbmNoLAorCQkJCQlhdXRob3IgPT0gbnVsbCA/IG5ldyBQZXJzb25JZGVudChyZXBvKSA6IGF1dGhvciwKKwkJCQkJY2FsbGJhY2sgPT0gbnVsbCA/IG5ldyBEZWZhdWx0UmVtb3RlUmVhZGVyKCkgOiBjYWxsYmFjaywKKwkJCQkJYmFyZVdyaXRlckNvbmZpZywgZXh0cmFDb250ZW50cyk7CisJCQlyZXR1cm4gd3JpdGVyLndyaXRlKHJlbmFtZWRQcm9qZWN0cyk7CiAJCX0KIAotCQlidWlsZGVyLmZpbmlzaCgpOwotCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCi0JCQlSZXZXYWxrIHJ3LCBPYmplY3RJZCB0cmVlSWQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gewotCQlPYmplY3RJZCBoZWFkSWQgPSByZXBvLnJlc29sdmUodGFyZ2V0QnJhbmNoICsgIl57Y29tbWl0fSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChoZWFkSWQgIT0gbnVsbCAmJiBydy5wYXJzZUNvbW1pdChoZWFkSWQpLmdldFRyZWUoKS5nZXRJZCgpLmVxdWFscyh0cmVlSWQpKSB7Ci0JCQkvLyBObyBjaGFuZ2UuIERvIG5vdGhpbmcuCi0JCQlyZXR1cm4gcncucGFyc2VDb21taXQoaGVhZElkKTsKLQkJfQotCi0JCUNvbW1pdEJ1aWxkZXIgY29tbWl0ID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKLQkJY29tbWl0LnNldFRyZWVJZCh0cmVlSWQpOwotCQlpZiAoaGVhZElkICE9IG51bGwpCi0JCQljb21taXQuc2V0UGFyZW50SWRzKGhlYWRJZCk7Ci0JCWNvbW1pdC5zZXRBdXRob3IoYXV0aG9yKTsKLQkJY29tbWl0LnNldENvbW1pdHRlcihhdXRob3IpOwotCQljb21taXQuc2V0TWVzc2FnZShSZXBvVGV4dC5nZXQoKS5yZXBvQ29tbWl0TWVzc2FnZSk7Ci0KLQkJT2JqZWN0SWQgY29tbWl0SWQgPSBpbnNlcnRlci5pbnNlcnQoY29tbWl0KTsKLQkJaW5zZXJ0ZXIuZmx1c2goKTsKLQotCQlSZWZVcGRhdGUgcnUgPSByZXBvLnVwZGF0ZVJlZih0YXJnZXRCcmFuY2gpOwotCQlydS5zZXROZXdPYmplY3RJZChjb21taXRJZCk7Ci0JCXJ1LnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoaGVhZElkICE9IG51bGwgPyBoZWFkSWQgOiBPYmplY3RJZC56ZXJvSWQoKSk7Ci0JCVJlc3VsdCByYyA9IHJ1LnVwZGF0ZShydyk7Ci0JCXN3aXRjaCAocmMpIHsKLQkJCWNhc2UgTkVXOgotCQkJY2FzZSBGT1JDRUQ6Ci0JCQljYXNlIEZBU1RfRk9SV0FSRDoKLQkJCQkvLyBTdWNjZXNzZnVsLiBEbyBub3RoaW5nLgotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUpFQ1RFRDoKLQkJCWNhc2UgTE9DS19GQUlMVVJFOgotCQkJCXRocm93IG5ldyBDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2Fubm90TG9jaywgdGFyZ2V0QnJhbmNoKSwKLQkJCQkJCXJ1LmdldFJlZigpLCByYyk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlKR2l0VGV4dC5nZXQoKS51cGRhdGluZ1JlZkZhaWxlZCwKLQkJCQkJCXRhcmdldEJyYW5jaCwgY29tbWl0SWQubmFtZSgpLCByYykpOwotCQl9Ci0KLQkJcmV0dXJuIHJ3LnBhcnNlQ29tbWl0KGNvbW1pdElkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3VibW9kdWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsLCBTdHJpbmcgcGF0aCwKLQkJCVN0cmluZyByZXZpc2lvbiwgTGlzdDxDb3B5RmlsZT4gY29weWZpbGVzLCBMaXN0PExpbmtGaWxlPiBsaW5rZmlsZXMsCi0JCQlHaXQgZ2l0KSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWFzc2VydCAoIXJlcG8uaXNCYXJlKCkpOwotCQlhc3NlcnQgKGdpdCAhPSBudWxsKTsKLQkJaWYgKCFsaW5rZmlsZXMuaXNFbXB0eSgpKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJCUpHaXRUZXh0LmdldCgpLm5vbkJhcmVMaW5rRmlsZXNOb3RTdXBwb3J0ZWQpOwotCQl9Ci0KLQkJU3VibW9kdWxlQWRkQ29tbWFuZCBhZGQgPSBnaXQuc3VibW9kdWxlQWRkKCkuc2V0TmFtZShuYW1lKS5zZXRQYXRoKHBhdGgpCi0JCQkJLnNldFVSSSh1cmwpOwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJYWRkLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQotCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBhZGQuY2FsbCgpOwotCQlpZiAocmV2aXNpb24gIT0gbnVsbCkgewotCQkJdHJ5IChHaXQgc3ViID0gbmV3IEdpdChzdWJSZXBvKSkgewotCQkJCXN1Yi5jaGVja291dCgpLnNldE5hbWUoZmluZFJlZihyZXZpc2lvbiwgc3ViUmVwbykpLmNhbGwoKTsKLQkJCX0KLQkJCXN1YlJlcG8uY2xvc2UoKTsKLQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihwYXRoKS5jYWxsKCk7Ci0JCX0KLQkJZm9yIChDb3B5RmlsZSBjb3B5ZmlsZSA6IGNvcHlmaWxlcykgewotCQkJY29weWZpbGUuY29weSgpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGNvcHlmaWxlLmRlc3QpLmNhbGwoKTsKLQkJfQorCQlSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyIHdyaXRlciA9IG5ldyBSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyKHJlcG8sIG1vbml0b3IpOworCQlyZXR1cm4gd3JpdGVyLndyaXRlKGZpbHRlcmVkUHJvamVjdHMpOwogCX0KIAogCS8qKgpAQCAtOTEwLDEzICs2ODIsNCBAQCBzdGF0aWMgVVJJIHJlbGF0aXZpemUoVVJJIGN1cnJlbnQsIFVSSSB0YXJnZXQpIHsKIAkJcmV0dXJuIFVSSS5jcmVhdGUoai50b1N0cmluZygpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFJlZihTdHJpbmcgcmVmLCBSZXBvc2l0b3J5IHJlcG8pCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIU9iamVjdElkLmlzSWQocmVmKSkgewotCQkJUmVmIHIgPSByZXBvLmV4YWN0UmVmKFJfUkVNT1RFUyArIERFRkFVTFRfUkVNT1RFX05BTUUgKyAiLyIgKyByZWYpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAociAhPSBudWxsKQotCQkJCXJldHVybiByLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVmOwotCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQppbmRleCA2MWEyZTg3Li4yYWRkZTBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCkBAIC0zODcsNiArMzg3LDggQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbk1lbW9yeUJ1ZmZlckxpbWl0RXhjZWVkZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnB1dERpZG50TWF0Y2hMZW5ndGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnB1dFN0cmVhbU11c3RTdXBwb3J0TWFyazsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVnZXJWYWx1ZU5vdEluUmFuZ2U7CisJLyoqKi8gcHVibGljIFN0cmluZyBpbnRlZ2VyVmFsdWVOb3RJblJhbmdlU3ViU2VjdGlvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVnZXJWYWx1ZU91dE9mUmFuZ2U7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnRlcm5hbFJldmlzaW9uRXJyb3I7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnRlcm5hbFNlcnZlckVycm9yOwpAQCAtMzk4LDYgKzQwMCw3IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEJvb2xlYW5WYWx1ZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRDaGFubmVsOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZENvbW1pdFBhcmVudE51bWJlcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRDb3JlQWJicmV2OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZERlcHRoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEVuY29kaW5nOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEVuY3J5cHRpb247CkBAIC01OTksNiArNjAyLDExIEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaENlcnRpZmljYXRlSW52YWxpZEZpZWxkVmFsdWU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkSGVhZGVyOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaENlcnRpZmljYXRlSW52YWxpZFNpZ25hdHVyZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hEZWZhdWx0Tm90aGluZzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hEZWZhdWx0Tm9VcHN0cmVhbTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hEZWZhdWx0U2ltcGxlOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHRUcmlhbmd1bGFyVXBzdHJlYW07CisJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoRGVmYXVsdFVua25vd247CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoSXNOb3RTdXBwb3J0ZWRGb3JCdW5kbGVUcmFuc3BvcnQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoTm90UGVybWl0dGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaE9wdGlvbnNOb3RTdXBwb3J0ZWQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvQ29tbWFuZExpbmVEaWZmVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0NvbW1hbmRMaW5lRGlmZlRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk1MTVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0NvbW1hbmRMaW5lRGlmZlRvb2wuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKKy8qKgorICogUHJlLWRlZmluZWQgY29tbWFuZCBsaW5lIGRpZmYgdG9vbHMuCisgKgorICogQWRkcyBzYW1lIGRpZmYgdG9vbHMgYXMgYWxzbyBwcmUtZGVmaW5lZCBpbiBDLUdpdAorICogPHA+CisgKiBzZWUgImdpdC1jb3JlXG1lcmdldG9vbHNcIgorICogPC9wPgorICogPHA+CisgKiBzZWUgbGlua3MgdG8gY29tbWFuZCBsaW5lIHBhcmFtZXRlciBkZXNjcmlwdGlvbiBmb3IgdGhlIHRvb2xzCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqIGFyYXhpcworICogYmMKKyAqIGJjMworICogY29kZWNvbXBhcmUKKyAqIGRlbHRhd2Fsa2VyCisgKiBkaWZmbWVyZ2UKKyAqIGRpZmZ1c2UKKyAqIGVjbWVyZ2UKKyAqIGVtZXJnZQorICogZXhhbWRpZmYKKyAqIGd1aWZmeQorICogZ3ZpbWRpZmYKKyAqIGd2aW1kaWZmMgorICogZ3ZpbWRpZmYzCisgKiBrZGlmZjMKKyAqIGtvbXBhcmUKKyAqIG1lbGQKKyAqIG9wZW5kaWZmCisgKiBwNG1lcmdlCisgKiB0a2RpZmYKKyAqIHZpbWRpZmYKKyAqIHZpbWRpZmYyCisgKiB2aW1kaWZmMworICogd2lubWVyZ2UKKyAqIHh4ZGlmZgorICogPC9wcmU+CisgKgorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBlbnVtIENvbW1hbmRMaW5lRGlmZlRvb2wgeworCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuYXJheGlzLmNvbS9tZXJnZS9kb2N1bWVudGF0aW9uLXdpbmRvd3MvY29tbWFuZC1saW5lLmVuIj5odHRwczovL3d3dy5hcmF4aXMuY29tL21lcmdlL2RvY3VtZW50YXRpb24td2luZG93cy9jb21tYW5kLWxpbmUuZW48L2E+CisJICovCisJYXJheGlzKCJjb21wYXJlIiwgIi13YWl0IC0yIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LnNjb290ZXJzb2Z0d2FyZS5jb20vdjRoZWxwL2luZGV4Lmh0bWw/Y29tbWFuZF9saW5lX3JlZmVyZW5jZS5odG1sIj5odHRwczovL3d3dy5zY29vdGVyc29mdHdhcmUuY29tL3Y0aGVscC9pbmRleC5odG1sP2NvbW1hbmRfbGluZV9yZWZlcmVuY2UuaHRtbDwvYT4KKwkgKi8KKwliYygiYmNvbXAiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuc2Nvb3RlcnNvZnR3YXJlLmNvbS92NGhlbHAvaW5kZXguaHRtbD9jb21tYW5kX2xpbmVfcmVmZXJlbmNlLmh0bWwiPmh0dHBzOi8vd3d3LnNjb290ZXJzb2Z0d2FyZS5jb20vdjRoZWxwL2luZGV4Lmh0bWw/Y29tbWFuZF9saW5lX3JlZmVyZW5jZS5odG1sPC9hPgorCSAqLworCWJjMygiYmNvbXBhcmUiLCBiYyksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5kZXZhcnQuY29tL2NvZGVjb21wYXJlL2RvY3MvaW5kZXguaHRtbD9jb21wYXJpbmdfdmlhX2NvbW1hbmRfbGluZS5odG0iPmh0dHBzOi8vd3d3LmRldmFydC5jb20vY29kZWNvbXBhcmUvZG9jcy9pbmRleC5odG1sP2NvbXBhcmluZ192aWFfY29tbWFuZF9saW5lLmh0bTwvYT4KKwkgKi8KKwljb2RlY29tcGFyZSgiQ29kZUNvbXBhcmUiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuZGVsdGF3YWxrZXIuY29tL2ludGVncmF0ZS9jb21tYW5kLWxpbmUiPmh0dHBzOi8vd3d3LmRlbHRhd2Fsa2VyLmNvbS9pbnRlZ3JhdGUvY29tbWFuZC1saW5lPC9hPgorCSAqLworCWRlbHRhd2Fsa2VyKCJEZWx0YVdhbGtlciIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3NvdXJjZWdlYXIuY29tL2RpZmZtZXJnZS93ZWJoZWxwL3NlY19fY2xhcmdzX19kaWZmLmh0bWwiPmh0dHBzOi8vc291cmNlZ2Vhci5jb20vZGlmZm1lcmdlL3dlYmhlbHAvc2VjX19jbGFyZ3NfX2RpZmYuaHRtbDwvYT4KKwkgKi8KKwlkaWZmbWVyZ2UoImRpZmZtZXJnZSIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vZGlmZnVzZS5zb3VyY2Vmb3JnZS5uZXQvbWFudWFsLmh0bWwjaW50cm9kdWN0aW9uLXVzYWdlIj5odHRwOi8vZGlmZnVzZS5zb3VyY2Vmb3JnZS5uZXQvbWFudWFsLmh0bWwjaW50cm9kdWN0aW9uLXVzYWdlPC9hPgorCSAqLworCWRpZmZ1c2UoImRpZmZ1c2UiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3d3dy5lbGxpZWNvbXB1dGluZy5jb20vZW4vT25saW5lRG9jL2VjbWVyZ2VfZW4vNDQyMDUxNjcuYXNwIj5odHRwOi8vd3d3LmVsbGllY29tcHV0aW5nLmNvbS9lbi9PbmxpbmVEb2MvZWNtZXJnZV9lbi80NDIwNTE2Ny5hc3A8L2E+CisJICovCisJZWNtZXJnZSgiZWNtZXJnZSIsICItLWRlZmF1bHQgLS1tb2RlPWRpZmYyIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZW1hY3MvbWFudWFsL2h0bWxfbm9kZS9lbWFjcy9PdmVydmlldy1vZi1FbWVyZ2UuaHRtbCI+aHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9lbWFjcy9tYW51YWwvaHRtbF9ub2RlL2VtYWNzL092ZXJ2aWV3LW9mLUVtZXJnZS5odG1sPC9hPgorCSAqLworCWVtZXJnZSgiZW1hY3MiLCAiLWYgZW1lcmdlLWZpbGVzLWNvbW1hbmQgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cucHJlc3Rvc29mdC5jb20vcHMuYXNwP3BhZ2U9aHRtbGhlbHAvZWRwL2NvbW1hbmRfbGluZV9vcHRpb25zIj5odHRwczovL3d3dy5wcmVzdG9zb2Z0LmNvbS9wcy5hc3A/cGFnZT1odG1saGVscC9lZHAvY29tbWFuZF9saW5lX29wdGlvbnM8L2E+CisJICovCisJZXhhbWRpZmYoIkV4YW1EaWZmIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIgLW5oIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5ndWlmZnkuY29tL2hlbHAvR3VpZmZ5SGVscC9HdWlmZnlDbWQuaHRtbCI+aHR0cHM6Ly93d3cuZ3VpZmZ5LmNvbS9oZWxwL0d1aWZmeUhlbHAvR3VpZmZ5Q21kLmh0bWw8L2E+CisJICovCisJZ3VpZmZ5KCJndWlmZnkiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCWd2aW1kaWZmKCJndmlld2RpZmYiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCWd2aW1kaWZmMihndmltZGlmZiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CisJICovCisJZ3ZpbWRpZmYzKGd2aW1kaWZmKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9rZGlmZjMuc291cmNlZm9yZ2UubmV0L2RvYy9kb2N1bWVudGF0aW9uLmh0bWwiPmh0dHA6Ly9rZGlmZjMuc291cmNlZm9yZ2UubmV0L2RvYy9kb2N1bWVudGF0aW9uLmh0bWw8L2E+CisJICovCisJa2RpZmYzKCJrZGlmZjMiLAorCQkJIi0tTDEgXCIkTUVSR0VEIChBKVwiIC0tTDIgXCIkTUVSR0VEIChCKVwiIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vZG9jcy5rZGUub3JnL3RydW5rNS9lbi9rZGVzZGsva29tcGFyZS9jb21tYW5kbGluZS1vcHRpb25zLmh0bWwiPmh0dHBzOi8vZG9jcy5rZGUub3JnL3RydW5rNS9lbi9rZGVzZGsva29tcGFyZS9jb21tYW5kbGluZS1vcHRpb25zLmh0bWw8L2E+CisJICovCisJa29tcGFyZSgia29tcGFyZSIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJ0dHA6Ly9tZWxkbWVyZ2Uub3JnL2hlbHAvZmlsZS1tb2RlLmh0bWwiPmh0dHA6Ly9tZWxkbWVyZ2Uub3JnL2hlbHAvZmlsZS1tb2RlLmh0bWw8L2E+CisJICovCisJbWVsZCgibWVsZCIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vd3d3Lm1hbnBhZ2V6LmNvbS9tYW4vMS9vcGVuZGlmZi8iPmh0dHA6Ly93d3cubWFucGFnZXouY29tL21hbi8xL29wZW5kaWZmLzwvYT4KKwkgKiA8cD4KKwkgKiBIaW50OiBjaGVjayB0aGUgJyB8IGNhdCcgZm9yIHRoZSBjYWxsCisJICogPC9wPgorCSAqLworCW9wZW5kaWZmKCJvcGVuZGlmZiIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5wZXJmb3JjZS5jb20vbWFudWFscy92MTUuMS9jbWRyZWYvcDRfbWVyZ2UuaHRtbCI+aHR0cHM6Ly93d3cucGVyZm9yY2UuY29tL21hbnVhbHMvdjE1LjEvY21kcmVmL3A0X21lcmdlLmh0bWw8L2E+CisJICovCisJcDRtZXJnZSgicDRtZXJnZSIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vbGludXgubWF0aC50aWZyLnJlcy5pbi9tYW51YWxzL21hbi90a2RpZmYuaHRtbCI+aHR0cDovL2xpbnV4Lm1hdGgudGlmci5yZXMuaW4vbWFudWFscy9tYW4vdGtkaWZmLmh0bWw8L2E+CisJICovCisJdGtkaWZmKCJ0a2RpZmYiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCXZpbWRpZmYoInZpZXdkaWZmIiwgZ3ZpbWRpZmYpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCXZpbWRpZmYyKHZpbWRpZmYpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCXZpbWRpZmYzKHZpbWRpZmYpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL21hbnVhbC53aW5tZXJnZS5vcmcvQ29tbWFuZF9saW5lLmh0bWwiPmh0dHA6Ly9tYW51YWwud2lubWVyZ2Uub3JnL0NvbW1hbmRfbGluZS5odG1sPC9hPgorCSAqIDxwPgorCSAqIEhpbnQ6IGNoZWNrIGhvdyAnbWVyZ2V0b29sX2ZpbmRfd2luMzJfY21kICJXaW5NZXJnZVUuZXhlIiAiV2luTWVyZ2UiJworCSAqIHdvcmtzCisJICogPC9wPgorCSAqLworCXdpbm1lcmdlKCJXaW5NZXJnZVUiLCAiLXUgLWUgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL2Z1cml1cy5jYS94eGRpZmYvZG9jL3h4ZGlmZi1kb2MuaHRtbCI+aHR0cDovL2Z1cml1cy5jYS94eGRpZmYvZG9jL3h4ZGlmZi1kb2MuaHRtbDwvYT4KKwkgKi8KKwl4eGRpZmYoInh4ZGlmZiIsCisJCQkiLVIgJ0FjY2VsLlNlYXJjaDogXCJDdHJsK0ZcIicgLVIgJ0FjY2VsLlNlYXJjaEZvcndhcmQ6IFwiQ3RybCtHXCInIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKTsKKworCUNvbW1hbmRMaW5lRGlmZlRvb2woU3RyaW5nIHBhdGgsIFN0cmluZyBwYXJhbWV0ZXJzKSB7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisJfQorCisJQ29tbWFuZExpbmVEaWZmVG9vbChDb21tYW5kTGluZURpZmZUb29sIGZyb20pIHsKKwkJdGhpcyhmcm9tLmdldFBhdGgoKSwgZnJvbS5nZXRQYXJhbWV0ZXJzKCkpOworCX0KKworCUNvbW1hbmRMaW5lRGlmZlRvb2woU3RyaW5nIHBhdGgsIENvbW1hbmRMaW5lRGlmZlRvb2wgZnJvbSkgeworCQl0aGlzKHBhdGgsIGZyb20uZ2V0UGFyYW1ldGVycygpKTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBwYXRoOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFyYW1ldGVyczsKKworCS8qKgorCSAqIEByZXR1cm4gcGF0aAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJLyoqCisJICogQHJldHVybiBwYXJhbWV0ZXJzIGFzIG9uZSBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcnMoKSB7CisJCXJldHVybiBwYXJhbWV0ZXJzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29sQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRGlmZlRvb2xDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTFmNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29sQ29uZmlnLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMSwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfRElGRlRPT0xfU0VDVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19ESUZGX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfR1VJVE9PTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUEFUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFJPTVBUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UT09MOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnLlNlY3Rpb25QYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworCisvKioKKyAqIEtlZXBzIHRyYWNrIG9mIGRpZmZ0b29sIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICovCitwdWJsaWMgY2xhc3MgRGlmZlRvb2xDb25maWcgeworCisJLyoqIEtleSBmb3Ige0BsaW5rIENvbmZpZyNnZXQoU2VjdGlvblBhcnNlcil9LiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlnLlNlY3Rpb25QYXJzZXI8RGlmZlRvb2xDb25maWc+IEtFWSA9IERpZmZUb29sQ29uZmlnOjpuZXc7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB0b29sTmFtZTsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIGd1aVRvb2xOYW1lOworCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHByb21wdDsKKworCXByaXZhdGUgZmluYWwgQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGU7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHRvb2xzOworCisJcHJpdmF0ZSBEaWZmVG9vbENvbmZpZyhDb25maWcgcmMpIHsKKwkJdG9vbE5hbWUgPSByYy5nZXRTdHJpbmcoQ09ORklHX0RJRkZfU0VDVElPTiwgbnVsbCwgQ09ORklHX0tFWV9UT09MKTsKKwkJZ3VpVG9vbE5hbWUgPSByYy5nZXRTdHJpbmcoQ09ORklHX0RJRkZfU0VDVElPTiwgbnVsbCwKKwkJCQlDT05GSUdfS0VZX0dVSVRPT0wpOworCQlwcm9tcHQgPSByYy5nZXRCb29sZWFuKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBDT05GSUdfS0VZX1BST01QVCwKKwkJCQl0cnVlKTsKKwkJU3RyaW5nIHRydXN0U3RyID0gcmMuZ2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBudWxsLAorCQkJCUNPTkZJR19LRVlfVFJVU1RfRVhJVF9DT0RFKTsKKwkJaWYgKHRydXN0U3RyICE9IG51bGwpIHsKKwkJCXRydXN0RXhpdENvZGUgPSBCb29sZWFuLnBhcnNlQm9vbGVhbih0cnVzdFN0cikKKwkJCQkJPyBCb29sZWFuVHJpU3RhdGUuVFJVRQorCQkJCQk6IEJvb2xlYW5UcmlTdGF0ZS5GQUxTRTsKKwkJfSBlbHNlIHsKKwkJCXRydXN0RXhpdENvZGUgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CisJCX0KKwkJdG9vbHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCVNldDxTdHJpbmc+IHN1YnNlY3Rpb25zID0gcmMuZ2V0U3Vic2VjdGlvbnMoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04pOworCQlmb3IgKFN0cmluZyBuYW1lIDogc3Vic2VjdGlvbnMpIHsKKwkJCVN0cmluZyBjbWQgPSByYy5nZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIG5hbWUsCisJCQkJCUNPTkZJR19LRVlfQ01EKTsKKwkJCVN0cmluZyBwYXRoID0gcmMuZ2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBuYW1lLAorCQkJCQlDT05GSUdfS0VZX1BBVEgpOworCQkJaWYgKChjbWQgIT0gbnVsbCkgfHwgKHBhdGggIT0gbnVsbCkpIHsKKwkJCQl0b29scy5wdXQobmFtZSwgbmV3IFVzZXJEZWZpbmVkRGlmZlRvb2wobmFtZSwgcGF0aCwgY21kKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGRpZmYgdG9vbCBuYW1lIChkaWZmLnRvb2wpCisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VG9vbE5hbWUoKSB7CisJCXJldHVybiB0b29sTmFtZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IEdVSSBkaWZmIHRvb2wgbmFtZSAoZGlmZi5ndWl0b29sKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEd1aVRvb2xOYW1lKCkgeworCQlyZXR1cm4gZ3VpVG9vbE5hbWU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZGlmZiB0b29sICJwcm9tcHQiIG9wdGlvbiAoZGlmZnRvb2wucHJvbXB0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUHJvbXB0KCkgeworCQlyZXR1cm4gcHJvbXB0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRpZmYgdG9vbCAidHJ1c3QgZXhpdCBjb2RlIiBvcHRpb24gKGRpZmZ0b29sLnRydXN0RXhpdENvZGUpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNUcnVzdEV4aXRDb2RlKCkgeworCQlyZXR1cm4gdHJ1c3RFeGl0Q29kZSA9PSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0b29scyBtYXAKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gZ2V0VG9vbHMoKSB7CisJCXJldHVybiB0b29sczsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0b29sIG5hbWVzCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldFRvb2xOYW1lcygpIHsKKwkJcmV0dXJuIHRvb2xzLmtleVNldCgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTcyOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29scy5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsLkJvb2xlYW5UcmlTdGF0ZTsKKworLyoqCisgKiBNYW5hZ2VzIGRpZmYgdG9vbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBEaWZmVG9vbHMgeworCisJcHJpdmF0ZSBmaW5hbCBEaWZmVG9vbENvbmZpZyBjb25maWc7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHByZWRlZmluZWRUb29sczsKKworCXByaXZhdGUgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdXNlckRlZmluZWRUb29sczsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGV4dGVybmFsIGRpZmYtdG9vbHMgbWFuYWdlciBmb3IgZ2l2ZW4gcmVwb3NpdG9yeS4KKwkgKgorCSAqIEBwYXJhbSByZXBvCisJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeQorCSAqLworCXB1YmxpYyBEaWZmVG9vbHMoUmVwb3NpdG9yeSByZXBvKSB7CisJCWNvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCkuZ2V0KERpZmZUb29sQ29uZmlnLktFWSk7CisJCXNldHVwUHJlZGVmaW5lZFRvb2xzKCk7CisJCXNldHVwVXNlckRlZmluZWRUb29scygpOworCX0KKworCS8qKgorCSAqIENvbXBhcmUgdHdvIHZlcnNpb25zIG9mIGEgZmlsZS4KKwkgKgorCSAqIEBwYXJhbSBuZXdQYXRoCisJICogICAgICAgICAgICB0aGUgbmV3IGZpbGUgcGF0aAorCSAqIEBwYXJhbSBvbGRQYXRoCisJICogICAgICAgICAgICB0aGUgb2xkIGZpbGUgcGF0aAorCSAqIEBwYXJhbSBuZXdJZAorCSAqICAgICAgICAgICAgdGhlIG5ldyBvYmplY3QgSUQKKwkgKiBAcGFyYW0gb2xkSWQKKwkgKiAgICAgICAgICAgIHRoZSBvbGQgb2JqZWN0IElECisJICogQHBhcmFtIHRvb2xOYW1lCisJICogICAgICAgICAgICB0aGUgc2VsZWN0ZWQgdG9vbCBuYW1lIChjYW4gYmUgbnVsbCkKKwkgKiBAcGFyYW0gcHJvbXB0CisJICogICAgICAgICAgICB0aGUgcHJvbXB0IG9wdGlvbgorCSAqIEBwYXJhbSBndWkKKwkgKiAgICAgICAgICAgIHRoZSBHVUkgb3B0aW9uCisJICogQHBhcmFtIHRydXN0RXhpdENvZGUKKwkgKiAgICAgICAgICAgIHRoZSAidHJ1c3QgZXhpdCBjb2RlIiBvcHRpb24KKwkgKiBAcmV0dXJuIHRoZSByZXR1cm4gY29kZSBmcm9tIGV4ZWN1dGVkIHRvb2wKKwkgKi8KKwlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIG5ld1BhdGgsIFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3SWQsCisJCQlTdHJpbmcgb2xkSWQsIFN0cmluZyB0b29sTmFtZSwgQm9vbGVhblRyaVN0YXRlIHByb21wdCwKKwkJCUJvb2xlYW5UcmlTdGF0ZSBndWksIEJvb2xlYW5UcmlTdGF0ZSB0cnVzdEV4aXRDb2RlKSB7CisJCXJldHVybiAwOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgbmFtZXMKKwkgKi8KKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0VG9vbE5hbWVzKCkgeworCQlyZXR1cm4gY29uZmlnLmdldFRvb2xOYW1lcygpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHVzZXIgZGVmaW5lZCB0b29scworCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBnZXRVc2VyRGVmaW5lZFRvb2xzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHVzZXJEZWZpbmVkVG9vbHMpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGF2YWlsYWJsZSBwcmVkZWZpbmVkIHRvb2xzCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IGdldEF2YWlsYWJsZVRvb2xzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHByZWRlZmluZWRUb29scyk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgTk9UIGF2YWlsYWJsZSBwcmVkZWZpbmVkIHRvb2xzCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IGdldE5vdEF2YWlsYWJsZVRvb2xzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG5ldyBUcmVlTWFwPD4oKSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGd1aQorCSAqICAgICAgICAgICAgdXNlIHRoZSBkaWZmLmd1aXRvb2wgc2V0dGluZyA/CisJICogQHJldHVybiB0aGUgZGVmYXVsdCB0b29sIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUb29sTmFtZShCb29sZWFuVHJpU3RhdGUgZ3VpKSB7CisJCXJldHVybiBndWkgIT0gQm9vbGVhblRyaVN0YXRlLlVOU0VUID8gIm15X2d1aV90b29sIiAvLyROT04tTkxTLTEkCisJCQkJOiAibXlfZGVmYXVsdF90b29sbmFtZSI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGlzIGludGVyYWN0aXZlIChjb25maWcgcHJvbXB0IGVuYWJsZWQpID8KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVyYWN0aXZlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldHVwUHJlZGVmaW5lZFRvb2xzKCkgeworCQlwcmVkZWZpbmVkVG9vbHMgPSBuZXcgVHJlZU1hcDw+KCk7CisJCWZvciAoQ29tbWFuZExpbmVEaWZmVG9vbCB0b29sIDogQ29tbWFuZExpbmVEaWZmVG9vbC52YWx1ZXMoKSkgeworCQkJcHJlZGVmaW5lZFRvb2xzLnB1dCh0b29sLm5hbWUoKSwgbmV3IFByZURlZmluZWREaWZmVG9vbCh0b29sKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0dXBVc2VyRGVmaW5lZFRvb2xzKCkgeworCQl1c2VyRGVmaW5lZFRvb2xzID0gbmV3IFRyZWVNYXA8PigpOworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiB1c2VyVG9vbHMgPSBjb25maWcuZ2V0VG9vbHMoKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IHVzZXJUb29scy5rZXlTZXQoKSkgeworCQkJRXh0ZXJuYWxEaWZmVG9vbCB1c2VyVG9vbCA9IHVzZXJUb29scy5nZXQobmFtZSk7CisJCQkvLyBpZiBkaWZmdG9vbC48bmFtZT4uY21kIGlzIGRlZmluZWQgd2UgaGF2ZSB1c2VyIGRlZmluZWQgdG9vbAorCQkJaWYgKHVzZXJUb29sLmdldENvbW1hbmQoKSAhPSBudWxsKSB7CisJCQkJdXNlckRlZmluZWRUb29scy5wdXQobmFtZSwgdXNlclRvb2wpOworCQkJfSBlbHNlIGlmICh1c2VyVG9vbC5nZXRQYXRoKCkgIT0gbnVsbCkgeworCQkJCS8vIGlmIGRpZmZ0b29sLjxuYW1lPi5wYXRoIGlzIGRlZmluZWQgd2UganVzdCBvdmVybG9hZCB0aGUgcGF0aAorCQkJCS8vIG9mIHByZWRlZmluZWQgdG9vbAorCQkJCVByZURlZmluZWREaWZmVG9vbCBwcmVkZWZUb29sID0gKFByZURlZmluZWREaWZmVG9vbCkgcHJlZGVmaW5lZFRvb2xzCisJCQkJCQkuZ2V0KG5hbWUpOworCQkJCWlmIChwcmVkZWZUb29sICE9IG51bGwpIHsKKwkJCQkJcHJlZGVmVG9vbC5zZXRQYXRoKHVzZXJUb29sLmdldFBhdGgoKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQ3ZTgyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2wuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworLyoqCisgKiBUaGUgZXh0ZXJuYWwgdG9vbCBpbnRlcmZhY2UuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxEaWZmVG9vbCB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0b29sIG5hbWUKKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdG9vbCBwYXRoCisJICovCisJU3RyaW5nIGdldFBhdGgoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgY29tbWFuZAorCSAqLworCVN0cmluZyBnZXRDb21tYW5kKCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9QcmVEZWZpbmVkRGlmZlRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9QcmVEZWZpbmVkRGlmZlRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY5ZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1ByZURlZmluZWREaWZmVG9vbC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMSwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCisvKioKKyAqIFRoZSBwcmUtZGVmaW5lZCBkaWZmIHRvb2wuCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVEZWZpbmVkRGlmZlRvb2wgZXh0ZW5kcyBVc2VyRGVmaW5lZERpZmZUb29sIHsKKworCS8qKgorCSAqIENyZWF0ZSBhIHByZS1kZWZpbmVkIGRpZmYgdG9vbAorCSAqCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHRoZSBwYXRoCisJICogQHBhcmFtIHBhcmFtZXRlcnMKKwkgKiAgICAgICAgICAgIHRoZSB0b29sIHBhcmFtZXRlcnMgYXMgb25lIHN0cmluZyB0aGF0IGlzIHVzZWQgdG9nZXRoZXIgd2l0aAorCSAqICAgICAgICAgICAgcGF0aCBhcyBjb21tYW5kCisJICovCisJcHVibGljIFByZURlZmluZWREaWZmVG9vbChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgsIFN0cmluZyBwYXJhbWV0ZXJzKSB7CisJCXN1cGVyKG5hbWUsIHBhdGgsIHBhcmFtZXRlcnMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIHByZS1kZWZpbmVkIGRpZmYgdG9vbAorCSAqCisJICogQHBhcmFtIHRvb2wKKwkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIGxpbmUgZGlmZiB0b29sCisJICoKKwkgKi8KKwlwdWJsaWMgUHJlRGVmaW5lZERpZmZUb29sKENvbW1hbmRMaW5lRGlmZlRvb2wgdG9vbCkgeworCQl0aGlzKHRvb2wubmFtZSgpLCB0b29sLmdldFBhdGgoKSwgdG9vbC5nZXRQYXJhbWV0ZXJzKCkpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXRoCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworCQkvLyBoYW5kbGluZyBvZiBzcGFjZXMgaW4gcGF0aAorCQlpZiAocGF0aC5jb250YWlucygiICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIGFkZCBxdW90ZXMgYmVmb3JlIGlmIG5lZWRlZAorCQkJaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIlwiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXBhdGggPSAiXCIiICsgcGF0aDsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJLy8gYWRkIHF1b3RlcyBhZnRlciBpZiBuZWVkZWQKKwkJCWlmICghcGF0aC5lbmRzV2l0aCgiXCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcGF0aCA9IHBhdGggKyAiXCIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJc3VwZXIuc2V0UGF0aChwYXRoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0ZWQgcGF0aCBhbmQgY29tbWFuZCBvZiB0aGUgcHJlLWRlZmluZWQgZGlmZiB0b29sCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkgeworCQlyZXR1cm4gZ2V0UGF0aCgpICsgIiAiICsgc3VwZXIuZ2V0Q29tbWFuZCgpOyAvLyROT04tTkxTLTEkCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvVXNlckRlZmluZWREaWZmVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1VzZXJEZWZpbmVkRGlmZlRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTIyOTZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1VzZXJEZWZpbmVkRGlmZlRvb2wuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKKy8qKgorICogVGhlIHVzZXItZGVmaW5lZCBkaWZmIHRvb2wuCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyRGVmaW5lZERpZmZUb29sIGltcGxlbWVudHMgRXh0ZXJuYWxEaWZmVG9vbCB7CisKKwkvKioKKwkgKiB0aGUgZGlmZiB0b29sIG5hbWUKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogdGhlIGRpZmYgdG9vbCBwYXRoCisJICovCisJcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworCS8qKgorCSAqIHRoZSBkaWZmIHRvb2wgY29tbWFuZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGNtZDsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRpZmYgdG9vbAorCSAqCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHRoZSBwYXRoCisJICogQHBhcmFtIGNtZAorCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQKKwkgKi8KKwlwdWJsaWMgVXNlckRlZmluZWREaWZmVG9vbChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgsIFN0cmluZyBjbWQpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5wYXRoID0gcGF0aDsKKwkJdGhpcy5jbWQgPSBjbWQ7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZGlmZiB0b29sIG5hbWUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIFRoZSBwYXRoIG9mIHRoZSBkaWZmIHRvb2wuCisJICoKKwkgKiA8cD4KKwkgKiBUaGUgcGF0aCB0byBhIHByZS1kZWZpbmVkIGV4dGVybmFsIGRpZmYgdG9vbCBjYW4gYmUgb3ZlcnJpZGRlbiBieQorCSAqIHNwZWNpZnlpbmcge0Bjb2RlIGRpZmZ0b29sLjx0b29sPi5wYXRofSBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogRm9yIGEgdXNlciBkZWZpbmVkIGRpZmYgdG9vbCAodGhhdCBkb2VzIG5vdCBvdmVycmlkZSBhIHByZS1kZWZpbmVkIGRpZmYKKwkgKiB0b29sKSwgdGhlIHBhdGggaXMgaWdub3JlZCB3aGVuIGludm9raW5nIHRoZSB0b29sLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGRpZmYgdG9vbCBwYXRoCisJICoKKwkgKiBAc2VlIDxhIGhyZWY9CisJICogICAgICAiaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1kaWZmdG9vbCI+aHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1kaWZmdG9vbDwvYT4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisJCXJldHVybiBwYXRoOworCX0KKworCS8qKgorCSAqIFRoZSBjb21tYW5kIG9mIHRoZSBkaWZmIHRvb2wuCisJICoKKwkgKiA8cD4KKwkgKiBBIHByZS1kZWZpbmVkIGV4dGVybmFsIGRpZmYgdG9vbCBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgdG9vbHMgbmFtZQorCSAqIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLiBUaGUgb3ZlcndyaXR0ZW4gdG9vbCBpcyB0aGVuIGEgdXNlciBkZWZpbmVkIHRvb2wKKwkgKiBhbmQgdGhlIGNvbW1hbmQgb2YgdGhlIGRpZmYgdG9vbCBpcyBzcGVjaWZpZWQgd2l0aAorCSAqIHtAY29kZSBkaWZmdG9vbC48dG9vbD4uY21kfS4gVGhpcyBjb21tYW5kIG11c3Qgd29yayB3aXRob3V0IHByZXBlbmRpbmcKKwkgKiB0aGUgdmFsdWUgb2Yge0BsaW5rICNnZXRQYXRoKCl9IGFuZCBjYW4gc29tZXRpbWVzIGluY2x1ZGUgdG9vbAorCSAqIHBhcmFtZXRlcnMuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgZGlmZiB0b29sIGNvbW1hbmQKKwkgKgorCSAqIEBzZWUgPGEgaHJlZj0KKwkgKiAgICAgICJodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWRpZmZ0b29sIj5odHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWRpZmZ0b29sPC9hPgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZCgpIHsKKwkJcmV0dXJuIGNtZDsKKwl9CisKKwkvKioKKwkgKiBPdmVycmlkZXMgdGhlIHBhdGggZm9yIHRoZSBnaXZlbiB0b29sLiBFcXVpdmFsZW50IHRvIHNldHRpbmcKKwkgKiB7QGNvZGUgZGlmZnRvb2wuPHRvb2w+LnBhdGh9LgorCSAqCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgZGlmZiB0b29sIHBhdGgKKwkgKgorCSAqIEBzZWUgPGEgaHJlZj0KKwkgKiAgICAgICJodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWRpZmZ0b29sIj5odHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWRpZmZ0b29sPC9hPgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKwkJdGhpcy5wYXRoID0gcGF0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhCmluZGV4IDU0YzUyN2MuLmIzMGQ1MDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhCkBAIC0xMiw2ICsxMiwxMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VBcnJheTsKQEAgLTE2Niw2ICsxNzAsMTIgQEAgcHVibGljIHN0YXRpYyBEZnNCbG9ja0NhY2hlIGdldEluc3RhbmNlKCkgewogCS8qKiBMaW1pdHMgb2YgY2FjaGUgaG90IGNvdW50IHBlciBwYWNrIGZpbGUgZXh0ZW5zaW9uLiAqLwogCXByaXZhdGUgZmluYWwgaW50W10gY2FjaGVIb3RMaW1pdHMgPSBuZXcgaW50W1BhY2tFeHQudmFsdWVzKCkubGVuZ3RoXTsKIAorCS8qKiBDb25zdW1lciBvZiBsb2FkaW5nIGFuZCBldmljdGlvbiBldmVudHMgb2YgaW5kZXhlcy4gKi8KKwlwcml2YXRlIGZpbmFsIERmc0Jsb2NrQ2FjaGVDb25maWcuSW5kZXhFdmVudENvbnN1bWVyIGluZGV4RXZlbnRDb25zdW1lcjsKKworCS8qKiBTdG9yZXMgdGltZXN0YW1wcyBvZiB0aGUgbGFzdCBldmljdGlvbiBvZiBpbmRleGVzLiAqLworCXByaXZhdGUgZmluYWwgTWFwPEV2aWN0S2V5LCBMb25nPiBpbmRleEV2aWN0aW9uTWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCXByaXZhdGUgRGZzQmxvY2tDYWNoZShEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgewogCQl0YWJsZVNpemUgPSB0YWJsZVNpemUoY2ZnKTsKQEAgLTIxMyw2ICsyMjMsNyBAQCBwcml2YXRlIERmc0Jsb2NrQ2FjaGUoRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKIAkJCQljYWNoZUhvdExpbWl0c1tpXSA9IERmc0Jsb2NrQ2FjaGVDb25maWcuREVGQVVMVF9DQUNIRV9IT1RfTUFYOwogCQkJfQogCQl9CisJCWluZGV4RXZlbnRDb25zdW1lciA9IGNmZy5nZXRJbmRleEV2ZW50Q29uc3VtZXIoKTsKIAl9CiAKIAlib29sZWFuIHNob3VsZENvcHlUaHJvdWdoQ2FjaGUobG9uZyBsZW5ndGgpIHsKQEAgLTQ2MSw2ICs0NzIsNyBAQCBwcml2YXRlIHZvaWQgcmVzZXJ2ZVNwYWNlKGxvbmcgcmVzZXJ2ZSwgRGZzU3RyZWFtS2V5IGtleSkgewogCQkJCQlsaXZlIC09IGRlYWQuc2l6ZTsKIAkJCQkJZ2V0U3RhdChsaXZlQnl0ZXMsIGRlYWQua2V5KS5hZGRBbmRHZXQoLWRlYWQuc2l6ZSk7CiAJCQkJCWdldFN0YXQoc3RhdEV2aWN0LCBkZWFkLmtleSkuaW5jcmVtZW50QW5kR2V0KCk7CisJCQkJCXJlcG9ydEluZGV4RXZpY3RlZChkZWFkKTsKIAkJCQl9IHdoaWxlIChtYXhCeXRlcyA8IGxpdmUpOwogCQkJCWNsb2NrSGFuZCA9IHByZXY7CiAJCQl9CkBAIC01MTUsMTEgKzUyNywxMyBAQCB2b2lkIHB1dChEZnNCbG9jayB2KSB7CiAJPFQ+IFJlZjxUPiBnZXRPckxvYWRSZWYoCiAJCQlEZnNTdHJlYW1LZXkga2V5LCBsb25nIHBvc2l0aW9uLCBSZWZMb2FkZXI8VD4gbG9hZGVyKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwogCQlpbnQgc2xvdCA9IHNsb3Qoa2V5LCBwb3NpdGlvbik7CiAJCUhhc2hFbnRyeSBlMSA9IHRhYmxlLmdldChzbG90KTsKIAkJUmVmPFQ+IHJlZiA9IHNjYW5SZWYoZTEsIGtleSwgcG9zaXRpb24pOwogCQlpZiAocmVmICE9IG51bGwpIHsKIAkJCWdldFN0YXQoc3RhdEhpdCwga2V5KS5pbmNyZW1lbnRBbmRHZXQoKTsKKwkJCXJlcG9ydEluZGV4UmVxdWVzdGVkKHJlZiwgdHJ1ZSAvKiBjYWNoZUhpdCAqLywgc3RhcnQpOwogCQkJcmV0dXJuIHJlZjsKIAkJfQogCkBAIC01MzIsNiArNTQ2LDggQEAgPFQ+IFJlZjxUPiBnZXRPckxvYWRSZWYoCiAJCQkJcmVmID0gc2NhblJlZihlMiwga2V5LCBwb3NpdGlvbik7CiAJCQkJaWYgKHJlZiAhPSBudWxsKSB7CiAJCQkJCWdldFN0YXQoc3RhdEhpdCwga2V5KS5pbmNyZW1lbnRBbmRHZXQoKTsKKwkJCQkJcmVwb3J0SW5kZXhSZXF1ZXN0ZWQocmVmLCB0cnVlIC8qIGNhY2hlSGl0ICovLAorCQkJCQkJCXN0YXJ0KTsKIAkJCQkJcmV0dXJuIHJlZjsKIAkJCQl9CiAJCQl9CkBAIC01NTYsNiArNTcyLDcgQEAgPFQ+IFJlZjxUPiBnZXRPckxvYWRSZWYoCiAJCX0gZmluYWxseSB7CiAJCQlyZWdpb25Mb2NrLnVubG9jaygpOwogCQl9CisJCXJlcG9ydEluZGV4UmVxdWVzdGVkKHJlZiwgZmFsc2UgLyogY2FjaGVIaXQgKi8sIHN0YXJ0KTsKIAkJcmV0dXJuIHJlZjsKIAl9CiAKQEAgLTY4Miw4ICs2OTksOSBAQCBwcml2YXRlIHN0YXRpYyBBdG9taWNMb25nIGdldFN0YXQoQXRvbWljUmVmZXJlbmNlPEF0b21pY0xvbmdbXT4gc3RhdHMsCiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgSGFzaEVudHJ5IGNsZWFuKEhhc2hFbnRyeSB0b3ApIHsKLQkJd2hpbGUgKHRvcCAhPSBudWxsICYmIHRvcC5yZWYubmV4dCA9PSBudWxsKQorCQl3aGlsZSAodG9wICE9IG51bGwgJiYgdG9wLnJlZi5uZXh0ID09IG51bGwpIHsKIAkJCXRvcCA9IHRvcC5uZXh0OworCQl9CiAJCWlmICh0b3AgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KQEAgLTY5MSw2ICs3MDksNDQgQEAgcHJpdmF0ZSBzdGF0aWMgSGFzaEVudHJ5IGNsZWFuKEhhc2hFbnRyeSB0b3ApIHsKIAkJcmV0dXJuIG4gPT0gdG9wLm5leHQgPyB0b3AgOiBuZXcgSGFzaEVudHJ5KG4sIHRvcC5yZWYpOwogCX0KIAorCXByaXZhdGUgdm9pZCByZXBvcnRJbmRleFJlcXVlc3RlZChSZWY8Pz4gcmVmLCBib29sZWFuIGNhY2hlSGl0LAorCQkJbG9uZyBzdGFydCkgeworCQlpZiAoaW5kZXhFdmVudENvbnN1bWVyID09IG51bGwKKwkJCQl8fCAhaXNJbmRleE9yQml0bWFwRXh0UG9zKHJlZi5rZXkucGFja0V4dFBvcykpIHsKKwkJCXJldHVybjsKKwkJfQorCQlFdmljdEtleSBldmljdEtleSA9IG5ldyBFdmljdEtleShyZWYpOworCQlMb25nIHByZXZFdmljdGVkVGltZSA9IGluZGV4RXZpY3Rpb25NYXAuZ2V0KGV2aWN0S2V5KTsKKwkJbG9uZyBub3cgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJbG9uZyBzaW5jZUxhc3RFdmljdGlvbk5hbm9zID0gcHJldkV2aWN0ZWRUaW1lID09IG51bGwgPyAwTAorCQkJCTogbm93IC0gcHJldkV2aWN0ZWRUaW1lLmxvbmdWYWx1ZSgpOworCQlpbmRleEV2ZW50Q29uc3VtZXIuYWNjZXB0UmVxdWVzdGVkRXZlbnQocmVmLmtleS5wYWNrRXh0UG9zLCBjYWNoZUhpdCwKKwkJCQkobm93IC0gc3RhcnQpIC8gMTAwMEwgLyogbWljcm9zICovLCByZWYuc2l6ZSwKKwkJCQlEdXJhdGlvbi5vZk5hbm9zKHNpbmNlTGFzdEV2aWN0aW9uTmFub3MpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVwb3J0SW5kZXhFdmljdGVkKFJlZjw/PiBkZWFkKSB7CisJCWlmIChpbmRleEV2ZW50Q29uc3VtZXIgPT0gbnVsbAorCQkJCXx8ICFpbmRleEV2ZW50Q29uc3VtZXIuc2hvdWxkUmVwb3J0RXZpY3RlZEV2ZW50KCkKKwkJCQl8fCAhaXNJbmRleE9yQml0bWFwRXh0UG9zKGRlYWQua2V5LnBhY2tFeHRQb3MpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRXZpY3RLZXkgZXZpY3RLZXkgPSBuZXcgRXZpY3RLZXkoZGVhZCk7CisJCUxvbmcgcHJldkV2aWN0ZWRUaW1lID0gaW5kZXhFdmljdGlvbk1hcC5nZXQoZXZpY3RLZXkpOworCQlsb25nIG5vdyA9IFN5c3RlbS5uYW5vVGltZSgpOworCQlsb25nIHNpbmNlTGFzdEV2aWN0aW9uTmFub3MgPSBwcmV2RXZpY3RlZFRpbWUgPT0gbnVsbCA/IDBMCisJCQkJOiBub3cgLSBwcmV2RXZpY3RlZFRpbWUubG9uZ1ZhbHVlKCk7CisJCWluZGV4RXZpY3Rpb25NYXAucHV0KGV2aWN0S2V5LCBMb25nLnZhbHVlT2Yobm93KSk7CisJCWluZGV4RXZlbnRDb25zdW1lci5hY2NlcHRFdmljdGVkRXZlbnQoZGVhZC5rZXkucGFja0V4dFBvcywgZGVhZC5zaXplLAorCQkJCWRlYWQudG90YWxIaXRDb3VudC5nZXQoKSwKKwkJCQlEdXJhdGlvbi5vZk5hbm9zKHNpbmNlTGFzdEV2aWN0aW9uTmFub3MpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5kZXhPckJpdG1hcEV4dFBvcyhpbnQgcGFja0V4dFBvcykgeworCQlyZXR1cm4gcGFja0V4dFBvcyA9PSBQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCkKKwkJCQl8fCBwYWNrRXh0UG9zID09IFBhY2tFeHQuQklUTUFQX0lOREVYLmdldFBvc2l0aW9uKCk7CisJfQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSGFzaEVudHJ5IHsKIAkJLyoqIE5leHQgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUncyBjaGFpbiBsaXN0LiAqLwogCQlmaW5hbCBIYXNoRW50cnkgbmV4dDsKQEAgLTcxMiw2ICs3NjgsNyBAQCBzdGF0aWMgZmluYWwgY2xhc3MgUmVmPFQ+IHsKIAkJUmVmIG5leHQ7CiAKIAkJcHJpdmF0ZSB2b2xhdGlsZSBpbnQgaG90Q291bnQ7CisJCXByaXZhdGUgQXRvbWljSW50ZWdlciB0b3RhbEhpdENvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKIAogCQlSZWYoRGZzU3RyZWFtS2V5IGtleSwgbG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplLCBUIHYpIHsKIAkJCXRoaXMua2V5ID0ga2V5OwpAQCAtNzM2LDYgKzc5Myw3IEBAIHZvaWQgbWFya0hvdHRlcigpIHsKIAkJCWludCBjYXAgPSBEZnNCbG9ja0NhY2hlCiAJCQkJCS5nZXRJbnN0YW5jZSgpLmNhY2hlSG90TGltaXRzW2tleS5wYWNrRXh0UG9zXTsKIAkJCWhvdENvdW50ID0gTWF0aC5taW4oY2FwLCBob3RDb3VudCArIDEpOworCQkJdG90YWxIaXRDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKIAkJfQogCiAJCXZvaWQgbWFya0NvbGRlcigpIHsKQEAgLTc0Nyw2ICs4MDUsMzQgQEAgYm9vbGVhbiBpc0hvdCgpIHsKIAkJfQogCX0KIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEV2aWN0S2V5IHsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQga2V5SGFzaDsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgcGFja0V4dFBvczsKKwkJcHJpdmF0ZSBmaW5hbCBsb25nIHBvc2l0aW9uOworCisJCUV2aWN0S2V5KFJlZjw/PiByZWYpIHsKKwkJCWtleUhhc2ggPSByZWYua2V5Lmhhc2g7CisJCQlwYWNrRXh0UG9zID0gcmVmLmtleS5wYWNrRXh0UG9zOworCQkJcG9zaXRpb24gPSByZWYucG9zaXRpb247CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKwkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFdmljdEtleSkgeworCQkJCUV2aWN0S2V5IG90aGVyID0gKEV2aWN0S2V5KSBvYmplY3Q7CisJCQkJcmV0dXJuIGtleUhhc2ggPT0gb3RoZXIua2V5SGFzaAorCQkJCQkJJiYgcGFja0V4dFBvcyA9PSBvdGhlci5wYWNrRXh0UG9zCisJCQkJCQkmJiBwb3NpdGlvbiA9PSBvdGhlci5wb3NpdGlvbjsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJcmV0dXJuIERmc0Jsb2NrQ2FjaGUuZ2V0SW5zdGFuY2UoKS5oYXNoKGtleUhhc2gsIHBvc2l0aW9uKTsKKwkJfQorCX0KKwogCUBGdW5jdGlvbmFsSW50ZXJmYWNlCiAJaW50ZXJmYWNlIFJlZkxvYWRlcjxUPiB7CiAJCVJlZjxUPiBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwpAQCAtNzYzLDQgKzg0OSw0IEBAIGludGVyZmFjZSBSZWFkYWJsZUNoYW5uZWxTdXBwbGllciB7CiAJCSAqLwogCQlSZWFkYWJsZUNoYW5uZWwgZ2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCX0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCmluZGV4IDI3MTZmNzkuLjY5YTM3MDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1NUUkVBTV9SQVRJTzsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudGltZS5EdXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CkBAIC00Niw5ICs0NywxMCBAQCBwdWJsaWMgY2xhc3MgRGZzQmxvY2tDYWNoZUNvbmZpZyB7CiAJcHJpdmF0ZSBpbnQgY29uY3VycmVuY3lMZXZlbDsKIAogCXByaXZhdGUgQ29uc3VtZXI8TG9uZz4gcmVmTG9jazsKLQogCXByaXZhdGUgTWFwPFBhY2tFeHQsIEludGVnZXI+IGNhY2hlSG90TWFwOwogCisJcHJpdmF0ZSBJbmRleEV2ZW50Q29uc3VtZXIgaW5kZXhFdmVudENvbnN1bWVyOworCiAJLyoqCiAJICogQ3JlYXRlIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uLgogCSAqLwpAQCAtMjE2LDYgKzIxOCwyOCBAQCBwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRDYWNoZUhvdE1hcCgKIAl9CiAKIAkvKioKKwkgKiBHZXQgdGhlIGNvbnN1bWVyIG9mIGNhY2hlIGluZGV4IGV2ZW50cy4KKwkgKgorCSAqIEByZXR1cm4gY29uc3VtZXIgb2YgY2FjaGUgaW5kZXggZXZlbnRzLgorCSAqLworCXB1YmxpYyBJbmRleEV2ZW50Q29uc3VtZXIgZ2V0SW5kZXhFdmVudENvbnN1bWVyKCkgeworCQlyZXR1cm4gaW5kZXhFdmVudENvbnN1bWVyOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgY29uc3VtZXIgb2YgY2FjaGUgaW5kZXggZXZlbnRzLgorCSAqCisJICogQHBhcmFtIGluZGV4RXZlbnRDb25zdW1lcgorCSAqICAgICAgICAgICAgY29uc3VtZXIgb2YgY2FjaGUgaW5kZXggZXZlbnRzLgorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICovCisJcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0SW5kZXhFdmVudENvbnN1bWVyKAorCQkJSW5kZXhFdmVudENvbnN1bWVyIGluZGV4RXZlbnRDb25zdW1lcikgeworCQl0aGlzLmluZGV4RXZlbnRDb25zdW1lciA9IGluZGV4RXZlbnRDb25zdW1lcjsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCiAJICogVXBkYXRlIHByb3BlcnRpZXMgYnkgc2V0dGluZyBmaWVsZHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KIAkgKiA8cD4KIAkgKiBJZiBhIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uLCB0aGVuIGl0IGlzIGxlZnQKQEAgLTI3Miw0ICsyOTYsNTIgQEAgcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgZnJvbUNvbmZpZyhDb25maWcgcmMpIHsKIAkJfQogCQlyZXR1cm4gdGhpczsKIAl9Ci19CisKKwkvKiogQ29uc3VtZXIgb2YgRGZzQmxvY2tDYWNoZSBsb2FkaW5nIGFuZCBldmljdGlvbiBldmVudHMgZm9yIGluZGV4ZXMuICovCisJcHVibGljIGludGVyZmFjZSBJbmRleEV2ZW50Q29uc3VtZXIgeworCQkvKioKKwkJICogQWNjZXB0IGFuIGV2ZW50IG9mIGFuIGluZGV4IHJlcXVlc3RlZC4gSXQgY291bGQgYmUgbG9hZGVkIGZyb20gZWl0aGVyCisJCSAqIGNhY2hlIG9yIHN0b3JhZ2UuCisJCSAqCisJCSAqIEBwYXJhbSBwYWNrRXh0UG9zCisJCSAqICAgICAgICAgICAgcG9zaXRpb24gaW4ge0Bjb2RlIFBhY2tFeHR9IGVudW0KKwkJICogQHBhcmFtIGNhY2hlSGl0CisJCSAqICAgICAgICAgICAgdHJ1ZSBpZiBhbiBpbmRleCB3YXMgYWxyZWFkeSBpbiBjYWNoZS4gT3RoZXJ3aXNlLCB0aGUKKwkJICogICAgICAgICAgICBpbmRleCB3YXMgbG9hZGVkIGZyb20gc3RvcmFnZSBpbnRvIHRoZSBjYWNoZSBpbiB0aGUKKwkJICogICAgICAgICAgICBjdXJyZW50IHJlcXVlc3QsCisJCSAqIEBwYXJhbSBsb2FkTWljcm9zCisJCSAqICAgICAgICAgICAgdGltZSB0byBsb2FkIGFuIGluZGV4IGZyb20gY2FjaGUgb3Igc3RvcmFnZSBpbgorCQkgKiAgICAgICAgICAgIG1pY3Jvc2Vjb25kcworCQkgKiBAcGFyYW0gYnl0ZXMKKwkJICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgbG9hZGVkCisJCSAqIEBwYXJhbSBsYXN0RXZpY3Rpb25EdXJhdGlvbgorCQkgKiAgICAgICAgICAgIHRpbWUgc2luY2UgbGFzdCBldmljdGlvbiwgMCBpZiB3YXMgbm90IGV2aWN0ZWQgeWV0CisJCSAqLworCQl2b2lkIGFjY2VwdFJlcXVlc3RlZEV2ZW50KGludCBwYWNrRXh0UG9zLCBib29sZWFuIGNhY2hlSGl0LAorCQkJCWxvbmcgbG9hZE1pY3JvcywgbG9uZyBieXRlcywgRHVyYXRpb24gbGFzdEV2aWN0aW9uRHVyYXRpb24pOworCisJCS8qKgorCQkgKiBBY2NlcHQgYW4gZXZlbnQgb2YgYW4gaW5kZXggZXZpY3RlZCBmcm9tIGNhY2hlLgorCQkgKgorCQkgKiBAcGFyYW0gcGFja0V4dFBvcworCQkgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHtAY29kZSBQYWNrRXh0fSBlbnVtCisJCSAqIEBwYXJhbSBieXRlcworCQkgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBldmljdGVkCisJCSAqIEBwYXJhbSB0b3RhbENhY2hlSGl0Q291bnQKKwkJICogICAgICAgICAgICBudW1iZXIgb2YgdGltZXMgYW4gaW5kZXggd2FzIGFjY2Vzc2VkIHdoaWxlIGluIGNhY2hlCisJCSAqIEBwYXJhbSBsYXN0RXZpY3Rpb25EdXJhdGlvbgorCQkgKiAgICAgICAgICAgIHRpbWUgc2luY2UgbGFzdCBldmljdGlvbiwgMCBpZiB3YXMgbm90IGV2aWN0ZWQgeWV0CisJCSAqLworCQlkZWZhdWx0IHZvaWQgYWNjZXB0RXZpY3RlZEV2ZW50KGludCBwYWNrRXh0UG9zLCBsb25nIGJ5dGVzLAorCQkJCWludCB0b3RhbENhY2hlSGl0Q291bnQsIER1cmF0aW9uIGxhc3RFdmljdGlvbkR1cmF0aW9uKSB7CisJCQkvLyBPZmYgYnkgZGVmYXVsdC4KKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRydWUgaWYgcmVwb3J0aW5nIGV2aWN0ZWQgZXZlbnRzIGlzIGVuYWJsZWQuCisJCSAqLworCQlkZWZhdWx0IGJvb2xlYW4gc2hvdWxkUmVwb3J0RXZpY3RlZEV2ZW50KCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQppbmRleCBiYjc2ZGYxLi5mN2EyYzk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCkBAIC0xMDYxLDcgKzEwNjEsOCBAQCBwcml2YXRlIERmc0Jsb2NrQ2FjaGUuUmVmPFBhY2tCaXRtYXBJbmRleD4gbG9hZEJpdG1hcEluZGV4KERmc1JlYWRlciBjdHgsCiAJCQkJfQogCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4sIGJzKTsKIAkJCQlibWlkeCA9IFBhY2tCaXRtYXBJbmRleC5yZWFkKGluLCAoKSAtPiBpZHgoY3R4KSwKLQkJCQkJCSgpIC0+IGdldFJldmVyc2VJZHgoY3R4KSk7CisJCQkJCQkoKSAtPiBnZXRSZXZlcnNlSWR4KGN0eCksCisJCQkJCQljdHguZ2V0T3B0aW9ucygpLnNob3VsZExvYWRSZXZJbmRleEluUGFyYWxsZWwoKSk7CiAJCQl9IGZpbmFsbHkgewogCQkJCXNpemUgPSByYy5wb3NpdGlvbigpOwogCQkJCWN0eC5zdGF0cy5yZWFkQml0bWFwSWR4Qnl0ZXMgKz0gc2l6ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKaW5kZXggODlkZTUzNC4uMTQ2Zjc2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKQEAgLTM0LDYgKzM0LDggQEAgcHVibGljIGNsYXNzIERmc1JlYWRlck9wdGlvbnMgewogCiAJcHJpdmF0ZSBpbnQgc3RyZWFtUGFja0J1ZmZlclNpemU7CiAKKwlwcml2YXRlIGJvb2xlYW4gbG9hZFJldkluZGV4SW5QYXJhbGxlbDsKKwogCS8qKgogCSAqIENyZWF0ZSBhIGRlZmF1bHQgcmVhZGVyIGNvbmZpZ3VyYXRpb24uCiAJICovCkBAIC0xMTMsNiArMTE1LDI4IEBAIHB1YmxpYyBEZnNSZWFkZXJPcHRpb25zIHNldFN0cmVhbVBhY2tCdWZmZXJTaXplKGludCBidWZzeikgewogCX0KIAogCS8qKgorCSAqIENoZWNrIGlmIHJldmVyc2UgaW5kZXggc2hvdWxkIGJlIGxvYWRlZCBpbiBwYXJhbGxlbC4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiByZXZlcnNlIGluZGV4IGlzIGxvYWRlZCBpbiBwYXJhbGxlbCBmb3IgYml0bWFwIGluZGV4LgorCSAqLworCXB1YmxpYyBib29sZWFuIHNob3VsZExvYWRSZXZJbmRleEluUGFyYWxsZWwoKSB7CisJCXJldHVybiBsb2FkUmV2SW5kZXhJblBhcmFsbGVsOworCX0KKworCS8qKgorCSAqIEVuYWJsZSAob3IgZGlzYWJsZSkgcGFyYWxsZWwgbG9hZGluZyBvZiByZXZlcnNlIGluZGV4LgorCSAqCisJICogQHBhcmFtIGxvYWRSZXZJbmRleEluUGFyYWxsZWwKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gbG9hZCByZXZlcnNlIGluZGV4IGluIHBhcmFsbGVsLgorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICovCisJcHVibGljIERmc1JlYWRlck9wdGlvbnMgc2V0TG9hZFJldkluZGV4SW5QYXJhbGxlbCgKKwkJCWJvb2xlYW4gbG9hZFJldkluZGV4SW5QYXJhbGxlbCkgeworCQl0aGlzLmxvYWRSZXZJbmRleEluUGFyYWxsZWwgPSBsb2FkUmV2SW5kZXhJblBhcmFsbGVsOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKIAkgKiBVcGRhdGUgcHJvcGVydGllcyBieSBzZXR0aW5nIGZpZWxkcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogCSAqIDxwPgogCSAqIElmIGEgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHRoZW4gaXQgaXMgbGVmdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9Jbk1lbW9yeVJlcG9zaXRvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvSW5NZW1vcnlSZXBvc2l0b3J5LmphdmEKaW5kZXggNWI2ODk0ZC4uOTlkYTIyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9Jbk1lbW9yeVJlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0luTWVtb3J5UmVwb3NpdG9yeS5qYXZhCkBAIC0xNjUsNiArMTY1LDE1IEBAIHB1YmxpYyB2b2lkIGZsdXNoKCkgewogCQkJCX0KIAkJCX07CiAJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGxvbmcgZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpIHsKKwkJCWxvbmcgY291bnQgPSAwOworCQkJZm9yIChEZnNQYWNrRGVzY3JpcHRpb24gcCA6IHBhY2tzKSB7CisJCQkJY291bnQgKz0gcC5nZXRPYmplY3RDb3VudCgpOworCQkJfQorCQkJcmV0dXJuIGNvdW50OworCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVtUGFjayBleHRlbmRzIERmc1BhY2tEZXNjcmlwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCmluZGV4IGIwNjEyZjkuLmNkNGYxNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCkBAIC03Myw3ICs3Myw2IEBAIHB1YmxpYyBib29sZWFuIGlzTGFyZ2UoKSB7CiAJcHVibGljIE9iamVjdFN0cmVhbSBvcGVuU3RyZWFtKCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJUGFja0lucHV0U3RyZWFtIHBhY2tJbjsKIAkJLy8gY3R4IGlzIGNsb3NlZCBieSBQYWNrSW5wdXRTdHJlYW0sIG9yIGV4cGxpY2l0bHkgaW4gdGhlIGZpbmFsbHkgYmxvY2sKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKIAkJRGZzUmVhZGVyIGN0eCA9IGRiLm5ld1JlYWRlcigpOwogCQl0cnkgewogCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggN2RlZGViNS4uMDk0ZmRjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTI2Myw0ICsyNjMsMTcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVW5wYWNrZWRPYmplY3RJZCBleHRlbmRzIE9iamVjdElkT3duZXJNYXAuRW50cnkgewogCXByaXZhdGUgQWx0ZXJuYXRlSGFuZGxlLklkIGdldEFsdGVybmF0ZUlkKCkgewogCQlyZXR1cm4gd3JhcHBlZC5nZXRBbHRlcm5hdGVJZCgpOwogCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBsb25nIGdldEFwcHJveGltYXRlT2JqZWN0Q291bnQoKSB7CisJCWxvbmcgY291bnQgPSAwOworCQlmb3IgKFBhY2sgcCA6IGdldFBhY2tzKCkpIHsKKwkJCXRyeSB7CisJCQkJY291bnQgKz0gcC5nZXRPYmplY3RDb3VudCgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrLmphdmEKaW5kZXggZjAyYzg2MS4uNTE1MjM2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiAKIC8qKgogICogQSBtdXRhYmxlIHN0YWNrIG9mIHJlZnRhYmxlcyBvbiBsb2NhbCBmaWxlc3lzdGVtIHN0b3JhZ2UuIE5vdCB0aHJlYWQtc2FmZS4KQEAgLTUyNywxMSArNTI4LDE5IEBAIGJvb2xlYW4gY29tcGFjdFJhbmdlKGludCBmaXJzdCwgaW50IGxhc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCisJCQlyZWxvYWQoKTsKIAkJCWZvciAoRmlsZSBmIDogZGVsZXRlT25TdWNjZXNzKSB7Ci0JCQkJRmlsZXMuZGVsZXRlKGYudG9QYXRoKCkpOworCQkJCXRyeSB7CisJCQkJCUZpbGVzLmRlbGV0ZShmLnRvUGF0aCgpKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIElnbm9yZTogdGhpcyBjYW4gaGFwcGVuIG9uIFdpbmRvd3MgaW4gY2FzZSBvZiBjb25jdXJyZW50IHByb2Nlc3Nlcy4KKwkJCQkJLy8gbGVhdmUgdGhlIGdhcmJhZ2UgYW5kIGNvbnRpbnVlLgorCQkJCQlpZiAoIVN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmlzV2luZG93cygpKSB7CisJCQkJCQl0aHJvdyBlOworCQkJCQl9CisJCQkJfQogCQkJfQogCi0JCQlyZWxvYWQoKTsKIAkJCXJldHVybiB0cnVlOwogCQl9IGZpbmFsbHkgewogCQkJaWYgKHRtcFRhYmxlICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCmluZGV4IGIzNzE1NTcuLjNlOTJjZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQpAQCAtNjcyLDE4ICs2NzIsMjAgQEAgdm9pZCBjb252ZXJ0VG9QYWNrZWRSZWZzKGJvb2xlYW4gd3JpdGVMb2dzLCBib29sZWFuIGJhY2t1cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQkJaWYgKHdyaXRlTG9ncykgewogCQkJCUxpc3Q8UmVmbG9nRW50cnk+IGxvZ3MgPSBvbGREYi5nZXRSZWZsb2dSZWFkZXIoci5nZXROYW1lKCkpCi0JCQkJCS5nZXRSZXZlcnNlRW50cmllcygpOworCQkJCQkJLmdldFJldmVyc2VFbnRyaWVzKCk7CiAJCQkJQ29sbGVjdGlvbnMucmV2ZXJzZShsb2dzKTsKIAkJCQlmb3IgKFJlZmxvZ0VudHJ5IGUgOiBsb2dzKSB7CiAJCQkJCWxvZ1dyaXRlci5sb2coci5nZXROYW1lKCksIGUpOwogCQkJCX0KLQkJfQorCQkJfQogCQl9CiAKIAkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodGhpcykpIHsKIAkJCWJydS5leGVjdXRlKHJ3LCBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFKTsKIAkJfQogCisJCW9sZERiLmNsb3NlKCk7CisKIAkJTGlzdDxTdHJpbmc+IGZhaWxlZCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGJydS5nZXRDb21tYW5kcygpKSB7CiAJCQlpZiAoY21kLmdldFJlc3VsdCgpICE9IFJlY2VpdmVDb21tYW5kLlJlc3VsdC5PSykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9vc2VPYmplY3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb29zZU9iamVjdHMuamF2YQppbmRleCAzMzYyMWExLi5iOWFmODNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb29zZU9iamVjdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb29zZU9iamVjdHMuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkQ29weU9wdGlvbjsKQEAgLTI0LDYgKzI1LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5GaWxlT2JqZWN0RGF0YWJhc2UuSW5zZXJ0TG9vc2VPYmplY3RSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQWJicmV2aWF0ZWRPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RMb2FkZXI7CkBAIC01MiwxNSArNTUsMjIgQEAgY2xhc3MgTG9vc2VPYmplY3RzIHsKIAogCXByaXZhdGUgZmluYWwgVW5wYWNrZWRPYmplY3RDYWNoZSB1bnBhY2tlZE9iamVjdENhY2hlOwogCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRydXN0Rm9sZGVyU3RhdDsKKwogCS8qKgogCSAqIEluaXRpYWxpemUgYSByZWZlcmVuY2UgdG8gYW4gb24tZGlzayBvYmplY3QgZGlyZWN0b3J5LgogCSAqCisJICogQHBhcmFtIGNvbmZpZworCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvb3NlIG9iamVjdHMgaGFuZGxlci4KIAkgKiBAcGFyYW0gZGlyCiAJICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIDxjb2RlPm9iamVjdHM8L2NvZGU+IGRpcmVjdG9yeS4KIAkgKi8KLQlMb29zZU9iamVjdHMoRmlsZSBkaXIpIHsKKwlMb29zZU9iamVjdHMoQ29uZmlnIGNvbmZpZywgRmlsZSBkaXIpIHsKIAkJZGlyZWN0b3J5ID0gZGlyOwogCQl1bnBhY2tlZE9iamVjdENhY2hlID0gbmV3IFVucGFja2VkT2JqZWN0Q2FjaGUoKTsKKwkJdHJ1c3RGb2xkZXJTdGF0ID0gY29uZmlnLmdldEJvb2xlYW4oCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RGT0xERVJTVEFULCB0cnVlKTsKIAl9CiAKIAkvKioKQEAgLTk4LDYgKzEwOCwxOSBAQCBib29sZWFuIGhhc0NhY2hlZChBbnlPYmplY3RJZCBpZCkgewogCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIHN0b3JlZCBhcyBhIGxvb3NlIG9iamVjdC4KIAkgKi8KIAlib29sZWFuIGhhcyhBbnlPYmplY3RJZCBvYmplY3RJZCkgeworCQlib29sZWFuIGV4aXN0cyA9IGhhc1dpdGhvdXRSZWZyZXNoKG9iamVjdElkKTsKKwkJaWYgKHRydXN0Rm9sZGVyU3RhdCB8fCBleGlzdHMpIHsKKwkJCXJldHVybiBleGlzdHM7CisJCX0KKwkJdHJ5IChJbnB1dFN0cmVhbSBzdHJlYW0gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShkaXJlY3RvcnkudG9QYXRoKCkpKSB7CisJCQkvLyByZWZyZXNoIGRpcmVjdG9yeSB0byB3b3JrIGFyb3VuZCBORlMgY2FjaGluZyBpc3N1ZQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGhhc1dpdGhvdXRSZWZyZXNoKG9iamVjdElkKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaGFzV2l0aG91dFJlZnJlc2goQW55T2JqZWN0SWQgb2JqZWN0SWQpIHsKIAkJcmV0dXJuIGZpbGVGb3Iob2JqZWN0SWQpLmV4aXN0cygpOwogCX0KIApAQCAtMTgzLDYgKzIwNiwyMiBAQCBPYmplY3RMb2FkZXIgb3BlbihXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICovCiAJT2JqZWN0TG9hZGVyIGdldE9iamVjdExvYWRlcihXaW5kb3dDdXJzb3IgY3VycywgRmlsZSBwYXRoLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gZ2V0T2JqZWN0TG9hZGVyV2l0aG91dFJlZnJlc2goY3VycywgcGF0aCwgaWQpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJaWYgKHRydXN0Rm9sZGVyU3RhdCkgeworCQkJCXRocm93IGU7CisJCQl9CisJCQl0cnkgKElucHV0U3RyZWFtIHN0cmVhbSA9IEZpbGVzCisJCQkJCS5uZXdJbnB1dFN0cmVhbShkaXJlY3RvcnkudG9QYXRoKCkpKSB7CisJCQkJLy8gcmVmcmVzaCBkaXJlY3RvcnkgdG8gd29yayBhcm91bmQgTkZTIGNhY2hpbmcgaXNzdWVzCisJCQl9CisJCQlyZXR1cm4gZ2V0T2JqZWN0TG9hZGVyV2l0aG91dFJlZnJlc2goY3VycywgcGF0aCwgaWQpOworCQl9CisJfQorCisJcHJpdmF0ZSBPYmplY3RMb2FkZXIgZ2V0T2JqZWN0TG9hZGVyV2l0aG91dFJlZnJlc2goV2luZG93Q3Vyc29yIGN1cnMsCisJCQlGaWxlIHBhdGgsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCkpIHsKIAkJCXVucGFja2VkT2JqZWN0Q2FjaGUoKS5hZGQoaWQpOwogCQkJcmV0dXJuIFVucGFja2VkT2JqZWN0Lm9wZW4oaW4sIHBhdGgsIGlkLCBjdXJzKTsKQEAgLTIwMywxNiArMjQyLDM0IEBAIFVucGFja2VkT2JqZWN0Q2FjaGUgdW5wYWNrZWRPYmplY3RDYWNoZSgpIHsKIAl9CiAKIAlsb25nIGdldFNpemUoV2luZG93Q3Vyc29yIGN1cnMsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIGdldFNpemVXaXRob3V0UmVmcmVzaChjdXJzLCBpZCk7CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub0ZpbGUpIHsKKwkJCXRyeSB7CisJCQkJaWYgKHRydXN0Rm9sZGVyU3RhdCkgeworCQkJCQl0aHJvdyBub0ZpbGU7CisJCQkJfQorCQkJCXRyeSAoSW5wdXRTdHJlYW0gc3RyZWFtID0gRmlsZXMKKwkJCQkJCS5uZXdJbnB1dFN0cmVhbShkaXJlY3RvcnkudG9QYXRoKCkpKSB7CisJCQkJCS8vIHJlZnJlc2ggZGlyZWN0b3J5IHRvIHdvcmsgYXJvdW5kIE5GUyBjYWNoaW5nIGlzc3VlCisJCQkJfQorCQkJCXJldHVybiBnZXRTaXplV2l0aG91dFJlZnJlc2goY3VycywgaWQpOworCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAoZmlsZUZvcihpZCkuZXhpc3RzKCkpIHsKKwkJCQkJdGhyb3cgbm9GaWxlOworCQkJCX0KKwkJCQl1bnBhY2tlZE9iamVjdENhY2hlKCkucmVtb3ZlKGlkKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGxvbmcgZ2V0U2l6ZVdpdGhvdXRSZWZyZXNoKFdpbmRvd0N1cnNvciBjdXJzLCBBbnlPYmplY3RJZCBpZCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgZiA9IGZpbGVGb3IoaWQpOwogCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpIHsKIAkJCXVucGFja2VkT2JqZWN0Q2FjaGUoKS5hZGQoaWQpOwogCQkJcmV0dXJuIFVucGFja2VkT2JqZWN0LmdldFNpemUoaW4sIGlkLCBjdXJzKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG5vRmlsZSkgewotCQkJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCQl0aHJvdyBub0ZpbGU7Ci0JCQl9Ci0JCQl1bnBhY2tlZE9iamVjdENhY2hlKCkucmVtb3ZlKGlkKTsKLQkJCXJldHVybiAtMTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YQppbmRleCBhM2NlMzE1Li5hYzNhNTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YQpAQCAtMTIxLDcgKzEyMSw3IEBAIHB1YmxpYyBPYmplY3REaXJlY3RvcnkoZmluYWwgQ29uZmlnIGNmZywgZmluYWwgRmlsZSBkaXIsCiAJCUZpbGUgcGFja0RpcmVjdG9yeSA9IG5ldyBGaWxlKG9iamVjdHMsICJwYWNrIik7IC8vJE5PTi1OTFMtMSQKIAkJRmlsZSBwcmVzZXJ2ZWREaXJlY3RvcnkgPSBuZXcgRmlsZShwYWNrRGlyZWN0b3J5LCAicHJlc2VydmVkIik7IC8vJE5PTi1OTFMtMSQKIAkJYWx0ZXJuYXRlc0ZpbGUgPSBuZXcgRmlsZShvYmplY3RzLCBDb25zdGFudHMuSU5GT19BTFRFUk5BVEVTKTsKLQkJbG9vc2UgPSBuZXcgTG9vc2VPYmplY3RzKG9iamVjdHMpOworCQlsb29zZSA9IG5ldyBMb29zZU9iamVjdHMoY29uZmlnLCBvYmplY3RzKTsKIAkJcGFja2VkID0gbmV3IFBhY2tEaXJlY3RvcnkoY29uZmlnLCBwYWNrRGlyZWN0b3J5KTsKIAkJcHJlc2VydmVkID0gbmV3IFBhY2tEaXJlY3RvcnkoY29uZmlnLCBwcmVzZXJ2ZWREaXJlY3RvcnkpOwogCQl0aGlzLmZzID0gZnM7CkBAIC0yMTMsNiArMjEzLDIwIEBAIHB1YmxpYyBDb2xsZWN0aW9uPFBhY2s+IGdldFBhY2tzKCkgewogCQlyZXR1cm4gcGFja2VkLmdldFBhY2tzKCk7CiAJfQogCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCkgeworCQlsb25nIGNvdW50ID0gMDsKKwkJZm9yIChQYWNrIHAgOiBnZXRQYWNrcygpKSB7CisJCQl0cnkgeworCQkJCWNvdW50ICs9IHAuZ2V0SW5kZXgoKS5nZXRPYmplY3RDb3VudCgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQppbmRleCA4NDAxZjA3Li44ZmIxN2ZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQpAQCAtOTUsNyArOTUsNyBAQCBwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCBvcGVuKEZpbGUgaWR4RmlsZSwgUGFja0luZGV4IHBhY2tJbmRleCwKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCByZWFkKElucHV0U3RyZWFtIGZkLCBQYWNrSW5kZXggcGFja0luZGV4LAogCQkJUGFja1JldmVyc2VJbmRleCByZXZlcnNlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUGFja0JpdG1hcEluZGV4VjEoZmQsICgpIC0+IHBhY2tJbmRleCwgKCkgLT4gcmV2ZXJzZUluZGV4KTsKKwkJcmV0dXJuIG5ldyBQYWNrQml0bWFwSW5kZXhWMShmZCwgcGFja0luZGV4LCByZXZlcnNlSW5kZXgpOwogCX0KIAogCS8qKgpAQCAtMTE0LDYgKzExNCw4IEBAIHB1YmxpYyBzdGF0aWMgUGFja0JpdG1hcEluZGV4IHJlYWQoSW5wdXRTdHJlYW0gZmQsIFBhY2tJbmRleCBwYWNrSW5kZXgsCiAJICogQHBhcmFtIHJldmVyc2VJbmRleFN1cHBsaWVyCiAJICogICAgICAgICAgICB0aGUgc3VwcGxpZXIgZm9yIHBhY2sgcmV2ZXJzZSBpbmRleCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGFjawogCSAqICAgICAgICAgICAgZmlsZS4KKwkgKiBAcGFyYW0gbG9hZFBhcmFsbGVsUmV2SW5kZXgKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgcmV2ZXJzZSBpbmRleCBzaG91bGQgYmUgbG9hZGVkIGluIHBhcmFsbGVsCiAJICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGluZGV4IGluLW1lbW9yeS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIGNhbm5vdCBiZSByZWFkLgpAQCAtMTIyLDEwICsxMjQsMTEgQEAgcHVibGljIHN0YXRpYyBQYWNrQml0bWFwSW5kZXggcmVhZChJbnB1dFN0cmVhbSBmZCwgUGFja0luZGV4IHBhY2tJbmRleCwKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCByZWFkKElucHV0U3RyZWFtIGZkLAogCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja0luZGV4PiBwYWNrSW5kZXhTdXBwbGllciwKLQkJCVN1cHBsaWVyV2l0aElPRXhjZXB0aW9uPFBhY2tSZXZlcnNlSW5kZXg+IHJldmVyc2VJbmRleFN1cHBsaWVyKQorCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja1JldmVyc2VJbmRleD4gcmV2ZXJzZUluZGV4U3VwcGxpZXIsCisJCQlib29sZWFuIGxvYWRQYXJhbGxlbFJldkluZGV4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBQYWNrQml0bWFwSW5kZXhWMShmZCwgcGFja0luZGV4U3VwcGxpZXIsCi0JCQkJcmV2ZXJzZUluZGV4U3VwcGxpZXIpOworCQkJCXJldmVyc2VJbmRleFN1cHBsaWVyLCBsb2FkUGFyYWxsZWxSZXZJbmRleCk7CiAJfQogCiAJLyoqIEZvb3RlciBjaGVja3N1bSBhcHBsaWVkIG9uIHRoZSBib3R0b20gb2YgdGhlIHBhY2sgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleFYxLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXhWMS5qYXZhCmluZGV4IDY4NDZlM2IuLjIxYWJhM2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleFYxLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4VjEuamF2YQpAQCAtMTcsNiArMTcsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CkBAIC00MCw2ICs0NiwyMyBAQCBjbGFzcyBQYWNrQml0bWFwSW5kZXhWMSBleHRlbmRzIEJhc2VQYWNrQml0bWFwSW5kZXggewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9YT1JfT0ZGU0VUID0gMTI2OwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzCisJCQkubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJCQlwcml2YXRlIGZpbmFsIFRocmVhZEZhY3RvcnkgYmFzZUZhY3RvcnkgPSBFeGVjdXRvcnMKKwkJCQkJCS5kZWZhdWx0VGhyZWFkRmFjdG9yeSgpOworCisJCQkJcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIHRocmVhZE51bWJlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcnVubmFibGUpIHsKKwkJCQkJVGhyZWFkIHRocmVhZCA9IGJhc2VGYWN0b3J5Lm5ld1RocmVhZChydW5uYWJsZSk7CisJCQkJCXRocmVhZC5zZXROYW1lKCJKR2l0LVBhY2tCaXRtYXBJbmRleFYxLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgdGhyZWFkTnVtYmVyLmdldEFuZEluY3JlbWVudCgpKTsKKwkJCQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKwkJCQkJcmV0dXJuIHRocmVhZDsKKwkJCQl9CisJCQl9KTsKKwogCXByaXZhdGUgZmluYWwgUGFja0luZGV4IHBhY2tJbmRleDsKIAlwcml2YXRlIGZpbmFsIFBhY2tSZXZlcnNlSW5kZXggcmV2ZXJzZUluZGV4OwogCXByaXZhdGUgZmluYWwgRVdBSENvbXByZXNzZWRCaXRtYXAgY29tbWl0czsKQEAgLTQ5LDE1ICs3MiwyOCBAQCBjbGFzcyBQYWNrQml0bWFwSW5kZXhWMSBleHRlbmRzIEJhc2VQYWNrQml0bWFwSW5kZXggewogCiAJcHJpdmF0ZSBmaW5hbCBPYmplY3RJZE93bmVyTWFwPFN0b3JlZEJpdG1hcD4gYml0bWFwczsKIAorCVBhY2tCaXRtYXBJbmRleFYxKGZpbmFsIElucHV0U3RyZWFtIGZkLCBQYWNrSW5kZXggcGFja0luZGV4LAorCQkJUGFja1JldmVyc2VJbmRleCByZXZlcnNlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMoZmQsICgpIC0+IHBhY2tJbmRleCwgKCkgLT4gcmV2ZXJzZUluZGV4LCBmYWxzZSk7CisJfQorCiAJUGFja0JpdG1hcEluZGV4VjEoZmluYWwgSW5wdXRTdHJlYW0gZmQsCiAJCQlTdXBwbGllcldpdGhJT0V4Y2VwdGlvbjxQYWNrSW5kZXg+IHBhY2tJbmRleFN1cHBsaWVyLAotCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja1JldmVyc2VJbmRleD4gcmV2ZXJzZUluZGV4U3VwcGxpZXIpCisJCQlTdXBwbGllcldpdGhJT0V4Y2VwdGlvbjxQYWNrUmV2ZXJzZUluZGV4PiByZXZlcnNlSW5kZXhTdXBwbGllciwKKwkJCWJvb2xlYW4gbG9hZFBhcmFsbGVsUmV2SW5kZXgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBBbiBlbnRyeSBpcyBvYmplY3QgaWQsIHhvciBvZmZzZXQsIGZsYWcgYnl0ZSwgYW5kIGEgbGVuZ3RoIGVuY29kZWQKIAkJLy8gYml0bWFwLiBUaGUgb2JqZWN0IGlkIGlzIGFuIGludDMyIG9mIHRoZSBudGggcG9zaXRpb24gc29ydGVkIGJ5IG5hbWUuCiAJCXN1cGVyKG5ldyBPYmplY3RJZE93bmVyTWFwPFN0b3JlZEJpdG1hcD4oKSk7CiAJCXRoaXMuYml0bWFwcyA9IGdldEJpdG1hcHMoKTsKIAorCQkvLyBPcHRpb25hbGx5IHN0YXJ0IGxvYWRpbmcgcmV2ZXJzZSBpbmRleCBpbiBwYXJhbGxlbCB0byBsb2FkaW5nIGJpdG1hcAorCQkvLyBmcm9tIHN0b3JhZ2UuCisJCUZ1dHVyZTxQYWNrUmV2ZXJzZUluZGV4PiByZXZlcnNlSW5kZXhGdXR1cmUgPSBudWxsOworCQlpZiAobG9hZFBhcmFsbGVsUmV2SW5kZXgpIHsKKwkJCXJldmVyc2VJbmRleEZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdChyZXZlcnNlSW5kZXhTdXBwbGllcjo6Z2V0KTsKKwkJfQorCiAJCWZpbmFsIGJ5dGVbXSBzY3JhdGNoID0gbmV3IGJ5dGVbMzJdOwogCQlJTy5yZWFkRnVsbHkoZmQsIHNjcmF0Y2gsIDAsIHNjcmF0Y2gubGVuZ3RoKTsKIApAQCAtMTY0LDcgKzIwMCwxOCBAQCBjbGFzcyBQYWNrQml0bWFwSW5kZXhWMSBleHRlbmRzIEJhc2VQYWNrQml0bWFwSW5kZXggewogCQkJYml0bWFwcy5hZGQoc2IpOwogCQl9CiAKLQkJdGhpcy5yZXZlcnNlSW5kZXggPSByZXZlcnNlSW5kZXhTdXBwbGllci5nZXQoKTsKKwkJUGFja1JldmVyc2VJbmRleCBjb21wdXRlZFJldmVyc2VJbmRleDsKKwkJaWYgKGxvYWRQYXJhbGxlbFJldkluZGV4ICYmIHJldmVyc2VJbmRleEZ1dHVyZSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCWNvbXB1dGVkUmV2ZXJzZUluZGV4ID0gcmV2ZXJzZUluZGV4RnV0dXJlLmdldCgpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBFeGVjdXRpb25FeGNlcHRpb24gZSkgeworCQkJCS8vIEZhbGxiYWNrIHRvIGxvYWRpbmcgcmV2ZXJzZSBpbmRleCB0aHJvdWdoIGEgc3VwcGxpZXIuCisJCQkJY29tcHV0ZWRSZXZlcnNlSW5kZXggPSByZXZlcnNlSW5kZXhTdXBwbGllci5nZXQoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbXB1dGVkUmV2ZXJzZUluZGV4ID0gcmV2ZXJzZUluZGV4U3VwcGxpZXIuZ2V0KCk7CisJCX0KKwkJdGhpcy5yZXZlcnNlSW5kZXggPSBjb21wdXRlZFJldmVyc2VJbmRleDsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0RpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0RpcmVjdG9yeS5qYXZhCmluZGV4IDIyOTc3ZDMuLjZhOTljYjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tEaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRGlyZWN0b3J5LmphdmEKQEAgLTY1LDEyICs2NSwxMiBAQCBjbGFzcyBQYWNrRGlyZWN0b3J5IHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWNrTGlzdCBOT19QQUNLUyA9IG5ldyBQYWNrTGlzdChGaWxlU25hcHNob3QuRElSVFksCiAJCQluZXcgUGFja1swXSk7CiAKLQlwcml2YXRlIGZpbmFsIENvbmZpZyBjb25maWc7Ci0KIAlwcml2YXRlIGZpbmFsIEZpbGUgZGlyZWN0b3J5OwogCiAJcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8UGFja0xpc3Q+IHBhY2tMaXN0OwogCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRydXN0Rm9sZGVyU3RhdDsKKwogCS8qKgogCSAqIEluaXRpYWxpemUgYSByZWZlcmVuY2UgdG8gYW4gb24tZGlzayAncGFjaycgZGlyZWN0b3J5LgogCSAqCkBAIC04MCw5ICs4MCwxNiBAQCBjbGFzcyBQYWNrRGlyZWN0b3J5IHsKIAkgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUge0Bjb2RlIHBhY2t9IGRpcmVjdG9yeS4KIAkgKi8KIAlQYWNrRGlyZWN0b3J5KENvbmZpZyBjb25maWcsIEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwogCQl0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKIAkJcGFja0xpc3QgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oTk9fUEFDS1MpOworCisJCS8vIFdoZXRoZXIgdG8gdHJ1c3QgdGhlIHBhY2sgZm9sZGVyJ3MgbW9kaWZpY2F0aW9uIHRpbWUuIElmIHNldCB0byBmYWxzZQorCQkvLyB3ZSB3aWxsIGFsd2F5cyBzY2FuIHRoZSAuZ2l0L29iamVjdHMvcGFjayBmb2xkZXIgdG8gY2hlY2sgZm9yIG5ldworCQkvLyBwYWNrIGZpbGVzLiBJZiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdCkgd2UgdXNlIHRoZSBmb2xkZXIncyBzaXplLAorCQkvLyBtb2RpZmljYXRpb24gdGltZSwgYW5kIGtleSAoaW5vZGUpIGFuZCBhc3N1bWUgdGhhdCBubyBuZXcgcGFjayBmaWxlcworCQkvLyBjYW4gYmUgaW4gdGhpcyBmb2xkZXIgaWYgdGhlc2UgYXR0cmlidXRlcyBoYXZlIG5vdCBjaGFuZ2VkLgorCQl0cnVzdEZvbGRlclN0YXQgPSBjb25maWcuZ2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVEZPTERFUlNUQVQsIHRydWUpOwogCX0KIAogCS8qKgpAQCAtMzUwLDE2ICszNTcsNiBAQCBwcml2YXRlIGJvb2xlYW4gZG9Mb2dFeHBvbmVudGlhbEJhY2tvZmYoaW50IG4pIHsKIAl9CiAKIAlib29sZWFuIHNlYXJjaFBhY2tzQWdhaW4oUGFja0xpc3Qgb2xkKSB7Ci0JCS8vIFdoZXRoZXIgdG8gdHJ1c3QgdGhlIHBhY2sgZm9sZGVyJ3MgbW9kaWZpY2F0aW9uIHRpbWUuIElmIHNldAotCQkvLyB0byBmYWxzZSB3ZSB3aWxsIGFsd2F5cyBzY2FuIHRoZSAuZ2l0L29iamVjdHMvcGFjayBmb2xkZXIgdG8KLQkJLy8gY2hlY2sgZm9yIG5ldyBwYWNrIGZpbGVzLiBJZiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdCkgd2UgdXNlIHRoZQotCQkvLyBsYXN0bW9kaWZpZWQgYXR0cmlidXRlIG9mIHRoZSBmb2xkZXIgYW5kIGFzc3VtZSB0aGF0IG5vIG5ldwotCQkvLyBwYWNrIGZpbGVzIGNhbiBiZSBpbiB0aGlzIGZvbGRlciBpZiBoaXMgbW9kaWZpY2F0aW9uIHRpbWUgaGFzCi0JCS8vIG5vdCBjaGFuZ2VkLgotCQlib29sZWFuIHRydXN0Rm9sZGVyU3RhdCA9IGNvbmZpZy5nZXRCb29sZWFuKAotCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAotCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RSVVNURk9MREVSU1RBVCwgdHJ1ZSk7Ci0KIAkJcmV0dXJuICgoIXRydXN0Rm9sZGVyU3RhdCkgfHwgb2xkLnNuYXBzaG90LmlzTW9kaWZpZWQoZGlyZWN0b3J5KSkKIAkJCQkmJiBvbGQgIT0gc2NhblBhY2tzKG9sZCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQppbmRleCBiNDZmZmUzLi5jNzMyMmIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQpAQCAtMzAsMTAgKzMwLDEyIEBACiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRGlyZWN0b3J5Tm90RW1wdHlFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwpAQCAtNjAsNiArNjIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnLlRydXN0UGFja2VkUmVmc1N0YXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWRSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtMTc3LDYgKzE4MCwxMCBAQCBwdWJsaWMgY2xhc3MgUmVmRGlyZWN0b3J5IGV4dGVuZHMgUmVmRGF0YWJhc2UgewogCiAJcHJpdmF0ZSBMaXN0PEludGVnZXI+IHJldHJ5U2xlZXBNcyA9IFJFVFJZX1NMRUVQX01TOwogCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRydXN0Rm9sZGVyU3RhdDsKKworCXByaXZhdGUgZmluYWwgVHJ1c3RQYWNrZWRSZWZzU3RhdCB0cnVzdFBhY2tlZFJlZnNTdGF0OworCiAJUmVmRGlyZWN0b3J5KEZpbGVSZXBvc2l0b3J5IGRiKSB7CiAJCWZpbmFsIEZTIGZzID0gZGIuZ2V0RlMoKTsKIAkJcGFyZW50ID0gZGI7CkBAIC0xODgsNiArMTk1LDEzIEBAIHB1YmxpYyBjbGFzcyBSZWZEaXJlY3RvcnkgZXh0ZW5kcyBSZWZEYXRhYmFzZSB7CiAKIAkJbG9vc2VSZWZzLnNldChSZWZMaXN0LjxMb29zZVJlZj4gZW1wdHlMaXN0KCkpOwogCQlwYWNrZWRSZWZzLnNldChOT19QQUNLRURfUkVGUyk7CisJCXRydXN0Rm9sZGVyU3RhdCA9IGRiLmdldENvbmZpZygpCisJCQkJLmdldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCisJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVEZPTERFUlNUQVQsIHRydWUpOworCQl0cnVzdFBhY2tlZFJlZnNTdGF0ID0gZGIuZ2V0Q29uZmlnKCkKKwkJCQkuZ2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RSVVNUX1BBQ0tFRF9SRUZTX1NUQVQsCisJCQkJCQlUcnVzdFBhY2tlZFJlZnNTdGF0LlVOU0VUKTsKIAl9CiAKIAlSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7CkBAIC04ODksMTMgKzkwMywzMCBAQCBlbHNlIGlmICgwIDw9IChpZHggPSBwYWNrZWQuZmluZChkc3QuZ2V0TmFtZSgpKSkpCiAJfQogCiAJUGFja2VkUmVmTGlzdCBnZXRQYWNrZWRSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiB0cnVzdEZvbGRlclN0YXQgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuZ2V0Qm9vbGVhbigKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVEZPTERFUlNUQVQsIHRydWUpOwotCiAJCWZpbmFsIFBhY2tlZFJlZkxpc3QgY3VyTGlzdCA9IHBhY2tlZFJlZnMuZ2V0KCk7Ci0JCWlmICh0cnVzdEZvbGRlclN0YXQgJiYgIWN1ckxpc3Quc25hcHNob3QuaXNNb2RpZmllZChwYWNrZWRSZWZzRmlsZSkpIHsKLQkJCXJldHVybiBjdXJMaXN0OworCisJCXN3aXRjaCAodHJ1c3RQYWNrZWRSZWZzU3RhdCkgeworCQljYXNlIE5FVkVSOgorCQkJYnJlYWs7CisJCWNhc2UgQUZURVJfT1BFTjoKKwkJCXRyeSAoSW5wdXRTdHJlYW0gc3RyZWFtID0gRmlsZXMKKwkJCQkJLm5ld0lucHV0U3RyZWFtKHBhY2tlZFJlZnNGaWxlLnRvUGF0aCgpKSkgeworCQkJCS8vIG9wZW4gdGhlIGZpbGUgdG8gcmVmcmVzaCBhdHRyaWJ1dGVzIChvbiBzb21lIE5GUyBjbGllbnRzKQorCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWdub3JlIGFzIHBhY2tlZC1yZWZzIG1heSBub3QgZXhpc3QKKwkJCX0KKwkJCS8vJEZBTEwtVEhST1VHSCQKKwkJY2FzZSBBTFdBWVM6CisJCQlpZiAoIWN1ckxpc3Quc25hcHNob3QuaXNNb2RpZmllZChwYWNrZWRSZWZzRmlsZSkpIHsKKwkJCQlyZXR1cm4gY3VyTGlzdDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFVOU0VUOgorCQkJaWYgKHRydXN0Rm9sZGVyU3RhdAorCQkJCQkmJiAhY3VyTGlzdC5zbmFwc2hvdC5pc01vZGlmaWVkKHBhY2tlZFJlZnNGaWxlKSkgeworCQkJCXJldHVybiBjdXJMaXN0OworCQkJfQorCQkJYnJlYWs7CiAJCX0KIAogCQlmaW5hbCBQYWNrZWRSZWZMaXN0IG5ld0xpc3QgPSByZWFkUGFja2VkUmVmcygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTIwOTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRlbmNlbnQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CisKKy8qKgorICogQW4gT3V0cHV0U3RyZWFtIHRoYXQga2VlcHMgYSBkaWdlc3QgYW5kIGNoZWNrcyBldmVyeSBOIGJ5dGVzIGZvcgorICogY2FuY2VsbGF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisJLyoqIFRoZSBPdXRwdXRTdHJlYW0gY2hlY2tzIGV2ZXJ5IHRoaXMgdmFsdWUgZm9yIGNhbmNlbGxhdGlvbiAqKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLID0gMTI4ICogMTAyNDsKKworCXByaXZhdGUgZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHdyaXRlTW9uaXRvcjsKKworCXByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG91dDsKKworCXByaXZhdGUgZmluYWwgTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7CisKKwlwcml2YXRlIGxvbmcgY291bnQ7CisKKwlwcml2YXRlIGxvbmcgY2hlY2tDYW5jZWxBdDsKKworCS8qKgorCSAqIEluaXRpYWxpemUgYSBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbS4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZU1vbml0b3IKKwkgKiAgICAgICAgICAgIG1vbml0b3IgdG8gdXBkYXRlIG9uIG91dHB1dCBwcm9ncmVzcyBhbmQgY2hlY2sgY2FuY2VsLgorCSAqIEBwYXJhbSBvdXQKKwkgKiAgICAgICAgICAgIHRhcmdldCBzdHJlYW0gdG8gcmVjZWl2ZSBhbGwgY29udGVudHMuCisJICovCisJcHVibGljIENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtKFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3IsCisJCQlPdXRwdXRTdHJlYW0gb3V0KSB7CisJCXRoaXMud3JpdGVNb25pdG9yID0gd3JpdGVNb25pdG9yOworCQl0aGlzLm91dCA9IG91dDsKKwkJdGhpcy5jaGVja0NhbmNlbEF0ID0gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIG1vbml0b3Igd2hpY2ggaXMgdXNlZCB0byB1cGRhdGUgb24gb3V0cHV0IHByb2dyZXNzIGFuZCBjaGVjaworCSAqIGNhbmNlbC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIG1vbml0b3IKKwkgKi8KKwlwdWJsaWMgZmluYWwgUHJvZ3Jlc3NNb25pdG9yIGdldFdyaXRlTW9uaXRvcigpIHsKKwkJcmV0dXJuIHdyaXRlTW9uaXRvcjsKKwl9CisKKwkvKioKKwkgKiBPYnRhaW4gdGhlIGN1cnJlbnQgU0hBLTEgZGlnZXN0LgorCSAqCisJICogQHJldHVybiBTSEEtMSBkaWdlc3QKKwkgKi8KKwlwdWJsaWMgZmluYWwgYnl0ZVtdIGdldERpZ2VzdCgpIHsKKwkJcmV0dXJuIG1kLmRpZ2VzdCgpOworCX0KKworCS8qKgorCSAqIEdldCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSBzdHJlYW0gc3RhcnQuCisJICoKKwkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNpbmNlIHN0cmVhbSBzdGFydC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgbG9uZyBsZW5ndGgoKSB7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioge0Bpbmhlcml0RG9jfSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoY2hlY2tDYW5jZWxBdCA8PSBjb3VudCkgeworCQkJaWYgKHdyaXRlTW9uaXRvci5pc0NhbmNlbGxlZCgpKSB7CisJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oKTsKKwkJCX0KKwkJCWNoZWNrQ2FuY2VsQXQgPSBjb3VudCArIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7CisJCX0KKworCQlvdXQud3JpdGUoYik7CisJCW1kLnVwZGF0ZSgoYnl0ZSkgYik7CisJCWNvdW50Kys7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd2hpbGUgKDAgPCBsZW4pIHsKKwkJCWlmIChjaGVja0NhbmNlbEF0IDw9IGNvdW50KSB7CisJCQkJaWYgKHdyaXRlTW9uaXRvci5pc0NhbmNlbGxlZCgpKSB7CisJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisJCQkJfQorCQkJCWNoZWNrQ2FuY2VsQXQgPSBjb3VudCArIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7CisJCQl9CisKKwkJCWludCBuID0gTWF0aC5taW4obGVuLCBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLKTsKKwkJCW91dC53cml0ZShiLCBvZmYsIG4pOworCQkJbWQudXBkYXRlKGIsIG9mZiwgbik7CisJCQljb3VudCArPSBuOworCisJCQlvZmYgKz0gbjsKKwkJCWxlbiAtPSBuOworCQl9CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW91dC5mbHVzaCgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQppbmRleCA3MTA0Yjk0Li4yZDBmZTI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCkBAIC0xNywxMCArMTcsOCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW8uQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5OQjsKIApAQCAtMjgsMjUgKzI2LDE0IEBACiAgKiBDdXN0b20gb3V0cHV0IHN0cmVhbSB0byBzdXBwb3J0CiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja1dyaXRlcn0uCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQYWNrT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyA9IDEyOCAqIDEwMjQ7Ci0KLQlwcml2YXRlIGZpbmFsIFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3I7Ci0KLQlwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQ7CitwdWJsaWMgZmluYWwgY2xhc3MgUGFja091dHB1dFN0cmVhbSBleHRlbmRzIENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtIHsKIAogCXByaXZhdGUgZmluYWwgUGFja1dyaXRlciBwYWNrV3JpdGVyOwogCi0JcHJpdmF0ZSBmaW5hbCBNZXNzYWdlRGlnZXN0IG1kID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKLQotCXByaXZhdGUgbG9uZyBjb3VudDsKLQogCXByaXZhdGUgZmluYWwgYnl0ZVtdIGhlYWRlckJ1ZmZlciA9IG5ldyBieXRlWzMyXTsKIAogCXByaXZhdGUgZmluYWwgYnl0ZVtdIGNvcHlCdWZmZXIgPSBuZXcgYnl0ZVs2NCA8PCAxMF07CiAKLQlwcml2YXRlIGxvbmcgY2hlY2tDYW5jZWxBdDsKLQogCXByaXZhdGUgYm9vbGVhbiBvZnNEZWx0YTsKIAogCS8qKgpAQCAtNjYsNDggKzUzLDggQEAgcHVibGljIGZpbmFsIGNsYXNzIFBhY2tPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewogCSAqLwogCXB1YmxpYyBQYWNrT3V0cHV0U3RyZWFtKGZpbmFsIFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3IsCiAJCQlmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LCBmaW5hbCBQYWNrV3JpdGVyIHB3KSB7Ci0JCXRoaXMud3JpdGVNb25pdG9yID0gd3JpdGVNb25pdG9yOwotCQl0aGlzLm91dCA9IG91dDsKKwkJc3VwZXIod3JpdGVNb25pdG9yLCBvdXQpOwogCQl0aGlzLnBhY2tXcml0ZXIgPSBwdzsKLQkJdGhpcy5jaGVja0NhbmNlbEF0ID0gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb3VudCsrOwotCQlvdXQud3JpdGUoYik7Ci0JCW1kLnVwZGF0ZSgoYnl0ZSkgYik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgbGVuKSB7Ci0JCQlmaW5hbCBpbnQgbiA9IE1hdGgubWluKGxlbiwgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7Ci0JCQljb3VudCArPSBuOwotCi0JCQlpZiAoY2hlY2tDYW5jZWxBdCA8PSBjb3VudCkgewotCQkJCWlmICh3cml0ZU1vbml0b3IuaXNDYW5jZWxsZWQoKSkgewotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQkJSkdpdFRleHQuZ2V0KCkucGFja2luZ0NhbmNlbGxlZER1cmluZ09iamVjdHNXcml0aW5nKTsKLQkJCQl9Ci0JCQkJY2hlY2tDYW5jZWxBdCA9IGNvdW50ICsgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKLQkJCX0KLQotCQkJb3V0LndyaXRlKGIsIG9mZiwgbik7Ci0JCQltZC51cGRhdGUoYiwgb2ZmLCBuKTsKLQotCQkJb2ZmICs9IG47Ci0JCQlsZW4gLT0gbjsKLQkJfQotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQuZmx1c2goKTsKIAl9CiAKIAlmaW5hbCB2b2lkIHdyaXRlRmlsZUhlYWRlcihpbnQgdmVyc2lvbiwgbG9uZyBvYmplY3RDb3VudCkKQEAgLTE2MCw3ICsxMDcsNyBAQCBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUhlYWRlcihPYmplY3RUb1BhY2sgb3RwLCBsb25nIHJhd0xlbmd0aCkKIAkJT2JqZWN0VG9QYWNrIGIgPSBvdHAuZ2V0RGVsdGFCYXNlKCk7CiAJCWlmIChiICE9IG51bGwgJiYgKGIuaXNXcml0dGVuKCkgJiBvZnNEZWx0YSkpIHsgLy8gTm9uLXNob3J0LWNpcmN1aXQgbG9naWMgaXMgaW50ZW50aW9uYWwKIAkJCWludCBuID0gb2JqZWN0SGVhZGVyKHJhd0xlbmd0aCwgT0JKX09GU19ERUxUQSwgaGVhZGVyQnVmZmVyKTsKLQkJCW4gPSBvZnNEZWx0YShjb3VudCAtIGIuZ2V0T2Zmc2V0KCksIGhlYWRlckJ1ZmZlciwgbik7CisJCQluID0gb2ZzRGVsdGEobGVuZ3RoKCkgLSBiLmdldE9mZnNldCgpLCBoZWFkZXJCdWZmZXIsIG4pOwogCQkJd3JpdGUoaGVhZGVyQnVmZmVyLCAwLCBuKTsKIAkJfSBlbHNlIGlmIChvdHAuaXNEZWx0YVJlcHJlc2VudGF0aW9uKCkpIHsKIAkJCWludCBuID0gb2JqZWN0SGVhZGVyKHJhd0xlbmd0aCwgT0JKX1JFRl9ERUxUQSwgaGVhZGVyQnVmZmVyKTsKQEAgLTIwOSwyMCArMTU2LDYgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG9mc0RlbHRhVmFySW50TGVuZ3RoKGxvbmcgdikgewogCX0KIAogCXZvaWQgZW5kT2JqZWN0KCkgewotCQl3cml0ZU1vbml0b3IudXBkYXRlKDEpOwotCX0KLQotCS8qKgotCSAqIEdldCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSBzdHJlYW0gc3RhcnQuCi0JICoKLQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNpbmNlIHN0cmVhbSBzdGFydC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgbG9uZyBsZW5ndGgoKSB7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKiogQHJldHVybiBvYnRhaW4gdGhlIGN1cnJlbnQgU0hBLTEgZGlnZXN0LiAqLwotCWZpbmFsIGJ5dGVbXSBnZXREaWdlc3QoKSB7Ci0JCXJldHVybiBtZC5kaWdlc3QoKTsKKwkJZ2V0V3JpdGVNb25pdG9yKCkudXBkYXRlKDEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEKaW5kZXggNjQ4ZDRhMS4uNjU5Y2NiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEKQEAgLTUwMiw2ICs1MDIsOTggQEAgcHVibGljIHN0YXRpYyBib29sZWFuIGZsYWcoU3RyaW5nIHZhbHVlKSB7CiAJfQogCiAJLyoqCisJICogQ29udmVydHMgYW4gT3BlblNTSCB0aW1lIHZhbHVlIGludG8gYSBudW1iZXIgb2Ygc2Vjb25kcy4gVGhlIGZvcm1hdCBpcworCSAqIGRlZmluZWQgYnkgT3BlblNTSCBhcyBhIHNlcXVlbmNlIG9mIChwb3NpdGl2ZSkgaW50ZWdlcnMgd2l0aCBzdWZmaXhlcyBmb3IKKwkgKiBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgZGF5cywgYW5kIHdlZWtzLgorCSAqCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0byBjb252ZXJ0CisJICogQHJldHVybiB0aGUgcGFyc2VkIHZhbHVlIGFzIGEgbnVtYmVyIG9mIHNlY29uZHMsIG9yIC0xIGlmIHRoZSB2YWx1ZSBpcworCSAqICAgICAgICAgbm90IGEgdmFsaWQgT3BlblNTSCB0aW1lIHZhbHVlCisJICogQHNlZSA8YSBocmVmPSJodHRwczovL21hbi5vcGVuYnNkLm9yZy9zc2hkX2NvbmZpZy41I1RJTUVfRk9STUFUUyI+T3BlbkJTRAorCSAqICAgICAgbWFuIDUgc3NoZF9jb25maWcsIHNlY3Rpb24gVElNRSBGT1JNQVRTPC9hPgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IHRpbWVTcGVjKFN0cmluZyB2YWx1ZSkgeworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXRyeSB7CisJCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisJCQlpbnQgaSA9IDA7CisJCQlpbnQgc2Vjb25kcyA9IDA7CisJCQlib29sZWFuIHZhbHVlU2VlbiA9IGZhbHNlOworCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKKwkJCQkvLyBTa2lwIHdoaXRlc3BhY2UKKwkJCQljaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOworCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkgeworCQkJCQlpKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoY2ggPT0gJysnKSB7CisJCQkJCS8vIE9wZW5TU0ggdXNlcyBzdHJ0b2wgd2l0aCBiYXNlIDEwOiBhIGxlYWRpbmcgcGx1cyBzaWduIGlzCisJCQkJCS8vIGFsbG93ZWQuCisJCQkJCWkrKzsKKwkJCQl9CisJCQkJaW50IHZhbCA9IDA7CisJCQkJaW50IGogPSBpOworCQkJCXdoaWxlIChqIDwgbGVuZ3RoKSB7CisJCQkJCWNoID0gdmFsdWUuY2hhckF0KGorKyk7CisJCQkJCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJCQkJCQl2YWwgPSBNYXRoLmFkZEV4YWN0KE1hdGgubXVsdGlwbHlFeGFjdCh2YWwsIDEwKSwKKwkJCQkJCQkJY2ggLSAnMCcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJai0tOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGkgPT0gaikgeworCQkJCQkvLyBObyBkaWdpdHMgc2VlbgorCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWkgPSBqOworCQkJCWludCBtdWx0aXBsaWVyID0gMTsKKwkJCQlpZiAoaSA8IGxlbmd0aCkgeworCQkJCQljaCA9IHZhbHVlLmNoYXJBdChpKyspOworCQkJCQlzd2l0Y2ggKGNoKSB7CisJCQkJCWNhc2UgJ3MnOgorCQkJCQljYXNlICdTJzoKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdtJzoKKwkJCQkJY2FzZSAnTSc6CisJCQkJCQltdWx0aXBsaWVyID0gNjA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnaCc6CisJCQkJCWNhc2UgJ0gnOgorCQkJCQkJbXVsdGlwbGllciA9IDM2MDA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnZCc6CisJCQkJCWNhc2UgJ0QnOgorCQkJCQkJbXVsdGlwbGllciA9IDI0ICogMzYwMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICd3JzoKKwkJCQkJY2FzZSAnVyc6CisJCQkJCQltdWx0aXBsaWVyID0gNyAqIDI0ICogMzYwMDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBJbnZhbGlkIHRpbWUgc3BlYworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJCXNlY29uZHMgPSBNYXRoLmFkZEV4YWN0KHNlY29uZHMsCisJCQkJCQlNYXRoLm11bHRpcGx5RXhhY3QodmFsLCBtdWx0aXBsaWVyKSk7CisJCQkJdmFsdWVTZWVuID0gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiB2YWx1ZVNlZW4gPyBzZWNvbmRzIDogLTE7CisJCX0gY2F0Y2ggKEFyaXRobWV0aWNFeGNlcHRpb24gZSkgeworCQkJLy8gT3ZlcmZsb3cKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qKgogCSAqIFJldHJpZXZlcyB0aGUgbG9jYWwgdXNlciBuYW1lIGFzIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KIAkgKgogCSAqIEByZXR1cm4gdGhlIHVzZXIgbmFtZQpAQCAtNTQ5LDYgKzY0MSw3IEBAIHB1YmxpYyBzdGF0aWMgY2xhc3MgSG9zdEVudHJ5IGltcGxlbWVudHMgU3NoQ29uZmlnU3RvcmUuSG9zdENvbmZpZyB7CiAJCQlMSVNUX0tFWVMuYWRkKFNzaENvbnN0YW50cy5HTE9CQUxfS05PV05fSE9TVFNfRklMRSk7CiAJCQlMSVNUX0tFWVMuYWRkKFNzaENvbnN0YW50cy5TRU5EX0VOVik7CiAJCQlMSVNUX0tFWVMuYWRkKFNzaENvbnN0YW50cy5VU0VSX0tOT1dOX0hPU1RTX0ZJTEUpOworCQkJTElTVF9LRVlTLmFkZChTc2hDb25zdGFudHMuQUREX0tFWVNfVE9fQUdFTlQpOyAvLyBjb25maXJtIHRpbWVTcGVjCiAJCX0KIAogCQkvKioKQEAgLTg3MSw3ICs5NjQsOCBAQCB2b2lkIHN1YnN0aXR1dGUoU3RyaW5nIG9yaWdpbmFsSG9zdE5hbWUsIGludCBwb3J0LCBTdHJpbmcgdXNlck5hbWUsCiAJCQlpZiAob3B0aW9ucyAhPSBudWxsKSB7CiAJCQkJLy8gSE9TVE5BTUUgYWxyZWFkeSBkb25lIGFib3ZlCiAJCQkJU3RyaW5nIHZhbHVlID0gb3B0aW9ucy5nZXQoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmICFTc2hDb25zdGFudHMuTk9ORS5lcXVhbHModmFsdWUpCisJCQkJCQkmJiAhU3NoQ29uc3RhbnRzLkVOVl9TU0hfQVVUSF9TT0NLRVQuZXF1YWxzKHZhbHVlKSkgewogCQkJCQl2YWx1ZSA9IHIuc3Vic3RpdHV0ZSh2YWx1ZSwgUmVwbGFjZXIuREVGQVVMVF9UT0tFTlMsIHRydWUpOwogCQkJCQl2YWx1ZSA9IHRvRmlsZSh2YWx1ZSwgaG9tZSkuZ2V0UGF0aCgpOwogCQkJCQlvcHRpb25zLnB1dChTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQsIHZhbHVlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldkNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwOWNmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCAgTWF0dGhpYXMgU29obiA8bWF0dGhpYXMuc29obkBzYXAuY29tPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UeXBlZENvbmZpZ0dldHRlci5VTlNFVF9JTlQ7CisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworCisvKioKKyAqIEdpdCBjb25maWd1cmF0aW9uIG9wdGlvbiA8YQorICogaHJlZj1odHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LWNvbmZpZyNEb2N1bWVudGF0aW9uL2dpdC1jb25maWcudHh0LWNvcmVhYmJyZXYiPgorICogY29yZS5hYmJyZXY8L2E+CisgKgorICogQHNpbmNlIDYuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWJicmV2Q29uZmlnIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIG1pbmltdW0gdmFsdWUgb2YgYWJicmV2CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0FCQlJFViA9IDQ7CisKKwkvKioKKwkgKiBDYXAgY29uZmlndXJlZCBjb3JlLmFiYnJldiB0byByYW5nZSBiZXR3ZWVuIG1pbmltdW0gb2YgNCBhbmQgbnVtYmVyIG9mCisJICogaGV4LWRpZ2l0cyBvZiBhIGZ1bGwgb2JqZWN0IGlkLgorCSAqCisJICogQHBhcmFtIGxlbgorCSAqICAgICAgICAgICAgY29uZmlndXJlZCBudW1iZXIgb2YgaGV4LWRpZ2l0cyB0byBhYmJyZXZpYXRlIG9iamVjdCBpZHMgdG8KKwkgKiBAcmV0dXJuIGNvcmUuYWJicmV2IGNhcHBlZCB0byByYW5nZSBiZXR3ZWVuIG1pbmltdW0gb2YgNCBhbmQgbnVtYmVyIG9mCisJICogICAgICAgICBoZXgtZGlnaXRzIG9mIGEgZnVsbCBvYmplY3QgaWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBjYXBBYmJyZXYoaW50IGxlbikgeworCQlyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoTUlOX0FCQlJFViwgbGVuKSwKKwkJCQlDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOworCX0KKworCS8qKgorCSAqIE5vIGFiYnJldmlhdGlvbgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgQWJicmV2Q29uZmlnIE5PID0gbmV3IEFiYnJldkNvbmZpZygKKwkJCUNvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CisKKwkvKioKKwkgKiBQYXJzZSBzdHJpbmcgdmFsdWUgb2YgY29yZS5hYmJyZXYgZ2l0IG9wdGlvbiBmb3IgYSBnaXZlbiByZXBvc2l0b3J5CisJICoKKwkgKiBAcGFyYW0gcmVwbworCSAqICAgICAgICAgICAgcmVwb3NpdG9yeQorCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBBYmJyZXZDb25maWcKKwkgKiBAdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdmFsdWUgb2YgY29yZS5hYmJyZXYgaXMgaW52YWxpZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQWJicmV2Q29uZmlnIHBhcnNlRnJvbUNvbmZpZyhSZXBvc2l0b3J5IHJlcG8pCisJCQl0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gcmVwby5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHZhbHVlID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKKwkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BQkJSRVYpOworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFZBTFVFX0FVVE8pKSB7CisJCQlyZXR1cm4gYXV0byhyZXBvKTsKKwkJfQorCQlpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShWQUxVRV9OTykpIHsKKwkJCXJldHVybiBOTzsKKwkJfQorCQl0cnkgeworCQkJaW50IGxlbiA9IGNvbmZpZy5nZXRJbnRJblJhbmdlKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAorCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9BQkJSRVYsIE1JTl9BQkJSRVYsCisJCQkJCUNvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCwgVU5TRVRfSU5UKTsKKwkJCWlmIChsZW4gPT0gVU5TRVRfSU5UKSB7CisJCQkJLy8gVW5zZXQgd2FzIGNoZWNrZWQgYWJvdmUuIElmIHdlIGdldCBVTlNFVF9JTlQgaGVyZSwgdGhlbgorCQkJCS8vIGVpdGhlciB0aGUgdmFsdWUgd2FzIFVOU0VUX0lOVCwgb3IgaXQgd2FzIGFuIGludmFsaWQgdmFsdWUKKwkJCQkvLyAobm90IGFuIGludGVnZXIsIG9yIG91dCBvZiByYW5nZSksIGFuZCBFR2l0J3MKKwkJCQkvLyBSZXBvcnRpbmdUeXBlZEdldHRlciBjYXVnaHQgdGhlIGV4Y2VwdGlvbiBhbmQgaGFzIGxvZ2dlZCBhCisJCQkJLy8gd2FybmluZy4gSW4gZWl0aGVyIGNhc2Ugd2Ugc2hvdWxkIGZhbGwgYmFjayB0byBzb21lIHNhbmUKKwkJCQkvLyBkZWZhdWx0LgorCQkJCWxlbiA9IE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwkJCX0KKwkJCXJldHVybiBuZXcgQWJicmV2Q29uZmlnKGxlbik7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRDb3JlQWJicmV2LCB2YWx1ZSksIGUpOworCQl9CisJfQorCisJLyoqCisJICogQW4gYXBwcm9wcmlhdGUgdmFsdWUgaXMgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGFwcHJveGltYXRlIG51bWJlciBvZgorCSAqIHBhY2tlZCBvYmplY3RzIGluIGEgcmVwb3NpdG9yeSwgd2hpY2ggaG9wZWZ1bGx5IGlzIGVub3VnaCBmb3IgYWJicmV2aWF0ZWQKKwkgKiBvYmplY3QgbmFtZXMgdG8gc3RheSB1bmlxdWUgZm9yIHNvbWUgdGltZS4KKwkgKgorCSAqIEBwYXJhbSByZXBvCisJICogQHJldHVybiBhcHByb3ByaWF0ZSB2YWx1ZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mCisJICogICAgICAgICBwYWNrZWQgb2JqZWN0cyBpbiBhIHJlcG9zaXRvcnkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBBYmJyZXZDb25maWcgYXV0byhSZXBvc2l0b3J5IHJlcG8pIHsKKwkJbG9uZyBjb3VudCA9IHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCk7CisJCWlmIChjb3VudCA9PSAtMSkgeworCQkJcmV0dXJuIG5ldyBBYmJyZXZDb25maWcoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKTsKKwkJfQorCQkvLyBmaW5kIG1zYiwgcm91bmQgdG8gbmV4dCBwb3dlciBvZiAyCisJCWludCBsZW4gPSA2MyAtIExvbmcubnVtYmVyT2ZMZWFkaW5nWmVyb3MoY291bnQpICsgMTsKKwkJLy8gV2l0aCB0aGUgb3JkZXIgb2YgMl5sZW4gb2JqZWN0cywgd2UgZXhwZWN0IGEgY29sbGlzaW9uIGF0CisJCS8vIDJeKGxlbi8yKS4gQnV0IHdlIGFsc28gY2FyZSBhYm91dCBoZXggY2hhcnMsIG5vdCBiaXRzLCBhbmQKKwkJLy8gdGhlcmUgYXJlIDQgYml0cyBwZXIgaGV4LiBTbyBhbGwgdG9nZXRoZXIgd2UgbmVlZCB0byBkaXZpZGUKKwkJLy8gYnkgMjsgYnV0IHdlIGFsc28gd2FudCB0byByb3VuZCBvZGQgbnVtYmVycyB1cCwgaGVuY2UgYWRkaW5nCisJCS8vIG9uZSBiZWZvcmUgZGl2aWRpbmcuCisJCWxlbiA9IChsZW4gKyAxKSAvIDI7CisJCS8vIGZvciBzbWFsbCByZXBvcyB1c2UgYXQgbGVhc3QgZmFsbGJhY2sgbGVuZ3RoCisJCXJldHVybiBuZXcgQWJicmV2Q29uZmlnKE1hdGgubWF4KGxlbiwgT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKSk7CisJfQorCisJLyoqCisJICogQWxsIG90aGVyIHBvc3NpYmxlIGFiYnJldmlhdGlvbiBsZW5ndGhzLiBWYWxpZCByYW5nZSA0IHRvIG51bWJlciBvZgorCSAqIGhleC1kaWdpdHMgb2YgYW4gdW5hYmJyZXZpYXRlZCBvYmplY3QgaWQgKDQwIGZvciBTSEExIG9iamVjdCBpZHMsIGpnaXQKKwkgKiBkb2Vzbid0IHN1cHBvcnQgU0hBMjU2IHlldCkuCisJICovCisJcHJpdmF0ZSBpbnQgYWJicmV2OworCisJLyoqCisJICogQHBhcmFtIGFiYnJldgorCSAqLworCXByaXZhdGUgQWJicmV2Q29uZmlnKGludCBhYmJyZXYpIHsKKwkJdGhpcy5hYmJyZXYgPSBjYXBBYmJyZXYoYWJicmV2KTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGNvbmZpZ3VyZWQgYWJicmV2aWF0aW9uIGxlbmd0aCBmb3Igb2JqZWN0IGlkcy4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgYWJicmV2aWF0aW9uIGxlbmd0aCBmb3Igb2JqZWN0IGlkcworCSAqLworCXB1YmxpYyBpbnQgZ2V0KCkgeworCQlyZXR1cm4gYWJicmV2OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGFiYnJldik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKaW5kZXggNmRhNmYxMi4uYWE2MTNkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKQEAgLTEzOCw2ICsxMzgsMTggQEAgcHVibGljIFN0cmluZyBnZXRSZW1vdGUoKSB7CiAJfQogCiAJLyoqCisJICogR2V0IHRoZSByZW1vdGUgdGhpcyBicmFuY2ggaXMgY29uZmlndXJlZCB0byBwdXNoIHRvLgorCSAqCisJICogQHJldHVybiB0aGUgcmVtb3RlIHRoaXMgYnJhbmNoIGlzIGNvbmZpZ3VyZWQgdG8gcHVzaCB0bywgb3Ige0Bjb2RlIG51bGx9CisJICogICAgICAgICBpZiBub3QgZGVmaW5lZAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFB1c2hSZW1vdGUoKSB7CisJCXJldHVybiBjb25maWcuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQlJBTkNIX1NFQ1RJT04sCisJCQkJYnJhbmNoTmFtZSwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFVTSF9SRU1PVEUpOworCX0KKworCS8qKgogCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgdXBzdHJlYW0gYnJhbmNoIGFzIGl0IGlzIGNhbGxlZCBvbiB0aGUgcmVtb3RlCiAJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB1cHN0cmVhbSBicmFuY2ggYXMgaXQgaXMgY2FsbGVkIG9uIHRoZSByZW1vdGUsIG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZy5qYXZhCmluZGV4IDIyZTFmOTguLjU1Y2MwMjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZy5qYXZhCkBAIC0xOCwxMSArMTgsMTMgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWcuQ29uZmlnRW51bTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWcuU2VjdGlvblBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwpAQCAtMzQsMjIgKzM2LDc2IEBACiAgKiBAc2luY2UgNS4xMwogICovCiBwdWJsaWMgY2xhc3MgQ29tbWl0Q29uZmlnIHsKKwogCS8qKgogCSAqIEtleSBmb3Ige0BsaW5rIENvbmZpZyNnZXQoU2VjdGlvblBhcnNlcil9LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlnLlNlY3Rpb25QYXJzZXI8Q29tbWl0Q29uZmlnPiBLRVkgPSBDb21taXRDb25maWc6Om5ldzsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVQgPSAiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEhvdyB0byBjbGVhbiB1cCBjb21taXQgbWVzc2FnZXMgd2hlbiBjb21taXR0aW5nLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBlbnVtIENsZWFudXBNb2RlIGltcGxlbWVudHMgQ29uZmlnRW51bSB7CisKKwkJLyoqCisJCSAqIHtAbGluayAjV0hJVEVTUEFDRX0sIGFkZGl0aW9uYWxseSByZW1vdmUgY29tbWVudCBsaW5lcy4KKwkJICovCisJCVNUUklQLAorCisJCS8qKgorCQkgKiBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgbGluZXM7CisJCSAqIGNvbGxhcHNlIG11bHRpcGxlIGVtcHR5IGxpbmVzIHRvIGEgc2luZ2xlIG9uZS4KKwkJICovCisJCVdISVRFU1BBQ0UsCisKKwkJLyoqCisJCSAqIE1ha2Ugbm8gY2hhbmdlcy4KKwkJICovCisJCVZFUkJBVElNLAorCisJCS8qKgorCQkgKiBPbWl0IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmlyc3QgInNjaXNzb3IiIGxpbmUgb24sIHRoZW4gYXBwbHkKKwkJICoge0BsaW5rICNXSElURVNQQUNFfS4KKwkJICovCisJCVNDSVNTT1JTLAorCisJCS8qKgorCQkgKiBVc2Uge0BsaW5rICNTVFJJUH0gZm9yIHVzZXItZWRpdGVkIG1lc3NhZ2VzLCBvdGhlcndpc2UKKwkJICoge0BsaW5rICNXSElURVNQQUNFfSwgdW5sZXNzIG92ZXJyaWRkZW4gYnkgYSBnaXQgY29uZmlnIHNldHRpbmcgb3RoZXIKKwkJICogdGhhbiBERUZBVUxULgorCQkgKi8KKwkJREVGQVVMVDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b0NvbmZpZ1ZhbHVlKCkgeworCQkJcmV0dXJuIG5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gbWF0Y2hDb25maWdWYWx1ZShTdHJpbmcgaW4pIHsKKwkJCXJldHVybiB0b0NvbmZpZ1ZhbHVlKCkuZXF1YWxzKGluKTsKKwkJfQorCX0KKwogCXByaXZhdGUgZmluYWwgc3RhdGljIENoYXJzZXQgREVGQVVMVF9DT01NSVRfTUVTU0FHRV9FTkNPRElORyA9IFN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiAKIAlwcml2YXRlIFN0cmluZyBpMThuQ29tbWl0RW5jb2Rpbmc7CiAKIAlwcml2YXRlIFN0cmluZyBjb21taXRUZW1wbGF0ZVBhdGg7CiAKKwlwcml2YXRlIENsZWFudXBNb2RlIGNsZWFudXBNb2RlOworCiAJcHJpdmF0ZSBDb21taXRDb25maWcoQ29uZmlnIHJjKSB7CiAJCWNvbW1pdFRlbXBsYXRlUGF0aCA9IHJjLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX0NPTU1JVF9TRUNUSU9OLAogCQkJCW51bGwsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NPTU1JVF9URU1QTEFURSk7CiAJCWkxOG5Db21taXRFbmNvZGluZyA9IHJjLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fSTE4TiwKIAkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DT01NSVRfRU5DT0RJTkcpOworCQljbGVhbnVwTW9kZSA9IHJjLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT01NSVRfU0VDVElPTiwgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DTEVBTlVQLCBDbGVhbnVwTW9kZS5ERUZBVUxUKTsKIAl9CiAKIAkvKioKQEAgLTc1LDYgKzEzMSw0OCBAQCBwdWJsaWMgU3RyaW5nIGdldENvbW1pdEVuY29kaW5nKCkgewogCX0KIAogCS8qKgorCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIENsZWFudXBNb2RlfSBhcyBnaXZlbiBieSBnaXQgY29uZmlnCisJICoge0Bjb2RlIGNvbW1pdC5jbGVhbnVwfS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBDbGVhbnVwTW9kZX07IHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSBpZiB0aGUgZ2l0CisJICogICAgICAgICBjb25maWcgaXMgbm90IHNldAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBDbGVhbnVwTW9kZSBnZXRDbGVhbnVwTW9kZSgpIHsKKwkJcmV0dXJuIGNsZWFudXBNb2RlOworCX0KKworCS8qKgorCSAqIENvbXB1dGVzIGEgbm9uLWRlZmF1bHQge0BsaW5rIENsZWFudXBNb2RlfSBmcm9tIHRoZSBnaXZlbiBtb2RlIGFuZCB0aGUKKwkgKiBnaXQgY29uZmlnLgorCSAqCisJICogQHBhcmFtIG1vZGUKKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gcmVzb2x2ZQorCSAqIEBwYXJhbSBkZWZhdWx0U3RyaXAKKwkgKiAgICAgICAgICAgIGlmIHtAY29kZSB0cnVlfSByZXR1cm4ge0BsaW5rIENsZWFudXBNb2RlI1NUUklQfSBpZiB0aGUgZ2l0CisJICogICAgICAgICAgICBjb25maWcgaXMgYWxzbyAiZGVmYXVsdCIsIG90aGVyd2lzZSByZXR1cm4KKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZSNXSElURVNQQUNFfQorCSAqIEByZXR1cm4gdGhlIHtAY29kZSBtb2RlfSwgaWYgaXQgaXMgbm90IHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSwKKwkgKiAgICAgICAgIG90aGVyd2lzZSB0aGUgcmVzb2x2ZWQgbW9kZSwgd2hpY2ggaXMgbmV2ZXIKKwkgKiAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBDbGVhbnVwTW9kZSByZXNvbHZlKEBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUsCisJCQlib29sZWFuIGRlZmF1bHRTdHJpcCkgeworCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVCA9PSBtb2RlKSB7CisJCQlDbGVhbnVwTW9kZSBkZWZhdWx0TW9kZSA9IGdldENsZWFudXBNb2RlKCk7CisJCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVCA9PSBkZWZhdWx0TW9kZSkgeworCQkJCXJldHVybiBkZWZhdWx0U3RyaXAgPyBDbGVhbnVwTW9kZS5TVFJJUAorCQkJCQkJOiBDbGVhbnVwTW9kZS5XSElURVNQQUNFOworCQkJfQorCQkJcmV0dXJuIGRlZmF1bHRNb2RlOworCQl9CisJCXJldHVybiBtb2RlOworCX0KKworCS8qKgogCSAqIEdldCB0aGUgY29udGVudCB0byB0aGUgY29tbWl0IHRlbXBsYXRlIGFzIGRlZmluZWQgaW4KIAkgKiB7QGNvZGUgY29tbWl0LnRlbXBsYXRlfS4gSWYgbm8ge0Bjb2RlIGkxOG4uY29tbWl0RW5jb2Rpbmd9IGlzIHNwZWNpZmllZCwKIAkgKiBVVEYtOCBmYWxsYmFjayBpcyB1c2VkLgpAQCAtMTM1LDQgKzIzMyw4NiBAQCBwcml2YXRlIENoYXJzZXQgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAKIAkJcmV0dXJuIGNvbW1pdE1lc3NhZ2VFbmNvZGluZzsKIAl9CisKKwkvKioKKwkgKiBQcm9jZXNzZXMgYSB0ZXh0IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIENsZWFudXBNb2RlfS4KKwkgKgorCSAqIEBwYXJhbSB0ZXh0CisJICogICAgICAgICAgICB0ZXh0IHRvIHByb2Nlc3MKKwkgKiBAcGFyYW0gbW9kZQorCSAqICAgICAgICAgICAge0BsaW5rIENsZWFudXBNb2RlfSB0byB1c2UKKwkgKiBAcGFyYW0gY29tbWVudENoYXIKKwkgKiAgICAgICAgICAgIGNvbW1lbnQgY2hhcmFjdGVyIChub3JtYWxseSB7QGNvZGUgI30pIHRvIHVzZSBpZiB7QGNvZGUgbW9kZX0KKwkgKiAgICAgICAgICAgIGlzIHtAbGluayBDbGVhbnVwTW9kZSNTVFJJUH0gb3Ige0BsaW5rIENsZWFudXBNb2RlI1NDSVNTT1JTfQorCSAqIEByZXR1cm4gdGhlIHByb2Nlc3NlZCB0ZXh0CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgbW9kZX0gaXMge0BsaW5rIENsZWFudXBNb2RlI0RFRkFVTFR9ICh1c2UKKwkgKiAgICAgICAgICAgICB7QGxpbmsgI3Jlc29sdmUoQ2xlYW51cE1vZGUsIGJvb2xlYW4pfSBmaXJzdCkKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5UZXh0KEBOb25OdWxsIFN0cmluZyB0ZXh0LAorCQkJQE5vbk51bGwgQ2xlYW51cE1vZGUgbW9kZSwgY2hhciBjb21tZW50Q2hhcikgeworCQlTdHJpbmcgdG9Qcm9jZXNzID0gdGV4dDsKKwkJYm9vbGVhbiBzdHJpcCA9IGZhbHNlOworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBWRVJCQVRJTToKKwkJCXJldHVybiB0ZXh0OworCQljYXNlIFNDSVNTT1JTOgorCQkJU3RyaW5nIGN1dCA9IGNvbW1lbnRDaGFyICsgQ1VUOworCQkJaWYgKHRleHQuc3RhcnRzV2l0aChjdXQpKSB7CisJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpbnQgY3V0UG9zID0gdGV4dC5pbmRleE9mKCdcbicgKyBjdXQpOworCQkJaWYgKGN1dFBvcyA+PSAwKSB7CisJCQkJdG9Qcm9jZXNzID0gdGV4dC5zdWJzdHJpbmcoMCwgY3V0UG9zICsgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVFJJUDoKKwkJCXN0cmlwID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdISVRFU1BBQ0U6CisJCQlicmVhazsKKwkJY2FzZSBERUZBVUxUOgorCQlkZWZhdWx0OgorCQkJLy8gSW50ZXJuYWwgZXJyb3I7IG5vIHRyYW5zbGF0aW9uCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNsZWFuLXVwIG1vZGUgIiArIG1vZGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJLy8gV0hJVEVTUEFDRQorCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWJvb2xlYW4gbGFzdFdhc0VtcHR5ID0gdHJ1ZTsKKwkJZm9yIChTdHJpbmcgbGluZSA6IHRvUHJvY2Vzcy5zcGxpdCgiXG4iKSkgeyAvLyROT04tTkxTLTEkCisJCQlsaW5lID0gbGluZS5zdHJpcFRyYWlsaW5nKCk7CisJCQlpZiAobGluZS5pc0VtcHR5KCkpIHsKKwkJCQlpZiAoIWxhc3RXYXNFbXB0eSkgeworCQkJCQlyZXN1bHQuYXBwZW5kKCdcbicpOworCQkJCQlsYXN0V2FzRW1wdHkgPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmlwIHx8ICFpc0NvbW1lbnQobGluZSwgY29tbWVudENoYXIpKSB7CisJCQkJbGFzdFdhc0VtcHR5ID0gZmFsc2U7CisJCQkJcmVzdWx0LmFwcGVuZChsaW5lKS5hcHBlbmQoJ1xuJyk7CisJCQl9CisJCX0KKwkJaW50IGJ1ZmZlclNpemUgPSByZXN1bHQubGVuZ3RoKCk7CisJCWlmIChsYXN0V2FzRW1wdHkgJiYgYnVmZmVyU2l6ZSA+IDApIHsKKwkJCWJ1ZmZlclNpemUtLTsKKwkJCXJlc3VsdC5zZXRMZW5ndGgoYnVmZmVyU2l6ZSk7CisJCX0KKwkJaWYgKGJ1ZmZlclNpemUgPiAwICYmICF0b1Byb2Nlc3MuZW5kc1dpdGgoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHJlc3VsdC5jaGFyQXQoYnVmZmVyU2l6ZSAtIDEpID09ICdcbicpIHsKKwkJCQlyZXN1bHQuc2V0TGVuZ3RoKGJ1ZmZlclNpemUgLSAxKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbW1lbnQoU3RyaW5nIHRleHQsIGNoYXIgY29tbWVudENoYXIpIHsKKwkJaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKKwkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKKwkJCQlyZXR1cm4gY2ggPT0gY29tbWVudENoYXI7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhCmluZGV4IDFjZTNlMzEuLmQxZDY2ZDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhCkBAIC0yNzgsNiArMjc4LDU0IEBAIHB1YmxpYyBpbnQgZ2V0SW50KGZpbmFsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKIAl9CiAKIAkvKioKKwkgKiBPYnRhaW4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHdoaWNoIG11c3QgYmUgaW5zaWRlIGdpdmVuCisJICogcmFuZ2UuCisJICoKKwkgKiBAcGFyYW0gc2VjdGlvbgorCSAqICAgICAgICAgICAgc2VjdGlvbiB0aGUga2V5IGlzIGdyb3VwZWQgd2l0aGluLgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBrZXkgdG8gZ2V0LgorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqICAgICAgICAgICAgbWluaW11bSB2YWx1ZQorCSAqIEBwYXJhbSBtYXhWYWx1ZQorCSAqICAgICAgICAgICAgbWF4aW11bSB2YWx1ZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG5vIHZhbHVlIHdhcyBwcmVzZW50LgorCSAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCBvciBkZWZhdWx0VmFsdWUuCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW50SW5SYW5nZShTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIG5hbWUsIGludCBtaW5WYWx1ZSwKKwkJCWludCBtYXhWYWx1ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCQlyZXR1cm4gdHlwZWRHZXR0ZXIuZ2V0SW50SW5SYW5nZSh0aGlzLCBzZWN0aW9uLCBudWxsLCBuYW1lLCBtaW5WYWx1ZSwKKwkJCQltYXhWYWx1ZSwgZGVmYXVsdFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBPYnRhaW4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHdoaWNoIG11c3QgYmUgaW5zaWRlIGdpdmVuCisJICogcmFuZ2UuCisJICoKKwkgKiBAcGFyYW0gc2VjdGlvbgorCSAqICAgICAgICAgICAgc2VjdGlvbiB0aGUga2V5IGlzIGdyb3VwZWQgd2l0aGluLgorCSAqIEBwYXJhbSBzdWJzZWN0aW9uCisJICogICAgICAgICAgICBzdWJzZWN0aW9uIG5hbWUsIHN1Y2ggYSByZW1vdGUgb3IgYnJhbmNoIG5hbWUuCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGtleSB0byBnZXQuCisJICogQHBhcmFtIG1pblZhbHVlCisJICogICAgICAgICAgICBtaW5pbXVtIHZhbHVlCisJICogQHBhcmFtIG1heFZhbHVlCisJICogICAgICAgICAgICBtYXhpbXVtIHZhbHVlCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgbm8gdmFsdWUgd2FzIHByZXNlbnQuCisJICogQHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIG9yIGRlZmF1bHRWYWx1ZS4KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIGludCBnZXRJbnRJblJhbmdlKFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwgU3RyaW5nIG5hbWUsCisJCQlpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCQlyZXR1cm4gdHlwZWRHZXR0ZXIuZ2V0SW50SW5SYW5nZSh0aGlzLCBzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lLAorCQkJCW1pblZhbHVlLCBtYXhWYWx1ZSwgZGVmYXVsdFZhbHVlKTsKKwl9CisKKwkvKioKIAkgKiBPYnRhaW4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogCSAqCiAJICogQHBhcmFtIHNlY3Rpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKaW5kZXggNjM0ZTNmNy4uZDRiZDZjMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnQ29uc3RhbnRzLmphdmEKQEAgLTEsNyArMSw4IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXRoaWFzIEtpbnpsZXIgPG1hdGhpYXMua2luemxlckBzYXAuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpcyBBbmlzemN6eWsgPGNhbmlzemN6eWtAZ21haWwuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDIwLCBSb2JpbiBSb3NlbmJlcmcgYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMsIFJvYmluIFJvc2VuYmVyZworICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5LDYgKzMwLDQ4IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCS8qKiBUaGUgImRpZmYiIHNlY3Rpb24gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElGRl9TRUNUSU9OID0gImRpZmYiOwogCisJLyoqCisJICogVGhlICJ0b29sIiBrZXkgd2l0aGluICJkaWZmIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9UT09MID0gInRvb2wiOworCisJLyoqCisJICogVGhlICJndWl0b29sIiBrZXkgd2l0aGluICJkaWZmIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9HVUlUT09MID0gImd1aXRvb2wiOworCisJLyoqCisJICogVGhlICJkaWZmdG9vbCIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19ESUZGVE9PTF9TRUNUSU9OID0gImRpZmZ0b29sIjsKKworCS8qKgorCSAqIFRoZSAicHJvbXB0IiBrZXkgd2l0aGluICJkaWZmdG9vbCIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUFJPTVBUID0gInByb21wdCI7CisKKwkvKioKKwkgKiBUaGUgInRydXN0RXhpdENvZGUiIGtleSB3aXRoaW4gImRpZmZ0b29sIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREUgPSAidHJ1c3RFeGl0Q29kZSI7CisKKwkvKioKKwkgKiBUaGUgImNtZCIga2V5IHdpdGhpbiAiZGlmZnRvb2wuKi4iIHNlY3Rpb24KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0NNRCA9ICJjbWQiOworCiAJLyoqIFRoZSAiZGZzIiBzZWN0aW9uICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0RGU19TRUNUSU9OID0gImRmcyI7CiAKQEAgLTEzOSw2ICsxODIsMTMgQEAgcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ0NvbnN0YW50cyB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1RBR19TRUNUSU9OID0gInRhZyI7CiAKIAkvKioKKwkgKiBUaGUgImNsZWFudXAiIGtleQorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfQ0xFQU5VUCA9ICJjbGVhbnVwIjsKKworCS8qKgogCSAqIFRoZSAiZ3BnU2lnbiIga2V5CiAJICoKIAkgKiBAc2luY2UgNS4yCkBAIC0yNzksNiArMzI5LDIwIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCS8qKiBUaGUgInJlbW90ZSIga2V5ICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9SRU1PVEUgPSAicmVtb3RlIjsKIAorCS8qKgorCSAqIFRoZSAicHVzaFJlbW90ZSIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUFVTSF9SRU1PVEUgPSAicHVzaFJlbW90ZSI7CisKKwkvKioKKwkgKiBUaGUgInB1c2hEZWZhdWx0IiBrZXkuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9QVVNIX0RFRkFVTFQgPSAicHVzaERlZmF1bHQiOworCiAJLyoqIFRoZSAibWVyZ2UiIGtleSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfTUVSR0UgPSAibWVyZ2UiOwogCkBAIC03NzgsNiArODQyLDM0IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfU0VBUkNIX0ZPUl9SRVVTRV9USU1FT1VUID0gInNlYXJjaGZvcnJldXNldGltZW91dCI7CiAKIAkvKioKKwkgKiBUaGUgInB1c2giIHNlY3Rpb24uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BVU0hfU0VDVElPTiA9ICJwdXNoIjsKKworCS8qKgorCSAqIFRoZSAiZGVmYXVsdCIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfREVGQVVMVCA9ICJkZWZhdWx0IjsKKworCS8qKgorCSAqIFRoZSAiYWJicmV2IiBrZXkKKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0FCQlJFViA9ICJhYmJyZXYiOworCisJLyoqCisJICogVGhlICJ0cnVzdFBhY2tlZFJlZnNTdGF0IiBrZXkKKwkgKgorCSAqIEBzaW5jZSA2LjEuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfVFJVU1RfUEFDS0VEX1JFRlNfU1RBVCA9ICJ0cnVzdFBhY2tlZFJlZnNTdGF0IjsKKworCS8qKgogCSAqIFRoZSAicGFjay5wcmVzZXJ2ZU9sZFBhY2tzIiBrZXkKIAkgKgogCSAqIEBzaW5jZSA1LjEzLjIKQEAgLTc5MCw1ICs4ODIsNCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnQ29uc3RhbnRzIHsKIAkgKiBAc2luY2UgNS4xMy4yCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9QUlVORV9QUkVTRVJWRUQgPSAicHJ1bmVwcmVzZXJ2ZWQiOwotCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCmluZGV4IDkyMzY3ZWIuLmNmMmU2OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCkBAIC00OCw2ICs0OCwxNSBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCA9IE9CSkVDVF9JRF9MRU5HVEggKiAyOwogCisJLyoqCisJICogVGhlIGhpc3RvcmljIGxlbmd0aCBvZiBhbiBhYmJyZXZpYXRlZCBHaXQgb2JqZWN0IGhhc2ggc3RyaW5nLiBHaXQgMi4xMQorCSAqIGNoYW5nZWQgdGhpcyBzdGF0aWMgbnVtYmVyIHRvIGEgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBvbmUgdGhhdCBzY2FsZXMKKwkgKiBhcyB0aGUgcmVwb3NpdG9yeSBncm93cy4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEggPSA3OworCiAJLyoqIFNwZWNpYWwgbmFtZSBmb3IgdGhlICJIRUFEIiBzeW1ib2xpYy1yZWYuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9ICJIRUFEIjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhCmluZGV4IGYyM2M2ZTAuLmZjODJhNWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEKQEAgLTExNiw2ICsxMTYsMjcgQEAgcHVibGljIGVudW0gTG9nUmVmVXBkYXRlcyB7CiAJCUFMV0FZUwogCX0KIAorCS8qKgorCSAqIFBlcm1pc3NpYmxlIHZhbHVlcyBmb3Ige0Bjb2RlIGNvcmUudHJ1c3RQYWNrZWRSZWZzU3RhdH0uCisJICoKKwkgKiBAc2luY2UgNi4xLjEKKwkgKi8KKwlwdWJsaWMgZW51bSBUcnVzdFBhY2tlZFJlZnNTdGF0IHsKKwkJLyoqIERvIG5vdCB0cnVzdCBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIHBhY2tlZC1yZWZzIGZpbGUuICovCisJCU5FVkVSLAorCisJCS8qKiBUcnVzdCBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIHBhY2tlZC1yZWZzIGZpbGUuICovCisJCUFMV0FZUywKKworCQkvKiogT3BlbiBhbmQgY2xvc2UgdGhlIHBhY2tlZC1yZWZzIGZpbGUgdG8gcmVmcmVzaCBpdHMgZmlsZSBhdHRyaWJ1dGVzCisJCSAqIGFuZCB0aGVuIHRydXN0IGl0LiAqLworCQlBRlRFUl9PUEVOLAorCisJCS8qKiB7QGNvZGUgY29yZS50cnVzdFBhY2tlZFJlZnNTdGF0fSBkZWZhdWx0cyB0byB0aGlzIHdoZW4gaXQgaXMKKwkJICogbm90IHNldCAqLworCQlVTlNFVAorCX0KKwogCXByaXZhdGUgZmluYWwgaW50IGNvbXByZXNzaW9uOwogCiAJcHJpdmF0ZSBmaW5hbCBpbnQgcGFja0luZGV4VmVyc2lvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEKaW5kZXggOWY5NmJjZS4uODY0MDk0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEKQEAgLTEyMCw2ICsxMjAsMjYgQEAgcHVibGljIGludCBnZXRJbnQoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGdldEludEluUmFuZ2UoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLAorCQkJU3RyaW5nIG5hbWUsIGludCBtaW5WYWx1ZSwgaW50IG1heFZhbHVlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisJCWludCB2YWwgPSBnZXRJbnQoY29uZmlnLCBzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lLCBkZWZhdWx0VmFsdWUpOworCQlpZiAoKHZhbCA+PSBtaW5WYWx1ZSAmJiB2YWwgPD0gbWF4VmFsdWUpIHx8IHZhbCA9PSBVTlNFVF9JTlQpIHsKKwkJCXJldHVybiB2YWw7CisJCX0KKwkJaWYgKHN1YnNlY3Rpb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJSkdpdFRleHQuZ2V0KCkuaW50ZWdlclZhbHVlTm90SW5SYW5nZSwgc2VjdGlvbiwgbmFtZSwKKwkJCQkJSW50ZWdlci52YWx1ZU9mKHZhbCksIEludGVnZXIudmFsdWVPZihtaW5WYWx1ZSksCisJCQkJCUludGVnZXIudmFsdWVPZihtYXhWYWx1ZSkpKTsKKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCUpHaXRUZXh0LmdldCgpLmludGVnZXJWYWx1ZU5vdEluUmFuZ2VTdWJTZWN0aW9uLCBzZWN0aW9uLAorCQkJCXN1YnNlY3Rpb24sIG5hbWUsIEludGVnZXIudmFsdWVPZih2YWwpLAorCQkJCUludGVnZXIudmFsdWVPZihtaW5WYWx1ZSksIEludGVnZXIudmFsdWVPZihtYXhWYWx1ZSkpKTsKKwl9CisKKwkvKioge0Bpbmhlcml0RG9jfSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBsb25nIGdldExvbmcoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLAogCQkJU3RyaW5nIG5hbWUsIGxvbmcgZGVmYXVsdFZhbHVlKSB7CiAJCWZpbmFsIFN0cmluZyBzdHIgPSBjb25maWcuZ2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQppbmRleCAyOGVhOTI3Li5kZjlmZDQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQpAQCAtNTY4LDYgKzU2OCw5IEBAIHB1YmxpYyBib29sZWFuIGRpZmYoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCBlc3RXb3JrVHJlZVNpemUsCiAJCWlmIChpZ25vcmVTdWJtb2R1bGVNb2RlICE9IElnbm9yZVN1Ym1vZHVsZU1vZGUuQUxMKSB7CiAJCQl0cnkgKFN1Ym1vZHVsZVdhbGsgc213ID0gbmV3IFN1Ym1vZHVsZVdhbGsocmVwb3NpdG9yeSkpIHsKIAkJCQlzbXcuc2V0VHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcihkaXJDYWNoZSkpOworCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgeworCQkJCQlzbXcuc2V0RmlsdGVyKGZpbHRlcik7CisJCQkJfQogCQkJCXNtdy5zZXRCdWlsZGVyRmFjdG9yeShmYWN0b3J5KTsKIAkJCQl3aGlsZSAoc213Lm5leHQoKSkgewogCQkJCQlJZ25vcmVTdWJtb2R1bGVNb2RlIGxvY2FsSWdub3JlU3VibW9kdWxlTW9kZSA9IGlnbm9yZVN1Ym1vZHVsZU1vZGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQppbmRleCAwNDI2MmMwLi43MDAwOWNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKQEAgLTE1NSw0ICsxNTUsMTQgQEAgcHVibGljIE9iamVjdExvYWRlciBvcGVuKEFueU9iamVjdElkIG9iamVjdElkLCBpbnQgdHlwZUhpbnQpCiAJcHVibGljIE9iamVjdERhdGFiYXNlIG5ld0NhY2hlZERhdGFiYXNlKCkgewogCQlyZXR1cm4gdGhpczsKIAl9CisKKwkvKioKKwkgKiBHZXQgYSBxdWljaywgcm91Z2ggY291bnQgb2Ygb2JqZWN0cyBpbiB0aGlzIHJlcG9zaXRvcnkuIElnbm9yZXMgbG9vc2UKKwkgKiBvYmplY3RzLiBSZXR1cm5zIHtAY29kZSAtMX0gaWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KKwkgKgorCSAqIEByZXR1cm4gcXVpY2ssIHJvdWdoIGNvdW50IG9mIG9iamVjdHMgaW4gdGhpcyByZXBvc2l0b3J5LCB7QGNvZGUgLTF9IGlmCisJICogICAgICAgICBhbiBleGNlcHRpb24gb2NjdXJzCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldEFwcHJveGltYXRlT2JqZWN0Q291bnQoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdFJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0UmVhZGVyLmphdmEKaW5kZXggYTJjNzM4MS4uMjZjM2ZmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0UmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0UmVhZGVyLmphdmEKQEAgLTEwLDYgKzEwLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtNzYsNyArNzgsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0UmVhZGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CiAJICovCiAJcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgYWJicmV2aWF0ZShBbnlPYmplY3RJZCBvYmplY3RJZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBhYmJyZXZpYXRlKG9iamVjdElkLCA3KTsKKwkJcmV0dXJuIGFiYnJldmlhdGUob2JqZWN0SWQsIE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQppbmRleCA0MjhhNmI5Li45MzcxMDI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKQEAgLTE0LDYgKzE0LDggQEAKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CkBAIC0yMDYsNiArMjA4LDIwIEBAIHB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSwgRGF0ZSBhV2hlbikgewogCX0KIAogCS8qKgorCSAqIENvcHkgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9LCBidXQgYWx0ZXIgdGhlIGNsb25lJ3MKKwkgKiB0aW1lIHN0YW1wCisJICoKKwkgKiBAcGFyYW0gcGkKKwkgKiAgICAgICAgICAgIG9yaWdpbmFsIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudH0KKwkgKiBAcGFyYW0gYVdoZW4KKwkgKiAgICAgICAgICAgIGxvY2FsIHRpbWUgYXMgSW5zdGFudAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUGVyc29uSWRlbnQoUGVyc29uSWRlbnQgcGksIEluc3RhbnQgYVdoZW4pIHsKKwkJdGhpcyhwaS5nZXROYW1lKCksIHBpLmdldEVtYWlsQWRkcmVzcygpLCBhV2hlbi50b0Vwb2NoTWlsbGkoKSwgcGkudHpPZmZzZXQpOworCX0KKworCS8qKgogCSAqIENvbnN0cnVjdCBhIFBlcnNvbklkZW50IGZyb20gc2ltcGxlIGRhdGEKIAkgKgogCSAqIEBwYXJhbSBhTmFtZSBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCkBAIC0yMjIsNiArMjM4LDI3IEBAIHB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgYU5hbWUsIGZpbmFsIFN0cmluZyBhRW1haWxBZGRyZXNzLAogCX0KIAogCS8qKgorCSAqIENvbnN0cnVjdCBhIFBlcnNvbklkZW50IGZyb20gc2ltcGxlIGRhdGEKKwkgKgorCSAqIEBwYXJhbSBhTmFtZQorCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgorCSAqIEBwYXJhbSBhRW1haWxBZGRyZXNzCisJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCisJICogQHBhcmFtIGFXaGVuCisJICogICAgICAgICAgICBsb2NhbCB0aW1lIHN0YW1wCisJICogQHBhcmFtIHpvbmVJZAorCSAqICAgICAgICAgICAgdGltZSB6b25lIGlkCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgYU5hbWUsIFN0cmluZyBhRW1haWxBZGRyZXNzLCBJbnN0YW50IGFXaGVuLAorCQkJWm9uZUlkIHpvbmVJZCkgeworCQl0aGlzKGFOYW1lLCBhRW1haWxBZGRyZXNzLCBhV2hlbi50b0Vwb2NoTWlsbGkoKSwKKwkJCQlUaW1lWm9uZS5nZXRUaW1lWm9uZSh6b25lSWQpCisJCQkJCQkuZ2V0T2Zmc2V0KGFXaGVuCisJCQkJLnRvRXBvY2hNaWxsaSgpKSAvICg2MCAqIDEwMDApKTsKKwl9CisKKwkvKioKIAkgKiBDb3B5IGEgUGVyc29uSWRlbnQsIGJ1dCBhbHRlciB0aGUgY2xvbmUncyB0aW1lIHN0YW1wCiAJICoKIAkgKiBAcGFyYW0gcGkKQEAgLTMwNCw2ICszNDEsMTYgQEAgcHVibGljIERhdGUgZ2V0V2hlbigpIHsKIAl9CiAKIAkvKioKKwkgKiBHZXQgd2hlbiBhdHRyaWJ1dGUgYXMgaW5zdGFudAorCSAqCisJICogQHJldHVybiB0aW1lc3RhbXAKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIEluc3RhbnQgZ2V0V2hlbkFzSW5zdGFudCgpIHsKKwkJcmV0dXJuIEluc3RhbnQub2ZFcG9jaE1pbGxpKHdoZW4pOworCX0KKworCS8qKgogCSAqIEdldCB0aGlzIHBlcnNvbidzIGRlY2xhcmVkIHRpbWUgem9uZQogCSAqCiAJICogQHJldHVybiB0aGlzIHBlcnNvbidzIGRlY2xhcmVkIHRpbWUgem9uZTsgbnVsbCBpZiB0aW1lIHpvbmUgaXMgdW5rbm93bi4KQEAgLTMxMyw2ICszNjAsMTYgQEAgcHVibGljIFRpbWVab25lIGdldFRpbWVab25lKCkgewogCX0KIAogCS8qKgorCSAqIEdldCB0aGUgdGltZSB6b25lIGlkCisJICoKKwkgKiBAcmV0dXJuIHRoZSB0aW1lIHpvbmUgaWQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFpvbmVJZCBnZXRab25lSWQoKSB7CisJCXJldHVybiBnZXRUaW1lWm9uZSgpLnRvWm9uZUlkKCk7CisJfQorCisJLyoqCiAJICogR2V0IHRoaXMgcGVyc29uJ3MgZGVjbGFyZWQgdGltZSB6b25lIGFzIG1pbnV0ZXMgZWFzdCBvZiBVVEMuCiAJICoKIAkgKiBAcmV0dXJuIHRoaXMgcGVyc29uJ3MgZGVjbGFyZWQgdGltZSB6b25lIGFzIG1pbnV0ZXMgZWFzdCBvZiBVVEMuIElmIHRoZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVHlwZWRDb25maWdHZXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEKaW5kZXggMGYyZjZjZi4uYzRlYjhmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVHlwZWRDb25maWdHZXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UeXBlZENvbmZpZ0dldHRlci5qYXZhCkBAIC0yOSw2ICsyOSwxMyBAQAogcHVibGljIGludGVyZmFjZSBUeXBlZENvbmZpZ0dldHRlciB7CiAKIAkvKioKKwkgKiBVc2Uge0Bjb2RlIEludGVnZXIjTUlOX1ZBTFVFfSBhcyB1bnNldCBpbnQgdmFsdWUKKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFVF9JTlQgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworCS8qKgogCSAqIEdldCBhIGJvb2xlYW4gdmFsdWUgZnJvbSBhIGdpdCB7QGxpbmsgQ29uZmlnfS4KIAkgKgogCSAqIEBwYXJhbSBjb25maWcKQEAgLTg3LDYgKzk0LDMyIEBAIGludCBnZXRJbnQoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLCBTdHJpbmcgbmFtZSwKIAkJCWludCBkZWZhdWx0VmFsdWUpOwogCiAJLyoqCisJICogT2J0YWluIGFuIGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdCB7QGxpbmsgQ29uZmlnfSB3aGljaCBtdXN0IGJlIGluIGdpdmVuCisJICogcmFuZ2UuCisJICoKKwkgKiBAcGFyYW0gY29uZmlnCisJICogICAgICAgICAgICB0byBnZXQgdGhlIHZhbHVlIGZyb20KKwkgKiBAcGFyYW0gc2VjdGlvbgorCSAqICAgICAgICAgICAgc2VjdGlvbiB0aGUga2V5IGlzIGdyb3VwZWQgd2l0aGluLgorCSAqIEBwYXJhbSBzdWJzZWN0aW9uCisJICogICAgICAgICAgICBzdWJzZWN0aW9uIG5hbWUsIHN1Y2ggYSByZW1vdGUgb3IgYnJhbmNoIG5hbWUuCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGtleSB0byBnZXQuCisJICogQHBhcmFtIG1pblZhbHVlCisJICogICAgICAgICAgICBtaW5pbWFsIHZhbHVlCisJICogQHBhcmFtIG1heFZhbHVlCisJICogICAgICAgICAgICBtYXhpbXVtIHZhbHVlCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgbm8gdmFsdWUgd2FzIHByZXNlbnQuIFVzZQorCSAqICAgICAgICAgICAge0Bjb2RlICNVTlNFVF9JTlR9IHRvIHNldCB0aGUgZGVmYXVsdCB0byB1bnNldC4KKwkgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgb3IgZGVmYXVsdFZhbHVlLgorCSAqICAgICAgICAge0Bjb2RlICNVTlNFVF9JTlR9IGlmIHVuc2V0LgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlpbnQgZ2V0SW50SW5SYW5nZShDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCisJCQlTdHJpbmcgbmFtZSwgaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGludCBkZWZhdWx0VmFsdWUpOworCisJLyoqCiAJICogT2J0YWluIGEgbG9uZyB2YWx1ZSBmcm9tIGEgZ2l0IHtAbGluayBDb25maWd9LgogCSAqCiAJICogQHBhcmFtIGNvbmZpZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvaW50ZXJuYWwvQm9vbGVhblRyaVN0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9pbnRlcm5hbC9Cb29sZWFuVHJpU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQzYmIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvaW50ZXJuYWwvQm9vbGVhblRyaVN0YXRlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBTaW1lb24gQW5kcmVldiA8c2ltZW9uLmRhbmFpbG92LmFuZHJlZXZAZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDsKKworLyoqCisgKiBBIGJvb2xlYW4gdmFsdWUgdGhhdCBjYW4gYWxzbyBoYXZlIGFuIHVuc2V0IHN0YXRlLgorICovCitwdWJsaWMgZW51bSBCb29sZWFuVHJpU3RhdGUgeworCS8qKgorCSAqIFZhbHVlIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIHRydWV9LgorCSAqLworCVRSVUUsCisJLyoqCisJICogVmFsdWUgZXF1aXZhbGVudCB0byB7QGNvZGUgZmFsc2V9LgorCSAqLworCUZBTFNFLAorCS8qKgorCSAqIFZhbHVlIGlzIG5vdCBzZXQuCisJICovCisJVU5TRVQ7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXIuamF2YQppbmRleCBmNzk2NmEyLi5lMGMwODNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyLmphdmEKQEAgLTkyLDM2ICs5Miw2MiBAQCBwdWJsaWMgU3RyaW5nIGZvcm1hdChMaXN0PFJlZj4gcmVmc1RvTWVyZ2UsIFJlZiB0YXJnZXQpIHsKIAl9CiAKIAkvKioKLQkgKiBBZGQgc2VjdGlvbiB3aXRoIGNvbmZsaWN0aW5nIHBhdGhzIHRvIG1lcmdlIG1lc3NhZ2UuCisJICogQWRkIHNlY3Rpb24gd2l0aCBjb25mbGljdGluZyBwYXRocyB0byBtZXJnZSBtZXNzYWdlLiBMaW5lcyBhcmUgcHJlZml4ZWQKKwkgKiB3aXRoIGEgaGFzaC4KIAkgKgogCSAqIEBwYXJhbSBtZXNzYWdlCiAJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgbWVyZ2UgbWVzc2FnZQogCSAqIEBwYXJhbSBjb25mbGljdGluZ1BhdGhzCiAJICogICAgICAgICAgICB0aGUgcGF0aHMgd2l0aCBjb25mbGljdHMKIAkgKiBAcmV0dXJuIG1lcmdlIG1lc3NhZ2Ugd2l0aCBjb25mbGljdGluZyBwYXRocyBhZGRlZAorCSAqIEBkZXByZWNhdGVkIHNpbmNlIDYuMTsgdXNlCisJICogICAgICAgICAgICAge0BsaW5rICNmb3JtYXRXaXRoQ29uZmxpY3RzKFN0cmluZywgSXRlcmFibGUsIGNoYXIpfSBpbnN0ZWFkCiAJICovCisJQERlcHJlY2F0ZWQKIAlwdWJsaWMgU3RyaW5nIGZvcm1hdFdpdGhDb25mbGljdHMoU3RyaW5nIG1lc3NhZ2UsCiAJCQlMaXN0PFN0cmluZz4gY29uZmxpY3RpbmdQYXRocykgeworCQlyZXR1cm4gZm9ybWF0V2l0aENvbmZsaWN0cyhtZXNzYWdlLCBjb25mbGljdGluZ1BhdGhzLCAnIycpOworCX0KKworCS8qKgorCSAqIEFkZCBzZWN0aW9uIHdpdGggY29uZmxpY3RpbmcgcGF0aHMgdG8gbWVyZ2UgbWVzc2FnZS4KKwkgKgorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgbWVyZ2UgbWVzc2FnZQorCSAqIEBwYXJhbSBjb25mbGljdGluZ1BhdGhzCisJICogICAgICAgICAgICB0aGUgcGF0aHMgd2l0aCBjb25mbGljdHMKKwkgKiBAcGFyYW0gY29tbWVudENoYXIKKwkgKiAgICAgICAgICAgIGNvbW1lbnQgY2hhcmFjdGVyIHRvIHVzZSBmb3IgcHJlZml4aW5nIHRoZSBjb25mbGljdCBsaW5lcworCSAqIEByZXR1cm4gbWVyZ2UgbWVzc2FnZSB3aXRoIGNvbmZsaWN0aW5nIHBhdGhzIGFkZGVkCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBTdHJpbmcgZm9ybWF0V2l0aENvbmZsaWN0cyhTdHJpbmcgbWVzc2FnZSwKKwkJCUl0ZXJhYmxlPFN0cmluZz4gY29uZmxpY3RpbmdQYXRocywgY2hhciBjb21tZW50Q2hhcikgewogCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJU3RyaW5nW10gbGluZXMgPSBtZXNzYWdlLnNwbGl0KCJcbiIpOyAvLyROT04tTkxTLTEkCiAJCWludCBmaXJzdEZvb3RlckxpbmUgPSBDaGFuZ2VJZFV0aWwuaW5kZXhPZkZpcnN0Rm9vdGVyTGluZShsaW5lcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlyc3RGb290ZXJMaW5lOyBpKyspCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlyc3RGb290ZXJMaW5lOyBpKyspIHsKIAkJCXNiLmFwcGVuZChsaW5lc1tpXSkuYXBwZW5kKCdcbicpOwotCQlpZiAoZmlyc3RGb290ZXJMaW5lID09IGxpbmVzLmxlbmd0aCAmJiBtZXNzYWdlLmxlbmd0aCgpICE9IDApCisJCX0KKwkJaWYgKGZpcnN0Rm9vdGVyTGluZSA9PSBsaW5lcy5sZW5ndGggJiYgbWVzc2FnZS5sZW5ndGgoKSAhPSAwKSB7CiAJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCWFkZENvbmZsaWN0c01lc3NhZ2UoY29uZmxpY3RpbmdQYXRocywgc2IpOwotCQlpZiAoZmlyc3RGb290ZXJMaW5lIDwgbGluZXMubGVuZ3RoKQorCQl9CisJCWFkZENvbmZsaWN0c01lc3NhZ2UoY29uZmxpY3RpbmdQYXRocywgc2IsIGNvbW1lbnRDaGFyKTsKKwkJaWYgKGZpcnN0Rm9vdGVyTGluZSA8IGxpbmVzLmxlbmd0aCkgewogCQkJc2IuYXBwZW5kKCdcbicpOwotCQlmb3IgKGludCBpID0gZmlyc3RGb290ZXJMaW5lOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspCisJCX0KKwkJZm9yIChpbnQgaSA9IGZpcnN0Rm9vdGVyTGluZTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAJCQlzYi5hcHBlbmQobGluZXNbaV0pLmFwcGVuZCgnXG4nKTsKKwkJfQogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENvbmZsaWN0c01lc3NhZ2UoTGlzdDxTdHJpbmc+IGNvbmZsaWN0aW5nUGF0aHMsCi0JCQlTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgiQ29uZmxpY3RzOlxuIik7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENvbmZsaWN0c01lc3NhZ2UoSXRlcmFibGU8U3RyaW5nPiBjb25mbGljdGluZ1BhdGhzLAorCQkJU3RyaW5nQnVpbGRlciBzYiwgY2hhciBjb21tZW50Q2hhcikgeworCQlzYi5hcHBlbmQoY29tbWVudENoYXIpLmFwcGVuZCgiIENvbmZsaWN0czpcbiIpOyAvLyROT04tTkxTLTEkCiAJCWZvciAoU3RyaW5nIGNvbmZsaWN0aW5nUGF0aCA6IGNvbmZsaWN0aW5nUGF0aHMpIHsKLQkJCXNiLmFwcGVuZCgnXHQnKS5hcHBlbmQoY29uZmxpY3RpbmdQYXRoKS5hcHBlbmQoJ1xuJyk7CisJCQlzYi5hcHBlbmQoY29tbWVudENoYXIpLmFwcGVuZCgnXHQnKS5hcHBlbmQoY29uZmxpY3RpbmdQYXRoKQorCQkJCQkuYXBwZW5kKCdcbicpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhCmluZGV4IDc3Njc2NjIuLmI5YWIxZDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIsIE1hdHRoaWFzIFNvaG4gPG1hdHRoaWFzLnNvaG5Ac2FwLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAxMiwgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQKICAqIENvcHlyaWdodCAoQykgMjAxNywgT2JlbyAobWF0aGlldS5jYXJ0YXVkQG9iZW8uZnIpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjIgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3NiwxMSArMjc2LDE1IEBAIHB1YmxpYyBlbnVtIE1lcmdlRmFpbHVyZVJlYXNvbiB7CiAJcHJpdmF0ZSBDb250ZW50TWVyZ2VTdHJhdGVneSBjb250ZW50U3RyYXRlZ3kgPSBDb250ZW50TWVyZ2VTdHJhdGVneS5DT05GTElDVDsKIAogCS8qKgotCSAqIEtlZXBzIHtAbGluayBDaGVja291dE1ldGFkYXRhfSBmb3Ige0BsaW5rICNjaGVja291dCgpfSBhbmQKLQkgKiB7QGxpbmsgI2NsZWFuVXAoKX0uCisJICogS2VlcHMge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGZvciB7QGxpbmsgI2NoZWNrb3V0KCl9LgogCSAqLwogCXByaXZhdGUgTWFwPFN0cmluZywgQ2hlY2tvdXRNZXRhZGF0YT4gY2hlY2tvdXRNZXRhZGF0YTsKIAorCS8qKgorCSAqIEtlZXBzIHtAbGluayBDaGVja291dE1ldGFkYXRhfSBmb3Ige0BsaW5rICNjbGVhblVwKCl9LgorCSAqLworCXByaXZhdGUgTWFwPFN0cmluZywgQ2hlY2tvdXRNZXRhZGF0YT4gY2xlYW51cE1ldGFkYXRhOworCiAJcHJpdmF0ZSBzdGF0aWMgTWVyZ2VBbGdvcml0aG0gZ2V0TWVyZ2VBbGdvcml0aG0oQ29uZmlnIGNvbmZpZykgewogCQlTdXBwb3J0ZWRBbGdvcml0aG0gZGlmZkFsZyA9IGNvbmZpZy5nZXRFbnVtKAogCQkJCUNPTkZJR19ESUZGX1NFQ1RJT04sIG51bGwsIENPTkZJR19LRVlfQUxHT1JJVEhNLApAQCAtMzgzLDEyICszODcsMTQgQEAgcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2VJbXBsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCQlpZiAoIWluQ29yZSkgewogCQkJY2hlY2tvdXRNZXRhZGF0YSA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWNsZWFudXBNZXRhZGF0YSA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJfQogCQl0cnkgewogCQkJcmV0dXJuIG1lcmdlVHJlZXMobWVyZ2VCYXNlKCksIHNvdXJjZVRyZWVzWzBdLCBzb3VyY2VUcmVlc1sxXSwKIAkJCQkJZmFsc2UpOwogCQl9IGZpbmFsbHkgewogCQkJY2hlY2tvdXRNZXRhZGF0YSA9IG51bGw7CisJCQljbGVhbnVwTWV0YWRhdGEgPSBudWxsOwogCQkJaWYgKGltcGxpY2l0RGlyQ2FjaGUpIHsKIAkJCQlkaXJjYWNoZS51bmxvY2soKTsKIAkJCX0KQEAgLTQ0Nyw3ICs0NTMsNyBAQCBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgdGhyb3dzIE5vV29ya1RyZWVFeGNlcHRpb24sCiAJCQlEaXJDYWNoZUVudHJ5IGVudHJ5ID0gZGMuZ2V0RW50cnkobXBhdGgpOwogCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKIAkJCQlEaXJDYWNoZUNoZWNrb3V0LmNoZWNrb3V0RW50cnkoZGIsIGVudHJ5LCByZWFkZXIsIGZhbHNlLAotCQkJCQkJY2hlY2tvdXRNZXRhZGF0YS5nZXQobXBhdGgpKTsKKwkJCQkJCWNsZWFudXBNZXRhZGF0YS5nZXQobXBhdGgpKTsKIAkJCX0KIAkJCW1wYXRoc0l0LnJlbW92ZSgpOwogCQl9CkBAIC01MDEsMjIgKzUwNywyNiBAQCBwcml2YXRlIERpckNhY2hlRW50cnkga2VlcChEaXJDYWNoZUVudHJ5IGUpIHsKIAkgKiBSZW1lbWJlcnMgdGhlIHtAbGluayBDaGVja291dE1ldGFkYXRhfSBmb3IgdGhlIGdpdmVuIHBhdGg7IGl0IG1heSBiZQogCSAqIG5lZWRlZCBpbiB7QGxpbmsgI2NoZWNrb3V0KCl9IG9yIGluIHtAbGluayAjY2xlYW5VcCgpfS4KIAkgKgorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIHRvIGFkZCB0aGUgbWV0YWRhdGEgdG8KIAkgKiBAcGFyYW0gcGF0aAogCSAqICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgbm9kZQogCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogICAgICAgICAgICBmb3IgdGhlIGN1cnJlbnQgbm9kZQorCSAqICAgICAgICAgICAgdG8gdXNlIGZvciBkZXRlcm1pbmluZyB0aGUgbWV0YWRhdGEKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgdGhlIHNtdWRnZSBmaWx0ZXIgY2Fubm90IGJlIGRldGVybWluZWQKLQkgKiBAc2luY2UgNS4xCisJICogQHNpbmNlIDYuMQogCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoZWNrb3V0TWV0YWRhdGEoU3RyaW5nIHBhdGgsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja291dE1ldGFkYXRhKE1hcDxTdHJpbmcsIENoZWNrb3V0TWV0YWRhdGE+IG1hcCwKKwkJCVN0cmluZyBwYXRoLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoY2hlY2tvdXRNZXRhZGF0YSAhPSBudWxsKSB7CisJCWlmIChtYXAgIT0gbnVsbCkgewogCQkJRW9sU3RyZWFtVHlwZSBlb2wgPSBFb2xTdHJlYW1UeXBlVXRpbC5kZXRlY3RTdHJlYW1UeXBlKAotCQkJCQlPcGVyYXRpb25UeXBlLkNIRUNLT1VUX09QLCB3b3JraW5nVHJlZU9wdGlvbnMsIGF0dHJpYnV0ZXMpOworCQkJCQlPcGVyYXRpb25UeXBlLkNIRUNLT1VUX09QLCB3b3JraW5nVHJlZU9wdGlvbnMsCisJCQkJCWF0dHJpYnV0ZXMpOwogCQkJQ2hlY2tvdXRNZXRhZGF0YSBkYXRhID0gbmV3IENoZWNrb3V0TWV0YWRhdGEoZW9sLAotCQkJCQl0dy5nZXRGaWx0ZXJDb21tYW5kKENvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRSkpOwotCQkJY2hlY2tvdXRNZXRhZGF0YS5wdXQocGF0aCwgZGF0YSk7CisJCQkJCXR3LmdldFNtdWRnZUNvbW1hbmQoYXR0cmlidXRlcykpOworCQkJbWFwLnB1dChwYXRoLCBkYXRhKTsKIAkJfQogCX0KIApAQCAtNTI5LDE1ICs1MzksMTcgQEAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tvdXRNZXRhZGF0YShTdHJpbmcgcGF0aCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQogCSAqIEBwYXJhbSBlbnRyeQogCSAqICAgICAgICAgICAgdG8gYWRkCiAJICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIGZvciB0aGUgY3VycmVudCBlbnRyeQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBBdHRyaWJ1dGVzfSBvZiB0aGUgdHJlZXMKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgdGhlIHtAbGluayBDaGVja291dE1ldGFkYXRhfSBjYW5ub3QgYmUgZGV0ZXJtaW5lZAotCSAqIEBzaW5jZSA1LjEKKwkgKiBAc2luY2UgNi4xCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgYWRkVG9DaGVja291dChTdHJpbmcgcGF0aCwgRGlyQ2FjaGVFbnRyeSBlbnRyeSwKLQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCUF0dHJpYnV0ZXNbXSBhdHRyaWJ1dGVzKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG9CZUNoZWNrZWRPdXQucHV0KHBhdGgsIGVudHJ5KTsKLQkJYWRkQ2hlY2tvdXRNZXRhZGF0YShwYXRoLCBhdHRyaWJ1dGVzKTsKKwkJYWRkQ2hlY2tvdXRNZXRhZGF0YShjbGVhbnVwTWV0YWRhdGEsIHBhdGgsIGF0dHJpYnV0ZXNbVF9PVVJTXSk7CisJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2hlY2tvdXRNZXRhZGF0YSwgcGF0aCwgYXR0cmlidXRlc1tUX1RIRUlSU10pOwogCX0KIAogCS8qKgpAQCAtNTQ5LDcgKzU2MSw3IEBAIHByb3RlY3RlZCB2b2lkIGFkZFRvQ2hlY2tvdXQoU3RyaW5nIHBhdGgsIERpckNhY2hlRW50cnkgZW50cnksCiAJICogQHBhcmFtIGlzRmlsZQogCSAqICAgICAgICAgICAgd2hldGhlciBpdCBpcyBhIGZpbGUKIAkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgZm9yIHRoZSBlbnRyeQorCSAqICAgICAgICAgICAgdG8gdXNlIGZvciBkZXRlcm1pbmluZyB0aGUge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHRoZSB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0gY2Fubm90IGJlIGRldGVybWluZWQKIAkgKiBAc2luY2UgNS4xCkBAIC01NTgsNyArNTcwLDcgQEAgcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRpb24oU3RyaW5nIHBhdGgsIGJvb2xlYW4gaXNGaWxlLAogCQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0b0JlRGVsZXRlZC5hZGQocGF0aCk7CiAJCWlmIChpc0ZpbGUpIHsKLQkJCWFkZENoZWNrb3V0TWV0YWRhdGEocGF0aCwgYXR0cmlidXRlcyk7CisJCQlhZGRDaGVja291dE1ldGFkYXRhKGNsZWFudXBNZXRhZGF0YSwgcGF0aCwgYXR0cmlidXRlcyk7CiAJCX0KIAl9CiAKQEAgLTU5OSw3ICs2MTEsNyBAQCBwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGlvbihTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0ZpbGUsCiAJICogICAgICAgICAgICBzZWUKIAkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlJlc29sdmVNZXJnZXIjbWVyZ2VUcmVlcyhBYnN0cmFjdFRyZWVJdGVyYXRvciwgUmV2VHJlZSwgUmV2VHJlZSwgYm9vbGVhbil9CiAJICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoaXMgZW50cnkKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQXR0cmlidXRlc30gZm9yIHRoZSB0aHJlZSB0cmVlcwogCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBtZXJnZSB3aWxsIGZhaWwgYmVjYXVzZSB0aGUgaW5kZXggZW50cnkKIAkgKiAgICAgICAgIGRpZG4ndCBtYXRjaCBvdXJzIG9yIHRoZSB3b3JraW5nLWRpciBmaWxlIHdhcyBkaXJ0eSBhbmQgYQogCSAqICAgICAgICAgY29uZmxpY3Qgb2NjdXJyZWQKQEAgLTYwNywxMiArNjE5LDEyIEBAIHByb3RlY3RlZCB2b2lkIGFkZERlbGV0aW9uKFN0cmluZyBwYXRoLCBib29sZWFuIGlzRmlsZSwKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24KIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgNC45CisJICogQHNpbmNlIDYuMQogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQlDYW5vbmljYWxUcmVlUGFyc2VyIG91cnMsIENhbm9uaWNhbFRyZWVQYXJzZXIgdGhlaXJzLAogCQkJRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yIGluZGV4LCBXb3JraW5nVHJlZUl0ZXJhdG9yIHdvcmssCi0JCQlib29sZWFuIGlnbm9yZUNvbmZsaWN0cywgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorCQkJYm9vbGVhbiBpZ25vcmVDb25mbGljdHMsIEF0dHJpYnV0ZXNbXSBhdHRyaWJ1dGVzKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWVudGVyU3VidHJlZSA9IHRydWU7CkBAIC03MjksNyArNzQxLDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCQkvLyBCYXNlLCBvdXJzLCBhbmQgdGhlaXJzIGFsbCBjb250YWluIGEgZm9sZGVyOiBkb24ndCBkZWxldGUKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KLQkJCWFkZERlbGV0aW9uKHR3LmdldFBhdGhTdHJpbmcoKSwgbm9uVHJlZShtb2RlTyksIGF0dHJpYnV0ZXMpOworCQkJYWRkRGVsZXRpb24odHcuZ2V0UGF0aFN0cmluZygpLCBub25UcmVlKG1vZGVPKSwgYXR0cmlidXRlc1tUX09VUlNdKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAKQEAgLTc3Miw3ICs3ODQsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQlpZiAobm9uVHJlZShtb2RlTykgJiYgbm9uVHJlZShtb2RlVCkpIHsKIAkJCS8vIENoZWNrIHdvcmt0cmVlIGJlZm9yZSBtb2RpZnlpbmcgZmlsZXMKIAkJCWJvb2xlYW4gd29ya3RyZWVEaXJ0eSA9IGlzV29ya3RyZWVEaXJ0eSh3b3JrLCBvdXJEY2UpOwotCQkJaWYgKCFhdHRyaWJ1dGVzLmNhbkJlQ29udGVudE1lcmdlZCgpICYmIHdvcmt0cmVlRGlydHkpIHsKKwkJCWlmICghYXR0cmlidXRlc1tUX09VUlNdLmNhbkJlQ29udGVudE1lcmdlZCgpICYmIHdvcmt0cmVlRGlydHkpIHsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKQEAgLTc5MSw3ICs4MDMsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJCW1lcmdlUmVzdWx0cy5wdXQodHcuZ2V0UGF0aFN0cmluZygpLCByZXN1bHQpOwogCQkJCXVubWVyZ2VkUGF0aHMuYWRkKHR3LmdldFBhdGhTdHJpbmcoKSk7CiAJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKCFhdHRyaWJ1dGVzLmNhbkJlQ29udGVudE1lcmdlZCgpKSB7CisJCQl9IGVsc2UgaWYgKCFhdHRyaWJ1dGVzW1RfT1VSU10uY2FuQmVDb250ZW50TWVyZ2VkKCkpIHsKIAkJCQkvLyBGaWxlIG1hcmtlZCBhcyBiaW5hcnkKIAkJCQlzd2l0Y2ggKGdldENvbnRlbnRNZXJnZVN0cmF0ZWd5KCkpIHsKIAkJCQljYXNlIE9VUlM6CkBAIC04NDIsMTMgKzg1NCwxNiBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJaWYgKGlnbm9yZUNvbmZsaWN0cykgewogCQkJCXJlc3VsdC5zZXRDb250YWluc0NvbmZsaWN0cyhmYWxzZSk7CiAJCQl9Ci0JCQl1cGRhdGVJbmRleChiYXNlLCBvdXJzLCB0aGVpcnMsIHJlc3VsdCwgYXR0cmlidXRlcyk7CisJCQl1cGRhdGVJbmRleChiYXNlLCBvdXJzLCB0aGVpcnMsIHJlc3VsdCwgYXR0cmlidXRlc1tUX09VUlNdKTsKIAkJCVN0cmluZyBjdXJyZW50UGF0aCA9IHR3LmdldFBhdGhTdHJpbmcoKTsKIAkJCWlmIChyZXN1bHQuY29udGFpbnNDb25mbGljdHMoKSAmJiAhaWdub3JlQ29uZmxpY3RzKSB7CiAJCQkJdW5tZXJnZWRQYXRocy5hZGQoY3VycmVudFBhdGgpOwogCQkJfQogCQkJbW9kaWZpZWRGaWxlcy5hZGQoY3VycmVudFBhdGgpOwotCQkJYWRkQ2hlY2tvdXRNZXRhZGF0YShjdXJyZW50UGF0aCwgYXR0cmlidXRlcyk7CisJCQlhZGRDaGVja291dE1ldGFkYXRhKGNsZWFudXBNZXRhZGF0YSwgY3VycmVudFBhdGgsCisJCQkJCWF0dHJpYnV0ZXNbVF9PVVJTXSk7CisJCQlhZGRDaGVja291dE1ldGFkYXRhKGNoZWNrb3V0TWV0YWRhdGEsIGN1cnJlbnRQYXRoLAorCQkJCQlhdHRyaWJ1dGVzW1RfVEhFSVJTXSk7CiAJCX0gZWxzZSBpZiAobW9kZU8gIT0gbW9kZVQpIHsKIAkJCS8vIE9VUlMgb3IgVEhFSVJTIGhhcyBiZWVuIGRlbGV0ZWQKIAkJCWlmICgoKG1vZGVPICE9IDAgJiYgIXR3LmlkRXF1YWwoVF9CQVNFLCBUX09VUlMpKSB8fCAobW9kZVQgIT0gMCAmJiAhdHcKQEAgLTg4MSw3ICs4OTYsOCBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJCQkJLy8gbWFya2VycykuIEJ1dCBhbHNvIHN0YWdlIDAgb2YgdGhlIGluZGV4IGlzIGZpbGxlZAogCQkJCQkJLy8gd2l0aCB0aGF0IGNvbnRlbnQuCiAJCQkJCQlyZXN1bHQuc2V0Q29udGFpbnNDb25mbGljdHMoZmFsc2UpOwotCQkJCQkJdXBkYXRlSW5kZXgoYmFzZSwgb3VycywgdGhlaXJzLCByZXN1bHQsIGF0dHJpYnV0ZXMpOworCQkJCQkJdXBkYXRlSW5kZXgoYmFzZSwgb3VycywgdGhlaXJzLCByZXN1bHQsCisJCQkJCQkJCWF0dHJpYnV0ZXNbVF9PVVJTXSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlhZGQodHcuZ2V0UmF3UGF0aCgpLCBiYXNlLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzEsIEVQT0NILAogCQkJCQkJCQkwKTsKQEAgLTg5NiwxMSArOTEyLDkgQEAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCQkJCQlpZiAoaXNXb3JrdHJlZURpcnR5KHdvcmssIG91ckRjZSkpIHsKIAkJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJCX0KLQkJCQkJCQlpZiAobm9uVHJlZShtb2RlVCkpIHsKLQkJCQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJCQkJYWRkVG9DaGVja291dCh0dy5nZXRQYXRoU3RyaW5nKCksIGUsCi0JCQkJCQkJCQkJCWF0dHJpYnV0ZXMpOwotCQkJCQkJCQl9CisJCQkJCQkJaWYgKG5vblRyZWUobW9kZVQpICYmIGUgIT0gbnVsbCkgeworCQkJCQkJCQlhZGRUb0NoZWNrb3V0KHR3LmdldFBhdGhTdHJpbmcoKSwgZSwKKwkJCQkJCQkJCQlhdHRyaWJ1dGVzKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAKQEAgLTk0NSwxNCArOTU5LDE2IEBAIHByaXZhdGUgc3RhdGljIE1lcmdlUmVzdWx0PFN1Ym1vZHVsZUNvbmZsaWN0PiBjcmVhdGVHaXRMaW5rc01lcmdlUmVzdWx0KAogCSAqLwogCXByaXZhdGUgTWVyZ2VSZXN1bHQ8UmF3VGV4dD4gY29udGVudE1lcmdlKENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCUNhbm9uaWNhbFRyZWVQYXJzZXIgb3VycywgQ2Fub25pY2FsVHJlZVBhcnNlciB0aGVpcnMsCi0JCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIENvbnRlbnRNZXJnZVN0cmF0ZWd5IHN0cmF0ZWd5KQorCQkJQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMsIENvbnRlbnRNZXJnZVN0cmF0ZWd5IHN0cmF0ZWd5KQogCQkJdGhyb3dzIEJpbmFyeUJsb2JFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJLy8gVFc6IFRoZSBhdHRyaWJ1dGVzIGhlcmUgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBMRlMgc211ZGdlIGZpbHRlci4KKwkJLy8gSXMgZG9pbmcgYSBjb250ZW50IG1lcmdlIG9uIExGUyBpdGVtcyByZWFsbHkgYSBnb29kIGlkZWE/PwogCQlSYXdUZXh0IGJhc2VUZXh0ID0gYmFzZSA9PSBudWxsID8gUmF3VGV4dC5FTVBUWV9URVhUCi0JCQkJOiBnZXRSYXdUZXh0KGJhc2UuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzKTsKKwkJCQk6IGdldFJhd1RleHQoYmFzZS5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXNbVF9CQVNFXSk7CiAJCVJhd1RleHQgb3VyVGV4dCA9IG91cnMgPT0gbnVsbCA/IFJhd1RleHQuRU1QVFlfVEVYVAotCQkJCTogZ2V0UmF3VGV4dChvdXJzLmdldEVudHJ5T2JqZWN0SWQoKSwgYXR0cmlidXRlcyk7CisJCQkJOiBnZXRSYXdUZXh0KG91cnMuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzW1RfT1VSU10pOwogCQlSYXdUZXh0IHRoZWlyc1RleHQgPSB0aGVpcnMgPT0gbnVsbCA/IFJhd1RleHQuRU1QVFlfVEVYVAotCQkJCTogZ2V0UmF3VGV4dCh0aGVpcnMuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzKTsKKwkJCQk6IGdldFJhd1RleHQodGhlaXJzLmdldEVudHJ5T2JqZWN0SWQoKSwgYXR0cmlidXRlc1tUX1RIRUlSU10pOwogCQltZXJnZUFsZ29yaXRobS5zZXRDb250ZW50TWVyZ2VTdHJhdGVneShzdHJhdGVneSk7CiAJCXJldHVybiBtZXJnZUFsZ29yaXRobS5tZXJnZShSYXdUZXh0Q29tcGFyYXRvci5ERUZBVUxULCBiYXNlVGV4dCwKIAkJCQlvdXJUZXh0LCB0aGVpcnNUZXh0KTsKQEAgLTEzNDIsNyArMTM1OCw3IEBAIHByb3RlY3RlZCBib29sZWFuIG1lcmdlVHJlZXMoQWJzdHJhY3RUcmVlSXRlcmF0b3IgYmFzZVRyZWUsCiAKIAkJdHcgPSBuZXcgTmFtZUNvbmZsaWN0VHJlZVdhbGsoZGIsIHJlYWRlcik7CiAJCXR3LmFkZFRyZWUoYmFzZVRyZWUpOwotCQl0dy5hZGRUcmVlKGhlYWRUcmVlKTsKKwkJdHcuc2V0SGVhZCh0dy5hZGRUcmVlKGhlYWRUcmVlKSk7CiAJCXR3LmFkZFRyZWUobWVyZ2VUcmVlKTsKIAkJaW50IGRjaVBvcyA9IHR3LmFkZFRyZWUoYnVpbGRJdCk7CiAJCWlmICh3b3JraW5nVHJlZUl0ZXJhdG9yICE9IG51bGwpIHsKQEAgLTE0MDMsNiArMTQxOSwxMyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZVRyZWVXYWxrKFRyZWVXYWxrIHRyZWVXYWxrLCBib29sZWFuIGlnbm9yZUNvbmZsaWN0cykKIAkJYm9vbGVhbiBoYXNBdHRyaWJ1dGVOb2RlUHJvdmlkZXIgPSB0cmVlV2FsawogCQkJCS5nZXRBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyKCkgIT0gbnVsbDsKIAkJd2hpbGUgKHRyZWVXYWxrLm5leHQoKSkgeworCQkJQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMgPSB7IE5PX0FUVFJJQlVURVMsIE5PX0FUVFJJQlVURVMsCisJCQkJCU5PX0FUVFJJQlVURVMgfTsKKwkJCWlmIChoYXNBdHRyaWJ1dGVOb2RlUHJvdmlkZXIpIHsKKwkJCQlhdHRyaWJ1dGVzW1RfQkFTRV0gPSB0cmVlV2Fsay5nZXRBdHRyaWJ1dGVzKFRfQkFTRSk7CisJCQkJYXR0cmlidXRlc1tUX09VUlNdID0gdHJlZVdhbGsuZ2V0QXR0cmlidXRlcyhUX09VUlMpOworCQkJCWF0dHJpYnV0ZXNbVF9USEVJUlNdID0gdHJlZVdhbGsuZ2V0QXR0cmlidXRlcyhUX1RIRUlSUyk7CisJCQl9CiAJCQlpZiAoIXByb2Nlc3NFbnRyeSgKIAkJCQkJdHJlZVdhbGsuZ2V0VHJlZShUX0JBU0UsIENhbm9uaWNhbFRyZWVQYXJzZXIuY2xhc3MpLAogCQkJCQl0cmVlV2Fsay5nZXRUcmVlKFRfT1VSUywgQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcyksCkBAIC0xNDEwLDkgKzE0MzMsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZVRyZWVXYWxrKFRyZWVXYWxrIHRyZWVXYWxrLCBib29sZWFuIGlnbm9yZUNvbmZsaWN0cykKIAkJCQkJdHJlZVdhbGsuZ2V0VHJlZShUX0lOREVYLCBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IuY2xhc3MpLAogCQkJCQloYXNXb3JraW5nVHJlZUl0ZXJhdG9yID8gdHJlZVdhbGsuZ2V0VHJlZShUX0ZJTEUsCiAJCQkJCQkJV29ya2luZ1RyZWVJdGVyYXRvci5jbGFzcykgOiBudWxsLAotCQkJCQlpZ25vcmVDb25mbGljdHMsIGhhc0F0dHJpYnV0ZU5vZGVQcm92aWRlcgotCQkJCQkJCT8gdHJlZVdhbGsuZ2V0QXR0cmlidXRlcygpCi0JCQkJCQkJOiBOT19BVFRSSUJVVEVTKSkgeworCQkJCQlpZ25vcmVDb25mbGljdHMsIGF0dHJpYnV0ZXMpKSB7CiAJCQkJY2xlYW5VcCgpOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCmluZGV4IGU2Zjk1ODAuLjRlNDhhNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTM5LDcgKzEzOSw3IEBAIHB1YmxpYyB2b2lkIHZpc2l0ZWQoUmV2T2JqZWN0IG8pIHsKIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gZGF0YSBmcm9tLgogCSAqLwogCXB1YmxpYyBPYmplY3RXYWxrKFJlcG9zaXRvcnkgcmVwbykgewotCQl0aGlzKHJlcG8ubmV3T2JqZWN0UmVhZGVyKCkpOworCQl0aGlzKHJlcG8ubmV3T2JqZWN0UmVhZGVyKCksIHRydWUpOwogCX0KIAogCS8qKgpAQCAtMTUxLDcgKzE1MSwxMSBAQCBwdWJsaWMgT2JqZWN0V2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgIHJlcXVpcmVkLgogCSAqLwogCXB1YmxpYyBPYmplY3RXYWxrKE9iamVjdFJlYWRlciBvcikgewotCQlzdXBlcihvcik7CisJCXRoaXMob3IsIGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIE9iamVjdFdhbGsoT2JqZWN0UmVhZGVyIG9yLCBib29sZWFuIGNsb3NlUmVhZGVyKSB7CisJCXN1cGVyKG9yLCBjbG9zZVJlYWRlcik7CiAJCXNldFJldGFpbkJvZHkoZmFsc2UpOwogCQlyb290T2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlwZW5kaW5nT2JqZWN0cyA9IG5ldyBCbG9ja09ialF1ZXVlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQppbmRleCA4ZDU3MWY1Li5hNTBlYWYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKQEAgLTIxNSw3ICsyMTUsNyBAQCBwdWJsaWMgUmV2V2FsayhPYmplY3RSZWFkZXIgb3IpIHsKIAkJdGhpcyhvciwgZmFsc2UpOwogCX0KIAotCXByaXZhdGUgUmV2V2FsayhPYmplY3RSZWFkZXIgb3IsIGJvb2xlYW4gY2xvc2VSZWFkZXIpIHsKKwlSZXZXYWxrKE9iamVjdFJlYWRlciBvciwgYm9vbGVhbiBjbG9zZVJlYWRlcikgewogCQlyZWFkZXIgPSBvcjsKIAkJaWRCdWZmZXIgPSBuZXcgTXV0YWJsZU9iamVjdElkKCk7CiAJCW9iamVjdHMgPSBuZXcgT2JqZWN0SWRPd25lck1hcDw+KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEKaW5kZXggZmRhN2E4MS4uYzg3NzRkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcsIERhdmlkIFB1cnNlaG91c2UgPGRhdmlkLnB1cnNlaG91c2VAZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMjIgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDcgKzEwLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgpAQCAtMTksOCArMjIsOSBAQAogICogQHNpbmNlIDQuOQogICovCiBwdWJsaWMgY2xhc3MgUHVzaENvbmZpZyB7CisKIAkvKioKLQkgKiBDb25maWcgdmFsdWVzIGZvciBwdXNoLnJlY3Vyc2VTdWJtb2R1bGVzLgorCSAqIEdpdCBjb25maWcgdmFsdWVzIGZvciB7QGNvZGUgcHVzaC5yZWN1cnNlU3VibW9kdWxlc30uCiAJICovCiAJcHVibGljIGVudW0gUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSBpbXBsZW1lbnRzIENvbmZpZy5Db25maWdFbnVtIHsKIAkJLyoqCkBAIC01OSw0ICs2MywxMDAgQEAgcHVibGljIGJvb2xlYW4gbWF0Y2hDb25maWdWYWx1ZShTdHJpbmcgcykgewogCQkJCQl8fCBjb25maWdWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKHMpOwogCQl9CiAJfQorCisJLyoqCisJICogR2l0IGNvbmZpZyB2YWx1ZXMgZm9yIHtAY29kZSBwdXNoLmRlZmF1bHR9LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBlbnVtIFB1c2hEZWZhdWx0IGltcGxlbWVudHMgQ29uZmlnLkNvbmZpZ0VudW0geworCisJCS8qKgorCQkgKiBEbyBub3QgcHVzaCBpZiB0aGVyZSBhcmUgbm8gZXhwbGljaXQgcmVmc3BlY3MuCisJCSAqLworCQlOT1RISU5HLAorCisJCS8qKgorCQkgKiBQdXNoIHRoZSBjdXJyZW50IGJyYW5jaCB0byBhbiB1cHN0cmVhbSBicmFuY2ggb2YgdGhlIHNhbWUgbmFtZS4KKwkJICovCisJCUNVUlJFTlQsCisKKwkJLyoqCisJCSAqIFB1c2ggdGhlIGN1cnJlbnQgYnJhbmNoIHRvIGFuIHVwc3RyZWFtIGJyYW5jaCBkZXRlcm1pbmVkIGJ5IGdpdAorCQkgKiBjb25maWcge0Bjb2RlIGJyYW5jaC48Y3VycmVudEJyYW5jaD4ubWVyZ2V9LgorCQkgKi8KKwkJVVBTVFJFQU0oInRyYWNraW5nIiksIC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogTGlrZSB7QGxpbmsgI1VQU1RSRUFNfSwgYnV0IG9ubHkgaWYgdGhlIHVwc3RyZWFtIG5hbWUgaXMgdGhlIHNhbWUgYXMKKwkJICogdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbG9jYWwgYnJhbmNoLgorCQkgKi8KKwkJU0lNUExFLAorCisJCS8qKgorCQkgKiBQdXNoIGFsbCBjdXJyZW50IGxvY2FsIGJyYW5jaGVzIHRoYXQgbWF0Y2ggYSBjb25maWd1cmVkIHB1c2ggcmVmc3BlYworCQkgKiBvZiB0aGUgcmVtb3RlIGNvbmZpZ3VyYXRpb24uCisJCSAqLworCQlNQVRDSElORzsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZyBhbGlhczsKKworCQlwcml2YXRlIFB1c2hEZWZhdWx0KCkgeworCQkJYWxpYXMgPSBudWxsOworCQl9CisKKwkJcHJpdmF0ZSBQdXNoRGVmYXVsdChTdHJpbmcgYWxpYXMpIHsKKwkJCXRoaXMuYWxpYXMgPSBhbGlhczsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvQ29uZmlnVmFsdWUoKSB7CisJCQlyZXR1cm4gbmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBtYXRjaENvbmZpZ1ZhbHVlKFN0cmluZyBpbikgeworCQkJcmV0dXJuIHRvQ29uZmlnVmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKGluKQorCQkJCQl8fCAoYWxpYXMgIT0gbnVsbCAmJiBhbGlhcy5lcXVhbHNJZ25vcmVDYXNlKGluKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUgcmVjdXJzZVN1Ym1vZHVsZXM7CisKKwlwcml2YXRlIGZpbmFsIFB1c2hEZWZhdWx0IHB1c2hEZWZhdWx0OworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBjb25maWcKKwkgKiAgICAgICAgICAgIHtAbGluayBDb25maWd9IHRvIGZpbGwgdGhlIHtAbGluayBQdXNoQ29uZmlnfSBmcm9tCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQdXNoQ29uZmlnKENvbmZpZyBjb25maWcpIHsKKwkJcmVjdXJzZVN1Ym1vZHVsZXMgPSBjb25maWcuZ2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX1BVU0hfU0VDVElPTiwKKwkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9SRUNVUlNFX1NVQk1PRFVMRVMsCisJCQkJUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5OTyk7CisJCXB1c2hEZWZhdWx0ID0gY29uZmlnLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19QVVNIX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfREVGQVVMVCwgUHVzaERlZmF1bHQuU0lNUExFKTsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGdpdCBjb25maWcge0Bjb2RlIHB1c2gucmVjdXJzZVN1Ym1vZHVsZXN9LgorCSAqCisJICogQHJldHVybiB0aGUgdmFsdWUKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUgZ2V0UmVjdXJzZVN1Ym1vZHVsZXMoKSB7CisJCXJldHVybiByZWN1cnNlU3VibW9kdWxlczsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGdpdCBjb25maWcge0Bjb2RlIHB1c2guZGVmYXVsdH0uCisJICoKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUHVzaERlZmF1bHQgZ2V0UHVzaERlZmF1bHQoKSB7CisJCXJldHVybiBwdXNoRGVmYXVsdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQppbmRleCBhMjQ0YzU1Li45NDJkYWQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKQEAgLTE4LDExICsxOCwxNSBAQAogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuUHJlUHVzaEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKQEAgLTU4LDYgKzYyLDggQEAgY2xhc3MgUHVzaFByb2Nlc3MgewogCS8qKiBBIGxpc3Qgb2Ygb3B0aW9uIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHVzaCAqLwogCXByaXZhdGUgTGlzdDxTdHJpbmc+IHB1c2hPcHRpb25zOwogCisJcHJpdmF0ZSBmaW5hbCBQcmVQdXNoSG9vayBwcmVQdXNoOworCiAJLyoqCiAJICogQ3JlYXRlIHByb2Nlc3MgZm9yIHNwZWNpZmllZCB0cmFuc3BvcnQgYW5kIHJlZnMgdXBkYXRlcyBzcGVjaWZpY2F0aW9uLgogCSAqCkBAIC02NiwxMiArNzIsMTQgQEAgY2xhc3MgUHVzaFByb2Nlc3MgewogCSAqICAgICAgICAgICAgY29ubmVjdGlvbi4KIAkgKiBAcGFyYW0gdG9QdXNoCiAJICogICAgICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHJlZnMgdXBkYXRlcyAoYW5kIGxvY2FsIHRyYWNraW5nIGJyYW5jaGVzKS4KLQkgKgorCSAqIEBwYXJhbSBwcmVQdXNoCisJICogICAgICAgICAgICB7QGxpbmsgUHJlUHVzaEhvb2t9IHRvIHJ1biBhZnRlciB0aGUgcmVtb3RlIGFkdmVydGlzZW1lbnQgaGFzCisJICogICAgICAgICAgICBiZWVuIGdvdHRlbgogCSAqIEB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uCiAJICovCi0JUHVzaFByb2Nlc3MoZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCwKLQkJCWZpbmFsIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiB0b1B1c2gpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewotCQl0aGlzKHRyYW5zcG9ydCwgdG9QdXNoLCBudWxsKTsKKwlQdXNoUHJvY2VzcyhUcmFuc3BvcnQgdHJhbnNwb3J0LCBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdG9QdXNoLAorCQkJUHJlUHVzaEhvb2sgcHJlUHVzaCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCXRoaXModHJhbnNwb3J0LCB0b1B1c2gsIHByZVB1c2gsIG51bGwpOwogCX0KIAogCS8qKgpAQCAtODIsMTYgKzkwLDE5IEBAIGNsYXNzIFB1c2hQcm9jZXNzIHsKIAkgKiAgICAgICAgICAgIGNvbm5lY3Rpb24uCiAJICogQHBhcmFtIHRvUHVzaAogCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBvZiByZWZzIHVwZGF0ZXMgKGFuZCBsb2NhbCB0cmFja2luZyBicmFuY2hlcykuCisJICogQHBhcmFtIHByZVB1c2gKKwkgKiAgICAgICAgICAgIHtAbGluayBQcmVQdXNoSG9va30gdG8gcnVuIGFmdGVyIHRoZSByZW1vdGUgYWR2ZXJ0aXNlbWVudCBoYXMKKwkgKiAgICAgICAgICAgIGJlZW4gZ290dGVuCiAJICogQHBhcmFtIG91dAogCSAqICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIG1lc3NhZ2VzIHRvCiAJICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24KIAkgKi8KLQlQdXNoUHJvY2VzcyhmaW5hbCBUcmFuc3BvcnQgdHJhbnNwb3J0LAotCQkJZmluYWwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHRvUHVzaCwgT3V0cHV0U3RyZWFtIG91dCkKLQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCVB1c2hQcm9jZXNzKFRyYW5zcG9ydCB0cmFuc3BvcnQsIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiB0b1B1c2gsCisJCQlQcmVQdXNoSG9vayBwcmVQdXNoLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdGhpcy53YWxrZXIgPSBuZXcgUmV2V2Fsayh0cmFuc3BvcnQubG9jYWwpOwogCQl0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKIAkJdGhpcy50b1B1c2ggPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisJCXRoaXMucHJlUHVzaCA9IHByZVB1c2g7CiAJCXRoaXMub3V0ID0gb3V0OwogCQl0aGlzLnB1c2hPcHRpb25zID0gdHJhbnNwb3J0LmdldFB1c2hPcHRpb25zKCk7CiAJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaCkgewpAQCAtMTI5LDEwICsxNDAsMzggQEAgUHVzaFJlc3VsdCBleGVjdXRlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQkJCXJlcy5zZXRBZHZlcnRpc2VkUmVmcyh0cmFuc3BvcnQuZ2V0VVJJKCksIGNvbm5lY3Rpb24KIAkJCQkJCS5nZXRSZWZzTWFwKCkpOwogCQkJCXJlcy5wZWVyVXNlckFnZW50ID0gY29ubmVjdGlvbi5nZXRQZWVyVXNlckFnZW50KCk7Ci0JCQkJcmVzLnNldFJlbW90ZVVwZGF0ZXModG9QdXNoKTsKIAkJCQltb25pdG9yLmVuZFRhc2soKTsKIAorCQkJCU1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gZXhwYW5kZWQgPSBleHBhbmRNYXRjaGluZygpOworCQkJCXRvUHVzaC5jbGVhcigpOworCQkJCXRvUHVzaC5wdXRBbGwoZXhwYW5kZWQpOworCisJCQkJcmVzLnNldFJlbW90ZVVwZGF0ZXModG9QdXNoKTsKIAkJCQlmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHByZXByb2Nlc3NlZCA9IHByZXBhcmVSZW1vdGVVcGRhdGVzKCk7CisJCQkJTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHdpbGxCZUF0dGVtcHRlZCA9IHByZXByb2Nlc3NlZC52YWx1ZXMoKQorCQkJCQkJLnN0cmVhbSgpLmZpbHRlcih1IC0+IHsKKwkJCQkJCQlzd2l0Y2ggKHUuZ2V0U3RhdHVzKCkpIHsKKwkJCQkJCQljYXNlIE5PTl9FWElTVElORzoKKwkJCQkJCQljYXNlIFJFSkVDVEVEX05PREVMRVRFOgorCQkJCQkJCWNhc2UgUkVKRUNURURfTk9ORkFTVEZPUldBUkQ6CisJCQkJCQkJY2FzZSBSRUpFQ1RFRF9PVEhFUl9SRUFTT046CisJCQkJCQkJY2FzZSBSRUpFQ1RFRF9SRU1PVEVfQ0hBTkdFRDoKKwkJCQkJCQljYXNlIFVQX1RPX0RBVEU6CisJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJCWlmICghd2lsbEJlQXR0ZW1wdGVkLmlzRW1wdHkoKSkgeworCQkJCQlpZiAocHJlUHVzaCAhPSBudWxsKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXByZVB1c2guc2V0UmVmcyh3aWxsQmVBdHRlbXB0ZWQpOworCQkJCQkJCXByZVB1c2guY2FsbCgpOworCQkJCQkJfSBjYXRjaCAoQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KIAkJCQlpZiAodHJhbnNwb3J0LmlzRHJ5UnVuKCkpCiAJCQkJCW1vZGlmeVVwZGF0ZXNGb3JEcnlSdW4oKTsKIAkJCQllbHNlIGlmICghcHJlcHJvY2Vzc2VkLmlzRW1wdHkoKSkKQEAgLTIwMSwyNSArMjQwLDggQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHByZXBhcmVSZW1vdGVVcGRhdGVzKCkKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJLy8gY2hlY2sgZm9yIGZhc3QtZm9yd2FyZDoKLQkJCS8vIC0gYm90aCBvbGQgYW5kIG5ldyByZWYgbXVzdCBwb2ludCB0byBjb21taXRzLCBBTkQKLQkJCS8vIC0gYm90aCBvZiB0aGVtIG11c3QgYmUga25vd24gZm9yIHVzLCBleGlzdCBpbiByZXBvc2l0b3J5LCBBTkQKLQkJCS8vIC0gb2xkIGNvbW1pdCBtdXN0IGJlIGFuY2VzdG9yIG9mIG5ldyBjb21taXQKLQkJCWJvb2xlYW4gZmFzdEZvcndhcmQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlSZXZPYmplY3Qgb2xkUmV2ID0gd2Fsa2VyLnBhcnNlQW55KGFkdmVydGlzZWRPbGQpOwotCQkJCWZpbmFsIFJldk9iamVjdCBuZXdSZXYgPSB3YWxrZXIucGFyc2VBbnkocnJ1LmdldE5ld09iamVjdElkKCkpOwotCQkJCWlmICghKG9sZFJldiBpbnN0YW5jZW9mIFJldkNvbW1pdCkKLQkJCQkJCXx8ICEobmV3UmV2IGluc3RhbmNlb2YgUmV2Q29tbWl0KQotCQkJCQkJfHwgIXdhbGtlci5pc01lcmdlZEludG8oKFJldkNvbW1pdCkgb2xkUmV2LAotCQkJCQkJCQkoUmV2Q29tbWl0KSBuZXdSZXYpKQotCQkJCQlmYXN0Rm9yd2FyZCA9IGZhbHNlOwotCQkJfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiB4KSB7Ci0JCQkJZmFzdEZvcndhcmQgPSBmYWxzZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0JCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbih0cmFuc3BvcnQuZ2V0VVJJKCksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJSkdpdFRleHQuZ2V0KCkucmVhZGluZ09iamVjdHNGcm9tTG9jYWxSZXBvc2l0b3J5RmFpbGVkLCB4LmdldE1lc3NhZ2UoKSksIHgpOwotCQkJfQorCQkJYm9vbGVhbiBmYXN0Rm9yd2FyZCA9IGlzRmFzdEZvcndhcmQoYWR2ZXJ0aXNlZE9sZCwKKwkJCQkJcnJ1LmdldE5ld09iamVjdElkKCkpOwogCQkJcnJ1LnNldEZhc3RGb3J3YXJkKGZhc3RGb3J3YXJkKTsKIAkJCWlmICghZmFzdEZvcndhcmQgJiYgIXJydS5pc0ZvcmNlVXBkYXRlKCkpIHsKIAkJCQlycnUuc2V0U3RhdHVzKFN0YXR1cy5SRUpFQ1RFRF9OT05GQVNURk9SV0FSRCk7CkBAIC0yMzMsNiArMjU1LDEzNCBAQCBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcHJlcGFyZVJlbW90ZVVwZGF0ZXMoKQogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciBhbiB1cGRhdGUgZnJvbSB7QGNvZGUgb2xkT2lkfSB0byB7QGNvZGUgbmV3T2lkfSBpcyBhCisJICogZmFzdC1mb3J3YXJkIHVwZGF0ZToKKwkgKiA8dWw+CisJICogPGxpPmJvdGggb2xkIGFuZCBuZXcgbXVzdCBiZSBjb21taXRzLCBBTkQ8L2xpPgorCSAqIDxsaT5ib3RoIG9mIHRoZW0gbXVzdCBiZSBrbm93biB0byB1cyBhbmQgZXhpc3QgaW4gdGhlIHJlcG9zaXRvcnksCisJICogQU5EPC9saT4KKwkgKiA8bGk+dGhlIG9sZCBjb21taXQgbXVzdCBiZSBhbiBhbmNlc3RvciBvZiB0aGUgbmV3IGNvbW1pdC48L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcGFyYW0gb2xkT2lkCisJICogICAgICAgICAgICB7QGxpbmsgT2JqZWN0SWR9wqBvZiB0aGUgb2xkIGNvbW1pdAorCSAqIEBwYXJhbSBuZXdPaWQKKwkgKiAgICAgICAgICAgIHtAbGluayBPYmplY3RJZH3CoG9mIHRoZSBuZXcgY29tbWl0CisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHVwZGF0ZSBmYXN0LWZvcndhcmRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCSAqIEB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRmFzdEZvcndhcmQoT2JqZWN0SWQgb2xkT2lkLCBPYmplY3RJZCBuZXdPaWQpCisJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVJldk9iamVjdCBvbGRSZXYgPSB3YWxrZXIucGFyc2VBbnkob2xkT2lkKTsKKwkJCVJldk9iamVjdCBuZXdSZXYgPSB3YWxrZXIucGFyc2VBbnkobmV3T2lkKTsKKwkJCWlmICghKG9sZFJldiBpbnN0YW5jZW9mIFJldkNvbW1pdCkgfHwgIShuZXdSZXYgaW5zdGFuY2VvZiBSZXZDb21taXQpCisJCQkJCXx8ICF3YWxrZXIuaXNNZXJnZWRJbnRvKChSZXZDb21taXQpIG9sZFJldiwKKwkJCQkJCQkoUmV2Q29tbWl0KSBuZXdSZXYpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIHgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKwkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0LmdldFVSSSgpLAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAorCQkJCQkJCS5nZXQoKS5yZWFkaW5nT2JqZWN0c0Zyb21Mb2NhbFJlcG9zaXRvcnlGYWlsZWQsCisJCQkJCQkJeC5nZXRNZXNzYWdlKCkpLAorCQkJCQl4KTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBFeHBhbmRzIGFsbCBwbGFjZWhvbGRlciB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfXMgZm9yICJtYXRjaGluZyIKKwkgKiB7QGxpbmsgUmVmU3BlY31zICI6IiBpbiB7QGxpbmsgI3RvUHVzaH0gYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBtYXAgaW4KKwkgKiB3aGljaCB0aGUgcGxhY2Vob2xkZXJzIGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGVpciBleHBhbnNpb24uCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IG1hcCBvZiB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfXMga2V5ZWQgYnkgcmVtb3RlIG5hbWUKKwkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBleHBhbnNpb24gcmVzdWx0cyBpbiBkdXBsaWNhdGUgdXBkYXRlcworCSAqLworCXByaXZhdGUgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBleHBhbmRNYXRjaGluZygpCisJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisJCWJvb2xlYW4gaGFkTWF0Y2ggPSBmYWxzZTsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdXBkYXRlIDogdG9QdXNoLnZhbHVlcygpKSB7CisJCQlpZiAodXBkYXRlLmlzTWF0Y2hpbmcoKSkgeworCQkJCWlmIChoYWRNYXRjaCkgeworCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZVJlbW90ZVJlZlVwZGF0ZUlzSWxsZWdhbCwKKwkJCQkJCQkiOiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlleHBhbmRNYXRjaGluZyhyZXN1bHQsIHVwZGF0ZSk7CisJCQkJaGFkTWF0Y2ggPSB0cnVlOworCQkJfSBlbHNlIGlmIChyZXN1bHQucHV0KHVwZGF0ZS5nZXRSZW1vdGVOYW1lKCksIHVwZGF0ZSkgIT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVSZW1vdGVSZWZVcGRhdGVJc0lsbGVnYWwsCisJCQkJCQl1cGRhdGUuZ2V0UmVtb3RlTmFtZSgpKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBFeHBhbmRzIHRoZSBwbGFjZWhvbGRlciB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfSB7QGNvZGUgbWF0Y2h9IGZvciBhCisJICogIm1hdGNoaW5nIiB7QGxpbmsgUmVmU3BlY30gIjoiIG9yICIrOiIgYW5kIHB1dHMgdGhlIGV4cGFuc2lvbiBpbnRvIHRoZQorCSAqIGdpdmVuIG1hcCB7QGNvZGUgdXBkYXRlc30uCisJICoKKwkgKiBAcGFyYW0gdXBkYXRlcworCSAqICAgICAgICAgICAgbWFwIHRvIHB1dCB0aGUgZXhwYW5zaW9uIGluCisJICogQHBhcmFtIG1hdGNoCisJICogICAgICAgICAgICB0aGUgcGxhY2Vob2xkZXIge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX0gdG8gZXhwYW5kCisJICoKKwkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBleHBhbnNpb24gcmVzdWx0cyBpbiBkdXBsaWNhdGUgdXBkYXRlcywgb3IgdGhlIGxvY2FsCisJICogICAgICAgICAgICAgYnJhbmNoZXMgY2Fubm90IGJlIGRldGVybWluZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgZXhwYW5kTWF0Y2hpbmcoTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzLAorCQkJUmVtb3RlUmVmVXBkYXRlIG1hdGNoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCU1hcDxTdHJpbmcsIFJlZj4gYWR2ZXJ0aXNlbWVudCA9IGNvbm5lY3Rpb24uZ2V0UmVmc01hcCgpOworCQkJQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzID0gbWF0Y2guZ2V0RmV0Y2hTcGVjcygpOworCQkJYm9vbGVhbiBmb3JjZVVwZGF0ZSA9IG1hdGNoLmlzRm9yY2VVcGRhdGUoKTsKKwkJCWZvciAoUmVmIGxvY2FsIDogdHJhbnNwb3J0LmxvY2FsLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkJLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9IRUFEUykpIHsKKwkJCQlpZiAobG9jYWwuaXNTeW1ib2xpYygpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlTdHJpbmcgbmFtZSA9IGxvY2FsLmdldE5hbWUoKTsKKwkJCQlSZWYgYWR2ZXJ0aXNlZCA9IGFkdmVydGlzZW1lbnQuZ2V0KG5hbWUpOworCQkJCWlmIChhZHZlcnRpc2VkID09IG51bGwgfHwgYWR2ZXJ0aXNlZC5pc1N5bWJvbGljKCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCU9iamVjdElkIG9sZE9pZCA9IGFkdmVydGlzZWQuZ2V0T2JqZWN0SWQoKTsKKwkJCQlpZiAob2xkT2lkID09IG51bGwgfHwgT2JqZWN0SWQuemVyb0lkKCkuZXF1YWxzKG9sZE9pZCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCU9iamVjdElkIG5ld09pZCA9IGxvY2FsLmdldE9iamVjdElkKCk7CisJCQkJaWYgKG5ld09pZCA9PSBudWxsIHx8IE9iamVjdElkLnplcm9JZCgpLmVxdWFscyhuZXdPaWQpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCVJlbW90ZVJlZlVwZGF0ZSBycnUgPSBuZXcgUmVtb3RlUmVmVXBkYXRlKHRyYW5zcG9ydC5sb2NhbCwgbmFtZSwKKwkJCQkJCW5ld09pZCwgbmFtZSwgZm9yY2VVcGRhdGUsCisJCQkJCQlUcmFuc3BvcnQuZmluZFRyYWNraW5nUmVmTmFtZShuYW1lLCBmZXRjaFNwZWNzKSwKKwkJCQkJCW9sZE9pZCk7CisJCQkJaWYgKHVwZGF0ZXMucHV0KHJydS5nZXRSZW1vdGVOYW1lKCksIHJydSkgIT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZVJlbW90ZVJlZlVwZGF0ZUlzSWxsZWdhbCwKKwkJCQkJCQlycnUuZ2V0UmVtb3RlTmFtZSgpKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CisJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydC5nZXRVUkkoKSwKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQKKwkJCQkJCQkuZ2V0KCkucmVhZGluZ09iamVjdHNGcm9tTG9jYWxSZXBvc2l0b3J5RmFpbGVkLAorCQkJCQkJCXguZ2V0TWVzc2FnZSgpKSwKKwkJCQkJeCk7CisJCX0KKwl9CisKIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVqZWN0QWxsKCkgewogCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLk5PVF9BVFRFTVBURUQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQppbmRleCBhYzM1N2FmLi41NmQwMDM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCkBAIC0xMiwxMSArMTIsMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SZWZlcmVuY2VzOwogCiAvKioKICAqIERlc2NyaWJlcyBob3cgcmVmcyBpbiBvbmUgcmVwb3NpdG9yeSBjb3B5IGludG8gYW5vdGhlciByZXBvc2l0b3J5LgpAQCAtNTAsNiArNTAsOSBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaWxkY2FyZChTdHJpbmcgcykgewogCS8qKiBJcyB0aGlzIHNwZWNpZmljYXRpb24gYWN0dWFsbHkgYSB3aWxkY2FyZCBtYXRjaD8gKi8KIAlwcml2YXRlIGJvb2xlYW4gd2lsZGNhcmQ7CiAKKwkvKiogSXMgdGhpcyB0aGUgc3BlY2lhbCAiOiIgUmVmU3BlYz8gKi8KKwlwcml2YXRlIGJvb2xlYW4gbWF0Y2hpbmc7CisKIAkvKioKIAkgKiBIb3cgc3RyaWN0IHRvIGJlIGFib3V0IHdpbGRjYXJkcy4KIAkgKgpAQCAtNzEsNiArNzQsNyBAQCBwdWJsaWMgZW51bSBXaWxkY2FyZE1vZGUgewogCQkgKi8KIAkJQUxMT1dfTUlTTUFUQ0gKIAl9CisKIAkvKiogV2hldGhlciBhIHdpbGRjYXJkIGlzIGFsbG93ZWQgb24gb25lIHNpZGUgYnV0IG5vdCB0aGUgb3RoZXIuICovCiAJcHJpdmF0ZSBXaWxkY2FyZE1vZGUgYWxsb3dNaXNtYXRjaGVkV2lsZGNhcmRzOwogCkBAIC04Nyw2ICs5MSw3IEBAIHB1YmxpYyBlbnVtIFdpbGRjYXJkTW9kZSB7CiAJICogYXBwbGljYXRpb25zLCBhcyBhdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBzZXQgdG8gbWF0Y2ggYSBzb3VyY2UgbmFtZS4KIAkgKi8KIAlwdWJsaWMgUmVmU3BlYygpIHsKKwkJbWF0Y2hpbmcgPSBmYWxzZTsKIAkJZm9yY2UgPSBmYWxzZTsKIAkJd2lsZGNhcmQgPSBmYWxzZTsKIAkJc3JjTmFtZSA9IENvbnN0YW50cy5IRUFEOwpAQCAtMTMzLDE3ICsxMzgsMjUgQEAgcHVibGljIFJlZlNwZWMoU3RyaW5nIHNwZWMsIFdpbGRjYXJkTW9kZSBtb2RlKSB7CiAJCQlzID0gcy5zdWJzdHJpbmcoMSk7CiAJCX0KIAorCQlib29sZWFuIG1hdGNoUHVzaFNwZWMgPSBmYWxzZTsKIAkJZmluYWwgaW50IGMgPSBzLmxhc3RJbmRleE9mKCc6Jyk7CiAJCWlmIChjID09IDApIHsKIAkJCXMgPSBzLnN1YnN0cmluZygxKTsKLQkJCWlmIChpc1dpbGRjYXJkKHMpKSB7CisJCQlpZiAocy5pc0VtcHR5KCkpIHsKKwkJCQltYXRjaFB1c2hTcGVjID0gdHJ1ZTsKIAkJCQl3aWxkY2FyZCA9IHRydWU7Ci0JCQkJaWYgKG1vZGUgPT0gV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkV2lsZGNhcmRzLCBzcGVjKSk7CisJCQkJc3JjTmFtZSA9IENvbnN0YW50cy5SX0hFQURTICsgJyonOworCQkJCWRzdE5hbWUgPSBzcmNOYW1lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaXNXaWxkY2FyZChzKSkgeworCQkJCQl3aWxkY2FyZCA9IHRydWU7CisJCQkJCWlmIChtb2RlID09IFdpbGRjYXJkTW9kZS5SRVFVSVJFX01BVENIKSB7CisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkV2lsZGNhcmRzLCBzcGVjKSk7CisJCQkJCX0KIAkJCQl9CisJCQkJZHN0TmFtZSA9IGNoZWNrVmFsaWQocyk7CiAJCQl9Ci0JCQlkc3ROYW1lID0gY2hlY2tWYWxpZChzKTsKIAkJfSBlbHNlIGlmIChjID4gMCkgewogCQkJU3RyaW5nIHNyYyA9IHMuc3Vic3RyaW5nKDAsIGMpOwogCQkJU3RyaW5nIGRzdCA9IHMuc3Vic3RyaW5nKGMgKyAxKTsKQEAgLTE2OCw2ICsxODEsNyBAQCBwdWJsaWMgUmVmU3BlYyhTdHJpbmcgc3BlYywgV2lsZGNhcmRNb2RlIG1vZGUpIHsKIAkJCX0KIAkJCXNyY05hbWUgPSBjaGVja1ZhbGlkKHMpOwogCQl9CisJCW1hdGNoaW5nID0gbWF0Y2hQdXNoU3BlYzsKIAl9CiAKIAkvKioKQEAgLTE5NSw2ICsyMDksNyBAQCBwdWJsaWMgUmVmU3BlYyhTdHJpbmcgc3BlYykgewogCX0KIAogCXByaXZhdGUgUmVmU3BlYyhSZWZTcGVjIHApIHsKKwkJbWF0Y2hpbmcgPSBmYWxzZTsKIAkJZm9yY2UgPSBwLmlzRm9yY2VVcGRhdGUoKTsKIAkJd2lsZGNhcmQgPSBwLmlzV2lsZGNhcmQoKTsKIAkJc3JjTmFtZSA9IHAuZ2V0U291cmNlKCk7CkBAIC0yMDMsNiArMjE4LDE3IEBAIHByaXZhdGUgUmVmU3BlYyhSZWZTcGVjIHApIHsKIAl9CiAKIAkvKioKKwkgKiBUZWxscyB3aGV0aGVyIHRoaXMge0BsaW5rIFJlZlNwZWN9IGlzIHRoZSBzcGVjaWFsICJtYXRjaGluZyIgUmVmU3BlYyAiOiIKKwkgKiBmb3IgcHVzaGluZy4KKwkgKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgIm1hdGNoaW5nIiBSZWZTcGVjCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmcoKSB7CisJCXJldHVybiBtYXRjaGluZzsKKwl9CisKKwkvKioKIAkgKiBDaGVjayBpZiB0aGlzIHNwZWNpZmljYXRpb24gd2FudHMgdG8gZm9yY2VmdWxseSB1cGRhdGUgdGhlIGRlc3RpbmF0aW9uLgogCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgc3BlY2lmaWNhdGlvbiBhc2tzIGZvciB1cGRhdGVzIHdpdGhvdXQgbWVyZ2UgdGVzdHMuCkBAIC0yMjAsNiArMjQ2LDcgQEAgcHVibGljIGJvb2xlYW4gaXNGb3JjZVVwZGF0ZSgpIHsKIAkgKi8KIAlwdWJsaWMgUmVmU3BlYyBzZXRGb3JjZVVwZGF0ZShib29sZWFuIGZvcmNlVXBkYXRlKSB7CiAJCWZpbmFsIFJlZlNwZWMgciA9IG5ldyBSZWZTcGVjKHRoaXMpOworCQlyLm1hdGNoaW5nID0gbWF0Y2hpbmc7CiAJCXIuZm9yY2UgPSBmb3JjZVVwZGF0ZTsKIAkJcmV0dXJuIHI7CiAJfQpAQCAtMzIyLDggKzM0OSw3IEBAIHB1YmxpYyBSZWZTcGVjIHNldERlc3RpbmF0aW9uKFN0cmluZyBkZXN0aW5hdGlvbikgewogCSAqICAgICAgICAgICAgIFRoZSB3aWxkY2FyZCBzdGF0dXMgb2YgdGhlIG5ldyBzb3VyY2UgZGlzYWdyZWVzIHdpdGggdGhlCiAJICogICAgICAgICAgICAgd2lsZGNhcmQgc3RhdHVzIG9mIHRoZSBuZXcgZGVzdGluYXRpb24uCiAJICovCi0JcHVibGljIFJlZlNwZWMgc2V0U291cmNlRGVzdGluYXRpb24oZmluYWwgU3RyaW5nIHNvdXJjZSwKLQkJCWZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbikgeworCXB1YmxpYyBSZWZTcGVjIHNldFNvdXJjZURlc3RpbmF0aW9uKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZXN0aW5hdGlvbikgewogCQlpZiAoaXNXaWxkY2FyZChzb3VyY2UpICE9IGlzV2lsZGNhcmQoZGVzdGluYXRpb24pKQogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5zb3VyY2VEZXN0aW5hdGlvbk11c3RNYXRjaCk7CiAJCWZpbmFsIFJlZlNwZWMgciA9IG5ldyBSZWZTcGVjKHRoaXMpOwpAQCAtNTQxLDM3ICs1NjcsMzYgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAkJaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmU3BlYykpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWZpbmFsIFJlZlNwZWMgYiA9IChSZWZTcGVjKSBvYmo7Ci0JCWlmIChpc0ZvcmNlVXBkYXRlKCkgIT0gYi5pc0ZvcmNlVXBkYXRlKCkpCisJCWlmIChpc0ZvcmNlVXBkYXRlKCkgIT0gYi5pc0ZvcmNlVXBkYXRlKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzV2lsZGNhcmQoKSAhPSBiLmlzV2lsZGNhcmQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFlcShnZXRTb3VyY2UoKSwgYi5nZXRTb3VyY2UoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZXEoZ2V0RGVzdGluYXRpb24oKSwgYi5nZXREZXN0aW5hdGlvbigpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJaWYgKFJlZmVyZW5jZXMuaXNTYW1lT2JqZWN0KGEsIGIpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKKwkJaWYgKGlzTWF0Y2hpbmcoKSkgeworCQkJcmV0dXJuIGIuaXNNYXRjaGluZygpOworCQl9IGVsc2UgaWYgKGIuaXNNYXRjaGluZygpKSB7CiAJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhLmVxdWFscyhiKTsKKwkJfQorCQlyZXR1cm4gaXNXaWxkY2FyZCgpID09IGIuaXNXaWxkY2FyZCgpCisJCQkJJiYgT2JqZWN0cy5lcXVhbHMoZ2V0U291cmNlKCksIGIuZ2V0U291cmNlKCkpCisJCQkJJiYgT2JqZWN0cy5lcXVhbHMoZ2V0RGVzdGluYXRpb24oKSwgYi5nZXREZXN0aW5hdGlvbigpKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWlmIChpc0ZvcmNlVXBkYXRlKCkpCisJCWlmIChpc0ZvcmNlVXBkYXRlKCkpIHsKIAkJCXIuYXBwZW5kKCcrJyk7Ci0JCWlmIChnZXRTb3VyY2UoKSAhPSBudWxsKQotCQkJci5hcHBlbmQoZ2V0U291cmNlKCkpOwotCQlpZiAoZ2V0RGVzdGluYXRpb24oKSAhPSBudWxsKSB7CisJCX0KKwkJaWYgKGlzTWF0Y2hpbmcoKSkgewogCQkJci5hcHBlbmQoJzonKTsKLQkJCXIuYXBwZW5kKGdldERlc3RpbmF0aW9uKCkpOworCQl9IGVsc2UgeworCQkJaWYgKGdldFNvdXJjZSgpICE9IG51bGwpIHsKKwkJCQlyLmFwcGVuZChnZXRTb3VyY2UoKSk7CisJCQl9CisJCQlpZiAoZ2V0RGVzdGluYXRpb24oKSAhPSBudWxsKSB7CisJCQkJci5hcHBlbmQoJzonKTsKKwkJCQlyLmFwcGVuZChnZXREZXN0aW5hdGlvbigpKTsKKwkJCX0KIAkJfQogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKaW5kZXggNDNlYWFjNy4uMjE4ZTYyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKQEAgLTEyLDcgKzEyLDkgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CkBAIC0xMTYsNiArMTE4LDEyIEBAIHB1YmxpYyBlbnVtIFN0YXR1cyB7CiAJcHJpdmF0ZSBSZWZVcGRhdGUgbG9jYWxVcGRhdGU7CiAKIAkvKioKKwkgKiBJZiBzZXQsIHRoZSBSZW1vdGVSZWZVcGRhdGUgaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlICJtYXRjaGluZyIgUmVmU3BlYworCSAqIHRvIGJlIGV4cGFuZGVkIGFmdGVyIHRoZSBhZHZlcnRpc2VtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQgaW4gYSBwdXNoLgorCSAqLworCXByaXZhdGUgQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzOworCisJLyoqCiAJICogQ29uc3RydWN0IHJlbW90ZSByZWYgdXBkYXRlIHJlcXVlc3QgYnkgcHJvdmlkaW5nIGFuIHVwZGF0ZSBzcGVjaWZpY2F0aW9uLgogCSAqIE9iamVjdCBpcyBjcmVhdGVkIHdpdGggZGVmYXVsdAogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVSZWZVcGRhdGUuU3RhdHVzI05PVF9BVFRFTVBURUR9CkBAIC0xNTcsOSArMTY1LDggQEAgcHVibGljIGVudW0gU3RhdHVzIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBzb21lIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbnVsbAogCSAqLwotCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbERiLCBmaW5hbCBTdHJpbmcgc3JjUmVmLAotCQkJZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsIGZpbmFsIGJvb2xlYW4gZm9yY2VVcGRhdGUsCi0JCQlmaW5hbCBTdHJpbmcgbG9jYWxOYW1lLCBmaW5hbCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKQorCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoUmVwb3NpdG9yeSBsb2NhbERiLCBTdHJpbmcgc3JjUmVmLCBTdHJpbmcgcmVtb3RlTmFtZSwKKwkJCWJvb2xlYW4gZm9yY2VVcGRhdGUsIFN0cmluZyBsb2NhbE5hbWUsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKGxvY2FsRGIsIHNyY1JlZiwgc3JjUmVmICE9IG51bGwgPyBsb2NhbERiLnJlc29sdmUoc3JjUmVmKQogCQkJCTogT2JqZWN0SWQuemVyb0lkKCksIHJlbW90ZU5hbWUsIGZvcmNlVXBkYXRlLCBsb2NhbE5hbWUsCkBAIC0yMDMsOSArMjEwLDggQEAgcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsRGIsIGZpbmFsIFN0cmluZyBzcmNSZWYsCiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgc29tZSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG51bGwKIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWxEYiwgZmluYWwgUmVmIHNyY1JlZiwKLQkJCWZpbmFsIFN0cmluZyByZW1vdGVOYW1lLCBmaW5hbCBib29sZWFuIGZvcmNlVXBkYXRlLAotCQkJZmluYWwgU3RyaW5nIGxvY2FsTmFtZSwgZmluYWwgT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKFJlcG9zaXRvcnkgbG9jYWxEYiwgUmVmIHNyY1JlZiwgU3RyaW5nIHJlbW90ZU5hbWUsCisJCQlib29sZWFuIGZvcmNlVXBkYXRlLCBTdHJpbmcgbG9jYWxOYW1lLCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcyhsb2NhbERiLCBzcmNSZWYgIT0gbnVsbCA/IHNyY1JlZi5nZXROYW1lKCkgOiBudWxsLAogCQkJCXNyY1JlZiAhPSBudWxsID8gc3JjUmVmLmdldE9iamVjdElkKCkgOiBudWxsLCByZW1vdGVOYW1lLApAQCAtMjU1LDI4ICsyNjEsNDEgQEAgcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsRGIsIGZpbmFsIFJlZiBzcmNSZWYsCiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgc29tZSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG51bGwKIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWxEYiwgZmluYWwgU3RyaW5nIHNyY1JlZiwKLQkJCWZpbmFsIE9iamVjdElkIHNyY0lkLCBmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwKLQkJCWZpbmFsIGJvb2xlYW4gZm9yY2VVcGRhdGUsIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlmaW5hbCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAocmVtb3RlTmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5yZW1vdGVOYW1lQ2Fubm90QmVOdWxsKTsKLQkJaWYgKHNyY0lkID09IG51bGwgJiYgc3JjUmVmICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCUpHaXRUZXh0LmdldCgpLnNvdXJjZVJlZkRvZXNudFJlc29sdmVUb0FueU9iamVjdCwgc3JjUmVmKSk7CisJcHVibGljIFJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIFN0cmluZyBzcmNSZWYsIE9iamVjdElkIHNyY0lkLAorCQkJU3RyaW5nIHJlbW90ZU5hbWUsIGJvb2xlYW4gZm9yY2VVcGRhdGUsIFN0cmluZyBsb2NhbE5hbWUsCisJCQlPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0aGlzKGxvY2FsRGIsIHNyY1JlZiwgc3JjSWQsIHJlbW90ZU5hbWUsIGZvcmNlVXBkYXRlLCBsb2NhbE5hbWUsIG51bGwsCisJCQkJZXhwZWN0ZWRPbGRPYmplY3RJZCk7CisJfQogCi0JCWlmIChzcmNSZWYgIT0gbnVsbCkKKwlwcml2YXRlIFJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIFN0cmluZyBzcmNSZWYsIE9iamVjdElkIHNyY0lkLAorCQkJU3RyaW5nIHJlbW90ZU5hbWUsIGJvb2xlYW4gZm9yY2VVcGRhdGUsIFN0cmluZyBsb2NhbE5hbWUsCisJCQlDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoZmV0Y2hTcGVjcyA9PSBudWxsKSB7CisJCQlpZiAocmVtb3RlTmFtZSA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCUpHaXRUZXh0LmdldCgpLnJlbW90ZU5hbWVDYW5ub3RCZU51bGwpOworCQkJfQorCQkJaWYgKHNyY0lkID09IG51bGwgJiYgc3JjUmVmICE9IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5zb3VyY2VSZWZEb2VzbnRSZXNvbHZlVG9BbnlPYmplY3QsCisJCQkJCQlzcmNSZWYpKTsKKwkJCX0KKwkJfQorCQlpZiAoc3JjUmVmICE9IG51bGwpIHsKIAkJCXRoaXMuc3JjUmVmID0gc3JjUmVmOwotCQllbHNlIGlmIChzcmNJZCAhPSBudWxsICYmICFzcmNJZC5lcXVhbHMoT2JqZWN0SWQuemVyb0lkKCkpKQorCQl9IGVsc2UgaWYgKHNyY0lkICE9IG51bGwgJiYgIXNyY0lkLmVxdWFscyhPYmplY3RJZC56ZXJvSWQoKSkpIHsKIAkJCXRoaXMuc3JjUmVmID0gc3JjSWQubmFtZSgpOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQl0aGlzLnNyY1JlZiA9IG51bGw7Ci0KLQkJaWYgKHNyY0lkICE9IG51bGwpCisJCX0KKwkJaWYgKHNyY0lkICE9IG51bGwpIHsKIAkJCXRoaXMubmV3T2JqZWN0SWQgPSBzcmNJZDsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJdGhpcy5uZXdPYmplY3RJZCA9IE9iamVjdElkLnplcm9JZCgpOwotCisJCX0KKwkJdGhpcy5mZXRjaFNwZWNzID0gZmV0Y2hTcGVjczsKIAkJdGhpcy5yZW1vdGVOYW1lID0gcmVtb3RlTmFtZTsKIAkJdGhpcy5mb3JjZVVwZGF0ZSA9IGZvcmNlVXBkYXRlOwogCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxEYiAhPSBudWxsKSB7CkBAIC0yOTIsOCArMzExLDkgQEAgZWxzZSBpZiAoc3JjSWQgIT0gbnVsbCAmJiAhc3JjSWQuZXF1YWxzKE9iamVjdElkLnplcm9JZCgpKSkKIAkJCQkJCT8gbG9jYWxVcGRhdGUuZ2V0T2xkT2JqZWN0SWQoKQogCQkJCQkJOiBPYmplY3RJZC56ZXJvSWQoKSwKIAkJCQkJbmV3T2JqZWN0SWQpOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXRyYWNraW5nUmVmVXBkYXRlID0gbnVsbDsKKwkJfQogCQl0aGlzLmxvY2FsRGIgPSBsb2NhbERiOwogCQl0aGlzLmV4cGVjdGVkT2xkT2JqZWN0SWQgPSBleHBlY3RlZE9sZE9iamVjdElkOwogCQl0aGlzLnN0YXR1cyA9IFN0YXR1cy5OT1RfQVRURU1QVEVEOwpAQCAtMzE2LDExICszMzYsNTcgQEAgZWxzZSBpZiAoc3JjSWQgIT0gbnVsbCAmJiAhc3JjSWQuZXF1YWxzKE9iamVjdElkLnplcm9JZCgpKSkKIAkgKiAgICAgICAgICAgICBsb2NhbCB0cmFja2luZyBicmFuY2ggb3Igc3JjUmVmIG9mIGJhc2Ugb2JqZWN0IG5vIGxvbmdlciBjYW4KIAkgKiAgICAgICAgICAgICBiZSByZXNvbHZlZCB0byBhbnkgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVtb3RlUmVmVXBkYXRlIGJhc2UsCi0JCQlmaW5hbCBPYmplY3RJZCBuZXdFeHBlY3RlZE9sZE9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzKGJhc2UubG9jYWxEYiwgYmFzZS5zcmNSZWYsIGJhc2UucmVtb3RlTmFtZSwgYmFzZS5mb3JjZVVwZGF0ZSwKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKFJlbW90ZVJlZlVwZGF0ZSBiYXNlLAorCQkJT2JqZWN0SWQgbmV3RXhwZWN0ZWRPbGRPYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdGhpcyhiYXNlLmxvY2FsRGIsIGJhc2Uuc3JjUmVmLCBiYXNlLm5ld09iamVjdElkLCBiYXNlLnJlbW90ZU5hbWUsCisJCQkJYmFzZS5mb3JjZVVwZGF0ZSwKIAkJCQkoYmFzZS50cmFja2luZ1JlZlVwZGF0ZSA9PSBudWxsID8gbnVsbCA6IGJhc2UudHJhY2tpbmdSZWZVcGRhdGUKLQkJCQkJCS5nZXRMb2NhbE5hbWUoKSksIG5ld0V4cGVjdGVkT2xkT2JqZWN0SWQpOworCQkJCQkJLmdldExvY2FsTmFtZSgpKSwKKwkJCQliYXNlLmZldGNoU3BlY3MsIG5ld0V4cGVjdGVkT2xkT2JqZWN0SWQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSAicGxhY2Vob2xkZXIiIHVwZGF0ZSBmb3IgdGhlICJtYXRjaGluZyIgUmVmU3BlYyAiOiIuCisJICoKKwkgKiBAcGFyYW0gbG9jYWxEYgorCSAqICAgICAgICAgICAgbG9jYWwgcmVwb3NpdG9yeSB0byBwdXNoIGZyb20KKwkgKiBAcGFyYW0gZm9yY2VVcGRhdGUKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgbm9uLWZhc3QtZm9yd2FyZCB1cGRhdGVzIHNoYWxsIGJlIGFsbG93ZWQKKwkgKiBAcGFyYW0gZmV0Y2hTcGVjcworCSAqICAgICAgICAgICAgVGhlIGZldGNoIHtAbGluayBSZWZTcGVjfXMgdG8gdXNlIHdoZW4gdGhpcyBwbGFjZWhvbGRlciBpcworCSAqICAgICAgICAgICAgZXhwYW5kZWQgdG8gZGV0ZXJtaW5lIHJlbW90ZSB0cmFja2luZyBicmFuY2ggdXBkYXRlcworCSAqLworCVJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIGJvb2xlYW4gZm9yY2VVcGRhdGUsCisJCQlATm9uTnVsbCBDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MpIHsKKwkJdGhpcy5sb2NhbERiID0gbG9jYWxEYjsKKwkJdGhpcy5mb3JjZVVwZGF0ZSA9IGZvcmNlVXBkYXRlOworCQl0aGlzLmZldGNoU3BlY3MgPSBmZXRjaFNwZWNzOworCQl0aGlzLnRyYWNraW5nUmVmVXBkYXRlID0gbnVsbDsKKwkJdGhpcy5zcmNSZWYgPSBudWxsOworCQl0aGlzLnJlbW90ZU5hbWUgPSBudWxsOworCQl0aGlzLm5ld09iamVjdElkID0gbnVsbDsKKwkJdGhpcy5zdGF0dXMgPSBTdGF0dXMuTk9UX0FUVEVNUFRFRDsKKwl9CisKKwkvKioKKwkgKiBUZWxscyB3aGV0aGVyIHRoaXMge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX0gaXMgYSBwbGFjZWhvbGRlciBmb3IgYQorCSAqICJtYXRjaGluZyIge0BsaW5rIFJlZlNwZWN9LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nKCkgeworCQlyZXR1cm4gZmV0Y2hTcGVjcyAhPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgZmV0Y2gge0BsaW5rIFJlZlNwZWN9cyBvZiB0aGlzIHtAbGluayBSZW1vdGVSZWZVcGRhdGV9LgorCSAqCisJICogQHJldHVybiB0aGUgZmV0Y2gge0BsaW5rIFJlZlNwZWN9cywgb3Ige0Bjb2RlIG51bGx9IGlmCisJICogICAgICAgICB7QGNvZGUgdGhpcy59e0BsaW5rICNpc01hdGNoaW5nKCl9IHtAY29kZSA9PSBmYWxzZX0KKwkgKi8KKwlDb2xsZWN0aW9uPFJlZlNwZWM+IGdldEZldGNoU3BlY3MoKSB7CisJCXJldHVybiBmZXRjaFNwZWNzOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YQppbmRleCAyMTJhNGU0Li40OGNhY2YwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjAgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtNDQsNiArNDQsMTQgQEAgcHJpdmF0ZSBTc2hDb25zdGFudHMoKSB7CiAKIAkvLyBDb25maWcgZmlsZSBrZXlzCiAKKwkvKioKKwkgKiBQcm9wZXJ0eSB0byBjb250cm9sIHdoZXRoZXIgcHJpdmF0ZSBrZXlzIGFyZSBhZGRlZCB0byBhbiBTU0ggYWdlbnQsIGlmCisJICogb25lIGlzIHJ1bm5pbmcsIGFmdGVyIGhhdmluZyBiZWVuIGxvYWRlZC4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfS0VZU19UT19BR0VOVCA9ICJBZGRLZXlzVG9BZ2VudCI7CisKIAkvKiogS2V5IGluIGFuIHNzaCBjb25maWcgZmlsZS4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVRDSF9NT0RFID0gIkJhdGNoTW9kZSI7CiAKQEAgLTYyLDYgKzcwLDE1IEBAIHByaXZhdGUgU3NoQ29uc3RhbnRzKCkgewogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fQVRURU1QVFMgPSAiQ29ubmVjdGlvbkF0dGVtcHRzIjsKIAorCS8qKgorCSAqIEFuIE9wZW5TU0ggdGltZSB2YWx1ZSBmb3IgdGhlIGNvbm5lY3Rpb24gdGltZW91dC4gSW4gT3BlblNTSCwgdGhpcworCSAqIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgaW5pdGlhbCBrZXkgZXhjaGFuZ2U7IGluIEpHaXQgaXQKKwkgKiBjb3ZlcnMgb25seSB0aGUgdW5kZXJseWluZyBUQ1AgY29ubmVjdC4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUX1RJTUVPVVQgPSAiQ29ubmVjdFRpbWVvdXQiOworCiAJLyoqIEtleSBpbiBhbiBzc2ggY29uZmlnIGZpbGUuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9QQVRIID0gIkNvbnRyb2xQYXRoIjsKIApAQCAtMTU5LDYgKzE3NiwxNCBAQCBwcml2YXRlIFNzaENvbnN0YW50cygpIHsKIAkvKiogS2V5IGluIGFuIHNzaCBjb25maWcgZmlsZS4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfRk9SV0FSRCA9ICJSZW1vdGVGb3J3YXJkIjsKIAorCS8qKgorCSAqIChBYnNvbHV0ZSkgcGF0aCB0byBhIG1pZGRsZXdhcmUgbGlicmFyeSB0aGUgU1NIIGFnZW50IHNoYWxsIHVzZSB0byBsb2FkCisJICogU0sgKFUyRikga2V5cy4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNVUklUWV9LRVlfUFJPVklERVIgPSAiU2VjdXJpdHlLZXlQcm92aWRlciI7CisKIAkvKiogS2V5IGluIGFuIHNzaCBjb25maWcgZmlsZS4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5EX0VOViA9ICJTZW5kRW52IjsKIApAQCAtMjI5LDQgKzI1NCwxMiBAQCBwcml2YXRlIFNzaENvbnN0YW50cygpIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfSURFTlRJVElFUyA9IHsgLy8KIAkJCUlEX1JTQSwgSURfRFNBLCBJRF9FQ0RTQSwgSURfRUQyNTUxOQogCX07CisKKwkvKioKKwkgKiBOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBob2xkaW5nIHRoZSBVbml4IGRvbWFpbiBzb2NrZXQgZm9yCisJICogY29tbXVuaWNhdGlvbiB3aXRoIGFuIFNTSCBhZ2VudC4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfU1NIX0FVVEhfU09DS0VUID0gIlNTSF9BVVRIX1NPQ0siOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhY2tpbmdSZWZVcGRhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYWNraW5nUmVmVXBkYXRlLmphdmEKaW5kZXggNjk2Y2E3Yy4uNTFiYzA3YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhY2tpbmdSZWZVcGRhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFja2luZ1JlZlVwZGF0ZS5qYXZhCkBAIC0xMiw2ICsxMiw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKQEAgLTE4NCw5ICsxODYsMTMgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGZvcmNlVXBkYXRlKQogCQkJc2IuYXBwZW5kKCIgKGZvcmNlZCkiKTsKIAkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChvbGRPYmplY3RJZCA9PSBudWxsID8gIiIgOiBvbGRPYmplY3RJZC5hYmJyZXZpYXRlKDcpLm5hbWUoKSk7CisJCXNiLmFwcGVuZChvbGRPYmplY3RJZCA9PSBudWxsID8gIiIKKwkJCQk6IG9sZE9iamVjdElkLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKQorCQkJCQkJLm5hbWUoKSk7CiAJCXNiLmFwcGVuZCgiLi4iKTsKLQkJc2IuYXBwZW5kKG5ld09iamVjdElkID09IG51bGwgPyAiIiA6IG5ld09iamVjdElkLmFiYnJldmlhdGUoNykubmFtZSgpKTsKKwkJc2IuYXBwZW5kKG5ld09iamVjdElkID09IG51bGwgPyAiIgorCQkJCTogbmV3T2JqZWN0SWQuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJCQkubmFtZSgpKTsKIAkJc2IuYXBwZW5kKCJdIik7CiAJCXJldHVybiBzYi50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEKaW5kZXggNWI3ODFhYy4uMGVhYjQ0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEKQEAgLTIsNyArMiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwOCwgTWFyZWsgWmF3aXJza2kgPG1hcmVrLnphd2lyc2tpQGdtYWlsLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAwOCwgUm9iaW4gUm9zZW5iZXJnIDxyb2Jpbi5yb3NlbmJlcmdAZGV3aXJlLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAyMCBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAyMiBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTQwLDcgKzQwLDYgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5BYm9ydGVkQnlIb29rRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ob29rcy5Ib29rczsKQEAgLTU5MCw2ICs1ODksMTEgQEAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gZmluZFJlbW90ZVJlZlVwZGF0ZXNGb3IoCiAJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKGRiLCBzcGVjcyk7CiAKIAkJZm9yIChSZWZTcGVjIHNwZWMgOiBwcm9jUmVmcykgeworCQkJaWYgKHNwZWMuaXNNYXRjaGluZygpKSB7CisJCQkJcmVzdWx0LmFkZChuZXcgUmVtb3RlUmVmVXBkYXRlKGRiLCBzcGVjLmlzRm9yY2VVcGRhdGUoKSwKKwkJCQkJCWZldGNoU3BlY3MpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCVN0cmluZyBzcmNTcGVjID0gc3BlYy5nZXRTb3VyY2UoKTsKIAkJCWZpbmFsIFJlZiBzcmNSZWYgPSBkYi5maW5kUmVmKHNyY1NwZWMpOwogCQkJaWYgKHNyY1JlZiAhPSBudWxsKQpAQCAtNjU2LDE0ICs2NjAsMTggQEAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gZmluZFJlbW90ZVJlZlVwZGF0ZXNGb3IoCiAJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxSZWZTcGVjPiBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKAogCQkJZmluYWwgUmVwb3NpdG9yeSBkYiwgZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBzcGVjcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIExpc3Q8UmVmPiBsb2NhbFJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKIAkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBwcm9jUmVmcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKIAorCQlMaXN0PFJlZj4gbG9jYWxSZWZzID0gbnVsbDsKIAkJZm9yIChSZWZTcGVjIHNwZWMgOiBzcGVjcykgewotCQkJaWYgKHNwZWMuaXNXaWxkY2FyZCgpKSB7CisJCQlpZiAoIXNwZWMuaXNNYXRjaGluZygpICYmIHNwZWMuaXNXaWxkY2FyZCgpKSB7CisJCQkJaWYgKGxvY2FsUmVmcyA9PSBudWxsKSB7CisJCQkJCWxvY2FsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQkJCX0KIAkJCQlmb3IgKFJlZiBsb2NhbFJlZiA6IGxvY2FsUmVmcykgewotCQkJCQlpZiAoc3BlYy5tYXRjaFNvdXJjZShsb2NhbFJlZikpCisJCQkJCWlmIChzcGVjLm1hdGNoU291cmNlKGxvY2FsUmVmKSkgewogCQkJCQkJcHJvY1JlZnMuYWRkKHNwZWMuZXhwYW5kRnJvbVNvdXJjZShsb2NhbFJlZikpOworCQkJCQl9CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlwcm9jUmVmcy5hZGQoc3BlYyk7CkBAIC02NzIsNyArNjgwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxSZWZTcGVjPiBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKAogCQlyZXR1cm4gcHJvY1JlZnM7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRUcmFja2luZ1JlZk5hbWUoZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsCisJc3RhdGljIFN0cmluZyBmaW5kVHJhY2tpbmdSZWZOYW1lKGZpbmFsIFN0cmluZyByZW1vdGVOYW1lLAogCQkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzKSB7CiAJCS8vIHRyeSB0byBmaW5kIG1hdGNoaW5nIHRyYWNraW5nIHJlZnMKIAkJZm9yIChSZWZTcGVjIGZldGNoU3BlYyA6IGZldGNoU3BlY3MpIHsKQEAgLTEzNzEsMTYgKzEzNzksOSBAQCBwdWJsaWMgUHVzaFJlc3VsdCBwdXNoKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJaWYgKHRvUHVzaC5pc0VtcHR5KCkpCiAJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5ub3RoaW5nVG9QdXNoKTsKIAkJfQotCQlpZiAocHJlUHVzaCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXByZVB1c2guc2V0UmVmcyh0b1B1c2gpOwotCQkJCXByZVB1c2guY2FsbCgpOwotCQkJfSBjYXRjaCAoQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQogCi0JCWZpbmFsIFB1c2hQcm9jZXNzIHB1c2hQcm9jZXNzID0gbmV3IFB1c2hQcm9jZXNzKHRoaXMsIHRvUHVzaCwgb3V0KTsKKwkJZmluYWwgUHVzaFByb2Nlc3MgcHVzaFByb2Nlc3MgPSBuZXcgUHVzaFByb2Nlc3ModGhpcywgdG9QdXNoLCBwcmVQdXNoLAorCQkJCW91dCk7CiAJCXJldHVybiBwdXNoUHJvY2Vzcy5leGVjdXRlKG1vbml0b3IpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCmluZGV4IDBjMjNjOGMuLjQ2YWJlMzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKQEAgLTIzNTgsNyArMjM1OCw3IEBAIGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCiAJCQkJCQk6IHJlcS5nZXREZXB0aCgpIC0gMTsKIAkJCQlwdy5zZXRTaGFsbG93UGFjayhyZXEuZ2V0RGVwdGgoKSwgdW5zaGFsbG93Q29tbWl0cyk7CiAKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBPd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgYmVsb3cKKwkJCQkvLyBPd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgYmVsb3cKIAkJCQlEZXB0aFdhbGsuUmV2V2FsayBkdyA9IG5ldyBEZXB0aFdhbGsuUmV2V2FsaygKIAkJCQkJCXdhbGsuZ2V0T2JqZWN0UmVhZGVyKCksIHdhbGtEZXB0aCk7CiAJCQkJZHcuc2V0RGVlcGVuU2luY2UocmVxLmdldERlZXBlblNpbmNlKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQppbmRleCAzZDE1ZWY1Li4wNDZmMzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMjIsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDExICsxOCwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnlDYWNoZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5Q2FjaGUuRmlsZUtleTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIERlZmF1bHQgcmVzb2x2ZXIgc2VydmluZyBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtLgpAQCAtNjcsNyArNjcsNyBAQCBwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKEMgcmVxLCBTdHJpbmcgbmFtZSkKIAkJaWYgKGlzVW5yZWFzb25hYmxlTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24obmFtZSk7CiAKLQkJUmVwb3NpdG9yeSBkYiA9IGV4cG9ydHMuZ2V0KG5hbWVXaXRoRG90R2l0KG5hbWUpKTsKKwkJUmVwb3NpdG9yeSBkYiA9IGV4cG9ydHMuZ2V0KFN0cmluZ1V0aWxzLm5hbWVXaXRoRG90R2l0KG5hbWUpKTsKIAkJaWYgKGRiICE9IG51bGwpIHsKIAkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCXJldHVybiBkYjsKQEAgLTE1NCw3ICsxNTQsNyBAQCBwdWJsaWMgdm9pZCBzZXRFeHBvcnRBbGwoYm9vbGVhbiBleHBvcnQpIHsKIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IGluc3RhbmNlLgogCSAqLwogCXB1YmxpYyB2b2lkIGV4cG9ydFJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFJlcG9zaXRvcnkgZGIpIHsKLQkJZXhwb3J0cy5wdXQobmFtZVdpdGhEb3RHaXQobmFtZSksIGRiKTsKKwkJZXhwb3J0cy5wdXQoU3RyaW5nVXRpbHMubmFtZVdpdGhEb3RHaXQobmFtZSksIGRiKTsKIAl9CiAKIAkvKioKQEAgLTE5NywxMiArMTk3LDYgQEAgZWxzZSBpZiAoZGIuZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZVdpdGhEb3RHaXQoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUuZW5kc1dpdGgoQ29uc3RhbnRzLkRPVF9HSVRfRVhUKSkKLQkJCXJldHVybiBuYW1lOwotCQlyZXR1cm4gbmFtZSArIENvbnN0YW50cy5ET1RfR0lUX0VYVDsKLQl9Ci0KIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5yZWFzb25hYmxlTmFtZShTdHJpbmcgbmFtZSkgewogCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIHRydWU7IC8vIG5vIGVtcHR5IHBhdGhzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKaW5kZXggMWY2MTRlMy4uODI2OTY2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgR29vZ2xlIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAyMiBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTczLDYgKzc0LDcgQEAKICAqIHRocmVhZHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBUcmVlV2FsayBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUsIEF0dHJpYnV0ZXNQcm92aWRlciB7CisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvcltdIE5PX1RSRUVTID0ge307CiAKIAkvKioKQEAgLTkyLDcgKzk0LDcgQEAgcHVibGljIGVudW0gT3BlcmF0aW9uVHlwZSB7CiAJfQogCiAJLyoqCi0JICogICAgICAgICAgICBUeXBlIG9mIG9wZXJhdGlvbiB5b3Ugd2FudCB0byByZXRyaWV2ZSB0aGUgZ2l0IGF0dHJpYnV0ZXMgZm9yLgorCSAqIFR5cGUgb2Ygb3BlcmF0aW9uIHlvdSB3YW50IHRvIHJldHJpZXZlIHRoZSBnaXQgYXR0cmlidXRlcyBmb3IuCiAJICovCiAJcHJpdmF0ZSBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBPcGVyYXRpb25UeXBlLkNIRUNLT1VUX09QOwogCkBAIC0yODQsMTEgKzI4NiwyMCBAQCBwdWJsaWMgc3RhdGljIFRyZWVXYWxrIGZvclBhdGgoZmluYWwgUmVwb3NpdG9yeSBkYiwgZmluYWwgU3RyaW5nIHBhdGgsCiAKIAlBYnN0cmFjdFRyZWVJdGVyYXRvciBjdXJyZW50SGVhZDsKIAotCS8qKiBDYWNoZWQgYXR0cmlidXRlIGZvciB0aGUgY3VycmVudCBlbnRyeSAqLwotCXByaXZhdGUgQXR0cmlidXRlcyBhdHRycyA9IG51bGw7CisJLyoqCisJICogQ2FjaGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBjdXJyZW50IGVudHJ5OyBwZXIgdHJlZS4gSW5kZXggaSsxIGlzIGZvciB0cmVlCisJICogaTsgaW5kZXggMCBpcyBmb3IgdGhlIGRlcHJlY2F0ZWQgbGVnYWN5IGJlaGF2aW9yLgorCSAqLworCXByaXZhdGUgQXR0cmlidXRlc1tdIGF0dHJzOwogCi0JLyoqIENhY2hlZCBhdHRyaWJ1dGVzIGhhbmRsZXIgKi8KLQlwcml2YXRlIEF0dHJpYnV0ZXNIYW5kbGVyIGF0dHJpYnV0ZXNIYW5kbGVyOworCS8qKgorCSAqIENhY2hlZCBhdHRyaWJ1dGVzIGhhbmRsZXI7IHBlciB0cmVlLiBJbmRleCBpKzEgaXMgZm9yIHRyZWUgaTsgaW5kZXggMCBpcworCSAqIGZvciB0aGUgZGVwcmVjYXRlZCBsZWdhY3kgYmVoYXZpb3IuCisJICovCisJcHJpdmF0ZSBBdHRyaWJ1dGVzSGFuZGxlcltdIGF0dHJpYnV0ZXNIYW5kbGVyczsKKworCS8qKiBDYW4gYmUgc2V0IHRvIGlkZW50aWZ5IHRoZSB0cmVlIHRvIHVzZSBmb3Ige0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LiAqLworCXByaXZhdGUgaW50IGhlYWRJbmRleCA9IC0xOwogCiAJcHJpdmF0ZSBDb25maWcgY29uZmlnOwogCkBAIC01MTUsNiArNTI2LDI0IEBAIHB1YmxpYyBBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIGdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKSB7CiAJfQogCiAJLyoqCisJICogSWRlbnRpZmllcyB0aGUgdHJlZSBhdCB0aGUgZ2l2ZW4gaW5kZXggYXMgdGhlIGhlYWQgdHJlZS4gVGhpcyBpcyB0aGUgdHJlZQorCSAqIHVzZSBieSBkZWZhdWx0IHRvIGRldGVybWluZSBhdHRyaWJ1dGVzIGFuZCBFT0wgbW9kZXMuCisJICoKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIG9mIHRoZSB0cmVlIHRvIHVzZSBhcyBoZWFkCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyB2b2lkIHNldEhlYWQoaW50IGluZGV4KSB7CisJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdHJlZXMubGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIZWFkIGluZGV4ICIgKyBpbmRleCAvLyROT04tTkxTLTEkCisJCQkJCSsgIiBvdXQgb2YgcmFuZ2UgWzAsIiArIHRyZWVzLmxlbmd0aCArICcpJyk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQloZWFkSW5kZXggPSBpbmRleDsKKwl9CisKKwkvKioKIAkgKiB7QGluaGVyaXREb2N9CiAJICogPHA+CiAJICogUmV0cmlldmUgdGhlIGdpdCBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCBlbnRyeS4KQEAgLTU1NiwyNSArNTg1LDUxIEBAIHB1YmxpYyBBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIGdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKSB7CiAJICovCiAJQE92ZXJyaWRlCiAJcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJzICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0cnM7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVzKGhlYWRJbmRleCk7CisJfQogCisJLyoqCisJICogUmV0cmlldmVzIHRoZSBnaXQgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gdHJlZS4KKwkgKgorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgb2YgdGhlIHRyZWUgdG8gdXNlIGFzIGJhc2UgZm9yIHRoZSBhdHRyaWJ1dGVzCisJICogQHJldHVybiB0aGUgYXR0cmlidXRlcworCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKGludCBpbmRleCkgeworCQlpbnQgYXR0ckluZGV4ID0gaW5kZXggKyAxOworCQlBdHRyaWJ1dGVzIHJlc3VsdCA9IGF0dHJzW2F0dHJJbmRleF07CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQogCQlpZiAoYXR0cmlidXRlc05vZGVQcm92aWRlciA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgd29yayB0cmVlIHNob3VsZCBoYXZlIGEgQXR0cmlidXRlc05vZGVQcm92aWRlciB0byBiZSBhYmxlIHRvCi0JCQkvLyByZXRyaWV2ZSB0aGUgaW5mbyBhbmQgZ2xvYmFsIGF0dHJpYnV0ZXMgbm9kZQogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKIAkJCQkJIlRoZSB0cmVlIHdhbGsgc2hvdWxkIGhhdmUgb25lIEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgc2V0IGluIG9yZGVyIHRvIGNvbXB1dGUgdGhlIGdpdCBhdHRyaWJ1dGVzLiIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAogCQl0cnkgewotCQkJLy8gTGF6eSBjcmVhdGUgdGhlIGF0dHJpYnV0ZXNIYW5kbGVyIG9uIHRoZSBmaXJzdCBhY2Nlc3Mgb2YKLQkJCS8vIGF0dHJpYnV0ZXMuIFRoaXMgcmVxdWlyZXMgdGhlIGluZm8sIGdsb2JhbCBhbmQgcm9vdAotCQkJLy8gYXR0cmlidXRlcyBub2RlcwotCQkJaWYgKGF0dHJpYnV0ZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQlhdHRyaWJ1dGVzSGFuZGxlciA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcih0aGlzKTsKKwkJCUF0dHJpYnV0ZXNIYW5kbGVyIGhhbmRsZXIgPSBhdHRyaWJ1dGVzSGFuZGxlcnNbYXR0ckluZGV4XTsKKwkJCWlmIChoYW5kbGVyID09IG51bGwpIHsKKwkJCQlpZiAoaW5kZXggPCAwKSB7CisJCQkJCS8vIExlZ2FjeSBiZWhhdmlvciAoaGVhZEluZGV4IG5vdCBzZXQsIGdldEF0dHJpYnV0ZXMoKSBhYm92ZQorCQkJCQkvLyBjYWxsZWQpCisJCQkJCWhhbmRsZXIgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXIodGhpcywgKCkgLT4geworCQkJCQkJcmV0dXJuIGdldFRyZWUoQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcyk7CisJCQkJCX0pOworCQkJCX0gZWxzZSB7CisJCQkJCWhhbmRsZXIgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXIodGhpcywgKCkgLT4geworCQkJCQkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgdHJlZSA9IHRyZWVzW2luZGV4XTsKKwkJCQkJCWlmICh0cmVlIGluc3RhbmNlb2YgQ2Fub25pY2FsVHJlZVBhcnNlcikgeworCQkJCQkJCXJldHVybiAoQ2Fub25pY2FsVHJlZVBhcnNlcikgdHJlZTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9KTsKKwkJCQl9CisJCQkJYXR0cmlidXRlc0hhbmRsZXJzW2F0dHJJbmRleF0gPSBoYW5kbGVyOwogCQkJfQotCQkJYXR0cnMgPSBhdHRyaWJ1dGVzSGFuZGxlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlyZXR1cm4gYXR0cnM7CisJCQlyZXN1bHQgPSBoYW5kbGVyLmdldEF0dHJpYnV0ZXMoKTsKKwkJCWF0dHJzW2F0dHJJbmRleF0gPSByZXN1bHQ7CisJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSkdpdEludGVybmFsRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBwYXJzaW5nIGF0dHJpYnV0ZXMiLCAvLyROT04tTkxTLTEkCiAJCQkJCWUpOwpAQCAtNTk1LDExICs2NTAsMzQgQEAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKIAkgKi8KIAlATnVsbGFibGUKIAlwdWJsaWMgRW9sU3RyZWFtVHlwZSBnZXRFb2xTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUgb3BUeXBlKSB7Ci0JCWlmIChhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID09IG51bGwgfHwgY29uZmlnID09IG51bGwpCisJCWlmIChhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID09IG51bGwgfHwgY29uZmlnID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRW9sU3RyZWFtVHlwZVV0aWwuZGV0ZWN0U3RyZWFtVHlwZSgKLQkJCQlvcFR5cGUgIT0gbnVsbCA/IG9wVHlwZSA6IG9wZXJhdGlvblR5cGUsCi0JCQkJCWNvbmZpZy5nZXQoV29ya2luZ1RyZWVPcHRpb25zLktFWSksIGdldEF0dHJpYnV0ZXMoKSk7CisJCX0KKwkJT3BlcmF0aW9uVHlwZSBvcCA9IG9wVHlwZSAhPSBudWxsID8gb3BUeXBlIDogb3BlcmF0aW9uVHlwZTsKKwkJcmV0dXJuIEVvbFN0cmVhbVR5cGVVdGlsLmRldGVjdFN0cmVhbVR5cGUob3AsCisJCQkJY29uZmlnLmdldChXb3JraW5nVHJlZU9wdGlvbnMuS0VZKSwgZ2V0QXR0cmlidXRlcygpKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSBmb3IgY2hlY2tpbmcgb3V0IHVzaW5nIHRoZQorCSAqIGNvbmZpZyBhbmQge0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LgorCSAqCisJICogQHBhcmFtIHRyZWUKKwkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSB0cmVlIHRoZSBjaGVjay1vdXQgaXMgdG8gYmUgZnJvbQorCSAqIEByZXR1cm4gdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSB1c2luZyB0aGUgY29uZmlnIGFuZAorCSAqICAgICAgICAge0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsCisJICogICAgICAgICBpZiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9IGlzIG5vdCBiYXNlZCBvbgorCSAqICAgICAgICAgYSB3b3JraW5nIHRyZWUKKwkgKiBAc2luY2UgNi4xCisJICovCisJQE51bGxhYmxlCisJcHVibGljIEVvbFN0cmVhbVR5cGUgZ2V0Q2hlY2tvdXRFb2xTdHJlYW1UeXBlKGludCB0cmVlKSB7CisJCWlmIChhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID09IG51bGwgfHwgY29uZmlnID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXModHJlZSk7CisJCXJldHVybiBFb2xTdHJlYW1UeXBlVXRpbC5kZXRlY3RTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1AsCisJCQkJY29uZmlnLmdldChXb3JraW5nVHJlZU9wdGlvbnMuS0VZKSwgYXR0cik7CiAJfQogCiAJLyoqCkBAIC02MDcsNyArNjg1LDggQEAgcHVibGljIEVvbFN0cmVhbVR5cGUgZ2V0RW9sU3RyZWFtVHlwZShPcGVyYXRpb25UeXBlIG9wVHlwZSkgewogCSAqLwogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewogCQlhdHRycyA9IG51bGw7Ci0JCWF0dHJpYnV0ZXNIYW5kbGVyID0gbnVsbDsKKwkJYXR0cmlidXRlc0hhbmRsZXJzID0gbnVsbDsKKwkJaGVhZEluZGV4ID0gLTE7CiAJCXRyZWVzID0gTk9fVFJFRVM7CiAJCWFkdmFuY2UgPSBmYWxzZTsKIAkJZGVwdGggPSAwOwpAQCAtNjUxLDcgKzczMCw5IEBAIHB1YmxpYyB2b2lkIHJlc2V0KEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAogCQlhZHZhbmNlID0gZmFsc2U7CiAJCWRlcHRoID0gMDsKLQkJYXR0cnMgPSBudWxsOworCQlhdHRycyA9IG5ldyBBdHRyaWJ1dGVzWzJdOworCQlhdHRyaWJ1dGVzSGFuZGxlcnMgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXJbMl07CisJCWhlYWRJbmRleCA9IC0xOwogCX0KIAogCS8qKgpAQCAtNzAxLDcgKzc4MiwxNCBAQCBwdWJsaWMgdm9pZCByZXNldChBbnlPYmplY3RJZC4uLiBpZHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQl0cmVlcyA9IHI7CiAJCWFkdmFuY2UgPSBmYWxzZTsKIAkJZGVwdGggPSAwOwotCQlhdHRycyA9IG51bGw7CisJCWlmIChvbGRMZW4gPT0gbmV3TGVuKSB7CisJCQlBcnJheXMuZmlsbChhdHRycywgbnVsbCk7CisJCQlBcnJheXMuZmlsbChhdHRyaWJ1dGVzSGFuZGxlcnMsIG51bGwpOworCQl9IGVsc2UgeworCQkJYXR0cnMgPSBuZXcgQXR0cmlidXRlc1tuZXdMZW4gKyAxXTsKKwkJCWF0dHJpYnV0ZXNIYW5kbGVycyA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcltuZXdMZW4gKyAxXTsKKwkJfQorCQloZWFkSW5kZXggPSAtMTsKIAl9CiAKIAkvKioKQEAgLTc1OCw2ICs4NDYsMTYgQEAgcHVibGljIGludCBhZGRUcmVlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcC5tYXRjaFNoaWZ0ID0gMDsKIAogCQl0cmVlcyA9IG5ld1RyZWVzOworCQlpZiAoYXR0cnMgPT0gbnVsbCkgeworCQkJYXR0cnMgPSBuZXcgQXR0cmlidXRlc1tuICsgMl07CisJCX0gZWxzZSB7CisJCQlhdHRycyA9IEFycmF5cy5jb3B5T2YoYXR0cnMsIG4gKyAyKTsKKwkJfQorCQlpZiAoYXR0cmlidXRlc0hhbmRsZXJzID09IG51bGwpIHsKKwkJCWF0dHJpYnV0ZXNIYW5kbGVycyA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcltuICsgMl07CisJCX0gZWxzZSB7CisJCQlhdHRyaWJ1dGVzSGFuZGxlcnMgPSBBcnJheXMuY29weU9mKGF0dHJpYnV0ZXNIYW5kbGVycywgbiArIDIpOworCQl9CiAJCXJldHVybiBuOwogCX0KIApAQCAtODAwLDcgKzg5OCw3IEBAIHB1YmxpYyBib29sZWFuIG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCX0KIAogCQkJZm9yICg7OykgewotCQkJCWF0dHJzID0gbnVsbDsKKwkJCQlBcnJheXMuZmlsbChhdHRycywgbnVsbCk7CiAJCQkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IG1pbigpOwogCQkJCWlmICh0LmVvZigpKSB7CiAJCQkJCWlmIChkZXB0aCA+IDApIHsKQEAgLTEyNTUsNyArMTM1Myw3IEBAIHB1YmxpYyBib29sZWFuIGlzUG9zdENoaWxkcmVuKCkgewogCSAqLwogCXB1YmxpYyB2b2lkIGVudGVyU3VidHJlZSgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlhdHRycyA9IG51bGw7CisJCUFycmF5cy5maWxsKGF0dHJzLCBudWxsKTsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY2ggPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3JbXSB0bXAgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3JbdHJlZXMubGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlcy5sZW5ndGg7IGkrKykgewpAQCAtMTM3NCwxMSArMTQ3MiwxMiBAQCBwdWJsaWMgPFQgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvcj4gVCBnZXRUcmVlKENsYXNzPFQ+IHR5cGUpIHsKIAogCS8qKgogCSAqIEluc3BlY3QgY29uZmlnIGFuZCBhdHRyaWJ1dGVzIHRvIHJldHVybiBhIGZpbHRlcmNvbW1hbmQgYXBwbGljYWJsZSBmb3IKLQkgKiB0aGUgY3VycmVudCBwYXRoLCBidXQgd2l0aG91dCBleHBhbmRpbmcgJWYgb2NjdXJlbmNlcworCSAqIHRoZSBjdXJyZW50IHBhdGguCiAJICoKIAkgKiBAcGFyYW0gZmlsdGVyQ29tbWFuZFR5cGUKIAkgKiAgICAgICAgICAgIHdoaWNoIHR5cGUgb2YgZmlsdGVyQ29tbWFuZCBzaG91bGQgYmUgZXhlY3V0ZWQuIEUuZy4gImNsZWFuIiwKLQkgKiAgICAgICAgICAgICJzbXVkZ2UiCisJICogICAgICAgICAgICAic211ZGdlIi4gRm9yICJzbXVkZ2UiIGNvbnNpZGVyIHVzaW5nCisJICogICAgICAgICAgICB7e0BsaW5rICNnZXRTbXVkZ2VDb21tYW5kKGludCl9IGluc3RlYWQuCiAJICogQHJldHVybiBhIGZpbHRlciBjb21tYW5kCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgpAQCAtMTQwNyw2ICsxNTA2LDU0IEBAIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyQ29tbWFuZChTdHJpbmcgZmlsdGVyQ29tbWFuZFR5cGUpCiAJfQogCiAJLyoqCisJICogSW5zcGVjdCBjb25maWcgYW5kIGF0dHJpYnV0ZXMgdG8gcmV0dXJuIGEgZmlsdGVyY29tbWFuZCBhcHBsaWNhYmxlIGZvcgorCSAqIHRoZSBjdXJyZW50IHBhdGguCisJICoKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIG9mIHRoZSB0cmVlIHRoZSBpdGVtIHRvIGJlIHNtdWRnZWQgaXMgaW4KKwkgKiBAcmV0dXJuIGEgZmlsdGVyIGNvbW1hbmQKKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFN0cmluZyBnZXRTbXVkZ2VDb21tYW5kKGludCBpbmRleCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRTbXVkZ2VDb21tYW5kKGdldEF0dHJpYnV0ZXMoaW5kZXgpKTsKKwl9CisKKwkvKioKKwkgKiBJbnNwZWN0IGNvbmZpZyBhbmQgYXR0cmlidXRlcyB0byByZXR1cm4gYSBmaWx0ZXJjb21tYW5kIGFwcGxpY2FibGUgZm9yCisJICogdGhlIGN1cnJlbnQgcGF0aC4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCisJICogICAgICAgICAgICB0byB1c2UKKwkgKiBAcmV0dXJuIGEgZmlsdGVyIGNvbW1hbmQKKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFN0cmluZyBnZXRTbXVkZ2VDb21tYW5kKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQXR0cmlidXRlIGYgPSBhdHRyaWJ1dGVzLmdldChDb25zdGFudHMuQVRUUl9GSUxURVIpOworCQlpZiAoZiA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTdHJpbmcgZmlsdGVyVmFsdWUgPSBmLmdldFZhbHVlKCk7CisJCWlmIChmaWx0ZXJWYWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCVN0cmluZyBmaWx0ZXJDb21tYW5kID0gZ2V0RmlsdGVyQ29tbWFuZERlZmluaXRpb24oZmlsdGVyVmFsdWUsCisJCQkJQ29uc3RhbnRzLkFUVFJfRklMVEVSX1RZUEVfU01VREdFKTsKKwkJaWYgKGZpbHRlckNvbW1hbmQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGZpbHRlckNvbW1hbmQucmVwbGFjZUFsbCgiJWYiLCAvLyROT04tTkxTLTEkCisJCQkJTWF0Y2hlci5xdW90ZVJlcGxhY2VtZW50KAorCQkJCQkJUXVvdGVkU3RyaW5nLkJPVVJORS5xdW90ZSgoZ2V0UGF0aFN0cmluZygpKSkpKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIGZpbHRlciBjb21tYW5kIGhvdyBpdCBpcyBkZWZpbmVkIGluIGdpdGNvbmZpZy4gVGhlIHJldHVybmVkCiAJICogc3RyaW5nIG1heSBjb250YWluICIlZiIgd2hpY2ggbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgcGF0aAogCSAqIGJlZm9yZSBleGVjdXRpbmcgdGhlIGZpbHRlciBjb21tYW5kLiBUaGVzZSBmaWx0ZXIgZGVmaW5pdGlvbnMgYXJlIGNhY2hlZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQppbmRleCA1MGNlMTVlLi40MjdlYWM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQpAQCAtMiw3ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpc3RpYW4gSGFsc3RyaWNrIDxjaHJpc3RpYW4uaGFsc3RyaWNrQHNhcC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hdHRoaWFzIFNvaG4gPG1hdHRoaWFzLnNvaG5Ac2FwLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMi0yMDIxLCBSb2JpbiBSb3NlbmJlcmcgYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDIyLCBSb2JpbiBSb3NlbmJlcmcgYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMzg3LDggKzM4Nyw4IEBAIHB1YmxpYyBib29sZWFuIGlzV29ya1RyZWUoKSB7CiAJCQkJc3RhdGUuaW5pdGlhbGl6ZVJlYWRCdWZmZXIoKTsKIAogCQkJCWZpbmFsIGxvbmcgbGVuID0gZS5nZXRMZW5ndGgoKTsKLQkJCQlJbnB1dFN0cmVhbSBmaWx0ZXJlZElzID0gcG9zc2libHlGaWx0ZXJlZElucHV0U3RyZWFtKGUsIGlzLCBsZW4sCi0JCQkJCQlPcGVyYXRpb25UeXBlLkNIRUNLSU5fT1ApOworCQkJCUlucHV0U3RyZWFtIGZpbHRlcmVkSXMgPSBwb3NzaWJseUZpbHRlcmVkSW5wdXRTdHJlYW0oZSwgaXMsCisJCQkJCQlsZW4pOwogCQkJCXJldHVybiBjb21wdXRlSGFzaChmaWx0ZXJlZElzLCBjYW5vbkxlbik7CiAJCQl9IGZpbmFsbHkgewogCQkJCXNhZmVDbG9zZShpcyk7CkBAIC00MDAsMjMgKzQwMCwxOCBAQCBwdWJsaWMgYm9vbGVhbiBpc1dvcmtUcmVlKCkgewogCX0KIAogCXByaXZhdGUgSW5wdXRTdHJlYW0gcG9zc2libHlGaWx0ZXJlZElucHV0U3RyZWFtKGZpbmFsIEVudHJ5IGUsCi0JCQlmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgbG9uZyBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwb3NzaWJseUZpbHRlcmVkSW5wdXRTdHJlYW0oZSwgaXMsIGxlbiwgbnVsbCk7Ci0KLQl9Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIHBvc3NpYmx5RmlsdGVyZWRJbnB1dFN0cmVhbShmaW5hbCBFbnRyeSBlLAotCQkJZmluYWwgSW5wdXRTdHJlYW0gaXMsIGZpbmFsIGxvbmcgbGVuLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKKwkJCWZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBsb25nIGxlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChnZXRDbGVhbkZpbHRlckNvbW1hbmQoKSA9PSBudWxsCi0JCQkJJiYgZ2V0RW9sU3RyZWFtVHlwZShvcFR5cGUpID09IEVvbFN0cmVhbVR5cGUuRElSRUNUKSB7CisJCQkJJiYgZ2V0RW9sU3RyZWFtVHlwZSgKKwkJCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tJTl9PUCkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKIAkJCWNhbm9uTGVuID0gbGVuOwogCQkJcmV0dXJuIGlzOwogCQl9CiAKIAkJaWYgKGxlbiA8PSBNQVhJTVVNX0ZJTEVfU0laRV9UT19SRUFEX0ZVTExZKSB7CiAJCQlCeXRlQnVmZmVyIHJhd2J1ZiA9IElPLnJlYWRXaG9sZVN0cmVhbShpcywgKGludCkgbGVuKTsKLQkJCXJhd2J1ZiA9IGZpbHRlckNsZWFuKHJhd2J1Zi5hcnJheSgpLCByYXdidWYubGltaXQoKSwgb3BUeXBlKTsKKwkJCXJhd2J1ZiA9IGZpbHRlckNsZWFuKHJhd2J1Zi5hcnJheSgpLCByYXdidWYubGltaXQoKSk7CiAJCQljYW5vbkxlbiA9IHJhd2J1Zi5saW1pdCgpOwogCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXdidWYuYXJyYXkoKSwgMCwgKGludCkgY2Fub25MZW4pOwogCQl9CkBAIC00MjYsMTQgKzQyMSwxMyBAQCAmJiBnZXRFb2xTdHJlYW1UeXBlKG9wVHlwZSkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKIAkJCQlyZXR1cm4gaXM7CiAJCQl9CiAKLQkJZmluYWwgSW5wdXRTdHJlYW0gbGVuSXMgPSBmaWx0ZXJDbGVhbihlLm9wZW5JbnB1dFN0cmVhbSgpLAotCQkJCW9wVHlwZSk7CisJCQlmaW5hbCBJbnB1dFN0cmVhbSBsZW5JcyA9IGZpbHRlckNsZWFuKGUub3BlbklucHV0U3RyZWFtKCkpOwogCQl0cnkgewogCQkJY2Fub25MZW4gPSBjb21wdXRlTGVuZ3RoKGxlbklzKTsKIAkJfSBmaW5hbGx5IHsKIAkJCXNhZmVDbG9zZShsZW5Jcyk7CiAJCX0KLQkJcmV0dXJuIGZpbHRlckNsZWFuKGlzLCBvcFR5cGUpOworCQlyZXR1cm4gZmlsdGVyQ2xlYW4oaXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgc2FmZUNsb3NlKElucHV0U3RyZWFtIGluKSB7CkBAIC00NTUsMjMgKzQ0OSwyMCBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5KEVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBCeXRlQnVmZmVyIGZpbHRlckNsZWFuKGJ5dGVbXSBzcmMsIGludCBuLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKKwlwcml2YXRlIEJ5dGVCdWZmZXIgZmlsdGVyQ2xlYW4oYnl0ZVtdIHNyYywgaW50IG4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzcmMpOwogCQl0cnkgewotCQkJcmV0dXJuIElPLnJlYWRXaG9sZVN0cmVhbShmaWx0ZXJDbGVhbihpbiwgb3BUeXBlKSwgbik7CisJCQlyZXR1cm4gSU8ucmVhZFdob2xlU3RyZWFtKGZpbHRlckNsZWFuKGluKSwgbik7CiAJCX0gZmluYWxseSB7CiAJCQlzYWZlQ2xvc2UoaW4pOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBmaWx0ZXJDbGVhbihJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbHRlckNsZWFuKGluLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIGZpbHRlckNsZWFuKElucHV0U3RyZWFtIGluLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKKwlwcml2YXRlIElucHV0U3RyZWFtIGZpbHRlckNsZWFuKElucHV0U3RyZWFtIGluKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW4gPSBoYW5kbGVBdXRvQ1JMRihpbiwgb3BUeXBlKTsKKwkJaW4gPSBFb2xTdHJlYW1UeXBlVXRpbC53cmFwSW5wdXRTdHJlYW0oaW4sCisJCQkJZ2V0RW9sU3RyZWFtVHlwZShPcGVyYXRpb25UeXBlLkNIRUNLSU5fT1ApKTsKIAkJU3RyaW5nIGZpbHRlckNvbW1hbmQgPSBnZXRDbGVhbkZpbHRlckNvbW1hbmQoKTsKIAkJaWYgKGZpbHRlckNvbW1hbmQgIT0gbnVsbCkgewogCQkJaWYgKEZpbHRlckNvbW1hbmRSZWdpc3RyeS5pc1JlZ2lzdGVyZWQoZmlsdGVyQ29tbWFuZCkpIHsKQEAgLTUwOSwxMSArNTAwLDYgQEAgZmlsdGVyQ29tbWFuZCwgZ2V0RW50cnlQYXRoU3RyaW5nKCksCiAJCXJldHVybiBpbjsKIAl9CiAKLQlwcml2YXRlIElucHV0U3RyZWFtIGhhbmRsZUF1dG9DUkxGKElucHV0U3RyZWFtIGluLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBFb2xTdHJlYW1UeXBlVXRpbC53cmFwSW5wdXRTdHJlYW0oaW4sIGdldEVvbFN0cmVhbVR5cGUob3BUeXBlKSk7Ci0JfQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgd29ya2luZyB0cmVlIG9wdGlvbnMgdXNlZCBieSB0aGlzIGl0ZXJhdG9yLgogCSAqCkBAIC02NjQsNyArNjUwLDggQEAgcHVibGljIEluc3RhbnQgZ2V0RW50cnlMYXN0TW9kaWZpZWRJbnN0YW50KCkgewogCXB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuRW50cnlTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSByYXdpcyA9IGN1cnJlbnQoKS5vcGVuSW5wdXRTdHJlYW0oKTsKIAkJaWYgKGdldENsZWFuRmlsdGVyQ29tbWFuZCgpID09IG51bGwKLQkJCQkmJiBnZXRFb2xTdHJlYW1UeXBlKCkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKKwkJCQkmJiBnZXRFb2xTdHJlYW1UeXBlKAorCQkJCQkJT3BlcmF0aW9uVHlwZS5DSEVDS0lOX09QKSA9PSBFb2xTdHJlYW1UeXBlLkRJUkVDVCkgewogCQkJcmV0dXJuIHJhd2lzOwogCQl9CiAJCXJldHVybiBmaWx0ZXJDbGVhbihyYXdpcyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCmluZGV4IGZmMDk0ZjYuLmFlNzNkM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRPcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRSZXN1bHQ7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwogaW1wb3J0IGphdmEubmlvLmZpbGUuU2ltcGxlRmlsZVZpc2l0b3I7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuQmFzaWNGaWxlQXR0cmlidXRlczsKQEAgLTk2LDYgKzk3LDkgQEAgcHVibGljIGJvb2xlYW4gcmV0cnlGYWlsZWRMb2NrRmlsZUNvbW1pdCgpIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBFbnRyeVtdIGxpc3QoRmlsZSBkaXJlY3RvcnksIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQlpZiAoIUZpbGVzLmlzRGlyZWN0b3J5KGRpcmVjdG9yeS50b1BhdGgoKSwgTGlua09wdGlvbi5OT0ZPTExPV19MSU5LUykpIHsKKwkJCXJldHVybiBOT19FTlRSSUVTOworCQl9CiAJCUxpc3Q8RW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlGUyBmcyA9IHRoaXM7CiAJCWJvb2xlYW4gY2hlY2tFeGVjdXRhYmxlID0gZnMuc3VwcG9ydHNFeGVjdXRlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCmluZGV4IDhhYjEzMzguLjkxN2FkZDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAyMiwgR29vZ2xlIEluYy4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNiArMTUsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogCiAvKioKICAqIE1pc2NlbGxhbmVvdXMgc3RyaW5nIGNvbXBhcmlzb24gdXRpbGl0eSBtZXRob2RzLgpAQCAtMzcsNiArMzgsMTAgQEAgcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1V0aWxzIHsKIAkJCUxDW2NdID0gKGNoYXIpICgnYScgKyAoYyAtICdBJykpOwogCX0KIAorCXByaXZhdGUgU3RyaW5nVXRpbHMoKSB7CisJCS8vIERvIG5vdCBjcmVhdGUgaW5zdGFuY2VzCisJfQorCiAJLyoqCiAJICogQ29udmVydCB0aGUgaW5wdXQgdG8gbG93ZXJjYXNlLgogCSAqIDxwPgpAQCAtMjY5LDggKzI3NCwyMCBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyBqb2luKENvbGxlY3Rpb248U3RyaW5nPiBwYXJ0cywgU3RyaW5nIHNlcGFyYXRvciwKIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmdVdGlscygpIHsKLQkJLy8gRG8gbm90IGNyZWF0ZSBpbnN0YW5jZXMKKwkvKioKKwkgKiBBcHBlbmRzIHtAbGluayBDb25zdGFudHMjRE9UX0dJVF9FWFR9IHVubGVzcyB0aGUgZ2l2ZW4gbmFtZSBhbHJlYWR5IGVuZHMKKwkgKiB3aXRoIHRoYXQgc3VmZml4LgorCSAqCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRvIGNvbXBsZXRlCisJICogQHJldHVybiB0aGUgbmFtZSBlbmRpbmcgd2l0aCB7QGxpbmsgQ29uc3RhbnRzI0RPVF9HSVRfRVhUfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lV2l0aERvdEdpdChTdHJpbmcgbmFtZSkgeworCQlpZiAobmFtZS5lbmRzV2l0aChDb25zdGFudHMuRE9UX0dJVF9FWFQpKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCQlyZXR1cm4gbmFtZSArIENvbnN0YW50cy5ET1RfR0lUX0VYVDsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YQppbmRleCA0Zjk0MGQ3Li4yYzk3MmI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5SHVua0lucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC05MCw3ICs5MCw3IEBAIHByaXZhdGUgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGVuY29kZWQgPSBuZXcgYnl0ZVtCYXNlODUuZW5jb2RlZExlbmd0aChsZW5ndGgpXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSsrKSB7CiAJCQlpbnQgYiA9IGluLnJlYWQoKTsKLQkJCWlmIChiIDwgMCB8fCBiID09ICdcbicpIHsKKwkJCWlmIChiIDwgMCB8fCBiID09ICdccicgfHwgYiA9PSAnXG4nKSB7CiAJCQkJdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmJpbmFyeUh1bmtJbnZhbGlkTGVuZ3RoLAogCQkJCQkJSW50ZWdlci52YWx1ZU9mKGxpbmVOdW1iZXIpKSk7CkBAIC05OSw2ICs5OSwxMCBAQCBwcml2YXRlIHZvaWQgZmlsbEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAkJLy8gTXVzdCBiZSBmb2xsb3dlZCBieSBhIG5ld2xpbmU7IHRvbGVyYXRlIEVPRi4KIAkJaW50IGIgPSBpbi5yZWFkKCk7CisJCWlmIChiID09ICdccicpIHsKKwkJCS8vIEJlIGxlbmllbnQgYW5kIGFjY2VwdCBDUi1MRiwgdG9vLgorCQkJYiA9IGluLnJlYWQoKTsKKwkJfQogCQlpZiAoYiA+PSAwICYmIGIgIT0gJ1xuJykgewogCQkJdGhyb3cgbmV3IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYmluYXJ5SHVua01pc3NpbmdOZXdsaW5lLApkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggYzQ4NjU2OS4uODEwOTNjMCAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0xOCw3ICsxOCw3IEBACiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAKICAgPG5hbWU+SkdpdCAtIFBhcmVudDwvbmFtZT4KICAgPHVybD4ke2pnaXQtdXJsfTwvdXJsPgpAQCAtMTUwLDkgKzE1MCw5IEBACiAgICAgPGphdmEudmVyc2lvbj4xMTwvamF2YS52ZXJzaW9uPgogICAgIDxidW5kbGUtbWFuaWZlc3Q+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vTUVUQS1JTkYvTUFOSUZFU1QuTUY8L2J1bmRsZS1tYW5pZmVzdD4KIAotICAgIDxqZ2l0LWxhc3QtcmVsZWFzZS12ZXJzaW9uPjUuMTMuMC4yMDIxMDkwODA4MjctcjwvamdpdC1sYXN0LXJlbGVhc2UtdmVyc2lvbj4KKyAgICA8amdpdC1sYXN0LXJlbGVhc2UtdmVyc2lvbj42LjAuMC4yMDIxMTEyOTEwMDAtcjwvamdpdC1sYXN0LXJlbGVhc2UtdmVyc2lvbj4KICAgICA8YW50LXZlcnNpb24+MS4xMC4xMjwvYW50LXZlcnNpb24+Ci0gICAgPGFwYWNoZS1zc2hkLXZlcnNpb24+Mi43LjA8L2FwYWNoZS1zc2hkLXZlcnNpb24+CisgICAgPGFwYWNoZS1zc2hkLXZlcnNpb24+Mi44LjA8L2FwYWNoZS1zc2hkLXZlcnNpb24+CiAgICAgPGpzY2gtdmVyc2lvbj4wLjEuNTU8L2pzY2gtdmVyc2lvbj4KICAgICA8anpsaWItdmVyc2lvbj4xLjEuMTwvanpsaWItdmVyc2lvbj4KICAgICA8amF2YWV3YWgtdmVyc2lvbj4xLjEuMTM8L2phdmFld2FoLXZlcnNpb24+CkBAIC0xNjAsNyArMTYwLDcgQEAKICAgICA8dGVzdC1mb3JrLWNvdW50PjFDPC90ZXN0LWZvcmstY291bnQ+CiAgICAgPGFyZ3M0ai12ZXJzaW9uPjIuMzM8L2FyZ3M0ai12ZXJzaW9uPgogICAgIDxjb21tb25zLWNvbXByZXNzLXZlcnNpb24+MS4yMTwvY29tbW9ucy1jb21wcmVzcy12ZXJzaW9uPgotICAgIDxvc2dpLWNvcmUtdmVyc2lvbj40LjMuMTwvb3NnaS1jb3JlLXZlcnNpb24+CisgICAgPG9zZ2ktY29yZS12ZXJzaW9uPjYuMC4wPC9vc2dpLWNvcmUtdmVyc2lvbj4KICAgICA8c2VydmxldC1hcGktdmVyc2lvbj40LjAuMDwvc2VydmxldC1hcGktdmVyc2lvbj4KICAgICA8amV0dHktdmVyc2lvbj4xMC4wLjY8L2pldHR5LXZlcnNpb24+CiAgICAgPGphcGljbXAtdmVyc2lvbj4wLjE1LjM8L2phcGljbXAtdmVyc2lvbj4KQEAgLTE2OSw4ICsxNjksOCBAQAogICAgIDxzbGY0ai12ZXJzaW9uPjEuNy4zMDwvc2xmNGotdmVyc2lvbj4KICAgICA8bWF2ZW4tamF2YWRvYy1wbHVnaW4tdmVyc2lvbj4zLjMuMTwvbWF2ZW4tamF2YWRvYy1wbHVnaW4tdmVyc2lvbj4KICAgICA8dHljaG8tZXh0cmFzLXZlcnNpb24+Mi41LjA8L3R5Y2hvLWV4dHJhcy12ZXJzaW9uPgotICAgIDxnc29uLXZlcnNpb24+Mi44Ljg8L2dzb24tdmVyc2lvbj4KLSAgICA8Ym91bmN5Y2FzdGxlLXZlcnNpb24+MS42OTwvYm91bmN5Y2FzdGxlLXZlcnNpb24+CisgICAgPGdzb24tdmVyc2lvbj4yLjguOTwvZ3Nvbi12ZXJzaW9uPgorICAgIDxib3VuY3ljYXN0bGUtdmVyc2lvbj4xLjcwPC9ib3VuY3ljYXN0bGUtdmVyc2lvbj4KICAgICA8c3BvdGJ1Z3MtbWF2ZW4tcGx1Z2luLXZlcnNpb24+NC4zLjA8L3Nwb3RidWdzLW1hdmVuLXBsdWdpbi12ZXJzaW9uPgogICAgIDxtYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW4tdmVyc2lvbj4zLjEuMjwvbWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luLXZlcnNpb24+CiAgICAgPG1hdmVuLWp4ci1wbHVnaW4tdmVyc2lvbj4zLjEuMTwvbWF2ZW4tanhyLXBsdWdpbi12ZXJzaW9uPgpAQCAtMjAzLDYgKzIwMywxNCBAQAogICAgICAgPGlkPnJlcG8uZWNsaXBzZS5vcmcuY2JpLXNuYXBzaG90czwvaWQ+CiAgICAgICA8dXJsPmh0dHBzOi8vcmVwby5lY2xpcHNlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9jYmktc25hcHNob3RzLzwvdXJsPgogICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KKyAgICA8cGx1Z2luUmVwb3NpdG9yeT4KKyAgICAgIDxpZD5yZXBvLmVjbGlwc2Uub3JnLmRhc2gtcmVsZWFzZXM8L2lkPgorICAgICAgPHVybD5odHRwczovL3JlcG8uZWNsaXBzZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvZGFzaC1saWNlbnNlcy1yZWxlYXNlcy88L3VybD4KKyAgICA8L3BsdWdpblJlcG9zaXRvcnk+CisgICAgPHBsdWdpblJlcG9zaXRvcnk+CisgICAgICA8aWQ+cmVwby5lY2xpcHNlLm9yZy5kYXNoLXNuYXBzaG90czwvaWQ+CisgICAgICA8dXJsPmh0dHBzOi8vcmVwby5lY2xpcHNlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9kYXNoLWxpY2Vuc2VzLXNuYXBzaG90cy88L3VybD4KKyAgICA8L3BsdWdpblJlcG9zaXRvcnk+CiAgIDwvcGx1Z2luUmVwb3NpdG9yaWVzPgogCiAgIDxidWlsZD4KQEAgLTMzOCw3ICszNDYsNyBAQAogICAgICAgICAgICAgPGRlcGVuZGVuY3k+PCEtLSBhZGQgc3VwcG9ydCBmb3Igc3NoL3NjcCAtLT4KICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tc3NoPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICA8dmVyc2lvbj4zLjQuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPHZlcnNpb24+My41LjE8L3ZlcnNpb24+CiAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CiAgICAgICAgIDwvcGx1Z2luPgpAQCAtMzgyLDYgKzM5MCwxMSBAQAogICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1ib290LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICA8dmVyc2lvbj4yLjUuNDwvdmVyc2lvbj4KICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuZGFzaDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5saWNlbnNlLXRvb2wtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KICAgICAgIDwvcGx1Z2lucz4KICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CiAKQEAgLTU0MCw2ICs1NTMsMTAgQEAKICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5kYXNoPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5saWNlbnNlLXRvb2wtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgogICA8L2J1aWxkPgogCkBAIC04NTMsNyArODcwLDcgQEAKICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamR0PC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjI3LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4yOC4wPC92ZXJzaW9uPgogICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KICAgICAgICAgICA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL0JVSUxEIGIvdG9vbHMvQlVJTEQKaW5kZXggMTgyNjI0OS4uMWU2NzEwOCAxMDA2NDQKLS0tIGEvdG9vbHMvQlVJTEQKKysrIGIvdG9vbHMvQlVJTEQKQEAgLTEsMzQgKzEsMjggQEAKIGxvYWQoCiAgICAgIkBiYXplbF90b29scy8vdG9vbHMvamRrOmRlZmF1bHRfamF2YV90b29sY2hhaW4uYnpsIiwKLSAgICAiSkRLOV9KVk1fT1BUUyIsCiAgICAgImRlZmF1bHRfamF2YV90b29sY2hhaW4iLAogKQogbG9hZCgiQHJ1bGVzX2phdmEvL2phdmE6ZGVmcy5iemwiLCAiamF2YV9wYWNrYWdlX2NvbmZpZ3VyYXRpb24iKQogCi1KREsxMV9KVk1fT1BUUyA9IFsKLSAgICAiLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5hcGk9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmNvZGU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmNvbXA9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLm1haW49QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnRyZWU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnV0aWw9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1vcGVucz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5maWxlPUFMTC1VTk5BTUVEIiwKLSAgICAiLS1wYXRjaC1tb2R1bGU9amF2YS5jb21waWxlcj0kKGxvY2F0aW9uIEBiYXplbF90b29scy8vdG9vbHMvamRrOmphdmFfY29tcGlsZXJfamFyKSIsCi0gICAgIi0tcGF0Y2gtbW9kdWxlPWpkay5jb21waWxlcj0kKGxvY2F0aW9uIEBiYXplbF90b29scy8vdG9vbHMvamRrOmpka19jb21waWxlcl9qYXIpIiwKLSAgICAiLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEubmlvPUFMTC1VTk5BTUVEIiwKLSAgICAiLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEubGFuZz1BTEwtVU5OQU1FRCIsCi1dCi0KIGRlZmF1bHRfamF2YV90b29sY2hhaW4oCi0gICAgbmFtZSA9ICJlcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW4iLAotICAgIGJvb3RjbGFzc3BhdGggPSBbIkBiYXplbF90b29scy8vdG9vbHMvamRrOnBsYXRmb3JtY2xhc3NwYXRoLmphciJdLAotICAgIGp2bV9vcHRzID0gSkRLMTFfSlZNX09QVFMsCi0gICAgc291cmNlX3ZlcnNpb24gPSAiMTEiLAotICAgIHRhcmdldF92ZXJzaW9uID0gIjExIiwKKyAgICBuYW1lID0gImVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTEiLAogICAgIHBhY2thZ2VfY29uZmlndXJhdGlvbiA9IFsKICAgICAgICAgIjplcnJvcl9wcm9uZSIsCiAgICAgXSwKKyAgICBzb3VyY2VfdmVyc2lvbiA9ICIxMSIsCisgICAgdGFyZ2V0X3ZlcnNpb24gPSAiMTEiLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKKworZGVmYXVsdF9qYXZhX3Rvb2xjaGFpbigKKyAgICBuYW1lID0gImVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTciLAorICAgIGNvbmZpZ3VyYXRpb24gPSBkaWN0KCksCisgICAgamF2YV9ydW50aW1lID0gIkBiYXplbF90b29scy8vdG9vbHMvamRrOnJlbW90ZWpka18xNyIsCisgICAgcGFja2FnZV9jb25maWd1cmF0aW9uID0gWworICAgICAgICAiOmVycm9yX3Byb25lIiwKKyAgICBdLAorICAgIHNvdXJjZV92ZXJzaW9uID0gIjE3IiwKKyAgICB0YXJnZXRfdmVyc2lvbiA9ICIxNyIsCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogKQogCkBAIC0xMDgsMjAgKzEwMiwyNSBAQAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ly4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuYW50Ly4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC8uLi4iLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L2h0dHAvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMvLi4uIiwKLSAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS8uLi4iLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC51aS8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Ly4uLiIsCmRpZmYgLS1naXQgYS90b29scy9iYXplbGlza192ZXJzaW9uLmJ6bCBiL3Rvb2xzL2JhemVsaXNrX3ZlcnNpb24uYnpsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzZDEwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2JhemVsaXNrX3ZlcnNpb24uYnpsCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotX3RlbXBsYXRlID0gIiIiCi1sb2FkKCJAYmF6ZWxfc2t5bGliLy9saWI6dmVyc2lvbnMuYnpsIiwgInZlcnNpb25zIikKLQotZGVmIGNoZWNrX2JhemVsX3ZlcnNpb24oKToKLSAgdmVyc2lvbnMuY2hlY2sobWluaW11bV9iYXplbF92ZXJzaW9uID0gInt2ZXJzaW9ufSIpCi0iIiIuc3RyaXAoKQotCi1kZWYgX2ltcGwocmVwb3NpdG9yeV9jdHgpOgotICAgIHJlcG9zaXRvcnlfY3R4LnN5bWxpbmsoTGFiZWwoIkAvLzouYmF6ZWx2ZXJzaW9uIiksICIuYmF6ZWx2ZXJzaW9uIikKLSAgICBiYXplbHZlcnNpb24gPSByZXBvc2l0b3J5X2N0eC5yZWFkKCIuYmF6ZWx2ZXJzaW9uIikuc3RyaXAoKQotCi0gICAgcmVwb3NpdG9yeV9jdHguZmlsZSgiQlVJTEQiLCBleGVjdXRhYmxlID0gRmFsc2UpCi0KLSAgICByZXBvc2l0b3J5X2N0eC5maWxlKCJjaGVjay5iemwiLCBleGVjdXRhYmxlID0gRmFsc2UsIGNvbnRlbnQgPSBfdGVtcGxhdGUuZm9ybWF0KHZlcnNpb24gPSBiYXplbHZlcnNpb24pKQotCi1iYXplbGlza192ZXJzaW9uID0gcmVwb3NpdG9yeV9ydWxlKGltcGxlbWVudGF0aW9uID0gX2ltcGwpCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGUtYmF6ZWxyYyBiL3Rvb2xzL3JlbW90ZS1iYXplbHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Zjc5NGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZW1vdGUtYmF6ZWxyYwpAQCAtMCwwICsxLDY3IEBACisjIENvcHlyaWdodCAyMDIyIFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGZyb20gcmVsZWFzZS9iYXplbHJjLnRwbCBhbmQgc2hvdWxkIG5vdCBiZQorIyBtb2RpZmllZCBkaXJlY3RseS4KKworIyBUaGlzIC5iYXplbHJjIGZpbGUgY29udGFpbnMgYWxsIG9mIHRoZSBmbGFncyByZXF1aXJlZCBmb3IgdGhlIHByb3ZpZGVkCisjIHRvb2xjaGFpbiB3aXRoIFJlbW90ZSBCdWlsZCBFeGVjdXRpb24uCisjCisjIFRoaXMgLmJhemVscmMgZmlsZSBhbHNvIGNvbnRhaW5zIGFsbCBvZiB0aGUgZmxhZ3MgcmVxdWlyZWQgZm9yIHRoZSBsb2NhbAorIyBkb2NrZXIgc2FuZGJveGluZy4KKworIyBEZXBlbmRpbmcgb24gaG93IG1hbnkgbWFjaGluZXMgYXJlIGluIHRoZSByZW1vdGUgZXhlY3V0aW9uIGluc3RhbmNlLCBzZXR0aW5nCisjIHRoaXMgaGlnaGVyIGNhbiBtYWtlIGJ1aWxkcyBmYXN0ZXIgYnkgYWxsb3dpbmcgbW9yZSBqb2JzIHRvIHJ1biBpbiBwYXJhbGxlbC4KKyMgU2V0dGluZyBpdCB0b28gaGlnaCBjYW4gcmVzdWx0IGluIGpvYnMgdGhhdCB0aW1lb3V0LCBob3dldmVyLCB3aGlsZSB3YWl0aW5nCisjIGZvciBhIHJlbW90ZSBtYWNoaW5lIHRvIGV4ZWN1dGUgdGhlbS4KK2J1aWxkOnJlbW90ZSAtLWpvYnM9MjAwCitidWlsZDpyZW1vdGUgLS1kaXNrX2NhY2hlPQorCisjIFNldCBzZXZlcmFsIGZsYWdzIHJlbGF0ZWQgdG8gc3BlY2lmeWluZyB0aGUgcGxhdGZvcm0sIHRvb2xjaGFpbiBhbmQgamF2YQorIyBwcm9wZXJ0aWVzLgorYnVpbGQ6cmVtb3RlIC0taG9zdF9qYXZhYmFzZT1AcmJlX2pkazExLy9qYXZhOmpkaworYnVpbGQ6cmVtb3RlIC0tamF2YWJhc2U9QHJiZV9qZGsxMS8vamF2YTpqZGsKK2J1aWxkOnJlbW90ZSAtLWNyb3NzdG9vbF90b3A9QHJiZV9qZGsxMS8vY2M6dG9vbGNoYWluCitidWlsZDpyZW1vdGUgLS1leHRyYV90b29sY2hhaW5zPUByYmVfamRrMTEvL2NvbmZpZzpjYy10b29sY2hhaW4KK2J1aWxkOnJlbW90ZSAtLWV4dHJhX2V4ZWN1dGlvbl9wbGF0Zm9ybXM9QHJiZV9qZGsxMS8vY29uZmlnOnBsYXRmb3JtCitidWlsZDpyZW1vdGUgLS1ob3N0X3BsYXRmb3JtPUByYmVfamRrMTEvL2NvbmZpZzpwbGF0Zm9ybQorYnVpbGQ6cmVtb3RlIC0tcGxhdGZvcm1zPUByYmVfamRrMTEvL2NvbmZpZzpwbGF0Zm9ybQorYnVpbGQ6cmVtb3RlIC0tYWN0aW9uX2Vudj1CQVpFTF9ET19OT1RfREVURUNUX0NQUF9UT09MQ0hBSU49MQorCisjIFNldCB2YXJpb3VzIHN0cmF0ZWdpZXMgc28gdGhhdCBhbGwgYWN0aW9ucyBleGVjdXRlIHJlbW90ZWx5LiBNaXhpbmcgcmVtb3RlCisjIGFuZCBsb2NhbCBleGVjdXRpb24gd2lsbCBsZWFkIHRvIGVycm9ycyB1bmxlc3MgdGhlIHRvb2xjaGFpbiBhbmQgcmVtb3RlCisjIG1hY2hpbmUgZXhhY3RseSBtYXRjaCB0aGUgaG9zdCBtYWNoaW5lLgorYnVpbGQ6cmVtb3RlIC0tZGVmaW5lPUVYRUNVVE9SPXJlbW90ZQorCisjIEVuYWJsZSB0aGUgcmVtb3RlIGNhY2hlIHNvIGFjdGlvbiByZXN1bHRzIGNhbiBiZSBzaGFyZWQgYWNyb3NzIG1hY2hpbmVzLAorIyBkZXZlbG9wZXJzLCBhbmQgd29ya3NwYWNlcy4KK2J1aWxkOnJlbW90ZSAtLXJlbW90ZV9jYWNoZT1yZW1vdGVidWlsZGV4ZWN1dGlvbi5nb29nbGVhcGlzLmNvbQorCisjIEVuYWJsZSByZW1vdGUgZXhlY3V0aW9uIHNvIGFjdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgcmVtb3RlIHN5c3RlbXMuCitidWlsZDpyZW1vdGUgLS1yZW1vdGVfZXhlY3V0b3I9cmVtb3RlYnVpbGRleGVjdXRpb24uZ29vZ2xlYXBpcy5jb20KKworIyBTZXQgYSBoaWdoZXIgdGltZW91dCB2YWx1ZSwganVzdCBpbiBjYXNlLgorYnVpbGQ6cmVtb3RlIC0tcmVtb3RlX3RpbWVvdXQ9MzYwMAorCisjIEVuYWJsZSBhdXRoZW50aWNhdGlvbi4gVGhpcyB3aWxsIHBpY2sgdXAgYXBwbGljYXRpb24gZGVmYXVsdCBjcmVkZW50aWFscyBieQorIyBkZWZhdWx0LiBZb3UgY2FuIHVzZSAtLWF1dGhfY3JlZGVudGlhbHM9c29tZV9maWxlLmpzb24gdG8gdXNlIGEgc2VydmljZQorIyBhY2NvdW50IGNyZWRlbnRpYWwgaW5zdGVhZC4KK2J1aWxkOnJlbW90ZSAtLWdvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzCisKKyMgVGhlIGZvbGxvd2luZyBmbGFncyBlbmFibGUgdGhlIHJlbW90ZSBjYWNoZSBzbyBhY3Rpb24gcmVzdWx0cyBjYW4gYmUgc2hhcmVkCisjIGFjcm9zcyBtYWNoaW5lcywgZGV2ZWxvcGVycywgYW5kIHdvcmtzcGFjZXMuCitidWlsZDpyZW1vdGUtY2FjaGUgLS1yZW1vdGVfY2FjaGU9cmVtb3RlYnVpbGRleGVjdXRpb24uZ29vZ2xlYXBpcy5jb20KK2J1aWxkOnJlbW90ZS1jYWNoZSAtLXRsc19lbmFibGVkPXRydWUKK2J1aWxkOnJlbW90ZS1jYWNoZSAtLXJlbW90ZV90aW1lb3V0PTM2MDAKK2J1aWxkOnJlbW90ZS1jYWNoZSAtLWF1dGhfZW5hYmxlZD10cnVlCg==