LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUdlbmVyaWNSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci8qKgogKiAKICovCnB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZSBpbXBsZW1lbnRzIElHZW5lcmljUnVudGltZSB7Cglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCA9ICJ2bS1pbnN0YWxsLXR5cGUtaWQiOwoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOwoKCXByb3RlY3RlZCBJUnVudGltZSBydW50aW1lOwoKCXB1YmxpYyBHZW5lcmljUnVudGltZSgpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUnVudGltZSBuZXdSdW50aW1lKSB7CgkJdGhpcy5ydW50aW1lID0gbmV3UnVudGltZTsKCX0KCglwdWJsaWMgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Cgl9CgoJcHVibGljIFN0cmluZyBnZXRWTUluc3RhbGxJZCgpIHsKCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwoJfQoKCXB1YmxpYyBJVk1JbnN0YWxsIGdldFZNSW5zdGFsbCgpIHsKCQl0cnkgewoJCQlJVk1JbnN0YWxsVHlwZSB2bUluc3RhbGxUeXBlID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZShnZXRWTUluc3RhbGxUeXBlSWQoKSk7CgkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7CgkJCWludCBzaXplID0gdm1JbnN0YWxscy5sZW5ndGg7CgkJCVN0cmluZyBpZCA9IGdldFZNSW5zdGFsbElkKCk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlpZiAoaWQuZXF1YWxzKHZtSW5zdGFsbHNbaV0uZ2V0SWQoKSkpCgkJCQkJcmV0dXJuIHZtSW5zdGFsbHNbaV07CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewoJCWlmIChydW50aW1lLmdldE5hbWUoKSA9PSBudWxsIHx8IHJ1bnRpbWUuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDApCgkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBKYXZhU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZXJyb3JOYW1lIiksIG51bGwpOwoKCQlpZiAoU2VydmVyVXRpbC5pc05hbWVJblVzZShydW50aW1lKSkKCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIEphdmFTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvckR1cGxpY2F0ZVJ1bnRpbWVOYW1lIiksIG51bGwpOwoJCQoJCUlQYXRoIHBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7CgkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzRW1wdHkoKSkKCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKCQllbHNlIGlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkKCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIEphdmFTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvckxvY2F0aW9uIiksIG51bGwpOwoJCWVsc2UgaWYgKGdldFZNSW5zdGFsbCgpID09IG51bGwpCgkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBKYXZhU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZXJyb3JKUkUiKSwgbnVsbCk7CgkJZWxzZQoJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwoJfQoJCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewoJCS8vIGRvIG5vdGhpbmcKCX0KfQ==