LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci8qKgogKiAKICogQHNpbmNlIDEuMAogKi8KcHVibGljIGludGVyZmFjZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSB7CgkvKioKCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDApIGZvciBubyBjaGFuZ2UuCgkgKiAKCSAqIEBzZWUgI2dldEtpbmQoKQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19DSEFOR0UgPSAwOwoKCS8qKgoJICogS2luZCBjb25zdGFudCAodmFsdWUgMSkgZm9yIGFkZGVkIHJlc291cmNlcy4KCSAqIAoJICogQHNlZSAjZ2V0S2luZCgpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMTsKCgkvKioKCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDIpIGZvciBjaGFuZ2VkIHJlc291cmNlcy4KCSAqIAoJICogQHNlZSAjZ2V0S2luZCgpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRUQgPSAyOwoKCS8qKgoJICogS2luZCBjb25zdGFudCAodmFsdWUgMykgZm9yIHJlbW92ZWQgcmVzb3VyY2VzLgoJICogCgkgKiBAc2VlICNnZXRLaW5kKCkKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFRCA9IDM7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZWx0YS4KCSAqIAoJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgcmVzb3VyY2UKCSAqLwoJcHVibGljIElNb2R1bGVSZXNvdXJjZSBnZXRNb2R1bGVSZXNvdXJjZSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUga2luZCBvZiB0aGlzIHJlc291cmNlIGRlbHRhLgoJICogTm9ybWFsbHksIG9uZSBvZiA8Y29kZT5BRERFRDwvY29kZT4sIAoJICogPGNvZGU+UkVNT1ZFRDwvY29kZT4sIDxjb2RlPkNIQU5HRUQ8L2NvZGU+LgoJICogCgkgKiBAcmV0dXJuIHRoZSBraW5kIG9mIHRoaXMgcmVzb3VyY2UgZGVsdGEKCSAqIAoJICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNBRERFRAoJICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNSRU1PVkVECgkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI0NIQU5HRUQKCSAqLwoJcHVibGljIGludCBnZXRLaW5kKCk7CgoJLyoqCgkgKiBSZXR1cm5zIG1vZHVsZSByZXNvdXJjZSBkZWx0YXMgZm9yIGFsbCBjaGlsZHJlbiBvZiB0aGlzIHJlc291cmNlIAoJICogd2hpY2ggd2VyZSBhZGRlZCwgcmVtb3ZlZCwgb3IgY2hhbmdlZC4gUmV0dXJucyBhbiBlbXB0eQoJICogYXJyYXkgaWYgdGhlcmUgYXJlIG5vIGFmZmVjdGVkIGNoaWxkcmVuLgoJICogPHA+CgkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBmdWxseSBlcXVpdmFsZW50IHRvOgoJICogPHByZT4KCSAqICAgZ2V0QWZmZWN0ZWRDaGlsZHJlbihBRERFRCB8IFJFTU9WRUQgfCBDSEFOR0VELCBJUmVzb3VyY2UuTk9ORSk7CgkgKiA8L3ByZT4KCSAqIDwvcD4KCSAqCgkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBkZWx0YXMgZm9yIGFsbCBhZmZlY3RlZCBjaGlsZHJlbgoJICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNBRERFRAoJICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNSRU1PVkVECgkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI0NIQU5HRUQKCSAqLwoJcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwoJCgkvKioKCSAqIFJldHVybnMgdGhlIG1vZHVsZS1yZWxhdGl2ZSBwYXRoIG9mIHRoaXMgcmVzb3VyY2UgZGVsdGEuCgkgKiBSZXR1cm5zIHRoZSBlbXB0eSBwYXRoIGZvciByZXNvdXJjZXMgaW4gdGhlIG1vZHVsZSByb290LgoJICogPHA+CgkgKiBBIHJlc291cmNlJ3MgbW9kdWxlLXJlbGF0aXZlIHBhdGggaW5kaWNhdGVzIHRoZSByb3V0ZSBmcm9tIHRoZSBtb2R1bGUKCSAqIHRvIHRoZSByZXNvdXJjZS4gV2l0aGluIGEgbW9kdWxlLCB0aGVyZSBpcyBleGFjdGx5IG9uZSBzdWNoIHBhdGgKCSAqIGZvciBhbnkgZ2l2ZW4gcmVzb3VyY2UuIFRoZSByZXR1cm5lZCBwYXRoIG5ldmVyIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvci4KCSAqIDwvcD4KCSAqIEByZXR1cm4gdGhlIG1vZHVsZS1yZWxhdGl2ZSBwYXRoIG9mIHRoaXMgcmVzb3VyY2UgZGVsdGEKCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlI2dldE1vZHVsZVJlbGF0aXZlUGF0aCgpCgkgKi8KCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKTsKCQoJLyoqCgkgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgZGVzY2VuZGVudCBkZWx0YSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoIGluCgkgKiB0aGlzIGRlbHRhLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGRlc2NlbmRlbnQgZXhpc3RzLgoJICogVGhlIHN1cHBsaWVkIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpbiBlaXRoZXIgY2FzZSwgaXQgaXMKCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgZGVsdGEuICAgVHJhaWxpbmcgc2VwYXJhdG9ycyBhcmUgaWdub3JlZC4KCSAqIElmIHRoZSBwYXRoIGlzIGVtcHR5IHRoaXMgZGVsdGEgaXMgcmV0dXJuZWQuCgkgKiA8cD4KCSAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYXZvaWQgbWFudWFsIHRyYXZlcnNhbCBvZiB0aGUgZGVsdGEKCSAqIHRyZWUgaW4gY2FzZXMgd2hlcmUgdGhlIGxpc3RlbmVyIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiBjaGFuZ2VzIHRvCgkgKiBwYXJ0aWN1bGFyIHJlc291cmNlcy4gIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBnZW5lcmFsbHkgYmUKCSAqIGZhc3RlciB0aGFuIG1hbnVhbGx5IHRyYXZlcnNpbmcgdGhlIGRlbHRhIHRvIGEgcGFydGljdWxhciBkZXNjZW5kZW50LgoJICogPC9wPgoJICogQHBhcmFtIHBhdGggdGhlIHBhdGggb2YgdGhlIGRlc2lyZWQgZGVzY2VuZGVudCBkZWx0YQoJICogQHJldHVybiB0aGUgZGVzY2VuZGVudCBkZWx0YSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaAoJICogCQlkZXNjZW5kZW50IGV4aXN0cyBpbiB0aGUgZGVsdGEKCSAqIEBzaW5jZSAyLjAKCSAqLwoJLy9wdWJsaWMgSU1vZHVsZVJlc291cmNlRGVsdGEgZmluZE1lbWJlcihJUGF0aCBwYXRoKTsKCQoJLyoqCgkgKiBSZXR1cm5zIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGNoaWxkcmVuIG9mIHRoaXMgcmVzb3VyY2UgCgkgKiB3aG9zZSBraW5kIGlzIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBtYXNrLiBLaW5kIG1hc2tzIGFyZSBmb3JtZWQKCSAqIGJ5IHRoZSBiaXR3aXNlIG9yIG9mIDxjb2RlPklSZXNvdXJjZURlbHRhPC9jb2RlPiBraW5kIGNvbnN0YW50cy4KCSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIGFmZmVjdGVkIGNoaWxkcmVuLgoJICogPHA+CgkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBmdWxseSBlcXVpdmFsZW50IHRvOgoJICogPHByZT4KCSAqICAgZ2V0QWZmZWN0ZWRDaGlsZHJlbihraW5kTWFzaywgSVJlc291cmNlLk5PTkUpOwoJICogPC9wcmU+CgkgKiBUZWFtLXByaXZhdGUgbWVtYmVyIHJlc291cmNlcyBhcmUgPGI+bm90PC9iPiBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBraW5kTWFzayBhIG1hc2sgZm9ybWVkIGJ5IHRoZSBiaXR3aXNlIG9yIG9mIDxjb2RlPklSZXNvdXJjZURlbHRhIDwvY29kZT4gCgkgKiAgICBkZWx0YSBraW5kIGNvbnN0YW50cwoJICogQHJldHVybiB0aGUgcmVzb3VyY2UgZGVsdGFzIGZvciBhbGwgYWZmZWN0ZWQgY2hpbGRyZW4KCSAqIEBzZWUgSVJlc291cmNlRGVsdGEjQURERUQKCSAqIEBzZWUgSVJlc291cmNlRGVsdGEjUkVNT1ZFRAoJICogQHNlZSBJUmVzb3VyY2VEZWx0YSNDSEFOR0VECgkgKiBAc2VlICNnZXRBZmZlY3RlZENoaWxkcmVuKGludCkKCSAqLwoJLy9wdWJsaWMgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXRBZmZlY3RlZENoaWxkcmVuKGludCBraW5kTWFzayk7CgkKCS8qKgoJICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvci4KCSAqIFRoZSBvbmx5IGtpbmRzIG9mIHJlc291cmNlIGRlbHRhcyB2aXNpdGVkIAoJICogYXJlIDxjb2RlPkFEREVEPC9jb2RlPiwgPGNvZGU+UkVNT1ZFRDwvY29kZT4sIAoJICogYW5kIDxjb2RlPkNIQU5HRUQ8L2NvZGU+LgoJICogVGhlIHZpc2l0b3IncyA8Y29kZT52aXNpdDwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoaXMKCSAqIHJlc291cmNlIGRlbHRhIGlmIGFwcGxpY2FibGUuIElmIHRoZSB2aXNpdG9yIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sCgkgKiB0aGUgcmVzb3VyY2UgZGVsdGEncyBjaGlsZHJlbiBhcmUgYWxzbyB2aXNpdGVkLgoJICogPHA+CgkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBmdWxseSBlcXVpdmFsZW50IHRvIAoJICogPGNvZGU+YWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5OT05FKTwvY29kZT4uCgkgKiBBbHRob3VnaCB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQgZm9yIHRoaXMgcmVzb3VyY2UgZGVsdGEsIGl0IHdpbGwgbm90IGJlCgkgKiBpbnZva2VkIGZvciBhbnkgdGVhbS1wcml2YXRlIG1lbWJlciByZXNvdXJjZXMuCgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3IKCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgdmlzaXRvciBmYWlsZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KElSZXNvdXJjZURlbHRhKQoJICovCgkvL3B1YmxpYyB2b2lkIGFjY2VwdChJTW9kdWxlUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Cn0=