LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwovKioKICogUHVibGlzaCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBtb2R1bGUgb24gYSBzcGVjaWZpYyBzZXJ2ZXIuCiAqLwpwdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8gewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9JRCA9ICJtb2R1bGUtaWRzIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAicGF0aCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTVAgPSAic3RhbXAiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSID0gImZvbGRlciI7CgoJcHJpdmF0ZSBTdHJpbmcgbW9kdWxlSWQ7Cglwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07CgoJLyoqCgkgKiBNb2R1bGVQdWJsaXNoSW5mbyBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oU3RyaW5nIG1vZHVsZUlkKSB7CgkJc3VwZXIoKTsKCgkJdGhpcy5tb2R1bGVJZCA9IG1vZHVsZUlkOwoJfQoJCgkvKioKCSAqIE1vZHVsZVB1Ymxpc2hJbmZvIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBNb2R1bGVQdWJsaXNoSW5mbyhJTWVtZW50byBtZW1lbnRvKSB7CgkJc3VwZXIoKTsKCQkKCQlsb2FkKG1lbWVudG8pOwoJfQoJCglwdWJsaWMgU3RyaW5nIGdldE1vZHVsZUlkKCkgewoJCXJldHVybiBtb2R1bGVJZDsKCX0KCQoJcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIGdldFJlc291cmNlcygpIHsKCQlyZXR1cm4gcmVzb3VyY2VzOwoJfQoJCglwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoSU1vZHVsZVJlc291cmNlW10gcmVzKSB7CgkJcmVzb3VyY2VzID0gcmVzOwoJfQoJCgkvKioKCSAqIAoJICovCglwcm90ZWN0ZWQgdm9pZCBsb2FkKElNZW1lbnRvIG1lbWVudG8pIHsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIG1vZHVsZSBwdWJsaXNoIGluZm8gZm9yOiAiICsgbWVtZW50byk7CgkKCQl0cnkgewoJCQltb2R1bGVJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKE1PRFVMRV9JRCk7CgkKCQkJcmVzb3VyY2VzID0gbG9hZFJlc291cmNlKG1lbWVudG8pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb2R1bGUgcHVibGlzaCBpbmZvIGluZm9ybWF0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwoJCX0KCX0KCQoJcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGxvYWRSZXNvdXJjZShJTWVtZW50byBtZW1lbnRvKSB7CgkJaWYgKG1lbWVudG8gPT0gbnVsbCkKCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07CgkJCgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCg1KTsKCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGSUxFKTsKCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCVN0cmluZyBuYW1lID0gY2hpbGRyZW5baV0uZ2V0U3RyaW5nKE5BTUUpOwoJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNoaWxkcmVuW2ldLmdldFN0cmluZyhQQVRIKSk7CgkJCQlsb25nIHN0YW1wID0gTG9uZy5wYXJzZUxvbmcoY2hpbGRyZW5baV0uZ2V0U3RyaW5nKFNUQU1QKSk7CgkJCQlNb2R1bGVGaWxlIGZpbGUgPSBuZXcgTW9kdWxlRmlsZShuYW1lLCBwYXRoLCBzdGFtcCk7CgkJCQlsaXN0LmFkZChmaWxlKTsKCQkJfQoJCX0KCQljaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oRk9MREVSKTsKCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCVN0cmluZyBuYW1lID0gY2hpbGRyZW5baV0uZ2V0U3RyaW5nKE5BTUUpOwoJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNoaWxkcmVuW2ldLmdldFN0cmluZyhQQVRIKSk7CgkJCQlNb2R1bGVGb2xkZXIgZm9sZGVyID0gbmV3IE1vZHVsZUZvbGRlcihuYW1lLCBwYXRoKTsKCQkJCWZvbGRlci5zZXRNZW1iZXJzKGxvYWRSZXNvdXJjZShjaGlsZHJlbltpXSkpOwoJCQkJbGlzdC5hZGQoZm9sZGVyKTsKCQkJfQoJCX0KCQkKCQlJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMyID0gbmV3IElNb2R1bGVSZXNvdXJjZVtsaXN0LnNpemUoKV07CgkJbGlzdC50b0FycmF5KHJlc291cmNlczIpOwoJCXJldHVybiByZXNvdXJjZXM7Cgl9CgkKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bykgewoJCXRyeSB7CgkJCW1lbWVudG8ucHV0U3RyaW5nKE1PRFVMRV9JRCwgbW9kdWxlSWQpOwoJCQkKCQkJc2F2ZVJlc291cmNlKG1lbWVudG8sIHJlc291cmNlcyk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgbW9kdWxlIHB1Ymxpc2ggaW5mbyIsIGUpOwoJCX0KCX0KCQoJcHJvdGVjdGVkIHZvaWQgc2F2ZVJlc291cmNlKElNZW1lbnRvIG1lbWVudG8sIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIpIHsKCQlpZiAocmVzb3VyY2VzMiA9PSBudWxsKQoJCQlyZXR1cm47CgkJaW50IHNpemUgPSByZXNvdXJjZXMyLmxlbmd0aDsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQlpZiAocmVzb3VyY2VzMltpXSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7CgkJCQlJTW9kdWxlRmlsZSBmaWxlID0gKElNb2R1bGVGaWxlKSByZXNvdXJjZXMyW2ldOwoJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKEZJTEUpOwoJCQkJY2hpbGQucHV0U3RyaW5nKE5BTUUsIGZpbGUuZ2V0TmFtZSgpKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhQQVRILCBmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7CgkJCQljaGlsZC5wdXRTdHJpbmcoU1RBTVAsICIiICsgZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKTsKCQkJfSBlbHNlIHsKCQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlczJbaV07CgkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoRk9MREVSKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhOQU1FLCBmb2xkZXIuZ2V0TmFtZSgpKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhQQVRILCBmb2xkZXIuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczMgPSBmb2xkZXIubWVtYmVycygpOwoJCQkJc2F2ZVJlc291cmNlKGNoaWxkLCByZXNvdXJjZXMzKTsKCQkJfQoJCX0KCX0KCQoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIk1vZHVsZVB1Ymxpc2hJbmZvIFsiICsgbW9kdWxlSWQgKyAiXSI7Cgl9Cn0=