LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZvbGRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwovKioKICogQSBzaW1wbGUgSU1vZHVsZVByb2plY3QgdGhhdCBtYXBzIGEgZm9sZGVyIHdpdGhpbiBhIHByb2plY3QKICogKG9yIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IGl0c2VsZikgdG8gdGhlIG1vZHVsZS4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0TW9kdWxlIGV4dGVuZHMgTW9kdWxlRGVsZWdhdGUgewoJcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Cglwcm90ZWN0ZWQgSVBhdGggcm9vdDsKCQoJLy8gY2hhbmdlIGxpc3RlbmVycwoJcHJpdmF0ZSB0cmFuc2llbnQgTGlzdCBsaXN0ZW5lcnM7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgcHJvamVjdCBtb2R1bGUuCgkgKi8KCXB1YmxpYyBQcm9qZWN0TW9kdWxlKCkgewoJCS8vIGRvIG5vdGhpbmcKCX0KCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBwcm9qZWN0IG1vZHVsZSBpbiB0aGUgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgbW9kdWxlCgkgKi8KCXB1YmxpYyBQcm9qZWN0TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIGluLgoJICogCgkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgaW4KCSAqLwoJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CgkJcmV0dXJuIHByb2plY3Q7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlci4gVGhlIHJvb3QgZm9sZGVyIGlzIHRoZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGgKCSAqIHRoYXQgcG9pbnRzIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgbW9kdWxlLiBBbGwgcmVzb3VyY2VzIGNvbnRhaW5lZAoJICogd2l0aGluIHRoaXMgZm9sZGVyIGJlbG9uZyB0byB0aGUgbW9kdWxlLgoJICogCgkgKiBAcmV0dXJuIHRoZSByb290IHByb2plY3QtcmVsYXRpdmUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzCgkgKiAgICBvZiB0aGUgbW9kdWxlCgkgKi8KCXB1YmxpYyBJUGF0aCBnZXRSb290Rm9sZGVyKCkgewoJCXJldHVybiByb290OwoJfQoKCS8qCgkgKiBAc2VlIElNb2R1bGVQcm9qZWN0I2dldE1vZHVsZVJlc291cmNlRGVsdGEoSVJlc291cmNlRGVsdGEpCgkgKi8KCS8qcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhIGdldE1vZHVsZVJlc291cmNlRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI+IGdldE1vZHVsZVJlc291cmNlRGVsdGEiKTsKCQlJUGF0aCByb290MiA9IG51bGw7CgkJdHJ5IHsKCQkJcm9vdDIgPSBnZXRSb290Rm9sZGVyKCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRXJyb3IgZ2V0dGluZyByb290MiIpOwoJCX0KCQlpZiAocm9vdDIgPT0gbnVsbCkgewoJCQlyZXR1cm4gY29udmVydENoaWxkcmVuKGRlbHRhLCBudWxsKTsKCQl9CgkJY2xhc3MgSGVscGVyIHsKCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwoJCQlJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YTI7CgkJfQoJCWZpbmFsIEhlbHBlciBoZWxwZXIgPSBuZXcgSGVscGVyKCk7CgkJZmluYWwgSVBhdGggcm9vdDMgPSByb290MjsKCQl0cnkgewoJCQlkZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIHZpc2l0RGVsdGEpIHsKCQkJCQlpZiAoIWhlbHBlci5mb3VuZCAmJiByb290My5lcXVhbHModmlzaXREZWx0YS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpKSB7CgkJCQkJCWhlbHBlci5kZWx0YTIgPSBjb252ZXJ0Q2hpbGRyZW4odmlzaXREZWx0YSwgbnVsbCk7CgkJCQkJCWhlbHBlci5mb3VuZCA9IHRydWU7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0pOwoJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI8IGdldE1vZHVsZVJlc291cmNlRGVsdGEiKTsKCQkJcmV0dXJuIGhlbHBlci5kZWx0YTI7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBtb2R1bGUgcmVzb3VyY2UgZGVsdGEiKTsKCQl9CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPCBnZXRNb2R1bGVSZXNvdXJjZURlbHRhIG51bGwiKTsKCQlyZXR1cm4gbnVsbDsKCX0qLwoJCgkvKioKCSAqIAoJICovCgkvKnByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VEZWx0YSBjb252ZXJ0Q2hpbGRyZW4oSVJlc291cmNlRGVsdGEgZGVsdGEsIElNb2R1bGVGb2xkZXIgcGFyZW50KSB7CgkJaW50IGZsYWdzID0gZGVsdGEuZ2V0S2luZCgpOwoJCWludCBraW5kID0gSU1vZHVsZVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFOwoJCWlmIChmbGFncyA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkKCQkJa2luZCA9IElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEOwoJCWVsc2UgaWYgKGZsYWdzID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpCgkJCWtpbmQgPSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEOwoJCWVsc2UgaWYgKGZsYWdzID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpCgkJCWtpbmQgPSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5DSEFOR0VEOwoJCQoJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7CgkJCgkJSU1vZHVsZVJlc291cmNlIHB1YlJlc291cmNlID0gbnVsbDsKCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQoJCQlwdWJSZXNvdXJjZSA9IG5ldyBQcm9qZWN0TW9kdWxlRm9sZGVyKHRoaXMsIHBhcmVudCwgKElDb250YWluZXIpIHJlc291cmNlKTsJCgkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewoJCQlpZiAoZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKQoJCQkJcmV0dXJuIG51bGw7CgkJCXB1YlJlc291cmNlID0gbmV3IFByb2plY3RNb2R1bGVGaWxlKHRoaXMsIHBhcmVudCwgKElGaWxlKSByZXNvdXJjZSk7CgkJfQoJCQoJCU1vZHVsZVJlc291cmNlRGVsdGEgZGVwbG95RGVsdGEgPSBuZXcgTW9kdWxlUmVzb3VyY2VEZWx0YShwdWJSZXNvdXJjZSwga2luZCk7CgkJCgkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBwdWJSZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlJTW9kdWxlUmVzb3VyY2VEZWx0YSBjaGlsZERlbHRhID0gY29udmVydENoaWxkcmVuKGNoaWxkcmVuW2ldLCAoSU1vZHVsZUZvbGRlcikgcHViUmVzb3VyY2UpOwoJCQkJaWYgKGNoaWxkRGVsdGEgIT0gbnVsbCkKCQkJCQlkZXBsb3lEZWx0YS5hZGRDaGlsZChjaGlsZERlbHRhKTsKCQkJfQoJCX0KCQlyZXR1cm4gZGVwbG95RGVsdGE7Cgl9Ki8KCgkvKioKCSAqIEhlbHBlciBtZXRob2QgLSByZXR1cm5zIHRoZSBtb2R1bGUncyBpZC4KCSAqIAoJICogQHJldHVybiB0aGUgbW9kdWxlIGlkCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CgkJcmV0dXJuIGdldFByb2plY3QoKS5nZXROYW1lKCk7CgkJLy9yZXR1cm4gZ2V0TW9kdWxlKCkuZ2V0SWQoKTsKCX0KCgkvKioKCSAqIEBzZWUgTW9kdWxlRGVsZWdhdGUjdmFsaWRhdGUoKQoJICovCglwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIEBzZWUgTW9kdWxlRGVsZWdhdGUjbWVtYmVycygpCgkgKi8KCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCUlQYXRoIHJvb3QyID0gbnVsbDsKCQl0cnkgewoJCQlyb290MiA9IGdldFJvb3RGb2xkZXIoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJdHJ5IHsKCQkJaWYgKHJvb3QyID09IG51bGwgfHwgcm9vdDIuaXNSb290KCkgfHwgcm9vdDIuZXF1YWxzKG5ldyBQYXRoKCIiKSkgfHwgcm9vdDIuZXF1YWxzKG5ldyBQYXRoKCIvIikpKQoJCQkJcmV0dXJuIGdldE1vZHVsZVJlc291cmNlcyhQYXRoLkVNUFRZLCBnZXRQcm9qZWN0KCkpOwoJCQkKCQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihyb290Mik7CgkJCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoUGF0aC5FTVBUWSwgZm9sZGVyKTsKCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKCQkJdGhyb3cgZTsKCQl9Cgl9CgoJcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldE1vZHVsZVJlc291cmNlcyhJUGF0aCBwYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCiAJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7CgkgCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewoJIAkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOwoJIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lcjIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7CgkJCQkJTW9kdWxlRm9sZGVyIG1mID0gbmV3IE1vZHVsZUZvbGRlcihjb250YWluZXIyLmdldE5hbWUoKSwgcGF0aCk7CgkJCQkJbWYuc2V0TWVtYmVycyhnZXRNb2R1bGVSZXNvdXJjZXMocGF0aC5hcHBlbmQoY29udGFpbmVyMi5nZXROYW1lKCkpLCBjb250YWluZXIyKSk7CgkJCQkJbGlzdC5hZGQobWYpOwoJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CgkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7CgkJCQkJbGlzdC5hZGQobmV3IE1vZHVsZUZpbGUoZmlsZS5nZXROYW1lKCksIHBhdGgsIGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkpOwoJCQkJfQoJCQl9CgkgCX0KCSAJCgkgCUlNb2R1bGVSZXNvdXJjZVtdIG1vZHVsZVJlc291cmNlcyA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwoJIAlsaXN0LnRvQXJyYXkobW9kdWxlUmVzb3VyY2VzKTsKCSAJcmV0dXJuIG1vZHVsZVJlc291cmNlczsKCX0KCgkvKioKCSAqIEhlbHBlciBtZXRob2QgLSByZXR1cm5zIHRoZSBtb2R1bGUncyBuYW1lLgoJICogCgkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgbmFtZQoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CgkJcmV0dXJuIGdldFByb2plY3QoKS5nZXROYW1lKCk7CgkJLy9yZXR1cm4gZ2V0TW9kdWxlKCkuZ2V0TmFtZSgpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZSBjdXJyZW50bHkgZXhpc3RzLCBhbmQgZmFsc2UgaWYgaXQgaGFzCgkgKiBiZWVuIGRlbGV0ZWQgb3IgbW92ZWQgYW5kIGlzIG5vIGxvbmdlciByZXByZXNlbnRlZCBieSB0aGlzIG1vZHVsZS4KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewoJCXJldHVybiAoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgZ2V0UHJvamVjdCgpLmV4aXN0cygpKTsKCX0KCQoJLyoqCgkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQoJICovCglwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewoJCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGUpKQoJCQlyZXR1cm4gZmFsc2U7CgoJCVByb2plY3RNb2R1bGUgZHAgPSAoUHJvamVjdE1vZHVsZSkgb2JqOwoJCS8vaWYgKGdldEZhY3RvcnlJZCgpICE9IG51bGwgJiYgIWdldEZhY3RvcnlJZCgpLmVxdWFscyhkcC5nZXRGYWN0b3J5SWQoKSkpCgkJLy8JcmV0dXJuIGZhbHNlOwoJCQkKCQlJUGF0aCByb290MiA9IG51bGw7CgkJdHJ5IHsKCQkJcm9vdDIgPSBnZXRSb290Rm9sZGVyKCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJLy8gaWdub3JlCgkJfQoJCQoJCUlQYXRoIHJvb3QzID0gbnVsbDsKCQl0cnkgewoJCQlyb290MyA9IGRwLmdldFJvb3RGb2xkZXIoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJCgkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmICFwcm9qZWN0LmVxdWFscyhkcC5nZXRQcm9qZWN0KCkpKQoJCQlyZXR1cm4gZmFsc2U7CgkJCgkJaWYgKGdldElkKCkgIT0gbnVsbCAmJiAhZ2V0SWQoKS5lcXVhbHMoZHAuZ2V0SWQoKSkpCgkJCXJldHVybiBmYWxzZTsKCgkJaWYgKHJvb3QyID09IG51bGwgJiYgcm9vdDMgIT0gbnVsbCkKCQkJcmV0dXJuIGZhbHNlOwoJCWlmIChyb290MiAhPSBudWxsICYmICFyb290Mi5lcXVhbHMocm9vdDMpKQoJCQlyZXR1cm4gZmFsc2U7CgoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogQWRkIGEgbGlzdGVuZXIgZm9yIHRoZSBtb2R1bGUuCgkgKgoJICogQHBhcmFtIGxpc3RlbmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlTGlzdGVuZXIKCSAqLwoJcHVibGljIHZvaWQgYWRkTW9kdWxlTGlzdGVuZXIoSU1vZHVsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQWRkaW5nIG1vZHVsZSBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKCQoJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwoJCWVsc2UgaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCgkJCXJldHVybjsKCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBBZGQgYSBsaXN0ZW5lciBmb3IgdGhlIG1vZHVsZS4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVMaXN0ZW5lcgoJICovCglwdWJsaWMgdm9pZCByZW1vdmVNb2R1bGVMaXN0ZW5lcihJTW9kdWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJSZW1vdmluZyBtb2R1bGUgbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiBmcm9tICIgKyB0aGlzKTsKCQoJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Cgl9CgkKCS8qKgoJICogRmlyZSBhIG1vZHVsZSBjaGFuZ2UgZXZlbnQuCgkgKi8KCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVDaGFuZ2VFdmVudChib29sZWFuIGlzQ2hhbmdlLCBJTW9kdWxlW10gYWRkZWQsIElNb2R1bGVbXSBjaGFuZ2VkLCBJTW9kdWxlW10gcmVtb3ZlZCkgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBGaXJpbmcgbW9kdWxlIGNoYW5nZSBldmVudDogIiArIGdldE1vZHVsZSgpLmdldE5hbWUoKSArICIgKCIgKyBpc0NoYW5nZSArICIpIC0+LSIpOwoJCgkJaWYgKGxpc3RlbmVycyA9PSBudWxsIHx8IGxpc3RlbmVycy5pc0VtcHR5KCkpCgkJCXJldHVybjsKCQoJCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKCQlJTW9kdWxlTGlzdGVuZXJbXSBkY2wgPSBuZXcgSU1vZHVsZUxpc3RlbmVyW3NpemVdOwoJCWxpc3RlbmVycy50b0FycmF5KGRjbCk7CgkJCgkJTW9kdWxlRXZlbnQgZXZlbnQgPSBuZXcgTW9kdWxlRXZlbnQoZ2V0TW9kdWxlKCksIGlzQ2hhbmdlLCBhZGRlZCwgY2hhbmdlZCwgcmVtb3ZlZCk7CgkKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQl0cnkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiICBGaXJpbmcgbW9kdWxlIGNoYW5nZSBldmVudCB0bzogIiArIGRjbFtpXSk7CgkJCQlkY2xbaV0ubW9kdWxlQ2hhbmdlZChldmVudCk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIEVycm9yIGZpcmluZyBtb2R1bGUgY2hhbmdlIGV2ZW50IiwgZSk7CgkJCX0KCQl9CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLTwtIERvbmUgZmlyaW5nIG1vZHVsZSBjaGFuZ2UgZXZlbnQgLTwtIik7Cgl9CgkKCS8qKgoJICogQ2FsbGVkIHdoZW4gdGhlIGxpc3RlbmVyIHBhdGhzIGZyb20gdGhlIG1vZHVsZSBmYWN0b3J5IGNoYW5nZS4KCSAqIFVzZSB0aGlzIG1ldGhvZCB0byByZS1jYWNoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kdWxlLgoJICovCglwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CgkJLy8gZG8gbm90aGluZwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlcyBvZiB0aGlzIG1vZHVsZS4KCSAqCgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlW10KCSAqLwoJcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoKSB7CgkJcmV0dXJuIG51bGw7Cgl9Cn0=