LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQ29weXJpZ2h0IChjKTIwMjAgQ0VBIExJU1QsIENvbW1pdHRlciBOYW1lLCBhbmQgb3RoZXJzLgoqCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwoqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLwoqCiogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKgoqIENvbnRyaWJ1dG9yczoKKiBDRUEgTElTVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgoqIFBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIFBhdHJpY2sudGVzc2llckBjZWEuZnIgCiogR2FicmllbCBQZWRyb3phIChDRUEgTElTVCkgZ2FicmllbC5wZWRyb3phQGNlYS5mciAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxCgppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkZhaXJseSAKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5Qcm9jZXNzUHJpbmNpcGxlCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuVHJhbnNwYXJlbmN5CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHVycG9zZUxpbWl0YXRpb24KaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5BY2N1cmFjeQppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlN0b3JhZ2VMaW1pdGF0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuU2VjdXJpdHlTYWZldHkKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5EYXRhTWluaW1pc2F0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb25zZW50CgpjbGFzcyBHRFBSUmVxdWlyZW1lbnRzIHsKCS8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsIHJlcXVpcmVtZW50cyBmcm9tIHJ0aWNsZTUuMQoJICovCgkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsUmVxdWlyZW1lbnQoTGF3ZnVsIGxhd2Z1bCl7CgkgCScnJ0lGIHByb2Nlc3MgIqtsYXdmdWwucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgcHJvY2Vzc2VzICKrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MobGF3ZnVsKbsiIG9mICKrbGF3ZnVsLmRhdGFTdWJqZWN0LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBUSEVOIHRoZSBQcm9jZXNzICKrbGF3ZnVsLnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGxhd2Z1bGwuJycnCgkgfQoJIAoJIAoJIGRlZiBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChMYXdmdWxCeUNvbnNlbnQgbGF3ZnVsQnlDb25zZW50KXsKCSAJJycnUHJvY2Vzc2luZyAiq2xhd2Z1bEJ5Q29uc2VudC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWwgaWYgdGhlIGRhdGEgc3ViamVjdCAiq2xhd2Z1bEJ5Q29uc2VudC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgaGFzIGdpdmVuIGNvbnNlbnQgIqtsYXdmdWxCeUNvbnNlbnQuY29uc2VudC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgdG8gdGhlIHByb2Nlc3Npbmcgb2YgaGlzIG9yIGhlciBwZXJzb25hbCBkYXRhICKrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MobGF3ZnVsQnlDb25zZW50KbsiIGZvciBvbmUgb3IgbW9yZSBzcGVjaWZpYyBwdXJwb3NlcyCrbGF3ZnVsQnlDb25zZW50LnByb2Nlc3MuY29udHJpYnV0ZWRUby5iYXNlX05hbWVkRWxlbWVudC5uYW1luycnJwoJfQoJIAoJIAoJIC8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciBmYWlybHkgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTUuMQoJICovCgkgZGVmIGdldERlc2NyaXB0aW9uRm9yRmFpcmx5UmVxdWlyZW1lbnQoRmFpcmx5IGZhaXJseSl7CgkgCQoJIAknJydJRiBwcm9jZXNzICKrZmFpcmx5LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHByb2Nlc3NlcyAiq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGZhaXJseSm7IiBvZiAiq2ZhaXJseS5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgVEhFTiB0aGUgUHJvY2VzcyAiq2ZhaXJseS5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBmYWlybHkuJycnCgkgfQoJIC8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciB0cmFuc3BhcmVudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JUcmFuc3BhcmVudFJlcXVpcmVtZW50KFRyYW5zcGFyZW5jeSB0cmFuc3BhcmVuY3kpewoJIAkKCSAJJycnSUYgcHJvY2VzcyAiq3RyYW5zcGFyZW5jeS5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBwcm9jZXNzZXMgIqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2Vzcyh0cmFuc3BhcmVuY3kpuyIgb2YgIqt0cmFuc3BhcmVuY3kuZGF0YVN1YmplY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIFRIRU4gdGhlIFByb2Nlc3MgIqt0cmFuc3BhcmVuY3kucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgdHJhbnNwYXJlbnQuJycnCgkgfQoJIC8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciB0cmFuc3BhcmVudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xLmIKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvclB1cnBvc2VMaW1pdGF0aW9uKFB1cnBvc2VMaW1pdGF0aW9uIHB1cnBvc2VMaW1pdGF0aW9uKXsKCSAJCgkgCScnJ1RoZSBwdXJwb3NlICKrcHVycG9zZUxpbWl0YXRpb24ucHVycG9zZS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgb2YgdGhlIFBlcnNvbmFsRGF0YSAiq3B1cnBvc2VMaW1pdGF0aW9uLnBlcnNvbmFsRGF0YS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgc3BlY2lmaWVkLCBleHBsaWNpdCwgbGVnaW1hdGUsIGFuZCBjb21wYXRpYmxlLicnJwoJIH0KCSAKCSAvKioKCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgdHJhbnNwYXJlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTUuMS5jCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JEYXRhTWluaW1pc2F0aW9uKERhdGFNaW5pbWlzYXRpb24gZGF0YU1pbmltaXNhdGlvbil7CgkgCQoJIAknJydQZXJzb25hbCBEYXRhICKrZGF0YU1pbmltaXNhdGlvbi5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGFkZXF1YXRlLCByZWxldmFudCBhbmQgbGltaXRlZCB0byB3aGF0IGlzIG5lY2Vzc2FyeSBpbiByZWxhdGlvbiB0byB0aGUgcHVycG9zZSAiq2RhdGFNaW5pbWlzYXRpb24ucHVycG9zZS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgZm9yIHdoaWNoIHRoZXkgYXJlIHByb2Nlc3NlZCcnJwoJIH0KCSAvKioKCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgdHJhbnNwYXJlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTUuMS5kCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JBY2N1cmF0ZShBY2N1cmFjeSBhY2N1cmFjeSl7CgkgCScnJ1BlcnNvbmFsIERhdGEgIqthY2N1cmFjeS5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGFjY3VyYXRlIGFuZCwgd2hlcmUgbmVjZXNzYXJ5LCBrZXB0IHVwIHRvIGRhdGUuIElmIHBlcnNvbmFsIGRhdGEgIqthY2N1cmFjeS5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGFyZSBpbmFjY3VyYXRlLCBoYXZpbmcgcmVnYXJkIHRvIHRoZSBwdXJwb3NlcyAiq2FjY3VyYWN5LnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciB3aGljaCB0aGV5IGFyZSBwcm9jZXNzZWQsIGl0IHNoYWxsICBlcmFzZWQgb3IgcmVjdGlmaWVkIHdpdGhvdXQgZGVsYXkuJycnCgkgfQoJIC8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciB0cmFuc3BhcmVudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xLmUKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvclN0b3JhZ2VMaW1pdGF0aW9uKFN0b3JhZ2VMaW1pdGF0aW9uIHN0b3JhZ2VMaW1pdGF0aW9uKXsKCSAJJycnUGVyc29uYWwgRGF0YSAiq3N0b3JhZ2VMaW1pdGF0aW9uLnBlcnNvbmFsRGF0YS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUga2VwdCBpbiBhIGZvcm0gd2hpY2ggcGVybWl0cyBpZGVudGlmaWNhdGlvbiBvZiBkYXRhIHN1YmplY3QgIqtzdG9yYWdlTGltaXRhdGlvbi5wZXJzb25hbERhdGEucmVsYXRlZFRvLmdldCgwKS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgZm9yIG5vIGxvbmdlciB0aGFuIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHB1cnBvc2UgIqtzdG9yYWdlTGltaXRhdGlvbi5wdXJwb3NlLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBmb3Igd2hpY2ggdGhlIHBlcnNvbmFsIGRhdGEgYXJlIHByb2Nlc3NlZCcnJwoJIAkKCSB9CgkgCgkgIC8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciB0cmFuc3BhcmVudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xLmUKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvclNlY3VyaXR5U2FmZXR5KFNlY3VyaXR5U2FmZXR5IHNlY3VyaXR5U2FmZXR5KXsKCSAJJycnUGVyc29uYWwgRGF0YSCrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3Moc2VjdXJpdHlTYWZldHkpuyAgc2hhbGwgYmUgcHJvY2Vzc2VkIGluIGEgbWFubmVyIHRoYXQgZW5zdXJlcyBhcHByb3ByaWF0ZSBzZWN1cml0eS4gJycnCgkgfQoJIAoJIGRlZiBnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhQcm9jZXNzUHJpbmNpcGxlIFByb2Nlc3NQcmluY2lwbGUpewoJCXZhciByZXN1bHQgPSAiIgoJIAkKCSAJZm9yIChlbGVtZW50IDogUHJvY2Vzc1ByaW5jaXBsZS5wZXJzb25hbERhdGEpIHsKCSAJCXJlc3VsdD1yZXN1bHQrIGVsZW1lbnQuYmFzZV9OYW1lZEVsZW1lbnQubmFtZSsiICI7CgkgCX0KCSAJcmV0dXJuIHJlc3VsdAoJIH0KCSAKCSAKfQ==