LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CgppbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CmltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLyoqCiAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCiAqLwpwdWJsaWMgY2xhc3MgVHJhY2UgewoJcHVibGljIHN0YXRpYyBieXRlIENPTkZJRyA9IDA7CglwdWJsaWMgc3RhdGljIGJ5dGUgSU5GTyA9IDE7CglwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDI7CglwdWJsaWMgc3RhdGljIGJ5dGUgU0VWRVJFID0gMzsKCXB1YmxpYyBzdGF0aWMgYnl0ZSBGSU5FU1QgPSA0OwoJcHVibGljIHN0YXRpYyBieXRlIEZJTkVSID0gNTsKCXB1YmxpYyBzdGF0aWMgYnl0ZSBQRVJGT1JNQU5DRSA9IDY7CgkKCXByb3RlY3RlZCBzdGF0aWMgaW50IHBsdWdpbkxlbmd0aCA9IC0xOwoJCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXZlbE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKCQkiQ09ORklHICIsICJJTkZPICAgIiwgIldBUk5JTkciLCAiU0VWRVJFICIsICJGSU5FUiAgIiwgIkZJTkVTVCAiLCAiUEVSRiAgICJ9OwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNwYWNlciA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7CgoJLyoqCgkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwcml2YXRlIFRyYWNlKCkgewoJCXN1cGVyKCk7Cgl9CgoJLyoqCgkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KCSAqCgkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewoJCXRyYWNlKGxldmVsLCBzLCBudWxsKTsKCX0KCQoJLyoqCgkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgoJICoKCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKCSAqIEBwYXJhbSB0IGphdmEubGFuZy5UaHJvd2FibGUKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewoJCWlmICghU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQoJCQlyZXR1cm47CgoJCVN0cmluZyBwbHVnaW5JZCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRDsKCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBsdWdpbklkKTsKCQlpZiAocGx1Z2luSWQubGVuZ3RoKCkgPiBwbHVnaW5MZW5ndGgpCgkJCXBsdWdpbkxlbmd0aCA9IHBsdWdpbklkLmxlbmd0aCgpOwoJCWVsc2UgaWYgKHBsdWdpbklkLmxlbmd0aCgpIDwgcGx1Z2luTGVuZ3RoKQoJCQlzYi5hcHBlbmQoc3BhY2VyLnN1YnN0cmluZygwLCBwbHVnaW5MZW5ndGggLSBwbHVnaW5JZC5sZW5ndGgoKSkpOwoJCXNiLmFwcGVuZCgiICIpOwoJCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7CgkJc2IuYXBwZW5kKCIgIik7CgkJc2IuYXBwZW5kKHNkZi5mb3JtYXQobmV3IERhdGUoKSkpOwoJCXNiLmFwcGVuZCgiICIpOwoJCXNiLmFwcGVuZChzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CgkJaWYgKHQgIT0gbnVsbCkKCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKCX0KCgkvKioKCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgoJICoKCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBzKSB7CgkJdHJhY2UocywgbnVsbCk7Cgl9CgkKCS8qKgoJICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KCSAqCgkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCgkgKiBAcGFyYW0gdCBqYXZhLmxhbmcuVGhyb3dhYmxlCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKCQl0cmFjZShGSU5FU1QsIHMsIHQpOwoJfQp9