LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC4qOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlOwovKioKICogCiAqIAogKiBAc2luY2UgMS4wCiAqLwpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBleHRlbmRzIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Cglwcm90ZWN0ZWQgc3RhdGljIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwoJCglwcm90ZWN0ZWQgc3RhdGljIExpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwoKCXByb3RlY3RlZCBMaXN0IGFkZGVkOwoJcHJvdGVjdGVkIExpc3QgcmVtb3ZlZDsKCgkvLyBtYXAgZnJvbSBJUHJvamVjdCB0byBJTW9kdWxlW10KCXByb3RlY3RlZCBNYXAgcHJvamVjdHM7CgoJLyoqCgkgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS4KCSAqLwoJcHVibGljIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUoKSB7CgkJc3VwZXIoKTsKCQkKCQlmYWN0b3JpZXMuYWRkKHRoaXMpOwoJCQoJCWFkZExpc3RlbmVyKCk7Cgl9CgoJLyoqCgkgKiBDYWNoZSBhbnkgcHJlZXhpc3RpbmcgbW9kdWxlLgoJICogVE9ETzogV2hlbi93aGVyZSBpcyB0aGlzIGNhbGxlZD8KCSAqLwoJcHJvdGVjdGVkIHZvaWQgY2FjaGVNb2R1bGVzKCkgewoJCXByb2plY3RzID0gbmV3IEhhc2hNYXAoKTsKCQl0cnkgewoJCQlJUHJvamVjdFtdIHByb2plY3RzMiA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0cygpOwoJCQlpbnQgc2l6ZSA9IHByb2plY3RzMi5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQkvL1RyYWNlLnRyYWNlKCJjYWNoaW5nOiAiICsgdGhpcyArICIgIiArIHByb2plY3RzW2ldICsgIiAiICsgaXNWYWxpZE1vZHVsZShwcm9qZWN0c1tpXSkpOwoJCQkJaWYgKGlzVmFsaWRNb2R1bGUocHJvamVjdHMyW2ldKSkgewoJCQkJCWFkZE1vZHVsZXMocHJvamVjdHMyW2ldKTsKCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhY2hpbmcgbW9kdWxlcyIsIGUpOwoJCX0KCQlmaXJlRXZlbnRzKCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIHdvcmtzcGFjZSByb290LgoJICogCgkgKiBAcmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdAoJICovCglwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewoJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbW9kdWxlcyBmb3IgdGhlIGdpdmVuIHByb2plY3QsIG9yIG51bGwKCSAqIGlmIHRoaXMgZmFjdG9yeSBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1vZHVsZXMuCgkgKi8KCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CgkJdHJ5IHsKCQkJcmV0dXJuIChJTW9kdWxlW10pIHByb2plY3RzLmdldChwcm9qZWN0KTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBBZGQgYSByZXNvdXJjZSBsaXN0ZW5lciB0byB0aGUgd29ya3NwYWNlLgoJICovCglwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoKSB7CgkJaWYgKGxpc3RlbmVyICE9IG51bGwpCgkJCXJldHVybjsKCgkJbGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgbGlzdGVuZXIgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2U6ICIgKyBldmVudC5nZXRUeXBlKCkgKyAiIC0+LSIpOwoJCQkJdHJ5IHsKCQkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CgkJCQkJCgkJCQkJLy9pZiAoZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTIHx8IGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKQoJCQkJCS8vCXJldHVybjsKCQkJCQoJCQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewoJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSB2aXNpdG9yRGVsdGEpIHsKCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHZpc2l0b3JEZWx0YS5nZXRSZXNvdXJjZSgpOwoJCQkJCQkJLy9UcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJyZXNvdXJjZTogIiArIHJlc291cmNlKTsKCQoJCQkJCQkJLy8gb25seSByZXNwb25kIGNoYW5nZXMgd2l0aGluIHByb2plY3RzCgkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CgkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7CgkJCQkJCQkJaGFuZGxlR2xvYmFsUHJvamVjdENoYW5nZShwcm9qZWN0LCB2aXNpdG9yRGVsdGEpOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFByb2plY3QoKSAhPSBudWxsKSB7CgkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJfSBlbHNlCgkJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJLy9UcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSIsIGUpOwoJCQkJfQoJCQkJZmlyZUdsb2JhbEV2ZW50cygpOwoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLTwtIERvbmUgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSAtPC0iKTsKCQkJfQoJCX07CgkJCgkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKCX0KCQoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZUdsb2JhbFByb2plY3RDaGFuZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQkvLyBoYW5kbGUgcHJvamVjdCBsZXZlbCBjaGFuZ2VzCgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCS8vVHJhY2UudHJhY2UoIkZpcmluZyB0bzogIiArIGZhY3RvcnkpOwoJCQlmYWN0b3J5LmhhbmRsZVByb2plY3RDaGFuZ2UocHJvamVjdCwgZGVsdGEpOwoJCX0KCQkKCQkvLyBoYW5kbGUgaW50ZXJuYWwgdXBkYXRlcwoJCWl0ZXJhdG9yID0gZmFjdG9yaWVzLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQlQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGZhY3RvcnkgPSAoUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgaXRlcmF0b3IubmV4dCgpOwoJCQkvL1RyYWNlLnRyYWNlKCJGaXJpbmcgdG86ICIgKyBmYWN0b3J5KTsKCQkJZmFjdG9yeS5oYW5kbGVQcm9qZWN0SW50ZXJuYWxDaGFuZ2UocHJvamVjdCwgZGVsdGEpOwoJCX0KCX0KCQoJLyoqCgkgKiBGaXJlIHRoZSBhY2N1bXVsYXRlZCBtb2R1bGUgZmFjdG9yeSBldmVudHMuCgkgKi8KCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaXJlR2xvYmFsRXZlbnRzKCkgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkZpcmluZyBnbG9iYWwgbW9kdWxlIGV2ZW50Iik7CgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCWZhY3RvcnkudXBkYXRlUHJvamVjdHMoKTsKCQl9CgkJCgkJaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCWZhY3RvcnkuZmlyZUV2ZW50cygpOwoJCX0KCX0KCgkvKioKCSAqIFRlbXBvcmFyeSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcHJvamVjdCBtb2R1bGVzIGFyZSB1cGRhdGVkLgoJICovCglwcml2YXRlIHZvaWQgdXBkYXRlUHJvamVjdHMoKSB7CgkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZ2V0TW9kdWxlcygpOwoJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7CgkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJaWYgKG1vZHVsZXMyW2ldIGluc3RhbmNlb2YgUHJvamVjdE1vZHVsZSkKCQkJCQkoKFByb2plY3RNb2R1bGUpIG1vZHVsZXMyW2ldKS51cGRhdGUoKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIEhhbmRsZSBjaGFuZ2VzIHRvIGEgcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQoJICovCglwcml2YXRlIHZvaWQgaGFuZGxlUHJvamVjdENoYW5nZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewoJCWlmIChwcm9qZWN0cy5jb250YWluc0tleShwcm9qZWN0KSkgewoJCQkvLyBhbHJlYWR5IGEgbW9kdWxlCgkJCWlmICgoKGRlbHRhLmdldEtpbmQoKSAmICBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSAhPSAwKSB8fCAhaXNWYWxpZE1vZHVsZShwcm9qZWN0KSkgewoJCQkJcmVtb3ZlTW9kdWxlcyhwcm9qZWN0KTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIG5vdCBhIG1vZHVsZQoJCQlpZiAoaXNWYWxpZE1vZHVsZShwcm9qZWN0KSkgewoJCQkJYWRkTW9kdWxlcyhwcm9qZWN0KTsKCQkJfQoJCX0KCX0KCQoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RJbnRlcm5hbENoYW5nZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewoJCWZpbmFsIElQYXRoW10gcGF0aHMgPSBnZXRMaXN0ZW5lclBhdGhzKCk7CgkJaWYgKHBhdGhzICE9IG51bGwpIHsKCQkJZmluYWwgSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXRNb2R1bGVzKHByb2plY3QpOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKCQkJCWZpbmFsIElNb2R1bGUgbW9kdWxlID0gbW9kdWxlc1tpXTsKCQkJCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBtb2R1bGUgaW5zdGFuY2VvZiBQcm9qZWN0TW9kdWxlKSB7CgkJCQkJLy8gY2hlY2sgZm9yIGFueSBjaGFuZ2VzIHRvIHRoZSBtb2R1bGUKCQkJCQlmaW5hbCBJUGF0aCByb290ID0gKChQcm9qZWN0TW9kdWxlKSBtb2R1bGUpLmdldFJvb3RGb2xkZXIoKTsKCQkJCQlJUmVzb3VyY2VEZWx0YSByb290RGVsdGEgPSBkZWx0YS5maW5kTWVtYmVyKHJvb3QpOwoJCQkJCWlmIChyb290RGVsdGEgIT0gbnVsbCkKCQkJCQkJKChQcm9qZWN0TW9kdWxlKSBtb2R1bGUpLmZpcmVNb2R1bGVDaGFuZ2VFdmVudCh0cnVlLCBudWxsLCBudWxsLCBudWxsKTsKCQkJCQkKCQkJCQkvLyBjaGVjayBmb3IgbGlzdGVuZXIgcGF0aHMKCQkJCQlmaW5hbCBpbnQgc2l6ZSA9IHBhdGhzLmxlbmd0aDsKCQkJCQljbGFzcyBUZW1wIHsKCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwoJCQkJCX0KCQkJCQlmaW5hbCBUZW1wIHRlbXAgPSBuZXcgVGVtcCgpOwoJCQkJCXRyeSB7CgkJCQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewoJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgdmlzaXRvckRlbHRhKSB7CgkJCQkJCQkJaWYgKHRlbXAuZm91bmQpCgkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQlJUGF0aCBwYXRoID0gdmlzaXRvckRlbHRhLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKCQkJCQkJCQkKCQkJCQkJCQlib29sZWFuIHByZWZpeCA9IGZhbHNlOwoJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZSAmJiAhdGVtcC5mb3VuZDsgaisrKSB7CgkJCQkJCQkJCWlmIChwYXRoc1tqXS5lcXVhbHMocGF0aCkpCgkJCQkJCQkJCQl0ZW1wLmZvdW5kID0gdHJ1ZTsKCQkJCQkJCQkJZWxzZSBpZiAocGF0aC5pc1ByZWZpeE9mKHBhdGhzW2pdKSkKCQkJCQkJCQkJCXByZWZpeCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJCWlmICh0ZW1wLmZvdW5kKSB7CgkJCQkJCQkJCSgoUHJvamVjdE1vZHVsZSkgbW9kdWxlKS51cGRhdGUoKTsKCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCX0gZWxzZSBpZiAocHJlZml4KQoJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCQllbHNlCgkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2VhcmNoaW5nIGZvciBsaXN0ZW5pbmcgcGF0aHMiLCBlKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBBZGQgYSBtb2R1bGUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqLwoJcHJpdmF0ZSB2b2lkIGFkZE1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewoJCWlmIChwcm9qZWN0cyA9PSBudWxsKQoJCQljYWNoZU1vZHVsZXMoKTsKCQkKCQlJTW9kdWxlW10gbW9kdWxlcyA9IGNyZWF0ZU1vZHVsZXMocHJvamVjdCk7CgkJaWYgKG1vZHVsZXMgPT0gbnVsbCB8fCBtb2R1bGVzLmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkJcHJvamVjdHMucHV0KHByb2plY3QsIG1vZHVsZXMpOwoJCWFkZGVkID0gbmV3IEFycmF5TGlzdCgyKTsKCQlhZGRlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb2R1bGVzKSk7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgdGhlIG1vZHVsZXMgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqLwoJcHJpdmF0ZSB2b2lkIHJlbW92ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewoJCWlmIChwcm9qZWN0cyA9PSBudWxsKQoJCQljYWNoZU1vZHVsZXMoKTsKCQkKCQl0cnkgewoJCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIHByb2plY3RzLmdldChwcm9qZWN0KTsKCQkJcHJvamVjdHMucmVtb3ZlKHByb2plY3QpOwoJCQlpZiAocmVtb3ZlZCA9PSBudWxsKQoJCQkJcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3QoMik7CgkJCXJlbW92ZWQuYWRkQWxsKEFycmF5cy5hc0xpc3QobW9kdWxlcykpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbW92aW5nIG1vZHVsZSBwcm9qZWN0IiwgZSk7CgkJfQoJfQoKCS8qKgoJICogRmlyZSB0aGUgYWNjdW11bGF0ZWQgbW9kdWxlIGZhY3RvcnkgZXZlbnRzLgoJICovCglwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnRzKCkgewoJCWlmICgoYWRkZWQgPT0gbnVsbCB8fCBhZGRlZC5pc0VtcHR5KCkpICYmIChyZW1vdmVkID09IG51bGwgfHwgcmVtb3ZlZC5pc0VtcHR5KCkpKQoJCQlyZXR1cm47CgoJCUlNb2R1bGVbXSBhZGQgPSBudWxsOwoJCWlmIChhZGRlZCAhPSBudWxsKSB7CgkJCWFkZCA9IG5ldyBJTW9kdWxlW2FkZGVkLnNpemUoKV07CgkJCWFkZGVkLnRvQXJyYXkoYWRkKTsKCQl9CgkJSU1vZHVsZVtdIHJlbW92ZSA9IG51bGw7CgkJaWYgKHJlbW92ZWQgIT0gbnVsbCkgewoJCQlyZW1vdmUgPSBuZXcgSU1vZHVsZVtyZW1vdmVkLnNpemUoKV07CgkJCXJlbW92ZWQudG9BcnJheShyZW1vdmUpOwoJCX0KCQkKCQlmaXJlTW9kdWxlRmFjdG9yeUV2ZW50KGFkZCwgcmVtb3ZlKTsKCQlhZGRlZCA9IG5ldyBBcnJheUxpc3QoMik7CgkJcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3QoMik7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2plY3QgbWF5IGNvbnRhaW4gbW9kdWxlcyBvZiB0aGUgY29ycmVjdCB0eXBlLgoJICogVGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBtYXkgY29udGFpbiBtb2R1bGVzLCBhbmQKCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBkZWZpbml0ZWx5IGRvZXMgbm90CgkgKi8KCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzVmFsaWRNb2R1bGUoSVByb2plY3QgcHJvamVjdCk7CgoJLyoqCgkgKiBDcmVhdGVzIHRoZSBtb2R1bGVzIGZvciBhIGdpdmVuIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdCB0byBjcmVhdGUgbW9kdWxlcyBmb3IKCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCgkgKi8KCXByb3RlY3RlZCBhYnN0cmFjdCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvCgkgKiBmb3Igc3RhdGUgY2hhbmdlcy4gVGhlIHBhdGhzIHNob3VsZCBiZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzLgoJICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGUgcGF0aHMuCgkgKgoJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHBhdGhzCgkgKi8KCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7CgkJcmV0dXJuIG51bGw7Cgl9Cn0=