LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDIwIENFQSBMSVNUCiAqIAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZQogKiBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgTGljZW5zZSAyLjAgd2hpY2gKICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KICogCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgQWJoaXNoZWsgRGplYWNoYW5kcmFuZSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnBhY2thZ2Ugb3JnLmVjbGlwc2UucGFweXJ1cy5haW1sLmdlbi5rZXJhczsKCmltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzczsKaW1wb3J0IHN0YXRpYyBleHRlbnNpb24gb3JnLmVjbGlwc2UudW1sMi51bWwudXRpbC5VTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbgppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5haW1sLnByb2ZpbGUuQUlNTC5Nb2R1bGUuTW9kZWwKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuYWltbC5wcm9maWxlLkFJTUwuVGVuc29yLlRlbnNvcgppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5haW1sLnByb2ZpbGUuQUlNTC5Db252b2x1dGlvbl9sYXllcnMuQ29udm9sdXRpb25fbGF5ZXJzCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLmFpbWwucHJvZmlsZS5BSU1MLlJlY3VycmVudF9sYXllcnMuUmVjdXJyZW50X2xheWVycwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5haW1sLnByb2ZpbGUuQUlNTC5SZWN1cnJlbnRfbGF5ZXJzLkxTVE0KaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuYWltbC5wcm9maWxlLkFJTUwuUmVjdXJyZW50X2xheWVycy5HUlUKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuYWltbC5wcm9maWxlLkFJTUwuTGluZWFyX2xheWVycy5MaW5lYXJfbGF5ZXJzCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLmFpbWwucHJvZmlsZS5BSU1MLkxpbmVhcl9sYXllcnMuTGluZWFyCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLmFpbWwuZ2VuLmtlcmFzLk1vZGVsT3BzOwoKCmNsYXNzIEdlbktlcmFzIHsKCXN0YXRpYyBkZWYgZ2VuS2VyYXMoQ2xhc3MgY2xhenopIHsKCQl2YWwgbW9kdWxlID0gY2xhenouZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKE1vZGVsKQoJCWlmIChtb2R1bGUgIT09IG51bGwpIHsKCQkJcmV0dXJuIG1vZHVsZS5nZW5Nb2R1bGUKCQl9IGVsc2UgewoJCQlyZXR1cm4gIiI7CgkJfQoJfQoJLyoqCgkgKiBHZW5lcmF0ZSBhIG1vZGVsIHdpdGggZGlmZmVyZW50IGVsZW1lbnRzIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBpbGF0aW9uIAoJICovCglzdGF0aWMgZGVmIGdlbk1vZHVsZShNb2RlbCBtb2R1bGUpICcnJwoJCattb2R1bGUuZ2VuRGVmYXVsdFRlbXBsYXRluwoJCQoJCattb2R1bGUuZ2VuTW9kdWxlSW5pdLsKCQkKCQkJq21vZHVsZS5nZW5Nb2R1bGVDYWxsuwoJCQoJCattb2R1bGUuZ2VuTW9kdWxlQ29tcGlsYXRpb267CgoJCQoJCQoJCQoJCQoJJycnCgoJLyoqCgkgKiBHZW5lcmF0ZSB0aGUgbW9kZWwgaW5zdGFuY2UgYW5kIGNvbXBpbGF0aW9uIAoJICovCglzdGF0aWMgZGVmIGdlbk1vZHVsZUNvbXBpbGF0aW9uKE1vZGVsIG1vZHVsZSkgJycnCgkJq21vZHVsZS5iYXNlX0NsYXNzLm5hbWUudG9GaXJzdExvd2VyuyA9IKttb2R1bGUuYmFzZV9DbGFzcy5uYW1luygpCgkJq6urq7urTW9kZWxPcHMubW9kZWxBdHRyaWJ1dGVzVG9EaXNwbGF5Rm9yQ29tcGlsYXRpb24obW9kdWxlKbsKCQmrdmFyIHN0dWR5PU1vZGVsT3BzLm1vZGVsQXR0cmlidXRlc1RvQ29sbGVjdFByb3Blcmx5KG1vZHVsZSm7CgkJq3N0dWR5LmF0dHJpYnV0ZXNOYW1lLnRvTGlzdLsKCQmrc3R1ZHkuYXR0cmlidXRlc1ZhbHVlLnRvTGlzdLsKCQmrc3R1ZHkuYXR0cmlidXRlc1R5cGUudG9MaXN0uwoJCatGT1IgbiA6IHN0dWR5LmF0dHJpYnV0ZXNWYWx1ZS50b0xpc3S7CgkJCgkJq0VOREZPUrsKCQmrdmFyIHN0dWR5Mj1Nb2RlbE9wcy5tb2RlbEF0dHJpYnV0ZXNUb0Rpc3BsYXlGb3JDb21waWxhdGlvblByb3Blcmx5KG1vZHVsZSm7CgkJq3N0dWR5MrsKCScnJwoJLyoqCgkgKiBHZW5lcmF0ZSB0aGUgYmFzaWMgdGVtcGxhdGUgd2l0aCBpbXBvcnRhdGlvbiBpbiB0aGUgaGVhZCBvZiB0aGUgY29kZSAKCSAqLwoJc3RhdGljIGRlZiBnZW5EZWZhdWx0VGVtcGxhdGUoTW9kZWwgbW9kdWxlKSAnJycKCQkjIGdlbmVyYXRlZCBieSBQYXB5cnVzIGZyb20gbW9kdWxlIKttb2R1bGUuYmFzZV9DbGFzcy5jbGFzc7sKCQkKCQlpbXBvcnQgdGVuc29yZmxvdyBhcyB0ZgoJCWZyb20gdGVuc29yZmxvdyBpbXBvcnQga2VyYXMKCQlpbnB1dHM9WygxLDIpLCgzLDQpXQoJJycnCgoJLyoqCgkgKiBHZW5lcmF0ZSBsYXllciBpbnN0YW5jZSB0aHJvdWdoIG1vZGVsaW5nCgkgKi8KCXN0YXRpYyBkZWYgZ2VuTW9kdWxlSW5pdChNb2RlbCBtb2R1bGUpICcnJwoJCWNsYXNzIKttb2R1bGUuYmFzZV9DbGFzcy5uYW1luyh0Zi5rZXJhcy5Nb2RlbCk6CgkJCWRlZiBfX2luaXRfXyhzZWxmKToKCQkJCXN1cGVyKE15TW9kZWwsIHNlbGYpLl9faW5pdF9fKCkKCQkJCQoJCQkJq0ZPUiBsYXllciA6IG1vZHVsZS5iYXNlX0NsYXNzLm93bmVkQXR0cmlidXRlc7sKCQkJCQmrdmFsIHR5cGUgPSBsYXllci50eXBluwoJCQkJCat2YWwgbGF5ZXJTdCA9IHR5cGUuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKE1vZGVsKbsKCQkJCQmrZ2VuTGF5ZXIobGF5ZXJTdCm7CgkJCQmrRU5ERk9SuwoJCQkJq0ZPUiBjb25uZWN0b3IgOiBtb2R1bGUuYmFzZV9DbGFzcy5vd25lZENvbm5lY3RvcnO7CgkJCQmrRU5ERk9SuwoJJycnCgoKCS8qKgoJICogR2VuZXJhdGUgdGhlIGNvZGUgd2hpY2ggY29uc2lzdCB0byBkZXRlcm1pbmUgdGhlIGRhdGEgZmxvdyBiZXR3ZWVuIGxheWVycwoJICogQHBhcmFtIGwgdGhlIG1vZGVsIC4uLgoJICovCglzdGF0aWMgZGVmIGdlbk1vZHVsZUNhbGwoTW9kZWwgbW9kdWxlKSAnJycKCQlkZWYgY2FsbChzZWxmLCBpbnB1dHMpOgoKCQmrdmFyIG5icl9sYXkgPSBHZW5DaGVjay5maW5kTmJyT2ZMYXllcihtb2R1bGUpuwoJCat2YXIgdW5zb3J0ZWRJbmZvcm1hdGlvbkZsb3dMaXN0ID0gTW9kZWxPcHMuZ2VuSW5wdXRPdXRwdXRMYXllckFycmF5V2l0aEZsb3cobmJyX2xheSxtb2R1bGUpuwoJCQoJCatJRiB1bnNvcnRlZEluZm9ybWF0aW9uRmxvd0xpc3QgaW5zdGFuY2VvZiBNb2R1bGVJbmZvuwoJCQmrdmFyIHNvcnRlZEluZm9ybWF0aW9uRmxvd0xpc3QgPSBNb2RlbE9wcy5nZW5GbG93T3JkZXIobmJyX2xheSwgdW5zb3J0ZWRJbmZvcm1hdGlvbkZsb3dMaXN0KbsKCQkJCatGT1IgbGF5ZXIgOnNvcnRlZEluZm9ybWF0aW9uRmxvd0xpc3QudG9MaXN0uwoJCQkJCat2YXIgaW5wdXRzID0gc29ydGVkSW5mb3JtYXRpb25GbG93TGlzdC50b0xpc3QuaW5kZXhPZihsYXllciktMbsKCQkJCQmrSUYgaW5wdXRzPDC7CgkJCQkJCXirc29ydGVkSW5mb3JtYXRpb25GbG93TGlzdC50b0xpc3QuaW5kZXhPZihsYXllcim7ID0gc2VsZi6rbGF5ZXK7KGlucHV0KQoJCQkJCatFTFNFSUYgaW5wdXRzPj0wICYmIGlucHV0czxzb3J0ZWRJbmZvcm1hdGlvbkZsb3dMaXN0Lmxlbmd0aC0yuwoJCQkJCQl4q3NvcnRlZEluZm9ybWF0aW9uRmxvd0xpc3QudG9MaXN0LmluZGV4T2YobGF5ZXIpuyA9IHNlbGYuq2xheWVyuyh4q2lucHV0c7spCgkJCQkJq0VMU0VJRiBpbnB1dHM9PXNvcnRlZEluZm9ybWF0aW9uRmxvd0xpc3QubGVuZ3RoLTK7CgkJCQkJCW91dHB1dCA9IHNlbGYuq2xheWVyuyh4q2lucHV0c7spCgkJCQkJq0VORElGuwoJCQkJq0VOREZPUrsKCQmrRU5ESUa7CQoJCQlyZXR1cm4gb3V0cHV0CQkKCScnJwoKCS8qKgoJICogR2VuZXJhdGUgZWFjaCBsYXllciBhY2NvcmRpbmcgdG8gdGhlIG1vZGVsCgkgKi8KCXN0YXRpYyBkZWYgZ2VuTGF5ZXIoTW9kZWwgbGF5ZXIpIHsKCQlpZiAobGF5ZXIgaW5zdGFuY2VvZiBDb252b2x1dGlvbl9sYXllcnMpIHsKCQkJZ2VuQ29udm9sdXRpb25MYXllcihsYXllciBhcyBDb252b2x1dGlvbl9sYXllcnMpCgkJfSBlbHNlIGlmIChsYXllciBpbnN0YW5jZW9mIFJlY3VycmVudF9sYXllcnMpIHsKCQkJZ2VuUmVjdXJyZW50TGF5ZXIobGF5ZXIgYXMgUmVjdXJyZW50X2xheWVycykKCQl9IGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgTGluZWFyX2xheWVycykgewoJCQlnZW5MaW5lYXJMYXllcihsYXllciBhcyBMaW5lYXJfbGF5ZXJzKQoJCX0KCX0KCS8qKgoJICogR2VuZXJhdGUgZWFjaCBjb252b2x1dGlvbiBsYXllciBhY2NvcmRpbmcgdG8gdGhlIG1vZGVsCgkgKi8KCXN0YXRpYyBkZWYgZ2VuQ29udm9sdXRpb25MYXllcihDb252b2x1dGlvbl9sYXllcnMgY29udm9sdXRpb25MYXllcikgJycnCgknJycKCS8qKgoJICogR2VuZXJhdGUgZWFjaCBsaW5lYXIgbGF5ZXIgYWNjb3JkaW5nIHRvIHRoZSBtb2RlbAoJICovCglzdGF0aWMgZGVmIGdlbkxpbmVhckxheWVyKExpbmVhcl9sYXllcnMgbGluZWFyTGF5ZXIpIHsKCQlpZiAobGluZWFyTGF5ZXIgaW5zdGFuY2VvZiBMaW5lYXIpIHsKCQkJZ2VuRGVuc2UobGluZWFyTGF5ZXIgYXMgTGluZWFyKQoJCX0KCX0KCS8qKgoJICogR2VuZXJhdGUgZWFjaCByZWN1cnJlbnQgbGF5ZXIgYWNjb3JkaW5nIHRvIHRoZSBtb2RlbAoJICovCglzdGF0aWMgZGVmIGdlblJlY3VycmVudExheWVyKFJlY3VycmVudF9sYXllcnMgcmVjdXJyZW50TGF5ZXIpIHsKCQlpZiAocmVjdXJyZW50TGF5ZXIgaW5zdGFuY2VvZiBMU1RNKSB7CgkJCWdlbkxzdG0ocmVjdXJyZW50TGF5ZXIgYXMgTFNUTSkKCQl9IGVsc2UgaWYgKHJlY3VycmVudExheWVyIGluc3RhbmNlb2YgR1JVKSB7CgkJCWdlbkdydShyZWN1cnJlbnRMYXllciBhcyBHUlUpCgkJfQoJfQoJLyoqCgkgKiBHZW5lcmF0ZSBlYWNoIGRlbnNlIGxheWVyIGFjY29yZGluZyB0byB0aGUgbW9kZWwKCSAqLwoJc3RhdGljIGRlZiBnZW5EZW5zZShMaW5lYXIgZGVuc2VMYXllcikgJycnCgkJc2VsZi6rZGVuc2VMYXllci5iYXNlX0NsYXNzLm5hbWW7PXRmLmtlcmFzLmxheWVycy5EZW5zZSirZGVuc2VMYXllci5pbl9mZWF0dXJlc7spCgknJycKCS8qKgoJICogR2VuZXJhdGUgZWFjaCBMU1RNIGxheWVyIGFjY29yZGluZyB0byB0aGUgbW9kZWwKCSAqLwoJc3RhdGljIGRlZiBnZW5Mc3RtKExTVE0gbHN0bUxheWVyKSAnJycKCQmrq6u7u6tJRiBsc3RtTGF5ZXIucmV0dXJuX3NlcXVlbmNlcy5lcXVhbHModHJ1ZSm7CgkJCaurq3NlbGYuq2xzdG1MYXllci5iYXNlX0NsYXNzLm5hbWW7PXRmLmtlcmFzLmxheWVycy6rbHN0bUxheWVyLmVDbGFzcy5uYW1luyirbHN0bUxheWVyLmhpZGRlbl9zaXpluyxpbnB1dF9zaGFwZT1bq2xzdG1MYXllci5pbnB1dF9zaXplu10scmV0dXJuX3NlcXVlbmNlcz1UcnVlKQoJCaurq6u7u6tFTFNFSUYgbHN0bUxheWVyLnJldHVybl9zZXF1ZW5jZXMuZXF1YWxzKGZhbHNlKbsKCQkJq6urq3NlbGYuq2xzdG1MYXllci5iYXNlX0NsYXNzLm5hbWW7PXRmLmtlcmFzLmxheWVycy6rbHN0bUxheWVyLmVDbGFzcy5uYW1luyirbHN0bUxheWVyLmhpZGRlbl9zaXpluyxpbnB1dF9zaGFwZT1bq2xzdG1MYXllci5pbnB1dF9zaXplu10scmV0dXJuX3NlcXVlbmNlcz1GYWxzZSkKCQmrq6uru7urRU5ESUa7CQoJCat2YXIgdHQgPSBSZWN1cnJlbnRMYXllck9wcy5sc3RtQXR0cmlidXRlc1RvRGlzcGxheShsc3RtTGF5ZXIpuwoJCat0dLsKCScnJwoJLyoqCgkgKiBHZW5lcmF0ZSBlYWNoIEdSVSBsYXllciBhY2NvcmRpbmcgdG8gdGhlIG1vZGVsCgkgKi8KCXN0YXRpYyBkZWYgZ2VuR3J1KEdSVSBncnVMYXllcikgJycnCgkJq6uru7urZ3J1TGF5ZXIuZUNsYXNzLm5hbWW7CgkJq6uru6tncnVMYXllci5pbnB1dF9zaXpluwoJCat2YXIgdHQgPSBSZWN1cnJlbnRMYXllck9wcy5sc3RtQXR0cmlidXRlc1RvRGlzcGxheShncnVMYXllcim7CgkJq3R0uwoJJycnCgkvKioKCSAqIEdlbmVyYXRlIGVhY2ggdGVuc29yIGFjY29yZGluZyB0byB0aGUgbW9kZWwKCSAqLwoJc3RhdGljIGRlZiBnZW5UZW5zb3IoVGVuc29yIHRlbnNvcikgJycnCgkJdGVuc29yIC4uLgoJJycnCgp9Cg==