LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDExIHByb3RvcyBzb2Z0d2FyZSBnbWJoIChodHRwOi8vd3d3LnByb3Rvcy5kZSkuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KICoKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICogCiAqIENPTlRSSUJVVE9SUzoKICogCQlUaG9tYXMgSnVuZywgVGhvbWFzIFNjaHVldHogKGluaXRpYWwgY29udHJpYnV0aW9uKQogKiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuZG9jLmdlbgoKaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdAppbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uCmltcG9ydCBqYXZhLmlvLkZpbGUKaW1wb3J0IGphdmEudXRpbC5MaXN0CmltcG9ydCBqYXZhLnV0aWwuU2V0CmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5jb21tb24uYmFzZS5Eb2N1bWVudGF0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5jb21tb24uYmFzZS51dGlsLlJlbGF0aXZlUGF0aEhlbHBlcnMKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmZzbS5mU00uU3RhdGUKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5Sb290CmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkFjdG9yQ2xhc3MKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uQXR0cmlidXRlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkNvbXBvdW5kUHJvdG9jb2xDbGFzcwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5EYXRhQ2xhc3MKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uRW51bWVyYXRpb25UeXBlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkxvZ2ljYWxTeXN0ZW0KaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUG9ydAppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5Qcm90b2NvbENsYXNzCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLlJvb21DbGFzcwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5Sb29tTW9kZWwKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uU3RhbmRhcmRPcGVyYXRpb24KaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uU3ViU3lzdGVtQ2xhc3MKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20udXRpbC5Sb29tSGVscGVycwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5mc20uYmFzZS5Db2RlZ2VuSGVscGVycwppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5iYXNlLmxvZ2dpbmcuSUxvZ2dlcgppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5iYXNlLmlvLklHZW5lcmF0b3JGaWxlSU8KCkBTaW5nbGV0b24KY2xhc3MgRG9jR2VuIHsKCglASW5qZWN0IGV4dGVuc2lvbiBSb29tSGVscGVycwoJQEluamVjdCBleHRlbnNpb24gQ29kZWdlbkhlbHBlcnMKCUBJbmplY3QgSUdlbmVyYXRvckZpbGVJTyBmaWxlSU8KCUBJbmplY3QgSUxvZ2dlciBsb2dnZXIKCQoJZmluYWwgdmFsIElNR0RJUl9ERUZBVUxUID0gIi4vaW1hZ2VzIgoJZmluYWwgdmFsIElNR1dJRFRIX0RFRkFVTFQgPSAiMS4wXFx0ZXh0d2lkdGgiCgkKCXN0YXRpYyBjbGFzcyBEb2NHZW5Db250ZXh0IHsKCQl2YWwgUm9vdCByb290CgkJdmFsIFJvb21Nb2RlbCBtb2RlbAoJCQoJCW5ldyhSb290IHIsIFJvb21Nb2RlbCBtKSB7CgkJCXJvb3QgPSByCgkJCW1vZGVsID0gbQoJCX0KCQkKCX0KCQoJZGVmIGRvR2VuZXJhdGUoUm9vdCByb290KSB7CgkJZm9yIChtb2RlbDogcm9vdC5tb2RlbHMpIHsKCQkJdmFsIGN0eCA9IG5ldyBEb2NHZW4uRG9jR2VuQ29udGV4dChyb290LG1vZGVsKQoJCQl2YXIgZmlsZSA9IG1vZGVsLm5hbWUrIi50ZXgiCgkJCXZhbCBTZXQ8Um9vbU1vZGVsPiByZWZlcmVuY2VkTW9kZWxzID0gbmV3SGFzaFNldAoJCQlsb2dnZXIubG9nSW5mbygiZ2VuZXJhdGluZyBMYVRlWCBkb2N1bWVudGF0aW9uOiAnIitmaWxlKyInIikKCQkJCgkJCS8vIFNhdmUgZG9jdW1lbnRhdGlvbiBmcmFnbWVudHMgZm9yIFJvb21Nb2RlbCBjaGlsZHJlbgoJCQltb2RlbC5zeXN0ZW1zLmZvckVhY2hbZ2VuZXJhdGVEb2MoY3R4KS5zYXZlQXMobW9kZWwubmFtZStkb2NGcmFnbWVudE5hbWUpXQoJCQltb2RlbC5zeXN0ZW1zLmZvckVhY2hbcmVmZXJlbmNlZE1vZGVscy5hZGRBbGwocm9vdC5nZXRSZWZlcmVuY2VkTW9kZWxzKGl0KSldCgkJCW1vZGVsLnN1YlN5c3RlbUNsYXNzZXMuZm9yRWFjaFtnZW5lcmF0ZURvYyhjdHgpLnNhdmVBcyhtb2RlbC5uYW1lK2RvY0ZyYWdtZW50TmFtZSldCgkJCW1vZGVsLnN1YlN5c3RlbUNsYXNzZXMuZm9yRWFjaFtyZWZlcmVuY2VkTW9kZWxzLmFkZEFsbChyb290LmdldFJlZmVyZW5jZWRNb2RlbHMoaXQpKV0KCQkJbW9kZWwucHJvdG9jb2xDbGFzc2VzLmZvckVhY2hbZ2VuZXJhdGVEb2MoY3R4KS5zYXZlQXMobW9kZWwubmFtZStkb2NGcmFnbWVudE5hbWUpXQoJCQltb2RlbC5wcm90b2NvbENsYXNzZXMuZm9yRWFjaFtyZWZlcmVuY2VkTW9kZWxzLmFkZEFsbChyb290LmdldFJlZmVyZW5jZWRNb2RlbHMoaXQpKV0KCQkJbW9kZWwuZW51bWVyYXRpb25UeXBlcy5mb3JFYWNoW2dlbmVyYXRlRG9jKGN0eCkuc2F2ZUFzKG1vZGVsLm5hbWUrZG9jRnJhZ21lbnROYW1lKV0KCQkJbW9kZWwuZW51bWVyYXRpb25UeXBlcy5mb3JFYWNoW3JlZmVyZW5jZWRNb2RlbHMuYWRkQWxsKHJvb3QuZ2V0UmVmZXJlbmNlZE1vZGVscyhpdCkpXQoJCQltb2RlbC5kYXRhQ2xhc3Nlcy5mb3JFYWNoW2dlbmVyYXRlRG9jKGN0eCkuc2F2ZUFzKG1vZGVsLm5hbWUrZG9jRnJhZ21lbnROYW1lKV0KCQkJbW9kZWwuZGF0YUNsYXNzZXMuZm9yRWFjaFtyZWZlcmVuY2VkTW9kZWxzLmFkZEFsbChyb290LmdldFJlZmVyZW5jZWRNb2RlbHMoaXQpKV0KCQkJbW9kZWwuYWN0b3JDbGFzc2VzLmZvckVhY2hbZ2VuZXJhdGVEb2MoY3R4KS5zYXZlQXMobW9kZWwubmFtZStkb2NGcmFnbWVudE5hbWUpXQoJCQltb2RlbC5hY3RvckNsYXNzZXMuZm9yRWFjaFtyZWZlcmVuY2VkTW9kZWxzLmFkZEFsbChyb290LmdldFJlZmVyZW5jZWRNb2RlbHMoaXQpKV0KCQkJCgkJCS8vIFNhdmUgdG9wLWxldmVsIGRvY3VtZW50YXRpb24gZm9yIFJvb21Nb2RlbAoJCQlnZW5lcmF0ZU1vZGVsRG9jKGN0eCwgcmVmZXJlbmNlZE1vZGVscykuc2F2ZUFzKGZpbGUpCgkJCQovLwkJCWxvZ2dlci5sb2dJbmZvKCJtYWluIHBhdGggIittb2RlbC5kb2NHZW5lcmF0aW9uVGFyZ2V0UGF0aCkKLy8JCQlyZWZlcmVuY2VkTW9kZWxzLmZvckVhY2hbbG9nZ2VyLmxvZ0luZm8oInJlZiBwYXRoICIrZG9jR2VuZXJhdGlvblRhcmdldFBhdGgrIiAtICIKLy8JCQkJK1JlbGF0aXZlUGF0aEhlbHBlcnMuZ2V0UmVsYXRpdmVQYXRoKAovLwkJCQkJbW9kZWwuZG9jR2VuZXJhdGlvblRhcmdldFBhdGgucmVtb3ZlTGFzdCwgZG9jR2VuZXJhdGlvblRhcmdldFBhdGgucmVtb3ZlTGFzdCwgdHJ1ZSkKLy8JCQkpXQoJCX0KCX0KCQoJZGVmIHByaXZhdGUgcmVtb3ZlTGFzdChTdHJpbmcgc3RyKSB7CgkJc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoLTEpCgl9CgkKCWRlZiBwcml2YXRlIGFwcGVuZElmTm90RW1wdHkoU3RyaW5nIHR4dCwgU3RyaW5nIHN1ZmZpeCkgewoJCWlmICh0eHQuZW1wdHkpCgkJCXR4dAoJCWVsc2UKCQkJdHh0K3N1ZmZpeAoJfQoJCglkZWYgcHJpdmF0ZSBnZW5lcmF0ZU1vZGVsRG9jKERvY0dlbi5Eb2NHZW5Db250ZXh0IGN0eCwgU2V0PFJvb21Nb2RlbD4gcmVmZXJlbmNlZE1vZGVscykgewoJCXZhciBtb2RlbCA9IGN0eC5tb2RlbAoJCScnJwoJCVxkb2N1bWVudGNsYXNzW3RpdGxlcGFnZV17YXJ0aWNsZX0KCQlcdXNlcGFja2FnZXtpbXBvcnR9CgkJXHVzZXBhY2thZ2V7Z3JhcGhpY3h9CgkJXHVzZXBhY2thZ2V7eHJ9CgkJXHVzZXBhY2thZ2V7aHlwZXJyZWZ9CgkJXElmRmlsZUV4aXN0c3suLi9kb2MvdXNlcmlucHV0cy50ZXh9e1xzdWJpbXBvcnR7Li4vZG9jL317dXNlcmlucHV0cy50ZXh9fXt9ICVob29rIGZvciBjb25kaXRpb25hbCB1c2VyLXNwZWNpZmljIGlucHV0cywgaW5jbHVkZXMsIG1hY3JvcywgLi4uIAoJCVx1c2VwYWNrYWdlW2E0cGFwZXIsdGV4dD17MTYwbW0sMjU1bW19LGNlbnRlcmluZyxoZWFkc2VwPTVtbSxmb290c2tpcD0xMG1tXXtnZW9tZXRyeX0KCQlcdXNlcGFja2FnZXtub25mbG9hdH0KCQlccGFyaW5kZW50IDBwdAoJCVxtYWtlYXRsZXR0ZXIKCQlcbmV3Y29tbWFuZFxsZXZlbFsxXXslCgkJICAgXGlmY2FzZSMxXHJlbGF4XGV4cGFuZGFmdGVyXGNoYXB0ZXJcb3IKCQkgICAgIFxleHBhbmRhZnRlclxzZWN0aW9uXG9yCgkJICAgICBcZXhwYW5kYWZ0ZXJcc3Vic2VjdGlvblxvcgoJCSAgICAgXGV4cGFuZGFmdGVyXHN1YnN1YnNlY3Rpb25cZWxzZQoJCSAgICAgXGRlZlxuZXh0e1xAbGV2ZWx7IzF9fVxleHBhbmRhZnRlclxuZXh0CgkJICAgXGZpfQoJCQoJCVxuZXdjb21tYW5ke1xAbGV2ZWx9WzFdeyUKCQlcQHN0YXJ0c2VjdGlvbntsZXZlbCMxfQoJCSAgICAgeyMxfQoJCSAgICAge1x6QH0lCgkJICAgICB7LTMuMjVleFxAcGx1cyAtMWV4IFxAbWludXMgLS4yZXh9JQoJCSAgICAgezEuNWV4IFxAcGx1cyAuMmV4fSUKCQkgICAgIHtcbm9ybWFsZm9udFxub3JtYWxzaXplXGJmc2VyaWVzfX0KCQkKCQlcbmV3ZGltZW5cQGxldmVsZGltCgkJIFxuZXdkaW1lblxAZG90c2RpbQoJCSB7XG5vcm1hbGZvbnRcbm9ybWFsc2l6ZQoJCSAgXHNib3hcekB7MH1cZ2xvYmFsXEBsZXZlbGRpbT1cd2RcekAKCQkgIFxzYm94XHpAey59XGdsb2JhbFxAZG90c2RpbT1cd2RcekAKCQkgfSAgCgkJXG5ld2NvdW50ZXJ7bGV2ZWw0fVtzdWJzdWJzZWN0aW9uXQoJCSBcQG5hbWVkZWZ7dGhlbGV2ZWw0fXtcdGhlc3Vic3Vic2VjdGlvbi5cYXJhYmlje2xldmVsNH19CgkJIFxAbmFtZWRlZntsZXZlbDRtYXJrfSMxe30KCQkgXGRlZlxsQHNlY3Rpb257XEBkb3R0ZWR0b2NsaW5lezF9ezBwdH17XGRpbWV4cHJcQGxldmVsZGltKjQrXEBkb3RzZGltKjErNnB0XHJlbGF4fX0KCQkgXGRlZlxsQHN1YnNlY3Rpb257XEBkb3R0ZWR0b2NsaW5lezJ9ezBwdH17XGRpbWV4cHJcQGxldmVsZGltKjUrXEBkb3RzZGltKjIrNnB0XHJlbGF4fX0KCQkgXGRlZlxsQHN1YnN1YnNlY3Rpb257XEBkb3R0ZWR0b2NsaW5lezN9ezBwdH17XGRpbWV4cHJcQGxldmVsZGltKjYrXEBkb3RzZGltKjMrNnB0XHJlbGF4fX0KCQkgXEBuYW1lZGVme2xAbGV2ZWw0fXtcQGRvdHRlZHRvY2xpbmV7NH17MHB0fXtcZGltZXhwclxAbGV2ZWxkaW0qNytcQGRvdHNkaW0qNCs2cHRccmVsYXh9fQoJCQoJCVxjb3VudEA9NAoJCSBcZGVmXEBuY3AjMXtcbnVtYmVyXG51bWV4cHJcY291bnRAKyMxXHJlbGF4fQoJCSBcbG9vcFxpZm51bVxjb3VudEA8MTAwCgkJICAgXGJlZ2luZ3JvdXBcZWRlZlx4e1xlbmRncm91cAoJCSAgICAgXG5vZXhwYW5kXG5ld2NvdW50ZXJ7bGV2ZWxcQG5jcHsxfX1bbGV2ZWxcbnVtYmVyXGNvdW50QF0KCQkgICAgIFxub2V4cGFuZFxAbmFtZWRlZnt0aGVsZXZlbFxAbmNwezF9fXslCgkJICAgICAgIFxub2V4cGFuZFxAbmFtZXVzZXt0aGVsZXZlbFxAbmNwezB9fS5cbm9leHBhbmRcYXJhYmlje2xldmVsXEBuY3B7MH19fQoJCSAgICAgXG5vZXhwYW5kXEBuYW1lZGVme2xldmVsXEBuY3B7MX1tYXJrfSMjIyMxe30lCgkJICAgICBcbm9leHBhbmRcQG5hbWVkZWZ7bEBsZXZlbFxAbmNwezF9fSUKCQkgICAgICAge1xub2V4cGFuZFxAZG90dGVkdG9jbGluZXtcQG5jcHsxfX17MHB0fXtcdGhlXGRpbWV4cHJcQGxldmVsZGltKlxAbmNwezV9K1xAZG90c2RpbSpcQG5jcHswfVxyZWxheH19fSUKCQkgICBceAoJCSAgIFxhZHZhbmNlXGNvdW50QFxAbmUKCQkgXHJlcGVhdAoJCSBcbWFrZWF0b3RoZXIKCQkgXHNldGNvdW50ZXJ7c2VjbnVtZGVwdGh9ezEwMH0KCQkgXHNldGNvdW50ZXJ7dG9jZGVwdGh9ezEwMH0KCgoJCVx0aXRsZXurbW9kZWwubmFtZS5lc2NhcGVkU3RyaW5nuyBNb2RlbCBEb2N1bWVudGF0aW9ufQoJCVxkYXRle1x0b2RheX0KCQlcYXV0aG9ye2dlbmVyYXRlZCBieSBlVHJpY2V9CgkJCgkJXGJlZ2lue2RvY3VtZW50fQoJCQoJCVxwYWdlc3R5bGV7cGxhaW59CgkJXG1ha2V0aXRsZQoJCVx0YWJsZW9mY29udGVudHMKCgkJXG5ld3BhZ2UKCQlcbGlzdG9mZmlndXJlcwoJCVxuZXdwYWdlCgkJXHNlY3Rpb257TW9kZWwgRGVzY3JpcHRpb259CgkJCgkJq0lGICFyZWZlcmVuY2VkTW9kZWxzLmVtcHR5uwoJCQlcc2VjdGlvbntSZWZlcmVuY2VkIE1vZGVsc30KCQkJCgkJCVxiZWdpbntpdGVtaXplfQoJCQmrRk9SIHJlZk1vZGVsIDogcmVmZXJlbmNlZE1vZGVscy5zb3J0QnlbbmFtZV27CqurqwkJCQmrdmFsIHJlbFBhdGggPSBSZWxhdGl2ZVBhdGhIZWxwZXJzLmdldFJlbGF0aXZlUGF0aCgKq6urCQkJCQltb2RlbC5nZW5lcmF0aW9uVGFyZ2V0UGF0aC5yZW1vdmVMYXN0LCByZWZNb2RlbC5nZW5lcmF0aW9uVGFyZ2V0UGF0aC5yZW1vdmVMYXN0LCB0cnVlKS5hcHBlbmRJZk5vdEVtcHR5KCIvIim7CqurqwkJCQlcaXRlbSBcaHJlZnurKHJlbFBhdGgucmVwbGFjZSgiXFwiLCAiLyIpK3JlZk1vZGVsLm5hbWUpLmVzY2FwZWRTdHJpbme7LnBkZn17q3JlZk1vZGVsLm5hbWUuZXNjYXBlZFN0cmluZ7t9CgkJCQlcaXRlbSCrcmVmTW9kZWwubmFtZS5lc2NhcGVkU3RyaW5nuwoJCQmrRU5ERk9SuwoJCQlcZW5ke2l0ZW1pemV9CgkJCVxuZXdwYWdlCgkJq0VORElGuwoJCQoJCatJRiAhbW9kZWwuc3lzdGVtcy5lbXB0ebsKCQkJXHNlY3Rpb257TG9naWNhbCBTeXN0ZW0gQ2xhc3Nlc30KCQkJq0ZPUiBzIDogbW9kZWwuc3lzdGVtc7sKCQkJCatzLmdlbmVyYXRlSW1wb3J0KG1vZGVsLm5hbWUpuwoJCQmrRU5ERk9SuwoJCQlcbmV3cGFnZQoJCatFTkRJRrsKCQkKCQmrSUYgIW1vZGVsLnN1YlN5c3RlbUNsYXNzZXMuZW1wdHm7CgkJCVxzZWN0aW9ue1N1YnN5c3RlbSBDbGFzc2VzfQoJCQmrRk9SIHMgOiBtb2RlbC5zdWJTeXN0ZW1DbGFzc2VzuwoJCQkJq3MuZ2VuZXJhdGVJbXBvcnQobW9kZWwubmFtZSm7CgkJCatFTkRGT1K7CgkJCVxuZXdwYWdlCgkJq0VORElGuwoJCQoJCatJRiAhbW9kZWwucHJvdG9jb2xDbGFzc2VzLmVtcHR5uwoJCQlcc2VjdGlvbntQcm90b2NvbCBDbGFzc2VzfQoJCQmrRk9SIGMgOiBtb2RlbC5wcm90b2NvbENsYXNzZXO7CgkJCQmrYy5nZW5lcmF0ZUltcG9ydChtb2RlbC5uYW1lKbsKCQkJq0VOREZPUrsKCQkJXG5ld3BhZ2UKCQmrRU5ESUa7CgkJCgkJq0lGICFtb2RlbC5lbnVtZXJhdGlvblR5cGVzLmVtcHR5uwoJCQlcc2VjdGlvbntFbnVtZXJhdGlvbiBUeXBlc30KCQkJq0ZPUiBlIDogbW9kZWwuZW51bWVyYXRpb25UeXBlc7sKCQkJCatlLmdlbmVyYXRlSW1wb3J0KG1vZGVsLm5hbWUpuwoJCQmrRU5ERk9SuwoJCQlcbmV3cGFnZQoJCatFTkRJRrsKCQkKCQmrSUYgIW1vZGVsLmRhdGFDbGFzc2VzLmVtcHR5uwoJCQlcc2VjdGlvbntEYXRhIENsYXNzZXN9CgkJCatGT1IgYyA6IG1vZGVsLmRhdGFDbGFzc2VzuwoJCQkJq2MuZ2VuZXJhdGVJbXBvcnQobW9kZWwubmFtZSm7CgkJCatFTkRGT1K7CgkJCVxuZXdwYWdlCgkJq0VORElGuwoJCQoJCatJRiAhbW9kZWwuYWN0b3JDbGFzc2VzLmVtcHR5uwoJCQlcc2VjdGlvbntBY3RvciBDbGFzc2VzfQoJCQmrRk9SIGMgOiBtb2RlbC5hY3RvckNsYXNzZXO7CgkJCQmrYy5nZW5lcmF0ZUltcG9ydChtb2RlbC5uYW1lKbsKCQkJq0VOREZPUrsKCQmrRU5ESUa7CgkJXGVuZHtkb2N1bWVudH0KCScnJwoJfQoJCglkZWYgcHJpdmF0ZSBkaXNwYXRjaCBnZW5lcmF0ZURvYyhMb2dpY2FsU3lzdGVtIHN5c3RlbSwgRG9jR2VuLkRvY0dlbkNvbnRleHQgY3R4KSB7CgkJdmFsIGZpbGVuYW1lID0gc3lzdGVtLm5hbWUgKyAiX2luc3RhbmNlVHJlZS5qcGciCgkJJycnCgkJXGxldmVsezJ9e6tzeXN0ZW0ubmFtZS5lc2NhcGVkU3RyaW5nu30KCQmrc3lzdGVtLmRvY3UuZ2VuZXJhdGVEb2NUZXh0uwoJCVxsZXZlbHszfXtJbnN0YW5jZSBUcmVlfQoJCatJRiBjdHgubW9kZWwuZmlsZUV4aXN0cyhmaWxlbmFtZS5pbWFnZVBhdGgpLmVxdWFscygidHJ1ZSIpuwoJCQmraW5jbHVkZUdyYXBoaWNzKGZpbGVuYW1lLmltYWdlUGF0aCxJTUdXSURUSF9ERUZBVUxULHN5c3RlbS5uYW1lICsgIiBJbnN0YW5jZSBUcmVlIim7CgkJq0VORElGuwoJCScnJwoJfQoJCglkZWYgcHJpdmF0ZSBkaXNwYXRjaCBnZW5lcmF0ZURvYyhTdWJTeXN0ZW1DbGFzcyBzc2MsIERvY0dlbi5Eb2NHZW5Db250ZXh0IGN0eCkgewoJCXZhbCBmaWxlbmFtZSA9IHNzYy5uYW1lLmVzY2FwZWRTdHJpbmcgKyAiX3N0cnVjdHVyZS5qcGciCgkJCgkJJycnCgkJXGxldmVsezJ9e6tzc2MubmFtZS5lc2NhcGVkU3RyaW5nu30KCQmrc3NjLmRvY3UuZ2VuZXJhdGVEb2NUZXh0uwoJCVxsZXZlbHszfXtTdHJ1Y3R1cmV9CgkJq0lGIGN0eC5tb2RlbC5maWxlRXhpc3RzKGZpbGVuYW1lLmltYWdlUGF0aCkuZXF1YWxzKCJ0cnVlIim7CgkJCatpbmNsdWRlR3JhcGhpY3MoZmlsZW5hbWUuaW1hZ2VQYXRoLElNR1dJRFRIX0RFRkFVTFQsc3NjLm5hbWUgKyAiIFN0cnVjdHVyZSIpuwoJCatFTkRJRrsKCQknJycKCX0KCQoJZGVmIHByaXZhdGUgZGlzcGF0Y2ggZ2VuZXJhdGVEb2MoRW51bWVyYXRpb25UeXBlIGRjLCBEb2NHZW4uRG9jR2VuQ29udGV4dCBjdHgpIHsKCScnJwoJCVxsZXZlbHsyfSB7q2RjLm5hbWUuZXNjYXBlZFN0cmluZ7t9CgkJq2RjLmRvY3UuZ2VuZXJhdGVEb2NUZXh0uwoJCatJRiBkYy5wcmltaXRpdmVUeXBlIT09bnVsbLsKCQkJVGhlIGxpdGVyYWxzIG9mIHRoaXMgZW51bWVyYXRpb24gYXJlIGJhc2VkIG9uIFByaW1pdGl2ZVR5cGUgq2RjLnByaW1pdGl2ZVR5cGUubmFtZS5lc2NhcGVkU3RyaW5nuy4KCQmrRUxTRbsKCQkJVGhlIGxpdGVyYWxzIG9mIHRoaXMgZW51bWVyYXRpb24gYXJlIG9mIHR5cGUgXHRleHR0dHtpbnR9LgoJCatFTkRJRrsKCQlcbGV2ZWx7M317TGl0ZXJhbHN9CgkJXGJlZ2lue3RhYnVsYXJ9W2h0XXt8bHxyfHJ8cnx9CgkJXGhsaW5lCgkJXHRleHRiZntOYW1lfSAmIFx0ZXh0YmZ7VmFsdWV9ICYgXHRleHRiZntIZXggVmFsdWV9ICYgXHRleHRiZntCaW5hcnkgVmFsdWV9XFwKCQmrRk9SIGxpdDogZGMubGl0ZXJhbHO7CgkJCVxobGluZQoJCQmrbGl0Lm5hbWUuZXNjYXBlZFN0cmluZ7sgJiCrbGl0LmxpdGVyYWxWYWx1ZbsgJiAweKtMb25nLnRvSGV4U3RyaW5nKGxpdC5saXRlcmFsVmFsdWUpuyAmIKtMb25nLnRvQmluYXJ5U3RyaW5nKGxpdC5saXRlcmFsVmFsdWUpu1xcCgkJq0VOREZPUrsKCQlcaGxpbmUKCQlcZW5ke3RhYnVsYXJ9CgknJycJCgl9CgkKCWRlZiBwcml2YXRlIGRpc3BhdGNoIGdlbmVyYXRlRG9jKERhdGFDbGFzcyBkYywgRG9jR2VuLkRvY0dlbkNvbnRleHQgY3R4KSB7JycnCgkJXGxldmVsezJ9IHurZGMubmFtZS5lc2NhcGVkU3RyaW5nu30KCQmrZGMuZG9jdS5nZW5lcmF0ZURvY1RleHS7CgkJXGxldmVsezN9e0F0dHJpYnV0ZXN9CgkJq2RjLmF0dHJpYnV0ZXMuZ2VuZXJhdGVBdHRyaWJ1dGVzRG9juwoJCQoJCVxsZXZlbHszfXtPcGVyYXRpb25zfQoJCatkYy5vcGVyYXRpb25zLmdlbmVyYXRlT3BlcmF0aW9uc0RvY7sKCScnJwkKCX0KCQoJZGVmIHByaXZhdGUgZGlzcGF0Y2ggZ2VuZXJhdGVEb2MoUHJvdG9jb2xDbGFzcyBwYywgRG9jR2VuLkRvY0dlbkNvbnRleHQgY3R4KSB7JycnCgkJXGxldmVsezJ9IHurcGMubmFtZS5lc2NhcGVkU3RyaW5nu30KCQmrcGMuZG9jdS5nZW5lcmF0ZURvY1RleHS7CgkJq0lGICFwYy5hbGxJbmNvbWluZ01lc3NhZ2VzLmVtcHR5uwoJCQlcbGV2ZWx7M317SW5jb21pbmcgTWVzc2FnZXN9CgkJCQoJCQlcYmVnaW57dGFidWxhcn1baHRde3xsfGx8cHs4Y219fH0KCQkJXGhsaW5lCgkJCU1lc3NhZ2UgJiBUeXBlICYgRGVzY3JpcHRpb25cXAoJCQmrRk9SIGltcyA6IHBjLmFsbEluY29taW5nTWVzc2FnZXO7CgkJCQlcaGxpbmUKCQkJCatpbXMubmFtZS5lc2NhcGVkU3RyaW5nuyAmIKtJRiBpbXMuZGF0YSAhPT0gbnVsbLsgq2ltcy5kYXRhLnJlZlR5cGUudHlwZS5uYW1lLmVzY2FwZWRTdHJpbme7IKtFTkRJRrsgJiCraW1zLmRvY3UuZ2VuZXJhdGVEb2NUZXh0u1xcCgkJCatFTkRGT1K7CgkJCVxobGluZQoJCQlcZW5ke3RhYnVsYXJ9CgkJq0VORElGuwoJCatJRiAhcGMuYWxsT3V0Z29pbmdNZXNzYWdlcy5lbXB0ebsKCQkJXGxldmVsezN9e091dGdvaW5nIE1lc3NhZ2VzfQoJCQlcYmVnaW57dGFidWxhcn1baHRde3xsfGx8cHs4Y219fH0KCQkJXGhsaW5lCgkJCU1lc3NhZ2UgJiBUeXBlICYgRGVzY3JpcHRpb25cXAoJCQmrRk9SIG9tcyA6IHBjLmFsbE91dGdvaW5nTWVzc2FnZXO7CgkJCQlcaGxpbmUKCQkJCatvbXMubmFtZS5lc2NhcGVkU3RyaW5nuyAmIKtJRiBvbXMuZGF0YSAhPT0gbnVsbLsgq29tcy5kYXRhLnJlZlR5cGUudHlwZS5uYW1lLmVzY2FwZWRTdHJpbme7IKtFTkRJRrsgJiCrb21zLmRvY3UuZ2VuZXJhdGVEb2NUZXh0u1xcCgkJCatFTkRGT1K7CgkJCVxobGluZQoJCQlcZW5ke3RhYnVsYXJ9CgkJq0VORElGuwoJJycnCQoJfQoJCglkZWYgcHJpdmF0ZSBkaXNwYXRjaCBnZW5lcmF0ZURvYyhDb21wb3VuZFByb3RvY29sQ2xhc3MgcGMsIERvY0dlbi5Eb2NHZW5Db250ZXh0IGN0eCkgeycnJwoJCVxsZXZlbHsyfSB7q3BjLm5hbWUuZXNjYXBlZFN0cmluZ7t9CgkJq3BjLmRvY3UuZ2VuZXJhdGVEb2NUZXh0uwoJCVxsZXZlbHszfXtTdWIgUHJvdG9jb2xzfQoJCQoJCVxiZWdpbnt0YWJ1bGFyfVtodF17fGx8bHx9CgkJXGhsaW5lCgkJXHRleHRiZntOYW1lfSAmIFx0ZXh0YmZ7UHJvdG9jb2x9XFwKCQmrRk9SIHN1YiA6IHBjLnN1YlByb3RvY29sc7sKCQkJXGhsaW5lCgkJCatzdWIubmFtZS5lc2NhcGVkU3RyaW5nuyAmIKtzdWIucHJvdG9jb2wubmFtZS5lc2NhcGVkU3RyaW5nu1xcCgkJq0VOREZPUrsKCQlcaGxpbmUKCQlcZW5ke3RhYnVsYXJ9CgknJycKCX0KCQoJZGVmIGRpc3BhdGNoIHByaXZhdGUgZ2VuZXJhdGVEb2MoQWN0b3JDbGFzcyBhYywgRG9jR2VuLkRvY0dlbkNvbnRleHQgY3R4KSB7CgkJdmFsIGZpbGVuYW1lID0gYWMubmFtZSArICJfc3RydWN0dXJlLmpwZyIKCQknJycKCQlcbGV2ZWx7Mn17q2FjLm5hbWUuZXNjYXBlZFN0cmluZ7t9CgkJq2FjLmRvY3UuZ2VuZXJhdGVEb2NUZXh0uwoJCQoJCatJRiBjdHgubW9kZWwuZmlsZUV4aXN0cyhmaWxlbmFtZS5pbWFnZVBhdGgpLmVxdWFscygidHJ1ZSIpICYmICghYWMuYWxsSW50ZXJmYWNlSXRlbXMuZW1wdHkgfHwgIWFjLmFjdG9yUmVmcy5lbXB0eSm7CgkJCVxsZXZlbHszfXtTdHJ1Y3R1cmV9CgkJCathYy5zdHJ1Y3R1cmVEb2N1LmdlbmVyYXRlRG9jVGV4dLsKCQkJq2luY2x1ZGVHcmFwaGljcyhmaWxlbmFtZS5pbWFnZVBhdGgsSU1HV0lEVEhfREVGQVVMVCxhYy5uYW1lICsgIiBTdHJ1Y3R1cmUiKbsKCQmrRUxTRUlGIGFjLnN0cnVjdHVyZURvY3UgIT09IG51bGy7CgkJCVxsZXZlbHszfXtTdHJ1Y3R1cmV9CgkJCathYy5zdHJ1Y3R1cmVEb2N1LmdlbmVyYXRlRG9jVGV4dLsKCQmrRU5ESUa7CgkJCgkJq0lGICFhYy5hbGxQb3J0cy5lbXB0ebsKCQkJXGxldmVsezN9e1BvcnRzfQoJCQmrZ2VuZXJhdGVQb3J0RG9jKGFjKbsKCQmrRU5ESUa7CgkJCgkJq0lGIGFjLmlzQmVoYXZpb3JBbm5vdGF0aW9uUHJlc2VudCgiQmVoYXZpb3JNYW51YWwiKbsKCQkJXGxldmVsezN9e0JlaGF2aW9yfQoJCQmrYWMuYmVoYXZpb3JEb2N1LmdlbmVyYXRlRG9jVGV4dLsKCQkJVGhlIGJlaGF2aW9yIGZvciBBY3RvckNsYXNzIKthYy5uYW1luyBpcyBpbXBsZW1lbnRlZCBtYW51YWxseS4KCQmrRUxTRUlGIGFjLmhhc05vbkVtcHR5U3RhdGVNYWNoaW5luwoJCQlcbGV2ZWx7M317QmVoYXZpb3J9CgkJCathYy5iZWhhdmlvckRvY3UuZ2VuZXJhdGVEb2NUZXh0uwoJCQmrZ2VuZXJhdGVGc21Eb2MoY3R4Lm1vZGVsLCBhYym7CgkJq0VMU0VJRiBhYy5iZWhhdmlvckRvY3UgIT09IG51bGy7CgkJCVxsZXZlbHszfXtCZWhhdmlvcn0KCQkJq2FjLmJlaGF2aW9yRG9jdS5nZW5lcmF0ZURvY1RleHS7CgkJq0VORElGuwoJCQoJCatJRiAhYWMuYXR0cmlidXRlcy5lbXB0ebsKCQkJXGxldmVsezN9e0F0dHJpYnV0ZXN9CgkJCathYy5hdHRyaWJ1dGVzLmdlbmVyYXRlQXR0cmlidXRlc0RvY7sKCQmrRU5ESUa7CgkJCgkJq0lGICFhYy5vcGVyYXRpb25zLmVtcHR5uwoJCQlcbGV2ZWx7M317T3BlcmF0aW9uc30KCQkJq2FjLm9wZXJhdGlvbnMuZ2VuZXJhdGVPcGVyYXRpb25zRG9juwoJCatFTkRJRrsKCQknJycKCX0KCglkZWYgcHJpdmF0ZSBnZW5lcmF0ZUZzbURvYyhSb29tTW9kZWwgbW9kZWwsIEFjdG9yQ2xhc3MgYWMpewoJCXZhbCBmaWxlbmFtZSA9IGFjLm5hbWUgKyAiX2JlaGF2aW9yLmpwZyIKCQknJycKCQlcbGV2ZWx7NH17VG9wIExldmVsfQoJCatJRiBtb2RlbC5maWxlRXhpc3RzKGZpbGVuYW1lLmltYWdlUGF0aCkuZXF1YWxzKCJ0cnVlIim7CgkJCatpbmNsdWRlR3JhcGhpY3MoZmlsZW5hbWUuaW1hZ2VQYXRoLElNR1dJRFRIX0RFRkFVTFQsYWMubmFtZSArICIgVG9wIFN0YXRlIim7CgkJq0VORElGuwoJCQoJCVxiZWdpbntwYXJ9CgkJq0ZPUiBzIDogYWMuc3RhdGVNYWNoaW5lLnN0YXRlc7sKCQkJq0lGIHMuZG9jdSAhPT0gbnVsbLsJCgkJCQlcdGV4dGJme1N0YXRlIGRlc2NyaXB0aW9ufSBcdGV4dGl0e6tzLmdlblN0YXRlUGF0aE5hbWUucmVwbGFjZUFsbCgiXyIsIlxcXFxfIim7fToKCQkJCVxuZXdsaW5lCgkJCQmrZ2VuZXJhdGVEb2NUZXh0KHMuZG9jdSm7CgkJCQlcbmV3bGluZVxuZXdsaW5lCgkJCatFTkRJRrsKCQmrRU5ERk9SuwoKCQmrRk9SIGMgOiBhYy5zdGF0ZU1hY2hpbmUuY2hQb2ludHO7CgkJCatJRiBjLmRvY3UgIT09IG51bGy7CgkJCQlcdGV4dGJme0Nob2ljZXBvaW50IGRlc2NyaXB0aW9ufSBcdGV4dGl0e6tjLm5hbWUuZXNjYXBlZFN0cmluZ7t9OgoJCQkJXG5ld2xpbmUKCQkJCatnZW5lcmF0ZURvY1RleHQoYy5kb2N1KbsKCQkJCVxuZXdsaW5lXG5ld2xpbmUKCQkJq0VORElGuwoJCatFTkRGT1K7CgkJXGVuZHtwYXJ9CgkJCgkJq0ZPUiBzIDogYWMuc3RhdGVNYWNoaW5lLnN0YXRlc7sJCgkJCatJRiAhcy5pc0xlYWa7CgkJCQmrZ2VuZXJhdGVTdGF0ZURvYyhtb2RlbCwgYWMsIHMpuwoJCQmrRU5ESUa7CgkJq0VOREZPUrsJCQoJCScnJwoJfQoJCglkZWYgcHJpdmF0ZSBnZXRUeXBlKFBvcnQgcCkgewoJCWlmIChwLmNvbmp1Z2F0ZWQpICJjb25qLiIgZWxzZSAicmVnLiIKCX0KCQoJZGVmIHByaXZhdGUgZ2V0S2luZChQb3J0IHApIHsKCQlpZiAocC5pbnRlcm5hbCkKCQkJImludGVybmFsIgoJCWVsc2UgaWYgKHAuZXh0ZXJuYWwpCgkJCSJleHRlcm5hbCIKCQllbHNlIGlmIChwLnJlbGF5KQoJCQkicmVsYXkiCgkJZWxzZQoJCQkiPyIKCX0KCQoJZGVmIHByaXZhdGUgU3RyaW5nIGdldE11bHRBc1RleHQoUG9ydCBwKSB7CgkJaWYgKHAubXVsdGlwbGljaXR5PT0tMSkKCQkJIioiCgkJZWxzZQoJCQlwLm11bHRpcGxpY2l0eS50b1N0cmluZwoJfQoJCglkZWYgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVQb3J0RG9jKEFjdG9yQ2xhc3MgYWMpIHsKCQknJycKCQkJXGJlZ2lue3RhYnVsYXJ9W2h0XXt8bHxsfGx8bHxsfHB7NWNtfXx9CgkJCVxobGluZQoJCQlcdGV4dGJme05hbWV9ICYgXHRleHRiZntQcm90b2NvbH0gJiBcdGV4dGJme1R5cGV9ICYgXHRleHRiZntLaW5kfSAmIFx0ZXh0YmZ7TXVsdGlwbGljaXR5fSAmIFx0ZXh0YmZ7RGVzY3JpcHRpb259XFwKCQkJq0ZPUiBhdCA6IGFjLmFsbFBvcnRzuwoJCQkJXGhsaW5lCgkJCQmrYXQubmFtZS5lc2NhcGVkU3RyaW5nuyAmIKthdC5wcm90b2NvbC5uYW1lLmVzY2FwZWRTdHJpbme7ICYgq2F0LnR5cGW7ICYgq2F0LmtpbmS7ICYgq2F0Lm11bHRBc1RleHS7ICYgq2dlbmVyYXRlRG9jVGV4dChhdC5kb2N1KbtcXAoJCQmrRU5ERk9SuwkKCQkJXGhsaW5lCgkJCVxlbmR7dGFidWxhcn0KCQknJycKCX0KCQoJZGVmIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlU3RhdGVEb2MoUm9vbU1vZGVsIG1vZGVsLCBBY3RvckNsYXNzIGFjLCBTdGF0ZSBzdGF0ZSl7CgkJdmFsIGZpbGVuYW1lID0gYWMubmFtZSArICJfIiArIHN0YXRlLmdlblN0YXRlUGF0aE5hbWUgKyAiX2JlaGF2aW9yLmpwZyIKCgkJbG9nZ2VyLmxvZ0luZm8oIkdlbiBGaWxlbmFtZTogIiArIGZpbGVuYW1lKTsgCgkJJycnCgkJXGxldmVsezR9e1N1YmdyYXBoIKtzdGF0ZS5nZW5TdGF0ZVBhdGhOYW1lLnJlcGxhY2VBbGwoIl8iLCJcXFxcXyIpu30KCQmrSUYgbW9kZWwuZmlsZUV4aXN0cyhmaWxlbmFtZS5pbWFnZVBhdGgpLmVxdWFscygidHJ1ZSIpuwoJCQmraW5jbHVkZUdyYXBoaWNzKGZpbGVuYW1lLmltYWdlUGF0aCxJTUdXSURUSF9ERUZBVUxULGFjLm5hbWUgKyAiXyIgKyBzdGF0ZS5nZW5TdGF0ZVBhdGhOYW1lKbsKCQmrRU5ESUa7CgkJCgkJXGJlZ2lue3Bhcn0KCQmrRk9SIHMgOiBzdGF0ZS5zdWJncmFwaC5zdGF0ZXO7CgkJCatJRiBzLmRvY3UgIT09IG51bGy7CQoJCQkJXHRleHRiZntTdGF0ZSBkZXNjcmlwdGlvbn0gXHRleHRpdHurcy5nZW5TdGF0ZVBhdGhOYW1lLnJlcGxhY2VBbGwoIl8iLCJcXFxcXyIpu306CgkJCQlcbmV3bGluZQoJCQkJq2dlbmVyYXRlRG9jVGV4dChzLmRvY3UpuwoJCQkJXG5ld2xpbmVcbmV3bGluZQoJCQmrRU5ESUa7CgkJq0VOREZPUrsKCgkJq0ZPUiBjIDogc3RhdGUuc3ViZ3JhcGguY2hQb2ludHO7CgkJCatJRiBjLmRvY3UgIT09IG51bGy7CgkJCQlcdGV4dGJme0Nob2ljZXBvaW50IGRlc2NyaXB0aW9ufSBcdGV4dGl0e6tjLm5hbWUuZXNjYXBlZFN0cmluZ7t9OgoJCQkJXG5ld2xpbmUKCQkJCatnZW5lcmF0ZURvY1RleHQoYy5kb2N1KbsKCQkJCVxuZXdsaW5lXG5ld2xpbmUKCQkJq0VORElGuwoJCatFTkRGT1K7CgkJXGVuZHtwYXJ9CgkJCQoJCatGT1IgcyA6IHN0YXRlLnN1YmdyYXBoLnN0YXRlc7sJCgkJCatJRiAhcy5pc0xlYWa7CgkJCQmrZ2VuZXJhdGVTdGF0ZURvYyhtb2RlbCwgYWMsIHMpuwoJCQmrRU5ESUa7CgkJq0VOREZPUrsJCQoJCScnJwkJCgl9CgoJZGVmIHByaXZhdGUgZ2VuZXJhdGVBdHRyaWJ1dGVzRG9jKExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzKSB7CgkJJycnCgkJq0lGICFhdHRyaWJ1dGVzLmVtcHR5uwoJCQlcYmVnaW57dGFidWxhcn1baHRde3xsfGx8cHs4Y219fH0KCQkJXGhsaW5lCgkJCVx0ZXh0YmZ7TmFtZX0gJiBcdGV4dGJme1R5cGV9ICYgXHRleHRiZntEZXNjcmlwdGlvbn1cXAoJCQmrRk9SIGF0IDogYXR0cmlidXRlc7sKCQkJXGhsaW5lCgkJCathdC5uYW1lLmVzY2FwZWRTdHJpbme7ICYgq2F0LnR5cGUudHlwZS5uYW1lLmVzY2FwZWRTdHJpbme7ICYgq2dlbmVyYXRlRG9jVGV4dChhdC5kb2N1KbtcXAoJCQmrRU5ERk9SuwkKCQkJXGhsaW5lCgkJCVxlbmR7dGFidWxhcn0KCQmrRU5ESUa7CQoJCScnJwoJCX0KCQoJZGVmIHByaXZhdGUgZ2VuZXJhdGVPcGVyYXRpb25zRG9jKExpc3Q8U3RhbmRhcmRPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKCQknJycKCQmrRk9SIG9wIDogb3BlcmF0aW9uc7sKCQkJXGJlZ2lue3RhYnVsYXJ9W2h0XXt8bHxsfH0KCQkJXGhsaW5lCQkKCQkJCU5hbWU6ICYgq29wLm5hbWUuZXNjYXBlZFN0cmluZ7tcXAoJCQkJXGhsaW5lCgkJCQlSZXR1cm5UeXBlOiAmICCrSUYgb3AucmV0dXJuVHlwZSAhPT0gbnVsbLurb3AucmV0dXJuVHlwZS50eXBlLm5hbWUuZXNjYXBlZFN0cmluZ7urRUxTRbt2b2lkq0VORElGu1xcCgkJCQlcaGxpbmUKCQkJCUFyZ3VtZW50czogJiCrRk9SIHBhIDogb3AuYXJndW1lbnRzIFNFUEFSQVRPUiAiLCAiu6twYS5uYW1lLmVzY2FwZWRTdHJpbme7OqtwYS5yZWZUeXBlLnR5cGUubmFtZS5lc2NhcGVkU3RyaW5nu6tFTkRGT1K7XFwKCQkJCatJRiBvcC5kb2N1ICE9PSBudWxsuwoJCQkJCVxobGluZQoJCQkJCatJRiBvcC5kb2N1LnRvU3RyaW5nLmxlbmd0aCA+IDg1uwoJCQkJCQlcbXVsdGljb2x1bW57Mn0ge3xwezEzY219fH0ge6tnZW5lcmF0ZURvY1RleHQob3AuZG9jdSm7fVxcCgkJCQkJq0VMU0W7CgkJCQkJCVxtdWx0aWNvbHVtbnsyfSB7fGx8fSB7q2dlbmVyYXRlRG9jVGV4dChvcC5kb2N1Kbt9XFwKCQkJCQmrRU5ESUa7CgkJCQmrRU5ESUa7CgkJCQlcaGxpbmUKCQkJXGVuZHt0YWJ1bGFyfQoJCQlcbmV3bGluZVxuZXdsaW5lXG5ld2xpbmUKCQmrRU5ERk9SuwoJCScnJwoJfQoJCglkZWYgcHJpdmF0ZSBnZW5lcmF0ZURvY1RleHQoRG9jdW1lbnRhdGlvbiBkb2MpewoJCScnJwoJCatJRiBkb2MhPT1udWxsuwoJCQklIGJlZ2luIHRleHQgZnJvbSB1c2VyIERvY3VtZW50YXRpb24KCQkJq0ZPUiBsaW5lOiBkb2MubGluZXO7CgkJCQmrbGluZS5lc2NhcGVkU3RyaW5nuwoJCQmrRU5ERk9SuwoJCQklIGVuZCB0ZXh0IGZyb20gdXNlciBEb2N1bWVudGF0aW9uCgkJq0VORElGuwoJCScnJwoJfQoJCglkZWYgcHJpdmF0ZSBmaWxlRXhpc3RzKFJvb21Nb2RlbCBtb2RlbCwgU3RyaW5nIGYpewovLwkJdmFsIGFic1BhdGggPSBtb2RlbC5nZW5lcmF0aW9uVGFyZ2V0UGF0aCArIGYKLy8JCXZhbCBmaWxlID0gbmV3IEZpbGUoYWJzUGF0aCk7Ci8vCQl2YWwgZXhpc3QgPSBmaWxlLmV4aXN0cygpOwovLwkJCWlmIChleGlzdCA9PSB0cnVlKSB7Ci8vCQkJCS8vIEZpbGUgb3IgZGlyZWN0b3J5IGV4aXN0cwovLwkJCQlsb2dnZXIubG9nSW5mbygiRmlsZSBmb3VuZCAhICIgKyBmKTsgCi8vCQkJCXJldHVybiAidHJ1ZSIKLy8JCQl9IGVsc2UgewovLwkJCQkvLyBGaWxlIG9yIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAovLwkJCQlsb2dnZXIubG9nSW5mbygiRmlsZSBub3QgZm91bmQgISAiICsgZik7Ci8vCQkJCXJldHVybiAiZmFsc2UiCi8vCQl9CgogCgkJcmV0dXJuICJmYWxzZSIKCX0KCQoJZGVmIHByaXZhdGUgaW5jbHVkZUdyYXBoaWNzKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHdpZHRoLCBTdHJpbmcgY2FwdGlvbil7CgkJdmFyIGxhdGV4Q2FwdGlvbiA9IGNhcHRpb24ucmVwbGFjZUFsbCgiXyIsIlxcXFxfIik7CgkJJycnCgkJCXsKCQkJXGNlbnRlcmluZ3t9CgkJCVxpbmNsdWRlZ3JhcGhpY3Nbd2lkdGg9q3dpZHRou117q2ZpbGVuYW1lu30KCQkJXGZpZ2NhcHRpb257q2xhdGV4Q2FwdGlvbrt9CgkJCX0KCQknJycKCX0KCQoJZGVmIHByaXZhdGUgZXNjYXBlZFN0cmluZyhTdHJpbmcgdGV4dCkgewoJCXRleHQucmVwbGFjZSgiXyIsIlxcXyIpCgl9CgkKCWRlZiBwcml2YXRlIGdldEltYWdlUGF0aChTdHJpbmcgZmlsZW5hbWUpIHsKCQl2YXIgZmlsZW5hbWVpID0gSU1HRElSX0RFRkFVTFQgKyAiLyIgKyBmaWxlbmFtZQoJCWZpbGVuYW1laSA9IGZpbGVuYW1laS5yZXBsYWNlQWxsKCJcXFxcIiwiLyIpCgkJcmV0dXJuIGZpbGVuYW1laQoJfQoJCglkZWYgcHJpdmF0ZSBzYXZlQXMoQ2hhclNlcXVlbmNlIGNvbnRlbnQsIFN0cmluZyBmaWxlbmFtZSkgewoJCWZpbGVJTy5nZW5lcmF0ZUZpbGUoZmlsZW5hbWUsIGNvbnRlbnQpCgl9CgkKCWRlZiBwcml2YXRlIGRvY0ZyYWdtZW50TmFtZShSb29tQ2xhc3MgcmMpIHsKCQlyYy5uYW1lICsgIi50ZXgiCgl9CgkKCWRlZiBwcml2YXRlIGdlbmVyYXRlSW1wb3J0KFJvb21DbGFzcyByYywgU3RyaW5nIGRpcikKCQknJyercmMuZG9jRnJhZ21lbnROYW1lLmdlbmVyYXRlSW1wb3J0KGRpcim7JycnCgkKCWRlZiBwcml2YXRlIGdlbmVyYXRlSW1wb3J0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGlyKQoJCScnJ1xzdWJpbXBvcnQqe6tkaXK7L317q25hbWW7fScnJwp9Cg==