LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwovKioKICogUHVibGlzaCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBtb2R1bGUgb24gYSBzcGVjaWZpYyBzZXJ2ZXIuCiAqLwpwdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8gewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9JRCA9ICJtb2R1bGUtaWRzIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAicGF0aCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTVAgPSAic3RhbXAiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSID0gImZvbGRlciI7CgoJcHJpdmF0ZSBTdHJpbmcgbW9kdWxlSWQ7Cglwcml2YXRlIFN0cmluZyBuYW1lOwoJcHJpdmF0ZSBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwoKCS8qKgoJICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCgkgKiAKCSAqIEBwYXJhbSBtb2R1bGVJZCBhIG1vZHVsZSBpZAoJICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSdzIG5hbWUKCSAqLwoJcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKFN0cmluZyBtb2R1bGVJZCwgU3RyaW5nIG5hbWUpIHsKCQlzdXBlcigpOwoKCQl0aGlzLm1vZHVsZUlkID0gbW9kdWxlSWQ7CgkJdGhpcy5uYW1lID0gbmFtZTsKCX0KCgkvKioKCSAqIE1vZHVsZVB1Ymxpc2hJbmZvIGNvbnN0cnVjdG9yLgoJICogCgkgKiBAcGFyYW0gbWVtZW50byBhIG1lbWVudG8KCSAqLwoJcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKElNZW1lbnRvIG1lbWVudG8pIHsKCQlzdXBlcigpOwoJCQoJCWxvYWQobWVtZW50byk7Cgl9CgoJcHVibGljIFN0cmluZyBnZXRNb2R1bGVJZCgpIHsKCQlyZXR1cm4gbW9kdWxlSWQ7Cgl9CgoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBuYW1lOwoJfQoKCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoKSB7CgkJcmV0dXJuIHJlc291cmNlczsKCX0KCglwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoSU1vZHVsZVJlc291cmNlW10gcmVzKSB7CgkJcmVzb3VyY2VzID0gcmVzOwoJfQoKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgbW9kdWxlIHB1Ymxpc2ggaW5mbyBmb3I6ICIgKyBtZW1lbnRvKTsKCQoJCXRyeSB7CgkJCW1vZHVsZUlkID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX0lEKTsKCQkJbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKE5BTUUpOwoJCgkJCXJlc291cmNlcyA9IGxvYWRSZXNvdXJjZShtZW1lbnRvKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9kdWxlIHB1Ymxpc2ggaW5mbyBpbmZvcm1hdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQl9Cgl9CgoJcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGxvYWRSZXNvdXJjZShJTWVtZW50byBtZW1lbnRvKSB7CgkJaWYgKG1lbWVudG8gPT0gbnVsbCkKCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07CgkJCgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCg1KTsKCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGSUxFKTsKCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCVN0cmluZyBuYW1lMiA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhOQU1FKTsKCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjaGlsZHJlbltpXS5nZXRTdHJpbmcoUEFUSCkpOwoJCQkJbG9uZyBzdGFtcCA9IExvbmcucGFyc2VMb25nKGNoaWxkcmVuW2ldLmdldFN0cmluZyhTVEFNUCkpOwoJCQkJTW9kdWxlRmlsZSBmaWxlID0gbmV3IE1vZHVsZUZpbGUobnVsbCwgbmFtZTIsIHBhdGgsIHN0YW1wKTsKCQkJCWxpc3QuYWRkKGZpbGUpOwoJCQl9CgkJfQoJCWNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGT0xERVIpOwoJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CgkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJU3RyaW5nIG5hbWUyID0gY2hpbGRyZW5baV0uZ2V0U3RyaW5nKE5BTUUpOwoJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNoaWxkcmVuW2ldLmdldFN0cmluZyhQQVRIKSk7CgkJCQlNb2R1bGVGb2xkZXIgZm9sZGVyID0gbmV3IE1vZHVsZUZvbGRlcihudWxsLCBuYW1lMiwgcGF0aCk7CgkJCQlmb2xkZXIuc2V0TWVtYmVycyhsb2FkUmVzb3VyY2UoY2hpbGRyZW5baV0pKTsKCQkJCWxpc3QuYWRkKGZvbGRlcik7CgkJCX0KCQl9CgkJCgkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwoJCWxpc3QudG9BcnJheShyZXNvdXJjZXMyKTsKCQlyZXR1cm4gcmVzb3VyY2VzOwoJfQoKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bykgewoJCXRyeSB7CgkJCW1lbWVudG8ucHV0U3RyaW5nKE1PRFVMRV9JRCwgbW9kdWxlSWQpOwoJCQlpZiAobmFtZSAhPSBudWxsKQoJCQkJbWVtZW50by5wdXRTdHJpbmcoTkFNRSwgbmFtZSk7CgkJCQoJCQlzYXZlUmVzb3VyY2UobWVtZW50bywgcmVzb3VyY2VzKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBtb2R1bGUgcHVibGlzaCBpbmZvIiwgZSk7CgkJfQoJfQoKCXByb3RlY3RlZCB2b2lkIHNhdmVSZXNvdXJjZShJTWVtZW50byBtZW1lbnRvLCBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMyKSB7CgkJaWYgKHJlc291cmNlczIgPT0gbnVsbCkKCQkJcmV0dXJuOwoJCWludCBzaXplID0gcmVzb3VyY2VzMi5sZW5ndGg7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJaWYgKHJlc291cmNlczJbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewoJCQkJSU1vZHVsZUZpbGUgZmlsZSA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2VzMltpXTsKCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZChGSUxFKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhOQU1FLCBmaWxlLmdldE5hbWUoKSk7CgkJCQljaGlsZC5wdXRTdHJpbmcoUEFUSCwgZmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwoJCQkJY2hpbGQucHV0U3RyaW5nKFNUQU1QLCAiIiArIGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7CgkJCX0gZWxzZSB7CgkJCQlJTW9kdWxlRm9sZGVyIGZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSByZXNvdXJjZXMyW2ldOwoJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKEZPTERFUik7CgkJCQljaGlsZC5wdXRTdHJpbmcoTkFNRSwgZm9sZGVyLmdldE5hbWUoKSk7CgkJCQljaGlsZC5wdXRTdHJpbmcoUEFUSCwgZm9sZGVyLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7CgkJCQlJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMzID0gZm9sZGVyLm1lbWJlcnMoKTsKCQkJCXNhdmVSZXNvdXJjZShjaGlsZCwgcmVzb3VyY2VzMyk7CgkJCX0KCQl9Cgl9CgoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIk1vZHVsZVB1Ymxpc2hJbmZvIFsiICsgbW9kdWxlSWQgKyAiXSI7Cgl9Cn0=