LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDExIHByb3RvcyBzb2Z0d2FyZSBnbWJoIChodHRwOi8vd3d3LnByb3Rvcy5kZSkuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KICoKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICoKICogQ09OVFJJQlVUT1JTOgogKiAJCUhlbnJpayBSZW50ei1SZWljaGVydCAoaW5pdGlhbCBjb250cmlidXRpb24pCiAqIAkJUGV0ZXIgS2FybGl0c2NoZWsKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwLmdlbgoKaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbgppbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3IKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmZzbS5mU00uU3RhdGUKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmZzbS5mc21nZW4uR3JhcGhDb250YWluZXIKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmZzbS5mc21nZW4uTm9kZQppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAuTWFpbgppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5nZW5lcmljLkdlbmVyaWNTdGF0ZU1hY2hpbmVHZW5lcmF0b3IKCmltcG9ydCBzdGF0aWMgZXh0ZW5zaW9uIG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmZzbS5Gc21HZW5FeHRlbnNpb25zLioKaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdAppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAuc2V0dXAuR2VuZXJhdG9yT3B0aW9uc0hlbHBlcgoKQFNpbmdsZXRvbgpjbGFzcyBTdGF0ZU1hY2hpbmVHZW4gZXh0ZW5kcyBHZW5lcmljU3RhdGVNYWNoaW5lR2VuZXJhdG9yIHsKCglASW5qZWN0IHByb3RlY3RlZCBleHRlbnNpb24gR2VuZXJhdG9yT3B0aW9uc0hlbHBlcgoKCXZhbCBub2RlQ29tcGFyYXRvciA9IG5ldyBOb2RlQ29tcGFyYXRvcgoJCglvdmVycmlkZSBnZW5FeHRyYShHcmFwaENvbnRhaW5lciBnYywgYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7CgkJdmFyIGFjID0gZ2MuY29tcG9uZW50CgkJdmFsIGNsc05hbWUgPSBhYy5jb21wb25lbnROYW1lCgkJdmFsIG9yZGVyZWRTdGF0ZU5vZGVzID0gZ2MuZ3JhcGguYWxsU3RhdGVOb2Rlcy50b0xpc3Quc29ydFdpdGgobm9kZUNvbXBhcmF0b3IpCgoJCWlmKGdlbmVyYXRlSW1wbGVtZW50YXRpb24pCgkJCScnJwoJCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uIHx8IE1haW46OnNldHRpbmdzLmdlbmVyYXRlV2l0aFZlcmJvc2VPdXRwdXS7CgkJCQkJLy8gc3RhdGUgbmFtZXMKCQkJCQljb25zdCBTdHJpbmcgq2Nsc05hbWW7OjpzX3N0YXRlU3RyaW5nc1tdID0gewoJCQkJCQkiPG5vIHN0YXRlPiIsCgkJCQkJCSI8dG9wPiIsCgkJCQkJCatGT1Igc3RhdGUgOiBvcmRlcmVkU3RhdGVOb2RlcyBTRVBBUkFUT1IgIiwiuwoJCQkJCQkJIqsoc3RhdGUuc3RhdGVHcmFwaE5vZGUgYXMgU3RhdGUpLmdlblN0YXRlUGF0aE5hbWW7IgoJCQkJCQmrRU5ERk9SuwoJCQkJCX07CgkJCQmrRU5ESUa7CgkJCQljb25zdCBpbnQgq2Nsc05hbWW7OjpzX251bWJlck9mU3RhdGVzID0gqzIrb3JkZXJlZFN0YXRlTm9kZXMuc2l6Zbs7CgoJCQkJdm9pZCCrY2xzTmFtZbs6OnNldFN0YXRlKGludCBuZXdfc3RhdGUpIHsKCQkJCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267CgkJCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkQWN0b3JTdGF0ZSgqdGhpcywgc19zdGF0ZVN0cmluZ3NbbmV3X3N0YXRlXS5jX3N0cigpKTsKCQkJCQmrRU5ESUa7CgkJCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlV2l0aFZlcmJvc2VPdXRwdXS7CgkJCQkJCWlmIChzX3N0YXRlU3RyaW5nc1tuZXdfc3RhdGVdICE9ICJJZGxlIikgewoJCQkJCQkJc3RkOjpjb3V0IDw8IGdldEluc3RhbmNlUGF0aCgpLmNfc3RyKCkgPDwgIiAtPiAiIDw8IHNfc3RhdGVTdHJpbmdzW25ld19zdGF0ZV0uY19zdHIoKSA8PCBzdGQ6OmVuZGw7CgkJCQkJCX0KCQkJCQmrRU5ESUa7CgkJCQkJbV9zdGF0ZSA9IG5ld19zdGF0ZTsKCQkJCX0KCQkJJycnCgkJZWxzZQoJCQknJycKCQkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbiB8fCBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZVdpdGhWZXJib3NlT3V0cHV0uwoJCQkJc3RhdGljIGNvbnN0IFN0cmluZyBzX3N0YXRlU3RyaW5nc1tdOwoJCQkJq0VORElGuwoJCQkJc3RhdGljIGNvbnN0IGludCBzX251bWJlck9mU3RhdGVzOwoKCQkJCWludCBoaXN0b3J5W6syK29yZGVyZWRTdGF0ZU5vZGVzLnNpemW7XTsKCgkJCQl2b2lkIHNldFN0YXRlKGludCBuZXdfc3RhdGUpOwoJCQknJycKCX0KCglvdmVycmlkZSBzdGF0ZVR5cGUoKSB7CgkJImV0SW50MTYiCgl9CgoJb3ZlcnJpZGUgYm9vbFR5cGUoKSB7CgkJImV0Qm9vbCIKCX0KCglwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8Tm9kZT4gewoJCQoJCS8vIGl0IGlzIGNydWNpYWwgdGhhdCB3ZSBvYmV5IHRoZSBvcmRlciB0aGF0IGlzIHVzZWQgZm9yIHN0YXRlIElEcwoJCS8vIHRoYXQgbWVhbnMgd2UgaGF2ZSB0byBjb2xsZWN0IGJhc2UgY2xhc3NlcyBmaXJzdCBhbmQgZWFjaCBiYXNlIGNsYXNzIGxpc3Qgd2l0aCBsZWFmIHN0YXRlcyBsYXN0CgkJb3ZlcnJpZGUgaW50IGNvbXBhcmUoTm9kZSBvMSwgTm9kZSBvMikgewoJCQlpZiAobzEuaW5oZXJpdGFuY2VMZXZlbD09bzIuaW5oZXJpdGFuY2VMZXZlbCkgewoJCQkJaWYgKG8xLmlzTGVhZiAmJiBvMi5pc0xlYWYpIHsKCQkJCQlyZXR1cm4gMAoJCQkJfQoJCQkJaWYgKG8xLmlzTGVhZikgewoJCQkJCXJldHVybiAxCgkJCQl9CgkJCQlpZiAobzIuaXNMZWFmKSB7CgkJCQkJcmV0dXJuIC0xCgkJCQl9CgkJCQlyZXR1cm4gMAoJCQl9CgkJCWVsc2UgewoJCQkJcmV0dXJuIEludGVnZXIuY29tcGFyZShvMS5pbmhlcml0YW5jZUxldmVsLCBvMS5pbmhlcml0YW5jZUxldmVsKQoJCQl9CgkJfQoJCQoJfQp9Cg==