LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkZvbGRlclNvdXJjZUNvbnRhaW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLyoqCiAqCiAqLwpwdWJsaWMgY2xhc3MgVG9tY2F0U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgewoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUjY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCgkgKi8KCXB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBKYXZhUnVudGltZS5jb21wdXRlVW5yZXNvbHZlZFNvdXJjZUxvb2t1cFBhdGgoY29uZmlndXJhdGlvbik7CgkJTGlzdCBzb3VyY2Vmb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoKCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwoJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewoJCQkvL0lQYXRoIGJhc2VQYXRoID0gKChUb21jYXRTZXJ2ZXJCZWhhdmlvdXIpc2VydmVyLmdldEFkYXB0ZXIoVG9tY2F0U2VydmVyQmVoYXZpb3VyLmNsYXNzKSkuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoJCQkvL0xpc3QgcGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7CgkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlc1tpXS5nZXRQcm9qZWN0KCk7CgkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7CgkJCQkJCgkJCQkJSUZvbGRlciBtb2R1bGVGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihtb2R1bGVzW2ldLmdldE5hbWUoKSk7CgkJCQkJaWYgKG1vZHVsZUZvbGRlci5leGlzdHMoKSkgewoJCQkJCQlzb3VyY2Vmb2xkZXJMaXN0LmFkZChuZXcgRm9sZGVyU291cmNlQ29udGFpbmVyKG1vZHVsZUZvbGRlciwgdHJ1ZSkpOwoJCQkJCX0KCQkJCQkKCQkJCQl0cnkgewoJCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewoJCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKCQkJCQkJCWlmICghbGlzdC5jb250YWlucyhqYXZhUHJvamVjdCkpCgkJCQkJCQkJbGlzdC5hZGQoamF2YVByb2plY3QpOwoJCQkJCQl9CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJLy8gaWdub3JlCgkJCQkJfQoJCQkJCQoJCQkJCS8vSVBhdGggcGF0aCA9IGJhc2VQYXRoLmFwcGVuZCgid29yayIpLmFwcGVuZCgiQ2F0YWxpbmEiKS5hcHBlbmQoImxvY2FsaG9zdCIpLmFwcGVuZChtb2R1bGVzW2ldLmdldE5hbWUoKSk7CgkJCQkJLy9wYXRoTGlzdC5hZGQocGF0aCk7CgkJCQl9CgkJCX0KCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W3NpemVdOwoJCQlsaXN0LnRvQXJyYXkocHJvamVjdHMpOwoJCQkKCQkJaW50IHNpemUyID0gZW50cmllcy5sZW5ndGg7CgkJCS8vaW50IHNpemUzID0gcGF0aExpc3Quc2l6ZSgpOwoJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllczIgPSBuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtzaXplICsgc2l6ZTJdOwoJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIGVudHJpZXMyLCAwLCBzaXplMik7CgkJCQoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKCQkJCWVudHJpZXMyW3NpemUyICsgaV0gPSBKYXZhUnVudGltZS5uZXdQcm9qZWN0UnVudGltZUNsYXNzcGF0aEVudHJ5KHByb2plY3RzW2ldKTsKCQkJCgkJCS8vZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMzsgaSsrKQoJCQkvLwllbnRyaWVzMltzaXplICsgc2l6ZTIgKyBpXSA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoKElQYXRoKSBwYXRoTGlzdC5nZXQoaSkpOwoJCQkKCQkJZW50cmllcyA9IGVudHJpZXMyOwoJCX0KCQkKCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWQgPSBKYXZhUnVudGltZS5yZXNvbHZlU291cmNlTG9va3VwUGF0aChlbnRyaWVzLCBjb25maWd1cmF0aW9uKTsKCQlJU291cmNlQ29udGFpbmVyW10gc291cmNlQ29udGFpbmVycyA9IEphdmFSdW50aW1lLmdldFNvdXJjZUNvbnRhaW5lcnMocmVzb2x2ZWQpOwoJCQoJCWlmICghc291cmNlZm9sZGVyTGlzdC5pc0VtcHR5KCkpIHsKCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbWJpbmVkU291cmNlQ29udGFpbmVycyA9IG5ldyBJU291cmNlQ29udGFpbmVyW3NvdXJjZUNvbnRhaW5lcnMubGVuZ3RoICsgc291cmNlZm9sZGVyTGlzdC5zaXplKCldOwoJCQlzb3VyY2Vmb2xkZXJMaXN0LnRvQXJyYXkoY29tYmluZWRTb3VyY2VDb250YWluZXJzKTsKCQkJU3lzdGVtLmFycmF5Y29weShzb3VyY2VDb250YWluZXJzLCAwLCBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnMsIHNvdXJjZWZvbGRlckxpc3Quc2l6ZSgpLCBzb3VyY2VDb250YWluZXJzLmxlbmd0aCk7CgkJCXNvdXJjZUNvbnRhaW5lcnMgPSBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnM7CgkJfQoKCQlyZXR1cm4gc291cmNlQ29udGFpbmVyczsKCX0KfQ==