LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklXZWJNb2R1bGU7Ci8qKgogKiBUb21jYXQgNDAgaGFuZGxlci4KICovCnB1YmxpYyBjbGFzcyBUb21jYXQ0MEhhbmRsZXIgaW1wbGVtZW50cyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgewoJcHVibGljIGJvb2xlYW4gdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKCQlpZiAoaW5zdGFsbFBhdGggPT0gbnVsbCkKCQkJcmV0dXJuIGZhbHNlOwoKCQlTdHJpbmcgcyA9IGluc3RhbGxQYXRoLmxhc3RTZWdtZW50KCk7CgkJaWYgKHMgIT0gbnVsbCAmJiBzLnN0YXJ0c1dpdGgoImpha2FydGEtdG9tY2F0LSIpICYmICFzLnN0YXJ0c1dpdGgoImpha2FydGEtdG9tY2F0LTQuMCIpKQoJCQlyZXR1cm4gZmFsc2U7CgkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aChpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF80MCk7Cgl9CgkKCS8qKgoJICogUmV0dXJuIHRoZSBydW50aW1lIGNsYXNzIG5hbWUuCgkgKgoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewoJCXJldHVybiAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCI7Cgl9CgkKCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKCQlMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwoJCQoJCS8vIDQuMCAtIGFkZCBib290c3RyYXAuamFyIGZyb20gdGhlIFRvbWNhdCBiaW4gZGlyZWN0b3J5CgkJSVBhdGggYmluUGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgiYmluIik7CgkJaWYgKGJpblBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKCQkJSVBhdGggcGF0aCA9IGJpblBhdGguYXBwZW5kKCJib290c3RyYXAuamFyIik7CgkJCWNwLmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpKTsKCQl9CgkJCgkJcmV0dXJuIGNwOwoJfQoKCS8qKgoJICogUmV0dXJuIHRoZSBwcm9ncmFtJ3MgcnVudGltZSBhcmd1bWVudHMuCgkgKgoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KCSAqLwoJcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJaWYgKGNvbmZpZ1BhdGggIT0gbnVsbCkgewoJCQlsaXN0LmFkZCgiLWNvbmZpZyBcIiIgKyBjb25maWdQYXRoLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSArICJcIiIpOwoJCX0KCQkKCQlpZiAoZGVidWcpCgkJCWxpc3QuYWRkKCItZGVidWciKTsKCQkKCQlpZiAoc3RhcnRpbmcpCgkJCWxpc3QuYWRkKCJzdGFydCIpOwoJCWVsc2UKCQkJbGlzdC5hZGQoInN0b3AiKTsKCQkKCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07CgkJbGlzdC50b0FycmF5KHMpOwoJCXJldHVybiBzOwoJfQoKCS8qKgoJICogUmV0dXJuIHRoZSBydW50aW1lIChWTSkgYXJndW1lbnRzLgoJICoKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCgkgKi8KCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gaXNTZWN1cmUpIHsKCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJbGlzdC5hZGQoIi1EY2F0YWxpbmEuaG9tZT1cIiIgKyBpbnN0YWxsUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKCQlTdHJpbmcgZW5kb3JzZWQgPSBpbnN0YWxsUGF0aC5hcHBlbmQoImJpbiIpLnRvT1NTdHJpbmcoKSArCgkJCWluc3RhbGxQYXRoLmFwcGVuZCgiY29tbW9uIikuYXBwZW5kKCJsaWIiKS50b09TU3RyaW5nKCk7CgkJbGlzdC5hZGQoIi1EamF2YS5lbmRvcnNlZC5kaXJzPVwiIiArIGVuZG9yc2VkICsgIlwiIik7CgkJCgkJLy8gcnVuIGluIHNlY3VyZSBtb2RlCgkJaWYgKGlzU2VjdXJlKSB7CgkJCWxpc3QuYWRkKCItRGphdmEuc2VjdXJpdHkubWFuYWdlciIpOwoJCQlJUGF0aCBkaXIgPSBjb25maWdQYXRoLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5Iik7CgkJCWxpc3QuYWRkKCItRGphdmEuc2VjdXJpdHkucG9saWN5PVwiIiArIGRpci50b09TU3RyaW5nKCkgKyAiXCIiKTsKCQl9CgkJCgkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwoJCWxpc3QudG9BcnJheShzKTsKCQlyZXR1cm4gczsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgaXMgc3VwcG9ydGVkIGJ5IHRoaXMKCSAqIHNlcnZlciwgYW5kIGZhbHNlIG90aGVyd2lzZS4KCSAqCgkgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQoJICogQHJldHVybiB0aGUgc3RhdHVzCgkgKi8KCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJV2ViTW9kdWxlIG1vZHVsZSkgewoJCWlmICgiMS4yIi5lcXVhbHMobW9kdWxlLmdldEoyRUVTcGVjaWZpY2F0aW9uVmVyc2lvbigpKSB8fCAiMS4zIi5lcXVhbHMobW9kdWxlLmdldEoyRUVTcGVjaWZpY2F0aW9uVmVyc2lvbigpKSkKCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgVG9tY2F0UGx1Z2luLmdldFJlc291cmNlKCIlY2FuQWRkTW9kdWxlIiksIG51bGwpOwoJCQoJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIFRvbWNhdFBsdWdpbi5nZXRSZXNvdXJjZSgiJWVycm9yU3BlYzQwIiksIG51bGwpOwoJfQp9