LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUNCiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wDQogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4NCiAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdA0KICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLg0KICoNCiAqIFNlbGVjdEJ1bmRsZQ0KICogICBwcm9wZXJ0eSB0byBzZXQNCiAqICAgYmFzZW5hbWUgICAgIChibmQsIG9yZy5lY2xpcHNlLmVxdWlub3gpIHJlcXVpcmVkDQogKiAgIHNlcGFyYXRvciAgICAoLSxfKSBkZWZhdWx0IHRvIF8NCiAqICAgY3JpdGVyaW9uICAgIE9TR2kgc2VsZWN0aW9uIGNyaXRlcmlhIFsxLjAsMi4wKSByZXF1aXJlZA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgICBlZ3dpbiAtIGluaXRpYWwgY29uY2VwdGlvbiBhbmQgaW1wbGVtZW50YXRpb24NCiAqLw0KDQpwYWNrYWdlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmJ1aWxkdG9vbHMuYW50LnRhc2tkZWZzOw0KDQppbXBvcnQgamF2YS5pby5GaWxlOw0KaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7DQppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsNCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOw0KaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmJ1aWxkdG9vbHMuaGVscGVyLlZlcnNpb247DQoNCnB1YmxpYyBjbGFzcyBTZWxlY3RCdW5kbGUgZXh0ZW5kcyBUYXNrIHsNCiAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXBhdGggPSBmYWxzZTsgLy8gd2hldGhlciB0byBpbmNsdWRlIHRoZSBwYXRoIChkaXJlY3RvcnkgcHJvcGVydHkpIGluIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eSBpZiBzZWxlY3Rpb24gaXMgc3VjY2Vzc2Z1bCAoZGVmYXVsdDogbm8pDQogICAgcHJpdmF0ZSBib29sZWFuIHZlcnNpb25vbmx5ID0gZmFsc2U7IC8vIHdoZXRoZXIgdG8gcmV0dXJuIGJ1bmRsZSB2ZXJzaW9uIGluZm8gb25seSwgb3IgZnVsbCBidW5kbGUgbmFtZSAoZGVmYXVsdDogZnVsbCBidW5kbGUgbmFtZSkNCiAgICBwcml2YXRlIFN0cmluZyBjcml0ZXJpb24gPSAiIjsgICAgICAgLy8gdGhlIE9TR2ktbGlrZSBjcml0ZXJpYSB1c2VkIHRvICdzZWxlY3QnIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGphci4gZm9yIGV4YW1wbGU6KDEuMCwyLjBdDQogICAgcHJpdmF0ZSBTdHJpbmcgYmFzZW5hbWUgID0gIiI7ICAgICAgIC8vIGJhc2VuYW1lIG9mIGphciAob3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLCBqYXZheC54bWwuYmluZCwgamF2YXgucGVyc2lzdGVuY2UpDQogICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5ID0gIiI7ICAgICAgIC8vIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIHRoZSBqYXINCiAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eSAgPSAiIjsgICAgICAgLy8gcHJvcGVydHkgdG8gc2V0IHdpdGggZmlsZW5hbWUgb2YgJ3NlbGVjdGVkJyBqYXINCiAgICBwcml2YXRlIFN0cmluZyBzZXBhcmF0b3IgPSAiXyI7ICAgICAgLy8gdGhlIHNlcGFyYXRvciB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmFzZW5hbWUgYW5kIGphcnZlcnNpb24NCiAgICBwcml2YXRlIFN0cmluZyBzdWZmaXggICAgPSAiamFyIjsgICAgLy8gc3VmZml4IG9mIGZpbGUgdG8gZmluZCAoZGVmYXVsdDogamFyKQ0KDQogICAgcHJpdmF0ZSBib29sZWFuIG1pbkluY2x1c2l2ZSA9IGZhbHNlOyAgIC8vIGxvY2FsOiB3aGV0aGVyIHRoZSAnZmxvb3InIHZlcnNpb24gaXMgaW5jbHVzaXZlIG9yIG5vdCAiKCI9dHJ1ZSAiWyI9ZmFsc2UNCiAgICBwcml2YXRlIGJvb2xlYW4gbWF4SW5jbHVzaXZlID0gZmFsc2U7ICAgLy8gbG9jYWw6IHdoZXRoZXIgdGhlICdjZWlsaW5nJyB2ZXJzaW9uIGlzIGluY2x1c2l2ZSBvciBub3QgIigiPXRydWUgIlsiPWZhbHNlDQogICAgcHJpdmF0ZSBWZXJzaW9uIG1pblZlcnNpb24gICA9IG51bGw7ICAgIC8vIGxvY2FsOiB0aGUgdmFsdWUgb2YgdGhlICJmbG9vciIgdmVyc2lvbg0KICAgIHByaXZhdGUgVmVyc2lvbiBtYXhWZXJzaW9uICAgPSBudWxsOyAgICAvLyBsb2NhbDogdGhlIHZhbHVlIG9mIHRoZSAiY2VpbGluZyIgdmVyc2lvbg0KICAgIHByaXZhdGUgU3RyaW5nICB2ZXJzaW9uICAgICAgPSAiIjsgICAgICAvLyB0aGUgJ3ZlcnNpb24nIGNvbXBvbmVudCBvZiB0aGUgImJlc3RtYXRjaCIgc3RyaW5nDQoNCiAgICBwcml2YXRlIHZvaWQgZXZhbHVhdGVDcml0ZXJpYSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7DQogICAgICAgIC8vICgpPSBpbmNsdWRlcw0KICAgICAgICAvLyBbXT0gdXAgdG8sIG5vdCBpbmNsdWRpbmcNCiAgICAgICAgLy8gc2hvdWxkIGJlIGF0IG1vc3QgMSAnLCcNCiAgICAgICAgLy8gY2FuIGhhdmUgMSB2ZXJzaW9uLCBvciB0d28gY29udGFpbmluZyB1cCB0byBmb3VyIHZlcnNpb24gcGFydHMgKG1ham9yLm1pbm9yLmJ1Z2ZpeC5xdWFsaWZpZXIpDQogICAgICAgIGlmICggISggY3JpdGVyaW9uID09IG51bGwgfHwgY3JpdGVyaW9uLmxlbmd0aCgpID09IDApKSB7DQogICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBjcml0ZXJpb24ubGVuZ3RoKCkgLSAxOw0KICAgICAgICAgICAgYm9vbGVhbiBtaW5TcXVhcmVCcmFja2V0ID0gY3JpdGVyaW9uLnN0YXJ0c1dpdGgoIlsiKTsNCiAgICAgICAgICAgIGJvb2xlYW4gbWF4U3F1YXJlQnJhY2tldCA9IGNyaXRlcmlvbi5lbmRzV2l0aCgiXSIpOw0KICAgICAgICAgICAgYm9vbGVhbiBtaW5Sb3VuZEJyYWNrZXQgPSBjcml0ZXJpb24uc3RhcnRzV2l0aCgiKCIpOw0KICAgICAgICAgICAgYm9vbGVhbiBtYXhSb3VuZEJyYWNrZXQgPSBjcml0ZXJpb24uZW5kc1dpdGgoIikiKTsNCiAgICAgICAgICAgIGJvb2xlYW4gaW5pdEludCA9IGNyaXRlcmlvbi5zdWJzdHJpbmcoMCwxKS5jb250YWlucygiMDEyMzQ1Njc4OSIpOw0KICAgICAgICAgICAgYm9vbGVhbiBlbmRJbnQgPSBjcml0ZXJpb24uc3Vic3RyaW5nKGVuZEluZGV4LTEsZW5kSW5kZXgpLmNvbnRhaW5zKCIwMTIzNDU2Nzg5Iik7DQogICAgICAgICAgICBib29sZWFuIGNvbW1hcHJlc2VudCA9IGNyaXRlcmlvbi5jb250YWlucygiLCIpOw0KICAgICAgICAgICAgLy8gdmFsaWRhdGUgYmVnaW5uaW5nIG9mIHN0cmluZw0KICAgICAgICAgICAgaWYgKCAhKCBtaW5TcXVhcmVCcmFja2V0IHx8IG1pblJvdW5kQnJhY2tldCB8fCBpbml0SW50ICkgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGNyaXRlcmlvbiBhdHRyaWJ1dGUgbXVzdCBiZWdpbiB3aXRoICgsWywgb3IgYSBudW1iZXIuIiwgZ2V0TG9jYXRpb24oKSk7DQogICAgICAgICAgICAvLyB2YWxpZGF0ZSBlbmQgb2Ygc3RyaW5nDQogICAgICAgICAgICBpZiAoICEoIG1heFNxdWFyZUJyYWNrZXQgfHwgbWF4Um91bmRCcmFja2V0IHx8IGVuZEludCApICkNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBjcml0ZXJpb24gYXR0cmlidXRlIG11c3QgZW5kIHdpdGggKSxdLCBvciBhIG51bWJlci4iLCBnZXRMb2NhdGlvbigpKTsNCiAgICAgICAgICAgIC8vIHZhbGlkYXRlIGJhc2ljIHN5bnRheA0KICAgICAgICAgICAgaWYoKGluaXRJbnQgJiYgIWVuZEludCkgfHwgKCFpbml0SW50ICYmIGVuZEludCkgfHwgKCFpbml0SW50ICYmICFjb21tYXByZXNlbnQpIHx8IChpbml0SW50ICYmIGNvbW1hcHJlc2VudCkgKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGNyaXRlcmlvbiBhdHRyaWJ1dGUgbXVzdCBiZSBhIHZhbGlkIE9TR2kgdmVyc2lvbiByYW5nZSBzdHJpbmciLCBnZXRMb2NhdGlvbigpKTsNCiAgICAgICAgICAgIC8vIGRldGVybWluZSAiZmxvb3IiIHZlcnNpb24NCiAgICAgICAgICAgIG1pbkluY2x1c2l2ZSA9IChtaW5TcXVhcmVCcmFja2V0IHx8IGluaXRJbnQpOw0KICAgICAgICAgICAgbWF4SW5jbHVzaXZlID0gKG1heFNxdWFyZUJyYWNrZXQgfHwgZW5kSW50KTsNCiAgICAgICAgICAgIC8vc2luZ2xldG9uIHZlcnNpb24NCiAgICAgICAgICAgIGlmKGluaXRJbnQpIHsNCiAgICAgICAgICAgICAgICBsb2coImV2YWx1YXRlQ3JpdGVyaWE6IFNpbmdsZXRvbiBkZXRlY3RlZCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KICAgICAgICAgICAgICAgIG1pblZlcnNpb24gPSBuZXcgVmVyc2lvbihjcml0ZXJpb24pOw0KICAgICAgICAgICAgICAgIC8vIGFuIGFwcHJveGltYXRpb24gb2YgaW5maW5pdHkgKGhpZ2ggdmFsdWUgZm9yIG1ham9yLm1vbm9yLm1pY3JvIGFuZCBxdWFsaWZpZXIpDQogICAgICAgICAgICAgICAgbWF4VmVyc2lvbiA9IG5ldyBWZXJzaW9uKCI5OTk5OS45OTk5OS45OTk5OS7///////8iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIHZlcnNpb24gcmFuZ2UNCiAgICAgICAgICAgIGlmKCFpbml0SW50KSB7DQogICAgICAgICAgICAgICAgbG9nKCJldmFsdWF0ZUNyaXRlcmlhOiBSYW5nZShtaW46IiArIGNyaXRlcmlvbi5zdWJzdHJpbmcoMSxjcml0ZXJpb24uaW5kZXhPZignLCcpKSArICIpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgICAgICAgICAgICAgbWluVmVyc2lvbiA9IG5ldyBWZXJzaW9uKCBjcml0ZXJpb24uc3Vic3RyaW5nKDEsY3JpdGVyaW9uLmluZGV4T2YoJywnKSkgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKCFlbmRJbnQpIHsNCiAgICAgICAgICAgICAgICBsb2coImV2YWx1YXRlQ3JpdGVyaWE6IFJhbmdlKG1heDoiICsgY3JpdGVyaW9uLnN1YnN0cmluZyhjcml0ZXJpb24uaW5kZXhPZignLCcpKzEsZW5kSW5kZXgpICsgIikiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCiAgICAgICAgICAgICAgICBtYXhWZXJzaW9uID0gbmV3IFZlcnNpb24oIGNyaXRlcmlvbi5zdWJzdHJpbmcoY3JpdGVyaW9uLmluZGV4T2YoJywnKSsxLGVuZEluZGV4KSApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgLy8gY3JpdGVyaWEgbm90IHNwZWNpZmllZC4gRGVmYXVsdCBpcyAiYW55IHZlcnNpb24iIG9yICJbMC4wLGluZmluaXR5XSINCiAgICAgICAgICAgIG1pbkluY2x1c2l2ZSA9IHRydWU7DQogICAgICAgICAgICBtaW5WZXJzaW9uID0gbmV3IFZlcnNpb24oKTsNCiAgICAgICAgICAgIC8vIGFuIGFwcHJveGltYXRpb24gb2YgaW5maW5pdHkgKGhpZ2ggdmFsdWUgZm9yIG1ham9yLm1vbm9yLm1pY3JvIGFuZCBxdWFsaWZpZXIpDQogICAgICAgICAgICBtYXhWZXJzaW9uID0gbmV3IFZlcnNpb24oIjk5OTk5Ljk5OTk5Ljk5OTk5Lv///////yIpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBEZWJ1ZyBMb2dnaW5nDQogICAgICAgIGlmKG1pbkluY2x1c2l2ZSkNCiAgICAgICAgICAgIGxvZygiZXZhbHVhdGVDcml0ZXJpYTogbWluSW5jbHVzaXZlKHRydWUpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGxvZygiZXZhbHVhdGVDcml0ZXJpYTogbWluSW5jbHVzaXZlKGZhbHNlKSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KICAgICAgICBpZihtYXhJbmNsdXNpdmUpDQogICAgICAgICAgICBsb2coImV2YWx1YXRlQ3JpdGVyaWE6IG1heEluY2x1c2l2ZSh0cnVlKSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICBsb2coImV2YWx1YXRlQ3JpdGVyaWE6IG1heEluY2x1c2l2ZShmYWxzZSkiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCiAgICAgICAgbG9nKCJldmFsdWF0ZUNyaXRlcmlhOiBtaW5WZXJzaW9uKCIgKyBtaW5WZXJzaW9uLmdldElkZW50aWZpZXIoKSArICIpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgICAgIGxvZygiZXZhbHVhdGVDcml0ZXJpYTogbWF4VmVyc2lvbigiICsgbWF4VmVyc2lvbi5nZXRJZGVudGlmaWVyKCkgKyAiKSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KDQogICAgfQ0KDQogICAgcHJpdmF0ZSBTdHJpbmcgbWF0Y2hDcml0ZXJpYSgpIHsNCiAgICAgICAgU3RyaW5nIGJlc3RNYXRjaCA9IG51bGw7ICAgICAgIC8vZmlsZW5hbWUgb2YgZmlsZSBzZWxlY3RlZA0KICAgICAgICBTdHJpbmdbXSBmaWxlbGlzdCA9IGdldExpc3RPZkZpbGVzKGRpcmVjdG9yeSk7DQoNCiAgICAgICAgbG9nKCJtYXRjaENyaXRlcmlhOiBiYXNlbmFtZS5sZW5ndGg9JyIgKyBJbnRlZ2VyLnRvU3RyaW5nKGJhc2VuYW1lLmxlbmd0aCgpKSArICInIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgICAgIGxvZygibWF0Y2hDcml0ZXJpYTogc2VwYXJhdG9yLmxlbmd0aD0nIiArIEludGVnZXIudG9TdHJpbmcoc2VwYXJhdG9yLmxlbmd0aCgpKSArICInIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgICAgIGludCByZWxhdGl2ZVZlcnNpb25JbmRleCA9IGJhc2VuYW1lLmxlbmd0aCgpICsgc2VwYXJhdG9yLmxlbmd0aCgpOw0KICAgICAgICBsb2coIm1hdGNoQ3JpdGVyaWE6IHJlbGF0aXZlVmVyc2lvbkluZGV4KCIgKyBJbnRlZ2VyLnRvU3RyaW5nKHJlbGF0aXZlVmVyc2lvbkluZGV4KSArICIpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgICAgIGlmKCBmaWxlbGlzdCAhPSBudWxsICkgew0KICAgICAgICAgICAgbG9nKCJtYXRjaENyaXRlcmlhOiBmaWxlbGlzdC5sZW5ndGg9JyIgKyBJbnRlZ2VyLnRvU3RyaW5nKGZpbGVsaXN0Lmxlbmd0aCkgKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KICAgICAgICAgICAgZm9yICggaW50IGk9MDsgaTxmaWxlbGlzdC5sZW5ndGg7IGkrKyApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHZlcnNpb25FbmRJbmRleCA9IGZpbGVsaXN0W2ldLmluZGV4T2YoIi4iK3N1ZmZpeCk7DQogICAgICAgICAgICAgICAgbG9nKCJtYXRjaENyaXRlcmlhOiB2ZXJzaW9uRW5kSW5kZXgoIiArIEludGVnZXIudG9TdHJpbmcodmVyc2lvbkVuZEluZGV4KSsiKSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KICAgICAgICAgICAgICAgIGxvZygibWF0Y2hDcml0ZXJpYTogZmlsZWxpc3RbIisgSW50ZWdlci50b1N0cmluZyhpKSArICJdKCIgKyBmaWxlbGlzdFtpXSArICIpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgICAgICAgICAgICAgLy8gU2hvdWxkIGFkZCB0cnkgYmxvY2sgdG8gdGVzdCBmb3IgdmVyc2lvbiBleGNlcHRpb24NCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZmlsZWxpc3RbaV0uc3Vic3RyaW5nKHJlbGF0aXZlVmVyc2lvbkluZGV4LHZlcnNpb25FbmRJbmRleCk7DQoNCiAgICAgICAgICAgICAgICBsb2coIm1hdGNoQ3JpdGVyaWE6IHZlcnNpb24gc3RyaW5nIG9mIGZvdW5kIGZpbGUoIiArIHZlcnNpb24gKyAiKSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KICAgICAgICAgICAgICAgIGlmKHZlcnNpb24ubGVuZ3RoKCk+MCl7DQogICAgICAgICAgICAgICAgICAgIGlmKG1pbkluY2x1c2l2ZSAmJiBtYXhJbmNsdXNpdmUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1pblZlcnNpb24ubGUodmVyc2lvbikgJiYgbWF4VmVyc2lvbi5nZSh2ZXJzaW9uKSApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGZpbGVsaXN0W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pbkluY2x1c2l2ZSAmJiAhbWF4SW5jbHVzaXZlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1pblZlcnNpb24ubGUodmVyc2lvbikgJiYgbWF4VmVyc2lvbi5ndCh2ZXJzaW9uKSApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGZpbGVsaXN0W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFtaW5JbmNsdXNpdmUgJiYgbWF4SW5jbHVzaXZlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1pblZlcnNpb24ubHQodmVyc2lvbikgJiYgbWF4VmVyc2lvbi5nZSh2ZXJzaW9uKSApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGZpbGVsaXN0W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFtaW5JbmNsdXNpdmUgJiYgIW1heEluY2x1c2l2ZSApew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYobWluVmVyc2lvbi5sdCh2ZXJzaW9uKSAmJiBtYXhWZXJzaW9uLmd0KHZlcnNpb24pICl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoID0gZmlsZWxpc3RbaV07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbG9nKCJtYXRjaENyaXRlcmlhOiBCZXN0IE1hdGNoIHNvIGZhcigiICsgYmVzdE1hdGNoICsgIikiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBsb2coIm1hdGNoQ3JpdGVyaWE6IEJlc3RNYXRjaCgiICsgYmVzdE1hdGNoICsgIikiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGxvZygibWF0Y2hDcml0ZXJpYTogZmlsZWxpc3QgaXMgbnVsbCEiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCiAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDsNCiAgICB9DQoNCiAgICBwcml2YXRlIFN0cmluZ1tdIGdldExpc3RPZkZpbGVzKFN0cmluZyBkaXJlY3RvcnkpIHsNCiAgICAgICAgY2xhc3MgTXlGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlcg0KICAgICAgICB7DQogICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBmaWxlcGF0dGVybikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIGZpbGVwYXR0ZXJuLnN0YXJ0c1dpdGgoYmFzZW5hbWUgKyBzZXBhcmF0b3IpICYmIGZpbGVwYXR0ZXJuLmVuZHNXaXRoKCIuIiArIHN1ZmZpeCkgKSByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUoZGlyZWN0b3J5KS5saXN0KCBuZXcgTXlGaWx0ZXIoKSApOw0KICAgIH0NCg0KICAgIC8vIFRoZSAibWVhdCINCiAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsNCiAgICAgICAgaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9qZWN0IG5vdCBzZXQhIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGJhc2VuYW1lID09IG51bGwgfHwgYmFzZW5hbWUubGVuZ3RoKCkgPT0gMCkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYmFzZW5hbWUgYXR0cmlidXRlIG11c3QgYmUgcHJlc2VudC4iLCBnZXRMb2NhdGlvbigpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZGlyZWN0b3J5ID09IG51bGwgfHwgZGlyZWN0b3J5Lmxlbmd0aCgpID09IDApIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGRpcmVjdG9yeSBhdHRyaWJ1dGUgbXVzdCBiZSBwcmVzZW50LiIsIGdldExvY2F0aW9uKCkpOw0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5Lmxlbmd0aCgpID09IDApIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHByb3BlcnR5IGF0dHJpYnV0ZSBtdXN0IGJlIHByZXNlbnQuIiwgZ2V0TG9jYXRpb24oKSk7DQogICAgICAgIH0NCiAgICAgICAgbG9nKCJleGVjdXRlOiAqKiBFdmFsdWF0ZSAqKiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KICAgICAgICBldmFsdWF0ZUNyaXRlcmlhKCk7DQogICAgICAgIGxvZygiZXhlY3V0ZTogKiogTWF0Y2ggKioiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCiAgICAgICAgU3RyaW5nIGZpbGUgPSBtYXRjaENyaXRlcmlhKCk7DQoNCiAgICAgICAgaWYoIGZpbGUgIT0gbnVsbCApew0KICAgICAgICAgICAgaWYgKGluY2x1ZGVwYXRoKQ0KICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgZGlyZWN0b3J5KyIvIitmaWxlKTsNCiAgICAgICAgICAgIGVsc2UgeyAgDQogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25vbmx5KQ0KICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHZlcnNpb24pOw0KICAgICAgICAgICAgICAgIGVsc2UgICANCiAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBmaWxlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBsb2coImV4ZWN1dGU6IFNlYXJjaCBGaW5pc2hlZC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCiAgICB9DQoNCiAgICAvLyBTZXR0ZXJzDQogICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXBhdGgoYm9vbGVhbiBpbmNsdWRlcGF0aCkgew0KICAgICAgICB0aGlzLmluY2x1ZGVwYXRoID0gaW5jbHVkZXBhdGg7DQogICAgfQ0KDQogICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbk9ubHkoYm9vbGVhbiB2ZXJzaW9ub25seSkgew0KICAgICAgICB0aGlzLnZlcnNpb25vbmx5ID0gdmVyc2lvbm9ubHk7DQogICAgfQ0KDQogICAgcHVibGljIHZvaWQgc2V0Q3JpdGVyaW9uKFN0cmluZyBjcml0ZXJpb24pIHsNCiAgICAgICAgdGhpcy5jcml0ZXJpb24gPSBjcml0ZXJpb247DQogICAgfQ0KDQogICAgcHVibGljIHZvaWQgc2V0QmFzZW5hbWUoU3RyaW5nIGJhc2VuYW1lKSB7DQogICAgICAgIHRoaXMuYmFzZW5hbWUgPSBiYXNlbmFtZTsNCiAgICB9DQoNCiAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgew0KICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsNCiAgICAgICAgbG9nKCJzZXREaXJlY3Rvcnk6IGRpcmVjdG9yeT0nIiArIGRpcmVjdG9yeSArICInIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQogICAgfQ0KDQogICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7DQogICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsNCiAgICB9DQoNCiAgICBwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHNlcGFyYXRvcikgew0KICAgICAgICBpZiAoIChzZXBhcmF0b3IubGVuZ3RoKCkgPiAxKSB8fCAoc2VwYXJhdG9yLmxlbmd0aCgpID09IDApICkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgc2VwYXJhdG9yIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIuIiwgZ2V0TG9jYXRpb24oKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSBzZXBhcmF0b3I7DQogICAgfQ0KDQogICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsNCiAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7DQogICAgfQ0KDQp9DQo=