LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEVjbGlwc2UgRm91bmRhdGlvbgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGplc3BlckBzZWxza2FiZXQub3JnCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGVzdHMuZm9ybWF0OwoKaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGVzdHMudXRpbHMuU3RyaW5nQ29tcGFyZVV0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7CgpwdWJsaWMgY2xhc3MgVGVzdEZvcm1hdFByb2Nlc3NvckhUTUwgZXh0ZW5kcyBUZXN0Q2FzZSB7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUExJVF9NVUxUSV9BVFRSUyA9IGZhbHNlOwoKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlQgPSAiXHQiOwoKCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gZmFsc2U7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MSU5FX1dJRFRIID0gNzI7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKCglwcml2YXRlIFN0cmluZ0NvbXBhcmVVdGlsIGZTdHJpbmdDb21wYXJlVXRpbDsKCglwdWJsaWMgVGVzdEZvcm1hdFByb2Nlc3NvckhUTUwoU3RyaW5nIG5hbWUpIHsKCQlzdXBlcihuYW1lKTsKCX0KCglwcml2YXRlIEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsIGZvcm1hdFByb2Nlc3NvcjsKCglwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewoJCWZvcm1hdFByb2Nlc3NvciA9IG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpOwoJCWZTdHJpbmdDb21wYXJlVXRpbCA9IG5ldyBTdHJpbmdDb21wYXJlVXRpbCgpOwoJfQoKCS8qKgoJICogbXVzdCByZWxlYXNlIG1vZGVsIChmcm9tIGVkaXQpIGFmdGVyCgkgKiAKCSAqIEBwYXJhbSBmaWxlbmFtZQoJICogICAgICAgICAgICByZWxhdGl2ZSB0byB0aGlzIGNsYXNzIChUZXN0U3RydWN0dXJlZFBhcnRpdGlvbmVyKQoJICovCglwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KGZpbmFsIFN0cmluZyBmaWxlbmFtZSkgewoKCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKCQl0cnkgewoJCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7CgkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lKTsKCQkJaWYgKGluU3RyZWFtID09IG51bGwpCgkJCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBmaWxlIHJlc291cmNlIHN0cmVhbSAiICsgZmlsZW5hbWUpOwoJCQlmaW5hbCBTdHJpbmcgYmFzZUZpbGUgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKGZpbGVuYW1lKS50b1N0cmluZygpOwoJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRNb2RlbEZvckVkaXQoYmFzZUZpbGUsIGluU3RyZWFtLCBuZXcgVVJJUmVzb2x2ZXIoKSB7CgoJCQkJU3RyaW5nIGZCYXNlID0gYmFzZUZpbGU7CgoJCQkJcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewoJCQkJCXJldHVybiBmQmFzZTsKCQkJCX0KCgkJCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSkgewoJCQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZkJhc2UpOwoJCQkJfQoKCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewoJCQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSk7CgkJCQl9CgoJCQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKSB7CgkJCQkJaW50IGxhc3RTbGFzaCA9IGJhc2VSZWZlcmVuY2UubGFzdEluZGV4T2YoIi8iKTsKCQkJCQlpZiAobGFzdFNsYXNoID4gMCkKCQkJCQkJcmV0dXJuIGJhc2VSZWZlcmVuY2Uuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCArIDEpICsgdXJpOwoJCQkJCXJldHVybiBiYXNlUmVmZXJlbmNlOwoJCQkJfQoKCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKCQkJCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGJhc2VSZWZlcmVuY2UpOwoJCQkJfQoKCQkJCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewoJCQkJCXJldHVybiBudWxsOwoJCQkJfQoKCQkJCXB1YmxpYyBJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpIHsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCgkJCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0VVJJU3RyZWFtKFN0cmluZyB1cmkpIHsKCQkJCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGdldExvY2F0aW9uQnlVUkkodXJpKSk7CgkJCQl9CgoJCQkJcHVibGljIHZvaWQgc2V0RmlsZUJhc2VMb2NhdGlvbihTdHJpbmcgbmV3TG9jYXRpb24pIHsKCQkJCQl0aGlzLmZCYXNlID0gbmV3TG9jYXRpb247CgkJCQl9CgoJCQkJcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KSB7CgkJCQl9CgkJCX0pOwoJCX0KCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CgkJfQoJCXJldHVybiBtb2RlbDsKCX0KCglwcm90ZWN0ZWQgdm9pZCBmb3JtYXRBbmRBc3NlcnRFcXVhbHMoU3RyaW5nIGJlZm9yZVBhdGgsIFN0cmluZyBhZnRlclBhdGgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJZm9ybWF0QW5kQXNzZXJ0RXF1YWxzKGJlZm9yZVBhdGgsIGFmdGVyUGF0aCwgdHJ1ZSk7Cgl9CgoJcHJpdmF0ZSB2b2lkIGZvcm1hdEFuZEFzc2VydEVxdWFscyhTdHJpbmcgYmVmb3JlUGF0aCwgU3RyaW5nIGFmdGVyUGF0aCwgYm9vbGVhbiByZXNldFByZWZlcmVuY2VzKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewoJCUlTdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlTW9kZWwgPSBudWxsLCBhZnRlck1vZGVsID0gbnVsbDsKCQl0cnkgewoJCQliZWZvcmVNb2RlbCA9IGdldE1vZGVsRm9yRWRpdChiZWZvcmVQYXRoKTsKCQkJYXNzZXJ0Tm90TnVsbCgiY291bGQgbm90IHJldHJpZXZlIHN0cnVjdHVyZWQgbW9kZWwgZm9yIDogIiArIGJlZm9yZVBhdGgsIGJlZm9yZU1vZGVsKTsKCgkJCWFmdGVyTW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoYWZ0ZXJQYXRoKTsKCQkJYXNzZXJ0Tm90TnVsbCgiY291bGQgbm90IHJldHJpZXZlIHN0cnVjdHVyZWQgbW9kZWwgZm9yIDogIiArIGFmdGVyUGF0aCwgYWZ0ZXJNb2RlbCk7CgoJCQlpZiAocmVzZXRQcmVmZXJlbmNlcykKCQkJCXJlc2V0UHJlZmVyZW5jZXNUb0RlZmF1bHQoKTsKCgkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yKSBmb3JtYXRQcm9jZXNzb3IpLnJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcyA9IGZhbHNlOwoJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0TW9kZWwoYmVmb3JlTW9kZWwpOwoJCQkoKEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcikgZm9ybWF0UHJvY2Vzc29yKS5yZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMgPSB0cnVlOwoKCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZvcm1hdHRlZEJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQliZWZvcmVNb2RlbC5zYXZlKGZvcm1hdHRlZEJ5dGVzKTsgLy8gImJlZm9yZU1vZGVsIiBzaG91bGQgbm93IGJlCgkJCS8vIGFmdGVyIHRoZSBmb3JtYXR0ZXIKCgkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBhZnRlckJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQlhZnRlck1vZGVsLnNhdmUoYWZ0ZXJCeXRlcyk7CgoJCQlTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyA9IG5ldyBTdHJpbmcoYWZ0ZXJCeXRlcy50b0J5dGVBcnJheSgpLCBVVEZfOCk7CgkJCVN0cmluZyBhY3R1YWxDb250ZW50cyA9IG5ldyBTdHJpbmcoZm9ybWF0dGVkQnl0ZXMudG9CeXRlQXJyYXkoKSwgVVRGXzgpOwoJCQlhc3NlcnRUcnVlKCJGb3JtYXR0ZWQgZG9jdW1lbnQgZGlmZmVycyBmcm9tIHRoZSBleHBlY3RlZC5cbkV4cGVjdGVkIENvbnRlbnRzOlxuIiArIGV4cGVjdGVkQ29udGVudHMgKyAiXG5BY3R1YWwgQ29udGVudHM6XG4iICsgYWN0dWFsQ29udGVudHMsIGZTdHJpbmdDb21wYXJlVXRpbC5lcXVhbHNJZ25vcmVMaW5lU2VwZXJhdG9yKGV4cGVjdGVkQ29udGVudHMsIGFjdHVhbENvbnRlbnRzKSk7CgkJfQoJCWZpbmFsbHkgewoJCQlpZiAoYmVmb3JlTW9kZWwgIT0gbnVsbCkKCQkJCWJlZm9yZU1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwoJCQlpZiAoYWZ0ZXJNb2RlbCAhPSBudWxsKQoJCQkJYWZ0ZXJNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKCQl9Cgl9CgoJcHJpdmF0ZSB2b2lkIHJlc2V0UHJlZmVyZW5jZXNUb0RlZmF1bHQoKSB7CgkJSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcyA9IGZvcm1hdFByb2Nlc3Nvci5nZXRGb3JtYXRQcmVmZXJlbmNlcygpOwoJCWZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChNQVhfTElORV9XSURUSCk7CgkJZm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKENMRUFSX0FMTF9CTEFOS19MSU5FUyk7CgkJZm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KElOREVOVCk7CgkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMoU1BMSVRfTVVMVElfQVRUUlMpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUZvcm1hdCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJZm9ybWF0QW5kQXNzZXJ0RXF1YWxzKCJ0ZXN0ZmlsZXMvaHRtbC90YWJsZWZvcm1hdC5odG1sIiwgInRlc3RmaWxlcy9odG1sL3RhYmxlZm9ybWF0LWZtdC5odG1sIik7Cgl9CgoJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkQ1NTRm9ybWF0KCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQkvLyBCVUc5Mjk1NwoJCWZvcm1hdEFuZEFzc2VydEVxdWFscygidGVzdGZpbGVzL2h0bWwvaHRtbHdpdGhjc3MuaHRtbCIsICJ0ZXN0ZmlsZXMvaHRtbC9odG1sd2l0aGNzcy1mbXQuaHRtbCIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlRm9ybWF0KCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQkvLyBCVUcxMTM1ODQKCQlJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJvY2Vzc29yLmdldEZvcm1hdFByZWZlcmVuY2VzKCk7CgkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnModHJ1ZSk7CgkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZvcm1hdFByZWZlcmVuY2VzKS5zZXRBbGlnbkVuZEJyYWNrZXQodHJ1ZSk7CgkJZm9ybWF0QW5kQXNzZXJ0RXF1YWxzKCJ0ZXN0ZmlsZXMvaHRtbC9hdHRyaWJ1dGVzZm9ybWF0Lmh0bWwiLCAidGVzdGZpbGVzL2h0bWwvYXR0cmlidXRlc2Zvcm1hdC1mbXQuaHRtbCIsIGZhbHNlKTsKCX0KfQo=