LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLyoqCiAqIEhlbHBlciBjbGFzcyB0aGF0IHN0b3JlcyBwcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvciBzZXJ2ZXIgdG9vbHMuCiAqLwpwdWJsaWMgY2xhc3MgU2VydmVyUHJlZmVyZW5jZXMgewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19SRVNUQVJUID0gImF1dG8tcmVzdGFydCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0ggPSAiYXV0by1wdWJsaXNoIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUID0gIm1vZHVsZS1zdGFydC10aW1lb3V0IjsKCQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMID0gImF1dG8tcHVibGlzaC1sb2NhbCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0hfTE9DQUxfVElNRSA9ICJhdXRvLXB1Ymxpc2gtbG9jYWwtdGltZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFID0gImF1dG8tcHVibGlzaC1yZW1vdGUiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URV9USU1FID0gImF1dG8tcHVibGlzaC1yZW1vdGUtdGltZSI7CgkKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX01BQ0hJTkVfU1BFRUQgPSAibWFjaGluZS1zcGVlZCI7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU1lOQ19PTl9TVEFSVFVQID0gInN5bmMtb24tc3RhcnR1cCI7CgoJcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKCglwcm90ZWN0ZWQgc3RhdGljIFNlcnZlclByZWZlcmVuY2VzIGluc3RhbmNlOwoKCS8qKgoJICogU2VydmVyUHJlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwcml2YXRlIFNlcnZlclByZWZlcmVuY2VzKCkgewoJCXN1cGVyKCk7CgkJcHJlZmVyZW5jZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc3RhdGljIGluc3RhbmNlLgoJICogCgkgKiBAcmV0dXJuIHRoZSBzdGF0aWMgaW5zdGFuY2UKCSAqLwoJcHVibGljIHN0YXRpYyBTZXJ2ZXJQcmVmZXJlbmNlcyBnZXRJbnN0YW5jZSgpIHsKCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKCQkJaW5zdGFuY2UgPSBuZXcgU2VydmVyUHJlZmVyZW5jZXMoKTsKCQlyZXR1cm4gaW5zdGFuY2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KCSAqIHJlcXVpcmVkLgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0F1dG9SZXN0YXJ0aW5nKCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQVVUT19SRVNUQVJUKTsKCX0KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBzZXJ2ZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgd2hlbgoJICogcmVxdWlyZWQuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEF1dG9SZXN0YXJ0aW5nKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBvY2N1ciBiZWZvcmUgc3RhcnRpbmcgdGhlCgkgKiBzZXJ2ZXIuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzQXV0b1B1Ymxpc2hpbmcoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUFJFRl9BVVRPX1BVQkxJU0gpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBvY2N1ciBiZWZvcmUgc3RhcnRpbmcgdGhlCgkgKiBzZXJ2ZXIuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEF1dG9QdWJsaXNoaW5nKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogU2V0IHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KCSAqIHRoZXkgbmVlZCBhIHJlc3RhcnQuCgkgKgoJICogQHBhcmFtIHZhbHVlCgkgKi8KCXB1YmxpYyB2b2lkIHNldEF1dG9SZXN0YXJ0aW5nKGJvb2xlYW4gdmFsdWUpIHsKCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUkVTVEFSVCwgdmFsdWUpOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogU2V0IHdoZXRoZXIgcHVibGlzaGluZyBzaG91bGQgaGFwcGVuIGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cy4KCSAqCgkgKiBAcGFyYW0gdmFsdWUKCSAqLwoJcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hpbmcoYm9vbGVhbiB2YWx1ZSkgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNILCB2YWx1ZSk7CgkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgc3RhcnQgdGltZW91dC4KCSAqIAoJICogQHJldHVybiB0aGUgbW9kdWxlIHN0YXJ0IHRpbWVvdXQKCSAqLwoJcHVibGljIGludCBnZXRNb2R1bGVTdGFydFRpbWVvdXQoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUKTsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgbWFjaGluZSBzcGVlZCBpbmRleCwgZnJvbSAxIHRvIDEwLgoJICogCgkgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBzcGVlZAoJICovCglwdWJsaWMgaW50IGdldE1hY2hpbmVTcGVlZCgpIHsKCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfTUFDSElORV9TUEVFRCk7Cgl9CgkKCS8qKgoJICogUmV0dXJuIHRoZSBkZWZhdWx0IG1hY2hpbmUgc3BlZWQgaW5kZXgsIDUuCgkgKiAKCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3BlZWQgaW5kZXgKCSAqLwoJcHVibGljIGludCBnZXREZWZhdWx0TWFjaGluZVNwZWVkKCkgewoJCXJldHVybiA1OwoJfQoKCS8qKgoJICogU2V0cyB0aGUgcmVsYXRpdmUgbWFjaGluZSBzcGVlZCBpbmRleCwgZnJvbSAxIHRvIDEwLgoJICogCgkgKiBAcGFyYW0gc3BlZWQgdGhlIHJlbGF0aXZlIHNwZWVkIAoJICovCglwdWJsaWMgdm9pZCBzZXRNYWNoaW5lU3BlZWQoaW50IHNwZWVkKSB7CgkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9NQUNISU5FX1NQRUVELCBzcGVlZCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIHN5bmMgb24gc3RhcnR1cCB2YWx1ZS4KCSAqIAoJICogQHJldHVybiB0aGUgc3luYyBvbiBzdGFydHVwIHZhbHVlCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzU3luY09uU3RhcnR1cCgpIHsKCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX1NZTkNfT05fU1RBUlRVUCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc3luYyBvbiBzdGFydHVwIHZhbHVlLgoJICogCgkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHN5bmMgb24gc3RhcnR1cCB2YWx1ZQoJICovCglwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U3luY09uU3RhcnR1cCgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBzeW5jIG9uIHN0YXJ0dXAgdmFsdWUuCgkgKiAKCSAqIEBwYXJhbSBzeW5jIHRoZSBzeW5jIG9uIHN0YXJ0dXAgdmFsdWUgCgkgKi8KCXB1YmxpYyB2b2lkIHNldFN5bmNPblN0YXJ0dXAoYm9vbGVhbiBzeW5jKSB7CgkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9TWU5DX09OX1NUQVJUVVAsIHN5bmMpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBsb2NhbCBhdXRvLXB1Ymxpc2hpbmcuCgkgKiAKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRBdXRvUHVibGlzaExvY2FsKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIGxvY2FsIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGJvb2xlYW4gZ2V0QXV0b1B1Ymxpc2hMb2NhbCgpIHsKCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX0FVVE9fUFVCTElTSF9MT0NBTCk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcGFyYW0gYXV0bwoJICovCglwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaExvY2FsKGJvb2xlYW4gYXV0bykgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMLCBhdXRvKTsKCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIGxvY2FsIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGludCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKSB7CgkJcmV0dXJuIDE1OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgaW50IGdldEF1dG9QdWJsaXNoTG9jYWxUaW1lKCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9BVVRPX1BVQkxJU0hfTE9DQUxfVElNRSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcGFyYW0gYXV0bwoJICovCglwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaExvY2FsVGltZShpbnQgYXV0bykgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMX1RJTUUsIGF1dG8pOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0QXV0b1B1Ymxpc2hSZW1vdGUoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGJvb2xlYW4gZ2V0QXV0b1B1Ymxpc2hSZW1vdGUoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFKTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHZhbHVlIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcGFyYW0gYXV0bwoJICovCglwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaFJlbW90ZShib29sZWFuIGF1dG8pIHsKCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUsIGF1dG8pOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgaW50IGdldERlZmF1bHRBdXRvUHVibGlzaFJlbW90ZVRpbWUoKSB7CgkJcmV0dXJuIDYwOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGludCBnZXRBdXRvUHVibGlzaFJlbW90ZVRpbWUoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEVfVElNRSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHBhcmFtIGF1dG8KCSAqLwoJcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKGludCBhdXRvKSB7CgkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFX1RJTUUsIGF1dG8pOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcy4KCSAqLwoJcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSCwgaXNEZWZhdWx0QXV0b1B1Ymxpc2hpbmcoKSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUkVTVEFSVCwgaXNEZWZhdWx0QXV0b1Jlc3RhcnRpbmcoKSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX01BQ0hJTkVfU1BFRUQsIGdldERlZmF1bHRNYWNoaW5lU3BlZWQoKSk7CgkJCgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9MT0NBTCwgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWwoKSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9MT0NBTF9USU1FLCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUsIGdldERlZmF1bHRBdXRvUHVibGlzaFJlbW90ZSgpKTsKCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URV9USU1FLCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKCkpOwoJCQoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TWU5DX09OX1NUQVJUVVAsIGdldERlZmF1bHRTeW5jT25TdGFydHVwKCkpOwoJCQoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCwgMzAwMDAxKTsKCQlib29sZWFuIHNhdmUgPSBmYWxzZTsKCQlpZiAocHJlZmVyZW5jZXMuaXNEZWZhdWx0KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQpKSB7CgkJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQsIDMwMDAwMCk7CgkJCXNhdmUgPSB0cnVlOwoJCX0KCQlpZiAoc2F2ZSkKCQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Cgl9Cn0=