LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQ29weXJpZ2h0IChjKTIwMjAgQ0VBIExJU1QsIENvbW1pdHRlciBOYW1lLCBhbmQgb3RoZXJzLgoqCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwoqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLwoqCiogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKgoqIENvbnRyaWJ1dG9yczoKKiBDRUEgTElTVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgoqIFBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIFBhdHJpY2sudGVzc2llckBjZWEuZnIgCiogR2FicmllbCBQZWRyb3phIChDRUEgTElTVCkgZ2FicmllbC5wZWRyb3phQGNlYS5mciAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxCgppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkZhaXJseSAKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5Qcm9jZXNzUHJpbmNpcGxlCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuVHJhbnNwYXJlbmN5CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHVycG9zZUxpbWl0YXRpb24KaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5BY2N1cmFjeQppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlN0b3JhZ2VMaW1pdGF0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuU2VjdXJpdHlTYWZldHkKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5EYXRhTWluaW1pc2F0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb25zZW50CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb250cmFjdAppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuVml0YWxJbnRlcmVzdAppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLlB1YmxpY0ludGVyZXN0CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuTGVnaXRpbWF0ZUludGVyZXN0CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlWaXRhbEludGVyZXN0CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlQdWJsaWNJbnRlcmVzdAppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsbEJ5U2FmZUd1YXJkCgpjbGFzcyBHRFBSUmVxdWlyZW1lbnRzIHsKCS8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsIHJlcXVpcmVtZW50cyBmcm9tIHJ0aWNsZTUuMQoJICovCgkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsUmVxdWlyZW1lbnQoTGF3ZnVsIGxhd2Z1bCl7CgkgCScnJ0lGIHByb2Nlc3MgOiKrbGF3ZnVsLnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHByb2Nlc3NlcyA6IqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWwpuyIgb2YgOiKrbGF3ZnVsLmRhdGFTdWJqZWN0LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBUSEVOIHRoZSBQcm9jZXNzIDoiq2xhd2Z1bC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWxsLicnJwoJIH0KCSAKCSAKCSAvKioKCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgZmFpcmx5IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU1LjEKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvckZhaXJseVJlcXVpcmVtZW50KEZhaXJseSBmYWlybHkpewoJIAkKCSAJJycnSUYgcHJvY2VzcyA6IqtmYWlybHkucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgcHJvY2Vzc2VzIDoiq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGZhaXJseSm7IiBvZiA6IqtmYWlybHkuZGF0YVN1YmplY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIFRIRU4gdGhlIFByb2Nlc3MgOiKrZmFpcmx5LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGZhaXJseS4nJycKCSB9CgkgLyoqCgkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIHRyYW5zcGFyZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU1LjEKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvclRyYW5zcGFyZW50UmVxdWlyZW1lbnQoVHJhbnNwYXJlbmN5IHRyYW5zcGFyZW5jeSl7CgkgCQoJIAknJydJRiBwcm9jZXNzIDoiq3RyYW5zcGFyZW5jeS5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBwcm9jZXNzZXMgOiKrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3ModHJhbnNwYXJlbmN5KbsiIG9mIDoiq3RyYW5zcGFyZW5jeS5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgVEhFTiB0aGUgUHJvY2VzcyA6Iqt0cmFuc3BhcmVuY3kucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgdHJhbnNwYXJlbnQuJycnCgkgfQoJIC8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciB0cmFuc3BhcmVudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xLmIKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvclB1cnBvc2VMaW1pdGF0aW9uKFB1cnBvc2VMaW1pdGF0aW9uIHB1cnBvc2VMaW1pdGF0aW9uKXsKCSAJCgkgCScnJ1RoZSBwdXJwb3NlIDoiq3B1cnBvc2VMaW1pdGF0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIG9mIHRoZSBQZXJzb25hbERhdGEgOiKrcHVycG9zZUxpbWl0YXRpb24ucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBzcGVjaWZpZWQsIGV4cGxpY2l0LCBsZWdpbWF0ZSwgYW5kIGNvbXBhdGlibGUuJycnCgkgfQoJIAoJIC8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciB0cmFuc3BhcmVudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xLmMKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvckRhdGFNaW5pbWlzYXRpb24oRGF0YU1pbmltaXNhdGlvbiBkYXRhTWluaW1pc2F0aW9uKXsKCSAJCgkgCScnJ1BlcnNvbmFsIERhdGEgOiKrZGF0YU1pbmltaXNhdGlvbi5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGFkZXF1YXRlLCByZWxldmFudCBhbmQgbGltaXRlZCB0byB3aGF0IGlzIG5lY2Vzc2FyeSBpbiByZWxhdGlvbiB0byB0aGUgcHVycG9zZSA6IqtkYXRhTWluaW1pc2F0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciB3aGljaCB0aGV5IGFyZSBwcm9jZXNzZWQnJycKCSB9CgkgLyoqCgkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIHRyYW5zcGFyZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU1LjEuZAoJICovCgkgZGVmIGdldERlc2NyaXB0aW9uRm9yQWNjdXJhdGUoQWNjdXJhY3kgYWNjdXJhY3kpewoJIAknJydQZXJzb25hbCBEYXRhIDoiq2FjY3VyYWN5LnBlcnNvbmFsRGF0YS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgYWNjdXJhdGUgYW5kLCB3aGVyZSBuZWNlc3NhcnksIGtlcHQgdXAgdG8gZGF0ZS4gSWYgcGVyc29uYWwgZGF0YSA6IqthY2N1cmFjeS5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGFyZSBpbmFjY3VyYXRlLCBoYXZpbmcgcmVnYXJkIHRvIHRoZSBwdXJwb3NlcyA6IqthY2N1cmFjeS5wdXJwb3NlLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBmb3Igd2hpY2ggdGhleSBhcmUgcHJvY2Vzc2VkLCBpdCBzaGFsbCAgZXJhc2VkIG9yIHJlY3RpZmllZCB3aXRob3V0IGRlbGF5LicnJwoJIH0KCSAvKioKCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgdHJhbnNwYXJlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTUuMS5lCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JTdG9yYWdlTGltaXRhdGlvbihTdG9yYWdlTGltaXRhdGlvbiBzdG9yYWdlTGltaXRhdGlvbil7CgkgCScnJ1BlcnNvbmFsIERhdGEgOiKrc3RvcmFnZUxpbWl0YXRpb24ucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBrZXB0IGluIGEgZm9ybSB3aGljaCBwZXJtaXRzIGlkZW50aWZpY2F0aW9uIG9mIGRhdGEgc3ViamVjdCA6IqtzdG9yYWdlTGltaXRhdGlvbi5wZXJzb25hbERhdGEucmVsYXRlZFRvLmdldCgwKS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgZm9yIG5vIGxvbmdlciB0aGFuIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHB1cnBvc2UgOiKrc3RvcmFnZUxpbWl0YXRpb24ucHVycG9zZS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgZm9yIHdoaWNoIHRoZSBwZXJzb25hbCBkYXRhIGFyZSBwcm9jZXNzZWQnJycKCSAJCgkgfQoJIAoJICAvKioKCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgdHJhbnNwYXJlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTUuMS5lCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JTZWN1cml0eVNhZmV0eShTZWN1cml0eVNhZmV0eSBzZWN1cml0eVNhZmV0eSl7CgkgCScnJ1BlcnNvbmFsIERhdGEgq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKHNlY3VyaXR5U2FmZXR5KbsiIHNoYWxsIGJlIHByb2Nlc3NlZCBpbiBhIG1hbm5lciB0aGF0IGVuc3VyZXMgYXBwcm9wcmlhdGUgc2VjdXJpdHkuICcnJwoJIH0KCSAgCgkgLyoqCgkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIGxhd2Z1bGxCeUNvbnNlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5hCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUNvbnNlbnQoTGF3ZnVsQnlDb25zZW50IGxhd2Z1bEJ5Q29uc2VudCl7CgkgCScnJ1Byb2Nlc3NpbmcgOiKrbGF3ZnVsQnlDb25zZW50LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGxhd2Z1bCBpZiB0aGUgZGF0YSBzdWJqZWN0IDoiq2xhd2Z1bEJ5Q29uc2VudC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgaGFzIGdpdmVuIGNvbnNlbnQgOiKrbGF3ZnVsQnlDb25zZW50LmNvbnNlbnQuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHRvIHRoZSBwcm9jZXNzaW5nIG9mIGhpcyBvciBoZXIgcGVyc29uYWwgZGF0YSA6IqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxCeUNvbnNlbnQpuyIgZm9yIG9uZSBvciBtb3JlIHNwZWNpZmljIHB1cnBvc2VzIDoiq2xhd2Z1bEJ5Q29uc2VudC5wcm9jZXNzLmNvbnRyaWJ1dGVkVG8uYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiJycnCgl9CgkKCSAvKioKCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29udHJhY3QgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5iCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUNvbnRyYWN0KExhd2Z1bEJ5Q29udHJhY3QgbGF3ZnVsQnlDb250cmFjdCl7CgkgCScnJ1Byb2Nlc3NpbmcgOiKrbGF3ZnVsQnlDb250cmFjdC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyA6IqtsYXdmdWxCeUNvbnRyYWN0LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjb250cmFjdDoiq2xhd2Z1bEJ5Q29udHJhY3QuY29udHJhY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHRvIHdoaWNoIHRoZSBkYXRhIHN1YmplY3Q6IqtsYXdmdWxCeUNvbnRyYWN0LmRhdGFTdWJqZWN0LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBpcyBwYXJ0eSBvciBpbiBvcmRlciB0byB0YWtlIHN0ZXBzIGF0IHRoZSByZXF1ZXN0IG9mIHRoZSBkYXRhIHN1YmplY3QgcHJpb3IgdG8gZW50ZXJpbmcgaW50byBhIGNvbnRyYWN0JycnCgl9CgkJLyoqCgkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIGxhd2Z1bGxCeUNvbnNlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5jCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbihMYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbiBsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbil7CgkgCScnJ1Byb2Nlc3NpbmcgOiKrbGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24ucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsIGlmIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5IGZvciBjb21wbGlhbmNlIHdpdGggYSBsZWdhbCBvYmxpZ2F0aW9uIDoiq2xhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uLmxlZ2FsT2JsaWdhdGlvbi5iYXNlX05hbWVkRWxlbWVudC5uYW1luyJ0byB3aGljaCB0aGUgY29udHJvbGxlcjogIqtnZXREYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MobGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24puyIgaXMgc3ViamVjdCcnJwoJfQoJCgkvKioKCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29uc2VudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNi4xLmQKCSAqLwoJIGRlZiBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Vml0YWxJbnRlcmVzdChMYXdmdWxCeVZpdGFsSW50ZXJlc3QgbGF3ZnVsQnlWaXRhbEludGVyZXN0KXsKCSAJJycnUHJvY2Vzc2luZyA6IqtsYXdmdWxCeVZpdGFsSW50ZXJlc3QucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsIGlmIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHByb3RlY3QgdGhlIHZpdGFsIGludGVyZXN0cyBvZiB0aGUgZGF0YSBzdWJqZWN0IDoiq2xhd2Z1bEJ5Vml0YWxJbnRlcmVzdC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgb3Igb2YgYW5vdGhlciBuYXR1cmFsIHBlcnNvbicnJwoJfQoJLyoqCgkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIGxhd2Z1bGxCeUNvbnNlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5lCgkgKi8KCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeVB1YmxpY0ludGVyZXN0KExhd2Z1bEJ5UHVibGljSW50ZXJlc3QgbGF3ZnVsQnlQdWJsaWNJbnRlcmVzdCl7CgkgCScnJ1Byb2Nlc3NpbmcgOiKrbGF3ZnVsQnlQdWJsaWNJbnRlcmVzdC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBwZXJmb3JtYW5jZSBvZiBhIHRhc2sgY2FycmllZCBvdXQgaW4gdGhlIHB1YmxpYyBpbnRlcmVzdCBvciBpbiB0aGUgZXhlcmNpc2Ugb2Ygb2ZmaWNpYWwgYXV0aG9yaXR5IHZlc3RlZCBpbiB0aGUgY29udHJvbGxlciA6ICKrZ2V0RGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKGxhd2Z1bEJ5UHVibGljSW50ZXJlc3QpuyInJycKCX0KCS8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsQnlDb25zZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU2LjEuZgoJICovCgkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlMZWdpdGltYXRlSW50ZXJlc3QoTGF3ZnVsQnlMZWdpdGltYXRlSW50ZXJlc3QgbGF3ZnVsQnlMZWdpdGltYXRlSW50ZXJlc3QpewoJIAknJydQcm9jZXNzaW5nIDoiq2xhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGxhd2Z1bCBpZiBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBsZWdpdGltYXRlIGludGVyZXN0cyA6IqtsYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdC5sZWdpdGltYXRlSW50ZXJlc3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHB1cnN1ZWQgYnkgdGhlIGNvbnRyb2xsZXIgOiKrZ2V0RGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKGxhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0Kbsib3IgYnkgYSB0aGlyZCBwYXJ0eSwgZXhjZXB0IHdoZXJlIHN1Y2ggaW50ZXJlc3RzIGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBpbnRlcmVzdHMgb3IgZnVuZGFtZW50YWwgcmlnaHRzIGFuZCBmcmVlZG9tcyBvZiB0aGUgZGF0YSBzdWJqZWN0IHdoaWNoIHJlcXVpcmUgcHJvdGVjdGlvbiBvZiBwZXJzb25hbCBkYXRhLCBpbiBwYXJ0aWN1bGFyIHdoZXJlIHRoZSBkYXRhIHN1YmplY3QgaXMgYSBjaGlsZC4KJycnCgl9CgkKCS8qKgoJICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsQnlDb25zZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU2LjEuZgoJICovCgkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlTYWZlR3VhcmQoTGF3ZnVsbEJ5U2FmZUd1YXJkIGxhd2Z1bGxCeVNhZmVHdWFyZCl7CicnJ1doZXJlIHRoZSBwcm9jZXNzaW5nIDoiq2xhd2Z1bGxCeVNhZmVHdWFyZC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBmb3IgYSBwdXJwb3NlIDoiq2xhd2Z1bGxCeVNhZmVHdWFyZC5wcm9jZXNzLmNvbnRyaWJ1dGVkVG8uYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIG90aGVyIHRoYW4gdGhhdCBmb3Igd2hpY2ggdGhlIHBlcnNvbmFsIGRhdGEgOiKrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MobGF3ZnVsbEJ5U2FmZUd1YXJkKbsiIGhhdmUgYmVlbiBjb2xsZWN0ZWQgaXMgbm90IGJhc2VkIG9uIHRoZSBkYXRhIHN1YmplY3SScyBjb25zZW50IG9yCm9uIGEgVW5pb24gb3IgTWVtYmVyIFN0YXRlIGxhdyB3aGljaCBjb25zdGl0dXRlcyBhIG5lY2Vzc2FyeSBhbmQgcHJvcG9ydGlvbmF0ZSBtZWFzdXJlIGluIGEgZGVtb2NyYXRpYyBzb2NpZXR5IHRvIHNhZmVndWFyZCB0aGUgb2JqZWN0aXZlcyByZWZlcnJlZCB0byBpbiBBcnRpY2xlIDIzKDEpLCB0aGUgY29udHJvbGxlciA6IqtnZXREYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MobGF3ZnVsbEJ5U2FmZUd1YXJkKbsiIHNoYWxsLAppbiBvcmRlciB0byBhc2NlcnRhaW4gd2hldGhlciBwcm9jZXNzaW5nIGZvciBhbm90aGVyIHB1cnBvc2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwdXJwb3NlIGZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSBhcmUgaW5pdGlhbGx5IGNvbGxlY3RlZCwgdGFrZSBpbnRvIGFjY291bnQsIGludGVyIGFsaWE6CmFueSBsaW5rIGJldHdlZW4gdGhlIHB1cnBvc2VzIKtsYXdmdWxsQnlTYWZlR3VhcmQucHJvY2Vzcy5jb250cmlidXRlZFRvLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7ImZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSA6IqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxsQnlTYWZlR3VhcmQpuyJoYXZlIGJlZW4gY29sbGVjdGVkIGFuZCB0aGUgcHVycG9zZXMgb2YgdGhlIGludGVuZGVkIGZ1cnRoZXIgcHJvY2Vzc2luZzsKCSAJLSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcGVyc29uYWwgZGF0YTogIqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxsQnlTYWZlR3VhcmQpuyIgIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIGluIHBhcnRpY3VsYXIgcmVnYXJkaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkYXRhIHN1YmplY3RzIDoiq2xhd2Z1bGxCeVNhZmVHdWFyZC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgYW5kIHRoZSBjb250cm9sbGVyOqtnZXREYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MobGF3ZnVsbEJ5U2FmZUd1YXJkKbsKCSAJLSB0aGUgbmF0dXJlIG9mIHRoZSBwZXJzb25hbCBkYXRhOiAiq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bGxCeVNhZmVHdWFyZCm7IiIgLCBpbiBwYXJ0aWN1bGFyIHdoZXRoZXIgc3BlY2lhbCBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGRhdGEgYXJlIHByb2Nlc3NlZCwgcHVyc3VhbnQgdG8gQXJ0aWNsZSA5LCBvciB3aGV0aGVyIHBlcnNvbmFsIGRhdGEgcmVsYXRlZCB0byBjcmltaW5hbCBjb252aWN0aW9ucyBhbmQgb2ZmZW5jZXMgYXJlIHByb2Nlc3NlZCwgcHVyc3VhbnQgdG8gQXJ0aWNsZSAxMDsKCSAJLSB0aGUgcG9zc2libGUgY29uc2VxdWVuY2VzIG9mIHRoZSBpbnRlbmRlZCBmdXJ0aGVyIHByb2Nlc3NpbmcgZm9yIGRhdGEgc3ViamVjdHM6IqtsYXdmdWxsQnlTYWZlR3VhcmQuZGF0YVN1YmplY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsKCSAJLSB0aGUgZXhpc3RlbmNlIG9mIGFwcHJvcHJpYXRlIHNhZmVndWFyZHMsIHdoaWNoIG1heSBpbmNsdWRlIGVuY3J5cHRpb24gb3IgcHNldWRvbnltaXNhdGlvbi4nJycKCX0KCQkgCgkgZGVmIGdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKFByb2Nlc3NQcmluY2lwbGUgUHJvY2Vzc1ByaW5jaXBsZSl7CgkJdmFyIHJlc3VsdCA9ICIiCgkgCQoJIAlmb3IgKGVsZW1lbnQgOiBQcm9jZXNzUHJpbmNpcGxlLnBlcnNvbmFsRGF0YSkgewoJIAkJcmVzdWx0PXJlc3VsdCsgZWxlbWVudC5iYXNlX05hbWVkRWxlbWVudC5uYW1lKyIgIjsKCSAJfQoJIAlyZXR1cm4gcmVzdWx0CgkgfQoJIAoJICBkZWYgZ2V0RGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKFByb2Nlc3NQcmluY2lwbGUgUHJvY2Vzc1ByaW5jaXBsZSl7CgkJdmFyIHJlc3VsdCA9ICIiCgkgCQoJIAlmb3IgKGRhdGEgOiBQcm9jZXNzUHJpbmNpcGxlLnBlcnNvbmFsRGF0YSkgewoJIAkJaWYocmVzdWx0LmluZGV4T2YoIiIrZGF0YS5yZXNwb25zaWJsZS5iYXNlX05hbWVkRWxlbWVudC5uYW1lKT09LTEpewoJIAkJCXJlc3VsdD1yZXN1bHQrIGRhdGEucmVzcG9uc2libGUuYmFzZV9OYW1lZEVsZW1lbnQubmFtZSsiICI7CgkgCQl9CgkgCQkKCSAJfQoJIAlyZXR1cm4gcmVzdWx0CgkgfQoJIAoJIAp9